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: reprodução de medidas de LQ conforme Haddad (2018) em R. Campo Grande-MS,Brasil: RStudio/Rpubs, 2020. Disponível em http://rpubs.com/amrofi/medidas_QL_haddad_regional e em https://adrianofigueiredo.netlify.app/post/economia-regional-reproducao-de-medidas-de-lq/.

1 Introdução

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)

Para esse exercício, tentaremos reproduzir os resultados das notas de aula do Prof. Eduardo Amaral Haddad (FEA-USP) utilizando o R (HADDAD, 2018). O link para os dados de emprego estão em http://www.usp.br/nereus/wp-content/uploads/Emprego-Munic%C3%ADpios-1992_2002-26-categorias.xlsx. A base de dados de valores da produção das regiões e setores estão em http://www.usp.br/nereus/wp-content/uploads/Classic_Measures_Isard.xlsx.

Os slides de aula contendo algumas orientações para os cálculos em Excel estão em: http://www.usp.br/nereus/wp-content/uploads/Aula_1_Medidas3.pdf, Aula 1: Medidas de Concentração, Especialização e Localização. Os dados foram baixados e armazenados no mesmo diretório do projeto a fim de agilizar a rotina do RMarkdown. Entretanto, os usuários podem obtê-los fazendo uso do R conforme segue.

# Executar uma vez para baixar xlsx
require(readxl)
suppressMessages(suppressWarnings(library(httr)))
url1 <- "http://www.usp.br/nereus/wp-content/uploads/Classic_Measures_Isard.xlsx"
download.file(url1, destfile = "Classic_Measures_Isard.xlsx", mode = "wb")

Após realizar o download, chamei os dados para o RStudio a partir da planilha .xlsx e fiz um dput() do objeto para colocá-lo “embedded” para vocês. É só baixar o script deste Markdown e vocês conseguirão acesso direto aos dados. Eles ficarão “omitidos” deste post apenas para economizar espaço e dar maior clareza ao texto.

require(readxl)
Classic_Measures_Isard <- read_excel("Classic_Measures_Isard.xlsx", sheet = "Basic data")
DT::datatable(Classic_Measures_Isard)
Tela dos dados básicos para realizar Quociente Locacional

Tela dos dados básicos para realizar Quociente Locacional

2 Procedimentos

