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

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Economia Regional: Índice de concentração normalizado (ICN) em R. Campo Grande-MS,Brasil: RStudio/Rpubs, 2021. Disponível em <http://rpubs.com/amrofi/Regional_Economics_icn>. DOI: 10.13140/RG.2.2.12564.63360

1 Introdução

1.1 Videoaulas

ECONOMIA REGIONAL 2021.1: 05 Perroux e os polos de crescimento - video teórico de polos de crescimento.

ECONOMIA REGIONAL 2021.1: 05 Perroux: Exercicio QL diversidade ubiquidade MS - video aplicado

ECONOMIA REGIONAL 2021.1: 05 ICN APL Polo - video aplicado específico sobre este post!

1.2 Ideia Básica

A ideia básica deste arquivo é orientar os procedimentos para o cálculo dos indicadores de análise regional a saber:

  1. Quociente Locacional (QL)
  2. Índice de Herfindahl-Hirschman Modificado (IHH)
  3. Participação Relativa (PR)
  4. Índice de Concentração Normalizado (ICN)

Para a maioria dos casos, os dados serão de Emprego Setorial (E) conforme as classes CNAE 2.0, por município de Mato Grosso. Neste caso, os dados são para a Criação de bovinos. Existem rotinas para a obtenção eletrônica desses dados, mas por hora eles serão trazidos já preparados em planilha eletrônica tipo MS Excel.

2 Procedimentos

2.1 Carregar os dados e pacotes

Os dados precisam ser organizados previamente para ter a primeira coluna como nome dos municípios, a segunda coluna tem os dados do setor por município, a terceira coluna tem o total do município, ao final dos municípios tem uma linha de total, neste caso sao 141 municípios de MT. A primeira linha tem os rótulos “Munic” “bovinos” “Total”.

Usarei o pacote readxl para chamar os dados, o pacote knitr para organizar as tabelas de saídas, e o pacote psych para rodar os componentes principais no cálculo do ICN.

2.2 Quociente Locacional (QL)

Para os próximos indicadores, necessita-se dos dados de emprego por setor em cada município de MT. Desta forma, chama-se a planilha já preparada com os dados da base de informações RAIS do Ministério do Trabalho e Emprego do Brasil (MTE). Um meio de obter tais informações eletronicamente é pelo pacote raisr. Outra forma é pela página http://bi.mte.gov.br/bgcaged/login.php.

A RAIS possui os dados para o final de cada ano (dezembro), portanto, os saldos de empregados ocupados. A CAGED apresenta outro tipo de informação, a de ligados e desligados, invés do saldo de pessoas ocupadas. Utilizaremos os dados da RAIS por vínculos, por Classe CNAE 2.0 e por município.

O Quociente Locacional (QL) é uma medida que dá a informação de qual o setor mais representado no município (região de análise) quando comparado com o mesmo setor no estado (região de referência). Foi elaborado inicialmente por Haig (1928) e vem sendo muito utilizado em várias análises regionais e de localização industrial. Também chamado de Índice de Revealed Comparative Advantage (RCA – ou Vantagem comparativa revelada, VCR) seguindo Balasa (1965), ou índice de Hoover-Balassa.

A expressão básica é:

\[ QL_{ki}= { {\left( {\frac{{{E_{ki}}}}{{{E_i}}} } \right)}} / { {\left( {\frac{{{E_{k}}}}{{{E}}} } \right)}} \]

em que: \({E_{ki}}\) é o emprego no setor \(k\) na localidade de análise \(i\); \({E_i}\) é o emprego total na localidade de análise \(i\); \({E_k}\) é o emprego no setor \(k\) da localidade de referência; e \(E\) é o emprego total da localidade de referência.

A ideia é saber se na localidade de análise, a proporção do emprego do setor é maior ou menor que esta proporção no local de referência. Assim, se o resultado for maior que hum \(\left( {QL_{ki}}\gt 1\right)\), então diz-se que a localidade de análise é relativamente mais especializada nesse setor que a localidade de refência. De outro lado, valores menores que a unidade \(\left( {QL_{ki}}\lt 1\right)\) indicam que a localidade analisada tem representação menor deste setor do que a representação deste na localidade de referência.

2.3 Índice de Herfindahl-Hirschman Modificado (IHH)

O índice de Herfindahl-Hirschman Modificado (IHH) ou como Crocco et al. (2003) chama de (HHm) faz uma relação parecida com a do QL, conforme a expressão:

\[ IHH_{ki} = HHm_{ki}= { {\left( {\frac{{{E_{ki}}}}{{{E_k}}} - \frac{{{E_i}}}{E}} \right)}} \]

Atentar que este índice é dito modificado porque não faz a soma dos quadrados da diferença da expressão acima, que seria o IHH convencional (Crocco et al., 2003).

2.4 Participação Relativa (PR)

A participação relativa é outro componente para o cálculo do ICN, e será obtido com os mesmos dados anteriores por meio da expressão (Crocco et al., 2003):

\[ PR_{ki} = { {\left( {\frac{{{E_{ki}}}}{{{E_k}}} } \right)}} \]

2.5 Índice de Concentração Normalizado (ICN)

Finalmente, o ICN será um índice composto dos três indicadores anteriores: QL, IHH e PR. Conforme Crocco et al. (2003) e DALLEMOLE (2007) entre outros trabalhos. O ICN será uma ponderação dos três indicadores, cujos pesos são obtidos por um procedimento baseado nos componentes principais, mas não serão exatamente os scores, conforme delineado por Crocco et al. (2003). Esta combinação utilizará os indicadores padronizados de Ql, IHH e PR, fazendo: 1) uma aplicação de componentes principais obtendo a matriz de componentes rotacionados (loadings do pacote psych::principal());
2) fazendo uma matriz normalizada da matriz de componentes rotacionados;
3) fazendo uma multiplicação matricial da matriz normalizada pela matriz (ou vetor coluna) dos autovalores (a Proportion Var) resultante de psych::principal();
4) cálculo dos pesos \(\Theta(\theta_{QL},\theta_{IHH},\theta_{PR}\) de cada componente original (QL, IHH, PR);
5) cálculo de ICN de cada município i e setor k fazendo:

\[ ICN_{ki} = \theta_{QL}*QL_{ki}+\theta_{IHH}*IHH_{ki}+\theta_{PR}*PR_{ki} \]

O texto de Crocco et al. (2003) ressalta a importância do ICN em casos em que o município de porte muito maior pode distorcer a análise quando se usa apenas QL ou PR.

Entretanto, em muitas situações, os pesos \(\Theta\) poderão indicar apenas um valor aproximado de \(1/3\), indicando que a mera média aritmética entre QL, IHH e PR seria suficiente. A nossa prática indica que em vários casos a média é sim suficiente, mas o pesquisador deve estar atento a casos particulares de concentração em algum setor com localidades de porte muito distinto. Ou seja, cuidado.

3 Rotina de cálculo

3.1 Cálculo dos componentes originais

Primeiro, chamamos os dados. Atentar para a presença de coluna de Total e para a linha do Total. Os dados foram colocados embedded no code.

library(readxl)
ICN_Sala <- read_excel("ICN Sala.xlsx", sheet = "R")
knitr::kable(ICN_Sala)
Munic bovinos Total
Acorizal 45 238
Agua Boa 551 3633
Alta Floresta 1272 9571
Alto Araguaia 215 2588
Alto Boa Vista 72 408
Alto Garcas 94 2072
Alto Paraguai 36 295
Alto Taquari 35 1878
Apiacas 196 1142
Araguaiana 260 568
Araguainha 19 234
Araputanga 373 2876
Arenapolis 63 854
Aripuana 335 2883
Barao de Melgaco 152 492
Barra do Bugres 411 5130
Barra do Garcas 1020 11613
Bom Jesus do Araguaia 63 501
Brasnorte 253 2618
Caceres 1412 11764
Campinapolis 171 768
Campo Novo do Parecis 42 6883
Campo Verde 107 7311
Campos de Julio 8 1367
Canabrava do Norte 57 393
Canarana 481 2988
Carlinda 173 756
Castanheira 147 629
Chapada dos Guimaraes 149 1997
Claudia 27 2008
Cocalinho 465 991
Colider 239 4499
Colniza 35 1870
Comodoro 475 2794
Confresa 85 1420
Conquista D’Oeste 100 589
Cotriguacu 79 1230
Cuiaba 771 204915
Curvelândia 9 256
Denise 99 780
Diamantino 115 6371
Dom Aquino 152 1420
Feliz Natal 26 1660
Figueiropolis D Oeste 88 383
Gaucha do Norte 157 756
General Carneiro 102 718
Gloria D’oeste 59 273
Guaranta do Norte 172 2818
Guiratinga 169 1321
Indiavai 75 279
Ipiranga do Norte 46 1031
Itanhanga 5 405
Itauba 208 946
Itiquira 274 3204
Jaciara 157 5011
Jangada 56 718
Jauru 202 853
Juara 884 5303
Juina 420 5370
Juruena 140 1086
Juscimeira 252 1127
Lambari D’oeste 190 1038
Lucas do Rio Verde 6 14104
Luciara 29 224
Vila Bela da Santissima Trindade 1022 1946
Marcelandia 201 1830
Matupa 172 2742
Mirassol Doeste 265 4911
Nobres 76 1997
Nortelandia 26 579
Nossa Senhora do Livramento 195 892
Nova Bandeirantes 255 1036
Nova Nazaré 74 254
Nova Lacerda 186 794
Nova Santa Helena 141 487
Nova Brasilandia 141 437
Nova Canaa do Norte 402 1295
Nova Mutum 177 10337
Nova Olimpia 103 4408
Nova Ubirata 81 2049
Nova Xavantina 363 1937
Novo Mundo 229 632
Novo Horizonte do Norte 24 226
Novo Sao Joaquim 140 1586
Paranaita 340 1173
Paranatinga 542 3289
Novo Santo Antonio 10 84
Pedra Preta 409 3946
Peixoto de Azevedo 172 1812
Planalto da Serra 110 337
Pocone 491 2782
Pontal do Araguaia 123 549
Ponte Branca 15 118
Pontes e Lacerda 1113 5920
Porto Alegre do Norte 31 638
Porto dos Gauchos 167 916
Porto Esperidiao 529 1492
Porto Estrela 128 401
Poxoreo 422 1955
Primavera do Leste 174 13069
Querencia 254 2436
Sao Jose dos Quatro Marcos 168 2448
Reserva do Cabacal 6 186
Ribeirao Cascalheira 254 815
Ribeiraozinho 15 251
Rio Branco 93 488
Santa Carmem 40 631
Santo Afonso 60 290
Sao Jose do Povo 63 304
Sao Jose do Rio Claro 151 2704
Sao Jose do Xingu 427 946
Sao Pedro da Cipa 11 938
Rondolandia 244 716
Rondonopolis 809 41066
Rosario Oeste 188 1465
Santa Cruz do Xingu 70 292
Salto do Ceu 88 449
Santa Rita do Trivelato 22 798
Santa Terezinha 238 748
Santo Antonio do Leste 59 732
Santo Antonio do Leverger 575 3946
Sao Felix do Araguaia 258 1404
Sapezal 31 5831
Serra Nova Dourada 20 79
Sinop 205 25469
Sorriso 54 16098
Tabapora 159 1554
Tangara da Serra 644 17268
Tapurah 108 2677
Terra Nova do Norte 104 977
Tesouro 97 392
Torixoreu 143 559
Uniao do Sul 36 548
Vale de São Domingos 11 37
Varzea Grande 196 38718
Vera 41 1747
Vila Rica 440 2198
Nova Guarita 41 302
Nova Marilandia 86 450
Nova Maringa 131 1043
Nova Monte Verde 429 1382
Total 30698 622459

3.2 Carregar funções

Utilizando funções por nós preparadas, carregar as funções para a memória do RStudio. Em todas, a função requer quatro argumentos:e_ki, e_i, e_k, e. Em um próximo desenvolvimento devo agregar as três funções em uma só!

# QL = quociente locacional
QL <- function(e_ki, e_i, e_k, e) {
    
    s_ki <- e_ki/e_i
    
    s_i <- e_k/e
    
    LQ <- s_ki/s_i
    
    return(LQ)
}
# IHH = Indice Herfindahl-Hirschman modificado
IHH <- function(e_ki, e_i, e_k, e) {
    
    s_ki <- e_ki/e_k
    
    s_i <- e_i/e
    
    IHH <- s_ki - s_i
    
    return(IHH)
}
# PR = participacao relativa
PR <- function(e_ki, e_i, e_k, e) {
    
    
    s_ki <- e_ki/e_k
    
    PR <- s_ki
    
    return(PR)
}

