diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index d8fce744..86c4c39f 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -18,7 +18,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: Generate Report run: | - pip install coverage + pip install coverage num2words coverage run -m unittest discover tests/ - name: Upload Coverage to Codecov uses: codecov/codecov-action@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3efcab1b..7bb57c98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added + +- Utilitário `convert_code_to_uf` [#397](https://github.com/brazilian-utils/brutils-python/pull/410) +- Utilitário `convert_date_to_text`[#394](https://github.com/brazilian-utils/brutils-python/pull/415) +- Utilitário `get_municipality_by_code` [412](https://github.com/brazilian-utils/brutils-python/pull/412) + +- Utilitário `get_code_by_municipality_name` [#399](https://github.com/brazilian-utils/brutils-python/issues/399) ## [2.2.0] - 2024-09-12 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 26c4b8da..756e0891 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -98,7 +98,7 @@ emulate bash -c '. .../bin/activate' Para testar se o ambiente virtual está ativo corretamente, execute o comando e verifique se a resposta é algo parecido com a seguinte: ```sh -$ poetry env inf +$ poetry env info Virtualenv Python: 3.x.y Implementation: CPython diff --git a/CONTRIBUTING_EN.md b/CONTRIBUTING_EN.md index d06cb212..18ed1000 100644 --- a/CONTRIBUTING_EN.md +++ b/CONTRIBUTING_EN.md @@ -10,35 +10,33 @@ Thanks for taking the time to contribute! 🙇‍♀️🙇‍♂️ Every littl How to make your first contribution: - [1. Create a GitHub Account](#1-create-a-github-account) -- [2. Find an Issue to Work With](#2-find-an-issue-to-work-with) +- [2. Find an Issue to Work On](#2-find-an-issue-to-work-on) - [3. Install Git](#3-install-git) - [4. Fork the Project](#4-fork-the-project) - [5. Clone your Fork](#5-clone-your-fork) - [6. Create a New Branch](#6-create-a-new-branch) -- [7. Run brutils locally](#7-run-brutils-locally) -- [8. Make your changes](#8-make-your-changes) -- [9. Test your changes](#9-test-your-changes) -- [10. Commit and push your changes](#10-commit-and-push-your-changes) -- [11. Add changelog entries](#11-add-changelog-entries) -- [12. Create a GitHub PR](#12-create-a-github-pr) -- [13. Update your branch if needed.](#13-update-your-branch-if-needed) +- [7. Run brutils Locally](#7-run-brutils-locally) +- [8. Make your Changes](#8-make-your-changes) +- [9. Test your Changes](#9-test-your-changes) +- [10. Update READMEs](#10-update-readmes) +- [11. Commit and push your Changes](#10-commit-and-push-your-changes) +- [12. Add changelog Entries](#11-add-changelog-entries) +- [13. Create a GitHub PR](#12-create-a-github-pr) +- [14. Update your branch if Needed.](#13-update-your-branch-if-needed) ### 1. Create a GitHub Account -Make sure you have a [GitHub account][github-join] and you are logged in with it. +Ensure you have a [GitHub account][github-join] and you are logged in. ### 2. Find an Issue to Work With -Visit the [brutils issues page][brutils-issues] and find an issue you would like to work with -and no one assigned to it yet. +Visit the [brutils issues page][brutils-issues] and find an issue that interests you and hasn't been assigned yet. -Send a comment in the issue with the content "bora!" This will trigger a bot that will assign you to the ticket. Once you are assigned to it, you can move to the next -step. +Leave a comment in the issue with "bora!". A bot will assign the issue to you. Once assigned, proceed to the next step. -Please, feel free to ask any questions in the issue's page before or during the development -process. +Feel free to ask any questions in the issue's page before or during the development process. -When starting to contribute to the project, it is advisable to pick one issue at a time. This helps ensure that others also have the opportunity to collaborate and prevents resources from staying inactive for too long. +When starting to contribute, it is advised to handle one issue at a time. This ensures others have the chance to collaborate and avoids inactive resources. ### 3. Install Git @@ -50,7 +48,7 @@ Make sure you have [Git installed][install-git]. ### 5. Clone your Fork -[Clone][github-cloning] your fork locally. +[Clone your fork][github-cloning] locally. ### 6. Create a New Branch @@ -58,25 +56,48 @@ Go into the brutils folder: ```bash $ cd brutils-python +> ``` -And create a new branch: +And create a new branch with the issue number you’re working on: ```bash $ git checkout -b +> +``` +Example: + +```bash +$ git checkout -b 386 +Switched to a new branch '386' +> ``` ### 7. Run brutils locally + ## Installation + ### Requirements -- [Python 3.7+][python] +- [Python 3.8+][python] - [Poetry][poetry] Create a [virtualenv][virtualenv] for brutils and activate it: ```shell $ make shell +Spawning shell within ...-py3.x +emulate bash -c '. .../bin/activate' +``` + +To test if the virtual environment is correctly activated, run: + +```sh +$ poetry env inf +Virtualenv +Python: 3.x.y +Implementation: CPython +... ``` **Note: You need to run `make shell` every time you open a new terminal window/tab.** @@ -85,41 +106,53 @@ Install the dependencies: ```shell $ make install +git config --local core.hooksPath .githooks/ +chmod -R +x .githooks +Installing dependencies from lock file +... ``` ## Using locally -```shell -$ make run-python -``` - Now, you can use it [in the same way described in the README.md file](/README_EN.md#usage). ## Tests +Run tests using the following command: + ```shell $ make test +make test +test__is_valid_mercosul (license_plate.test_is_valid.TestIsValidMercosul.test__is_valid_mercosul) ... ok +test__is_valid_old_format (license_plate.test_is_valid.TestIsValidOldFormat.test__is_valid_old_format) ... ok +.... + +---------------------------------------------------------------------- +Ran XX tests in 0.000s + +OK ``` ### 8. Make your changes -Now is the step where you can implement your changes in the code. +Now it’s time to implement your changes. + +Check the issue description for instructions or ideas in the section “Describe alternatives you considered.” Make sure your changes resolve everything mentioned in the issue. + +We document our code using [docstrings][docstring-definition]. All modules, classes, functions, and methods should have docstrings. Your changes should reflect updated docstrings, especially if any parameters were changed. -It is important to notice that we document our code using [docstrings][docstring-definition]. -Modules, classes, functions, and methods should be documented. Your changes should also be well -documented and should reflect updated docstrings if any of the params were changed for a -class/attributes or even functions. +All docstrings must be written in English. You can use tools like Google Translate or ChatGPT for help. We’ll suggest changes to the translation if needed. -We follow the given pattern below to keep consistency in the docstrings: +We follow this pattern for docstring consistency: ```python class Example: - """Explain the purpose of the class + """ + Explain the purpose of the class Attributes: x[dict]: Short explanation here y[type, optional]: Short explanation here - """ def __init__(self, x, y=None): @@ -127,20 +160,53 @@ class Example: self.y = y def foobar(self, w): - """Purpose if the function + """ + Purpose of the function Args: - w[str]: Short explanation here + name[type]: Short explanation here Returns: - value[str]: Short explanation here + type: Short explanation here + Example: + >>> command 1 + output 1 + >>> command 2 + output 2 """ ... return value ``` +Example: + +```python +def format_cep(cep): # type: (str) -> str | None + """ + Formats a Brazilian CEP (Postal Code) into a standard format. + + This function takes a CEP (Postal Code) as input and, if it is a valid + 8-digit CEP, formats it into the standard "12345-678" format. + + Args: + cep (str): The input CEP (Postal Code) to be formatted. + + Returns: + str: The formatted CEP in the "12345-678" format if it's valid, + None if it's not valid. + + Example: + >>> format_cep("12345678") + "12345-678" + >>> format_cep("12345") + None + """ + + return f"{cep[:5]}-{cep[5:8]}" if is_valid(cep) else None +``` + One last thing to keep in mind while self-documenting code with docstrings that you can ignore docstrings in property decorators and magic methods. @@ -156,33 +222,300 @@ Run all the tests with `make test` and make sure that they all passed. **PRs will not be merged if there is any test missing or failing.** -### 10. Commit and push your changes +#### Test it manually + +Open an interactive environment to manually test your changes: + +```sh +$ python +Python 3.x.y ... +Type "help", "copyright", "credits" or "license" for more information. +>>> # Test your changes here! + +### 10. Update READMEs + +Update the `brutils-python/README.md` and `brutils-python/README_EN.md` files with your changes. + +These files are essential for the library’s documentation, helping users understand how to use the provided features. Therefore, it’s important to always keep them up to date. + + • The brutils-python/README_EN.md file contains the documentation in English, and you can use the content already described in the docstring directly. + • The brutils-python/README.md file contains the documentation in Portuguese. For this one, simply translate the function’s docstring. + +If you need help translating into Portuguese, tools like Google Translate or ChatGPT can assist. Don’t worry about potential translation mistakes, as we will suggest adjustments when necessary. + +Example in Portuguese (README.md): + +````md +### format_cep + +Esta função recebe um CEP como entrada e, se for um CEP válido de 8 dígitos, formata-o no padrão "12345-678". + +Argumentos: + +- cep (str): O CEP a ser formatado. + +Retorna: + +- str: O CEP formatado no padrão "12345-678" se for válido, ou + None se não for válido. + +Exemplo: + +```python +>>> from brutils import format_cep +>>> format_cep('01310200') +'01310-200' +>>> format_cep("12345678") +"12345-678" +>>> format_cep("12345") +None +``` +```` +Example in English (README_EN.md): + +````md +### format_cep + +This function takes a CEP (Postal Code) as input and, if it is a valid +8-digit CEP, formats it into the standard "12345-678" format. + +Args: + +- cep (str): The input CEP (Postal Code) to be formatted. + +Returns: + +- str: The formatted CEP in the "12345-678" format if it's valid, + None if it's not valid. + +Example: + +```python +>>> from brutils import format_cep +>>> format_cep('01310200') +'01310-200' +>>> format_cep("12345678") +"12345-678" +>>> format_cep("12345") +None +``` +```` + +### 11. Commit and push your changes + +Format your code by running the command: + + +```bash +$ make format +... +``` + +Exemple: + +```bash +$ make format +31 files left unchanged +All checks passed! +``` -Commit the changes: +Commit your changes: ```bash $ git commit -a -m "" +... ``` -Push your commit to GitHub: +Example: ```bash -$ git push --set-upstream origin +$ git push --set-upstream origin 386 +Running pre-push hook checks +All checks passed! +Enumerating objects: 7, done. +Counting objects: 100% (7/7), done. +Delta compression using up to 10 threads +Compressing objects: 100% (4/4), done. +Writing objects: 100% (4/4), 2.36 KiB | 2.36 MiB/s, done. +Total 4 (delta 3), reused 0 (delta 0), pack-reused 0 +remote: Resolving deltas: 100% (3/3), completed with 3 local objects. +remote: +remote: Create a pull request for '386' on GitHub by visiting: +remote: https://github.com/brazilian-utils/brutils-python/pull/new/386 +remote: +To github.com:brazilian-utils/brutils-python.git + * [new branch] 386 -> 386 +``` + +Make the necessary changes and commits and push them when ready. + +### 12. Add changelog entries + +#### What is a changelog? + +A changelog is a file that contains a chronologically organized list of notable changes for each version of a project. + +#### Why maintain a changelog? + +To make it easier for users and contributors to see exactly what notable changes have been made between each release (or version) of the project. + +#### Who needs a changelog? + +People. Whether they are consumers or developers, the end users of software are human beings who care about what’s in the software. When the software changes, people want to know why and how. + +#### Where is the brutils changelog? + +The brutils changelog is available at [CHANGELOG.md][changelog]. + +#### Guiding principles + +- Changelogs are for humans, not machines. +- There should be an entry for every version. +- The same types of changes should be grouped together. +- Versions and sections should be linkable. +- The most recent version comes first. +- The release date of each version is displayed. + +#### What justifies an entry in the changelog? + +- Security fixes: These should be documented with the type labeled as “security” to alert users to resolved security issues. +Example: “Fixed a critical vulnerability that allowed remote code execution.” + +- User-facing changes: Changes that directly affect how users interact with the software, including new features, changes to existing features, or UI improvements. +Example: “Added a new filter option on the results page to make searching easier.” + +- Significant performance improvements: Should be recorded when they result in noticeable improvements in speed or efficiency that impact the user experience. +Example: “The home page loading time was reduced by 40% after backend optimization.” + +- Changes affecting compatibility: Adjustments to maintain compatibility with other tools, systems, or versions. +Example: “Updated library X to version 2.0 to support the new version of Python.” + +- Changes to the public API: Changes that affect how developers interact with the public API, such as adding new routes or modifying existing ones. +Example: “Added a new /api/v1/users route for user management.” + +- Dependency changes: Updates or changes to the project’s dependencies that may affect software behavior or compatibility. +Example: “Updated dependency package Y to version 3.1.4, which includes important security fixes.” + +#### What should NOT go in the changelog + +Although the changelog is a valuable tool for documenting changes, some information should not be included. Here are some examples of what should not appear in the changelog: + +- Internal Code Changes: Changes that do not affect the end-user experience, such as internal refactoring that does not alter functionality, need not be documented. +Example: “Refactored internal functions” or “Fixed inconsistent tests.” + +- Non-notable performance improvements: Performance improvements that do not result in noticeable changes or clear benefits for the end user do not need to be included. +Example: “Optimized internal algorithms.” + +- Minor bug fixes: Bug fixes that do not impact the general use or end-user experience can be omitted. +Example: “Fixed a small typo in the code.” + +- Documentation-only changes: Changes that affect only the documentation, without modifying the software behavior, usually don’t need to be included. +Example: “Updated README.md to reflect new dependencies.” + +- Excessive technical details: Overly technical information that is irrelevant to the end user or does not provide context on the impact of the change should be avoided. +Example: “Changed memory management in class X.” + +- Maintainer entries: Changes related only to the development or internal maintenance process, such as CI/CD tool configuration adjustments, are generally not relevant for the changelog. +Example: “Updated GitHub Actions configuration.” + +- A bug introduced and fixed in the same release does not need a changelog entry. + +Avoid including this information to keep the changelog focused and useful for project users and contributors. + +#### Writing good changelog entries + +A good changelog entry should be both descriptive and concise. It should explain the change to a reader with no prior context about the change. If it’s hard to be both concise and descriptive, lean toward being more descriptive. + +- **Bad** : Go to the project order. +- **Good**: Display the user’s starred projects at the top of the “Go to project” dropdown. + +The first example provides no context on where the change was made, why it was made, or how it benefits the user. + +- **Bad**: Copy (some text) to the clipboard. +- **Good**: Update the tooltip of “Copy to clipboard” to indicate what is being copied. + +Again, the first example is too vague and provides no context. + +- **Bad**: Fix and improve CSS and HTML issues in the mini pipeline graph and builds dropdown. +- **Good**: Fix tooltips and hover states in the mini pipeline graph and builds dropdown. + +The first example is too focused on implementation details. Users don’t care that we changed CSS and HTML, they care about the final result of those changes. + +- **Bad**: Remove null values in the Commit object array returned by find_commits_by_message_with_elastic. +- **Good**: Fix 500 errors caused by Elasticsearch results referencing commits already collected by the garbage collector. + +The first example focuses on how we fixed something, not on what was fixed. The rewritten version clearly describes the final benefit to the user (fewer 500 errors) and when it happens (when searching for commits with Elasticsearch). + +Use your best judgment and try to put yourself in the position of someone reading the compiled changelog. Does this entry add value? Does it provide context on where and why the change was made? + +#### How to add an entry to the changelog + +The changelog is available in the [CHANGELOG.md][changelog] file. + +First, you need to identify the type of your change. Types of changes: + +- `Added` for new features. +- `Changed` for changes to existing features. +- `Deprecated` for features that will soon be removed. +- `Fixed` for any bug fixes. +- `Removed` for features that were removed. +- `Security` in case of vulnerabilities. + +You should always add new entries to the changelog in the `Unreleased` section. At the time of release, we will move the changes from the `Unreleased` section to a new version section. + +So, within the `Unreleased` section, you should add your entry to the appropriate section by type. If there is no section yet for the type of your change, you should add one. + +Let’s see some examples. Suppose you have a new `Fixed` change to add, and the current CHANGELOG.md file looks like this: + +```md +## [Unreleased] +### Added +- Utility `get_address_from_cep` [#358](https://github.com/brazilian-utils/brutils-python/pull/358) + +### Changed +- Utility `fmt_voter_id` renamed to `format_voter_id` [#221](https://github.com/brazilian-utils/brutils-python/issues/221) +``` + +You would need to add a new `Fixed` section and include your new entry there: + +```md +## [Unreleased] +### Added +- Utility `get_address_from_cep` [#358](https://github.com/brazilian-utils/brutils-python/pull/358) + +### Changed +- Utility `fmt_voter_id` renamed to `format_voter_id` [#221](https://github.com/brazilian-utils/brutils-python/issues/221) + +### Fixed +- My changelog message here. [#]() ``` -Create the number of changes/commits you need and push them. +Note that the order of sections by type matters. We have a lint that checks this, so the sections must be ordered alphabetically. First `Added`, then `Changed`, third `Deprecated`, and so on. + +Now, let’s say you have another entry to add, and its type is `Added`. Since we already have a section for that, you should just add a new line: -### 11. Add changelog entries +```md +## [Unreleased] +### Added +- Utility `get_address_from_cep` [#358](https://github.com/brazilian-utils/brutils-python/pull/358) +- My other changelog message here. [#]() -[Add a changelog entry][keep-a-changelog] to CHANGELOG.md. +### Changed +- Utility `fmt_voter_id` renamed to `format_voter_id` [#221](https://github.com/brazilian-utils/brutils-python/issues/221) -### 12. Create a GitHub PR +### Fixed +- My changelog message here. [#]() +``` + +This content is based on the [Keep a Changelog][keep-a-changelog] site, as we follow its guidelines. + +### 13. Create a GitHub PR [Create a GitHub PR][github-creating-a-pr]. -### 13. Update your branch if needed. +### 14. Update your branch if needed. -[Make sure your branch is updated with main][github-sync-pr]. +[Ensure your branch is up to date with main][github-sync-pr]. # Release a New Version @@ -196,65 +529,66 @@ Here you will find how to deploy a new production version of brutils: #### Create the Issue -For the issue creation, you can use the feature template, with the issue name being `Release v`. [Example](https://github.com/brazilian-utils/brutils-python/issues/322) +To create the issue, you can use the feature template, naming the issue Release v. [Example](https://github.com/brazilian-utils/brutils-python/issues/322) #### Create a Branch -The branch name created for the release is related to the Issue number, as shown in [this example](https://github.com/brazilian-utils/brutils-python/pull/326) +The name of the branch created for the release is related to the Issue number, as shown in [this example](https://github.com/brazilian-utils/brutils-python/pull/326) ### 2. Create a Release PR -#### Bump the lib Version +#### Update the Library Version Increment the version number, following the [Semantic Versioning][semantic-versioning], in the `pyproject.toml` file: https://github.com/brazilian-utils/brutils-python/blob/main/pyproject.toml#L3 #### Update the CHANGELOG.md -Add a new version title with the new version number and the current date, like -[this](https://github.com/brazilian-utils/brutils-python/blob/main/CHANGELOG.md?plain=1#L9). +Add a title for the new version with the new number and the current date, as seen in [this example](https://github.com/brazilian-utils/brutils-python/blob/main/CHANGELOG.md?plain=1#L9). -And add the version links, like [this](https://github.com/antoniamaia/brutils-python/blob/eac770e8b213532d2bb5948d117f6f4684f65be2/CHANGELOG.md?plain=1#L76) +And add the version links, like [this example](https://github.com/antoniamaia/brutils-python/blob/eac770e8b213532d2bb5948d117f6f4684f65be2/CHANGELOG.md?plain=1#L76) #### Create the PR -Create a PR named `Release v` containing these two changes above. +Create a PR named `Release v` containing the two changes mentioned above. In the description of the Pull Request, add the modified section of the changelog. + [Example of Release PR](https://github.com/brazilian-utils/brutils-python/pull/128) #### Merge the PR -Once the PR has been accepted and passed on all checks, merge it. +Once the PR is accepted and passes all checks, merge it. ### 2. Deploy via GitHub -Deploy production is automatically done when a [new release is created][creating-releases] on GitHub. +The new version release in production is done automatically when a [new release is created][creating-releases] on GitHub. -- The `tag version` should be `v` (e.g `v2.0.0`). -- The `release title` should be the same as tag version (e.g `v2.0.0`). -- The `release description` should be the content copied from the CHANGELOG.md file from the +- Fill in the `tag version` should be `v` (e.g `v2.0.0`). +- Fill in the `release title` should be the same as tag version (e.g `v2.0.0`). +- Fill in the `release description` should be the content copied from the CHANGELOG.md file from the corresponding version section. Real examples are available at: https://github.com/brazilian-utils/brutils-python/releases -When the Deploy on GitHub is done, the new version will be also automatically deployed on -[PyPI][brutils-on-pypi]. Download the new brutils version from PyPI and test if everything is -working as expected. +When the GitHub deployment is completed, the new version will also be automatically released on +[PyPI][brutils-on-pypi]. Download the new brutils version from PyPI and test to ensure everything is working as expected. [brutils-issues]: https://github.com/brazilian-utils/brutils-python/issues [brutils-on-pypi]: https://pypi.org/project/brutils/ -[creating-releases]: https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release +[brutils-releases]: https://github.com/brazilian-utils/brutils-python/releases +[changelog]: https://github.com/brazilian-utils/brutils-python/blob/main/CHANGELOG.md +[creating-releases]: https://docs.github.com/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release [docstring-definition]: https://www.python.org/dev/peps/pep-0257/#what-is-a-docstring -[github-cloning]: https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository -[github-creating-a-pr]: https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request -[github-forking]: https://docs.github.com/en/get-started/quickstart/contributing-to-projects +[github-cloning]: https://docs.github.com/repositories/creating-and-managing-repositories/cloning-a-repository +[github-creating-a-pr]: https://docs.github.com/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request +[github-forking]: https://docs.github.com/get-started/quickstart/contributing-to-projects [github-join]: https://github.com/join -[github-sync-pr]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/keeping-your-pull-request-in-sync-with-the-base-branch -[install-git]: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git -[keep-a-changelog]: https://keepachangelog.com/en/1.1.0/ +[github-sync-pr]: https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/keeping-your-pull-request-in-sync-with-the-base-branch +[keep-a-changelog]: https://keepachangelog.com/en/1.0.0/ [poetry]: https://python-poetry.org/docs/#installation [python]: https://www.python.org/downloads/ -[semantic-versioning]: https://semver.org/ +[release-pr-example]: https://github.com/brazilian-utils/brutils-python/pull/326 +[semantic-versioning]: https://semver.org [virtualenv]: https://virtualenv.pypa.io/en/latest/ diff --git a/MAINTAINING.md b/MAINTAINING.md new file mode 100644 index 00000000..5f99446b --- /dev/null +++ b/MAINTAINING.md @@ -0,0 +1,177 @@ +# Prompt ChatGPT para Criar Issues + +## Exemplo: formatar moeda brasileira + +- Criar uma issue para o repositório brutils-python. +- Issue: formatar moeda brasileira +- nome da função: format_brl +- entrada: float +- saída: string formatada +- caso entrada seja inválida, retornar None +- Não implementar a lógica da função. Apenas deixar a docstring e um comentário `# implementar a lógica da função aqui` +- Considerar o maior número de edge cases possíveis +- Criar testes unitários para todos os edge cases +- Estes são os utilitários já existentes na lib: + +```md +- [CPF](#cpf) + - [is\_valid\_cpf](#is_valid_cpf) + - [format\_cpf](#format_cpf) + - [remove\_symbols\_cpf](#remove_symbols_cpf) + - [generate\_cpf](#generate_cpf) +- [CNPJ](#cnpj) + - [is\_valid\_cnpj](#is_valid_cnpj) + - [format\_cnpj](#format_cnpj) + - [remove\_symbols\_cnpj](#remove_symbols_cnpj) + - [generate\_cnpj](#generate_cnpj) +- [CEP](#cep) + - [is\_valid\_cep](#is_valid_cep) + - [format\_cep](#format_cep) + - [remove\_symbols\_cep](#remove_symbols_cep) + - [generate\_cep](#generate_cep) + - [get\_address\_from\_cep](#get_address_from_cep) + - [get\_cep\_information\_from\_address](#get_cep_information_from_address) +- [Telefone](#telefone) + - [is\_valid\_phone](#is_valid_phone) + - [format\_phone](#format_phone) + - [remove\_symbols\_phone](#remove_symbols_phone) + - [remove\_international\_dialing\_code](#remove_international_dialing_code) + - [generate\_phone](#generate_phone) +- [Email](#email) + - [is\_valid\_email](#is_valid_email) +- [Placa de Carro](#placa-de-carro) + - [is\_valid\_license\_plate](#is_valid_license_plate) + - [format\_license\_plate](#format_license_plate) + - [remove\_symbols\_license\_plate](#remove_symbols_license_plate) + - [generate\_license\_plate](#generate_license_plate) + - [convert\_license\_plate\_to\_mercosul](#convert_license_plate_to_mercosul) + - [get\_format\_license\_plate](#get_format_license_plate) +- [PIS](#pis) + - [is\_valid\_pis](#is_valid_pis) + - [format\_pis](#format_pis) + - [remove\_symbols\_pis](#remove_symbols_pis) + - [generate\_pis](#generate_pis) +- [Processo Jurídico](#processo-jurídico) + - [is\_valid\_legal\_process](#is_valid_legal_process) + - [format\_legal\_process](#format_legal_process) + - [remove\_symbols\_legal\_process](#remove_symbols_legal_process) + - [generate\_legal\_process](#generate_legal_process) +- [Título Eleitoral](#titulo-eleitoral) + - [is_valid_voter_id](#is_valid_voter_id) + - [format_voter_id](#format_voter_id) + - [generate_voter_id](#generate_voter_id) +- [IBGE](#ibge) + - [convert_code_to_uf](#convert_code_to_uf) +``` + +- Seguindo exatamento o mesmo modelo dessa issue: + +```md +Título da Issue: Conversão de Nome de Estado para UF + +**Seu pedido de recurso está relacionado a um problema? Por favor, descreva.** + +Dado o nome completo de um estado brasileiro, quero obter o código de Unidade Federativa (UF) correspondente. Isso é útil para conversão de nomes completos de estados em siglas utilizadas em sistemas e documentos. + +Por exemplo, converter `"São Paulo"` para `"SP"`. + +**Descreva a solução que você gostaria** + +* Uma função `convert_text_to_uf`, que recebe o nome completo do estado (string) e retorna o código UF correspondente. +* A função deve ignorar maiúsculas e minúsculas, e também deve desconsiderar acentos e o caractere especial ç (considerando c também). +* A função deve verificar se o nome completo é válido e retornar o código UF correspondente. +* Se o nome completo não for válido, a função deve retornar `None`. +* A função deve lidar com todos os estados e o Distrito Federal do Brasil. +* A lista das UFs e seus nomes completos já existe no arquivo `brutils/data/enums/uf.py`. Ela deve ser reutilizada. + +**Descreva alternativas que você considerou** + +1. Seguir até o passo 8 do [guia de contribuição](https://github.com/brazilian-utils/brutils-python/blob/main/CONTRIBUTING.md#primeira-contribui%C3%A7%C3%A3o). + +2. Como parte do passo 8, criar o arquivo: `brutils-python/brutils/ibge/uf.py`. + + ```python + def convert_text_to_uf(state_name): # type: (str) -> str | None + """ + Converts a given Brazilian state full name to its corresponding UF code. + + This function takes the full name of a Brazilian state and returns the corresponding + 2-letter UF code. It handles all Brazilian states and the Federal District. + + Args: + state_name (str): The full name of the state to be converted. + + Returns: + str or None: The UF code corresponding to the full state name, + or None if the full state name is invalid. + + Example: + >>> convert_text_to_uf('São Paulo') + "SP" + >>> convert_text_to_uf('Rio de Janeiro') + "RJ" + >>> convert_text_to_uf('Minas Gerais') + "MG" + >>> convert_text_to_uf('Distrito Federal') + "DF" + >>> convert_text_to_uf('Estado Inexistente') + None + """ + # implementar a lógica da função aqui + ``` + + Importar a nova função no arquivo `brutils-python/brutils/__init__.py`: + + ```python + # UF Imports + from brutils.ibge.uf import ( + convert_text_to_uf, + ) + ``` + + E adicionar o nome da nova função na lista `__all__` do mesmo arquivo `brutils-python/brutils/__init__.py`: + + ```python + __all__ = [ + ... + # UF + 'convert_text_to_uf', + ] + ``` + +3. Como parte do passo 9, criar o arquivo de teste: `brutils-python/tests/test_uf.py`. + + ```python + from unittest import TestCase + from brutils.ibge.uf import convert_text_to_uf + + class TestUF(TestCase): + def test_convert_text_to_uf(self): + # Testes para nomes válidos + self.assertEqual(convert_text_to_uf('São Paulo'), "SP") + self.assertEqual(convert_text_to_uf('Rio de Janeiro'), "RJ") + self.assertEqual(convert_text_to_uf('Minas Gerais'), "MG") + self.assertEqual(convert_text_to_uf('Distrito Federal'), "DF") + self.assertEqual(convert_text_to_uf('são paulo'), "SP") # Teste com minúsculas + self.assertEqual(convert_text_to_uf('riO de janeiRo'), "RJ") # Teste com misturas de maiúsculas e minúsculas + self.assertEqual(convert_text_to_uf('minas gerais'), "MG") # Teste com minúsculas + self.assertEqual(convert_text_to_uf('sao paulo'), "SP") # Teste sem acento + + # Testes para nomes inválidos + self.assertIsNone(convert_text_to_uf('Estado Inexistente')) # Nome não existe + self.assertIsNone(convert_text_to_uf('')) # Nome vazio + self.assertIsNone(convert_text_to_uf('123')) # Nome com números + self.assertIsNone(convert_text_to_uf('São Paulo SP')) # Nome com sigla incluída + self.assertIsNone(convert_text_to_uf('A')) # Nome com letra não mapeada + self.assertIsNone(convert_text_to_uf('ZZZ')) # Nome com mais de 2 letras + + # implementar mais casos de teste aqui se necessário + ``` + +4. Seguir os passos seguintes do [guia de contribuição](https://github.com/brazilian-utils/brutils-python/blob/main/CONTRIBUTING.md#primeira-contribui%C3%A7%C3%A3o). + +**Contexto adicional** + +* A lista de estados e suas siglas é definida pelo Instituto Brasileiro de Geografia e Estatística (IBGE). Para mais detalhes, consulte o [site do IBGE](https://atendimento.tecnospeed.com.br/hc/pt-br/articles/360021494734-Tabela-de-C%C3%B3digo-de-UF-do-IBGE). +* A função deve lidar com a normalização de texto, incluindo a remoção de acentos e a conversão para minúsculas para garantir que o texto seja comparado de forma consistente. +``` diff --git a/README.md b/README.md index ae47d910..0308eba5 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,8 @@ False - [generate\_phone](#generate_phone) - [Email](#email) - [is\_valid\_email](#is_valid_email) +- [Data](#date) + - [convert\_date\_to_text](#convert_date_to_text) - [Placa de Carro](#placa-de-carro) - [is\_valid\_license\_plate](#is_valid_license_plate) - [format\_license\_plate](#format_license_plate) @@ -87,6 +89,10 @@ False - [is_valid_voter_id](#is_valid_voter_id) - [format_voter_id](#format_voter_id) - [generate_voter_id](#generate_voter_id) +- [IBGE](#ibge) + - [get_code_by_municipality_name](#get_code_by_municipality_name) + - [convert_code_to_uf](#convert_code_to_uf) + - [get\_municipality\_by\_code](#get_municipality_by_code) ## CPF @@ -626,6 +632,33 @@ False False ``` +## Data + +## convert_date_to_text + +Converte uma data em sua representação textual. + +Argumentos: + - date (str): Uma string no formato dd/mm/aaaa + +Retorna: + - A represetação textual da data ou None caso a data esteja mal formatada ou a data seja inválida. + +Exemplo: + +````python +>>> from brutils import convert_date_to_text +>>> convert_date_to_text("25/12/2000") +"Vinte e cinco de dezembro de dois mil" +>>> convert_date_to_text("31/02/2000") +None +>>> convert_date_to_text("29/02/2024") +"Vinte e nove de fevereiro de dois mil e vinte e quatro" +>>> convert_date_to_text("1/08/2024") +"Primeiro de agosto de dois mil e vinte e quatro" +```` + + ## Placa de Carro ### is_valid_license_plate @@ -1084,7 +1117,79 @@ Exemplo: '950125640248' ``` +## IBGE + +### convert_code_to_uf +Converte um determinado código do IBGE (string de 2 dígitos) para sua UF (abreviatura estadual) correspondente. + +Args: + * code (str): O código IBGE de 2 dígitos a ser convertido. + +Retorna: + * str or None: O código UF correspondente ao código IBGE, ou None se o + código IBGE for inválido. + +Exemplo: + +```python +>>> from brutils.ibge.uf import convert_code_to_uf +>>> convert_code_to_uf("12") +'AC' +>>> convert_code_to_uf("33") +'RJ' +>>> convert_code_to_uf("99") +>>> +``` + +### get_municipality_by_code + +Retorna o nome do município e a UF para um código do IBGE. + +Args: + * code (str): O código do IBGE para o município. + +Returns: + * tuple: Retorna uma Tupla formatado como ("Município", "UF"). + * None: Retorna None se o código for inválido. + +Example: + +```python +>>> from brutils import get_municipality_by_code +>>> get_municipality_by_code(3550308) +("São Paulo", "SP") +``` + +### get_code_by_municipality_name + +Retorna o código IBGE para um dado nome de município e código de UF. +Essa função recebe uma string representando o nome de um município e o código da UF, e retorna o código IBGE correspondente (string). A função lida com os nomes ignorando diferenças de maiúsculas, acentos, tratando o caractere "ç" como "c", e ignorando diferenças de maiúsculas para o código da UF. + +Argumentos: + * municipality_name (str): O nome do município. + * uf (str): O código UF do estado. + +Retorna: + * str: O código IBGE do município. Retorna None se o nome não for válido ou não existir. + +Exemplo: + +```python +>>> from brutils import get_code_by_municipality_name +>>> get_code_by_municipality_name("São Paulo", "SP") +"3550308" +>>> get_code_by_municipality_name("goiania", "go") +"5208707" +>>> get_code_by_municipality_name("Conceição do Coité", "BA") +"2908408" +>>> get_code_by_municipality_name("conceicao do Coite", "Ba") +"2908408" +>>> get_code_by_municipality_name("Municipio Inexistente", "") +None +>>> get_code_by_municipality_name("Municipio Inexistente", "RS") +None +``` # Novos Utilitários e Reportar Bugs Caso queira sugerir novas funcionalidades ou reportar bugs, basta criar diff --git a/README_EN.md b/README_EN.md index 921e65a8..a3fc4926 100644 --- a/README_EN.md +++ b/README_EN.md @@ -58,6 +58,8 @@ False - [generate\_cep](#generate_cep) - [get\_address\_from\_cep](#get_address_from_cep) - [get\_cep\_information\_from\_address](#get_cep_information_from_address) +- [Date](#date) + - [convert\_date\_to_text](#convert_date_to_text) - [Phone](#phone) - [is\_valid\_phone](#is_valid_phone) - [format\_phone](#format_phone) @@ -87,6 +89,10 @@ False - [is_valid_voter_id](#is_valid_voter_id) - [format_voter_id](#format_voter_id) - [generate_voter_id](#generate_voter_id) +- [IBGE](#ibge) + - [convert_code_to_uf](#convert_code_to_uf) + - [get\_municipality\_by\_code](#get_municipality_by_code) + - [get_code_by_municipality_name](#get_code_by_municipality_name) ## CPF @@ -446,6 +452,32 @@ Example: ] ``` +## Date + +### convert_date_to_text +Convert a brazilian date (dd/mm/yyyy) format in their portuguese textual representation. + +Args: + - date (str): A date in a string format dd/mm/yyyy. + +Return: + - (str) | None: A portuguese textual representation of the date or None case a date is invalid. + + +Example: + +````python +>>> from brutils import convert_date_to_text +>>> convert_date_to_text("25/12/2000") +"Vinte e cinco de dezembro de dois mil" +>>> convert_date_to_text("31/02/2000") +None +>>> convert_date_to_text("29/02/2024") +"Vinte e nove de fevereiro de dois mil e vinte e quatro" +>>> convert_date_to_text("1/08/2024") +"Primeiro de agosto de dois mil e vinte e quatro" +```` + ## Phone ### is_valid_phone @@ -1086,6 +1118,82 @@ Example: >>> generate_voter_id(federative_union ="MG") '950125640248' ``` +## IBGE + +### convert_code_to_uf +Converts a given IBGE code (2-digit string) to its corresponding UF (state abbreviation). + +Args: + * code (str): The 2-digit IBGE code to be converted. + +Retorna: + * str or None: The UF code corresponding to the IBGE code, or None if the + IBGE code is invalid. + +Exemplo: + +```python +>>> from brutils.ibge.uf import convert_code_to_uf +>>> convert_code_to_uf("12") +'AC' +>>> convert_code_to_uf("33") +'RJ' +>>> convert_code_to_uf("99") +>>> +``` + +### get_municipality_by_code + +Returns the municipality name and UF for a given IBGE code. + +Args: + * code (str): The IBGE code of the municipality. + +Returns: + * tuple: Returns a tuple formatted as ("Município", "UF"). + * None: Returns None if the code is not valid. + +Example: + +```python +>>> from brutils import get_municipality_by_code +>>> get_municipality_by_code(3550308) +("São Paulo", "SP") +``` + +### get_code_by_municipality_name + +Returns the IBGE code for a given municipality name and uf code. + +This function takes a string representing a municipality's name +and uf's code and returns the corresponding IBGE code (string). The function +will handle names by ignoring differences in case, accents, and +treating the character ç as c and ignoring case differences for the uf code. + +Args: + * municipality_name (str): The name of the municipality. + * uf (str): The uf code of the state. + +Returns: + * str: The IBGE code of the municipality. Returns None if the name is not valid or does not exist. + +Example: + +```python +>>> from brutils import get_code_by_municipality_name +>>> get_code_by_municipality_name("São Paulo", "SP") +"3550308" +>>> get_code_by_municipality_name("goiania", "go") +"5208707" +>>> get_code_by_municipality_name("Conceição do Coité", "BA") +"2908408" +>>> get_code_by_municipality_name("conceicao do Coite", "Ba") +"2908408" +>>> get_code_by_municipality_name("Municipio Inexistente", "") +None +>>> get_code_by_municipality_name("Municipio Inexistente", "RS") +None +``` # Feature Request and Bug Report diff --git a/brutils/__init__.py b/brutils/__init__.py index 168da324..ae01db88 100644 --- a/brutils/__init__.py +++ b/brutils/__init__.py @@ -42,11 +42,19 @@ remove_symbols as remove_symbols_cpf, ) +# Date imports +from brutils.date import convert_date_to_text + # Email Import from brutils.email import is_valid as is_valid_email -# UF Imports +# IBGE Imports +from brutils.ibge.municipality import ( + get_code_by_municipality_name, + get_municipality_by_code, +) from brutils.ibge.uf import ( + convert_code_to_uf, convert_uf_to_text, ) @@ -141,6 +149,8 @@ "generate_cpf", "is_valid_cpf", "remove_symbols_cpf", + # Date + "convert_date_to_text", # Email "is_valid_email", # Legal Process @@ -166,10 +176,13 @@ "generate_pis", "is_valid_pis", "remove_symbols_pis", - # UF - "convert_uf_to_text", # Voter ID "format_voter_id", "generate_voter_id", "is_valid_voter_id", + # IBGE + "get_municipality_by_code", + "get_code_by_municipality_name", + "convert_code_to_uf", + "convert_uf_to_text", ] diff --git a/brutils/data/cities_code.json b/brutils/data/cities_code.json new file mode 100644 index 00000000..9371ab3f --- /dev/null +++ b/brutils/data/cities_code.json @@ -0,0 +1,5626 @@ +{ + "RO": { + "alta floresta d'oeste": "1100015", + "alto alegre dos parecis": "1100379", + "alto paraiso": "1100403", + "alvorada d'oeste": "1100346", + "ariquemes": "1100023", + "buritis": "1100452", + "cabixi": "1100031", + "cacaulandia": "1100601", + "cacoal": "1100049", + "campo novo de rondonia": "1100700", + "candeias do jamari": "1100809", + "castanheiras": "1100908", + "cerejeiras": "1100056", + "chupinguaia": "1100924", + "colorado do oeste": "1100064", + "corumbiara": "1100072", + "costa marques": "1100080", + "cujubim": "1100940", + "espigao d'oeste": "1100098", + "governador jorge teixeira": "1101005", + "guajara-mirim": "1100106", + "itapua do oeste": "1101104", + "jaru": "1100114", + "ji-parana": "1100122", + "machadinho d'oeste": "1100130", + "ministro andreazza": "1101203", + "mirante da serra": "1101302", + "monte negro": "1101401", + "nova brasilandia d'oeste": "1100148", + "nova mamore": "1100338", + "nova uniao": "1101435", + "novo horizonte do oeste": "1100502", + "ouro preto do oeste": "1100155", + "parecis": "1101450", + "pimenta bueno": "1100189", + "pimenteiras do oeste": "1101468", + "porto velho": "1100205", + "presidente medici": "1100254", + "primavera de rondonia": "1101476", + "rio crespo": "1100262", + "rolim de moura": "1100288", + "santa luzia d'oeste": "1100296", + "sao felipe d'oeste": "1101484", + "sao francisco do guapore": "1101492", + "sao miguel do guapore": "1100320", + "seringueiras": "1101500", + "teixeiropolis": "1101559", + "theobroma": "1101609", + "urupa": "1101708", + "vale do anari": "1101757", + "vale do paraiso": "1101807", + "vilhena": "1100304" + }, + "AC": { + "acrelandia": "1200013", + "assis brasil": "1200054", + "brasileia": "1200104", + "bujari": "1200138", + "capixaba": "1200179", + "cruzeiro do sul": "1200203", + "epitaciolandia": "1200252", + "feijo": "1200302", + "jordao": "1200328", + "mancio lima": "1200336", + "manoel urbano": "1200344", + "marechal thaumaturgo": "1200351", + "placido de castro": "1200385", + "porto acre": "1200807", + "porto walter": "1200393", + "rio branco": "1200401", + "rodrigues alves": "1200427", + "santa rosa do purus": "1200435", + "sena madureira": "1200500", + "senador guiomard": "1200450", + "tarauaca": "1200609", + "xapuri": "1200708" + }, + "AM": { + "alvaraes": "1300029", + "amatura": "1300060", + "anama": "1300086", + "anori": "1300102", + "apui": "1300144", + "atalaia do norte": "1300201", + "autazes": "1300300", + "barcelos": "1300409", + "barreirinha": "1300508", + "benjamin constant": "1300607", + "beruri": "1300631", + "boa vista do ramos": "1300680", + "boca do acre": "1300706", + "borba": "1300805", + "caapiranga": "1300839", + "canutama": "1300904", + "carauari": "1301001", + "careiro": "1301100", + "careiro da varzea": "1301159", + "coari": "1301209", + "codajas": "1301308", + "eirunepe": "1301407", + "envira": "1301506", + "fonte boa": "1301605", + "guajara": "1301654", + "humaita": "1301704", + "ipixuna": "1301803", + "iranduba": "1301852", + "itacoatiara": "1301902", + "itamarati": "1301951", + "itapiranga": "1302009", + "japura": "1302108", + "jurua": "1302207", + "jutai": "1302306", + "labrea": "1302405", + "manacapuru": "1302504", + "manaquiri": "1302553", + "manaus": "1302603", + "manicore": "1302702", + "maraa": "1302801", + "maues": "1302900", + "nhamunda": "1303007", + "nova olinda do norte": "1303106", + "novo airao": "1303205", + "novo aripuana": "1303304", + "parintins": "1303403", + "pauini": "1303502", + "presidente figueiredo": "1303536", + "rio preto da eva": "1303569", + "santa isabel do rio negro": "1303601", + "santo antonio do ica": "1303700", + "sao gabriel da cachoeira": "1303809", + "sao paulo de olivenca": "1303908", + "sao sebastiao do uatuma": "1303957", + "silves": "1304005", + "tabatinga": "1304062", + "tapaua": "1304104", + "tefe": "1304203", + "tonantins": "1304237", + "uarini": "1304260", + "urucara": "1304302", + "urucurituba": "1304401" + }, + "RR": { + "alto alegre": "1400050", + "amajari": "1400027", + "boa vista": "1400100", + "bonfim": "1400159", + "canta": "1400175", + "caracarai": "1400209", + "caroebe": "1400233", + "iracema": "1400282", + "mucajai": "1400308", + "normandia": "1400407", + "pacaraima": "1400456", + "rorainopolis": "1400472", + "sao joao da baliza": "1400506", + "sao luiz": "1400605", + "uiramuta": "1400704" + }, + "PA": { + "abaetetuba": "1500107", + "abel figueiredo": "1500131", + "acara": "1500206", + "afua": "1500305", + "agua azul do norte": "1500347", + "alenquer": "1500404", + "almeirim": "1500503", + "altamira": "1500602", + "anajas": "1500701", + "ananindeua": "1500800", + "anapu": "1500859", + "augusto correa": "1500909", + "aurora do para": "1500958", + "aveiro": "1501006", + "bagre": "1501105", + "baiao": "1501204", + "bannach": "1501253", + "barcarena": "1501303", + "belem": "1501402", + "belterra": "1501451", + "benevides": "1501501", + "bom jesus do tocantins": "1501576", + "bonito": "1501600", + "braganca": "1501709", + "brasil novo": "1501725", + "brejo grande do araguaia": "1501758", + "breu branco": "1501782", + "breves": "1501808", + "bujaru": "1501907", + "cachoeira do arari": "1502004", + "cachoeira do piria": "1501956", + "cameta": "1502103", + "canaa dos carajas": "1502152", + "capanema": "1502202", + "capitao poco": "1502301", + "castanhal": "1502400", + "chaves": "1502509", + "colares": "1502608", + "conceicao do araguaia": "1502707", + "concordia do para": "1502756", + "cumaru do norte": "1502764", + "curionopolis": "1502772", + "curralinho": "1502806", + "curua": "1502855", + "curuca": "1502905", + "dom eliseu": "1502939", + "eldorado do carajas": "1502954", + "faro": "1503002", + "floresta do araguaia": "1503044", + "garrafao do norte": "1503077", + "goianesia do para": "1503093", + "gurupa": "1503101", + "igarape-acu": "1503200", + "igarape-miri": "1503309", + "inhangapi": "1503408", + "ipixuna do para": "1503457", + "irituia": "1503507", + "itaituba": "1503606", + "itupiranga": "1503705", + "jacareacanga": "1503754", + "jacunda": "1503804", + "juruti": "1503903", + "limoeiro do ajuru": "1504000", + "mae do rio": "1504059", + "magalhaes barata": "1504109", + "maraba": "1504208", + "maracana": "1504307", + "marapanim": "1504406", + "marituba": "1504422", + "medicilandia": "1504455", + "melgaco": "1504505", + "mocajuba": "1504604", + "moju": "1504703", + "mojui dos campos": "1504752", + "monte alegre": "1504802", + "muana": "1504901", + "nova esperanca do piria": "1504950", + "nova ipixuna": "1504976", + "nova timboteua": "1505007", + "novo progresso": "1505031", + "novo repartimento": "1505064", + "obidos": "1505106", + "oeiras do para": "1505205", + "oriximina": "1505304", + "ourem": "1505403", + "ourilandia do norte": "1505437", + "pacaja": "1505486", + "palestina do para": "1505494", + "paragominas": "1505502", + "parauapebas": "1505536", + "pau d'arco": "1505551", + "peixe-boi": "1505601", + "picarra": "1505635", + "placas": "1505650", + "ponta de pedras": "1505700", + "portel": "1505809", + "porto de moz": "1505908", + "prainha": "1506005", + "primavera": "1506104", + "quatipuru": "1506112", + "redencao": "1506138", + "rio maria": "1506161", + "rondon do para": "1506187", + "ruropolis": "1506195", + "salinopolis": "1506203", + "salvaterra": "1506302", + "santa barbara do para": "1506351", + "santa cruz do arari": "1506401", + "santa izabel do para": "1506500", + "santa luzia do para": "1506559", + "santa maria das barreiras": "1506583", + "santa maria do para": "1506609", + "santana do araguaia": "1506708", + "santarem": "1506807", + "santarem novo": "1506906", + "santo antonio do taua": "1507003", + "sao caetano de odivelas": "1507102", + "sao domingos do araguaia": "1507151", + "sao domingos do capim": "1507201", + "sao felix do xingu": "1507300", + "sao francisco do para": "1507409", + "sao geraldo do araguaia": "1507458", + "sao joao da ponta": "1507466", + "sao joao de pirabas": "1507474", + "sao joao do araguaia": "1507508", + "sao miguel do guama": "1507607", + "sao sebastiao da boa vista": "1507706", + "sapucaia": "1507755", + "senador jose porfirio": "1507805", + "soure": "1507904", + "tailandia": "1507953", + "terra alta": "1507961", + "terra santa": "1507979", + "tome-acu": "1508001", + "tracuateua": "1508035", + "trairao": "1508050", + "tucuma": "1508084", + "tucurui": "1508100", + "ulianopolis": "1508126", + "uruara": "1508159", + "vigia": "1508209", + "viseu": "1508308", + "vitoria do xingu": "1508357", + "xinguara": "1508407" + }, + "AP": { + "amapa": "1600105", + "calcoene": "1600204", + "cutias": "1600212", + "ferreira gomes": "1600238", + "itaubal": "1600253", + "laranjal do jari": "1600279", + "macapa": "1600303", + "mazagao": "1600402", + "oiapoque": "1600501", + "pedra branca do amapari": "1600154", + "porto grande": "1600535", + "pracuuba": "1600550", + "santana": "1600600", + "serra do navio": "1600055", + "tartarugalzinho": "1600709", + "vitoria do jari": "1600808" + }, + "TO": { + "abreulandia": "1700251", + "aguiarnopolis": "1700301", + "alianca do tocantins": "1700350", + "almas": "1700400", + "alvorada": "1700707", + "ananas": "1701002", + "angico": "1701051", + "aparecida do rio negro": "1701101", + "aragominas": "1701309", + "araguacema": "1701903", + "araguacu": "1702000", + "araguaina": "1702109", + "araguana": "1702158", + "araguatins": "1702208", + "arapoema": "1702307", + "arraias": "1702406", + "augustinopolis": "1702554", + "aurora do tocantins": "1702703", + "axixa do tocantins": "1702901", + "babaculandia": "1703008", + "bandeirantes do tocantins": "1703057", + "barra do ouro": "1703073", + "barrolandia": "1703107", + "bernardo sayao": "1703206", + "bom jesus do tocantins": "1703305", + "brasilandia do tocantins": "1703602", + "brejinho de nazare": "1703701", + "buriti do tocantins": "1703800", + "cachoeirinha": "1703826", + "campos lindos": "1703842", + "cariri do tocantins": "1703867", + "carmolandia": "1703883", + "carrasco bonito": "1703891", + "caseara": "1703909", + "centenario": "1704105", + "chapada da natividade": "1705102", + "chapada de areia": "1704600", + "colinas do tocantins": "1705508", + "colmeia": "1716703", + "combinado": "1705557", + "conceicao do tocantins": "1705607", + "couto magalhaes": "1706001", + "cristalandia": "1706100", + "crixas do tocantins": "1706258", + "darcinopolis": "1706506", + "dianopolis": "1707009", + "divinopolis do tocantins": "1707108", + "dois irmaos do tocantins": "1707207", + "duere": "1707306", + "esperantina": "1707405", + "fatima": "1707553", + "figueiropolis": "1707652", + "filadelfia": "1707702", + "formoso do araguaia": "1708205", + "goianorte": "1708304", + "goiatins": "1709005", + "guarai": "1709302", + "gurupi": "1709500", + "ipueiras": "1709807", + "itacaja": "1710508", + "itaguatins": "1710706", + "itapiratins": "1710904", + "itapora do tocantins": "1711100", + "jau do tocantins": "1711506", + "juarina": "1711803", + "lagoa da confusao": "1711902", + "lagoa do tocantins": "1711951", + "lajeado": "1712009", + "lavandeira": "1712157", + "lizarda": "1712405", + "luzinopolis": "1712454", + "marianopolis do tocantins": "1712504", + "mateiros": "1712702", + "maurilandia do tocantins": "1712801", + "miracema do tocantins": "1713205", + "miranorte": "1713304", + "monte do carmo": "1713601", + "monte santo do tocantins": "1713700", + "muricilandia": "1713957", + "natividade": "1714203", + "nazare": "1714302", + "nova olinda": "1714880", + "nova rosalandia": "1715002", + "novo acordo": "1715101", + "novo alegre": "1715150", + "novo jardim": "1715259", + "oliveira de fatima": "1715507", + "palmas": "1721000", + "palmeirante": "1715705", + "palmeiras do tocantins": "1713809", + "palmeiropolis": "1715754", + "paraiso do tocantins": "1716109", + "parana": "1716208", + "pau d'arco": "1716307", + "pedro afonso": "1716505", + "peixe": "1716604", + "pequizeiro": "1716653", + "pindorama do tocantins": "1717008", + "piraque": "1717206", + "pium": "1717503", + "ponte alta do bom jesus": "1717800", + "ponte alta do tocantins": "1717909", + "porto alegre do tocantins": "1718006", + "porto nacional": "1718204", + "praia norte": "1718303", + "presidente kennedy": "1718402", + "pugmil": "1718451", + "recursolandia": "1718501", + "riachinho": "1718550", + "rio da conceicao": "1718659", + "rio dos bois": "1718709", + "rio sono": "1718758", + "sampaio": "1718808", + "sandolandia": "1718840", + "santa fe do araguaia": "1718865", + "santa maria do tocantins": "1718881", + "santa rita do tocantins": "1718899", + "santa rosa do tocantins": "1718907", + "santa tereza do tocantins": "1719004", + "santa terezinha do tocantins": "1720002", + "sao bento do tocantins": "1720101", + "sao felix do tocantins": "1720150", + "sao miguel do tocantins": "1720200", + "sao salvador do tocantins": "1720259", + "sao sebastiao do tocantins": "1720309", + "sao valerio": "1720499", + "silvanopolis": "1720655", + "sitio novo do tocantins": "1720804", + "sucupira": "1720853", + "tabocao": "1708254", + "taguatinga": "1720903", + "taipas do tocantins": "1720937", + "talisma": "1720978", + "tocantinia": "1721109", + "tocantinopolis": "1721208", + "tupirama": "1721257", + "tupiratins": "1721307", + "wanderlandia": "1722081", + "xambioa": "1722107" + }, + "MA": { + "acailandia": "2100055", + "afonso cunha": "2100105", + "agua doce do maranhao": "2100154", + "alcantara": "2100204", + "aldeias altas": "2100303", + "altamira do maranhao": "2100402", + "alto alegre do maranhao": "2100436", + "alto alegre do pindare": "2100477", + "alto parnaiba": "2100501", + "amapa do maranhao": "2100550", + "amarante do maranhao": "2100600", + "anajatuba": "2100709", + "anapurus": "2100808", + "apicum-acu": "2100832", + "araguana": "2100873", + "araioses": "2100907", + "arame": "2100956", + "arari": "2101004", + "axixa": "2101103", + "bacabal": "2101202", + "bacabeira": "2101251", + "bacuri": "2101301", + "bacurituba": "2101350", + "balsas": "2101400", + "barao de grajau": "2101509", + "barra do corda": "2101608", + "barreirinhas": "2101707", + "bela vista do maranhao": "2101772", + "belagua": "2101731", + "benedito leite": "2101806", + "bequimao": "2101905", + "bernardo do mearim": "2101939", + "boa vista do gurupi": "2101970", + "bom jardim": "2102002", + "bom jesus das selvas": "2102036", + "bom lugar": "2102077", + "brejo": "2102101", + "brejo de areia": "2102150", + "buriti": "2102200", + "buriti bravo": "2102309", + "buriticupu": "2102325", + "buritirana": "2102358", + "cachoeira grande": "2102374", + "cajapio": "2102408", + "cajari": "2102507", + "campestre do maranhao": "2102556", + "candido mendes": "2102606", + "cantanhede": "2102705", + "capinzal do norte": "2102754", + "carolina": "2102804", + "carutapera": "2102903", + "caxias": "2103000", + "cedral": "2103109", + "central do maranhao": "2103125", + "centro do guilherme": "2103158", + "centro novo do maranhao": "2103174", + "chapadinha": "2103208", + "cidelandia": "2103257", + "codo": "2103307", + "coelho neto": "2103406", + "colinas": "2103505", + "conceicao do lago-acu": "2103554", + "coroata": "2103604", + "cururupu": "2103703", + "davinopolis": "2103752", + "dom pedro": "2103802", + "duque bacelar": "2103901", + "esperantinopolis": "2104008", + "estreito": "2104057", + "feira nova do maranhao": "2104073", + "fernando falcao": "2104081", + "formosa da serra negra": "2104099", + "fortaleza dos nogueiras": "2104107", + "fortuna": "2104206", + "godofredo viana": "2104305", + "goncalves dias": "2104404", + "governador archer": "2104503", + "governador edison lobao": "2104552", + "governador eugenio barros": "2104602", + "governador luiz rocha": "2104628", + "governador newton bello": "2104651", + "governador nunes freire": "2104677", + "graca aranha": "2104701", + "grajau": "2104800", + "guimaraes": "2104909", + "humberto de campos": "2105005", + "icatu": "2105104", + "igarape do meio": "2105153", + "igarape grande": "2105203", + "imperatriz": "2105302", + "itaipava do grajau": "2105351", + "itapecuru mirim": "2105401", + "itinga do maranhao": "2105427", + "jatoba": "2105450", + "jenipapo dos vieiras": "2105476", + "joao lisboa": "2105500", + "joselandia": "2105609", + "junco do maranhao": "2105658", + "lago da pedra": "2105708", + "lago do junco": "2105807", + "lago dos rodrigues": "2105948", + "lago verde": "2105906", + "lagoa do mato": "2105922", + "lagoa grande do maranhao": "2105963", + "lajeado novo": "2105989", + "lima campos": "2106003", + "loreto": "2106102", + "luis domingues": "2106201", + "magalhaes de almeida": "2106300", + "maracacume": "2106326", + "maraja do sena": "2106359", + "maranhaozinho": "2106375", + "mata roma": "2106409", + "matinha": "2106508", + "matoes": "2106607", + "matoes do norte": "2106631", + "milagres do maranhao": "2106672", + "mirador": "2106706", + "miranda do norte": "2106755", + "mirinzal": "2106805", + "moncao": "2106904", + "montes altos": "2107001", + "morros": "2107100", + "nina rodrigues": "2107209", + "nova colinas": "2107258", + "nova iorque": "2107308", + "nova olinda do maranhao": "2107357", + "olho d'agua das cunhas": "2107407", + "olinda nova do maranhao": "2107456", + "paco do lumiar": "2107506", + "palmeirandia": "2107605", + "paraibano": "2107704", + "parnarama": "2107803", + "passagem franca": "2107902", + "pastos bons": "2108009", + "paulino neves": "2108058", + "paulo ramos": "2108108", + "pedreiras": "2108207", + "pedro do rosario": "2108256", + "penalva": "2108306", + "peri mirim": "2108405", + "peritoro": "2108454", + "pindare-mirim": "2108504", + "pinheiro": "2108603", + "pio xii": "2108702", + "pirapemas": "2108801", + "pocao de pedras": "2108900", + "porto franco": "2109007", + "porto rico do maranhao": "2109056", + "presidente dutra": "2109106", + "presidente juscelino": "2109205", + "presidente medici": "2109239", + "presidente sarney": "2109270", + "presidente vargas": "2109304", + "primeira cruz": "2109403", + "raposa": "2109452", + "riachao": "2109502", + "ribamar fiquene": "2109551", + "rosario": "2109601", + "sambaiba": "2109700", + "santa filomena do maranhao": "2109759", + "santa helena": "2109809", + "santa ines": "2109908", + "santa luzia": "2110005", + "santa luzia do parua": "2110039", + "santa quiteria do maranhao": "2110104", + "santa rita": "2110203", + "santana do maranhao": "2110237", + "santo amaro do maranhao": "2110278", + "santo antonio dos lopes": "2110302", + "sao benedito do rio preto": "2110401", + "sao bento": "2110500", + "sao bernardo": "2110609", + "sao domingos do azeitao": "2110658", + "sao domingos do maranhao": "2110708", + "sao felix de balsas": "2110807", + "sao francisco do brejao": "2110856", + "sao francisco do maranhao": "2110906", + "sao joao batista": "2111003", + "sao joao do caru": "2111029", + "sao joao do paraiso": "2111052", + "sao joao do soter": "2111078", + "sao joao dos patos": "2111102", + "sao jose de ribamar": "2111201", + "sao jose dos basilios": "2111250", + "sao luis": "2111300", + "sao luis gonzaga do maranhao": "2111409", + "sao mateus do maranhao": "2111508", + "sao pedro da agua branca": "2111532", + "sao pedro dos crentes": "2111573", + "sao raimundo das mangabeiras": "2111607", + "sao raimundo do doca bezerra": "2111631", + "sao roberto": "2111672", + "sao vicente ferrer": "2111706", + "satubinha": "2111722", + "senador alexandre costa": "2111748", + "senador la rocque": "2111763", + "serrano do maranhao": "2111789", + "sitio novo": "2111805", + "sucupira do norte": "2111904", + "sucupira do riachao": "2111953", + "tasso fragoso": "2112001", + "timbiras": "2112100", + "timon": "2112209", + "trizidela do vale": "2112233", + "tufilandia": "2112274", + "tuntum": "2112308", + "turiacu": "2112407", + "turilandia": "2112456", + "tutoia": "2112506", + "urbano santos": "2112605", + "vargem grande": "2112704", + "viana": "2112803", + "vila nova dos martirios": "2112852", + "vitoria do mearim": "2112902", + "vitorino freire": "2113009", + "ze doca": "2114007" + }, + "PI": { + "acaua": "2200053", + "agricolandia": "2200103", + "agua branca": "2200202", + "alagoinha do piaui": "2200251", + "alegrete do piaui": "2200277", + "alto longa": "2200301", + "altos": "2200400", + "alvorada do gurgueia": "2200459", + "amarante": "2200509", + "angical do piaui": "2200608", + "anisio de abreu": "2200707", + "antonio almeida": "2200806", + "aroazes": "2200905", + "aroeiras do itaim": "2200954", + "arraial": "2201002", + "assuncao do piaui": "2201051", + "avelino lopes": "2201101", + "baixa grande do ribeiro": "2201150", + "barra d'alcantara": "2201176", + "barras": "2201200", + "barreiras do piaui": "2201309", + "barro duro": "2201408", + "batalha": "2201507", + "bela vista do piaui": "2201556", + "belem do piaui": "2201572", + "beneditinos": "2201606", + "bertolinia": "2201705", + "betania do piaui": "2201739", + "boa hora": "2201770", + "bocaina": "2201804", + "bom jesus": "2201903", + "bom principio do piaui": "2201919", + "bonfim do piaui": "2201929", + "boqueirao do piaui": "2201945", + "brasileira": "2201960", + "brejo do piaui": "2201988", + "buriti dos lopes": "2202000", + "buriti dos montes": "2202026", + "cabeceiras do piaui": "2202059", + "cajazeiras do piaui": "2202075", + "cajueiro da praia": "2202083", + "caldeirao grande do piaui": "2202091", + "campinas do piaui": "2202109", + "campo alegre do fidalgo": "2202117", + "campo grande do piaui": "2202133", + "campo largo do piaui": "2202174", + "campo maior": "2202208", + "canavieira": "2202251", + "canto do buriti": "2202307", + "capitao de campos": "2202406", + "capitao gervasio oliveira": "2202455", + "caracol": "2202505", + "caraubas do piaui": "2202539", + "caridade do piaui": "2202554", + "castelo do piaui": "2202604", + "caxingo": "2202653", + "cocal": "2202703", + "cocal de telha": "2202711", + "cocal dos alves": "2202729", + "coivaras": "2202737", + "colonia do gurgueia": "2202752", + "colonia do piaui": "2202778", + "conceicao do caninde": "2202802", + "coronel jose dias": "2202851", + "corrente": "2202901", + "cristalandia do piaui": "2203008", + "cristino castro": "2203107", + "curimata": "2203206", + "currais": "2203230", + "curral novo do piaui": "2203271", + "curralinhos": "2203255", + "demerval lobao": "2203305", + "dirceu arcoverde": "2203354", + "dom expedito lopes": "2203404", + "dom inocencio": "2203453", + "domingos mourao": "2203420", + "elesbao veloso": "2203503", + "eliseu martins": "2203602", + "esperantina": "2203701", + "fartura do piaui": "2203750", + "flores do piaui": "2203800", + "floresta do piaui": "2203859", + "floriano": "2203909", + "francinopolis": "2204006", + "francisco ayres": "2204105", + "francisco macedo": "2204154", + "francisco santos": "2204204", + "fronteiras": "2204303", + "geminiano": "2204352", + "gilbues": "2204402", + "guadalupe": "2204501", + "guaribas": "2204550", + "hugo napoleao": "2204600", + "ilha grande": "2204659", + "inhuma": "2204709", + "ipiranga do piaui": "2204808", + "isaias coelho": "2204907", + "itainopolis": "2205003", + "itaueira": "2205102", + "jacobina do piaui": "2205151", + "jaicos": "2205201", + "jardim do mulato": "2205250", + "jatoba do piaui": "2205276", + "jerumenha": "2205300", + "joao costa": "2205359", + "joaquim pires": "2205409", + "joca marques": "2205458", + "jose de freitas": "2205508", + "juazeiro do piaui": "2205516", + "julio borges": "2205524", + "jurema": "2205532", + "lagoa alegre": "2205557", + "lagoa de sao francisco": "2205573", + "lagoa do barro do piaui": "2205565", + "lagoa do piaui": "2205581", + "lagoa do sitio": "2205599", + "lagoinha do piaui": "2205540", + "landri sales": "2205607", + "luis correia": "2205706", + "luzilandia": "2205805", + "madeiro": "2205854", + "manoel emidio": "2205904", + "marcolandia": "2205953", + "marcos parente": "2206001", + "massape do piaui": "2206050", + "matias olimpio": "2206100", + "miguel alves": "2206209", + "miguel leao": "2206308", + "milton brandao": "2206357", + "monsenhor gil": "2206407", + "monsenhor hipolito": "2206506", + "monte alegre do piaui": "2206605", + "morro cabeca no tempo": "2206654", + "morro do chapeu do piaui": "2206670", + "murici dos portelas": "2206696", + "nazare do piaui": "2206704", + "nazaria": "2206720", + "nossa senhora de nazare": "2206753", + "nossa senhora dos remedios": "2206803", + "nova santa rita": "2207959", + "novo oriente do piaui": "2206902", + "novo santo antonio": "2206951", + "oeiras": "2207009", + "olho d'agua do piaui": "2207108", + "padre marcos": "2207207", + "paes landim": "2207306", + "pajeu do piaui": "2207355", + "palmeira do piaui": "2207405", + "palmeirais": "2207504", + "paqueta": "2207553", + "parnagua": "2207603", + "parnaiba": "2207702", + "passagem franca do piaui": "2207751", + "patos do piaui": "2207777", + "pau d'arco do piaui": "2207793", + "paulistana": "2207801", + "pavussu": "2207850", + "pedro ii": "2207900", + "pedro laurentino": "2207934", + "picos": "2208007", + "pimenteiras": "2208106", + "pio ix": "2208205", + "piracuruca": "2208304", + "piripiri": "2208403", + "porto": "2208502", + "porto alegre do piaui": "2208551", + "prata do piaui": "2208601", + "queimada nova": "2208650", + "redencao do gurgueia": "2208700", + "regeneracao": "2208809", + "riacho frio": "2208858", + "ribeira do piaui": "2208874", + "ribeiro goncalves": "2208908", + "rio grande do piaui": "2209005", + "santa cruz do piaui": "2209104", + "santa cruz dos milagres": "2209153", + "santa filomena": "2209203", + "santa luz": "2209302", + "santa rosa do piaui": "2209377", + "santana do piaui": "2209351", + "santo antonio de lisboa": "2209401", + "santo antonio dos milagres": "2209450", + "santo inacio do piaui": "2209500", + "sao braz do piaui": "2209559", + "sao felix do piaui": "2209609", + "sao francisco de assis do piaui": "2209658", + "sao francisco do piaui": "2209708", + "sao goncalo do gurgueia": "2209757", + "sao goncalo do piaui": "2209807", + "sao joao da canabrava": "2209856", + "sao joao da fronteira": "2209872", + "sao joao da serra": "2209906", + "sao joao da varjota": "2209955", + "sao joao do arraial": "2209971", + "sao joao do piaui": "2210003", + "sao jose do divino": "2210052", + "sao jose do peixe": "2210102", + "sao jose do piaui": "2210201", + "sao juliao": "2210300", + "sao lourenco do piaui": "2210359", + "sao luis do piaui": "2210375", + "sao miguel da baixa grande": "2210383", + "sao miguel do fidalgo": "2210391", + "sao miguel do tapuio": "2210409", + "sao pedro do piaui": "2210508", + "sao raimundo nonato": "2210607", + "sebastiao barros": "2210623", + "sebastiao leal": "2210631", + "sigefredo pacheco": "2210656", + "simoes": "2210706", + "simplicio mendes": "2210805", + "socorro do piaui": "2210904", + "sussuapara": "2210938", + "tamboril do piaui": "2210953", + "tanque do piaui": "2210979", + "teresina": "2211001", + "uniao": "2211100", + "urucui": "2211209", + "valenca do piaui": "2211308", + "varzea branca": "2211357", + "varzea grande": "2211407", + "vera mendes": "2211506", + "vila nova do piaui": "2211605", + "wall ferraz": "2211704" + }, + "CE": { + "abaiara": "2300101", + "acarape": "2300150", + "acarau": "2300200", + "acopiara": "2300309", + "aiuaba": "2300408", + "alcantaras": "2300507", + "altaneira": "2300606", + "alto santo": "2300705", + "amontada": "2300754", + "antonina do norte": "2300804", + "apuiares": "2300903", + "aquiraz": "2301000", + "aracati": "2301109", + "aracoiaba": "2301208", + "ararenda": "2301257", + "araripe": "2301307", + "aratuba": "2301406", + "arneiroz": "2301505", + "assare": "2301604", + "aurora": "2301703", + "baixio": "2301802", + "banabuiu": "2301851", + "barbalha": "2301901", + "barreira": "2301950", + "barro": "2302008", + "barroquinha": "2302057", + "baturite": "2302107", + "beberibe": "2302206", + "bela cruz": "2302305", + "boa viagem": "2302404", + "brejo santo": "2302503", + "camocim": "2302602", + "campos sales": "2302701", + "caninde": "2302800", + "capistrano": "2302909", + "caridade": "2303006", + "carire": "2303105", + "caririacu": "2303204", + "carius": "2303303", + "carnaubal": "2303402", + "cascavel": "2303501", + "catarina": "2303600", + "catunda": "2303659", + "caucaia": "2303709", + "cedro": "2303808", + "chaval": "2303907", + "choro": "2303931", + "chorozinho": "2303956", + "coreau": "2304004", + "crateus": "2304103", + "crato": "2304202", + "croata": "2304236", + "cruz": "2304251", + "deputado irapuan pinheiro": "2304269", + "erere": "2304277", + "eusebio": "2304285", + "farias brito": "2304301", + "forquilha": "2304350", + "fortaleza": "2304400", + "fortim": "2304459", + "frecheirinha": "2304509", + "general sampaio": "2304608", + "graca": "2304657", + "granja": "2304707", + "granjeiro": "2304806", + "groairas": "2304905", + "guaiuba": "2304954", + "guaraciaba do norte": "2305001", + "guaramiranga": "2305100", + "hidrolandia": "2305209", + "horizonte": "2305233", + "ibaretama": "2305266", + "ibiapina": "2305308", + "ibicuitinga": "2305332", + "icapui": "2305357", + "ico": "2305407", + "iguatu": "2305506", + "independencia": "2305605", + "ipaporanga": "2305654", + "ipaumirim": "2305704", + "ipu": "2305803", + "ipueiras": "2305902", + "iracema": "2306009", + "iraucuba": "2306108", + "itaicaba": "2306207", + "itaitinga": "2306256", + "itapaje": "2306306", + "itapipoca": "2306405", + "itapiuna": "2306504", + "itarema": "2306553", + "itatira": "2306603", + "jaguaretama": "2306702", + "jaguaribara": "2306801", + "jaguaribe": "2306900", + "jaguaruana": "2307007", + "jardim": "2307106", + "jati": "2307205", + "jijoca de jericoacoara": "2307254", + "juazeiro do norte": "2307304", + "jucas": "2307403", + "lavras da mangabeira": "2307502", + "limoeiro do norte": "2307601", + "madalena": "2307635", + "maracanau": "2307650", + "maranguape": "2307700", + "marco": "2307809", + "martinopole": "2307908", + "massape": "2308005", + "mauriti": "2308104", + "meruoca": "2308203", + "milagres": "2308302", + "milha": "2308351", + "miraima": "2308377", + "missao velha": "2308401", + "mombaca": "2308500", + "monsenhor tabosa": "2308609", + "morada nova": "2308708", + "moraujo": "2308807", + "morrinhos": "2308906", + "mucambo": "2309003", + "mulungu": "2309102", + "nova olinda": "2309201", + "nova russas": "2309300", + "novo oriente": "2309409", + "ocara": "2309458", + "oros": "2309508", + "pacajus": "2309607", + "pacatuba": "2309706", + "pacoti": "2309805", + "pacuja": "2309904", + "palhano": "2310001", + "palmacia": "2310100", + "paracuru": "2310209", + "paraipaba": "2310258", + "parambu": "2310308", + "paramoti": "2310407", + "pedra branca": "2310506", + "penaforte": "2310605", + "pentecoste": "2310704", + "pereiro": "2310803", + "pindoretama": "2310852", + "piquet carneiro": "2310902", + "pires ferreira": "2310951", + "poranga": "2311009", + "porteiras": "2311108", + "potengi": "2311207", + "potiretama": "2311231", + "quiterianopolis": "2311264", + "quixada": "2311306", + "quixelo": "2311355", + "quixeramobim": "2311405", + "quixere": "2311504", + "redencao": "2311603", + "reriutaba": "2311702", + "russas": "2311801", + "saboeiro": "2311900", + "salitre": "2311959", + "santa quiteria": "2312205", + "santana do acarau": "2312007", + "santana do cariri": "2312106", + "sao benedito": "2312304", + "sao goncalo do amarante": "2312403", + "sao joao do jaguaribe": "2312502", + "sao luis do curu": "2312601", + "senador pompeu": "2312700", + "senador sa": "2312809", + "sobral": "2312908", + "solonopole": "2313005", + "tabuleiro do norte": "2313104", + "tamboril": "2313203", + "tarrafas": "2313252", + "taua": "2313302", + "tejucuoca": "2313351", + "tiangua": "2313401", + "trairi": "2313500", + "tururu": "2313559", + "ubajara": "2313609", + "umari": "2313708", + "umirim": "2313757", + "uruburetama": "2313807", + "uruoca": "2313906", + "varjota": "2313955", + "varzea alegre": "2314003", + "vicosa do ceara": "2314102" + }, + "RN": { + "acari": "2400109", + "acu": "2400208", + "afonso bezerra": "2400307", + "agua nova": "2400406", + "alexandria": "2400505", + "almino afonso": "2400604", + "alto do rodrigues": "2400703", + "angicos": "2400802", + "antonio martins": "2400901", + "apodi": "2401008", + "areia branca": "2401107", + "ares": "2401206", + "baia formosa": "2401404", + "barauna": "2401453", + "barcelona": "2401503", + "bento fernandes": "2401602", + "bodo": "2401651", + "bom jesus": "2401701", + "brejinho": "2401800", + "caicara do norte": "2401859", + "caicara do rio do vento": "2401909", + "caico": "2402006", + "campo grande": "2401305", + "campo redondo": "2402105", + "canguaretama": "2402204", + "caraubas": "2402303", + "carnauba dos dantas": "2402402", + "carnaubais": "2402501", + "ceara-mirim": "2402600", + "cerro cora": "2402709", + "coronel ezequiel": "2402808", + "coronel joao pessoa": "2402907", + "cruzeta": "2403004", + "currais novos": "2403103", + "doutor severiano": "2403202", + "encanto": "2403301", + "equador": "2403400", + "espirito santo": "2403509", + "extremoz": "2403608", + "felipe guerra": "2403707", + "fernando pedroza": "2403756", + "florania": "2403806", + "francisco dantas": "2403905", + "frutuoso gomes": "2404002", + "galinhos": "2404101", + "goianinha": "2404200", + "governador dix-sept rosado": "2404309", + "grossos": "2404408", + "guamare": "2404507", + "ielmo marinho": "2404606", + "ipanguacu": "2404705", + "ipueira": "2404804", + "itaja": "2404853", + "itau": "2404903", + "jacana": "2405009", + "jandaira": "2405108", + "janduis": "2405207", + "januario cicco": "2405306", + "japi": "2405405", + "jardim de angicos": "2405504", + "jardim de piranhas": "2405603", + "jardim do serido": "2405702", + "joao camara": "2405801", + "joao dias": "2405900", + "jose da penha": "2406007", + "jucurutu": "2406106", + "jundia": "2406155", + "lagoa d'anta": "2406205", + "lagoa de pedras": "2406304", + "lagoa de velhos": "2406403", + "lagoa nova": "2406502", + "lagoa salgada": "2406601", + "lajes": "2406700", + "lajes pintadas": "2406809", + "lucrecia": "2406908", + "luis gomes": "2407005", + "macaiba": "2407104", + "macau": "2407203", + "major sales": "2407252", + "marcelino vieira": "2407302", + "martins": "2407401", + "maxaranguape": "2407500", + "messias targino": "2407609", + "montanhas": "2407708", + "monte alegre": "2407807", + "monte das gameleiras": "2407906", + "mossoro": "2408003", + "natal": "2408102", + "nisia floresta": "2408201", + "nova cruz": "2408300", + "olho d'agua do borges": "2408409", + "ouro branco": "2408508", + "parana": "2408607", + "parau": "2408706", + "parazinho": "2408805", + "parelhas": "2408904", + "parnamirim": "2403251", + "passa e fica": "2409100", + "passagem": "2409209", + "patu": "2409308", + "pau dos ferros": "2409407", + "pedra grande": "2409506", + "pedra preta": "2409605", + "pedro avelino": "2409704", + "pedro velho": "2409803", + "pendencias": "2409902", + "piloes": "2410009", + "poco branco": "2410108", + "portalegre": "2410207", + "porto do mangue": "2410256", + "pureza": "2410405", + "rafael fernandes": "2410504", + "rafael godeiro": "2410603", + "riacho da cruz": "2410702", + "riacho de santana": "2410801", + "riachuelo": "2410900", + "rio do fogo": "2408953", + "rodolfo fernandes": "2411007", + "ruy barbosa": "2411106", + "santa cruz": "2411205", + "santa maria": "2409332", + "santana do matos": "2411403", + "santana do serido": "2411429", + "santo antonio": "2411502", + "sao bento do norte": "2411601", + "sao bento do trairi": "2411700", + "sao fernando": "2411809", + "sao francisco do oeste": "2411908", + "sao goncalo do amarante": "2412005", + "sao joao do sabugi": "2412104", + "sao jose de mipibu": "2412203", + "sao jose do campestre": "2412302", + "sao jose do serido": "2412401", + "sao miguel": "2412500", + "sao miguel do gostoso": "2412559", + "sao paulo do potengi": "2412609", + "sao pedro": "2412708", + "sao rafael": "2412807", + "sao tome": "2412906", + "sao vicente": "2413003", + "senador eloi de souza": "2413102", + "senador georgino avelino": "2413201", + "serra caiada": "2410306", + "serra de sao bento": "2413300", + "serra do mel": "2413359", + "serra negra do norte": "2413409", + "serrinha": "2413508", + "serrinha dos pintos": "2413557", + "severiano melo": "2413607", + "sitio novo": "2413706", + "taboleiro grande": "2413805", + "taipu": "2413904", + "tangara": "2414001", + "tenente ananias": "2414100", + "tenente laurentino cruz": "2414159", + "tibau": "2411056", + "tibau do sul": "2414209", + "timbauba dos batistas": "2414308", + "touros": "2414407", + "triunfo potiguar": "2414456", + "umarizal": "2414506", + "upanema": "2414605", + "varzea": "2414704", + "venha-ver": "2414753", + "vera cruz": "2414803", + "vicosa": "2414902", + "vila flor": "2415008" + }, + "PB": { + "agua branca": "2500106", + "aguiar": "2500205", + "alagoa grande": "2500304", + "alagoa nova": "2500403", + "alagoinha": "2500502", + "alcantil": "2500536", + "algodao de jandaira": "2500577", + "alhandra": "2500601", + "amparo": "2500734", + "aparecida": "2500775", + "aracagi": "2500809", + "arara": "2500908", + "araruna": "2501005", + "areia": "2501104", + "areia de baraunas": "2501153", + "areial": "2501203", + "aroeiras": "2501302", + "assuncao": "2501351", + "baia da traicao": "2501401", + "bananeiras": "2501500", + "barauna": "2501534", + "barra de santa rosa": "2501609", + "barra de santana": "2501575", + "barra de sao miguel": "2501708", + "bayeux": "2501807", + "belem": "2501906", + "belem do brejo do cruz": "2502003", + "bernardino batista": "2502052", + "boa ventura": "2502102", + "boa vista": "2502151", + "bom jesus": "2502201", + "bom sucesso": "2502300", + "bonito de santa fe": "2502409", + "boqueirao": "2502508", + "borborema": "2502706", + "brejo do cruz": "2502805", + "brejo dos santos": "2502904", + "caapora": "2503001", + "cabaceiras": "2503100", + "cabedelo": "2503209", + "cachoeira dos indios": "2503308", + "cacimba de areia": "2503407", + "cacimba de dentro": "2503506", + "cacimbas": "2503555", + "caicara": "2503605", + "cajazeiras": "2503704", + "cajazeirinhas": "2503753", + "caldas brandao": "2503803", + "camalau": "2503902", + "campina grande": "2504009", + "capim": "2504033", + "caraubas": "2504074", + "carrapateira": "2504108", + "casserengue": "2504157", + "catingueira": "2504207", + "catole do rocha": "2504306", + "caturite": "2504355", + "conceicao": "2504405", + "condado": "2504504", + "conde": "2504603", + "congo": "2504702", + "coremas": "2504801", + "coxixola": "2504850", + "cruz do espirito santo": "2504900", + "cubati": "2505006", + "cuite": "2505105", + "cuite de mamanguape": "2505238", + "cuitegi": "2505204", + "curral de cima": "2505279", + "curral velho": "2505303", + "damiao": "2505352", + "desterro": "2505402", + "diamante": "2505600", + "dona ines": "2505709", + "duas estradas": "2505808", + "emas": "2505907", + "esperanca": "2506004", + "fagundes": "2506103", + "frei martinho": "2506202", + "gado bravo": "2506251", + "guarabira": "2506301", + "gurinhem": "2506400", + "gurjao": "2506509", + "ibiara": "2506608", + "igaracy": "2502607", + "imaculada": "2506707", + "inga": "2506806", + "itabaiana": "2506905", + "itaporanga": "2507002", + "itapororoca": "2507101", + "itatuba": "2507200", + "jacarau": "2507309", + "jerico": "2507408", + "joao pessoa": "2507507", + "joca claudino": "2513653", + "juarez tavora": "2507606", + "juazeirinho": "2507705", + "junco do serido": "2507804", + "juripiranga": "2507903", + "juru": "2508000", + "lagoa": "2508109", + "lagoa de dentro": "2508208", + "lagoa seca": "2508307", + "lastro": "2508406", + "livramento": "2508505", + "logradouro": "2508554", + "lucena": "2508604", + "mae d'agua": "2508703", + "malta": "2508802", + "mamanguape": "2508901", + "manaira": "2509008", + "marcacao": "2509057", + "mari": "2509107", + "marizopolis": "2509156", + "massaranduba": "2509206", + "mataraca": "2509305", + "matinhas": "2509339", + "mato grosso": "2509370", + "matureia": "2509396", + "mogeiro": "2509404", + "montadas": "2509503", + "monte horebe": "2509602", + "monteiro": "2509701", + "mulungu": "2509800", + "natuba": "2509909", + "nazarezinho": "2510006", + "nova floresta": "2510105", + "nova olinda": "2510204", + "nova palmeira": "2510303", + "olho d'agua": "2510402", + "olivedos": "2510501", + "ouro velho": "2510600", + "parari": "2510659", + "passagem": "2510709", + "patos": "2510808", + "paulista": "2510907", + "pedra branca": "2511004", + "pedra lavrada": "2511103", + "pedras de fogo": "2511202", + "pedro regis": "2512721", + "pianco": "2511301", + "picui": "2511400", + "pilar": "2511509", + "piloes": "2511608", + "piloezinhos": "2511707", + "pirpirituba": "2511806", + "pitimbu": "2511905", + "pocinhos": "2512002", + "poco dantas": "2512036", + "poco de jose de moura": "2512077", + "pombal": "2512101", + "prata": "2512200", + "princesa isabel": "2512309", + "puxinana": "2512408", + "queimadas": "2512507", + "quixaba": "2512606", + "remigio": "2512705", + "riachao": "2512747", + "riachao do bacamarte": "2512754", + "riachao do poco": "2512762", + "riacho de santo antonio": "2512788", + "riacho dos cavalos": "2512804", + "rio tinto": "2512903", + "salgadinho": "2513000", + "salgado de sao felix": "2513109", + "santa cecilia": "2513158", + "santa cruz": "2513208", + "santa helena": "2513307", + "santa ines": "2513356", + "santa luzia": "2513406", + "santa rita": "2513703", + "santa teresinha": "2513802", + "santana de mangueira": "2513505", + "santana dos garrotes": "2513604", + "santo andre": "2513851", + "sao bentinho": "2513927", + "sao bento": "2513901", + "sao domingos": "2513968", + "sao domingos do cariri": "2513943", + "sao francisco": "2513984", + "sao joao do cariri": "2514008", + "sao joao do rio do peixe": "2500700", + "sao joao do tigre": "2514107", + "sao jose da lagoa tapada": "2514206", + "sao jose de caiana": "2514305", + "sao jose de espinharas": "2514404", + "sao jose de piranhas": "2514503", + "sao jose de princesa": "2514552", + "sao jose do bonfim": "2514602", + "sao jose do brejo do cruz": "2514651", + "sao jose do sabugi": "2514701", + "sao jose dos cordeiros": "2514800", + "sao jose dos ramos": "2514453", + "sao mamede": "2514909", + "sao miguel de taipu": "2515005", + "sao sebastiao de lagoa de roca": "2515104", + "sao sebastiao do umbuzeiro": "2515203", + "sao vicente do serido": "2515401", + "sape": "2515302", + "serra branca": "2515500", + "serra da raiz": "2515609", + "serra grande": "2515708", + "serra redonda": "2515807", + "serraria": "2515906", + "sertaozinho": "2515930", + "sobrado": "2515971", + "solanea": "2516003", + "soledade": "2516102", + "sossego": "2516151", + "sousa": "2516201", + "sume": "2516300", + "tacima": "2516409", + "taperoa": "2516508", + "tavares": "2516607", + "teixeira": "2516706", + "tenorio": "2516755", + "triunfo": "2516805", + "uirauna": "2516904", + "umbuzeiro": "2517001", + "varzea": "2517100", + "vieiropolis": "2517209", + "vista serrana": "2505501", + "zabele": "2517407" + }, + "PE": { + "abreu e lima": "2600054", + "afogados da ingazeira": "2600104", + "afranio": "2600203", + "agrestina": "2600302", + "agua preta": "2600401", + "aguas belas": "2600500", + "alagoinha": "2600609", + "alianca": "2600708", + "altinho": "2600807", + "amaraji": "2600906", + "angelim": "2601003", + "aracoiaba": "2601052", + "araripina": "2601102", + "arcoverde": "2601201", + "barra de guabiraba": "2601300", + "barreiros": "2601409", + "belem de maria": "2601508", + "belem do sao francisco": "2601607", + "belo jardim": "2601706", + "betania": "2601805", + "bezerros": "2601904", + "bodoco": "2602001", + "bom conselho": "2602100", + "bom jardim": "2602209", + "bonito": "2602308", + "brejao": "2602407", + "brejinho": "2602506", + "brejo da madre de deus": "2602605", + "buenos aires": "2602704", + "buique": "2602803", + "cabo de santo agostinho": "2602902", + "cabrobo": "2603009", + "cachoeirinha": "2603108", + "caetes": "2603207", + "calcado": "2603306", + "calumbi": "2603405", + "camaragibe": "2603454", + "camocim de sao felix": "2603504", + "camutanga": "2603603", + "canhotinho": "2603702", + "capoeiras": "2603801", + "carnaiba": "2603900", + "carnaubeira da penha": "2603926", + "carpina": "2604007", + "caruaru": "2604106", + "casinhas": "2604155", + "catende": "2604205", + "cedro": "2604304", + "cha de alegria": "2604403", + "cha grande": "2604502", + "condado": "2604601", + "correntes": "2604700", + "cortes": "2604809", + "cumaru": "2604908", + "cupira": "2605004", + "custodia": "2605103", + "dormentes": "2605152", + "escada": "2605202", + "exu": "2605301", + "feira nova": "2605400", + "fernando de noronha": "2605459", + "ferreiros": "2605509", + "flores": "2605608", + "floresta": "2605707", + "frei miguelinho": "2605806", + "gameleira": "2605905", + "garanhuns": "2606002", + "gloria do goita": "2606101", + "goiana": "2606200", + "granito": "2606309", + "gravata": "2606408", + "iati": "2606507", + "ibimirim": "2606606", + "ibirajuba": "2606705", + "igarassu": "2606804", + "iguaracy": "2606903", + "ilha de itamaraca": "2607604", + "inaja": "2607000", + "ingazeira": "2607109", + "ipojuca": "2607208", + "ipubi": "2607307", + "itacuruba": "2607406", + "itaiba": "2607505", + "itambe": "2607653", + "itapetim": "2607703", + "itapissuma": "2607752", + "itaquitinga": "2607802", + "jaboatao dos guararapes": "2607901", + "jaqueira": "2607950", + "jatauba": "2608008", + "jatoba": "2608057", + "joao alfredo": "2608107", + "joaquim nabuco": "2608206", + "jucati": "2608255", + "jupi": "2608305", + "jurema": "2608404", + "lagoa de itaenga": "2608503", + "lagoa do carro": "2608453", + "lagoa do ouro": "2608602", + "lagoa dos gatos": "2608701", + "lagoa grande": "2608750", + "lajedo": "2608800", + "limoeiro": "2608909", + "macaparana": "2609006", + "machados": "2609105", + "manari": "2609154", + "maraial": "2609204", + "mirandiba": "2609303", + "moreilandia": "2614303", + "moreno": "2609402", + "nazare da mata": "2609501", + "olinda": "2609600", + "orobo": "2609709", + "oroco": "2609808", + "ouricuri": "2609907", + "palmares": "2610004", + "palmeirina": "2610103", + "panelas": "2610202", + "paranatama": "2610301", + "parnamirim": "2610400", + "passira": "2610509", + "paudalho": "2610608", + "paulista": "2610707", + "pedra": "2610806", + "pesqueira": "2610905", + "petrolandia": "2611002", + "petrolina": "2611101", + "pocao": "2611200", + "pombos": "2611309", + "primavera": "2611408", + "quipapa": "2611507", + "quixaba": "2611533", + "recife": "2611606", + "riacho das almas": "2611705", + "ribeirao": "2611804", + "rio formoso": "2611903", + "saire": "2612000", + "salgadinho": "2612109", + "salgueiro": "2612208", + "saloa": "2612307", + "sanharo": "2612406", + "santa cruz": "2612455", + "santa cruz da baixa verde": "2612471", + "santa cruz do capibaribe": "2612505", + "santa filomena": "2612554", + "santa maria da boa vista": "2612604", + "santa maria do cambuca": "2612703", + "santa terezinha": "2612802", + "sao benedito do sul": "2612901", + "sao bento do una": "2613008", + "sao caitano": "2613107", + "sao joao": "2613206", + "sao joaquim do monte": "2613305", + "sao jose da coroa grande": "2613404", + "sao jose do belmonte": "2613503", + "sao jose do egito": "2613602", + "sao lourenco da mata": "2613701", + "sao vicente ferrer": "2613800", + "serra talhada": "2613909", + "serrita": "2614006", + "sertania": "2614105", + "sirinhaem": "2614204", + "solidao": "2614402", + "surubim": "2614501", + "tabira": "2614600", + "tacaimbo": "2614709", + "tacaratu": "2614808", + "tamandare": "2614857", + "taquaritinga do norte": "2615003", + "terezinha": "2615102", + "terra nova": "2615201", + "timbauba": "2615300", + "toritama": "2615409", + "tracunhaem": "2615508", + "trindade": "2615607", + "triunfo": "2615706", + "tupanatinga": "2615805", + "tuparetama": "2615904", + "venturosa": "2616001", + "verdejante": "2616100", + "vertente do lerio": "2616183", + "vertentes": "2616209", + "vicencia": "2616308", + "vitoria de santo antao": "2616407", + "xexeu": "2616506" + }, + "AL": { + "agua branca": "2700102", + "anadia": "2700201", + "arapiraca": "2700300", + "atalaia": "2700409", + "barra de santo antonio": "2700508", + "barra de sao miguel": "2700607", + "batalha": "2700706", + "belem": "2700805", + "belo monte": "2700904", + "boca da mata": "2701001", + "branquinha": "2701100", + "cacimbinhas": "2701209", + "cajueiro": "2701308", + "campestre": "2701357", + "campo alegre": "2701407", + "campo grande": "2701506", + "canapi": "2701605", + "capela": "2701704", + "carneiros": "2701803", + "cha preta": "2701902", + "coite do noia": "2702009", + "colonia leopoldina": "2702108", + "coqueiro seco": "2702207", + "coruripe": "2702306", + "craibas": "2702355", + "delmiro gouveia": "2702405", + "dois riachos": "2702504", + "estrela de alagoas": "2702553", + "feira grande": "2702603", + "feliz deserto": "2702702", + "flexeiras": "2702801", + "girau do ponciano": "2702900", + "ibateguara": "2703007", + "igaci": "2703106", + "igreja nova": "2703205", + "inhapi": "2703304", + "jacare dos homens": "2703403", + "jacuipe": "2703502", + "japaratinga": "2703601", + "jaramataia": "2703700", + "jequia da praia": "2703759", + "joaquim gomes": "2703809", + "jundia": "2703908", + "junqueiro": "2704005", + "lagoa da canoa": "2704104", + "limoeiro de anadia": "2704203", + "maceio": "2704302", + "major isidoro": "2704401", + "mar vermelho": "2704906", + "maragogi": "2704500", + "maravilha": "2704609", + "marechal deodoro": "2704708", + "maribondo": "2704807", + "mata grande": "2705002", + "matriz de camaragibe": "2705101", + "messias": "2705200", + "minador do negrao": "2705309", + "monteiropolis": "2705408", + "murici": "2705507", + "novo lino": "2705606", + "olho d'agua das flores": "2705705", + "olho d'agua do casado": "2705804", + "olho d'agua grande": "2705903", + "olivenca": "2706000", + "ouro branco": "2706109", + "palestina": "2706208", + "palmeira dos indios": "2706307", + "pao de acucar": "2706406", + "pariconha": "2706422", + "paripueira": "2706448", + "passo de camaragibe": "2706505", + "paulo jacinto": "2706604", + "penedo": "2706703", + "piacabucu": "2706802", + "pilar": "2706901", + "pindoba": "2707008", + "piranhas": "2707107", + "poco das trincheiras": "2707206", + "porto calvo": "2707305", + "porto de pedras": "2707404", + "porto real do colegio": "2707503", + "quebrangulo": "2707602", + "rio largo": "2707701", + "roteiro": "2707800", + "santa luzia do norte": "2707909", + "santana do ipanema": "2708006", + "santana do mundau": "2708105", + "sao bras": "2708204", + "sao jose da laje": "2708303", + "sao jose da tapera": "2708402", + "sao luis do quitunde": "2708501", + "sao miguel dos campos": "2708600", + "sao miguel dos milagres": "2708709", + "sao sebastiao": "2708808", + "satuba": "2708907", + "senador rui palmeira": "2708956", + "tanque d'arca": "2709004", + "taquarana": "2709103", + "teotonio vilela": "2709152", + "traipu": "2709202", + "uniao dos palmares": "2709301", + "vicosa": "2709400" + }, + "SE": { + "amparo do sao francisco": "2800100", + "aquidaba": "2800209", + "aracaju": "2800308", + "araua": "2800407", + "areia branca": "2800506", + "barra dos coqueiros": "2800605", + "boquim": "2800670", + "brejo grande": "2800704", + "campo do brito": "2801009", + "canhoba": "2801108", + "caninde de sao francisco": "2801207", + "capela": "2801306", + "carira": "2801405", + "carmopolis": "2801504", + "cedro de sao joao": "2801603", + "cristinapolis": "2801702", + "cumbe": "2801900", + "divina pastora": "2802007", + "estancia": "2802106", + "feira nova": "2802205", + "frei paulo": "2802304", + "gararu": "2802403", + "general maynard": "2802502", + "gracho cardoso": "2802601", + "ilha das flores": "2802700", + "indiaroba": "2802809", + "itabaiana": "2802908", + "itabaianinha": "2803005", + "itabi": "2803104", + "itaporanga d'ajuda": "2803203", + "japaratuba": "2803302", + "japoata": "2803401", + "lagarto": "2803500", + "laranjeiras": "2803609", + "macambira": "2803708", + "malhada dos bois": "2803807", + "malhador": "2803906", + "maruim": "2804003", + "moita bonita": "2804102", + "monte alegre de sergipe": "2804201", + "muribeca": "2804300", + "neopolis": "2804409", + "nossa senhora aparecida": "2804458", + "nossa senhora da gloria": "2804508", + "nossa senhora das dores": "2804607", + "nossa senhora de lourdes": "2804706", + "nossa senhora do socorro": "2804805", + "pacatuba": "2804904", + "pedra mole": "2805000", + "pedrinhas": "2805109", + "pinhao": "2805208", + "pirambu": "2805307", + "poco redondo": "2805406", + "poco verde": "2805505", + "porto da folha": "2805604", + "propria": "2805703", + "riachao do dantas": "2805802", + "riachuelo": "2805901", + "ribeiropolis": "2806008", + "rosario do catete": "2806107", + "salgado": "2806206", + "santa luzia do itanhy": "2806305", + "santa rosa de lima": "2806503", + "santana do sao francisco": "2806404", + "santo amaro das brotas": "2806602", + "sao cristovao": "2806701", + "sao domingos": "2806800", + "sao francisco": "2806909", + "sao miguel do aleixo": "2807006", + "simao dias": "2807105", + "siriri": "2807204", + "telha": "2807303", + "tobias barreto": "2807402", + "tomar do geru": "2807501", + "umbauba": "2807600" + }, + "BA": { + "abaira": "2900108", + "abare": "2900207", + "acajutiba": "2900306", + "adustina": "2900355", + "agua fria": "2900405", + "aiquara": "2900603", + "alagoinhas": "2900702", + "alcobaca": "2900801", + "almadina": "2900900", + "amargosa": "2901007", + "amelia rodrigues": "2901106", + "america dourada": "2901155", + "anage": "2901205", + "andarai": "2901304", + "andorinha": "2901353", + "angical": "2901403", + "anguera": "2901502", + "antas": "2901601", + "antonio cardoso": "2901700", + "antonio goncalves": "2901809", + "apora": "2901908", + "apuarema": "2901957", + "aracas": "2902054", + "aracatu": "2902005", + "araci": "2902104", + "aramari": "2902203", + "arataca": "2902252", + "aratuipe": "2902302", + "aurelino leal": "2902401", + "baianopolis": "2902500", + "baixa grande": "2902609", + "banzae": "2902658", + "barra": "2902708", + "barra da estiva": "2902807", + "barra do choca": "2902906", + "barra do mendes": "2903003", + "barra do rocha": "2903102", + "barreiras": "2903201", + "barro alto": "2903235", + "barro preto": "2903300", + "barrocas": "2903276", + "belmonte": "2903409", + "belo campo": "2903508", + "biritinga": "2903607", + "boa nova": "2903706", + "boa vista do tupim": "2903805", + "bom jesus da lapa": "2903904", + "bom jesus da serra": "2903953", + "boninal": "2904001", + "bonito": "2904050", + "boquira": "2904100", + "botupora": "2904209", + "brejoes": "2904308", + "brejolandia": "2904407", + "brotas de macaubas": "2904506", + "brumado": "2904605", + "buerarema": "2904704", + "buritirama": "2904753", + "caatiba": "2904803", + "cabaceiras do paraguacu": "2904852", + "cachoeira": "2904902", + "cacule": "2905008", + "caem": "2905107", + "caetanos": "2905156", + "caetite": "2905206", + "cafarnaum": "2905305", + "cairu": "2905404", + "caldeirao grande": "2905503", + "camacan": "2905602", + "camacari": "2905701", + "camamu": "2905800", + "campo alegre de lourdes": "2905909", + "campo formoso": "2906006", + "canapolis": "2906105", + "canarana": "2906204", + "canavieiras": "2906303", + "candeal": "2906402", + "candeias": "2906501", + "candiba": "2906600", + "candido sales": "2906709", + "cansancao": "2906808", + "canudos": "2906824", + "capela do alto alegre": "2906857", + "capim grosso": "2906873", + "caraibas": "2906899", + "caravelas": "2906907", + "cardeal da silva": "2907004", + "carinhanha": "2907103", + "casa nova": "2907202", + "castro alves": "2907301", + "catolandia": "2907400", + "catu": "2907509", + "caturama": "2907558", + "central": "2907608", + "chorrocho": "2907707", + "cicero dantas": "2907806", + "cipo": "2907905", + "coaraci": "2908002", + "cocos": "2908101", + "conceicao da feira": "2908200", + "conceicao do almeida": "2908309", + "conceicao do coite": "2908408", + "conceicao do jacuipe": "2908507", + "conde": "2908606", + "condeuba": "2908705", + "contendas do sincora": "2908804", + "coracao de maria": "2908903", + "cordeiros": "2909000", + "coribe": "2909109", + "coronel joao sa": "2909208", + "correntina": "2909307", + "cotegipe": "2909406", + "cravolandia": "2909505", + "crisopolis": "2909604", + "cristopolis": "2909703", + "cruz das almas": "2909802", + "curaca": "2909901", + "dario meira": "2910008", + "dias d'avila": "2910057", + "dom basilio": "2910107", + "dom macedo costa": "2910206", + "elisio medrado": "2910305", + "encruzilhada": "2910404", + "entre rios": "2910503", + "erico cardoso": "2900504", + "esplanada": "2910602", + "euclides da cunha": "2910701", + "eunapolis": "2910727", + "fatima": "2910750", + "feira da mata": "2910776", + "feira de santana": "2910800", + "filadelfia": "2910859", + "firmino alves": "2910909", + "floresta azul": "2911006", + "formosa do rio preto": "2911105", + "gandu": "2911204", + "gaviao": "2911253", + "gentio do ouro": "2911303", + "gloria": "2911402", + "gongogi": "2911501", + "governador mangabeira": "2911600", + "guajeru": "2911659", + "guanambi": "2911709", + "guaratinga": "2911808", + "heliopolis": "2911857", + "iacu": "2911907", + "ibiassuce": "2912004", + "ibicarai": "2912103", + "ibicoara": "2912202", + "ibicui": "2912301", + "ibipeba": "2912400", + "ibipitanga": "2912509", + "ibiquera": "2912608", + "ibirapitanga": "2912707", + "ibirapua": "2912806", + "ibirataia": "2912905", + "ibitiara": "2913002", + "ibitita": "2913101", + "ibotirama": "2913200", + "ichu": "2913309", + "igapora": "2913408", + "igrapiuna": "2913457", + "iguai": "2913507", + "ilheus": "2913606", + "inhambupe": "2913705", + "ipecaeta": "2913804", + "ipiau": "2913903", + "ipira": "2914000", + "ipupiara": "2914109", + "irajuba": "2914208", + "iramaia": "2914307", + "iraquara": "2914406", + "irara": "2914505", + "irece": "2914604", + "itabela": "2914653", + "itaberaba": "2914703", + "itabuna": "2914802", + "itacare": "2914901", + "itaete": "2915007", + "itagi": "2915106", + "itagiba": "2915205", + "itagimirim": "2915304", + "itaguacu da bahia": "2915353", + "itaju do colonia": "2915403", + "itajuipe": "2915502", + "itamaraju": "2915601", + "itamari": "2915700", + "itambe": "2915809", + "itanagra": "2915908", + "itanhem": "2916005", + "itaparica": "2916104", + "itape": "2916203", + "itapebi": "2916302", + "itapetinga": "2916401", + "itapicuru": "2916500", + "itapitanga": "2916609", + "itaquara": "2916708", + "itarantim": "2916807", + "itatim": "2916856", + "itirucu": "2916906", + "itiuba": "2917003", + "itororo": "2917102", + "ituacu": "2917201", + "itubera": "2917300", + "iuiu": "2917334", + "jaborandi": "2917359", + "jacaraci": "2917409", + "jacobina": "2917508", + "jaguaquara": "2917607", + "jaguarari": "2917706", + "jaguaripe": "2917805", + "jandaira": "2917904", + "jequie": "2918001", + "jeremoabo": "2918100", + "jiquirica": "2918209", + "jitauna": "2918308", + "joao dourado": "2918357", + "juazeiro": "2918407", + "jucurucu": "2918456", + "jussara": "2918506", + "jussari": "2918555", + "jussiape": "2918605", + "lafaiete coutinho": "2918704", + "lagoa real": "2918753", + "laje": "2918803", + "lajedao": "2918902", + "lajedinho": "2919009", + "lajedo do tabocal": "2919058", + "lamarao": "2919108", + "lapao": "2919157", + "lauro de freitas": "2919207", + "lencois": "2919306", + "licinio de almeida": "2919405", + "livramento de nossa senhora": "2919504", + "luis eduardo magalhaes": "2919553", + "macajuba": "2919603", + "macarani": "2919702", + "macaubas": "2919801", + "macurure": "2919900", + "madre de deus": "2919926", + "maetinga": "2919959", + "maiquinique": "2920007", + "mairi": "2920106", + "malhada": "2920205", + "malhada de pedras": "2920304", + "manoel vitorino": "2920403", + "mansidao": "2920452", + "maracas": "2920502", + "maragogipe": "2920601", + "marau": "2920700", + "marcionilio souza": "2920809", + "mascote": "2920908", + "mata de sao joao": "2921005", + "matina": "2921054", + "medeiros neto": "2921104", + "miguel calmon": "2921203", + "milagres": "2921302", + "mirangaba": "2921401", + "mirante": "2921450", + "monte santo": "2921500", + "morpara": "2921609", + "morro do chapeu": "2921708", + "mortugaba": "2921807", + "mucuge": "2921906", + "mucuri": "2922003", + "mulungu do morro": "2922052", + "mundo novo": "2922102", + "muniz ferreira": "2922201", + "muquem do sao francisco": "2922250", + "muritiba": "2922300", + "mutuipe": "2922409", + "nazare": "2922508", + "nilo pecanha": "2922607", + "nordestina": "2922656", + "nova canaa": "2922706", + "nova fatima": "2922730", + "nova ibia": "2922755", + "nova itarana": "2922805", + "nova redencao": "2922854", + "nova soure": "2922904", + "nova vicosa": "2923001", + "novo horizonte": "2923035", + "novo triunfo": "2923050", + "olindina": "2923100", + "oliveira dos brejinhos": "2923209", + "ouricangas": "2923308", + "ourolandia": "2923357", + "palmas de monte alto": "2923407", + "palmeiras": "2923506", + "paramirim": "2923605", + "paratinga": "2923704", + "paripiranga": "2923803", + "pau brasil": "2923902", + "paulo afonso": "2924009", + "pe de serra": "2924058", + "pedrao": "2924108", + "pedro alexandre": "2924207", + "piata": "2924306", + "pilao arcado": "2924405", + "pindai": "2924504", + "pindobacu": "2924603", + "pintadas": "2924652", + "pirai do norte": "2924678", + "piripa": "2924702", + "piritiba": "2924801", + "planaltino": "2924900", + "planalto": "2925006", + "pocoes": "2925105", + "pojuca": "2925204", + "ponto novo": "2925253", + "porto seguro": "2925303", + "potiragua": "2925402", + "prado": "2925501", + "presidente dutra": "2925600", + "presidente janio quadros": "2925709", + "presidente tancredo neves": "2925758", + "queimadas": "2925808", + "quijingue": "2925907", + "quixabeira": "2925931", + "rafael jambeiro": "2925956", + "remanso": "2926004", + "retirolandia": "2926103", + "riachao das neves": "2926202", + "riachao do jacuipe": "2926301", + "riacho de santana": "2926400", + "ribeira do amparo": "2926509", + "ribeira do pombal": "2926608", + "ribeirao do largo": "2926657", + "rio de contas": "2926707", + "rio do antonio": "2926806", + "rio do pires": "2926905", + "rio real": "2927002", + "rodelas": "2927101", + "ruy barbosa": "2927200", + "salinas da margarida": "2927309", + "salvador": "2927408", + "santa barbara": "2927507", + "santa brigida": "2927606", + "santa cruz cabralia": "2927705", + "santa cruz da vitoria": "2927804", + "santa ines": "2927903", + "santa luzia": "2928059", + "santa maria da vitoria": "2928109", + "santa rita de cassia": "2928406", + "santa terezinha": "2928505", + "santaluz": "2928000", + "santana": "2928208", + "santanopolis": "2928307", + "santo amaro": "2928604", + "santo antonio de jesus": "2928703", + "santo estevao": "2928802", + "sao desiderio": "2928901", + "sao domingos": "2928950", + "sao felipe": "2929107", + "sao felix": "2929008", + "sao felix do coribe": "2929057", + "sao francisco do conde": "2929206", + "sao gabriel": "2929255", + "sao goncalo dos campos": "2929305", + "sao jose da vitoria": "2929354", + "sao jose do jacuipe": "2929370", + "sao miguel das matas": "2929404", + "sao sebastiao do passe": "2929503", + "sapeacu": "2929602", + "satiro dias": "2929701", + "saubara": "2929750", + "saude": "2929800", + "seabra": "2929909", + "sebastiao laranjeiras": "2930006", + "senhor do bonfim": "2930105", + "sento se": "2930204", + "serra do ramalho": "2930154", + "serra dourada": "2930303", + "serra preta": "2930402", + "serrinha": "2930501", + "serrolandia": "2930600", + "simoes filho": "2930709", + "sitio do mato": "2930758", + "sitio do quinto": "2930766", + "sobradinho": "2930774", + "souto soares": "2930808", + "tabocas do brejo velho": "2930907", + "tanhacu": "2931004", + "tanque novo": "2931053", + "tanquinho": "2931103", + "taperoa": "2931202", + "tapiramuta": "2931301", + "teixeira de freitas": "2931350", + "teodoro sampaio": "2931400", + "teofilandia": "2931509", + "teolandia": "2931608", + "terra nova": "2931707", + "tremedal": "2931806", + "tucano": "2931905", + "uaua": "2932002", + "ubaira": "2932101", + "ubaitaba": "2932200", + "ubata": "2932309", + "uibai": "2932408", + "umburanas": "2932457", + "una": "2932507", + "urandi": "2932606", + "urucuca": "2932705", + "utinga": "2932804", + "valenca": "2932903", + "valente": "2933000", + "varzea da roca": "2933059", + "varzea do poco": "2933109", + "varzea nova": "2933158", + "varzedo": "2933174", + "vera cruz": "2933208", + "vereda": "2933257", + "vitoria da conquista": "2933307", + "wagner": "2933406", + "wanderley": "2933455", + "wenceslau guimaraes": "2933505", + "xique-xique": "2933604" + }, + "MG": { + "abadia dos dourados": "3100104", + "abaete": "3100203", + "abre campo": "3100302", + "acaiaca": "3100401", + "acucena": "3100500", + "agua boa": "3100609", + "agua comprida": "3100708", + "aguanil": "3100807", + "aguas formosas": "3100906", + "aguas vermelhas": "3101003", + "aimores": "3101102", + "aiuruoca": "3101201", + "alagoa": "3101300", + "albertina": "3101409", + "alem paraiba": "3101508", + "alfenas": "3101607", + "alfredo vasconcelos": "3101631", + "almenara": "3101706", + "alpercata": "3101805", + "alpinopolis": "3101904", + "alterosa": "3102001", + "alto caparao": "3102050", + "alto jequitiba": "3153509", + "alto rio doce": "3102100", + "alvarenga": "3102209", + "alvinopolis": "3102308", + "alvorada de minas": "3102407", + "amparo do serra": "3102506", + "andradas": "3102605", + "andrelandia": "3102803", + "angelandia": "3102852", + "antonio carlos": "3102902", + "antonio dias": "3103009", + "antonio prado de minas": "3103108", + "aracai": "3103207", + "aracitaba": "3103306", + "aracuai": "3103405", + "araguari": "3103504", + "arantina": "3103603", + "araponga": "3103702", + "arapora": "3103751", + "arapua": "3103801", + "araujos": "3103900", + "araxa": "3104007", + "arceburgo": "3104106", + "arcos": "3104205", + "areado": "3104304", + "argirita": "3104403", + "aricanduva": "3104452", + "arinos": "3104502", + "astolfo dutra": "3104601", + "ataleia": "3104700", + "augusto de lima": "3104809", + "baependi": "3104908", + "baldim": "3105004", + "bambui": "3105103", + "bandeira": "3105202", + "bandeira do sul": "3105301", + "barao de cocais": "3105400", + "barao de monte alto": "3105509", + "barbacena": "3105608", + "barra longa": "3105707", + "barroso": "3105905", + "bela vista de minas": "3106002", + "belmiro braga": "3106101", + "belo horizonte": "3106200", + "belo oriente": "3106309", + "belo vale": "3106408", + "berilo": "3106507", + "berizal": "3106655", + "bertopolis": "3106606", + "betim": "3106705", + "bias fortes": "3106804", + "bicas": "3106903", + "biquinhas": "3107000", + "boa esperanca": "3107109", + "bocaina de minas": "3107208", + "bocaiuva": "3107307", + "bom despacho": "3107406", + "bom jardim de minas": "3107505", + "bom jesus da penha": "3107604", + "bom jesus do amparo": "3107703", + "bom jesus do galho": "3107802", + "bom repouso": "3107901", + "bom sucesso": "3108008", + "bonfim": "3108107", + "bonfinopolis de minas": "3108206", + "bonito de minas": "3108255", + "borda da mata": "3108305", + "botelhos": "3108404", + "botumirim": "3108503", + "bras pires": "3108701", + "brasilandia de minas": "3108552", + "brasilia de minas": "3108602", + "braunas": "3108800", + "brazopolis": "3108909", + "brumadinho": "3109006", + "bueno brandao": "3109105", + "buenopolis": "3109204", + "bugre": "3109253", + "buritis": "3109303", + "buritizeiro": "3109402", + "cabeceira grande": "3109451", + "cabo verde": "3109501", + "cachoeira da prata": "3109600", + "cachoeira de minas": "3109709", + "cachoeira de pajeu": "3102704", + "cachoeira dourada": "3109808", + "caetanopolis": "3109907", + "caete": "3110004", + "caiana": "3110103", + "cajuri": "3110202", + "caldas": "3110301", + "camacho": "3110400", + "camanducaia": "3110509", + "cambui": "3110608", + "cambuquira": "3110707", + "campanario": "3110806", + "campanha": "3110905", + "campestre": "3111002", + "campina verde": "3111101", + "campo azul": "3111150", + "campo belo": "3111200", + "campo do meio": "3111309", + "campo florido": "3111408", + "campos altos": "3111507", + "campos gerais": "3111606", + "cana verde": "3111903", + "canaa": "3111705", + "canapolis": "3111804", + "candeias": "3112000", + "cantagalo": "3112059", + "caparao": "3112109", + "capela nova": "3112208", + "capelinha": "3112307", + "capetinga": "3112406", + "capim branco": "3112505", + "capinopolis": "3112604", + "capitao andrade": "3112653", + "capitao eneas": "3112703", + "capitolio": "3112802", + "caputira": "3112901", + "carai": "3113008", + "caranaiba": "3113107", + "carandai": "3113206", + "carangola": "3113305", + "caratinga": "3113404", + "carbonita": "3113503", + "careacu": "3113602", + "carlos chagas": "3113701", + "carmesia": "3113800", + "carmo da cachoeira": "3113909", + "carmo da mata": "3114006", + "carmo de minas": "3114105", + "carmo do cajuru": "3114204", + "carmo do paranaiba": "3114303", + "carmo do rio claro": "3114402", + "carmopolis de minas": "3114501", + "carneirinho": "3114550", + "carrancas": "3114600", + "carvalhopolis": "3114709", + "carvalhos": "3114808", + "casa grande": "3114907", + "cascalho rico": "3115003", + "cassia": "3115102", + "cataguases": "3115300", + "catas altas": "3115359", + "catas altas da noruega": "3115409", + "catuji": "3115458", + "catuti": "3115474", + "caxambu": "3115508", + "cedro do abaete": "3115607", + "central de minas": "3115706", + "centralina": "3115805", + "chacara": "3115904", + "chale": "3116001", + "chapada do norte": "3116100", + "chapada gaucha": "3116159", + "chiador": "3116209", + "cipotanea": "3116308", + "claraval": "3116407", + "claro dos pocoes": "3116506", + "claudio": "3116605", + "coimbra": "3116704", + "coluna": "3116803", + "comendador gomes": "3116902", + "comercinho": "3117009", + "conceicao da aparecida": "3117108", + "conceicao da barra de minas": "3115201", + "conceicao das alagoas": "3117306", + "conceicao das pedras": "3117207", + "conceicao de ipanema": "3117405", + "conceicao do mato dentro": "3117504", + "conceicao do para": "3117603", + "conceicao do rio verde": "3117702", + "conceicao dos ouros": "3117801", + "conego marinho": "3117836", + "confins": "3117876", + "congonhal": "3117900", + "congonhas": "3118007", + "congonhas do norte": "3118106", + "conquista": "3118205", + "conselheiro lafaiete": "3118304", + "conselheiro pena": "3118403", + "consolacao": "3118502", + "contagem": "3118601", + "coqueiral": "3118700", + "coracao de jesus": "3118809", + "cordisburgo": "3118908", + "cordislandia": "3119005", + "corinto": "3119104", + "coroaci": "3119203", + "coromandel": "3119302", + "coronel fabriciano": "3119401", + "coronel murta": "3119500", + "coronel pacheco": "3119609", + "coronel xavier chaves": "3119708", + "corrego danta": "3119807", + "corrego do bom jesus": "3119906", + "corrego fundo": "3119955", + "corrego novo": "3120003", + "couto de magalhaes de minas": "3120102", + "crisolita": "3120151", + "cristais": "3120201", + "cristalia": "3120300", + "cristiano otoni": "3120409", + "cristina": "3120508", + "crucilandia": "3120607", + "cruzeiro da fortaleza": "3120706", + "cruzilia": "3120805", + "cuparaque": "3120839", + "curral de dentro": "3120870", + "curvelo": "3120904", + "datas": "3121001", + "delfim moreira": "3121100", + "delfinopolis": "3121209", + "delta": "3121258", + "descoberto": "3121308", + "desterro de entre rios": "3121407", + "desterro do melo": "3121506", + "diamantina": "3121605", + "diogo de vasconcelos": "3121704", + "dionisio": "3121803", + "divinesia": "3121902", + "divino": "3122009", + "divino das laranjeiras": "3122108", + "divinolandia de minas": "3122207", + "divinopolis": "3122306", + "divisa alegre": "3122355", + "divisa nova": "3122405", + "divisopolis": "3122454", + "dom bosco": "3122470", + "dom cavati": "3122504", + "dom joaquim": "3122603", + "dom silverio": "3122702", + "dom vicoso": "3122801", + "dona euzebia": "3122900", + "dores de campos": "3123007", + "dores de guanhaes": "3123106", + "dores do indaia": "3123205", + "dores do turvo": "3123304", + "doresopolis": "3123403", + "douradoquara": "3123502", + "durande": "3123528", + "eloi mendes": "3123601", + "engenheiro caldas": "3123700", + "engenheiro navarro": "3123809", + "entre folhas": "3123858", + "entre rios de minas": "3123908", + "ervalia": "3124005", + "esmeraldas": "3124104", + "espera feliz": "3124203", + "espinosa": "3124302", + "espirito santo do dourado": "3124401", + "estiva": "3124500", + "estrela dalva": "3124609", + "estrela do indaia": "3124708", + "estrela do sul": "3124807", + "eugenopolis": "3124906", + "ewbank da camara": "3125002", + "extrema": "3125101", + "fama": "3125200", + "faria lemos": "3125309", + "felicio dos santos": "3125408", + "felisburgo": "3125606", + "felixlandia": "3125705", + "fernandes tourinho": "3125804", + "ferros": "3125903", + "fervedouro": "3125952", + "florestal": "3126000", + "formiga": "3126109", + "formoso": "3126208", + "fortaleza de minas": "3126307", + "fortuna de minas": "3126406", + "francisco badaro": "3126505", + "francisco dumont": "3126604", + "francisco sa": "3126703", + "franciscopolis": "3126752", + "frei gaspar": "3126802", + "frei inocencio": "3126901", + "frei lagonegro": "3126950", + "fronteira": "3127008", + "fronteira dos vales": "3127057", + "fruta de leite": "3127073", + "frutal": "3127107", + "funilandia": "3127206", + "galileia": "3127305", + "gameleiras": "3127339", + "glaucilandia": "3127354", + "goiabeira": "3127370", + "goiana": "3127388", + "goncalves": "3127404", + "gonzaga": "3127503", + "gouveia": "3127602", + "governador valadares": "3127701", + "grao mogol": "3127800", + "grupiara": "3127909", + "guanhaes": "3128006", + "guape": "3128105", + "guaraciaba": "3128204", + "guaraciama": "3128253", + "guaranesia": "3128303", + "guarani": "3128402", + "guarara": "3128501", + "guarda-mor": "3128600", + "guaxupe": "3128709", + "guidoval": "3128808", + "guimarania": "3128907", + "guiricema": "3129004", + "gurinhata": "3129103", + "heliodora": "3129202", + "iapu": "3129301", + "ibertioga": "3129400", + "ibia": "3129509", + "ibiai": "3129608", + "ibiracatu": "3129657", + "ibiraci": "3129707", + "ibirite": "3129806", + "ibitiura de minas": "3129905", + "ibituruna": "3130002", + "icarai de minas": "3130051", + "igarape": "3130101", + "igaratinga": "3130200", + "iguatama": "3130309", + "ijaci": "3130408", + "ilicinea": "3130507", + "imbe de minas": "3130556", + "inconfidentes": "3130606", + "indaiabira": "3130655", + "indianopolis": "3130705", + "ingai": "3130804", + "inhapim": "3130903", + "inhauma": "3131000", + "inimutaba": "3131109", + "ipaba": "3131158", + "ipanema": "3131208", + "ipatinga": "3131307", + "ipiacu": "3131406", + "ipuiuna": "3131505", + "irai de minas": "3131604", + "itabira": "3131703", + "itabirinha": "3131802", + "itabirito": "3131901", + "itacambira": "3132008", + "itacarambi": "3132107", + "itaguara": "3132206", + "itaipe": "3132305", + "itajuba": "3132404", + "itamarandiba": "3132503", + "itamarati de minas": "3132602", + "itambacuri": "3132701", + "itambe do mato dentro": "3132800", + "itamogi": "3132909", + "itamonte": "3133006", + "itanhandu": "3133105", + "itanhomi": "3133204", + "itaobim": "3133303", + "itapagipe": "3133402", + "itapecerica": "3133501", + "itapeva": "3133600", + "itatiaiucu": "3133709", + "itau de minas": "3133758", + "itauna": "3133808", + "itaverava": "3133907", + "itinga": "3134004", + "itueta": "3134103", + "ituiutaba": "3134202", + "itumirim": "3134301", + "iturama": "3134400", + "itutinga": "3134509", + "jaboticatubas": "3134608", + "jacinto": "3134707", + "jacui": "3134806", + "jacutinga": "3134905", + "jaguaracu": "3135001", + "jaiba": "3135050", + "jampruca": "3135076", + "janauba": "3135100", + "januaria": "3135209", + "japaraiba": "3135308", + "japonvar": "3135357", + "jeceaba": "3135407", + "jenipapo de minas": "3135456", + "jequeri": "3135506", + "jequitai": "3135605", + "jequitiba": "3135704", + "jequitinhonha": "3135803", + "jesuania": "3135902", + "joaima": "3136009", + "joanesia": "3136108", + "joao monlevade": "3136207", + "joao pinheiro": "3136306", + "joaquim felicio": "3136405", + "jordania": "3136504", + "jose goncalves de minas": "3136520", + "jose raydan": "3136553", + "josenopolis": "3136579", + "juatuba": "3136652", + "juiz de fora": "3136702", + "juramento": "3136801", + "juruaia": "3136900", + "juvenilia": "3136959", + "ladainha": "3137007", + "lagamar": "3137106", + "lagoa da prata": "3137205", + "lagoa dos patos": "3137304", + "lagoa dourada": "3137403", + "lagoa formosa": "3137502", + "lagoa grande": "3137536", + "lagoa santa": "3137601", + "lajinha": "3137700", + "lambari": "3137809", + "lamim": "3137908", + "laranjal": "3138005", + "lassance": "3138104", + "lavras": "3138203", + "leandro ferreira": "3138302", + "leme do prado": "3138351", + "leopoldina": "3138401", + "liberdade": "3138500", + "lima duarte": "3138609", + "limeira do oeste": "3138625", + "lontra": "3138658", + "luisburgo": "3138674", + "luislandia": "3138682", + "luminarias": "3138708", + "luz": "3138807", + "machacalis": "3138906", + "machado": "3139003", + "madre de deus de minas": "3139102", + "malacacheta": "3139201", + "mamonas": "3139250", + "manga": "3139300", + "manhuacu": "3139409", + "manhumirim": "3139508", + "mantena": "3139607", + "mar de espanha": "3139805", + "maravilhas": "3139706", + "maria da fe": "3139904", + "mariana": "3140001", + "marilac": "3140100", + "mario campos": "3140159", + "maripa de minas": "3140209", + "marlieria": "3140308", + "marmelopolis": "3140407", + "martinho campos": "3140506", + "martins soares": "3140530", + "mata verde": "3140555", + "materlandia": "3140605", + "mateus leme": "3140704", + "mathias lobato": "3171501", + "matias barbosa": "3140803", + "matias cardoso": "3140852", + "matipo": "3140902", + "mato verde": "3141009", + "matozinhos": "3141108", + "matutina": "3141207", + "medeiros": "3141306", + "medina": "3141405", + "mendes pimentel": "3141504", + "merces": "3141603", + "mesquita": "3141702", + "minas novas": "3141801", + "minduri": "3141900", + "mirabela": "3142007", + "miradouro": "3142106", + "mirai": "3142205", + "miravania": "3142254", + "moeda": "3142304", + "moema": "3142403", + "monjolos": "3142502", + "monsenhor paulo": "3142601", + "montalvania": "3142700", + "monte alegre de minas": "3142809", + "monte azul": "3142908", + "monte belo": "3143005", + "monte carmelo": "3143104", + "monte formoso": "3143153", + "monte santo de minas": "3143203", + "monte siao": "3143401", + "montes claros": "3143302", + "montezuma": "3143450", + "morada nova de minas": "3143500", + "morro da garca": "3143609", + "morro do pilar": "3143708", + "munhoz": "3143807", + "muriae": "3143906", + "mutum": "3144003", + "muzambinho": "3144102", + "nacip raydan": "3144201", + "nanuque": "3144300", + "naque": "3144359", + "natalandia": "3144375", + "natercia": "3144409", + "nazareno": "3144508", + "nepomuceno": "3144607", + "ninheira": "3144656", + "nova belem": "3144672", + "nova era": "3144706", + "nova lima": "3144805", + "nova modica": "3144904", + "nova ponte": "3145000", + "nova porteirinha": "3145059", + "nova resende": "3145109", + "nova serrana": "3145208", + "nova uniao": "3136603", + "novo cruzeiro": "3145307", + "novo oriente de minas": "3145356", + "novorizonte": "3145372", + "olaria": "3145406", + "olhos-d'agua": "3145455", + "olimpio noronha": "3145505", + "oliveira": "3145604", + "oliveira fortes": "3145703", + "onca de pitangui": "3145802", + "oratorios": "3145851", + "orizania": "3145877", + "ouro branco": "3145901", + "ouro fino": "3146008", + "ouro preto": "3146107", + "ouro verde de minas": "3146206", + "padre carvalho": "3146255", + "padre paraiso": "3146305", + "pai pedro": "3146552", + "paineiras": "3146404", + "pains": "3146503", + "paiva": "3146602", + "palma": "3146701", + "palmopolis": "3146750", + "papagaios": "3146909", + "para de minas": "3147105", + "paracatu": "3147006", + "paraguacu": "3147204", + "paraisopolis": "3147303", + "paraopeba": "3147402", + "passa quatro": "3147600", + "passa tempo": "3147709", + "passa vinte": "3147808", + "passabem": "3147501", + "passos": "3147907", + "patis": "3147956", + "patos de minas": "3148004", + "patrocinio": "3148103", + "patrocinio do muriae": "3148202", + "paula candido": "3148301", + "paulistas": "3148400", + "pavao": "3148509", + "pecanha": "3148608", + "pedra azul": "3148707", + "pedra bonita": "3148756", + "pedra do anta": "3148806", + "pedra do indaia": "3148905", + "pedra dourada": "3149002", + "pedralva": "3149101", + "pedras de maria da cruz": "3149150", + "pedrinopolis": "3149200", + "pedro leopoldo": "3149309", + "pedro teixeira": "3149408", + "pequeri": "3149507", + "pequi": "3149606", + "perdigao": "3149705", + "perdizes": "3149804", + "perdoes": "3149903", + "periquito": "3149952", + "pescador": "3150000", + "piau": "3150109", + "piedade de caratinga": "3150158", + "piedade de ponte nova": "3150208", + "piedade do rio grande": "3150307", + "piedade dos gerais": "3150406", + "pimenta": "3150505", + "pingo-d'agua": "3150539", + "pintopolis": "3150570", + "piracema": "3150604", + "pirajuba": "3150703", + "piranga": "3150802", + "pirangucu": "3150901", + "piranguinho": "3151008", + "pirapetinga": "3151107", + "pirapora": "3151206", + "pirauba": "3151305", + "pitangui": "3151404", + "piumhi": "3151503", + "planura": "3151602", + "poco fundo": "3151701", + "pocos de caldas": "3151800", + "pocrane": "3151909", + "pompeu": "3152006", + "ponte nova": "3152105", + "ponto chique": "3152131", + "ponto dos volantes": "3152170", + "porteirinha": "3152204", + "porto firme": "3152303", + "pote": "3152402", + "pouso alegre": "3152501", + "pouso alto": "3152600", + "prados": "3152709", + "prata": "3152808", + "pratapolis": "3152907", + "pratinha": "3153004", + "presidente bernardes": "3153103", + "presidente juscelino": "3153202", + "presidente kubitschek": "3153301", + "presidente olegario": "3153400", + "prudente de morais": "3153608", + "quartel geral": "3153707", + "queluzito": "3153806", + "raposos": "3153905", + "raul soares": "3154002", + "recreio": "3154101", + "reduto": "3154150", + "resende costa": "3154200", + "resplendor": "3154309", + "ressaquinha": "3154408", + "riachinho": "3154457", + "riacho dos machados": "3154507", + "ribeirao das neves": "3154606", + "ribeirao vermelho": "3154705", + "rio acima": "3154804", + "rio casca": "3154903", + "rio do prado": "3155108", + "rio doce": "3155009", + "rio espera": "3155207", + "rio manso": "3155306", + "rio novo": "3155405", + "rio paranaiba": "3155504", + "rio pardo de minas": "3155603", + "rio piracicaba": "3155702", + "rio pomba": "3155801", + "rio preto": "3155900", + "rio vermelho": "3156007", + "ritapolis": "3156106", + "rochedo de minas": "3156205", + "rodeiro": "3156304", + "romaria": "3156403", + "rosario da limeira": "3156452", + "rubelita": "3156502", + "rubim": "3156601", + "sabara": "3156700", + "sabinopolis": "3156809", + "sacramento": "3156908", + "salinas": "3157005", + "salto da divisa": "3157104", + "santa barbara": "3157203", + "santa barbara do leste": "3157252", + "santa barbara do monte verde": "3157278", + "santa barbara do tugurio": "3157302", + "santa cruz de minas": "3157336", + "santa cruz de salinas": "3157377", + "santa cruz do escalvado": "3157401", + "santa efigenia de minas": "3157500", + "santa fe de minas": "3157609", + "santa helena de minas": "3157658", + "santa juliana": "3157708", + "santa luzia": "3157807", + "santa margarida": "3157906", + "santa maria de itabira": "3158003", + "santa maria do salto": "3158102", + "santa maria do suacui": "3158201", + "santa rita de caldas": "3159209", + "santa rita de ibitipoca": "3159407", + "santa rita de jacutinga": "3159308", + "santa rita de minas": "3159357", + "santa rita do itueto": "3159506", + "santa rita do sapucai": "3159605", + "santa rosa da serra": "3159704", + "santa vitoria": "3159803", + "santana da vargem": "3158300", + "santana de cataguases": "3158409", + "santana de pirapama": "3158508", + "santana do deserto": "3158607", + "santana do garambeu": "3158706", + "santana do jacare": "3158805", + "santana do manhuacu": "3158904", + "santana do paraiso": "3158953", + "santana do riacho": "3159001", + "santana dos montes": "3159100", + "santo antonio do amparo": "3159902", + "santo antonio do aventureiro": "3160009", + "santo antonio do grama": "3160108", + "santo antonio do itambe": "3160207", + "santo antonio do jacinto": "3160306", + "santo antonio do monte": "3160405", + "santo antonio do retiro": "3160454", + "santo antonio do rio abaixo": "3160504", + "santo hipolito": "3160603", + "santos dumont": "3160702", + "sao bento abade": "3160801", + "sao bras do suacui": "3160900", + "sao domingos das dores": "3160959", + "sao domingos do prata": "3161007", + "sao felix de minas": "3161056", + "sao francisco": "3161106", + "sao francisco de paula": "3161205", + "sao francisco de sales": "3161304", + "sao francisco do gloria": "3161403", + "sao geraldo": "3161502", + "sao geraldo da piedade": "3161601", + "sao geraldo do baixio": "3161650", + "sao goncalo do abaete": "3161700", + "sao goncalo do para": "3161809", + "sao goncalo do rio abaixo": "3161908", + "sao goncalo do rio preto": "3125507", + "sao goncalo do sapucai": "3162005", + "sao gotardo": "3162104", + "sao joao batista do gloria": "3162203", + "sao joao da lagoa": "3162252", + "sao joao da mata": "3162302", + "sao joao da ponte": "3162401", + "sao joao das missoes": "3162450", + "sao joao del rei": "3162500", + "sao joao do manhuacu": "3162559", + "sao joao do manteninha": "3162575", + "sao joao do oriente": "3162609", + "sao joao do pacui": "3162658", + "sao joao do paraiso": "3162708", + "sao joao evangelista": "3162807", + "sao joao nepomuceno": "3162906", + "sao joaquim de bicas": "3162922", + "sao jose da barra": "3162948", + "sao jose da lapa": "3162955", + "sao jose da safira": "3163003", + "sao jose da varginha": "3163102", + "sao jose do alegre": "3163201", + "sao jose do divino": "3163300", + "sao jose do goiabal": "3163409", + "sao jose do jacuri": "3163508", + "sao jose do mantimento": "3163607", + "sao lourenco": "3163706", + "sao miguel do anta": "3163805", + "sao pedro da uniao": "3163904", + "sao pedro do suacui": "3164100", + "sao pedro dos ferros": "3164001", + "sao romao": "3164209", + "sao roque de minas": "3164308", + "sao sebastiao da bela vista": "3164407", + "sao sebastiao da vargem alegre": "3164431", + "sao sebastiao do anta": "3164472", + "sao sebastiao do maranhao": "3164506", + "sao sebastiao do oeste": "3164605", + "sao sebastiao do paraiso": "3164704", + "sao sebastiao do rio preto": "3164803", + "sao sebastiao do rio verde": "3164902", + "sao tiago": "3165008", + "sao tomas de aquino": "3165107", + "sao tome das letras": "3165206", + "sao vicente de minas": "3165305", + "sapucai-mirim": "3165404", + "sardoa": "3165503", + "sarzedo": "3165537", + "sem-peixe": "3165560", + "senador amaral": "3165578", + "senador cortes": "3165602", + "senador firmino": "3165701", + "senador jose bento": "3165800", + "senador modestino goncalves": "3165909", + "senhora de oliveira": "3166006", + "senhora do porto": "3166105", + "senhora dos remedios": "3166204", + "sericita": "3166303", + "seritinga": "3166402", + "serra azul de minas": "3166501", + "serra da saudade": "3166600", + "serra do salitre": "3166808", + "serra dos aimores": "3166709", + "serrania": "3166907", + "serranopolis de minas": "3166956", + "serranos": "3167004", + "serro": "3167103", + "sete lagoas": "3167202", + "setubinha": "3165552", + "silveirania": "3167301", + "silvianopolis": "3167400", + "simao pereira": "3167509", + "simonesia": "3167608", + "sobralia": "3167707", + "soledade de minas": "3167806", + "tabuleiro": "3167905", + "taiobeiras": "3168002", + "taparuba": "3168051", + "tapira": "3168101", + "tapirai": "3168200", + "taquaracu de minas": "3168309", + "tarumirim": "3168408", + "teixeiras": "3168507", + "teofilo otoni": "3168606", + "timoteo": "3168705", + "tiradentes": "3168804", + "tiros": "3168903", + "tocantins": "3169000", + "tocos do moji": "3169059", + "toledo": "3169109", + "tombos": "3169208", + "tres coracoes": "3169307", + "tres marias": "3169356", + "tres pontas": "3169406", + "tumiritinga": "3169505", + "tupaciguara": "3169604", + "turmalina": "3169703", + "turvolandia": "3169802", + "uba": "3169901", + "ubai": "3170008", + "ubaporanga": "3170057", + "uberaba": "3170107", + "uberlandia": "3170206", + "umburatiba": "3170305", + "unai": "3170404", + "uniao de minas": "3170438", + "uruana de minas": "3170479", + "urucania": "3170503", + "urucuia": "3170529", + "vargem alegre": "3170578", + "vargem bonita": "3170602", + "vargem grande do rio pardo": "3170651", + "varginha": "3170701", + "varjao de minas": "3170750", + "varzea da palma": "3170800", + "varzelandia": "3170909", + "vazante": "3171006", + "verdelandia": "3171030", + "veredinha": "3171071", + "verissimo": "3171105", + "vermelho novo": "3171154", + "vespasiano": "3171204", + "vicosa": "3171303", + "vieiras": "3171402", + "virgem da lapa": "3171600", + "virginia": "3171709", + "virginopolis": "3171808", + "virgolandia": "3171907", + "visconde do rio branco": "3172004", + "volta grande": "3172103", + "wenceslau braz": "3172202" + }, + "ES": { + "afonso claudio": "3200102", + "agua doce do norte": "3200169", + "aguia branca": "3200136", + "alegre": "3200201", + "alfredo chaves": "3200300", + "alto rio novo": "3200359", + "anchieta": "3200409", + "apiaca": "3200508", + "aracruz": "3200607", + "atilio vivacqua": "3200706", + "baixo guandu": "3200805", + "barra de sao francisco": "3200904", + "boa esperanca": "3201001", + "bom jesus do norte": "3201100", + "brejetuba": "3201159", + "cachoeiro de itapemirim": "3201209", + "cariacica": "3201308", + "castelo": "3201407", + "colatina": "3201506", + "conceicao da barra": "3201605", + "conceicao do castelo": "3201704", + "divino de sao lourenco": "3201803", + "domingos martins": "3201902", + "dores do rio preto": "3202009", + "ecoporanga": "3202108", + "fundao": "3202207", + "governador lindenberg": "3202256", + "guacui": "3202306", + "guarapari": "3202405", + "ibatiba": "3202454", + "ibiracu": "3202504", + "ibitirama": "3202553", + "iconha": "3202603", + "irupi": "3202652", + "itaguacu": "3202702", + "itapemirim": "3202801", + "itarana": "3202900", + "iuna": "3203007", + "jaguare": "3203056", + "jeronimo monteiro": "3203106", + "joao neiva": "3203130", + "laranja da terra": "3203163", + "linhares": "3203205", + "mantenopolis": "3203304", + "marataizes": "3203320", + "marechal floriano": "3203346", + "marilandia": "3203353", + "mimoso do sul": "3203403", + "montanha": "3203502", + "mucurici": "3203601", + "muniz freire": "3203700", + "muqui": "3203809", + "nova venecia": "3203908", + "pancas": "3204005", + "pedro canario": "3204054", + "pinheiros": "3204104", + "piuma": "3204203", + "ponto belo": "3204252", + "presidente kennedy": "3204302", + "rio bananal": "3204351", + "rio novo do sul": "3204401", + "santa leopoldina": "3204500", + "santa maria de jetiba": "3204559", + "santa teresa": "3204609", + "sao domingos do norte": "3204658", + "sao gabriel da palha": "3204708", + "sao jose do calcado": "3204807", + "sao mateus": "3204906", + "sao roque do canaa": "3204955", + "serra": "3205002", + "sooretama": "3205010", + "vargem alta": "3205036", + "venda nova do imigrante": "3205069", + "viana": "3205101", + "vila pavao": "3205150", + "vila valerio": "3205176", + "vila velha": "3205200", + "vitoria": "3205309" + }, + "RJ": { + "angra dos reis": "3300100", + "aperibe": "3300159", + "araruama": "3300209", + "areal": "3300225", + "armacao dos buzios": "3300233", + "arraial do cabo": "3300258", + "barra do pirai": "3300308", + "barra mansa": "3300407", + "belford roxo": "3300456", + "bom jardim": "3300506", + "bom jesus do itabapoana": "3300605", + "cabo frio": "3300704", + "cachoeiras de macacu": "3300803", + "cambuci": "3300902", + "campos dos goytacazes": "3301009", + "cantagalo": "3301108", + "carapebus": "3300936", + "cardoso moreira": "3301157", + "carmo": "3301207", + "casimiro de abreu": "3301306", + "comendador levy gasparian": "3300951", + "conceicao de macabu": "3301405", + "cordeiro": "3301504", + "duas barras": "3301603", + "duque de caxias": "3301702", + "engenheiro paulo de frontin": "3301801", + "guapimirim": "3301850", + "iguaba grande": "3301876", + "itaborai": "3301900", + "itaguai": "3302007", + "italva": "3302056", + "itaocara": "3302106", + "itaperuna": "3302205", + "itatiaia": "3302254", + "japeri": "3302270", + "laje do muriae": "3302304", + "macae": "3302403", + "macuco": "3302452", + "mage": "3302502", + "mangaratiba": "3302601", + "marica": "3302700", + "mendes": "3302809", + "mesquita": "3302858", + "miguel pereira": "3302908", + "miracema": "3303005", + "natividade": "3303104", + "nilopolis": "3303203", + "niteroi": "3303302", + "nova friburgo": "3303401", + "nova iguacu": "3303500", + "paracambi": "3303609", + "paraiba do sul": "3303708", + "paraty": "3303807", + "paty do alferes": "3303856", + "petropolis": "3303906", + "pinheiral": "3303955", + "pirai": "3304003", + "porciuncula": "3304102", + "porto real": "3304110", + "quatis": "3304128", + "queimados": "3304144", + "quissama": "3304151", + "resende": "3304201", + "rio bonito": "3304300", + "rio claro": "3304409", + "rio das flores": "3304508", + "rio das ostras": "3304524", + "rio de janeiro": "3304557", + "santa maria madalena": "3304607", + "santo antonio de padua": "3304706", + "sao fidelis": "3304805", + "sao francisco de itabapoana": "3304755", + "sao goncalo": "3304904", + "sao joao da barra": "3305000", + "sao joao de meriti": "3305109", + "sao jose de uba": "3305133", + "sao jose do vale do rio preto": "3305158", + "sao pedro da aldeia": "3305208", + "sao sebastiao do alto": "3305307", + "sapucaia": "3305406", + "saquarema": "3305505", + "seropedica": "3305554", + "silva jardim": "3305604", + "sumidouro": "3305703", + "tangua": "3305752", + "teresopolis": "3305802", + "trajano de moraes": "3305901", + "tres rios": "3306008", + "valenca": "3306107", + "varre-sai": "3306156", + "vassouras": "3306206", + "volta redonda": "3306305" + }, + "SP": { + "adamantina": "3500105", + "adolfo": "3500204", + "aguai": "3500303", + "aguas da prata": "3500402", + "aguas de lindoia": "3500501", + "aguas de santa barbara": "3500550", + "aguas de sao pedro": "3500600", + "agudos": "3500709", + "alambari": "3500758", + "alfredo marcondes": "3500808", + "altair": "3500907", + "altinopolis": "3501004", + "alto alegre": "3501103", + "aluminio": "3501152", + "alvares florence": "3501202", + "alvares machado": "3501301", + "alvaro de carvalho": "3501400", + "alvinlandia": "3501509", + "americana": "3501608", + "americo brasiliense": "3501707", + "americo de campos": "3501806", + "amparo": "3501905", + "analandia": "3502002", + "andradina": "3502101", + "angatuba": "3502200", + "anhembi": "3502309", + "anhumas": "3502408", + "aparecida": "3502507", + "aparecida d'oeste": "3502606", + "apiai": "3502705", + "aracariguama": "3502754", + "aracatuba": "3502804", + "aracoiaba da serra": "3502903", + "aramina": "3503000", + "arandu": "3503109", + "arapei": "3503158", + "araraquara": "3503208", + "araras": "3503307", + "arco-iris": "3503356", + "arealva": "3503406", + "areias": "3503505", + "areiopolis": "3503604", + "ariranha": "3503703", + "artur nogueira": "3503802", + "aruja": "3503901", + "aspasia": "3503950", + "assis": "3504008", + "atibaia": "3504107", + "auriflama": "3504206", + "avai": "3504305", + "avanhandava": "3504404", + "avare": "3504503", + "bady bassitt": "3504602", + "balbinos": "3504701", + "balsamo": "3504800", + "bananal": "3504909", + "barao de antonina": "3505005", + "barbosa": "3505104", + "bariri": "3505203", + "barra bonita": "3505302", + "barra do chapeu": "3505351", + "barra do turvo": "3505401", + "barretos": "3505500", + "barrinha": "3505609", + "barueri": "3505708", + "bastos": "3505807", + "batatais": "3505906", + "bauru": "3506003", + "bebedouro": "3506102", + "bento de abreu": "3506201", + "bernardino de campos": "3506300", + "bertioga": "3506359", + "bilac": "3506409", + "birigui": "3506508", + "biritiba mirim": "3506607", + "boa esperanca do sul": "3506706", + "bocaina": "3506805", + "bofete": "3506904", + "boituva": "3507001", + "bom jesus dos perdoes": "3507100", + "bom sucesso de itarare": "3507159", + "bora": "3507209", + "boraceia": "3507308", + "borborema": "3507407", + "borebi": "3507456", + "botucatu": "3507506", + "braganca paulista": "3507605", + "brauna": "3507704", + "brejo alegre": "3507753", + "brodowski": "3507803", + "brotas": "3507902", + "buri": "3508009", + "buritama": "3508108", + "buritizal": "3508207", + "cabralia paulista": "3508306", + "cabreuva": "3508405", + "cacapava": "3508504", + "cachoeira paulista": "3508603", + "caconde": "3508702", + "cafelandia": "3508801", + "caiabu": "3508900", + "caieiras": "3509007", + "caiua": "3509106", + "cajamar": "3509205", + "cajati": "3509254", + "cajobi": "3509304", + "cajuru": "3509403", + "campina do monte alegre": "3509452", + "campinas": "3509502", + "campo limpo paulista": "3509601", + "campos do jordao": "3509700", + "campos novos paulista": "3509809", + "cananeia": "3509908", + "canas": "3509957", + "candido mota": "3510005", + "candido rodrigues": "3510104", + "canitar": "3510153", + "capao bonito": "3510203", + "capela do alto": "3510302", + "capivari": "3510401", + "caraguatatuba": "3510500", + "carapicuiba": "3510609", + "cardoso": "3510708", + "casa branca": "3510807", + "cassia dos coqueiros": "3510906", + "castilho": "3511003", + "catanduva": "3511102", + "catigua": "3511201", + "cedral": "3511300", + "cerqueira cesar": "3511409", + "cerquilho": "3511508", + "cesario lange": "3511607", + "charqueada": "3511706", + "chavantes": "3557204", + "clementina": "3511904", + "colina": "3512001", + "colombia": "3512100", + "conchal": "3512209", + "conchas": "3512308", + "cordeiropolis": "3512407", + "coroados": "3512506", + "coronel macedo": "3512605", + "corumbatai": "3512704", + "cosmopolis": "3512803", + "cosmorama": "3512902", + "cotia": "3513009", + "cravinhos": "3513108", + "cristais paulista": "3513207", + "cruzalia": "3513306", + "cruzeiro": "3513405", + "cubatao": "3513504", + "cunha": "3513603", + "descalvado": "3513702", + "diadema": "3513801", + "dirce reis": "3513850", + "divinolandia": "3513900", + "dobrada": "3514007", + "dois corregos": "3514106", + "dolcinopolis": "3514205", + "dourado": "3514304", + "dracena": "3514403", + "duartina": "3514502", + "dumont": "3514601", + "echapora": "3514700", + "eldorado": "3514809", + "elias fausto": "3514908", + "elisiario": "3514924", + "embauba": "3514957", + "embu das artes": "3515004", + "embu-guacu": "3515103", + "emilianopolis": "3515129", + "engenheiro coelho": "3515152", + "espirito santo do pinhal": "3515186", + "espirito santo do turvo": "3515194", + "estiva gerbi": "3557303", + "estrela do norte": "3515301", + "estrela d'oeste": "3515202", + "euclides da cunha paulista": "3515350", + "fartura": "3515400", + "fernando prestes": "3515608", + "fernandopolis": "3515509", + "fernao": "3515657", + "ferraz de vasconcelos": "3515707", + "flora rica": "3515806", + "floreal": "3515905", + "florida paulista": "3516002", + "florinea": "3516101", + "franca": "3516200", + "francisco morato": "3516309", + "franco da rocha": "3516408", + "gabriel monteiro": "3516507", + "galia": "3516606", + "garca": "3516705", + "gastao vidigal": "3516804", + "gaviao peixoto": "3516853", + "general salgado": "3516903", + "getulina": "3517000", + "glicerio": "3517109", + "guaicara": "3517208", + "guaimbe": "3517307", + "guaira": "3517406", + "guapiacu": "3517505", + "guapiara": "3517604", + "guara": "3517703", + "guaracai": "3517802", + "guaraci": "3517901", + "guarani d'oeste": "3518008", + "guaranta": "3518107", + "guararapes": "3518206", + "guararema": "3518305", + "guaratingueta": "3518404", + "guarei": "3518503", + "guariba": "3518602", + "guaruja": "3518701", + "guarulhos": "3518800", + "guatapara": "3518859", + "guzolandia": "3518909", + "herculandia": "3519006", + "holambra": "3519055", + "hortolandia": "3519071", + "iacanga": "3519105", + "iacri": "3519204", + "iaras": "3519253", + "ibate": "3519303", + "ibira": "3519402", + "ibirarema": "3519501", + "ibitinga": "3519600", + "ibiuna": "3519709", + "icem": "3519808", + "iepe": "3519907", + "igaracu do tiete": "3520004", + "igarapava": "3520103", + "igarata": "3520202", + "iguape": "3520301", + "ilha comprida": "3520426", + "ilha solteira": "3520442", + "ilhabela": "3520400", + "indaiatuba": "3520509", + "indiana": "3520608", + "indiapora": "3520707", + "inubia paulista": "3520806", + "ipaussu": "3520905", + "ipero": "3521002", + "ipeuna": "3521101", + "ipigua": "3521150", + "iporanga": "3521200", + "ipua": "3521309", + "iracemapolis": "3521408", + "irapua": "3521507", + "irapuru": "3521606", + "itabera": "3521705", + "itai": "3521804", + "itajobi": "3521903", + "itaju": "3522000", + "itanhaem": "3522109", + "itaoca": "3522158", + "itapecerica da serra": "3522208", + "itapetininga": "3522307", + "itapeva": "3522406", + "itapevi": "3522505", + "itapira": "3522604", + "itapirapua paulista": "3522653", + "itapolis": "3522703", + "itaporanga": "3522802", + "itapui": "3522901", + "itapura": "3523008", + "itaquaquecetuba": "3523107", + "itarare": "3523206", + "itariri": "3523305", + "itatiba": "3523404", + "itatinga": "3523503", + "itirapina": "3523602", + "itirapua": "3523701", + "itobi": "3523800", + "itu": "3523909", + "itupeva": "3524006", + "ituverava": "3524105", + "jaborandi": "3524204", + "jaboticabal": "3524303", + "jacarei": "3524402", + "jaci": "3524501", + "jacupiranga": "3524600", + "jaguariuna": "3524709", + "jales": "3524808", + "jambeiro": "3524907", + "jandira": "3525003", + "jardinopolis": "3525102", + "jarinu": "3525201", + "jau": "3525300", + "jeriquara": "3525409", + "joanopolis": "3525508", + "joao ramalho": "3525607", + "jose bonifacio": "3525706", + "julio mesquita": "3525805", + "jumirim": "3525854", + "jundiai": "3525904", + "junqueiropolis": "3526001", + "juquia": "3526100", + "juquitiba": "3526209", + "lagoinha": "3526308", + "laranjal paulista": "3526407", + "lavinia": "3526506", + "lavrinhas": "3526605", + "leme": "3526704", + "lencois paulista": "3526803", + "limeira": "3526902", + "lindoia": "3527009", + "lins": "3527108", + "lorena": "3527207", + "lourdes": "3527256", + "louveira": "3527306", + "lucelia": "3527405", + "lucianopolis": "3527504", + "luis antonio": "3527603", + "luiziania": "3527702", + "lupercio": "3527801", + "lutecia": "3527900", + "macatuba": "3528007", + "macaubal": "3528106", + "macedonia": "3528205", + "magda": "3528304", + "mairinque": "3528403", + "mairipora": "3528502", + "manduri": "3528601", + "maraba paulista": "3528700", + "maracai": "3528809", + "marapoama": "3528858", + "mariapolis": "3528908", + "marilia": "3529005", + "marinopolis": "3529104", + "martinopolis": "3529203", + "matao": "3529302", + "maua": "3529401", + "mendonca": "3529500", + "meridiano": "3529609", + "mesopolis": "3529658", + "miguelopolis": "3529708", + "mineiros do tiete": "3529807", + "mira estrela": "3530003", + "miracatu": "3529906", + "mirandopolis": "3530102", + "mirante do paranapanema": "3530201", + "mirassol": "3530300", + "mirassolandia": "3530409", + "mococa": "3530508", + "mogi das cruzes": "3530607", + "mogi guacu": "3530706", + "mogi mirim": "3530805", + "mombuca": "3530904", + "moncoes": "3531001", + "mongagua": "3531100", + "monte alegre do sul": "3531209", + "monte alto": "3531308", + "monte aprazivel": "3531407", + "monte azul paulista": "3531506", + "monte castelo": "3531605", + "monte mor": "3531803", + "monteiro lobato": "3531704", + "morro agudo": "3531902", + "morungaba": "3532009", + "motuca": "3532058", + "murutinga do sul": "3532108", + "nantes": "3532157", + "narandiba": "3532207", + "natividade da serra": "3532306", + "nazare paulista": "3532405", + "neves paulista": "3532504", + "nhandeara": "3532603", + "nipoa": "3532702", + "nova alianca": "3532801", + "nova campina": "3532827", + "nova canaa paulista": "3532843", + "nova castilho": "3532868", + "nova europa": "3532900", + "nova granada": "3533007", + "nova guataporanga": "3533106", + "nova independencia": "3533205", + "nova luzitania": "3533304", + "nova odessa": "3533403", + "novais": "3533254", + "novo horizonte": "3533502", + "nuporanga": "3533601", + "ocaucu": "3533700", + "oleo": "3533809", + "olimpia": "3533908", + "onda verde": "3534005", + "oriente": "3534104", + "orindiuva": "3534203", + "orlandia": "3534302", + "osasco": "3534401", + "oscar bressane": "3534500", + "osvaldo cruz": "3534609", + "ourinhos": "3534708", + "ouro verde": "3534807", + "ouroeste": "3534757", + "pacaembu": "3534906", + "palestina": "3535002", + "palmares paulista": "3535101", + "palmeira d'oeste": "3535200", + "palmital": "3535309", + "panorama": "3535408", + "paraguacu paulista": "3535507", + "paraibuna": "3535606", + "paraiso": "3535705", + "paranapanema": "3535804", + "paranapua": "3535903", + "parapua": "3536000", + "pardinho": "3536109", + "pariquera-acu": "3536208", + "parisi": "3536257", + "patrocinio paulista": "3536307", + "pauliceia": "3536406", + "paulinia": "3536505", + "paulistania": "3536570", + "paulo de faria": "3536604", + "pederneiras": "3536703", + "pedra bela": "3536802", + "pedranopolis": "3536901", + "pedregulho": "3537008", + "pedreira": "3537107", + "pedrinhas paulista": "3537156", + "pedro de toledo": "3537206", + "penapolis": "3537305", + "pereira barreto": "3537404", + "pereiras": "3537503", + "peruibe": "3537602", + "piacatu": "3537701", + "piedade": "3537800", + "pilar do sul": "3537909", + "pindamonhangaba": "3538006", + "pindorama": "3538105", + "pinhalzinho": "3538204", + "piquerobi": "3538303", + "piquete": "3538501", + "piracaia": "3538600", + "piracicaba": "3538709", + "piraju": "3538808", + "pirajui": "3538907", + "pirangi": "3539004", + "pirapora do bom jesus": "3539103", + "pirapozinho": "3539202", + "pirassununga": "3539301", + "piratininga": "3539400", + "pitangueiras": "3539509", + "planalto": "3539608", + "platina": "3539707", + "poa": "3539806", + "poloni": "3539905", + "pompeia": "3540002", + "pongai": "3540101", + "pontal": "3540200", + "pontalinda": "3540259", + "pontes gestal": "3540309", + "populina": "3540408", + "porangaba": "3540507", + "porto feliz": "3540606", + "porto ferreira": "3540705", + "potim": "3540754", + "potirendaba": "3540804", + "pracinha": "3540853", + "pradopolis": "3540903", + "praia grande": "3541000", + "pratania": "3541059", + "presidente alves": "3541109", + "presidente bernardes": "3541208", + "presidente epitacio": "3541307", + "presidente prudente": "3541406", + "presidente venceslau": "3541505", + "promissao": "3541604", + "quadra": "3541653", + "quata": "3541703", + "queiroz": "3541802", + "queluz": "3541901", + "quintana": "3542008", + "rafard": "3542107", + "rancharia": "3542206", + "redencao da serra": "3542305", + "regente feijo": "3542404", + "reginopolis": "3542503", + "registro": "3542602", + "restinga": "3542701", + "ribeira": "3542800", + "ribeirao bonito": "3542909", + "ribeirao branco": "3543006", + "ribeirao corrente": "3543105", + "ribeirao do sul": "3543204", + "ribeirao dos indios": "3543238", + "ribeirao grande": "3543253", + "ribeirao pires": "3543303", + "ribeirao preto": "3543402", + "rifaina": "3543600", + "rincao": "3543709", + "rinopolis": "3543808", + "rio claro": "3543907", + "rio das pedras": "3544004", + "rio grande da serra": "3544103", + "riolandia": "3544202", + "riversul": "3543501", + "rosana": "3544251", + "roseira": "3544301", + "rubiacea": "3544400", + "rubineia": "3544509", + "sabino": "3544608", + "sagres": "3544707", + "sales": "3544806", + "sales oliveira": "3544905", + "salesopolis": "3545001", + "salmourao": "3545100", + "saltinho": "3545159", + "salto": "3545209", + "salto de pirapora": "3545308", + "salto grande": "3545407", + "sandovalina": "3545506", + "santa adelia": "3545605", + "santa albertina": "3545704", + "santa barbara d'oeste": "3545803", + "santa branca": "3546009", + "santa clara d'oeste": "3546108", + "santa cruz da conceicao": "3546207", + "santa cruz da esperanca": "3546256", + "santa cruz das palmeiras": "3546306", + "santa cruz do rio pardo": "3546405", + "santa ernestina": "3546504", + "santa fe do sul": "3546603", + "santa gertrudes": "3546702", + "santa isabel": "3546801", + "santa lucia": "3546900", + "santa maria da serra": "3547007", + "santa mercedes": "3547106", + "santa rita do passa quatro": "3547502", + "santa rita d'oeste": "3547403", + "santa rosa de viterbo": "3547601", + "santa salete": "3547650", + "santana da ponte pensa": "3547205", + "santana de parnaiba": "3547304", + "santo anastacio": "3547700", + "santo andre": "3547809", + "santo antonio da alegria": "3547908", + "santo antonio de posse": "3548005", + "santo antonio do aracangua": "3548054", + "santo antonio do jardim": "3548104", + "santo antonio do pinhal": "3548203", + "santo expedito": "3548302", + "santopolis do aguapei": "3548401", + "santos": "3548500", + "sao bento do sapucai": "3548609", + "sao bernardo do campo": "3548708", + "sao caetano do sul": "3548807", + "sao carlos": "3548906", + "sao francisco": "3549003", + "sao joao da boa vista": "3549102", + "sao joao das duas pontes": "3549201", + "sao joao de iracema": "3549250", + "sao joao do pau d'alho": "3549300", + "sao joaquim da barra": "3549409", + "sao jose da bela vista": "3549508", + "sao jose do barreiro": "3549607", + "sao jose do rio pardo": "3549706", + "sao jose do rio preto": "3549805", + "sao jose dos campos": "3549904", + "sao lourenco da serra": "3549953", + "sao luiz do paraitinga": "3550001", + "sao manuel": "3550100", + "sao miguel arcanjo": "3550209", + "sao paulo": "3550308", + "sao pedro": "3550407", + "sao pedro do turvo": "3550506", + "sao roque": "3550605", + "sao sebastiao": "3550704", + "sao sebastiao da grama": "3550803", + "sao simao": "3550902", + "sao vicente": "3551009", + "sarapui": "3551108", + "sarutaia": "3551207", + "sebastianopolis do sul": "3551306", + "serra azul": "3551405", + "serra negra": "3551603", + "serrana": "3551504", + "sertaozinho": "3551702", + "sete barras": "3551801", + "severinia": "3551900", + "silveiras": "3552007", + "socorro": "3552106", + "sorocaba": "3552205", + "sud mennucci": "3552304", + "sumare": "3552403", + "suzanapolis": "3552551", + "suzano": "3552502", + "tabapua": "3552601", + "tabatinga": "3552700", + "taboao da serra": "3552809", + "taciba": "3552908", + "taguai": "3553005", + "taiacu": "3553104", + "taiuva": "3553203", + "tambau": "3553302", + "tanabi": "3553401", + "tapirai": "3553500", + "tapiratiba": "3553609", + "taquaral": "3553658", + "taquaritinga": "3553708", + "taquarituba": "3553807", + "taquarivai": "3553856", + "tarabai": "3553906", + "taruma": "3553955", + "tatui": "3554003", + "taubate": "3554102", + "tejupa": "3554201", + "teodoro sampaio": "3554300", + "terra roxa": "3554409", + "tiete": "3554508", + "timburi": "3554607", + "torre de pedra": "3554656", + "torrinha": "3554706", + "trabiju": "3554755", + "tremembe": "3554805", + "tres fronteiras": "3554904", + "tuiuti": "3554953", + "tupa": "3555000", + "tupi paulista": "3555109", + "turiuba": "3555208", + "turmalina": "3555307", + "ubarana": "3555356", + "ubatuba": "3555406", + "ubirajara": "3555505", + "uchoa": "3555604", + "uniao paulista": "3555703", + "urania": "3555802", + "uru": "3555901", + "urupes": "3556008", + "valentim gentil": "3556107", + "valinhos": "3556206", + "valparaiso": "3556305", + "vargem": "3556354", + "vargem grande do sul": "3556404", + "vargem grande paulista": "3556453", + "varzea paulista": "3556503", + "vera cruz": "3556602", + "vinhedo": "3556701", + "viradouro": "3556800", + "vista alegre do alto": "3556909", + "vitoria brasil": "3556958", + "votorantim": "3557006", + "votuporanga": "3557105", + "zacarias": "3557154" + }, + "PR": { + "abatia": "4100103", + "adrianopolis": "4100202", + "agudos do sul": "4100301", + "almirante tamandare": "4100400", + "altamira do parana": "4100459", + "alto paraiso": "4128625", + "alto parana": "4100608", + "alto piquiri": "4100707", + "altonia": "4100509", + "alvorada do sul": "4100806", + "amapora": "4100905", + "ampere": "4101002", + "anahy": "4101051", + "andira": "4101101", + "angulo": "4101150", + "antonina": "4101200", + "antonio olinto": "4101309", + "apucarana": "4101408", + "arapongas": "4101507", + "arapoti": "4101606", + "arapua": "4101655", + "araruna": "4101705", + "araucaria": "4101804", + "ariranha do ivai": "4101853", + "assai": "4101903", + "assis chateaubriand": "4102000", + "astorga": "4102109", + "atalaia": "4102208", + "balsa nova": "4102307", + "bandeirantes": "4102406", + "barbosa ferraz": "4102505", + "barra do jacare": "4102703", + "barracao": "4102604", + "bela vista da caroba": "4102752", + "bela vista do paraiso": "4102802", + "bituruna": "4102901", + "boa esperanca": "4103008", + "boa esperanca do iguacu": "4103024", + "boa ventura de sao roque": "4103040", + "boa vista da aparecida": "4103057", + "bocaiuva do sul": "4103107", + "bom jesus do sul": "4103156", + "bom sucesso": "4103206", + "bom sucesso do sul": "4103222", + "borrazopolis": "4103305", + "braganey": "4103354", + "brasilandia do sul": "4103370", + "cafeara": "4103404", + "cafelandia": "4103453", + "cafezal do sul": "4103479", + "california": "4103503", + "cambara": "4103602", + "cambe": "4103701", + "cambira": "4103800", + "campina da lagoa": "4103909", + "campina do simao": "4103958", + "campina grande do sul": "4104006", + "campo bonito": "4104055", + "campo do tenente": "4104105", + "campo largo": "4104204", + "campo magro": "4104253", + "campo mourao": "4104303", + "candido de abreu": "4104402", + "candoi": "4104428", + "cantagalo": "4104451", + "capanema": "4104501", + "capitao leonidas marques": "4104600", + "carambei": "4104659", + "carlopolis": "4104709", + "cascavel": "4104808", + "castro": "4104907", + "catanduvas": "4105003", + "centenario do sul": "4105102", + "cerro azul": "4105201", + "ceu azul": "4105300", + "chopinzinho": "4105409", + "cianorte": "4105508", + "cidade gaucha": "4105607", + "clevelandia": "4105706", + "colombo": "4105805", + "colorado": "4105904", + "congonhinhas": "4106001", + "conselheiro mairinck": "4106100", + "contenda": "4106209", + "corbelia": "4106308", + "cornelio procopio": "4106407", + "coronel domingos soares": "4106456", + "coronel vivida": "4106506", + "corumbatai do sul": "4106555", + "cruz machado": "4106803", + "cruzeiro do iguacu": "4106571", + "cruzeiro do oeste": "4106605", + "cruzeiro do sul": "4106704", + "cruzmaltina": "4106852", + "curitiba": "4106902", + "curiuva": "4107009", + "diamante do norte": "4107108", + "diamante do sul": "4107124", + "diamante d'oeste": "4107157", + "dois vizinhos": "4107207", + "douradina": "4107256", + "doutor camargo": "4107306", + "doutor ulysses": "4128633", + "eneas marques": "4107405", + "engenheiro beltrao": "4107504", + "entre rios do oeste": "4107538", + "esperanca nova": "4107520", + "espigao alto do iguacu": "4107546", + "farol": "4107553", + "faxinal": "4107603", + "fazenda rio grande": "4107652", + "fenix": "4107702", + "fernandes pinheiro": "4107736", + "figueira": "4107751", + "flor da serra do sul": "4107850", + "florai": "4107801", + "floresta": "4107900", + "florestopolis": "4108007", + "florida": "4108106", + "formosa do oeste": "4108205", + "foz do iguacu": "4108304", + "foz do jordao": "4108452", + "francisco alves": "4108320", + "francisco beltrao": "4108403", + "general carneiro": "4108502", + "godoy moreira": "4108551", + "goioere": "4108601", + "goioxim": "4108650", + "grandes rios": "4108700", + "guaira": "4108809", + "guairaca": "4108908", + "guamiranga": "4108957", + "guapirama": "4109005", + "guaporema": "4109104", + "guaraci": "4109203", + "guaraniacu": "4109302", + "guarapuava": "4109401", + "guaraquecaba": "4109500", + "guaratuba": "4109609", + "honorio serpa": "4109658", + "ibaiti": "4109708", + "ibema": "4109757", + "ibipora": "4109807", + "icaraima": "4109906", + "iguaracu": "4110003", + "iguatu": "4110052", + "imbau": "4110078", + "imbituva": "4110102", + "inacio martins": "4110201", + "inaja": "4110300", + "indianopolis": "4110409", + "ipiranga": "4110508", + "ipora": "4110607", + "iracema do oeste": "4110656", + "irati": "4110706", + "iretama": "4110805", + "itaguaje": "4110904", + "itaipulandia": "4110953", + "itambaraca": "4111001", + "itambe": "4111100", + "itapejara d'oeste": "4111209", + "itaperucu": "4111258", + "itauna do sul": "4111308", + "ivai": "4111407", + "ivaipora": "4111506", + "ivate": "4111555", + "ivatuba": "4111605", + "jaboti": "4111704", + "jacarezinho": "4111803", + "jaguapita": "4111902", + "jaguariaiva": "4112009", + "jandaia do sul": "4112108", + "janiopolis": "4112207", + "japira": "4112306", + "japura": "4112405", + "jardim alegre": "4112504", + "jardim olinda": "4112603", + "jataizinho": "4112702", + "jesuitas": "4112751", + "joaquim tavora": "4112801", + "jundiai do sul": "4112900", + "juranda": "4112959", + "jussara": "4113007", + "kalore": "4113106", + "lapa": "4113205", + "laranjal": "4113254", + "laranjeiras do sul": "4113304", + "leopolis": "4113403", + "lidianopolis": "4113429", + "lindoeste": "4113452", + "loanda": "4113502", + "lobato": "4113601", + "londrina": "4113700", + "luiziana": "4113734", + "lunardelli": "4113759", + "lupionopolis": "4113809", + "mallet": "4113908", + "mambore": "4114005", + "mandaguacu": "4114104", + "mandaguari": "4114203", + "mandirituba": "4114302", + "manfrinopolis": "4114351", + "mangueirinha": "4114401", + "manoel ribas": "4114500", + "marechal candido rondon": "4114609", + "maria helena": "4114708", + "marialva": "4114807", + "marilandia do sul": "4114906", + "marilena": "4115002", + "mariluz": "4115101", + "maringa": "4115200", + "mariopolis": "4115309", + "maripa": "4115358", + "marmeleiro": "4115408", + "marquinho": "4115457", + "marumbi": "4115507", + "matelandia": "4115606", + "matinhos": "4115705", + "mato rico": "4115739", + "maua da serra": "4115754", + "medianeira": "4115804", + "mercedes": "4115853", + "mirador": "4115903", + "miraselva": "4116000", + "missal": "4116059", + "moreira sales": "4116109", + "morretes": "4116208", + "munhoz de melo": "4116307", + "nossa senhora das gracas": "4116406", + "nova alianca do ivai": "4116505", + "nova america da colina": "4116604", + "nova aurora": "4116703", + "nova cantu": "4116802", + "nova esperanca": "4116901", + "nova esperanca do sudoeste": "4116950", + "nova fatima": "4117008", + "nova laranjeiras": "4117057", + "nova londrina": "4117107", + "nova olimpia": "4117206", + "nova prata do iguacu": "4117255", + "nova santa barbara": "4117214", + "nova santa rosa": "4117222", + "nova tebas": "4117271", + "novo itacolomi": "4117297", + "ortigueira": "4117305", + "ourizona": "4117404", + "ouro verde do oeste": "4117453", + "paicandu": "4117503", + "palmas": "4117602", + "palmeira": "4117701", + "palmital": "4117800", + "palotina": "4117909", + "paraiso do norte": "4118006", + "paranacity": "4118105", + "paranagua": "4118204", + "paranapoema": "4118303", + "paranavai": "4118402", + "pato bragado": "4118451", + "pato branco": "4118501", + "paula freitas": "4118600", + "paulo frontin": "4118709", + "peabiru": "4118808", + "perobal": "4118857", + "perola": "4118907", + "perola d'oeste": "4119004", + "pien": "4119103", + "pinhais": "4119152", + "pinhal de sao bento": "4119251", + "pinhalao": "4119202", + "pinhao": "4119301", + "pirai do sul": "4119400", + "piraquara": "4119509", + "pitanga": "4119608", + "pitangueiras": "4119657", + "planaltina do parana": "4119707", + "planalto": "4119806", + "ponta grossa": "4119905", + "pontal do parana": "4119954", + "porecatu": "4120002", + "porto amazonas": "4120101", + "porto barreiro": "4120150", + "porto rico": "4120200", + "porto vitoria": "4120309", + "prado ferreira": "4120333", + "pranchita": "4120358", + "presidente castelo branco": "4120408", + "primeiro de maio": "4120507", + "prudentopolis": "4120606", + "quarto centenario": "4120655", + "quatigua": "4120705", + "quatro barras": "4120804", + "quatro pontes": "4120853", + "quedas do iguacu": "4120903", + "querencia do norte": "4121000", + "quinta do sol": "4121109", + "quitandinha": "4121208", + "ramilandia": "4121257", + "rancho alegre": "4121307", + "rancho alegre d'oeste": "4121356", + "realeza": "4121406", + "reboucas": "4121505", + "renascenca": "4121604", + "reserva": "4121703", + "reserva do iguacu": "4121752", + "ribeirao claro": "4121802", + "ribeirao do pinhal": "4121901", + "rio azul": "4122008", + "rio bom": "4122107", + "rio bonito do iguacu": "4122156", + "rio branco do ivai": "4122172", + "rio branco do sul": "4122206", + "rio negro": "4122305", + "rolandia": "4122404", + "roncador": "4122503", + "rondon": "4122602", + "rosario do ivai": "4122651", + "sabaudia": "4122701", + "salgado filho": "4122800", + "salto do itarare": "4122909", + "salto do lontra": "4123006", + "santa amelia": "4123105", + "santa cecilia do pavao": "4123204", + "santa cruz de monte castelo": "4123303", + "santa fe": "4123402", + "santa helena": "4123501", + "santa ines": "4123600", + "santa isabel do ivai": "4123709", + "santa izabel do oeste": "4123808", + "santa lucia": "4123824", + "santa maria do oeste": "4123857", + "santa mariana": "4123907", + "santa monica": "4123956", + "santa tereza do oeste": "4124020", + "santa terezinha de itaipu": "4124053", + "santana do itarare": "4124004", + "santo antonio da platina": "4124103", + "santo antonio do caiua": "4124202", + "santo antonio do paraiso": "4124301", + "santo antonio do sudoeste": "4124400", + "santo inacio": "4124509", + "sao carlos do ivai": "4124608", + "sao jeronimo da serra": "4124707", + "sao joao": "4124806", + "sao joao do caiua": "4124905", + "sao joao do ivai": "4125001", + "sao joao do triunfo": "4125100", + "sao jorge do ivai": "4125308", + "sao jorge do patrocinio": "4125357", + "sao jorge d'oeste": "4125209", + "sao jose da boa vista": "4125407", + "sao jose das palmeiras": "4125456", + "sao jose dos pinhais": "4125506", + "sao manoel do parana": "4125555", + "sao mateus do sul": "4125605", + "sao miguel do iguacu": "4125704", + "sao pedro do iguacu": "4125753", + "sao pedro do ivai": "4125803", + "sao pedro do parana": "4125902", + "sao sebastiao da amoreira": "4126009", + "sao tome": "4126108", + "sapopema": "4126207", + "sarandi": "4126256", + "saudade do iguacu": "4126272", + "senges": "4126306", + "serranopolis do iguacu": "4126355", + "sertaneja": "4126405", + "sertanopolis": "4126504", + "siqueira campos": "4126603", + "sulina": "4126652", + "tamarana": "4126678", + "tamboara": "4126702", + "tapejara": "4126801", + "tapira": "4126900", + "teixeira soares": "4127007", + "telemaco borba": "4127106", + "terra boa": "4127205", + "terra rica": "4127304", + "terra roxa": "4127403", + "tibagi": "4127502", + "tijucas do sul": "4127601", + "toledo": "4127700", + "tomazina": "4127809", + "tres barras do parana": "4127858", + "tunas do parana": "4127882", + "tuneiras do oeste": "4127908", + "tupassi": "4127957", + "turvo": "4127965", + "ubirata": "4128005", + "umuarama": "4128104", + "uniao da vitoria": "4128203", + "uniflor": "4128302", + "urai": "4128401", + "ventania": "4128534", + "vera cruz do oeste": "4128559", + "vere": "4128609", + "virmond": "4128658", + "vitorino": "4128708", + "wenceslau braz": "4128500", + "xambre": "4128807" + }, + "SC": { + "abdon batista": "4200051", + "abelardo luz": "4200101", + "agrolandia": "4200200", + "agronomica": "4200309", + "agua doce": "4200408", + "aguas de chapeco": "4200507", + "aguas frias": "4200556", + "aguas mornas": "4200606", + "alfredo wagner": "4200705", + "alto bela vista": "4200754", + "anchieta": "4200804", + "angelina": "4200903", + "anita garibaldi": "4201000", + "anitapolis": "4201109", + "antonio carlos": "4201208", + "apiuna": "4201257", + "arabuta": "4201273", + "araquari": "4201307", + "ararangua": "4201406", + "armazem": "4201505", + "arroio trinta": "4201604", + "arvoredo": "4201653", + "ascurra": "4201703", + "atalanta": "4201802", + "aurora": "4201901", + "balneario arroio do silva": "4201950", + "balneario barra do sul": "4202057", + "balneario camboriu": "4202008", + "balneario gaivota": "4202073", + "balneario picarras": "4212809", + "balneario rincao": "4220000", + "bandeirante": "4202081", + "barra bonita": "4202099", + "barra velha": "4202107", + "bela vista do toldo": "4202131", + "belmonte": "4202156", + "benedito novo": "4202206", + "biguacu": "4202305", + "blumenau": "4202404", + "bocaina do sul": "4202438", + "bom jardim da serra": "4202503", + "bom jesus": "4202537", + "bom jesus do oeste": "4202578", + "bom retiro": "4202602", + "bombinhas": "4202453", + "botuvera": "4202701", + "braco do norte": "4202800", + "braco do trombudo": "4202859", + "brunopolis": "4202875", + "brusque": "4202909", + "cacador": "4203006", + "caibi": "4203105", + "calmon": "4203154", + "camboriu": "4203204", + "campo alegre": "4203303", + "campo belo do sul": "4203402", + "campo ere": "4203501", + "campos novos": "4203600", + "canelinha": "4203709", + "canoinhas": "4203808", + "capao alto": "4203253", + "capinzal": "4203907", + "capivari de baixo": "4203956", + "catanduvas": "4204004", + "caxambu do sul": "4204103", + "celso ramos": "4204152", + "cerro negro": "4204178", + "chapadao do lageado": "4204194", + "chapeco": "4204202", + "cocal do sul": "4204251", + "concordia": "4204301", + "cordilheira alta": "4204350", + "coronel freitas": "4204400", + "coronel martins": "4204459", + "correia pinto": "4204558", + "corupa": "4204509", + "criciuma": "4204608", + "cunha pora": "4204707", + "cunhatai": "4204756", + "curitibanos": "4204806", + "descanso": "4204905", + "dionisio cerqueira": "4205001", + "dona emma": "4205100", + "doutor pedrinho": "4205159", + "entre rios": "4205175", + "ermo": "4205191", + "erval velho": "4205209", + "faxinal dos guedes": "4205308", + "flor do sertao": "4205357", + "florianopolis": "4205407", + "formosa do sul": "4205431", + "forquilhinha": "4205456", + "fraiburgo": "4205506", + "frei rogerio": "4205555", + "galvao": "4205605", + "garopaba": "4205704", + "garuva": "4205803", + "gaspar": "4205902", + "governador celso ramos": "4206009", + "grao-para": "4206108", + "gravatal": "4206207", + "guabiruba": "4206306", + "guaraciaba": "4206405", + "guaramirim": "4206504", + "guaruja do sul": "4206603", + "guatambu": "4206652", + "herval d'oeste": "4206702", + "ibiam": "4206751", + "ibicare": "4206801", + "ibirama": "4206900", + "icara": "4207007", + "ilhota": "4207106", + "imarui": "4207205", + "imbituba": "4207304", + "imbuia": "4207403", + "indaial": "4207502", + "iomere": "4207577", + "ipira": "4207601", + "ipora do oeste": "4207650", + "ipuacu": "4207684", + "ipumirim": "4207700", + "iraceminha": "4207759", + "irani": "4207809", + "irati": "4207858", + "irineopolis": "4207908", + "ita": "4208005", + "itaiopolis": "4208104", + "itajai": "4208203", + "itapema": "4208302", + "itapiranga": "4208401", + "itapoa": "4208450", + "ituporanga": "4208500", + "jabora": "4208609", + "jacinto machado": "4208708", + "jaguaruna": "4208807", + "jaragua do sul": "4208906", + "jardinopolis": "4208955", + "joacaba": "4209003", + "joinville": "4209102", + "jose boiteux": "4209151", + "jupia": "4209177", + "lacerdopolis": "4209201", + "lages": "4209300", + "laguna": "4209409", + "lajeado grande": "4209458", + "laurentino": "4209508", + "lauro muller": "4209607", + "lebon regis": "4209706", + "leoberto leal": "4209805", + "lindoia do sul": "4209854", + "lontras": "4209904", + "luiz alves": "4210001", + "luzerna": "4210035", + "macieira": "4210050", + "mafra": "4210100", + "major gercino": "4210209", + "major vieira": "4210308", + "maracaja": "4210407", + "maravilha": "4210506", + "marema": "4210555", + "massaranduba": "4210605", + "matos costa": "4210704", + "meleiro": "4210803", + "mirim doce": "4210852", + "modelo": "4210902", + "mondai": "4211009", + "monte carlo": "4211058", + "monte castelo": "4211108", + "morro da fumaca": "4211207", + "morro grande": "4211256", + "navegantes": "4211306", + "nova erechim": "4211405", + "nova itaberaba": "4211454", + "nova trento": "4211504", + "nova veneza": "4211603", + "novo horizonte": "4211652", + "orleans": "4211702", + "otacilio costa": "4211751", + "ouro": "4211801", + "ouro verde": "4211850", + "paial": "4211876", + "painel": "4211892", + "palhoca": "4211900", + "palma sola": "4212007", + "palmeira": "4212056", + "palmitos": "4212106", + "papanduva": "4212205", + "paraiso": "4212239", + "passo de torres": "4212254", + "passos maia": "4212270", + "paulo lopes": "4212304", + "pedras grandes": "4212403", + "penha": "4212502", + "peritiba": "4212601", + "pescaria brava": "4212650", + "petrolandia": "4212700", + "pinhalzinho": "4212908", + "pinheiro preto": "4213005", + "piratuba": "4213104", + "planalto alegre": "4213153", + "pomerode": "4213203", + "ponte alta": "4213302", + "ponte alta do norte": "4213351", + "ponte serrada": "4213401", + "porto belo": "4213500", + "porto uniao": "4213609", + "pouso redondo": "4213708", + "praia grande": "4213807", + "presidente castello branco": "4213906", + "presidente getulio": "4214003", + "presidente nereu": "4214102", + "princesa": "4214151", + "quilombo": "4214201", + "rancho queimado": "4214300", + "rio das antas": "4214409", + "rio do campo": "4214508", + "rio do oeste": "4214607", + "rio do sul": "4214805", + "rio dos cedros": "4214706", + "rio fortuna": "4214904", + "rio negrinho": "4215000", + "rio rufino": "4215059", + "riqueza": "4215075", + "rodeio": "4215109", + "romelandia": "4215208", + "salete": "4215307", + "saltinho": "4215356", + "salto veloso": "4215406", + "sangao": "4215455", + "santa cecilia": "4215505", + "santa helena": "4215554", + "santa rosa de lima": "4215604", + "santa rosa do sul": "4215653", + "santa terezinha": "4215679", + "santa terezinha do progresso": "4215687", + "santiago do sul": "4215695", + "santo amaro da imperatriz": "4215703", + "sao bento do sul": "4215802", + "sao bernardino": "4215752", + "sao bonifacio": "4215901", + "sao carlos": "4216008", + "sao cristovao do sul": "4216057", + "sao domingos": "4216107", + "sao francisco do sul": "4216206", + "sao joao batista": "4216305", + "sao joao do itaperiu": "4216354", + "sao joao do oeste": "4216255", + "sao joao do sul": "4216404", + "sao joaquim": "4216503", + "sao jose": "4216602", + "sao jose do cedro": "4216701", + "sao jose do cerrito": "4216800", + "sao lourenco do oeste": "4216909", + "sao ludgero": "4217006", + "sao martinho": "4217105", + "sao miguel da boa vista": "4217154", + "sao miguel do oeste": "4217204", + "sao pedro de alcantara": "4217253", + "saudades": "4217303", + "schroeder": "4217402", + "seara": "4217501", + "serra alta": "4217550", + "sideropolis": "4217600", + "sombrio": "4217709", + "sul brasil": "4217758", + "taio": "4217808", + "tangara": "4217907", + "tigrinhos": "4217956", + "tijucas": "4218004", + "timbe do sul": "4218103", + "timbo": "4218202", + "timbo grande": "4218251", + "tres barras": "4218301", + "treviso": "4218350", + "treze de maio": "4218400", + "treze tilias": "4218509", + "trombudo central": "4218608", + "tubarao": "4218707", + "tunapolis": "4218756", + "turvo": "4218806", + "uniao do oeste": "4218855", + "urubici": "4218905", + "urupema": "4218954", + "urussanga": "4219002", + "vargeao": "4219101", + "vargem": "4219150", + "vargem bonita": "4219176", + "vidal ramos": "4219200", + "videira": "4219309", + "vitor meireles": "4219358", + "witmarsum": "4219408", + "xanxere": "4219507", + "xavantina": "4219606", + "xaxim": "4219705", + "zortea": "4219853" + }, + "RS": { + "acegua": "4300034", + "agua santa": "4300059", + "agudo": "4300109", + "ajuricaba": "4300208", + "alecrim": "4300307", + "alegrete": "4300406", + "alegria": "4300455", + "almirante tamandare do sul": "4300471", + "alpestre": "4300505", + "alto alegre": "4300554", + "alto feliz": "4300570", + "alvorada": "4300604", + "amaral ferrador": "4300638", + "ametista do sul": "4300646", + "andre da rocha": "4300661", + "anta gorda": "4300703", + "antonio prado": "4300802", + "arambare": "4300851", + "ararica": "4300877", + "aratiba": "4300901", + "arroio do meio": "4301008", + "arroio do padre": "4301073", + "arroio do sal": "4301057", + "arroio do tigre": "4301206", + "arroio dos ratos": "4301107", + "arroio grande": "4301305", + "arvorezinha": "4301404", + "augusto pestana": "4301503", + "aurea": "4301552", + "bage": "4301602", + "balneario pinhal": "4301636", + "barao": "4301651", + "barao de cotegipe": "4301701", + "barao do triunfo": "4301750", + "barra do guarita": "4301859", + "barra do quarai": "4301875", + "barra do ribeiro": "4301909", + "barra do rio azul": "4301925", + "barra funda": "4301958", + "barracao": "4301800", + "barros cassal": "4302006", + "benjamin constant do sul": "4302055", + "bento goncalves": "4302105", + "boa vista das missoes": "4302154", + "boa vista do burica": "4302204", + "boa vista do cadeado": "4302220", + "boa vista do incra": "4302238", + "boa vista do sul": "4302253", + "bom jesus": "4302303", + "bom principio": "4302352", + "bom progresso": "4302378", + "bom retiro do sul": "4302402", + "boqueirao do leao": "4302451", + "bossoroca": "4302501", + "bozano": "4302584", + "braga": "4302600", + "brochier": "4302659", + "butia": "4302709", + "cacapava do sul": "4302808", + "cacequi": "4302907", + "cachoeira do sul": "4303004", + "cachoeirinha": "4303103", + "cacique doble": "4303202", + "caibate": "4303301", + "caicara": "4303400", + "camaqua": "4303509", + "camargo": "4303558", + "cambara do sul": "4303608", + "campestre da serra": "4303673", + "campina das missoes": "4303707", + "campinas do sul": "4303806", + "campo bom": "4303905", + "campo novo": "4304002", + "campos borges": "4304101", + "candelaria": "4304200", + "candido godoi": "4304309", + "candiota": "4304358", + "canela": "4304408", + "cangucu": "4304507", + "canoas": "4304606", + "canudos do vale": "4304614", + "capao bonito do sul": "4304622", + "capao da canoa": "4304630", + "capao do cipo": "4304655", + "capao do leao": "4304663", + "capela de santana": "4304689", + "capitao": "4304697", + "capivari do sul": "4304671", + "caraa": "4304713", + "carazinho": "4304705", + "carlos barbosa": "4304804", + "carlos gomes": "4304853", + "casca": "4304903", + "caseiros": "4304952", + "catuipe": "4305009", + "caxias do sul": "4305108", + "centenario": "4305116", + "cerrito": "4305124", + "cerro branco": "4305132", + "cerro grande": "4305157", + "cerro grande do sul": "4305173", + "cerro largo": "4305207", + "chapada": "4305306", + "charqueadas": "4305355", + "charrua": "4305371", + "chiapetta": "4305405", + "chui": "4305439", + "chuvisca": "4305447", + "cidreira": "4305454", + "ciriaco": "4305504", + "colinas": "4305587", + "colorado": "4305603", + "condor": "4305702", + "constantina": "4305801", + "coqueiro baixo": "4305835", + "coqueiros do sul": "4305850", + "coronel barros": "4305871", + "coronel bicaco": "4305900", + "coronel pilar": "4305934", + "cotipora": "4305959", + "coxilha": "4305975", + "crissiumal": "4306007", + "cristal": "4306056", + "cristal do sul": "4306072", + "cruz alta": "4306106", + "cruzaltense": "4306130", + "cruzeiro do sul": "4306205", + "david canabarro": "4306304", + "derrubadas": "4306320", + "dezesseis de novembro": "4306353", + "dilermando de aguiar": "4306379", + "dois irmaos": "4306403", + "dois irmaos das missoes": "4306429", + "dois lajeados": "4306452", + "dom feliciano": "4306502", + "dom pedrito": "4306601", + "dom pedro de alcantara": "4306551", + "dona francisca": "4306700", + "doutor mauricio cardoso": "4306734", + "doutor ricardo": "4306759", + "eldorado do sul": "4306767", + "encantado": "4306809", + "encruzilhada do sul": "4306908", + "engenho velho": "4306924", + "entre rios do sul": "4306957", + "entre-ijuis": "4306932", + "erebango": "4306973", + "erechim": "4307005", + "ernestina": "4307054", + "erval grande": "4307203", + "erval seco": "4307302", + "esmeralda": "4307401", + "esperanca do sul": "4307450", + "espumoso": "4307500", + "estacao": "4307559", + "estancia velha": "4307609", + "esteio": "4307708", + "estrela": "4307807", + "estrela velha": "4307815", + "eugenio de castro": "4307831", + "fagundes varela": "4307864", + "farroupilha": "4307906", + "faxinal do soturno": "4308003", + "faxinalzinho": "4308052", + "fazenda vilanova": "4308078", + "feliz": "4308102", + "flores da cunha": "4308201", + "floriano peixoto": "4308250", + "fontoura xavier": "4308300", + "formigueiro": "4308409", + "forquetinha": "4308433", + "fortaleza dos valos": "4308458", + "frederico westphalen": "4308508", + "garibaldi": "4308607", + "garruchos": "4308656", + "gaurama": "4308706", + "general camara": "4308805", + "gentil": "4308854", + "getulio vargas": "4308904", + "girua": "4309001", + "glorinha": "4309050", + "gramado": "4309100", + "gramado dos loureiros": "4309126", + "gramado xavier": "4309159", + "gravatai": "4309209", + "guabiju": "4309258", + "guaiba": "4309308", + "guapore": "4309407", + "guarani das missoes": "4309506", + "harmonia": "4309555", + "herval": "4307104", + "herveiras": "4309571", + "horizontina": "4309605", + "hulha negra": "4309654", + "humaita": "4309704", + "ibarama": "4309753", + "ibiaca": "4309803", + "ibiraiaras": "4309902", + "ibirapuita": "4309951", + "ibiruba": "4310009", + "igrejinha": "4310108", + "ijui": "4310207", + "ilopolis": "4310306", + "imbe": "4310330", + "imigrante": "4310363", + "independencia": "4310405", + "inhacora": "4310413", + "ipe": "4310439", + "ipiranga do sul": "4310462", + "irai": "4310504", + "itaara": "4310538", + "itacurubi": "4310553", + "itapuca": "4310579", + "itaqui": "4310603", + "itati": "4310652", + "itatiba do sul": "4310702", + "ivora": "4310751", + "ivoti": "4310801", + "jaboticaba": "4310850", + "jacuizinho": "4310876", + "jacutinga": "4310900", + "jaguarao": "4311007", + "jaguari": "4311106", + "jaquirana": "4311122", + "jari": "4311130", + "joia": "4311155", + "julio de castilhos": "4311205", + "lagoa bonita do sul": "4311239", + "lagoa dos tres cantos": "4311270", + "lagoa vermelha": "4311304", + "lagoao": "4311254", + "lajeado": "4311403", + "lajeado do bugre": "4311429", + "lavras do sul": "4311502", + "liberato salzano": "4311601", + "lindolfo collor": "4311627", + "linha nova": "4311643", + "macambara": "4311718", + "machadinho": "4311700", + "mampituba": "4311734", + "manoel viana": "4311759", + "maquine": "4311775", + "marata": "4311791", + "marau": "4311809", + "marcelino ramos": "4311908", + "mariana pimentel": "4311981", + "mariano moro": "4312005", + "marques de souza": "4312054", + "mata": "4312104", + "mato castelhano": "4312138", + "mato leitao": "4312153", + "mato queimado": "4312179", + "maximiliano de almeida": "4312203", + "minas do leao": "4312252", + "miraguai": "4312302", + "montauri": "4312351", + "monte alegre dos campos": "4312377", + "monte belo do sul": "4312385", + "montenegro": "4312401", + "mormaco": "4312427", + "morrinhos do sul": "4312443", + "morro redondo": "4312450", + "morro reuter": "4312476", + "mostardas": "4312500", + "mucum": "4312609", + "muitos capoes": "4312617", + "muliterno": "4312625", + "nao-me-toque": "4312658", + "nicolau vergueiro": "4312674", + "nonoai": "4312708", + "nova alvorada": "4312757", + "nova araca": "4312807", + "nova bassano": "4312906", + "nova boa vista": "4312955", + "nova brescia": "4313003", + "nova candelaria": "4313011", + "nova esperanca do sul": "4313037", + "nova hartz": "4313060", + "nova padua": "4313086", + "nova palma": "4313102", + "nova petropolis": "4313201", + "nova prata": "4313300", + "nova ramada": "4313334", + "nova roma do sul": "4313359", + "nova santa rita": "4313375", + "novo barreiro": "4313490", + "novo cabrais": "4313391", + "novo hamburgo": "4313409", + "novo machado": "4313425", + "novo tiradentes": "4313441", + "novo xingu": "4313466", + "osorio": "4313508", + "paim filho": "4313607", + "palmares do sul": "4313656", + "palmeira das missoes": "4313706", + "palmitinho": "4313805", + "panambi": "4313904", + "pantano grande": "4313953", + "parai": "4314001", + "paraiso do sul": "4314027", + "pareci novo": "4314035", + "parobe": "4314050", + "passa sete": "4314068", + "passo do sobrado": "4314076", + "passo fundo": "4314100", + "paulo bento": "4314134", + "paverama": "4314159", + "pedras altas": "4314175", + "pedro osorio": "4314209", + "pejucara": "4314308", + "pelotas": "4314407", + "picada cafe": "4314423", + "pinhal": "4314456", + "pinhal da serra": "4314464", + "pinhal grande": "4314472", + "pinheirinho do vale": "4314498", + "pinheiro machado": "4314506", + "pinto bandeira": "4314548", + "pirapo": "4314555", + "piratini": "4314605", + "planalto": "4314704", + "poco das antas": "4314753", + "pontao": "4314779", + "ponte preta": "4314787", + "portao": "4314803", + "porto alegre": "4314902", + "porto lucena": "4315008", + "porto maua": "4315057", + "porto vera cruz": "4315073", + "porto xavier": "4315107", + "pouso novo": "4315131", + "presidente lucena": "4315149", + "progresso": "4315156", + "protasio alves": "4315172", + "putinga": "4315206", + "quarai": "4315305", + "quatro irmaos": "4315313", + "quevedos": "4315321", + "quinze de novembro": "4315354", + "redentora": "4315404", + "relvado": "4315453", + "restinga seca": "4315503", + "rio dos indios": "4315552", + "rio grande": "4315602", + "rio pardo": "4315701", + "riozinho": "4315750", + "roca sales": "4315800", + "rodeio bonito": "4315909", + "rolador": "4315958", + "rolante": "4316006", + "ronda alta": "4316105", + "rondinha": "4316204", + "roque gonzales": "4316303", + "rosario do sul": "4316402", + "sagrada familia": "4316428", + "saldanha marinho": "4316436", + "salto do jacui": "4316451", + "salvador das missoes": "4316477", + "salvador do sul": "4316501", + "sananduva": "4316600", + "santa barbara do sul": "4316709", + "santa cecilia do sul": "4316733", + "santa clara do sul": "4316758", + "santa cruz do sul": "4316808", + "santa margarida do sul": "4316972", + "santa maria": "4316907", + "santa maria do herval": "4316956", + "santa rosa": "4317202", + "santa tereza": "4317251", + "santa vitoria do palmar": "4317301", + "santana da boa vista": "4317004", + "sant'ana do livramento": "4317103", + "santiago": "4317400", + "santo angelo": "4317509", + "santo antonio da patrulha": "4317608", + "santo antonio das missoes": "4317707", + "santo antonio do palma": "4317558", + "santo antonio do planalto": "4317756", + "santo augusto": "4317806", + "santo cristo": "4317905", + "santo expedito do sul": "4317954", + "sao borja": "4318002", + "sao domingos do sul": "4318051", + "sao francisco de assis": "4318101", + "sao francisco de paula": "4318200", + "sao gabriel": "4318309", + "sao jeronimo": "4318408", + "sao joao da urtiga": "4318424", + "sao joao do polesine": "4318432", + "sao jorge": "4318440", + "sao jose das missoes": "4318457", + "sao jose do herval": "4318465", + "sao jose do hortencio": "4318481", + "sao jose do inhacora": "4318499", + "sao jose do norte": "4318507", + "sao jose do ouro": "4318606", + "sao jose do sul": "4318614", + "sao jose dos ausentes": "4318622", + "sao leopoldo": "4318705", + "sao lourenco do sul": "4318804", + "sao luiz gonzaga": "4318903", + "sao marcos": "4319000", + "sao martinho": "4319109", + "sao martinho da serra": "4319125", + "sao miguel das missoes": "4319158", + "sao nicolau": "4319208", + "sao paulo das missoes": "4319307", + "sao pedro da serra": "4319356", + "sao pedro das missoes": "4319364", + "sao pedro do butia": "4319372", + "sao pedro do sul": "4319406", + "sao sebastiao do cai": "4319505", + "sao sepe": "4319604", + "sao valentim": "4319703", + "sao valentim do sul": "4319711", + "sao valerio do sul": "4319737", + "sao vendelino": "4319752", + "sao vicente do sul": "4319802", + "sapiranga": "4319901", + "sapucaia do sul": "4320008", + "sarandi": "4320107", + "seberi": "4320206", + "sede nova": "4320230", + "segredo": "4320263", + "selbach": "4320305", + "senador salgado filho": "4320321", + "sentinela do sul": "4320354", + "serafina correa": "4320404", + "serio": "4320453", + "sertao": "4320503", + "sertao santana": "4320552", + "sete de setembro": "4320578", + "severiano de almeida": "4320602", + "silveira martins": "4320651", + "sinimbu": "4320677", + "sobradinho": "4320701", + "soledade": "4320800", + "tabai": "4320859", + "tapejara": "4320909", + "tapera": "4321006", + "tapes": "4321105", + "taquara": "4321204", + "taquari": "4321303", + "taquarucu do sul": "4321329", + "tavares": "4321352", + "tenente portela": "4321402", + "terra de areia": "4321436", + "teutonia": "4321451", + "tio hugo": "4321469", + "tiradentes do sul": "4321477", + "toropi": "4321493", + "torres": "4321501", + "tramandai": "4321600", + "travesseiro": "4321626", + "tres arroios": "4321634", + "tres cachoeiras": "4321667", + "tres coroas": "4321709", + "tres de maio": "4321808", + "tres forquilhas": "4321832", + "tres palmeiras": "4321857", + "tres passos": "4321907", + "trindade do sul": "4321956", + "triunfo": "4322004", + "tucunduva": "4322103", + "tunas": "4322152", + "tupanci do sul": "4322186", + "tupancireta": "4322202", + "tupandi": "4322251", + "tuparendi": "4322301", + "turucu": "4322327", + "ubiretama": "4322343", + "uniao da serra": "4322350", + "unistalda": "4322376", + "uruguaiana": "4322400", + "vacaria": "4322509", + "vale do sol": "4322533", + "vale real": "4322541", + "vale verde": "4322525", + "vanini": "4322558", + "venancio aires": "4322608", + "vera cruz": "4322707", + "veranopolis": "4322806", + "vespasiano correa": "4322855", + "viadutos": "4322905", + "viamao": "4323002", + "vicente dutra": "4323101", + "victor graeff": "4323200", + "vila flores": "4323309", + "vila langaro": "4323358", + "vila maria": "4323408", + "vila nova do sul": "4323457", + "vista alegre": "4323507", + "vista alegre do prata": "4323606", + "vista gaucha": "4323705", + "vitoria das missoes": "4323754", + "westfalia": "4323770", + "xangri-la": "4323804" + }, + "MS": { + "agua clara": "5000203", + "alcinopolis": "5000252", + "amambai": "5000609", + "anastacio": "5000708", + "anaurilandia": "5000807", + "angelica": "5000856", + "antonio joao": "5000906", + "aparecida do taboado": "5001003", + "aquidauana": "5001102", + "aral moreira": "5001243", + "bandeirantes": "5001508", + "bataguassu": "5001904", + "bataypora": "5002001", + "bela vista": "5002100", + "bodoquena": "5002159", + "bonito": "5002209", + "brasilandia": "5002308", + "caarapo": "5002407", + "camapua": "5002605", + "campo grande": "5002704", + "caracol": "5002803", + "cassilandia": "5002902", + "chapadao do sul": "5002951", + "corguinho": "5003108", + "coronel sapucaia": "5003157", + "corumba": "5003207", + "costa rica": "5003256", + "coxim": "5003306", + "deodapolis": "5003454", + "dois irmaos do buriti": "5003488", + "douradina": "5003504", + "dourados": "5003702", + "eldorado": "5003751", + "fatima do sul": "5003801", + "figueirao": "5003900", + "gloria de dourados": "5004007", + "guia lopes da laguna": "5004106", + "iguatemi": "5004304", + "inocencia": "5004403", + "itapora": "5004502", + "itaquirai": "5004601", + "ivinhema": "5004700", + "japora": "5004809", + "jaraguari": "5004908", + "jardim": "5005004", + "jatei": "5005103", + "juti": "5005152", + "ladario": "5005202", + "laguna carapa": "5005251", + "maracaju": "5005400", + "miranda": "5005608", + "mundo novo": "5005681", + "navirai": "5005707", + "nioaque": "5005806", + "nova alvorada do sul": "5006002", + "nova andradina": "5006200", + "novo horizonte do sul": "5006259", + "paraiso das aguas": "5006275", + "paranaiba": "5006309", + "paranhos": "5006358", + "pedro gomes": "5006408", + "ponta pora": "5006606", + "porto murtinho": "5006903", + "ribas do rio pardo": "5007109", + "rio brilhante": "5007208", + "rio negro": "5007307", + "rio verde de mato grosso": "5007406", + "rochedo": "5007505", + "santa rita do pardo": "5007554", + "sao gabriel do oeste": "5007695", + "selviria": "5007802", + "sete quedas": "5007703", + "sidrolandia": "5007901", + "sonora": "5007935", + "tacuru": "5007950", + "taquarussu": "5007976", + "terenos": "5008008", + "tres lagoas": "5008305", + "vicentina": "5008404" + }, + "MT": { + "acorizal": "5100102", + "agua boa": "5100201", + "alta floresta": "5100250", + "alto araguaia": "5100300", + "alto boa vista": "5100359", + "alto garcas": "5100409", + "alto paraguai": "5100508", + "alto taquari": "5100607", + "apiacas": "5100805", + "araguaiana": "5101001", + "araguainha": "5101209", + "araputanga": "5101258", + "arenapolis": "5101308", + "aripuana": "5101407", + "barao de melgaco": "5101605", + "barra do bugres": "5101704", + "barra do garcas": "5101803", + "bom jesus do araguaia": "5101852", + "brasnorte": "5101902", + "caceres": "5102504", + "campinapolis": "5102603", + "campo novo do parecis": "5102637", + "campo verde": "5102678", + "campos de julio": "5102686", + "canabrava do norte": "5102694", + "canarana": "5102702", + "carlinda": "5102793", + "castanheira": "5102850", + "chapada dos guimaraes": "5103007", + "claudia": "5103056", + "cocalinho": "5103106", + "colider": "5103205", + "colniza": "5103254", + "comodoro": "5103304", + "confresa": "5103353", + "conquista d'oeste": "5103361", + "cotriguacu": "5103379", + "cuiaba": "5103403", + "curvelandia": "5103437", + "denise": "5103452", + "diamantino": "5103502", + "dom aquino": "5103601", + "feliz natal": "5103700", + "figueiropolis d'oeste": "5103809", + "gaucha do norte": "5103858", + "general carneiro": "5103908", + "gloria d'oeste": "5103957", + "guaranta do norte": "5104104", + "guiratinga": "5104203", + "indiavai": "5104500", + "ipiranga do norte": "5104526", + "itanhanga": "5104542", + "itauba": "5104559", + "itiquira": "5104609", + "jaciara": "5104807", + "jangada": "5104906", + "jauru": "5105002", + "juara": "5105101", + "juina": "5105150", + "juruena": "5105176", + "juscimeira": "5105200", + "lambari d'oeste": "5105234", + "lucas do rio verde": "5105259", + "luciara": "5105309", + "marcelandia": "5105580", + "matupa": "5105606", + "mirassol d'oeste": "5105622", + "nobres": "5105903", + "nortelandia": "5106000", + "nossa senhora do livramento": "5106109", + "nova bandeirantes": "5106158", + "nova brasilandia": "5106208", + "nova canaa do norte": "5106216", + "nova guarita": "5108808", + "nova lacerda": "5106182", + "nova marilandia": "5108857", + "nova maringa": "5108907", + "nova monte verde": "5108956", + "nova mutum": "5106224", + "nova nazare": "5106174", + "nova olimpia": "5106232", + "nova santa helena": "5106190", + "nova ubirata": "5106240", + "nova xavantina": "5106257", + "novo horizonte do norte": "5106273", + "novo mundo": "5106265", + "novo santo antonio": "5106315", + "novo sao joaquim": "5106281", + "paranaita": "5106299", + "paranatinga": "5106307", + "pedra preta": "5106372", + "peixoto de azevedo": "5106422", + "planalto da serra": "5106455", + "pocone": "5106505", + "pontal do araguaia": "5106653", + "ponte branca": "5106703", + "pontes e lacerda": "5106752", + "porto alegre do norte": "5106778", + "porto dos gauchos": "5106802", + "porto esperidiao": "5106828", + "porto estrela": "5106851", + "poxoreu": "5107008", + "primavera do leste": "5107040", + "querencia": "5107065", + "reserva do cabacal": "5107156", + "ribeirao cascalheira": "5107180", + "ribeiraozinho": "5107198", + "rio branco": "5107206", + "rondolandia": "5107578", + "rondonopolis": "5107602", + "rosario oeste": "5107701", + "salto do ceu": "5107750", + "santa carmem": "5107248", + "santa cruz do xingu": "5107743", + "santa rita do trivelato": "5107768", + "santa terezinha": "5107776", + "santo afonso": "5107263", + "santo antonio de leverger": "5107800", + "santo antonio do leste": "5107792", + "sao felix do araguaia": "5107859", + "sao jose do povo": "5107297", + "sao jose do rio claro": "5107305", + "sao jose do xingu": "5107354", + "sao jose dos quatro marcos": "5107107", + "sao pedro da cipa": "5107404", + "sapezal": "5107875", + "serra nova dourada": "5107883", + "sinop": "5107909", + "sorriso": "5107925", + "tabapora": "5107941", + "tangara da serra": "5107958", + "tapurah": "5108006", + "terra nova do norte": "5108055", + "tesouro": "5108105", + "torixoreu": "5108204", + "uniao do sul": "5108303", + "vale de sao domingos": "5108352", + "varzea grande": "5108402", + "vera": "5108501", + "vila bela da santissima trindade": "5105507", + "vila rica": "5108600" + }, + "GO": { + "abadia de goias": "5200050", + "abadiania": "5200100", + "acreuna": "5200134", + "adelandia": "5200159", + "agua fria de goias": "5200175", + "agua limpa": "5200209", + "aguas lindas de goias": "5200258", + "alexania": "5200308", + "aloandia": "5200506", + "alto horizonte": "5200555", + "alto paraiso de goias": "5200605", + "alvorada do norte": "5200803", + "amaralina": "5200829", + "americano do brasil": "5200852", + "amorinopolis": "5200902", + "anapolis": "5201108", + "anhanguera": "5201207", + "anicuns": "5201306", + "aparecida de goiania": "5201405", + "aparecida do rio doce": "5201454", + "apore": "5201504", + "aracu": "5201603", + "aragarcas": "5201702", + "aragoiania": "5201801", + "araguapaz": "5202155", + "arenopolis": "5202353", + "aruana": "5202502", + "aurilandia": "5202601", + "avelinopolis": "5202809", + "baliza": "5203104", + "barro alto": "5203203", + "bela vista de goias": "5203302", + "bom jardim de goias": "5203401", + "bom jesus de goias": "5203500", + "bonfinopolis": "5203559", + "bonopolis": "5203575", + "brazabrantes": "5203609", + "britania": "5203807", + "buriti alegre": "5203906", + "buriti de goias": "5203939", + "buritinopolis": "5203962", + "cabeceiras": "5204003", + "cachoeira alta": "5204102", + "cachoeira de goias": "5204201", + "cachoeira dourada": "5204250", + "cacu": "5204300", + "caiaponia": "5204409", + "caldas novas": "5204508", + "caldazinha": "5204557", + "campestre de goias": "5204607", + "campinacu": "5204656", + "campinorte": "5204706", + "campo alegre de goias": "5204805", + "campo limpo de goias": "5204854", + "campos belos": "5204904", + "campos verdes": "5204953", + "carmo do rio verde": "5205000", + "castelandia": "5205059", + "catalao": "5205109", + "caturai": "5205208", + "cavalcante": "5205307", + "ceres": "5205406", + "cezarina": "5205455", + "chapadao do ceu": "5205471", + "cidade ocidental": "5205497", + "cocalzinho de goias": "5205513", + "colinas do sul": "5205521", + "corrego do ouro": "5205703", + "corumba de goias": "5205802", + "corumbaiba": "5205901", + "cristalina": "5206206", + "cristianopolis": "5206305", + "crixas": "5206404", + "crominia": "5206503", + "cumari": "5206602", + "damianopolis": "5206701", + "damolandia": "5206800", + "davinopolis": "5206909", + "diorama": "5207105", + "divinopolis de goias": "5208301", + "doverlandia": "5207253", + "edealina": "5207352", + "edeia": "5207402", + "estrela do norte": "5207501", + "faina": "5207535", + "fazenda nova": "5207600", + "firminopolis": "5207808", + "flores de goias": "5207907", + "formosa": "5208004", + "formoso": "5208103", + "gameleira de goias": "5208152", + "goianapolis": "5208400", + "goiandira": "5208509", + "goianesia": "5208608", + "goiania": "5208707", + "goianira": "5208806", + "goias": "5208905", + "goiatuba": "5209101", + "gouvelandia": "5209150", + "guapo": "5209200", + "guaraita": "5209291", + "guarani de goias": "5209408", + "guarinos": "5209457", + "heitorai": "5209606", + "hidrolandia": "5209705", + "hidrolina": "5209804", + "iaciara": "5209903", + "inaciolandia": "5209937", + "indiara": "5209952", + "inhumas": "5210000", + "ipameri": "5210109", + "ipiranga de goias": "5210158", + "ipora": "5210208", + "israelandia": "5210307", + "itaberai": "5210406", + "itaguari": "5210562", + "itaguaru": "5210604", + "itaja": "5210802", + "itapaci": "5210901", + "itapirapua": "5211008", + "itapuranga": "5211206", + "itaruma": "5211305", + "itaucu": "5211404", + "itumbiara": "5211503", + "ivolandia": "5211602", + "jandaia": "5211701", + "jaragua": "5211800", + "jatai": "5211909", + "jaupaci": "5212006", + "jesupolis": "5212055", + "joviania": "5212105", + "jussara": "5212204", + "lagoa santa": "5212253", + "leopoldo de bulhoes": "5212303", + "luziania": "5212501", + "mairipotaba": "5212600", + "mambai": "5212709", + "mara rosa": "5212808", + "marzagao": "5212907", + "matrincha": "5212956", + "maurilandia": "5213004", + "mimoso de goias": "5213053", + "minacu": "5213087", + "mineiros": "5213103", + "moipora": "5213400", + "monte alegre de goias": "5213509", + "montes claros de goias": "5213707", + "montividiu": "5213756", + "montividiu do norte": "5213772", + "morrinhos": "5213806", + "morro agudo de goias": "5213855", + "mossamedes": "5213905", + "mozarlandia": "5214002", + "mundo novo": "5214051", + "mutunopolis": "5214101", + "nazario": "5214408", + "neropolis": "5214507", + "niquelandia": "5214606", + "nova america": "5214705", + "nova aurora": "5214804", + "nova crixas": "5214838", + "nova gloria": "5214861", + "nova iguacu de goias": "5214879", + "nova roma": "5214903", + "nova veneza": "5215009", + "novo brasil": "5215207", + "novo gama": "5215231", + "novo planalto": "5215256", + "orizona": "5215306", + "ouro verde de goias": "5215405", + "ouvidor": "5215504", + "padre bernardo": "5215603", + "palestina de goias": "5215652", + "palmeiras de goias": "5215702", + "palmelo": "5215801", + "palminopolis": "5215900", + "panama": "5216007", + "paranaiguara": "5216304", + "parauna": "5216403", + "perolandia": "5216452", + "petrolina de goias": "5216809", + "pilar de goias": "5216908", + "piracanjuba": "5217104", + "piranhas": "5217203", + "pirenopolis": "5217302", + "pires do rio": "5217401", + "planaltina": "5217609", + "pontalina": "5217708", + "porangatu": "5218003", + "porteirao": "5218052", + "portelandia": "5218102", + "posse": "5218300", + "professor jamil": "5218391", + "quirinopolis": "5218508", + "rialma": "5218607", + "rianapolis": "5218706", + "rio quente": "5218789", + "rio verde": "5218805", + "rubiataba": "5218904", + "sanclerlandia": "5219001", + "santa barbara de goias": "5219100", + "santa cruz de goias": "5219209", + "santa fe de goias": "5219258", + "santa helena de goias": "5219308", + "santa isabel": "5219357", + "santa rita do araguaia": "5219407", + "santa rita do novo destino": "5219456", + "santa rosa de goias": "5219506", + "santa tereza de goias": "5219605", + "santa terezinha de goias": "5219704", + "santo antonio da barra": "5219712", + "santo antonio de goias": "5219738", + "santo antonio do descoberto": "5219753", + "sao domingos": "5219803", + "sao francisco de goias": "5219902", + "sao joao da parauna": "5220058", + "sao joao d'alianca": "5220009", + "sao luis de montes belos": "5220108", + "sao luiz do norte": "5220157", + "sao miguel do araguaia": "5220207", + "sao miguel do passa quatro": "5220264", + "sao patricio": "5220280", + "sao simao": "5220405", + "senador canedo": "5220454", + "serranopolis": "5220504", + "silvania": "5220603", + "simolandia": "5220686", + "sitio d'abadia": "5220702", + "taquaral de goias": "5221007", + "teresina de goias": "5221080", + "terezopolis de goias": "5221197", + "tres ranchos": "5221304", + "trindade": "5221403", + "trombas": "5221452", + "turvania": "5221502", + "turvelandia": "5221551", + "uirapuru": "5221577", + "uruacu": "5221601", + "uruana": "5221700", + "urutai": "5221809", + "valparaiso de goias": "5221858", + "varjao": "5221908", + "vianopolis": "5222005", + "vicentinopolis": "5222054", + "vila boa": "5222203", + "vila propicio": "5222302" + }, + "DF": { + "brasilia": "5300108" + } +} \ No newline at end of file diff --git a/brutils/data/enums/__init__.py b/brutils/data/enums/__init__.py index 5a6997e5..705fc822 100644 --- a/brutils/data/enums/__init__.py +++ b/brutils/data/enums/__init__.py @@ -1 +1 @@ -from .uf import UF +from .uf import CODE_TO_UF, UF diff --git a/brutils/data/enums/months.py b/brutils/data/enums/months.py new file mode 100644 index 00000000..5e22e56f --- /dev/null +++ b/brutils/data/enums/months.py @@ -0,0 +1,57 @@ +from brutils.data.enums.better_enum import BetterEnum + + +class MonthsEnum(BetterEnum): + JANEIRO = 1 + FEVEREIRO = 2 + MARCO = 3 + ABRIL = 4 + MAIO = 5 + JUNHO = 6 + JULHO = 7 + AGOSTO = 8 + SETEMBRO = 9 + OUTUBRO = 10 + NOVEMBRO = 11 + DEZEMBRO = 12 + + @property + def month_name(self) -> str: + if self == MonthsEnum.JANEIRO: + return "janeiro" + elif self == MonthsEnum.FEVEREIRO: + return "fevereiro" + elif self == MonthsEnum.MARCO: + return "marco" + elif self == MonthsEnum.ABRIL: + return "abril" + elif self == MonthsEnum.MAIO: + return "maio" + elif self == MonthsEnum.JUNHO: + return "junho" + elif self == MonthsEnum.JULHO: + return "julho" + elif self == MonthsEnum.AGOSTO: + return "agosto" + elif self == MonthsEnum.SETEMBRO: + return "setembro" + elif self == MonthsEnum.OUTUBRO: + return "outubro" + elif self == MonthsEnum.NOVEMBRO: + return "novembro" + else: + return "dezembro" + + @classmethod + def is_valid_month(cls, month: int) -> bool: + """ + Checks if the given month value is valid. + Args: + month (int): The month to check. + + Returns: + True if the month is valid, False otherwise. + """ + return ( + True if month in set(month.value for month in MonthsEnum) else False + ) diff --git a/brutils/data/enums/uf.py b/brutils/data/enums/uf.py index aef60101..9bdb971b 100644 --- a/brutils/data/enums/uf.py +++ b/brutils/data/enums/uf.py @@ -29,3 +29,33 @@ class UF(BetterEnum): SP = "São Paulo" SE = "Sergipe" TO = "Tocantins" + + +class CODE_TO_UF(BetterEnum): + AC = "12" + AL = "27" + AP = "16" + AM = "13" + BA = "29" + CE = "23" + DF = "53" + ES = "32" + GO = "52" + MA = "21" + MT = "51" + MS = "52" + MG = "31" + PA = "15" + PB = "25" + PR = "41" + PE = "26" + PI = "22" + RJ = "33" + RN = "24" + RS = "43" + RO = "11" + RR = "14" + SC = "42" + SP = "35" + SE = "28" + TO = "17" diff --git a/brutils/date.py b/brutils/date.py new file mode 100644 index 00000000..98645017 --- /dev/null +++ b/brutils/date.py @@ -0,0 +1,64 @@ +import re +from typing import Union + +from num2words import num2words + +from brutils.data.enums.months import MonthsEnum + + +def convert_date_to_text(date: str) -> Union[str, None]: + """ + Converts a given date in Brazilian format (dd/mm/yyyy) to its textual representation. + + This function takes a date as a string in the format dd/mm/yyyy and converts it + to a string with the date written out in Brazilian Portuguese, including the full + month name and the year. + + Args: + date (str): The date to be converted into text. Expected format: dd/mm/yyyy. + + Returns: + str or None: A string with the date written out in Brazilian Portuguese, + or None if the date is invalid. + + """ + pattern = re.compile(r"\d{2}/\d{2}/\d{4}") + if not re.match(pattern, date): + raise ValueError( + "Date is not a valid date. Please pass a date in the format dd/mm/yyyy." + ) + + day_str, month_str, year_str = date.split("/") + day = int(day_str) + month = int(month_str) + year = int(year_str) + + if 0 <= day > 31: + return None + + if not MonthsEnum.is_valid_month(month): + return None + + # Leap year. + if MonthsEnum(int(month)) is MonthsEnum.FEVEREIRO: + if (int(year) % 4 == 0 and int(year) % 100 != 0) or ( + int(year) % 400 == 0 + ): + if day > 29: + return None + else: + if day > 28: + return None + + day_string = "Primeiro" if day == 1 else num2words(day, lang="pt") + month = MonthsEnum(month) + year_string = num2words(year, lang="pt") + + date_string = ( + day_string.capitalize() + + " de " + + month.month_name + + " de " + + year_string + ) + return date_string diff --git a/brutils/ibge/__init__.py b/brutils/ibge/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/brutils/ibge/municipality.py b/brutils/ibge/municipality.py new file mode 100644 index 00000000..af9a2bc2 --- /dev/null +++ b/brutils/ibge/municipality.py @@ -0,0 +1,167 @@ +import gzip +import io +import json +import pathlib +import unicodedata +from urllib.error import HTTPError +from urllib.request import urlopen + + +def get_municipality_by_code(code): # type: (str) -> Tuple[str, str] | None + """ + Returns the municipality name and UF for a given IBGE code. + + This function takes a string representing an IBGE municipality code + and returns a tuple with the municipality's name and its corresponding UF. + + Args: + code (str): The IBGE code of the municipality. + + Returns: + tuple: A tuple formatted as ("Município", "UF"). + - Returns None if the code is not valid. + + Example: + >>> get_municipality_by_code("3550308") + ("São Paulo", "SP") + """ + baseUrl = ( + f"https://servicodados.ibge.gov.br/api/v1/localidades/municipios/{code}" + ) + try: + with urlopen(baseUrl) as f: + compressed_data = f.read() + if f.info().get("Content-Encoding") == "gzip": + try: + with gzip.GzipFile( + fileobj=io.BytesIO(compressed_data) + ) as gzip_file: + decompressed_data = gzip_file.read() + except OSError as e: + print(f"Erro ao descomprimir os dados: {e}") + return None + except Exception as e: + print(f"Erro desconhecido ao descomprimir os dados: {e}") + return None + else: + decompressed_data = compressed_data + + if _is_empty(decompressed_data): + print(f"{code} é um código inválido") + return None + + except HTTPError as e: + if e.code == 404: + print(f"{code} é um código inválido") + return None + else: + print(f"Erro HTTP ao buscar o código {code}: {e}") + return None + + except Exception as e: + print(f"Erro desconhecido ao buscar o código {code}: {e}") + return None + + try: + json_data = json.loads(decompressed_data) + return _get_values(json_data) + except json.JSONDecodeError as e: + print(f"Erro ao decodificar os dados JSON: {e}") + return None + except KeyError as e: + print(f"Erro ao acessar os dados do município: {e}") + return None + + +def get_code_by_municipality_name(municipality_name: str, uf: str): # type: (str, str) -> str | None + """ + Returns the IBGE code for a given municipality name and uf code. + + This function takes a string representing a municipality's name + and uf's code and returns the corresponding IBGE code (string). The function + will handle names by ignoring differences in case, accents, and + treating the character ç as c and ignoring case differences for the uf code. + + Args: + municipality_name (str): The name of the municipality. + uf (str): The uf code of the state. + + Returns: + str: The IBGE code of the municipality. + - Returns None if the name is not valid or does not exist. + + Example: + >>> get_code_by_municipality_name("São Paulo", "SP") + "3550308" + >>> get_code_by_municipality_name("goiania", "go") + "5208707" + >>> get_code_by_municipality_name("Conceição do Coité", "BA") + "2908408" + >>> get_code_by_municipality_name("conceicao do Coite", "Ba") + "2908408" + >>> get_code_by_municipality_name("Municipio Inexistente", "") + None + >>> get_code_by_municipality_name("Municipio Inexistente", "RS") + None + """ + + abs_path = pathlib.Path(__file__).resolve() + script_dir = abs_path.parent.parent + + json_cities_code_path = script_dir / "data" / "cities_code.json" + uf = uf.upper() + + with open(json_cities_code_path, "r", encoding="utf-8") as file: + cities_uf_code = json.load(file) + + if uf not in cities_uf_code.keys(): + return None + + cities_code = cities_uf_code.get(uf) + name_city = _transform_text(municipality_name) + + if name_city not in cities_code.keys(): + return None + + code = cities_code.get(name_city) + + return code + + +def _get_values(data): + municipio = data["nome"] + estado = data["microrregiao"]["mesorregiao"]["UF"]["sigla"] + return (municipio, estado) + + +def _is_empty(zip): + return zip == b"[]" or len(zip) == 0 + + +def _transform_text(municipality_name: str): # type: (str) -> str + """ + Normalize municipality name and returns the normalized string. + + Args: + municipality_name (str): The name of the municipality. + + Returns: + str: The normalized string + + Example: + >>> _transform_text("São Paulo") + "sao paulo" + >>> _transform_text("Goiânia") + "goiania" + >>> _transform_text("Conceição do Coité") + "'conceicao do coite' + """ + + normalized_string = ( + unicodedata.normalize("NFKD", municipality_name) + .encode("ascii", "ignore") + .decode("ascii") + ) + case_fold_string = normalized_string.casefold() + + return case_fold_string diff --git a/brutils/ibge/uf.py b/brutils/ibge/uf.py index 7c01ba5d..f187d38a 100644 --- a/brutils/ibge/uf.py +++ b/brutils/ibge/uf.py @@ -1,3 +1,37 @@ +from brutils.data.enums.uf import CODE_TO_UF, UF + + +def convert_code_to_uf(code): # type: (str) -> str | None + """ + Converts a given IBGE code (2-digit string) to its corresponding UF (state abbreviation). + + This function takes a 2-digit IBGE code and returns the corresponding UF code. + It handles all Brazilian states and the Federal District. + + Args: + code (str): The 2-digit IBGE code to be converted. + + Returns: + str or None: The UF code corresponding to the IBGE code, + or None if the IBGE code is invalid. + + Example: + >>> convert_code_to_uf('12') + 'AC' + >>> convert_code_to_uf('33') + 'RJ' + >>> convert_code_to_uf('99') + >>> + """ + + result = None + + if code in CODE_TO_UF.values: + result = CODE_TO_UF(code).name + + return result + + def convert_uf_to_text(uf): # type: (str) -> str | None """ Converts a given Brazilian state code (UF) to its full state name. @@ -21,8 +55,6 @@ def convert_uf_to_text(uf): # type: (str) -> str | None None """ - from brutils.data.enums.uf import UF - try: return UF[uf.upper()].value except KeyError: diff --git a/poetry.lock b/poetry.lock index 8e096a72..fefb6af4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -84,34 +84,58 @@ files = [ [package.extras] toml = ["tomli"] +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + +[[package]] +name = "num2words" +version = "0.5.13" +description = "Modules to convert numbers to words. Easily extensible." +optional = false +python-versions = "*" +files = [ + {file = "num2words-0.5.13-py3-none-any.whl", hash = "sha256:39e662c663f0a7e15415431ea68eb3dc711b49e3b776d93403e1da0a219ca4ee"}, + {file = "num2words-0.5.13.tar.gz", hash = "sha256:a3064716fbbf90d75c449450cebfbc73a6a13e63b2531d09bdecc3ab1a2209cf"}, +] + +[package.dependencies] +docopt = ">=0.6.2" + [[package]] name = "ruff" -version = "0.6.9" +version = "0.6.7" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"}, - {file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"}, - {file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"}, - {file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"}, - {file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"}, - {file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"}, - {file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"}, + {file = "ruff-0.6.7-py3-none-linux_armv6l.whl", hash = "sha256:08277b217534bfdcc2e1377f7f933e1c7957453e8a79764d004e44c40db923f2"}, + {file = "ruff-0.6.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c6707a32e03b791f4448dc0dce24b636cbcdee4dd5607adc24e5ee73fd86c00a"}, + {file = "ruff-0.6.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:533d66b7774ef224e7cf91506a7dafcc9e8ec7c059263ec46629e54e7b1f90ab"}, + {file = "ruff-0.6.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17a86aac6f915932d259f7bec79173e356165518859f94649d8c50b81ff087e9"}, + {file = "ruff-0.6.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3f8822defd260ae2460ea3832b24d37d203c3577f48b055590a426a722d50ef"}, + {file = "ruff-0.6.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ba4efe5c6dbbb58be58dd83feedb83b5e95c00091bf09987b4baf510fee5c99"}, + {file = "ruff-0.6.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:525201b77f94d2b54868f0cbe5edc018e64c22563da6c5c2e5c107a4e85c1c0d"}, + {file = "ruff-0.6.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8854450839f339e1049fdbe15d875384242b8e85d5c6947bb2faad33c651020b"}, + {file = "ruff-0.6.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f0b62056246234d59cbf2ea66e84812dc9ec4540518e37553513392c171cb18"}, + {file = "ruff-0.6.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b1462fa56c832dc0cea5b4041cfc9c97813505d11cce74ebc6d1aae068de36b"}, + {file = "ruff-0.6.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:02b083770e4cdb1495ed313f5694c62808e71764ec6ee5db84eedd82fd32d8f5"}, + {file = "ruff-0.6.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c05fd37013de36dfa883a3854fae57b3113aaa8abf5dea79202675991d48624"}, + {file = "ruff-0.6.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f49c9caa28d9bbfac4a637ae10327b3db00f47d038f3fbb2195c4d682e925b14"}, + {file = "ruff-0.6.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a0e1655868164e114ba43a908fd2d64a271a23660195017c17691fb6355d59bb"}, + {file = "ruff-0.6.7-py3-none-win32.whl", hash = "sha256:a939ca435b49f6966a7dd64b765c9df16f1faed0ca3b6f16acdf7731969deb35"}, + {file = "ruff-0.6.7-py3-none-win_amd64.whl", hash = "sha256:590445eec5653f36248584579c06252ad2e110a5d1f32db5420de35fb0e1c977"}, + {file = "ruff-0.6.7-py3-none-win_arm64.whl", hash = "sha256:b28f0d5e2f771c1fe3c7a45d3f53916fc74a480698c4b5731f0bea61e52137c8"}, + {file = "ruff-0.6.7.tar.gz", hash = "sha256:44e52129d82266fa59b587e2cd74def5637b730a69c4542525dfdecfaae38bd5"}, ] [metadata] lock-version = "2.0" python-versions = "^3.8.1" -content-hash = "d8b14f498f22110c956599439555c577506734f885bad5b50b2ea6ba8b64596b" +content-hash = "957675c81621c16701bae337f25dc9571f3c2a787002725627de366f1b01d16a" diff --git a/pyproject.toml b/pyproject.toml index a9435a86..7d967168 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ classifiers = [ [tool.poetry.dependencies] python = "^3.8.1" -ruff = "^0.6.9" +num2words = "0.5.13" [tool.poetry.group.test.dependencies] coverage = "^7.2.7" diff --git a/tests/ibge/__init__.py b/tests/ibge/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/ibge/test_municipality.py b/tests/ibge/test_municipality.py new file mode 100644 index 00000000..119c3c88 --- /dev/null +++ b/tests/ibge/test_municipality.py @@ -0,0 +1,131 @@ +import gzip +from json import JSONDecodeError +from unittest import TestCase, main +from unittest.mock import MagicMock, patch +from urllib.error import HTTPError + +from brutils.ibge.municipality import ( + get_code_by_municipality_name, + get_municipality_by_code, +) + + +class TestIBGE(TestCase): + def test_get_municipality_by_code(self): + self.assertEqual( + get_municipality_by_code("3550308"), ("São Paulo", "SP") + ) + self.assertEqual( + get_municipality_by_code("3304557"), ("Rio de Janeiro", "RJ") + ) + self.assertEqual(get_municipality_by_code("5208707"), ("Goiânia", "GO")) + self.assertIsNone(get_municipality_by_code("1234567")) + + @patch("brutils.ibge.municipality.urlopen") + def test_get_municipality_http_error(self, mock): + mock.side_effect = HTTPError( + "http://fakeurl.com", 404, "Not Found", None, None + ) + result = get_municipality_by_code("342432") + self.assertIsNone(result) + + @patch("brutils.ibge.municipality.urlopen") + def test_get_municipality_http_error_1(self, mock): + mock.side_effect = HTTPError( + "http://fakeurl.com", 401, "Denied", None, None + ) + result = get_municipality_by_code("342432") + self.assertIsNone(result) + + @patch("brutils.ibge.municipality.urlopen") + def test_get_municipality_excpetion(self, mock): + mock.side_effect = Exception("Erro desconhecido") + result = get_municipality_by_code("342432") + self.assertIsNone(result) + + @patch("brutils.ibge.municipality.urlopen") + def test_successfull_decompression(self, mock_urlopen): + valid_json = '{"nome":"São Paulo","microrregiao":{"mesorregiao":{"UF":{"sigla":"SP"}}}}' + compressed_data = gzip.compress(valid_json.encode("utf-8")) + mock_response = MagicMock() + mock_response.read.return_value = compressed_data + mock_response.info.return_value.get.return_value = "gzip" + mock_urlopen.return_value.__enter__.return_value = mock_response + + result = get_municipality_by_code("3550308") + self.assertEqual(result, ("São Paulo", "SP")) + + @patch("brutils.ibge.municipality.urlopen") + def test_successful_json_without_compression(self, mock_urlopen): + valid_json = '{"nome":"São Paulo","microrregiao":{"mesorregiao":{"UF":{"sigla":"SP"}}}}' + mock_response = MagicMock() + mock_response.read.return_value = valid_json + mock_urlopen.return_value.__enter__.return_value = mock_response + + result = get_municipality_by_code("3550308") + self.assertEqual(result, ("São Paulo", "SP")) + + @patch("gzip.GzipFile.read", side_effect=OSError("Erro na descompressão")) + def test_error_decompression(self, mock_gzip_read): + result = get_municipality_by_code("3550308") + self.assertIsNone(result) + + @patch( + "gzip.GzipFile.read", + side_effect=Exception("Erro desconhecido na descompressão"), + ) + def test_error_decompression_generic_exception(self, mock_gzip_read): + result = get_municipality_by_code("3550308") + self.assertIsNone(result) + + @patch("json.loads", side_effect=JSONDecodeError("error", "city.json", 1)) + def test_error_json_load(self, mock_json_loads): + result = get_municipality_by_code("3550308") + self.assertIsNone(result) + + @patch("json.loads", side_effect=KeyError) + def test_error_json_key_error(self, mock_json_loads): + result = get_municipality_by_code("3550308") + self.assertIsNone(result) + + def test_get_code_by_municipality_name(self): + self.assertEqual( + get_code_by_municipality_name("Florianópolis", "sc"), "4205407" + ) + self.assertEqual( + get_code_by_municipality_name("São Paulo", "sp"), "3550308" + ) + self.assertEqual( + get_code_by_municipality_name("GOIANIA", "GO"), "5208707" + ) + self.assertEqual( + get_code_by_municipality_name("Conceição do Coité", "BA"), "2908408" + ) + self.assertEqual( + get_code_by_municipality_name("conceicao do Coite", "Ba"), "2908408" + ) + self.assertEqual( + get_code_by_municipality_name("rio de janeiro", "rj"), "3304557" + ) + self.assertEqual( + get_code_by_municipality_name("Lauro Müller", "sc"), "4209607" + ) + self.assertEqual( + get_code_by_municipality_name("Tôrres", "rs"), "4321501" + ) + self.assertEqual( + get_code_by_municipality_name("aurora", "ce"), "2301703" + ) + self.assertEqual( + get_code_by_municipality_name("aurora", "sc"), "4201901" + ) + self.assertIsNone( + get_code_by_municipality_name("Municipio Inexistente", "RS") + ) + self.assertIsNone( + get_code_by_municipality_name("Municipio Inexistente", "") + ) + + +if __name__ == "__main__": + main() diff --git a/tests/ibge/test_uf.py b/tests/ibge/test_uf.py index 208a9ade..bad868e1 100644 --- a/tests/ibge/test_uf.py +++ b/tests/ibge/test_uf.py @@ -1,9 +1,25 @@ from unittest import TestCase -from brutils.ibge.uf import convert_uf_to_text +from brutils.ibge.uf import ( + convert_code_to_uf, + convert_uf_to_text, +) class TestUF(TestCase): + def test_convert_code_to_uf(self): + # Testes para códigos válidos + self.assertEqual(convert_code_to_uf("12"), "AC") + self.assertEqual(convert_code_to_uf("33"), "RJ") + self.assertEqual(convert_code_to_uf("31"), "MG") + self.assertEqual(convert_code_to_uf("52"), "GO") + + # Testes para códigos inválidos + self.assertIsNone(convert_code_to_uf("99")) + self.assertIsNone(convert_code_to_uf("00")) + self.assertIsNone(convert_code_to_uf("")) + self.assertIsNone(convert_code_to_uf("AB")) + def test_convert_uf_to_text(self): # Testes para códigos válidos self.assertEqual(convert_uf_to_text("SP"), "São Paulo") diff --git a/tests/test_date.py b/tests/test_date.py new file mode 100644 index 00000000..3691ec76 --- /dev/null +++ b/tests/test_date.py @@ -0,0 +1,80 @@ +from unittest import TestCase + +from num2words import num2words + +from brutils import convert_date_to_text +from brutils.data.enums.months import MonthsEnum + + +class TestNum2Words(TestCase): + def test_num_conversion(self) -> None: + """ + Smoke test of the num2words library. + This test is used to guarantee that our dependency still works. + """ + self.assertEqual(num2words(30, lang="pt-br"), "trinta") + self.assertEqual(num2words(42, lang="pt-br"), "quarenta e dois") + self.assertEqual( + num2words(2024, lang="pt-br"), "dois mil e vinte e quatro" + ) + self.assertEqual(num2words(0, lang="pt-br"), "zero") + self.assertEqual(num2words(-1, lang="pt-br"), "menos um") + + +class TestDate(TestCase): + def test_convert_date_to_text(self): + self.assertEqual( + convert_date_to_text("15/08/2024"), + "Quinze de agosto de dois mil e vinte e quatro", + ) + self.assertEqual( + convert_date_to_text("01/01/2000"), + "Primeiro de janeiro de dois mil", + ) + self.assertEqual( + convert_date_to_text("31/12/1999"), + "Trinta e um de dezembro de mil novecentos e noventa e nove", + ) + + # + self.assertIsNone(convert_date_to_text("30/02/2020"), None) + self.assertIsNone(convert_date_to_text("30/00/2020"), None) + self.assertIsNone(convert_date_to_text("30/02/2000"), None) + self.assertIsNone(convert_date_to_text("50/09/2000"), None) + self.assertIsNone(convert_date_to_text("25/15/2000"), None) + self.assertIsNone(convert_date_to_text("29/02/2019"), None) + + # Invalid date pattern. + self.assertRaises(ValueError, convert_date_to_text, "Invalid") + self.assertRaises(ValueError, convert_date_to_text, "25/1/2020") + self.assertRaises(ValueError, convert_date_to_text, "1924/08/20") + self.assertRaises(ValueError, convert_date_to_text, "5/09/2020") + + self.assertEqual( + convert_date_to_text("29/02/2020"), + "Vinte e nove de fevereiro de dois mil e vinte", + ) + self.assertEqual( + convert_date_to_text("01/01/1900"), + "Primeiro de janeiro de mil e novecentos", + ) + + months_year = [ + (1, "janeiro"), + (2, "fevereiro"), + (3, "marco"), + (4, "abril"), + (5, "maio"), + (6, "junho"), + (7, "julho"), + (8, "agosto"), + (9, "setembro"), + (10, "outubro"), + (11, "novembro"), + (12, "dezembro"), + ] + + def testMonthEnum(self): + for number_month, name_month in self.months_year: + month = MonthsEnum(number_month) + self.assertEqual(month.month_name, name_month)