Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Economia Regional: Mapas de Coeficiente de Especialização em R. Campo Grande-MS,Brasil: RStudio/Rpubs, 2020. Disponível em http://rpubs.com/amrofi/Regional_Economics_CEmaps.

1 Introdução

Para realizar seu mapa em R, inicialmente o leitor deve baixar os programas e pacotes necessários ao projeto. Neste caso, sugere-se que utilize o RStudio e o R atualizados, a partir de: http://cran.r-project.org/bin/windows/base/ e https://www.rstudio.com/products/rstudio/download3/. Quando esta revisão foi feita, a versão do RStudio era a RStudio Desktop 1.2.5042 e do R-4.0 for Windows (32/64 bit).

Primeiro instale o R e posteriormente o RStudio, de modo que o segundo reconheça automaticamente o primeiro. Se tudo estiver perfeito, a tela inicial do RStudio mostrará corretamente a versão do R.

2 Mapas em R

Agora a meta é gerar um mapa simples em R. Para tanto, primeiro define-se a malha municipal desejada. Para o presente caso, utilizam-se as malhas digitais do IBGE de http://mapas.ibge.gov.br/bases-e-referenciais/bases-cartograficas/malhas-digitais. Primeiro faz-se o download do arquivo zip completo para Mato Grosso do Sul (MS). A partir de ftp://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2015/UFs/MS/MS.zip, o arquivo foi descompactado no mesmo diretorio de trabalho do projeto R, numa pasta de nome MS. Neste arquivo zip, existem arquivos referentes a unidade da federação 50 para Mato Grosso do Sul (50UE), assim como para a mesorregião (50ME), microrregião (50MI) e municípios (50MU). A referência E250GC_SIR diz respeito à escala (1:250.000) e origem georeferenciada dos mapas (Datum SIRGAS).

2.1 Pacotes necessários

Agora deve-se instalar os pacotes úteis para fazer os mapas. O R vem com alguns pacotes automaticamente instalados, mas outros pacotes púbicos devem ser chamados para realizar operações específicas. Um deles é o pacote rgdal.

library(rgdal)
library(maptools)
library(readxl)
library(spdep)
library(ctv)
library(sf)

O pacote rgdal já fornecerá a primeira função prática para fazer o mapa. Usa-se aqui a função readOGR e indica-se o nome do arquivo shape a ser buscado, neste caso, na pasta MS e o arquivo de nome 50MUE250GC_SIR. Neste caso, a base de municípios (indicado por MU). A saída (plot) mostra o mapa e as características básicas (79 municípios e 2 campos - nome e código do município).

MS.mu <- readOGR("MS", "50MUE250GC_SIR")
OGR data source with driver: ESRI Shapefile 
Source: "C:\Users\amrof\Downloads\reuniao22maio2020\MS", layer: "50MUE250GC_SIR"
with 79 features
It has 2 fields
plot(MS.mu)

Agora propõe-se colorir o mapa municipal com cores inserindo o valor do Coeficiente de Especialização - CE. Para tanto, será necessário o pacote sf. Colocaremos a saída dput() dos dados do CE calculado para os 79 municipios e 87 divisões CNAE, a partir dos dados de empregos do MTE/RAIS.

# pacotes chamados anteriormente
library(rgdal)
library(maptools)
library(readxl)
library(spdep)
library(ctv)
library(sf)

emprego_sf <- st_read("MS/50MUE250GC_SIR.shp")
Reading layer `50MUE250GC_SIR' from data source `C:\Users\amrof\Downloads\reuniao22maio2020\MS\50MUE250GC_SIR.shp' using driver `ESRI Shapefile'
Simple feature collection with 79 features and 2 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -58.16851 ymin: -24.06858 xmax: -50.92291 ymax: -17.16635
geographic CRS: SIRGAS 2000
# ou para ver apenas o contorno
plot(st_geometry(emprego_sf))

Agora usarei o comando merge para juntar os dados de CE ao objeto emprego_sf criado no último chunk (bloco de scripts).