2.1 Quociente Locacional (QL)

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{{\frac{{{E_{ki}}}}{E_i}}}{{\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.

A representação de Haddad (2018) é no mesmo sentido, apenas a diferença é que invés de mencionar o emprego como variável, ele coloca produção. Isso é realizado em vários estudos, principalmente nos do tipo insumo-produto, quando se colocam os valores de valor adicionado. Em alguns estudos encontramos também versões com a produção agrícola, ou ainda os valores de exportações para a análoga da vantagem comparativa revelada de Balassa. A fórmula da nota de aula de Haddad (2018), portanto, é a mesma, apenas com indicação algébrica alterada para \(R_i\) e \(N_i\) para indicar a região (R) e o país (N) no setor i, a saber:

\[ QL_{i}=\left( {\frac{{\frac{{{R_{i}}}}{N_i}}}{{\frac{{{R}}}{N}}}} \right)=\left( {\frac{{\frac{{{R_{i}}}}{R}}}{{\frac{{{N_i}}}{N}}}} \right) \]

em que: \({R_i}\) é a produção no setor \(i\) na localidade de análise; \({R}\) é a produção total na localidade de análise; \({N_i}\) é a produção no setor \(i\) da localidade de referência (do país); e \(N\) é a produção total da localidade de referência (do país).

É interessante olhar estas razões (ou shares), pois no cálculo exemplificado em Excel, ficarão evidenciadas as operações matemáticas.

2.1.1 EconGeo de Balland (2017)

Esta rotina pode ser resumida fazendo o uso do pacote EconGeo, e a função RCA para obter o Quociente Locacional (similar ao Revealed Comparative Advantage - RCA - índice de Balassa, 1965). O pacote pode ser instalado fazendo como a seguir:

install.packages("devtools")
library(devtools)
devtools::install_github("PABalland/EconGeo", force = T)

Ela utiliza uma matriz contendo os dados no formato abaixo, em que \((I1,I2,I3)\) são as indústrias ou setores, para os municípios \((R1,R2,R3)\).

municipio  |I1       |I2      | I3
-----------|---------|--------|------------
 R1        |100      |150     | 165
 R2        |130      |400     | 220
 R3        |200      |1200    | 20

Prepararemos os dados para os cálculos, construindo uma matriz mat para os dados de medidas clássicas de Isard:

library(EconGeo)
## gerar a matriz industrial da região, para T0
set.seed(31)
mat_0 <- as.matrix(Classic_Measures_Isard[3:26, 3:6])
rownames(mat_0) <- c("R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10", 
    "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20", "R21", 
    "R22", "R23", "R24")
colnames(mat_0) <- c("setor1", "setor2", "setor3", "setor4")

O cálculo do Quociente Locacional (QL = RCA) será fazendo:

class(mat_0) <- "numeric"
QL_T0 <- round(RCA(mat_0), digits = 4)

Você pode comparar esse resultado com o da planilha LQ1, onde os cálculos forma feitos em fórmulas do Excel. Similarmente fizemos para T1 e depois colocamos tudo em uma só tabela.

library(EconGeo)
## gerar a matriz industrial da região, para T0
set.seed(31)
mat_1 <- as.matrix(Classic_Measures_Isard[3:26, 9:12])
rownames(mat_1) <- c("R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10", 
    "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20", "R21", 
    "R22", "R23", "R24")
colnames(mat_1) <- c("setor1", "setor2", "setor3", "setor4")
class(mat_1) <- "numeric"
QL_T1 <- round(RCA(mat_1), digits = 4)
LQ1 <- cbind(QL_T0, QL_T1)
knitr::kable(LQ1, caption = "Quociente Locacional em T0 e T1")
Quociente Locacional em T0 e T1
setor1 setor2 setor3 setor4 setor1 setor2 setor3 setor4
R1 2.7091 0.4514 0.7233 1.1800 2.7095 0.2243 0.8269 1.2228
R2 2.3973 0.3297 1.4113 1.2305 2.3067 0.4429 1.4311 0.9841
R3 1.6141 0.5886 1.0156 1.3102 1.8683 0.5749 0.6895 1.2064
R4 2.1558 0.3398 1.2961 1.3451 1.8978 0.2948 1.0996 1.4151
R5 1.4793 0.7138 0.7317 1.2884 1.6663 0.6772 0.6146 1.1921
R6 2.1643 0.5634 1.0122 1.1397 1.7470 0.8488 0.8377 0.9009
R7 2.2904 0.5345 0.8867 1.1722 2.5493 0.3214 0.7746 1.1910
R8 1.0648 0.8945 0.8069 1.1790 1.3611 0.6250 0.8574 1.3201
R9 2.5897 0.4222 0.8057 1.2360 2.3847 0.3955 0.6609 1.2037
R10 0.8128 1.1945 0.5701 0.9541 1.1910 0.1730 0.9171 1.9035
R11 3.3012 0.1498 0.6553 1.3808 3.1914 0.1244 0.5365 1.2092
R12 0.1344 1.0416 1.4655 1.1140 0.0634 1.1328 1.5133 1.1110
R13 3.1159 0.1735 1.1504 1.2554 2.4057 0.2431 1.0756 1.2660
R14 3.6211 0.2096 0.7996 1.1350 3.2901 0.2534 0.7295 0.9676
R15 2.2419 0.3201 1.3951 1.3065 2.1339 0.4689 1.2821 1.0654
R16 2.3407 0.4668 1.1410 1.1594 1.8408 0.5910 1.1923 1.0705
R17 0.2218 1.5427 0.3959 0.7711 0.3100 1.3974 0.3411 0.9987
R18 1.9839 0.4866 1.5346 1.1364 1.8896 0.6688 1.3175 0.9271
R19 0.6793 1.3345 0.6490 0.7927 0.8544 1.3450 0.6028 0.7617
R20 1.0445 0.9444 0.9613 1.0698 1.0393 0.8633 0.8498 1.1811
R21 1.4613 1.0047 0.5428 0.9725 0.8661 1.3042 0.4442 0.8449
R22 0.0223 1.5209 0.8922 0.7108 0.0214 1.5396 1.1191 0.7560
R23 1.3082 1.1893 0.5759 0.7746 1.3513 1.1581 0.4588 0.8055
R24 1.1684 1.1885 0.5659 0.8309 1.2753 1.1842 0.5556 0.7826

E agora reproduzimos a tela do Excel, pasta “LQ1”, previamente calculado para conferência.

Resultados da planilha em MS Excel para LQ1.

Resultados da planilha em MS Excel para LQ1.

2.1.2 Exemplificando pelo Excel

Acompanhando a notação da nota de aula de Haddad (2018), coloco as imagens do procedimento realizado no Excel. Para recordar, a expressão é
\[ QL_{i}=\left( {\frac{{\frac{{{R_{i}}}}{N_i}}}{{\frac{{{R}}}{N}}}} \right)=\left( {\frac{{\frac{{{R_{i}}}}{R}}}{{\frac{{{N_i}}}{N}}}} \right) \]

2.1.2.1 LQ1

Passo 1: calcular as parcelas regionais (regional shares). Desta forma, o primeiro passo será obter \(\frac{R_i}{N_i}\).O procedimento começa fazendo as contas do valor (para a célula C4) igual a ='Basic data'!C4/'Basic data'!C$29. Ou seja, a célula C4 (produção da Region1 Sector1 em ‘Basic data’) dividido pela célula C29 (produção Total Sector1 em ‘Basic data’). Os cálculos seguem para as demais células e encorajamos o leitor a fazer a checagem na planilha.

Cálculo do share regional.

Cálculo do share regional.

O resultado obtido na coluna G, em Regional Shares, indica a parcela da região 1 no total (='Basic data'!G4/'Basic data'!G$29 em ‘Regional Shares’).

Passo 2: O resultado da coluna G será o denominador da expressão de \(QL_i\). Ou seja, passamos então ao passo 2 que é efetivamente o cálculo do QL.

Cálculo do quociente locacional - LQ1.

Cálculo do quociente locacional - LQ1.

O cálculo do valor (para a célula C4) igual a ='='Regional shares'!C4/'Regional shares'!$G4. Ou seja, a célula C4 (‘Regional shares’ da Region1 Sector1) dividido pela célula G4 de ‘Regional shares’ (o share total).

2.1.2.2 LQ2

O cálculo semelhante é feito por Haddad (2018) em LQ2 para evidenciar que fazendo pelo share setorial dará resultado igual, mas deve-se atentar pela alteração do sentido.

Passo 1 para LQ2: Neste LQ2, o cálculo será pela linha (ou seja, \(R_i/R\). Na planilha ‘Sectoral shares’, você encontrará em C4 a fórmula: ='Basic data'!C4/'Basic data'!$G4, ou seja, agora divide-se a coluna C por G fazendo o sectoral share. A linha 29 dará o denominador \(N_i/N\).

Cálculo do share setorial.

Cálculo do share setorial.

Passo 2 para LQ2: agora faz-se o cálculo do quociente locacional usando a fórmula, para a célula C4, ='Sectoral shares'!C4/'Sectoral shares'!C$29, ou seja, o share setorial da região dividido pelo share setorial do país (total).

Cálculo do quociente locacional - LQ2.

Cálculo do quociente locacional - LQ2.

Referências

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

BALLAND, P.A. Economic Geography in R: Introduction to the EconGeo Package, Papers in Evolutionary Economic Geography, 17 (09): 1-75, 2017.

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.

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

HADDAD, Eduardo Amaral. Aula 1: Medidas de Concentração, Especialização e Localização. In: HADDAD, E.A. Métodos de Análise Regional e Inter-regional. Departamento de Ciências Econômicas/UEMS, Ponta Porã - MS, 13 e 14 de junho de 2018. São Paulo: NEREUS-FEA-USP, 2018. Disponível em: http://www.usp.br/nereus/wp-content/uploads/Aula_1_Medidas3.pdf. Acesso em 27 Abr 2020.

HADDAD, Paulo R. (org.) (1989). Economia Regional: Teorias e Métodos de Análise. Banco do Nordeste, Fortaleza, cap. 4.

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.

NORTH, Douglas. Teoria da localização e crescimento econômico regional. In: SCWARTZMANN, J. (org.) Economia regional e urbana: tetos escolhidos. Belo Horizonte: UFMG, p.333-343, 1977.

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.

LS0tDQp0aXRsZTogIkVjb25vbWlhIFJlZ2lvbmFsOiByZXByb2R1w6fDo28gZGUgbWVkaWRhcyBkZSBMUSBjb25mb3JtZSBIYWRkYWQgKDIwMTgpIGVtIFIiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbywgKmUtbWFpbDogYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIqIg0KbGlua2NvbG9yOiBibHVlDQphYnN0cmFjdDogDQogIFRoaXMgaXMgYW4gdW5kZXJncmFkIHN0dWRlbnQgbGV2ZWwgaW5zdHJ1Y3Rpb24gZm9yIGNsYXNzIHVzZS4gIA0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGZpZ19jYXB0aW9uOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCg0KYGBge3Iga25pdHJfaW5pdCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KHJtZGZvcm1hdHMpDQoNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iMTAwIikNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwNCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwNCiAgICAgICAgICAgICAgIHRpZHk9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkNCm9wdHNfa25pdCRzZXQod2lkdGg9MTAwKQ0KYGBgDQoNCg0KTGljZW7Dp2Egey0jTGljZW7Dp2F9DQo9PT09PT09PT09PT09PT09PT09DQoNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQgPGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8+IG9yIHNlbmQgYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgUE8gQm94IDE4NjYsIE1vdW50YWluIFZpZXcsIENBIDk0MDQyLCBVU0EuDQoNCiFbTGljZW5zZTogQ0MgQlktU0EgNC4wXShodHRwczovL21pcnJvcnMuY3JlYXRpdmVjb21tb25zLm9yZy9wcmVzc2tpdC9idXR0b25zLzg4eDMxL3BuZy9ieS1zYS5wbmcpeyB3aWR0aD0yNSUgfQ0KDQpDaXRhw6fDo28gey0jQ2l0YcOnw6NvfQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzoNCkZJR1VFSVJFRE8sIEFkcmlhbm8gTWFyY29zIFJvZHJpZ3Vlcy4gRWNvbm9taWEgUmVnaW9uYWw6IHJlcHJvZHXDp8OjbyBkZSBtZWRpZGFzIGRlIExRIGNvbmZvcm1lIEhhZGRhZCAoMjAxOCkgZW0gUi4gQ2FtcG8gR3JhbmRlLU1TLEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAyMC4gRGlzcG9uw612ZWwgZW0gPGh0dHA6Ly9ycHVicy5jb20vYW1yb2ZpL21lZGlkYXNfUUxfaGFkZGFkX3JlZ2lvbmFsPiBlIGVtIDxodHRwczovL2Fkcmlhbm9maWd1ZWlyZWRvLm5ldGxpZnkuYXBwL3Bvc3QvZWNvbm9taWEtcmVnaW9uYWwtcmVwcm9kdWNhby1kZS1tZWRpZGFzLWRlLWxxLz4uIA0KDQpJbnRyb2R1w6fDo28NCj09PT09PT09PT09PT09PT09PT0NCg0KDQpBIGlkZWlhIGLDoXNpY2EgZGVzdGUgYXJxdWl2byDDqSBvcmllbnRhciBvcyBwcm9jZWRpbWVudG9zIHBhcmEgbw0KY8OhbGN1bG8gZG9zIGluZGljYWRvcmVzIGRlIGFuw6FsaXNlIHJlZ2lvbmFsIGEgc2FiZXI6DQoNCjEuIFF1b2NpZW50ZSBMb2NhY2lvbmFsIChRTCkNCg0KDQpQYXJhIGVzc2UgZXhlcmPDrWNpbywgdGVudGFyZW1vcyByZXByb2R1emlyIG9zIHJlc3VsdGFkb3MgZGFzIG5vdGFzIGRlIGF1bGEgZG8gUHJvZi4gRWR1YXJkbyBBbWFyYWwgSGFkZGFkIChGRUEtVVNQKSB1dGlsaXphbmRvIG8gUiAoSEFEREFELCAyMDE4KS4gTyBsaW5rIHBhcmEgb3MgZGFkb3MgZGUgZW1wcmVnbyBlc3TDo28gZW0gPGh0dHA6Ly93d3cudXNwLmJyL25lcmV1cy93cC1jb250ZW50L3VwbG9hZHMvRW1wcmVnby1NdW5pYyVDMyVBRHBpb3MtMTk5Ml8yMDAyLTI2LWNhdGVnb3JpYXMueGxzeD4uIEEgYmFzZSBkZSBkYWRvcyBkZSB2YWxvcmVzIGRhIHByb2R1w6fDo28gZGFzIHJlZ2nDtWVzIGUgc2V0b3JlcyBlc3TDo28gZW0gPGh0dHA6Ly93d3cudXNwLmJyL25lcmV1cy93cC1jb250ZW50L3VwbG9hZHMvQ2xhc3NpY19NZWFzdXJlc19Jc2FyZC54bHN4Pi4gICAgDQogICAgDQpPcyBzbGlkZXMgZGUgYXVsYSBjb250ZW5kbyBhbGd1bWFzIG9yaWVudGHDp8O1ZXMgcGFyYSBvcyBjw6FsY3Vsb3MgZW0gRXhjZWwgZXN0w6NvIGVtOiA8aHR0cDovL3d3dy51c3AuYnIvbmVyZXVzL3dwLWNvbnRlbnQvdXBsb2Fkcy9BdWxhXzFfTWVkaWRhczMucGRmPiwgX0F1bGEgMTogTWVkaWRhcyBkZQ0KQ29uY2VudHJhw6fDo28sIEVzcGVjaWFsaXphw6fDo28gZSBMb2NhbGl6YcOnw6NvXy4gT3MgZGFkb3MgZm9yYW0gYmFpeGFkb3MgZSBhcm1hemVuYWRvcyBubyBtZXNtbyBkaXJldMOzcmlvIGRvIHByb2pldG8gYSBmaW0gZGUgYWdpbGl6YXIgYSByb3RpbmEgZG8gUk1hcmtkb3duLiBFbnRyZXRhbnRvLCBvcyB1c3XDoXJpb3MgcG9kZW0gb2J0w6otbG9zIGZhemVuZG8gdXNvIGRvIFIgY29uZm9ybWUgc2VndWUuDQoNCmBgYHtyIGRhZG9zX1ZSUCwgZXZhbD1GQUxTRX0NCiMgRXhlY3V0YXIgdW1hIHZleiBwYXJhIGJhaXhhciB4bHN4DQpyZXF1aXJlKHJlYWR4bCkNCnN1cHByZXNzTWVzc2FnZXMoc3VwcHJlc3NXYXJuaW5ncyhsaWJyYXJ5KGh0dHIpKSkNCnVybDE8LQ0KICAnaHR0cDovL3d3dy51c3AuYnIvbmVyZXVzL3dwLWNvbnRlbnQvdXBsb2Fkcy9DbGFzc2ljX01lYXN1cmVzX0lzYXJkLnhsc3gnDQpkb3dubG9hZC5maWxlKHVybDEsZGVzdGZpbGUgPSAiQ2xhc3NpY19NZWFzdXJlc19Jc2FyZC54bHN4Iixtb2RlID0gIndiIikNCmBgYA0KDQpBcMOzcyByZWFsaXphciBvIGRvd25sb2FkLCAgY2hhbWVpIG9zIGRhZG9zIHBhcmEgbyBSU3R1ZGlvIGEgcGFydGlyIGRhIHBsYW5pbGhhIC54bHN4IGUgZml6IHVtIGRwdXQoKSBkbyBvYmpldG8gcGFyYSBjb2xvY8OhLWxvICIqZW1iZWRkZWQqIiBwYXJhIHZvY8Oqcy4gw4kgc8OzIGJhaXhhciBvIHNjcmlwdCBkZXN0ZSBNYXJrZG93biBlIHZvY8OqcyBjb25zZWd1aXLDo28gYWNlc3NvIGRpcmV0byBhb3MgZGFkb3MuIEVsZXMgZmljYXLDo28gIm9taXRpZG9zIiBkZXN0ZSBwb3N0IGFwZW5hcyBwYXJhIGVjb25vbWl6YXIgZXNwYcOnbyBlIGRhciBtYWlvciBjbGFyZXphIGFvIHRleHRvLiANCg0KYGBge3IsIGV2YWw9RkFMU0V9DQpyZXF1aXJlKHJlYWR4bCkNCkNsYXNzaWNfTWVhc3VyZXNfSXNhcmQgPC0gcmVhZF9leGNlbCgiQ2xhc3NpY19NZWFzdXJlc19Jc2FyZC54bHN4IiwgDQogICAgc2hlZXQgPSAiQmFzaWMgZGF0YSIpDQpgYGANCg0KYGBge3IgZHB1dCxpbmNsdWRlPUZBTFNFfQ0KI2RwdXQoQ2xhc3NpY19NZWFzdXJlc19Jc2FyZCkNCkNsYXNzaWNfTWVhc3VyZXNfSXNhcmQ8LQ0KICBzdHJ1Y3R1cmUobGlzdCguLi4xID0gYyhOQSwgTkEsICJBbHRvIGRhIFNlcnJhIGRvIEJvdHVjYXJhaSIsIA0KIkFsdG8gSmFjdcOtIiwgIkNhbXBhbmhhIiwgIkNlbnRyYWwiLCAiQ2VudHJvIFN1bCIsICJGcm9udGVpcmEgTm9yb2VzdGUiLCANCiJGcm9udGVpcmEgT2VzdGUiLCAiSG9ydMOqbnNpYXMiLCAiSmFjdcOtIENlbnRybyIsICJMaXRvcmFsIiwgIk3DqWRpbyBBbHRvIFVydWd1YWkiLCANCiJNZXRyb3BvbGl0YW5vIGRvIERlbHRhIGRvIEphY3XDrSIsICJNaXNzw7VlcyIsICJOb3JkZXN0ZSIsICJOb3JvZXN0ZSBDb2xvbmlhbCIsIA0KIk5vcnRlIiwgIlBhcmFuaGFuYS1FbmNvc3RhIGRhIFNlcnJhIiwgIlByb2R1w6fDo28iLCAiU2VycmEiLCAiU3VsIiwgDQoiVmFsZSBkbyBDYcOtIiwgIlZhbGUgZG8gUmlvIGRvcyBTaW5vcyIsICJWYWxlIGRvIFJpbyBQYXJkbyIsIA0KIlZhbGUgZG8gVGFxdWFyaSIsIE5BLCAiVG90YWwgZG8gUmlvIEdyYW5kZSBkbyBTdWwiKSwgYEdSUCAoJClgID0gYyhOQSwgDQpOQSwgIlJlZ2lvbiAxIiwgIlJlZ2lvbiAyIiwgIlJlZ2lvbiAzIiwgIlJlZ2lvbiA0IiwgIlJlZ2lvbiA1IiwgDQoiUmVnaW9uIDYiLCAiUmVnaW9uIDciLCAiUmVnaW9uIDgiLCAiUmVnaW9uIDkiLCAiUmVnaW9uIDEwIiwgDQoiUmVnaW9uIDExIiwgIlJlZ2lvbiAxMiIsICJSZWdpb24gMTMiLCAiUmVnaW9uIDE0IiwgIlJlZ2lvbiAxNSIsIA0KIlJlZ2lvbiAxNiIsICJSZWdpb24gMTciLCAiUmVnaW9uIDE4IiwgIlJlZ2lvbiAxOSIsICJSZWdpb24gMjAiLCANCiJSZWdpb24gMjEiLCAiUmVnaW9uIDIyIiwgIlJlZ2lvbiAyMyIsICJSZWdpb24gMjQiLCBOQSwgIlRvdGFsIg0KKSwgVDAgPSBjKCJBZ3JvcGVjdcOhcmlhIiwgIlNlY3RvciAxIiwgIjIyMDA1MyIsICIzNzE3MDAiLCAiMjcyNjU3IiwgDQoiNjU3ODg1IiwgIjI1ODIyNSIsICI0MjMwMjUiLCAiOTkxMzgxIiwgIjE1MDg3NCIsICIyOTMyNjMiLCAiMTg4MzY0IiwgDQoiMzk4OTk2IiwgIjI3OTU5OCIsICI2NzAwMzUiLCAiMzkwNDQzIiwgIjU3NTkxMCIsICI0MDYyMTYiLCAiNDQ0MzciLCANCiI3MDcyMTEiLCAiNjk5MTM1IiwgIjc2NjQ2NCIsICIyMjYzOTciLCAiNDA0OTgiLCAiNjIzNzg5IiwgIjQ0NjgyNSIsIA0KTkEsICIxMDEwMzM4MSIpLCAuLi40ID0gYygiSW5kw7pzdHJpYSIsICJTZWN0b3IgMiIsICIxMzAxODYiLCANCiIxODE1MTciLCAiMzUzMDI3IiwgIjM2ODE5OSIsICI0NDIzNjMiLCAiMzkwOTg3IiwgIjgyMTQ0MCIsICI0NTAwMDkiLCANCiIxNjk3NTMiLCAiOTgyODg0IiwgIjY0Mjc0IiwgIjc2OTE3OTQiLCAiMTMyNDI0IiwgIjgwMjI5IiwgIjI5MTkwMyIsIA0KIjI4NzU5NSIsICIxMDk3NTUyIiwgIjYxNTg5NSIsICI0ODc2MjU5IiwgIjI0NjAyNzYiLCAiNTUyNjQ2IiwgDQoiOTgwMjM2MyIsICIyMDEzMzkzIiwgIjE2MTM3MjYiLCBOQSwgIjM1ODcwNjk0IiksIC4uLjUgPSBjKCJDb23DqXJjaW8iLCANCiJTZWN0b3IgMyIsICI1MTk1MSIsICIxOTM0OTAiLCAiMTUxNjk3IiwgIjM0OTc0NyIsICIxMTI5MzAiLCANCiIxNzQ5MzUiLCAiMzM5MzY1IiwgIjEwMTEwMiIsICI4MDY3NCIsICIxMTY4MjMiLCAiNzAwMzQiLCAiMjY5NTEzMiIsIA0KIjIxODczNiIsICI3NjIzNSIsICIzMTY4ODciLCAiMTc1MDk2IiwgIjcwMTQwIiwgIjQ4MzcwNCIsICI1OTA2NjEiLCANCiI2MjM3MjQiLCAiNzQzNjUiLCAiMTQzMjA5MSIsICIyNDI4MDAiLCAiMTkxMzU3IiwgTkEsICI4OTMzNjc2Ig0KKSwgLi4uNiA9IGMoIlNlcnZpw6dvcyIsICJTZWN0b3IgNCIsICIyNTcyODgiLCAiNTEyMTE2IiwgIjU5NDA4MyIsIA0KIjExMDE4NDEiLCAiNjAzNjU5IiwgIjU5NzkyNiIsICIxMzYyMDAwIiwgIjQ0ODQ0NCIsICIzNzU2OTEiLCANCiI1OTM1MjQiLCAiNDQ3OTY4IiwgIjYyMTk2MTQiLCAiNzI0NjU2IiwgIjMyODUwNyIsICI5MDA5MzgiLCANCiI1NDAwNzgiLCAiNDE0NzY1IiwgIjEwODczNzkiLCAiMjE5MDA2MCIsICIyMTA3MDk3IiwgIjQwNDQ0MyIsIA0KIjM0NjM4MzAiLCAiOTkxNDM4IiwgIjg1MzAwMyIsIE5BLCAiMjcxMjAzNDgiKSwgLi4uNyA9IGMoIlRvdGFsIiwgDQoiVG90YWwiLCAiNjU5NDc4IiwgIjEyNTg4MjMiLCAiMTM3MTQ2NCIsICIyNDc3NjcyIiwgIjE0MTcxNzciLCANCiIxNTg2ODczIiwgIjM1MTQxODYiLCAiMTE1MDQyOSIsICI5MTkzODEiLCAiMTg4MTU5NSIsICI5ODEyNzIiLCANCiIxNjg4NjEzOCIsICIxNzQ1ODUxIiwgIjg3NTQxNCIsICIyMDg1NjM4IiwgIjE0MDg5ODUiLCAiMTYyNjg5NCIsIA0KIjI4OTQxODkiLCAiODM1NjExNSIsICI1OTU3NTYxIiwgIjEyNTc4NTEiLCAiMTQ3Mzg3ODIiLCAiMzg3MTQyMCIsIA0KIjMxMDQ5MTEiLCBOQSwgIjgyMDI4MDk5IiksIC4uLjggPSBjKE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIA0KTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIA0KTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksIFQxID0gYygiQWdyb3BlY3XDoXJpYSIsICJTZWN0b3IgMSIsICIzMjU5MTAiLCANCiI2MDA5MDAiLCAiNDk2NjY1IiwgIjk2MzI4OSIsICI0OTI2NTYiLCAiNjA3MzM1IiwgIjE2NjA3NzkiLCANCiIzMTg4MDQiLCAiNDAxNTUxIiwgIjI4MDUwMyIsICI2ODgwNDAiLCAiMjE2MDcyIiwgIjcwMDQxNSIsICI2ODA5ODMiLCANCiI5MTI3NDYiLCAiNTgwNjE5IiwgIjkyNTEyIiwgIjEzMjk5MjciLCAiMTU4MjAyMiIsICIxMDIxNzg5IiwgDQoiMjY2NDgzIiwgIjU2MzcxIiwgIjEwNDU0NjQiLCAiODQ4NDI3IiwgTkEsICIxNjE3MDI2MiIpLCAuLi4xMCA9IGMoIkluZMO6c3RyaWEiLCANCiJTZWN0b3IgMiIsICI3NDA5OCIsICIzMTY4NjgiLCAiNDE5Njk4IiwgIjQxMDkyNyIsICI1NDk4NDciLCANCiI4MTAyODQiLCAiNTc0OTYxIiwgIjQwMjAxNSIsICIxODI4NzUiLCAiMTExODY3IiwgIjczNjY4IiwgIjEwNTk0Mjg5IiwgDQoiMTk0MzY5IiwgIjE0NDAwMiIsICI1NTA3ODEiLCAiNTExODgxIiwgIjExNDUyMjkiLCAiMTI5MjY2NiIsIA0KIjY4Mzk2MDAiLCAiMjMzMDczMiIsICIxMTAxOTYzIiwgIjExMTQ5MTYxIiwgIjI0NjA0ODYiLCAiMjE2MzQ5OSIsIA0KTkEsICI0NDQwNTc2NiIpLCAuLi4xMSA9IGMoIkNvbcOpcmNpbyIsICJTZWN0b3IgMyIsICI2MDA5OCIsICIyMjUyNTYiLCANCiIxMTA3NTAiLCAiMzM3MjQ4IiwgIjEwOTc5NCIsICIxNzU5NjEiLCAiMzA0OTExIiwgIjEyMTM0MCIsICI2NzI0MSIsIA0KIjEzMDUxMSIsICI2OTg4OSIsICIzMTEzOTM1IiwgIjE4OTIxNSIsICI5MTIzNCIsICIzMzEzNTUiLCAiMjI3MjE3IiwgDQoiNjE1MDgiLCAiNTYwMjk5IiwgIjY3NDM5NyIsICI1MDQ4MDEiLCAiODI1ODMiLCAiMTc4MzA5OCIsICIyMTQ0ODYiLCANCiIyMjMzNjMiLCBOQSwgIjk3NzA0OTAiKSwgLi4uMTIgPSBjKCJTZXJ2acOnb3MiLCAiU2VjdG9yIDQiLCAiMzQ2Nzc2IiwgDQoiNjA0NDA2IiwgIjc1NjEwNyIsICIxNjkzNDQ0IiwgIjgzMDk2NyIsICI3Mzg0MDUiLCAiMTgyOTM0NSIsIA0KIjcyOTAwMCIsICI0Nzc4ODMiLCAiMTA1Njk1MyIsICI2MTQ2MjIiLCAiODkyMDgwNyIsICI4NjkwMTEiLCANCiI0NzIxOTkiLCAiMTA3NDM1OCIsICI3OTYwNTciLCAiNzAyNzI1IiwgIjE1MzgzNDUiLCAiMzMyNTM5MyIsIA0KIjI3Mzc2NzYiLCAiNjEyODgyIiwgIjQ3MDAxMDgiLCAiMTQ2OTIyOCIsICIxMjI3NTMyIiwgTkEsICIzODEyNDIyOSINCiksIC4uLjEzID0gYygiVG90YWwiLCAiVG90YWwiLCAiODA2ODgyIiwgIjE3NDc0MzAiLCAiMTc4MzIyMCIsIA0KIjM0MDQ5MDgiLCAiMTk4MzI2NCIsICIyMzMxOTg1IiwgIjQzNjk5OTYiLCAiMTU3MTE1OSIsICIxMTI5NTUwIiwgDQoiMTU3OTgzNCIsICIxNDQ2MjE5IiwgIjIyODQ1MTAzIiwgIjE5NTMwMTAiLCAiMTM4ODQxOCIsICIyODY5MjQwIiwgDQoiMjExNTc3NCIsICIyMDAxOTc0IiwgIjQ3MjEyMzciLCAiMTI0MjE0MTIiLCAiNjU5NDk5OCIsICIyMDYzOTExIiwgDQoiMTc2ODg3MzgiLCAiNTE4OTY2NCIsICI0NDYyODIxIiwgTkEsICIxMDg0NzA3NDciKSksIHJvdy5uYW1lcyA9IGMoTkEsIA0KLTI4TCksIGNsYXNzID0gYygidGJsX2RmIiwgInRibCIsICJkYXRhLmZyYW1lIikpDQpgYGANCiAgDQpgYGB7cn0NCkRUOjpkYXRhdGFibGUoQ2xhc3NpY19NZWFzdXJlc19Jc2FyZCkNCmBgYA0KDQpgYGB7ciBkYWRvc19oYWRkYWRfUUwsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQud2lkdGggPSAiODAlIiwgZmlnLmNhcCA9ICdUZWxhIGRvcyBkYWRvcyBiw6FzaWNvcyBwYXJhIHJlYWxpemFyIFF1b2NpZW50ZSBMb2NhY2lvbmFsJywgZmlnLnN1YmNhcCA9ICdGb250ZTogRGFkb3MgYsOhc2ljb3MgZGUgSGFkZGFkIChub3RhcyBkZSBhdWxhKS4nLGVjaG89RkFMU0V9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiYmFzaWNfZGF0YV9oYWRkYWQucG5nIikNCmBgYA0KDQoNClByb2NlZGltZW50b3MNCj09PT09PT09PT09PT09PT09PT09PT0NCg0KDQojIyBRdW9jaWVudGUgTG9jYWNpb25hbCAoUUwpDQoNCg0KTyBRdW9jaWVudGUgTG9jYWNpb25hbCAoUUwpIMOpIHVtYSBtZWRpZGEgcXVlIGTDoSBhIGluZm9ybWHDp8OjbyBkZSBxdWFsIG8gc2V0b3IgbWFpcyByZXByZXNlbnRhZG8gbm8gbXVuaWPDrXBpbyAocmVnacOjbyBkZSBhbsOhbGlzZSkgcXVhbmRvIGNvbXBhcmFkbyBjb20gbyBtZXNtbyBzZXRvciBubyBlc3RhZG8gKHJlZ2nDo28gZGUgcmVmZXLDqm5jaWEpLiBGb2kgZWxhYm9yYWRvIGluaWNpYWxtZW50ZSBwb3IgSGFpZyAoMTkyOCkgZSB2ZW0gc2VuZG8gbXVpdG8gdXRpbGl6YWRvIGVtIHbDoXJpYXMgYW7DoWxpc2VzIHJlZ2lvbmFpcyBlIGRlIGxvY2FsaXphw6fDo28gaW5kdXN0cmlhbC4gIFRhbWLDqW0gY2hhbWFkbyBkZSDDjW5kaWNlIGRlIGBSZXZlYWxlZCBDb21wYXJhdGl2ZSBBZHZhbnRhZ2VgIChSQ0Eg4oCTIG91IFZhbnRhZ2VtIGNvbXBhcmF0aXZhIHJldmVsYWRhLCBWQ1IpIHNlZ3VpbmRvIEJhbGFzYSAoMTk2NSksIG91IMOtbmRpY2UgZGUgSG9vdmVyLUJhbGFzc2EuICAgIA0KDQpBIGV4cHJlc3PDo28gYsOhc2ljYSDDqToNCg0KJCQNClFMX3traX09XGxlZnQoIHtcZnJhY3t7XGZyYWN7e3tFX3traX19fX17RV9pfX19e3tcZnJhY3t7e0Vfa319fXtFfX19fSBccmlnaHQpDQokJA0KZW0gcXVlOiAke0Vfe2tpfX0kIMOpIG8gZW1wcmVnbyBubyBzZXRvciAkayQgIG5hIGxvY2FsaWRhZGUgZGUgYW7DoWxpc2UgJGkkOyAke0VfaX0kIMOpIG8gZW1wcmVnbyB0b3RhbCBuYSBsb2NhbGlkYWRlIGRlIGFuw6FsaXNlICRpJDsgJHtFX2t9JCDDqSBvIGVtcHJlZ28gbm8gc2V0b3IgJGskIGRhIGxvY2FsaWRhZGUgZGUgcmVmZXLDqm5jaWE7IGUgJEUkIMOpIG8gZW1wcmVnbyB0b3RhbCBkYSBsb2NhbGlkYWRlIGRlIHJlZmVyw6puY2lhLiAgICAgDQoNCkEgaWRlaWEgw6kgc2FiZXIgc2UgbmEgbG9jYWxpZGFkZSBkZSBhbsOhbGlzZSwgYSBwcm9wb3LDp8OjbyBkbyBlbXByZWdvIGRvIHNldG9yIMOpIG1haW9yIG91IG1lbm9yIHF1ZSBlc3RhIHByb3BvcsOnw6NvIG5vIGxvY2FsIGRlIHJlZmVyw6puY2lhLiBBc3NpbSwgc2UgbyByZXN1bHRhZG8gZm9yIG1haW9yIHF1ZSBodW0gJFxsZWZ0KCB7UUxfe2tpfX1cZ3QgMVxyaWdodCkkLCBlbnTDo28gZGl6LXNlIHF1ZSBhIGxvY2FsaWRhZGUgZGUgYW7DoWxpc2Ugw6kgcmVsYXRpdmFtZW50ZSBtYWlzIGVzcGVjaWFsaXphZGEgbmVzc2Ugc2V0b3IgcXVlIGEgbG9jYWxpZGFkZSBkZSByZWbDqm5jaWEuIERlIG91dHJvIGxhZG8sIHZhbG9yZXMgbWVub3JlcyBxdWUgYSB1bmlkYWRlICAkXGxlZnQoIHtRTF97a2l9fVxsdCAxXHJpZ2h0KSQgaW5kaWNhbSBxdWUgYSBsb2NhbGlkYWRlIGFuYWxpc2FkYSB0ZW0gcmVwcmVzZW50YcOnw6NvIG1lbm9yIGRlc3RlIHNldG9yIGRvIHF1ZSBhIHJlcHJlc2VudGHDp8OjbyBkZXN0ZSBuYSBsb2NhbGlkYWRlIGRlIHJlZmVyw6puY2lhLiAgICANCiAgICANCkEgcmVwcmVzZW50YcOnw6NvIGRlIEhhZGRhZCAoMjAxOCkgw6kgbm8gbWVzbW8gc2VudGlkbywgYXBlbmFzIGEgZGlmZXJlbsOnYSDDqSBxdWUgaW52w6lzIGRlIG1lbmNpb25hciBvIGVtcHJlZ28gY29tbyB2YXJpw6F2ZWwsIGVsZSBjb2xvY2EgcHJvZHXDp8Ojby4gSXNzbyDDqSByZWFsaXphZG8gZW0gdsOhcmlvcyBlc3R1ZG9zLCBwcmluY2lwYWxtZW50ZSBub3MgZG8gdGlwbyBpbnN1bW8tcHJvZHV0bywgcXVhbmRvIHNlIGNvbG9jYW0gb3MgdmFsb3JlcyBkZSB2YWxvciBhZGljaW9uYWRvLiBFbSBhbGd1bnMgZXN0dWRvcyBlbmNvbnRyYW1vcyB0YW1iw6ltIHZlcnPDtWVzIGNvbSBhIHByb2R1w6fDo28gYWdyw61jb2xhLCBvdSBhaW5kYSBvcyB2YWxvcmVzIGRlIGV4cG9ydGHDp8O1ZXMgcGFyYSBhIGFuw6Fsb2dhIGRhIHZhbnRhZ2VtIGNvbXBhcmF0aXZhIHJldmVsYWRhIGRlIEJhbGFzc2EuIEEgZsOzcm11bGEgZGEgbm90YSBkZSBhdWxhIGRlIEhhZGRhZCAoMjAxOCksIHBvcnRhbnRvLCDDqSBhIG1lc21hLCBhcGVuYXMgY29tIGluZGljYcOnw6NvIGFsZ8OpYnJpY2EgYWx0ZXJhZGEgcGFyYSAkUl9pJCBlICROX2kkIHBhcmEgaW5kaWNhciBhIHJlZ2nDo28gKFIpIGUgbyBwYcOtcyAoTikgbm8gc2V0b3IgaSwgYSBzYWJlcjoNCg0KJCQNClFMX3tpfT1cbGVmdCgge1xmcmFje3tcZnJhY3t7e1Jfe2l9fX19e05faX19fXt7XGZyYWN7e3tSfX19e059fX19IFxyaWdodCk9XGxlZnQoIHtcZnJhY3t7XGZyYWN7e3tSX3tpfX19fXtSfX19e3tcZnJhY3t7e05faX19fXtOfX19fSBccmlnaHQpDQokJA0KDQplbSBxdWU6ICR7Ul9pfSQgw6kgYSBwcm9kdcOnw6NvIG5vIHNldG9yICRpJCAgbmEgbG9jYWxpZGFkZSBkZSBhbsOhbGlzZTsgJHtSfSQgw6kgYSBwcm9kdcOnw6NvIHRvdGFsIG5hIGxvY2FsaWRhZGUgZGUgYW7DoWxpc2U7ICR7Tl9pfSQgw6kgYSBwcm9kdcOnw6NvIG5vIHNldG9yICRpJCBkYSBsb2NhbGlkYWRlIGRlIHJlZmVyw6puY2lhIChkbyBwYcOtcyk7IGUgJE4kIMOpIGEgcHJvZHXDp8OjbyB0b3RhbCBkYSBsb2NhbGlkYWRlIGRlIHJlZmVyw6puY2lhIChkbyBwYcOtcykuICAgIA0KDQrDiSBpbnRlcmVzc2FudGUgb2xoYXIgZXN0YXMgcmF6w7VlcyAob3UgX3NoYXJlc18pLCBwb2lzIG5vIGPDoWxjdWxvIGV4ZW1wbGlmaWNhZG8gZW0gRXhjZWwsIGZpY2Fyw6NvIGV2aWRlbmNpYWRhcyBhcyBvcGVyYcOnw7VlcyBtYXRlbcOhdGljYXMuIA0KDQoNCiMjIyBFY29uR2VvIGRlIEJhbGxhbmQgKDIwMTcpDQoNCkVzdGEgcm90aW5hIHBvZGUgc2VyIHJlc3VtaWRhIGZhemVuZG8gbyB1c28gZG8gcGFjb3RlIGBFY29uR2VvYCwgZSBhIGZ1bsOnw6NvIGBSQ0FgIHBhcmEgb2J0ZXIgbyBRdW9jaWVudGUgTG9jYWNpb25hbCAoc2ltaWxhciBhbyAqUmV2ZWFsZWQgQ29tcGFyYXRpdmUgQWR2YW50YWdlKiAtIFJDQSAtIMOtbmRpY2UgZGUgQmFsYXNzYSwgMTk2NSkuIE8gcGFjb3RlIHBvZGUgc2VyIGluc3RhbGFkbyBmYXplbmRvIGNvbW8gYSBzZWd1aXI6DQoNCmBgYA0KaW5zdGFsbC5wYWNrYWdlcygiZGV2dG9vbHMiKQ0KbGlicmFyeShkZXZ0b29scykNCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiUEFCYWxsYW5kL0Vjb25HZW8iLCBmb3JjZSA9IFQpDQpgYGANCg0KRWxhIHV0aWxpemEgdW1hIG1hdHJpeiBjb250ZW5kbyBvcyBkYWRvcyBubyBmb3JtYXRvIGFiYWl4bywgZW0gcXVlICQoSTEsSTIsSTMpJCBzw6NvIGFzIGluZMO6c3RyaWFzIG91IHNldG9yZXMsIHBhcmEgb3MgbXVuaWPDrXBpb3MgJChSMSxSMixSMykkLg0KDQpgYGANCm11bmljaXBpbyAgfEkxICAgICAgIHxJMiAgICAgIHwgSTMNCi0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0NCiBSMSAgICAgICAgfDEwMCAgICAgIHwxNTAgICAgIHwgMTY1DQogUjIgICAgICAgIHwxMzAgICAgICB8NDAwICAgICB8IDIyMA0KIFIzICAgICAgICB8MjAwICAgICAgfDEyMDAgICAgfCAyMA0KYGBgDQoNClByZXBhcmFyZW1vcyBvcyBkYWRvcyBwYXJhIG9zIGPDoWxjdWxvcywgY29uc3RydWluZG8gdW1hIG1hdHJpeiBgbWF0YCBwYXJhIG9zIGRhZG9zIGRlIG1lZGlkYXMgY2zDoXNzaWNhcyBkZSBJc2FyZDoNCg0KYGBge3J9DQpsaWJyYXJ5KEVjb25HZW8pDQojIyBnZXJhciBhIG1hdHJpeiBpbmR1c3RyaWFsIGRhIHJlZ2nDo28sIHBhcmEgVDANCnNldC5zZWVkKDMxKQ0KbWF0XzAgPC0gYXMubWF0cml4KENsYXNzaWNfTWVhc3VyZXNfSXNhcmRbMzoyNiwzOjZdKQ0Kcm93bmFtZXMobWF0XzApPC0gYyAoIlIxIiwgIlIyIiwgIlIzIiwgIlI0IiwgIlI1IiwiUjYiLCAiUjciLCAiUjgiLCANCiAgICAgICAgICAgICAgICAgICAiUjkiLCAiUjEwIiwiUjExIiwiUjEyIiwiUjEzIiwgIlIxNCIsICJSMTUiLCAiUjE2IiwNCiAgICAgICAgICAgICAgICAgICAiUjE3IiwiUjE4IiwgIlIxOSIsICJSMjAiLCAiUjIxIiwgIlIyMiIsIlIyMyIsIlIyNCIpDQpjb2xuYW1lcyhtYXRfMCk8LWMoInNldG9yMSIsInNldG9yMiIsInNldG9yMyIsInNldG9yNCIpDQpgYGANCg0KTyBjw6FsY3VsbyBkbyBRdW9jaWVudGUgTG9jYWNpb25hbCAoUUwgPSBSQ0EpIHNlcsOhIGZhemVuZG86DQoNCmBgYHtyfQ0KY2xhc3MobWF0XzApIDwtICJudW1lcmljIg0KUUxfVDA8LXJvdW5kKFJDQShtYXRfMCksZGlnaXRzID0gNCkNCmBgYA0KDQpWb2PDqiBwb2RlIGNvbXBhcmFyIGVzc2UgcmVzdWx0YWRvIGNvbSBvIGRhIHBsYW5pbGhhIExRMSwgb25kZSBvcyBjw6FsY3Vsb3MgZm9ybWEgZmVpdG9zIGVtIGbDs3JtdWxhcyBkbyBFeGNlbC4gU2ltaWxhcm1lbnRlIGZpemVtb3MgcGFyYSBUMSBlIGRlcG9pcyBjb2xvY2Ftb3MgdHVkbyBlbSB1bWEgc8OzIHRhYmVsYS4gICAgDQoNCmBgYHtyfQ0KbGlicmFyeShFY29uR2VvKQ0KIyMgZ2VyYXIgYSBtYXRyaXogaW5kdXN0cmlhbCBkYSByZWdpw6NvLCBwYXJhIFQwDQpzZXQuc2VlZCgzMSkNCm1hdF8xIDwtIGFzLm1hdHJpeChDbGFzc2ljX01lYXN1cmVzX0lzYXJkWzM6MjYsOToxMl0pDQpyb3duYW1lcyhtYXRfMSk8LSBjICgiUjEiLCAiUjIiLCAiUjMiLCAiUjQiLCAiUjUiLCJSNiIsICJSNyIsICJSOCIsIA0KICAgICAgICAgICAgICAgICAgICJSOSIsICJSMTAiLCJSMTEiLCJSMTIiLCJSMTMiLCAiUjE0IiwgIlIxNSIsICJSMTYiLA0KICAgICAgICAgICAgICAgICAgICJSMTciLCJSMTgiLCAiUjE5IiwgIlIyMCIsICJSMjEiLCAiUjIyIiwiUjIzIiwiUjI0IikNCmNvbG5hbWVzKG1hdF8xKTwtYygic2V0b3IxIiwic2V0b3IyIiwic2V0b3IzIiwic2V0b3I0IikNCmNsYXNzKG1hdF8xKSA8LSAibnVtZXJpYyINClFMX1QxPC1yb3VuZChSQ0EobWF0XzEpLGRpZ2l0cyA9IDQpDQpgYGANCg0KYGBge3J9DQpMUTE8LWNiaW5kKFFMX1QwLFFMX1QxKQ0Ka25pdHI6OmthYmxlKExRMSxjYXB0aW9uID0gIlF1b2NpZW50ZSBMb2NhY2lvbmFsIGVtIFQwIGUgVDEiKQ0KYGBgDQoNCkUgYWdvcmEgcmVwcm9kdXppbW9zIGEgdGVsYSBkbyBFeGNlbCwgcGFzdGEgIkxRMSIsIHByZXZpYW1lbnRlIGNhbGN1bGFkbyBwYXJhIGNvbmZlcsOqbmNpYS4gICAgDQoNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgb3V0LndpZHRoID0gIjgwJSIsIGZpZy5jYXAgPSAnUmVzdWx0YWRvcyBkYSBwbGFuaWxoYSBlbSBNUyBFeGNlbCBwYXJhIExRMS4nLCBmaWcuc3ViY2FwID0gJ0ZvbnRlOiBEYWRvcyBiw6FzaWNvcyBkZSBIYWRkYWQgKDIwMTgpIChub3RhcyBkZSBhdWxhKS4nLGVjaG89RkFMU0V9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiTFExLnBuZyIpDQpgYGANCg0KDQojIyMgRXhlbXBsaWZpY2FuZG8gcGVsbyBFeGNlbA0KDQpBY29tcGFuaGFuZG8gYSBub3Rhw6fDo28gZGEgbm90YSBkZSBhdWxhIGRlIEhhZGRhZCAoMjAxOCksIGNvbG9jbyBhcyBpbWFnZW5zIGRvIHByb2NlZGltZW50byByZWFsaXphZG8gbm8gRXhjZWwuIFBhcmEgcmVjb3JkYXIsIGEgZXhwcmVzc8OjbyDDqSAgICANCiQkDQpRTF97aX09XGxlZnQoIHtcZnJhY3t7XGZyYWN7e3tSX3tpfX19fXtOX2l9fX17e1xmcmFje3t7Un19fXtOfX19fSBccmlnaHQpPVxsZWZ0KCB7XGZyYWN7e1xmcmFje3t7Ul97aX19fX17Un19fXt7XGZyYWN7e3tOX2l9fX17Tn19fX0gXHJpZ2h0KQ0KJCQNCiAgICAgDQojIyMjIExRMQ0KDQpQYXNzbyAxOiBjYWxjdWxhciBhcyBwYXJjZWxhcyByZWdpb25haXMgKCpyZWdpb25hbCBzaGFyZXMqKS4gRGVzdGEgZm9ybWEsIG8gcHJpbWVpcm8gcGFzc28gc2Vyw6Egb2J0ZXIgICRcZnJhY3tSX2l9e05faX0kLk8gcHJvY2VkaW1lbnRvIGNvbWXDp2EgZmF6ZW5kbyBhcyBjb250YXMgZG8gdmFsb3IgKHBhcmEgYSBjw6lsdWxhIEM0KSBpZ3VhbCBhIGA9J0Jhc2ljIGRhdGEnIUM0LydCYXNpYyBkYXRhJyFDJDI5YC4gT3Ugc2VqYSwgYSBjw6lsdWxhIEM0IChwcm9kdcOnw6NvIGRhIFJlZ2lvbjEgU2VjdG9yMSBlbSAnQmFzaWMgZGF0YScpIGRpdmlkaWRvIHBlbGEgY8OpbHVsYSBDMjkgKHByb2R1w6fDo28gVG90YWwgU2VjdG9yMSBlbSAnQmFzaWMgZGF0YScpLiBPcyBjw6FsY3Vsb3Mgc2VndWVtIHBhcmEgYXMgZGVtYWlzIGPDqWx1bGFzIGUgZW5jb3JhamFtb3MgbyBsZWl0b3IgYSBmYXplciBhIGNoZWNhZ2VtIG5hIHBsYW5pbGhhLg0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG91dC53aWR0aCA9ICI4MCUiLCBmaWcuY2FwID0gJ0PDoWxjdWxvIGRvIHNoYXJlIHJlZ2lvbmFsLicsIGZpZy5zdWJjYXAgPSAnRm9udGU6IERhZG9zIGLDoXNpY29zIGRlIEhhZGRhZCAoMjAxOCkgKG5vdGFzIGRlIGF1bGEpLicsZWNobz1GQUxTRX0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJyZWdpb25hbF9zaGFyZXMucG5nIikNCmBgYA0KDQpPIHJlc3VsdGFkbyBvYnRpZG8gbmEgY29sdW5hIEcsIGVtIFJlZ2lvbmFsIFNoYXJlcywgaW5kaWNhIGEgcGFyY2VsYSBkYSByZWdpw6NvIDEgbm8gdG90YWwgKGA9J0Jhc2ljIGRhdGEnIUc0LydCYXNpYyBkYXRhJyFHJDI5YCBlbSAnUmVnaW9uYWwgU2hhcmVzJykuICAgICANCg0KDQpQYXNzbyAyOiBPIHJlc3VsdGFkbyBkYSBjb2x1bmEgRyBzZXLDoSBvIGRlbm9taW5hZG9yIGRhIGV4cHJlc3PDo28gZGUgJFFMX2kkLiBPdSBzZWphLCBwYXNzYW1vcyBlbnTDo28gYW8gcGFzc28gMiBxdWUgw6kgZWZldGl2YW1lbnRlIG8gY8OhbGN1bG8gZG8gUUwuICANCg0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQud2lkdGggPSAiODAlIiwgZmlnLmNhcCA9ICdDw6FsY3VsbyBkbyBxdW9jaWVudGUgbG9jYWNpb25hbCAtIExRMS4nLCBmaWcuc3ViY2FwID0gJ0ZvbnRlOiBEYWRvcyBiw6FzaWNvcyBkZSBIYWRkYWQgKDIwMTgpIChub3RhcyBkZSBhdWxhKS4nLGVjaG89RkFMU0V9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiTFExX2Zvcm11bGEucG5nIikNCmBgYA0KDQpPIGPDoWxjdWxvIGRvIHZhbG9yIChwYXJhIGEgY8OpbHVsYSBDNCkgaWd1YWwgYSBgPSc9J1JlZ2lvbmFsIHNoYXJlcychQzQvJ1JlZ2lvbmFsIHNoYXJlcychJEc0YC4gT3Ugc2VqYSwgYSBjw6lsdWxhIEM0ICgnUmVnaW9uYWwgc2hhcmVzJyBkYSBSZWdpb24xIFNlY3RvcjEpIGRpdmlkaWRvIHBlbGEgY8OpbHVsYSBHNCBkZSAnUmVnaW9uYWwgc2hhcmVzJyAobyBzaGFyZSB0b3RhbCkuICAgIA0KDQojIyMjIExRMg0KTyBjw6FsY3VsbyBzZW1lbGhhbnRlIMOpIGZlaXRvIHBvciBIYWRkYWQgKDIwMTgpIGVtIExRMiBwYXJhIGV2aWRlbmNpYXIgcXVlIGZhemVuZG8gcGVsbyBzaGFyZSBzZXRvcmlhbCBkYXLDoSByZXN1bHRhZG8gaWd1YWwsIG1hcyBkZXZlLXNlIGF0ZW50YXIgcGVsYSBhbHRlcmHDp8OjbyBkbyBzZW50aWRvLiAgICAgICAgIA0KDQpQYXNzbyAxIHBhcmEgTFEyOiBOZXN0ZSBMUTIsIG8gY8OhbGN1bG8gc2Vyw6EgcGVsYSBsaW5oYSAob3Ugc2VqYSwgJFJfaS9SJC4gTmEgcGxhbmlsaGEgJ1NlY3RvcmFsIHNoYXJlcycsIHZvY8OqIGVuY29udHJhcsOhIGVtIEM0IGEgZsOzcm11bGE6IGA9J0Jhc2ljIGRhdGEnIUM0LydCYXNpYyBkYXRhJyEkRzRgLCBvdSBzZWphLCBhZ29yYSBkaXZpZGUtc2UgYSBjb2x1bmEgQyBwb3IgRyBmYXplbmRvIG8gX3NlY3RvcmFsIHNoYXJlXy4gQSBsaW5oYSAyOSBkYXLDoSBvIGRlbm9taW5hZG9yICROX2kvTiQuICAgIA0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG91dC53aWR0aCA9ICI4MCUiLCBmaWcuY2FwID0gJ0PDoWxjdWxvIGRvIHNoYXJlIHNldG9yaWFsLicsIGZpZy5zdWJjYXAgPSAnRm9udGU6IERhZG9zIGLDoXNpY29zIGRlIEhhZGRhZCAoMjAxOCkgKG5vdGFzIGRlIGF1bGEpLicsZWNobz1GQUxTRX0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJzZWN0b3JhbF9zaGFyZXMucG5nIikNCmBgYA0KDQpQYXNzbyAyIHBhcmEgTFEyOiBhZ29yYSBmYXotc2UgbyBjw6FsY3VsbyBkbyBxdW9jaWVudGUgbG9jYWNpb25hbCB1c2FuZG8gYSBmw7NybXVsYSwgcGFyYSBhIGPDqWx1bGEgQzQsIGA9J1NlY3RvcmFsIHNoYXJlcychQzQvJ1NlY3RvcmFsIHNoYXJlcychQyQyOWAsIG91IHNlamEsIG8gc2hhcmUgc2V0b3JpYWwgZGEgcmVnacOjbyBkaXZpZGlkbyBwZWxvIHNoYXJlIHNldG9yaWFsIGRvIHBhw61zICh0b3RhbCkuDQoNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgb3V0LndpZHRoID0gIjgwJSIsIGZpZy5jYXAgPSAnQ8OhbGN1bG8gZG8gcXVvY2llbnRlIGxvY2FjaW9uYWwgLSBMUTIuJywgZmlnLnN1YmNhcCA9ICdGb250ZTogRGFkb3MgYsOhc2ljb3MgZGUgSGFkZGFkICgyMDE4KSAobm90YXMgZGUgYXVsYSkuJyxlY2hvPUZBTFNFfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkxRMl9mb3JtdWxhLnBuZyIpDQpgYGANCg0KDQoNClJlZmVyw6puY2lhcyB7LSNSZWZlcsOqbmNpYXN9DQo9PT09PT09PT09PT09PT09PT09PT09PT0NCg0KQkFMQVNTQSwgQi4gVHJhZGUgTGliZXJhbGl6YXRpb24gYW5kIFJldmVhbGVkIENvbXBhcmF0aXZlIEFkdmFudGFnZSwgVGhlIE1hbmNoZXN0ZXIgU2Nob29sIDMzOiA5OS0xMjMuIDE5NjUuIA0KDQpCQUxMQU5ELCBQLkEuIEVjb25vbWljIEdlb2dyYXBoeSBpbiBSOiBJbnRyb2R1Y3Rpb24gdG8gdGhlIEVjb25HZW8gUGFja2FnZSwgUGFwZXJzIGluIEV2b2x1dGlvbmFyeSBFY29ub21pYyBHZW9ncmFwaHksIDE3ICgwOSk6IDEtNzUsIDIwMTcuDQoNCkNSVVosIEIuTy47IFFVRUlST1osIEkuVi4gRWZlaXRvcyBlbmNhZGVhZG9zIGRvIHBlcmZpbCAgc2V0b3JpYWwgZG9zIGludmVzdGltZW50b3MgZSBhIGRpc3RyaWJ1acOnw6NvIGVzcGFjaWFsIGRhICBpbmTDunN0cmlhOiBvbmRlIHNlIGxvY2FsaXphbSBhcyBpbmTDunN0cmlhcyBkb3Mgc2V0b3JlcyBjb20gIG1haW9yZXMgaW1wYWN0b3M/IFRleHRvIHBhcmEgZGlzY3Vzc8OjbyBuLiAyMTcyLCBCcmFzw61saWE6IElQRUEsIDIwMTYuDQoNCkZMT1JFTkNFLCBQLiBTYXJnZW50LiBJbnZlc3RtZW50LCBsb2NhdGlvbiwgYW5kIHNpemUgb2YgcGxhbnQuIENhbWJyaWRnZTogQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MsIDE5NDguDQoNCkhBRERBRCwgRWR1YXJkbyBBbWFyYWwuIEF1bGEgMTogTWVkaWRhcyBkZSBDb25jZW50cmHDp8OjbywgRXNwZWNpYWxpemHDp8OjbyBlIExvY2FsaXphw6fDo28uIEluOiBIQUREQUQsIEUuQS4gKipNw6l0b2RvcyBkZSBBbsOhbGlzZSBSZWdpb25hbCBlIEludGVyLXJlZ2lvbmFsKiouIERlcGFydGFtZW50byBkZSBDacOqbmNpYXMgRWNvbsO0bWljYXMvVUVNUywgUG9udGEgUG9yw6MgLSBNUywgMTMgZSAxNCBkZSBqdW5obyBkZSAyMDE4LiBTw6NvIFBhdWxvOiBORVJFVVMtRkVBLVVTUCwgMjAxOC4gRGlzcG9uw612ZWwgZW06IDxodHRwOi8vd3d3LnVzcC5ici9uZXJldXMvd3AtY29udGVudC91cGxvYWRzL0F1bGFfMV9NZWRpZGFzMy5wZGY+LiBBY2Vzc28gZW0gMjcgQWJyIDIwMjAuICAgIA0KDQpIQUREQUQsIFBhdWxvIFIuIChvcmcuKSAoMTk4OSkuIEVjb25vbWlhIFJlZ2lvbmFsOiBUZW9yaWFzIGUgTcOpdG9kb3MgZGUgQW7DoWxpc2UuIEJhbmNvIGRvIE5vcmRlc3RlLCBGb3J0YWxlemEsIGNhcC4gNC4NCg0KTU9OQVNURVJJTywgTGVvbmFyZG8uIEluZGljYWRvcmVzIGRlIGFuw6FsaXNlIHJlZ2lvbmFsIGUgZXNwYWNpYWwuIEluOiBDUlVaIGV0IGFsIChvcmdzKS4gRWNvbm9taWEgcmVnaW9uYWwgZSB1cmJhbmEgOiB0ZW9yaWFzIGUgbcOpdG9kb3MgY29tIMOqbmZhc2Ugbm8gQnJhc2lsLiBCcmFzw61saWE6IElwZWEsIDIwMTEuIGNhcC4gMTAuIHBwLjMxNS0zMzEuDQoNCk5PUlRILCBEb3VnbGFzLiBUZW9yaWEgZGEgbG9jYWxpemHDp8OjbyBlIGNyZXNjaW1lbnRvIGVjb27DtG1pY28gcmVnaW9uYWwuIEluOiBTQ1dBUlRaTUFOTiwgSi4gKG9yZy4pIEVjb25vbWlhIHJlZ2lvbmFsIGUgdXJiYW5hOiB0ZXRvcyBlc2NvbGhpZG9zLiBCZWxvIEhvcml6b250ZTogVUZNRywgcC4zMzMtMzQzLCAxOTc3LiANCg0KU09VWkEsIEZpbGlwZSBMYWdlIGRlLiBBIGxvY2FsaXphw6fDo28gZGEgaW5kw7pzdHJpYSBkZSB0cmFuc2Zvcm1hw6fDo28gYnJhc2lsZWlyYSBuYXMgw7psdGltYXMgdHLDqnMgZMOpY2FkYXMuIFJpbyBkZSBKYW5laXJvOiBFUEdFLUZHViwgMjAwMi4gKERpc3NlcnRhw6fDo28sIE1lc3RyYWRvIGVtIEVjb25vbWlhKS4gMTMwcC4=