3.3 Cálculo dos componentes (QL, IHH, PR)

Atentar que os cálculos não estão generalizados para o número de municípios. Ou seja, se tiver 79 municípios em MS, precisará alterar o 141 de MT para 79 de MS. Fica a dica para usar o genérico length() em um próximo desenvolvimento destas funções. O chunk abaixo é genérico e computa o valor dos argumentos E (emprego total da localidade de referência), ei (o emprego total da localidade i), e Ek (o emprego total da localidade de referência do setor k). Estes argumentos serão utilizados nas três funções.

dados <- ICN_Sala  # apenas mudei o nome do dataset para dados
# JÁ COLOQUEI O TOTAL NOS DADOS
E <- colSums(dados[1:141, 3], dims = 1)  # conferir resultado com o total da coluna Total
ei <- dados[1:141, 3]  # coluna do Total para 141 municipios de MT
# ei é o emprego total da localidade i, E é o emprego total da referência Ek é o
# emprego total da referência do setor k
Ek <- t(colSums(dados[1:141, 2], dims = 1))  # total da coluna do setor bovinos

3.3.1 QL

# ql
ql.mt <- QL(dados[1:141, 2], ei, Ek[1, 1], E)
head(ql.mt)  # primeiras 6 linhas de QL
class(ql.mt)
[1] "data.frame"

3.3.2 IHH

IHH.mt <- IHH(dados[1:141, 2], ei, Ek[1, 1], E)
head(IHH.mt)  # primeiras 6 linhas de IHH
class(IHH.mt)
[1] "data.frame"

3.3.3 PR

PR.mt <- PR(dados[1:141, 2], ei, Ek[1, 1], E)
PR.mt <- as.data.frame(PR.mt)
head(PR.mt)  # primeiras 6 linhas de PR
class(PR.mt)
[1] "data.frame"

3.3.4 Tabela dos componentes originais (não padronizados)

# tabela
componentes <- cbind(Munic = dados[1:141, 1], QL = ql.mt, IHH = IHH.mt, PR = PR.mt)
colnames(componentes) <- c("Municipio", "QL", "IHH", "PR")
knitr::kable(componentes)
Municipio QL IHH PR
Acorizal 3.8338598 0.0010835 0.0014659
Agua Boa 3.0752956 0.0121125 0.0179491
Alta Floresta 2.6948244 0.0260598 0.0414359
Alto Araguaia 1.6845149 0.0028460 0.0070037
Alto Boa Vista 3.5782691 0.0016900 0.0023454
Alto Garcas 0.9198961 -0.0002666 0.0030621
Alto Paraguai 2.4744641 0.0006988 0.0011727
Alto Taquari 0.3778967 -0.0018769 0.0011401
Apiacas 3.4800913 0.0045501 0.0063848
Araguaiana 9.2816605 0.0075571 0.0084696
Araguainha 1.6464116 0.0002430 0.0006189
Araputanga 2.6297873 0.0075302 0.0121506
Arenapolis 1.4958338 0.0006803 0.0020523
Aripuana 2.3561386 0.0062811 0.0109128
Barao de Melgaco 6.2643953 0.0041610 0.0049515
Barra do Bugres 1.6245202 0.0051470 0.0133885
Barra do Garcas 1.7809692 0.0145703 0.0332269
Bom Jesus do Araguaia 2.5497846 0.0012474 0.0020523
Brasnorte 1.9595283 0.0040357 0.0082416
Caceres 2.4337746 0.0270972 0.0459965
Campinapolis 4.5147693 0.0043366 0.0055704
Campo Novo do Parecis 0.1237292 -0.0096896 0.0013682
Campo Verde 0.2967616 -0.0082598 0.0034856
Campos de Julio 0.1186649 -0.0019355 0.0002606
Canabrava do Norte 2.9409184 0.0012254 0.0018568
Canarana 3.2641128 0.0108685 0.0156688
Carlinda 4.6400747 0.0044210 0.0056355
Castanheira 4.7387889 0.0037781 0.0047886
Chapada dos Guimaraes 1.5128953 0.0016455 0.0048537
Claudia 0.2726470 -0.0023464 0.0008795
Cocalinho 9.5143685 0.0135555 0.0151476
Colider 1.0771659 0.0005577 0.0077855
Colniza 0.3795134 -0.0018641 0.0011401
Comodoro 3.4472111 0.0109847 0.0154733
Confresa 1.2137556 0.0004876 0.0027689
Conquista D’Oeste 3.4425906 0.0023113 0.0032575
Cotriguacu 1.3023348 0.0005974 0.0025735
Cuiaba 0.0762924 -0.3040868 0.0251156
Curvelândia 0.7128583 -0.0001181 0.0002932
Denise 2.5736013 0.0019719 0.0032250
Diamantino 0.3660083 -0.0064890 0.0037462
Dom Aquino 2.1704806 0.0026702 0.0049515
Feliz Natal 0.3175893 -0.0018199 0.0008470
Figueiropolis D Oeste 4.6589126 0.0022513 0.0028666
Gaucha do Norte 4.2109349 0.0038998 0.0051143
General Carneiro 2.8805565 0.0021692 0.0033227
Gloria D’oeste 4.3821782 0.0014834 0.0019219
Guaranta do Norte 1.2376223 0.0010758 0.0056030
Guiratinga 2.5940871 0.0033830 0.0055052
Indiavai 5.4507684 0.0019949 0.0024432
Ipiranga do Norte 0.9046901 -0.0001579 0.0014985
Itanhanga 0.2503316 -0.0004878 0.0001629
Itauba 4.4583367 0.0052559 0.0067757
Itiquira 1.7340385 0.0037783 0.0089257
Jaciara 0.6352957 -0.0029360 0.0051143
Jangada 1.5814820 0.0006707 0.0018242
Jauru 4.8017883 0.0052099 0.0065802
Juara 3.3801137 0.0202772 0.0287967
Juina 1.5858995 0.0050546 0.0136817
Juruena 2.6139596 0.0028159 0.0045606
Juscimeira 4.5339559 0.0063984 0.0082090
Lambari D’oeste 3.7115637 0.0045217 0.0061893
Lucas do Rio Verde 0.0086260 -0.0224631 0.0001955
Luciara 2.6251290 0.0005848 0.0009447
Vila Bela da Santissima Trindade 10.6489976 0.0301658 0.0332921
Marcelandia 2.2271304 0.0036077 0.0065477
Matupa 1.2719255 0.0011979 0.0056030
Mirassol Doeste 1.0941494 0.0007428 0.0086325
Nobres 0.7716781 -0.0007325 0.0024757
Nortelandia 0.9105325 -0.0000832 0.0008470
Nossa Senhora do Livramento 4.4327213 0.0049192 0.0063522
Nova Bandeirantes 4.9909256 0.0066424 0.0083067
Nova Nazaré 5.9074312 0.0020025 0.0024106
Nova Lacerda 4.7499945 0.0047834 0.0060590
Nova Santa Helena 5.8707126 0.0038108 0.0045931
Nova Brasilandia 6.5424189 0.0038911 0.0045931
Nova Canaa do Norte 6.2944379 0.0110149 0.0130953
Nova Mutum 0.3471998 -0.0108409 0.0057658
Nova Olimpia 0.4738014 -0.0037263 0.0033553
Nova Ubirata 0.8015742 -0.0006532 0.0026386
Nova Xavantina 3.7999482 0.0087130 0.0118249
Novo Mundo 7.3471528 0.0064444 0.0074598
Novo Horizonte do Norte 2.1532947 0.0004187 0.0007818
Novo Sao Joaquim 1.7898866 0.0020126 0.0045606
Paranaita 5.8773503 0.0091912 0.0110756
Paranatinga 3.3414586 0.0123720 0.0176559
Novo Santo Antonio 2.4139117 0.0001908 0.0003258
Pedra Preta 2.1016815 0.0069840 0.0133233
Peixoto de Azevedo 1.9247349 0.0026919 0.0056030
Planalto da Serra 6.6185591 0.0030419 0.0035833
Pocone 3.5786979 0.0115252 0.0159945
Pontal do Araguaia 4.5429027 0.0031248 0.0040068
Ponte Branca 2.5775667 0.0002991 0.0004886
Pontes e Lacerda 3.8121864 0.0267458 0.0362564
Porto Alegre do Norte 0.9852392 -0.0000151 0.0010098
Porto dos Gauchos 3.6967635 0.0039685 0.0054401
Porto Esperidiao 7.1893151 0.0148354 0.0172324
Porto Estrela 6.4724137 0.0035254 0.0041697
Poxoreo 4.3768973 0.0106061 0.0137468
Primavera do Leste 0.2699651 -0.0153276 0.0056681
Querencia 2.1142537 0.0043606 0.0082742
Sao Jose dos Quatro Marcos 1.3915491 0.0015399 0.0054727
Reserva do Cabacal 0.6540922 -0.0001034 0.0001955
Ribeirao Cascalheira 6.3194135 0.0069648 0.0082742
Ribeiraozinho 1.2117644 0.0000854 0.0004886
Rio Branco 3.8642374 0.0022455 0.0030295
Santa Carmem 1.2853793 0.0002893 0.0013030
Santo Afonso 4.1952121 0.0014886 0.0019545
Sao Jose do Povo 4.2021121 0.0015639 0.0020523
Sao Jose do Rio Claro 1.1323246 0.0005748 0.0049189
Sao Jose do Xingu 9.1524509 0.0123899 0.0139097
Sao Pedro da Cipa 0.2377883 -0.0011486 0.0003583
Rondolandia 6.9099909 0.0067981 0.0079484
Rondonopolis 0.3994540 -0.0396203 0.0263535
Rosario Oeste 2.6020815 0.0037706 0.0061242
Santa Cruz do Xingu 4.8608907 0.0018112 0.0022803
Salto do Ceu 3.9740836 0.0021453 0.0028666
Santa Rita do Trivelato 0.5590111 -0.0005654 0.0007167
Santa Terezinha 6.4517277 0.0065513 0.0077529
Santo Antonio do Leste 1.6343369 0.0007460 0.0019219
Santo Antonio do Leverger 2.9546867 0.0123915 0.0187309
Sao Felix do Araguaia 3.7260894 0.0061489 0.0084045
Sapezal 0.1078001 -0.0083578 0.0010098
Serra Nova Dourada 5.1333819 0.0005246 0.0006515
Sinop 0.1632084 -0.0342388 0.0066780
Sorriso 0.0680178 -0.0241029 0.0017591
Tabapora 2.0746593 0.0026829 0.0051795
Tangara da Serra 0.7562136 -0.0067630 0.0209786
Tapurah 0.8180429 -0.0007825 0.0035181
Terra Nova do Norte 2.1584373 0.0018183 0.0033878
Tesouro 5.0174879 0.0025301 0.0031598
Torixoreu 5.1871033 0.0037602 0.0046583
Uniao do Sul 1.3320564 0.0002923 0.0011727
Vale de São Domingos 6.0282552 0.0002989 0.0003583
Varzea Grande 0.1026464 -0.0558169 0.0063848
Vera 0.4758736 -0.0014710 0.0013356
Vila Rica 4.0590617 0.0108020 0.0143332
Nova Guarita 2.7528185 0.0008504 0.0013356
Nova Marilandia 3.8751329 0.0020785 0.0028015
Nova Maringa 2.5467579 0.0025918 0.0042674
Nova Monte Verde 6.2943359 0.0117546 0.0139749

3.4 ICN

3.4.1 Componentes principais

Observar que o pacote psych precisa estar instalado. Recomenda-se observar para o teste de esfericidade de Bartlett (neste exemplo, p-value<0.05 e rejeito H0 de que a matriz de correlação é uma matriz identidade) e os testes KMO antes de realizar o procedimento. Faremos uma análise de componentes principais com rotação varimax, padronizando os componentes (scale) antes de chamar a função psych::principal().

Se a significância do Teste de Bartlett for menor que o nível de significância (usualmente 5% = 0.05) a hipótese nula será rejeitada e a análise pode ser realizada conforme Hair et al.(2005) e Mingoti (2005), citados por Dallemole (2007, p. 64).

O teste Kaiser-Meyer-Olkin (KMO) permite avaliar se o modelo de componentes principais está ajustado corretamente aos dados, ou adequado (adequacy KMO test). Neste caso, indicou valroes de MSA geral (overall MSA) de 0.48, e valores individuais de cada componente de 0.46 a 0.48, valores muito baixos. Hair et al. (2006), citado por Dallemole (2007), sugerem o mínimo de 0.50 como mínimo aceitável, o que não foi encontrado neste exemplo. Ignoraremos para fins meramente didáticos esta situação.