ce_2016 <- structure(list(codmun = c("5000203", "5000252", "5000609", "5000708", 
    "5000807", "5000856", "5000906", "5001003", "5001102", "5001243", "5001508", 
    "5001904", "5002001", "5002100", "5002159", "5002209", "5002308", "5002407", 
    "5002605", "5002704", "5002803", "5002902", "5002951", "5003108", "5003157", 
    "5003207", "5003256", "5003306", "5003454", "5003488", "5003504", "5003702", 
    "5003751", "5003801", "5003900", "5004007", "5004106", "5004304", "5004403", 
    "5004502", "5004601", "5004700", "5004809", "5004908", "5005004", "5005103", 
    "5005152", "5005202", "5005251", "5005400", "5005608", "5005681", "5005707", 
    "5005806", "5006002", "5006200", "5006259", "5006275", "5006309", "5006358", 
    "5006408", "5006606", "5006903", "5007109", "5007208", "5007307", "5007406", 
    "5007505", "5007554", "5007695", "5007802", "5007703", "5007901", "5007935", 
    "5007950", "5007976", "5008008", "5008305", "5008404"), nomemun = c("Água Clara - MS", 
    "Alcinópolis - MS", "Amambai - MS", "Anastácio - MS", "Anaurilândia - MS", "Angélica - MS", 
    "Antônio João - MS", "Aparecida do Taboado - MS", "Aquidauana - MS", "Aral Moreira - MS", 
    "Bandeirantes - MS", "Bataguassu - MS", "Batayporã - MS", "Bela Vista - MS", 
    "Bodoquena - MS", "Bonito - MS", "Brasilândia - MS", "Caarapó - MS", "Camapuã - MS", 
    "Campo Grande - MS", "Caracol - MS", "Cassilândia - MS", "Chapadão do Sul - MS", 
    "Corguinho - MS", "Coronel Sapucaia - MS", "Corumbá - MS", "Costa Rica - MS", 
    "Coxim - MS", "Deodápolis - MS", "Dois Irmãos do Buriti - MS", "Douradina - MS", 
    "Dourados - MS", "Eldorado - MS", "Fátima do Sul - MS", "Figueirão - MS", "Glória de Dourados - MS", 
    "Guia Lopes da Laguna - MS", "Iguatemi - MS", "Inocência - MS", "Itaporã - MS", 
    "Itaquiraí - MS", "Ivinhema - MS", "Japorã - MS", "Jaraguari - MS", "Jardim - MS", 
    "Jateí - MS", "Juti - MS", "Ladário - MS", "Laguna Carapã - MS", "Maracaju - MS", 
    "Miranda - MS", "Mundo Novo - MS", "Naviraí - MS", "Nioaque - MS", "Nova Alvorada do Sul - MS", 
    "Nova Andradina - MS", "Novo Horizonte do Sul - MS", "Paraíso das Águas - MS", 
    "Paranaíba - MS", "Paranhos - MS", "Pedro Gomes - MS", "Ponta Porã - MS", "Porto Murtinho - MS", 
    "Ribas do Rio Pardo - MS", "Rio Brilhante - MS", "Rio Negro - MS", "Rio Verde de Mato Grosso - MS", 
    "Rochedo - MS", "Santa Rita do Pardo - MS", "São Gabriel do Oeste - MS", "Selvíria - MS", 
    "Sete Quedas - MS", "Sidrolândia - MS", "Sonora - MS", "Tacuru - MS", "Taquarussu - MS", 
    "Terenos - MS", "Três Lagoas - MS", "Vicentina - MS"), CE_2016 = c(0.5772, 0.5627, 
    0.2312, 0.4615, 0.4398, 0.7682, 0.5212, 0.4393, 0.2811, 0.4744, 0.4282, 0.4141, 
    0.3852, 0.3901, 0.4941, 0.4008, 0.4639, 0.3579, 0.3499, 0.19, 0.5811, 0.2847, 
    0.3367, 0.5722, 0.4153, 0.2426, 0.4267, 0.2797, 0.3323, 0.4934, 0.4316, 0.2656, 
    0.2798, 0.3251, 0.564, 0.3027, 0.3983, 0.3286, 0.4468, 0.3832, 0.4548, 0.2763, 
    0.6395, 0.5064, 0.2479, 0.6099, 0.4653, 0.6171, 0.5526, 0.2785, 0.3785, 0.3125, 
    0.2198, 0.431, 0.449, 0.2381, 0.3679, 0.5354, 0.3131, 0.4944, 0.4372, 0.1949, 
    0.5528, 0.5936, 0.4358, 0.4569, 0.3518, 0.5224, 0.5895, 0.344, 0.5973, 0.3571, 
    0.3364, 0.498, 0.4703, 0.6074, 0.4552, 0.3702, 0.5127)), class = c("tbl_df", 
    "tbl", "data.frame"), row.names = c(NA, -79L))

Aos leitores mais curiosos, uma boa leitura está em https://r-spatial.github.io/sf/articles/sf5.html.

emprego_sf_merged <- merge(emprego_sf, ce_2016, by.x = "CD_GEOCMU", by.y = "codmun")
names(emprego_sf_merged)
[1] "CD_GEOCMU"  "NM_MUNICIP" "nomemun"    "CE_2016"    "geometry"  
plot(emprego_sf_merged[, "CE_2016"], border = "red", axes = TRUE, main = "CE 2016 MS, 79obs", 
    breaks = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1))

Ou fazendo igual ao mapa de Figueiredo (2020), ou associar o objeto sf com o ggplot2::

library(ggplot2)
library("ggspatial")
ggplot() + geom_sf(data = emprego_sf_merged, aes(fill = CE_2016), color = NA, size = 0.15) + 
    labs(title = "CE 2016 dos Municípios de MS", caption = "Fonte: Elaboração própria", 
        size = 8) + scale_fill_distiller(palette = "RdGy", limits = c(0.1, 0.8), 
    name = "CE_2016") + theme_minimal() + annotation_north_arrow(location = "bl", 
    which_north = "true", pad_x = unit(0.65, "in"), pad_y = unit(0.3, "in"), style = north_arrow_fancy_orienteering) + 
    annotation_scale(location = "bl", width_hint = 0.3)

Ou usando o mapview conforme Pebesma (2018) e https://r-spatial.github.io/sf/articles/sf5.html:

library(mapview)
mapview(emprego_sf_merged["CE_2016"], col.regions = sf.colors(10))

Referências

ENGEL, Claudia A. Using Spatial Data with R. Disponível em: https://cengel.github.io/R-spatial/. 11 Feb, 2019.

FIGUEIREDO, Adriano Marcos Rodrigues. Economia Regional: polos, diversidade e especialização em R. Campo Grande-MS,Brasil: RStudio/Rpubs, 2019. Disponível em http://rpubs.com/amrofi/Regional_Economics_poles_diversity.

