brutils 2.3.0__tar.gz → 2.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {brutils-2.3.0 → brutils-2.5.0}/PKG-INFO +278 -11
- {brutils-2.3.0 → brutils-2.5.0}/README.md +275 -8
- {brutils-2.3.0 → brutils-2.5.0}/brutils/__init__.py +36 -1
- {brutils-2.3.0 → brutils-2.5.0}/brutils/cep.py +10 -8
- brutils-2.5.0/brutils/cnh.py +86 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/cnpj.py +71 -16
- {brutils-2.3.0 → brutils-2.5.0}/brutils/cpf.py +9 -9
- {brutils-2.3.0 → brutils-2.5.0}/brutils/email.py +1 -1
- {brutils-2.3.0 → brutils-2.5.0}/brutils/ibge/uf.py +59 -0
- brutils-2.5.0/brutils/legal_nature.py +165 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/legal_process.py +11 -8
- {brutils-2.3.0 → brutils-2.5.0}/brutils/license_plate.py +14 -12
- brutils-2.5.0/brutils/passport.py +107 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/phone.py +13 -13
- brutils-2.5.0/brutils/renavam.py +56 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/voter_id.py +11 -10
- {brutils-2.3.0 → brutils-2.5.0}/pyproject.toml +4 -4
- {brutils-2.3.0 → brutils-2.5.0}/LICENSE +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/currency.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/data/cities_code.json +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/data/enums/__init__.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/data/enums/better_enum.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/data/enums/months.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/data/enums/uf.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/data/legal_process_ids.json +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/date_utils.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/exceptions/__init__.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/exceptions/cep.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/ibge/__init__.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/ibge/municipality.py +0 -0
- {brutils-2.3.0 → brutils-2.5.0}/brutils/pis.py +0 -0
- {brutils-2.3.0/brutils/types → brutils-2.5.0/brutils/schemas}/__init__.py +0 -0
- {brutils-2.3.0/brutils/types → brutils-2.5.0/brutils/schemas}/address.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: brutils
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.0
|
|
4
4
|
Summary: Utils library for specific Brazilian businesses
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -24,17 +24,19 @@ Classifier: Topic :: Office/Business
|
|
|
24
24
|
Classifier: Topic :: Software Development :: Internationalization
|
|
25
25
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
26
|
Requires-Dist: coverage (>=7.2.7,<8.0.0)
|
|
27
|
-
Requires-Dist: holidays (>=0.58,<0.
|
|
27
|
+
Requires-Dist: holidays (>=0.58,<0.99)
|
|
28
28
|
Requires-Dist: num2words (==0.5.14)
|
|
29
|
-
Project-URL: Repository, https://github.com/brazilian-utils/
|
|
29
|
+
Project-URL: Repository, https://github.com/brazilian-utils/python
|
|
30
30
|
Description-Content-Type: text/markdown
|
|
31
31
|
|
|
32
|
+

|
|
33
|
+
|
|
32
34
|
<div align="center">
|
|
33
|
-
<h1>🇧🇷 Brazilian Utils</h1>
|
|
34
35
|
|
|
35
|
-
<p>
|
|
36
|
+
<p>Biblioteca de utilitários projetada para validar, gerar e manipular dados de acordo com as particularidades do Brasil</p>
|
|
36
37
|
|
|
37
|
-
[](https://codecov.io/gh/brazilian-utils/python)
|
|
39
|
+
[](https://github.com/brazilian-utils/python/actions/workflows/check-lint.yml?query=branch%3Amain)
|
|
38
40
|
[](https://pypistats.org/packages/brutils)
|
|
39
41
|
[](https://pypi.org/project/brutils/)
|
|
40
42
|
|
|
@@ -71,7 +73,6 @@ False
|
|
|
71
73
|
```
|
|
72
74
|
|
|
73
75
|
# Utilitários
|
|
74
|
-
|
|
75
76
|
- [CPF](#cpf)
|
|
76
77
|
- [is\_valid\_cpf](#is_valid_cpf)
|
|
77
78
|
- [format\_cpf](#format_cpf)
|
|
@@ -99,6 +100,8 @@ False
|
|
|
99
100
|
- [is\_valid\_email](#is_valid_email)
|
|
100
101
|
- [Data](#date)
|
|
101
102
|
- [convert\_date\_to_text](#convert_date_to_text)
|
|
103
|
+
- [CNH](#cnh)
|
|
104
|
+
- [is\_valid\_cnh](#is_valid_cnh)
|
|
102
105
|
- [Placa de Carro](#placa-de-carro)
|
|
103
106
|
- [is\_valid\_license\_plate](#is_valid_license_plate)
|
|
104
107
|
- [format\_license\_plate](#format_license_plate)
|
|
@@ -116,6 +119,8 @@ False
|
|
|
116
119
|
- [format\_legal\_process](#format_legal_process)
|
|
117
120
|
- [remove\_symbols\_legal\_process](#remove_symbols_legal_process)
|
|
118
121
|
- [generate\_legal\_process](#generate_legal_process)
|
|
122
|
+
- [RENAVAM](#renavam)
|
|
123
|
+
- [is_valid_renavam](#is_valid_renavam)
|
|
119
124
|
- [Titulo Eleitoral](#titulo-eleitoral)
|
|
120
125
|
- [is\_valid\_voter\_id](#is_valid_voter_id)
|
|
121
126
|
- [format\_voter\_id](#format_voter_id)
|
|
@@ -123,6 +128,7 @@ False
|
|
|
123
128
|
- [IBGE](#ibge)
|
|
124
129
|
- [convert_code_to_uf](#convert_code_to_uf)
|
|
125
130
|
- [convert_uf_to_name](#convert_uf_to_name)
|
|
131
|
+
- [convert_name_to_uf](#convert_name_to_uf)
|
|
126
132
|
- [get_code_by_municipality_name](#get_code_by_municipality_name)
|
|
127
133
|
- [get\_municipality\_by\_code](#get_municipality_by_code)
|
|
128
134
|
- [Feriados](#feriados)
|
|
@@ -130,6 +136,15 @@ False
|
|
|
130
136
|
- [Monetário](#monetário)
|
|
131
137
|
- [format\_currency](#format_currency)
|
|
132
138
|
- [convert\_real\_to\_text](#convert_real_to_text)
|
|
139
|
+
- [Natureza Jurídica](#natureza-jurídica)
|
|
140
|
+
- [is_valid_legal_nature](#is_valid_legal_nature)
|
|
141
|
+
- [get_legal_nature_description](#get_legal_nature_description)
|
|
142
|
+
- [list_all_legal_nature](#list_all_legal_nature)
|
|
143
|
+
- [Passaporte](#passaporte)
|
|
144
|
+
- [is_valid_passport](#is_valid_passport)
|
|
145
|
+
- [format_passport](#format_passport)
|
|
146
|
+
- [remove_symbols_passport](#remove_symbols_passport)
|
|
147
|
+
- [generate_passport](#generate_passport)
|
|
133
148
|
|
|
134
149
|
## CPF
|
|
135
150
|
|
|
@@ -229,7 +244,8 @@ Exemplo:
|
|
|
229
244
|
|
|
230
245
|
Verifica se os dígitos de verificação do CNPJ (Cadastro Nacional da Pessoa
|
|
231
246
|
Jurídica) fornecido correspondem ao seu número base. A entrada deve ser uma
|
|
232
|
-
string de
|
|
247
|
+
string de 14 caracteres, permitindo dígitos e letras maiúsculas nas 12
|
|
248
|
+
primeiras posições e dígitos nas 2 últimas. Esta função não verifica a
|
|
233
249
|
existência do CNPJ; ela só valida o formato da string.
|
|
234
250
|
|
|
235
251
|
Argumentos:
|
|
@@ -301,12 +317,16 @@ Exemplo:
|
|
|
301
317
|
|
|
302
318
|
### generate_cnpj
|
|
303
319
|
|
|
304
|
-
Gera uma string de
|
|
305
|
-
|
|
320
|
+
Gera uma string de CNPJ válida aleatória. Um número de filial opcional pode ser
|
|
321
|
+
fornecido; o padrão é 1. Use `alphanumeric=True` para gerar um CNPJ cujas 12
|
|
322
|
+
primeiras posições podem conter dígitos e letras maiúsculas.
|
|
306
323
|
|
|
307
324
|
Argumentos:
|
|
308
325
|
|
|
309
|
-
- branch (int): Um número de filial opcional a ser incluído no CNPJ.
|
|
326
|
+
- branch (int | str): Um número de filial opcional a ser incluído no CNPJ.
|
|
327
|
+
Valores de filial alfanuméricos são aceitos apenas com
|
|
328
|
+
`alphanumeric=True`.
|
|
329
|
+
- alphanumeric (bool): Define se o CNPJ gerado deve ser alfanumérico.
|
|
310
330
|
|
|
311
331
|
Retorna:
|
|
312
332
|
|
|
@@ -320,6 +340,13 @@ Exemplo:
|
|
|
320
340
|
'34665388000161'
|
|
321
341
|
>>> generate_cnpj(1234)
|
|
322
342
|
"01745284123455"
|
|
343
|
+
>>> generate_cnpj(alphanumeric=True)
|
|
344
|
+
"9359QAG9000184"
|
|
345
|
+
>>> generate_cnpj(branch="AB12", alphanumeric=True)
|
|
346
|
+
"BR2026UTAB1290"
|
|
347
|
+
>>> generate_cnpj(branch="CD34", alphanumeric=True)
|
|
348
|
+
# CNPJ inválido para exemplos de validação:
|
|
349
|
+
"NX9K79E2CD3400"
|
|
323
350
|
```
|
|
324
351
|
|
|
325
352
|
## CEP
|
|
@@ -695,6 +722,37 @@ None
|
|
|
695
722
|
"Primeiro de agosto de dois mil e vinte e quatro"
|
|
696
723
|
````
|
|
697
724
|
|
|
725
|
+
## CNH
|
|
726
|
+
|
|
727
|
+
### is_valid_cnh
|
|
728
|
+
|
|
729
|
+
Verifica se o número de registro de CNH (Carteira de Habilitação Nacional) brasileiro é válido.
|
|
730
|
+
Para que um número de CNH seja considerado válido, a entrada deve ser uma string contendo
|
|
731
|
+
exatamente 11 dígitos numéricos. Esta função não verifica se o número da CNH é real, apenas
|
|
732
|
+
valida os dígitos verificadores.
|
|
733
|
+
|
|
734
|
+
Argumentos:
|
|
735
|
+
|
|
736
|
+
- cnh (str): A string contendo o número de registro de CNH a ser verificado.
|
|
737
|
+
|
|
738
|
+
Retorno:
|
|
739
|
+
|
|
740
|
+
- bool: True se o número de registro da CNHN for válido (11 dígitos), False caso contrário.
|
|
741
|
+
|
|
742
|
+
Exemplo:
|
|
743
|
+
|
|
744
|
+
```python
|
|
745
|
+
>>> from brutils import is_valid_cnh
|
|
746
|
+
>>> is_valid_cnh("12345678901")
|
|
747
|
+
False
|
|
748
|
+
>>> is_valid_cnh("A2C45678901")
|
|
749
|
+
False
|
|
750
|
+
>>> is_valid_cnh("98765432100")
|
|
751
|
+
True
|
|
752
|
+
>>> is_valid_cnh("987654321-00")
|
|
753
|
+
True
|
|
754
|
+
```
|
|
755
|
+
|
|
698
756
|
|
|
699
757
|
## Placa de Carro
|
|
700
758
|
|
|
@@ -1249,6 +1307,33 @@ Exemplo:
|
|
|
1249
1307
|
'Rio de Janeiro'
|
|
1250
1308
|
```
|
|
1251
1309
|
|
|
1310
|
+
### convert_name_to_uf
|
|
1311
|
+
Converte o nome completo de um estado brasileiro para seu código UF.
|
|
1312
|
+
|
|
1313
|
+
Esta função recebe o nome completo de um estado brasileiro e retorna o código UF de duas letras correspondente. A comparação ignora maiúsculas/minúsculas e acentos.
|
|
1314
|
+
|
|
1315
|
+
Argumentos:
|
|
1316
|
+
* state_name (str): O nome completo do estado (por exemplo, 'São Paulo', 'sao paulo').
|
|
1317
|
+
|
|
1318
|
+
Retorna:
|
|
1319
|
+
* str | None: O código UF se encontrado, ou None se o nome do estado for inválido.
|
|
1320
|
+
|
|
1321
|
+
Exemplo:
|
|
1322
|
+
|
|
1323
|
+
```python
|
|
1324
|
+
>>> from brutils.ibge.uf import convert_name_to_uf
|
|
1325
|
+
>>> convert_name_to_uf('São Paulo')
|
|
1326
|
+
'SP'
|
|
1327
|
+
>>> convert_name_to_uf('sao paulo')
|
|
1328
|
+
'SP'
|
|
1329
|
+
>>> convert_name_to_uf('Rio de Janeiro')
|
|
1330
|
+
'RJ'
|
|
1331
|
+
>>> convert_name_to_uf('rio de janeiro')
|
|
1332
|
+
'RJ'
|
|
1333
|
+
>>> convert_name_to_uf('Estado Inválido')
|
|
1334
|
+
>>>
|
|
1335
|
+
```
|
|
1336
|
+
|
|
1252
1337
|
## Feriados
|
|
1253
1338
|
|
|
1254
1339
|
### is_holiday
|
|
@@ -1344,6 +1429,188 @@ Exemplo:
|
|
|
1344
1429
|
None
|
|
1345
1430
|
```
|
|
1346
1431
|
|
|
1432
|
+
## Natureza Jurídica
|
|
1433
|
+
|
|
1434
|
+
### is_valid_legal_nature
|
|
1435
|
+
|
|
1436
|
+
Valida se o código informado existe na tabela oficial. Aceita `NNNN` ou `NNN-N`.
|
|
1437
|
+
O valor é **normalizado** antes da checagem: remove espaços, mantém apenas dígitos e aceita hífen entre o 3º e 4º dígitos.
|
|
1438
|
+
|
|
1439
|
+
**Argumentos**
|
|
1440
|
+
- `code (str)`: Código de 4 dígitos (ex.: `"2062"` ou `"206-2"`)
|
|
1441
|
+
|
|
1442
|
+
**Retorna**
|
|
1443
|
+
- `bool`: `True` se existir na tabela, `False` caso contrário.
|
|
1444
|
+
|
|
1445
|
+
**Exemplo**
|
|
1446
|
+
```python
|
|
1447
|
+
>>> from brutils import legal_nature
|
|
1448
|
+
>>> legal_nature.is_valid("2062")
|
|
1449
|
+
True
|
|
1450
|
+
>>> legal_nature.is_valid("206-2")
|
|
1451
|
+
True
|
|
1452
|
+
>>> legal_nature.is_valid("9999")
|
|
1453
|
+
False
|
|
1454
|
+
```
|
|
1455
|
+
|
|
1456
|
+
### get_legal_nature_description
|
|
1457
|
+
|
|
1458
|
+
Retorna a **descrição oficial** do código de Natureza Jurídica. Aceita `NNNN` ou `NNN-N`. Aplica a mesma normalização do `is_valid`.
|
|
1459
|
+
|
|
1460
|
+
**Argumentos**
|
|
1461
|
+
|
|
1462
|
+
* `code (str)`: Código de 4 dígitos
|
|
1463
|
+
|
|
1464
|
+
**Retorna**
|
|
1465
|
+
|
|
1466
|
+
* `str | None`: Descrição correspondente ou `None` se o código for inválido ou inexistente.
|
|
1467
|
+
|
|
1468
|
+
**Exemplo**
|
|
1469
|
+
|
|
1470
|
+
```python
|
|
1471
|
+
>>> from brutils import legal_nature
|
|
1472
|
+
>>> legal_nature.get_description("2062")
|
|
1473
|
+
'Sociedade Empresária Limitada'
|
|
1474
|
+
>>> legal_nature.get_description("101-5")
|
|
1475
|
+
'Órgão Público do Poder Executivo Federal'
|
|
1476
|
+
>>> legal_nature.get_description("0000")
|
|
1477
|
+
None
|
|
1478
|
+
```
|
|
1479
|
+
|
|
1480
|
+
### list_all_legal_nature
|
|
1481
|
+
|
|
1482
|
+
Retorna uma cópia do dicionário completo `{codigo: descricao}`.
|
|
1483
|
+
|
|
1484
|
+
**Retorna**
|
|
1485
|
+
|
|
1486
|
+
* `dict[str, str]`: Mapeamento de todos os códigos para suas descrições.
|
|
1487
|
+
|
|
1488
|
+
**Exemplo**
|
|
1489
|
+
|
|
1490
|
+
```python
|
|
1491
|
+
>>> from brutils import legal_nature
|
|
1492
|
+
>>> data = legal_nature.list_all()
|
|
1493
|
+
>>> len(data) > 0
|
|
1494
|
+
True
|
|
1495
|
+
>>> data["2062"]
|
|
1496
|
+
'Sociedade Empresária Limitada'
|
|
1497
|
+
```
|
|
1498
|
+
|
|
1499
|
+
## RENAVAM
|
|
1500
|
+
|
|
1501
|
+
### is_valid_renavam
|
|
1502
|
+
|
|
1503
|
+
Valida se os dígitos de verificação do RENAVAM fornecido
|
|
1504
|
+
correspondem aos seus 10 dígitos iniciais. Esta função não verifica a existência do veículo;
|
|
1505
|
+
ela apenas valida o formato da string e o dígito verificador.
|
|
1506
|
+
|
|
1507
|
+
Argumentos:
|
|
1508
|
+
|
|
1509
|
+
- renavam (str): O RENAVAM a ser validado, uma string de 11 dígitos.
|
|
1510
|
+
|
|
1511
|
+
Retorna:
|
|
1512
|
+
|
|
1513
|
+
- bool: Verdadeiro se o RENAVAM for válido
|
|
1514
|
+
Falso caso contrário.
|
|
1515
|
+
|
|
1516
|
+
Exemplo:
|
|
1517
|
+
|
|
1518
|
+
```python
|
|
1519
|
+
>>> from brutils import is_valid_renavam
|
|
1520
|
+
>>> is_valid_renavam("86769597308")
|
|
1521
|
+
True
|
|
1522
|
+
>>> is_valid_renavam("12345678901")
|
|
1523
|
+
False
|
|
1524
|
+
```
|
|
1525
|
+
|
|
1526
|
+
## Passaporte
|
|
1527
|
+
|
|
1528
|
+
### is_valid_passport
|
|
1529
|
+
|
|
1530
|
+
Verifica se um número de passaporte brasileiro é válido.
|
|
1531
|
+
|
|
1532
|
+
Para ser considerado válido, a entrada deve ser uma string contendo exatamente dois caracteres alfabéticos seguidos de exatamente seis dígitos numéricos.
|
|
1533
|
+
|
|
1534
|
+
Esta função não verifica se a entrada é um número de passaporte real, pois não existem dígitos verificadores para o passaporte brasileiro.
|
|
1535
|
+
|
|
1536
|
+
Argumentos:
|
|
1537
|
+
- passport (str): A string contendo o número do passaporte a ser verificado.
|
|
1538
|
+
|
|
1539
|
+
Retorna:
|
|
1540
|
+
- bool: True se o número do passaporte for válido (2 letras seguidas de 6 dígitos). False caso contrário.
|
|
1541
|
+
|
|
1542
|
+
Exemplo:
|
|
1543
|
+
```python
|
|
1544
|
+
>>> from brutils import is_valid_passport
|
|
1545
|
+
>>> is_valid_passport("Ab123456")
|
|
1546
|
+
True
|
|
1547
|
+
>>> is_valid_passport("12345678")
|
|
1548
|
+
False
|
|
1549
|
+
>>> is_valid_passport("DC-221345")
|
|
1550
|
+
False
|
|
1551
|
+
```
|
|
1552
|
+
### format_passport
|
|
1553
|
+
|
|
1554
|
+
Formata um número de passaporte brasileiro para exibição.
|
|
1555
|
+
|
|
1556
|
+
Esta função recebe uma string representando um número de passaporte válido e o retorna formatado (maiúsculas, sem símbolos).
|
|
1557
|
+
|
|
1558
|
+
Argumentos:
|
|
1559
|
+
- passport (str | None): Um número de passaporte brasileiro (minúsculas ou maiúsculas, possivelmente incluindo símbolos)
|
|
1560
|
+
|
|
1561
|
+
Retorna:
|
|
1562
|
+
- str: O número do passaporte formatado (maiúsculas, sem símbolos) ou None se a entrada for inválida
|
|
1563
|
+
|
|
1564
|
+
Exemplo:
|
|
1565
|
+
```python
|
|
1566
|
+
>>> from brutils import format_passport
|
|
1567
|
+
>>> format_passport("Ab123456")
|
|
1568
|
+
AB123456
|
|
1569
|
+
>>> format_passport("Ab-123456")
|
|
1570
|
+
AB123456
|
|
1571
|
+
>>> format_passport("111111")
|
|
1572
|
+
None
|
|
1573
|
+
```
|
|
1574
|
+
### remove_symbols_passport
|
|
1575
|
+
|
|
1576
|
+
Remove símbolos ('-', '.' e espaços em branco) de um número de passaporte.
|
|
1577
|
+
|
|
1578
|
+
Esta função recebe uma string com um número de passaporte como entrada e remove todas as ocorrências dos caracteres '.', '-' e espaço em branco.
|
|
1579
|
+
|
|
1580
|
+
Argumentos:
|
|
1581
|
+
- passport (str): A string contendo um número de passaporte
|
|
1582
|
+
|
|
1583
|
+
Retorna:
|
|
1584
|
+
- str: O número do passaporte com hífens (-), pontos (.) e espaços em branco ( ) removidos.
|
|
1585
|
+
|
|
1586
|
+
Exemplo:
|
|
1587
|
+
```python
|
|
1588
|
+
>>> from brutils import remove_symbols_passport
|
|
1589
|
+
>>> remove_symbols_passport("Ab123456")
|
|
1590
|
+
Ab123456
|
|
1591
|
+
>>> remove_symbols_passport("Ab-123456")
|
|
1592
|
+
Ab123456
|
|
1593
|
+
>>> remove_symbols_passport("Ab -. 123456")
|
|
1594
|
+
Ab123456
|
|
1595
|
+
```
|
|
1596
|
+
### generate_passport
|
|
1597
|
+
|
|
1598
|
+
Gera uma string com um número de passaporte brasileiro válido aleatório.
|
|
1599
|
+
|
|
1600
|
+
Esta função gera uma string com um número de passaporte brasileiro aleatório.
|
|
1601
|
+
|
|
1602
|
+
Retorna:
|
|
1603
|
+
- str: Uma string com um número de passaporte válido aleatório.
|
|
1604
|
+
|
|
1605
|
+
Exemplo:
|
|
1606
|
+
```python
|
|
1607
|
+
>>> from brutils import generate_passport
|
|
1608
|
+
>>> generate_passport()
|
|
1609
|
+
"RY393097"
|
|
1610
|
+
>>> generate_passport()
|
|
1611
|
+
"ZS840088"
|
|
1612
|
+
```
|
|
1613
|
+
|
|
1347
1614
|
# Novos Utilitários e Reportar Bugs
|
|
1348
1615
|
|
|
1349
1616
|
Caso queira sugerir novas funcionalidades ou reportar bugs, basta criar
|