# padronizar variaveis
x <- scale(componentes[, 2:4])
r <- cor(x)  # matriz de correlação de x
psych::cortest.bartlett(r, n = length(x[, 1]))  # teste de Bartlett
$chisq
[1] 18.98054

$p.value
[1] 0.0002759439

$df
[1] 3
psych::KMO(r)  # teste de KMO
Kaiser-Meyer-Olkin factor adequacy
Call: psych::KMO(r = r)
Overall MSA =  0.48
MSA for each item = 
  QL  IHH   PR 
0.48 0.47 0.46 
# realizar componentes principais em x
pca_psych_rotated <- psych::principal(x, rotate = "varimax", nfactors = 3, scores = F, 
    oblique.scores = T)
summary(pca_psych_rotated)

Factor analysis with Call: psych::principal(r = x, nfactors = 3, rotate = "varimax", scores = F, 
    oblique.scores = T)

Test of the hypothesis that 3 factors are sufficient.
The degrees of freedom for the model is -3  and the objective function was  0 
The number of observations was  141  with Chi Square =  0  with prob <  NA 

The root mean square of the residuals (RMSA) is  0 

3.4.2 Extração dos loadings e Proportion_Var

pca_psych_rotated$values  # loadings = eigenvalues
[1] 1.3567510 1.0022272 0.6410218
pca_psych_rotated$loadings  # rotated component matrix

Loadings:
    RC3    RC2    RC1   
QL   0.147  0.111  0.983
IHH  0.990         0.144
PR          0.994  0.108

                 RC3   RC2   RC1
SS loadings    1.001 1.001 0.998
Proportion Var 0.334 0.334 0.333
Cumulative Var 0.334 0.667 1.000
# extract loadings as a data.frame
# (https://stackoverflow.com/questions/17371266/extracting-output-from-principal-function-in-psych-package-as-a-data-frame)
loadings <- as.data.frame(unclass(pca_psych_rotated$loadings))
loadings
# normalizar loadings
matriz_normal <- t(t(loadings)/rowSums(t(loadings)))
matriz_normal
             RC3          RC2        RC1
QL   0.130564515  0.101229646 0.79620326
IHH  0.876789173 -0.008813106 0.11665888
PR  -0.007353689  0.907583460 0.08713786
# Proportion Var
Vaccounted <- as.data.frame(unclass(pca_psych_rotated$Vaccounted))
Proportion_Var <- t(Vaccounted[2, ])  # matriz de autovalores
Proportion_Var
    Proportion Var
RC3      0.3336503
RC2      0.3335833
RC1      0.3327664

3.4.2.1 obter theta = matriz_normal%*%varexpl

# varexpl é o mesmo que Proportion_Var transposto
varexpl <- matrix(pca_psych_rotated$Vaccounted[4, ], nrow = 1, ncol = 3)
varexpl
          [,1]      [,2]      [,3]
[1,] 0.3336503 0.3335833 0.3327664
theta = matriz_normal %*% Proportion_Var
colnames(theta) <- c("theta")
theta
        theta
QL  0.3422811
IHH 0.3284212
PR  0.3292977

3.4.3 Cálculo de ICN

dados_originais <- componentes[, 2:4]
ICN = as.matrix.data.frame(dados_originais, ncol = 3, nrow = 141) %*% matrix(theta, 
    nrow = 3, ncol = 1)
options(scipen = 100)
print(head(ICN))  # primeiras 6 linhas de ICN
          [,1]
[1,] 1.3130963
[2,] 1.0625041
[3,] 0.9445908
[4,] 0.5798186
[5,] 1.2261012
[6,] 0.3157838
tabela_final <- cbind(componentes, ICN = ICN)
knitr::kable(tabela_final)
Municipio QL IHH PR ICN
Acorizal 3.8338598 0.0010835 0.0014659 1.3130963
Agua Boa 3.0752956 0.0121125 0.0179491 1.0625041
Alta Floresta 2.6948244 0.0260598 0.0414359 0.9445908
Alto Araguaia 1.6845149 0.0028460 0.0070037 0.5798186
Alto Boa Vista 3.5782691 0.0016900 0.0023454 1.2261012
Alto Garcas 0.9198961 -0.0002666 0.0030621 0.3157838
Alto Paraguai 2.4744641 0.0006988 0.0011727 0.8475779
Alto Taquari 0.3778967 -0.0018769 0.0011401 0.1291059
Apiacas 3.4800913 0.0045501 0.0063848 1.1947663
Araguaiana 9.2816605 0.0075571 0.0084696 3.1822078
Araguainha 1.6464116 0.0002430 0.0006189 0.5638192
Araputanga 2.6297873 0.0075302 0.0121506 0.9066007
Arenapolis 1.4958338 0.0006803 0.0020523 0.5128948
Aripuana 2.3561386 0.0062811 0.0109128 0.8121181
Barao de Melgaco 6.2643953 0.0041610 0.0049515 2.1471811
Barra do Bugres 1.6245202 0.0051470 0.0133885 0.5621417
Barra do Garcas 1.7809692 0.0145703 0.0332269 0.6253188
Bom Jesus do Araguaia 2.5497846 0.0012474 0.0020523 0.8738285
Brasnorte 1.9595283 0.0040357 0.0082416 0.6747488
Caceres 2.4337746 0.0270972 0.0459965 0.8570809
Campinapolis 4.5147693 0.0043366 0.0055704 1.5485787
Campo Novo do Parecis 0.1237292 -0.0096896 0.0013682 0.0396184
Campo Verde 0.2967616 -0.0082598 0.0034856 0.1000110
Campos de Julio 0.1186649 -0.0019355 0.0002606 0.0400669
Canabrava do Norte 2.9409184 0.0012254 0.0018568 1.0076346
Canarana 3.2641128 0.0108685 0.0156688 1.1259732
Carlinda 4.6400747 0.0044210 0.0056355 1.5915176
Castanheira 4.7387889 0.0037781 0.0047886 1.6248155
Chapada dos Guimaraes 1.5128953 0.0016455 0.0048537 0.5199742
Claudia 0.2726470 -0.0023464 0.0008795 0.0928409
Cocalinho 9.5143685 0.0135555 0.0151476 3.2660284
Colider 1.0771659 0.0005577 0.0077855 0.3714404
Colniza 0.3795134 -0.0018641 0.0011401 0.1296635
Comodoro 3.4472111 0.0109847 0.0154733 1.1886181
Confresa 1.2137556 0.0004876 0.0027689 0.4165175
Conquista D’Oeste 3.4425906 0.0023113 0.0032575 1.1801654
Cotriguacu 1.3023348 0.0005974 0.0025735 0.4468082
Cuiaba 0.0762924 -0.3040868 0.0251156 -0.0654846
Curvelândia 0.7128583 -0.0001181 0.0002932 0.2440557
Denise 2.5736013 0.0019719 0.0032250 0.8826046
Diamantino 0.3660083 -0.0064890 0.0037462 0.1243802
Dom Aquino 2.1704806 0.0026702 0.0049515 0.7454219
Feliz Natal 0.3175893 -0.0018199 0.0008470 0.1083860
Figueiropolis D Oeste 4.6589126 0.0022513 0.0028666 1.5963411
Gaucha do Norte 4.2109349 0.0038998 0.0051143 1.4442883
General Carneiro 2.8805565 0.0021692 0.0033227 0.9877666
Gloria D’oeste 4.3821782 0.0014834 0.0019219 1.5010568
Guaranta do Norte 1.2376223 0.0010758 0.0056030 0.4258131
Guiratinga 2.5940871 0.0033830 0.0055052 0.8908309
Indiavai 5.4507684 0.0019949 0.0024432 1.8671546
Ipiranga do Norte 0.9046901 -0.0001579 0.0014985 0.3100999
Itanhanga 0.2503316 -0.0004878 0.0001629 0.0855772
Itauba 4.4583367 0.0052559 0.0067757 1.5299617
Itiquira 1.7340385 0.0037783 0.0089257 0.5977087
Jaciara 0.6352957 -0.0029360 0.0051143 0.2181696
Jangada 1.5814820 0.0006707 0.0018242 0.5421324
Jauru 4.8017883 0.0052099 0.0065802 1.6474392
Juara 3.3801137 0.0202772 0.0287967 1.1730911
Juina 1.5858995 0.0050546 0.0136817 0.5489888
Juruena 2.6139596 0.0028159 0.0045606 0.8971355
Juscimeira 4.5339559 0.0063984 0.0082090 1.5566920
Lambari D’oeste 3.7115637 0.0045217 0.0061893 1.2739212
Lucas do Rio Verde 0.0086260 -0.0224631 0.0001955 -0.0043605
Luciara 2.6251290 0.0005848 0.0009447 0.8990352
Vila Bela da Santissima Trindade 10.6489976 0.0301658 0.0332921 3.6658206
Marcelandia 2.2271304 0.0036077 0.0065477 0.7656456
Matupa 1.2719255 0.0011979 0.0056030 0.4375945
Mirassol Doeste 1.0941494 0.0007428 0.0086325 0.3775932
Nobres 0.7716781 -0.0007325 0.0024757 0.2647055
Nortelandia 0.9105325 -0.0000832 0.0008470 0.3119096
Nossa Senhora do Livramento 4.4327213 0.0049192 0.0063522 1.5209440
Nova Bandeirantes 4.9909256 0.0066424 0.0083067 1.7132163
Nova Nazaré 5.9074312 0.0020025 0.0024106 2.0234534
Nova Lacerda 4.7499945 0.0047834 0.0060590 1.6293995
Nova Santa Helena 5.8707126 0.0038108 0.0045931 2.0121979
Nova Brasilandia 6.5424189 0.0038911 0.0045931 2.2421367
Nova Canaa do Norte 6.2944379 0.0110149 0.0130953 2.1623968
Nova Mutum 0.3471998 -0.0108409 0.0057658 0.1171782
Nova Olimpia 0.4738014 -0.0037263 0.0033553 0.1620543
Nova Ubirata 0.8015742 -0.0006532 0.0026386 0.2750181
Nova Xavantina 3.7999482 0.0087130 0.0118249 1.3074058
Novo Mundo 7.3471528 0.0064444 0.0074598 2.5193644
Novo Horizonte do Norte 2.1532947 0.0004187 0.0007818 0.7374270
Novo Sao Joaquim 1.7898866 0.0020126 0.0045606 0.6148071
Paranaita 5.8773503 0.0091912 0.0110756 2.0183716
Paranatinga 3.3414586 0.0123720 0.0176559 1.1535953
Novo Santo Antonio 2.4139117 0.0001908 0.0003258 0.8264063
Pedra Preta 2.1016815 0.0069840 0.0133233 0.7260469
Peixoto de Azevedo 1.9247349 0.0026919 0.0056030 0.6615295
Planalto da Serra 6.6185591 0.0030419 0.0035833 2.2675866
Pocone 3.5786979 0.0115252 0.0159945 1.2339727
Pontal do Araguaia 4.5429027 0.0031248 0.0040068 1.5572954
Ponte Branca 2.5775667 0.0002991 0.0004886 0.8825115
Pontes e Lacerda 3.8121864 0.0267458 0.0362564 1.3255623
Porto Alegre do Norte 0.9852392 -0.0000151 0.0010098 0.3375563
Porto dos Gauchos 3.6967635 0.0039685 0.0054401 1.2684270
Porto Esperidiao 7.1893151 0.0148354 0.0172324 2.4713135
Porto Estrela 6.4724137 0.0035254 0.0041697 2.2179157
Poxoreo 4.3768973 0.0106061 0.0137468 1.5061392
Primavera do Leste 0.2699651 -0.0153276 0.0056681 0.0892365
Querencia 2.1142537 0.0043606 0.0082742 0.7278258
Sao Jose dos Quatro Marcos 1.3915491 0.0015399 0.0054727 0.4786088
Reserva do Cabacal 0.6540922 -0.0001034 0.0001955 0.2239138
Ribeirao Cascalheira 6.3194135 0.0069648 0.0082742 2.1680278
Ribeiraozinho 1.2117644 0.0000854 0.0004886 0.4149530
Rio Branco 3.8642374 0.0022455 0.0030295 1.3243905
Santa Carmem 1.2853793 0.0002893 0.0013030 0.4404851
Santo Afonso 4.1952121 0.0014886 0.0019545 1.4370743
Sao Jose do Povo 4.2021121 0.0015639 0.0020523 1.4394929
Sao Jose do Rio Claro 1.1323246 0.0005748 0.0049189 0.3893818
Sao Jose do Xingu 9.1524509 0.0123899 0.0139097 3.1413604
Sao Pedro da Cipa 0.2377883 -0.0011486 0.0003583 0.0811312
Rondolandia 6.9099909 0.0067981 0.0079484 2.3700092
Rondonopolis 0.3994540 -0.0396203 0.0263535 0.1323916
Rosario Oeste 2.6020815 0.0037706 0.0061242 0.8938983
Santa Cruz do Xingu 4.8608907 0.0018112 0.0022803 1.6651367
Salto do Ceu 3.9740836 0.0021453 0.0028666 1.3619022
Santa Rita do Trivelato 0.5590111 -0.0005654 0.0007167 0.1913893
Santa Terezinha 6.4517277 0.0065513 0.0077529 2.2130090
Santo Antonio do Leste 1.6343369 0.0007460 0.0019219 0.5602805
Santo Antonio do Leverger 2.9546867 0.0123915 0.0187309 1.0215710
Sao Felix do Araguaia 3.7260894 0.0061489 0.0084045 1.2801569
Sapezal 0.1078001 -0.0083578 0.0010098 0.0344856
Serra Nova Dourada 5.1333819 0.0005246 0.0006515 1.7574464
Sinop 0.1632084 -0.0342388 0.0066780 0.0468175
Sorriso 0.0680178 -0.0241029 0.0017591 0.0159446
Tabapora 2.0746593 0.0026829 0.0051795 0.7127034
Tangara da Serra 0.7562136 -0.0067630 0.0209786 0.2635247
Tapurah 0.8180429 -0.0007825 0.0035181 0.2809021
Terra Nova do Norte 2.1584373 0.0018183 0.0033878 0.7405050
Tesouro 5.0174879 0.0025301 0.0031598 1.7192627
Torixoreu 5.1871033 0.0037602 0.0046583 1.7782163
Uniao do Sul 1.3320564 0.0002923 0.0011727 0.4564199
Vale de São Domingos 6.0282552 0.0002989 0.0003583 2.0635739
Varzea Grande 0.1026464 -0.0558169 0.0063848 0.0189050
Vera 0.4758736 -0.0014710 0.0013356 0.1628392
Vila Rica 4.0590617 0.0108020 0.0143332 1.3976076
Nova Guarita 2.7528185 0.0008504 0.0013356 0.9429568
Nova Marilandia 3.8751329 0.0020785 0.0028015 1.3279899
Nova Maringa 2.5467579 0.0025918 0.0042674 0.8739635
Nova Monte Verde 6.2943359 0.0117546 0.0139749 2.1628945