FIGUEIREDO, Adriano Marcos Rodrigues. Economia Regional em R: Indicadores de análise de especialização regional - QL, CE, KSI, RDI, DIV, UBIQ. Campo Grande-MS,Brasil: RStudio/Rpubs, 2020. Disponível em http://rpubs.com/amrofi/regional_parte_2 e https://adrianofigueiredo.netlify.app/post/economia-regional-em-r-indicadores-de-analise-2/.

PEBESMA, E., 2018. Simple Features for R: Standardized Support for Spatial Vector Data. The R Journal 10 (1), 439-446, https://doi.org/10.32614/RJ-2018-009.

LS0tDQp0aXRsZTogIkVjb25vbWlhIFJlZ2lvbmFsOiBNYXBhcyBkZSBDb2VmaWNpZW50ZSBkZSBFc3BlY2lhbGl6YcOnw6NvIGVtIFIiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbywgKmUtbWFpbDogYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIqIg0KbGlua2NvbG9yOiBibHVlDQphYnN0cmFjdDogDQogIFRoaXMgaXMgYW4gdW5kZXJncmFkIHN0dWRlbnQgbGV2ZWwgaW5zdHJ1Y3Rpb24gZm9yIGNsYXNzIHVzZS4NCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogZGVmYXVsdA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IGZhbHNlDQogICAgaGlnaGxpZ2h0OiAidGFuZ28iDQogICAgdXNlX2Jvb2tkb3duOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgbnVtYmVyX3NlY3Rpb25zOiBUUlVFDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KYGBge3Iga25pdHJfaW5pdCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KHJtZGZvcm1hdHMpDQoNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iMTAwIikNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwNCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwNCiAgICAgICAgICAgICAgIHRpZHk9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkNCm9wdHNfa25pdCRzZXQod2lkdGg9MTAwKQ0KYGBgDQoNCg0KTGljZW7Dp2Egey0jTGljZW7Dp2F9DQo9PT09PT09PT09PT09PT09PT09DQoNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQgPGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8+IG9yIHNlbmQgYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgUE8gQm94IDE4NjYsIE1vdW50YWluIFZpZXcsIENBIDk0MDQyLCBVU0EuDQoNCiFbTGljZW5zZTogQ0MgQlktU0EgNC4wXShodHRwczovL21pcnJvcnMuY3JlYXRpdmVjb21tb25zLm9yZy9wcmVzc2tpdC9idXR0b25zLzg4eDMxL3BuZy9ieS1zYS5wbmcpeyB3aWR0aD0yNSUgfQ0KDQoNCkNpdGHDp8OjbyB7LSNDaXRhw6fDo299DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpTdWdlc3TDo28gZGUgY2l0YcOnw6NvOg0KRklHVUVJUkVETywgQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzLiBFY29ub21pYSBSZWdpb25hbDogTWFwYXMgZGUgQ29lZmljaWVudGUgZGUgRXNwZWNpYWxpemHDp8OjbyBlbSBSLiBDYW1wbyBHcmFuZGUtTVMsQnJhc2lsOiBSU3R1ZGlvL1JwdWJzLCAyMDIwLiBEaXNwb27DrXZlbCBlbSA8aHR0cDovL3JwdWJzLmNvbS9hbXJvZmkvUmVnaW9uYWxfRWNvbm9taWNzX0NFbWFwcz4uIA0KDQpJbnRyb2R1w6fDo28NCj09PT09PT09PT09PT09PT09PT09PT0NCg0KUGFyYSByZWFsaXphciBzZXUgbWFwYSBlbSBSLCBpbmljaWFsbWVudGUgbyBsZWl0b3IgZGV2ZSBiYWl4YXIgb3MgcHJvZ3JhbWFzIGUgcGFjb3RlcyBuZWNlc3PDoXJpb3MgYW8gcHJvamV0by4gTmVzdGUgY2Fzbywgc3VnZXJlLXNlIHF1ZSB1dGlsaXplIG8gUlN0dWRpbyBlIG8gUiBhdHVhbGl6YWRvcywgYSBwYXJ0aXIgZGU6IGh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmcvYmluL3dpbmRvd3MvYmFzZS8gZSBodHRwczovL3d3dy5yc3R1ZGlvLmNvbS9wcm9kdWN0cy9yc3R1ZGlvL2Rvd25sb2FkMy8uIFF1YW5kbyBlc3RhIHJldmlzw6NvIGZvaSBmZWl0YSwgYSB2ZXJzw6NvIGRvIFJTdHVkaW8gZXJhIGEgX1JTdHVkaW8gRGVza3RvcCAxLjIuNTA0Ml8gZSBkbyBfUi00LjAgZm9yIFdpbmRvd3MgKDMyLzY0IGJpdClfLiANCg0KUHJpbWVpcm8gaW5zdGFsZSBvIFIgZSBwb3N0ZXJpb3JtZW50ZSBvIFJTdHVkaW8sIGRlIG1vZG8gcXVlIG8gc2VndW5kbyByZWNvbmhlw6dhIGF1dG9tYXRpY2FtZW50ZSBvIHByaW1laXJvLiBTZSB0dWRvIGVzdGl2ZXIgcGVyZmVpdG8sIGEgdGVsYSBpbmljaWFsIGRvIFJTdHVkaW8gbW9zdHJhcsOhIGNvcnJldGFtZW50ZSBhIHZlcnPDo28gZG8gUi4NCg0KDQpNYXBhcyBlbSBSDQo9PT09PT09PT09PT09PT09DQoNCkFnb3JhIGEgbWV0YSDDqSBnZXJhciB1bSBtYXBhIHNpbXBsZXMgZW0gUi4gUGFyYSB0YW50bywgcHJpbWVpcm8gZGVmaW5lLXNlIGEgbWFsaGEgbXVuaWNpcGFsIGRlc2VqYWRhLiBQYXJhIG8gcHJlc2VudGUgY2FzbywgdXRpbGl6YW0tc2UgYXMgbWFsaGFzIGRpZ2l0YWlzIGRvIElCR0UgZGUgaHR0cDovL21hcGFzLmliZ2UuZ292LmJyL2Jhc2VzLWUtcmVmZXJlbmNpYWlzL2Jhc2VzLWNhcnRvZ3JhZmljYXMvbWFsaGFzLWRpZ2l0YWlzLiBQcmltZWlybyBmYXotc2UgbyBkb3dubG9hZCBkbyBhcnF1aXZvIHppcCBjb21wbGV0byBwYXJhIE1hdG8gR3Jvc3NvIGRvIFN1bCAoTVMpLiBBIHBhcnRpciBkZSA8ZnRwOi8vZ2VvZnRwLmliZ2UuZ292LmJyL29yZ2FuaXphY2FvX2RvX3RlcnJpdG9yaW8vbWFsaGFzX3RlcnJpdG9yaWFpcy9tYWxoYXNfbXVuaWNpcGFpcy9tdW5pY2lwaW9fMjAxNS9VRnMvTVMvTVMuemlwPiwgIG8gYXJxdWl2byBmb2kgZGVzY29tcGFjdGFkbyBubyBtZXNtbyBkaXJldG9yaW8gZGUgdHJhYmFsaG8gZG8gcHJvamV0byBSLCBudW1hIHBhc3RhIGRlIG5vbWUgTVMuIE5lc3RlIGFycXVpdm8gemlwLCBleGlzdGVtIGFycXVpdm9zIHJlZmVyZW50ZXMgYSB1bmlkYWRlIGRhIGZlZGVyYcOnw6NvIDUwIHBhcmEgTWF0byBHcm9zc28gZG8gU3VsICg1MFVFKSwgYXNzaW0gY29tbyBwYXJhIGEgbWVzb3JyZWdpw6NvICg1ME1FKSwgbWljcm9ycmVnacOjbyAoNTBNSSkgZSBtdW5pY8OtcGlvcyAoNTBNVSkuIEEgcmVmZXLDqm5jaWEgRTI1MEdDX1NJUiBkaXogcmVzcGVpdG8gw6AgZXNjYWxhICgxOjI1MC4wMDApIGUgb3JpZ2VtIGdlb3JlZmVyZW5jaWFkYSBkb3MgbWFwYXMgKERhdHVtIFNJUkdBUykuIA0KDQojIyBQYWNvdGVzIG5lY2Vzc8Ohcmlvcw0KDQpBZ29yYSBkZXZlLXNlIGluc3RhbGFyIG9zIHBhY290ZXMgw7p0ZWlzIHBhcmEgZmF6ZXIgb3MgbWFwYXMuIE8gUiB2ZW0gY29tIGFsZ3VucyBwYWNvdGVzIGF1dG9tYXRpY2FtZW50ZSBpbnN0YWxhZG9zLCBtYXMgb3V0cm9zIHBhY290ZXMgcMO6Ymljb3MgZGV2ZW0gc2VyIGNoYW1hZG9zIHBhcmEgcmVhbGl6YXIgb3BlcmHDp8O1ZXMgZXNwZWPDrWZpY2FzLiBVbSBkZWxlcyDDqSBvIHBhY290ZSAqcmdkYWwqLg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShyZ2RhbCk7IGxpYnJhcnkobWFwdG9vbHMpOyBsaWJyYXJ5KHJlYWR4bCk7IGxpYnJhcnkoc3BkZXApOyBsaWJyYXJ5KGN0dik7IGxpYnJhcnkoc2YpIA0KYGBgDQoNCk8gcGFjb3RlICpyZ2RhbCogasOhIGZvcm5lY2Vyw6EgYSBwcmltZWlyYSBmdW7Dp8OjbyBwcsOhdGljYSBwYXJhIGZhemVyIG8gbWFwYS4gVXNhLXNlIGFxdWkgYSBmdW7Dp8OjbyAqcmVhZE9HUiogZSBpbmRpY2Etc2UgbyBub21lIGRvIGFycXVpdm8gc2hhcGUgYSBzZXIgYnVzY2FkbywgbmVzdGUgY2FzbywgbmEgcGFzdGEgTVMgZSBvIGFycXVpdm8gZGUgbm9tZSA1ME1VRTI1MEdDX1NJUi4gTmVzdGUgY2FzbywgYSBiYXNlIGRlIG11bmljw61waW9zIChpbmRpY2FkbyBwb3IgTVUpLiBBIHNhw61kYSAoKnBsb3QqKSBtb3N0cmEgbyBtYXBhIGUgYXMgY2FyYWN0ZXLDrXN0aWNhcyBiw6FzaWNhcyAoNzkgbXVuaWPDrXBpb3MgZSAyIGNhbXBvcyAtIG5vbWUgZSBjw7NkaWdvIGRvIG11bmljw61waW8pLg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KTVMubXUgPC0gcmVhZE9HUigiTVMiLCAiNTBNVUUyNTBHQ19TSVIiKQ0KcGxvdChNUy5tdSkNCmBgYA0KDQpBZ29yYSBwcm9ww7VlLXNlIGNvbG9yaXIgbyBtYXBhIG11bmljaXBhbCBjb20gY29yZXMgaW5zZXJpbmRvIG8gdmFsb3IgZG8gQ29lZmljaWVudGUgZGUgRXNwZWNpYWxpemHDp8OjbyAtIENFLiBQYXJhIHRhbnRvLCBzZXLDoSBuZWNlc3PDoXJpbyBvIHBhY290ZSAqc2YqLiBDb2xvY2FyZW1vcyBhIHNhw61kYSBkcHV0KCkgZG9zIGRhZG9zIGRvIENFIGNhbGN1bGFkbyBwYXJhIG9zIDc5IG11bmljaXBpb3MgZSA4NyBkaXZpc8O1ZXMgQ05BRSwgYSBwYXJ0aXIgZG9zIGRhZG9zIGRlIGVtcHJlZ29zIGRvIE1URS9SQUlTLiANCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiMgcGFjb3RlcyBjaGFtYWRvcyBhbnRlcmlvcm1lbnRlDQpsaWJyYXJ5KHJnZGFsKTtsaWJyYXJ5KG1hcHRvb2xzKTtsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoc3BkZXApO2xpYnJhcnkoY3R2KTtsaWJyYXJ5KHNmKSANCg0KZW1wcmVnb19zZiA8LSAgc3RfcmVhZCgiTVMvNTBNVUUyNTBHQ19TSVIuc2hwIikNCg0KIyBvdSBwYXJhIHZlciBhcGVuYXMgbyBjb250b3Jubw0KcGxvdChzdF9nZW9tZXRyeShlbXByZWdvX3NmKSkNCg0KYGBgDQoNCkFnb3JhIHVzYXJlaSBvIGNvbWFuZG8gYG1lcmdlYCBwYXJhIGp1bnRhciBvcyBkYWRvcyBkZSBDRSBhbyBvYmpldG8gYGVtcHJlZ29fc2ZgIGNyaWFkbyBubyDDumx0aW1vIGNodW5rIChibG9jbyBkZSBzY3JpcHRzKS4NCg0KYGBge3IgZGFkb3NfQ0V9DQpjZV8yMDE2PC0NCiAgc3RydWN0dXJlKGxpc3QoDQogICAgY29kbXVuID0gYygiNTAwMDIwMyIsICI1MDAwMjUyIiwgIjUwMDA2MDkiLCAiNTAwMDcwOCIsIA0KICAgICAgICAgICAgICAgIjUwMDA4MDciLCAiNTAwMDg1NiIsICI1MDAwOTA2IiwgIjUwMDEwMDMiLCAiNTAwMTEwMiIsICI1MDAxMjQzIiwgDQogICAgICAgICAgICAgICAiNTAwMTUwOCIsICI1MDAxOTA0IiwgIjUwMDIwMDEiLCAiNTAwMjEwMCIsICI1MDAyMTU5IiwgIjUwMDIyMDkiLCANCiAgICAgICAgICAgICAgICI1MDAyMzA4IiwgIjUwMDI0MDciLCAiNTAwMjYwNSIsICI1MDAyNzA0IiwgIjUwMDI4MDMiLCAiNTAwMjkwMiIsIA0KICAgICAgICAgICAgICAgIjUwMDI5NTEiLCAiNTAwMzEwOCIsICI1MDAzMTU3IiwgIjUwMDMyMDciLCAiNTAwMzI1NiIsICI1MDAzMzA2IiwgDQogICAgICAgICAgICAgICAiNTAwMzQ1NCIsICI1MDAzNDg4IiwgIjUwMDM1MDQiLCAiNTAwMzcwMiIsICI1MDAzNzUxIiwgIjUwMDM4MDEiLCANCiAgICAgICAgICAgICAgICI1MDAzOTAwIiwgIjUwMDQwMDciLCAiNTAwNDEwNiIsICI1MDA0MzA0IiwgIjUwMDQ0MDMiLCAiNTAwNDUwMiIsIA0KICAgICAgICAgICAgICAgIjUwMDQ2MDEiLCAiNTAwNDcwMCIsICI1MDA0ODA5IiwgIjUwMDQ5MDgiLCAiNTAwNTAwNCIsICI1MDA1MTAzIiwgDQogICAgICAgICAgICAgICAiNTAwNTE1MiIsICI1MDA1MjAyIiwgIjUwMDUyNTEiLCAiNTAwNTQwMCIsICI1MDA1NjA4IiwgIjUwMDU2ODEiLCANCiAgICAgICAgICAgICAgICI1MDA1NzA3IiwgIjUwMDU4MDYiLCAiNTAwNjAwMiIsICI1MDA2MjAwIiwgIjUwMDYyNTkiLCAiNTAwNjI3NSIsIA0KICAgICAgICAgICAgICAgIjUwMDYzMDkiLCAiNTAwNjM1OCIsICI1MDA2NDA4IiwgIjUwMDY2MDYiLCAiNTAwNjkwMyIsICI1MDA3MTA5IiwgDQogICAgICAgICAgICAgICAiNTAwNzIwOCIsICI1MDA3MzA3IiwgIjUwMDc0MDYiLCAiNTAwNzUwNSIsICI1MDA3NTU0IiwgIjUwMDc2OTUiLCANCiAgICAgICAgICAgICAgICI1MDA3ODAyIiwgIjUwMDc3MDMiLCAiNTAwNzkwMSIsICI1MDA3OTM1IiwgIjUwMDc5NTAiLCAiNTAwNzk3NiIsIA0KICAgICAgICAgICAgICAgIjUwMDgwMDgiLCAiNTAwODMwNSIsICI1MDA4NDA0IiksIA0KICAgIG5vbWVtdW4gPSBjKCLDgWd1YSBDbGFyYSAtIE1TIiwiQWxjaW7Ds3BvbGlzIC0gTVMiLCAiQW1hbWJhaSAtIE1TIiwgIkFuYXN0w6FjaW8gLSBNUyIsIA0KICAgICAgICAgICAgICAgICJBbmF1cmlsw6JuZGlhIC0gTVMiLCAiQW5nw6lsaWNhIC0gTVMiLCAiQW50w7RuaW8gSm/Do28gLSBNUyIsIA0KICAgICAgICAgICAgICAgICJBcGFyZWNpZGEgZG8gVGFib2FkbyAtIE1TIiwgDQogICAgICAgICAgICAgICAgIkFxdWlkYXVhbmEgLSBNUyIsICJBcmFsIE1vcmVpcmEgLSBNUyIsICJCYW5kZWlyYW50ZXMgLSBNUyIsIA0KICAgICAgICAgICAgICAgICJCYXRhZ3Vhc3N1IC0gTVMiLCAiQmF0YXlwb3LDoyAtIE1TIiwgIkJlbGEgVmlzdGEgLSBNUyIsICJCb2RvcXVlbmEgLSBNUyIsIA0KICAgICAgICAgICAgICAgICJCb25pdG8gLSBNUyIsICJCcmFzaWzDom5kaWEgLSBNUyIsICJDYWFyYXDDsyAtIE1TIiwgIkNhbWFwdcOjIC0gTVMiLCANCiAgICAgICAgICAgICAgICAiQ2FtcG8gR3JhbmRlIC0gTVMiLCAiQ2FyYWNvbCAtIE1TIiwgIkNhc3NpbMOibmRpYSAtIE1TIiwgIkNoYXBhZMOjbyBkbyBTdWwgLSBNUyIsIA0KICAgICAgICAgICAgICAgICJDb3JndWluaG8gLSBNUyIsICJDb3JvbmVsIFNhcHVjYWlhIC0gTVMiLCAiQ29ydW1iw6EgLSBNUyIsICJDb3N0YSBSaWNhIC0gTVMiLCANCiAgICAgICAgICAgICAgICAiQ294aW0gLSBNUyIsICJEZW9kw6Fwb2xpcyAtIE1TIiwgIkRvaXMgSXJtw6NvcyBkbyBCdXJpdGkgLSBNUyIsIA0KICAgICAgICAgICAgICAgICJEb3VyYWRpbmEgLSBNUyIsICJEb3VyYWRvcyAtIE1TIiwgIkVsZG9yYWRvIC0gTVMiLCAiRsOhdGltYSBkbyBTdWwgLSBNUyIsIA0KICAgICAgICAgICAgICAgICJGaWd1ZWlyw6NvIC0gTVMiLCAiR2zDs3JpYSBkZSBEb3VyYWRvcyAtIE1TIiwgIkd1aWEgTG9wZXMgZGEgTGFndW5hIC0gTVMiLCANCiAgICAgICAgICAgICAgICAiSWd1YXRlbWkgLSBNUyIsICJJbm9jw6puY2lhIC0gTVMiLCAiSXRhcG9yw6MgLSBNUyIsICJJdGFxdWlyYcOtIC0gTVMiLCANCiAgICAgICAgICAgICAgICAiSXZpbmhlbWEgLSBNUyIsICJKYXBvcsOjIC0gTVMiLCAiSmFyYWd1YXJpIC0gTVMiLCAiSmFyZGltIC0gTVMiLCANCiAgICAgICAgICAgICAgICAiSmF0ZcOtIC0gTVMiLCAiSnV0aSAtIE1TIiwgIkxhZMOhcmlvIC0gTVMiLCAiTGFndW5hIENhcmFww6MgLSBNUyIsIA0KICAgICAgICAgICAgICAgICJNYXJhY2FqdSAtIE1TIiwgIk1pcmFuZGEgLSBNUyIsICJNdW5kbyBOb3ZvIC0gTVMiLCAiTmF2aXJhw60gLSBNUyIsIA0KICAgICAgICAgICAgICAgICJOaW9hcXVlIC0gTVMiLCAiTm92YSBBbHZvcmFkYSBkbyBTdWwgLSBNUyIsICJOb3ZhIEFuZHJhZGluYSAtIE1TIiwgDQogICAgICAgICAgICAgICAgIk5vdm8gSG9yaXpvbnRlIGRvIFN1bCAtIE1TIiwgIlBhcmHDrXNvIGRhcyDDgWd1YXMgLSBNUyIsICJQYXJhbmHDrWJhIC0gTVMiLCANCiAgICAgICAgICAgICAgICAiUGFyYW5ob3MgLSBNUyIsICJQZWRybyBHb21lcyAtIE1TIiwgIlBvbnRhIFBvcsOjIC0gTVMiLCAiUG9ydG8gTXVydGluaG8gLSBNUyIsIA0KICAgICAgICAgICAgICAgICJSaWJhcyBkbyBSaW8gUGFyZG8gLSBNUyIsICJSaW8gQnJpbGhhbnRlIC0gTVMiLCAiUmlvIE5lZ3JvIC0gTVMiLCANCiAgICAgICAgICAgICAgICAiUmlvIFZlcmRlIGRlIE1hdG8gR3Jvc3NvIC0gTVMiLCAiUm9jaGVkbyAtIE1TIiwgIlNhbnRhIFJpdGEgZG8gUGFyZG8gLSBNUyIsIA0KICAgICAgICAgICAgICAgICJTw6NvIEdhYnJpZWwgZG8gT2VzdGUgLSBNUyIsICJTZWx2w61yaWEgLSBNUyIsICJTZXRlIFF1ZWRhcyAtIE1TIiwgDQogICAgICAgICAgICAgICAgIlNpZHJvbMOibmRpYSAtIE1TIiwgIlNvbm9yYSAtIE1TIiwgIlRhY3VydSAtIE1TIiwgIlRhcXVhcnVzc3UgLSBNUyIsIA0KICAgICAgICAgICAgICAgICJUZXJlbm9zIC0gTVMiLCAiVHLDqnMgTGFnb2FzIC0gTVMiLCAiVmljZW50aW5hIC0gTVMiKSwgDQogICAgQ0VfMjAxNiA9IGMoMC41NzcyLCAwLjU2MjcsIDAuMjMxMiwgMC40NjE1LCAwLjQzOTgsIDAuNzY4MiwgMC41MjEyLCAwLjQzOTMsIDAuMjgxMSwgDQogICAgICAgICAgICAgICAgMC40NzQ0LCAwLjQyODIsIDAuNDE0MSwgMC4zODUyLCAwLjM5MDEsIDAuNDk0MSwgMC40MDA4LCAwLjQ2MzksIA0KICAgICAgICAgICAgICAgIDAuMzU3OSwgMC4zNDk5LCAwLjE5LCAwLjU4MTEsIDAuMjg0NywgMC4zMzY3LCAwLjU3MjIsIDAuNDE1MywgDQogICAgICAgICAgICAgICAgMC4yNDI2LCAwLjQyNjcsIDAuMjc5NywgMC4zMzIzLCAwLjQ5MzQsIDAuNDMxNiwgMC4yNjU2LCAwLjI3OTgsIA0KICAgICAgICAgICAgICAgIDAuMzI1MSwgMC41NjQsIDAuMzAyNywgMC4zOTgzLCAwLjMyODYsIDAuNDQ2OCwgMC4zODMyLCAwLjQ1NDgsIA0KICAgICAgICAgICAgICAgIDAuMjc2MywgMC42Mzk1LCAwLjUwNjQsIDAuMjQ3OSwgMC42MDk5LCAwLjQ2NTMsIDAuNjE3MSwgMC41NTI2LCANCiAgICAgICAgICAgICAgICAwLjI3ODUsIDAuMzc4NSwgMC4zMTI1LCAwLjIxOTgsIDAuNDMxLCAwLjQ0OSwgMC4yMzgxLCAwLjM2NzksIA0KICAgICAgICAgICAgICAgIDAuNTM1NCwgMC4zMTMxLCAwLjQ5NDQsIDAuNDM3MiwgMC4xOTQ5LCAwLjU1MjgsIDAuNTkzNiwgMC40MzU4LCANCiAgICAgICAgICAgICAgICAwLjQ1NjksIDAuMzUxOCwgMC41MjI0LCAwLjU4OTUsIDAuMzQ0LCAwLjU5NzMsIDAuMzU3MSwgMC4zMzY0LCANCiAgICAgICAgICAgICAgICAwLjQ5OCwgMC40NzAzLCAwLjYwNzQsIDAuNDU1MiwgMC4zNzAyLCAwLjUxMjcpKSwgDQogICAgY2xhc3MgPSBjKCJ0YmxfZGYiLCAidGJsIiwgImRhdGEuZnJhbWUiKSwgcm93Lm5hbWVzID0gYyhOQSwgLTc5TCkpDQpgYGANCg0KQW9zIGxlaXRvcmVzIG1haXMgY3VyaW9zb3MsIHVtYSBib2EgbGVpdHVyYSBlc3TDoSBlbSA8aHR0cHM6Ly9yLXNwYXRpYWwuZ2l0aHViLmlvL3NmL2FydGljbGVzL3NmNS5odG1sPi4NCg0KYGBge3IgbWVyZ2V9DQplbXByZWdvX3NmX21lcmdlZCA8LSBtZXJnZShlbXByZWdvX3NmLCBjZV8yMDE2LCBieS54ID0gIkNEX0dFT0NNVSIsIGJ5LnkgPSAiY29kbXVuIikNCm5hbWVzKGVtcHJlZ29fc2ZfbWVyZ2VkKQ0KcGxvdChlbXByZWdvX3NmX21lcmdlZFssICJDRV8yMDE2Il0sIA0KICAgICBib3JkZXIgPSAicmVkIiwgYXhlcyA9IFRSVUUsIG1haW4gPSAiQ0UgMjAxNiBNUywgNzlvYnMiLA0KICAgICBicmVha3MgPSBjKDAsLjEsLjIsLjMsLjQsLjUsLjYsLjcsLjgsLjksMSkpDQpgYGANCg0KT3UgZmF6ZW5kbyBpZ3VhbCBhbyBtYXBhIGRlIEZpZ3VlaXJlZG8gKDIwMjApLCBvdSBhc3NvY2lhciBvIG9iamV0byBgc2ZgIGNvbSBvIGBnZ3Bsb3QyYDo6DQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSgiZ2dzcGF0aWFsIikNCmdncGxvdCgpICsgZ2VvbV9zZihkYXRhID0gZW1wcmVnb19zZl9tZXJnZWQsIGFlcyhmaWxsID0gQ0VfMjAxNiksIGNvbG9yID0gTkEsIHNpemUgPSAwLjE1KSArIA0KICAgIGxhYnModGl0bGUgPSAiQ0UgMjAxNiBkb3MgTXVuaWPDrXBpb3MgZGUgTVMiLCBjYXB0aW9uID0gIkZvbnRlOiBFbGFib3Jhw6fDo28gcHLDs3ByaWEiLCANCiAgICAgICAgc2l6ZSA9IDgpICsgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZEd5IiwgbGltaXRzID0gYygwLjEsIDAuOCksIA0KICAgIG5hbWUgPSAiQ0VfMjAxNiIpICsgdGhlbWVfbWluaW1hbCgpICsgYW5ub3RhdGlvbl9ub3J0aF9hcnJvdyhsb2NhdGlvbiA9ICJibCIsIHdoaWNoX25vcnRoID0gInRydWUiLCANCiAgICBwYWRfeCA9IHVuaXQoMC42NSwgImluIiksIHBhZF95ID0gdW5pdCgwLjMsICJpbiIpLCBzdHlsZSA9IG5vcnRoX2Fycm93X2ZhbmN5X29yaWVudGVlcmluZykgKyANCiAgICBhbm5vdGF0aW9uX3NjYWxlKGxvY2F0aW9uID0gImJsIiwgd2lkdGhfaGludCA9IDAuMykNCmBgYA0KDQpPdSB1c2FuZG8gbyBgbWFwdmlld2AgY29uZm9ybWUgUGViZXNtYSAoMjAxOCkgZSA8aHR0cHM6Ly9yLXNwYXRpYWwuZ2l0aHViLmlvL3NmL2FydGljbGVzL3NmNS5odG1sPjoNCg0KYGBge3J9DQpsaWJyYXJ5KG1hcHZpZXcpDQptYXB2aWV3KGVtcHJlZ29fc2ZfbWVyZ2VkWyJDRV8yMDE2Il0sIGNvbC5yZWdpb25zID0gc2YuY29sb3JzKDEwKSkNCmBgYA0KDQpSZWZlcsOqbmNpYXMgey0jUmVmZXLDqm5jaWFzfQ0KPT09PT09PT09PT09PT09PT09PT09PT09DQoNCg0KRU5HRUwsIENsYXVkaWEgQS4gVXNpbmcgU3BhdGlhbCBEYXRhIHdpdGggUi4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL2NlbmdlbC5naXRodWIuaW8vUi1zcGF0aWFsLz4uIDExIEZlYiwgMjAxOS4NCg0KRklHVUVJUkVETywgQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzLiBFY29ub21pYSBSZWdpb25hbDogcG9sb3MsIGRpdmVyc2lkYWRlIGUgZXNwZWNpYWxpemHDp8OjbyBlbSBSLiBDYW1wbyBHcmFuZGUtTVMsQnJhc2lsOiBSU3R1ZGlvL1JwdWJzLCAyMDE5LiBEaXNwb27DrXZlbCBlbSBodHRwOi8vcnB1YnMuY29tL2Ftcm9maS9SZWdpb25hbF9FY29ub21pY3NfcG9sZXNfZGl2ZXJzaXR5Lg0KDQpGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuIEVjb25vbWlhIFJlZ2lvbmFsIGVtIFI6IEluZGljYWRvcmVzIGRlIGFuw6FsaXNlIGRlIGVzcGVjaWFsaXphw6fDo28gcmVnaW9uYWwgLSBRTCwgQ0UsIEtTSSwgUkRJLCBESVYsIFVCSVEuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMjAuIERpc3BvbsOtdmVsIGVtIGh0dHA6Ly9ycHVicy5jb20vYW1yb2ZpL3JlZ2lvbmFsX3BhcnRlXzIgZSBodHRwczovL2Fkcmlhbm9maWd1ZWlyZWRvLm5ldGxpZnkuYXBwL3Bvc3QvZWNvbm9taWEtcmVnaW9uYWwtZW0tci1pbmRpY2Fkb3Jlcy1kZS1hbmFsaXNlLTIvLg0KDQpQRUJFU01BLCBFLiwgMjAxOC4gU2ltcGxlIEZlYXR1cmVzIGZvciBSOiBTdGFuZGFyZGl6ZWQgU3VwcG9ydCBmb3IgU3BhdGlhbCBWZWN0b3IgRGF0YS4gVGhlIFIgSm91cm5hbCAxMCAoMSksIDQzOS00NDYsIGh0dHBzOi8vZG9pLm9yZy8xMC4zMjYxNC9SSi0yMDE4LTAwOS4=