Installation
gh skills-hub install geofeed-tuner Don't have the extension? Run gh extension install samueltauil/skills-hub first.
Download and extract to your repository:
.github/skills/geofeed-tuner/ Extract the ZIP to .github/skills/ in your repo. The folder name must match geofeed-tuner for Copilot to auto-discover it.
Skill Files (8)
SKILL.md 47.7 KB
---
name: geofeed-tuner
description: >
Use this skill whenever the user mentions IP geolocation feeds, RFC 8805, geofeeds, or wants help creating, tuning, validating, or publishing a
self-published IP geolocation feed in CSV format. Intended user audience is a network
operator, ISP, mobile carrier, cloud provider, hosting company, IXP, or satellite provider
asking about IP geolocation accuracy, or geofeed authoring best practices.
Helps create, refine, and improve CSV-format IP geolocation feeds with opinionated
recommendations beyond RFC 8805 compliance. Do NOT use for private or internal IP address
management — applies only to publicly routable IP addresses.
license: Apache-2.0
metadata:
author: Sid Mathur <support@getfastah.com>
version: "0.0.9"
compatibility: Requires Python 3
---
# Geofeed Tuner – Create Better IP Geolocation Feeds
This skill helps you create and improve IP geolocation feeds in CSV format by:
- Ensuring your CSV is well-formed and consistent
- Checking alignment with [RFC 8805](references/rfc8805.txt) (the industry standard)
- Applying **opinionated best practices** learned from real-world deployments
- Suggesting improvements for accuracy, completeness, and privacy
## When to Use This Skill
- Use this skill when a user asks for help **creating, improving, or publishing** an IP geolocation feed file in CSV format.
- Use it to **tune and troubleshoot CSV geolocation feeds** — catching errors, suggesting improvements, and ensuring real-world usability beyond RFC compliance.
- **Intended audience:**
- Network operators, administrators, and engineers responsible for publicly routable IP address space
- Organizations such as ISPs, mobile carriers, cloud providers, hosting and colocation companies, Internet Exchange operators, and satellite internet providers
- **Do not use** this skill for private or internal IP address management; it applies **only to publicly routable IP addresses**.
## Prerequisites
- **Python 3** is required.
## Directory Structure and File Management
This skill uses a clear separation between **distribution files** (read-only) and **working files** (generated at runtime).
### Read-Only Directories (Do Not Modify)
The following directories contain static distribution assets. **Do not create, modify, or delete files in these directories:**
| Directory | Purpose |
|----------------|------------------------------------------------------------|
| `assets/` | Static data files (ISO codes, examples) |
| `references/` | RFC specifications and code snippets for reference |
| `scripts/` | Executable code and HTML template files for reports |
### Working Directories (Generated Content)
All generated, temporary, and output files go in these directories:
| Directory | Purpose |
|-----------------|------------------------------------------------------|
| `run/` | Working directory for all agent-generated content |
| `run/data/` | Downloaded CSV files from remote URLs |
| `run/report/` | Generated HTML tuning reports |
### File Management Rules
1. **Never write to `assets/`, `references/`, or `scripts/`** — these are part of the skill distribution and must remain unchanged.
2. **All downloaded input files** (from remote URLs) must be saved to `./run/data/`.
3. **All generated HTML reports** must be saved to `./run/report/`.
4. **All generated Python scripts** must be saved to `./run/`.
5. The `run/` directory may be cleared between sessions; do not store permanent data there.
6. **Working directory for execution:** All generated scripts in `./run/` must be executed with the **skill root directory** (the directory containing `SKILL.md`) as the current working directory, so that relative paths like `assets/iso3166-1.json` and `./run/data/report-data.json` resolve correctly. Do not `cd` into `./run/` before running scripts.
## Processing Pipeline: Sequential Phase Execution
All phases must be executed **in order**, from Phase 1 through Phase 6. Each phase depends on the successful completion of the previous phase. For example, **structure checks** must complete before **quality analysis** can run.
The phases are summarized below. The agent must follow the detailed steps outlined further in each phase section.
| Phase | Name | Description |
|-------|----------------------------|-----------------------------------------------------------------------------------|
| 1 | Understand the Standard | Review the key requirements of RFC 8805 for self-published IP geolocation feeds |
| 2 | Gather Input | Collect IP subnet data from local files or remote URLs |
| 3 | Checks & Suggestions | Validate CSV structure, analyze IP prefixes, and check data quality |
| 4 | Tuning Data Lookup | Use Fastah's MCP tool to retrieve tuning data for improving geolocation accuracy |
| 5 | Generate Tuning Report | Create an HTML report summarizing the analysis and suggestions |
| 6 | Final Review | Verify consistency and completeness of the report data |
**Do not skip phases.** Each phase provides critical checks or data transformations required by subsequent stages.
### Execution Plan Rules
Before executing each phase, the agent MUST generate a visible TODO checklist.
The plan MUST:
- Appear at the very start of the phase
- List every step in order
- Use a checkbox format
- Be updated live as steps complete
### Phase 1: Understand the Standard
The key requirements from RFC 8805 that this skill enforces are summarized below. **Use this summary as your working reference.** Only consult the full [RFC 8805 text](references/rfc8805.txt) for edge cases, ambiguous situations, or when the user asks a standards question not covered here.
#### RFC 8805 Key Facts
**Purpose:** A self-published IP geolocation feed lets network operators publish authoritative location data for their IP address space in a simple CSV format, allowing geolocation providers to incorporate operator-supplied corrections.
**CSV Column Order (Sections 2.1.1.1–2.1.1.5):**
| Column | Field | Required | Notes |
|--------|---------------|----------|------------------------------------------------------------|
| 1 | `ip_prefix` | Yes | CIDR notation; IPv4 or IPv6; must be a network address |
| 2 | `alpha2code` | No | ISO 3166-1 alpha-2 country code; empty or "ZZ" = do-not-geolocate |
| 3 | `region` | No | ISO 3166-2 subdivision code (e.g., `US-CA`) |
| 4 | `city` | No | Free-text city name; no authoritative validation set |
| 5 | `postal_code` | No | **Deprecated** — must be left empty or absent |
**Structural rules:**
- Files may contain comment lines beginning with `#` (including the header, if present).
- A header row is optional; if present, it is treated as a comment if it starts with `#`.
- Files must be encoded in UTF-8.
- Subnet host bits must not be set (i.e., `192.168.1.1/24` is invalid; use `192.168.1.0/24`).
- Applies only to **globally routable** unicast addresses — not private, loopback, link-local, or multicast space.
**Do-not-geolocate:** An entry with an empty `alpha2code` or case-insensitive `ZZ` (irrespective of values of region/city) is an explicit signal that the operator does not want geolocation applied to that prefix.
**Postal codes deprecated (Section 2.1.1.5):** The fifth column must not contain postal or ZIP codes. They are too fine-grained for IP-range mapping and raise privacy concerns.
### Phase 2: Gather Input
- If the user has not already provided a list of IP subnets or ranges (sometimes referred to as `inetnum` or `inet6num`), prompt them to supply it. Accepted input formats:
- Text pasted into the chat
- A local CSV file
- A remote URL pointing to a CSV file
- If the input is a **remote URL**:
- Attempt to download the CSV file to `./run/data/` before processing.
- On HTTP error (4xx, 5xx, timeout, or redirect loop), **stop immediately** and report to the user:
`Feed URL is not reachable: HTTP {status_code}. Please verify the URL is publicly accessible.`
- Do not proceed to Phase 3 with an incomplete or empty download.
- If the input is a **local file**, process it directly without downloading.
- **Encoding detection and normalization:**
1. Attempt to read the file as UTF-8 first.
2. If a `UnicodeDecodeError` is raised, try `utf-8-sig` (UTF-8 with BOM), then `latin-1`.
3. Once successfully decoded, re-encode and write the working copy as UTF-8.
4. If no encoding succeeds, stop and report: `Unable to decode input file. Please save it as UTF-8 and try again.`
### Phase 3: Checks & Suggestions
#### Execution Rules
- Generate a **script** for this phase.
- Do NOT combine this phase with others.
- Do NOT precompute future-phase data.
- Store the output as a JSON file at: [`./run/data/report-data.json`](./run/data/report-data.json)
#### Schema Definition
The JSON structure below is **IMMUTABLE** during Phase 3. Phase 4 will later add a `TunedEntry` object to each object in `Entries` — this is the only permitted schema extension and happens in a separate phase.
JSON keys map directly to template placeholders like `{{.CountryCode}}`, `{{.HasError}}`, etc.
```json
{
"InputFile": "",
"Timestamp": 0,
"TotalEntries": 0,
"IpV4Entries": 0,
"IpV6Entries": 0,
"InvalidEntries": 0,
"Errors": 0,
"Warnings": 0,
"OK": 0,
"Suggestions": 0,
"CityLevelAccuracy": 0,
"RegionLevelAccuracy": 0,
"CountryLevelAccuracy": 0,
"DoNotGeolocate": 0,
"Entries": [
{
"Line": 0,
"IPPrefix": "",
"CountryCode": "",
"RegionCode": "",
"City": "",
"Status": "",
"IPVersion": "",
"Messages": [
{
"ID": "",
"Type": "",
"Text": "",
"Checked": false
}
],
"HasError": false,
"HasWarning": false,
"HasSuggestion": false,
"DoNotGeolocate": false,
"GeocodingHint": "",
"Tunable": false
}
]
}
```
Field definitions:
**Top-level metadata:**
- `InputFile`: The original input source, either a local filename or a remote URL.
- `Timestamp`: Milliseconds since Unix epoch when the tuning was performed.
- `TotalEntries`: Total number of data rows processed (excluding comment and blank lines).
- `IpV4Entries`: Count of entries that are IPv4 subnets.
- `IpV6Entries`: Count of entries that are IPv6 subnets.
- `InvalidEntries`: Count of entries that failed IP prefix parsing and CSV parsing.
- `Errors`: Total entries whose `Status` is `ERROR`.
- `Warnings`: Total entries whose `Status` is `WARNING`.
- `OK`: Total entries whose `Status` is `OK`.
- `Suggestions`: Total entries whose `Status` is `SUGGESTION`.
- `CityLevelAccuracy`: Count of valid entries where `City` is non-empty.
- `RegionLevelAccuracy`: Count of valid entries where `RegionCode` is non-empty and `City` is empty.
- `CountryLevelAccuracy`: Count of valid entries where `CountryCode` is non-empty, `RegionCode` is empty, and `City` is empty.
- `DoNotGeolocate` (metadata): Count of valid entries where `CountryCode`, `RegionCode`, and `City` are all empty.
**Entry fields:**
- `Entries`: Array of objects, one per data row, with the following per-entry fields:
- `Line`: 1-based line number in the original CSV (counting all lines including comments and blanks).
- `IPPrefix`: The normalized IP prefix in CIDR slash notation.
- `CountryCode`: The ISO 3166-1 alpha-2 country code, or empty string.
- `RegionCode`: The ISO 3166-2 region code (e.g., `US-CA`), or empty string.
- `City`: The city name, or empty string.
- `Status`: Highest severity assigned: `ERROR` > `WARNING` > `SUGGESTION` > `OK`.
- `IPVersion`: `"IPv4"` or `"IPv6"` based on the parsed IP prefix.
- `Messages`: Array of message objects, each with:
- `ID`: String identifier from the **Validation Rules Reference** table below (e.g., `"1101"`, `"3301"`).
- `Type`: The severity type: `"ERROR"`, `"WARNING"`, or `"SUGGESTION"`.
- `Text`: The human-readable validation message string.
- `Checked`: `true` if the validation rule is auto-tunable (`Tunable: true` in the reference table), `false` otherwise. Controls whether the checkbox in the report is `checked` or `disabled`.
- `HasError`: `true` if any message has `Type` `"ERROR"`.
- `HasWarning`: `true` if any message has `Type` `"WARNING"`.
- `HasSuggestion`: `true` if any message has `Type` `"SUGGESTION"`.
- `DoNotGeolocate` (entry): `true` if `CountryCode` is empty or `"ZZ"` — the entry is an explicit do-not-geolocate signal.
- `GeocodingHint`: Always empty string `""` in Phase 3. Reserved for future use.
- `Tunable`: `true` if **any** message in the entry has `Checked: true`. Computed as logical OR across all messages' `Checked` values. This flag drives the "Tune" button visibility in the report.
#### Validation Rules Reference
When adding messages to an entry, use the `ID`, `Type`, `Text`, and `Checked` values from this table.
| ID | Type | Text | Checked | Condition Reference |
|--------|--------------|------------------------------------------------------------------------------------------------|---------|----------------------------------------|
| `1101` | `ERROR` | IP prefix is empty | `false` | IP Prefix Analysis: empty |
| `1102` | `ERROR` | Invalid IP prefix: unable to parse as IPv4 or IPv6 network | `false` | IP Prefix Analysis: invalid syntax |
| `1103` | `ERROR` | Non-public IP range is not allowed in an RFC 8805 feed | `false` | IP Prefix Analysis: non-public |
| `3101` | `SUGGESTION` | IPv4 prefix is unusually large and may indicate a typo | `false` | IP Prefix Analysis: IPv4 < /22 |
| `3102` | `SUGGESTION` | IPv6 prefix is unusually large and may indicate a typo | `false` | IP Prefix Analysis: IPv6 < /64 |
| `1201` | `ERROR` | Invalid country code: not a valid ISO 3166-1 alpha-2 value | `true` | Country Code Analysis: invalid |
| `1301` | `ERROR` | Invalid region format; expected COUNTRY-SUBDIVISION (e.g., US-CA) | `true` | Region Code Analysis: bad format |
| `1302` | `ERROR` | Invalid region code: not a valid ISO 3166-2 subdivision | `true` | Region Code Analysis: unknown code |
| `1303` | `ERROR` | Region code does not match the specified country code | `true` | Region Code Analysis: mismatch |
| `1401` | `ERROR` | Invalid city name: placeholder value is not allowed | `false` | City Name Analysis: placeholder |
| `1402` | `ERROR` | Invalid city name: abbreviated or code-based value detected | `true` | City Name Analysis: abbreviation |
| `2401` | `WARNING` | City name formatting is inconsistent; consider normalizing the value | `true` | City Name Analysis: formatting |
| `1501` | `ERROR` | Postal codes are deprecated by RFC 8805 and must be removed for privacy reasons | `true` | Postal Code Check |
| `3301` | `SUGGESTION` | Region is usually unnecessary for small territories; consider removing the region value | `true` | Tuning: small territory region |
| `3402` | `SUGGESTION` | City-level granularity is usually unnecessary for small territories; consider removing the city value | `true` | Tuning: small territory city |
| `3303` | `SUGGESTION` | Region code is recommended when a city is specified; choose a region from the dropdown | `true` | Tuning: missing region with city |
| `3104` | `SUGGESTION` | Confirm whether this subnet is intentionally marked as do-not-geolocate or missing location data | `true` | Tuning: unspecified geolocation |
#### Populating Messages
When a validation check matches, add a message to the entry's `Messages` array using the values from the reference table:
```python
entry["Messages"].append({
"ID": "1201", # From the table
"Type": "ERROR", # From the table
"Text": "Invalid country code: not a valid ISO 3166-1 alpha-2 value", # From the table
"Checked": True # From the table (True = tunable)
})
```
After populating all messages for an entry, derive the entry-level flags:
```python
entry["HasError"] = any(m["Type"] == "ERROR" for m in entry["Messages"])
entry["HasWarning"] = any(m["Type"] == "WARNING" for m in entry["Messages"])
entry["HasSuggestion"] = any(m["Type"] == "SUGGESTION" for m in entry["Messages"])
entry["Tunable"] = any(m["Checked"] for m in entry["Messages"])
```
#### Accuracy Level Counting Rules
Accuracy levels are **mutually exclusive**. Assign each valid (non-ERROR, non-invalid) entry to exactly one bucket based on the most granular non-empty geo field:
| Condition | Bucket |
|--------------------------------------------------------------|-----------------------------|
| `City` is non-empty | `CityLevelAccuracy` |
| `RegionCode` non-empty AND `City` is empty | `RegionLevelAccuracy` |
| `CountryCode` non-empty, `RegionCode` and `City` empty | `CountryLevelAccuracy` |
| `DoNotGeolocate` (entry) is `true` | `DoNotGeolocate` (metadata) |
**Do not count** entries with `HasError: true` or entries in `InvalidEntries` in any accuracy bucket.
The agent MUST NOT:
- Rename fields
- Add or remove fields
- Change data types
- Reorder keys
- Alter nesting
- Wrap the object
- Split into multiple files
If a value is unknown, **leave it empty** — never invent data.
#### Structure & Format Check
This phase verifies that your feed is well-formed and parseable. **Critical structural errors** must be resolved before the tuner can analyze geolocation quality.
##### CSV Structure
This subsection defines rules for **CSV-formatted input files** used for IP geolocation feeds.
The goal is to ensure the file can be parsed reliably and normalized into a **consistent internal representation**.
- **CSV Structure Checks**
- If `pandas` is available, use it for CSV parsing.
- Otherwise, fall back to Python's built-in `csv` module.
- Ensure the CSV contains **exactly 4 or 5 logical columns**.
- Comment lines are allowed.
- A header row **may or may not** be present.
- If no header row exists, assume the implicit column order:
```
ip_prefix, alpha2code, region, city, postal code (deprecated)
```
- Refer to the example input file:
[`assets/example/01-user-input-rfc8805-feed.csv`](assets/example/01-user-input-rfc8805-feed.csv)
- **CSV Cleansing and Normalization**
- Clean and normalize the CSV using Python logic equivalent to the following operations:
- Select only the **first five columns**, dropping any columns beyond the fifth.
- Write the output file with a **UTF-8 BOM**.
- **Comments**
- Remove comment rows where the **first column begins with `#`**.
- This also removes a header row if it begins with `#`.
- Create a map of comments using the **1-based line number** as the key and the full original line as the value. Also store blank lines.
- Store this map in a JSON file at: [`./run/data/comments.json`](./run/data/comments.json)
- Example: `{ "4": "# It's OK for small city states to leave state ISO2 code unspecified" }`
- **Notes**
- Both implementation paths (`pandas` and built-in `csv`) must write output using
the `utf-8-sig` encoding to ensure a **UTF-8 BOM** is present.
#### IP Prefix Analysis
- Check that the `IPPrefix` field is present and non-empty for each entry.
- Check for duplicate `IPPrefix` values across entries.
- If duplicates are found, stop the skill and report to the user with the message: `Duplicate IP prefix detected: {ip_prefix_value} appears on lines {line_numbers}`
- If no duplicates are found, continue with the analysis.
- **Checks**
- Each subnet must parse cleanly as either an **IPv4 or IPv6 network** using the code snippets in the `references/` folder.
- Subnets must be normalized and displayed in **CIDR slash notation**.
- Single-host IPv4 subnets must be represented as **`/32`**.
- Single-host IPv6 subnets must be represented as **`/128`**.
- **ERROR**
- Report the following conditions as **ERROR**:
- **Invalid subnet syntax**
- Message ID: `1102`
- **Non-public address space**
- Applies to subnets that are **private, loopback, link-local, multicast, or otherwise non-public**
- In Python, detect non-public ranges using `is_private` and related address properties as shown in `./references`.
- Message ID: `1103`
- **SUGGESTION**
- Report the following conditions as **SUGGESTION**:
- **Overly large IPv6 subnets**
- Prefixes shorter than `/64`
- Message ID: `3102`
- **Overly large IPv4 subnets**
- Prefixes shorter than `/22`
- Message ID: `3101`
#### Geolocation Quality Check
Analyze the **accuracy and consistency** of geolocation data:
- Country codes
- Region codes
- City names
- Deprecated fields
This phase runs after structural checks pass.
##### Country Code Analysis
- Use the locally available data table [`ISO3166-1`](assets/iso3166-1.json) for checking.
- JSON array of countries and territories with ISO codes
- Each object includes:
- `alpha_2`: two-letter country code
- `name`: short country name
- `flag`: flag emoji
- This file represents the **superset of valid `CountryCode` values** for an RFC 8805 CSV.
- Check the entry's `CountryCode` (RFC 8805 Section 2.1.1.2, column `alpha2code`) against the `alpha_2` attribute.
- Sample code is available in the `references/` directory.
- If a country is found in [`assets/small-territories.json`](assets/small-territories.json), mark the entry internally as a small territory. This flag is used in later checks and suggestions but is **not stored in the output JSON** (it is transient validation state).
- **Note:** `small-territories.json` contains some historic/disputed codes (`AN`, `CS`, `XK`) that are not present in `iso3166-1.json`. An entry using one of these as its `CountryCode` will fail the country code validation (ERROR) even though it matches as a small territory. The country code ERROR takes precedence — do not suppress it based on the small-territory flag.
- **ERROR**
- Report the following conditions as **ERROR**:
- **Invalid country code**
- Condition: `CountryCode` is present but not found in the `alpha_2` set
- Message ID: `1201`
- **SUGGESTION**
- Report the following conditions as **SUGGESTION**:
- **Unspecified geolocation for subnet**
- Condition: All geographical fields (`CountryCode`, `RegionCode`, `City`) are empty for a subnet.
- Action:
- Set `DoNotGeolocate = true` for the entry.
- Set `CountryCode` to `ZZ` for the entry.
- Message ID: `3104`
##### Region Code Analysis
- Use the locally available data table [`ISO3166-2`](assets/iso3166-2.json) for checking.
- JSON array of country subdivisions with ISO-assigned codes
- Each object includes:
- `code`: subdivision code prefixed with country code (e.g., `US-CA`)
- `name`: short subdivision name
- This file represents the **superset of valid `RegionCode` values** for an RFC 8805 CSV.
- If a `RegionCode` value is provided (RFC 8805 Section 2.1.1.3):
- Check that the format matches `{COUNTRY}-{SUBDIVISION}` (e.g., `US-CA`, `AU-NSW`).
- Check the value against the `code` attribute (already prefixed with the country code).
- **Small-territory exception:** If the entry is a small territory **and** the `RegionCode` value equals the entry's `CountryCode` (e.g., `SG` as both country and region for Singapore), treat the region as acceptable — skip all region validation checks for this entry. Small territories are effectively city-states with no meaningful ISO 3166-2 administrative subdivisions.
- **ERROR**
- Report the following conditions as **ERROR**:
- **Invalid region format**
- Condition: `RegionCode` does not match `{COUNTRY}-{SUBDIVISION}` **and** the small-territory exception does not apply
- Message ID: `1301`
- **Unknown region code**
- Condition: `RegionCode` value is not found in the `code` set **and** the small-territory exception does not apply
- Message ID: `1302`
- **Country–region mismatch**
- Condition: Country portion of `RegionCode` does not match `CountryCode`
- Message ID: `1303`
##### City Name Analysis
- City names are validated using **heuristic checks only**.
- There is currently **no authoritative dataset** available for validating city names.
- **ERROR**
- Report the following conditions as **ERROR**:
- **Placeholder or non-meaningful values**
- Condition: Placeholder or non-meaningful values including but not limited to:
- `undefined`
- `Please select`
- `null`
- `N/A`
- `TBD`
- `unknown`
- Message ID: `1401`
- **Truncated names, abbreviations, or airport codes**
- Condition: Truncated names, abbreviations, or airport codes that do not represent valid city names:
- `LA`
- `Frft`
- `sin01`
- `LHR`
- `SIN`
- `MAA`
- Message ID: `1402`
- **WARNING**
- Report the following conditions as **WARNING**:
- **Inconsistent casing or formatting**
- Condition: City names with inconsistent casing, spacing, or formatting that may reduce data quality, for example:
- `HongKong` vs `Hong Kong`
- Mixed casing or unexpected script usage
- Message ID: `2401`
##### Postal Code Check
- RFC 8805 Section 2.1.1.5 explicitly **deprecates postal or ZIP codes**.
- Postal codes can represent very small populations and are **not considered privacy-safe** for mapping IP address ranges, which are statistical in nature.
- **ERROR**
- Report the following conditions as **ERROR**:
- **Postal code present**
- Condition: A non-empty value is present in the postal/ZIP code field.
- Message ID: `1501`
#### Tuning & Recommendations
This phase applies **opinionated recommendations** beyond RFC 8805, learned from real-world geofeed deployments, that improve accuracy and usability.
- **SUGGESTION**
- Report the following conditions as **SUGGESTION**:
- **Region or city specified for small territory**
- Condition:
- Entry is a small territory
- `RegionCode` is non-empty **OR**
- `City` is non-empty.
- Message IDs: `3301` (for region), `3402` (for city)
- **Missing region code when city is specified**
- Condition:
- `City` is non-empty
- `RegionCode` is empty
- Entry is **not** a small territory
- Message ID: `3303`
### Phase 4: Tuning Data Lookup
#### Objective
Lookup all the `Entries` using Fastah's `rfc8805-row-place-search` tool.
#### Execution Rules
- Generate a new **script** _only_ for payload generation (read the dataset and write one or more payload JSON files; do not call MCP from this script).
- Server only accepts 1000 entries per request, so if there are more than 1000 entries, split into multiple requests.
- The agent must read the generated payload files, construct the requests from them, and send those requests to the MCP server in batches of at most 1000 entries each.
- **On MCP failure:** If the MCP server is unreachable, returns an error, or returns no results for any batch, log a warning and continue to Phase 5. Set `TunedEntry: {}` for all affected entries. Do not block report generation. Notify the user clearly: `Tuning data lookup unavailable; the report will show validation results only.`
- Suggestions are **advisory only** — **never auto-populate** them.
#### Step 1: Build Lookup Payload with Deduplication
Load the dataset from: [./run/data/report-data.json](./run/data/report-data.json)
- Read the `Entries` array. Each entry will be used to build the MCP lookup payload.
Reduce server requests by deduplicating identical entries:
- For each entry in `Entries`, compute a content hash (hash of `CountryCode` + `RegionCode` + `City`).
- Create a deduplication map: `{ contentHash -> { rowKey, payload, entryIndices: [] } }`. rowKey is a UUID that will be sent to the MCP server for matching responses.
- If an entry's hash already exists, append its **0-based array index** in `Entries` to that deduplication entry's `entryIndices` array.
- If hash is new, generate a **UUID (rowKey)** and create a new deduplication entry.
Build request batches:
- Extract unique deduplicated entries from the map, keeping them in deduplication order.
- Build request batches of up to 1000 items each.
- For each batch, keep an in-memory structure like `[{ rowKey, payload, entryIndices }, ...]` to match responses back by rowKey.
- When writing the MCP payload file, include the `rowKey` field with each payload object:
```json
[
{"rowKey": "550e8400-e29b-41d4-a716-446655440000", "countryCode":"CA","regionCode":"CA-ON","cityName":"Toronto"},
{"rowKey": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "countryCode":"IN","regionCode":"IN-KA","cityName":"Bangalore"},
{"rowKey": "6ba7b811-9dad-11d1-80b4-00c04fd430c8", "countryCode":"IN","regionCode":"IN-KA"}
]
```
- When reading responses, match each response `rowKey` field to the corresponding deduplication entry to retrieve all associated `entryIndices`.
Rules:
- Write payload to: [./run/data/mcp-server-payload.json](./run/data/mcp-server-payload.json)
- Exit the script after writing the payload.
#### Step 2: Invoke Fastah MCP Tool
- An example `mcp.json` style configuration of Fastah MCP server is as follows:
```json
"fastah-ip-geofeed": {
"type": "http",
"url": "https://mcp.fastah.ai/mcp"
}
```
- Server: `https://mcp.fastah.ai/mcp`
- Tool and its Schema: before the first `tools/call`, the agent MUST send a `tools/list` request to read the input and output schema for **`rfc8805-row-place-search`**.
Use the discovered schema as the authoritative source for field names, types, and constraints.
- The following is an illustrative example only; always defer to the schema returned by `tools/list`:
```json
[
{"rowKey": "550e8400-...", "countryCode":"CA", ...},
{"rowKey": "690e9301-...", "countryCode":"ZZ", ...}
]
- Open [./run/data/mcp-server-payload.json](./run/data/mcp-server-payload.json) and send all deduplicated entries with their rowKeys.
- If there are more than 1000 deduplicated entries after deduplication, split into multiple requests of 1000 entries each.
- The server will respond with the same `rowKey` field in each response for mapping back.
- Do NOT use local data.
#### Step 3: Attach Tuned Data to Entries
- Generate a new **script** for attaching tuned data.
- Load both [./run/data/report-data.json](./run/data/report-data.json) and the deduplication map (held in memory from Step 1, or re-derived from the payload file).
- For each response from the MCP server:
- Extract the `rowKey` from the response.
- Look up the `entryIndices` array associated with that `rowKey` from the deduplication map.
- For each index in `entryIndices`, attach the best match to `Entries[index]`.
- Use the **first (best) match** from the response when available.
Create the field on each affected entry if it does not exist. Remap the MCP API response keys to Go struct field names:
```json
"TunedEntry": {
"Name": "",
"CountryCode": "",
"RegionCode": "",
"PlaceType": "",
"H3Cells": [],
"BoundingBox": []
}
```
The `TunedEntry` field is a **single object** (not an array). It holds the best match from the MCP server.
**MCP response key → JSON key mapping**:
| MCP API response key | JSON key |
|----------------------|----------------------------|
| `placeName` | `Name` |
| `countryCode` | `CountryCode` |
| `stateCode` | `RegionCode` |
| `placeType` | `PlaceType` |
| `h3Cells` | `H3Cells` |
| `boundingBox` | `BoundingBox` |
Entries with no UUID match (i.e. the MCP server returned no response for their UUID) must receive an empty `TunedEntry: {}` object — never leave the field absent.
- Write the dataset back to: [./run/data/report-data.json](./run/data/report-data.json)
- Rules:
- Maintain all existing validation flags.
- Do NOT create additional intermediate files.
### Phase 5: Generate Tuning Report
Generate a **self-contained HTML report** by rendering the template at `./scripts/templates/index.html` with data from `./run/data/report-data.json` and `./run/data/comments.json`.
Write the completed report to `./run/report/geofeed-report.html`. After generating, attempt to open it in the system's default browser (e.g., `webbrowser.open()`). If running in a headless environment, CI pipeline, or remote container where no browser is available, skip the browser step and instead present the file path to the user so they can open or download it.
**The template uses Go `html/template` syntax** (`{{.Field}}`, `{{range}}`, `{{if eq}}`, etc.). Write a Python script that reads the template, builds a rendering context from the JSON data files, and processes the template placeholders to produce final HTML. Do not modify the template file itself — all processing happens in the Python script at render time.
#### Step 1: Replace Metadata Placeholders
Replace each `{{.Metadata.X}}` placeholder in the template with the corresponding value from `report-data.json`. Since JSON keys match the template placeholder, the mapping is direct — `{{.Metadata.InputFile}}` maps to the `InputFile` JSON key, etc.
| Template placeholder | JSON key (`report-data.json`) |
|----------------------------------------|-----------------------------------|
| `{{.Metadata.InputFile}}` | `InputFile` |
| `{{.Metadata.Timestamp}}` | `Timestamp` |
| `{{.Metadata.TotalEntries}}` | `TotalEntries` |
| `{{.Metadata.IpV4Entries}}` | `IpV4Entries` |
| `{{.Metadata.IpV6Entries}}` | `IpV6Entries` |
| `{{.Metadata.InvalidEntries}}` | `InvalidEntries` |
| `{{.Metadata.Errors}}` | `Errors` |
| `{{.Metadata.Warnings}}` | `Warnings` |
| `{{.Metadata.Suggestions}}` | `Suggestions` |
| `{{.Metadata.OK}}` | `OK` |
| `{{.Metadata.CityLevelAccuracy}}` | `CityLevelAccuracy` |
| `{{.Metadata.RegionLevelAccuracy}}` | `RegionLevelAccuracy` |
| `{{.Metadata.CountryLevelAccuracy}}` | `CountryLevelAccuracy` |
| `{{.Metadata.DoNotGeolocate}}` | `DoNotGeolocate` (metadata) |
**Note on `{{.Metadata.Timestamp}}`:** This placeholder appears inside a JavaScript `new Date(...)` call. Replace it with the raw integer value (no HTML escaping needed for a numeric literal inside `<script>`). All other metadata values should be HTML-escaped since they appear inside HTML element text.
#### Step 2: Replace the Comment Map Placeholder
Locate this pattern in the template:
```javascript
const commentMap = {{.Comments}};
```
Replace `{{.Comments}}` with the serialized JSON object from `./run/data/comments.json`. The JSON is embedded directly as a JavaScript object literal (not inside a string), so no extra escaping is needed:
```python
comments_json = json.dumps(comments)
template = template.replace("{{.Comments}}", comments_json)
```
#### Step 3: Expand the Entries Range Block
The template contains a `{{range .Entries}}...{{end}}` block inside `<tbody id="entriesTableBody">`. Process it as follows:
1. **Extract** the range block body using regex. **Critical:** The block contains nested `{{end}}` tags (from `{{if eq .Status ...}}`, `{{if .Checked}}`, and `{{range .Messages}}`). A naive non-greedy match like `\{\{range \.Entries\}\}(.*?)\{\{end\}\}` will match the **first** inner `{{end}}`, truncating the block. Instead, anchor the outer `{{end}}` to the `</tbody>` that follows it:
```python
m = re.search(
r'\{\{range \.Entries\}\}(.*?)\{\{end\}\}\s*</tbody>',
template,
re.DOTALL,
)
entry_body = m.group(1) # template text for one entry iteration
```
This ensures you capture the full block body including all three `<tr>` rows and the nested `{{range .Messages}}...{{end}}`.
2. **Iterate** over each entry in `report-data.json`'s `Entries` array.
3. **Expand** the block body for each entry using the processing order below.
4. **Replace** the entire match (from `{{range .Entries}}` through `</tbody>`) with the concatenated expanded HTML followed by `</tbody>`.
**Processing order for each entry** (innermost constructs first to avoid `{{end}}` confusion):
1. Evaluate `{{if eq .Status ...}}...{{end}}` conditionals (status badge class and icon).
2. Evaluate `{{if .Checked}}...{{end}}` conditional (message checkbox).
3. Expand `{{range .Messages}}...{{end}}` inner range.
4. Replace simple `{{.Field}}` placeholders.
##### Entry Field Mapping
Within the range block body, replace these placeholders for each entry. Since JSON keys match the template placeholder, the template placeholder `{{.X}}` maps directly to JSON key `X`:
| Template placeholder | JSON key (`Entries[]`) | Notes |
|--------------------------------|------------------------------|--------------------------------------------------------------|
| `{{.Line}}` | `Line` | Direct integer value |
| `{{.IPPrefix}}` | `IPPrefix` | HTML-escaped |
| `{{.CountryCode}}` | `CountryCode` | HTML-escaped |
| `{{.RegionCode}}` | `RegionCode` | HTML-escaped |
| `{{.City}}` | `City` | HTML-escaped |
| `{{.Status}}` | `Status` | HTML-escaped |
| `{{.HasError}}` | `HasError` | Lowercase string: `"true"` or `"false"` |
| `{{.HasWarning}}` | `HasWarning` | Lowercase string: `"true"` or `"false"` |
| `{{.HasSuggestion}}` | `HasSuggestion` | Lowercase string: `"true"` or `"false"` |
| `{{.GeocodingHint}}` | `GeocodingHint` | Empty string `""` |
| `{{.DoNotGeolocate}}` | `DoNotGeolocate` | `"true"` or `"false"` |
| `{{.Tunable}}` | `Tunable` | `"true"` or `"false"` |
| `{{.TunedEntry.CountryCode}}` | `TunedEntry.CountryCode` | `""` if `TunedEntry` is empty `{}` |
| `{{.TunedEntry.RegionCode}}` | `TunedEntry.RegionCode` | `""` if `TunedEntry` is empty `{}` |
| `{{.TunedEntry.Name}}` | `TunedEntry.Name` | `""` if `TunedEntry` is empty `{}` |
| `{{.TunedEntry.H3Cells}}` | `TunedEntry.H3Cells` | Bracket-wrapped space-separated; `"[]"` if empty (see format below) |
| `{{.TunedEntry.BoundingBox}}` | `TunedEntry.BoundingBox` | Bracket-wrapped space-separated; `"[]"` if empty (see format below) |
**`data-h3-cells` and `data-bounding-box` format:** These are **NOT JSON arrays**. They are bracket-wrapped, space-separated values. Do **not** use JSON serialization (no quotes around string elements, no commas between numbers). Examples:
- `[836752fffffffff 836755fffffffff]` — correct
- `["836752fffffffff","836755fffffffff"]` — **WRONG**, quotes will break parsing
- `[-71.70 10.73 -71.52 10.55]` — correct
- `[]` — correct for empty
##### Evaluating Status Conditionals
**Process these BEFORE replacing simple `{{.Field}}` placeholders** — otherwise the `{{end}}` markers get consumed and the regex won't match.
The template uses `{{if eq .Status "..."}}` conditionals for the status badge CSS class and icon. Evaluate these by checking the entry's `status` value and keeping only the matching branch text.
The status badge line contains **two** `{{if eq .Status ...}}...{{end}}` blocks on a single line — one for the CSS class, one for the icon. Use `re.sub` with a callback to resolve all occurrences:
```python
STATUS_CSS = {"ERROR": "error", "WARNING": "warning", "SUGGESTION": "suggestion", "OK": "ok"}
STATUS_ICON = {
"ERROR": "bi-x-circle-fill",
"WARNING": "bi-exclamation-triangle-fill",
"SUGGESTION": "bi-lightbulb-fill",
"OK": "bi-check-circle-fill",
}
def resolve_status_if(match_obj, status):
"""Pick the branch matching `status` from a {{if eq .Status ...}}...{{end}} block."""
block = match_obj.group(0)
# Try each branch: {{if eq .Status "X"}}val{{else if ...}}val{{else}}val{{end}}
for st, val in [("ERROR",), ("WARNING",), ("SUGGESTION",)]:
# not needed to parse generically — just map from the known patterns
...
```
A simpler approach: since there are exactly two known patterns, replace them as literal strings:
```python
css_class = STATUS_CSS.get(status, "ok")
icon_class = STATUS_ICON.get(status, "bi-check-circle-fill")
body = body.replace(
'{{if eq .Status "ERROR"}}error{{else if eq .Status "WARNING"}}warning{{else if eq .Status "SUGGESTION"}}suggestion{{else}}ok{{end}}',
css_class,
)
body = body.replace(
'{{if eq .Status "ERROR"}}bi-x-circle-fill{{else if eq .Status "WARNING"}}bi-exclamation-triangle-fill{{else if eq .Status "SUGGESTION"}}bi-lightbulb-fill{{else}}bi-check-circle-fill{{end}}',
icon_class,
)
```
This avoids regex entirely and is safe because these exact strings appear verbatim in the template.
#### Step 4: Expand the Nested Messages Range
The `{{range .Messages}}...{{end}}` block contains a **nested** `{{if .Checked}} checked{{else}} disabled{{end}}` conditional, so its inner `{{end}}` would cause a simple non-greedy regex to match too early. Anchor the regex to `</td>` (the tag immediately after the messages range closing `{{end}}`) to capture the full block body:
```python
msg_match = re.search(
r'\{\{range \.Messages\}\}(.*?)\{\{end\}\}\s*(?=</td>)',
body, re.DOTALL
)
```
The lookahead `(?=</td>)` ensures the regex skips past the checkbox conditional's `{{end}}` (which is followed by `>`, not `</td>`) and matches only the range-closing `{{end}}` (which is followed by whitespace then `</td>`).
For each message in the entry's `Messages` array, clone the captured block body and expand it:
1. **Resolve the checkbox conditional** per message (must happen before simple placeholder replacement to remove the nested `{{end}}`):
```python
if msg.get("Checked"):
msg_body = msg_body.replace(
'{{if .Checked}} checked{{else}} disabled{{end}}', ' checked'
)
else:
msg_body = msg_body.replace(
'{{if .Checked}} checked{{else}} disabled{{end}}', ' disabled'
)
```
2. **Replace message field placeholders**:
| Template placeholder | Source | Notes |
|--------------------------|-----------------------------------|--------------------------------|
| `{{.ID}}` | `Messages[i].ID` | Direct string value from JSON |
| `{{.Text}}` | `Messages[i].Text` | HTML-escaped |
3. **Concatenate** all expanded message blocks and replace the original `{{range .Messages}}...{{end}}` match (`msg_match.group(0)`) with the result:
```python
body = body[:msg_match.start()] + "".join(expanded_msgs) + body[msg_match.end():]
```
If `Messages` is empty, replace the entire matched region with an empty string (no message divs — only the issues header remains).
#### Output Guarantees
- The report must be readable in any modern browser without extra network dependencies beyond the CDN links already in the template (`leaflet`, `h3-js`, `bootstrap-icons`, Raleway font).
- All values embedded in HTML must be **HTML-escaped** (`<`, `>`, `&`, `"`) to prevent rendering issues.
- `commentMap` is embedded as a direct JavaScript object literal (not inside a string), so no JS string escaping is needed — just emit valid JSON.
- All values must be derived **only from analysis output**, not recomputed heuristically.
### Phase 6: Final Review
Perform a final verification pass using concrete, checkable assertions before presenting results to the user.
**Check 1 — Entry count integrity**
- Count non-comment, non-blank data rows in the original input CSV.
- Assert: `len(entries) in report-data.json == data_row_count`
- On failure: `Row count mismatch: input has {N} data rows but report contains {M} entries.`
**Check 2 — Summary counter integrity**
- These counters use **mutual exclusion** based on the boolean flags, which mirrors the highest-severity `Status` field. An entry with both `HasError: true` and `HasWarning: true` is counted only in `Errors`, never in `Warnings`. This is equivalent to counting by the entry's `Status` field.
- Assert all of the following; correct any that fail before generating the report:
- `Errors == sum(1 for e in Entries if e['HasError'])`
- `Warnings == sum(1 for e in Entries if e['HasWarning'] and not e['HasError'])`
- `Suggestions == sum(1 for e in Entries if e['HasSuggestion'] and not e['HasError'] and not e['HasWarning'])`
- `OK == sum(1 for e in Entries if not e['HasError'] and not e['HasWarning'] and not e['HasSuggestion'])`
- `Errors + Warnings + Suggestions + OK == TotalEntries - InvalidEntries`
**Check 3 — Accuracy bucket integrity**
- Assert: `CityLevelAccuracy + RegionLevelAccuracy + CountryLevelAccuracy + DoNotGeolocate == TotalEntries - InvalidEntries`
- **Note:** The accuracy buckets defined in Phase 3 say "Do not count entries with `HasError: true`", but the Check 3 formula above uses `TotalEntries - InvalidEntries` (which still includes ERROR entries). This means ERROR entries (those that parsed as valid IPs but failed validation) **are** counted in accuracy buckets by their geo-field presence. Only `InvalidEntries` (unparsable IP prefixes) are excluded. Follow the Check 3 formula as the authoritative rule.
- On failure, trace and fix the bucketing logic before proceeding.
**Check 4 — No duplicate line numbers**
- Assert: all `Line` values in `Entries` are unique.
- On failure, report the duplicated line numbers to the user.
**Check 5 — TunedEntry completeness**
- Assert: every object in `Entries` has a `TunedEntry` key (even if its value is `{}`).
- On failure, add `"TunedEntry": {}` to any entry missing the key, then re-save `report-data.json`.
**Check 6 — Report file is present and non-empty**
- Confirm `./run/report/geofeed-report.html` was written and has a file size greater than zero bytes.
- On failure, regenerate the report before presenting to the user.
01-user-input-rfc8805-feed.csv 0.2 KB
202.125.100.144/28,ID,,Jakarta,
2605:59c8:2700::/40,CA,CA-QC,"Montreal"
150.228.170.0/24,SG,SG-01,Singapore,
# It's OK for small city states to leave state ISO2 code unspecified
2406:2d40:8100::/42,SG,SG,Singapore, iso3166-1.json 21.0 KB
{
"3166-1": [
{
"alpha_2": "AD",
"name": "Andorra",
"flag": "🇦🇩"
},
{
"alpha_2": "AE",
"name": "United Arab Emirates",
"flag": "🇦🇪"
},
{
"alpha_2": "AF",
"name": "Afghanistan",
"flag": "🇦🇫"
},
{
"alpha_2": "AG",
"name": "Antigua and Barbuda",
"flag": "🇦🇬"
},
{
"alpha_2": "AI",
"name": "Anguilla",
"flag": "🇦🇮"
},
{
"alpha_2": "AL",
"name": "Albania",
"flag": "🇦🇱"
},
{
"alpha_2": "AM",
"name": "Armenia",
"flag": "🇦🇲"
},
{
"alpha_2": "AO",
"name": "Angola",
"flag": "🇦🇴"
},
{
"alpha_2": "AQ",
"name": "Antarctica",
"flag": "🇦🇶"
},
{
"alpha_2": "AR",
"name": "Argentina",
"flag": "🇦🇷"
},
{
"alpha_2": "AS",
"name": "American Samoa",
"flag": "🇦🇸"
},
{
"alpha_2": "AT",
"name": "Austria",
"flag": "🇦🇹"
},
{
"alpha_2": "AU",
"name": "Australia",
"flag": "🇦🇺"
},
{
"alpha_2": "AW",
"name": "Aruba",
"flag": "🇦🇼"
},
{
"alpha_2": "AX",
"name": "Åland Islands",
"flag": "🇦🇽"
},
{
"alpha_2": "AZ",
"name": "Azerbaijan",
"flag": "🇦🇿"
},
{
"alpha_2": "BA",
"name": "Bosnia and Herzegovina",
"flag": "🇧🇦"
},
{
"alpha_2": "BB",
"name": "Barbados",
"flag": "🇧🇧"
},
{
"alpha_2": "BD",
"name": "Bangladesh",
"flag": "🇧🇩"
},
{
"alpha_2": "BE",
"name": "Belgium",
"flag": "🇧🇪"
},
{
"alpha_2": "BF",
"name": "Burkina Faso",
"flag": "🇧🇫"
},
{
"alpha_2": "BG",
"name": "Bulgaria",
"flag": "🇧🇬"
},
{
"alpha_2": "BH",
"name": "Bahrain",
"flag": "🇧🇭"
},
{
"alpha_2": "BI",
"name": "Burundi",
"flag": "🇧🇮"
},
{
"alpha_2": "BJ",
"name": "Benin",
"flag": "🇧🇯"
},
{
"alpha_2": "BL",
"name": "Saint Barthélemy",
"flag": "🇧🇱"
},
{
"alpha_2": "BM",
"name": "Bermuda",
"flag": "🇧🇲"
},
{
"alpha_2": "BN",
"name": "Brunei Darussalam",
"flag": "🇧🇳"
},
{
"alpha_2": "BO",
"name": "Bolivia, Plurinational State of",
"flag": "🇧🇴"
},
{
"alpha_2": "BQ",
"name": "Bonaire, Sint Eustatius and Saba",
"flag": "🇧🇶"
},
{
"alpha_2": "BR",
"name": "Brazil",
"flag": "🇧🇷"
},
{
"alpha_2": "BS",
"name": "Bahamas",
"flag": "🇧🇸"
},
{
"alpha_2": "BT",
"name": "Bhutan",
"flag": "🇧🇹"
},
{
"alpha_2": "BV",
"name": "Bouvet Island",
"flag": "🇧🇻"
},
{
"alpha_2": "BW",
"name": "Botswana",
"flag": "🇧🇼"
},
{
"alpha_2": "BY",
"name": "Belarus",
"flag": "🇧🇾"
},
{
"alpha_2": "BZ",
"name": "Belize",
"flag": "🇧🇿"
},
{
"alpha_2": "CA",
"name": "Canada",
"flag": "🇨🇦"
},
{
"alpha_2": "CC",
"name": "Cocos (Keeling) Islands",
"flag": "🇨🇨"
},
{
"alpha_2": "CD",
"name": "Congo, The Democratic Republic of the",
"flag": "🇨🇩"
},
{
"alpha_2": "CF",
"name": "Central African Republic",
"flag": "🇨🇫"
},
{
"alpha_2": "CG",
"name": "Congo",
"flag": "🇨🇬"
},
{
"alpha_2": "CH",
"name": "Switzerland",
"flag": "🇨🇭"
},
{
"alpha_2": "CI",
"name": "Côte d'Ivoire",
"flag": "🇨🇮"
},
{
"alpha_2": "CK",
"name": "Cook Islands",
"flag": "🇨🇰"
},
{
"alpha_2": "CL",
"name": "Chile",
"flag": "🇨🇱"
},
{
"alpha_2": "CM",
"name": "Cameroon",
"flag": "🇨🇲"
},
{
"alpha_2": "CN",
"name": "China",
"flag": "🇨🇳"
},
{
"alpha_2": "CO",
"name": "Colombia",
"flag": "🇨🇴"
},
{
"alpha_2": "CR",
"name": "Costa Rica",
"flag": "🇨🇷"
},
{
"alpha_2": "CU",
"name": "Cuba",
"flag": "🇨🇺"
},
{
"alpha_2": "CV",
"name": "Cabo Verde",
"flag": "🇨🇻"
},
{
"alpha_2": "CW",
"name": "Curaçao",
"flag": "🇨🇼"
},
{
"alpha_2": "CX",
"name": "Christmas Island",
"flag": "🇨🇽"
},
{
"alpha_2": "CY",
"name": "Cyprus",
"flag": "🇨🇾"
},
{
"alpha_2": "CZ",
"name": "Czechia",
"flag": "🇨🇿"
},
{
"alpha_2": "DE",
"name": "Germany",
"flag": "🇩🇪"
},
{
"alpha_2": "DJ",
"name": "Djibouti",
"flag": "🇩🇯"
},
{
"alpha_2": "DK",
"name": "Denmark",
"flag": "🇩🇰"
},
{
"alpha_2": "DM",
"name": "Dominica",
"flag": "🇩🇲"
},
{
"alpha_2": "DO",
"name": "Dominican Republic",
"flag": "🇩🇴"
},
{
"alpha_2": "DZ",
"name": "Algeria",
"flag": "🇩🇿"
},
{
"alpha_2": "EC",
"name": "Ecuador",
"flag": "🇪🇨"
},
{
"alpha_2": "EE",
"name": "Estonia",
"flag": "🇪🇪"
},
{
"alpha_2": "EG",
"name": "Egypt",
"flag": "🇪🇬"
},
{
"alpha_2": "EH",
"name": "Western Sahara",
"flag": "🇪🇭"
},
{
"alpha_2": "ER",
"name": "Eritrea",
"flag": "🇪🇷"
},
{
"alpha_2": "ES",
"name": "Spain",
"flag": "🇪🇸"
},
{
"alpha_2": "ET",
"name": "Ethiopia",
"flag": "🇪🇹"
},
{
"alpha_2": "FI",
"name": "Finland",
"flag": "🇫🇮"
},
{
"alpha_2": "FJ",
"name": "Fiji",
"flag": "🇫🇯"
},
{
"alpha_2": "FK",
"name": "Falkland Islands (Malvinas)",
"flag": "🇫🇰"
},
{
"alpha_2": "FM",
"name": "Micronesia, Federated States of",
"flag": "🇫🇲"
},
{
"alpha_2": "FO",
"name": "Faroe Islands",
"flag": "🇫🇴"
},
{
"alpha_2": "FR",
"name": "France",
"flag": "🇫🇷"
},
{
"alpha_2": "GA",
"name": "Gabon",
"flag": "🇬🇦"
},
{
"alpha_2": "GB",
"name": "United Kingdom",
"flag": "🇬🇧"
},
{
"alpha_2": "GD",
"name": "Grenada",
"flag": "🇬🇩"
},
{
"alpha_2": "GE",
"name": "Georgia",
"flag": "🇬🇪"
},
{
"alpha_2": "GF",
"name": "French Guiana",
"flag": "🇬🇫"
},
{
"alpha_2": "GG",
"name": "Guernsey",
"flag": "🇬🇬"
},
{
"alpha_2": "GH",
"name": "Ghana",
"flag": "🇬🇭"
},
{
"alpha_2": "GI",
"name": "Gibraltar",
"flag": "🇬🇮"
},
{
"alpha_2": "GL",
"name": "Greenland",
"flag": "🇬🇱"
},
{
"alpha_2": "GM",
"name": "Gambia",
"flag": "🇬🇲"
},
{
"alpha_2": "GN",
"name": "Guinea",
"flag": "🇬🇳"
},
{
"alpha_2": "GP",
"name": "Guadeloupe",
"flag": "🇬🇵"
},
{
"alpha_2": "GQ",
"name": "Equatorial Guinea",
"flag": "🇬🇶"
},
{
"alpha_2": "GR",
"name": "Greece",
"flag": "🇬🇷"
},
{
"alpha_2": "GS",
"name": "South Georgia and the South Sandwich Islands",
"flag": "🇬🇸"
},
{
"alpha_2": "GT",
"name": "Guatemala",
"flag": "🇬🇹"
},
{
"alpha_2": "GU",
"name": "Guam",
"flag": "🇬🇺"
},
{
"alpha_2": "GW",
"name": "Guinea-Bissau",
"flag": "🇬🇼"
},
{
"alpha_2": "GY",
"name": "Guyana",
"flag": "🇬🇾"
},
{
"alpha_2": "HK",
"name": "Hong Kong",
"flag": "🇭🇰"
},
{
"alpha_2": "HM",
"name": "Heard Island and McDonald Islands",
"flag": "🇭🇲"
},
{
"alpha_2": "HN",
"name": "Honduras",
"flag": "🇭🇳"
},
{
"alpha_2": "HR",
"name": "Croatia",
"flag": "🇭🇷"
},
{
"alpha_2": "HT",
"name": "Haiti",
"flag": "🇭🇹"
},
{
"alpha_2": "HU",
"name": "Hungary",
"flag": "🇭🇺"
},
{
"alpha_2": "ID",
"name": "Indonesia",
"flag": "🇮🇩"
},
{
"alpha_2": "IE",
"name": "Ireland",
"flag": "🇮🇪"
},
{
"alpha_2": "IL",
"name": "Israel",
"flag": "🇮🇱"
},
{
"alpha_2": "IM",
"name": "Isle of Man",
"flag": "🇮🇲"
},
{
"alpha_2": "IN",
"name": "India",
"flag": "🇮🇳"
},
{
"alpha_2": "IO",
"name": "British Indian Ocean Territory",
"flag": "🇮🇴"
},
{
"alpha_2": "IQ",
"name": "Iraq",
"flag": "🇮🇶"
},
{
"alpha_2": "IR",
"name": "Iran, Islamic Republic of",
"flag": "🇮🇷"
},
{
"alpha_2": "IS",
"name": "Iceland",
"flag": "🇮🇸"
},
{
"alpha_2": "IT",
"name": "Italy",
"flag": "🇮🇹"
},
{
"alpha_2": "JE",
"name": "Jersey",
"flag": "🇯🇪"
},
{
"alpha_2": "JM",
"name": "Jamaica",
"flag": "🇯🇲"
},
{
"alpha_2": "JO",
"name": "Jordan",
"flag": "🇯🇴"
},
{
"alpha_2": "JP",
"name": "Japan",
"flag": "🇯🇵"
},
{
"alpha_2": "KE",
"name": "Kenya",
"flag": "🇰🇪"
},
{
"alpha_2": "KG",
"name": "Kyrgyzstan",
"flag": "🇰🇬"
},
{
"alpha_2": "KH",
"name": "Cambodia",
"flag": "🇰🇭"
},
{
"alpha_2": "KI",
"name": "Kiribati",
"flag": "🇰🇮"
},
{
"alpha_2": "KM",
"name": "Comoros",
"flag": "🇰🇲"
},
{
"alpha_2": "KN",
"name": "Saint Kitts and Nevis",
"flag": "🇰🇳"
},
{
"alpha_2": "KP",
"name": "Korea, Democratic People's Republic of",
"flag": "🇰🇵"
},
{
"alpha_2": "KR",
"name": "Korea, Republic of",
"flag": "🇰🇷"
},
{
"alpha_2": "KW",
"name": "Kuwait",
"flag": "🇰🇼"
},
{
"alpha_2": "KY",
"name": "Cayman Islands",
"flag": "🇰🇾"
},
{
"alpha_2": "KZ",
"name": "Kazakhstan",
"flag": "🇰🇿"
},
{
"alpha_2": "LA",
"name": "Lao People's Democratic Republic",
"flag": "🇱🇦"
},
{
"alpha_2": "LB",
"name": "Lebanon",
"flag": "🇱🇧"
},
{
"alpha_2": "LC",
"name": "Saint Lucia",
"flag": "🇱🇨"
},
{
"alpha_2": "LI",
"name": "Liechtenstein",
"flag": "🇱🇮"
},
{
"alpha_2": "LK",
"name": "Sri Lanka",
"flag": "🇱🇰"
},
{
"alpha_2": "LR",
"name": "Liberia",
"flag": "🇱🇷"
},
{
"alpha_2": "LS",
"name": "Lesotho",
"flag": "🇱🇸"
},
{
"alpha_2": "LT",
"name": "Lithuania",
"flag": "🇱🇹"
},
{
"alpha_2": "LU",
"name": "Luxembourg",
"flag": "🇱🇺"
},
{
"alpha_2": "LV",
"name": "Latvia",
"flag": "🇱🇻"
},
{
"alpha_2": "LY",
"name": "Libya",
"flag": "🇱🇾"
},
{
"alpha_2": "MA",
"name": "Morocco",
"flag": "🇲🇦"
},
{
"alpha_2": "MC",
"name": "Monaco",
"flag": "🇲🇨"
},
{
"alpha_2": "MD",
"name": "Moldova, Republic of",
"flag": "🇲🇩"
},
{
"alpha_2": "ME",
"name": "Montenegro",
"flag": "🇲🇪"
},
{
"alpha_2": "MF",
"name": "Saint Martin (French part)",
"flag": "🇲🇫"
},
{
"alpha_2": "MG",
"name": "Madagascar",
"flag": "🇲🇬"
},
{
"alpha_2": "MH",
"name": "Marshall Islands",
"flag": "🇲🇭"
},
{
"alpha_2": "MK",
"name": "North Macedonia",
"flag": "🇲🇰"
},
{
"alpha_2": "ML",
"name": "Mali",
"flag": "🇲🇱"
},
{
"alpha_2": "MM",
"name": "Myanmar",
"flag": "🇲🇲"
},
{
"alpha_2": "MN",
"name": "Mongolia",
"flag": "🇲🇳"
},
{
"alpha_2": "MO",
"name": "Macao",
"flag": "🇲🇴"
},
{
"alpha_2": "MP",
"name": "Northern Mariana Islands",
"flag": "🇲🇵"
},
{
"alpha_2": "MQ",
"name": "Martinique",
"flag": "🇲🇶"
},
{
"alpha_2": "MR",
"name": "Mauritania",
"flag": "🇲🇷"
},
{
"alpha_2": "MS",
"name": "Montserrat",
"flag": "🇲🇸"
},
{
"alpha_2": "MT",
"name": "Malta",
"flag": "🇲🇹"
},
{
"alpha_2": "MU",
"name": "Mauritius",
"flag": "🇲🇺"
},
{
"alpha_2": "MV",
"name": "Maldives",
"flag": "🇲🇻"
},
{
"alpha_2": "MW",
"name": "Malawi",
"flag": "🇲🇼"
},
{
"alpha_2": "MX",
"name": "Mexico",
"flag": "🇲🇽"
},
{
"alpha_2": "MY",
"name": "Malaysia",
"flag": "🇲🇾"
},
{
"alpha_2": "MZ",
"name": "Mozambique",
"flag": "🇲🇿"
},
{
"alpha_2": "NA",
"name": "Namibia",
"flag": "🇳🇦"
},
{
"alpha_2": "NC",
"name": "New Caledonia",
"flag": "🇳🇨"
},
{
"alpha_2": "NE",
"name": "Niger",
"flag": "🇳🇪"
},
{
"alpha_2": "NF",
"name": "Norfolk Island",
"flag": "🇳🇫"
},
{
"alpha_2": "NG",
"name": "Nigeria",
"flag": "🇳🇬"
},
{
"alpha_2": "NI",
"name": "Nicaragua",
"flag": "🇳🇮"
},
{
"alpha_2": "NL",
"name": "Netherlands",
"flag": "🇳🇱"
},
{
"alpha_2": "NO",
"name": "Norway",
"flag": "🇳🇴"
},
{
"alpha_2": "NP",
"name": "Nepal",
"flag": "🇳🇵"
},
{
"alpha_2": "NR",
"name": "Nauru",
"flag": "🇳🇷"
},
{
"alpha_2": "NU",
"name": "Niue",
"flag": "🇳🇺"
},
{
"alpha_2": "NZ",
"name": "New Zealand",
"flag": "🇳🇿"
},
{
"alpha_2": "OM",
"name": "Oman",
"flag": "🇴🇲"
},
{
"alpha_2": "PA",
"name": "Panama",
"flag": "🇵🇦"
},
{
"alpha_2": "PE",
"name": "Peru",
"flag": "🇵🇪"
},
{
"alpha_2": "PF",
"name": "French Polynesia",
"flag": "🇵🇫"
},
{
"alpha_2": "PG",
"name": "Papua New Guinea",
"flag": "🇵🇬"
},
{
"alpha_2": "PH",
"name": "Philippines",
"flag": "🇵🇭"
},
{
"alpha_2": "PK",
"name": "Pakistan",
"flag": "🇵🇰"
},
{
"alpha_2": "PL",
"name": "Poland",
"flag": "🇵🇱"
},
{
"alpha_2": "PM",
"name": "Saint Pierre and Miquelon",
"flag": "🇵🇲"
},
{
"alpha_2": "PN",
"name": "Pitcairn",
"flag": "🇵🇳"
},
{
"alpha_2": "PR",
"name": "Puerto Rico",
"flag": "🇵🇷"
},
{
"alpha_2": "PS",
"name": "Palestine, State of",
"flag": "🇵🇸"
},
{
"alpha_2": "PT",
"name": "Portugal",
"flag": "🇵🇹"
},
{
"alpha_2": "PW",
"name": "Palau",
"flag": "🇵🇼"
},
{
"alpha_2": "PY",
"name": "Paraguay",
"flag": "🇵🇾"
},
{
"alpha_2": "QA",
"name": "Qatar",
"flag": "🇶🇦"
},
{
"alpha_2": "RE",
"name": "Réunion",
"flag": "🇷🇪"
},
{
"alpha_2": "RO",
"name": "Romania",
"flag": "🇷🇴"
},
{
"alpha_2": "RS",
"name": "Serbia",
"flag": "🇷🇸"
},
{
"alpha_2": "RU",
"name": "Russian Federation",
"flag": "🇷🇺"
},
{
"alpha_2": "RW",
"name": "Rwanda",
"flag": "🇷🇼"
},
{
"alpha_2": "SA",
"name": "Saudi Arabia",
"flag": "🇸🇦"
},
{
"alpha_2": "SB",
"name": "Solomon Islands",
"flag": "🇸🇧"
},
{
"alpha_2": "SC",
"name": "Seychelles",
"flag": "🇸🇨"
},
{
"alpha_2": "SD",
"name": "Sudan",
"flag": "🇸🇩"
},
{
"alpha_2": "SE",
"name": "Sweden",
"flag": "🇸🇪"
},
{
"alpha_2": "SG",
"name": "Singapore",
"flag": "🇸🇬"
},
{
"alpha_2": "SH",
"name": "Saint Helena, Ascension and Tristan da Cunha",
"flag": "🇸🇭"
},
{
"alpha_2": "SI",
"name": "Slovenia",
"flag": "🇸🇮"
},
{
"alpha_2": "SJ",
"name": "Svalbard and Jan Mayen",
"flag": "🇸🇯"
},
{
"alpha_2": "SK",
"name": "Slovakia",
"flag": "🇸🇰"
},
{
"alpha_2": "SL",
"name": "Sierra Leone",
"flag": "🇸🇱"
},
{
"alpha_2": "SM",
"name": "San Marino",
"flag": "🇸🇲"
},
{
"alpha_2": "SN",
"name": "Senegal",
"flag": "🇸🇳"
},
{
"alpha_2": "SO",
"name": "Somalia",
"flag": "🇸🇴"
},
{
"alpha_2": "SR",
"name": "Suriname",
"flag": "🇸🇷"
},
{
"alpha_2": "SS",
"name": "South Sudan",
"flag": "🇸🇸"
},
{
"alpha_2": "ST",
"name": "Sao Tome and Principe",
"flag": "🇸🇹"
},
{
"alpha_2": "SV",
"name": "El Salvador",
"flag": "🇸🇻"
},
{
"alpha_2": "SX",
"name": "Sint Maarten (Dutch part)",
"flag": "🇸🇽"
},
{
"alpha_2": "SY",
"name": "Syrian Arab Republic",
"flag": "🇸🇾"
},
{
"alpha_2": "SZ",
"name": "Eswatini",
"flag": "🇸🇿"
},
{
"alpha_2": "TC",
"name": "Turks and Caicos Islands",
"flag": "🇹🇨"
},
{
"alpha_2": "TD",
"name": "Chad",
"flag": "🇹🇩"
},
{
"alpha_2": "TF",
"name": "French Southern Territories",
"flag": "🇹🇫"
},
{
"alpha_2": "TG",
"name": "Togo",
"flag": "🇹🇬"
},
{
"alpha_2": "TH",
"name": "Thailand",
"flag": "🇹🇭"
},
{
"alpha_2": "TJ",
"name": "Tajikistan",
"flag": "🇹🇯"
},
{
"alpha_2": "TK",
"name": "Tokelau",
"flag": "🇹🇰"
},
{
"alpha_2": "TL",
"name": "Timor-Leste",
"flag": "🇹🇱"
},
{
"alpha_2": "TM",
"name": "Turkmenistan",
"flag": "🇹🇲"
},
{
"alpha_2": "TN",
"name": "Tunisia",
"flag": "🇹🇳"
},
{
"alpha_2": "TO",
"name": "Tonga",
"flag": "🇹🇴"
},
{
"alpha_2": "TR",
"name": "Türkiye",
"flag": "🇹🇷"
},
{
"alpha_2": "TT",
"name": "Trinidad and Tobago",
"flag": "🇹🇹"
},
{
"alpha_2": "TV",
"name": "Tuvalu",
"flag": "🇹🇻"
},
{
"alpha_2": "TW",
"name": "Taiwan, Province of China",
"flag": "🇹🇼"
},
{
"alpha_2": "TZ",
"name": "Tanzania, United Republic of",
"flag": "🇹🇿"
},
{
"alpha_2": "UA",
"name": "Ukraine",
"flag": "🇺🇦"
},
{
"alpha_2": "UG",
"name": "Uganda",
"flag": "🇺🇬"
},
{
"alpha_2": "UM",
"name": "United States Minor Outlying Islands",
"flag": "🇺🇲"
},
{
"alpha_2": "US",
"name": "United States",
"flag": "🇺🇸"
},
{
"alpha_2": "UY",
"name": "Uruguay",
"flag": "🇺🇾"
},
{
"alpha_2": "UZ",
"name": "Uzbekistan",
"flag": "🇺🇿"
},
{
"alpha_2": "VA",
"name": "Holy See (Vatican City State)",
"flag": "🇻🇦"
},
{
"alpha_2": "VC",
"name": "Saint Vincent and the Grenadines",
"flag": "🇻🇨"
},
{
"alpha_2": "VE",
"name": "Venezuela, Bolivarian Republic of",
"flag": "🇻🇪"
},
{
"alpha_2": "VG",
"name": "Virgin Islands, British",
"flag": "🇻🇬"
},
{
"alpha_2": "VI",
"name": "Virgin Islands, U.S.",
"flag": "🇻🇮"
},
{
"alpha_2": "VN",
"name": "Viet Nam",
"flag": "🇻🇳"
},
{
"alpha_2": "VU",
"name": "Vanuatu",
"flag": "🇻🇺"
},
{
"alpha_2": "WF",
"name": "Wallis and Futuna",
"flag": "🇼🇫"
},
{
"alpha_2": "WS",
"name": "Samoa",
"flag": "🇼🇸"
},
{
"alpha_2": "YE",
"name": "Yemen",
"flag": "🇾🇪"
},
{
"alpha_2": "YT",
"name": "Mayotte",
"flag": "🇾🇹"
},
{
"alpha_2": "ZA",
"name": "South Africa",
"flag": "🇿🇦"
},
{
"alpha_2": "ZM",
"name": "Zambia",
"flag": "🇿🇲"
},
{
"alpha_2": "ZW",
"name": "Zimbabwe",
"flag": "🇿🇼"
}
]
}
iso3166-2.json 311.3 KB
{
"3166-2": [
{
"code": "AD-02",
"name": "Canillo"
},
{
"code": "AD-03",
"name": "Encamp"
},
{
"code": "AD-04",
"name": "La Massana"
},
{
"code": "AD-05",
"name": "Ordino"
},
{
"code": "AD-06",
"name": "Sant Julià de Lòria"
},
{
"code": "AD-07",
"name": "Andorra la Vella"
},
{
"code": "AD-08",
"name": "Escaldes-Engordany"
},
{
"code": "AE-AJ",
"name": "‘Ajmān"
},
{
"code": "AE-AZ",
"name": "Abū Z̧aby"
},
{
"code": "AE-DU",
"name": "Dubayy"
},
{
"code": "AE-FU",
"name": "Al Fujayrah"
},
{
"code": "AE-RK",
"name": "Ra’s al Khaymah"
},
{
"code": "AE-SH",
"name": "Ash Shāriqah"
},
{
"code": "AE-UQ",
"name": "Umm al Qaywayn"
},
{
"code": "AF-BAL",
"name": "Balkh"
},
{
"code": "AF-BAM",
"name": "Bāmyān"
},
{
"code": "AF-BDG",
"name": "Bādghīs"
},
{
"code": "AF-BDS",
"name": "Badakhshān"
},
{
"code": "AF-BGL",
"name": "Baghlān"
},
{
"code": "AF-DAY",
"name": "Dāykundī"
},
{
"code": "AF-FRA",
"name": "Farāh"
},
{
"code": "AF-FYB",
"name": "Fāryāb"
},
{
"code": "AF-GHA",
"name": "Ghaznī"
},
{
"code": "AF-GHO",
"name": "Ghōr"
},
{
"code": "AF-HEL",
"name": "Helmand"
},
{
"code": "AF-HER",
"name": "Herāt"
},
{
"code": "AF-JOW",
"name": "Jowzjān"
},
{
"code": "AF-KAB",
"name": "Kābul"
},
{
"code": "AF-KAN",
"name": "Kandahār"
},
{
"code": "AF-KAP",
"name": "Kāpīsā"
},
{
"code": "AF-KDZ",
"name": "Kunduz"
},
{
"code": "AF-KHO",
"name": "Khōst"
},
{
"code": "AF-KNR",
"name": "Kunaṟ"
},
{
"code": "AF-LAG",
"name": "Laghmān"
},
{
"code": "AF-LOG",
"name": "Lōgar"
},
{
"code": "AF-NAN",
"name": "Nangarhār"
},
{
"code": "AF-NIM",
"name": "Nīmrōz"
},
{
"code": "AF-NUR",
"name": "Nūristān"
},
{
"code": "AF-PAN",
"name": "Panjshayr"
},
{
"code": "AF-PAR",
"name": "Parwān"
},
{
"code": "AF-PIA",
"name": "Paktiyā"
},
{
"code": "AF-PKA",
"name": "Paktīkā"
},
{
"code": "AF-SAM",
"name": "Samangān"
},
{
"code": "AF-SAR",
"name": "Sar-e Pul"
},
{
"code": "AF-TAK",
"name": "Takhār"
},
{
"code": "AF-URU",
"name": "Uruzgān"
},
{
"code": "AF-WAR",
"name": "Wardak"
},
{
"code": "AF-ZAB",
"name": "Zābul"
},
{
"code": "AG-03",
"name": "Saint George"
},
{
"code": "AG-04",
"name": "Saint John"
},
{
"code": "AG-05",
"name": "Saint Mary"
},
{
"code": "AG-06",
"name": "Saint Paul"
},
{
"code": "AG-07",
"name": "Saint Peter"
},
{
"code": "AG-08",
"name": "Saint Philip"
},
{
"code": "AG-10",
"name": "Barbuda"
},
{
"code": "AG-11",
"name": "Redonda"
},
{
"code": "AL-01",
"name": "Berat"
},
{
"code": "AL-02",
"name": "Durrës"
},
{
"code": "AL-03",
"name": "Elbasan"
},
{
"code": "AL-04",
"name": "Fier"
},
{
"code": "AL-05",
"name": "Gjirokastër"
},
{
"code": "AL-06",
"name": "Korçë"
},
{
"code": "AL-07",
"name": "Kukës"
},
{
"code": "AL-08",
"name": "Lezhë"
},
{
"code": "AL-09",
"name": "Dibër"
},
{
"code": "AL-10",
"name": "Shkodër"
},
{
"code": "AL-11",
"name": "Tiranë"
},
{
"code": "AL-12",
"name": "Vlorë"
},
{
"code": "AM-AG",
"name": "Aragac̣otn"
},
{
"code": "AM-AR",
"name": "Ararat"
},
{
"code": "AM-AV",
"name": "Armavir"
},
{
"code": "AM-ER",
"name": "Erevan"
},
{
"code": "AM-GR",
"name": "Geġark'unik'"
},
{
"code": "AM-KT",
"name": "Kotayk'"
},
{
"code": "AM-LO",
"name": "Loṙi"
},
{
"code": "AM-SH",
"name": "Širak"
},
{
"code": "AM-SU",
"name": "Syunik'"
},
{
"code": "AM-TV",
"name": "Tavuš"
},
{
"code": "AM-VD",
"name": "Vayoć Jor"
},
{
"code": "AO-BGO",
"name": "Bengo"
},
{
"code": "AO-BGU",
"name": "Benguela"
},
{
"code": "AO-BIE",
"name": "Bié"
},
{
"code": "AO-CAB",
"name": "Cabinda"
},
{
"code": "AO-CCU",
"name": "Cuando Cubango"
},
{
"code": "AO-CNN",
"name": "Cunene"
},
{
"code": "AO-CNO",
"name": "Cuanza-Norte"
},
{
"code": "AO-CUS",
"name": "Cuanza-Sul"
},
{
"code": "AO-HUA",
"name": "Huambo"
},
{
"code": "AO-HUI",
"name": "Huíla"
},
{
"code": "AO-LNO",
"name": "Lunda-Norte"
},
{
"code": "AO-LSU",
"name": "Lunda-Sul"
},
{
"code": "AO-LUA",
"name": "Luanda"
},
{
"code": "AO-MAL",
"name": "Malange"
},
{
"code": "AO-MOX",
"name": "Moxico"
},
{
"code": "AO-NAM",
"name": "Namibe"
},
{
"code": "AO-UIG",
"name": "Uíge"
},
{
"code": "AO-ZAI",
"name": "Zaire"
},
{
"code": "AR-A",
"name": "Salta"
},
{
"code": "AR-B",
"name": "Buenos Aires"
},
{
"code": "AR-C",
"name": "Ciudad Autónoma de Buenos Aires"
},
{
"code": "AR-D",
"name": "San Luis"
},
{
"code": "AR-E",
"name": "Entre Ríos"
},
{
"code": "AR-F",
"name": "La Rioja"
},
{
"code": "AR-G",
"name": "Santiago del Estero"
},
{
"code": "AR-H",
"name": "Chaco"
},
{
"code": "AR-J",
"name": "San Juan"
},
{
"code": "AR-K",
"name": "Catamarca"
},
{
"code": "AR-L",
"name": "La Pampa"
},
{
"code": "AR-M",
"name": "Mendoza"
},
{
"code": "AR-N",
"name": "Misiones"
},
{
"code": "AR-P",
"name": "Formosa"
},
{
"code": "AR-Q",
"name": "Neuquén"
},
{
"code": "AR-R",
"name": "Río Negro"
},
{
"code": "AR-S",
"name": "Santa Fe"
},
{
"code": "AR-T",
"name": "Tucumán"
},
{
"code": "AR-U",
"name": "Chubut"
},
{
"code": "AR-V",
"name": "Tierra del Fuego"
},
{
"code": "AR-W",
"name": "Corrientes"
},
{
"code": "AR-X",
"name": "Córdoba"
},
{
"code": "AR-Y",
"name": "Jujuy"
},
{
"code": "AR-Z",
"name": "Santa Cruz"
},
{
"code": "AT-1",
"name": "Burgenland"
},
{
"code": "AT-2",
"name": "Kärnten"
},
{
"code": "AT-3",
"name": "Niederösterreich"
},
{
"code": "AT-4",
"name": "Oberösterreich"
},
{
"code": "AT-5",
"name": "Salzburg"
},
{
"code": "AT-6",
"name": "Steiermark"
},
{
"code": "AT-7",
"name": "Tirol"
},
{
"code": "AT-8",
"name": "Vorarlberg"
},
{
"code": "AT-9",
"name": "Wien"
},
{
"code": "AU-ACT",
"name": "Australian Capital Territory"
},
{
"code": "AU-NSW",
"name": "New South Wales"
},
{
"code": "AU-NT",
"name": "Northern Territory"
},
{
"code": "AU-QLD",
"name": "Queensland"
},
{
"code": "AU-SA",
"name": "South Australia"
},
{
"code": "AU-TAS",
"name": "Tasmania"
},
{
"code": "AU-VIC",
"name": "Victoria"
},
{
"code": "AU-WA",
"name": "Western Australia"
},
{
"code": "AZ-ABS",
"name": "Abşeron"
},
{
"code": "AZ-AGA",
"name": "Ağstafa"
},
{
"code": "AZ-AGC",
"name": "Ağcabədi"
},
{
"code": "AZ-AGM",
"name": "Ağdam"
},
{
"code": "AZ-AGS",
"name": "Ağdaş"
},
{
"code": "AZ-AGU",
"name": "Ağsu"
},
{
"code": "AZ-AST",
"name": "Astara"
},
{
"code": "AZ-BA",
"name": "Bakı"
},
{
"code": "AZ-BAB",
"name": "Babək"
},
{
"code": "AZ-BAL",
"name": "Balakən"
},
{
"code": "AZ-BAR",
"name": "Bərdə"
},
{
"code": "AZ-BEY",
"name": "Beyləqan"
},
{
"code": "AZ-BIL",
"name": "Biləsuvar"
},
{
"code": "AZ-CAB",
"name": "Cəbrayıl"
},
{
"code": "AZ-CAL",
"name": "Cəlilabad"
},
{
"code": "AZ-CUL",
"name": "Culfa"
},
{
"code": "AZ-DAS",
"name": "Daşkəsən"
},
{
"code": "AZ-FUZ",
"name": "Füzuli"
},
{
"code": "AZ-GA",
"name": "Gəncə"
},
{
"code": "AZ-GAD",
"name": "Gədəbəy"
},
{
"code": "AZ-GOR",
"name": "Goranboy"
},
{
"code": "AZ-GOY",
"name": "Göyçay"
},
{
"code": "AZ-GYG",
"name": "Göygöl"
},
{
"code": "AZ-HAC",
"name": "Hacıqabul"
},
{
"code": "AZ-IMI",
"name": "İmişli"
},
{
"code": "AZ-ISM",
"name": "İsmayıllı"
},
{
"code": "AZ-KAL",
"name": "Kəlbəcər"
},
{
"code": "AZ-KAN",
"name": "Kǝngǝrli"
},
{
"code": "AZ-KUR",
"name": "Kürdəmir"
},
{
"code": "AZ-LA",
"name": "Lənkəran"
},
{
"code": "AZ-LAC",
"name": "Laçın"
},
{
"code": "AZ-LAN",
"name": "Lənkəran"
},
{
"code": "AZ-LER",
"name": "Lerik"
},
{
"code": "AZ-MAS",
"name": "Masallı"
},
{
"code": "AZ-MI",
"name": "Mingəçevir"
},
{
"code": "AZ-NA",
"name": "Naftalan"
},
{
"code": "AZ-NEF",
"name": "Neftçala"
},
{
"code": "AZ-NV",
"name": "Naxçıvan"
},
{
"code": "AZ-NX",
"name": "Naxçıvan"
},
{
"code": "AZ-OGU",
"name": "Oğuz"
},
{
"code": "AZ-ORD",
"name": "Ordubad"
},
{
"code": "AZ-QAB",
"name": "Qəbələ"
},
{
"code": "AZ-QAX",
"name": "Qax"
},
{
"code": "AZ-QAZ",
"name": "Qazax"
},
{
"code": "AZ-QBA",
"name": "Quba"
},
{
"code": "AZ-QBI",
"name": "Qubadlı"
},
{
"code": "AZ-QOB",
"name": "Qobustan"
},
{
"code": "AZ-QUS",
"name": "Qusar"
},
{
"code": "AZ-SA",
"name": "Şəki"
},
{
"code": "AZ-SAB",
"name": "Sabirabad"
},
{
"code": "AZ-SAD",
"name": "Sədərək"
},
{
"code": "AZ-SAH",
"name": "Şahbuz"
},
{
"code": "AZ-SAK",
"name": "Şəki"
},
{
"code": "AZ-SAL",
"name": "Salyan"
},
{
"code": "AZ-SAR",
"name": "Şərur"
},
{
"code": "AZ-SAT",
"name": "Saatlı"
},
{
"code": "AZ-SBN",
"name": "Şabran"
},
{
"code": "AZ-SIY",
"name": "Siyəzən"
},
{
"code": "AZ-SKR",
"name": "Şəmkir"
},
{
"code": "AZ-SM",
"name": "Sumqayıt"
},
{
"code": "AZ-SMI",
"name": "Şamaxı"
},
{
"code": "AZ-SMX",
"name": "Samux"
},
{
"code": "AZ-SR",
"name": "Şirvan"
},
{
"code": "AZ-SUS",
"name": "Şuşa"
},
{
"code": "AZ-TAR",
"name": "Tərtər"
},
{
"code": "AZ-TOV",
"name": "Tovuz"
},
{
"code": "AZ-UCA",
"name": "Ucar"
},
{
"code": "AZ-XA",
"name": "Xankəndi"
},
{
"code": "AZ-XAC",
"name": "Xaçmaz"
},
{
"code": "AZ-XCI",
"name": "Xocalı"
},
{
"code": "AZ-XIZ",
"name": "Xızı"
},
{
"code": "AZ-XVD",
"name": "Xocavənd"
},
{
"code": "AZ-YAR",
"name": "Yardımlı"
},
{
"code": "AZ-YE",
"name": "Yevlax"
},
{
"code": "AZ-YEV",
"name": "Yevlax"
},
{
"code": "AZ-ZAN",
"name": "Zəngilan"
},
{
"code": "AZ-ZAQ",
"name": "Zaqatala"
},
{
"code": "AZ-ZAR",
"name": "Zərdab"
},
{
"code": "BA-BIH",
"name": "Federacija Bosne i Hercegovine"
},
{
"code": "BA-BRC",
"name": "Brčko distrikt"
},
{
"code": "BA-SRP",
"name": "Republika Srpska"
},
{
"code": "BB-01",
"name": "Christ Church"
},
{
"code": "BB-02",
"name": "Saint Andrew"
},
{
"code": "BB-03",
"name": "Saint George"
},
{
"code": "BB-04",
"name": "Saint James"
},
{
"code": "BB-05",
"name": "Saint John"
},
{
"code": "BB-06",
"name": "Saint Joseph"
},
{
"code": "BB-07",
"name": "Saint Lucy"
},
{
"code": "BB-08",
"name": "Saint Michael"
},
{
"code": "BB-09",
"name": "Saint Peter"
},
{
"code": "BB-10",
"name": "Saint Philip"
},
{
"code": "BB-11",
"name": "Saint Thomas"
},
{
"code": "BD-01",
"name": "Bandarban"
},
{
"code": "BD-02",
"name": "Barguna"
},
{
"code": "BD-03",
"name": "Bogura"
},
{
"code": "BD-04",
"name": "Brahmanbaria"
},
{
"code": "BD-05",
"name": "Bagerhat"
},
{
"code": "BD-06",
"name": "Barishal"
},
{
"code": "BD-07",
"name": "Bhola"
},
{
"code": "BD-08",
"name": "Cumilla"
},
{
"code": "BD-09",
"name": "Chandpur"
},
{
"code": "BD-10",
"name": "Chattogram"
},
{
"code": "BD-11",
"name": "Cox's Bazar"
},
{
"code": "BD-12",
"name": "Chuadanga"
},
{
"code": "BD-13",
"name": "Dhaka"
},
{
"code": "BD-14",
"name": "Dinajpur"
},
{
"code": "BD-15",
"name": "Faridpur"
},
{
"code": "BD-16",
"name": "Feni"
},
{
"code": "BD-17",
"name": "Gopalganj"
},
{
"code": "BD-18",
"name": "Gazipur"
},
{
"code": "BD-19",
"name": "Gaibandha"
},
{
"code": "BD-20",
"name": "Habiganj"
},
{
"code": "BD-21",
"name": "Jamalpur"
},
{
"code": "BD-22",
"name": "Jashore"
},
{
"code": "BD-23",
"name": "Jhenaidah"
},
{
"code": "BD-24",
"name": "Joypurhat"
},
{
"code": "BD-25",
"name": "Jhalakathi"
},
{
"code": "BD-26",
"name": "Kishoreganj"
},
{
"code": "BD-27",
"name": "Khulna"
},
{
"code": "BD-28",
"name": "Kurigram"
},
{
"code": "BD-29",
"name": "Khagrachhari"
},
{
"code": "BD-30",
"name": "Kushtia"
},
{
"code": "BD-31",
"name": "Lakshmipur"
},
{
"code": "BD-32",
"name": "Lalmonirhat"
},
{
"code": "BD-33",
"name": "Manikganj"
},
{
"code": "BD-34",
"name": "Mymensingh"
},
{
"code": "BD-35",
"name": "Munshiganj"
},
{
"code": "BD-36",
"name": "Madaripur"
},
{
"code": "BD-37",
"name": "Magura"
},
{
"code": "BD-38",
"name": "Moulvibazar"
},
{
"code": "BD-39",
"name": "Meherpur"
},
{
"code": "BD-40",
"name": "Narayanganj"
},
{
"code": "BD-41",
"name": "Netrakona"
},
{
"code": "BD-42",
"name": "Narsingdi"
},
{
"code": "BD-43",
"name": "Narail"
},
{
"code": "BD-44",
"name": "Natore"
},
{
"code": "BD-45",
"name": "Chapai Nawabganj"
},
{
"code": "BD-46",
"name": "Nilphamari"
},
{
"code": "BD-47",
"name": "Noakhali"
},
{
"code": "BD-48",
"name": "Naogaon"
},
{
"code": "BD-49",
"name": "Pabna"
},
{
"code": "BD-50",
"name": "Pirojpur"
},
{
"code": "BD-51",
"name": "Patuakhali"
},
{
"code": "BD-52",
"name": "Panchagarh"
},
{
"code": "BD-53",
"name": "Rajbari"
},
{
"code": "BD-54",
"name": "Rajshahi"
},
{
"code": "BD-55",
"name": "Rangpur"
},
{
"code": "BD-56",
"name": "Rangamati"
},
{
"code": "BD-57",
"name": "Sherpur"
},
{
"code": "BD-58",
"name": "Satkhira"
},
{
"code": "BD-59",
"name": "Sirajganj"
},
{
"code": "BD-60",
"name": "Sylhet"
},
{
"code": "BD-61",
"name": "Sunamganj"
},
{
"code": "BD-62",
"name": "Shariatpur"
},
{
"code": "BD-63",
"name": "Tangail"
},
{
"code": "BD-64",
"name": "Thakurgaon"
},
{
"code": "BD-A",
"name": "Barishal"
},
{
"code": "BD-B",
"name": "Chattogram"
},
{
"code": "BD-C",
"name": "Dhaka"
},
{
"code": "BD-D",
"name": "Khulna"
},
{
"code": "BD-E",
"name": "Rajshahi"
},
{
"code": "BD-F",
"name": "Rangpur"
},
{
"code": "BD-G",
"name": "Sylhet"
},
{
"code": "BD-H",
"name": "Mymensingh"
},
{
"code": "BE-BRU",
"name": "Bruxelles-Capitale, Région de"
},
{
"code": "BE-VAN",
"name": "Antwerpen"
},
{
"code": "BE-VBR",
"name": "Vlaams-Brabant"
},
{
"code": "BE-VLG",
"name": "Vlaams Gewest"
},
{
"code": "BE-VLI",
"name": "Limburg"
},
{
"code": "BE-VOV",
"name": "Oost-Vlaanderen"
},
{
"code": "BE-VWV",
"name": "West-Vlaanderen"
},
{
"code": "BE-WAL",
"name": "wallonne, Région"
},
{
"code": "BE-WBR",
"name": "Brabant wallon"
},
{
"code": "BE-WHT",
"name": "Hainaut"
},
{
"code": "BE-WLG",
"name": "Liège"
},
{
"code": "BE-WLX",
"name": "Luxembourg"
},
{
"code": "BE-WNA",
"name": "Namur"
},
{
"code": "BF-01",
"name": "Boucle du Mouhoun"
},
{
"code": "BF-02",
"name": "Cascades"
},
{
"code": "BF-03",
"name": "Centre"
},
{
"code": "BF-04",
"name": "Centre-Est"
},
{
"code": "BF-05",
"name": "Centre-Nord"
},
{
"code": "BF-06",
"name": "Centre-Ouest"
},
{
"code": "BF-07",
"name": "Centre-Sud"
},
{
"code": "BF-08",
"name": "Est"
},
{
"code": "BF-09",
"name": "Hauts-Bassins"
},
{
"code": "BF-10",
"name": "Nord"
},
{
"code": "BF-11",
"name": "Plateau-Central"
},
{
"code": "BF-12",
"name": "Sahel"
},
{
"code": "BF-13",
"name": "Sud-Ouest"
},
{
"code": "BF-BAL",
"name": "Balé"
},
{
"code": "BF-BAM",
"name": "Bam"
},
{
"code": "BF-BAN",
"name": "Banwa"
},
{
"code": "BF-BAZ",
"name": "Bazèga"
},
{
"code": "BF-BGR",
"name": "Bougouriba"
},
{
"code": "BF-BLG",
"name": "Boulgou"
},
{
"code": "BF-BLK",
"name": "Boulkiemdé"
},
{
"code": "BF-COM",
"name": "Comoé"
},
{
"code": "BF-GAN",
"name": "Ganzourgou"
},
{
"code": "BF-GNA",
"name": "Gnagna"
},
{
"code": "BF-GOU",
"name": "Gourma"
},
{
"code": "BF-HOU",
"name": "Houet"
},
{
"code": "BF-IOB",
"name": "Ioba"
},
{
"code": "BF-KAD",
"name": "Kadiogo"
},
{
"code": "BF-KEN",
"name": "Kénédougou"
},
{
"code": "BF-KMD",
"name": "Komondjari"
},
{
"code": "BF-KMP",
"name": "Kompienga"
},
{
"code": "BF-KOP",
"name": "Koulpélogo"
},
{
"code": "BF-KOS",
"name": "Kossi"
},
{
"code": "BF-KOT",
"name": "Kouritenga"
},
{
"code": "BF-KOW",
"name": "Kourwéogo"
},
{
"code": "BF-LER",
"name": "Léraba"
},
{
"code": "BF-LOR",
"name": "Loroum"
},
{
"code": "BF-MOU",
"name": "Mouhoun"
},
{
"code": "BF-NAM",
"name": "Namentenga"
},
{
"code": "BF-NAO",
"name": "Nahouri"
},
{
"code": "BF-NAY",
"name": "Nayala"
},
{
"code": "BF-NOU",
"name": "Noumbiel"
},
{
"code": "BF-OUB",
"name": "Oubritenga"
},
{
"code": "BF-OUD",
"name": "Oudalan"
},
{
"code": "BF-PAS",
"name": "Passoré"
},
{
"code": "BF-PON",
"name": "Poni"
},
{
"code": "BF-SEN",
"name": "Séno"
},
{
"code": "BF-SIS",
"name": "Sissili"
},
{
"code": "BF-SMT",
"name": "Sanmatenga"
},
{
"code": "BF-SNG",
"name": "Sanguié"
},
{
"code": "BF-SOM",
"name": "Soum"
},
{
"code": "BF-SOR",
"name": "Sourou"
},
{
"code": "BF-TAP",
"name": "Tapoa"
},
{
"code": "BF-TUI",
"name": "Tuy"
},
{
"code": "BF-YAG",
"name": "Yagha"
},
{
"code": "BF-YAT",
"name": "Yatenga"
},
{
"code": "BF-ZIR",
"name": "Ziro"
},
{
"code": "BF-ZON",
"name": "Zondoma"
},
{
"code": "BF-ZOU",
"name": "Zoundwéogo"
},
{
"code": "BG-01",
"name": "Blagoevgrad"
},
{
"code": "BG-02",
"name": "Burgas"
},
{
"code": "BG-03",
"name": "Varna"
},
{
"code": "BG-04",
"name": "Veliko Tarnovo"
},
{
"code": "BG-05",
"name": "Vidin"
},
{
"code": "BG-06",
"name": "Vratsa"
},
{
"code": "BG-07",
"name": "Gabrovo"
},
{
"code": "BG-08",
"name": "Dobrich"
},
{
"code": "BG-09",
"name": "Kardzhali"
},
{
"code": "BG-10",
"name": "Kyustendil"
},
{
"code": "BG-11",
"name": "Lovech"
},
{
"code": "BG-12",
"name": "Montana"
},
{
"code": "BG-13",
"name": "Pazardzhik"
},
{
"code": "BG-14",
"name": "Pernik"
},
{
"code": "BG-15",
"name": "Pleven"
},
{
"code": "BG-16",
"name": "Plovdiv"
},
{
"code": "BG-17",
"name": "Razgrad"
},
{
"code": "BG-18",
"name": "Ruse"
},
{
"code": "BG-19",
"name": "Silistra"
},
{
"code": "BG-20",
"name": "Sliven"
},
{
"code": "BG-21",
"name": "Smolyan"
},
{
"code": "BG-22",
"name": "Sofia (stolitsa)"
},
{
"code": "BG-23",
"name": "Sofia"
},
{
"code": "BG-24",
"name": "Stara Zagora"
},
{
"code": "BG-25",
"name": "Targovishte"
},
{
"code": "BG-26",
"name": "Haskovo"
},
{
"code": "BG-27",
"name": "Shumen"
},
{
"code": "BG-28",
"name": "Yambol"
},
{
"code": "BH-13",
"name": "Al ‘Āşimah"
},
{
"code": "BH-14",
"name": "Al Janūbīyah"
},
{
"code": "BH-15",
"name": "Al Muḩarraq"
},
{
"code": "BH-17",
"name": "Ash Shamālīyah"
},
{
"code": "BI-BB",
"name": "Bubanza"
},
{
"code": "BI-BL",
"name": "Bujumbura Rural"
},
{
"code": "BI-BM",
"name": "Bujumbura Mairie"
},
{
"code": "BI-BR",
"name": "Bururi"
},
{
"code": "BI-CA",
"name": "Cankuzo"
},
{
"code": "BI-CI",
"name": "Cibitoke"
},
{
"code": "BI-GI",
"name": "Gitega"
},
{
"code": "BI-KI",
"name": "Kirundo"
},
{
"code": "BI-KR",
"name": "Karuzi"
},
{
"code": "BI-KY",
"name": "Kayanza"
},
{
"code": "BI-MA",
"name": "Makamba"
},
{
"code": "BI-MU",
"name": "Muramvya"
},
{
"code": "BI-MW",
"name": "Mwaro"
},
{
"code": "BI-MY",
"name": "Muyinga"
},
{
"code": "BI-NG",
"name": "Ngozi"
},
{
"code": "BI-RM",
"name": "Rumonge"
},
{
"code": "BI-RT",
"name": "Rutana"
},
{
"code": "BI-RY",
"name": "Ruyigi"
},
{
"code": "BJ-AK",
"name": "Atacora"
},
{
"code": "BJ-AL",
"name": "Alibori"
},
{
"code": "BJ-AQ",
"name": "Atlantique"
},
{
"code": "BJ-BO",
"name": "Borgou"
},
{
"code": "BJ-CO",
"name": "Collines"
},
{
"code": "BJ-DO",
"name": "Donga"
},
{
"code": "BJ-KO",
"name": "Couffo"
},
{
"code": "BJ-LI",
"name": "Littoral"
},
{
"code": "BJ-MO",
"name": "Mono"
},
{
"code": "BJ-OU",
"name": "Ouémé"
},
{
"code": "BJ-PL",
"name": "Plateau"
},
{
"code": "BJ-ZO",
"name": "Zou"
},
{
"code": "BN-BE",
"name": "Belait"
},
{
"code": "BN-BM",
"name": "Brunei-Muara"
},
{
"code": "BN-TE",
"name": "Temburong"
},
{
"code": "BN-TU",
"name": "Tutong"
},
{
"code": "BO-B",
"name": "El Beni"
},
{
"code": "BO-C",
"name": "Cochabamba"
},
{
"code": "BO-H",
"name": "Chuquisaca"
},
{
"code": "BO-L",
"name": "La Paz"
},
{
"code": "BO-N",
"name": "Pando"
},
{
"code": "BO-O",
"name": "Oruro"
},
{
"code": "BO-P",
"name": "Potosí"
},
{
"code": "BO-S",
"name": "Santa Cruz"
},
{
"code": "BO-T",
"name": "Tarija"
},
{
"code": "BQ-BO",
"name": "Bonaire"
},
{
"code": "BQ-SA",
"name": "Saba"
},
{
"code": "BQ-SE",
"name": "Sint Eustatius"
},
{
"code": "BR-AC",
"name": "Acre"
},
{
"code": "BR-AL",
"name": "Alagoas"
},
{
"code": "BR-AM",
"name": "Amazonas"
},
{
"code": "BR-AP",
"name": "Amapá"
},
{
"code": "BR-BA",
"name": "Bahia"
},
{
"code": "BR-CE",
"name": "Ceará"
},
{
"code": "BR-DF",
"name": "Distrito Federal"
},
{
"code": "BR-ES",
"name": "Espírito Santo"
},
{
"code": "BR-GO",
"name": "Goiás"
},
{
"code": "BR-MA",
"name": "Maranhão"
},
{
"code": "BR-MG",
"name": "Minas Gerais"
},
{
"code": "BR-MS",
"name": "Mato Grosso do Sul"
},
{
"code": "BR-MT",
"name": "Mato Grosso"
},
{
"code": "BR-PA",
"name": "Pará"
},
{
"code": "BR-PB",
"name": "Paraíba"
},
{
"code": "BR-PE",
"name": "Pernambuco"
},
{
"code": "BR-PI",
"name": "Piauí"
},
{
"code": "BR-PR",
"name": "Paraná"
},
{
"code": "BR-RJ",
"name": "Rio de Janeiro"
},
{
"code": "BR-RN",
"name": "Rio Grande do Norte"
},
{
"code": "BR-RO",
"name": "Rondônia"
},
{
"code": "BR-RR",
"name": "Roraima"
},
{
"code": "BR-RS",
"name": "Rio Grande do Sul"
},
{
"code": "BR-SC",
"name": "Santa Catarina"
},
{
"code": "BR-SE",
"name": "Sergipe"
},
{
"code": "BR-SP",
"name": "São Paulo"
},
{
"code": "BR-TO",
"name": "Tocantins"
},
{
"code": "BS-AK",
"name": "Acklins"
},
{
"code": "BS-BI",
"name": "Bimini"
},
{
"code": "BS-BP",
"name": "Black Point"
},
{
"code": "BS-BY",
"name": "Berry Islands"
},
{
"code": "BS-CE",
"name": "Central Eleuthera"
},
{
"code": "BS-CI",
"name": "Cat Island"
},
{
"code": "BS-CK",
"name": "Crooked Island and Long Cay"
},
{
"code": "BS-CO",
"name": "Central Abaco"
},
{
"code": "BS-CS",
"name": "Central Andros"
},
{
"code": "BS-EG",
"name": "East Grand Bahama"
},
{
"code": "BS-EX",
"name": "Exuma"
},
{
"code": "BS-FP",
"name": "City of Freeport"
},
{
"code": "BS-GC",
"name": "Grand Cay"
},
{
"code": "BS-HI",
"name": "Harbour Island"
},
{
"code": "BS-HT",
"name": "Hope Town"
},
{
"code": "BS-IN",
"name": "Inagua"
},
{
"code": "BS-LI",
"name": "Long Island"
},
{
"code": "BS-MC",
"name": "Mangrove Cay"
},
{
"code": "BS-MG",
"name": "Mayaguana"
},
{
"code": "BS-MI",
"name": "Moore's Island"
},
{
"code": "BS-NE",
"name": "North Eleuthera"
},
{
"code": "BS-NO",
"name": "North Abaco"
},
{
"code": "BS-NP",
"name": "New Providence"
},
{
"code": "BS-NS",
"name": "North Andros"
},
{
"code": "BS-RC",
"name": "Rum Cay"
},
{
"code": "BS-RI",
"name": "Ragged Island"
},
{
"code": "BS-SA",
"name": "South Andros"
},
{
"code": "BS-SE",
"name": "South Eleuthera"
},
{
"code": "BS-SO",
"name": "South Abaco"
},
{
"code": "BS-SS",
"name": "San Salvador"
},
{
"code": "BS-SW",
"name": "Spanish Wells"
},
{
"code": "BS-WG",
"name": "West Grand Bahama"
},
{
"code": "BT-11",
"name": "Paro"
},
{
"code": "BT-12",
"name": "Chhukha"
},
{
"code": "BT-13",
"name": "Haa"
},
{
"code": "BT-14",
"name": "Samtse"
},
{
"code": "BT-15",
"name": "Thimphu"
},
{
"code": "BT-21",
"name": "Tsirang"
},
{
"code": "BT-22",
"name": "Dagana"
},
{
"code": "BT-23",
"name": "Punakha"
},
{
"code": "BT-24",
"name": "Wangdue Phodrang"
},
{
"code": "BT-31",
"name": "Sarpang"
},
{
"code": "BT-32",
"name": "Trongsa"
},
{
"code": "BT-33",
"name": "Bumthang"
},
{
"code": "BT-34",
"name": "Zhemgang"
},
{
"code": "BT-41",
"name": "Trashigang"
},
{
"code": "BT-42",
"name": "Monggar"
},
{
"code": "BT-43",
"name": "Pema Gatshel"
},
{
"code": "BT-44",
"name": "Lhuentse"
},
{
"code": "BT-45",
"name": "Samdrup Jongkhar"
},
{
"code": "BT-GA",
"name": "Gasa"
},
{
"code": "BT-TY",
"name": "Trashi Yangtse"
},
{
"code": "BW-CE",
"name": "Central"
},
{
"code": "BW-CH",
"name": "Chobe"
},
{
"code": "BW-FR",
"name": "Francistown"
},
{
"code": "BW-GA",
"name": "Gaborone"
},
{
"code": "BW-GH",
"name": "Ghanzi"
},
{
"code": "BW-JW",
"name": "Jwaneng"
},
{
"code": "BW-KG",
"name": "Kgalagadi"
},
{
"code": "BW-KL",
"name": "Kgatleng"
},
{
"code": "BW-KW",
"name": "Kweneng"
},
{
"code": "BW-LO",
"name": "Lobatse"
},
{
"code": "BW-NE",
"name": "North East"
},
{
"code": "BW-NW",
"name": "North West"
},
{
"code": "BW-SE",
"name": "South East"
},
{
"code": "BW-SO",
"name": "Southern"
},
{
"code": "BW-SP",
"name": "Selibe Phikwe"
},
{
"code": "BW-ST",
"name": "Sowa Town"
},
{
"code": "BY-BR",
"name": "Bresckaja voblasć"
},
{
"code": "BY-HM",
"name": "Horad Minsk"
},
{
"code": "BY-HO",
"name": "Homieĺskaja voblasć"
},
{
"code": "BY-HR",
"name": "Hrodzienskaja voblasć"
},
{
"code": "BY-MA",
"name": "Mahilioŭskaja voblasć"
},
{
"code": "BY-MI",
"name": "Minskaja voblasć"
},
{
"code": "BY-VI",
"name": "Viciebskaja voblasć"
},
{
"code": "BZ-BZ",
"name": "Belize"
},
{
"code": "BZ-CY",
"name": "Cayo"
},
{
"code": "BZ-CZL",
"name": "Corozal"
},
{
"code": "BZ-OW",
"name": "Orange Walk"
},
{
"code": "BZ-SC",
"name": "Stann Creek"
},
{
"code": "BZ-TOL",
"name": "Toledo"
},
{
"code": "CA-AB",
"name": "Alberta"
},
{
"code": "CA-BC",
"name": "British Columbia"
},
{
"code": "CA-MB",
"name": "Manitoba"
},
{
"code": "CA-NB",
"name": "New Brunswick"
},
{
"code": "CA-NL",
"name": "Newfoundland and Labrador"
},
{
"code": "CA-NS",
"name": "Nova Scotia"
},
{
"code": "CA-NT",
"name": "Northwest Territories"
},
{
"code": "CA-NU",
"name": "Nunavut"
},
{
"code": "CA-ON",
"name": "Ontario"
},
{
"code": "CA-PE",
"name": "Prince Edward Island"
},
{
"code": "CA-QC",
"name": "Quebec"
},
{
"code": "CA-SK",
"name": "Saskatchewan"
},
{
"code": "CA-YT",
"name": "Yukon"
},
{
"code": "CD-BC",
"name": "Kongo Central"
},
{
"code": "CD-BU",
"name": "Bas-Uélé"
},
{
"code": "CD-EQ",
"name": "Équateur"
},
{
"code": "CD-HK",
"name": "Haut-Katanga"
},
{
"code": "CD-HL",
"name": "Haut-Lomami"
},
{
"code": "CD-HU",
"name": "Haut-Uélé"
},
{
"code": "CD-IT",
"name": "Ituri"
},
{
"code": "CD-KC",
"name": "Kasaï Central"
},
{
"code": "CD-KE",
"name": "Kasaï Oriental"
},
{
"code": "CD-KG",
"name": "Kwango"
},
{
"code": "CD-KL",
"name": "Kwilu"
},
{
"code": "CD-KN",
"name": "Kinshasa"
},
{
"code": "CD-KS",
"name": "Kasaï"
},
{
"code": "CD-LO",
"name": "Lomami"
},
{
"code": "CD-LU",
"name": "Lualaba"
},
{
"code": "CD-MA",
"name": "Maniema"
},
{
"code": "CD-MN",
"name": "Mai-Ndombe"
},
{
"code": "CD-MO",
"name": "Mongala"
},
{
"code": "CD-NK",
"name": "Nord-Kivu"
},
{
"code": "CD-NU",
"name": "Nord-Ubangi"
},
{
"code": "CD-SA",
"name": "Sankuru"
},
{
"code": "CD-SK",
"name": "Sud-Kivu"
},
{
"code": "CD-SU",
"name": "Sud-Ubangi"
},
{
"code": "CD-TA",
"name": "Tanganyika"
},
{
"code": "CD-TO",
"name": "Tshopo"
},
{
"code": "CD-TU",
"name": "Tshuapa"
},
{
"code": "CF-AC",
"name": "Ouham"
},
{
"code": "CF-BB",
"name": "Bamingui-Bangoran"
},
{
"code": "CF-BGF",
"name": "Bangui"
},
{
"code": "CF-BK",
"name": "Basse-Kotto"
},
{
"code": "CF-HK",
"name": "Haute-Kotto"
},
{
"code": "CF-HM",
"name": "Haut-Mbomou"
},
{
"code": "CF-HS",
"name": "Haute-Sangha / Mambéré-Kadéï"
},
{
"code": "CF-KB",
"name": "Gribingui"
},
{
"code": "CF-KG",
"name": "Kémo-Gribingui"
},
{
"code": "CF-LB",
"name": "Lobaye"
},
{
"code": "CF-MB",
"name": "Mbomou"
},
{
"code": "CF-MP",
"name": "Ombella-Mpoko"
},
{
"code": "CF-NM",
"name": "Nana-Mambéré"
},
{
"code": "CF-OP",
"name": "Ouham-Pendé"
},
{
"code": "CF-SE",
"name": "Sangha"
},
{
"code": "CF-UK",
"name": "Ouaka"
},
{
"code": "CF-VK",
"name": "Vakaga"
},
{
"code": "CG-11",
"name": "Bouenza"
},
{
"code": "CG-12",
"name": "Pool"
},
{
"code": "CG-13",
"name": "Sangha"
},
{
"code": "CG-14",
"name": "Plateaux"
},
{
"code": "CG-15",
"name": "Cuvette-Ouest"
},
{
"code": "CG-16",
"name": "Pointe-Noire"
},
{
"code": "CG-2",
"name": "Lékoumou"
},
{
"code": "CG-5",
"name": "Kouilou"
},
{
"code": "CG-7",
"name": "Likouala"
},
{
"code": "CG-8",
"name": "Cuvette"
},
{
"code": "CG-9",
"name": "Niari"
},
{
"code": "CG-BZV",
"name": "Brazzaville"
},
{
"code": "CH-AG",
"name": "Aargau"
},
{
"code": "CH-AI",
"name": "Appenzell Innerrhoden"
},
{
"code": "CH-AR",
"name": "Appenzell Ausserrhoden"
},
{
"code": "CH-BE",
"name": "Berne"
},
{
"code": "CH-BL",
"name": "Basel-Landschaft"
},
{
"code": "CH-BS",
"name": "Basel-Stadt"
},
{
"code": "CH-FR",
"name": "Fribourg"
},
{
"code": "CH-GE",
"name": "Genève"
},
{
"code": "CH-GL",
"name": "Glarus"
},
{
"code": "CH-GR",
"name": "Graubünden"
},
{
"code": "CH-JU",
"name": "Jura"
},
{
"code": "CH-LU",
"name": "Luzern"
},
{
"code": "CH-NE",
"name": "Neuchâtel"
},
{
"code": "CH-NW",
"name": "Nidwalden"
},
{
"code": "CH-OW",
"name": "Obwalden"
},
{
"code": "CH-SG",
"name": "Sankt Gallen"
},
{
"code": "CH-SH",
"name": "Schaffhausen"
},
{
"code": "CH-SO",
"name": "Solothurn"
},
{
"code": "CH-SZ",
"name": "Schwyz"
},
{
"code": "CH-TG",
"name": "Thurgau"
},
{
"code": "CH-TI",
"name": "Ticino"
},
{
"code": "CH-UR",
"name": "Uri"
},
{
"code": "CH-VD",
"name": "Vaud"
},
{
"code": "CH-VS",
"name": "Valais"
},
{
"code": "CH-ZG",
"name": "Zug"
},
{
"code": "CH-ZH",
"name": "Zürich"
},
{
"code": "CI-AB",
"name": "Abidjan"
},
{
"code": "CI-BS",
"name": "Bas-Sassandra"
},
{
"code": "CI-CM",
"name": "Comoé"
},
{
"code": "CI-DN",
"name": "Denguélé"
},
{
"code": "CI-GD",
"name": "Gôh-Djiboua"
},
{
"code": "CI-LC",
"name": "Lacs"
},
{
"code": "CI-LG",
"name": "Lagunes"
},
{
"code": "CI-MG",
"name": "Montagnes"
},
{
"code": "CI-SM",
"name": "Sassandra-Marahoué"
},
{
"code": "CI-SV",
"name": "Savanes"
},
{
"code": "CI-VB",
"name": "Vallée du Bandama"
},
{
"code": "CI-WR",
"name": "Woroba"
},
{
"code": "CI-YM",
"name": "Yamoussoukro"
},
{
"code": "CI-ZZ",
"name": "Zanzan"
},
{
"code": "CL-AI",
"name": "Aisén del General Carlos Ibañez del Campo"
},
{
"code": "CL-AN",
"name": "Antofagasta"
},
{
"code": "CL-AP",
"name": "Arica y Parinacota"
},
{
"code": "CL-AR",
"name": "La Araucanía"
},
{
"code": "CL-AT",
"name": "Atacama"
},
{
"code": "CL-BI",
"name": "Biobío"
},
{
"code": "CL-CO",
"name": "Coquimbo"
},
{
"code": "CL-LI",
"name": "Libertador General Bernardo O'Higgins"
},
{
"code": "CL-LL",
"name": "Los Lagos"
},
{
"code": "CL-LR",
"name": "Los Ríos"
},
{
"code": "CL-MA",
"name": "Magallanes"
},
{
"code": "CL-ML",
"name": "Maule"
},
{
"code": "CL-NB",
"name": "Ñuble"
},
{
"code": "CL-RM",
"name": "Región Metropolitana de Santiago"
},
{
"code": "CL-TA",
"name": "Tarapacá"
},
{
"code": "CL-VS",
"name": "Valparaíso"
},
{
"code": "CM-AD",
"name": "Adamaoua"
},
{
"code": "CM-CE",
"name": "Centre"
},
{
"code": "CM-EN",
"name": "Far North"
},
{
"code": "CM-ES",
"name": "East"
},
{
"code": "CM-LT",
"name": "Littoral"
},
{
"code": "CM-NO",
"name": "North"
},
{
"code": "CM-NW",
"name": "North-West"
},
{
"code": "CM-OU",
"name": "West"
},
{
"code": "CM-SU",
"name": "South"
},
{
"code": "CM-SW",
"name": "South-West"
},
{
"code": "CN-AH",
"name": "Anhui Sheng"
},
{
"code": "CN-BJ",
"name": "Beijing Shi"
},
{
"code": "CN-CQ",
"name": "Chongqing Shi"
},
{
"code": "CN-FJ",
"name": "Fujian Sheng"
},
{
"code": "CN-GD",
"name": "Guangdong Sheng"
},
{
"code": "CN-GS",
"name": "Gansu Sheng"
},
{
"code": "CN-GX",
"name": "Guangxi Zhuangzu Zizhiqu"
},
{
"code": "CN-GZ",
"name": "Guizhou Sheng"
},
{
"code": "CN-HA",
"name": "Henan Sheng"
},
{
"code": "CN-HB",
"name": "Hubei Sheng"
},
{
"code": "CN-HE",
"name": "Hebei Sheng"
},
{
"code": "CN-HI",
"name": "Hainan Sheng"
},
{
"code": "CN-HK",
"name": "Hong Kong SAR"
},
{
"code": "CN-HL",
"name": "Heilongjiang Sheng"
},
{
"code": "CN-HN",
"name": "Hunan Sheng"
},
{
"code": "CN-JL",
"name": "Jilin Sheng"
},
{
"code": "CN-JS",
"name": "Jiangsu Sheng"
},
{
"code": "CN-JX",
"name": "Jiangxi Sheng"
},
{
"code": "CN-LN",
"name": "Liaoning Sheng"
},
{
"code": "CN-MO",
"name": "Macao SAR"
},
{
"code": "CN-NM",
"name": "Nei Mongol Zizhiqu"
},
{
"code": "CN-NX",
"name": "Ningxia Huizu Zizhiqu"
},
{
"code": "CN-QH",
"name": "Qinghai Sheng"
},
{
"code": "CN-SC",
"name": "Sichuan Sheng"
},
{
"code": "CN-SD",
"name": "Shandong Sheng"
},
{
"code": "CN-SH",
"name": "Shanghai Shi"
},
{
"code": "CN-SN",
"name": "Shaanxi Sheng"
},
{
"code": "CN-SX",
"name": "Shanxi Sheng"
},
{
"code": "CN-TJ",
"name": "Tianjin Shi"
},
{
"code": "CN-TW",
"name": "Taiwan Sheng"
},
{
"code": "CN-XJ",
"name": "Xinjiang Uygur Zizhiqu"
},
{
"code": "CN-XZ",
"name": "Xizang Zizhiqu"
},
{
"code": "CN-YN",
"name": "Yunnan Sheng"
},
{
"code": "CN-ZJ",
"name": "Zhejiang Sheng"
},
{
"code": "CO-AMA",
"name": "Amazonas"
},
{
"code": "CO-ANT",
"name": "Antioquia"
},
{
"code": "CO-ARA",
"name": "Arauca"
},
{
"code": "CO-ATL",
"name": "Atlántico"
},
{
"code": "CO-BOL",
"name": "Bolívar"
},
{
"code": "CO-BOY",
"name": "Boyacá"
},
{
"code": "CO-CAL",
"name": "Caldas"
},
{
"code": "CO-CAQ",
"name": "Caquetá"
},
{
"code": "CO-CAS",
"name": "Casanare"
},
{
"code": "CO-CAU",
"name": "Cauca"
},
{
"code": "CO-CES",
"name": "Cesar"
},
{
"code": "CO-CHO",
"name": "Chocó"
},
{
"code": "CO-COR",
"name": "Córdoba"
},
{
"code": "CO-CUN",
"name": "Cundinamarca"
},
{
"code": "CO-DC",
"name": "Distrito Capital de Bogotá"
},
{
"code": "CO-GUA",
"name": "Guainía"
},
{
"code": "CO-GUV",
"name": "Guaviare"
},
{
"code": "CO-HUI",
"name": "Huila"
},
{
"code": "CO-LAG",
"name": "La Guajira"
},
{
"code": "CO-MAG",
"name": "Magdalena"
},
{
"code": "CO-MET",
"name": "Meta"
},
{
"code": "CO-NAR",
"name": "Nariño"
},
{
"code": "CO-NSA",
"name": "Norte de Santander"
},
{
"code": "CO-PUT",
"name": "Putumayo"
},
{
"code": "CO-QUI",
"name": "Quindío"
},
{
"code": "CO-RIS",
"name": "Risaralda"
},
{
"code": "CO-SAN",
"name": "Santander"
},
{
"code": "CO-SAP",
"name": "San Andrés, Providencia y Santa Catalina"
},
{
"code": "CO-SUC",
"name": "Sucre"
},
{
"code": "CO-TOL",
"name": "Tolima"
},
{
"code": "CO-VAC",
"name": "Valle del Cauca"
},
{
"code": "CO-VAU",
"name": "Vaupés"
},
{
"code": "CO-VID",
"name": "Vichada"
},
{
"code": "CR-A",
"name": "Alajuela"
},
{
"code": "CR-C",
"name": "Cartago"
},
{
"code": "CR-G",
"name": "Guanacaste"
},
{
"code": "CR-H",
"name": "Heredia"
},
{
"code": "CR-L",
"name": "Limón"
},
{
"code": "CR-P",
"name": "Puntarenas"
},
{
"code": "CR-SJ",
"name": "San José"
},
{
"code": "CU-01",
"name": "Pinar del Río"
},
{
"code": "CU-03",
"name": "La Habana"
},
{
"code": "CU-04",
"name": "Matanzas"
},
{
"code": "CU-05",
"name": "Villa Clara"
},
{
"code": "CU-06",
"name": "Cienfuegos"
},
{
"code": "CU-07",
"name": "Sancti Spíritus"
},
{
"code": "CU-08",
"name": "Ciego de Ávila"
},
{
"code": "CU-09",
"name": "Camagüey"
},
{
"code": "CU-10",
"name": "Las Tunas"
},
{
"code": "CU-11",
"name": "Holguín"
},
{
"code": "CU-12",
"name": "Granma"
},
{
"code": "CU-13",
"name": "Santiago de Cuba"
},
{
"code": "CU-14",
"name": "Guantánamo"
},
{
"code": "CU-15",
"name": "Artemisa"
},
{
"code": "CU-16",
"name": "Mayabeque"
},
{
"code": "CU-99",
"name": "Isla de la Juventud"
},
{
"code": "CV-B",
"name": "Ilhas de Barlavento"
},
{
"code": "CV-BR",
"name": "Brava"
},
{
"code": "CV-BV",
"name": "Boa Vista"
},
{
"code": "CV-CA",
"name": "Santa Catarina"
},
{
"code": "CV-CF",
"name": "Santa Catarina do Fogo"
},
{
"code": "CV-CR",
"name": "Santa Cruz"
},
{
"code": "CV-MA",
"name": "Maio"
},
{
"code": "CV-MO",
"name": "Mosteiros"
},
{
"code": "CV-PA",
"name": "Paul"
},
{
"code": "CV-PN",
"name": "Porto Novo"
},
{
"code": "CV-PR",
"name": "Praia"
},
{
"code": "CV-RB",
"name": "Ribeira Brava"
},
{
"code": "CV-RG",
"name": "Ribeira Grande"
},
{
"code": "CV-RS",
"name": "Ribeira Grande de Santiago"
},
{
"code": "CV-S",
"name": "Ilhas de Sotavento"
},
{
"code": "CV-SD",
"name": "São Domingos"
},
{
"code": "CV-SF",
"name": "São Filipe"
},
{
"code": "CV-SL",
"name": "Sal"
},
{
"code": "CV-SM",
"name": "São Miguel"
},
{
"code": "CV-SO",
"name": "São Lourenço dos Órgãos"
},
{
"code": "CV-SS",
"name": "São Salvador do Mundo"
},
{
"code": "CV-SV",
"name": "São Vicente"
},
{
"code": "CV-TA",
"name": "Tarrafal"
},
{
"code": "CV-TS",
"name": "Tarrafal de São Nicolau"
},
{
"code": "CY-01",
"name": "Lefkosia"
},
{
"code": "CY-02",
"name": "Lemesos"
},
{
"code": "CY-03",
"name": "Larnaka"
},
{
"code": "CY-04",
"name": "Ammochostos"
},
{
"code": "CY-05",
"name": "Pafos"
},
{
"code": "CY-06",
"name": "Keryneia"
},
{
"code": "CZ-10",
"name": "Praha, Hlavní město"
},
{
"code": "CZ-20",
"name": "Středočeský kraj"
},
{
"code": "CZ-201",
"name": "Benešov"
},
{
"code": "CZ-202",
"name": "Beroun"
},
{
"code": "CZ-203",
"name": "Kladno"
},
{
"code": "CZ-204",
"name": "Kolín"
},
{
"code": "CZ-205",
"name": "Kutná Hora"
},
{
"code": "CZ-206",
"name": "Mělník"
},
{
"code": "CZ-207",
"name": "Mladá Boleslav"
},
{
"code": "CZ-208",
"name": "Nymburk"
},
{
"code": "CZ-209",
"name": "Praha-východ"
},
{
"code": "CZ-20A",
"name": "Praha-západ"
},
{
"code": "CZ-20B",
"name": "Příbram"
},
{
"code": "CZ-20C",
"name": "Rakovník"
},
{
"code": "CZ-31",
"name": "Jihočeský kraj"
},
{
"code": "CZ-311",
"name": "České Budějovice"
},
{
"code": "CZ-312",
"name": "Český Krumlov"
},
{
"code": "CZ-313",
"name": "Jindřichův Hradec"
},
{
"code": "CZ-314",
"name": "Písek"
},
{
"code": "CZ-315",
"name": "Prachatice"
},
{
"code": "CZ-316",
"name": "Strakonice"
},
{
"code": "CZ-317",
"name": "Tábor"
},
{
"code": "CZ-32",
"name": "Plzeňský kraj"
},
{
"code": "CZ-321",
"name": "Domažlice"
},
{
"code": "CZ-322",
"name": "Klatovy"
},
{
"code": "CZ-323",
"name": "Plzeň-město"
},
{
"code": "CZ-324",
"name": "Plzeň-jih"
},
{
"code": "CZ-325",
"name": "Plzeň-sever"
},
{
"code": "CZ-326",
"name": "Rokycany"
},
{
"code": "CZ-327",
"name": "Tachov"
},
{
"code": "CZ-41",
"name": "Karlovarský kraj"
},
{
"code": "CZ-411",
"name": "Cheb"
},
{
"code": "CZ-412",
"name": "Karlovy Vary"
},
{
"code": "CZ-413",
"name": "Sokolov"
},
{
"code": "CZ-42",
"name": "Ústecký kraj"
},
{
"code": "CZ-421",
"name": "Děčín"
},
{
"code": "CZ-422",
"name": "Chomutov"
},
{
"code": "CZ-423",
"name": "Litoměřice"
},
{
"code": "CZ-424",
"name": "Louny"
},
{
"code": "CZ-425",
"name": "Most"
},
{
"code": "CZ-426",
"name": "Teplice"
},
{
"code": "CZ-427",
"name": "Ústí nad Labem"
},
{
"code": "CZ-51",
"name": "Liberecký kraj"
},
{
"code": "CZ-511",
"name": "Česká Lípa"
},
{
"code": "CZ-512",
"name": "Jablonec nad Nisou"
},
{
"code": "CZ-513",
"name": "Liberec"
},
{
"code": "CZ-514",
"name": "Semily"
},
{
"code": "CZ-52",
"name": "Královéhradecký kraj"
},
{
"code": "CZ-521",
"name": "Hradec Králové"
},
{
"code": "CZ-522",
"name": "Jičín"
},
{
"code": "CZ-523",
"name": "Náchod"
},
{
"code": "CZ-524",
"name": "Rychnov nad Kněžnou"
},
{
"code": "CZ-525",
"name": "Trutnov"
},
{
"code": "CZ-53",
"name": "Pardubický kraj"
},
{
"code": "CZ-531",
"name": "Chrudim"
},
{
"code": "CZ-532",
"name": "Pardubice"
},
{
"code": "CZ-533",
"name": "Svitavy"
},
{
"code": "CZ-534",
"name": "Ústí nad Orlicí"
},
{
"code": "CZ-63",
"name": "Kraj Vysočina"
},
{
"code": "CZ-631",
"name": "Havlíčkův Brod"
},
{
"code": "CZ-632",
"name": "Jihlava"
},
{
"code": "CZ-633",
"name": "Pelhřimov"
},
{
"code": "CZ-634",
"name": "Třebíč"
},
{
"code": "CZ-635",
"name": "Žďár nad Sázavou"
},
{
"code": "CZ-64",
"name": "Jihomoravský kraj"
},
{
"code": "CZ-641",
"name": "Blansko"
},
{
"code": "CZ-642",
"name": "Brno-město"
},
{
"code": "CZ-643",
"name": "Brno-venkov"
},
{
"code": "CZ-644",
"name": "Břeclav"
},
{
"code": "CZ-645",
"name": "Hodonín"
},
{
"code": "CZ-646",
"name": "Vyškov"
},
{
"code": "CZ-647",
"name": "Znojmo"
},
{
"code": "CZ-71",
"name": "Olomoucký kraj"
},
{
"code": "CZ-711",
"name": "Jeseník"
},
{
"code": "CZ-712",
"name": "Olomouc"
},
{
"code": "CZ-713",
"name": "Prostějov"
},
{
"code": "CZ-714",
"name": "Přerov"
},
{
"code": "CZ-715",
"name": "Šumperk"
},
{
"code": "CZ-72",
"name": "Zlínský kraj"
},
{
"code": "CZ-721",
"name": "Kroměříž"
},
{
"code": "CZ-722",
"name": "Uherské Hradiště"
},
{
"code": "CZ-723",
"name": "Vsetín"
},
{
"code": "CZ-724",
"name": "Zlín"
},
{
"code": "CZ-80",
"name": "Moravskoslezský kraj"
},
{
"code": "CZ-801",
"name": "Bruntál"
},
{
"code": "CZ-802",
"name": "Frýdek-Místek"
},
{
"code": "CZ-803",
"name": "Karviná"
},
{
"code": "CZ-804",
"name": "Nový Jičín"
},
{
"code": "CZ-805",
"name": "Opava"
},
{
"code": "CZ-806",
"name": "Ostrava-město"
},
{
"code": "DE-BB",
"name": "Brandenburg"
},
{
"code": "DE-BE",
"name": "Berlin"
},
{
"code": "DE-BW",
"name": "Baden-Württemberg"
},
{
"code": "DE-BY",
"name": "Bayern"
},
{
"code": "DE-HB",
"name": "Bremen"
},
{
"code": "DE-HE",
"name": "Hessen"
},
{
"code": "DE-HH",
"name": "Hamburg"
},
{
"code": "DE-MV",
"name": "Mecklenburg-Vorpommern"
},
{
"code": "DE-NI",
"name": "Niedersachsen"
},
{
"code": "DE-NW",
"name": "Nordrhein-Westfalen"
},
{
"code": "DE-RP",
"name": "Rheinland-Pfalz"
},
{
"code": "DE-SH",
"name": "Schleswig-Holstein"
},
{
"code": "DE-SL",
"name": "Saarland"
},
{
"code": "DE-SN",
"name": "Sachsen"
},
{
"code": "DE-ST",
"name": "Sachsen-Anhalt"
},
{
"code": "DE-TH",
"name": "Thüringen"
},
{
"code": "DJ-AR",
"name": "Arta"
},
{
"code": "DJ-AS",
"name": "Ali Sabieh"
},
{
"code": "DJ-DI",
"name": "Dikhil"
},
{
"code": "DJ-DJ",
"name": "Djibouti"
},
{
"code": "DJ-OB",
"name": "Obock"
},
{
"code": "DJ-TA",
"name": "Tadjourah"
},
{
"code": "DK-81",
"name": "Nordjylland"
},
{
"code": "DK-82",
"name": "Midtjylland"
},
{
"code": "DK-83",
"name": "Syddanmark"
},
{
"code": "DK-84",
"name": "Hovedstaden"
},
{
"code": "DK-85",
"name": "Sjælland"
},
{
"code": "DM-02",
"name": "Saint Andrew"
},
{
"code": "DM-03",
"name": "Saint David"
},
{
"code": "DM-04",
"name": "Saint George"
},
{
"code": "DM-05",
"name": "Saint John"
},
{
"code": "DM-06",
"name": "Saint Joseph"
},
{
"code": "DM-07",
"name": "Saint Luke"
},
{
"code": "DM-08",
"name": "Saint Mark"
},
{
"code": "DM-09",
"name": "Saint Patrick"
},
{
"code": "DM-10",
"name": "Saint Paul"
},
{
"code": "DM-11",
"name": "Saint Peter"
},
{
"code": "DO-01",
"name": "Distrito Nacional (Santo Domingo)"
},
{
"code": "DO-02",
"name": "Azua"
},
{
"code": "DO-03",
"name": "Baoruco"
},
{
"code": "DO-04",
"name": "Barahona"
},
{
"code": "DO-05",
"name": "Dajabón"
},
{
"code": "DO-06",
"name": "Duarte"
},
{
"code": "DO-07",
"name": "Elías Piña"
},
{
"code": "DO-08",
"name": "El Seibo"
},
{
"code": "DO-09",
"name": "Espaillat"
},
{
"code": "DO-10",
"name": "Independencia"
},
{
"code": "DO-11",
"name": "La Altagracia"
},
{
"code": "DO-12",
"name": "La Romana"
},
{
"code": "DO-13",
"name": "La Vega"
},
{
"code": "DO-14",
"name": "María Trinidad Sánchez"
},
{
"code": "DO-15",
"name": "Monte Cristi"
},
{
"code": "DO-16",
"name": "Pedernales"
},
{
"code": "DO-17",
"name": "Peravia"
},
{
"code": "DO-18",
"name": "Puerto Plata"
},
{
"code": "DO-19",
"name": "Hermanas Mirabal"
},
{
"code": "DO-20",
"name": "Samaná"
},
{
"code": "DO-21",
"name": "San Cristóbal"
},
{
"code": "DO-22",
"name": "San Juan"
},
{
"code": "DO-23",
"name": "San Pedro de Macorís"
},
{
"code": "DO-24",
"name": "Sánchez Ramírez"
},
{
"code": "DO-25",
"name": "Santiago"
},
{
"code": "DO-26",
"name": "Santiago Rodríguez"
},
{
"code": "DO-27",
"name": "Valverde"
},
{
"code": "DO-28",
"name": "Monseñor Nouel"
},
{
"code": "DO-29",
"name": "Monte Plata"
},
{
"code": "DO-30",
"name": "Hato Mayor"
},
{
"code": "DO-31",
"name": "San José de Ocoa"
},
{
"code": "DO-32",
"name": "Santo Domingo"
},
{
"code": "DO-33",
"name": "Cibao Nordeste"
},
{
"code": "DO-34",
"name": "Cibao Noroeste"
},
{
"code": "DO-35",
"name": "Cibao Norte"
},
{
"code": "DO-36",
"name": "Cibao Sur"
},
{
"code": "DO-37",
"name": "El Valle"
},
{
"code": "DO-38",
"name": "Enriquillo"
},
{
"code": "DO-39",
"name": "Higuamo"
},
{
"code": "DO-40",
"name": "Ozama"
},
{
"code": "DO-41",
"name": "Valdesia"
},
{
"code": "DO-42",
"name": "Yuma"
},
{
"code": "DZ-01",
"name": "Adrar"
},
{
"code": "DZ-02",
"name": "Chlef"
},
{
"code": "DZ-03",
"name": "Laghouat"
},
{
"code": "DZ-04",
"name": "Oum el Bouaghi"
},
{
"code": "DZ-05",
"name": "Batna"
},
{
"code": "DZ-06",
"name": "Béjaïa"
},
{
"code": "DZ-07",
"name": "Biskra"
},
{
"code": "DZ-08",
"name": "Béchar"
},
{
"code": "DZ-09",
"name": "Blida"
},
{
"code": "DZ-10",
"name": "Bouira"
},
{
"code": "DZ-11",
"name": "Tamanrasset"
},
{
"code": "DZ-12",
"name": "Tébessa"
},
{
"code": "DZ-13",
"name": "Tlemcen"
},
{
"code": "DZ-14",
"name": "Tiaret"
},
{
"code": "DZ-15",
"name": "Tizi Ouzou"
},
{
"code": "DZ-16",
"name": "Alger"
},
{
"code": "DZ-17",
"name": "Djelfa"
},
{
"code": "DZ-18",
"name": "Jijel"
},
{
"code": "DZ-19",
"name": "Sétif"
},
{
"code": "DZ-20",
"name": "Saïda"
},
{
"code": "DZ-21",
"name": "Skikda"
},
{
"code": "DZ-22",
"name": "Sidi Bel Abbès"
},
{
"code": "DZ-23",
"name": "Annaba"
},
{
"code": "DZ-24",
"name": "Guelma"
},
{
"code": "DZ-25",
"name": "Constantine"
},
{
"code": "DZ-26",
"name": "Médéa"
},
{
"code": "DZ-27",
"name": "Mostaganem"
},
{
"code": "DZ-28",
"name": "M'sila"
},
{
"code": "DZ-29",
"name": "Mascara"
},
{
"code": "DZ-30",
"name": "Ouargla"
},
{
"code": "DZ-31",
"name": "Oran"
},
{
"code": "DZ-32",
"name": "El Bayadh"
},
{
"code": "DZ-33",
"name": "Illizi"
},
{
"code": "DZ-34",
"name": "Bordj Bou Arréridj"
},
{
"code": "DZ-35",
"name": "Boumerdès"
},
{
"code": "DZ-36",
"name": "El Tarf"
},
{
"code": "DZ-37",
"name": "Tindouf"
},
{
"code": "DZ-38",
"name": "Tissemsilt"
},
{
"code": "DZ-39",
"name": "El Oued"
},
{
"code": "DZ-40",
"name": "Khenchela"
},
{
"code": "DZ-41",
"name": "Souk Ahras"
},
{
"code": "DZ-42",
"name": "Tipaza"
},
{
"code": "DZ-43",
"name": "Mila"
},
{
"code": "DZ-44",
"name": "Aïn Defla"
},
{
"code": "DZ-45",
"name": "Naama"
},
{
"code": "DZ-46",
"name": "Aïn Témouchent"
},
{
"code": "DZ-47",
"name": "Ghardaïa"
},
{
"code": "DZ-48",
"name": "Relizane"
},
{
"code": "DZ-49",
"name": "Timimoun"
},
{
"code": "DZ-50",
"name": "Bordj Badji Mokhtar"
},
{
"code": "DZ-51",
"name": "Ouled Djellal"
},
{
"code": "DZ-52",
"name": "Béni Abbès"
},
{
"code": "DZ-53",
"name": "In Salah"
},
{
"code": "DZ-54",
"name": "In Guezzam"
},
{
"code": "DZ-55",
"name": "Touggourt"
},
{
"code": "DZ-56",
"name": "Djanet"
},
{
"code": "DZ-57",
"name": "El Meghaier"
},
{
"code": "DZ-58",
"name": "El Meniaa"
},
{
"code": "EC-A",
"name": "Azuay"
},
{
"code": "EC-B",
"name": "Bolívar"
},
{
"code": "EC-C",
"name": "Carchi"
},
{
"code": "EC-D",
"name": "Orellana"
},
{
"code": "EC-E",
"name": "Esmeraldas"
},
{
"code": "EC-F",
"name": "Cañar"
},
{
"code": "EC-G",
"name": "Guayas"
},
{
"code": "EC-H",
"name": "Chimborazo"
},
{
"code": "EC-I",
"name": "Imbabura"
},
{
"code": "EC-L",
"name": "Loja"
},
{
"code": "EC-M",
"name": "Manabí"
},
{
"code": "EC-N",
"name": "Napo"
},
{
"code": "EC-O",
"name": "El Oro"
},
{
"code": "EC-P",
"name": "Pichincha"
},
{
"code": "EC-R",
"name": "Los Ríos"
},
{
"code": "EC-S",
"name": "Morona Santiago"
},
{
"code": "EC-SD",
"name": "Santo Domingo de los Tsáchilas"
},
{
"code": "EC-SE",
"name": "Santa Elena"
},
{
"code": "EC-T",
"name": "Tungurahua"
},
{
"code": "EC-U",
"name": "Sucumbíos"
},
{
"code": "EC-W",
"name": "Galápagos"
},
{
"code": "EC-X",
"name": "Cotopaxi"
},
{
"code": "EC-Y",
"name": "Pastaza"
},
{
"code": "EC-Z",
"name": "Zamora Chinchipe"
},
{
"code": "EE-130",
"name": "Alutaguse"
},
{
"code": "EE-141",
"name": "Anija"
},
{
"code": "EE-142",
"name": "Antsla"
},
{
"code": "EE-171",
"name": "Elva"
},
{
"code": "EE-184",
"name": "Haapsalu"
},
{
"code": "EE-191",
"name": "Haljala"
},
{
"code": "EE-198",
"name": "Harku"
},
{
"code": "EE-205",
"name": "Hiiumaa"
},
{
"code": "EE-214",
"name": "Häädemeeste"
},
{
"code": "EE-245",
"name": "Jõelähtme"
},
{
"code": "EE-247",
"name": "Jõgeva"
},
{
"code": "EE-251",
"name": "Jõhvi"
},
{
"code": "EE-255",
"name": "Järva"
},
{
"code": "EE-272",
"name": "Kadrina"
},
{
"code": "EE-283",
"name": "Kambja"
},
{
"code": "EE-284",
"name": "Kanepi"
},
{
"code": "EE-291",
"name": "Kastre"
},
{
"code": "EE-293",
"name": "Kehtna"
},
{
"code": "EE-296",
"name": "Keila"
},
{
"code": "EE-303",
"name": "Kihnu"
},
{
"code": "EE-305",
"name": "Kiili"
},
{
"code": "EE-317",
"name": "Kohila"
},
{
"code": "EE-321",
"name": "Kohtla-Järve"
},
{
"code": "EE-338",
"name": "Kose"
},
{
"code": "EE-353",
"name": "Kuusalu"
},
{
"code": "EE-37",
"name": "Harjumaa"
},
{
"code": "EE-39",
"name": "Hiiumaa"
},
{
"code": "EE-424",
"name": "Loksa"
},
{
"code": "EE-430",
"name": "Lääneranna"
},
{
"code": "EE-431",
"name": "Lääne-Harju"
},
{
"code": "EE-432",
"name": "Luunja"
},
{
"code": "EE-441",
"name": "Lääne-Nigula"
},
{
"code": "EE-442",
"name": "Lüganuse"
},
{
"code": "EE-446",
"name": "Maardu"
},
{
"code": "EE-45",
"name": "Ida-Virumaa"
},
{
"code": "EE-478",
"name": "Muhu"
},
{
"code": "EE-480",
"name": "Mulgi"
},
{
"code": "EE-486",
"name": "Mustvee"
},
{
"code": "EE-50",
"name": "Jõgevamaa"
},
{
"code": "EE-503",
"name": "Märjamaa"
},
{
"code": "EE-511",
"name": "Narva"
},
{
"code": "EE-514",
"name": "Narva-Jõesuu"
},
{
"code": "EE-52",
"name": "Järvamaa"
},
{
"code": "EE-528",
"name": "Nõo"
},
{
"code": "EE-557",
"name": "Otepää"
},
{
"code": "EE-56",
"name": "Läänemaa"
},
{
"code": "EE-567",
"name": "Paide"
},
{
"code": "EE-586",
"name": "Peipsiääre"
},
{
"code": "EE-60",
"name": "Lääne-Virumaa"
},
{
"code": "EE-615",
"name": "Põhja-Sakala"
},
{
"code": "EE-618",
"name": "Põltsamaa"
},
{
"code": "EE-622",
"name": "Põlva"
},
{
"code": "EE-624",
"name": "Pärnu"
},
{
"code": "EE-638",
"name": "Põhja-Pärnumaa"
},
{
"code": "EE-64",
"name": "Põlvamaa"
},
{
"code": "EE-651",
"name": "Raasiku"
},
{
"code": "EE-653",
"name": "Rae"
},
{
"code": "EE-661",
"name": "Rakvere"
},
{
"code": "EE-663",
"name": "Rakvere"
},
{
"code": "EE-668",
"name": "Rapla"
},
{
"code": "EE-68",
"name": "Pärnumaa"
},
{
"code": "EE-689",
"name": "Ruhnu"
},
{
"code": "EE-698",
"name": "Rõuge"
},
{
"code": "EE-708",
"name": "Räpina"
},
{
"code": "EE-71",
"name": "Raplamaa"
},
{
"code": "EE-712",
"name": "Saarde"
},
{
"code": "EE-714",
"name": "Saaremaa"
},
{
"code": "EE-719",
"name": "Saku"
},
{
"code": "EE-726",
"name": "Saue"
},
{
"code": "EE-732",
"name": "Setomaa"
},
{
"code": "EE-735",
"name": "Sillamäe"
},
{
"code": "EE-74",
"name": "Saaremaa"
},
{
"code": "EE-784",
"name": "Tallinn"
},
{
"code": "EE-79",
"name": "Tartumaa"
},
{
"code": "EE-792",
"name": "Tapa"
},
{
"code": "EE-793",
"name": "Tartu"
},
{
"code": "EE-796",
"name": "Tartu"
},
{
"code": "EE-803",
"name": "Toila"
},
{
"code": "EE-809",
"name": "Tori"
},
{
"code": "EE-81",
"name": "Valgamaa"
},
{
"code": "EE-824",
"name": "Tõrva"
},
{
"code": "EE-834",
"name": "Türi"
},
{
"code": "EE-84",
"name": "Viljandimaa"
},
{
"code": "EE-855",
"name": "Valga"
},
{
"code": "EE-87",
"name": "Võrumaa"
},
{
"code": "EE-890",
"name": "Viimsi"
},
{
"code": "EE-897",
"name": "Viljandi"
},
{
"code": "EE-899",
"name": "Viljandi"
},
{
"code": "EE-901",
"name": "Vinni"
},
{
"code": "EE-903",
"name": "Viru-Nigula"
},
{
"code": "EE-907",
"name": "Vormsi"
},
{
"code": "EE-917",
"name": "Võru"
},
{
"code": "EE-919",
"name": "Võru"
},
{
"code": "EE-928",
"name": "Väike-Maarja"
},
{
"code": "EG-ALX",
"name": "Al Iskandarīyah"
},
{
"code": "EG-ASN",
"name": "Aswān"
},
{
"code": "EG-AST",
"name": "Asyūţ"
},
{
"code": "EG-BA",
"name": "Al Baḩr al Aḩmar"
},
{
"code": "EG-BH",
"name": "Al Buḩayrah"
},
{
"code": "EG-BNS",
"name": "Banī Suwayf"
},
{
"code": "EG-C",
"name": "Al Qāhirah"
},
{
"code": "EG-DK",
"name": "Ad Daqahlīyah"
},
{
"code": "EG-DT",
"name": "Dumyāţ"
},
{
"code": "EG-FYM",
"name": "Al Fayyūm"
},
{
"code": "EG-GH",
"name": "Al Gharbīyah"
},
{
"code": "EG-GZ",
"name": "Al Jīzah"
},
{
"code": "EG-IS",
"name": "Al Ismā'īlīyah"
},
{
"code": "EG-JS",
"name": "Janūb Sīnā'"
},
{
"code": "EG-KB",
"name": "Al Qalyūbīyah"
},
{
"code": "EG-KFS",
"name": "Kafr ash Shaykh"
},
{
"code": "EG-KN",
"name": "Qinā"
},
{
"code": "EG-LX",
"name": "Al Uqşur"
},
{
"code": "EG-MN",
"name": "Al Minyā"
},
{
"code": "EG-MNF",
"name": "Al Minūfīyah"
},
{
"code": "EG-MT",
"name": "Maţrūḩ"
},
{
"code": "EG-PTS",
"name": "Būr Sa‘īd"
},
{
"code": "EG-SHG",
"name": "Sūhāj"
},
{
"code": "EG-SHR",
"name": "Ash Sharqīyah"
},
{
"code": "EG-SIN",
"name": "Shamāl Sīnā'"
},
{
"code": "EG-SUZ",
"name": "As Suways"
},
{
"code": "EG-WAD",
"name": "Al Wādī al Jadīd"
},
{
"code": "ER-AN",
"name": "Ansabā"
},
{
"code": "ER-DK",
"name": "Janūbī al Baḩrī al Aḩmar"
},
{
"code": "ER-DU",
"name": "Al Janūbī"
},
{
"code": "ER-GB",
"name": "Qāsh-Barkah"
},
{
"code": "ER-MA",
"name": "Al Awsaţ"
},
{
"code": "ER-SK",
"name": "Shimālī al Baḩrī al Aḩmar"
},
{
"code": "ES-A",
"name": "Alicante"
},
{
"code": "ES-AB",
"name": "Albacete"
},
{
"code": "ES-AL",
"name": "Almería"
},
{
"code": "ES-AN",
"name": "Andalucía"
},
{
"code": "ES-AR",
"name": "Aragón"
},
{
"code": "ES-AS",
"name": "Asturias, Principado de"
},
{
"code": "ES-AV",
"name": "Ávila"
},
{
"code": "ES-B",
"name": "Barcelona [Barcelona]"
},
{
"code": "ES-BA",
"name": "Badajoz"
},
{
"code": "ES-BI",
"name": "Bizkaia"
},
{
"code": "ES-BU",
"name": "Burgos"
},
{
"code": "ES-C",
"name": "A Coruña [La Coruña]"
},
{
"code": "ES-CA",
"name": "Cádiz"
},
{
"code": "ES-CB",
"name": "Cantabria"
},
{
"code": "ES-CC",
"name": "Cáceres"
},
{
"code": "ES-CE",
"name": "Ceuta"
},
{
"code": "ES-CL",
"name": "Castilla y León"
},
{
"code": "ES-CM",
"name": "Castilla-La Mancha"
},
{
"code": "ES-CN",
"name": "Canarias"
},
{
"code": "ES-CO",
"name": "Córdoba"
},
{
"code": "ES-CR",
"name": "Ciudad Real"
},
{
"code": "ES-CS",
"name": "Castellón"
},
{
"code": "ES-CT",
"name": "Catalunya [Cataluña]"
},
{
"code": "ES-CU",
"name": "Cuenca"
},
{
"code": "ES-EX",
"name": "Extremadura"
},
{
"code": "ES-GA",
"name": "Galicia [Galicia]"
},
{
"code": "ES-GC",
"name": "Las Palmas"
},
{
"code": "ES-GI",
"name": "Girona [Gerona]"
},
{
"code": "ES-GR",
"name": "Granada"
},
{
"code": "ES-GU",
"name": "Guadalajara"
},
{
"code": "ES-H",
"name": "Huelva"
},
{
"code": "ES-HU",
"name": "Huesca"
},
{
"code": "ES-IB",
"name": "Illes Balears [Islas Baleares]"
},
{
"code": "ES-J",
"name": "Jaén"
},
{
"code": "ES-L",
"name": "Lleida [Lérida]"
},
{
"code": "ES-LE",
"name": "León"
},
{
"code": "ES-LO",
"name": "La Rioja"
},
{
"code": "ES-LU",
"name": "Lugo [Lugo]"
},
{
"code": "ES-M",
"name": "Madrid"
},
{
"code": "ES-MA",
"name": "Málaga"
},
{
"code": "ES-MC",
"name": "Murcia, Región de"
},
{
"code": "ES-MD",
"name": "Madrid, Comunidad de"
},
{
"code": "ES-ML",
"name": "Melilla"
},
{
"code": "ES-MU",
"name": "Murcia"
},
{
"code": "ES-NA",
"name": "Navarra"
},
{
"code": "ES-NC",
"name": "Navarra, Comunidad Foral de"
},
{
"code": "ES-O",
"name": "Asturias"
},
{
"code": "ES-OR",
"name": "Ourense [Orense]"
},
{
"code": "ES-P",
"name": "Palencia"
},
{
"code": "ES-PM",
"name": "Illes Balears [Islas Baleares]"
},
{
"code": "ES-PO",
"name": "Pontevedra [Pontevedra]"
},
{
"code": "ES-PV",
"name": "País Vasco"
},
{
"code": "ES-RI",
"name": "La Rioja"
},
{
"code": "ES-S",
"name": "Cantabria"
},
{
"code": "ES-SA",
"name": "Salamanca"
},
{
"code": "ES-SE",
"name": "Sevilla"
},
{
"code": "ES-SG",
"name": "Segovia"
},
{
"code": "ES-SO",
"name": "Soria"
},
{
"code": "ES-SS",
"name": "Gipuzkoa"
},
{
"code": "ES-T",
"name": "Tarragona [Tarragona]"
},
{
"code": "ES-TE",
"name": "Teruel"
},
{
"code": "ES-TF",
"name": "Santa Cruz de Tenerife"
},
{
"code": "ES-TO",
"name": "Toledo"
},
{
"code": "ES-V",
"name": "Valencia"
},
{
"code": "ES-VA",
"name": "Valladolid"
},
{
"code": "ES-VC",
"name": "Valenciana, Comunidad"
},
{
"code": "ES-VI",
"name": "Álava"
},
{
"code": "ES-Z",
"name": "Zaragoza"
},
{
"code": "ES-ZA",
"name": "Zamora"
},
{
"code": "ET-AA",
"name": "Addis Ababa"
},
{
"code": "ET-AF",
"name": "Afar"
},
{
"code": "ET-AM",
"name": "Amara"
},
{
"code": "ET-BE",
"name": "Benshangul-Gumaz"
},
{
"code": "ET-DD",
"name": "Dire Dawa"
},
{
"code": "ET-GA",
"name": "Gambela Peoples"
},
{
"code": "ET-HA",
"name": "Harari People"
},
{
"code": "ET-OR",
"name": "Oromia"
},
{
"code": "ET-SI",
"name": "Sidama"
},
{
"code": "ET-SN",
"name": "Southern Nations, Nationalities and Peoples"
},
{
"code": "ET-SO",
"name": "Somali"
},
{
"code": "ET-SW",
"name": "Southwest Ethiopia Peoples"
},
{
"code": "ET-TI",
"name": "Tigrai"
},
{
"code": "FI-01",
"name": "Landskapet Åland"
},
{
"code": "FI-02",
"name": "Etelä-Karjala"
},
{
"code": "FI-03",
"name": "Etelä-Pohjanmaa"
},
{
"code": "FI-04",
"name": "Etelä-Savo"
},
{
"code": "FI-05",
"name": "Kainuu"
},
{
"code": "FI-06",
"name": "Kanta-Häme"
},
{
"code": "FI-07",
"name": "Keski-Pohjanmaa"
},
{
"code": "FI-08",
"name": "Keski-Suomi"
},
{
"code": "FI-09",
"name": "Kymenlaakso"
},
{
"code": "FI-10",
"name": "Lappi"
},
{
"code": "FI-11",
"name": "Pirkanmaa"
},
{
"code": "FI-12",
"name": "Pohjanmaa"
},
{
"code": "FI-13",
"name": "Pohjois-Karjala"
},
{
"code": "FI-14",
"name": "Pohjois-Pohjanmaa"
},
{
"code": "FI-15",
"name": "Pohjois-Savo"
},
{
"code": "FI-16",
"name": "Päijät-Häme"
},
{
"code": "FI-17",
"name": "Satakunta"
},
{
"code": "FI-18",
"name": "Uusimaa"
},
{
"code": "FI-19",
"name": "Varsinais-Suomi"
},
{
"code": "FJ-01",
"name": "Ba"
},
{
"code": "FJ-02",
"name": "Bua"
},
{
"code": "FJ-03",
"name": "Cakaudrove"
},
{
"code": "FJ-04",
"name": "Kadavu"
},
{
"code": "FJ-05",
"name": "Lau"
},
{
"code": "FJ-06",
"name": "Lomaiviti"
},
{
"code": "FJ-07",
"name": "Macuata"
},
{
"code": "FJ-08",
"name": "Nadroga and Navosa"
},
{
"code": "FJ-09",
"name": "Naitasiri"
},
{
"code": "FJ-10",
"name": "Namosi"
},
{
"code": "FJ-11",
"name": "Ra"
},
{
"code": "FJ-12",
"name": "Rewa"
},
{
"code": "FJ-13",
"name": "Serua"
},
{
"code": "FJ-14",
"name": "Tailevu"
},
{
"code": "FJ-C",
"name": "Central"
},
{
"code": "FJ-E",
"name": "Eastern"
},
{
"code": "FJ-N",
"name": "Northern"
},
{
"code": "FJ-R",
"name": "Rotuma"
},
{
"code": "FJ-W",
"name": "Western"
},
{
"code": "FM-KSA",
"name": "Kosrae"
},
{
"code": "FM-PNI",
"name": "Pohnpei"
},
{
"code": "FM-TRK",
"name": "Chuuk"
},
{
"code": "FM-YAP",
"name": "Yap"
},
{
"code": "FR-01",
"name": "Ain"
},
{
"code": "FR-02",
"name": "Aisne"
},
{
"code": "FR-03",
"name": "Allier"
},
{
"code": "FR-04",
"name": "Alpes-de-Haute-Provence"
},
{
"code": "FR-05",
"name": "Hautes-Alpes"
},
{
"code": "FR-06",
"name": "Alpes-Maritimes"
},
{
"code": "FR-07",
"name": "Ardèche"
},
{
"code": "FR-08",
"name": "Ardennes"
},
{
"code": "FR-09",
"name": "Ariège"
},
{
"code": "FR-10",
"name": "Aube"
},
{
"code": "FR-11",
"name": "Aude"
},
{
"code": "FR-12",
"name": "Aveyron"
},
{
"code": "FR-13",
"name": "Bouches-du-Rhône"
},
{
"code": "FR-14",
"name": "Calvados"
},
{
"code": "FR-15",
"name": "Cantal"
},
{
"code": "FR-16",
"name": "Charente"
},
{
"code": "FR-17",
"name": "Charente-Maritime"
},
{
"code": "FR-18",
"name": "Cher"
},
{
"code": "FR-19",
"name": "Corrèze"
},
{
"code": "FR-20R",
"name": "Corse"
},
{
"code": "FR-21",
"name": "Côte-d'Or"
},
{
"code": "FR-22",
"name": "Côtes-d'Armor"
},
{
"code": "FR-23",
"name": "Creuse"
},
{
"code": "FR-24",
"name": "Dordogne"
},
{
"code": "FR-25",
"name": "Doubs"
},
{
"code": "FR-26",
"name": "Drôme"
},
{
"code": "FR-27",
"name": "Eure"
},
{
"code": "FR-28",
"name": "Eure-et-Loir"
},
{
"code": "FR-29",
"name": "Finistère"
},
{
"code": "FR-2A",
"name": "Corse-du-Sud"
},
{
"code": "FR-2B",
"name": "Haute-Corse"
},
{
"code": "FR-30",
"name": "Gard"
},
{
"code": "FR-31",
"name": "Haute-Garonne"
},
{
"code": "FR-32",
"name": "Gers"
},
{
"code": "FR-33",
"name": "Gironde"
},
{
"code": "FR-34",
"name": "Hérault"
},
{
"code": "FR-35",
"name": "Ille-et-Vilaine"
},
{
"code": "FR-36",
"name": "Indre"
},
{
"code": "FR-37",
"name": "Indre-et-Loire"
},
{
"code": "FR-38",
"name": "Isère"
},
{
"code": "FR-39",
"name": "Jura"
},
{
"code": "FR-40",
"name": "Landes"
},
{
"code": "FR-41",
"name": "Loir-et-Cher"
},
{
"code": "FR-42",
"name": "Loire"
},
{
"code": "FR-43",
"name": "Haute-Loire"
},
{
"code": "FR-44",
"name": "Loire-Atlantique"
},
{
"code": "FR-45",
"name": "Loiret"
},
{
"code": "FR-46",
"name": "Lot"
},
{
"code": "FR-47",
"name": "Lot-et-Garonne"
},
{
"code": "FR-48",
"name": "Lozère"
},
{
"code": "FR-49",
"name": "Maine-et-Loire"
},
{
"code": "FR-50",
"name": "Manche"
},
{
"code": "FR-51",
"name": "Marne"
},
{
"code": "FR-52",
"name": "Haute-Marne"
},
{
"code": "FR-53",
"name": "Mayenne"
},
{
"code": "FR-54",
"name": "Meurthe-et-Moselle"
},
{
"code": "FR-55",
"name": "Meuse"
},
{
"code": "FR-56",
"name": "Morbihan"
},
{
"code": "FR-57",
"name": "Moselle"
},
{
"code": "FR-58",
"name": "Nièvre"
},
{
"code": "FR-59",
"name": "Nord"
},
{
"code": "FR-60",
"name": "Oise"
},
{
"code": "FR-61",
"name": "Orne"
},
{
"code": "FR-62",
"name": "Pas-de-Calais"
},
{
"code": "FR-63",
"name": "Puy-de-Dôme"
},
{
"code": "FR-64",
"name": "Pyrénées-Atlantiques"
},
{
"code": "FR-65",
"name": "Hautes-Pyrénées"
},
{
"code": "FR-66",
"name": "Pyrénées-Orientales"
},
{
"code": "FR-67",
"name": "Bas-Rhin"
},
{
"code": "FR-68",
"name": "Haut-Rhin"
},
{
"code": "FR-69",
"name": "Rhône"
},
{
"code": "FR-69M",
"name": "Métropole de Lyon"
},
{
"code": "FR-6AE",
"name": "Alsace"
},
{
"code": "FR-70",
"name": "Haute-Saône"
},
{
"code": "FR-71",
"name": "Saône-et-Loire"
},
{
"code": "FR-72",
"name": "Sarthe"
},
{
"code": "FR-73",
"name": "Savoie"
},
{
"code": "FR-74",
"name": "Haute-Savoie"
},
{
"code": "FR-75C",
"name": "Paris"
},
{
"code": "FR-76",
"name": "Seine-Maritime"
},
{
"code": "FR-77",
"name": "Seine-et-Marne"
},
{
"code": "FR-78",
"name": "Yvelines"
},
{
"code": "FR-79",
"name": "Deux-Sèvres"
},
{
"code": "FR-80",
"name": "Somme"
},
{
"code": "FR-81",
"name": "Tarn"
},
{
"code": "FR-82",
"name": "Tarn-et-Garonne"
},
{
"code": "FR-83",
"name": "Var"
},
{
"code": "FR-84",
"name": "Vaucluse"
},
{
"code": "FR-85",
"name": "Vendée"
},
{
"code": "FR-86",
"name": "Vienne"
},
{
"code": "FR-87",
"name": "Haute-Vienne"
},
{
"code": "FR-88",
"name": "Vosges"
},
{
"code": "FR-89",
"name": "Yonne"
},
{
"code": "FR-90",
"name": "Territoire de Belfort"
},
{
"code": "FR-91",
"name": "Essonne"
},
{
"code": "FR-92",
"name": "Hauts-de-Seine"
},
{
"code": "FR-93",
"name": "Seine-Saint-Denis"
},
{
"code": "FR-94",
"name": "Val-de-Marne"
},
{
"code": "FR-95",
"name": "Val-d'Oise"
},
{
"code": "FR-971",
"name": "Guadeloupe"
},
{
"code": "FR-972",
"name": "Martinique"
},
{
"code": "FR-973",
"name": "Guyane (française)"
},
{
"code": "FR-974",
"name": "La Réunion"
},
{
"code": "FR-976",
"name": "Mayotte"
},
{
"code": "FR-ARA",
"name": "Auvergne-Rhône-Alpes"
},
{
"code": "FR-BFC",
"name": "Bourgogne-Franche-Comté"
},
{
"code": "FR-BL",
"name": "Saint-Barthélemy"
},
{
"code": "FR-BRE",
"name": "Bretagne"
},
{
"code": "FR-CP",
"name": "Clipperton"
},
{
"code": "FR-CVL",
"name": "Centre-Val de Loire"
},
{
"code": "FR-GES",
"name": "Grand-Est"
},
{
"code": "FR-HDF",
"name": "Hauts-de-France"
},
{
"code": "FR-IDF",
"name": "Île-de-France"
},
{
"code": "FR-MF",
"name": "Saint-Martin"
},
{
"code": "FR-NAQ",
"name": "Nouvelle-Aquitaine"
},
{
"code": "FR-NC",
"name": "Nouvelle-Calédonie"
},
{
"code": "FR-NOR",
"name": "Normandie"
},
{
"code": "FR-OCC",
"name": "Occitanie"
},
{
"code": "FR-PAC",
"name": "Provence-Alpes-Côte-d’Azur"
},
{
"code": "FR-PDL",
"name": "Pays-de-la-Loire"
},
{
"code": "FR-PF",
"name": "Polynésie française"
},
{
"code": "FR-PM",
"name": "Saint-Pierre-et-Miquelon"
},
{
"code": "FR-TF",
"name": "Terres australes françaises"
},
{
"code": "FR-WF",
"name": "Wallis-et-Futuna"
},
{
"code": "GA-1",
"name": "Estuaire"
},
{
"code": "GA-2",
"name": "Haut-Ogooué"
},
{
"code": "GA-3",
"name": "Moyen-Ogooué"
},
{
"code": "GA-4",
"name": "Ngounié"
},
{
"code": "GA-5",
"name": "Nyanga"
},
{
"code": "GA-6",
"name": "Ogooué-Ivindo"
},
{
"code": "GA-7",
"name": "Ogooué-Lolo"
},
{
"code": "GA-8",
"name": "Ogooué-Maritime"
},
{
"code": "GA-9",
"name": "Woleu-Ntem"
},
{
"code": "GB-ABC",
"name": "Armagh City, Banbridge and Craigavon"
},
{
"code": "GB-ABD",
"name": "Aberdeenshire"
},
{
"code": "GB-ABE",
"name": "Aberdeen City"
},
{
"code": "GB-AGB",
"name": "Argyll and Bute"
},
{
"code": "GB-AGY",
"name": "Isle of Anglesey [Sir Ynys Môn GB-YNM]"
},
{
"code": "GB-AND",
"name": "Ards and North Down"
},
{
"code": "GB-ANN",
"name": "Antrim and Newtownabbey"
},
{
"code": "GB-ANS",
"name": "Angus"
},
{
"code": "GB-BAS",
"name": "Bath and North East Somerset"
},
{
"code": "GB-BBD",
"name": "Blackburn with Darwen"
},
{
"code": "GB-BCP",
"name": "Bournemouth, Christchurch and Poole"
},
{
"code": "GB-BDF",
"name": "Bedford"
},
{
"code": "GB-BDG",
"name": "Barking and Dagenham"
},
{
"code": "GB-BEN",
"name": "Brent"
},
{
"code": "GB-BEX",
"name": "Bexley"
},
{
"code": "GB-BFS",
"name": "Belfast City"
},
{
"code": "GB-BGE",
"name": "Bridgend [Pen-y-bont ar Ogwr GB-POG]"
},
{
"code": "GB-BGW",
"name": "Blaenau Gwent"
},
{
"code": "GB-BIR",
"name": "Birmingham"
},
{
"code": "GB-BKM",
"name": "Buckinghamshire"
},
{
"code": "GB-BNE",
"name": "Barnet"
},
{
"code": "GB-BNH",
"name": "Brighton and Hove"
},
{
"code": "GB-BNS",
"name": "Barnsley"
},
{
"code": "GB-BOL",
"name": "Bolton"
},
{
"code": "GB-BPL",
"name": "Blackpool"
},
{
"code": "GB-BRC",
"name": "Bracknell Forest"
},
{
"code": "GB-BRD",
"name": "Bradford"
},
{
"code": "GB-BRY",
"name": "Bromley"
},
{
"code": "GB-BST",
"name": "Bristol, City of"
},
{
"code": "GB-BUR",
"name": "Bury"
},
{
"code": "GB-CAM",
"name": "Cambridgeshire"
},
{
"code": "GB-CAY",
"name": "Caerphilly [Caerffili GB-CAF]"
},
{
"code": "GB-CBF",
"name": "Central Bedfordshire"
},
{
"code": "GB-CCG",
"name": "Causeway Coast and Glens"
},
{
"code": "GB-CGN",
"name": "Ceredigion [Sir Ceredigion]"
},
{
"code": "GB-CHE",
"name": "Cheshire East"
},
{
"code": "GB-CHW",
"name": "Cheshire West and Chester"
},
{
"code": "GB-CLD",
"name": "Calderdale"
},
{
"code": "GB-CLK",
"name": "Clackmannanshire"
},
{
"code": "GB-CMA",
"name": "Cumbria"
},
{
"code": "GB-CMD",
"name": "Camden"
},
{
"code": "GB-CMN",
"name": "Carmarthenshire [Sir Gaerfyrddin GB-GFY]"
},
{
"code": "GB-CON",
"name": "Cornwall"
},
{
"code": "GB-COV",
"name": "Coventry"
},
{
"code": "GB-CRF",
"name": "Cardiff [Caerdydd GB-CRD]"
},
{
"code": "GB-CRY",
"name": "Croydon"
},
{
"code": "GB-CWY",
"name": "Conwy"
},
{
"code": "GB-DAL",
"name": "Darlington"
},
{
"code": "GB-DBY",
"name": "Derbyshire"
},
{
"code": "GB-DEN",
"name": "Denbighshire [Sir Ddinbych GB-DDB]"
},
{
"code": "GB-DER",
"name": "Derby"
},
{
"code": "GB-DEV",
"name": "Devon"
},
{
"code": "GB-DGY",
"name": "Dumfries and Galloway"
},
{
"code": "GB-DNC",
"name": "Doncaster"
},
{
"code": "GB-DND",
"name": "Dundee City"
},
{
"code": "GB-DOR",
"name": "Dorset"
},
{
"code": "GB-DRS",
"name": "Derry and Strabane"
},
{
"code": "GB-DUD",
"name": "Dudley"
},
{
"code": "GB-DUR",
"name": "Durham, County"
},
{
"code": "GB-EAL",
"name": "Ealing"
},
{
"code": "GB-EAY",
"name": "East Ayrshire"
},
{
"code": "GB-EDH",
"name": "Edinburgh, City of"
},
{
"code": "GB-EDU",
"name": "East Dunbartonshire"
},
{
"code": "GB-ELN",
"name": "East Lothian"
},
{
"code": "GB-ELS",
"name": "Eilean Siar"
},
{
"code": "GB-ENF",
"name": "Enfield"
},
{
"code": "GB-ENG",
"name": "England"
},
{
"code": "GB-ERW",
"name": "East Renfrewshire"
},
{
"code": "GB-ERY",
"name": "East Riding of Yorkshire"
},
{
"code": "GB-ESS",
"name": "Essex"
},
{
"code": "GB-ESX",
"name": "East Sussex"
},
{
"code": "GB-FAL",
"name": "Falkirk"
},
{
"code": "GB-FIF",
"name": "Fife"
},
{
"code": "GB-FLN",
"name": "Flintshire [Sir y Fflint GB-FFL]"
},
{
"code": "GB-FMO",
"name": "Fermanagh and Omagh"
},
{
"code": "GB-GAT",
"name": "Gateshead"
},
{
"code": "GB-GLG",
"name": "Glasgow City"
},
{
"code": "GB-GLS",
"name": "Gloucestershire"
},
{
"code": "GB-GRE",
"name": "Greenwich"
},
{
"code": "GB-GWN",
"name": "Gwynedd"
},
{
"code": "GB-HAL",
"name": "Halton"
},
{
"code": "GB-HAM",
"name": "Hampshire"
},
{
"code": "GB-HAV",
"name": "Havering"
},
{
"code": "GB-HCK",
"name": "Hackney"
},
{
"code": "GB-HEF",
"name": "Herefordshire"
},
{
"code": "GB-HIL",
"name": "Hillingdon"
},
{
"code": "GB-HLD",
"name": "Highland"
},
{
"code": "GB-HMF",
"name": "Hammersmith and Fulham"
},
{
"code": "GB-HNS",
"name": "Hounslow"
},
{
"code": "GB-HPL",
"name": "Hartlepool"
},
{
"code": "GB-HRT",
"name": "Hertfordshire"
},
{
"code": "GB-HRW",
"name": "Harrow"
},
{
"code": "GB-HRY",
"name": "Haringey"
},
{
"code": "GB-IOS",
"name": "Isles of Scilly"
},
{
"code": "GB-IOW",
"name": "Isle of Wight"
},
{
"code": "GB-ISL",
"name": "Islington"
},
{
"code": "GB-IVC",
"name": "Inverclyde"
},
{
"code": "GB-KEC",
"name": "Kensington and Chelsea"
},
{
"code": "GB-KEN",
"name": "Kent"
},
{
"code": "GB-KHL",
"name": "Kingston upon Hull"
},
{
"code": "GB-KIR",
"name": "Kirklees"
},
{
"code": "GB-KTT",
"name": "Kingston upon Thames"
},
{
"code": "GB-KWL",
"name": "Knowsley"
},
{
"code": "GB-LAN",
"name": "Lancashire"
},
{
"code": "GB-LBC",
"name": "Lisburn and Castlereagh"
},
{
"code": "GB-LBH",
"name": "Lambeth"
},
{
"code": "GB-LCE",
"name": "Leicester"
},
{
"code": "GB-LDS",
"name": "Leeds"
},
{
"code": "GB-LEC",
"name": "Leicestershire"
},
{
"code": "GB-LEW",
"name": "Lewisham"
},
{
"code": "GB-LIN",
"name": "Lincolnshire"
},
{
"code": "GB-LIV",
"name": "Liverpool"
},
{
"code": "GB-LND",
"name": "London, City of"
},
{
"code": "GB-LUT",
"name": "Luton"
},
{
"code": "GB-MAN",
"name": "Manchester"
},
{
"code": "GB-MDB",
"name": "Middlesbrough"
},
{
"code": "GB-MDW",
"name": "Medway"
},
{
"code": "GB-MEA",
"name": "Mid and East Antrim"
},
{
"code": "GB-MIK",
"name": "Milton Keynes"
},
{
"code": "GB-MLN",
"name": "Midlothian"
},
{
"code": "GB-MON",
"name": "Monmouthshire [Sir Fynwy GB-FYN]"
},
{
"code": "GB-MRT",
"name": "Merton"
},
{
"code": "GB-MRY",
"name": "Moray"
},
{
"code": "GB-MTY",
"name": "Merthyr Tydfil [Merthyr Tudful GB-MTU]"
},
{
"code": "GB-MUL",
"name": "Mid-Ulster"
},
{
"code": "GB-NAY",
"name": "North Ayrshire"
},
{
"code": "GB-NBL",
"name": "Northumberland"
},
{
"code": "GB-NEL",
"name": "North East Lincolnshire"
},
{
"code": "GB-NET",
"name": "Newcastle upon Tyne"
},
{
"code": "GB-NFK",
"name": "Norfolk"
},
{
"code": "GB-NGM",
"name": "Nottingham"
},
{
"code": "GB-NIR",
"name": "Northern Ireland"
},
{
"code": "GB-NLK",
"name": "North Lanarkshire"
},
{
"code": "GB-NLN",
"name": "North Lincolnshire"
},
{
"code": "GB-NMD",
"name": "Newry, Mourne and Down"
},
{
"code": "GB-NNH",
"name": "North Northamptonshire"
},
{
"code": "GB-NSM",
"name": "North Somerset"
},
{
"code": "GB-NTL",
"name": "Neath Port Talbot [Castell-nedd Port Talbot GB-CTL]"
},
{
"code": "GB-NTT",
"name": "Nottinghamshire"
},
{
"code": "GB-NTY",
"name": "North Tyneside"
},
{
"code": "GB-NWM",
"name": "Newham"
},
{
"code": "GB-NWP",
"name": "Newport [Casnewydd GB-CNW]"
},
{
"code": "GB-NYK",
"name": "North Yorkshire"
},
{
"code": "GB-OLD",
"name": "Oldham"
},
{
"code": "GB-ORK",
"name": "Orkney Islands"
},
{
"code": "GB-OXF",
"name": "Oxfordshire"
},
{
"code": "GB-PEM",
"name": "Pembrokeshire [Sir Benfro GB-BNF]"
},
{
"code": "GB-PKN",
"name": "Perth and Kinross"
},
{
"code": "GB-PLY",
"name": "Plymouth"
},
{
"code": "GB-POR",
"name": "Portsmouth"
},
{
"code": "GB-POW",
"name": "Powys"
},
{
"code": "GB-PTE",
"name": "Peterborough"
},
{
"code": "GB-RCC",
"name": "Redcar and Cleveland"
},
{
"code": "GB-RCH",
"name": "Rochdale"
},
{
"code": "GB-RCT",
"name": "Rhondda Cynon Taff [Rhondda CynonTaf]"
},
{
"code": "GB-RDB",
"name": "Redbridge"
},
{
"code": "GB-RDG",
"name": "Reading"
},
{
"code": "GB-RFW",
"name": "Renfrewshire"
},
{
"code": "GB-RIC",
"name": "Richmond upon Thames"
},
{
"code": "GB-ROT",
"name": "Rotherham"
},
{
"code": "GB-RUT",
"name": "Rutland"
},
{
"code": "GB-SAW",
"name": "Sandwell"
},
{
"code": "GB-SAY",
"name": "South Ayrshire"
},
{
"code": "GB-SCB",
"name": "Scottish Borders"
},
{
"code": "GB-SCT",
"name": "Scotland"
},
{
"code": "GB-SFK",
"name": "Suffolk"
},
{
"code": "GB-SFT",
"name": "Sefton"
},
{
"code": "GB-SGC",
"name": "South Gloucestershire"
},
{
"code": "GB-SHF",
"name": "Sheffield"
},
{
"code": "GB-SHN",
"name": "St. Helens"
},
{
"code": "GB-SHR",
"name": "Shropshire"
},
{
"code": "GB-SKP",
"name": "Stockport"
},
{
"code": "GB-SLF",
"name": "Salford"
},
{
"code": "GB-SLG",
"name": "Slough"
},
{
"code": "GB-SLK",
"name": "South Lanarkshire"
},
{
"code": "GB-SND",
"name": "Sunderland"
},
{
"code": "GB-SOL",
"name": "Solihull"
},
{
"code": "GB-SOM",
"name": "Somerset"
},
{
"code": "GB-SOS",
"name": "Southend-on-Sea"
},
{
"code": "GB-SRY",
"name": "Surrey"
},
{
"code": "GB-STE",
"name": "Stoke-on-Trent"
},
{
"code": "GB-STG",
"name": "Stirling"
},
{
"code": "GB-STH",
"name": "Southampton"
},
{
"code": "GB-STN",
"name": "Sutton"
},
{
"code": "GB-STS",
"name": "Staffordshire"
},
{
"code": "GB-STT",
"name": "Stockton-on-Tees"
},
{
"code": "GB-STY",
"name": "South Tyneside"
},
{
"code": "GB-SWA",
"name": "Swansea [Abertawe GB-ATA]"
},
{
"code": "GB-SWD",
"name": "Swindon"
},
{
"code": "GB-SWK",
"name": "Southwark"
},
{
"code": "GB-TAM",
"name": "Tameside"
},
{
"code": "GB-TFW",
"name": "Telford and Wrekin"
},
{
"code": "GB-THR",
"name": "Thurrock"
},
{
"code": "GB-TOB",
"name": "Torbay"
},
{
"code": "GB-TOF",
"name": "Torfaen [Tor-faen]"
},
{
"code": "GB-TRF",
"name": "Trafford"
},
{
"code": "GB-TWH",
"name": "Tower Hamlets"
},
{
"code": "GB-VGL",
"name": "Vale of Glamorgan, The [Bro Morgannwg GB-BMG]"
},
{
"code": "GB-WAR",
"name": "Warwickshire"
},
{
"code": "GB-WBK",
"name": "West Berkshire"
},
{
"code": "GB-WDU",
"name": "West Dunbartonshire"
},
{
"code": "GB-WFT",
"name": "Waltham Forest"
},
{
"code": "GB-WGN",
"name": "Wigan"
},
{
"code": "GB-WIL",
"name": "Wiltshire"
},
{
"code": "GB-WKF",
"name": "Wakefield"
},
{
"code": "GB-WLL",
"name": "Walsall"
},
{
"code": "GB-WLN",
"name": "West Lothian"
},
{
"code": "GB-WLS",
"name": "Wales [Cymru GB-CYM]"
},
{
"code": "GB-WLV",
"name": "Wolverhampton"
},
{
"code": "GB-WND",
"name": "Wandsworth"
},
{
"code": "GB-WNH",
"name": "West Northamptonshire"
},
{
"code": "GB-WNM",
"name": "Windsor and Maidenhead"
},
{
"code": "GB-WOK",
"name": "Wokingham"
},
{
"code": "GB-WOR",
"name": "Worcestershire"
},
{
"code": "GB-WRL",
"name": "Wirral"
},
{
"code": "GB-WRT",
"name": "Warrington"
},
{
"code": "GB-WRX",
"name": "Wrexham [Wrecsam GB-WRC]"
},
{
"code": "GB-WSM",
"name": "Westminster"
},
{
"code": "GB-WSX",
"name": "West Sussex"
},
{
"code": "GB-YOR",
"name": "York"
},
{
"code": "GB-ZET",
"name": "Shetland Islands"
},
{
"code": "GD-01",
"name": "Saint Andrew"
},
{
"code": "GD-02",
"name": "Saint David"
},
{
"code": "GD-03",
"name": "Saint George"
},
{
"code": "GD-04",
"name": "Saint John"
},
{
"code": "GD-05",
"name": "Saint Mark"
},
{
"code": "GD-06",
"name": "Saint Patrick"
},
{
"code": "GD-10",
"name": "Southern Grenadine Islands"
},
{
"code": "GE-AB",
"name": "Abkhazia"
},
{
"code": "GE-AJ",
"name": "Ajaria"
},
{
"code": "GE-GU",
"name": "Guria"
},
{
"code": "GE-IM",
"name": "Imereti"
},
{
"code": "GE-KA",
"name": "K'akheti"
},
{
"code": "GE-KK",
"name": "Kvemo Kartli"
},
{
"code": "GE-MM",
"name": "Mtskheta-Mtianeti"
},
{
"code": "GE-RL",
"name": "Rach'a-Lechkhumi-Kvemo Svaneti"
},
{
"code": "GE-SJ",
"name": "Samtskhe-Javakheti"
},
{
"code": "GE-SK",
"name": "Shida Kartli"
},
{
"code": "GE-SZ",
"name": "Samegrelo-Zemo Svaneti"
},
{
"code": "GE-TB",
"name": "Tbilisi"
},
{
"code": "GH-AA",
"name": "Greater Accra"
},
{
"code": "GH-AF",
"name": "Ahafo"
},
{
"code": "GH-AH",
"name": "Ashanti"
},
{
"code": "GH-BE",
"name": "Bono East"
},
{
"code": "GH-BO",
"name": "Bono"
},
{
"code": "GH-CP",
"name": "Central"
},
{
"code": "GH-EP",
"name": "Eastern"
},
{
"code": "GH-NE",
"name": "North East"
},
{
"code": "GH-NP",
"name": "Northern"
},
{
"code": "GH-OT",
"name": "Oti"
},
{
"code": "GH-SV",
"name": "Savannah"
},
{
"code": "GH-TV",
"name": "Volta"
},
{
"code": "GH-UE",
"name": "Upper East"
},
{
"code": "GH-UW",
"name": "Upper West"
},
{
"code": "GH-WN",
"name": "Western North"
},
{
"code": "GH-WP",
"name": "Western"
},
{
"code": "GL-AV",
"name": "Avannaata Kommunia"
},
{
"code": "GL-KU",
"name": "Kommune Kujalleq"
},
{
"code": "GL-QE",
"name": "Qeqqata Kommunia"
},
{
"code": "GL-QT",
"name": "Kommune Qeqertalik"
},
{
"code": "GL-SM",
"name": "Kommuneqarfik Sermersooq"
},
{
"code": "GM-B",
"name": "Banjul"
},
{
"code": "GM-L",
"name": "Lower River"
},
{
"code": "GM-M",
"name": "Central River"
},
{
"code": "GM-N",
"name": "North Bank"
},
{
"code": "GM-U",
"name": "Upper River"
},
{
"code": "GM-W",
"name": "Western"
},
{
"code": "GN-B",
"name": "Boké"
},
{
"code": "GN-BE",
"name": "Beyla"
},
{
"code": "GN-BF",
"name": "Boffa"
},
{
"code": "GN-BK",
"name": "Boké"
},
{
"code": "GN-C",
"name": "Conakry"
},
{
"code": "GN-CO",
"name": "Coyah"
},
{
"code": "GN-D",
"name": "Kindia"
},
{
"code": "GN-DB",
"name": "Dabola"
},
{
"code": "GN-DI",
"name": "Dinguiraye"
},
{
"code": "GN-DL",
"name": "Dalaba"
},
{
"code": "GN-DU",
"name": "Dubréka"
},
{
"code": "GN-F",
"name": "Faranah"
},
{
"code": "GN-FA",
"name": "Faranah"
},
{
"code": "GN-FO",
"name": "Forécariah"
},
{
"code": "GN-FR",
"name": "Fria"
},
{
"code": "GN-GA",
"name": "Gaoual"
},
{
"code": "GN-GU",
"name": "Guékédou"
},
{
"code": "GN-K",
"name": "Kankan"
},
{
"code": "GN-KA",
"name": "Kankan"
},
{
"code": "GN-KB",
"name": "Koubia"
},
{
"code": "GN-KD",
"name": "Kindia"
},
{
"code": "GN-KE",
"name": "Kérouané"
},
{
"code": "GN-KN",
"name": "Koundara"
},
{
"code": "GN-KO",
"name": "Kouroussa"
},
{
"code": "GN-KS",
"name": "Kissidougou"
},
{
"code": "GN-L",
"name": "Labé"
},
{
"code": "GN-LA",
"name": "Labé"
},
{
"code": "GN-LE",
"name": "Lélouma"
},
{
"code": "GN-LO",
"name": "Lola"
},
{
"code": "GN-M",
"name": "Mamou"
},
{
"code": "GN-MC",
"name": "Macenta"
},
{
"code": "GN-MD",
"name": "Mandiana"
},
{
"code": "GN-ML",
"name": "Mali"
},
{
"code": "GN-MM",
"name": "Mamou"
},
{
"code": "GN-N",
"name": "Nzérékoré"
},
{
"code": "GN-NZ",
"name": "Nzérékoré"
},
{
"code": "GN-PI",
"name": "Pita"
},
{
"code": "GN-SI",
"name": "Siguiri"
},
{
"code": "GN-TE",
"name": "Télimélé"
},
{
"code": "GN-TO",
"name": "Tougué"
},
{
"code": "GN-YO",
"name": "Yomou"
},
{
"code": "GQ-AN",
"name": "Annobon"
},
{
"code": "GQ-BN",
"name": "Bioko Nord"
},
{
"code": "GQ-BS",
"name": "Bioko Sud"
},
{
"code": "GQ-C",
"name": "Région Continentale"
},
{
"code": "GQ-CS",
"name": "Centro Sud"
},
{
"code": "GQ-DJ",
"name": "Djibloho"
},
{
"code": "GQ-I",
"name": "Région Insulaire"
},
{
"code": "GQ-KN",
"name": "Kié-Ntem"
},
{
"code": "GQ-LI",
"name": "Littoral"
},
{
"code": "GQ-WN",
"name": "Wele-Nzas"
},
{
"code": "GR-69",
"name": "Ágion Óros"
},
{
"code": "GR-A",
"name": "Anatolikí Makedonía kai Thráki"
},
{
"code": "GR-B",
"name": "Kentrikí Makedonía"
},
{
"code": "GR-C",
"name": "Dytikí Makedonía"
},
{
"code": "GR-D",
"name": "Ípeiros"
},
{
"code": "GR-E",
"name": "Thessalía"
},
{
"code": "GR-F",
"name": "Ionía Nísia"
},
{
"code": "GR-G",
"name": "Dytikí Elláda"
},
{
"code": "GR-H",
"name": "Stereá Elláda"
},
{
"code": "GR-I",
"name": "Attikí"
},
{
"code": "GR-J",
"name": "Pelopónnisos"
},
{
"code": "GR-K",
"name": "Vóreio Aigaío"
},
{
"code": "GR-L",
"name": "Nótio Aigaío"
},
{
"code": "GR-M",
"name": "Kríti"
},
{
"code": "GT-01",
"name": "Guatemala"
},
{
"code": "GT-02",
"name": "El Progreso"
},
{
"code": "GT-03",
"name": "Sacatepéquez"
},
{
"code": "GT-04",
"name": "Chimaltenango"
},
{
"code": "GT-05",
"name": "Escuintla"
},
{
"code": "GT-06",
"name": "Santa Rosa"
},
{
"code": "GT-07",
"name": "Sololá"
},
{
"code": "GT-08",
"name": "Totonicapán"
},
{
"code": "GT-09",
"name": "Quetzaltenango"
},
{
"code": "GT-10",
"name": "Suchitepéquez"
},
{
"code": "GT-11",
"name": "Retalhuleu"
},
{
"code": "GT-12",
"name": "San Marcos"
},
{
"code": "GT-13",
"name": "Huehuetenango"
},
{
"code": "GT-14",
"name": "Quiché"
},
{
"code": "GT-15",
"name": "Baja Verapaz"
},
{
"code": "GT-16",
"name": "Alta Verapaz"
},
{
"code": "GT-17",
"name": "Petén"
},
{
"code": "GT-18",
"name": "Izabal"
},
{
"code": "GT-19",
"name": "Zacapa"
},
{
"code": "GT-20",
"name": "Chiquimula"
},
{
"code": "GT-21",
"name": "Jalapa"
},
{
"code": "GT-22",
"name": "Jutiapa"
},
{
"code": "GW-BA",
"name": "Bafatá"
},
{
"code": "GW-BL",
"name": "Bolama / Bijagós"
},
{
"code": "GW-BM",
"name": "Biombo"
},
{
"code": "GW-BS",
"name": "Bissau"
},
{
"code": "GW-CA",
"name": "Cacheu"
},
{
"code": "GW-GA",
"name": "Gabú"
},
{
"code": "GW-L",
"name": "Leste"
},
{
"code": "GW-N",
"name": "Norte"
},
{
"code": "GW-OI",
"name": "Oio"
},
{
"code": "GW-QU",
"name": "Quinara"
},
{
"code": "GW-S",
"name": "Sul"
},
{
"code": "GW-TO",
"name": "Tombali"
},
{
"code": "GY-BA",
"name": "Barima-Waini"
},
{
"code": "GY-CU",
"name": "Cuyuni-Mazaruni"
},
{
"code": "GY-DE",
"name": "Demerara-Mahaica"
},
{
"code": "GY-EB",
"name": "East Berbice-Corentyne"
},
{
"code": "GY-ES",
"name": "Essequibo Islands-West Demerara"
},
{
"code": "GY-MA",
"name": "Mahaica-Berbice"
},
{
"code": "GY-PM",
"name": "Pomeroon-Supenaam"
},
{
"code": "GY-PT",
"name": "Potaro-Siparuni"
},
{
"code": "GY-UD",
"name": "Upper Demerara-Berbice"
},
{
"code": "GY-UT",
"name": "Upper Takutu-Upper Essequibo"
},
{
"code": "HN-AT",
"name": "Atlántida"
},
{
"code": "HN-CH",
"name": "Choluteca"
},
{
"code": "HN-CL",
"name": "Colón"
},
{
"code": "HN-CM",
"name": "Comayagua"
},
{
"code": "HN-CP",
"name": "Copán"
},
{
"code": "HN-CR",
"name": "Cortés"
},
{
"code": "HN-EP",
"name": "El Paraíso"
},
{
"code": "HN-FM",
"name": "Francisco Morazán"
},
{
"code": "HN-GD",
"name": "Gracias a Dios"
},
{
"code": "HN-IB",
"name": "Islas de la Bahía"
},
{
"code": "HN-IN",
"name": "Intibucá"
},
{
"code": "HN-LE",
"name": "Lempira"
},
{
"code": "HN-LP",
"name": "La Paz"
},
{
"code": "HN-OC",
"name": "Ocotepeque"
},
{
"code": "HN-OL",
"name": "Olancho"
},
{
"code": "HN-SB",
"name": "Santa Bárbara"
},
{
"code": "HN-VA",
"name": "Valle"
},
{
"code": "HN-YO",
"name": "Yoro"
},
{
"code": "HR-01",
"name": "Zagrebačka županija"
},
{
"code": "HR-02",
"name": "Krapinsko-zagorska županija"
},
{
"code": "HR-03",
"name": "Sisačko-moslavačka županija"
},
{
"code": "HR-04",
"name": "Karlovačka županija"
},
{
"code": "HR-05",
"name": "Varaždinska županija"
},
{
"code": "HR-06",
"name": "Koprivničko-križevačka županija"
},
{
"code": "HR-07",
"name": "Bjelovarsko-bilogorska županija"
},
{
"code": "HR-08",
"name": "Primorsko-goranska županija"
},
{
"code": "HR-09",
"name": "Ličko-senjska županija"
},
{
"code": "HR-10",
"name": "Virovitičko-podravska županija"
},
{
"code": "HR-11",
"name": "Požeško-slavonska županija"
},
{
"code": "HR-12",
"name": "Brodsko-posavska županija"
},
{
"code": "HR-13",
"name": "Zadarska županija"
},
{
"code": "HR-14",
"name": "Osječko-baranjska županija"
},
{
"code": "HR-15",
"name": "Šibensko-kninska županija"
},
{
"code": "HR-16",
"name": "Vukovarsko-srijemska županija"
},
{
"code": "HR-17",
"name": "Splitsko-dalmatinska županija"
},
{
"code": "HR-18",
"name": "Istarska županija"
},
{
"code": "HR-19",
"name": "Dubrovačko-neretvanska županija"
},
{
"code": "HR-20",
"name": "Međimurska županija"
},
{
"code": "HR-21",
"name": "Grad Zagreb"
},
{
"code": "HT-AR",
"name": "Artibonite"
},
{
"code": "HT-CE",
"name": "Centre"
},
{
"code": "HT-GA",
"name": "Grande’Anse"
},
{
"code": "HT-ND",
"name": "Nord"
},
{
"code": "HT-NE",
"name": "Nord-Est"
},
{
"code": "HT-NI",
"name": "Nippes"
},
{
"code": "HT-NO",
"name": "Nord-Ouest"
},
{
"code": "HT-OU",
"name": "Ouest"
},
{
"code": "HT-SD",
"name": "Sud"
},
{
"code": "HT-SE",
"name": "Sud-Est"
},
{
"code": "HU-BA",
"name": "Baranya"
},
{
"code": "HU-BC",
"name": "Békéscsaba"
},
{
"code": "HU-BE",
"name": "Békés"
},
{
"code": "HU-BK",
"name": "Bács-Kiskun"
},
{
"code": "HU-BU",
"name": "Budapest"
},
{
"code": "HU-BZ",
"name": "Borsod-Abaúj-Zemplén"
},
{
"code": "HU-CS",
"name": "Csongrád-Csanád"
},
{
"code": "HU-DE",
"name": "Debrecen"
},
{
"code": "HU-DU",
"name": "Dunaújváros"
},
{
"code": "HU-EG",
"name": "Eger"
},
{
"code": "HU-ER",
"name": "Érd"
},
{
"code": "HU-FE",
"name": "Fejér"
},
{
"code": "HU-GS",
"name": "Győr-Moson-Sopron"
},
{
"code": "HU-GY",
"name": "Győr"
},
{
"code": "HU-HB",
"name": "Hajdú-Bihar"
},
{
"code": "HU-HE",
"name": "Heves"
},
{
"code": "HU-HV",
"name": "Hódmezővásárhely"
},
{
"code": "HU-JN",
"name": "Jász-Nagykun-Szolnok"
},
{
"code": "HU-KE",
"name": "Komárom-Esztergom"
},
{
"code": "HU-KM",
"name": "Kecskemét"
},
{
"code": "HU-KV",
"name": "Kaposvár"
},
{
"code": "HU-MI",
"name": "Miskolc"
},
{
"code": "HU-NK",
"name": "Nagykanizsa"
},
{
"code": "HU-NO",
"name": "Nógrád"
},
{
"code": "HU-NY",
"name": "Nyíregyháza"
},
{
"code": "HU-PE",
"name": "Pest"
},
{
"code": "HU-PS",
"name": "Pécs"
},
{
"code": "HU-SD",
"name": "Szeged"
},
{
"code": "HU-SF",
"name": "Székesfehérvár"
},
{
"code": "HU-SH",
"name": "Szombathely"
},
{
"code": "HU-SK",
"name": "Szolnok"
},
{
"code": "HU-SN",
"name": "Sopron"
},
{
"code": "HU-SO",
"name": "Somogy"
},
{
"code": "HU-SS",
"name": "Szekszárd"
},
{
"code": "HU-ST",
"name": "Salgótarján"
},
{
"code": "HU-SZ",
"name": "Szabolcs-Szatmár-Bereg"
},
{
"code": "HU-TB",
"name": "Tatabánya"
},
{
"code": "HU-TO",
"name": "Tolna"
},
{
"code": "HU-VA",
"name": "Vas"
},
{
"code": "HU-VE",
"name": "Veszprém"
},
{
"code": "HU-VM",
"name": "Veszprém"
},
{
"code": "HU-ZA",
"name": "Zala"
},
{
"code": "HU-ZE",
"name": "Zalaegerszeg"
},
{
"code": "ID-AC",
"name": "Aceh"
},
{
"code": "ID-BA",
"name": "Bali"
},
{
"code": "ID-BB",
"name": "Kepulauan Bangka Belitung"
},
{
"code": "ID-BE",
"name": "Bengkulu"
},
{
"code": "ID-BT",
"name": "Banten"
},
{
"code": "ID-GO",
"name": "Gorontalo"
},
{
"code": "ID-JA",
"name": "Jambi"
},
{
"code": "ID-JB",
"name": "Jawa Barat"
},
{
"code": "ID-JI",
"name": "Jawa Timur"
},
{
"code": "ID-JK",
"name": "Jakarta Raya"
},
{
"code": "ID-JT",
"name": "Jawa Tengah"
},
{
"code": "ID-JW",
"name": "Jawa"
},
{
"code": "ID-KA",
"name": "Kalimantan"
},
{
"code": "ID-KB",
"name": "Kalimantan Barat"
},
{
"code": "ID-KI",
"name": "Kalimantan Timur"
},
{
"code": "ID-KR",
"name": "Kepulauan Riau"
},
{
"code": "ID-KS",
"name": "Kalimantan Selatan"
},
{
"code": "ID-KT",
"name": "Kalimantan Tengah"
},
{
"code": "ID-KU",
"name": "Kalimantan Utara"
},
{
"code": "ID-LA",
"name": "Lampung"
},
{
"code": "ID-MA",
"name": "Maluku"
},
{
"code": "ID-ML",
"name": "Maluku"
},
{
"code": "ID-MU",
"name": "Maluku Utara"
},
{
"code": "ID-NB",
"name": "Nusa Tenggara Barat"
},
{
"code": "ID-NT",
"name": "Nusa Tenggara Timur"
},
{
"code": "ID-NU",
"name": "Nusa Tenggara"
},
{
"code": "ID-PA",
"name": "Papua"
},
{
"code": "ID-PB",
"name": "Papua Barat"
},
{
"code": "ID-PD",
"name": "Papua Barat Daya"
},
{
"code": "ID-PE",
"name": "Papua Pengunungan"
},
{
"code": "ID-PP",
"name": "Papua"
},
{
"code": "ID-PS",
"name": "Papua Selatan"
},
{
"code": "ID-PT",
"name": "Papua Tengah"
},
{
"code": "ID-RI",
"name": "Riau"
},
{
"code": "ID-SA",
"name": "Sulawesi Utara"
},
{
"code": "ID-SB",
"name": "Sumatera Barat"
},
{
"code": "ID-SG",
"name": "Sulawesi Tenggara"
},
{
"code": "ID-SL",
"name": "Sulawesi"
},
{
"code": "ID-SM",
"name": "Sumatera"
},
{
"code": "ID-SN",
"name": "Sulawesi Selatan"
},
{
"code": "ID-SR",
"name": "Sulawesi Barat"
},
{
"code": "ID-SS",
"name": "Sumatera Selatan"
},
{
"code": "ID-ST",
"name": "Sulawesi Tengah"
},
{
"code": "ID-SU",
"name": "Sumatera Utara"
},
{
"code": "ID-YO",
"name": "Yogyakarta"
},
{
"code": "IE-C",
"name": "Connaught"
},
{
"code": "IE-CE",
"name": "Clare"
},
{
"code": "IE-CN",
"name": "Cavan"
},
{
"code": "IE-CO",
"name": "Cork"
},
{
"code": "IE-CW",
"name": "Carlow"
},
{
"code": "IE-D",
"name": "Dublin"
},
{
"code": "IE-DL",
"name": "Donegal"
},
{
"code": "IE-G",
"name": "Galway"
},
{
"code": "IE-KE",
"name": "Kildare"
},
{
"code": "IE-KK",
"name": "Kilkenny"
},
{
"code": "IE-KY",
"name": "Kerry"
},
{
"code": "IE-L",
"name": "Leinster"
},
{
"code": "IE-LD",
"name": "Longford"
},
{
"code": "IE-LH",
"name": "Louth"
},
{
"code": "IE-LK",
"name": "Limerick"
},
{
"code": "IE-LM",
"name": "Leitrim"
},
{
"code": "IE-LS",
"name": "Laois"
},
{
"code": "IE-M",
"name": "Munster"
},
{
"code": "IE-MH",
"name": "Meath"
},
{
"code": "IE-MN",
"name": "Monaghan"
},
{
"code": "IE-MO",
"name": "Mayo"
},
{
"code": "IE-OY",
"name": "Offaly"
},
{
"code": "IE-RN",
"name": "Roscommon"
},
{
"code": "IE-SO",
"name": "Sligo"
},
{
"code": "IE-TA",
"name": "Tipperary"
},
{
"code": "IE-U",
"name": "Ulster"
},
{
"code": "IE-WD",
"name": "Waterford"
},
{
"code": "IE-WH",
"name": "Westmeath"
},
{
"code": "IE-WW",
"name": "Wicklow"
},
{
"code": "IE-WX",
"name": "Wexford"
},
{
"code": "IL-D",
"name": "Al Janūbī"
},
{
"code": "IL-HA",
"name": "Ḩayfā"
},
{
"code": "IL-JM",
"name": "Al Quds"
},
{
"code": "IL-M",
"name": "Al Awsaţ"
},
{
"code": "IL-TA",
"name": "Tall Abīb"
},
{
"code": "IL-Z",
"name": "Ash Shamālī"
},
{
"code": "IN-AN",
"name": "Andaman and Nicobar Islands"
},
{
"code": "IN-AP",
"name": "Andhra Pradesh"
},
{
"code": "IN-AR",
"name": "Arunāchal Pradesh"
},
{
"code": "IN-AS",
"name": "Assam"
},
{
"code": "IN-BR",
"name": "Bihār"
},
{
"code": "IN-CG",
"name": "Chhattīsgarh"
},
{
"code": "IN-CH",
"name": "Chandīgarh"
},
{
"code": "IN-DH",
"name": "Dādra and Nagar Haveli and Damān and Diu"
},
{
"code": "IN-DL",
"name": "Delhi"
},
{
"code": "IN-GA",
"name": "Goa"
},
{
"code": "IN-GJ",
"name": "Gujarāt"
},
{
"code": "IN-HP",
"name": "Himāchal Pradesh"
},
{
"code": "IN-HR",
"name": "Haryāna"
},
{
"code": "IN-JH",
"name": "Jhārkhand"
},
{
"code": "IN-JK",
"name": "Jammu and Kashmīr"
},
{
"code": "IN-KA",
"name": "Karnātaka"
},
{
"code": "IN-KL",
"name": "Kerala"
},
{
"code": "IN-LA",
"name": "Ladākh"
},
{
"code": "IN-LD",
"name": "Lakshadweep"
},
{
"code": "IN-MH",
"name": "Mahārāshtra"
},
{
"code": "IN-ML",
"name": "Meghālaya"
},
{
"code": "IN-MN",
"name": "Manipur"
},
{
"code": "IN-MP",
"name": "Madhya Pradesh"
},
{
"code": "IN-MZ",
"name": "Mizoram"
},
{
"code": "IN-NL",
"name": "Nāgāland"
},
{
"code": "IN-OD",
"name": "Odisha"
},
{
"code": "IN-PB",
"name": "Punjab"
},
{
"code": "IN-PY",
"name": "Puducherry"
},
{
"code": "IN-RJ",
"name": "Rājasthān"
},
{
"code": "IN-SK",
"name": "Sikkim"
},
{
"code": "IN-TN",
"name": "Tamil Nādu"
},
{
"code": "IN-TR",
"name": "Tripura"
},
{
"code": "IN-TS",
"name": "Telangāna"
},
{
"code": "IN-UK",
"name": "Uttarākhand"
},
{
"code": "IN-UP",
"name": "Uttar Pradesh"
},
{
"code": "IN-WB",
"name": "West Bengal"
},
{
"code": "IQ-AN",
"name": "Al Anbār"
},
{
"code": "IQ-AR",
"name": "Arbīl"
},
{
"code": "IQ-BA",
"name": "Al Başrah"
},
{
"code": "IQ-BB",
"name": "Bābil"
},
{
"code": "IQ-BG",
"name": "Baghdād"
},
{
"code": "IQ-DA",
"name": "Dahūk"
},
{
"code": "IQ-DI",
"name": "Diyālá"
},
{
"code": "IQ-DQ",
"name": "Dhī Qār"
},
{
"code": "IQ-KA",
"name": "Karbalā’"
},
{
"code": "IQ-KI",
"name": "Kirkūk"
},
{
"code": "IQ-KR",
"name": "Iqlīm Kūrdistān"
},
{
"code": "IQ-MA",
"name": "Maysān"
},
{
"code": "IQ-MU",
"name": "Al Muthanná"
},
{
"code": "IQ-NA",
"name": "An Najaf"
},
{
"code": "IQ-NI",
"name": "Nīnawá"
},
{
"code": "IQ-QA",
"name": "Al Qādisīyah"
},
{
"code": "IQ-SD",
"name": "Şalāḩ ad Dīn"
},
{
"code": "IQ-SU",
"name": "As Sulaymānīyah"
},
{
"code": "IQ-WA",
"name": "Wāsiţ"
},
{
"code": "IR-00",
"name": "Markazī"
},
{
"code": "IR-01",
"name": "Gīlān"
},
{
"code": "IR-02",
"name": "Māzandarān"
},
{
"code": "IR-03",
"name": "Āz̄ārbāyjān-e Shārqī"
},
{
"code": "IR-04",
"name": "Āz̄ārbāyjān-e Ghārbī"
},
{
"code": "IR-05",
"name": "Kermānshāh"
},
{
"code": "IR-06",
"name": "Khūzestān"
},
{
"code": "IR-07",
"name": "Fārs"
},
{
"code": "IR-08",
"name": "Kermān"
},
{
"code": "IR-09",
"name": "Khorāsān-e Raẕavī"
},
{
"code": "IR-10",
"name": "Eşfahān"
},
{
"code": "IR-11",
"name": "Sīstān va Balūchestān"
},
{
"code": "IR-12",
"name": "Kordestān"
},
{
"code": "IR-13",
"name": "Hamadān"
},
{
"code": "IR-14",
"name": "Chahār Maḩāl va Bakhtīārī"
},
{
"code": "IR-15",
"name": "Lorestān"
},
{
"code": "IR-16",
"name": "Īlām"
},
{
"code": "IR-17",
"name": "Kohgīlūyeh va Bowyer Aḩmad"
},
{
"code": "IR-18",
"name": "Būshehr"
},
{
"code": "IR-19",
"name": "Zanjān"
},
{
"code": "IR-20",
"name": "Semnān"
},
{
"code": "IR-21",
"name": "Yazd"
},
{
"code": "IR-22",
"name": "Hormozgān"
},
{
"code": "IR-23",
"name": "Tehrān"
},
{
"code": "IR-24",
"name": "Ardabīl"
},
{
"code": "IR-25",
"name": "Qom"
},
{
"code": "IR-26",
"name": "Qazvīn"
},
{
"code": "IR-27",
"name": "Golestān"
},
{
"code": "IR-28",
"name": "Khorāsān-e Shomālī"
},
{
"code": "IR-29",
"name": "Khorāsān-e Jonūbī"
},
{
"code": "IR-30",
"name": "Alborz"
},
{
"code": "IS-1",
"name": "Höfuðborgarsvæði"
},
{
"code": "IS-2",
"name": "Suðurnes"
},
{
"code": "IS-3",
"name": "Vesturland"
},
{
"code": "IS-4",
"name": "Vestfirðir"
},
{
"code": "IS-5",
"name": "Norðurland vestra"
},
{
"code": "IS-6",
"name": "Norðurland eystra"
},
{
"code": "IS-7",
"name": "Austurland"
},
{
"code": "IS-8",
"name": "Suðurland"
},
{
"code": "IS-AKN",
"name": "Akraneskaupstaður"
},
{
"code": "IS-AKU",
"name": "Akureyrarbær"
},
{
"code": "IS-ARN",
"name": "Árneshreppur"
},
{
"code": "IS-ASA",
"name": "Ásahreppur"
},
{
"code": "IS-BLA",
"name": "Bláskógabyggð"
},
{
"code": "IS-BOG",
"name": "Borgarbyggð"
},
{
"code": "IS-BOL",
"name": "Bolungarvíkurkaupstaður"
},
{
"code": "IS-DAB",
"name": "Dalabyggð"
},
{
"code": "IS-DAV",
"name": "Dalvíkurbyggð"
},
{
"code": "IS-EOM",
"name": "Eyja- og Miklaholtshreppur"
},
{
"code": "IS-EYF",
"name": "Eyjafjarðarsveit"
},
{
"code": "IS-FJD",
"name": "Fjarðabyggð"
},
{
"code": "IS-FJL",
"name": "Fjallabyggð"
},
{
"code": "IS-FLA",
"name": "Flóahreppur"
},
{
"code": "IS-FLR",
"name": "Fljótsdalshreppur"
},
{
"code": "IS-GAR",
"name": "Garðabær"
},
{
"code": "IS-GOG",
"name": "Grímsnes- og Grafningshreppur"
},
{
"code": "IS-GRN",
"name": "Grindavíkurbær"
},
{
"code": "IS-GRU",
"name": "Grundarfjarðarbær"
},
{
"code": "IS-GRY",
"name": "Grýtubakkahreppur"
},
{
"code": "IS-HAF",
"name": "Hafnarfjarðarkaupstaður"
},
{
"code": "IS-HRG",
"name": "Hörgársveit"
},
{
"code": "IS-HRU",
"name": "Hrunamannahreppur"
},
{
"code": "IS-HUG",
"name": "Húnabyggð"
},
{
"code": "IS-HUV",
"name": "Húnaþing vestra"
},
{
"code": "IS-HVA",
"name": "Hvalfjarðarsveit"
},
{
"code": "IS-HVE",
"name": "Hveragerðisbær"
},
{
"code": "IS-ISA",
"name": "Ísafjarðarbær"
},
{
"code": "IS-KAL",
"name": "Kaldrananeshreppur"
},
{
"code": "IS-KJO",
"name": "Kjósarhreppur"
},
{
"code": "IS-KOP",
"name": "Kópavogsbær"
},
{
"code": "IS-LAN",
"name": "Langanesbyggð"
},
{
"code": "IS-MOS",
"name": "Mosfellsbær"
},
{
"code": "IS-MUL",
"name": "Múlaþing"
},
{
"code": "IS-MYR",
"name": "Mýrdalshreppur"
},
{
"code": "IS-NOR",
"name": "Norðurþing"
},
{
"code": "IS-RGE",
"name": "Rangárþing eystra"
},
{
"code": "IS-RGY",
"name": "Rangárþing ytra"
},
{
"code": "IS-RHH",
"name": "Reykhólahreppur"
},
{
"code": "IS-RKN",
"name": "Reykjanesbær"
},
{
"code": "IS-RKV",
"name": "Reykjavíkurborg"
},
{
"code": "IS-SBT",
"name": "Svalbarðsstrandarhreppur"
},
{
"code": "IS-SDN",
"name": "Suðurnesjabær"
},
{
"code": "IS-SDV",
"name": "Súðavíkurhreppur"
},
{
"code": "IS-SEL",
"name": "Seltjarnarnesbær"
},
{
"code": "IS-SFA",
"name": "Sveitarfélagið Árborg"
},
{
"code": "IS-SHF",
"name": "Sveitarfélagið Hornafjörður"
},
{
"code": "IS-SKF",
"name": "Skaftárhreppur"
},
{
"code": "IS-SKG",
"name": "Skagabyggð"
},
{
"code": "IS-SKO",
"name": "Skorradalshreppur"
},
{
"code": "IS-SKR",
"name": "Skagafjörður"
},
{
"code": "IS-SNF",
"name": "Snæfellsbær"
},
{
"code": "IS-SOG",
"name": "Skeiða- og Gnúpverjahreppur"
},
{
"code": "IS-SOL",
"name": "Sveitarfélagið Ölfus"
},
{
"code": "IS-SSS",
"name": "Sveitarfélagið Skagaströnd"
},
{
"code": "IS-STR",
"name": "Strandabyggð"
},
{
"code": "IS-STY",
"name": "Stykkishólmsbær"
},
{
"code": "IS-SVG",
"name": "Sveitarfélagið Vogar"
},
{
"code": "IS-TAL",
"name": "Tálknafjarðarhreppur"
},
{
"code": "IS-THG",
"name": "Þingeyjarsveit"
},
{
"code": "IS-TJO",
"name": "Tjörneshreppur"
},
{
"code": "IS-VEM",
"name": "Vestmannaeyjabær"
},
{
"code": "IS-VER",
"name": "Vesturbyggð"
},
{
"code": "IS-VOP",
"name": "Vopnafjarðarhreppur"
},
{
"code": "IT-21",
"name": "Piemonte"
},
{
"code": "IT-23",
"name": "Valle d'Aosta"
},
{
"code": "IT-25",
"name": "Lombardia"
},
{
"code": "IT-32",
"name": "Trentino-Alto Adige"
},
{
"code": "IT-34",
"name": "Veneto"
},
{
"code": "IT-36",
"name": "Friuli Venezia Giulia"
},
{
"code": "IT-42",
"name": "Liguria"
},
{
"code": "IT-45",
"name": "Emilia-Romagna"
},
{
"code": "IT-52",
"name": "Toscana"
},
{
"code": "IT-55",
"name": "Umbria"
},
{
"code": "IT-57",
"name": "Marche"
},
{
"code": "IT-62",
"name": "Lazio"
},
{
"code": "IT-65",
"name": "Abruzzo"
},
{
"code": "IT-67",
"name": "Molise"
},
{
"code": "IT-72",
"name": "Campania"
},
{
"code": "IT-75",
"name": "Puglia"
},
{
"code": "IT-77",
"name": "Basilicata"
},
{
"code": "IT-78",
"name": "Calabria"
},
{
"code": "IT-82",
"name": "Sicilia"
},
{
"code": "IT-88",
"name": "Sardegna"
},
{
"code": "IT-AG",
"name": "Agrigento"
},
{
"code": "IT-AL",
"name": "Alessandria"
},
{
"code": "IT-AN",
"name": "Ancona"
},
{
"code": "IT-AP",
"name": "Ascoli Piceno"
},
{
"code": "IT-AQ",
"name": "L'Aquila"
},
{
"code": "IT-AR",
"name": "Arezzo"
},
{
"code": "IT-AT",
"name": "Asti"
},
{
"code": "IT-AV",
"name": "Avellino"
},
{
"code": "IT-BA",
"name": "Bari"
},
{
"code": "IT-BG",
"name": "Bergamo"
},
{
"code": "IT-BI",
"name": "Biella"
},
{
"code": "IT-BL",
"name": "Belluno"
},
{
"code": "IT-BN",
"name": "Benevento"
},
{
"code": "IT-BO",
"name": "Bologna"
},
{
"code": "IT-BR",
"name": "Brindisi"
},
{
"code": "IT-BS",
"name": "Brescia"
},
{
"code": "IT-BT",
"name": "Barletta-Andria-Trani"
},
{
"code": "IT-BZ",
"name": "Bolzano"
},
{
"code": "IT-CA",
"name": "Cagliari"
},
{
"code": "IT-CB",
"name": "Campobasso"
},
{
"code": "IT-CE",
"name": "Caserta"
},
{
"code": "IT-CH",
"name": "Chieti"
},
{
"code": "IT-CL",
"name": "Caltanissetta"
},
{
"code": "IT-CN",
"name": "Cuneo"
},
{
"code": "IT-CO",
"name": "Como"
},
{
"code": "IT-CR",
"name": "Cremona"
},
{
"code": "IT-CS",
"name": "Cosenza"
},
{
"code": "IT-CT",
"name": "Catania"
},
{
"code": "IT-CZ",
"name": "Catanzaro"
},
{
"code": "IT-EN",
"name": "Enna"
},
{
"code": "IT-FC",
"name": "Forlì-Cesena"
},
{
"code": "IT-FE",
"name": "Ferrara"
},
{
"code": "IT-FG",
"name": "Foggia"
},
{
"code": "IT-FI",
"name": "Firenze"
},
{
"code": "IT-FM",
"name": "Fermo"
},
{
"code": "IT-FR",
"name": "Frosinone"
},
{
"code": "IT-GE",
"name": "Genova"
},
{
"code": "IT-GO",
"name": "Gorizia"
},
{
"code": "IT-GR",
"name": "Grosseto"
},
{
"code": "IT-IM",
"name": "Imperia"
},
{
"code": "IT-IS",
"name": "Isernia"
},
{
"code": "IT-KR",
"name": "Crotone"
},
{
"code": "IT-LC",
"name": "Lecco"
},
{
"code": "IT-LE",
"name": "Lecce"
},
{
"code": "IT-LI",
"name": "Livorno"
},
{
"code": "IT-LO",
"name": "Lodi"
},
{
"code": "IT-LT",
"name": "Latina"
},
{
"code": "IT-LU",
"name": "Lucca"
},
{
"code": "IT-MB",
"name": "Monza e Brianza"
},
{
"code": "IT-MC",
"name": "Macerata"
},
{
"code": "IT-ME",
"name": "Messina"
},
{
"code": "IT-MI",
"name": "Milano"
},
{
"code": "IT-MN",
"name": "Mantova"
},
{
"code": "IT-MO",
"name": "Modena"
},
{
"code": "IT-MS",
"name": "Massa-Carrara"
},
{
"code": "IT-MT",
"name": "Matera"
},
{
"code": "IT-NA",
"name": "Napoli"
},
{
"code": "IT-NO",
"name": "Novara"
},
{
"code": "IT-NU",
"name": "Nuoro"
},
{
"code": "IT-OR",
"name": "Oristano"
},
{
"code": "IT-PA",
"name": "Palermo"
},
{
"code": "IT-PC",
"name": "Piacenza"
},
{
"code": "IT-PD",
"name": "Padova"
},
{
"code": "IT-PE",
"name": "Pescara"
},
{
"code": "IT-PG",
"name": "Perugia"
},
{
"code": "IT-PI",
"name": "Pisa"
},
{
"code": "IT-PN",
"name": "Pordenone"
},
{
"code": "IT-PO",
"name": "Prato"
},
{
"code": "IT-PR",
"name": "Parma"
},
{
"code": "IT-PT",
"name": "Pistoia"
},
{
"code": "IT-PU",
"name": "Pesaro e Urbino"
},
{
"code": "IT-PV",
"name": "Pavia"
},
{
"code": "IT-PZ",
"name": "Potenza"
},
{
"code": "IT-RA",
"name": "Ravenna"
},
{
"code": "IT-RC",
"name": "Reggio Calabria"
},
{
"code": "IT-RE",
"name": "Reggio Emilia"
},
{
"code": "IT-RG",
"name": "Ragusa"
},
{
"code": "IT-RI",
"name": "Rieti"
},
{
"code": "IT-RM",
"name": "Roma"
},
{
"code": "IT-RN",
"name": "Rimini"
},
{
"code": "IT-RO",
"name": "Rovigo"
},
{
"code": "IT-SA",
"name": "Salerno"
},
{
"code": "IT-SI",
"name": "Siena"
},
{
"code": "IT-SO",
"name": "Sondrio"
},
{
"code": "IT-SP",
"name": "La Spezia"
},
{
"code": "IT-SR",
"name": "Siracusa"
},
{
"code": "IT-SS",
"name": "Sassari"
},
{
"code": "IT-SU",
"name": "Sud Sardegna"
},
{
"code": "IT-SV",
"name": "Savona"
},
{
"code": "IT-TA",
"name": "Taranto"
},
{
"code": "IT-TE",
"name": "Teramo"
},
{
"code": "IT-TN",
"name": "Trento"
},
{
"code": "IT-TO",
"name": "Torino"
},
{
"code": "IT-TP",
"name": "Trapani"
},
{
"code": "IT-TR",
"name": "Terni"
},
{
"code": "IT-TS",
"name": "Trieste"
},
{
"code": "IT-TV",
"name": "Treviso"
},
{
"code": "IT-UD",
"name": "Udine"
},
{
"code": "IT-VA",
"name": "Varese"
},
{
"code": "IT-VB",
"name": "Verbano-Cusio-Ossola"
},
{
"code": "IT-VC",
"name": "Vercelli"
},
{
"code": "IT-VE",
"name": "Venezia"
},
{
"code": "IT-VI",
"name": "Vicenza"
},
{
"code": "IT-VR",
"name": "Verona"
},
{
"code": "IT-VT",
"name": "Viterbo"
},
{
"code": "IT-VV",
"name": "Vibo Valentia"
},
{
"code": "JM-01",
"name": "Kingston"
},
{
"code": "JM-02",
"name": "Saint Andrew"
},
{
"code": "JM-03",
"name": "Saint Thomas"
},
{
"code": "JM-04",
"name": "Portland"
},
{
"code": "JM-05",
"name": "Saint Mary"
},
{
"code": "JM-06",
"name": "Saint Ann"
},
{
"code": "JM-07",
"name": "Trelawny"
},
{
"code": "JM-08",
"name": "Saint James"
},
{
"code": "JM-09",
"name": "Hanover"
},
{
"code": "JM-10",
"name": "Westmoreland"
},
{
"code": "JM-11",
"name": "Saint Elizabeth"
},
{
"code": "JM-12",
"name": "Manchester"
},
{
"code": "JM-13",
"name": "Clarendon"
},
{
"code": "JM-14",
"name": "Saint Catherine"
},
{
"code": "JO-AJ",
"name": "‘Ajlūn"
},
{
"code": "JO-AM",
"name": "Al ‘A̅şimah"
},
{
"code": "JO-AQ",
"name": "Al ‘Aqabah"
},
{
"code": "JO-AT",
"name": "Aţ Ţafīlah"
},
{
"code": "JO-AZ",
"name": "Az Zarqā’"
},
{
"code": "JO-BA",
"name": "Al Balqā’"
},
{
"code": "JO-IR",
"name": "Irbid"
},
{
"code": "JO-JA",
"name": "Jarash"
},
{
"code": "JO-KA",
"name": "Al Karak"
},
{
"code": "JO-MA",
"name": "Al Mafraq"
},
{
"code": "JO-MD",
"name": "Mādabā"
},
{
"code": "JO-MN",
"name": "Ma‘ān"
},
{
"code": "JP-01",
"name": "Hokkaido"
},
{
"code": "JP-02",
"name": "Aomori"
},
{
"code": "JP-03",
"name": "Iwate"
},
{
"code": "JP-04",
"name": "Miyagi"
},
{
"code": "JP-05",
"name": "Akita"
},
{
"code": "JP-06",
"name": "Yamagata"
},
{
"code": "JP-07",
"name": "Fukushima"
},
{
"code": "JP-08",
"name": "Ibaraki"
},
{
"code": "JP-09",
"name": "Tochigi"
},
{
"code": "JP-10",
"name": "Gunma"
},
{
"code": "JP-11",
"name": "Saitama"
},
{
"code": "JP-12",
"name": "Chiba"
},
{
"code": "JP-13",
"name": "Tokyo"
},
{
"code": "JP-14",
"name": "Kanagawa"
},
{
"code": "JP-15",
"name": "Niigata"
},
{
"code": "JP-16",
"name": "Toyama"
},
{
"code": "JP-17",
"name": "Ishikawa"
},
{
"code": "JP-18",
"name": "Fukui"
},
{
"code": "JP-19",
"name": "Yamanashi"
},
{
"code": "JP-20",
"name": "Nagano"
},
{
"code": "JP-21",
"name": "Gifu"
},
{
"code": "JP-22",
"name": "Shizuoka"
},
{
"code": "JP-23",
"name": "Aichi"
},
{
"code": "JP-24",
"name": "Mie"
},
{
"code": "JP-25",
"name": "Shiga"
},
{
"code": "JP-26",
"name": "Kyoto"
},
{
"code": "JP-27",
"name": "Osaka"
},
{
"code": "JP-28",
"name": "Hyogo"
},
{
"code": "JP-29",
"name": "Nara"
},
{
"code": "JP-30",
"name": "Wakayama"
},
{
"code": "JP-31",
"name": "Tottori"
},
{
"code": "JP-32",
"name": "Shimane"
},
{
"code": "JP-33",
"name": "Okayama"
},
{
"code": "JP-34",
"name": "Hiroshima"
},
{
"code": "JP-35",
"name": "Yamaguchi"
},
{
"code": "JP-36",
"name": "Tokushima"
},
{
"code": "JP-37",
"name": "Kagawa"
},
{
"code": "JP-38",
"name": "Ehime"
},
{
"code": "JP-39",
"name": "Kochi"
},
{
"code": "JP-40",
"name": "Fukuoka"
},
{
"code": "JP-41",
"name": "Saga"
},
{
"code": "JP-42",
"name": "Nagasaki"
},
{
"code": "JP-43",
"name": "Kumamoto"
},
{
"code": "JP-44",
"name": "Oita"
},
{
"code": "JP-45",
"name": "Miyazaki"
},
{
"code": "JP-46",
"name": "Kagoshima"
},
{
"code": "JP-47",
"name": "Okinawa"
},
{
"code": "KE-01",
"name": "Baringo"
},
{
"code": "KE-02",
"name": "Bomet"
},
{
"code": "KE-03",
"name": "Bungoma"
},
{
"code": "KE-04",
"name": "Busia"
},
{
"code": "KE-05",
"name": "Elgeyo/Marakwet"
},
{
"code": "KE-06",
"name": "Embu"
},
{
"code": "KE-07",
"name": "Garissa"
},
{
"code": "KE-08",
"name": "Homa Bay"
},
{
"code": "KE-09",
"name": "Isiolo"
},
{
"code": "KE-10",
"name": "Kajiado"
},
{
"code": "KE-11",
"name": "Kakamega"
},
{
"code": "KE-12",
"name": "Kericho"
},
{
"code": "KE-13",
"name": "Kiambu"
},
{
"code": "KE-14",
"name": "Kilifi"
},
{
"code": "KE-15",
"name": "Kirinyaga"
},
{
"code": "KE-16",
"name": "Kisii"
},
{
"code": "KE-17",
"name": "Kisumu"
},
{
"code": "KE-18",
"name": "Kitui"
},
{
"code": "KE-19",
"name": "Kwale"
},
{
"code": "KE-20",
"name": "Laikipia"
},
{
"code": "KE-21",
"name": "Lamu"
},
{
"code": "KE-22",
"name": "Machakos"
},
{
"code": "KE-23",
"name": "Makueni"
},
{
"code": "KE-24",
"name": "Mandera"
},
{
"code": "KE-25",
"name": "Marsabit"
},
{
"code": "KE-26",
"name": "Meru"
},
{
"code": "KE-27",
"name": "Migori"
},
{
"code": "KE-28",
"name": "Mombasa"
},
{
"code": "KE-29",
"name": "Murang'a"
},
{
"code": "KE-30",
"name": "Nairobi City"
},
{
"code": "KE-31",
"name": "Nakuru"
},
{
"code": "KE-32",
"name": "Nandi"
},
{
"code": "KE-33",
"name": "Narok"
},
{
"code": "KE-34",
"name": "Nyamira"
},
{
"code": "KE-35",
"name": "Nyandarua"
},
{
"code": "KE-36",
"name": "Nyeri"
},
{
"code": "KE-37",
"name": "Samburu"
},
{
"code": "KE-38",
"name": "Siaya"
},
{
"code": "KE-39",
"name": "Taita/Taveta"
},
{
"code": "KE-40",
"name": "Tana River"
},
{
"code": "KE-41",
"name": "Tharaka-Nithi"
},
{
"code": "KE-42",
"name": "Trans Nzoia"
},
{
"code": "KE-43",
"name": "Turkana"
},
{
"code": "KE-44",
"name": "Uasin Gishu"
},
{
"code": "KE-45",
"name": "Vihiga"
},
{
"code": "KE-46",
"name": "Wajir"
},
{
"code": "KE-47",
"name": "West Pokot"
},
{
"code": "KG-B",
"name": "Batken"
},
{
"code": "KG-C",
"name": "Chüy"
},
{
"code": "KG-GB",
"name": "Bishkek Shaary"
},
{
"code": "KG-GO",
"name": "Osh Shaary"
},
{
"code": "KG-J",
"name": "Jalal-Abad"
},
{
"code": "KG-N",
"name": "Naryn"
},
{
"code": "KG-O",
"name": "Osh"
},
{
"code": "KG-T",
"name": "Talas"
},
{
"code": "KG-Y",
"name": "Ysyk-Köl"
},
{
"code": "KH-1",
"name": "Banteay Mean Choăy"
},
{
"code": "KH-10",
"name": "Kracheh"
},
{
"code": "KH-11",
"name": "Mondol Kiri"
},
{
"code": "KH-12",
"name": "Phnom Penh"
},
{
"code": "KH-13",
"name": "Preah Vihear"
},
{
"code": "KH-14",
"name": "Prey Veaeng"
},
{
"code": "KH-15",
"name": "Pousaat"
},
{
"code": "KH-16",
"name": "Rotanak Kiri"
},
{
"code": "KH-17",
"name": "Siem Reab"
},
{
"code": "KH-18",
"name": "Preah Sihanouk"
},
{
"code": "KH-19",
"name": "Stueng Traeng"
},
{
"code": "KH-2",
"name": "Baat Dambang"
},
{
"code": "KH-20",
"name": "Svaay Rieng"
},
{
"code": "KH-21",
"name": "Taakaev"
},
{
"code": "KH-22",
"name": "Otdar Mean Chey"
},
{
"code": "KH-23",
"name": "Kaeb"
},
{
"code": "KH-24",
"name": "Pailin"
},
{
"code": "KH-25",
"name": "Tbong Khmum"
},
{
"code": "KH-3",
"name": "Kampong Chaam"
},
{
"code": "KH-4",
"name": "Kampong Chhnang"
},
{
"code": "KH-5",
"name": "Kampong Spueu"
},
{
"code": "KH-6",
"name": "Kampong Thum"
},
{
"code": "KH-7",
"name": "Kampot"
},
{
"code": "KH-8",
"name": "Kandaal"
},
{
"code": "KH-9",
"name": "Kaoh Kong"
},
{
"code": "KI-G",
"name": "Gilbert Islands"
},
{
"code": "KI-L",
"name": "Line Islands"
},
{
"code": "KI-P",
"name": "Phoenix Islands"
},
{
"code": "KM-A",
"name": "Anjouan"
},
{
"code": "KM-G",
"name": "Grande Comore"
},
{
"code": "KM-M",
"name": "Mohéli"
},
{
"code": "KN-01",
"name": "Christ Church Nichola Town"
},
{
"code": "KN-02",
"name": "Saint Anne Sandy Point"
},
{
"code": "KN-03",
"name": "Saint George Basseterre"
},
{
"code": "KN-04",
"name": "Saint George Gingerland"
},
{
"code": "KN-05",
"name": "Saint James Windward"
},
{
"code": "KN-06",
"name": "Saint John Capisterre"
},
{
"code": "KN-07",
"name": "Saint John Figtree"
},
{
"code": "KN-08",
"name": "Saint Mary Cayon"
},
{
"code": "KN-09",
"name": "Saint Paul Capisterre"
},
{
"code": "KN-10",
"name": "Saint Paul Charlestown"
},
{
"code": "KN-11",
"name": "Saint Peter Basseterre"
},
{
"code": "KN-12",
"name": "Saint Thomas Lowland"
},
{
"code": "KN-13",
"name": "Saint Thomas Middle Island"
},
{
"code": "KN-15",
"name": "Trinity Palmetto Point"
},
{
"code": "KN-K",
"name": "Saint Kitts"
},
{
"code": "KN-N",
"name": "Nevis"
},
{
"code": "KP-01",
"name": "Phyeongyang"
},
{
"code": "KP-02",
"name": "Phyeongannamto"
},
{
"code": "KP-03",
"name": "Phyeonganpukto"
},
{
"code": "KP-04",
"name": "Jakangto"
},
{
"code": "KP-05",
"name": "Hwanghainamto"
},
{
"code": "KP-06",
"name": "Hwanghaipukto"
},
{
"code": "KP-07",
"name": "Kangweonto"
},
{
"code": "KP-08",
"name": "Hamkyeongnamto"
},
{
"code": "KP-09",
"name": "Hamkyeongpukto"
},
{
"code": "KP-10",
"name": "Ryangkangto"
},
{
"code": "KP-13",
"name": "Raseon"
},
{
"code": "KP-14",
"name": "Nampho"
},
{
"code": "KP-15",
"name": "Kaeseong"
},
{
"code": "KR-11",
"name": "Seoul-teukbyeolsi"
},
{
"code": "KR-26",
"name": "Busan-gwangyeoksi"
},
{
"code": "KR-27",
"name": "Daegu-gwangyeoksi"
},
{
"code": "KR-28",
"name": "Incheon-gwangyeoksi"
},
{
"code": "KR-29",
"name": "Gwangju-gwangyeoksi"
},
{
"code": "KR-30",
"name": "Daejeon-gwangyeoksi"
},
{
"code": "KR-31",
"name": "Ulsan-gwangyeoksi"
},
{
"code": "KR-41",
"name": "Gyeonggi-do"
},
{
"code": "KR-42",
"name": "Gangwon-teukbyeoljachido"
},
{
"code": "KR-43",
"name": "Chungcheongbuk-do"
},
{
"code": "KR-44",
"name": "Chungcheongnam-do"
},
{
"code": "KR-45",
"name": "Jeollabuk-do"
},
{
"code": "KR-46",
"name": "Jeollanam-do"
},
{
"code": "KR-47",
"name": "Gyeongsangbuk-do"
},
{
"code": "KR-48",
"name": "Gyeongsangnam-do"
},
{
"code": "KR-49",
"name": "Jeju-teukbyeoljachido"
},
{
"code": "KR-50",
"name": "Sejong"
},
{
"code": "KW-AH",
"name": "Al Aḩmadī"
},
{
"code": "KW-FA",
"name": "Al Farwānīyah"
},
{
"code": "KW-HA",
"name": "Ḩawallī"
},
{
"code": "KW-JA",
"name": "Al Jahrā’"
},
{
"code": "KW-KU",
"name": "Al ‘Āşimah"
},
{
"code": "KW-MU",
"name": "Mubārak al Kabīr"
},
{
"code": "KZ-10",
"name": "Abay oblysy"
},
{
"code": "KZ-11",
"name": "Aqmola oblysy"
},
{
"code": "KZ-15",
"name": "Aqtöbe oblysy"
},
{
"code": "KZ-19",
"name": "Almaty oblysy"
},
{
"code": "KZ-23",
"name": "Atyraū oblysy"
},
{
"code": "KZ-27",
"name": "Batys Qazaqstan oblysy"
},
{
"code": "KZ-31",
"name": "Zhambyl oblysy"
},
{
"code": "KZ-33",
"name": "Zhetisū oblysy"
},
{
"code": "KZ-35",
"name": "Qaraghandy oblysy"
},
{
"code": "KZ-39",
"name": "Qostanay oblysy"
},
{
"code": "KZ-43",
"name": "Qyzylorda oblysy"
},
{
"code": "KZ-47",
"name": "Mangghystaū oblysy"
},
{
"code": "KZ-55",
"name": "Pavlodar oblysy"
},
{
"code": "KZ-59",
"name": "Soltüstik Qazaqstan oblysy"
},
{
"code": "KZ-61",
"name": "Türkistan oblysy"
},
{
"code": "KZ-62",
"name": "Ulytaū oblysy"
},
{
"code": "KZ-63",
"name": "Shyghys Qazaqstan oblysy"
},
{
"code": "KZ-71",
"name": "Astana"
},
{
"code": "KZ-75",
"name": "Almaty"
},
{
"code": "KZ-79",
"name": "Shymkent"
},
{
"code": "LA-AT",
"name": "Attapu"
},
{
"code": "LA-BK",
"name": "Bokèo"
},
{
"code": "LA-BL",
"name": "Bolikhamxai"
},
{
"code": "LA-CH",
"name": "Champasak"
},
{
"code": "LA-HO",
"name": "Houaphan"
},
{
"code": "LA-KH",
"name": "Khammouan"
},
{
"code": "LA-LM",
"name": "Louang Namtha"
},
{
"code": "LA-LP",
"name": "Louangphabang"
},
{
"code": "LA-OU",
"name": "Oudômxai"
},
{
"code": "LA-PH",
"name": "Phôngsali"
},
{
"code": "LA-SL",
"name": "Salavan"
},
{
"code": "LA-SV",
"name": "Savannakhét"
},
{
"code": "LA-VI",
"name": "Viangchan"
},
{
"code": "LA-VT",
"name": "Viangchan"
},
{
"code": "LA-XA",
"name": "Xaignabouli"
},
{
"code": "LA-XE",
"name": "Xékong"
},
{
"code": "LA-XI",
"name": "Xiangkhouang"
},
{
"code": "LA-XS",
"name": "Xaisômboun"
},
{
"code": "LB-AK",
"name": "‘Akkār"
},
{
"code": "LB-AS",
"name": "Ash Shimāl"
},
{
"code": "LB-BA",
"name": "Bayrūt"
},
{
"code": "LB-BH",
"name": "B‘alabak-Al Hirmil"
},
{
"code": "LB-BI",
"name": "Al Biqā‘"
},
{
"code": "LB-JA",
"name": "Al Janūb"
},
{
"code": "LB-JL",
"name": "Jabal Lubnān"
},
{
"code": "LB-NA",
"name": "An Nabaţīyah"
},
{
"code": "LC-01",
"name": "Anse la Raye"
},
{
"code": "LC-02",
"name": "Castries"
},
{
"code": "LC-03",
"name": "Choiseul"
},
{
"code": "LC-05",
"name": "Dennery"
},
{
"code": "LC-06",
"name": "Gros Islet"
},
{
"code": "LC-07",
"name": "Laborie"
},
{
"code": "LC-08",
"name": "Micoud"
},
{
"code": "LC-10",
"name": "Soufrière"
},
{
"code": "LC-11",
"name": "Vieux Fort"
},
{
"code": "LC-12",
"name": "Canaries"
},
{
"code": "LI-01",
"name": "Balzers"
},
{
"code": "LI-02",
"name": "Eschen"
},
{
"code": "LI-03",
"name": "Gamprin"
},
{
"code": "LI-04",
"name": "Mauren"
},
{
"code": "LI-05",
"name": "Planken"
},
{
"code": "LI-06",
"name": "Ruggell"
},
{
"code": "LI-07",
"name": "Schaan"
},
{
"code": "LI-08",
"name": "Schellenberg"
},
{
"code": "LI-09",
"name": "Triesen"
},
{
"code": "LI-10",
"name": "Triesenberg"
},
{
"code": "LI-11",
"name": "Vaduz"
},
{
"code": "LK-1",
"name": "Western Province"
},
{
"code": "LK-11",
"name": "Colombo"
},
{
"code": "LK-12",
"name": "Gampaha"
},
{
"code": "LK-13",
"name": "Kalutara"
},
{
"code": "LK-2",
"name": "Central Province"
},
{
"code": "LK-21",
"name": "Kandy"
},
{
"code": "LK-22",
"name": "Matale"
},
{
"code": "LK-23",
"name": "Nuwara Eliya"
},
{
"code": "LK-3",
"name": "Southern Province"
},
{
"code": "LK-31",
"name": "Galle"
},
{
"code": "LK-32",
"name": "Matara"
},
{
"code": "LK-33",
"name": "Hambantota"
},
{
"code": "LK-4",
"name": "Northern Province"
},
{
"code": "LK-41",
"name": "Jaffna"
},
{
"code": "LK-42",
"name": "Kilinochchi"
},
{
"code": "LK-43",
"name": "Mannar"
},
{
"code": "LK-44",
"name": "Vavuniya"
},
{
"code": "LK-45",
"name": "Mullaittivu"
},
{
"code": "LK-5",
"name": "Eastern Province"
},
{
"code": "LK-51",
"name": "Batticaloa"
},
{
"code": "LK-52",
"name": "Ampara"
},
{
"code": "LK-53",
"name": "Trincomalee"
},
{
"code": "LK-6",
"name": "North Western Province"
},
{
"code": "LK-61",
"name": "Kurunegala"
},
{
"code": "LK-62",
"name": "Puttalam"
},
{
"code": "LK-7",
"name": "North Central Province"
},
{
"code": "LK-71",
"name": "Anuradhapura"
},
{
"code": "LK-72",
"name": "Polonnaruwa"
},
{
"code": "LK-8",
"name": "Uva Province"
},
{
"code": "LK-81",
"name": "Badulla"
},
{
"code": "LK-82",
"name": "Monaragala"
},
{
"code": "LK-9",
"name": "Sabaragamuwa Province"
},
{
"code": "LK-91",
"name": "Ratnapura"
},
{
"code": "LK-92",
"name": "Kegalla"
},
{
"code": "LR-BG",
"name": "Bong"
},
{
"code": "LR-BM",
"name": "Bomi"
},
{
"code": "LR-CM",
"name": "Grand Cape Mount"
},
{
"code": "LR-GB",
"name": "Grand Bassa"
},
{
"code": "LR-GG",
"name": "Grand Gedeh"
},
{
"code": "LR-GK",
"name": "Grand Kru"
},
{
"code": "LR-GP",
"name": "Gbarpolu"
},
{
"code": "LR-LO",
"name": "Lofa"
},
{
"code": "LR-MG",
"name": "Margibi"
},
{
"code": "LR-MO",
"name": "Montserrado"
},
{
"code": "LR-MY",
"name": "Maryland"
},
{
"code": "LR-NI",
"name": "Nimba"
},
{
"code": "LR-RG",
"name": "River Gee"
},
{
"code": "LR-RI",
"name": "River Cess"
},
{
"code": "LR-SI",
"name": "Sinoe"
},
{
"code": "LS-A",
"name": "Maseru"
},
{
"code": "LS-B",
"name": "Botha-Bothe"
},
{
"code": "LS-C",
"name": "Leribe"
},
{
"code": "LS-D",
"name": "Berea"
},
{
"code": "LS-E",
"name": "Mafeteng"
},
{
"code": "LS-F",
"name": "Mohale's Hoek"
},
{
"code": "LS-G",
"name": "Quthing"
},
{
"code": "LS-H",
"name": "Qacha's Nek"
},
{
"code": "LS-J",
"name": "Mokhotlong"
},
{
"code": "LS-K",
"name": "Thaba-Tseka"
},
{
"code": "LT-01",
"name": "Akmenė"
},
{
"code": "LT-02",
"name": "Alytaus miestas"
},
{
"code": "LT-03",
"name": "Alytus"
},
{
"code": "LT-04",
"name": "Anykščiai"
},
{
"code": "LT-05",
"name": "Birštonas"
},
{
"code": "LT-06",
"name": "Biržai"
},
{
"code": "LT-07",
"name": "Druskininkai"
},
{
"code": "LT-08",
"name": "Elektrėnai"
},
{
"code": "LT-09",
"name": "Ignalina"
},
{
"code": "LT-10",
"name": "Jonava"
},
{
"code": "LT-11",
"name": "Joniškis"
},
{
"code": "LT-12",
"name": "Jurbarkas"
},
{
"code": "LT-13",
"name": "Kaišiadorys"
},
{
"code": "LT-14",
"name": "Kalvarija"
},
{
"code": "LT-15",
"name": "Kauno miestas"
},
{
"code": "LT-16",
"name": "Kaunas"
},
{
"code": "LT-17",
"name": "Kazlų Rūdos"
},
{
"code": "LT-18",
"name": "Kėdainiai"
},
{
"code": "LT-19",
"name": "Kelmė"
},
{
"code": "LT-20",
"name": "Klaipėdos miestas"
},
{
"code": "LT-21",
"name": "Klaipėda"
},
{
"code": "LT-22",
"name": "Kretinga"
},
{
"code": "LT-23",
"name": "Kupiškis"
},
{
"code": "LT-24",
"name": "Lazdijai"
},
{
"code": "LT-25",
"name": "Marijampolė"
},
{
"code": "LT-26",
"name": "Mažeikiai"
},
{
"code": "LT-27",
"name": "Molėtai"
},
{
"code": "LT-28",
"name": "Neringa"
},
{
"code": "LT-29",
"name": "Pagėgiai"
},
{
"code": "LT-30",
"name": "Pakruojis"
},
{
"code": "LT-31",
"name": "Palangos miestas"
},
{
"code": "LT-32",
"name": "Panevėžio miestas"
},
{
"code": "LT-33",
"name": "Panevėžys"
},
{
"code": "LT-34",
"name": "Pasvalys"
},
{
"code": "LT-35",
"name": "Plungė"
},
{
"code": "LT-36",
"name": "Prienai"
},
{
"code": "LT-37",
"name": "Radviliškis"
},
{
"code": "LT-38",
"name": "Raseiniai"
},
{
"code": "LT-39",
"name": "Rietavas"
},
{
"code": "LT-40",
"name": "Rokiškis"
},
{
"code": "LT-41",
"name": "Šakiai"
},
{
"code": "LT-42",
"name": "Šalčininkai"
},
{
"code": "LT-43",
"name": "Šiaulių miestas"
},
{
"code": "LT-44",
"name": "Šiauliai"
},
{
"code": "LT-45",
"name": "Šilalė"
},
{
"code": "LT-46",
"name": "Šilutė"
},
{
"code": "LT-47",
"name": "Širvintos"
},
{
"code": "LT-48",
"name": "Skuodas"
},
{
"code": "LT-49",
"name": "Švenčionys"
},
{
"code": "LT-50",
"name": "Tauragė"
},
{
"code": "LT-51",
"name": "Telšiai"
},
{
"code": "LT-52",
"name": "Trakai"
},
{
"code": "LT-53",
"name": "Ukmergė"
},
{
"code": "LT-54",
"name": "Utena"
},
{
"code": "LT-55",
"name": "Varėna"
},
{
"code": "LT-56",
"name": "Vilkaviškis"
},
{
"code": "LT-57",
"name": "Vilniaus miestas"
},
{
"code": "LT-58",
"name": "Vilnius"
},
{
"code": "LT-59",
"name": "Visaginas"
},
{
"code": "LT-60",
"name": "Zarasai"
},
{
"code": "LT-AL",
"name": "Alytaus apskritis"
},
{
"code": "LT-KL",
"name": "Klaipėdos apskritis"
},
{
"code": "LT-KU",
"name": "Kauno apskritis"
},
{
"code": "LT-MR",
"name": "Marijampolės apskritis"
},
{
"code": "LT-PN",
"name": "Panevėžio apskritis"
},
{
"code": "LT-SA",
"name": "Šiaulių apskritis"
},
{
"code": "LT-TA",
"name": "Tauragės apskritis"
},
{
"code": "LT-TE",
"name": "Telšių apskritis"
},
{
"code": "LT-UT",
"name": "Utenos apskritis"
},
{
"code": "LT-VL",
"name": "Vilniaus apskritis"
},
{
"code": "LU-CA",
"name": "Capellen"
},
{
"code": "LU-CL",
"name": "Clervaux"
},
{
"code": "LU-DI",
"name": "Diekirch"
},
{
"code": "LU-EC",
"name": "Echternach"
},
{
"code": "LU-ES",
"name": "Esch-sur-Alzette"
},
{
"code": "LU-GR",
"name": "Grevenmacher"
},
{
"code": "LU-LU",
"name": "Luxembourg"
},
{
"code": "LU-ME",
"name": "Mersch"
},
{
"code": "LU-RD",
"name": "Redange"
},
{
"code": "LU-RM",
"name": "Remich"
},
{
"code": "LU-VD",
"name": "Vianden"
},
{
"code": "LU-WI",
"name": "Wiltz"
},
{
"code": "LV-002",
"name": "Aizkraukles novads"
},
{
"code": "LV-007",
"name": "Alūksnes novads"
},
{
"code": "LV-011",
"name": "Ādažu novads"
},
{
"code": "LV-015",
"name": "Balvu novads"
},
{
"code": "LV-016",
"name": "Bauskas novads"
},
{
"code": "LV-022",
"name": "Cēsu novads"
},
{
"code": "LV-026",
"name": "Dobeles novads"
},
{
"code": "LV-033",
"name": "Gulbenes novads"
},
{
"code": "LV-041",
"name": "Jelgavas novads"
},
{
"code": "LV-042",
"name": "Jēkabpils novads"
},
{
"code": "LV-047",
"name": "Krāslavas novads"
},
{
"code": "LV-050",
"name": "Kuldīgas novads"
},
{
"code": "LV-052",
"name": "Ķekavas novads"
},
{
"code": "LV-054",
"name": "Limbažu novads"
},
{
"code": "LV-056",
"name": "Līvānu novads"
},
{
"code": "LV-058",
"name": "Ludzas novads"
},
{
"code": "LV-059",
"name": "Madonas novads"
},
{
"code": "LV-062",
"name": "Mārupes novads"
},
{
"code": "LV-067",
"name": "Ogres novads"
},
{
"code": "LV-068",
"name": "Olaines novads"
},
{
"code": "LV-073",
"name": "Preiļu novads"
},
{
"code": "LV-077",
"name": "Rēzeknes novads"
},
{
"code": "LV-080",
"name": "Ropažu novads"
},
{
"code": "LV-087",
"name": "Salaspils novads"
},
{
"code": "LV-088",
"name": "Saldus novads"
},
{
"code": "LV-089",
"name": "Saulkrastu novads"
},
{
"code": "LV-091",
"name": "Siguldas novads"
},
{
"code": "LV-094",
"name": "Smiltenes novads"
},
{
"code": "LV-097",
"name": "Talsu novads"
},
{
"code": "LV-099",
"name": "Tukuma novads"
},
{
"code": "LV-101",
"name": "Valkas novads"
},
{
"code": "LV-102",
"name": "Varakļānu novads"
},
{
"code": "LV-106",
"name": "Ventspils novads"
},
{
"code": "LV-111",
"name": "Augšdaugavas novads"
},
{
"code": "LV-112",
"name": "Dienvidkurzemes Novads"
},
{
"code": "LV-113",
"name": "Valmieras Novads"
},
{
"code": "LV-DGV",
"name": "Daugavpils"
},
{
"code": "LV-JEL",
"name": "Jelgava"
},
{
"code": "LV-JUR",
"name": "Jūrmala"
},
{
"code": "LV-LPX",
"name": "Liepāja"
},
{
"code": "LV-REZ",
"name": "Rēzekne"
},
{
"code": "LV-RIX",
"name": "Rīga"
},
{
"code": "LV-VEN",
"name": "Ventspils"
},
{
"code": "LY-BA",
"name": "Banghāzī"
},
{
"code": "LY-BU",
"name": "Al Buţnān"
},
{
"code": "LY-DR",
"name": "Darnah"
},
{
"code": "LY-GT",
"name": "Ghāt"
},
{
"code": "LY-JA",
"name": "Al Jabal al Akhḑar"
},
{
"code": "LY-JG",
"name": "Al Jabal al Gharbī"
},
{
"code": "LY-JI",
"name": "Al Jafārah"
},
{
"code": "LY-JU",
"name": "Al Jufrah"
},
{
"code": "LY-KF",
"name": "Al Kufrah"
},
{
"code": "LY-MB",
"name": "Al Marqab"
},
{
"code": "LY-MI",
"name": "Mişrātah"
},
{
"code": "LY-MJ",
"name": "Al Marj"
},
{
"code": "LY-MQ",
"name": "Murzuq"
},
{
"code": "LY-NL",
"name": "Nālūt"
},
{
"code": "LY-NQ",
"name": "An Nuqāţ al Khams"
},
{
"code": "LY-SB",
"name": "Sabhā"
},
{
"code": "LY-SR",
"name": "Surt"
},
{
"code": "LY-TB",
"name": "Ţarābulus"
},
{
"code": "LY-WA",
"name": "Al Wāḩāt"
},
{
"code": "LY-WD",
"name": "Wādī al Ḩayāt"
},
{
"code": "LY-WS",
"name": "Wādī ash Shāţi’"
},
{
"code": "LY-ZA",
"name": "Az Zāwiyah"
},
{
"code": "MA-01",
"name": "Tanger-Tétouan-Al Hoceïma"
},
{
"code": "MA-02",
"name": "L'Oriental"
},
{
"code": "MA-03",
"name": "Fès-Meknès"
},
{
"code": "MA-04",
"name": "Rabat-Salé-Kénitra"
},
{
"code": "MA-05",
"name": "Béni Mellal-Khénifra"
},
{
"code": "MA-06",
"name": "Casablanca-Settat"
},
{
"code": "MA-07",
"name": "Marrakech-Safi"
},
{
"code": "MA-08",
"name": "Drâa-Tafilalet"
},
{
"code": "MA-09",
"name": "Souss-Massa"
},
{
"code": "MA-10",
"name": "Guelmim-Oued Noun (EH-partial)"
},
{
"code": "MA-11",
"name": "Laâyoune-Sakia El Hamra (EH-partial)"
},
{
"code": "MA-12",
"name": "Dakhla-Oued Ed-Dahab (EH)"
},
{
"code": "MA-AGD",
"name": "Agadir-Ida-Ou-Tanane"
},
{
"code": "MA-AOU",
"name": "Aousserd (EH)"
},
{
"code": "MA-ASZ",
"name": "Assa-Zag (EH-partial)"
},
{
"code": "MA-AZI",
"name": "Azilal"
},
{
"code": "MA-BEM",
"name": "Béni Mellal"
},
{
"code": "MA-BER",
"name": "Berkane"
},
{
"code": "MA-BES",
"name": "Benslimane"
},
{
"code": "MA-BOD",
"name": "Boujdour (EH)"
},
{
"code": "MA-BOM",
"name": "Boulemane"
},
{
"code": "MA-BRR",
"name": "Berrechid"
},
{
"code": "MA-CAS",
"name": "Casablanca"
},
{
"code": "MA-CHE",
"name": "Chefchaouen"
},
{
"code": "MA-CHI",
"name": "Chichaoua"
},
{
"code": "MA-CHT",
"name": "Chtouka-Ait Baha"
},
{
"code": "MA-DRI",
"name": "Driouch"
},
{
"code": "MA-ERR",
"name": "Errachidia"
},
{
"code": "MA-ESI",
"name": "Essaouira"
},
{
"code": "MA-ESM",
"name": "Es-Semara (EH-partial)"
},
{
"code": "MA-FAH",
"name": "Fahs-Anjra"
},
{
"code": "MA-FES",
"name": "Fès"
},
{
"code": "MA-FIG",
"name": "Figuig"
},
{
"code": "MA-FQH",
"name": "Fquih Ben Salah"
},
{
"code": "MA-GUE",
"name": "Guelmim"
},
{
"code": "MA-GUF",
"name": "Guercif"
},
{
"code": "MA-HAJ",
"name": "El Hajeb"
},
{
"code": "MA-HAO",
"name": "Al Haouz"
},
{
"code": "MA-HOC",
"name": "Al Hoceïma"
},
{
"code": "MA-IFR",
"name": "Ifrane"
},
{
"code": "MA-INE",
"name": "Inezgane-Ait Melloul"
},
{
"code": "MA-JDI",
"name": "El Jadida"
},
{
"code": "MA-JRA",
"name": "Jerada"
},
{
"code": "MA-KEN",
"name": "Kénitra"
},
{
"code": "MA-KES",
"name": "El Kelâa des Sraghna"
},
{
"code": "MA-KHE",
"name": "Khémisset"
},
{
"code": "MA-KHN",
"name": "Khénifra"
},
{
"code": "MA-KHO",
"name": "Khouribga"
},
{
"code": "MA-LAA",
"name": "Laâyoune (EH)"
},
{
"code": "MA-LAR",
"name": "Larache"
},
{
"code": "MA-MAR",
"name": "Marrakech"
},
{
"code": "MA-MDF",
"name": "M’diq-Fnideq"
},
{
"code": "MA-MED",
"name": "Médiouna"
},
{
"code": "MA-MEK",
"name": "Meknès"
},
{
"code": "MA-MID",
"name": "Midelt"
},
{
"code": "MA-MOH",
"name": "Mohammadia"
},
{
"code": "MA-MOU",
"name": "Moulay Yacoub"
},
{
"code": "MA-NAD",
"name": "Nador"
},
{
"code": "MA-NOU",
"name": "Nouaceur"
},
{
"code": "MA-OUA",
"name": "Ouarzazate"
},
{
"code": "MA-OUD",
"name": "Oued Ed-Dahab (EH)"
},
{
"code": "MA-OUJ",
"name": "Oujda-Angad"
},
{
"code": "MA-OUZ",
"name": "Ouezzane"
},
{
"code": "MA-RAB",
"name": "Rabat"
},
{
"code": "MA-REH",
"name": "Rehamna"
},
{
"code": "MA-SAF",
"name": "Safi"
},
{
"code": "MA-SAL",
"name": "Salé"
},
{
"code": "MA-SEF",
"name": "Sefrou"
},
{
"code": "MA-SET",
"name": "Settat"
},
{
"code": "MA-SIB",
"name": "Sidi Bennour"
},
{
"code": "MA-SIF",
"name": "Sidi Ifni"
},
{
"code": "MA-SIK",
"name": "Sidi Kacem"
},
{
"code": "MA-SIL",
"name": "Sidi Slimane"
},
{
"code": "MA-SKH",
"name": "Skhirate-Témara"
},
{
"code": "MA-TAF",
"name": "Tarfaya (EH-partial)"
},
{
"code": "MA-TAI",
"name": "Taourirt"
},
{
"code": "MA-TAO",
"name": "Taounate"
},
{
"code": "MA-TAR",
"name": "Taroudannt"
},
{
"code": "MA-TAT",
"name": "Tata"
},
{
"code": "MA-TAZ",
"name": "Taza"
},
{
"code": "MA-TET",
"name": "Tétouan"
},
{
"code": "MA-TIN",
"name": "Tinghir"
},
{
"code": "MA-TIZ",
"name": "Tiznit"
},
{
"code": "MA-TNG",
"name": "Tanger-Assilah"
},
{
"code": "MA-TNT",
"name": "Tan-Tan (EH-partial)"
},
{
"code": "MA-YUS",
"name": "Youssoufia"
},
{
"code": "MA-ZAG",
"name": "Zagora"
},
{
"code": "MC-CL",
"name": "La Colle"
},
{
"code": "MC-CO",
"name": "La Condamine"
},
{
"code": "MC-FO",
"name": "Fontvieille"
},
{
"code": "MC-GA",
"name": "La Gare"
},
{
"code": "MC-JE",
"name": "Jardin Exotique"
},
{
"code": "MC-LA",
"name": "Larvotto"
},
{
"code": "MC-MA",
"name": "Malbousquet"
},
{
"code": "MC-MC",
"name": "Monte-Carlo"
},
{
"code": "MC-MG",
"name": "Moneghetti"
},
{
"code": "MC-MO",
"name": "Monaco-Ville"
},
{
"code": "MC-MU",
"name": "Moulins"
},
{
"code": "MC-PH",
"name": "Port-Hercule"
},
{
"code": "MC-SD",
"name": "Sainte-Dévote"
},
{
"code": "MC-SO",
"name": "La Source"
},
{
"code": "MC-SP",
"name": "Spélugues"
},
{
"code": "MC-SR",
"name": "Saint-Roman"
},
{
"code": "MC-VR",
"name": "Vallon de la Rousse"
},
{
"code": "MD-AN",
"name": "Anenii Noi"
},
{
"code": "MD-BA",
"name": "Bălți"
},
{
"code": "MD-BD",
"name": "Bender [Tighina]"
},
{
"code": "MD-BR",
"name": "Briceni"
},
{
"code": "MD-BS",
"name": "Basarabeasca"
},
{
"code": "MD-CA",
"name": "Cahul"
},
{
"code": "MD-CL",
"name": "Călărași"
},
{
"code": "MD-CM",
"name": "Cimișlia"
},
{
"code": "MD-CR",
"name": "Criuleni"
},
{
"code": "MD-CS",
"name": "Căușeni"
},
{
"code": "MD-CT",
"name": "Cantemir"
},
{
"code": "MD-CU",
"name": "Chișinău"
},
{
"code": "MD-DO",
"name": "Dondușeni"
},
{
"code": "MD-DR",
"name": "Drochia"
},
{
"code": "MD-DU",
"name": "Dubăsari"
},
{
"code": "MD-ED",
"name": "Edineț"
},
{
"code": "MD-FA",
"name": "Fălești"
},
{
"code": "MD-FL",
"name": "Florești"
},
{
"code": "MD-GA",
"name": "Găgăuzia, Unitatea teritorială autonomă (UTAG)"
},
{
"code": "MD-GL",
"name": "Glodeni"
},
{
"code": "MD-HI",
"name": "Hîncești"
},
{
"code": "MD-IA",
"name": "Ialoveni"
},
{
"code": "MD-LE",
"name": "Leova"
},
{
"code": "MD-NI",
"name": "Nisporeni"
},
{
"code": "MD-OC",
"name": "Ocnița"
},
{
"code": "MD-OR",
"name": "Orhei"
},
{
"code": "MD-RE",
"name": "Rezina"
},
{
"code": "MD-RI",
"name": "Rîșcani"
},
{
"code": "MD-SD",
"name": "Șoldănești"
},
{
"code": "MD-SI",
"name": "Sîngerei"
},
{
"code": "MD-SN",
"name": "Stînga Nistrului, unitatea teritorială din"
},
{
"code": "MD-SO",
"name": "Soroca"
},
{
"code": "MD-ST",
"name": "Strășeni"
},
{
"code": "MD-SV",
"name": "Ștefan Vodă"
},
{
"code": "MD-TA",
"name": "Taraclia"
},
{
"code": "MD-TE",
"name": "Telenești"
},
{
"code": "MD-UN",
"name": "Ungheni"
},
{
"code": "ME-01",
"name": "Andrijevica"
},
{
"code": "ME-02",
"name": "Bar"
},
{
"code": "ME-03",
"name": "Berane"
},
{
"code": "ME-04",
"name": "Bijelo Polje"
},
{
"code": "ME-05",
"name": "Budva"
},
{
"code": "ME-06",
"name": "Cetinje"
},
{
"code": "ME-07",
"name": "Danilovgrad"
},
{
"code": "ME-08",
"name": "Herceg-Novi"
},
{
"code": "ME-09",
"name": "Kolašin"
},
{
"code": "ME-10",
"name": "Kotor"
},
{
"code": "ME-11",
"name": "Mojkovac"
},
{
"code": "ME-12",
"name": "Nikšić"
},
{
"code": "ME-13",
"name": "Plav"
},
{
"code": "ME-14",
"name": "Pljevlja"
},
{
"code": "ME-15",
"name": "Plužine"
},
{
"code": "ME-16",
"name": "Podgorica"
},
{
"code": "ME-17",
"name": "Rožaje"
},
{
"code": "ME-18",
"name": "Šavnik"
},
{
"code": "ME-19",
"name": "Tivat"
},
{
"code": "ME-20",
"name": "Ulcinj"
},
{
"code": "ME-21",
"name": "Žabljak"
},
{
"code": "ME-22",
"name": "Gusinje"
},
{
"code": "ME-23",
"name": "Petnjica"
},
{
"code": "ME-24",
"name": "Tuzi"
},
{
"code": "ME-25",
"name": "Zeta"
},
{
"code": "MG-A",
"name": "Toamasina"
},
{
"code": "MG-D",
"name": "Antsiranana"
},
{
"code": "MG-F",
"name": "Fianarantsoa"
},
{
"code": "MG-M",
"name": "Mahajanga"
},
{
"code": "MG-T",
"name": "Antananarivo"
},
{
"code": "MG-U",
"name": "Toliara"
},
{
"code": "MH-ALK",
"name": "Ailuk"
},
{
"code": "MH-ALL",
"name": "Ailinglaplap"
},
{
"code": "MH-ARN",
"name": "Arno"
},
{
"code": "MH-AUR",
"name": "Aur"
},
{
"code": "MH-EBO",
"name": "Ebon"
},
{
"code": "MH-ENI",
"name": "Enewetak & Ujelang"
},
{
"code": "MH-JAB",
"name": "Jabat"
},
{
"code": "MH-JAL",
"name": "Jaluit"
},
{
"code": "MH-KIL",
"name": "Bikini & Kili"
},
{
"code": "MH-KWA",
"name": "Kwajalein"
},
{
"code": "MH-L",
"name": "Ralik chain"
},
{
"code": "MH-LAE",
"name": "Lae"
},
{
"code": "MH-LIB",
"name": "Lib"
},
{
"code": "MH-LIK",
"name": "Likiep"
},
{
"code": "MH-MAJ",
"name": "Majuro"
},
{
"code": "MH-MAL",
"name": "Maloelap"
},
{
"code": "MH-MEJ",
"name": "Mejit"
},
{
"code": "MH-MIL",
"name": "Mili"
},
{
"code": "MH-NMK",
"name": "Namdrik"
},
{
"code": "MH-NMU",
"name": "Namu"
},
{
"code": "MH-RON",
"name": "Rongelap"
},
{
"code": "MH-T",
"name": "Ratak chain"
},
{
"code": "MH-UJA",
"name": "Ujae"
},
{
"code": "MH-UTI",
"name": "Utrik"
},
{
"code": "MH-WTH",
"name": "Wotho"
},
{
"code": "MH-WTJ",
"name": "Wotje"
},
{
"code": "MK-101",
"name": "Veles"
},
{
"code": "MK-102",
"name": "Gradsko"
},
{
"code": "MK-103",
"name": "Demir Kapija"
},
{
"code": "MK-104",
"name": "Kavadarci"
},
{
"code": "MK-105",
"name": "Lozovo"
},
{
"code": "MK-106",
"name": "Negotino"
},
{
"code": "MK-107",
"name": "Rosoman"
},
{
"code": "MK-108",
"name": "Sveti Nikole"
},
{
"code": "MK-109",
"name": "Čaška"
},
{
"code": "MK-201",
"name": "Berovo"
},
{
"code": "MK-202",
"name": "Vinica"
},
{
"code": "MK-203",
"name": "Delčevo"
},
{
"code": "MK-204",
"name": "Zrnovci"
},
{
"code": "MK-205",
"name": "Karbinci"
},
{
"code": "MK-206",
"name": "Kočani"
},
{
"code": "MK-207",
"name": "Makedonska Kamenica"
},
{
"code": "MK-208",
"name": "Pehčevo"
},
{
"code": "MK-209",
"name": "Probištip"
},
{
"code": "MK-210",
"name": "Češinovo-Obleševo"
},
{
"code": "MK-211",
"name": "Štip"
},
{
"code": "MK-301",
"name": "Vevčani"
},
{
"code": "MK-303",
"name": "Debar"
},
{
"code": "MK-304",
"name": "Debrca"
},
{
"code": "MK-307",
"name": "Kičevo"
},
{
"code": "MK-308",
"name": "Makedonski Brod"
},
{
"code": "MK-310",
"name": "Ohrid"
},
{
"code": "MK-311",
"name": "Plasnica"
},
{
"code": "MK-312",
"name": "Struga"
},
{
"code": "MK-313",
"name": "Centar Župa"
},
{
"code": "MK-401",
"name": "Bogdanci"
},
{
"code": "MK-402",
"name": "Bosilovo"
},
{
"code": "MK-403",
"name": "Valandovo"
},
{
"code": "MK-404",
"name": "Vasilevo"
},
{
"code": "MK-405",
"name": "Gevgelija"
},
{
"code": "MK-406",
"name": "Dojran"
},
{
"code": "MK-407",
"name": "Konče"
},
{
"code": "MK-408",
"name": "Novo Selo"
},
{
"code": "MK-409",
"name": "Radoviš"
},
{
"code": "MK-410",
"name": "Strumica"
},
{
"code": "MK-501",
"name": "Bitola"
},
{
"code": "MK-502",
"name": "Demir Hisar"
},
{
"code": "MK-503",
"name": "Dolneni"
},
{
"code": "MK-504",
"name": "Krivogaštani"
},
{
"code": "MK-505",
"name": "Kruševo"
},
{
"code": "MK-506",
"name": "Mogila"
},
{
"code": "MK-507",
"name": "Novaci"
},
{
"code": "MK-508",
"name": "Prilep"
},
{
"code": "MK-509",
"name": "Resen"
},
{
"code": "MK-601",
"name": "Bogovinje"
},
{
"code": "MK-602",
"name": "Brvenica"
},
{
"code": "MK-603",
"name": "Vrapčište"
},
{
"code": "MK-604",
"name": "Gostivar"
},
{
"code": "MK-605",
"name": "Želino"
},
{
"code": "MK-606",
"name": "Jegunovce"
},
{
"code": "MK-607",
"name": "Mavrovo i Rostuše"
},
{
"code": "MK-608",
"name": "Tearce"
},
{
"code": "MK-609",
"name": "Tetovo"
},
{
"code": "MK-701",
"name": "Kratovo"
},
{
"code": "MK-702",
"name": "Kriva Palanka"
},
{
"code": "MK-703",
"name": "Kumanovo"
},
{
"code": "MK-704",
"name": "Lipkovo"
},
{
"code": "MK-705",
"name": "Rankovce"
},
{
"code": "MK-706",
"name": "Staro Nagoričane"
},
{
"code": "MK-801",
"name": "Aerodrom †"
},
{
"code": "MK-802",
"name": "Aračinovo"
},
{
"code": "MK-803",
"name": "Butel †"
},
{
"code": "MK-804",
"name": "Gazi Baba †"
},
{
"code": "MK-805",
"name": "Gjorče Petrov †"
},
{
"code": "MK-806",
"name": "Zelenikovo"
},
{
"code": "MK-807",
"name": "Ilinden"
},
{
"code": "MK-808",
"name": "Karpoš †"
},
{
"code": "MK-809",
"name": "Kisela Voda †"
},
{
"code": "MK-810",
"name": "Petrovec"
},
{
"code": "MK-811",
"name": "Saraj †"
},
{
"code": "MK-812",
"name": "Sopište"
},
{
"code": "MK-813",
"name": "Studeničani"
},
{
"code": "MK-814",
"name": "Centar †"
},
{
"code": "MK-815",
"name": "Čair †"
},
{
"code": "MK-816",
"name": "Čučer-Sandevo"
},
{
"code": "MK-817",
"name": "Šuto Orizari †"
},
{
"code": "ML-1",
"name": "Kayes"
},
{
"code": "ML-10",
"name": "Taoudénit"
},
{
"code": "ML-2",
"name": "Koulikoro"
},
{
"code": "ML-3",
"name": "Sikasso"
},
{
"code": "ML-4",
"name": "Ségou"
},
{
"code": "ML-5",
"name": "Mopti"
},
{
"code": "ML-6",
"name": "Tombouctou"
},
{
"code": "ML-7",
"name": "Gao"
},
{
"code": "ML-8",
"name": "Kidal"
},
{
"code": "ML-9",
"name": "Ménaka"
},
{
"code": "ML-BKO",
"name": "Bamako"
},
{
"code": "MM-01",
"name": "Sagaing"
},
{
"code": "MM-02",
"name": "Bago"
},
{
"code": "MM-03",
"name": "Magway"
},
{
"code": "MM-04",
"name": "Mandalay"
},
{
"code": "MM-05",
"name": "Tanintharyi"
},
{
"code": "MM-06",
"name": "Yangon"
},
{
"code": "MM-07",
"name": "Ayeyarwady"
},
{
"code": "MM-11",
"name": "Kachin"
},
{
"code": "MM-12",
"name": "Kayah"
},
{
"code": "MM-13",
"name": "Kayin"
},
{
"code": "MM-14",
"name": "Chin"
},
{
"code": "MM-15",
"name": "Mon"
},
{
"code": "MM-16",
"name": "Rakhine"
},
{
"code": "MM-17",
"name": "Shan"
},
{
"code": "MM-18",
"name": "Nay Pyi Taw"
},
{
"code": "MN-035",
"name": "Orhon"
},
{
"code": "MN-037",
"name": "Darhan uul"
},
{
"code": "MN-039",
"name": "Hentiy"
},
{
"code": "MN-041",
"name": "Hövsgöl"
},
{
"code": "MN-043",
"name": "Hovd"
},
{
"code": "MN-046",
"name": "Uvs"
},
{
"code": "MN-047",
"name": "Töv"
},
{
"code": "MN-049",
"name": "Selenge"
},
{
"code": "MN-051",
"name": "Sühbaatar"
},
{
"code": "MN-053",
"name": "Ömnögovĭ"
},
{
"code": "MN-055",
"name": "Övörhangay"
},
{
"code": "MN-057",
"name": "Dzavhan"
},
{
"code": "MN-059",
"name": "Dundgovĭ"
},
{
"code": "MN-061",
"name": "Dornod"
},
{
"code": "MN-063",
"name": "Dornogovĭ"
},
{
"code": "MN-064",
"name": "Govĭ-Sümber"
},
{
"code": "MN-065",
"name": "Govĭ-Altay"
},
{
"code": "MN-067",
"name": "Bulgan"
},
{
"code": "MN-069",
"name": "Bayanhongor"
},
{
"code": "MN-071",
"name": "Bayan-Ölgiy"
},
{
"code": "MN-073",
"name": "Arhangay"
},
{
"code": "MN-1",
"name": "Ulaanbaatar"
},
{
"code": "MR-01",
"name": "Hodh ech Chargui"
},
{
"code": "MR-02",
"name": "Hodh el Gharbi"
},
{
"code": "MR-03",
"name": "Assaba"
},
{
"code": "MR-04",
"name": "Gorgol"
},
{
"code": "MR-05",
"name": "Brakna"
},
{
"code": "MR-06",
"name": "Trarza"
},
{
"code": "MR-07",
"name": "Adrar"
},
{
"code": "MR-08",
"name": "Dakhlet Nouâdhibou"
},
{
"code": "MR-09",
"name": "Tagant"
},
{
"code": "MR-10",
"name": "Guidimaka"
},
{
"code": "MR-11",
"name": "Tiris Zemmour"
},
{
"code": "MR-12",
"name": "Inchiri"
},
{
"code": "MR-13",
"name": "Nouakchott Ouest"
},
{
"code": "MR-14",
"name": "Nouakchott Nord"
},
{
"code": "MR-15",
"name": "Nouakchott Sud"
},
{
"code": "MT-01",
"name": "Attard"
},
{
"code": "MT-02",
"name": "Balzan"
},
{
"code": "MT-03",
"name": "Birgu"
},
{
"code": "MT-04",
"name": "Birkirkara"
},
{
"code": "MT-05",
"name": "Birżebbuġa"
},
{
"code": "MT-06",
"name": "Bormla"
},
{
"code": "MT-07",
"name": "Dingli"
},
{
"code": "MT-08",
"name": "Fgura"
},
{
"code": "MT-09",
"name": "Floriana"
},
{
"code": "MT-10",
"name": "Fontana"
},
{
"code": "MT-11",
"name": "Gudja"
},
{
"code": "MT-12",
"name": "Gżira"
},
{
"code": "MT-13",
"name": "Għajnsielem"
},
{
"code": "MT-14",
"name": "Għarb"
},
{
"code": "MT-15",
"name": "Għargħur"
},
{
"code": "MT-16",
"name": "Għasri"
},
{
"code": "MT-17",
"name": "Għaxaq"
},
{
"code": "MT-18",
"name": "Ħamrun"
},
{
"code": "MT-19",
"name": "Iklin"
},
{
"code": "MT-20",
"name": "Isla"
},
{
"code": "MT-21",
"name": "Kalkara"
},
{
"code": "MT-22",
"name": "Kerċem"
},
{
"code": "MT-23",
"name": "Kirkop"
},
{
"code": "MT-24",
"name": "Lija"
},
{
"code": "MT-25",
"name": "Luqa"
},
{
"code": "MT-26",
"name": "Marsa"
},
{
"code": "MT-27",
"name": "Marsaskala"
},
{
"code": "MT-28",
"name": "Marsaxlokk"
},
{
"code": "MT-29",
"name": "Mdina"
},
{
"code": "MT-30",
"name": "Mellieħa"
},
{
"code": "MT-31",
"name": "Mġarr"
},
{
"code": "MT-32",
"name": "Mosta"
},
{
"code": "MT-33",
"name": "Mqabba"
},
{
"code": "MT-34",
"name": "Msida"
},
{
"code": "MT-35",
"name": "Mtarfa"
},
{
"code": "MT-36",
"name": "Munxar"
},
{
"code": "MT-37",
"name": "Nadur"
},
{
"code": "MT-38",
"name": "Naxxar"
},
{
"code": "MT-39",
"name": "Paola"
},
{
"code": "MT-40",
"name": "Pembroke"
},
{
"code": "MT-41",
"name": "Pietà"
},
{
"code": "MT-42",
"name": "Qala"
},
{
"code": "MT-43",
"name": "Qormi"
},
{
"code": "MT-44",
"name": "Qrendi"
},
{
"code": "MT-45",
"name": "Rabat Gozo"
},
{
"code": "MT-46",
"name": "Rabat Malta"
},
{
"code": "MT-47",
"name": "Safi"
},
{
"code": "MT-48",
"name": "Saint Julian's"
},
{
"code": "MT-49",
"name": "Saint John"
},
{
"code": "MT-50",
"name": "Saint Lawrence"
},
{
"code": "MT-51",
"name": "Saint Paul's Bay"
},
{
"code": "MT-52",
"name": "Sannat"
},
{
"code": "MT-53",
"name": "Saint Lucia's"
},
{
"code": "MT-54",
"name": "Santa Venera"
},
{
"code": "MT-55",
"name": "Siġġiewi"
},
{
"code": "MT-56",
"name": "Sliema"
},
{
"code": "MT-57",
"name": "Swieqi"
},
{
"code": "MT-58",
"name": "Ta' Xbiex"
},
{
"code": "MT-59",
"name": "Tarxien"
},
{
"code": "MT-60",
"name": "Valletta"
},
{
"code": "MT-61",
"name": "Xagħra"
},
{
"code": "MT-62",
"name": "Xewkija"
},
{
"code": "MT-63",
"name": "Xgħajra"
},
{
"code": "MT-64",
"name": "Żabbar"
},
{
"code": "MT-65",
"name": "Żebbuġ Gozo"
},
{
"code": "MT-66",
"name": "Żebbuġ Malta"
},
{
"code": "MT-67",
"name": "Żejtun"
},
{
"code": "MT-68",
"name": "Żurrieq"
},
{
"code": "MU-AG",
"name": "Agalega Islands"
},
{
"code": "MU-BL",
"name": "Black River"
},
{
"code": "MU-CC",
"name": "Cargados Carajos Shoals"
},
{
"code": "MU-FL",
"name": "Flacq"
},
{
"code": "MU-GP",
"name": "Grand Port"
},
{
"code": "MU-MO",
"name": "Moka"
},
{
"code": "MU-PA",
"name": "Pamplemousses"
},
{
"code": "MU-PL",
"name": "Port Louis"
},
{
"code": "MU-PW",
"name": "Plaines Wilhems"
},
{
"code": "MU-RO",
"name": "Rodrigues Island"
},
{
"code": "MU-RR",
"name": "Rivière du Rempart"
},
{
"code": "MU-SA",
"name": "Savanne"
},
{
"code": "MV-00",
"name": "South Ari Atoll"
},
{
"code": "MV-01",
"name": "Addu City"
},
{
"code": "MV-02",
"name": "North Ari Atoll"
},
{
"code": "MV-03",
"name": "Faadhippolhu"
},
{
"code": "MV-04",
"name": "Felidhu Atoll"
},
{
"code": "MV-05",
"name": "Hahdhunmathi"
},
{
"code": "MV-07",
"name": "North Thiladhunmathi"
},
{
"code": "MV-08",
"name": "Kolhumadulu"
},
{
"code": "MV-12",
"name": "Mulaku Atoll"
},
{
"code": "MV-13",
"name": "North Maalhosmadulu"
},
{
"code": "MV-14",
"name": "North Nilandhe Atoll"
},
{
"code": "MV-17",
"name": "South Nilandhe Atoll"
},
{
"code": "MV-20",
"name": "South Maalhosmadulu"
},
{
"code": "MV-23",
"name": "South Thiladhunmathi"
},
{
"code": "MV-24",
"name": "North Miladhunmadulu"
},
{
"code": "MV-25",
"name": "South Miladhunmadulu"
},
{
"code": "MV-26",
"name": "Male Atoll"
},
{
"code": "MV-27",
"name": "North Huvadhu Atoll"
},
{
"code": "MV-28",
"name": "South Huvadhu Atoll"
},
{
"code": "MV-29",
"name": "Fuvammulah"
},
{
"code": "MV-MLE",
"name": "Male"
},
{
"code": "MW-BA",
"name": "Balaka"
},
{
"code": "MW-BL",
"name": "Blantyre"
},
{
"code": "MW-C",
"name": "Central Region"
},
{
"code": "MW-CK",
"name": "Chikwawa"
},
{
"code": "MW-CR",
"name": "Chiradzulu"
},
{
"code": "MW-CT",
"name": "Chitipa"
},
{
"code": "MW-DE",
"name": "Dedza"
},
{
"code": "MW-DO",
"name": "Dowa"
},
{
"code": "MW-KR",
"name": "Karonga"
},
{
"code": "MW-KS",
"name": "Kasungu"
},
{
"code": "MW-LI",
"name": "Lilongwe"
},
{
"code": "MW-LK",
"name": "Likoma"
},
{
"code": "MW-MC",
"name": "Mchinji"
},
{
"code": "MW-MG",
"name": "Mangochi"
},
{
"code": "MW-MH",
"name": "Machinga"
},
{
"code": "MW-MU",
"name": "Mulanje"
},
{
"code": "MW-MW",
"name": "Mwanza"
},
{
"code": "MW-MZ",
"name": "Mzimba"
},
{
"code": "MW-N",
"name": "Northern Region"
},
{
"code": "MW-NB",
"name": "Nkhata Bay"
},
{
"code": "MW-NE",
"name": "Neno"
},
{
"code": "MW-NI",
"name": "Ntchisi"
},
{
"code": "MW-NK",
"name": "Nkhotakota"
},
{
"code": "MW-NS",
"name": "Nsanje"
},
{
"code": "MW-NU",
"name": "Ntcheu"
},
{
"code": "MW-PH",
"name": "Phalombe"
},
{
"code": "MW-RU",
"name": "Rumphi"
},
{
"code": "MW-S",
"name": "Southern Region"
},
{
"code": "MW-SA",
"name": "Salima"
},
{
"code": "MW-TH",
"name": "Thyolo"
},
{
"code": "MW-ZO",
"name": "Zomba"
},
{
"code": "MX-AGU",
"name": "Aguascalientes"
},
{
"code": "MX-BCN",
"name": "Baja California"
},
{
"code": "MX-BCS",
"name": "Baja California Sur"
},
{
"code": "MX-CAM",
"name": "Campeche"
},
{
"code": "MX-CHH",
"name": "Chihuahua"
},
{
"code": "MX-CHP",
"name": "Chiapas"
},
{
"code": "MX-CMX",
"name": "Ciudad de México"
},
{
"code": "MX-COA",
"name": "Coahuila de Zaragoza"
},
{
"code": "MX-COL",
"name": "Colima"
},
{
"code": "MX-DUR",
"name": "Durango"
},
{
"code": "MX-GRO",
"name": "Guerrero"
},
{
"code": "MX-GUA",
"name": "Guanajuato"
},
{
"code": "MX-HID",
"name": "Hidalgo"
},
{
"code": "MX-JAL",
"name": "Jalisco"
},
{
"code": "MX-MEX",
"name": "México"
},
{
"code": "MX-MIC",
"name": "Michoacán de Ocampo"
},
{
"code": "MX-MOR",
"name": "Morelos"
},
{
"code": "MX-NAY",
"name": "Nayarit"
},
{
"code": "MX-NLE",
"name": "Nuevo León"
},
{
"code": "MX-OAX",
"name": "Oaxaca"
},
{
"code": "MX-PUE",
"name": "Puebla"
},
{
"code": "MX-QUE",
"name": "Querétaro"
},
{
"code": "MX-ROO",
"name": "Quintana Roo"
},
{
"code": "MX-SIN",
"name": "Sinaloa"
},
{
"code": "MX-SLP",
"name": "San Luis Potosí"
},
{
"code": "MX-SON",
"name": "Sonora"
},
{
"code": "MX-TAB",
"name": "Tabasco"
},
{
"code": "MX-TAM",
"name": "Tamaulipas"
},
{
"code": "MX-TLA",
"name": "Tlaxcala"
},
{
"code": "MX-VER",
"name": "Veracruz de Ignacio de la Llave"
},
{
"code": "MX-YUC",
"name": "Yucatán"
},
{
"code": "MX-ZAC",
"name": "Zacatecas"
},
{
"code": "MY-01",
"name": "Johor"
},
{
"code": "MY-02",
"name": "Kedah"
},
{
"code": "MY-03",
"name": "Kelantan"
},
{
"code": "MY-04",
"name": "Melaka"
},
{
"code": "MY-05",
"name": "Negeri Sembilan"
},
{
"code": "MY-06",
"name": "Pahang"
},
{
"code": "MY-07",
"name": "Pulau Pinang"
},
{
"code": "MY-08",
"name": "Perak"
},
{
"code": "MY-09",
"name": "Perlis"
},
{
"code": "MY-10",
"name": "Selangor"
},
{
"code": "MY-11",
"name": "Terengganu"
},
{
"code": "MY-12",
"name": "Sabah"
},
{
"code": "MY-13",
"name": "Sarawak"
},
{
"code": "MY-14",
"name": "Wilayah Persekutuan Kuala Lumpur"
},
{
"code": "MY-15",
"name": "Wilayah Persekutuan Labuan"
},
{
"code": "MY-16",
"name": "Wilayah Persekutuan Putrajaya"
},
{
"code": "MZ-A",
"name": "Niassa"
},
{
"code": "MZ-B",
"name": "Manica"
},
{
"code": "MZ-G",
"name": "Gaza"
},
{
"code": "MZ-I",
"name": "Inhambane"
},
{
"code": "MZ-L",
"name": "Maputo"
},
{
"code": "MZ-MPM",
"name": "Maputo"
},
{
"code": "MZ-N",
"name": "Nampula"
},
{
"code": "MZ-P",
"name": "Cabo Delgado"
},
{
"code": "MZ-Q",
"name": "Zambézia"
},
{
"code": "MZ-S",
"name": "Sofala"
},
{
"code": "MZ-T",
"name": "Tete"
},
{
"code": "NA-CA",
"name": "Zambezi"
},
{
"code": "NA-ER",
"name": "Erongo"
},
{
"code": "NA-HA",
"name": "Hardap"
},
{
"code": "NA-KA",
"name": "//Karas"
},
{
"code": "NA-KE",
"name": "Kavango East"
},
{
"code": "NA-KH",
"name": "Khomas"
},
{
"code": "NA-KU",
"name": "Kunene"
},
{
"code": "NA-KW",
"name": "Kavango West"
},
{
"code": "NA-OD",
"name": "Otjozondjupa"
},
{
"code": "NA-OH",
"name": "Omaheke"
},
{
"code": "NA-ON",
"name": "Oshana"
},
{
"code": "NA-OS",
"name": "Omusati"
},
{
"code": "NA-OT",
"name": "Oshikoto"
},
{
"code": "NA-OW",
"name": "Ohangwena"
},
{
"code": "NE-1",
"name": "Agadez"
},
{
"code": "NE-2",
"name": "Diffa"
},
{
"code": "NE-3",
"name": "Dosso"
},
{
"code": "NE-4",
"name": "Maradi"
},
{
"code": "NE-5",
"name": "Tahoua"
},
{
"code": "NE-6",
"name": "Tillabéri"
},
{
"code": "NE-7",
"name": "Zinder"
},
{
"code": "NE-8",
"name": "Niamey"
},
{
"code": "NG-AB",
"name": "Abia"
},
{
"code": "NG-AD",
"name": "Adamawa"
},
{
"code": "NG-AK",
"name": "Akwa Ibom"
},
{
"code": "NG-AN",
"name": "Anambra"
},
{
"code": "NG-BA",
"name": "Bauchi"
},
{
"code": "NG-BE",
"name": "Benue"
},
{
"code": "NG-BO",
"name": "Borno"
},
{
"code": "NG-BY",
"name": "Bayelsa"
},
{
"code": "NG-CR",
"name": "Cross River"
},
{
"code": "NG-DE",
"name": "Delta"
},
{
"code": "NG-EB",
"name": "Ebonyi"
},
{
"code": "NG-ED",
"name": "Edo"
},
{
"code": "NG-EK",
"name": "Ekiti"
},
{
"code": "NG-EN",
"name": "Enugu"
},
{
"code": "NG-FC",
"name": "Abuja Federal Capital Territory"
},
{
"code": "NG-GO",
"name": "Gombe"
},
{
"code": "NG-IM",
"name": "Imo"
},
{
"code": "NG-JI",
"name": "Jigawa"
},
{
"code": "NG-KD",
"name": "Kaduna"
},
{
"code": "NG-KE",
"name": "Kebbi"
},
{
"code": "NG-KN",
"name": "Kano"
},
{
"code": "NG-KO",
"name": "Kogi"
},
{
"code": "NG-KT",
"name": "Katsina"
},
{
"code": "NG-KW",
"name": "Kwara"
},
{
"code": "NG-LA",
"name": "Lagos"
},
{
"code": "NG-NA",
"name": "Nasarawa"
},
{
"code": "NG-NI",
"name": "Niger"
},
{
"code": "NG-OG",
"name": "Ogun"
},
{
"code": "NG-ON",
"name": "Ondo"
},
{
"code": "NG-OS",
"name": "Osun"
},
{
"code": "NG-OY",
"name": "Oyo"
},
{
"code": "NG-PL",
"name": "Plateau"
},
{
"code": "NG-RI",
"name": "Rivers"
},
{
"code": "NG-SO",
"name": "Sokoto"
},
{
"code": "NG-TA",
"name": "Taraba"
},
{
"code": "NG-YO",
"name": "Yobe"
},
{
"code": "NG-ZA",
"name": "Zamfara"
},
{
"code": "NI-AN",
"name": "Costa Caribe Norte"
},
{
"code": "NI-AS",
"name": "Costa Caribe Sur"
},
{
"code": "NI-BO",
"name": "Boaco"
},
{
"code": "NI-CA",
"name": "Carazo"
},
{
"code": "NI-CI",
"name": "Chinandega"
},
{
"code": "NI-CO",
"name": "Chontales"
},
{
"code": "NI-ES",
"name": "Estelí"
},
{
"code": "NI-GR",
"name": "Granada"
},
{
"code": "NI-JI",
"name": "Jinotega"
},
{
"code": "NI-LE",
"name": "León"
},
{
"code": "NI-MD",
"name": "Madriz"
},
{
"code": "NI-MN",
"name": "Managua"
},
{
"code": "NI-MS",
"name": "Masaya"
},
{
"code": "NI-MT",
"name": "Matagalpa"
},
{
"code": "NI-NS",
"name": "Nueva Segovia"
},
{
"code": "NI-RI",
"name": "Rivas"
},
{
"code": "NI-SJ",
"name": "Río San Juan"
},
{
"code": "NL-AW",
"name": "Aruba"
},
{
"code": "NL-BQ1",
"name": "Bonaire"
},
{
"code": "NL-BQ2",
"name": "Saba"
},
{
"code": "NL-BQ3",
"name": "Sint Eustatius"
},
{
"code": "NL-CW",
"name": "Curaçao"
},
{
"code": "NL-DR",
"name": "Drenthe"
},
{
"code": "NL-FL",
"name": "Flevoland"
},
{
"code": "NL-FR",
"name": "Fryslân"
},
{
"code": "NL-GE",
"name": "Gelderland"
},
{
"code": "NL-GR",
"name": "Groningen"
},
{
"code": "NL-LI",
"name": "Limburg"
},
{
"code": "NL-NB",
"name": "Noord-Brabant"
},
{
"code": "NL-NH",
"name": "Noord-Holland"
},
{
"code": "NL-OV",
"name": "Overijssel"
},
{
"code": "NL-SX",
"name": "Sint Maarten"
},
{
"code": "NL-UT",
"name": "Utrecht"
},
{
"code": "NL-ZE",
"name": "Zeeland"
},
{
"code": "NL-ZH",
"name": "Zuid-Holland"
},
{
"code": "NO-03",
"name": "Oslo"
},
{
"code": "NO-11",
"name": "Rogaland"
},
{
"code": "NO-15",
"name": "Møre og Romsdal"
},
{
"code": "NO-18",
"name": "Nordland"
},
{
"code": "NO-21",
"name": "Svalbard (Arctic Region)"
},
{
"code": "NO-22",
"name": "Jan Mayen (Arctic Region)"
},
{
"code": "NO-30",
"name": "Viken"
},
{
"code": "NO-34",
"name": "Innlandet"
},
{
"code": "NO-38",
"name": "Vestfold og Telemark"
},
{
"code": "NO-42",
"name": "Agder"
},
{
"code": "NO-46",
"name": "Vestland"
},
{
"code": "NO-50",
"name": "Trøndelag"
},
{
"code": "NO-54",
"name": "Troms og Finnmark"
},
{
"code": "NP-P1",
"name": "Koshi"
},
{
"code": "NP-P2",
"name": "Madhesh"
},
{
"code": "NP-P3",
"name": "Bagmati"
},
{
"code": "NP-P4",
"name": "Gandaki"
},
{
"code": "NP-P5",
"name": "Lumbini"
},
{
"code": "NP-P6",
"name": "Karnali"
},
{
"code": "NP-P7",
"name": "Sudurpashchim"
},
{
"code": "NR-01",
"name": "Aiwo"
},
{
"code": "NR-02",
"name": "Anabar"
},
{
"code": "NR-03",
"name": "Anetan"
},
{
"code": "NR-04",
"name": "Anibare"
},
{
"code": "NR-05",
"name": "Baitsi"
},
{
"code": "NR-06",
"name": "Boe"
},
{
"code": "NR-07",
"name": "Buada"
},
{
"code": "NR-08",
"name": "Denigomodu"
},
{
"code": "NR-09",
"name": "Ewa"
},
{
"code": "NR-10",
"name": "Ijuw"
},
{
"code": "NR-11",
"name": "Meneng"
},
{
"code": "NR-12",
"name": "Nibok"
},
{
"code": "NR-13",
"name": "Uaboe"
},
{
"code": "NR-14",
"name": "Yaren"
},
{
"code": "NZ-AUK",
"name": "Auckland"
},
{
"code": "NZ-BOP",
"name": "Bay of Plenty"
},
{
"code": "NZ-CAN",
"name": "Canterbury"
},
{
"code": "NZ-CIT",
"name": "Chatham Islands Territory"
},
{
"code": "NZ-GIS",
"name": "Gisborne"
},
{
"code": "NZ-HKB",
"name": "Hawke's Bay"
},
{
"code": "NZ-MBH",
"name": "Marlborough"
},
{
"code": "NZ-MWT",
"name": "Manawatū-Whanganui"
},
{
"code": "NZ-NSN",
"name": "Nelson"
},
{
"code": "NZ-NTL",
"name": "Northland"
},
{
"code": "NZ-OTA",
"name": "Otago"
},
{
"code": "NZ-STL",
"name": "Southland"
},
{
"code": "NZ-TAS",
"name": "Tasman"
},
{
"code": "NZ-TKI",
"name": "Taranaki"
},
{
"code": "NZ-WGN",
"name": "Greater Wellington"
},
{
"code": "NZ-WKO",
"name": "Waikato"
},
{
"code": "NZ-WTC",
"name": "West Coast"
},
{
"code": "OM-BJ",
"name": "Janūb al Bāţinah"
},
{
"code": "OM-BS",
"name": "Shamāl al Bāţinah"
},
{
"code": "OM-BU",
"name": "Al Buraymī"
},
{
"code": "OM-DA",
"name": "Ad Dākhilīyah"
},
{
"code": "OM-MA",
"name": "Masqaţ"
},
{
"code": "OM-MU",
"name": "Musandam"
},
{
"code": "OM-SJ",
"name": "Janūb ash Sharqīyah"
},
{
"code": "OM-SS",
"name": "Shamāl ash Sharqīyah"
},
{
"code": "OM-WU",
"name": "Al Wusţá"
},
{
"code": "OM-ZA",
"name": "Az̧ Z̧āhirah"
},
{
"code": "OM-ZU",
"name": "Z̧ufār"
},
{
"code": "PA-1",
"name": "Bocas del Toro"
},
{
"code": "PA-10",
"name": "Panamá Oeste"
},
{
"code": "PA-2",
"name": "Coclé"
},
{
"code": "PA-3",
"name": "Colón"
},
{
"code": "PA-4",
"name": "Chiriquí"
},
{
"code": "PA-5",
"name": "Darién"
},
{
"code": "PA-6",
"name": "Herrera"
},
{
"code": "PA-7",
"name": "Los Santos"
},
{
"code": "PA-8",
"name": "Panamá"
},
{
"code": "PA-9",
"name": "Veraguas"
},
{
"code": "PA-EM",
"name": "Emberá"
},
{
"code": "PA-KY",
"name": "Guna Yala"
},
{
"code": "PA-NB",
"name": "Ngäbe-Buglé"
},
{
"code": "PA-NT",
"name": "Naso Tjër Di"
},
{
"code": "PE-AMA",
"name": "Amazonas"
},
{
"code": "PE-ANC",
"name": "Ancash"
},
{
"code": "PE-APU",
"name": "Apurímac"
},
{
"code": "PE-ARE",
"name": "Arequipa"
},
{
"code": "PE-AYA",
"name": "Ayacucho"
},
{
"code": "PE-CAJ",
"name": "Cajamarca"
},
{
"code": "PE-CAL",
"name": "El Callao"
},
{
"code": "PE-CUS",
"name": "Cusco"
},
{
"code": "PE-HUC",
"name": "Huánuco"
},
{
"code": "PE-HUV",
"name": "Huancavelica"
},
{
"code": "PE-ICA",
"name": "Ica"
},
{
"code": "PE-JUN",
"name": "Junín"
},
{
"code": "PE-LAL",
"name": "La Libertad"
},
{
"code": "PE-LAM",
"name": "Lambayeque"
},
{
"code": "PE-LIM",
"name": "Lima"
},
{
"code": "PE-LMA",
"name": "Municipalidad Metropolitana de Lima"
},
{
"code": "PE-LOR",
"name": "Loreto"
},
{
"code": "PE-MDD",
"name": "Madre de Dios"
},
{
"code": "PE-MOQ",
"name": "Moquegua"
},
{
"code": "PE-PAS",
"name": "Pasco"
},
{
"code": "PE-PIU",
"name": "Piura"
},
{
"code": "PE-PUN",
"name": "Puno"
},
{
"code": "PE-SAM",
"name": "San Martín"
},
{
"code": "PE-TAC",
"name": "Tacna"
},
{
"code": "PE-TUM",
"name": "Tumbes"
},
{
"code": "PE-UCA",
"name": "Ucayali"
},
{
"code": "PG-CPK",
"name": "Chimbu"
},
{
"code": "PG-CPM",
"name": "Central"
},
{
"code": "PG-EBR",
"name": "East New Britain"
},
{
"code": "PG-EHG",
"name": "Eastern Highlands"
},
{
"code": "PG-EPW",
"name": "Enga"
},
{
"code": "PG-ESW",
"name": "East Sepik"
},
{
"code": "PG-GPK",
"name": "Gulf"
},
{
"code": "PG-HLA",
"name": "Hela"
},
{
"code": "PG-JWK",
"name": "Jiwaka"
},
{
"code": "PG-MBA",
"name": "Milne Bay"
},
{
"code": "PG-MPL",
"name": "Morobe"
},
{
"code": "PG-MPM",
"name": "Madang"
},
{
"code": "PG-MRL",
"name": "Manus"
},
{
"code": "PG-NCD",
"name": "National Capital District (Port Moresby)"
},
{
"code": "PG-NIK",
"name": "New Ireland"
},
{
"code": "PG-NPP",
"name": "Northern"
},
{
"code": "PG-NSB",
"name": "Bougainville"
},
{
"code": "PG-SAN",
"name": "West Sepik"
},
{
"code": "PG-SHM",
"name": "Southern Highlands"
},
{
"code": "PG-WBK",
"name": "West New Britain"
},
{
"code": "PG-WHM",
"name": "Western Highlands"
},
{
"code": "PG-WPD",
"name": "Western"
},
{
"code": "PH-00",
"name": "National Capital Region"
},
{
"code": "PH-01",
"name": "Ilocos (Region I)"
},
{
"code": "PH-02",
"name": "Cagayan Valley (Region II)"
},
{
"code": "PH-03",
"name": "Central Luzon (Region III)"
},
{
"code": "PH-05",
"name": "Bicol (Region V)"
},
{
"code": "PH-06",
"name": "Western Visayas (Region VI)"
},
{
"code": "PH-07",
"name": "Central Visayas (Region VII)"
},
{
"code": "PH-08",
"name": "Eastern Visayas (Region VIII)"
},
{
"code": "PH-09",
"name": "Zamboanga Peninsula (Region IX)"
},
{
"code": "PH-10",
"name": "Northern Mindanao (Region X)"
},
{
"code": "PH-11",
"name": "Davao (Region XI)"
},
{
"code": "PH-12",
"name": "Soccsksargen (Region XII)"
},
{
"code": "PH-13",
"name": "Caraga (Region XIII)"
},
{
"code": "PH-14",
"name": "Autonomous Region in Muslim Mindanao (ARMM)"
},
{
"code": "PH-15",
"name": "Cordillera Administrative Region (CAR)"
},
{
"code": "PH-40",
"name": "Calabarzon (Region IV-A)"
},
{
"code": "PH-41",
"name": "Mimaropa (Region IV-B)"
},
{
"code": "PH-ABR",
"name": "Abra"
},
{
"code": "PH-AGN",
"name": "Agusan del Norte"
},
{
"code": "PH-AGS",
"name": "Agusan del Sur"
},
{
"code": "PH-AKL",
"name": "Aklan"
},
{
"code": "PH-ALB",
"name": "Albay"
},
{
"code": "PH-ANT",
"name": "Antique"
},
{
"code": "PH-APA",
"name": "Apayao"
},
{
"code": "PH-AUR",
"name": "Aurora"
},
{
"code": "PH-BAN",
"name": "Bataan"
},
{
"code": "PH-BAS",
"name": "Basilan"
},
{
"code": "PH-BEN",
"name": "Benguet"
},
{
"code": "PH-BIL",
"name": "Biliran"
},
{
"code": "PH-BOH",
"name": "Bohol"
},
{
"code": "PH-BTG",
"name": "Batangas"
},
{
"code": "PH-BTN",
"name": "Batanes"
},
{
"code": "PH-BUK",
"name": "Bukidnon"
},
{
"code": "PH-BUL",
"name": "Bulacan"
},
{
"code": "PH-CAG",
"name": "Cagayan"
},
{
"code": "PH-CAM",
"name": "Camiguin"
},
{
"code": "PH-CAN",
"name": "Camarines Norte"
},
{
"code": "PH-CAP",
"name": "Capiz"
},
{
"code": "PH-CAS",
"name": "Camarines Sur"
},
{
"code": "PH-CAT",
"name": "Catanduanes"
},
{
"code": "PH-CAV",
"name": "Cavite"
},
{
"code": "PH-CEB",
"name": "Cebu"
},
{
"code": "PH-COM",
"name": "Davao de Oro"
},
{
"code": "PH-DAO",
"name": "Davao Oriental"
},
{
"code": "PH-DAS",
"name": "Davao del Sur"
},
{
"code": "PH-DAV",
"name": "Davao del Norte"
},
{
"code": "PH-DIN",
"name": "Dinagat Islands"
},
{
"code": "PH-DVO",
"name": "Davao Occidental"
},
{
"code": "PH-EAS",
"name": "Eastern Samar"
},
{
"code": "PH-GUI",
"name": "Guimaras"
},
{
"code": "PH-IFU",
"name": "Ifugao"
},
{
"code": "PH-ILI",
"name": "Iloilo"
},
{
"code": "PH-ILN",
"name": "Ilocos Norte"
},
{
"code": "PH-ILS",
"name": "Ilocos Sur"
},
{
"code": "PH-ISA",
"name": "Isabela"
},
{
"code": "PH-KAL",
"name": "Kalinga"
},
{
"code": "PH-LAG",
"name": "Laguna"
},
{
"code": "PH-LAN",
"name": "Lanao del Norte"
},
{
"code": "PH-LAS",
"name": "Lanao del Sur"
},
{
"code": "PH-LEY",
"name": "Leyte"
},
{
"code": "PH-LUN",
"name": "La Union"
},
{
"code": "PH-MAD",
"name": "Marinduque"
},
{
"code": "PH-MAS",
"name": "Masbate"
},
{
"code": "PH-MDC",
"name": "Mindoro Occidental"
},
{
"code": "PH-MDR",
"name": "Mindoro Oriental"
},
{
"code": "PH-MGN",
"name": "Maguindanao del Norte"
},
{
"code": "PH-MGS",
"name": "Maguindanao del Sur"
},
{
"code": "PH-MOU",
"name": "Mountain Province"
},
{
"code": "PH-MSC",
"name": "Misamis Occidental"
},
{
"code": "PH-MSR",
"name": "Misamis Oriental"
},
{
"code": "PH-NCO",
"name": "Cotabato"
},
{
"code": "PH-NEC",
"name": "Negros Occidental"
},
{
"code": "PH-NER",
"name": "Negros Oriental"
},
{
"code": "PH-NSA",
"name": "Northern Samar"
},
{
"code": "PH-NUE",
"name": "Nueva Ecija"
},
{
"code": "PH-NUV",
"name": "Nueva Vizcaya"
},
{
"code": "PH-PAM",
"name": "Pampanga"
},
{
"code": "PH-PAN",
"name": "Pangasinan"
},
{
"code": "PH-PLW",
"name": "Palawan"
},
{
"code": "PH-QUE",
"name": "Quezon"
},
{
"code": "PH-QUI",
"name": "Quirino"
},
{
"code": "PH-RIZ",
"name": "Rizal"
},
{
"code": "PH-ROM",
"name": "Romblon"
},
{
"code": "PH-SAR",
"name": "Sarangani"
},
{
"code": "PH-SCO",
"name": "South Cotabato"
},
{
"code": "PH-SIG",
"name": "Siquijor"
},
{
"code": "PH-SLE",
"name": "Southern Leyte"
},
{
"code": "PH-SLU",
"name": "Sulu"
},
{
"code": "PH-SOR",
"name": "Sorsogon"
},
{
"code": "PH-SUK",
"name": "Sultan Kudarat"
},
{
"code": "PH-SUN",
"name": "Surigao del Norte"
},
{
"code": "PH-SUR",
"name": "Surigao del Sur"
},
{
"code": "PH-TAR",
"name": "Tarlac"
},
{
"code": "PH-TAW",
"name": "Tawi-Tawi"
},
{
"code": "PH-WSA",
"name": "Samar"
},
{
"code": "PH-ZAN",
"name": "Zamboanga del Norte"
},
{
"code": "PH-ZAS",
"name": "Zamboanga del Sur"
},
{
"code": "PH-ZMB",
"name": "Zambales"
},
{
"code": "PH-ZSI",
"name": "Zamboanga Sibugay"
},
{
"code": "PK-BA",
"name": "Balochistan"
},
{
"code": "PK-GB",
"name": "Gilgit-Baltistan"
},
{
"code": "PK-IS",
"name": "Islamabad"
},
{
"code": "PK-JK",
"name": "Azad Jammu and Kashmir"
},
{
"code": "PK-KP",
"name": "Khyber Pakhtunkhwa"
},
{
"code": "PK-PB",
"name": "Punjab"
},
{
"code": "PK-SD",
"name": "Sindh"
},
{
"code": "PL-02",
"name": "Dolnośląskie"
},
{
"code": "PL-04",
"name": "Kujawsko-Pomorskie"
},
{
"code": "PL-06",
"name": "Lubelskie"
},
{
"code": "PL-08",
"name": "Lubuskie"
},
{
"code": "PL-10",
"name": "Łódzkie"
},
{
"code": "PL-12",
"name": "Małopolskie"
},
{
"code": "PL-14",
"name": "Mazowieckie"
},
{
"code": "PL-16",
"name": "Opolskie"
},
{
"code": "PL-18",
"name": "Podkarpackie"
},
{
"code": "PL-20",
"name": "Podlaskie"
},
{
"code": "PL-22",
"name": "Pomorskie"
},
{
"code": "PL-24",
"name": "Śląskie"
},
{
"code": "PL-26",
"name": "Świętokrzyskie"
},
{
"code": "PL-28",
"name": "Warmińsko-Mazurskie"
},
{
"code": "PL-30",
"name": "Wielkopolskie"
},
{
"code": "PL-32",
"name": "Zachodniopomorskie"
},
{
"code": "PS-BTH",
"name": "Bethlehem"
},
{
"code": "PS-DEB",
"name": "Deir El Balah"
},
{
"code": "PS-GZA",
"name": "Gaza"
},
{
"code": "PS-HBN",
"name": "Hebron"
},
{
"code": "PS-JEM",
"name": "Jerusalem"
},
{
"code": "PS-JEN",
"name": "Jenin"
},
{
"code": "PS-JRH",
"name": "Jericho and Al Aghwar"
},
{
"code": "PS-KYS",
"name": "Khan Yunis"
},
{
"code": "PS-NBS",
"name": "Nablus"
},
{
"code": "PS-NGZ",
"name": "North Gaza"
},
{
"code": "PS-QQA",
"name": "Qalqilya"
},
{
"code": "PS-RBH",
"name": "Ramallah"
},
{
"code": "PS-RFH",
"name": "Rafah"
},
{
"code": "PS-SLT",
"name": "Salfit"
},
{
"code": "PS-TBS",
"name": "Tubas"
},
{
"code": "PS-TKM",
"name": "Tulkarm"
},
{
"code": "PT-01",
"name": "Aveiro"
},
{
"code": "PT-02",
"name": "Beja"
},
{
"code": "PT-03",
"name": "Braga"
},
{
"code": "PT-04",
"name": "Bragança"
},
{
"code": "PT-05",
"name": "Castelo Branco"
},
{
"code": "PT-06",
"name": "Coimbra"
},
{
"code": "PT-07",
"name": "Évora"
},
{
"code": "PT-08",
"name": "Faro"
},
{
"code": "PT-09",
"name": "Guarda"
},
{
"code": "PT-10",
"name": "Leiria"
},
{
"code": "PT-11",
"name": "Lisboa"
},
{
"code": "PT-12",
"name": "Portalegre"
},
{
"code": "PT-13",
"name": "Porto"
},
{
"code": "PT-14",
"name": "Santarém"
},
{
"code": "PT-15",
"name": "Setúbal"
},
{
"code": "PT-16",
"name": "Viana do Castelo"
},
{
"code": "PT-17",
"name": "Vila Real"
},
{
"code": "PT-18",
"name": "Viseu"
},
{
"code": "PT-20",
"name": "Região Autónoma dos Açores"
},
{
"code": "PT-30",
"name": "Região Autónoma da Madeira"
},
{
"code": "PW-002",
"name": "Aimeliik"
},
{
"code": "PW-004",
"name": "Airai"
},
{
"code": "PW-010",
"name": "Angaur"
},
{
"code": "PW-050",
"name": "Hatohobei"
},
{
"code": "PW-100",
"name": "Kayangel"
},
{
"code": "PW-150",
"name": "Koror"
},
{
"code": "PW-212",
"name": "Melekeok"
},
{
"code": "PW-214",
"name": "Ngaraard"
},
{
"code": "PW-218",
"name": "Ngarchelong"
},
{
"code": "PW-222",
"name": "Ngardmau"
},
{
"code": "PW-224",
"name": "Ngatpang"
},
{
"code": "PW-226",
"name": "Ngchesar"
},
{
"code": "PW-227",
"name": "Ngeremlengui"
},
{
"code": "PW-228",
"name": "Ngiwal"
},
{
"code": "PW-350",
"name": "Peleliu"
},
{
"code": "PW-370",
"name": "Sonsorol"
},
{
"code": "PY-1",
"name": "Concepción"
},
{
"code": "PY-10",
"name": "Alto Paraná"
},
{
"code": "PY-11",
"name": "Central"
},
{
"code": "PY-12",
"name": "Ñeembucú"
},
{
"code": "PY-13",
"name": "Amambay"
},
{
"code": "PY-14",
"name": "Canindeyú"
},
{
"code": "PY-15",
"name": "Presidente Hayes"
},
{
"code": "PY-16",
"name": "Alto Paraguay"
},
{
"code": "PY-19",
"name": "Boquerón"
},
{
"code": "PY-2",
"name": "San Pedro"
},
{
"code": "PY-3",
"name": "Cordillera"
},
{
"code": "PY-4",
"name": "Guairá"
},
{
"code": "PY-5",
"name": "Caaguazú"
},
{
"code": "PY-6",
"name": "Caazapá"
},
{
"code": "PY-7",
"name": "Itapúa"
},
{
"code": "PY-8",
"name": "Misiones"
},
{
"code": "PY-9",
"name": "Paraguarí"
},
{
"code": "PY-ASU",
"name": "Asunción"
},
{
"code": "QA-DA",
"name": "Ad Dawḩah"
},
{
"code": "QA-KH",
"name": "Al Khawr wa adh Dhakhīrah"
},
{
"code": "QA-MS",
"name": "Ash Shamāl"
},
{
"code": "QA-RA",
"name": "Ar Rayyān"
},
{
"code": "QA-SH",
"name": "Ash Shīḩānīyah"
},
{
"code": "QA-US",
"name": "Umm Şalāl"
},
{
"code": "QA-WA",
"name": "Al Wakrah"
},
{
"code": "QA-ZA",
"name": "Az̧ Z̧a‘āyin"
},
{
"code": "RO-AB",
"name": "Alba"
},
{
"code": "RO-AG",
"name": "Argeș"
},
{
"code": "RO-AR",
"name": "Arad"
},
{
"code": "RO-B",
"name": "București"
},
{
"code": "RO-BC",
"name": "Bacău"
},
{
"code": "RO-BH",
"name": "Bihor"
},
{
"code": "RO-BN",
"name": "Bistrița-Năsăud"
},
{
"code": "RO-BR",
"name": "Brăila"
},
{
"code": "RO-BT",
"name": "Botoșani"
},
{
"code": "RO-BV",
"name": "Brașov"
},
{
"code": "RO-BZ",
"name": "Buzău"
},
{
"code": "RO-CJ",
"name": "Cluj"
},
{
"code": "RO-CL",
"name": "Călărași"
},
{
"code": "RO-CS",
"name": "Caraș-Severin"
},
{
"code": "RO-CT",
"name": "Constanța"
},
{
"code": "RO-CV",
"name": "Covasna"
},
{
"code": "RO-DB",
"name": "Dâmbovița"
},
{
"code": "RO-DJ",
"name": "Dolj"
},
{
"code": "RO-GJ",
"name": "Gorj"
},
{
"code": "RO-GL",
"name": "Galați"
},
{
"code": "RO-GR",
"name": "Giurgiu"
},
{
"code": "RO-HD",
"name": "Hunedoara"
},
{
"code": "RO-HR",
"name": "Harghita"
},
{
"code": "RO-IF",
"name": "Ilfov"
},
{
"code": "RO-IL",
"name": "Ialomița"
},
{
"code": "RO-IS",
"name": "Iași"
},
{
"code": "RO-MH",
"name": "Mehedinți"
},
{
"code": "RO-MM",
"name": "Maramureș"
},
{
"code": "RO-MS",
"name": "Mureș"
},
{
"code": "RO-NT",
"name": "Neamț"
},
{
"code": "RO-OT",
"name": "Olt"
},
{
"code": "RO-PH",
"name": "Prahova"
},
{
"code": "RO-SB",
"name": "Sibiu"
},
{
"code": "RO-SJ",
"name": "Sălaj"
},
{
"code": "RO-SM",
"name": "Satu Mare"
},
{
"code": "RO-SV",
"name": "Suceava"
},
{
"code": "RO-TL",
"name": "Tulcea"
},
{
"code": "RO-TM",
"name": "Timiș"
},
{
"code": "RO-TR",
"name": "Teleorman"
},
{
"code": "RO-VL",
"name": "Vâlcea"
},
{
"code": "RO-VN",
"name": "Vrancea"
},
{
"code": "RO-VS",
"name": "Vaslui"
},
{
"code": "RS-00",
"name": "Beograd"
},
{
"code": "RS-01",
"name": "Severnobački okrug"
},
{
"code": "RS-02",
"name": "Srednjebanatski okrug"
},
{
"code": "RS-03",
"name": "Severnobanatski okrug"
},
{
"code": "RS-04",
"name": "Južnobanatski okrug"
},
{
"code": "RS-05",
"name": "Zapadnobački okrug"
},
{
"code": "RS-06",
"name": "Južnobački okrug"
},
{
"code": "RS-07",
"name": "Sremski okrug"
},
{
"code": "RS-08",
"name": "Mačvanski okrug"
},
{
"code": "RS-09",
"name": "Kolubarski okrug"
},
{
"code": "RS-10",
"name": "Podunavski okrug"
},
{
"code": "RS-11",
"name": "Braničevski okrug"
},
{
"code": "RS-12",
"name": "Šumadijski okrug"
},
{
"code": "RS-13",
"name": "Pomoravski okrug"
},
{
"code": "RS-14",
"name": "Borski okrug"
},
{
"code": "RS-15",
"name": "Zaječarski okrug"
},
{
"code": "RS-16",
"name": "Zlatiborski okrug"
},
{
"code": "RS-17",
"name": "Moravički okrug"
},
{
"code": "RS-18",
"name": "Raški okrug"
},
{
"code": "RS-19",
"name": "Rasinski okrug"
},
{
"code": "RS-20",
"name": "Nišavski okrug"
},
{
"code": "RS-21",
"name": "Toplički okrug"
},
{
"code": "RS-22",
"name": "Pirotski okrug"
},
{
"code": "RS-23",
"name": "Jablanički okrug"
},
{
"code": "RS-24",
"name": "Pčinjski okrug"
},
{
"code": "RS-25",
"name": "Kosovski okrug"
},
{
"code": "RS-26",
"name": "Pećki okrug"
},
{
"code": "RS-27",
"name": "Prizrenski okrug"
},
{
"code": "RS-28",
"name": "Kosovsko-Mitrovački okrug"
},
{
"code": "RS-29",
"name": "Kosovsko-Pomoravski okrug"
},
{
"code": "RS-KM",
"name": "Kosovo-Metohija"
},
{
"code": "RS-VO",
"name": "Vojvodina"
},
{
"code": "RU-AD",
"name": "Adygeya, Respublika"
},
{
"code": "RU-AL",
"name": "Altay, Respublika"
},
{
"code": "RU-ALT",
"name": "Altayskiy kray"
},
{
"code": "RU-AMU",
"name": "Amurskaya oblast'"
},
{
"code": "RU-ARK",
"name": "Arkhangel'skaya oblast'"
},
{
"code": "RU-AST",
"name": "Astrakhanskaya oblast'"
},
{
"code": "RU-BA",
"name": "Bashkortostan, Respublika"
},
{
"code": "RU-BEL",
"name": "Belgorodskaya oblast'"
},
{
"code": "RU-BRY",
"name": "Bryanskaya oblast'"
},
{
"code": "RU-BU",
"name": "Buryatiya, Respublika"
},
{
"code": "RU-CE",
"name": "Chechenskaya Respublika"
},
{
"code": "RU-CHE",
"name": "Chelyabinskaya oblast'"
},
{
"code": "RU-CHU",
"name": "Chukotskiy avtonomnyy okrug"
},
{
"code": "RU-CU",
"name": "Chuvashskaya Respublika"
},
{
"code": "RU-DA",
"name": "Dagestan, Respublika"
},
{
"code": "RU-IN",
"name": "Ingushetiya, Respublika"
},
{
"code": "RU-IRK",
"name": "Irkutskaya oblast'"
},
{
"code": "RU-IVA",
"name": "Ivanovskaya oblast'"
},
{
"code": "RU-KAM",
"name": "Kamchatskiy kray"
},
{
"code": "RU-KB",
"name": "Kabardino-Balkarskaya Respublika"
},
{
"code": "RU-KC",
"name": "Karachayevo-Cherkesskaya Respublika"
},
{
"code": "RU-KDA",
"name": "Krasnodarskiy kray"
},
{
"code": "RU-KEM",
"name": "Kemerovskaya oblast'"
},
{
"code": "RU-KGD",
"name": "Kaliningradskaya oblast'"
},
{
"code": "RU-KGN",
"name": "Kurganskaya oblast'"
},
{
"code": "RU-KHA",
"name": "Khabarovskiy kray"
},
{
"code": "RU-KHM",
"name": "Khanty-Mansiyskiy avtonomnyy okrug"
},
{
"code": "RU-KIR",
"name": "Kirovskaya oblast'"
},
{
"code": "RU-KK",
"name": "Khakasiya, Respublika"
},
{
"code": "RU-KL",
"name": "Kalmykiya, Respublika"
},
{
"code": "RU-KLU",
"name": "Kaluzhskaya oblast'"
},
{
"code": "RU-KO",
"name": "Komi, Respublika"
},
{
"code": "RU-KOS",
"name": "Kostromskaya oblast'"
},
{
"code": "RU-KR",
"name": "Kareliya, Respublika"
},
{
"code": "RU-KRS",
"name": "Kurskaya oblast'"
},
{
"code": "RU-KYA",
"name": "Krasnoyarskiy kray"
},
{
"code": "RU-LEN",
"name": "Leningradskaya oblast'"
},
{
"code": "RU-LIP",
"name": "Lipetskaya oblast'"
},
{
"code": "RU-MAG",
"name": "Magadanskaya oblast'"
},
{
"code": "RU-ME",
"name": "Mariy El, Respublika"
},
{
"code": "RU-MO",
"name": "Mordoviya, Respublika"
},
{
"code": "RU-MOS",
"name": "Moskovskaya oblast'"
},
{
"code": "RU-MOW",
"name": "Moskva"
},
{
"code": "RU-MUR",
"name": "Murmanskaya oblast'"
},
{
"code": "RU-NEN",
"name": "Nenetskiy avtonomnyy okrug"
},
{
"code": "RU-NGR",
"name": "Novgorodskaya oblast'"
},
{
"code": "RU-NIZ",
"name": "Nizhegorodskaya oblast'"
},
{
"code": "RU-NVS",
"name": "Novosibirskaya oblast'"
},
{
"code": "RU-OMS",
"name": "Omskaya oblast'"
},
{
"code": "RU-ORE",
"name": "Orenburgskaya oblast'"
},
{
"code": "RU-ORL",
"name": "Orlovskaya oblast'"
},
{
"code": "RU-PER",
"name": "Permskiy kray"
},
{
"code": "RU-PNZ",
"name": "Penzenskaya oblast'"
},
{
"code": "RU-PRI",
"name": "Primorskiy kray"
},
{
"code": "RU-PSK",
"name": "Pskovskaya oblast'"
},
{
"code": "RU-ROS",
"name": "Rostovskaya oblast'"
},
{
"code": "RU-RYA",
"name": "Ryazanskaya oblast'"
},
{
"code": "RU-SA",
"name": "Saha, Respublika"
},
{
"code": "RU-SAK",
"name": "Sakhalinskaya oblast'"
},
{
"code": "RU-SAM",
"name": "Samarskaya oblast'"
},
{
"code": "RU-SAR",
"name": "Saratovskaya oblast'"
},
{
"code": "RU-SE",
"name": "Severnaya Osetiya, Respublika"
},
{
"code": "RU-SMO",
"name": "Smolenskaya oblast'"
},
{
"code": "RU-SPE",
"name": "Sankt-Peterburg"
},
{
"code": "RU-STA",
"name": "Stavropol'skiy kray"
},
{
"code": "RU-SVE",
"name": "Sverdlovskaya oblast'"
},
{
"code": "RU-TA",
"name": "Tatarstan, Respublika"
},
{
"code": "RU-TAM",
"name": "Tambovskaya oblast'"
},
{
"code": "RU-TOM",
"name": "Tomskaya oblast'"
},
{
"code": "RU-TUL",
"name": "Tul'skaya oblast'"
},
{
"code": "RU-TVE",
"name": "Tverskaya oblast'"
},
{
"code": "RU-TY",
"name": "Tyva, Respublika"
},
{
"code": "RU-TYU",
"name": "Tyumenskaya oblast'"
},
{
"code": "RU-UD",
"name": "Udmurtskaya Respublika"
},
{
"code": "RU-ULY",
"name": "Ul'yanovskaya oblast'"
},
{
"code": "RU-VGG",
"name": "Volgogradskaya oblast'"
},
{
"code": "RU-VLA",
"name": "Vladimirskaya oblast'"
},
{
"code": "RU-VLG",
"name": "Vologodskaya oblast'"
},
{
"code": "RU-VOR",
"name": "Voronezhskaya oblast'"
},
{
"code": "RU-YAN",
"name": "Yamalo-Nenetskiy avtonomnyy okrug"
},
{
"code": "RU-YAR",
"name": "Yaroslavskaya oblast'"
},
{
"code": "RU-YEV",
"name": "Yevreyskaya avtonomnaya oblast'"
},
{
"code": "RU-ZAB",
"name": "Zabaykal'skiy kray"
},
{
"code": "RW-01",
"name": "City of Kigali"
},
{
"code": "RW-02",
"name": "Eastern"
},
{
"code": "RW-03",
"name": "Northern"
},
{
"code": "RW-04",
"name": "Western"
},
{
"code": "RW-05",
"name": "Southern"
},
{
"code": "SA-01",
"name": "Ar Riyāḑ"
},
{
"code": "SA-02",
"name": "Makkah al Mukarramah"
},
{
"code": "SA-03",
"name": "Al Madīnah al Munawwarah"
},
{
"code": "SA-04",
"name": "Ash Sharqīyah"
},
{
"code": "SA-05",
"name": "Al Qaşīm"
},
{
"code": "SA-06",
"name": "Ḩā'il"
},
{
"code": "SA-07",
"name": "Tabūk"
},
{
"code": "SA-08",
"name": "Al Ḩudūd ash Shamālīyah"
},
{
"code": "SA-09",
"name": "Jāzān"
},
{
"code": "SA-10",
"name": "Najrān"
},
{
"code": "SA-11",
"name": "Al Bāḩah"
},
{
"code": "SA-12",
"name": "Al Jawf"
},
{
"code": "SA-14",
"name": "'Asīr"
},
{
"code": "SB-CE",
"name": "Central"
},
{
"code": "SB-CH",
"name": "Choiseul"
},
{
"code": "SB-CT",
"name": "Capital Territory (Honiara)"
},
{
"code": "SB-GU",
"name": "Guadalcanal"
},
{
"code": "SB-IS",
"name": "Isabel"
},
{
"code": "SB-MK",
"name": "Makira-Ulawa"
},
{
"code": "SB-ML",
"name": "Malaita"
},
{
"code": "SB-RB",
"name": "Rennell and Bellona"
},
{
"code": "SB-TE",
"name": "Temotu"
},
{
"code": "SB-WE",
"name": "Western"
},
{
"code": "SC-01",
"name": "Anse aux Pins"
},
{
"code": "SC-02",
"name": "Anse Boileau"
},
{
"code": "SC-03",
"name": "Anse Etoile"
},
{
"code": "SC-04",
"name": "Au Cap"
},
{
"code": "SC-05",
"name": "Anse Royale"
},
{
"code": "SC-06",
"name": "Baie Lazare"
},
{
"code": "SC-07",
"name": "Baie Sainte Anne"
},
{
"code": "SC-08",
"name": "Beau Vallon"
},
{
"code": "SC-09",
"name": "Bel Air"
},
{
"code": "SC-10",
"name": "Bel Ombre"
},
{
"code": "SC-11",
"name": "Cascade"
},
{
"code": "SC-12",
"name": "Glacis"
},
{
"code": "SC-13",
"name": "Grand Anse Mahe"
},
{
"code": "SC-14",
"name": "Grand Anse Praslin"
},
{
"code": "SC-15",
"name": "La Digue"
},
{
"code": "SC-16",
"name": "English River"
},
{
"code": "SC-17",
"name": "Mont Buxton"
},
{
"code": "SC-18",
"name": "Mont Fleuri"
},
{
"code": "SC-19",
"name": "Plaisance"
},
{
"code": "SC-20",
"name": "Pointe Larue"
},
{
"code": "SC-21",
"name": "Port Glaud"
},
{
"code": "SC-22",
"name": "Saint Louis"
},
{
"code": "SC-23",
"name": "Takamaka"
},
{
"code": "SC-24",
"name": "Les Mamelles"
},
{
"code": "SC-25",
"name": "Roche Caiman"
},
{
"code": "SC-26",
"name": "Ile Perseverance I"
},
{
"code": "SC-27",
"name": "Ile Perseverance II"
},
{
"code": "SD-DC",
"name": "Central Darfur"
},
{
"code": "SD-DE",
"name": "East Darfur"
},
{
"code": "SD-DN",
"name": "North Darfur"
},
{
"code": "SD-DS",
"name": "South Darfur"
},
{
"code": "SD-DW",
"name": "West Darfur"
},
{
"code": "SD-GD",
"name": "Gedaref"
},
{
"code": "SD-GK",
"name": "West Kordofan"
},
{
"code": "SD-GZ",
"name": "Gezira"
},
{
"code": "SD-KA",
"name": "Kassala"
},
{
"code": "SD-KH",
"name": "Khartoum"
},
{
"code": "SD-KN",
"name": "North Kordofan"
},
{
"code": "SD-KS",
"name": "South Kordofan"
},
{
"code": "SD-NB",
"name": "Blue Nile"
},
{
"code": "SD-NO",
"name": "Northern"
},
{
"code": "SD-NR",
"name": "River Nile"
},
{
"code": "SD-NW",
"name": "White Nile"
},
{
"code": "SD-RS",
"name": "Red Sea"
},
{
"code": "SD-SI",
"name": "Sennar"
},
{
"code": "SE-AB",
"name": "Stockholms län [SE-01]"
},
{
"code": "SE-AC",
"name": "Västerbottens län [SE-24]"
},
{
"code": "SE-BD",
"name": "Norrbottens län [SE-25]"
},
{
"code": "SE-C",
"name": "Uppsala län [SE-03]"
},
{
"code": "SE-D",
"name": "Södermanlands län [SE-04]"
},
{
"code": "SE-E",
"name": "Östergötlands län [SE-05]"
},
{
"code": "SE-F",
"name": "Jönköpings län [SE-06]"
},
{
"code": "SE-G",
"name": "Kronobergs län [SE-07]"
},
{
"code": "SE-H",
"name": "Kalmar län [SE-08]"
},
{
"code": "SE-I",
"name": "Gotlands län [SE-09]"
},
{
"code": "SE-K",
"name": "Blekinge län [SE-10]"
},
{
"code": "SE-M",
"name": "Skåne län [SE-12]"
},
{
"code": "SE-N",
"name": "Hallands län [SE-13]"
},
{
"code": "SE-O",
"name": "Västra Götalands län [SE-14]"
},
{
"code": "SE-S",
"name": "Värmlands län [SE-17]"
},
{
"code": "SE-T",
"name": "Örebro län [SE-18]"
},
{
"code": "SE-U",
"name": "Västmanlands län [SE-19]"
},
{
"code": "SE-W",
"name": "Dalarnas län [SE-20]"
},
{
"code": "SE-X",
"name": "Gävleborgs län [SE-21]"
},
{
"code": "SE-Y",
"name": "Västernorrlands län [SE-22]"
},
{
"code": "SE-Z",
"name": "Jämtlands län [SE-23]"
},
{
"code": "SG-01",
"name": "Central Singapore"
},
{
"code": "SG-02",
"name": "North East"
},
{
"code": "SG-03",
"name": "North West"
},
{
"code": "SG-04",
"name": "South East"
},
{
"code": "SG-05",
"name": "South West"
},
{
"code": "SH-AC",
"name": "Ascension"
},
{
"code": "SH-HL",
"name": "Saint Helena"
},
{
"code": "SH-TA",
"name": "Tristan da Cunha"
},
{
"code": "SI-001",
"name": "Ajdovščina"
},
{
"code": "SI-002",
"name": "Beltinci"
},
{
"code": "SI-003",
"name": "Bled"
},
{
"code": "SI-004",
"name": "Bohinj"
},
{
"code": "SI-005",
"name": "Borovnica"
},
{
"code": "SI-006",
"name": "Bovec"
},
{
"code": "SI-007",
"name": "Brda"
},
{
"code": "SI-008",
"name": "Brezovica"
},
{
"code": "SI-009",
"name": "Brežice"
},
{
"code": "SI-010",
"name": "Tišina"
},
{
"code": "SI-011",
"name": "Celje"
},
{
"code": "SI-012",
"name": "Cerklje na Gorenjskem"
},
{
"code": "SI-013",
"name": "Cerknica"
},
{
"code": "SI-014",
"name": "Cerkno"
},
{
"code": "SI-015",
"name": "Črenšovci"
},
{
"code": "SI-016",
"name": "Črna na Koroškem"
},
{
"code": "SI-017",
"name": "Črnomelj"
},
{
"code": "SI-018",
"name": "Destrnik"
},
{
"code": "SI-019",
"name": "Divača"
},
{
"code": "SI-020",
"name": "Dobrepolje"
},
{
"code": "SI-021",
"name": "Dobrova-Polhov Gradec"
},
{
"code": "SI-022",
"name": "Dol pri Ljubljani"
},
{
"code": "SI-023",
"name": "Domžale"
},
{
"code": "SI-024",
"name": "Dornava"
},
{
"code": "SI-025",
"name": "Dravograd"
},
{
"code": "SI-026",
"name": "Duplek"
},
{
"code": "SI-027",
"name": "Gorenja vas-Poljane"
},
{
"code": "SI-028",
"name": "Gorišnica"
},
{
"code": "SI-029",
"name": "Gornja Radgona"
},
{
"code": "SI-030",
"name": "Gornji Grad"
},
{
"code": "SI-031",
"name": "Gornji Petrovci"
},
{
"code": "SI-032",
"name": "Grosuplje"
},
{
"code": "SI-033",
"name": "Šalovci"
},
{
"code": "SI-034",
"name": "Hrastnik"
},
{
"code": "SI-035",
"name": "Hrpelje-Kozina"
},
{
"code": "SI-036",
"name": "Idrija"
},
{
"code": "SI-037",
"name": "Ig"
},
{
"code": "SI-038",
"name": "Ilirska Bistrica"
},
{
"code": "SI-039",
"name": "Ivančna Gorica"
},
{
"code": "SI-040",
"name": "Izola"
},
{
"code": "SI-041",
"name": "Jesenice"
},
{
"code": "SI-042",
"name": "Juršinci"
},
{
"code": "SI-043",
"name": "Kamnik"
},
{
"code": "SI-044",
"name": "Kanal ob Soči"
},
{
"code": "SI-045",
"name": "Kidričevo"
},
{
"code": "SI-046",
"name": "Kobarid"
},
{
"code": "SI-047",
"name": "Kobilje"
},
{
"code": "SI-048",
"name": "Kočevje"
},
{
"code": "SI-049",
"name": "Komen"
},
{
"code": "SI-050",
"name": "Koper"
},
{
"code": "SI-051",
"name": "Kozje"
},
{
"code": "SI-052",
"name": "Kranj"
},
{
"code": "SI-053",
"name": "Kranjska Gora"
},
{
"code": "SI-054",
"name": "Krško"
},
{
"code": "SI-055",
"name": "Kungota"
},
{
"code": "SI-056",
"name": "Kuzma"
},
{
"code": "SI-057",
"name": "Laško"
},
{
"code": "SI-058",
"name": "Lenart"
},
{
"code": "SI-059",
"name": "Lendava"
},
{
"code": "SI-060",
"name": "Litija"
},
{
"code": "SI-061",
"name": "Ljubljana"
},
{
"code": "SI-062",
"name": "Ljubno"
},
{
"code": "SI-063",
"name": "Ljutomer"
},
{
"code": "SI-064",
"name": "Logatec"
},
{
"code": "SI-065",
"name": "Loška dolina"
},
{
"code": "SI-066",
"name": "Loški Potok"
},
{
"code": "SI-067",
"name": "Luče"
},
{
"code": "SI-068",
"name": "Lukovica"
},
{
"code": "SI-069",
"name": "Majšperk"
},
{
"code": "SI-070",
"name": "Maribor"
},
{
"code": "SI-071",
"name": "Medvode"
},
{
"code": "SI-072",
"name": "Mengeš"
},
{
"code": "SI-073",
"name": "Metlika"
},
{
"code": "SI-074",
"name": "Mežica"
},
{
"code": "SI-075",
"name": "Miren-Kostanjevica"
},
{
"code": "SI-076",
"name": "Mislinja"
},
{
"code": "SI-077",
"name": "Moravče"
},
{
"code": "SI-078",
"name": "Moravske Toplice"
},
{
"code": "SI-079",
"name": "Mozirje"
},
{
"code": "SI-080",
"name": "Murska Sobota"
},
{
"code": "SI-081",
"name": "Muta"
},
{
"code": "SI-082",
"name": "Naklo"
},
{
"code": "SI-083",
"name": "Nazarje"
},
{
"code": "SI-084",
"name": "Nova Gorica"
},
{
"code": "SI-085",
"name": "Novo Mesto"
},
{
"code": "SI-086",
"name": "Odranci"
},
{
"code": "SI-087",
"name": "Ormož"
},
{
"code": "SI-088",
"name": "Osilnica"
},
{
"code": "SI-089",
"name": "Pesnica"
},
{
"code": "SI-090",
"name": "Piran"
},
{
"code": "SI-091",
"name": "Pivka"
},
{
"code": "SI-092",
"name": "Podčetrtek"
},
{
"code": "SI-093",
"name": "Podvelka"
},
{
"code": "SI-094",
"name": "Postojna"
},
{
"code": "SI-095",
"name": "Preddvor"
},
{
"code": "SI-096",
"name": "Ptuj"
},
{
"code": "SI-097",
"name": "Puconci"
},
{
"code": "SI-098",
"name": "Rače-Fram"
},
{
"code": "SI-099",
"name": "Radeče"
},
{
"code": "SI-100",
"name": "Radenci"
},
{
"code": "SI-101",
"name": "Radlje ob Dravi"
},
{
"code": "SI-102",
"name": "Radovljica"
},
{
"code": "SI-103",
"name": "Ravne na Koroškem"
},
{
"code": "SI-104",
"name": "Ribnica"
},
{
"code": "SI-105",
"name": "Rogašovci"
},
{
"code": "SI-106",
"name": "Rogaška Slatina"
},
{
"code": "SI-107",
"name": "Rogatec"
},
{
"code": "SI-108",
"name": "Ruše"
},
{
"code": "SI-109",
"name": "Semič"
},
{
"code": "SI-110",
"name": "Sevnica"
},
{
"code": "SI-111",
"name": "Sežana"
},
{
"code": "SI-112",
"name": "Slovenj Gradec"
},
{
"code": "SI-113",
"name": "Slovenska Bistrica"
},
{
"code": "SI-114",
"name": "Slovenske Konjice"
},
{
"code": "SI-115",
"name": "Starše"
},
{
"code": "SI-116",
"name": "Sveti Jurij ob Ščavnici"
},
{
"code": "SI-117",
"name": "Šenčur"
},
{
"code": "SI-118",
"name": "Šentilj"
},
{
"code": "SI-119",
"name": "Šentjernej"
},
{
"code": "SI-120",
"name": "Šentjur"
},
{
"code": "SI-121",
"name": "Škocjan"
},
{
"code": "SI-122",
"name": "Škofja Loka"
},
{
"code": "SI-123",
"name": "Škofljica"
},
{
"code": "SI-124",
"name": "Šmarje pri Jelšah"
},
{
"code": "SI-125",
"name": "Šmartno ob Paki"
},
{
"code": "SI-126",
"name": "Šoštanj"
},
{
"code": "SI-127",
"name": "Štore"
},
{
"code": "SI-128",
"name": "Tolmin"
},
{
"code": "SI-129",
"name": "Trbovlje"
},
{
"code": "SI-130",
"name": "Trebnje"
},
{
"code": "SI-131",
"name": "Tržič"
},
{
"code": "SI-132",
"name": "Turnišče"
},
{
"code": "SI-133",
"name": "Velenje"
},
{
"code": "SI-134",
"name": "Velike Lašče"
},
{
"code": "SI-135",
"name": "Videm"
},
{
"code": "SI-136",
"name": "Vipava"
},
{
"code": "SI-137",
"name": "Vitanje"
},
{
"code": "SI-138",
"name": "Vodice"
},
{
"code": "SI-139",
"name": "Vojnik"
},
{
"code": "SI-140",
"name": "Vrhnika"
},
{
"code": "SI-141",
"name": "Vuzenica"
},
{
"code": "SI-142",
"name": "Zagorje ob Savi"
},
{
"code": "SI-143",
"name": "Zavrč"
},
{
"code": "SI-144",
"name": "Zreče"
},
{
"code": "SI-146",
"name": "Železniki"
},
{
"code": "SI-147",
"name": "Žiri"
},
{
"code": "SI-148",
"name": "Benedikt"
},
{
"code": "SI-149",
"name": "Bistrica ob Sotli"
},
{
"code": "SI-150",
"name": "Bloke"
},
{
"code": "SI-151",
"name": "Braslovče"
},
{
"code": "SI-152",
"name": "Cankova"
},
{
"code": "SI-153",
"name": "Cerkvenjak"
},
{
"code": "SI-154",
"name": "Dobje"
},
{
"code": "SI-155",
"name": "Dobrna"
},
{
"code": "SI-156",
"name": "Dobrovnik"
},
{
"code": "SI-157",
"name": "Dolenjske Toplice"
},
{
"code": "SI-158",
"name": "Grad"
},
{
"code": "SI-159",
"name": "Hajdina"
},
{
"code": "SI-160",
"name": "Hoče-Slivnica"
},
{
"code": "SI-161",
"name": "Hodoš"
},
{
"code": "SI-162",
"name": "Horjul"
},
{
"code": "SI-163",
"name": "Jezersko"
},
{
"code": "SI-164",
"name": "Komenda"
},
{
"code": "SI-165",
"name": "Kostel"
},
{
"code": "SI-166",
"name": "Križevci"
},
{
"code": "SI-167",
"name": "Lovrenc na Pohorju"
},
{
"code": "SI-168",
"name": "Markovci"
},
{
"code": "SI-169",
"name": "Miklavž na Dravskem polju"
},
{
"code": "SI-170",
"name": "Mirna Peč"
},
{
"code": "SI-171",
"name": "Oplotnica"
},
{
"code": "SI-172",
"name": "Podlehnik"
},
{
"code": "SI-173",
"name": "Polzela"
},
{
"code": "SI-174",
"name": "Prebold"
},
{
"code": "SI-175",
"name": "Prevalje"
},
{
"code": "SI-176",
"name": "Razkrižje"
},
{
"code": "SI-177",
"name": "Ribnica na Pohorju"
},
{
"code": "SI-178",
"name": "Selnica ob Dravi"
},
{
"code": "SI-179",
"name": "Sodražica"
},
{
"code": "SI-180",
"name": "Solčava"
},
{
"code": "SI-181",
"name": "Sveta Ana"
},
{
"code": "SI-182",
"name": "Sveti Andraž v Slovenskih goricah"
},
{
"code": "SI-183",
"name": "Šempeter-Vrtojba"
},
{
"code": "SI-184",
"name": "Tabor"
},
{
"code": "SI-185",
"name": "Trnovska Vas"
},
{
"code": "SI-186",
"name": "Trzin"
},
{
"code": "SI-187",
"name": "Velika Polana"
},
{
"code": "SI-188",
"name": "Veržej"
},
{
"code": "SI-189",
"name": "Vransko"
},
{
"code": "SI-190",
"name": "Žalec"
},
{
"code": "SI-191",
"name": "Žetale"
},
{
"code": "SI-192",
"name": "Žirovnica"
},
{
"code": "SI-193",
"name": "Žužemberk"
},
{
"code": "SI-194",
"name": "Šmartno pri Litiji"
},
{
"code": "SI-195",
"name": "Apače"
},
{
"code": "SI-196",
"name": "Cirkulane"
},
{
"code": "SI-197",
"name": "Kostanjevica na Krki"
},
{
"code": "SI-198",
"name": "Makole"
},
{
"code": "SI-199",
"name": "Mokronog-Trebelno"
},
{
"code": "SI-200",
"name": "Poljčane"
},
{
"code": "SI-201",
"name": "Renče-Vogrsko"
},
{
"code": "SI-202",
"name": "Središče ob Dravi"
},
{
"code": "SI-203",
"name": "Straža"
},
{
"code": "SI-204",
"name": "Sveta Trojica v Slovenskih goricah"
},
{
"code": "SI-205",
"name": "Sveti Tomaž"
},
{
"code": "SI-206",
"name": "Šmarješke Toplice"
},
{
"code": "SI-207",
"name": "Gorje"
},
{
"code": "SI-208",
"name": "Log-Dragomer"
},
{
"code": "SI-209",
"name": "Rečica ob Savinji"
},
{
"code": "SI-210",
"name": "Sveti Jurij v Slovenskih goricah"
},
{
"code": "SI-211",
"name": "Šentrupert"
},
{
"code": "SI-212",
"name": "Mirna"
},
{
"code": "SI-213",
"name": "Ankaran"
},
{
"code": "SK-BC",
"name": "Banskobystrický kraj"
},
{
"code": "SK-BL",
"name": "Bratislavský kraj"
},
{
"code": "SK-KI",
"name": "Košický kraj"
},
{
"code": "SK-NI",
"name": "Nitriansky kraj"
},
{
"code": "SK-PV",
"name": "Prešovský kraj"
},
{
"code": "SK-TA",
"name": "Trnavský kraj"
},
{
"code": "SK-TC",
"name": "Trenčiansky kraj"
},
{
"code": "SK-ZI",
"name": "Žilinský kraj"
},
{
"code": "SL-E",
"name": "Eastern"
},
{
"code": "SL-N",
"name": "Northern"
},
{
"code": "SL-NW",
"name": "North Western"
},
{
"code": "SL-S",
"name": "Southern"
},
{
"code": "SL-W",
"name": "Western Area (Freetown)"
},
{
"code": "SM-01",
"name": "Acquaviva"
},
{
"code": "SM-02",
"name": "Chiesanuova"
},
{
"code": "SM-03",
"name": "Domagnano"
},
{
"code": "SM-04",
"name": "Faetano"
},
{
"code": "SM-05",
"name": "Fiorentino"
},
{
"code": "SM-06",
"name": "Borgo Maggiore"
},
{
"code": "SM-07",
"name": "Città di San Marino"
},
{
"code": "SM-08",
"name": "Montegiardino"
},
{
"code": "SM-09",
"name": "Serravalle"
},
{
"code": "SN-DB",
"name": "Diourbel"
},
{
"code": "SN-DK",
"name": "Dakar"
},
{
"code": "SN-FK",
"name": "Fatick"
},
{
"code": "SN-KA",
"name": "Kaffrine"
},
{
"code": "SN-KD",
"name": "Kolda"
},
{
"code": "SN-KE",
"name": "Kédougou"
},
{
"code": "SN-KL",
"name": "Kaolack"
},
{
"code": "SN-LG",
"name": "Louga"
},
{
"code": "SN-MT",
"name": "Matam"
},
{
"code": "SN-SE",
"name": "Sédhiou"
},
{
"code": "SN-SL",
"name": "Saint-Louis"
},
{
"code": "SN-TC",
"name": "Tambacounda"
},
{
"code": "SN-TH",
"name": "Thiès"
},
{
"code": "SN-ZG",
"name": "Ziguinchor"
},
{
"code": "SO-AW",
"name": "Awdal"
},
{
"code": "SO-BK",
"name": "Bakool"
},
{
"code": "SO-BN",
"name": "Banaadir"
},
{
"code": "SO-BR",
"name": "Bari"
},
{
"code": "SO-BY",
"name": "Bay"
},
{
"code": "SO-GA",
"name": "Galguduud"
},
{
"code": "SO-GE",
"name": "Gedo"
},
{
"code": "SO-HI",
"name": "Hiiraan"
},
{
"code": "SO-JD",
"name": "Jubbada Dhexe"
},
{
"code": "SO-JH",
"name": "Jubbada Hoose"
},
{
"code": "SO-MU",
"name": "Mudug"
},
{
"code": "SO-NU",
"name": "Nugaal"
},
{
"code": "SO-SA",
"name": "Sanaag"
},
{
"code": "SO-SD",
"name": "Shabeellaha Dhexe"
},
{
"code": "SO-SH",
"name": "Shabeellaha Hoose"
},
{
"code": "SO-SO",
"name": "Sool"
},
{
"code": "SO-TO",
"name": "Togdheer"
},
{
"code": "SO-WO",
"name": "Woqooyi Galbeed"
},
{
"code": "SR-BR",
"name": "Brokopondo"
},
{
"code": "SR-CM",
"name": "Commewijne"
},
{
"code": "SR-CR",
"name": "Coronie"
},
{
"code": "SR-MA",
"name": "Marowijne"
},
{
"code": "SR-NI",
"name": "Nickerie"
},
{
"code": "SR-PM",
"name": "Paramaribo"
},
{
"code": "SR-PR",
"name": "Para"
},
{
"code": "SR-SA",
"name": "Saramacca"
},
{
"code": "SR-SI",
"name": "Sipaliwini"
},
{
"code": "SR-WA",
"name": "Wanica"
},
{
"code": "SS-BN",
"name": "Northern Bahr el Ghazal"
},
{
"code": "SS-BW",
"name": "Western Bahr el Ghazal"
},
{
"code": "SS-EC",
"name": "Central Equatoria"
},
{
"code": "SS-EE",
"name": "Eastern Equatoria"
},
{
"code": "SS-EW",
"name": "Western Equatoria"
},
{
"code": "SS-JG",
"name": "Jonglei"
},
{
"code": "SS-LK",
"name": "Lakes"
},
{
"code": "SS-NU",
"name": "Upper Nile"
},
{
"code": "SS-UY",
"name": "Unity"
},
{
"code": "SS-WR",
"name": "Warrap"
},
{
"code": "ST-01",
"name": "Água Grande"
},
{
"code": "ST-02",
"name": "Cantagalo"
},
{
"code": "ST-03",
"name": "Caué"
},
{
"code": "ST-04",
"name": "Lembá"
},
{
"code": "ST-05",
"name": "Lobata"
},
{
"code": "ST-06",
"name": "Mé-Zóchi"
},
{
"code": "ST-P",
"name": "Príncipe"
},
{
"code": "SV-AH",
"name": "Ahuachapán"
},
{
"code": "SV-CA",
"name": "Cabañas"
},
{
"code": "SV-CH",
"name": "Chalatenango"
},
{
"code": "SV-CU",
"name": "Cuscatlán"
},
{
"code": "SV-LI",
"name": "La Libertad"
},
{
"code": "SV-MO",
"name": "Morazán"
},
{
"code": "SV-PA",
"name": "La Paz"
},
{
"code": "SV-SA",
"name": "Santa Ana"
},
{
"code": "SV-SM",
"name": "San Miguel"
},
{
"code": "SV-SO",
"name": "Sonsonate"
},
{
"code": "SV-SS",
"name": "San Salvador"
},
{
"code": "SV-SV",
"name": "San Vicente"
},
{
"code": "SV-UN",
"name": "La Unión"
},
{
"code": "SV-US",
"name": "Usulután"
},
{
"code": "SY-DI",
"name": "Dimashq"
},
{
"code": "SY-DR",
"name": "Dar'ā"
},
{
"code": "SY-DY",
"name": "Dayr az Zawr"
},
{
"code": "SY-HA",
"name": "Al Ḩasakah"
},
{
"code": "SY-HI",
"name": "Ḩimş"
},
{
"code": "SY-HL",
"name": "Ḩalab"
},
{
"code": "SY-HM",
"name": "Ḩamāh"
},
{
"code": "SY-ID",
"name": "Idlib"
},
{
"code": "SY-LA",
"name": "Al Lādhiqīyah"
},
{
"code": "SY-QU",
"name": "Al Qunayţirah"
},
{
"code": "SY-RA",
"name": "Ar Raqqah"
},
{
"code": "SY-RD",
"name": "Rīf Dimashq"
},
{
"code": "SY-SU",
"name": "As Suwaydā'"
},
{
"code": "SY-TA",
"name": "Ţarţūs"
},
{
"code": "SZ-HH",
"name": "Hhohho"
},
{
"code": "SZ-LU",
"name": "Lubombo"
},
{
"code": "SZ-MA",
"name": "Manzini"
},
{
"code": "SZ-SH",
"name": "Shiselweni"
},
{
"code": "TD-BA",
"name": "Batha"
},
{
"code": "TD-BG",
"name": "Bahr el Ghazal"
},
{
"code": "TD-BO",
"name": "Borkou"
},
{
"code": "TD-CB",
"name": "Chari-Baguirmi"
},
{
"code": "TD-EE",
"name": "Ennedi-Est"
},
{
"code": "TD-EO",
"name": "Ennedi-Ouest"
},
{
"code": "TD-GR",
"name": "Guéra"
},
{
"code": "TD-HL",
"name": "Hadjer Lamis"
},
{
"code": "TD-KA",
"name": "Kanem"
},
{
"code": "TD-LC",
"name": "Lac"
},
{
"code": "TD-LO",
"name": "Logone-Occidental"
},
{
"code": "TD-LR",
"name": "Logone-Oriental"
},
{
"code": "TD-MA",
"name": "Mandoul"
},
{
"code": "TD-MC",
"name": "Moyen-Chari"
},
{
"code": "TD-ME",
"name": "Mayo-Kebbi-Est"
},
{
"code": "TD-MO",
"name": "Mayo-Kebbi-Ouest"
},
{
"code": "TD-ND",
"name": "Ville de Ndjamena"
},
{
"code": "TD-OD",
"name": "Ouaddaï"
},
{
"code": "TD-SA",
"name": "Salamat"
},
{
"code": "TD-SI",
"name": "Sila"
},
{
"code": "TD-TA",
"name": "Tandjilé"
},
{
"code": "TD-TI",
"name": "Tibesti"
},
{
"code": "TD-WF",
"name": "Wadi Fira"
},
{
"code": "TG-C",
"name": "Centrale"
},
{
"code": "TG-K",
"name": "Kara"
},
{
"code": "TG-M",
"name": "Maritime (Région)"
},
{
"code": "TG-P",
"name": "Plateaux"
},
{
"code": "TG-S",
"name": "Savanes"
},
{
"code": "TH-10",
"name": "Krung Thep Maha Nakhon"
},
{
"code": "TH-11",
"name": "Samut Prakan"
},
{
"code": "TH-12",
"name": "Nonthaburi"
},
{
"code": "TH-13",
"name": "Pathum Thani"
},
{
"code": "TH-14",
"name": "Phra Nakhon Si Ayutthaya"
},
{
"code": "TH-15",
"name": "Ang Thong"
},
{
"code": "TH-16",
"name": "Lop Buri"
},
{
"code": "TH-17",
"name": "Sing Buri"
},
{
"code": "TH-18",
"name": "Chai Nat"
},
{
"code": "TH-19",
"name": "Saraburi"
},
{
"code": "TH-20",
"name": "Chon Buri"
},
{
"code": "TH-21",
"name": "Rayong"
},
{
"code": "TH-22",
"name": "Chanthaburi"
},
{
"code": "TH-23",
"name": "Trat"
},
{
"code": "TH-24",
"name": "Chachoengsao"
},
{
"code": "TH-25",
"name": "Prachin Buri"
},
{
"code": "TH-26",
"name": "Nakhon Nayok"
},
{
"code": "TH-27",
"name": "Sa Kaeo"
},
{
"code": "TH-30",
"name": "Nakhon Ratchasima"
},
{
"code": "TH-31",
"name": "Buri Ram"
},
{
"code": "TH-32",
"name": "Surin"
},
{
"code": "TH-33",
"name": "Si Sa Ket"
},
{
"code": "TH-34",
"name": "Ubon Ratchathani"
},
{
"code": "TH-35",
"name": "Yasothon"
},
{
"code": "TH-36",
"name": "Chaiyaphum"
},
{
"code": "TH-37",
"name": "Amnat Charoen"
},
{
"code": "TH-38",
"name": "Bueng Kan"
},
{
"code": "TH-39",
"name": "Nong Bua Lam Phu"
},
{
"code": "TH-40",
"name": "Khon Kaen"
},
{
"code": "TH-41",
"name": "Udon Thani"
},
{
"code": "TH-42",
"name": "Loei"
},
{
"code": "TH-43",
"name": "Nong Khai"
},
{
"code": "TH-44",
"name": "Maha Sarakham"
},
{
"code": "TH-45",
"name": "Roi Et"
},
{
"code": "TH-46",
"name": "Kalasin"
},
{
"code": "TH-47",
"name": "Sakon Nakhon"
},
{
"code": "TH-48",
"name": "Nakhon Phanom"
},
{
"code": "TH-49",
"name": "Mukdahan"
},
{
"code": "TH-50",
"name": "Chiang Mai"
},
{
"code": "TH-51",
"name": "Lamphun"
},
{
"code": "TH-52",
"name": "Lampang"
},
{
"code": "TH-53",
"name": "Uttaradit"
},
{
"code": "TH-54",
"name": "Phrae"
},
{
"code": "TH-55",
"name": "Nan"
},
{
"code": "TH-56",
"name": "Phayao"
},
{
"code": "TH-57",
"name": "Chiang Rai"
},
{
"code": "TH-58",
"name": "Mae Hong Son"
},
{
"code": "TH-60",
"name": "Nakhon Sawan"
},
{
"code": "TH-61",
"name": "Uthai Thani"
},
{
"code": "TH-62",
"name": "Kamphaeng Phet"
},
{
"code": "TH-63",
"name": "Tak"
},
{
"code": "TH-64",
"name": "Sukhothai"
},
{
"code": "TH-65",
"name": "Phitsanulok"
},
{
"code": "TH-66",
"name": "Phichit"
},
{
"code": "TH-67",
"name": "Phetchabun"
},
{
"code": "TH-70",
"name": "Ratchaburi"
},
{
"code": "TH-71",
"name": "Kanchanaburi"
},
{
"code": "TH-72",
"name": "Suphan Buri"
},
{
"code": "TH-73",
"name": "Nakhon Pathom"
},
{
"code": "TH-74",
"name": "Samut Sakhon"
},
{
"code": "TH-75",
"name": "Samut Songkhram"
},
{
"code": "TH-76",
"name": "Phetchaburi"
},
{
"code": "TH-77",
"name": "Prachuap Khiri Khan"
},
{
"code": "TH-80",
"name": "Nakhon Si Thammarat"
},
{
"code": "TH-81",
"name": "Krabi"
},
{
"code": "TH-82",
"name": "Phangnga"
},
{
"code": "TH-83",
"name": "Phuket"
},
{
"code": "TH-84",
"name": "Surat Thani"
},
{
"code": "TH-85",
"name": "Ranong"
},
{
"code": "TH-86",
"name": "Chumphon"
},
{
"code": "TH-90",
"name": "Songkhla"
},
{
"code": "TH-91",
"name": "Satun"
},
{
"code": "TH-92",
"name": "Trang"
},
{
"code": "TH-93",
"name": "Phatthalung"
},
{
"code": "TH-94",
"name": "Pattani"
},
{
"code": "TH-95",
"name": "Yala"
},
{
"code": "TH-96",
"name": "Narathiwat"
},
{
"code": "TH-S",
"name": "Phatthaya"
},
{
"code": "TJ-DU",
"name": "Dushanbe"
},
{
"code": "TJ-GB",
"name": "Kŭhistoni Badakhshon"
},
{
"code": "TJ-KT",
"name": "Khatlon"
},
{
"code": "TJ-RA",
"name": "nohiyahoi tobei jumhurí"
},
{
"code": "TJ-SU",
"name": "Sughd"
},
{
"code": "TL-AL",
"name": "Aileu"
},
{
"code": "TL-AN",
"name": "Ainaro"
},
{
"code": "TL-BA",
"name": "Baucau"
},
{
"code": "TL-BO",
"name": "Bobonaro"
},
{
"code": "TL-CO",
"name": "Cova Lima"
},
{
"code": "TL-DI",
"name": "Díli"
},
{
"code": "TL-ER",
"name": "Ermera"
},
{
"code": "TL-LA",
"name": "Lautém"
},
{
"code": "TL-LI",
"name": "Liquiça"
},
{
"code": "TL-MF",
"name": "Manufahi"
},
{
"code": "TL-MT",
"name": "Manatuto"
},
{
"code": "TL-OE",
"name": "Oé-Cusse Ambeno"
},
{
"code": "TL-VI",
"name": "Viqueque"
},
{
"code": "TM-A",
"name": "Ahal"
},
{
"code": "TM-B",
"name": "Balkan"
},
{
"code": "TM-D",
"name": "Daşoguz"
},
{
"code": "TM-L",
"name": "Lebap"
},
{
"code": "TM-M",
"name": "Mary"
},
{
"code": "TM-S",
"name": "Aşgabat"
},
{
"code": "TN-11",
"name": "Tunis"
},
{
"code": "TN-12",
"name": "L'Ariana"
},
{
"code": "TN-13",
"name": "Ben Arous"
},
{
"code": "TN-14",
"name": "La Manouba"
},
{
"code": "TN-21",
"name": "Nabeul"
},
{
"code": "TN-22",
"name": "Zaghouan"
},
{
"code": "TN-23",
"name": "Bizerte"
},
{
"code": "TN-31",
"name": "Béja"
},
{
"code": "TN-32",
"name": "Jendouba"
},
{
"code": "TN-33",
"name": "Le Kef"
},
{
"code": "TN-34",
"name": "Siliana"
},
{
"code": "TN-41",
"name": "Kairouan"
},
{
"code": "TN-42",
"name": "Kasserine"
},
{
"code": "TN-43",
"name": "Sidi Bouzid"
},
{
"code": "TN-51",
"name": "Sousse"
},
{
"code": "TN-52",
"name": "Monastir"
},
{
"code": "TN-53",
"name": "Mahdia"
},
{
"code": "TN-61",
"name": "Sfax"
},
{
"code": "TN-71",
"name": "Gafsa"
},
{
"code": "TN-72",
"name": "Tozeur"
},
{
"code": "TN-73",
"name": "Kébili"
},
{
"code": "TN-81",
"name": "Gabès"
},
{
"code": "TN-82",
"name": "Médenine"
},
{
"code": "TN-83",
"name": "Tataouine"
},
{
"code": "TO-01",
"name": "'Eua"
},
{
"code": "TO-02",
"name": "Ha'apai"
},
{
"code": "TO-03",
"name": "Niuas"
},
{
"code": "TO-04",
"name": "Tongatapu"
},
{
"code": "TO-05",
"name": "Vava'u"
},
{
"code": "TR-01",
"name": "Adana"
},
{
"code": "TR-02",
"name": "Adıyaman"
},
{
"code": "TR-03",
"name": "Afyonkarahisar"
},
{
"code": "TR-04",
"name": "Ağrı"
},
{
"code": "TR-05",
"name": "Amasya"
},
{
"code": "TR-06",
"name": "Ankara"
},
{
"code": "TR-07",
"name": "Antalya"
},
{
"code": "TR-08",
"name": "Artvin"
},
{
"code": "TR-09",
"name": "Aydın"
},
{
"code": "TR-10",
"name": "Balıkesir"
},
{
"code": "TR-11",
"name": "Bilecik"
},
{
"code": "TR-12",
"name": "Bingöl"
},
{
"code": "TR-13",
"name": "Bitlis"
},
{
"code": "TR-14",
"name": "Bolu"
},
{
"code": "TR-15",
"name": "Burdur"
},
{
"code": "TR-16",
"name": "Bursa"
},
{
"code": "TR-17",
"name": "Çanakkale"
},
{
"code": "TR-18",
"name": "Çankırı"
},
{
"code": "TR-19",
"name": "Çorum"
},
{
"code": "TR-20",
"name": "Denizli"
},
{
"code": "TR-21",
"name": "Diyarbakır"
},
{
"code": "TR-22",
"name": "Edirne"
},
{
"code": "TR-23",
"name": "Elazığ"
},
{
"code": "TR-24",
"name": "Erzincan"
},
{
"code": "TR-25",
"name": "Erzurum"
},
{
"code": "TR-26",
"name": "Eskişehir"
},
{
"code": "TR-27",
"name": "Gaziantep"
},
{
"code": "TR-28",
"name": "Giresun"
},
{
"code": "TR-29",
"name": "Gümüşhane"
},
{
"code": "TR-30",
"name": "Hakkâri"
},
{
"code": "TR-31",
"name": "Hatay"
},
{
"code": "TR-32",
"name": "Isparta"
},
{
"code": "TR-33",
"name": "Mersin"
},
{
"code": "TR-34",
"name": "İstanbul"
},
{
"code": "TR-35",
"name": "İzmir"
},
{
"code": "TR-36",
"name": "Kars"
},
{
"code": "TR-37",
"name": "Kastamonu"
},
{
"code": "TR-38",
"name": "Kayseri"
},
{
"code": "TR-39",
"name": "Kırklareli"
},
{
"code": "TR-40",
"name": "Kırşehir"
},
{
"code": "TR-41",
"name": "Kocaeli"
},
{
"code": "TR-42",
"name": "Konya"
},
{
"code": "TR-43",
"name": "Kütahya"
},
{
"code": "TR-44",
"name": "Malatya"
},
{
"code": "TR-45",
"name": "Manisa"
},
{
"code": "TR-46",
"name": "Kahramanmaraş"
},
{
"code": "TR-47",
"name": "Mardin"
},
{
"code": "TR-48",
"name": "Muğla"
},
{
"code": "TR-49",
"name": "Muş"
},
{
"code": "TR-50",
"name": "Nevşehir"
},
{
"code": "TR-51",
"name": "Niğde"
},
{
"code": "TR-52",
"name": "Ordu"
},
{
"code": "TR-53",
"name": "Rize"
},
{
"code": "TR-54",
"name": "Sakarya"
},
{
"code": "TR-55",
"name": "Samsun"
},
{
"code": "TR-56",
"name": "Siirt"
},
{
"code": "TR-57",
"name": "Sinop"
},
{
"code": "TR-58",
"name": "Sivas"
},
{
"code": "TR-59",
"name": "Tekirdağ"
},
{
"code": "TR-60",
"name": "Tokat"
},
{
"code": "TR-61",
"name": "Trabzon"
},
{
"code": "TR-62",
"name": "Tunceli"
},
{
"code": "TR-63",
"name": "Şanlıurfa"
},
{
"code": "TR-64",
"name": "Uşak"
},
{
"code": "TR-65",
"name": "Van"
},
{
"code": "TR-66",
"name": "Yozgat"
},
{
"code": "TR-67",
"name": "Zonguldak"
},
{
"code": "TR-68",
"name": "Aksaray"
},
{
"code": "TR-69",
"name": "Bayburt"
},
{
"code": "TR-70",
"name": "Karaman"
},
{
"code": "TR-71",
"name": "Kırıkkale"
},
{
"code": "TR-72",
"name": "Batman"
},
{
"code": "TR-73",
"name": "Şırnak"
},
{
"code": "TR-74",
"name": "Bartın"
},
{
"code": "TR-75",
"name": "Ardahan"
},
{
"code": "TR-76",
"name": "Iğdır"
},
{
"code": "TR-77",
"name": "Yalova"
},
{
"code": "TR-78",
"name": "Karabük"
},
{
"code": "TR-79",
"name": "Kilis"
},
{
"code": "TR-80",
"name": "Osmaniye"
},
{
"code": "TR-81",
"name": "Düzce"
},
{
"code": "TT-ARI",
"name": "Arima"
},
{
"code": "TT-CHA",
"name": "Chaguanas"
},
{
"code": "TT-CTT",
"name": "Couva-Tabaquite-Talparo"
},
{
"code": "TT-DMN",
"name": "Diego Martin"
},
{
"code": "TT-MRC",
"name": "Mayaro-Rio Claro"
},
{
"code": "TT-PED",
"name": "Penal-Debe"
},
{
"code": "TT-POS",
"name": "Port of Spain"
},
{
"code": "TT-PRT",
"name": "Princes Town"
},
{
"code": "TT-PTF",
"name": "Point Fortin"
},
{
"code": "TT-SFO",
"name": "San Fernando"
},
{
"code": "TT-SGE",
"name": "Sangre Grande"
},
{
"code": "TT-SIP",
"name": "Siparia"
},
{
"code": "TT-SJL",
"name": "San Juan-Laventille"
},
{
"code": "TT-TOB",
"name": "Tobago"
},
{
"code": "TT-TUP",
"name": "Tunapuna-Piarco"
},
{
"code": "TV-FUN",
"name": "Funafuti"
},
{
"code": "TV-NIT",
"name": "Niutao"
},
{
"code": "TV-NKF",
"name": "Nukufetau"
},
{
"code": "TV-NKL",
"name": "Nukulaelae"
},
{
"code": "TV-NMA",
"name": "Nanumea"
},
{
"code": "TV-NMG",
"name": "Nanumaga"
},
{
"code": "TV-NUI",
"name": "Nui"
},
{
"code": "TV-VAI",
"name": "Vaitupu"
},
{
"code": "TW-CHA",
"name": "Changhua"
},
{
"code": "TW-CYI",
"name": "Chiayi"
},
{
"code": "TW-CYQ",
"name": "Chiayi"
},
{
"code": "TW-HSQ",
"name": "Hsinchu"
},
{
"code": "TW-HSZ",
"name": "Hsinchu"
},
{
"code": "TW-HUA",
"name": "Hualien"
},
{
"code": "TW-ILA",
"name": "Yilan"
},
{
"code": "TW-KEE",
"name": "Keelung"
},
{
"code": "TW-KHH",
"name": "Kaohsiung"
},
{
"code": "TW-KIN",
"name": "Kinmen"
},
{
"code": "TW-LIE",
"name": "Lienchiang"
},
{
"code": "TW-MIA",
"name": "Miaoli"
},
{
"code": "TW-NAN",
"name": "Nantou"
},
{
"code": "TW-NWT",
"name": "New Taipei"
},
{
"code": "TW-PEN",
"name": "Penghu"
},
{
"code": "TW-PIF",
"name": "Pingtung"
},
{
"code": "TW-TAO",
"name": "Taoyuan"
},
{
"code": "TW-TNN",
"name": "Tainan"
},
{
"code": "TW-TPE",
"name": "Taipei"
},
{
"code": "TW-TTT",
"name": "Taitung"
},
{
"code": "TW-TXG",
"name": "Taichung"
},
{
"code": "TW-YUN",
"name": "Yunlin"
},
{
"code": "TZ-01",
"name": "Arusha"
},
{
"code": "TZ-02",
"name": "Dar es Salaam"
},
{
"code": "TZ-03",
"name": "Dodoma"
},
{
"code": "TZ-04",
"name": "Iringa"
},
{
"code": "TZ-05",
"name": "Kagera"
},
{
"code": "TZ-06",
"name": "Pemba North"
},
{
"code": "TZ-07",
"name": "Zanzibar North"
},
{
"code": "TZ-08",
"name": "Kigoma"
},
{
"code": "TZ-09",
"name": "Kilimanjaro"
},
{
"code": "TZ-10",
"name": "Pemba South"
},
{
"code": "TZ-11",
"name": "Zanzibar South"
},
{
"code": "TZ-12",
"name": "Lindi"
},
{
"code": "TZ-13",
"name": "Mara"
},
{
"code": "TZ-14",
"name": "Mbeya"
},
{
"code": "TZ-15",
"name": "Zanzibar West"
},
{
"code": "TZ-16",
"name": "Morogoro"
},
{
"code": "TZ-17",
"name": "Mtwara"
},
{
"code": "TZ-18",
"name": "Mwanza"
},
{
"code": "TZ-19",
"name": "Coast"
},
{
"code": "TZ-20",
"name": "Rukwa"
},
{
"code": "TZ-21",
"name": "Ruvuma"
},
{
"code": "TZ-22",
"name": "Shinyanga"
},
{
"code": "TZ-23",
"name": "Singida"
},
{
"code": "TZ-24",
"name": "Tabora"
},
{
"code": "TZ-25",
"name": "Tanga"
},
{
"code": "TZ-26",
"name": "Manyara"
},
{
"code": "TZ-27",
"name": "Geita"
},
{
"code": "TZ-28",
"name": "Katavi"
},
{
"code": "TZ-29",
"name": "Njombe"
},
{
"code": "TZ-30",
"name": "Simiyu"
},
{
"code": "TZ-31",
"name": "Songwe"
},
{
"code": "UA-05",
"name": "Vinnytska oblast"
},
{
"code": "UA-07",
"name": "Volynska oblast"
},
{
"code": "UA-09",
"name": "Luhanska oblast"
},
{
"code": "UA-12",
"name": "Dnipropetrovska oblast"
},
{
"code": "UA-14",
"name": "Donetska oblast"
},
{
"code": "UA-18",
"name": "Zhytomyrska oblast"
},
{
"code": "UA-21",
"name": "Zakarpatska oblast"
},
{
"code": "UA-23",
"name": "Zaporizka oblast"
},
{
"code": "UA-26",
"name": "Ivano-Frankivska oblast"
},
{
"code": "UA-30",
"name": "Kyiv"
},
{
"code": "UA-32",
"name": "Kyivska oblast"
},
{
"code": "UA-35",
"name": "Kirovohradska oblast"
},
{
"code": "UA-40",
"name": "Sevastopol"
},
{
"code": "UA-43",
"name": "Avtonomna Respublika Krym"
},
{
"code": "UA-46",
"name": "Lvivska oblast"
},
{
"code": "UA-48",
"name": "Mykolaivska oblast"
},
{
"code": "UA-51",
"name": "Odeska oblast"
},
{
"code": "UA-53",
"name": "Poltavska oblast"
},
{
"code": "UA-56",
"name": "Rivnenska oblast"
},
{
"code": "UA-59",
"name": "Sumska oblast"
},
{
"code": "UA-61",
"name": "Ternopilska oblast"
},
{
"code": "UA-63",
"name": "Kharkivska oblast"
},
{
"code": "UA-65",
"name": "Khersonska oblast"
},
{
"code": "UA-68",
"name": "Khmelnytska oblast"
},
{
"code": "UA-71",
"name": "Cherkaska oblast"
},
{
"code": "UA-74",
"name": "Chernihivska oblast"
},
{
"code": "UA-77",
"name": "Chernivetska oblast"
},
{
"code": "UG-101",
"name": "Kalangala"
},
{
"code": "UG-102",
"name": "Kampala"
},
{
"code": "UG-103",
"name": "Kiboga"
},
{
"code": "UG-104",
"name": "Luwero"
},
{
"code": "UG-105",
"name": "Masaka"
},
{
"code": "UG-106",
"name": "Mpigi"
},
{
"code": "UG-107",
"name": "Mubende"
},
{
"code": "UG-108",
"name": "Mukono"
},
{
"code": "UG-109",
"name": "Nakasongola"
},
{
"code": "UG-110",
"name": "Rakai"
},
{
"code": "UG-111",
"name": "Sembabule"
},
{
"code": "UG-112",
"name": "Kayunga"
},
{
"code": "UG-113",
"name": "Wakiso"
},
{
"code": "UG-114",
"name": "Lyantonde"
},
{
"code": "UG-115",
"name": "Mityana"
},
{
"code": "UG-116",
"name": "Nakaseke"
},
{
"code": "UG-117",
"name": "Buikwe"
},
{
"code": "UG-118",
"name": "Bukomansibi"
},
{
"code": "UG-119",
"name": "Butambala"
},
{
"code": "UG-120",
"name": "Buvuma"
},
{
"code": "UG-121",
"name": "Gomba"
},
{
"code": "UG-122",
"name": "Kalungu"
},
{
"code": "UG-123",
"name": "Kyankwanzi"
},
{
"code": "UG-124",
"name": "Lwengo"
},
{
"code": "UG-125",
"name": "Kyotera"
},
{
"code": "UG-126",
"name": "Kasanda"
},
{
"code": "UG-201",
"name": "Bugiri"
},
{
"code": "UG-202",
"name": "Busia"
},
{
"code": "UG-203",
"name": "Iganga"
},
{
"code": "UG-204",
"name": "Jinja"
},
{
"code": "UG-205",
"name": "Kamuli"
},
{
"code": "UG-206",
"name": "Kapchorwa"
},
{
"code": "UG-207",
"name": "Katakwi"
},
{
"code": "UG-208",
"name": "Kumi"
},
{
"code": "UG-209",
"name": "Mbale"
},
{
"code": "UG-210",
"name": "Pallisa"
},
{
"code": "UG-211",
"name": "Soroti"
},
{
"code": "UG-212",
"name": "Tororo"
},
{
"code": "UG-213",
"name": "Kaberamaido"
},
{
"code": "UG-214",
"name": "Mayuge"
},
{
"code": "UG-215",
"name": "Sironko"
},
{
"code": "UG-216",
"name": "Amuria"
},
{
"code": "UG-217",
"name": "Budaka"
},
{
"code": "UG-218",
"name": "Bududa"
},
{
"code": "UG-219",
"name": "Bukedea"
},
{
"code": "UG-220",
"name": "Bukwo"
},
{
"code": "UG-221",
"name": "Butaleja"
},
{
"code": "UG-222",
"name": "Kaliro"
},
{
"code": "UG-223",
"name": "Manafwa"
},
{
"code": "UG-224",
"name": "Namutumba"
},
{
"code": "UG-225",
"name": "Bulambuli"
},
{
"code": "UG-226",
"name": "Buyende"
},
{
"code": "UG-227",
"name": "Kibuku"
},
{
"code": "UG-228",
"name": "Kween"
},
{
"code": "UG-229",
"name": "Luuka"
},
{
"code": "UG-230",
"name": "Namayingo"
},
{
"code": "UG-231",
"name": "Ngora"
},
{
"code": "UG-232",
"name": "Serere"
},
{
"code": "UG-233",
"name": "Butebo"
},
{
"code": "UG-234",
"name": "Namisindwa"
},
{
"code": "UG-235",
"name": "Bugweri"
},
{
"code": "UG-236",
"name": "Kapelebyong"
},
{
"code": "UG-237",
"name": "Kalaki"
},
{
"code": "UG-301",
"name": "Adjumani"
},
{
"code": "UG-302",
"name": "Apac"
},
{
"code": "UG-303",
"name": "Arua"
},
{
"code": "UG-304",
"name": "Gulu"
},
{
"code": "UG-305",
"name": "Kitgum"
},
{
"code": "UG-306",
"name": "Kotido"
},
{
"code": "UG-307",
"name": "Lira"
},
{
"code": "UG-308",
"name": "Moroto"
},
{
"code": "UG-309",
"name": "Moyo"
},
{
"code": "UG-310",
"name": "Nebbi"
},
{
"code": "UG-311",
"name": "Nakapiripirit"
},
{
"code": "UG-312",
"name": "Pader"
},
{
"code": "UG-313",
"name": "Yumbe"
},
{
"code": "UG-314",
"name": "Abim"
},
{
"code": "UG-315",
"name": "Amolatar"
},
{
"code": "UG-316",
"name": "Amuru"
},
{
"code": "UG-317",
"name": "Dokolo"
},
{
"code": "UG-318",
"name": "Kaabong"
},
{
"code": "UG-319",
"name": "Koboko"
},
{
"code": "UG-320",
"name": "Maracha"
},
{
"code": "UG-321",
"name": "Oyam"
},
{
"code": "UG-322",
"name": "Agago"
},
{
"code": "UG-323",
"name": "Alebtong"
},
{
"code": "UG-324",
"name": "Amudat"
},
{
"code": "UG-325",
"name": "Kole"
},
{
"code": "UG-326",
"name": "Lamwo"
},
{
"code": "UG-327",
"name": "Napak"
},
{
"code": "UG-328",
"name": "Nwoya"
},
{
"code": "UG-329",
"name": "Otuke"
},
{
"code": "UG-330",
"name": "Zombo"
},
{
"code": "UG-331",
"name": "Omoro"
},
{
"code": "UG-332",
"name": "Pakwach"
},
{
"code": "UG-333",
"name": "Kwania"
},
{
"code": "UG-334",
"name": "Nabilatuk"
},
{
"code": "UG-335",
"name": "Karenga"
},
{
"code": "UG-336",
"name": "Madi-Okollo"
},
{
"code": "UG-337",
"name": "Obongi"
},
{
"code": "UG-401",
"name": "Bundibugyo"
},
{
"code": "UG-402",
"name": "Bushenyi"
},
{
"code": "UG-403",
"name": "Hoima"
},
{
"code": "UG-404",
"name": "Kabale"
},
{
"code": "UG-405",
"name": "Kabarole"
},
{
"code": "UG-406",
"name": "Kasese"
},
{
"code": "UG-407",
"name": "Kibaale"
},
{
"code": "UG-408",
"name": "Kisoro"
},
{
"code": "UG-409",
"name": "Masindi"
},
{
"code": "UG-410",
"name": "Mbarara"
},
{
"code": "UG-411",
"name": "Ntungamo"
},
{
"code": "UG-412",
"name": "Rukungiri"
},
{
"code": "UG-413",
"name": "Kamwenge"
},
{
"code": "UG-414",
"name": "Kanungu"
},
{
"code": "UG-415",
"name": "Kyenjojo"
},
{
"code": "UG-416",
"name": "Buliisa"
},
{
"code": "UG-417",
"name": "Ibanda"
},
{
"code": "UG-418",
"name": "Isingiro"
},
{
"code": "UG-419",
"name": "Kiruhura"
},
{
"code": "UG-420",
"name": "Buhweju"
},
{
"code": "UG-421",
"name": "Kiryandongo"
},
{
"code": "UG-422",
"name": "Kyegegwa"
},
{
"code": "UG-423",
"name": "Mitooma"
},
{
"code": "UG-424",
"name": "Ntoroko"
},
{
"code": "UG-425",
"name": "Rubirizi"
},
{
"code": "UG-426",
"name": "Sheema"
},
{
"code": "UG-427",
"name": "Kagadi"
},
{
"code": "UG-428",
"name": "Kakumiro"
},
{
"code": "UG-429",
"name": "Rubanda"
},
{
"code": "UG-430",
"name": "Bunyangabu"
},
{
"code": "UG-431",
"name": "Rukiga"
},
{
"code": "UG-432",
"name": "Kikuube"
},
{
"code": "UG-433",
"name": "Kazo"
},
{
"code": "UG-434",
"name": "Kitagwenda"
},
{
"code": "UG-435",
"name": "Rwampara"
},
{
"code": "UG-C",
"name": "Central"
},
{
"code": "UG-E",
"name": "Eastern"
},
{
"code": "UG-N",
"name": "Northern"
},
{
"code": "UG-W",
"name": "Western"
},
{
"code": "UM-67",
"name": "Johnston Atoll"
},
{
"code": "UM-71",
"name": "Midway Islands"
},
{
"code": "UM-76",
"name": "Navassa Island"
},
{
"code": "UM-79",
"name": "Wake Island"
},
{
"code": "UM-81",
"name": "Baker Island"
},
{
"code": "UM-84",
"name": "Howland Island"
},
{
"code": "UM-86",
"name": "Jarvis Island"
},
{
"code": "UM-89",
"name": "Kingman Reef"
},
{
"code": "UM-95",
"name": "Palmyra Atoll"
},
{
"code": "US-AK",
"name": "Alaska"
},
{
"code": "US-AL",
"name": "Alabama"
},
{
"code": "US-AR",
"name": "Arkansas"
},
{
"code": "US-AS",
"name": "American Samoa"
},
{
"code": "US-AZ",
"name": "Arizona"
},
{
"code": "US-CA",
"name": "California"
},
{
"code": "US-CO",
"name": "Colorado"
},
{
"code": "US-CT",
"name": "Connecticut"
},
{
"code": "US-DC",
"name": "District of Columbia"
},
{
"code": "US-DE",
"name": "Delaware"
},
{
"code": "US-FL",
"name": "Florida"
},
{
"code": "US-GA",
"name": "Georgia"
},
{
"code": "US-GU",
"name": "Guam"
},
{
"code": "US-HI",
"name": "Hawaii"
},
{
"code": "US-IA",
"name": "Iowa"
},
{
"code": "US-ID",
"name": "Idaho"
},
{
"code": "US-IL",
"name": "Illinois"
},
{
"code": "US-IN",
"name": "Indiana"
},
{
"code": "US-KS",
"name": "Kansas"
},
{
"code": "US-KY",
"name": "Kentucky"
},
{
"code": "US-LA",
"name": "Louisiana"
},
{
"code": "US-MA",
"name": "Massachusetts"
},
{
"code": "US-MD",
"name": "Maryland"
},
{
"code": "US-ME",
"name": "Maine"
},
{
"code": "US-MI",
"name": "Michigan"
},
{
"code": "US-MN",
"name": "Minnesota"
},
{
"code": "US-MO",
"name": "Missouri"
},
{
"code": "US-MP",
"name": "Northern Mariana Islands"
},
{
"code": "US-MS",
"name": "Mississippi"
},
{
"code": "US-MT",
"name": "Montana"
},
{
"code": "US-NC",
"name": "North Carolina"
},
{
"code": "US-ND",
"name": "North Dakota"
},
{
"code": "US-NE",
"name": "Nebraska"
},
{
"code": "US-NH",
"name": "New Hampshire"
},
{
"code": "US-NJ",
"name": "New Jersey"
},
{
"code": "US-NM",
"name": "New Mexico"
},
{
"code": "US-NV",
"name": "Nevada"
},
{
"code": "US-NY",
"name": "New York"
},
{
"code": "US-OH",
"name": "Ohio"
},
{
"code": "US-OK",
"name": "Oklahoma"
},
{
"code": "US-OR",
"name": "Oregon"
},
{
"code": "US-PA",
"name": "Pennsylvania"
},
{
"code": "US-PR",
"name": "Puerto Rico"
},
{
"code": "US-RI",
"name": "Rhode Island"
},
{
"code": "US-SC",
"name": "South Carolina"
},
{
"code": "US-SD",
"name": "South Dakota"
},
{
"code": "US-TN",
"name": "Tennessee"
},
{
"code": "US-TX",
"name": "Texas"
},
{
"code": "US-UM",
"name": "United States Minor Outlying Islands"
},
{
"code": "US-UT",
"name": "Utah"
},
{
"code": "US-VA",
"name": "Virginia"
},
{
"code": "US-VI",
"name": "Virgin Islands, U.S."
},
{
"code": "US-VT",
"name": "Vermont"
},
{
"code": "US-WA",
"name": "Washington"
},
{
"code": "US-WI",
"name": "Wisconsin"
},
{
"code": "US-WV",
"name": "West Virginia"
},
{
"code": "US-WY",
"name": "Wyoming"
},
{
"code": "UY-AR",
"name": "Artigas"
},
{
"code": "UY-CA",
"name": "Canelones"
},
{
"code": "UY-CL",
"name": "Cerro Largo"
},
{
"code": "UY-CO",
"name": "Colonia"
},
{
"code": "UY-DU",
"name": "Durazno"
},
{
"code": "UY-FD",
"name": "Florida"
},
{
"code": "UY-FS",
"name": "Flores"
},
{
"code": "UY-LA",
"name": "Lavalleja"
},
{
"code": "UY-MA",
"name": "Maldonado"
},
{
"code": "UY-MO",
"name": "Montevideo"
},
{
"code": "UY-PA",
"name": "Paysandú"
},
{
"code": "UY-RN",
"name": "Río Negro"
},
{
"code": "UY-RO",
"name": "Rocha"
},
{
"code": "UY-RV",
"name": "Rivera"
},
{
"code": "UY-SA",
"name": "Salto"
},
{
"code": "UY-SJ",
"name": "San José"
},
{
"code": "UY-SO",
"name": "Soriano"
},
{
"code": "UY-TA",
"name": "Tacuarembó"
},
{
"code": "UY-TT",
"name": "Treinta y Tres"
},
{
"code": "UZ-AN",
"name": "Andijon"
},
{
"code": "UZ-BU",
"name": "Buxoro"
},
{
"code": "UZ-FA",
"name": "Farg‘ona"
},
{
"code": "UZ-JI",
"name": "Jizzax"
},
{
"code": "UZ-NG",
"name": "Namangan"
},
{
"code": "UZ-NW",
"name": "Navoiy"
},
{
"code": "UZ-QA",
"name": "Qashqadaryo"
},
{
"code": "UZ-QR",
"name": "Qoraqalpog‘iston Respublikasi"
},
{
"code": "UZ-SA",
"name": "Samarqand"
},
{
"code": "UZ-SI",
"name": "Sirdaryo"
},
{
"code": "UZ-SU",
"name": "Surxondaryo"
},
{
"code": "UZ-TK",
"name": "Toshkent"
},
{
"code": "UZ-TO",
"name": "Toshkent"
},
{
"code": "UZ-XO",
"name": "Xorazm"
},
{
"code": "VC-01",
"name": "Charlotte"
},
{
"code": "VC-02",
"name": "Saint Andrew"
},
{
"code": "VC-03",
"name": "Saint David"
},
{
"code": "VC-04",
"name": "Saint George"
},
{
"code": "VC-05",
"name": "Saint Patrick"
},
{
"code": "VC-06",
"name": "Grenadines"
},
{
"code": "VE-A",
"name": "Distrito Capital"
},
{
"code": "VE-B",
"name": "Anzoátegui"
},
{
"code": "VE-C",
"name": "Apure"
},
{
"code": "VE-D",
"name": "Aragua"
},
{
"code": "VE-E",
"name": "Barinas"
},
{
"code": "VE-F",
"name": "Bolívar"
},
{
"code": "VE-G",
"name": "Carabobo"
},
{
"code": "VE-H",
"name": "Cojedes"
},
{
"code": "VE-I",
"name": "Falcón"
},
{
"code": "VE-J",
"name": "Guárico"
},
{
"code": "VE-K",
"name": "Lara"
},
{
"code": "VE-L",
"name": "Mérida"
},
{
"code": "VE-M",
"name": "Miranda"
},
{
"code": "VE-N",
"name": "Monagas"
},
{
"code": "VE-O",
"name": "Nueva Esparta"
},
{
"code": "VE-P",
"name": "Portuguesa"
},
{
"code": "VE-R",
"name": "Sucre"
},
{
"code": "VE-S",
"name": "Táchira"
},
{
"code": "VE-T",
"name": "Trujillo"
},
{
"code": "VE-U",
"name": "Yaracuy"
},
{
"code": "VE-V",
"name": "Zulia"
},
{
"code": "VE-W",
"name": "Dependencias Federales"
},
{
"code": "VE-X",
"name": "La Guaira"
},
{
"code": "VE-Y",
"name": "Delta Amacuro"
},
{
"code": "VE-Z",
"name": "Amazonas"
},
{
"code": "VN-01",
"name": "Lai Châu"
},
{
"code": "VN-02",
"name": "Lào Cai"
},
{
"code": "VN-03",
"name": "Hà Giang"
},
{
"code": "VN-04",
"name": "Cao Bằng"
},
{
"code": "VN-05",
"name": "Sơn La"
},
{
"code": "VN-06",
"name": "Yên Bái"
},
{
"code": "VN-07",
"name": "Tuyên Quang"
},
{
"code": "VN-09",
"name": "Lạng Sơn"
},
{
"code": "VN-13",
"name": "Quảng Ninh"
},
{
"code": "VN-14",
"name": "Hòa Bình"
},
{
"code": "VN-18",
"name": "Ninh Bình"
},
{
"code": "VN-20",
"name": "Thái Bình"
},
{
"code": "VN-21",
"name": "Thanh Hóa"
},
{
"code": "VN-22",
"name": "Nghệ An"
},
{
"code": "VN-23",
"name": "Hà Tĩnh"
},
{
"code": "VN-24",
"name": "Quảng Bình"
},
{
"code": "VN-25",
"name": "Quảng Trị"
},
{
"code": "VN-26",
"name": "Thừa Thiên-Huế"
},
{
"code": "VN-27",
"name": "Quảng Nam"
},
{
"code": "VN-28",
"name": "Kon Tum"
},
{
"code": "VN-29",
"name": "Quảng Ngãi"
},
{
"code": "VN-30",
"name": "Gia Lai"
},
{
"code": "VN-31",
"name": "Bình Định"
},
{
"code": "VN-32",
"name": "Phú Yên"
},
{
"code": "VN-33",
"name": "Đắk Lắk"
},
{
"code": "VN-34",
"name": "Khánh Hòa"
},
{
"code": "VN-35",
"name": "Lâm Đồng"
},
{
"code": "VN-36",
"name": "Ninh Thuận"
},
{
"code": "VN-37",
"name": "Tây Ninh"
},
{
"code": "VN-39",
"name": "Đồng Nai"
},
{
"code": "VN-40",
"name": "Bình Thuận"
},
{
"code": "VN-41",
"name": "Long An"
},
{
"code": "VN-43",
"name": "Bà Rịa - Vũng Tàu"
},
{
"code": "VN-44",
"name": "An Giang"
},
{
"code": "VN-45",
"name": "Đồng Tháp"
},
{
"code": "VN-46",
"name": "Tiền Giang"
},
{
"code": "VN-47",
"name": "Kiến Giang"
},
{
"code": "VN-49",
"name": "Vĩnh Long"
},
{
"code": "VN-50",
"name": "Bến Tre"
},
{
"code": "VN-51",
"name": "Trà Vinh"
},
{
"code": "VN-52",
"name": "Sóc Trăng"
},
{
"code": "VN-53",
"name": "Bắc Kạn"
},
{
"code": "VN-54",
"name": "Bắc Giang"
},
{
"code": "VN-55",
"name": "Bạc Liêu"
},
{
"code": "VN-56",
"name": "Bắc Ninh"
},
{
"code": "VN-57",
"name": "Bình Dương"
},
{
"code": "VN-58",
"name": "Bình Phước"
},
{
"code": "VN-59",
"name": "Cà Mau"
},
{
"code": "VN-61",
"name": "Hải Dương"
},
{
"code": "VN-63",
"name": "Hà Nam"
},
{
"code": "VN-66",
"name": "Hưng Yên"
},
{
"code": "VN-67",
"name": "Nam Định"
},
{
"code": "VN-68",
"name": "Phú Thọ"
},
{
"code": "VN-69",
"name": "Thái Nguyên"
},
{
"code": "VN-70",
"name": "Vĩnh Phúc"
},
{
"code": "VN-71",
"name": "Điện Biên"
},
{
"code": "VN-72",
"name": "Đắk Nông"
},
{
"code": "VN-73",
"name": "Hậu Giang"
},
{
"code": "VN-CT",
"name": "Cần Thơ"
},
{
"code": "VN-DN",
"name": "Đà Nẵng"
},
{
"code": "VN-HN",
"name": "Hà Nội"
},
{
"code": "VN-HP",
"name": "Hải Phòng"
},
{
"code": "VN-SG",
"name": "Hồ Chí Minh"
},
{
"code": "VU-MAP",
"name": "Malampa"
},
{
"code": "VU-PAM",
"name": "Pénama"
},
{
"code": "VU-SAM",
"name": "Sanma"
},
{
"code": "VU-SEE",
"name": "Shéfa"
},
{
"code": "VU-TAE",
"name": "Taféa"
},
{
"code": "VU-TOB",
"name": "Torba"
},
{
"code": "WF-AL",
"name": "Alo"
},
{
"code": "WF-SG",
"name": "Sigave"
},
{
"code": "WF-UV",
"name": "Uvea"
},
{
"code": "WS-AA",
"name": "A'ana"
},
{
"code": "WS-AL",
"name": "Aiga-i-le-Tai"
},
{
"code": "WS-AT",
"name": "Atua"
},
{
"code": "WS-FA",
"name": "Fa'asaleleaga"
},
{
"code": "WS-GE",
"name": "Gaga'emauga"
},
{
"code": "WS-GI",
"name": "Gagaifomauga"
},
{
"code": "WS-PA",
"name": "Palauli"
},
{
"code": "WS-SA",
"name": "Satupa'itea"
},
{
"code": "WS-TU",
"name": "Tuamasaga"
},
{
"code": "WS-VF",
"name": "Va'a-o-Fonoti"
},
{
"code": "WS-VS",
"name": "Vaisigano"
},
{
"code": "YE-AB",
"name": "Abyan"
},
{
"code": "YE-AD",
"name": "‘Adan"
},
{
"code": "YE-AM",
"name": "‘Amrān"
},
{
"code": "YE-BA",
"name": "Al Bayḑā’"
},
{
"code": "YE-DA",
"name": "Aḑ Ḑāli‘"
},
{
"code": "YE-DH",
"name": "Dhamār"
},
{
"code": "YE-HD",
"name": "Ḩaḑramawt"
},
{
"code": "YE-HJ",
"name": "Ḩajjah"
},
{
"code": "YE-HU",
"name": "Al Ḩudaydah"
},
{
"code": "YE-IB",
"name": "Ibb"
},
{
"code": "YE-JA",
"name": "Al Jawf"
},
{
"code": "YE-LA",
"name": "Laḩij"
},
{
"code": "YE-MA",
"name": "Ma’rib"
},
{
"code": "YE-MR",
"name": "Al Mahrah"
},
{
"code": "YE-MW",
"name": "Al Maḩwīt"
},
{
"code": "YE-RA",
"name": "Raymah"
},
{
"code": "YE-SA",
"name": "Amānat al ‘Āşimah [city]"
},
{
"code": "YE-SD",
"name": "Şāʻdah"
},
{
"code": "YE-SH",
"name": "Shabwah"
},
{
"code": "YE-SN",
"name": "Şanʻā’"
},
{
"code": "YE-SU",
"name": "Arkhabīl Suquţrá"
},
{
"code": "YE-TA",
"name": "Tāʻizz"
},
{
"code": "ZA-EC",
"name": "Eastern Cape"
},
{
"code": "ZA-FS",
"name": "Free State"
},
{
"code": "ZA-GP",
"name": "Gauteng"
},
{
"code": "ZA-KZN",
"name": "Kwazulu-Natal"
},
{
"code": "ZA-LP",
"name": "Limpopo"
},
{
"code": "ZA-MP",
"name": "Mpumalanga"
},
{
"code": "ZA-NC",
"name": "Northern Cape"
},
{
"code": "ZA-NW",
"name": "North-West"
},
{
"code": "ZA-WC",
"name": "Western Cape"
},
{
"code": "ZM-01",
"name": "Western"
},
{
"code": "ZM-02",
"name": "Central"
},
{
"code": "ZM-03",
"name": "Eastern"
},
{
"code": "ZM-04",
"name": "Luapula"
},
{
"code": "ZM-05",
"name": "Northern"
},
{
"code": "ZM-06",
"name": "North-Western"
},
{
"code": "ZM-07",
"name": "Southern"
},
{
"code": "ZM-08",
"name": "Copperbelt"
},
{
"code": "ZM-09",
"name": "Lusaka"
},
{
"code": "ZM-10",
"name": "Muchinga"
},
{
"code": "ZW-BU",
"name": "Bulawayo"
},
{
"code": "ZW-HA",
"name": "Harare"
},
{
"code": "ZW-MA",
"name": "Manicaland"
},
{
"code": "ZW-MC",
"name": "Mashonaland Central"
},
{
"code": "ZW-ME",
"name": "Mashonaland East"
},
{
"code": "ZW-MI",
"name": "Midlands"
},
{
"code": "ZW-MN",
"name": "Matabeleland North"
},
{
"code": "ZW-MS",
"name": "Matabeleland South"
},
{
"code": "ZW-MV",
"name": "Masvingo"
},
{
"code": "ZW-MW",
"name": "Mashonaland West"
}
]
}
small-territories.json 1.0 KB
[
"AD",
"AG",
"AI",
"AN",
"AQ",
"AS",
"AW",
"AX",
"BB",
"BH",
"BL",
"BM",
"BN",
"BQ",
"BS",
"BT",
"BV",
"BZ",
"CC",
"CK",
"CS",
"CV",
"CW",
"CX",
"CY",
"DM",
"EH",
"FK",
"FM",
"FO",
"GD",
"GF",
"GG",
"GI",
"GL",
"GM",
"GP",
"GS",
"GU",
"GY",
"HK",
"HM",
"IM",
"IO",
"IS",
"JE",
"JM",
"KI",
"KM",
"KN",
"KY",
"LB",
"LC",
"LI",
"LU",
"MC",
"ME",
"MF",
"MH",
"MO",
"MP",
"MQ",
"MS",
"MT",
"MU",
"MV",
"NC",
"NF",
"NR",
"NU",
"PF",
"PM",
"PN",
"PR",
"PS",
"PW",
"QA",
"RE",
"SB",
"SC",
"SG",
"SH",
"SJ",
"SM",
"SR",
"ST",
"SX",
"TC",
"TF",
"TK",
"TL",
"TO",
"TT",
"TV",
"UM",
"VA",
"VC",
"VG",
"VI",
"VU",
"WF",
"WS",
"XK",
"YT"
] rfc8805.txt 29.9 KB
Independent Submission E. Kline
Request for Comments: 8805 Loon LLC
Category: Informational K. Duleba
ISSN: 2070-1721 Google
Z. Szamonek
S. Moser
Google Switzerland GmbH
W. Kumari
Google
August 2020
A Format for Self-Published IP Geolocation Feeds
Abstract
This document records a format whereby a network operator can publish
a mapping of IP address prefixes to simplified geolocation
information, colloquially termed a "geolocation feed". Interested
parties can poll and parse these feeds to update or merge with other
geolocation data sources and procedures. This format intentionally
only allows specifying coarse-level location.
Some technical organizations operating networks that move from one
conference location to the next have already experimentally published
small geolocation feeds.
This document describes a currently deployed format. At least one
consumer (Google) has incorporated these feeds into a geolocation
data pipeline, and a significant number of ISPs are using it to
inform them where their prefixes should be geolocated.
Status of This Memo
This document is not an Internet Standards Track specification; it is
published for informational purposes.
This is a contribution to the RFC Series, independently of any other
RFC stream. The RFC Editor has chosen to publish this document at
its discretion and makes no statement about its value for
implementation or deployment. Documents approved for publication by
the RFC Editor are not candidates for any level of Internet Standard;
see Section 2 of RFC 7841.
Information about the current status of this document, any errata,
and how to provide feedback on it may be obtained at
https://www.rfc-editor.org/info/rfc8805.
Copyright Notice
Copyright (c) 2020 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document.
Table of Contents
1. Introduction
1.1. Motivation
1.2. Requirements Notation
1.3. Assumptions about Publication
2. Self-Published IP Geolocation Feeds
2.1. Specification
2.1.1. Geolocation Feed Individual Entry Fields
2.1.1.1. IP Prefix
2.1.1.2. Alpha2code (Previously: 'country')
2.1.1.3. Region
2.1.1.4. City
2.1.1.5. Postal Code
2.1.2. Prefixes with No Geolocation Information
2.1.3. Additional Parsing Requirements
2.2. Examples
3. Consuming Self-Published IP Geolocation Feeds
3.1. Feed Integrity
3.2. Verification of Authority
3.3. Verification of Accuracy
3.4. Refreshing Feed Information
4. Privacy Considerations
5. Relation to Other Work
6. Security Considerations
7. Planned Future Work
8. Finding Self-Published IP Geolocation Feeds
8.1. Ad Hoc 'Well-Known' URIs
8.2. Other Mechanisms
9. IANA Considerations
10. References
10.1. Normative References
10.2. Informative References
Appendix A. Sample Python Validation Code
Acknowledgements
Authors' Addresses
1. Introduction
1.1. Motivation
Providers of services over the Internet have grown to depend on best-
effort geolocation information to improve the user experience.
Locality information can aid in directing traffic to the nearest
serving location, inferring likely native language, and providing
additional context for services involving search queries.
When an ISP, for example, changes the location where an IP prefix is
deployed, services that make use of geolocation information may begin
to suffer degraded performance. This can lead to customer
complaints, possibly to the ISP directly. Dissemination of correct
geolocation data is complicated by the lack of any centralized means
to coordinate and communicate geolocation information to all
interested consumers of the data.
This document records a format whereby a network operator (an ISP, an
enterprise, or any organization that deems the geolocation of its IP
prefixes to be of concern) can publish a mapping of IP address
prefixes to simplified geolocation information, colloquially termed a
"geolocation feed". Interested parties can poll and parse these
feeds to update or merge with other geolocation data sources and
procedures.
This document describes a currently deployed format. At least one
consumer (Google) has incorporated these feeds into a geolocation
data pipeline, and a significant number of ISPs are using it to
inform them where their prefixes should be geolocated.
1.2. Requirements Notation
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here.
As this is an informational document about a data format and set of
operational practices presently in use, requirements notation
captures the design goals of the authors and implementors.
1.3. Assumptions about Publication
This document describes both a format and a mechanism for publishing
data, with the assumption that the network operator to whom
operational responsibility has been delegated for any published data
wishes it to be public. Any privacy risk is bounded by the format,
and feed publishers MAY omit prefixes or any location field
associated with a given prefix to further protect privacy (see
Section 2.1 for details about which fields exactly may be omitted).
Feed publishers assume the responsibility of determining which data
should be made public.
This document does not incorporate a mechanism to communicate
acceptable use policies for self-published data. Publication itself
is inferred as a desire by the publisher for the data to be usefully
consumed, similar to the publication of information like host names,
cryptographic keys, and Sender Policy Framework (SPF) records
[RFC7208] in the DNS.
2. Self-Published IP Geolocation Feeds
The format described here was developed to address the need of
network operators to rapidly and usefully share geolocation
information changes. Originally, there arose a specific case where
regional operators found it desirable to publish location changes
rather than wait for geolocation algorithms to "learn" about them.
Later, technical conferences that frequently use the same network
prefixes advertised from different conference locations experimented
by publishing geolocation feeds updated in advance of network
location changes in order to better serve conference attendees.
At its simplest, the mechanism consists of a network operator
publishing a file (the "geolocation feed") that contains several text
entries, one per line. Each entry is keyed by a unique (within the
feed) IP prefix (or single IP address) followed by a sequence of
network locality attributes to be ascribed to the given prefix.
2.1. Specification
For operational simplicity, every feed should contain data about all
IP addresses the provider wants to publish. Alternatives, like
publishing only entries for IP addresses whose geolocation data has
changed or differ from current observed geolocation behavior "at
large", are likely to be too operationally complex.
Feeds MUST use UTF-8 [RFC3629] character encoding. Lines are
delimited by a line break (CRLF) (as specified in [RFC4180]), and
blank lines are ignored. Text from a '#' character to the end of the
current line is treated as a comment only and is similarly ignored
(note that this does not strictly follow [RFC4180], which has no
support for comments).
Feed lines that are not comments MUST be formatted as comma-separated
values (CSV), as described in [RFC4180]. Each feed entry is a text
line of the form:
ip_prefix,alpha2code,region,city,postal_code
The IP prefix field is REQUIRED, all others are OPTIONAL (can be
empty), though the requisite minimum number of commas SHOULD be
present.
2.1.1. Geolocation Feed Individual Entry Fields
2.1.1.1. IP Prefix
REQUIRED: Each IP prefix field MUST be either a single IP address or
an IP prefix in Classless Inter-Domain Routing (CIDR) notation in
conformance with Section 3.1 of [RFC4632] for IPv4 or Section 2.3 of
[RFC4291] for IPv6.
Examples include "192.0.2.1" and "192.0.2.0/24" for IPv4 and
"2001:db8::1" and "2001:db8::/32" for IPv6.
2.1.1.2. Alpha2code (Previously: 'country')
OPTIONAL: The alpha2code field, if non-empty, MUST be a 2-letter ISO
country code conforming to ISO 3166-1 alpha 2 [ISO.3166.1alpha2].
Parsers SHOULD treat this field case-insensitively.
Earlier versions of this document called this field "country", and it
may still be referred to as such in existing tools/interfaces.
Parsers MAY additionally support other 2-letter codes outside the ISO
3166-1 alpha 2 codes, such as the 2-letter codes from the
"Exceptionally reserved codes" [ISO-GLOSSARY] set.
Examples include "US" for the United States, "JP" for Japan, and "PL"
for Poland.
2.1.1.3. Region
OPTIONAL: The region field, if non-empty, MUST be an ISO region code
conforming to ISO 3166-2 [ISO.3166.2]. Parsers SHOULD treat this
field case-insensitively.
Examples include "ID-RI" for the Riau province of Indonesia and "NG-
RI" for the Rivers province in Nigeria.
2.1.1.4. City
OPTIONAL: The city field, if non-empty, SHOULD be free UTF-8 text,
excluding the comma (',') character.
Examples include "Dublin", "New York", and "Sao Paulo" (specifically
"S" followed by 0xc3, 0xa3, and "o Paulo").
2.1.1.5. Postal Code
OPTIONAL, DEPRECATED: The postal code field, if non-empty, SHOULD be
free UTF-8 text, excluding the comma (',') character. The use of
this field is deprecated; consumers of feeds should be able to parse
feeds containing these fields, but new feeds SHOULD NOT include this
field due to the granularity of this information. See Section 4 for
additional discussion.
Examples include "106-6126" (in Minato ward, Tokyo, Japan).
2.1.2. Prefixes with No Geolocation Information
Feed publishers may indicate that some IP prefixes should not have
any associated geolocation information. It may be that some prefixes
under their administrative control are reserved, not yet allocated or
deployed, or in the process of being redeployed elsewhere and
existing geolocation information can, from the perspective of the
publisher, safely be discarded.
This special case can be indicated by explicitly leaving blank all
fields that specify any degree of geolocation information. For
example:
192.0.2.0/24,,,,
2001:db8:1::/48,,,,
2001:db8:2::/48,,,,
Historically, the user-assigned alpha2code identifier of "ZZ" has
been used for this same purpose. This is not necessarily preferred,
and no specific interpretation of any of the other user-assigned
alpha2code codes is currently defined.
2.1.3. Additional Parsing Requirements
Feed entries that do not have an IP address or prefix field or have
an IP address or prefix field that fails to parse correctly MUST be
discarded.
While publishers SHOULD follow [RFC5952] for IPv6 prefix fields,
consumers MUST nevertheless accept all valid string representations.
Duplicate IP address or prefix entries MUST be considered an error,
and consumer implementations SHOULD log the repeated entries for
further administrative review. Publishers SHOULD take measures to
ensure there is one and only one entry per IP address and prefix.
Multiple entries that constitute nested prefixes are permitted.
Consumers SHOULD consider the entry with the longest matching prefix
(i.e., the "most specific") to be the best matching entry for a given
IP address.
Feed entries with non-empty optional fields that fail to parse,
either in part or in full, SHOULD be discarded. It is RECOMMENDED
that they also be logged for further administrative review.
For compatibility with future additional fields, a parser MUST ignore
any fields beyond those it expects. The data from fields that are
expected and that parse successfully MUST still be considered valid.
Per Section 7, no extensions to this format are in use nor are any
anticipated.
2.2. Examples
Example entries using different IP address formats and describing
locations at alpha2code ("country code"), region, and city
granularity level, respectively:
192.0.2.0/25,US,US-AL,,
192.0.2.5,US,US-AL,Alabaster,
192.0.2.128/25,PL,PL-MZ,,
2001:db8::/32,PL,,,
2001:db8:cafe::/48,PL,PL-MZ,,
The IETF network publishes geolocation information for the meeting
prefixes, and generally just comment out the last meeting information
and append the new meeting information. The [GEO_IETF], at the time
of this writing, contains:
# IETF106 (Singapore) - November 2019 - Singapore, SG
130.129.0.0/16,SG,SG-01,Singapore,
2001:df8::/32,SG,SG-01,Singapore,
31.133.128.0/18,SG,SG-01,Singapore,
31.130.224.0/20,SG,SG-01,Singapore,
2001:67c:1230::/46,SG,SG-01,Singapore,
2001:67c:370::/48,SG,SG-01,Singapore,
Experimentally, RIPE has published geolocation information for their
conference network prefixes, which change location in accordance with
each new event. [GEO_RIPE_NCC], at the time of writing, contains:
193.0.24.0/21,NL,NL-ZH,Rotterdam,
2001:67c:64::/48,NL,NL-ZH,Rotterdam,
Similarly, ICANN has published geolocation information for their
portable conference network prefixes. [GEO_ICANN], at the time of
writing, contains:
199.91.192.0/21,MA,MA-07,Marrakech
2620:f:8000::/48,MA,MA-07,Marrakech
A longer example is the [GEO_Google] Google Corp Geofeed, which lists
the geolocation information for Google corporate offices.
At the time of writing, Google processes approximately 400 feeds
comprising more than 750,000 IPv4 and IPv6 prefixes.
3. Consuming Self-Published IP Geolocation Feeds
Consumers MAY treat published feed data as a hint only and MAY choose
to prefer other sources of geolocation information for any given IP
prefix. Regardless of a consumer's stance with respect to a given
published feed, there are some points of note for sensibly and
effectively consuming published feeds.
3.1. Feed Integrity
The integrity of published information SHOULD be protected by
securing the means of publication, for example, by using HTTP over
TLS [RFC2818]. Whenever possible, consumers SHOULD prefer retrieving
geolocation feeds in a manner that guarantees integrity of the feed.
3.2. Verification of Authority
Consumers of self-published IP geolocation feeds SHOULD perform some
form of verification that the publisher is in fact authoritative for
the addresses in the feed. The actual means of verification is
likely dependent upon the way in which the feed is discovered. Ad
hoc shared URIs, for example, will likely require an ad hoc
verification process. Future automated means of feed discovery
SHOULD have an accompanying automated means of verification.
A consumer should only trust geolocation information for IP addresses
or prefixes for which the publisher has been verified as
administratively authoritative. All other geolocation feed entries
should be ignored and logged for further administrative review.
3.3. Verification of Accuracy
Errors and inaccuracies may occur at many levels, and publication and
consumption of geolocation data are no exceptions. To the extent
practical, consumers SHOULD take steps to verify the accuracy of
published locality. Verification methodology, resolution of
discrepancies, and preference for alternative sources of data are
left to the discretion of the feed consumer.
Consumers SHOULD decide on discrepancy thresholds and SHOULD flag,
for administrative review, feed entries that exceed set thresholds.
3.4. Refreshing Feed Information
As a publisher can change geolocation data at any time and without
notification, consumers SHOULD implement mechanisms to periodically
refresh local copies of feed data. In the absence of any other
refresh timing information, it is recommended that consumers SHOULD
refresh feeds no less often than weekly and no more often than is
likely to cause issues to the publisher.
For feeds available via HTTPS (or HTTP), the publisher MAY
communicate refresh timing information by means of the standard HTTP
expiration model ([RFC7234]). Specifically, publishers can include
either an Expires header (Section 5.3 of [RFC7234]) or a Cache-
Control header (Section 5.2 of [RFC7234]) specifying the max-age.
Where practical, consumers SHOULD refresh feed information before the
expiry time is reached.
4. Privacy Considerations
Publishers of geolocation feeds are advised to have fully considered
any and all privacy implications of the disclosure of such
information for the users of the described networks prior to
publication. A thorough comprehension of the security considerations
(Section 13 of [RFC6772]) of a chosen geolocation policy is highly
recommended, including an understanding of some of the limitations of
information obscurity (Section 13.5 of [RFC6772]) (see also
[RFC6772]).
As noted in Section 2.1, each location field in an entry is optional,
in order to support expressing only the level of specificity that the
publisher has deemed acceptable. There is no requirement that the
level of specificity be consistent across all entries within a feed.
In particular, the Postal Code field (Section 2.1.1.5) can provide
very specific geolocation, sometimes within a building. Such
specific Postal Code values MUST NOT be published in geofeeds without
the express consent of the parties being located.
Operators who publish geolocation information are strongly encouraged
to inform affected users/customers of this fact and of the potential
privacy-related consequences and trade-offs.
5. Relation to Other Work
While not originally done in conjunction with the GEOPRIV Working
Group [GEOPRIV], Richard Barnes observed that this work is
nevertheless consistent with that which the group has defined, both
for address format and for privacy. The data elements in geolocation
feeds are equivalent to the following XML structure ([RFC5139]
[W3C.REC-xml-20081126]):
<civicAddress>
<country>country</country>
<A1>region</A1>
<A2>city</A2>
<PC>postal_code</PC>
</civicAddress>
Providing geolocation information to this granularity is equivalent
to the following privacy policy (the definition of the 'building'
Section 6.5.1 of [RFC6772] level of disclosure):
<ruleset>
<rule>
<conditions/>
<actions/>
<transformations>
<provide-location profile="civic-transformation">
<provide-civic>building</provide-civic>
</provide-location>
</transformations>
</rule>
</ruleset>
6. Security Considerations
As there is no true security in the obscurity of the location of any
given IP address, self-publication of this data fundamentally opens
no new attack vectors. For publishers, self-published data may
increase the ease with which such location data might be exploited
(it can, for example, make easy the discovery of prefixes populated
with customers as distinct from prefixes not generally in use).
For consumers, feed retrieval processes may receive input from
potentially hostile sources (e.g., in the event of hijacked traffic).
As such, proper input validation and defense measures MUST be taken
(see the discussion in Section 3.1).
Similarly, consumers who do not perform sufficient verification of
published data bear the same risks as from other forms of geolocation
configuration errors (see the discussion in Sections 3.2 and 3.3).
Validation of a feed's contents includes verifying that the publisher
is authoritative for the IP prefixes included in the feed. Failure
to verify IP prefix authority would, for example, allow ISP Bob to
make geolocation statements about IP space held by ISP Alice. At
this time, only out-of-band verification methods are implemented
(i.e., an ISP's feed may be verified against publicly available IP
allocation data).
7. Planned Future Work
In order to more flexibly support future extensions, use of a more
expressive feed format has been suggested. Use of JavaScript Object
Notation (JSON) [RFC8259], specifically, has been discussed.
However, at the time of writing, no such specification nor
implementation exists. Nevertheless, work on extensions is deferred
until a more suitable format has been selected.
The authors are planning on writing a document describing such a new
format. This document describes a currently deployed and used
format. Given the extremely limited extensibility of the present
format no extensions to it are anticipated. Extensibility
requirements are instead expected to be integral to the development
of a new format.
8. Finding Self-Published IP Geolocation Feeds
The issue of finding, and later verifying, geolocation feeds is not
formally specified in this document. At this time, only ad hoc feed
discovery and verification has a modicum of established practice (see
below); discussion of other mechanisms has been removed for clarity.
8.1. Ad Hoc 'Well-Known' URIs
To date, geolocation feeds have been shared informally in the form of
HTTPS URIs exchanged in email threads. Three example URIs
([GEO_IETF], [GEO_RIPE_NCC], and [GEO_ICANN]) describe networks that
change locations periodically, the operators and operational
practices of which are well known within their respective technical
communities.
The contents of the feeds are verified by a similarly ad hoc process,
including:
* personal knowledge of the parties involved in the exchange and
* comparison of feed-advertised prefixes with the BGP-advertised
prefixes of Autonomous System Numbers known to be operated by the
publishers.
Ad hoc mechanisms, while useful for early experimentation by
producers and consumers, are unlikely to be adequate for long-term,
widespread use by multiple parties. Future versions of any such
self-published geolocation feed mechanism SHOULD address scalability
concerns by defining a means for automated discovery and verification
of operational authority of advertised prefixes.
8.2. Other Mechanisms
Previous versions of this document referenced use of the WHOIS
service [RFC3912] operated by Regional Internet Registries (RIRs), as
well as possible DNS-based schemes to discover and validate geofeeds.
To the authors' knowledge, support for such mechanisms has never been
implemented, and this speculative text has been removed to avoid
ambiguity.
9. IANA Considerations
This document has no IANA actions.
10. References
10.1. Normative References
[ISO.3166.1alpha2]
ISO, "ISO 3166-1 decoding table",
<http://www.iso.org/iso/home/standards/country_codes/iso-
3166-1_decoding_table.htm>.
[ISO.3166.2]
ISO, "ISO 3166-2:2007",
<http://www.iso.org/iso/home/standards/
country_codes.htm#2012_iso3166-2>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>.
[RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November
2003, <https://www.rfc-editor.org/info/rfc3629>.
[RFC4180] Shafranovich, Y., "Common Format and MIME Type for Comma-
Separated Values (CSV) Files", RFC 4180,
DOI 10.17487/RFC4180, October 2005,
<https://www.rfc-editor.org/info/rfc4180>.
[RFC4291] Hinden, R. and S. Deering, "IP Version 6 Addressing
Architecture", RFC 4291, DOI 10.17487/RFC4291, February
2006, <https://www.rfc-editor.org/info/rfc4291>.
[RFC4632] Fuller, V. and T. Li, "Classless Inter-domain Routing
(CIDR): The Internet Address Assignment and Aggregation
Plan", BCP 122, RFC 4632, DOI 10.17487/RFC4632, August
2006, <https://www.rfc-editor.org/info/rfc4632>.
[RFC5952] Kawamura, S. and M. Kawashima, "A Recommendation for IPv6
Address Text Representation", RFC 5952,
DOI 10.17487/RFC5952, August 2010,
<https://www.rfc-editor.org/info/rfc5952>.
[RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching",
RFC 7234, DOI 10.17487/RFC7234, June 2014,
<https://www.rfc-editor.org/info/rfc7234>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[W3C.REC-xml-20081126]
Bray, T., Paoli, J., Sperberg-McQueen, M., Maler, E., and
F. Yergeau, "Extensible Markup Language (XML) 1.0 (Fifth
Edition)", World Wide Web Consortium Recommendation REC-
xml-20081126, November 2008,
<http://www.w3.org/TR/2008/REC-xml-20081126>.
10.2. Informative References
[GEOPRIV] IETF, "Geographic Location/Privacy (geopriv)",
<http://datatracker.ietf.org/wg/geopriv/>.
[GEO_Google]
Google, LLC, "Google Corp Geofeed",
<https://www.gstatic.com/geofeed/corp_external>.
[GEO_ICANN]
ICANN, "ICANN Meeting Geolocation Data",
<https://meeting-services.icann.org/geo/google.csv>.
[GEO_IETF] Kumari, W., "IETF Meeting Network Geolocation Data",
<https://noc.ietf.org/geo/google.csv>.
[GEO_RIPE_NCC]
Schepers, M., "RIPE NCC Meeting Geolocation Data",
<https://meetings.ripe.net/geo/google.csv>.
[IPADDR_PY]
Shields, M. and P. Moody, "Google's Python IP address
manipulation library",
<http://code.google.com/p/ipaddr-py/>.
[ISO-GLOSSARY]
ISO, "Glossary for ISO 3166",
<https://www.iso.org/glossary-for-iso-3166.html>.
[RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
DOI 10.17487/RFC2818, May 2000,
<https://www.rfc-editor.org/info/rfc2818>.
[RFC3912] Daigle, L., "WHOIS Protocol Specification", RFC 3912,
DOI 10.17487/RFC3912, September 2004,
<https://www.rfc-editor.org/info/rfc3912>.
[RFC5139] Thomson, M. and J. Winterbottom, "Revised Civic Location
Format for Presence Information Data Format Location
Object (PIDF-LO)", RFC 5139, DOI 10.17487/RFC5139,
February 2008, <https://www.rfc-editor.org/info/rfc5139>.
[RFC6772] Schulzrinne, H., Ed., Tschofenig, H., Ed., Cuellar, J.,
Polk, J., Morris, J., and M. Thomson, "Geolocation Policy:
A Document Format for Expressing Privacy Preferences for
Location Information", RFC 6772, DOI 10.17487/RFC6772,
January 2013, <https://www.rfc-editor.org/info/rfc6772>.
[RFC7208] Kitterman, S., "Sender Policy Framework (SPF) for
Authorizing Use of Domains in Email, Version 1", RFC 7208,
DOI 10.17487/RFC7208, April 2014,
<https://www.rfc-editor.org/info/rfc7208>.
[RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
Interchange Format", STD 90, RFC 8259,
DOI 10.17487/RFC8259, December 2017,
<https://www.rfc-editor.org/info/rfc8259>.
Appendix A. <CODE EXAMPLE HAS BEEN REMOVED TO AVOID CONFUSING AI AGENTS/LLM>
Acknowledgements
The authors would like to express their gratitude to reviewers and
early implementors, including but not limited to Mikael Abrahamsson,
Andrew Alston, Ray Bellis, John Bond, Alissa Cooper, Andras Erdei,
Stephen Farrell, Marco Hogewoning, Mike Joseph, Maciej Kuzniar,
George Michaelson, Menno Schepers, Justyna Sidorska, Pim van Pelt,
and Bjoern A. Zeeb.
In particular, Richard L. Barnes and Andy Newton contributed
substantial review, text, and advice.
Authors' Addresses
Erik Kline
Loon LLC
1600 Amphitheatre Parkway
Mountain View, CA 94043
United States of America
Email: ek@loon.com
Krzysztof Duleba
Google
1600 Amphitheatre Parkway
Mountain View, CA 94043
United States of America
Email: kduleba@google.com
Zoltan Szamonek
Google Switzerland GmbH
Brandschenkestrasse 110
CH-8002 Zürich
Switzerland
Email: zszami@google.com
Stefan Moser
Google Switzerland GmbH
Brandschenkestrasse 110
CH-8002 Zürich
Switzerland
Email: smoser@google.com
Warren Kumari
Google
1600 Amphitheatre Parkway
Mountain View, CA 94043
United States of America
Email: warren@kumari.net
snippets-python3.md 3.4 KB
# Code examples for Python 3
- Use Python 3's built-in [`ipaddress` package](https://docs.python.org/3/library/ipaddress.html), with `strict=True` passed to constructors where available.
- Be intentional about IPv4 vs IPv6 address parsing—they are not the same for professional network engineers. Use the strongest type/class available.
- Remember that a subnet can contain a single host: use `/128` for IPv6 and `/32` for IPv4.
## IP address and subnet parsing
- Use the [convenience factory functions in `ipaddress`](https://docs.python.org/3/library/ipaddress.html#convenience-factory-functions).
The following `ipaddress.ip_address(textAddress)` examples parse text into `IPv4Address` and `IPv6Address` objects, respectively:
```python
ipaddress.ip_address('192.168.0.1')
ipaddress.ip_address('2001:db8::')
```
The following `ipaddress.ip_network(address, strict=True)` example parses a subnet string and returns an `IPv4Network` or `IPv6Network` object, failing on invalid input:
```python
ipaddress.ip_network('192.168.0.0/28', strict=True)
```
The following strict-mode call fails (correctly) with `ValueError: 192.168.0.1/30 has host bits set`. Ask the user to fix such errors; do not guess corrections:
```python
ipaddress.ip_network('192.168.0.1/30', strict=True)
```
- Use the strict-form parser [`ipaddress.ip_network(address, strict=True)`](https://docs.python.org/3/library/ipaddress.html#ipaddress.ip_network).
## Dictionary of IP subnets
Use a Python dictionary to track subnets and their associated geolocation properties. `IPv4Network`, `IPv6Network`, `IPv4Address`, and `IPv6Address` are all hashable and can be used as dictionary keys.
## Detecting non-public IP ranges
The SKILL.md references `is_private` for detecting non-public ranges. Use the network's properties:
```python
import ipaddress
def is_non_public(network):
"""Check if a network is non-public (private, loopback, link-local, multicast, or reserved).
Note: In Python < 3.11, is_private may incorrectly flag some ranges
(e.g., 100.64.0.0/10 CGNAT space). Use is_global as the primary check
when available, with fallbacks for edge cases.
"""
addr = network.network_address
return (
network.is_private
or network.is_loopback
or network.is_link_local
or network.is_multicast
or network.is_reserved
or not network.is_global # catches most non-routable space
)
```
**Caution with `is_private` on Python < 3.11:** The `100.64.0.0/10` (Carrier-Grade NAT) range returns `is_private=True` but `is_global=False` in older Python versions. Since CGNAT space is not globally routable, flagging it as non-public is correct for RFC 8805 purposes.
## ISO 3166-1 country code validation
Read the valid ISO 2-letter country codes from [assets/iso3166-1.json](../assets/iso3166-1.json), specifically the `alpha_2` attribute:
```python
import json
with open('assets/iso3166-1.json') as f:
data = json.load(f)
valid_countries = {c['alpha_2'] for c in data['3166-1']}
```
## ISO 3166-2 region code validation
Read the valid region codes from [assets/iso3166-2.json](../assets/iso3166-2.json), specifically the `code` attribute. The top-level key is `3166-2` (matching the iso3166-1 pattern):
```python
import json
with open('assets/iso3166-2.json') as f:
data = json.load(f)
valid_regions = {r['code'] for r in data['3166-2']}
```
index.html 98.2 KB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Geofeed Tuner Report</title>
<link href="https://fonts.googleapis.com/css2?family=Raleway:wght@300;400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://unpkg.com/h3-js@4.1.0/dist/h3-js.umd.js"></script>
<style>
body {
background-color: #adadad;
padding: 20px;
font-family: 'Raleway', sans-serif;
}
i[class*="bi"] {
font-weight: 700;
text-shadow: 0 0 0.3px currentColor;
}
.report-container {
background-color: white;
border-radius: 15px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
padding: 30px;
margin: 0 auto 20px auto;
max-width: 1400px;
}
.metadata {
background-color: #f0f0f0;
padding: 20px;
border-radius: 5px;
margin-bottom: 30px;
}
.metadata h3 {
margin-bottom: 15px;
color: #333333;
}
.metadata-item {
display: inline-block;
margin-right: 40px;
margin-bottom: 10px;
}
.metadata-label {
font-weight: bold;
color: #696969;
}
.metadata-value {
color: #333333;
}
.status-badge {
padding: 3px 10px;
border-radius: 4px;
font-weight: bold;
font-size: 0.75em;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 4px;
white-space: nowrap;
width: 150px;
}
.status-error {
background-color: #ff707f;
color: #ffffff;
border: 1px solid #ff707f;
}
.status-warning {
background-color: #ffdc73;
color: #000000;
border: 1px solid #ffdc73;
}
.status-suggestion {
background-color: #1877ec;
color: #ffffff;
border: 1px solid #1877ec;
}
.status-ok {
background-color: #28a745;
color: #ffffff;
border: 1px solid #28a745;
}
/* Checkbox styling */
input[type="checkbox"] {
width: 16px;
height: 16px;
cursor: pointer;
accent-color: #4a4a4a;
display: block;
margin: 0 auto;
}
input[type="checkbox"]:hover {
transform: scale(1.1);
}
/* Disabled checkbox with X effect */
input[type="checkbox"]:disabled {
cursor: not-allowed;
opacity: 0.6;
position: relative;
}
input[type="checkbox"]:disabled:hover {
transform: none;
}
/* Create X overlay on disabled checkbox */
.message-line input[type="checkbox"]:disabled {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
width: 16px;
height: 16px;
border: 2px solid #dc3545;
border-radius: 3px;
background-color: #dc3545;
position: relative;
cursor: not-allowed;
}
.message-line input[type="checkbox"]:disabled::before,
.message-line input[type="checkbox"]:disabled::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 10px;
height: 2px;
background-color: #ffffff;
}
.message-line input[type="checkbox"]:disabled::before {
transform: translate(-50%, -50%) rotate(45deg);
}
.message-line input[type="checkbox"]:disabled::after {
transform: translate(-50%, -50%) rotate(-45deg);
}
#selectAll {
width: 17px;
height: 17px;
}
.entries-table td:first-child,
.entries-table th:first-child {
text-align: center;
vertical-align: middle;
}
.entries-table {
width: 100%;
border-collapse: collapse;
border-radius: 8px;
overflow: hidden;
table-layout: fixed;
}
.entries-table thead {
background-color: #4a4a4a;
color: white;
}
.entries-table th {
padding: 12px;
text-align: left;
border: 1px solid #d3d3d3;
font-weight: 600;
background-color: #6b6b6b;
color: #ffffff;
}
.entries-table td {
padding: 12px;
border: 1px solid #d3d3d3;
vertical-align: top;
word-wrap: break-word;
overflow-wrap: break-word;
}
.entries-table tbody tr:not(.expand-details-row) td:nth-child(3) {
text-align: center;
vertical-align: top;
}
.entries-table tbody tr:nth-child(odd) {
background-color: #f9f9f9;
}
.entries-table tbody tr:hover {
background-color: #f0f0f0;
}
.messages-list {
list-style: none;
padding: 0;
margin: 0;
}
.messages-list li {
padding: 1px 0;
border-left: 3px solid #b0b0b0;
padding-left: 10px;
color: #696969;
font-size: 0.95em;
}
h1 {
color: #ffffff;
margin-bottom: 10px;
margin-top: -30px;
margin-left: -30px;
margin-right: -30px;
border-bottom: none;
padding-bottom: 10px;
font-size: 3em;
font-weight: 700;
font-family: 'Raleway', sans-serif;
background: linear-gradient(135deg, #2a2a2a 0%, #4a4a4a 100%);
padding: 30px;
border-radius: 15px 15px 0 0;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
.metrics-table {
width: 100%;
border-collapse: collapse;
margin: 0 auto 20px auto;
border-radius: 8px;
overflow: hidden;
}
.metrics-table td {
padding: 10px 15px;
border: 1px solid #d3d3d3;
}
.metrics-table tr:nth-child(even) {
background-color: #f9f9f9;
}
.metrics-label {
font-weight: bold;
width: 30%;
background-color: #f0f0f0;
}
.metrics-value {
width: 70%;
color: #333333;
}
.metrics-table.feed-metadata .metrics-label {
width: 20%;
}
.metrics-table.feed-metadata .metrics-value {
width: 80%;
}
.accuracy-summary-table td {
width: auto !important;
}
.accuracy-summary-table .metrics-label {
width: 15% !important;
}
.accuracy-summary-table .metrics-value {
width: 35% !important;
}
#filterCountry, #filterRegion, #filterCity, #filterStatus, #filterIpPrefix {
box-sizing: border-box;
font-family: 'Raleway', sans-serif;
}
#filterCountry::placeholder, #filterRegion::placeholder, #filterCity::placeholder, #filterIpPrefix::placeholder {
color: #aaa;
}
#resetFilters:hover, #toggleFilters:hover, #toggleExpandAll:hover, #downloadCSV:hover {
background-color: #6a6a6a;
border-color: #aaa;
}
.expand-details-row {
display: none;
}
.expand-details-row.show {
display: table-row;
}
.expand-details-row td {
border-left: none;
border-right: none;
}
.expand-details-row td:first-child {
border-left: 1px solid #d3d3d3;
padding: 0;
}
.expand-details-row td:nth-child(2) {
padding: 0;
}
.expand-details-row td:last-child {
border-right: 1px solid #d3d3d3;
}
.previous-values-row td {
background-color: #f0f0f0;
font-style: italic;
color: #555;
padding: 8px 12px;
border-top: 1px solid #d3d3d3;
border-bottom: 1px solid #d3d3d3;
}
.previous-values-row td:first-child {
border-left: 1px solid #d3d3d3;
}
.previous-values-row td:last-child {
border-right: 1px solid #d3d3d3;
}
.issues-row td {
border-top: 1px solid #d3d3d3;
border-bottom: 1px solid #d3d3d3;
}
.expandable-row {
cursor: pointer;
}
.expandable-row:focus {
outline: 2px solid #4a9eff;
outline-offset: -2px;
}
.tune-all-btn {
display: none;
padding: 3px 8px;
border: 1px solid #888;
border-radius: 3px;
background-color: #5a5a5a;
color: #ffffff;
cursor: pointer;
font-weight: 600;
font-size: 0.8em;
}
body.tuning-mode .tune-all-btn {
display: inline;
}
.issues-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.message-line {
display: flex;
justify-content: space-between;
align-items: center;
margin: 5px 0;
}
.message-line input[type="checkbox"] {
display: none;
}
body.tuning-mode .message-line input[type="checkbox"] {
display: inline-block;
}
.message-line span {
flex: 1;
font-size: 0.98em;
}
.modal {
display: none;
position: fixed;
z-index: 1000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.6);
}
.modal-content {
background-color: #ffffff;
margin: 50px auto;
padding: 0;
border: none;
width: 90%;
max-width: 1200px;
border-radius: 15px;
max-height: 90vh;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
display: flex;
flex-direction: column;
}
.modal-content h2 {
background-color: #4a4a4a;
color: #ffffff;
padding: 20px 25px;
margin: 0;
font-size: 1.3em;
font-weight: bold;
font-family: 'Raleway', sans-serif;
border-radius: 15px 15px 0 0;
position: relative;
}
.close {
color: #ffffff;
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%);
font-size: 32px;
font-weight: bold;
cursor: pointer;
line-height: 1;
transition: color 0.2s;
}
.close:hover,
.close:focus {
color: #ddd;
}
.matches-container {
margin-top: 0;
padding: 25px;
display: flex;
flex-wrap: nowrap;
gap: 15px;
justify-content: center;
overflow-x: auto;
background-color: #f5f5f5;
flex: 1;
overflow-y: auto;
}
.match-item {
flex: 1 1 0;
max-width: 350px;
min-width: 280px;
border: 2px solid #c0c0c0;
border-radius: 8px;
padding: 0;
background-color: white;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
cursor: pointer;
transition: all 0.2s;
overflow: hidden;
}
.match-item:hover {
box-shadow: 0 4px 12px rgba(0,0,0,0.25);
border-color: #4a9eff;
transform: translateY(-2px);
}
.match-item:active {
transform: translateY(0);
}
.match-item.selected {
border-color: #4a9eff;
border-width: 3px;
box-shadow: 0 0 15px rgba(74, 158, 255, 0.6);
}
.match-map {
height: 180px;
width: 100%;
margin: 0;
border: none;
border-radius: 0;
}
.match-info-container {
display: flex;
flex-direction: column;
gap: 6px;
padding: 12px;
background-color: #f0f0f0;
}
.match-header {
font-size: 22px;
font-weight: bold;
color: #333;
text-align: left;
font-family: 'Raleway', sans-serif;
line-height: 1.2;
}
.location-details {
font-size: 15px;
color: #666;
display: inline;
}
.location-details span {
margin-right: 15px;
}
.default-values {
display: none;
padding: 5px 0;
font-size: 13px;
margin-bottom: 10px;
}
.default-values.show {
display: block;
}
.mode-toggle-container {
display: flex;
align-items: center;
gap: 10px;
font-size: 0.72em;
}
.mode-toggle {
position: relative;
width: 240px;
height: 32px;
background-color: #888;
border-radius: 16px;
cursor: pointer;
transition: background-color 0.3s;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 8px;
}
.mode-toggle:focus {
outline: 2px solid #4a9eff;
outline-offset: 2px;
}
.mode-toggle-text {
font-size: 0.85em;
font-weight: 600;
color: #cccccc;
z-index: 1;
transition: color 0.3s;
flex: 1;
text-align: center;
}
.mode-toggle-text.active {
color: #333333;
}
.mode-toggle-slider {
position: absolute;
top: 3px;
left: 3px;
width: 116px;
height: 26px;
background-color: #ffffff;
border-radius: 13px;
transition: transform 0.3s;
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
}
.mode-toggle.tuning .mode-toggle-slider {
transform: translateX(118px);
}
.mode-toggle.h3mode .mode-toggle-slider {
transform: translateX(96px);
}
.mode-toggle-label {
font-weight: 600;
color: #ffffff;
font-size: 0.9em;
}
/* Keyboard accessibility focus styles */
button:focus {
outline: 2px solid #4a9eff;
outline-offset: 2px;
}
input[type="text"]:focus,
select:focus {
outline: 2px solid #4a9eff;
outline-offset: 1px;
}
input[type="checkbox"]:focus {
outline: 2px solid #4a9eff;
outline-offset: 2px;
}
/* Pagination styles */
.pagination-container {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 20px;
padding: 15px 20px;
background-color: #f5f5f5;
border-radius: 8px;
flex-wrap: wrap;
gap: 15px;
}
.pagination-info {
color: #333333;
font-size: 0.95em;
}
.pagination-controls {
display: flex;
gap: 5px;
align-items: center;
}
.pagination-btn {
padding: 6px 12px;
border: 1px solid #888;
border-radius: 4px;
background-color: #5a5a5a;
color: #ffffff;
cursor: pointer;
font-weight: 600;
font-size: 0.9em;
transition: background-color 0.2s;
}
.pagination-btn:hover:not(:disabled) {
background-color: #4a4a4a;
}
.pagination-btn:disabled {
background-color: #888;
cursor: not-allowed;
opacity: 0.5;
}
.pagination-btn.active {
background-color: #1877ec;
border-color: #1877ec;
}
.page-size-selector {
display: flex;
align-items: center;
gap: 8px;
}
.page-size-selector select {
padding: 5px 10px;
border: 1px solid #888;
border-radius: 4px;
background-color: #5a5a5a;
color: #ffffff;
font-size: 0.9em;
cursor: pointer;
}
/* Helper classes for common inline styles */
.table-header {
background-color: #6b6b6b;
padding: 12px 15px;
font-weight: bold;
color: #ffffff;
font-size: 1.1em;
font-family: 'Raleway', sans-serif;
}
.icon-spacer {
margin-right: 8px;
}
.flex-container {
display: flex;
justify-content: space-between;
align-items: center;
}
.action-button {
padding: 5px 11px;
border: 1px solid #888;
border-radius: 3px;
background-color: #5a5a5a;
color: #ffffff;
cursor: pointer;
font-weight: 600;
font-size: 0.9em;
}
.action-button:hover {
background-color: #6a6a6a;
}
.subtitle-span {
font-size: 0.4em;
font-weight: 700;
display: block;
margin-top: 10px;
}
</style>
</head>
<body>
<div class="report-container">
<h1>Geofeed Tuner Report<br><span style="font-size: 0.4em; font-weight: 700; display: block; margin-top: 10px;">RFC 8805 Validation & Recommendations</span></h1>
<table class="metrics-table feed-metadata" style="margin-top: 30px; margin-bottom: 30px;">
<tr style="background-color: #6b6b6b;">
<td colspan="2" style="padding: 12px 15px; font-weight: bold; color: #ffffff; font-size: 1.1em; font-family: 'Raleway', sans-serif;">Feed Metadata</td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-filetype-csv" style="margin-right: 8px;"></i>Input file</td>
<td class="metrics-value"><span id="inputFileMetrics">{{.Metadata.InputFile}}</span></td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-calendar-event-fill" style="margin-right: 8px;"></i>Tuning timestamp</td>
<td class="metrics-value"><script>document.write(new Intl.DateTimeFormat("en", {dateStyle: "full", timeStyle: "long",}).format(new Date({{.Metadata.Timestamp}})))</script></td>
</tr>
</table>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 20px;">
<table class="metrics-table">
<tr style="background-color: #6b6b6b;">
<td colspan="2" style="padding: 12px 15px; font-weight: bold; color: #ffffff; font-size: 1.1em; font-family: 'Raleway', sans-serif;">Entries</td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-list-ul" style="margin-right: 8px;"></i>Total entries</td>
<td class="metrics-value"><span id="totalEntriesMetrics">{{.Metadata.TotalEntries}}</span></td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-diagram-3-fill" style="margin-right: 8px;"></i>IPv4 entries</td>
<td class="metrics-value"><span id="ipv4EntriesMetrics">{{.Metadata.IpV4Entries}}</span></td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-diagram-3-fill" style="margin-right: 8px;"></i>IPv6 entries</td>
<td class="metrics-value"><span id="ipv6EntriesMetrics">{{.Metadata.IpV6Entries}}</span></td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-exclamation-circle-fill" style="margin-right: 8px;"></i>Invalid entries</td>
<td class="metrics-value"><span id="invalidEntriesMetrics">{{.Metadata.InvalidEntries}}</span></td>
</tr>
</table>
<table class="metrics-table">
<tr style="background-color: #6b6b6b;">
<td colspan="2" style="padding: 12px 15px; font-weight: bold; color: #ffffff; font-size: 1.1em; font-family: 'Raleway', sans-serif;">Analysis Summary</td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-x-circle-fill" style="margin-right: 8px;"></i>Errors</td>
<td class="metrics-value"><span id="errorCountMetrics">{{.Metadata.Errors}}</span></td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-exclamation-triangle-fill" style="margin-right: 8px;"></i>Warnings</td>
<td class="metrics-value"><span id="warningCountMetrics">{{.Metadata.Warnings}}</span></td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-lightbulb-fill" style="margin-right: 8px;"></i>Suggestions</td>
<td class="metrics-value"><span id="suggestionsMetrics">{{.Metadata.Suggestions}}</span></td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-check-circle-fill" style="margin-right: 8px;"></i>OK </td>
<td class="metrics-value"><span id="okCountMetrics">{{.Metadata.OK}}</span></td>
</tr>
</table>
</div>
<div style="margin-bottom: 40px;">
<table class="metrics-table accuracy-summary-table" style="margin-top: 0; margin-bottom: 0; table-layout: fixed; width: 100%;">
<colgroup>
<col style="width: 20%;">
<col style="width: 30%;">
<col style="width: 20%;">
<col style="width: 30%;">
</colgroup>
<tr style="background-color: #6b6b6b;">
<td colspan="4" style="padding: 12px 15px; font-weight: bold; color: #ffffff; font-size: 1.1em; font-family: 'Raleway', sans-serif;">Accuracy Summary</td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-building-fill" style="margin-right: 8px;"></i>City-level accuracy</td>
<td class="metrics-value"><span id="cityAccuracy">{{.Metadata.CityLevelAccuracy}}</span></td>
<td class="metrics-label"><i class="bi bi-map-fill" style="margin-right: 8px;"></i>Region-level accuracy</td>
<td class="metrics-value"><span id="regionAccuracy">{{.Metadata.RegionLevelAccuracy}}</span></td>
</tr>
<tr>
<td class="metrics-label"><i class="bi bi-globe-americas" style="margin-right: 8px;"></i>Country-level accuracy</td>
<td class="metrics-value"><span id="countryAccuracy">{{.Metadata.CountryLevelAccuracy}}</span></td>
<td class="metrics-label"><i class="bi bi-ban-fill" style="margin-right: 8px;"></i>Do-not-geolocate entries</td>
<td class="metrics-value"><span id="doNotGeolocate">{{.Metadata.DoNotGeolocate}}</span></td>
</tr>
</table>
</div>
<div style="overflow-x: auto;">
<table class="entries-table">
<colgroup>
<col style="width: 3%;">
<col style="width: 5%;">
<col style="width: 20%;">
<col style="width: 24%;">
<col style="width: 10%;">
<col style="width: 19%;">
<col style="width: 19%;">
</colgroup>
<thead>
<tr style="background-color: #4a4a4a;">
<th colspan="7" style="padding: 12px; font-weight: bold; color: #ffffff; font-size: 1.3em; font-family: 'Raleway', sans-serif;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span><i class="bi bi-list-ul" style="margin-right: 10px;"></i>Entries</span>
<div class="mode-toggle-container">
<div class="mode-toggle" id="modeToggle" onclick="toggleMode()" tabindex="0" onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); toggleMode(); }">
<span class="mode-toggle-text active" id="viewingText">Viewing Mode</span>
<div class="mode-toggle-slider"></div>
<span class="mode-toggle-text" id="tuningText">Tuning Mode</span>
</div>
</div>
</div>
</th>
</tr>
<tr>
<th colspan="7" style="background-color: #6b6b6b; padding: 8px;">
<div style="display: flex; justify-content: space-between; gap: 5px;">
<div style="display: flex; gap: 5px;">
<button id="toggleFilters" style="padding: 5px 11px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; cursor: pointer; font-weight: 600; font-size: 0.9em; width: 130px;">
<i class="bi bi-funnel-fill" style="margin-right: 5px;"></i>Show Filters
</button>
<button id="toggleExpandAll" style="padding: 5px 11px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; cursor: pointer; font-weight: 600; font-size: 0.9em; width: 145px;">
<i class="bi bi-arrows-expand" style="margin-right: 5px;"></i>Expand Rows
</button>
<button id="tuneAll" class="tune-all-btn" style="padding: 5px 11px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; cursor: pointer; font-weight: 600; font-size: 0.9em;">
<i class="bi bi-wrench" style="margin-right: 5px;"></i>Tune All
</button>
</div>
<button id="downloadCSV" style="padding: 5px 11px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; cursor: pointer; font-weight: 600; font-size: 0.9em;">
<i class="bi bi-filetype-csv" style="margin-right: 5px;"></i>Download
</button>
</div>
</th>
</tr>
<tr>
<th><input type="checkbox" id="selectAll" checked></th>
<th>Line</th>
<th>Status</th>
<th>IP Prefix</th>
<th>Country</th>
<th>Region</th>
<th>City</th>
</tr>
<tr id="filterRow" style="background-color: #6b6b6b; display: none;">
<th colspan="2" style="padding: 8px;">
<button id="resetFilters" style="padding: 5px 11px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; cursor: pointer; font-weight: 600; font-size: 0.9em; width: 100%;">Reset</button>
</th>
<th style="padding: 8px;">
<select id="filterStatus" style="padding: 5px 9px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; font-size: 0.9em; width: 100%;">
<option value="">All</option>
<option value="ERROR">ERROR</option>
<option value="WARNING">WARNING</option>
<option value="SUGGESTION">SUGGESTION</option>
<option value="OK">OK</option>
</select>
</th>
<th style="padding: 8px;">
<input type="text" id="filterIpPrefix" placeholder="IP Prefix" style="padding: 5px 9px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; font-size: 0.9em; width: 100%; box-sizing: border-box;">
</th>
<th style="padding: 8px;">
<input type="text" id="filterCountry" placeholder="Country" style="padding: 5px 9px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; font-size: 0.9em; width: 100%; box-sizing: border-box;">
</th>
<th style="padding: 8px;">
<input type="text" id="filterRegion" placeholder="Region" style="padding: 5px 9px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; font-size: 0.9em; width: 100%; box-sizing: border-box;">
</th>
<th style="padding: 8px;">
<input type="text" id="filterCity" placeholder="City" style="padding: 5px 9px; border: 1px solid #888; border-radius: 3px; background-color: #5a5a5a; color: #ffffff; font-size: 0.9em; width: 100%; box-sizing: border-box;">
</th>
</tr>
</thead>
<tbody id="entriesTableBody">
{{range .Entries}}
<tr
id="csv-r-{{.Line}}"
class="expandable-row"
data-geocoding-hint="{{.GeocodingHint}}"
data-do-not-geolocate="{{.DoNotGeolocate}}"
data-has-warning="{{.HasWarning}}"
data-has-error="{{.HasError}}"
data-has-suggestion="{{.HasSuggestion}}"
data-tunable="{{.Tunable}}"
data-tuned-country="{{.TunedEntry.CountryCode}}"
data-tuned-region="{{.TunedEntry.RegionCode}}"
data-tuned-city="{{.TunedEntry.Name}}"
data-h3-cells="{{.TunedEntry.H3Cells}}"
data-bounding-box="{{.TunedEntry.BoundingBox}}">
<td><input type="checkbox" class="row-checkbox" checked></td>
<td>{{.Line}}</td>
<td><span class="status-badge status-{{if eq .Status "ERROR"}}error{{else if eq .Status "WARNING"}}warning{{else if eq .Status "SUGGESTION"}}suggestion{{else}}ok{{end}}"><i class="bi {{if eq .Status "ERROR"}}bi-x-circle-fill{{else if eq .Status "WARNING"}}bi-exclamation-triangle-fill{{else if eq .Status "SUGGESTION"}}bi-lightbulb-fill{{else}}bi-check-circle-fill{{end}}"></i>{{.Status}}</span></td>
<td><strong>{{.IPPrefix}}</strong></td>
<td>{{.CountryCode}}</td>
<td>{{.RegionCode}}</td>
<td>{{.City}}</td>
</tr>
<tr class="expand-details-row previous-values-row">
<td></td>
<td></td>
<td></td>
<td><strong>Previous values:</strong></td>
<td class="previous-value"><span class="default-country">{{.CountryCode}}</span></td>
<td class="previous-value"><span class="default-region">{{.RegionCode}}</span></td>
<td class="previous-value"><span class="default-city">{{.City}}</span></td>
</tr>
<tr class="expand-details-row issues-row">
<td></td>
<td></td>
<td colspan="5">
<div class="issues-header">
<strong>Issues:</strong>
{{if .Tunable}}
<button class="tune-all-btn" onclick="handleTuneButtonClick(this)">Tune</button>
{{end}}
</div>
{{range .Messages}}
<div class="message-line" data-id="{{.ID}}">
<span>{{.Text}}</span>
<input type="checkbox"{{if .Checked}} checked{{else}} disabled{{end}}>
</div>
{{end}}
</td>
</tr>
{{end}}
</tbody>
</table>
<!-- Pagination Controls -->
<div class="pagination-container">
<div class="pagination-info">
<span id="paginationInfo">Showing 0-0 of 0 rows</span>
</div>
<div class="pagination-controls">
<button class="pagination-btn" id="firstPage" title="First Page">
<i class="bi bi-chevron-bar-left"></i>
</button>
<button class="pagination-btn" id="prevPage" title="Previous Page">
<i class="bi bi-chevron-left"></i>
</button>
<div id="pageNumbers" style="display: flex; gap: 5px;"></div>
<button class="pagination-btn" id="nextPage" title="Next Page">
<i class="bi bi-chevron-right"></i>
</button>
<button class="pagination-btn" id="lastPage" title="Last Page">
<i class="bi bi-chevron-bar-right"></i>
</button>
</div>
<div class="page-size-selector">
<label for="pageSize" style="color: #333333; font-size: 0.9em;">Rows per page:</label>
<select id="pageSize">
<option value="100" selected>100</option>
<option value="all">All</option>
</select>
</div>
</div>
</div>
<div style="margin-top: 30px;">
<table class="metrics-table" style="margin-bottom: 0; width: 100%; border-bottom-left-radius: 0; border-bottom-right-radius: 0;">
<tr style="background-color: #6b6b6b;">
<td style="padding: 12px 15px; font-weight: bold; color: #ffffff; font-size: 1.1em; font-family: 'Raleway', sans-serif;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span><i class="bi bi-map-fill" style="margin-right: 10px;"></i>Geographic Coverage Map</span>
<div class="mode-toggle-container" style="font-size: 1em;">
<div class="mode-toggle" id="mapModeToggle" onclick="switchMapMode()" tabindex="0" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();switchMapMode();}" style="width: 170px;">
<span class="mode-toggle-text active" id="mapModeBboxText">BBox</span>
<div class="mode-toggle-slider" style="width: 81px;"></div>
<span class="mode-toggle-text" id="mapModeH3Text">H3 Cells</span>
</div>
</div>
</div>
</td>
</tr>
</table>
<div id="summaryMap" style="height: 480px; border: 1px solid #bbb; border-top: none; border-radius: 0 0 4px 4px;"></div>
</div>
</div>
<div id="locationModal" class="modal" tabindex="-1">
<div class="modal-content" tabindex="0">
<h2>
<i class="bi bi-geo-alt" style="margin-right: 10px;"></i>Location Matches
<span class="close" tabindex="0">×</span>
</h2>
<div id="matchesList" class="matches-container"></div>
</div>
</div>
<script>
/**
* Table cell indices for accessing column data
* @type {Object<string, number>}
*/
// Constants
const CELL_INDEX = {
CHECKBOX: 0,
LINE: 1,
STATUS: 2,
IP_PREFIX: 3,
COUNTRY: 4,
REGION: 5,
CITY: 6,
MESSAGES: 7
};
/**
* Timing delays for UI interactions (in milliseconds)
* @type {Object<string, number>}
*/
const TIMING = {
MAP_INIT_DELAY: 100,
MODAL_FOCUS_DELAY: 150,
MAP_RESIZE_DELAY: 200
};
/**
* Global state variables for modal and map management
* @type {Object}
*/
// Global state
/** @type {Object<string, L.Map>} Maps indexed by mapId */
let maps = {};
/** @type {HTMLButtonElement|null} Currently active tune button reference */
let currentTuningButton = null;
/** @type {number} Currently selected match index in modal */
let selectedMatchIndex = 0;
/** @type {Array<HTMLElement>} Array of match item elements in modal */
let matchItems = [];
/** @type {boolean} Flag indicating if modal is currently open */
let isModalOpen = false;
let summaryMapInstance = null;
let summaryLayerGroup = null;
let currentMapMode = 'bbox';
let summaryRowData = [];
/**
* Stores CSV comment lines by line number for download functionality
* @type {Object<number, string>}
*/
// Comment map: stores CSV comments by line number
const commentMap = {{.Comments}};
// Modal elements
const modal = document.getElementById('locationModal');
const modalContent = document.querySelector('.modal-content');
const closeBtn = document.querySelector('.close');
// Modal functions
closeBtn.onclick = function() {
closeModal();
};
closeBtn.addEventListener('keydown', function(e) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
closeModal();
}
});
window.onclick = function(event) {
if (event.target == modal) {
closeModal();
}
};
/**
* Closes the location matches modal and cleans up resources
* @returns {void}
*/
function closeModal() {
if (!isModalOpen) return;
modal.style.display = 'none';
isModalOpen = false;
currentTuningButton = null;
document.body.style.overflow = '';
Object.values(maps).forEach(map => {
if (map && map.remove) {
map.remove();
}
});
maps = {};
matchItems = [];
}
// Modal keyboard navigation
modal.addEventListener('keydown', function(event) {
if (!isModalOpen) return;
if (event.key === 'Escape' || event.key === 'Esc') {
event.preventDefault();
closeModal();
return;
}
if (event.key === 'Enter') {
event.preventDefault();
if (matchItems[selectedMatchIndex]) {
matchItems[selectedMatchIndex].click();
}
return;
}
if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {
event.preventDefault();
navigateMatches(-1);
return;
}
if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {
event.preventDefault();
navigateMatches(1);
return;
}
if (event.key === '+' || event.key === '=') {
event.preventDefault();
zoomCurrentMap(1);
return;
}
if (event.key === '-' || event.key === '_') {
event.preventDefault();
zoomCurrentMap(-1);
return;
}
});
document.addEventListener('keydown', function(event) {
if ((event.key === 'Escape' || event.key === 'Esc') && isModalOpen) {
event.preventDefault();
closeModal();
}
});
/**
* Navigates between location match items with arrow keys
* @param {number} direction - Navigate direction: positive (right/down) or negative (left/up)
* @returns {void}
*/
function navigateMatches(direction) {
if (matchItems.length === 0) return;
if (matchItems[selectedMatchIndex]) {
matchItems[selectedMatchIndex].classList.remove('selected');
}
selectedMatchIndex = (selectedMatchIndex + direction + matchItems.length) % matchItems.length;
if (matchItems[selectedMatchIndex]) {
matchItems[selectedMatchIndex].classList.add('selected');
matchItems[selectedMatchIndex].scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });
}
}
/**
* Zooms the currently selected map in or out
* @param {number} direction - Zoom direction: positive to zoom in, negative to zoom out
* @returns {void}
*/
function zoomCurrentMap(direction) {
const mapId = `map-${selectedMatchIndex}`;
const map = maps[mapId];
if (map) {
const currentZoom = map.getZoom();
map.setZoom(currentZoom + direction);
}
}
/**
* API endpoint for place search functionality
* @type {string}
*/
const API_ENDPOINT = 'https://mcp.fastah.ai/rest/geofeeds/place-search';
/**
* Fetches geolocation matches from the API for given location data
* @async
* @param {Array<Object>} rows - Array of row objects with location data (countryCode, regionCode, cityName)
* @returns {Promise<{results: Array<Object>}|null>} API response with matches or null on error
*/
async function fetchPlaceMatches(rows) {
const MAX_BATCH_SIZE = 1000;
let allResults = [];
let batchCount = Math.ceil(rows.length / MAX_BATCH_SIZE);
let lastError = null;
for (let i = 0; i < batchCount; i++) {
const batchRows = rows.slice(i * MAX_BATCH_SIZE, (i + 1) * MAX_BATCH_SIZE);
try {
const response = await fetch(API_ENDPOINT, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({ rows: batchRows })
});
if (!response.ok) {
throw new Error(`API request failed: ${response.status} ${response.statusText}`);
}
const data = await response.json();
if (data && data.results) {
allResults = allResults.concat(data.results);
} else {
lastError = 'No results in API response';
}
} catch (error) {
console.error('Error calling place search API:', error);
lastError = error.message;
}
}
if (allResults.length === 0 && lastError) {
alert(`Failed to fetch location data: ${lastError}`);
return null;
}
return { results: allResults };
}
/**
* Prepares geofeed row data for API request
* @param {HTMLTableRowElement} dataRow - The table row element to extract data from
* @returns {Object|null} Object with countryCode, regionCode, cityName, maxResults and searchMode, or null if required data missing
*/
function prepareRowForApi(dataRow) {
const cells = dataRow.querySelectorAll('td');
if (cells.length <= CELL_INDEX.STATUS) return null;
const countryCode = cells[CELL_INDEX.COUNTRY].textContent.trim();
const regionCode = cells[CELL_INDEX.REGION].textContent.trim();
const cityName = cells[CELL_INDEX.CITY].textContent.trim();
if (!countryCode) {
return null;
}
return {
rowKey: crypto.randomUUID(),
countryCode: countryCode,
regionCode: regionCode || '',
cityName: cityName || '',
searchMode: 'auto'
};
}
/**
* Handles tune button click - fetches location matches for selected issues
* @async
* @param {HTMLButtonElement} button - The tune button that was clicked
* @returns {Promise<void>}
*/
async function handleTuneButtonClick(button) {
currentTuningButton = button;
const issuesContainer = button.closest('td');
const checkedBoxes = issuesContainer.querySelectorAll('.message-line input[type="checkbox"]:checked');
const selectedIssues = Array.from(checkedBoxes).map(cb => {
const messageLine = cb.closest('.message-line');
return {
id: messageLine.getAttribute('data-id'),
message: messageLine.querySelector('span').textContent
};
});
if (selectedIssues.length === 0) {
alert('Please select at least one issue to tune.');
return;
}
const detailsRow = button.closest('tr');
// Find the data row - it's before the expand-details-rows
let dataRow = detailsRow.previousElementSibling;
while (dataRow && dataRow.classList.contains('expand-details-row')) {
dataRow = dataRow.previousElementSibling;
}
if (!dataRow || !dataRow.classList.contains('expandable-row')) {
console.error('Could not find data row');
return;
}
const rowData = prepareRowForApi(dataRow);
if (!rowData) {
alert('Missing required location data for API call');
return;
}
const apiResponse = await fetchPlaceMatches([rowData]);
if (!apiResponse || !apiResponse.results || apiResponse.results.length === 0) {
alert('No results returned from API');
return;
}
const result = apiResponse.results[0];
if (result.matches && result.matches.length > 0) {
showLocationPopup(result.matches, selectedIssues);
} else {
alert('No location matches found for this entry');
}
}
/**
* Displays the location matches popup modal with maps and selectable options
* @param {Array<Object>} matches - Array of location match objects from API
* @param {Array<Object>} [selectedIssues=[]] - Array of selected issues for tracking
* @returns {void}
*/
function showLocationPopup(matches, selectedIssues = []) {
if (!matches || matches.length === 0) {
return;
}
const matchesList = document.getElementById('matchesList');
matchesList.innerHTML = '';
maps = {};
matchItems = [];
selectedMatchIndex = 0;
matches.forEach((match, index) => {
const matchItem = document.createElement('div');
matchItem.className = 'match-item';
if (index === 0) {
matchItem.classList.add('selected');
}
const mapId = `map-${index}`;
// Determine primary location text: city > region > country
let primaryLocation = match.placeName;
let locationType = 'city';
if (!primaryLocation || primaryLocation.trim() === '') {
primaryLocation = match.stateCode;
locationType = 'region';
}
if (!primaryLocation || primaryLocation.trim() === '') {
primaryLocation = match.countryCode;
locationType = 'country';
}
// Build secondary info (show what's available)
let secondaryInfo = [];
if (match.placeName && locationType !== 'city') {
secondaryInfo.push(`City: ${escapeHtml(match.placeName)}`);
}
if (match.stateCode && locationType !== 'region') {
secondaryInfo.push(`Region: ${escapeHtml(match.stateCode)}`);
}
if (match.countryCode && locationType !== 'country') {
secondaryInfo.push(`Country: ${escapeHtml(match.countryCode)}`);
}
matchItem.innerHTML = `
<div id="${mapId}" class="match-map"></div>
<div class="match-info-container">
<div class="match-header">${escapeHtml(primaryLocation)}</div>
${secondaryInfo.length > 0 ? `<div class="location-details">${secondaryInfo.join(' \u2022 ')}</div>` : ''}
</div>
`;
matchItem.addEventListener('click', function() {
selectLocationMatch(match);
});
matchesList.appendChild(matchItem);
matchItems.push(matchItem);
setTimeout(() => {
initializeMapForMatch(mapId, match);
}, TIMING.MAP_INIT_DELAY);
});
modal.style.display = 'block';
isModalOpen = true;
document.body.style.overflow = 'hidden';
setTimeout(() => {
if (modalContent) {
modalContent.focus();
}
}, TIMING.MODAL_FOCUS_DELAY);
}
/**
* Selects a location match and updates the corresponding table row
* @param {Object} match - Match object with countryCode, regionCode, name, and boundingBox
* @returns {void}
*/
function selectLocationMatch(match) {
if (!currentTuningButton) {
console.error('No tuning button reference found');
return;
}
const detailsRow = currentTuningButton.closest('tr');
// Find the data row - it's before the expand-details-rows
let dataRow = detailsRow.previousElementSibling;
while (dataRow && dataRow.classList.contains('expand-details-row')) {
dataRow = dataRow.previousElementSibling;
}
if (!dataRow || !dataRow.classList.contains('expandable-row')) {
console.error('Could not find data row');
return;
}
updateRowWithMatchData(dataRow, match);
closeModal();
}
/**
* Updates a table row with selected match data and stores original values
* @param {HTMLTableRowElement} dataRow - The table row to update
* @param {Object} match - Match object with countryCode, regionCode, and name
* @returns {void}
*/
function updateRowWithMatchData(dataRow, match) {
const cells = dataRow.querySelectorAll('td');
const currentCountry = cells[CELL_INDEX.COUNTRY].textContent;
const currentRegion = cells[CELL_INDEX.REGION].textContent;
const currentCity = cells[CELL_INDEX.CITY].textContent;
if (!dataRow.hasAttribute('data-original-country')) {
dataRow.setAttribute('data-original-country', currentCountry);
dataRow.setAttribute('data-original-region', currentRegion);
dataRow.setAttribute('data-original-city', currentCity);
}
cells[CELL_INDEX.COUNTRY].textContent = match.countryCode;
cells[CELL_INDEX.REGION].textContent = match.stateCode;
cells[CELL_INDEX.CITY].textContent = match.placeName;
// Find the previous values row (it's the first expand-details-row after the data row)
const previousValuesRow = dataRow.nextElementSibling;
if (previousValuesRow && previousValuesRow.classList.contains('previous-values-row')) {
previousValuesRow.classList.add('show');
const defaultCountry = previousValuesRow.querySelector('.default-country');
const defaultRegion = previousValuesRow.querySelector('.default-region');
const defaultCity = previousValuesRow.querySelector('.default-city');
if (defaultCountry) defaultCountry.textContent = dataRow.getAttribute('data-original-country');
if (defaultRegion) defaultRegion.textContent = dataRow.getAttribute('data-original-region');
if (defaultCity) defaultCity.textContent = dataRow.getAttribute('data-original-city');
}
}
/**
* Initializes a Leaflet map with location boundary and marker for a match
* @param {string} mapId - The DOM element ID where map will render
* @param {Object} match - Match object with name, boundingBox, regionCode, countryCode
* @returns {void}
*/
function initializeMapForMatch(mapId, match) {
try {
const mapInstance = L.map(mapId, {
scrollWheelZoom: false,
dragging: true,
zoomControl: true
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap',
maxZoom: 19
}).addTo(mapInstance);
const bbox = match.boundingBox;
if (bbox && bbox.length === 4) {
const [west, north, east, south] = bbox;
const centerLat = (south + north) / 2;
const centerLng = (west + east) / 2;
const isPoint = (west === east && north === south);
if (isPoint) {
const offset = 0.05;
const bounds = [
[south - offset, west - offset],
[north + offset, east + offset]
];
L.rectangle(bounds, {
color: '#dc3545',
weight: 3,
opacity: 1,
fillColor: '#dc3545',
fillOpacity: 0.2
}).addTo(mapInstance);
mapInstance.fitBounds(bounds, { padding: [30, 30] });
} else {
const bounds = [
[south, west],
[north, east]
];
L.rectangle(bounds, {
color: '#dc3545',
weight: 3,
opacity: 1,
fillColor: '#dc3545',
fillOpacity: 0.2
}).addTo(mapInstance);
mapInstance.fitBounds(bounds, { padding: [20, 20] });
}
L.marker([centerLat, centerLng]).addTo(mapInstance)
.bindPopup(`<b>${escapeHtml(match.placeName)}</b><br>${escapeHtml(match.stateCode)}`);
maps[mapId] = mapInstance;
setTimeout(() => {
mapInstance.invalidateSize();
}, TIMING.MAP_RESIZE_DELAY);
}
} catch (error) {
console.error('Error initializing map:', error);
}
}
/**
* Sets the report mode between 'viewing' and 'tuning'
* Tuning mode shows checkboxes and expands rows with issues
* @param {string} mode - 'viewing' or 'tuning'
* @returns {void}
*/
function setMode(mode) {
const toggle = document.getElementById('modeToggle');
const viewingText = document.getElementById('viewingText');
const tuningText = document.getElementById('tuningText');
if (mode === 'tuning') {
document.body.classList.add('tuning-mode');
toggle.classList.add('tuning');
viewingText.classList.remove('active');
tuningText.classList.add('active');
// Only expand rows with issues
const expandableRows = document.querySelectorAll('.expandable-row');
expandableRows.forEach(row => {
const hasError = row.getAttribute('data-has-error') === 'true';
const hasWarning = row.getAttribute('data-has-warning') === 'true';
const hasSuggestion = row.getAttribute('data-has-suggestion') === 'true';
if (hasError || hasWarning || hasSuggestion) {
let detailRow = row.nextElementSibling;
while (detailRow && detailRow.classList.contains('expand-details-row')) {
// Only show issues-row, not previous-values-row
if (detailRow.classList.contains('issues-row')) {
detailRow.classList.add('show');
}
detailRow = detailRow.nextElementSibling;
}
}
});
} else {
document.body.classList.remove('tuning-mode');
toggle.classList.remove('tuning');
viewingText.classList.add('active');
tuningText.classList.remove('active');
document.querySelectorAll('.expand-details-row').forEach(row => {
row.classList.remove('show');
});
}
// Refresh pagination after mode change
updatePagination();
}
/**
* Toggles between viewing and tuning modes
* @returns {void}
*/
function toggleMode() {
const isTuning = document.body.classList.contains('tuning-mode');
setMode(isTuning ? 'viewing' : 'tuning');
}
/**
* Escapes HTML special characters to prevent XSS attacks
* @param {string} text - Text to escape
* @returns {string} Escaped HTML text
*/
function escapeHtml(text) {
const map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return text.replace(/[&<>"']/g, m => map[m]);
}
/**
* Filters the entries table based on current filter input values
* Resets to page 1 and updates pagination
* @returns {void}
*/
function filterTable() {
const countryFilter = document.getElementById('filterCountry').value.toLowerCase();
const regionFilter = document.getElementById('filterRegion').value.toLowerCase();
const cityFilter = document.getElementById('filterCity').value.toLowerCase();
const statusFilter = document.getElementById('filterStatus').value;
const ipPrefixFilter = document.getElementById('filterIpPrefix').value.toLowerCase();
const allExpandableRows = document.querySelectorAll('.expandable-row');
// Filter rows and update allRows array
allRows = Array.from(allExpandableRows).filter(row => {
const cells = row.querySelectorAll('td');
if (cells.length <= CELL_INDEX.STATUS) return false;
const rowData = {
country: cells[CELL_INDEX.COUNTRY].textContent.toLowerCase(),
region: cells[CELL_INDEX.REGION].textContent.toLowerCase(),
city: cells[CELL_INDEX.CITY].textContent.toLowerCase(),
status: cells[CELL_INDEX.STATUS].textContent,
ipPrefix: cells[CELL_INDEX.IP_PREFIX].textContent.toLowerCase()
};
return (
(!countryFilter || rowData.country.includes(countryFilter)) &&
(!regionFilter || rowData.region.includes(regionFilter)) &&
(!cityFilter || rowData.city.includes(cityFilter)) &&
(!statusFilter || rowData.status === statusFilter) &&
(!ipPrefixFilter || rowData.ipPrefix.includes(ipPrefixFilter))
);
});
// Reset to page 1 and update pagination
currentPage = 1;
updatePagination();
}
/**
* Pagination state and configuration
* @type {Object}
*/
// Pagination state
/** @type {number} Current page number (1-indexed) */
let currentPage = 1;
/** @type {number} Number of rows to display per page */
let rowsPerPage = 100;
/** @type {Array<HTMLTableRowElement>} Array of expandable rows after filtering */
let allRows = [];
// Initialize on page load
window.addEventListener('DOMContentLoaded', function() {
// Initialize pagination
allRows = Array.from(document.querySelectorAll('.expandable-row'));
initializePagination();
// Setup select all checkbox
const selectAllCheckbox = document.getElementById('selectAll');
const rowCheckboxes = document.querySelectorAll('.row-checkbox');
selectAllCheckbox.addEventListener('change', function() {
rowCheckboxes.forEach(checkbox => {
checkbox.checked = selectAllCheckbox.checked;
});
});
// Update select all checkbox when individual checkboxes change
rowCheckboxes.forEach(checkbox => {
checkbox.addEventListener('click', function(e) {
e.stopPropagation(); // Prevent row expansion when clicking checkbox
});
checkbox.addEventListener('keydown', function(e) {
if (e.key === ' ' || e.key === 'Enter') {
e.stopPropagation(); // Prevent row expansion when using keyboard on checkbox
}
});
checkbox.addEventListener('change', function(e) {
e.stopPropagation(); // Prevent row expansion when clicking checkbox
const allChecked = Array.from(rowCheckboxes).every(cb => cb.checked);
const noneChecked = Array.from(rowCheckboxes).every(cb => !cb.checked);
selectAllCheckbox.checked = allChecked;
selectAllCheckbox.indeterminate = !allChecked && !noneChecked;
});
});
// Setup expandable rows
const expandableRows = document.querySelectorAll('.expandable-row');
expandableRows.forEach(row => {
const hasError = row.getAttribute('data-has-error') === 'true';
const hasWarning = row.getAttribute('data-has-warning') === 'true';
const hasSuggestion = row.getAttribute('data-has-suggestion') === 'true';
// Only make rows with issues focusable
if (hasError || hasWarning || hasSuggestion) {
row.setAttribute('tabindex', '0');
// Click handler
row.addEventListener('click', function(e) {
// Don't expand if clicking on checkbox
if (e.target.classList.contains('row-checkbox')) {
return;
}
let detailRow = this.nextElementSibling;
let expanding = false;
// First pass: check if we are expanding (issues-row will be shown)
while (detailRow && detailRow.classList.contains('expand-details-row')) {
if (detailRow.classList.contains('issues-row')) {
expanding = !detailRow.classList.contains('show');
break;
}
detailRow = detailRow.nextElementSibling;
}
detailRow = this.nextElementSibling;
while (detailRow && detailRow.classList.contains('expand-details-row')) {
if (detailRow.classList.contains('issues-row')) {
// Always toggle issues-row
detailRow.classList.toggle('show');
} else if (detailRow.classList.contains('previous-values-row')) {
if (expanding) {
// Show previous-values-row if this row has original data (was tuned)
if (row.hasAttribute('data-original-country') ||
row.hasAttribute('data-original-region') ||
row.hasAttribute('data-original-city')) {
detailRow.classList.add('show');
}
} else {
// If collapsing, hide previous-values-row
detailRow.classList.remove('show');
}
}
detailRow = detailRow.nextElementSibling;
}
// Refresh pagination to show/hide the toggled detail rows
updatePagination();
});
// Keyboard handler
row.addEventListener('keydown', function(e) {
// Don't handle if focus is on checkbox
if (document.activeElement.classList.contains('row-checkbox')) {
return;
}
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
let detailRow = this.nextElementSibling;
let expanding = false;
// First pass: check if we are expanding (issues-row will be shown)
while (detailRow && detailRow.classList.contains('expand-details-row')) {
if (detailRow.classList.contains('issues-row')) {
expanding = !detailRow.classList.contains('show');
break;
}
detailRow = detailRow.nextElementSibling;
}
detailRow = this.nextElementSibling;
while (detailRow && detailRow.classList.contains('expand-details-row')) {
if (detailRow.classList.contains('issues-row')) {
// Always toggle issues-row
detailRow.classList.toggle('show');
} else if (detailRow.classList.contains('previous-values-row')) {
if (expanding) {
// Show previous-values-row if this row has original data (was tuned)
if (row.hasAttribute('data-original-country') ||
row.hasAttribute('data-original-region') ||
row.hasAttribute('data-original-city')) {
detailRow.classList.add('show');
}
} else {
// If collapsing, hide previous-values-row
detailRow.classList.remove('show');
}
}
detailRow = detailRow.nextElementSibling;
}
// Refresh pagination to show/hide the toggled detail rows
updatePagination();
}
});
} else {
row.style.cursor = 'default';
}
});
// Toggle Expand All button
let isExpanded = false;
document.getElementById('toggleExpandAll').addEventListener('click', function() {
const expandableRows = document.querySelectorAll('.expandable-row');
const button = document.getElementById('toggleExpandAll');
if (!isExpanded) {
// Show all
expandableRows.forEach(row => {
const checkbox = row.querySelector('.row-checkbox');
if (!checkbox || !checkbox.checked) return; // Only work on checked rows
const hasError = row.getAttribute('data-has-error') === 'true';
const hasWarning = row.getAttribute('data-has-warning') === 'true';
const hasSuggestion = row.getAttribute('data-has-suggestion') === 'true';
// Only expand rows with issues
if (hasError || hasWarning || hasSuggestion) {
let detailRow = row.nextElementSibling;
while (detailRow && detailRow.classList.contains('expand-details-row')) {
// Show issues-row always
if (detailRow.classList.contains('issues-row')) {
detailRow.classList.add('show');
} else if (detailRow.classList.contains('previous-values-row')) {
// Show previous-values-row if this row has original data (was tuned)
if (row.hasAttribute('data-original-country') ||
row.hasAttribute('data-original-region') ||
row.hasAttribute('data-original-city')) {
detailRow.classList.add('show');
}
}
detailRow = detailRow.nextElementSibling;
}
}
});
button.innerHTML = '<i class="bi bi-arrows-collapse" style="margin-right: 5px;"></i>Collapse Rows';
isExpanded = true;
} else {
// Collapse all
expandableRows.forEach(row => {
const checkbox = row.querySelector('.row-checkbox');
if (!checkbox || !checkbox.checked) return; // Only work on checked rows
let detailRow = row.nextElementSibling;
while (detailRow && detailRow.classList.contains('expand-details-row')) {
detailRow.classList.remove('show');
detailRow = detailRow.nextElementSibling;
}
});
button.innerHTML = '<i class="bi bi-arrows-expand" style="margin-right: 5px;"></i>Expand Rows';
isExpanded = false;
}
// Refresh pagination to show expanded rows correctly
updatePagination();
});
// Toggle Filters button
document.getElementById('toggleFilters').addEventListener('click', function() {
const filterRow = document.getElementById('filterRow');
const button = document.getElementById('toggleFilters');
if (filterRow.style.display === 'none') {
filterRow.style.display = '';
button.innerHTML = '<i class="bi bi-funnel-fill" style="margin-right: 5px;"></i>Hide Filters';
} else {
filterRow.style.display = 'none';
button.innerHTML = '<i class="bi bi-funnel-fill" style="margin-right: 5px;"></i>Show Filters';
}
});
// Tune All button
document.getElementById('tuneAll').addEventListener('click', async function() {
const expandableRows = document.querySelectorAll('.expandable-row');
let updatedCount = 0;
let skippedCount = 0;
expandableRows.forEach(dataRow => {
const checkbox = dataRow.querySelector('.row-checkbox');
if (!checkbox || !checkbox.checked) {
skippedCount++;
return; // Only work on checked rows
}
const isTunable = dataRow.getAttribute('data-tunable') === 'true';
if (!isTunable) {
skippedCount++;
return;
}
const tunedCountry = dataRow.getAttribute('data-tuned-country');
const tunedRegion = dataRow.getAttribute('data-tuned-region');
const tunedCity = dataRow.getAttribute('data-tuned-city');
if (!tunedCountry && !tunedRegion && !tunedCity) {
skippedCount++;
return;
}
const cells = dataRow.querySelectorAll('td');
if (cells.length <= CELL_INDEX.STATUS) {
skippedCount++;
return;
}
if (!dataRow.hasAttribute('data-original-country')) {
dataRow.setAttribute('data-original-country', cells[CELL_INDEX.COUNTRY].textContent);
dataRow.setAttribute('data-original-region', cells[CELL_INDEX.REGION].textContent);
dataRow.setAttribute('data-original-city', cells[CELL_INDEX.CITY].textContent);
}
if (tunedCountry) cells[CELL_INDEX.COUNTRY].textContent = tunedCountry;
if (tunedRegion) cells[CELL_INDEX.REGION].textContent = tunedRegion;
if (tunedCity) cells[CELL_INDEX.CITY].textContent = tunedCity;
// Find the previous values row
const previousValuesRow = dataRow.nextElementSibling;
if (previousValuesRow && previousValuesRow.classList.contains('previous-values-row')) {
previousValuesRow.classList.add('show');
const defaultCountry = previousValuesRow.querySelector('.default-country');
const defaultRegion = previousValuesRow.querySelector('.default-region');
const defaultCity = previousValuesRow.querySelector('.default-city');
if (defaultCountry) defaultCountry.textContent = dataRow.getAttribute('data-original-country');
if (defaultRegion) defaultRegion.textContent = dataRow.getAttribute('data-original-region');
if (defaultCity) defaultCity.textContent = dataRow.getAttribute('data-original-city');
}
updatedCount++;
});
// Refresh pagination to update displayed values
updatePagination();
alert(`Successfully updated ${updatedCount} rows (${skippedCount} rows skipped - not tunable or no tuned values available)`);
});
// Add filter event listeners
document.getElementById('filterCountry').addEventListener('input', filterTable);
document.getElementById('filterRegion').addEventListener('input', filterTable);
document.getElementById('filterCity').addEventListener('input', filterTable);
document.getElementById('filterStatus').addEventListener('change', filterTable);
document.getElementById('filterIpPrefix').addEventListener('input', filterTable);
// Reset filters button
document.getElementById('resetFilters').addEventListener('click', function() {
document.getElementById('filterCountry').value = '';
document.getElementById('filterRegion').value = '';
document.getElementById('filterCity').value = '';
document.getElementById('filterStatus').value = '';
document.getElementById('filterIpPrefix').value = '';
// Reset to all rows and update pagination
allRows = Array.from(document.querySelectorAll('.expandable-row'));
currentPage = 1;
updatePagination();
});
// Download CSV button
document.getElementById('downloadCSV').addEventListener('click', function() {
const rows = document.querySelectorAll('.expandable-row');
const rowDataMap = {};
// Collect all data rows with their line numbers
rows.forEach(row => {
const cells = row.querySelectorAll('td');
if (cells.length > CELL_INDEX.CITY) {
const lineNum = parseInt(cells[CELL_INDEX.LINE].textContent.trim());
const ipPrefix = cells[CELL_INDEX.IP_PREFIX].textContent.trim();
const country = cells[CELL_INDEX.COUNTRY].textContent.trim();
const region = cells[CELL_INDEX.REGION].textContent.trim();
const city = cells[CELL_INDEX.CITY].textContent.trim();
rowDataMap[lineNum] = [ipPrefix, country, region, city];
}
});
// Build CSV content with comments in the correct positions
const csvLines = [];
// Find max line number
const allLineNumbers = Object.keys(rowDataMap).map(n => parseInt(n));
const maxLine = Math.max(...allLineNumbers);
// Iterate through all line numbers from 1 to maxLine
for (let lineNum = 1; lineNum <= maxLine; lineNum++) {
if (lineNum in commentMap) {
// This line is a comment
csvLines.push(commentMap[lineNum]);
} else if (rowDataMap[lineNum]) {
// This line is a data row
const row = rowDataMap[lineNum];
const csvRow = row.map(cell => {
// Escape quotes and wrap in quotes if contains comma, quote, or newline
const cellStr = String(cell);
if (cellStr.includes(',') || cellStr.includes('"') || cellStr.includes('\n')) {
return '"' + cellStr.replace(/"/g, '""') + '"';
}
return cellStr;
}).join(',');
csvLines.push(csvRow);
}
// If neither comment nor data, skip the line (maintains original CSV structure)
}
const csvContent = csvLines.join('\n');
// Create download link
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
const link = document.createElement('a');
const url = URL.createObjectURL(blob);
// Get filename from inputFileMetrics, ensure it has .csv extension
let filename =
document.getElementById('inputFileMetrics')
.textContent
.trim()
.split(/[/\\]/)
.pop() || 'geofeed_report.csv';
if (!filename.toLowerCase().endsWith('.csv')) {
filename += '.csv';
}
link.setAttribute('href', url);
link.setAttribute('download', filename);
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
// Pagination event listeners
document.getElementById('pageSize').addEventListener('change', function() {
const value = this.value;
if (value === 'all') {
rowsPerPage = allRows.length;
} else {
rowsPerPage = parseInt(value);
}
currentPage = 1;
updatePagination();
});
document.getElementById('firstPage').addEventListener('click', function() {
currentPage = 1;
updatePagination();
});
document.getElementById('prevPage').addEventListener('click', function() {
if (currentPage > 1) {
currentPage--;
updatePagination();
}
});
document.getElementById('nextPage').addEventListener('click', function() {
const totalPages = Math.ceil(allRows.length / rowsPerPage);
if (currentPage < totalPages) {
currentPage++;
updatePagination();
}
});
document.getElementById('lastPage').addEventListener('click', function() {
currentPage = Math.ceil(allRows.length / rowsPerPage);
updatePagination();
});
initSummaryMap();
});
/**
* Initializes pagination on page load
* @returns {void}
*/
function initializePagination() {
updatePagination();
}
function initSummaryMap() {
try {
const summaryMapEl = document.getElementById('summaryMap');
if (!summaryMapEl) return;
summaryMapInstance = L.map('summaryMap', {
scrollWheelZoom: true,
dragging: true,
zoomControl: true,
center: [20, 0],
zoom: 2
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '\u00a9 <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
maxZoom: 19
}).addTo(summaryMapInstance);
summaryLayerGroup = L.layerGroup().addTo(summaryMapInstance);
// Parse and cache all row data once
summaryRowData = [];
const expandableRows = document.querySelectorAll('.expandable-row');
expandableRows.forEach(row => {
const cells = row.querySelectorAll('td');
const hasError = row.getAttribute('data-has-error') === 'true';
const hasWarning = row.getAttribute('data-has-warning') === 'true';
const hasSugg = row.getAttribute('data-has-suggestion') === 'true';
let color = '#28a745';
if (hasError) color = '#dc3545';
else if (hasWarning) color = '#fd7e14';
else if (hasSugg) color = '#17a2b8';
const country = cells[CELL_INDEX.COUNTRY] ? cells[CELL_INDEX.COUNTRY].textContent.trim() : '';
const region = cells[CELL_INDEX.REGION] ? cells[CELL_INDEX.REGION].textContent.trim() : '';
const city = cells[CELL_INDEX.CITY] ? cells[CELL_INDEX.CITY].textContent.trim() : '';
const parts = [];
if (city && region && country) {
parts.push('<b>' + escapeHtml(city) + '</b>' + ' • ' + escapeHtml(region) + ' • ' + escapeHtml(country));
} else if (city && country) {
parts.push('<b>' + escapeHtml(city) + '</b>' + ' • ' + escapeHtml(country));
} else if (region && country) {
parts.push('<b>' + escapeHtml(region) + '</b>' + ' • ' + escapeHtml(country));
} else if (country) {
parts.push('<b>' + escapeHtml(country) + '</b>');
}
summaryRowData.push({
rowId: row.id,
bbox: row.getAttribute('data-bounding-box') || '',
h3cells: row.getAttribute('data-h3-cells') || '',
color: color,
popup: parts.join('<br>')
});
});
setTimeout(() => {
summaryMapInstance.invalidateSize();
switchMapMode('bbox');
}, 350);
} catch (err) {
console.error('initSummaryMap error:', err);
}
}
function switchMapMode(mode) {
const toggle = document.getElementById('mapModeToggle');
const bboxText = document.getElementById('mapModeBboxText');
const h3Text = document.getElementById('mapModeH3Text');
// If called with no argument, act as a toggle
if (mode === undefined) {
mode = currentMapMode === 'bbox' ? 'h3' : 'bbox';
}
if (mode === 'h3') {
toggle.classList.add('h3mode');
bboxText.classList.remove('active');
h3Text.classList.add('active');
} else {
toggle.classList.remove('h3mode');
bboxText.classList.add('active');
h3Text.classList.remove('active');
}
renderSummaryMapLayers(mode);
}
function renderSummaryMapLayers(mode) {
if (!summaryMapInstance || !summaryLayerGroup) return;
currentMapMode = mode;
summaryLayerGroup.clearLayers();
// Determine which row IDs are visible on the current page
const startIndex = (currentPage - 1) * rowsPerPage;
const endIndex = Math.min(startIndex + rowsPerPage, allRows.length);
const visibleIds = new Set();
for (let i = startIndex; i < endIndex; i++) {
visibleIds.add(allRows[i].id);
}
const tempBoundsLayers = [];
const seenBboxKeys = new Set(); // deduplicate identical bounding boxes / h3 cell sets
summaryRowData.forEach(data => {
// Only render entries whose row is on the current page
if (!visibleIds.has(data.rowId)) return;
if (mode === 'bbox') {
const raw = data.bbox.replace(/[\[\]]/g, '').trim();
const pts = raw.split(/[\s,]+/).map(Number);
if (pts.length !== 4 || pts.some(v => isNaN(v))) return;
// Skip duplicate bounding boxes
const bboxKey = pts.join(',');
if (seenBboxKeys.has(bboxKey)) return;
seenBboxKeys.add(bboxKey);
const [west, north, east, south] = pts;
const lb = [[south, west], [north, east]];
const rect = L.rectangle(lb, {
color: data.color, weight: 3, opacity: 1,
fillColor: data.color, fillOpacity: 0.35
});
rect.bindPopup(data.popup);
summaryLayerGroup.addLayer(rect);
const cm = L.circleMarker([(south + north) / 2, (west + east) / 2], {
radius: 5, color: data.color, fillColor: data.color, fillOpacity: 0.9, weight: 1
});
cm.bindPopup(data.popup);
summaryLayerGroup.addLayer(cm);
tempBoundsLayers.push(L.rectangle(lb));
} else {
// H3 cells mode
const raw = data.h3cells.replace(/[\[\]]/g, '').trim();
if (!raw) return;
// Skip duplicate h3 cell sets
if (seenBboxKeys.has(raw)) return;
seenBboxKeys.add(raw);
const cellIds = raw.split(/[\s,]+/).filter(Boolean);
cellIds.forEach(cellId => {
try {
const boundary = h3.cellToBoundary(cellId); // returns [[lat,lng],...]
const poly = L.polygon(boundary, {
color: data.color, weight: 2, opacity: 0.9,
fillColor: data.color, fillOpacity: 0.35
});
poly.bindPopup(data.popup);
summaryLayerGroup.addLayer(poly);
const b = poly.getBounds();
tempBoundsLayers.push(L.rectangle([[b.getSouth(), b.getWest()], [b.getNorth(), b.getEast()]]));
} catch (e) {
console.warn('H3 render error for cell', cellId, e);
}
});
}
});
if (tempBoundsLayers.length > 0) {
const group = L.featureGroup(tempBoundsLayers);
summaryMapInstance.fitBounds(group.getBounds(), { padding: [40, 40], maxZoom: 14 });
}
}
/**
* Updates pagination display for current page
* Shows/hides rows based on current page and rowsPerPage
* @returns {void}
*/
function updatePagination() {
const totalPages = Math.max(1, Math.ceil(allRows.length / rowsPerPage));
// Ensure currentPage is within valid range
if (currentPage > totalPages) {
currentPage = totalPages;
}
if (currentPage < 1) {
currentPage = 1;
}
const startIndex = (currentPage - 1) * rowsPerPage;
const endIndex = Math.min(startIndex + rowsPerPage, allRows.length);
// Hide ALL expandable rows first (not just filtered ones)
const allExpandableRows = document.querySelectorAll('.expandable-row');
allExpandableRows.forEach(row => {
row.style.display = 'none';
// Hide associated detail rows
let nextRow = row.nextElementSibling;
while (nextRow && nextRow.classList.contains('expand-details-row')) {
nextRow.style.display = 'none';
nextRow = nextRow.nextElementSibling;
}
});
// Show rows for current page
for (let i = startIndex; i < endIndex; i++) {
const row = allRows[i];
row.style.display = '';
// Show associated detail rows if they have 'show' class
let nextRow = row.nextElementSibling;
while (nextRow && nextRow.classList.contains('expand-details-row')) {
if (nextRow.classList.contains('show')) {
nextRow.style.display = '';
}
nextRow = nextRow.nextElementSibling;
}
}
// Update pagination info
if (allRows.length === 0) {
document.getElementById('paginationInfo').textContent = 'Showing 0 of 0 rows';
} else {
document.getElementById('paginationInfo').textContent =
`Showing ${startIndex + 1}-${endIndex} of ${allRows.length} rows`;
}
// Update button states
document.getElementById('firstPage').disabled = currentPage === 1 || allRows.length === 0;
document.getElementById('prevPage').disabled = currentPage === 1 || allRows.length === 0;
document.getElementById('nextPage').disabled = currentPage === totalPages || allRows.length === 0;
document.getElementById('lastPage').disabled = currentPage === totalPages || allRows.length === 0;
// Update page numbers
updatePageNumbers(totalPages);
// Refresh the Geographic Coverage Map to show only current-page entries
renderSummaryMapLayers(currentMapMode);
}
/**
* Updates page number buttons display with ellipsis for large page counts
* @param {number} totalPages - Total number of pages available
* @returns {void}
*/
function updatePageNumbers(totalPages) {
const pageNumbersContainer = document.getElementById('pageNumbers');
pageNumbersContainer.innerHTML = '';
// Show max 5 page numbers with ellipsis
const maxVisible = 5;
let startPage = Math.max(1, currentPage - Math.floor(maxVisible / 2));
let endPage = Math.min(totalPages, startPage + maxVisible - 1);
// Adjust if we're near the end
if (endPage - startPage < maxVisible - 1) {
startPage = Math.max(1, endPage - maxVisible + 1);
}
// Add first page and ellipsis if needed
if (startPage > 1) {
addPageButton(1);
if (startPage > 2) {
const ellipsis = document.createElement('span');
ellipsis.textContent = '...';
ellipsis.style.padding = '6px 8px';
ellipsis.style.color = '#333';
pageNumbersContainer.appendChild(ellipsis);
}
}
// Add page numbers
for (let i = startPage; i <= endPage; i++) {
addPageButton(i);
}
// Add ellipsis and last page if needed
if (endPage < totalPages) {
if (endPage < totalPages - 1) {
const ellipsis = document.createElement('span');
ellipsis.textContent = '...';
ellipsis.style.padding = '6px 8px';
ellipsis.style.color = '#333';
pageNumbersContainer.appendChild(ellipsis);
}
addPageButton(totalPages);
}
}
/**
* Creates and adds a page number button to pagination controls
* @param {number} pageNum - Page number for the button
* @returns {void}
*/
function addPageButton(pageNum) {
const pageNumbersContainer = document.getElementById('pageNumbers');
const btn = document.createElement('button');
btn.className = 'pagination-btn' + (pageNum === currentPage ? ' active' : '');
btn.textContent = pageNum;
btn.addEventListener('click', function() {
currentPage = pageNum;
updatePagination();
});
pageNumbersContainer.appendChild(btn);
}
</script>
</body>
</html>
License (MIT)
View full license text
MIT License Copyright GitHub, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.