Referências

BALASSA, B. Trade Liberalization and Revealed Comparative Advantage, The Manchester School 33: 99-123. 1965.

CROCCO, M.A.; GALINARI, R.; SANTOS, F.; LEMOS, M.B.; SIMÕES, R. Metodologia de identificação de arranjos produtivos locais potenciais: uma nota técnica. Texto para Discussão N. 191. Belo Horizonte: UFMG/CEDEPLAR, Abril/2003.

CRUZ, B.O.; QUEIROZ, I.V. Efeitos encadeados do perfil setorial dos investimentos e a distribuição espacial da indústria: onde se localizam as indústrias dos setores com maiores impactos? Texto para discussão n. 2172, Brasília: IPEA, 2016.

DALLEMOLE, D. Cadeia produtiva de couro e derivados no estado do Pará : Implicações para o Desenvolvimento Local. Tese (Doutorado em Ciências Agrárias). Belém-PA: UFRA, 2007.

FLORENCE, P. Sargent. Investment, location, and size of plant. Cambridge: Cambridge University Press, 1948.

MONASTERIO, Leonardo. Indicadores de análise regional e espacial. In: CRUZ et al (orgs). Economia regional e urbana : teorias e métodos com ênfase no Brasil. Brasília: Ipea, 2011. cap. 10. pp.315-331.

SOUZA, Filipe Lage de. A localização da indústria de transformação brasileira nas últimas três décadas. Rio de Janeiro: EPGE-FGV, 2002. (Dissertação, Mestrado em Economia). 130p.

LS0tDQp0aXRsZTogIkVjb25vbWlhIFJlZ2lvbmFsOiDDjW5kaWNlIGRlIGNvbmNlbnRyYcOnw6NvIG5vcm1hbGl6YWRvIChJQ04pIGVtIFIiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbywgKmUtbWFpbDogYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIqIg0KbGlua2NvbG9yOiBibHVlDQphYnN0cmFjdDogDQogIFRoaXMgaXMgYW4gdW5kZXJncmFkIHN0dWRlbnQgbGV2ZWwgaW5zdHJ1Y3Rpb24gZm9yIGNsYXNzIHVzZS4gIA0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IG5vDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2NhcHRpb246IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Iga25pdHJfaW5pdCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KHJtZGZvcm1hdHMpDQoNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iMTAwIikNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9RiwNCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwNCiAgICAgICAgICAgICAgIHRpZHk9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkNCm9wdHNfa25pdCRzZXQod2lkdGg9MTAwKQ0KYGBgDQoNCiMgTGljZW7Dp2EgeyNMaWNlbsOnYSAudW5udW1iZXJlZH0NCg0KVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVG8gdmlldyBhIGNvcHkgb2YgdGhpcyBsaWNlbnNlLCB2aXNpdCA8aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLz4gb3Igc2VuZCBhIGxldHRlciB0byBDcmVhdGl2ZSBDb21tb25zLCBQTyBCb3ggMTg2NiwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDIsIFVTQS4NCg0KIVtMaWNlbnNlOiBDQyBCWS1TQSA0LjBdKGh0dHBzOi8vbWlycm9ycy5jcmVhdGl2ZWNvbW1vbnMub3JnL3ByZXNza2l0L2J1dHRvbnMvODh4MzEvcG5nL2J5LXNhLnBuZyl7d2lkdGg9IjI1JSJ9DQoNCiMgQ2l0YcOnw6NvIHsjQ2l0YcOnw6NvIC51bm51bWJlcmVkfQ0KDQpTdWdlc3TDo28gZGUgY2l0YcOnw6NvOiBGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuIEVjb25vbWlhIFJlZ2lvbmFsOiDDjW5kaWNlIGRlIGNvbmNlbnRyYcOnw6NvIG5vcm1hbGl6YWRvIChJQ04pIGVtIFIuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMjEuIERpc3BvbsOtdmVsIGVtIFs8aHR0cDovL3JwdWJzLmNvbS9hbXJvZmkvUmVnaW9uYWxfRWNvbm9taWNzX2ljbj5dKGh0dHA6Ly9ycHVicy5jb20vYW1yb2ZpL1JlZ2lvbmFsX0Vjb25vbWljc19pY24pey51cml9LiBET0k6IFsxMC4xMzE0MC9SRy4yLjIuMTI1NjQuNjMzNjBdKGh0dHA6Ly9keC5kb2kub3JnLzEwLjEzMTQwL1JHLjIuMi4xMjU2NC42MzM2MCkNCg0KIyBJbnRyb2R1w6fDo28NCg0KIyMgVmlkZW9hdWxhcw0KDQpbRUNPTk9NSUEgUkVHSU9OQUwgMjAyMS4xOiAwNSBQZXJyb3V4IGUgb3MgcG9sb3MgZGUgY3Jlc2NpbWVudG9dKGh0dHBzOi8veW91dHUuYmUvcGJ5TlRES2NIMWcgIkVDT05PTUlBIFJFR0lPTkFMIDIwMjEuMTogMDUgUGVycm91eCBlIG9zIHBvbG9zIGRlIGNyZXNjaW1lbnRvIikgLSB2aWRlbyB0ZcOzcmljbyBkZSBwb2xvcyBkZSBjcmVzY2ltZW50by4NCg0KW0VDT05PTUlBIFJFR0lPTkFMIDIwMjEuMTogMDUgUGVycm91eDogRXhlcmNpY2lvIFFMIGRpdmVyc2lkYWRlIHViaXF1aWRhZGUgTVNdKGh0dHBzOi8veW91dHUuYmUvZXQyalZLc3lsdlEgIkVDT05PTUlBIFJFR0lPTkFMIDIwMjEuMTogMDUgUGVycm91eDogRXhlcmNpY2lvIFFMIGRpdmVyc2lkYWRlIHViaXF1aWRhZGUgTVMiKSAtIHZpZGVvIGFwbGljYWRvDQoNClsqKipFQ09OT01JQSBSRUdJT05BTCAyMDIxLjE6IDA1IElDTiBBUEwgUG9sbyoqKl0oaHR0cHM6Ly95b3V0dS5iZS9remFQTUx4dW9zNCAiRUNPTk9NSUEgUkVHSU9OQUwgMjAyMS4xOiAwNSBJQ04gQVBMIFBvbG8iKSAqKiotIHZpZGVvIGFwbGljYWRvIGVzcGVjw61maWNvIHNvYnJlIGVzdGUgcG9zdCEqKioNCg0KIyMgSWRlaWEgQsOhc2ljYQ0KDQpBIGlkZWlhIGLDoXNpY2EgZGVzdGUgYXJxdWl2byDDqSBvcmllbnRhciBvcyBwcm9jZWRpbWVudG9zIHBhcmEgbyBjw6FsY3VsbyBkb3MgaW5kaWNhZG9yZXMgZGUgYW7DoWxpc2UgcmVnaW9uYWwgYSBzYWJlcjoNCg0KMS4gIFF1b2NpZW50ZSBMb2NhY2lvbmFsIChRTCkNCjIuICDDjW5kaWNlIGRlIEhlcmZpbmRhaGwtSGlyc2NobWFuIE1vZGlmaWNhZG8gKElISCkNCjMuICBQYXJ0aWNpcGHDp8OjbyBSZWxhdGl2YSAoUFIpDQo0LiAgw41uZGljZSBkZSBDb25jZW50cmHDp8OjbyBOb3JtYWxpemFkbyAoSUNOKQ0KDQpQYXJhIGEgbWFpb3JpYSBkb3MgY2Fzb3MsIG9zIGRhZG9zIHNlcsOjbyBkZSBFbXByZWdvIFNldG9yaWFsIChFKSBjb25mb3JtZSBhcyBjbGFzc2VzIENOQUUgMi4wLCBwb3IgbXVuaWPDrXBpbyBkZSBNYXRvIEdyb3Nzby4gTmVzdGUgY2Fzbywgb3MgZGFkb3Mgc8OjbyBwYXJhIGEgQ3JpYcOnw6NvIGRlIGJvdmlub3MuIEV4aXN0ZW0gcm90aW5hcyBwYXJhIGEgb2J0ZW7Dp8OjbyBlbGV0csO0bmljYSBkZXNzZXMgZGFkb3MsIG1hcyBwb3IgaG9yYSBlbGVzIHNlcsOjbyB0cmF6aWRvcyBqw6EgcHJlcGFyYWRvcyBlbSBwbGFuaWxoYSBlbGV0csO0bmljYSB0aXBvIE1TIEV4Y2VsLg0KDQojIFByb2NlZGltZW50b3MNCg0KIyMgQ2FycmVnYXIgb3MgZGFkb3MgZSBwYWNvdGVzDQoNCk9zIGRhZG9zIHByZWNpc2FtIHNlciBvcmdhbml6YWRvcyBwcmV2aWFtZW50ZSBwYXJhIHRlciBhIHByaW1laXJhIGNvbHVuYSBjb21vIG5vbWUgZG9zIG11bmljw61waW9zLCBhIHNlZ3VuZGEgY29sdW5hIHRlbSBvcyBkYWRvcyBkbyBzZXRvciBwb3IgbXVuaWPDrXBpbywgYSB0ZXJjZWlyYSBjb2x1bmEgdGVtIG8gdG90YWwgZG8gbXVuaWPDrXBpbywgYW8gZmluYWwgZG9zIG11bmljw61waW9zIHRlbSB1bWEgbGluaGEgZGUgdG90YWwsIG5lc3RlIGNhc28gc2FvIDE0MSBtdW5pY8OtcGlvcyBkZSBNVC4gQSBwcmltZWlyYSBsaW5oYSB0ZW0gb3MgcsOzdHVsb3MgIk11bmljIiAiYm92aW5vcyIgIlRvdGFsIi4NCg0KVXNhcmVpIG8gcGFjb3RlIHJlYWR4bCBwYXJhIGNoYW1hciBvcyBkYWRvcywgbyBwYWNvdGUga25pdHIgcGFyYSBvcmdhbml6YXIgYXMgdGFiZWxhcyBkZSBzYcOtZGFzLCBlIG8gcGFjb3RlIHBzeWNoIHBhcmEgcm9kYXIgb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFpcyBubyBjw6FsY3VsbyBkbyBJQ04uDQoNCiMjIFF1b2NpZW50ZSBMb2NhY2lvbmFsIChRTCkNCg0KUGFyYSBvcyBwcsOzeGltb3MgaW5kaWNhZG9yZXMsIG5lY2Vzc2l0YS1zZSBkb3MgZGFkb3MgZGUgZW1wcmVnbyBwb3Igc2V0b3IgZW0gY2FkYSBtdW5pY8OtcGlvIGRlIE1ULiBEZXN0YSBmb3JtYSwgY2hhbWEtc2UgYSBwbGFuaWxoYSBqw6EgcHJlcGFyYWRhIGNvbSBvcyBkYWRvcyBkYSBiYXNlIGRlIGluZm9ybWHDp8O1ZXMgUkFJUyBkbyBNaW5pc3TDqXJpbyBkbyBUcmFiYWxobyBlIEVtcHJlZ28gZG8gQnJhc2lsIChNVEUpLiBVbSBtZWlvIGRlIG9idGVyIHRhaXMgaW5mb3JtYcOnw7VlcyBlbGV0cm9uaWNhbWVudGUgw6kgcGVsbyBwYWNvdGUgYHJhaXNyYC4gT3V0cmEgZm9ybWEgw6kgcGVsYSBww6FnaW5hIDxodHRwOi8vYmkubXRlLmdvdi5ici9iZ2NhZ2VkL2xvZ2luLnBocD4uDQoNCkEgUkFJUyBwb3NzdWkgb3MgZGFkb3MgcGFyYSBvIGZpbmFsIGRlIGNhZGEgYW5vIChkZXplbWJybyksIHBvcnRhbnRvLCBvcyBzYWxkb3MgZGUgZW1wcmVnYWRvcyBvY3VwYWRvcy4gQSBDQUdFRCBhcHJlc2VudGEgb3V0cm8gdGlwbyBkZSBpbmZvcm1hw6fDo28sIGEgZGUgbGlnYWRvcyBlIGRlc2xpZ2Fkb3MsIGludsOpcyBkbyBzYWxkbyBkZSBwZXNzb2FzIG9jdXBhZGFzLiBVdGlsaXphcmVtb3Mgb3MgZGFkb3MgZGEgUkFJUyBwb3IgdsOtbmN1bG9zLCBwb3IgQ2xhc3NlIENOQUUgMi4wIGUgcG9yIG11bmljw61waW8uDQoNCk8gUXVvY2llbnRlIExvY2FjaW9uYWwgKFFMKSDDqSB1bWEgbWVkaWRhIHF1ZSBkw6EgYSBpbmZvcm1hw6fDo28gZGUgcXVhbCBvIHNldG9yIG1haXMgcmVwcmVzZW50YWRvIG5vIG11bmljw61waW8gKHJlZ2nDo28gZGUgYW7DoWxpc2UpIHF1YW5kbyBjb21wYXJhZG8gY29tIG8gbWVzbW8gc2V0b3Igbm8gZXN0YWRvIChyZWdpw6NvIGRlIHJlZmVyw6puY2lhKS4gRm9pIGVsYWJvcmFkbyBpbmljaWFsbWVudGUgcG9yIEhhaWcgKDE5MjgpIGUgdmVtIHNlbmRvIG11aXRvIHV0aWxpemFkbyBlbSB2w6FyaWFzIGFuw6FsaXNlcyByZWdpb25haXMgZSBkZSBsb2NhbGl6YcOnw6NvIGluZHVzdHJpYWwuIFRhbWLDqW0gY2hhbWFkbyBkZSDDjW5kaWNlIGRlIGBSZXZlYWxlZCBDb21wYXJhdGl2ZSBBZHZhbnRhZ2VgIChSQ0EgLS0gb3UgVmFudGFnZW0gY29tcGFyYXRpdmEgcmV2ZWxhZGEsIFZDUikgc2VndWluZG8gQmFsYXNhICgxOTY1KSwgb3Ugw61uZGljZSBkZSBIb292ZXItQmFsYXNzYS4NCg0KQSBleHByZXNzw6NvIGLDoXNpY2Egw6k6DQoNCiQkDQpRTF97a2l9PSB7IHtcbGVmdCgge1xmcmFje3t7RV97a2l9fX19e3t7RV9pfX19IH0gXHJpZ2h0KX19IC8gIHsge1xsZWZ0KCB7XGZyYWN7e3tFX3trfX19fXt7e0V9fX0gfSBccmlnaHQpfX0NCiQkDQoNCmVtIHF1ZTogJHtFX3traX19JCDDqSBvIGVtcHJlZ28gbm8gc2V0b3IgJGskIG5hIGxvY2FsaWRhZGUgZGUgYW7DoWxpc2UgJGkkOyAke0VfaX0kIMOpIG8gZW1wcmVnbyB0b3RhbCBuYSBsb2NhbGlkYWRlIGRlIGFuw6FsaXNlICRpJDsgJHtFX2t9JCDDqSBvIGVtcHJlZ28gbm8gc2V0b3IgJGskIGRhIGxvY2FsaWRhZGUgZGUgcmVmZXLDqm5jaWE7IGUgJEUkIMOpIG8gZW1wcmVnbyB0b3RhbCBkYSBsb2NhbGlkYWRlIGRlIHJlZmVyw6puY2lhLg0KDQpBIGlkZWlhIMOpIHNhYmVyIHNlIG5hIGxvY2FsaWRhZGUgZGUgYW7DoWxpc2UsIGEgcHJvcG9yw6fDo28gZG8gZW1wcmVnbyBkbyBzZXRvciDDqSBtYWlvciBvdSBtZW5vciBxdWUgZXN0YSBwcm9wb3LDp8OjbyBubyBsb2NhbCBkZSByZWZlcsOqbmNpYS4gQXNzaW0sIHNlIG8gcmVzdWx0YWRvIGZvciBtYWlvciBxdWUgaHVtICRcbGVmdCgge1FMX3traX19XGd0IDFccmlnaHQpJCwgZW50w6NvIGRpei1zZSBxdWUgYSBsb2NhbGlkYWRlIGRlIGFuw6FsaXNlIMOpIHJlbGF0aXZhbWVudGUgbWFpcyBlc3BlY2lhbGl6YWRhIG5lc3NlIHNldG9yIHF1ZSBhIGxvY2FsaWRhZGUgZGUgcmVmw6puY2lhLiBEZSBvdXRybyBsYWRvLCB2YWxvcmVzIG1lbm9yZXMgcXVlIGEgdW5pZGFkZSAkXGxlZnQoIHtRTF97a2l9fVxsdCAxXHJpZ2h0KSQgaW5kaWNhbSBxdWUgYSBsb2NhbGlkYWRlIGFuYWxpc2FkYSB0ZW0gcmVwcmVzZW50YcOnw6NvIG1lbm9yIGRlc3RlIHNldG9yIGRvIHF1ZSBhIHJlcHJlc2VudGHDp8OjbyBkZXN0ZSBuYSBsb2NhbGlkYWRlIGRlIHJlZmVyw6puY2lhLg0KDQojIyDDjW5kaWNlIGRlIEhlcmZpbmRhaGwtSGlyc2NobWFuIE1vZGlmaWNhZG8gKElISCkNCg0KTyDDrW5kaWNlIGRlIEhlcmZpbmRhaGwtSGlyc2NobWFuIE1vZGlmaWNhZG8gKElISCkgb3UgY29tbyBDcm9jY28gZXQgYWwuICgyMDAzKSBjaGFtYSBkZSAoSEhtKSBmYXogdW1hIHJlbGHDp8OjbyBwYXJlY2lkYSBjb20gYSBkbyBRTCwgY29uZm9ybWUgYSBleHByZXNzw6NvOg0KDQokJA0KSUhIX3traX0gPSBISG1fe2tpfT0geyB7XGxlZnQoIHtcZnJhY3t7e0Vfe2tpfX19fXt7e0Vfa319fSAtIFxmcmFje3t7RV9pfX19e0V9fSBccmlnaHQpfX0NCiQkDQoNCkF0ZW50YXIgcXVlIGVzdGUgw61uZGljZSDDqSBkaXRvIG1vZGlmaWNhZG8gcG9ycXVlIG7Do28gZmF6IGEgc29tYSBkb3MgcXVhZHJhZG9zIGRhIGRpZmVyZW7Dp2EgZGEgZXhwcmVzc8OjbyBhY2ltYSwgcXVlIHNlcmlhIG8gSUhIIGNvbnZlbmNpb25hbCAoQ3JvY2NvIGV0IGFsLiwgMjAwMykuDQoNCiMjIFBhcnRpY2lwYcOnw6NvIFJlbGF0aXZhIChQUikNCg0KQSBwYXJ0aWNpcGHDp8OjbyByZWxhdGl2YSDDqSBvdXRybyBjb21wb25lbnRlIHBhcmEgbyBjw6FsY3VsbyBkbyBJQ04sIGUgc2Vyw6Egb2J0aWRvIGNvbSBvcyBtZXNtb3MgZGFkb3MgYW50ZXJpb3JlcyBwb3IgbWVpbyBkYSBleHByZXNzw6NvIChDcm9jY28gZXQgYWwuLCAyMDAzKToNCg0KJCQNClBSX3traX0gPSB7IHtcbGVmdCgge1xmcmFje3t7RV97a2l9fX19e3t7RV9rfX19IH0gXHJpZ2h0KX19DQokJA0KDQojIyDDjW5kaWNlIGRlIENvbmNlbnRyYcOnw6NvIE5vcm1hbGl6YWRvIChJQ04pDQoNCkZpbmFsbWVudGUsIG8gSUNOIHNlcsOhIHVtIMOtbmRpY2UgY29tcG9zdG8gZG9zIHRyw6pzIGluZGljYWRvcmVzIGFudGVyaW9yZXM6IFFMLCBJSEggZSBQUi4gQ29uZm9ybWUgQ3JvY2NvIGV0IGFsLiAoMjAwMykgZSBEQUxMRU1PTEUgKDIwMDcpIGVudHJlIG91dHJvcyB0cmFiYWxob3MuIE8gSUNOIHNlcsOhIHVtYSBwb25kZXJhw6fDo28gZG9zIHRyw6pzIGluZGljYWRvcmVzLCBjdWpvcyBwZXNvcyBzw6NvIG9idGlkb3MgcG9yIHVtIHByb2NlZGltZW50byBiYXNlYWRvIG5vcyBjb21wb25lbnRlcyBwcmluY2lwYWlzLCBtYXMgbsOjbyBzZXLDo28gZXhhdGFtZW50ZSBvcyBzY29yZXMsIGNvbmZvcm1lIGRlbGluZWFkbyBwb3IgQ3JvY2NvIGV0IGFsLiAoMjAwMykuIEVzdGEgY29tYmluYcOnw6NvIHV0aWxpemFyw6Egb3MgaW5kaWNhZG9yZXMgcGFkcm9uaXphZG9zIGRlIFFsLCBJSEggZSBQUiwgZmF6ZW5kbzogMSkgdW1hIGFwbGljYcOnw6NvIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhaXMgb2J0ZW5kbyBhIG1hdHJpeiBkZSBjb21wb25lbnRlcyByb3RhY2lvbmFkb3MgKGBsb2FkaW5nc2AgZG8gcGFjb3RlIGBwc3ljaDo6cHJpbmNpcGFsKClgKTtcDQoyKSBmYXplbmRvIHVtYSBtYXRyaXogbm9ybWFsaXphZGEgZGEgbWF0cml6IGRlIGNvbXBvbmVudGVzIHJvdGFjaW9uYWRvcztcDQozKSBmYXplbmRvIHVtYSBtdWx0aXBsaWNhw6fDo28gbWF0cmljaWFsIGRhIG1hdHJpeiBub3JtYWxpemFkYSBwZWxhIG1hdHJpeiAob3UgdmV0b3IgY29sdW5hKSBkb3MgYXV0b3ZhbG9yZXMgKGEgYFByb3BvcnRpb24gVmFyYCkgcmVzdWx0YW50ZSBkZSBgcHN5Y2g6OnByaW5jaXBhbCgpYDtcDQo0KSBjw6FsY3VsbyBkb3MgcGVzb3MgJFxUaGV0YShcdGhldGFfe1FMfSxcdGhldGFfe0lISH0sXHRoZXRhX3tQUn0kIGRlIGNhZGEgY29tcG9uZW50ZSBvcmlnaW5hbCAoUUwsIElISCwgUFIpO1wNCjUpIGPDoWxjdWxvIGRlIElDTiBkZSBjYWRhIG11bmljw61waW8gaSBlIHNldG9yIGsgZmF6ZW5kbzoNCg0KJCQNCklDTl97a2l9ID0gXHRoZXRhX3tRTH0qUUxfe2tpfStcdGhldGFfe0lISH0qSUhIX3traX0rXHRoZXRhX3tQUn0qUFJfe2tpfQ0KJCQNCg0KTyB0ZXh0byBkZSBDcm9jY28gZXQgYWwuICgyMDAzKSByZXNzYWx0YSBhIGltcG9ydMOibmNpYSBkbyBJQ04gZW0gY2Fzb3MgZW0gcXVlIG8gbXVuaWPDrXBpbyBkZSBwb3J0ZSBtdWl0byBtYWlvciBwb2RlIGRpc3RvcmNlciBhIGFuw6FsaXNlIHF1YW5kbyBzZSB1c2EgYXBlbmFzIFFMIG91IFBSLg0KDQpFbnRyZXRhbnRvLCBlbSBtdWl0YXMgc2l0dWHDp8O1ZXMsIG9zIHBlc29zICRcVGhldGEkIHBvZGVyw6NvIGluZGljYXIgYXBlbmFzIHVtIHZhbG9yIGFwcm94aW1hZG8gZGUgJDEvMyQsIGluZGljYW5kbyBxdWUgYSBtZXJhIG3DqWRpYSBhcml0bcOpdGljYSBlbnRyZSBRTCwgSUhIIGUgUFIgc2VyaWEgc3VmaWNpZW50ZS4gQSBub3NzYSBwcsOhdGljYSBpbmRpY2EgcXVlIGVtIHbDoXJpb3MgY2Fzb3MgYSBtw6lkaWEgw6kgc2ltIHN1ZmljaWVudGUsIG1hcyBvIHBlc3F1aXNhZG9yIGRldmUgZXN0YXIgYXRlbnRvIGEgY2Fzb3MgcGFydGljdWxhcmVzIGRlIGNvbmNlbnRyYcOnw6NvIGVtIGFsZ3VtIHNldG9yIGNvbSBsb2NhbGlkYWRlcyBkZSBwb3J0ZSBtdWl0byBkaXN0aW50by4gT3Ugc2VqYSwgY3VpZGFkby4NCg0KIyBSb3RpbmEgZGUgY8OhbGN1bG8NCg0KIyMgQ8OhbGN1bG8gZG9zIGNvbXBvbmVudGVzIG9yaWdpbmFpcw0KDQpQcmltZWlybywgY2hhbWFtb3Mgb3MgZGFkb3MuIEF0ZW50YXIgcGFyYSBhIHByZXNlbsOnYSBkZSBjb2x1bmEgZGUgVG90YWwgZSBwYXJhIGEgbGluaGEgZG8gVG90YWwuICoqKk9zIGRhZG9zIGZvcmFtIGNvbG9jYWRvcyBlbWJlZGRlZCBubyBjb2RlLioqKg0KDQpgYGB7ciwgZXZhbD1GQUxTRSxlY2hvPUZBTFNFfQ0KZHB1dChJQ05fU2FsYSkNCnN0cnVjdHVyZShsaXN0KE11bmljID0gYygiQWNvcml6YWwiLCAiQWd1YSBCb2EiLCAiQWx0YSBGbG9yZXN0YSIsIA0KIkFsdG8gQXJhZ3VhaWEiLCAiQWx0byBCb2EgVmlzdGEiLCAiQWx0byBHYXJjYXMiLCAiQWx0byBQYXJhZ3VhaSIsIA0KIkFsdG8gVGFxdWFyaSIsICJBcGlhY2FzIiwgIkFyYWd1YWlhbmEiLCAiQXJhZ3VhaW5oYSIsICJBcmFwdXRhbmdhIiwgDQoiQXJlbmFwb2xpcyIsICJBcmlwdWFuYSIsICJCYXJhbyBkZSBNZWxnYWNvIiwgIkJhcnJhIGRvIEJ1Z3JlcyIsIA0KIkJhcnJhIGRvIEdhcmNhcyIsICJCb20gSmVzdXMgZG8gQXJhZ3VhaWEiLCAiQnJhc25vcnRlIiwgIkNhY2VyZXMiLCANCiJDYW1waW5hcG9saXMiLCAiQ2FtcG8gTm92byBkbyBQYXJlY2lzIiwgIkNhbXBvIFZlcmRlIiwgIkNhbXBvcyBkZSBKdWxpbyIsIA0KIkNhbmFicmF2YSBkbyBOb3J0ZSIsICJDYW5hcmFuYSIsICJDYXJsaW5kYSIsICJDYXN0YW5oZWlyYSIsIA0KIkNoYXBhZGEgZG9zIEd1aW1hcmFlcyIsICJDbGF1ZGlhIiwgIkNvY2FsaW5obyIsICJDb2xpZGVyIiwgIkNvbG5pemEiLCANCiJDb21vZG9ybyIsICJDb25mcmVzYSIsICJDb25xdWlzdGEgRCdPZXN0ZSIsICJDb3RyaWd1YWN1IiwgIkN1aWFiYSIsIA0KIkN1cnZlbMOibmRpYSIsICJEZW5pc2UiLCAiRGlhbWFudGlubyIsICJEb20gQXF1aW5vIiwgIkZlbGl6IE5hdGFsIiwgDQoiRmlndWVpcm9wb2xpcyBEIE9lc3RlIiwgIkdhdWNoYSBkbyBOb3J0ZSIsICJHZW5lcmFsIENhcm5laXJvIiwgDQoiR2xvcmlhIEQnb2VzdGUiLCAiR3VhcmFudGEgZG8gTm9ydGUiLCAiR3VpcmF0aW5nYSIsICJJbmRpYXZhaSIsIA0KIklwaXJhbmdhIGRvIE5vcnRlIiwgIkl0YW5oYW5nYSIsICJJdGF1YmEiLCAiSXRpcXVpcmEiLCAiSmFjaWFyYSIsIA0KIkphbmdhZGEiLCAiSmF1cnUiLCAiSnVhcmEiLCAiSnVpbmEiLCAiSnVydWVuYSIsICJKdXNjaW1laXJhIiwgDQoiTGFtYmFyaSBEJ29lc3RlIiwgIkx1Y2FzIGRvIFJpbyBWZXJkZSIsICJMdWNpYXJhIiwgIlZpbGEgQmVsYSBkYSBTYW50aXNzaW1hIFRyaW5kYWRlIiwgDQoiTWFyY2VsYW5kaWEiLCAiTWF0dXBhIiwgIk1pcmFzc29sIERvZXN0ZSIsICJOb2JyZXMiLCAiTm9ydGVsYW5kaWEiLCANCiJOb3NzYSBTZW5ob3JhIGRvIExpdnJhbWVudG8iLCAiTm92YSBCYW5kZWlyYW50ZXMiLCAiTm92YSBOYXphcsOpIiwgDQoiTm92YSBMYWNlcmRhIiwgIk5vdmEgU2FudGEgSGVsZW5hIiwgIk5vdmEgQnJhc2lsYW5kaWEiLCAiTm92YSBDYW5hYSBkbyBOb3J0ZSIsIA0KIk5vdmEgTXV0dW0iLCAiTm92YSBPbGltcGlhIiwgIk5vdmEgVWJpcmF0YSIsICJOb3ZhIFhhdmFudGluYSIsIA0KIk5vdm8gTXVuZG8iLCAiTm92byBIb3Jpem9udGUgZG8gTm9ydGUiLCAiTm92byBTYW8gSm9hcXVpbSIsIA0KIlBhcmFuYWl0YSIsICJQYXJhbmF0aW5nYSIsICJOb3ZvIFNhbnRvIEFudG9uaW8iLCAiUGVkcmEgUHJldGEiLCANCiJQZWl4b3RvIGRlIEF6ZXZlZG8iLCAiUGxhbmFsdG8gZGEgU2VycmEiLCAiUG9jb25lIiwgIlBvbnRhbCBkbyBBcmFndWFpYSIsIA0KIlBvbnRlIEJyYW5jYSIsICJQb250ZXMgZSBMYWNlcmRhIiwgIlBvcnRvIEFsZWdyZSBkbyBOb3J0ZSIsIA0KIlBvcnRvIGRvcyBHYXVjaG9zIiwgIlBvcnRvIEVzcGVyaWRpYW8iLCAiUG9ydG8gRXN0cmVsYSIsICJQb3hvcmVvIiwgDQoiUHJpbWF2ZXJhIGRvIExlc3RlIiwgIlF1ZXJlbmNpYSIsICJTYW8gSm9zZSBkb3MgUXVhdHJvIE1hcmNvcyIsIA0KIlJlc2VydmEgZG8gQ2FiYWNhbCIsICJSaWJlaXJhbyBDYXNjYWxoZWlyYSIsICJSaWJlaXJhb3ppbmhvIiwgDQoiUmlvIEJyYW5jbyIsICJTYW50YSBDYXJtZW0iLCAiU2FudG8gQWZvbnNvIiwgIlNhbyBKb3NlIGRvIFBvdm8iLCANCiJTYW8gSm9zZSBkbyBSaW8gQ2xhcm8iLCAiU2FvIEpvc2UgZG8gWGluZ3UiLCAiU2FvIFBlZHJvIGRhIENpcGEiLCANCiJSb25kb2xhbmRpYSIsICJSb25kb25vcG9saXMiLCAiUm9zYXJpbyBPZXN0ZSIsICJTYW50YSBDcnV6IGRvIFhpbmd1IiwgDQoiU2FsdG8gZG8gQ2V1IiwgIlNhbnRhIFJpdGEgZG8gVHJpdmVsYXRvIiwgIlNhbnRhIFRlcmV6aW5oYSIsIA0KIlNhbnRvIEFudG9uaW8gZG8gTGVzdGUiLCAiU2FudG8gQW50b25pbyBkbyBMZXZlcmdlciIsICJTYW8gRmVsaXggZG8gQXJhZ3VhaWEiLCANCiJTYXBlemFsIiwgIlNlcnJhIE5vdmEgRG91cmFkYSIsICJTaW5vcCIsICJTb3JyaXNvIiwgIlRhYmFwb3JhIiwgDQoiVGFuZ2FyYSBkYSBTZXJyYSIsICJUYXB1cmFoIiwgIlRlcnJhIE5vdmEgZG8gTm9ydGUiLCAiVGVzb3VybyIsIA0KIlRvcml4b3JldSIsICJVbmlhbyBkbyBTdWwiLCAiVmFsZSBkZSBTw6NvIERvbWluZ29zIiwgIlZhcnplYSBHcmFuZGUiLCANCiJWZXJhIiwgIlZpbGEgUmljYSIsICJOb3ZhIEd1YXJpdGEiLCAiTm92YSBNYXJpbGFuZGlhIiwgIk5vdmEgTWFyaW5nYSIsIA0KIk5vdmEgTW9udGUgVmVyZGUiLCAiVG90YWwiKSwgYm92aW5vcyA9IGMoNDUsIDU1MSwgMTI3MiwgMjE1LCANCjcyLCA5NCwgMzYsIDM1LCAxOTYsIDI2MCwgMTksIDM3MywgNjMsIDMzNSwgMTUyLCA0MTEsIDEwMjAsIDYzLCANCjI1MywgMTQxMiwgMTcxLCA0MiwgMTA3LCA4LCA1NywgNDgxLCAxNzMsIDE0NywgMTQ5LCAyNywgNDY1LCANCjIzOSwgMzUsIDQ3NSwgODUsIDEwMCwgNzksIDc3MSwgOSwgOTksIDExNSwgMTUyLCAyNiwgODgsIDE1NywgDQoxMDIsIDU5LCAxNzIsIDE2OSwgNzUsIDQ2LCA1LCAyMDgsIDI3NCwgMTU3LCA1NiwgMjAyLCA4ODQsIDQyMCwgDQoxNDAsIDI1MiwgMTkwLCA2LCAyOSwgMTAyMiwgMjAxLCAxNzIsIDI2NSwgNzYsIDI2LCAxOTUsIDI1NSwgDQo3NCwgMTg2LCAxNDEsIDE0MSwgNDAyLCAxNzcsIDEwMywgODEsIDM2MywgMjI5LCAyNCwgMTQwLCAzNDAsIA0KNTQyLCAxMCwgNDA5LCAxNzIsIDExMCwgNDkxLCAxMjMsIDE1LCAxMTEzLCAzMSwgMTY3LCA1MjksIDEyOCwgDQo0MjIsIDE3NCwgMjU0LCAxNjgsIDYsIDI1NCwgMTUsIDkzLCA0MCwgNjAsIDYzLCAxNTEsIDQyNywgMTEsIA0KMjQ0LCA4MDksIDE4OCwgNzAsIDg4LCAyMiwgMjM4LCA1OSwgNTc1LCAyNTgsIDMxLCAyMCwgMjA1LCA1NCwgDQoxNTksIDY0NCwgMTA4LCAxMDQsIDk3LCAxNDMsIDM2LCAxMSwgMTk2LCA0MSwgNDQwLCA0MSwgODYsIDEzMSwgDQo0MjksIDMwNjk4KSwgVG90YWwgPSBjKDIzOCwgMzYzMywgOTU3MSwgMjU4OCwgNDA4LCAyMDcyLCAyOTUsIA0KMTg3OCwgMTE0MiwgNTY4LCAyMzQsIDI4NzYsIDg1NCwgMjg4MywgNDkyLCA1MTMwLCAxMTYxMywgNTAxLCANCjI2MTgsIDExNzY0LCA3NjgsIDY4ODMsIDczMTEsIDEzNjcsIDM5MywgMjk4OCwgNzU2LCA2MjksIDE5OTcsIA0KMjAwOCwgOTkxLCA0NDk5LCAxODcwLCAyNzk0LCAxNDIwLCA1ODksIDEyMzAsIDIwNDkxNSwgMjU2LCA3ODAsIA0KNjM3MSwgMTQyMCwgMTY2MCwgMzgzLCA3NTYsIDcxOCwgMjczLCAyODE4LCAxMzIxLCAyNzksIDEwMzEsIA0KNDA1LCA5NDYsIDMyMDQsIDUwMTEsIDcxOCwgODUzLCA1MzAzLCA1MzcwLCAxMDg2LCAxMTI3LCAxMDM4LCANCjE0MTA0LCAyMjQsIDE5NDYsIDE4MzAsIDI3NDIsIDQ5MTEsIDE5OTcsIDU3OSwgODkyLCAxMDM2LCAyNTQsIA0KNzk0LCA0ODcsIDQzNywgMTI5NSwgMTAzMzcsIDQ0MDgsIDIwNDksIDE5MzcsIDYzMiwgMjI2LCAxNTg2LCANCjExNzMsIDMyODksIDg0LCAzOTQ2LCAxODEyLCAzMzcsIDI3ODIsIDU0OSwgMTE4LCA1OTIwLCA2MzgsIDkxNiwgDQoxNDkyLCA0MDEsIDE5NTUsIDEzMDY5LCAyNDM2LCAyNDQ4LCAxODYsIDgxNSwgMjUxLCA0ODgsIDYzMSwgDQoyOTAsIDMwNCwgMjcwNCwgOTQ2LCA5MzgsIDcxNiwgNDEwNjYsIDE0NjUsIDI5MiwgNDQ5LCA3OTgsIDc0OCwgDQo3MzIsIDM5NDYsIDE0MDQsIDU4MzEsIDc5LCAyNTQ2OSwgMTYwOTgsIDE1NTQsIDE3MjY4LCAyNjc3LCA5NzcsIA0KMzkyLCA1NTksIDU0OCwgMzcsIDM4NzE4LCAxNzQ3LCAyMTk4LCAzMDIsIDQ1MCwgMTA0MywgMTM4MiwgNjIyNDU5DQopKSwgcm93Lm5hbWVzID0gYyhOQSwgLTE0MkwpLCBjbGFzcyA9IGMoInRibF9kZiIsICJ0YmwiLCAiZGF0YS5mcmFtZSINCikpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCklDTl9TYWxhIDwtIHJlYWRfZXhjZWwoIklDTiBTYWxhLnhsc3giLCBzaGVldCA9ICJSIikNCmtuaXRyOjprYWJsZShJQ05fU2FsYSkNCmBgYA0KDQojIyBDYXJyZWdhciBmdW7Dp8O1ZXMNCg0KVXRpbGl6YW5kbyBmdW7Dp8O1ZXMgcG9yIG7Ds3MgcHJlcGFyYWRhcywgY2FycmVnYXIgYXMgZnVuw6fDtWVzIHBhcmEgYSBtZW3Ds3JpYSBkbyBSU3R1ZGlvLiBFbSB0b2RhcywgYSBmdW7Dp8OjbyByZXF1ZXIgcXVhdHJvIGFyZ3VtZW50b3M6ZV9raSwgZV9pLCBlX2ssIGUuIEVtIHVtIHByw7N4aW1vIGRlc2Vudm9sdmltZW50byBkZXZvIGFncmVnYXIgYXMgdHLDqnMgZnVuw6fDtWVzIGVtIHVtYSBzw7MhDQoNCmBgYHtyfQ0KIyBRTCA9IHF1b2NpZW50ZSBsb2NhY2lvbmFsDQpRTCA8LQ0KICBmdW5jdGlvbiAoZV9raSwgZV9pLCBlX2ssIGUpIHsNCiAgICANCiAgICBzX2tpIDwtIGVfa2kvZV9pDQogICAgDQogICAgc19pIDwtIGVfay9lICANCiAgICANCiAgICBMUSA8LSBzX2tpL3NfaQ0KICAgIA0KICAgIHJldHVybihMUSkNCiAgfQ0KIyBJSEggPSBJbmRpY2UgSGVyZmluZGFobC1IaXJzY2htYW4gbW9kaWZpY2Fkbw0KSUhIIDwtDQogIGZ1bmN0aW9uIChlX2tpLCBlX2ksIGVfaywgZSkgew0KICAgIA0KICAgIHNfa2kgPC0gZV9raS9lX2sNCiAgICANCiAgICBzX2kgPC0gZV9pL2UgIA0KICAgIA0KICAgIElISCA8LSBzX2tpLXNfaQ0KICAgIA0KICAgIHJldHVybihJSEgpDQogIH0NCiMgUFIgPSBwYXJ0aWNpcGFjYW8gcmVsYXRpdmENClBSPC1mdW5jdGlvbiAoZV9raSwgZV9pLCBlX2ssIGUpIHsNCg0KICANCiAgc19raSA8LSBlX2tpL2Vfaw0KICANCiBQUiA8LSBzX2tpDQogIA0KICByZXR1cm4oUFIpDQp9DQoNCmBgYA0KDQojIyBDw6FsY3VsbyBkb3MgY29tcG9uZW50ZXMgKFFMLCBJSEgsIFBSKQ0KDQpBdGVudGFyIHF1ZSBvcyBjw6FsY3Vsb3MgbsOjbyBlc3TDo28gZ2VuZXJhbGl6YWRvcyBwYXJhIG8gbsO6bWVybyBkZSBtdW5pY8OtcGlvcy4gT3Ugc2VqYSwgc2UgdGl2ZXIgNzkgbXVuaWPDrXBpb3MgZW0gTVMsIHByZWNpc2Fyw6EgYWx0ZXJhciBvIDE0MSBkZSBNVCBwYXJhIDc5IGRlIE1TLiBGaWNhIGEgZGljYSBwYXJhIHVzYXIgbyBnZW7DqXJpY28gYGxlbmd0aCgpYCBlbSB1bSBwcsOzeGltbyBkZXNlbnZvbHZpbWVudG8gZGVzdGFzIGZ1bsOnw7Vlcy4gTyBjaHVuayBhYmFpeG8gw6kgZ2Vuw6lyaWNvIGUgY29tcHV0YSBvIHZhbG9yIGRvcyBhcmd1bWVudG9zIEUgKGVtcHJlZ28gdG90YWwgZGEgbG9jYWxpZGFkZSBkZSByZWZlcsOqbmNpYSksIGVpIChvIGVtcHJlZ28gdG90YWwgZGEgbG9jYWxpZGFkZSBpKSwgZSBFayAobyBlbXByZWdvIHRvdGFsIGRhIGxvY2FsaWRhZGUgZGUgcmVmZXLDqm5jaWEgZG8gc2V0b3IgaykuIEVzdGVzIGFyZ3VtZW50b3Mgc2Vyw6NvIHV0aWxpemFkb3MgbmFzIHRyw6pzIGZ1bsOnw7Vlcy4NCg0KYGBge3J9DQpkYWRvczwtSUNOX1NhbGEgICAjIGFwZW5hcyBtdWRlaSBvIG5vbWUgZG8gZGF0YXNldCBwYXJhIGRhZG9zDQojIErDgSBDT0xPUVVFSSBPIFRPVEFMIE5PUyBEQURPUw0KRTwtY29sU3VtcyAoZGFkb3NbMToxNDEsM10sIGRpbXMgPSAxKSAgIyBjb25mZXJpciByZXN1bHRhZG8gY29tIG8gdG90YWwgZGEgY29sdW5hIFRvdGFsDQplaTwtZGFkb3NbMToxNDEsM10gICMgY29sdW5hIGRvIFRvdGFsIHBhcmEgMTQxIG11bmljaXBpb3MgZGUgTVQNCiMgZWkgw6kgbyBlbXByZWdvIHRvdGFsIGRhIGxvY2FsaWRhZGUgaSwgDQojIEUgw6kgbyBlbXByZWdvIHRvdGFsIGRhIHJlZmVyw6puY2lhDQojIEVrIMOpIG8gZW1wcmVnbyB0b3RhbCBkYSByZWZlcsOqbmNpYSBkbyBzZXRvciBrDQpFazwtIHQoY29sU3VtcyhkYWRvc1sxOjE0MSwyXSwgZGltcyA9IDEpKSAjIHRvdGFsIGRhIGNvbHVuYSBkbyBzZXRvciBib3Zpbm9zDQpgYGANCg0KIyMjIFFMDQoNCmBgYHtyfQ0KIyBxbA0KcWwubXQ8LVFMKGRhZG9zWzE6MTQxLDJdLA0KICAgICAgICAgIGVpLCANCiAgICAgICAgICBFa1sxLDFdLCANCiAgICAgICAgICBFKQ0KaGVhZChxbC5tdCkgICMgcHJpbWVpcmFzIDYgbGluaGFzIGRlIFFMDQpjbGFzcyhxbC5tdCkNCmBgYA0KDQojIyMgSUhIDQoNCmBgYHtyfQ0KSUhILm10PC1JSEgoZGFkb3NbMToxNDEsMl0sDQogICAgICAgICAgZWksIA0KICAgICAgICAgIEVrWzEsMV0sIA0KICAgICAgICAgIEUpDQpoZWFkKElISC5tdCkgICMgcHJpbWVpcmFzIDYgbGluaGFzIGRlIElISA0KY2xhc3MoSUhILm10KQ0KYGBgDQoNCiMjIyBQUg0KDQpgYGB7cn0NClBSLm10PC1QUihkYWRvc1sxOjE0MSwyXSwNCiAgICAgICAgICAgIGVpLCBFa1sxLDFdLCBFKQ0KUFIubXQ8LWFzLmRhdGEuZnJhbWUoUFIubXQpDQpoZWFkKFBSLm10KSAgICMgcHJpbWVpcmFzIDYgbGluaGFzIGRlIFBSDQpjbGFzcyhQUi5tdCkNCmBgYA0KDQojIyMgVGFiZWxhIGRvcyBjb21wb25lbnRlcyBvcmlnaW5haXMgKG7Do28gcGFkcm9uaXphZG9zKQ0KDQpgYGB7cn0NCiMgdGFiZWxhDQpjb21wb25lbnRlczwtY2JpbmQoTXVuaWM9ZGFkb3NbMToxNDEsMV0sUUw9cWwubXQsSUhIPUlISC5tdCxQUj1QUi5tdCkNCmNvbG5hbWVzKGNvbXBvbmVudGVzKTwtYygiTXVuaWNpcGlvIiwiUUwiLCJJSEgiLCJQUiIpDQprbml0cjo6a2FibGUoY29tcG9uZW50ZXMpDQpgYGANCg0KIyMgSUNODQoNCiMjIyBDb21wb25lbnRlcyBwcmluY2lwYWlzDQoNCk9ic2VydmFyIHF1ZSBvIHBhY290ZSBgcHN5Y2hgIHByZWNpc2EgZXN0YXIgaW5zdGFsYWRvLiBSZWNvbWVuZGEtc2Ugb2JzZXJ2YXIgcGFyYSBvIHRlc3RlIGRlIGVzZmVyaWNpZGFkZSBkZSBCYXJ0bGV0dCAobmVzdGUgZXhlbXBsbywgcC12YWx1ZVw8MC4wNSBlIHJlamVpdG8gSDAgZGUgcXVlIGEgbWF0cml6IGRlIGNvcnJlbGHDp8OjbyDDqSB1bWEgbWF0cml6IGlkZW50aWRhZGUpIGUgb3MgdGVzdGVzIEtNTyBhbnRlcyBkZSByZWFsaXphciBvIHByb2NlZGltZW50by4gRmFyZW1vcyB1bWEgYW7DoWxpc2UgZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFpcyBjb20gcm90YcOnw6NvIHZhcmltYXgsIHBhZHJvbml6YW5kbyBvcyBjb21wb25lbnRlcyAoYHNjYWxlYCkgYW50ZXMgZGUgY2hhbWFyIGEgZnVuw6fDo28gYHBzeWNoOjpwcmluY2lwYWwoKWAuDQoNClNlIGEgc2lnbmlmaWPDom5jaWEgZG8gVGVzdGUgZGUgQmFydGxldHQgZm9yIG1lbm9yIHF1ZSBvIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSAodXN1YWxtZW50ZSA1JSA9IDAuMDUpIGEgaGlww7N0ZXNlIG51bGEgc2Vyw6EgcmVqZWl0YWRhIGUgYSBhbsOhbGlzZSBwb2RlIHNlciByZWFsaXphZGEgY29uZm9ybWUgSGFpciBldCBhbC4oMjAwNSkgZSBNaW5nb3RpICgyMDA1KSwgY2l0YWRvcyBwb3IgRGFsbGVtb2xlICgyMDA3LCBwLiA2NCkuDQoNCk8gdGVzdGUgS2Fpc2VyLU1leWVyLU9sa2luIChLTU8pIHBlcm1pdGUgYXZhbGlhciBzZSBvIG1vZGVsbyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWlzIGVzdMOhIGFqdXN0YWRvIGNvcnJldGFtZW50ZSBhb3MgZGFkb3MsIG91IGFkZXF1YWRvICgqYWRlcXVhY3kgS01PIHRlc3QqKS4gTmVzdGUgY2FzbywgaW5kaWNvdSB2YWxyb2VzIGRlIE1TQSBnZXJhbCAob3ZlcmFsbCBNU0EpIGRlIDAuNDgsIGUgdmFsb3JlcyBpbmRpdmlkdWFpcyBkZSBjYWRhIGNvbXBvbmVudGUgZGUgMC40NiBhIDAuNDgsIHZhbG9yZXMgbXVpdG8gYmFpeG9zLiBIYWlyIGV0IGFsLiAoMjAwNiksIGNpdGFkbyBwb3IgRGFsbGVtb2xlICgyMDA3KSwgc3VnZXJlbSBvIG3DrW5pbW8gZGUgMC41MCBjb21vIG3DrW5pbW8gYWNlaXTDoXZlbCwgbyBxdWUgbsOjbyBmb2kgZW5jb250cmFkbyBuZXN0ZSBleGVtcGxvLiBJZ25vcmFyZW1vcyBwYXJhIGZpbnMgbWVyYW1lbnRlIGRpZMOhdGljb3MgZXN0YSBzaXR1YcOnw6NvLg0KDQpgYGB7cn0NCiMgcGFkcm9uaXphciB2YXJpYXZlaXMNCnggPC0gc2NhbGUoY29tcG9uZW50ZXNbLDI6NF0pDQpyIDwtIGNvcih4KSAgIyBtYXRyaXogZGUgY29ycmVsYcOnw6NvIGRlIHgNCnBzeWNoOjpjb3J0ZXN0LmJhcnRsZXR0KHIsIG49bGVuZ3RoKHhbLDFdKSkgICMgdGVzdGUgZGUgQmFydGxldHQNCnBzeWNoOjpLTU8ocikgICMgdGVzdGUgZGUgS01PDQojIHJlYWxpemFyIGNvbXBvbmVudGVzIHByaW5jaXBhaXMgZW0geA0KcGNhX3BzeWNoX3JvdGF0ZWQgPC0gcHN5Y2g6OnByaW5jaXBhbCh4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlPSJ2YXJpbWF4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mYWN0b3JzPTMsIHNjb3Jlcz1GLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmxpcXVlLnNjb3Jlcz1UKQ0Kc3VtbWFyeShwY2FfcHN5Y2hfcm90YXRlZCkNCmBgYA0KDQojIyMgRXh0cmHDp8OjbyBkb3MgbG9hZGluZ3MgZSBQcm9wb3J0aW9uX1Zhcg0KDQpgYGB7cn0NCnBjYV9wc3ljaF9yb3RhdGVkJHZhbHVlcyAgIyBsb2FkaW5ncyA9IGVpZ2VudmFsdWVzDQpwY2FfcHN5Y2hfcm90YXRlZCRsb2FkaW5ncyAgIyByb3RhdGVkIGNvbXBvbmVudCBtYXRyaXgNCiMNCiMgZXh0cmFjdCBsb2FkaW5ncyBhcyBhIGRhdGEuZnJhbWUgDQojIChodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNzM3MTI2Ni9leHRyYWN0aW5nLW91dHB1dC1mcm9tLXByaW5jaXBhbC1mdW5jdGlvbi1pbi1wc3ljaC1wYWNrYWdlLWFzLWEtZGF0YS1mcmFtZSkNCmxvYWRpbmdzPC1hcy5kYXRhLmZyYW1lKHVuY2xhc3MocGNhX3BzeWNoX3JvdGF0ZWQkbG9hZGluZ3MpKQ0KbG9hZGluZ3MNCiMNCiMgbm9ybWFsaXphciBsb2FkaW5ncw0KbWF0cml6X25vcm1hbDwtdCh0KGxvYWRpbmdzKS9yb3dTdW1zKHQobG9hZGluZ3MpKSkNCm1hdHJpel9ub3JtYWwNCiMNCiMgUHJvcG9ydGlvbiBWYXINClZhY2NvdW50ZWQ8LWFzLmRhdGEuZnJhbWUodW5jbGFzcyhwY2FfcHN5Y2hfcm90YXRlZCRWYWNjb3VudGVkKSkNClByb3BvcnRpb25fVmFyPC10KFZhY2NvdW50ZWRbMixdKSAgIyBtYXRyaXogZGUgYXV0b3ZhbG9yZXMNClByb3BvcnRpb25fVmFyDQpgYGANCg0KIyMjIyBvYnRlciB0aGV0YSA9IG1hdHJpel9ub3JtYWwlXColdmFyZXhwbA0KDQpgYGB7cn0NCiN2YXJleHBsICDDqSBvIG1lc21vIHF1ZSBQcm9wb3J0aW9uX1ZhciB0cmFuc3Bvc3RvDQp2YXJleHBsPC1tYXRyaXgocGNhX3BzeWNoX3JvdGF0ZWQkVmFjY291bnRlZFs0LF0sbnJvdyA9IDEsbmNvbCA9IDMpDQp2YXJleHBsICANCnRoZXRhPW1hdHJpel9ub3JtYWwlKiVQcm9wb3J0aW9uX1Zhcg0KY29sbmFtZXModGhldGEpPC1jKCJ0aGV0YSIpDQp0aGV0YQ0KYGBgDQoNCiMjIyBDw6FsY3VsbyBkZSBJQ04NCg0KYGBge3J9DQpkYWRvc19vcmlnaW5haXM8LWNvbXBvbmVudGVzWywyOjRdDQpJQ049YXMubWF0cml4LmRhdGEuZnJhbWUoZGFkb3Nfb3JpZ2luYWlzLG5jb2wgPSAzLG5yb3cgPSAxNDEpICUqJSBtYXRyaXgodGhldGEsbnJvdyA9IDMsbmNvbCA9IDEpDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCnByaW50KGhlYWQoSUNOKSkgICMgcHJpbWVpcmFzIDYgbGluaGFzIGRlIElDTg0KdGFiZWxhX2ZpbmFsPC1jYmluZChjb21wb25lbnRlcyxJQ049SUNOKQ0Ka25pdHI6OmthYmxlKHRhYmVsYV9maW5hbCkNCmBgYA0KDQojIFJlZmVyw6puY2lhcyB7I1JlZmVyw6puY2lhcyAudW5udW1iZXJlZH0NCg0KQkFMQVNTQSwgQi4gVHJhZGUgTGliZXJhbGl6YXRpb24gYW5kIFJldmVhbGVkIENvbXBhcmF0aXZlIEFkdmFudGFnZSwgVGhlIE1hbmNoZXN0ZXIgU2Nob29sIDMzOiA5OS0xMjMuIDE5NjUuDQoNCkNST0NDTywgTS5BLjsgR0FMSU5BUkksIFIuOyBTQU5UT1MsIEYuOyBMRU1PUywgTS5CLjsgU0lNw5VFUywgUi4gTWV0b2RvbG9naWEgZGUgaWRlbnRpZmljYcOnw6NvIGRlIGFycmFuam9zIHByb2R1dGl2b3MgbG9jYWlzIHBvdGVuY2lhaXM6IHVtYSBub3RhIHTDqWNuaWNhLiBUZXh0byBwYXJhIERpc2N1c3PDo28gTi4gMTkxLiBCZWxvIEhvcml6b250ZTogVUZNRy9DRURFUExBUiwgQWJyaWwvMjAwMy4NCg0KQ1JVWiwgQi5PLjsgUVVFSVJPWiwgSS5WLiBFZmVpdG9zIGVuY2FkZWFkb3MgZG8gcGVyZmlsIHNldG9yaWFsIGRvcyBpbnZlc3RpbWVudG9zIGUgYSBkaXN0cmlidWnDp8OjbyBlc3BhY2lhbCBkYSBpbmTDunN0cmlhOiBvbmRlIHNlIGxvY2FsaXphbSBhcyBpbmTDunN0cmlhcyBkb3Mgc2V0b3JlcyBjb20gbWFpb3JlcyBpbXBhY3Rvcz8gVGV4dG8gcGFyYSBkaXNjdXNzw6NvIG4uIDIxNzIsIEJyYXPDrWxpYTogSVBFQSwgMjAxNi4NCg0KREFMTEVNT0xFLCBELiBDYWRlaWEgcHJvZHV0aXZhIGRlIGNvdXJvIGUgZGVyaXZhZG9zIG5vIGVzdGFkbyBkbyBQYXLDoSA6IEltcGxpY2HDp8O1ZXMgcGFyYSBvIERlc2Vudm9sdmltZW50byBMb2NhbC4gVGVzZSAoRG91dG9yYWRvIGVtIENpw6puY2lhcyBBZ3LDoXJpYXMpLiBCZWzDqW0tUEE6IFVGUkEsIDIwMDcuDQoNCkZMT1JFTkNFLCBQLiBTYXJnZW50LiBJbnZlc3RtZW50LCBsb2NhdGlvbiwgYW5kIHNpemUgb2YgcGxhbnQuIENhbWJyaWRnZTogQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MsIDE5NDguDQoNCk1PTkFTVEVSSU8sIExlb25hcmRvLiBJbmRpY2Fkb3JlcyBkZSBhbsOhbGlzZSByZWdpb25hbCBlIGVzcGFjaWFsLiBJbjogQ1JVWiBldCBhbCAob3JncykuIEVjb25vbWlhIHJlZ2lvbmFsIGUgdXJiYW5hIDogdGVvcmlhcyBlIG3DqXRvZG9zIGNvbSDDqm5mYXNlIG5vIEJyYXNpbC4gQnJhc8OtbGlhOiBJcGVhLCAyMDExLiBjYXAuIDEwLiBwcC4zMTUtMzMxLg0KDQpTT1VaQSwgRmlsaXBlIExhZ2UgZGUuIEEgbG9jYWxpemHDp8OjbyBkYSBpbmTDunN0cmlhIGRlIHRyYW5zZm9ybWHDp8OjbyBicmFzaWxlaXJhIG5hcyDDumx0aW1hcyB0csOqcyBkw6ljYWRhcy4gUmlvIGRlIEphbmVpcm86IEVQR0UtRkdWLCAyMDAyLiAoRGlzc2VydGHDp8OjbywgTWVzdHJhZG8gZW0gRWNvbm9taWEpLiAxMzBwLg0K