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: análise de insumo-produto de Leontief em R. Campo Grande-MS,Brasil: RStudio/Rpubs, 2019. Disponível em http://rpubs.com/amrofi/Regional_Economics_mip.

1 O modelo de recursos e usos (insumo-produto) de Leontief

O modelo parte de uma matriz de insumo-produto com dois setores do tipo abaixo:

Modelo Insumo Produto Teórico (2x2)

Modelo Insumo Produto Teórico (2x2)

A ideia básica deste arquivo é apresentar uma rotina para calcular multiplicadores de Insumo-Produto de Leontief em R. Os passos são: 1. chamar os dados, quando será preciso criar a matriz A dos Coeficientes tecnicos. Portanto chamarei a matriz de Consumo Intermediario e a linha dos totais do Valor Bruto da Producao. O comando dput() gerou a estrutura de dados de modo a colocá-los embeded.

A matriz insumo-produto deste exemplo será algo como:

==========================================
            s1    s2       C    G   I   X 
------------------------------------------
s1        25      20       5    30  35  35
s2        35      15      45    20  25  50
M          5    10  
trib      10       5                
sal       55      98                
outros    20      42                
vbp      150     190                
po        15      11                
==========================================

em que: \(s1\) e \(s2\) são os setores; \(C\), \(G\), \(I\) e \(X\) são, respectivamente, consumo das famílias, gasto do governo, investimento e exportações, ou seja, os componentes da demanda final; \(M\) são importações; \(trib\) são os impostos; \(sal\) são os salários; \(outros\) são os demais componentes do valor adicionado; vbp é o valor bruto da produção; e \(po\) é o pessoal ocupado.

A imagem fornece uma ideia mais intuitiva:

Modelo Insumo Produto (2x2)

Modelo Insumo Produto (2x2)

exemplo_powerpoint <- structure(list(X__1 = c(25, 35, 5, 10, 55, 20, 150, 15), 
    X__2 = c(20, 15, 10, 5, 98, 42, 190, 11), X__3 = c(5, 45, NA, NA, NA, NA, 
        NA, NA), X__4 = c(30, 20, NA, NA, NA, NA, NA, NA), X__5 = c(35, 25, 
        NA, NA, NA, NA, NA, NA), X__6 = c(35, 50, NA, NA, NA, NA, NA, NA)), 
    row.names = c(NA, -8L), class = c("tbl_df", "tbl", "data.frame"))
(exemplo_powerpoint)
CI <- as.matrix(exemplo_powerpoint[1:2, 1:2])
(CI)
  X__1 X__2
1   25   20
2   35   15

2 Procedimentos

Organizaremos os dados em seus componentes: consumo intermediário (CI), demanda final, totais de linhas e colunas.

# CI - consumo intermediário
flowtable <- rbind(c(25, 20), c(35, 15))
# demanda final de consumo das famílias
finaldemand.C <- rbind(c(5), c(45))
# demanda final total (fd.T)
fd.T <- rbind(c(105), c(140))
# Combinando em uma tabela insumo-produto
inputoutputtable <- cbind(flowtable, fd.T)
# Converter objeto em um `data.frame`
inputoutputtable <- as.data.frame(inputoutputtable)
# Nomear colunas da tabela (dataframe)
names(inputoutputtable) <- c("x1", "x2", "finaldemand.total")
# Calcular o produto total, adicionar demanda final e colunas intermediárias
inputoutputtable$totaloutput <- inputoutputtable$x1 + inputoutputtable$x2 + 
    inputoutputtable$finaldemand.total
# Mostrar uma tabela MIP pequena
knitr::kable(inputoutputtable)
x1 x2 finaldemand.total totaloutput
25 20 105 150
35 15 140 190
# Salvar o produto total como vetor em objeto separado para uso posterior
totaloutput <- inputoutputtable$totaloutput

3 Matriz de coeficientes técnicos

Os coeficientes técnicos que compõem a matriz A de coeficientes técnicos serão obtidos fazendo:

\[{a_{ij}} = \frac{{{X_{ij}}}}{{{X_j}}}\]

ou ainda,

\[{X_{ij}} = {a_{ij}}{X_j}\]

A matriz \(A\) é a matriz de coeficientes técnicos de produção; e as colunas da matriz \(A\) fornecem ideia da estrutura tecnológica do setor:

\[A = \left[ {\begin{array}{*{20}{c}} {{a_{11}}}&{{a_{12}}}& \ldots &{{a_{1i}}}& \ldots &{{a_{1n}}}\\ {{a_{21}}}&{{a_{22}}}& \ldots &{{a_{2i}}}& \ldots &{{a_{2n}}}\\ \vdots & \vdots & \ddots & \vdots &{}& \vdots \\ {{a_{i1}}}&{{a_{i2}}}& \ldots &{{a_{ii}}}& \ldots &{{a_{in}}}\\ \vdots & \vdots &{}& \vdots & \ddots & \vdots \\ {{a_{n1}}}&{{a_{n2}}}& \ldots &{{a_{ni}}}& \ldots &{{a_{nn}}} \end{array}} \right]\]

e as matrizes \(X\) e \(Y\) são tais que:

\[X = \left[ {\begin{array}{*{20}{c}} {{X_1}}\\ {{X_2}}\\ \vdots \\ {{X_i}}\\ \vdots \\ {{X_n}} \end{array}} \right]\]

\[Y = \left[ {\begin{array}{*{20}{c}} {{Y_1}}\\ {{Y_2}}\\ \vdots \\ {{Y_i}}\\ \vdots \\ {{Y_n}} \end{array}} \right]\]

O sistema aberto de Leontief é denotado por: \(X = (I-A)^{-1}Y\)

3.1 Procedimento 1

## Calculate coefficient matrix:
z <- (totaloutput)^-1 * diag(2)
A <- flowtable %*% z
# Show A
A
          [,1]       [,2]
[1,] 0.1666667 0.10526316
[2,] 0.2333333 0.07894737

3.2 Procedimento 2

# Using 'Sweep' - ALTERNATIVA PARA GERAR MATRIZ A
A.alternative <- sweep(flowtable, MARGIN = 2, totaloutput, "/")
A.alternative
          [,1]       [,2]
[1,] 0.1666667 0.10526316
[2,] 0.2333333 0.07894737

3.3 Inversa de Leontief

A inversa de Leontief será \((I-A)^{-1}\):

# matriz Identidade menos a matriz de coeficientes técnicos $A$
IminusA <- diag(2) - A
## Calcular inversa
B <- solve(IminusA)
# Mostrar matriz de Leontief (L ou B)
B
          [,1]      [,2]
[1,] 1.2396694 0.1416765
[2,] 0.3140496 1.1216057

4 Multiplicadores de Leontief

4.1 Multiplicadores Tipo I

4.1.1 Emprego tipo I

# pessoal ocupado (PO)
PO <- as.data.frame(exemplo_powerpoint[8, 1:2])
# multiplicador de emprego: efeito direto: matriz 'e'
e <- PO/totaloutput
e
# multiplicador de emprego: efeito direto e indireto: GE = e%*%B #gerador
GE <- as.matrix(e) %*% as.matrix(B)
GE
       [,1]       [,2]
8 0.1421488 0.07910272
# multiplicador ME=GE/e
ME <- GE/e
ME
# 1.421488 1.36632

4.1.2 Renda tipo I

# r = salarios / vbp salarios (sal)
sal <- as.data.frame(exemplo_powerpoint[5, 1:2])
# multiplicador de renda: efeito direto: matriz 'r'
r <- sal/totaloutput
r
# multiplicador de renda: efeito direto e indireto: GR = r%*%B #gerador
GR <- as.matrix(r) %*% as.matrix(B)
GR
       [,1]      [,2]
5 0.6165289 0.6304604
# multiplicador MR=GR/r
MR <- GR/r
MR
# 1.681443 1.222321

4.1.3 Produto - tipo I

# multiplicador de produto:efeito direto e indireto: soma dos coeficientes
# da matriz B em cada coluna
B
          [,1]      [,2]
[1,] 1.2396694 0.1416765
[2,] 0.3140496 1.1216057
# [,1]      [,2]
# [1,] 1.2396694 0.1416765
# [2,] 0.3140496 1.1216057
MP <- colSums(B)
MP
[1] 1.553719 1.263282
# [1] 1.553719 1.263282

4.2 Multiplicadores Tipo II - fechado

Levam em conta os aumentos nos gastos dos consumidores.

# altera a matriz A e B, chamaremos de A2 e B2

flowtable2 <- rbind(flowtable, as.matrix(sal))
flowtable2
  X__1 X__2
    25   20
    35   15
5   55   98
finaldemand.C2 <- rbind(finaldemand.C, 0)
# Using 'Sweep' - ALTERNATIVA PARA GERAR MATRIZ A
Ap <- sweep(flowtable2, MARGIN = 2, totaloutput, "/")
Ap
       X__1       X__2
  0.1666667 0.10526316
  0.2333333 0.07894737
5 0.3666667 0.51578947
# ao lado da coluna 2 colocarei C/U
c_U <- sweep(finaldemand.C2, MARGIN = 1, sum(finaldemand.C), "/")
# matriz A do tipo II - fechado
A2 <- cbind(Ap, c_U)
A2
       X__1       X__2    
  0.1666667 0.10526316 0.1
  0.2333333 0.07894737 0.9
5 0.3666667 0.51578947 0.0
# X__1       X__2    
# [1,] 0.1666667 0.10526316 0.1
# [2,] 0.2333333 0.07894737 0.9
# [3,] 0.3666667 0.51578947 0.0
# B2 é a matriz inversa (Leontief) para A2 - Leontief fechado Identity
# matrix minus technical coefficient matrix.
IminusA2 <- diag(3) - A2
## Calculate inverse.
B2 <- solve(IminusA2)
# Show Leontief matrix. (L ou B)
B2
                                5
X__1 1.657648 0.5691005 0.6779553
X__2 2.044051 2.8906996 2.8060348
     1.662105 1.6996626 2.6959068
# B2
# [,1]      [,2]      [,3]
# X__1 1.657648 0.5691005 0.6779553
# X__2 2.044051 2.8906996 2.8060348
#      1.662105 1.6996626 2.6959068

4.2.1 Emprego tipo II

# pessoal ocupado (PO)
PO <- as.data.frame(exemplo_powerpoint[8, 1:2])
# multiplicador de emprego: efeito direto: matriz 'e'
e <- PO/totaloutput
e
e2 <- cbind(e, 0)
# multiplicador de emprego: efeito direto e indireto: GE2 = e2%*%B2 #gerador
GE2 <- as.matrix(e2) %*% as.matrix(B2)
GE2
                              5
8 0.2841047 0.2242663 0.2302502
# multiplicador ME=GE/e
ME2 <- GE2/e2
ME2
#       X__1     X__2   0
#   2.841047 3.873691 Inf
# posso ignorar o Inf da terceira coluna 
# foi usado somente para contas

4.2.2 Renda tipo II

# r = salarios / vbp salarios (sal)
sal <- as.data.frame(exemplo_powerpoint[5, 1:2])
# multiplicador de renda: efeito direto: matriz 'r'
r <- sal/totaloutput
r
r2 <- cbind(r, 0)
# multiplicador de renda: efeito direto e indireto: GR = r%*%B #gerador
GR2 <- as.matrix(r2) %*% as.matrix(B2)
GR2
                           5
5 1.662105 1.699663 1.695907
# multiplicador MR=GR/r
MR2 <- GR2/r2
MR2
# X__1 X__2 0 4.533012 3.295264 Inf

4.2.3 Produto tipo II

# multiplicador de produto:efeito direto e indireto: soma dos coeficientes
# da matriz B2 em cada coluna

MP2 <- colSums(B2)
MP2
                         5 
5.363804 5.159463 6.179897 
# [1] 5.363804 5.159463 6.179897 o resultado da coluna 3 pode ser ignorado.
# foi usado apenas para as contas

# Efeito renda no emprego
ER = ME2[, 1:2] - ME
ER
# 1.419559 2.507372

4.3 Setores-chave - Indicadores de Ligação de Rasmussen-Hirschman

Os efeitos para trás são a forma encontrada por Hirschman (1958) para expressar as externalidades decorrentes da implantação de indústrias, que, ao aumentarem a demanda de insumos no setor a montante (para trás ou para nascente) , viabilizariam suas escalas mínimas de produção na região determinada.

Os efeitos para frente, por sua vez, resultariam da oferta de insumos, que tornaria viáveis os setores que se posicionassem a jusante (para a frente ou para poente). O investimento deve priorizar o setor chave da economia, o qual tem efeitos de encadeamentos (ligação) para trás e para frente no processo produtivo acima da média (grau de interdependência entre setores). A indústria chave (mestre) pode induzir o surgimento de várias outras, chamadas indústrias satélites.

A falta de interdependência setorial e, consequentemente, os baixos linkage effects, constituem uma das principais características das economias subdesenvolvidas e dominadas por atividades tradicionais (têxtil, alimentos, calçados etc). A adoção de políticas intervencionistas (tarifas, subsídios, etc.) de estímulos ao desenvolvimento de indústrias mestres nos países subdesenvolvidos é necessária para que estes setores chave maximizem os linkage effects.

4.3.1 Ligação para frente

# media dos coeficientes da linha do setor i / média de todos os
# coeficientes de B
mean_B <- mean(B)
mean_B
[1] 0.7042503
nsetores <- ncol(B)
Ui <- matrix(0, nrow = nsetores, ncol = 1)
for (i in 1:nsetores) {
    Uf <- mean(B[i, ])/mean_B
    Ui[i, 1] <- Uf
}
Ui
          [,1]
[1,] 0.9807209
[2,] 1.0192791
#           [,1]
# [1,] 0.9807209
# [2,] 1.0192791

4.3.2 Ligação para trás

# media dos coeficientes da coluna do setor j / média de todos os
# coeficientes de B
Uj <- matrix(0, nrow = nsetores, ncol = 1)
for (j in 1:nsetores) {
    Ut <- mean(B[, j])/mean_B
    Uj[j, 1] <- Ut
}
Uj
          [,1]
[1,] 1.1031014
[2,] 0.8968986

4.3.3 Tabela Resumo de ligações

ligacoes_frente_tras <- cbind(Ui, Uj)
round(ligacoes_frente_tras, 3)
      [,1]  [,2]
[1,] 0.981 1.103
[2,] 1.019 0.897
#  |          |          |    
#  |---------:|---------:|      
#  | 0.9807209| 1.1031014|    
#  | 1.0192791| 0.8968986| 

Ou seja, nesse caso, valores maiores que 1 indicam maior ligação. A primeira coluna é para frente e a segunda para trás.

Referências

LS0tDQp0aXRsZTogIkVjb25vbWlhIFJlZ2lvbmFsOiBhbsOhbGlzZSBkZSBpbnN1bW8tcHJvZHV0byBkZSBMZW9udGllZiBlbSBSIg0KYXV0aG9yOiAiQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzIEZpZ3VlaXJlZG8iDQplLW1haWw6ICJhZHJpYW5vLmZpZ3VlaXJlZG9AdWZtcy5iciINCmFic3RyYWN0OiAiVGhpcyBpcyBhbiB1bmRlcmdyYWQgc3R1ZGVudCBsZXZlbCBpbnN0cnVjdGlvbiBmb3IgY2xhc3MgdXNlLiINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogZGVmYXVsdA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7ciBrbml0cl9pbml0LCBlY2hvPUZBTFNFLCBjYWNoZT1GQUxTRX0NCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHJtYXJrZG93bikNCmxpYnJhcnkocm1kZm9ybWF0cykNCg0KIyMgR2xvYmFsIG9wdGlvbnMNCm9wdGlvbnMobWF4LnByaW50PSIxMDAiKQ0Kb3B0c19jaHVuayRzZXQoZWNobz1UUlVFLA0KCSAgICAgICAgICAgICBjYWNoZT1UUlVFLA0KICAgICAgICAgICAgICAgcHJvbXB0PUZBTFNFLA0KICAgICAgICAgICAgICAgdGlkeT1UUlVFLA0KICAgICAgICAgICAgICAgY29tbWVudD1OQSwNCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFLA0KICAgICAgICAgICAgICAgb3V0LndpZHRoPTc1MCwgDQogICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsIA0KICAgICAgICAgICAgICAgZmlnLndpZHRoPTgpDQpvcHRzX2tuaXQkc2V0KHdpZHRoPTEwMCkNCmBgYA0KDQoNCkxpY2Vuw6dhIHstI0xpY2Vuw6dhfQ0KPT09PT09PT09PT09PT09PT09PQ0KDQpUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0IDxodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvPiBvciBzZW5kIGEgbGV0dGVyIHRvIENyZWF0aXZlIENvbW1vbnMsIFBPIEJveCAxODY2LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MiwgVVNBLg0KDQohW0xpY2Vuc2U6IENDIEJZLVNBIDQuMF0oaHR0cHM6Ly9taXJyb3JzLmNyZWF0aXZlY29tbW9ucy5vcmcvcHJlc3NraXQvYnV0dG9ucy84OHgzMS9wbmcvYnktc2EucG5nKXsgd2lkdGg9MjUlIH0NCg0KDQpDaXRhw6fDo28gey0jQ2l0YcOnw6NvfQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzoNCkZJR1VFSVJFRE8sIEFkcmlhbm8gTWFyY29zIFJvZHJpZ3Vlcy4gRWNvbm9taWEgUmVnaW9uYWw6IGFuw6FsaXNlIGRlIGluc3Vtby1wcm9kdXRvIGRlIExlb250aWVmIGVtIFIuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMTkuIERpc3BvbsOtdmVsIGVtIDxodHRwOi8vcnB1YnMuY29tL2Ftcm9maS9SZWdpb25hbF9FY29ub21pY3NfbWlwPi4gDQoNCg0KTyBtb2RlbG8gZGUgcmVjdXJzb3MgZSB1c29zIChpbnN1bW8tcHJvZHV0bykgZGUgTGVvbnRpZWYNCj09PT09PT09PT09PT09PT09PT09PT0NCg0KTyBtb2RlbG8gcGFydGUgZGUgdW1hIG1hdHJpeiBkZSBpbnN1bW8tcHJvZHV0byBjb20gZG9pcyBzZXRvcmVzIGRvIHRpcG8gYWJhaXhvOg0KDQohW01vZGVsbyBJbnN1bW8gUHJvZHV0byBUZcOzcmljbyAoMngyKV0obWlwX3Rlb3JpY2FfMngyLnBuZyl7IHdpZHRoPTEwMCUgfQ0KICAgIA0KQSBpZGVpYSBiw6FzaWNhIGRlc3RlIGFycXVpdm8gw6kgYXByZXNlbnRhciB1bWEgcm90aW5hIHBhcmEgY2FsY3VsYXIgbXVsdGlwbGljYWRvcmVzIGRlIEluc3Vtby1Qcm9kdXRvIGRlIExlb250aWVmIGVtIFIuIE9zIHBhc3NvcyBzw6NvOiAxLiBjaGFtYXIgb3MgZGFkb3MsIHF1YW5kbyBzZXLDoSBwcmVjaXNvIGNyaWFyIGEgbWF0cml6IEEgZG9zIENvZWZpY2llbnRlcyB0ZWNuaWNvcy4gUG9ydGFudG8gY2hhbWFyZWkgYSBtYXRyaXogZGUgQ29uc3VtbyBJbnRlcm1lZGlhcmlvIGUgYSBsaW5oYSBkb3MgdG90YWlzIGRvIFZhbG9yIEJydXRvIGRhIFByb2R1Y2FvLiBPIGNvbWFuZG8gYGRwdXQoKWAgZ2Vyb3UgYSBlc3RydXR1cmEgZGUgZGFkb3MgZGUgbW9kbyBhIGNvbG9jw6EtbG9zICplbWJlZGVkKi4gICAgDQoNCkEgbWF0cml6IGluc3Vtby1wcm9kdXRvIGRlc3RlIGV4ZW1wbG8gc2Vyw6EgYWxnbyBjb21vOg0KDQpgYGANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KCSAgICAgICAgczEJICBzMgkgICBDICAgIEcgCUkgCVggDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnMxCSAgICAgIDI1CSAgMjAJICAgNSAgICAzMAkzNQkzNQ0KczIJICAgICAgMzUJICAxNQkgIDQ1ICAgIDIwCTI1CTUwDQpNICAgICAgICAgIDUgICAgMTAJDQp0cmliICAgICAgMTAJICAgNQkgCQkJDQpzYWwJICAgICAgNTUJICA5OAkgCQkJDQpvdXRyb3MJICAyMAkgIDQyCSAJCQkNCnZicAkgICAgIDE1MAkgMTkwCQkJCQ0KcG8JICAgICAgMTUJICAxMQkJCQkNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KYGBgDQplbSBxdWU6ICRzMSQgZSAkczIkIHPDo28gb3Mgc2V0b3JlczsgJEMkLCAkRyQsICRJJCBlICRYJCBzw6NvLCByZXNwZWN0aXZhbWVudGUsIGNvbnN1bW8gZGFzIGZhbcOtbGlhcywgZ2FzdG8gZG8gZ292ZXJubywgaW52ZXN0aW1lbnRvIGUgZXhwb3J0YcOnw7Vlcywgb3Ugc2VqYSwgb3MgY29tcG9uZW50ZXMgZGEgZGVtYW5kYSBmaW5hbDsgJE0kIHPDo28gaW1wb3J0YcOnw7VlczsgJHRyaWIkIHPDo28gb3MgaW1wb3N0b3M7ICRzYWwkIHPDo28gb3Mgc2Fsw6FyaW9zOyAkb3V0cm9zJCBzw6NvIG9zIGRlbWFpcyBjb21wb25lbnRlcyBkbyB2YWxvciBhZGljaW9uYWRvOyB2YnAgw6kgbyB2YWxvciBicnV0byBkYSBwcm9kdcOnw6NvOyBlICRwbyQgw6kgbyBwZXNzb2FsIG9jdXBhZG8uICAgIA0KDQpBIGltYWdlbSBmb3JuZWNlIHVtYSBpZGVpYSBtYWlzIGludHVpdGl2YToNCg0KIVtNb2RlbG8gSW5zdW1vIFByb2R1dG8gKDJ4MildKEltYWdlbTEucG5nKXsgd2lkdGg9MTAwJSB9DQoNCmBgYHtyfQ0KZXhlbXBsb19wb3dlcnBvaW50IDwtIHN0cnVjdHVyZShsaXN0KFhfXzEgPSBjKDI1LCAzNSwgNSwgMTAsIDU1LCAyMCwgMTUwLCAxNSksIFhfXzIgPSBjKDIwLCANCjE1LCAxMCwgNSwgOTgsIDQyLCAxOTAsIDExKSwgWF9fMyA9IGMoNSwgNDUsIE5BLCBOQSwgTkEsIE5BLCANCk5BLCBOQSksIFhfXzQgPSBjKDMwLCAyMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksIFhfXzUgPSBjKDM1LCANCjI1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwgWF9fNiA9IGMoMzUsIDUwLCBOQSwgTkEsIE5BLCBOQSwgDQpOQSwgTkEpKSwgcm93Lm5hbWVzID0gYyhOQSwgLThMKSwgY2xhc3MgPSBjKCJ0YmxfZGYiLCAidGJsIiwgDQoiZGF0YS5mcmFtZSIpKQ0KKGV4ZW1wbG9fcG93ZXJwb2ludCkNCkNJPC1hcy5tYXRyaXgoZXhlbXBsb19wb3dlcnBvaW50WzE6MiwxOjJdKQ0KKENJKQ0KYGBgDQoNClByb2NlZGltZW50b3MNCj09PT09PT09PT09PT09PT09PT09PT0NCg0KT3JnYW5pemFyZW1vcyBvcyBkYWRvcyBlbSBzZXVzIGNvbXBvbmVudGVzOiBjb25zdW1vIGludGVybWVkacOhcmlvIChDSSksIGRlbWFuZGEgZmluYWwsIHRvdGFpcyBkZSBsaW5oYXMgZSBjb2x1bmFzLg0KDQpgYGB7cn0NCiNDSSAtIGNvbnN1bW8gaW50ZXJtZWRpw6FyaW8NCmZsb3d0YWJsZSA8LSByYmluZCggYyggMjUgLCAyMCApLCBjKCAzNSAsIDE1ICkgKSAgDQojIGRlbWFuZGEgZmluYWwgZGUgY29uc3VtbyBkYXMgZmFtw61saWFzDQpmaW5hbGRlbWFuZC5DIDwtIHJiaW5kKCBjKCA1ICksIGMoIDQ1ICkgKQ0KIyBkZW1hbmRhIGZpbmFsIHRvdGFsIChmZC5UKQ0KZmQuVCA8LSByYmluZCggYyggMTA1ICksIGMoIDE0MCApICkNCiMgQ29tYmluYW5kbyBlbSB1bWEgdGFiZWxhIGluc3Vtby1wcm9kdXRvDQppbnB1dG91dHB1dHRhYmxlIDwtIGNiaW5kKCBmbG93dGFibGUgLCBmZC5UICkNCiMgQ29udmVydGVyIG9iamV0byBlbSB1bSBgZGF0YS5mcmFtZWANCmlucHV0b3V0cHV0dGFibGUgPC0gYXMuZGF0YS5mcmFtZSggaW5wdXRvdXRwdXR0YWJsZSApDQojIE5vbWVhciBjb2x1bmFzIGRhIHRhYmVsYSAoZGF0YWZyYW1lKQ0KbmFtZXMoIGlucHV0b3V0cHV0dGFibGUgKSA8LSBjKCJ4MSIgLCAieDIiICwgImZpbmFsZGVtYW5kLnRvdGFsIikNCiMgQ2FsY3VsYXIgbyBwcm9kdXRvIHRvdGFsLCBhZGljaW9uYXIgZGVtYW5kYSBmaW5hbCBlIGNvbHVuYXMgaW50ZXJtZWRpw6FyaWFzDQppbnB1dG91dHB1dHRhYmxlJHRvdGFsb3V0cHV0IDwtIGlucHV0b3V0cHV0dGFibGUkeDEgKw0KICBpbnB1dG91dHB1dHRhYmxlJHgyICsNCiAgaW5wdXRvdXRwdXR0YWJsZSRmaW5hbGRlbWFuZC50b3RhbA0KIyBNb3N0cmFyIHVtYSB0YWJlbGEgTUlQIHBlcXVlbmENCmtuaXRyOjprYWJsZShpbnB1dG91dHB1dHRhYmxlKQ0KIyBTYWx2YXIgbyBwcm9kdXRvIHRvdGFsIGNvbW8gdmV0b3IgZW0gb2JqZXRvIHNlcGFyYWRvIHBhcmEgdXNvIHBvc3Rlcmlvcg0KdG90YWxvdXRwdXQgPC0gaW5wdXRvdXRwdXR0YWJsZSR0b3RhbG91dHB1dA0KYGBgDQoNCk1hdHJpeiBkZSBjb2VmaWNpZW50ZXMgdMOpY25pY29zDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCk9zIGNvZWZpY2llbnRlcyB0w6ljbmljb3MgcXVlIGNvbXDDtWVtIGEgbWF0cml6IEEgZGUgY29lZmljaWVudGVzIHTDqWNuaWNvcyBzZXLDo28gb2J0aWRvcyBmYXplbmRvOg0KDQpcW3thX3tpan19ID0gXGZyYWN7e3tYX3tpan19fX17e3tYX2p9fX1cXQ0KDQpvdSBhaW5kYSwNCg0KXFt7WF97aWp9fSA9IHthX3tpan19e1hfan1cXQ0KDQpBIG1hdHJpeiAkQSQgIMOpIGEgbWF0cml6IGRlIGNvZWZpY2llbnRlcyB0w6ljbmljb3MgZGUgcHJvZHXDp8OjbzsgZSBhcyBjb2x1bmFzIGRhIG1hdHJpeiAkQSQgZm9ybmVjZW0gaWRlaWEgZGEgZXN0cnV0dXJhIHRlY25vbMOzZ2ljYSBkbyBzZXRvcjoNCg0KXFtBID0gXGxlZnRbIHtcYmVnaW57YXJyYXl9eyp7MjB9e2N9fQ0Ke3thX3sxMX19fSZ7e2FfezEyfX19JiBcbGRvdHMgJnt7YV97MWl9fX0mIFxsZG90cyAme3thX3sxbn19fVxcDQp7e2FfezIxfX19Jnt7YV97MjJ9fX0mIFxsZG90cyAme3thX3syaX19fSYgXGxkb3RzICZ7e2FfezJufX19XFwNCiBcdmRvdHMgJiBcdmRvdHMgJiBcZGRvdHMgJiBcdmRvdHMgJnt9JiBcdmRvdHMgXFwNCnt7YV97aTF9fX0me3thX3tpMn19fSYgXGxkb3RzICZ7e2Ffe2lpfX19JiBcbGRvdHMgJnt7YV97aW59fX1cXA0KIFx2ZG90cyAmIFx2ZG90cyAme30mIFx2ZG90cyAmIFxkZG90cyAmIFx2ZG90cyBcXA0Ke3thX3tuMX19fSZ7e2Ffe24yfX19JiBcbGRvdHMgJnt7YV97bml9fX0mIFxsZG90cyAme3thX3tubn19fQ0KXGVuZHthcnJheX19IFxyaWdodF1cXQ0KDQplIGFzIG1hdHJpemVzICRYJCBlICRZJCBzw6NvIHRhaXMgcXVlOg0KDQoNClxbWCA9IFxsZWZ0WyB7XGJlZ2lue2FycmF5fXsqezIwfXtjfX0NCnt7WF8xfX1cXA0Ke3tYXzJ9fVxcDQogXHZkb3RzIFxcDQp7e1hfaX19XFwNCiBcdmRvdHMgXFwNCnt7WF9ufX0NClxlbmR7YXJyYXl9fSBccmlnaHRdXF0NCg0KDQpcW1kgPSBcbGVmdFsge1xiZWdpbnthcnJheX17KnsyMH17Y319DQp7e1lfMX19XFwNCnt7WV8yfX1cXA0KIFx2ZG90cyBcXA0Ke3tZX2l9fVxcDQogXHZkb3RzIFxcDQp7e1lfbn19DQpcZW5ke2FycmF5fX0gXHJpZ2h0XVxdDQoNCk8gc2lzdGVtYSBhYmVydG8gZGUgTGVvbnRpZWYgw6kgZGVub3RhZG8gcG9yOg0KJFggPSAoSS1BKV57LTF9WSQNCg0KDQojIyBQcm9jZWRpbWVudG8gMQ0KDQpgYGB7cn0NCiMjIENhbGN1bGF0ZSBjb2VmZmljaWVudCBtYXRyaXg6DQp6IDwtICggdG90YWxvdXRwdXQgKV4tMSAqIGRpYWcoIDIgKQ0KQSA8LSBmbG93dGFibGUgJSolIHoNCiMgU2hvdyBBDQpBDQpgYGANCg0KIyMgUHJvY2VkaW1lbnRvIDIgDQoNCmBgYHtyfQ0KIyBVc2luZyAiU3dlZXAiICAtIEFMVEVSTkFUSVZBIFBBUkEgR0VSQVIgTUFUUklaIEENCkEuYWx0ZXJuYXRpdmUgPC0gc3dlZXAoIGZsb3d0YWJsZSAsDQogICAgICAgICAgICAgICAgICAgICAgICBNQVJHSU4gPSAyICwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsb3V0cHV0ICwNCiAgICAgICAgICAgICAgICAgICAgICAgICcvJyApDQpBLmFsdGVybmF0aXZlDQpgYGANCg0KIyMgSW52ZXJzYSBkZSBMZW9udGllZg0KDQpBIGludmVyc2EgZGUgTGVvbnRpZWYgc2Vyw6EgJChJLUEpXnstMX0kOg0KDQpgYGB7cn0NCiMgbWF0cml6IElkZW50aWRhZGUgbWVub3MgYSBtYXRyaXogZGUgY29lZmljaWVudGVzIHTDqWNuaWNvcyAkQSQNCkltaW51c0EgPC0gZGlhZyggMiApIC0gQQ0KIyMgQ2FsY3VsYXIgaW52ZXJzYSANCkIgPC0gc29sdmUoIEltaW51c0EgKQ0KIyBNb3N0cmFyIG1hdHJpeiBkZSBMZW9udGllZiAoTCBvdSBCKQ0KQg0KYGBgDQoNCk11bHRpcGxpY2Fkb3JlcyBkZSBMZW9udGllZg0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KDQojIyBNdWx0aXBsaWNhZG9yZXMgVGlwbyBJDQoNCiMjIyBFbXByZWdvIHRpcG8gSQ0KDQpgYGB7cn0NCiMgcGVzc29hbCBvY3VwYWRvIChQTykNClBPIDwtIGFzLmRhdGEuZnJhbWUoIGV4ZW1wbG9fcG93ZXJwb2ludFs4ICwgMToyXSApDQojIG11bHRpcGxpY2Fkb3IgZGUgZW1wcmVnbzogZWZlaXRvIGRpcmV0bzogbWF0cml6ICdlJw0KZTwtIFBPL3RvdGFsb3V0cHV0DQplDQojIG11bHRpcGxpY2Fkb3IgZGUgZW1wcmVnbzogZWZlaXRvIGRpcmV0byBlIGluZGlyZXRvOiANCiMgR0UgPSBlJSolQiAgICNnZXJhZG9yDQpHRTwtYXMubWF0cml4KGUpJSolYXMubWF0cml4KEIpDQpHRSAgIA0KIyBtdWx0aXBsaWNhZG9yIE1FPUdFL2UNCk1FPC1HRS9lDQpNRQ0KIyAxLjQyMTQ4OCAxLjM2NjMyDQpgYGANCg0KIyMjIFJlbmRhIHRpcG8gSQ0KDQpgYGB7cn0NCiMgciA9IHNhbGFyaW9zIC8gdmJwDQojIHNhbGFyaW9zIChzYWwpDQpzYWwgPC0gYXMuZGF0YS5mcmFtZShleGVtcGxvX3Bvd2VycG9pbnRbNSwxOjJdKQ0KIyBtdWx0aXBsaWNhZG9yIGRlIHJlbmRhOiBlZmVpdG8gZGlyZXRvOiBtYXRyaXogJ3InDQpyPC0gc2FsL3RvdGFsb3V0cHV0DQpyDQojIG11bHRpcGxpY2Fkb3IgZGUgcmVuZGE6IGVmZWl0byBkaXJldG8gZSBpbmRpcmV0bzogDQojIEdSID0gciUqJUIgICAjZ2VyYWRvcg0KR1I8LWFzLm1hdHJpeChyKSUqJWFzLm1hdHJpeChCKQ0KR1IgICANCiMgbXVsdGlwbGljYWRvciBNUj1HUi9yDQpNUjwtR1Ivcg0KTVINCiMgIDEuNjgxNDQzIDEuMjIyMzIxDQpgYGANCg0KIyMjIFByb2R1dG8gLSB0aXBvIEkNCg0KYGBge3J9DQojIG11bHRpcGxpY2Fkb3IgZGUgcHJvZHV0bzplZmVpdG8gZGlyZXRvIGUgaW5kaXJldG86IA0KIyBzb21hIGRvcyBjb2VmaWNpZW50ZXMgZGEgbWF0cml6IEIgZW0gY2FkYSBjb2x1bmENCkINCmBgYA0KDQpgYGANCiMgWywxXSAgICAgIFssMl0NCiMgWzEsXSAxLjIzOTY2OTQgMC4xNDE2NzY1DQojIFsyLF0gMC4zMTQwNDk2IDEuMTIxNjA1Nw0KYGBgDQpgYGB7cn0NCk1QIDwtIGNvbFN1bXMoQikNCk1QDQojIFsxXSAxLjU1MzcxOSAxLjI2MzI4Mg0KYGBgDQoNCiMjIE11bHRpcGxpY2Fkb3JlcyBUaXBvIElJIC0gZmVjaGFkbw0KDQpMZXZhbSBlbSBjb250YSBvcyBhdW1lbnRvcyBub3MgZ2FzdG9zIGRvcyBjb25zdW1pZG9yZXMuDQoNCmBgYHtyfQ0KIyBhbHRlcmEgYSBtYXRyaXogQSBlIEIsIGNoYW1hcmVtb3MgZGUgQTIgZSBCMg0KDQpmbG93dGFibGUyPC1yYmluZChmbG93dGFibGUsYXMubWF0cml4KHNhbCkpDQpmbG93dGFibGUyDQpmaW5hbGRlbWFuZC5DMjwtcmJpbmQoZmluYWxkZW1hbmQuQywwKQ0KIyBVc2luZyAiU3dlZXAiICAtIEFMVEVSTkFUSVZBIFBBUkEgR0VSQVIgTUFUUklaIEENCkFwIDwtIHN3ZWVwKCBmbG93dGFibGUyICwNCiAgICAgICAgICAgICAgICAgICAgICAgIE1BUkdJTiA9IDIgLA0KICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxvdXRwdXQgLA0KICAgICAgICAgICAgICAgICAgICAgICAgJy8nICkNCkFwDQojIGFvIGxhZG8gZGEgY29sdW5hIDIgY29sb2NhcmVpIEMvVQ0KY19VPC1zd2VlcCggZmluYWxkZW1hbmQuQzIsDQogICAgICAgICAgICBNQVJHSU4gPSAxLA0KICAgICAgICAgICAgc3VtKGZpbmFsZGVtYW5kLkMpLA0KICAgICAgICAgICAgJy8nICkNCiMgbWF0cml6IEEgZG8gdGlwbyBJSSAtIGZlY2hhZG8NCkEyPC0gY2JpbmQoQXAsY19VKQ0KQTINCmBgYA0KDQpgYGANCiMgWF9fMSAgICAgICBYX18yICAgIA0KIyBbMSxdIDAuMTY2NjY2NyAwLjEwNTI2MzE2IDAuMQ0KIyBbMixdIDAuMjMzMzMzMyAwLjA3ODk0NzM3IDAuOQ0KIyBbMyxdIDAuMzY2NjY2NyAwLjUxNTc4OTQ3IDAuMA0KYGBgDQpgYGB7cn0NCiMgQjIgw6kgYSBtYXRyaXogaW52ZXJzYSAoTGVvbnRpZWYpIHBhcmEgQTIgLSBMZW9udGllZiBmZWNoYWRvDQojIElkZW50aXR5IG1hdHJpeCBtaW51cyB0ZWNobmljYWwgY29lZmZpY2llbnQgbWF0cml4Lg0KSW1pbnVzQTIgPC0gZGlhZyggMyApIC0gQTINCiMjIENhbGN1bGF0ZSBpbnZlcnNlLg0KQjIgPC0gc29sdmUoIEltaW51c0EyICkNCiMgU2hvdyBMZW9udGllZiBtYXRyaXguIChMIG91IEIpDQpCMg0KYGBgDQoNCmBgYA0KIyBCMg0KIyBbLDFdICAgICAgWywyXSAgICAgIFssM10NCiMgWF9fMSAxLjY1NzY0OCAwLjU2OTEwMDUgMC42Nzc5NTUzDQojIFhfXzIgMi4wNDQwNTEgMi44OTA2OTk2IDIuODA2MDM0OA0KIyAgICAgIDEuNjYyMTA1IDEuNjk5NjYyNiAyLjY5NTkwNjgNCmBgYA0KDQojIyMgRW1wcmVnbyB0aXBvIElJDQoNCmBgYHtyfQ0KIyBwZXNzb2FsIG9jdXBhZG8gKFBPKQ0KUE8gPC0gYXMuZGF0YS5mcmFtZSggZXhlbXBsb19wb3dlcnBvaW50WzggLCAxOjJdICkNCiMgbXVsdGlwbGljYWRvciBkZSBlbXByZWdvOiBlZmVpdG8gZGlyZXRvOiBtYXRyaXogJ2UnDQplPC0gUE8vdG90YWxvdXRwdXQNCmUNCmUyPC1jYmluZChlLDApDQojIG11bHRpcGxpY2Fkb3IgZGUgZW1wcmVnbzogZWZlaXRvIGRpcmV0byBlIGluZGlyZXRvOiANCiMgR0UyID0gZTIlKiVCMiAgICNnZXJhZG9yDQpHRTI8LWFzLm1hdHJpeChlMiklKiVhcy5tYXRyaXgoQjIpDQpHRTIgICANCiMgbXVsdGlwbGljYWRvciBNRT1HRS9lDQpNRTI8LUdFMi9lMg0KTUUyDQpgYGAgDQoNCmBgYA0KIyAgICAgICBYX18xICAgICBYX18yICAgMA0KIyAgIDIuODQxMDQ3IDMuODczNjkxIEluZg0KIyBwb3NzbyBpZ25vcmFyIG8gSW5mIGRhIHRlcmNlaXJhIGNvbHVuYSANCiMgZm9pIHVzYWRvIHNvbWVudGUgcGFyYSBjb250YXMNCmBgYA0KDQojIyMgUmVuZGEgdGlwbyBJSQ0KDQpgYGB7cn0NCiMgciA9IHNhbGFyaW9zIC8gdmJwDQojIHNhbGFyaW9zIChzYWwpDQpzYWwgPC0gYXMuZGF0YS5mcmFtZShleGVtcGxvX3Bvd2VycG9pbnRbNSwxOjJdKQ0KIyBtdWx0aXBsaWNhZG9yIGRlIHJlbmRhOiBlZmVpdG8gZGlyZXRvOiBtYXRyaXogJ3InDQpyPC0gc2FsL3RvdGFsb3V0cHV0DQpyDQpyMjwtY2JpbmQociwwKQ0KIyBtdWx0aXBsaWNhZG9yIGRlIHJlbmRhOiBlZmVpdG8gZGlyZXRvIGUgaW5kaXJldG86IA0KIyBHUiA9IHIlKiVCICAgI2dlcmFkb3INCkdSMjwtYXMubWF0cml4KHIyKSUqJWFzLm1hdHJpeChCMikNCkdSMiANCiMgbXVsdGlwbGljYWRvciBNUj1HUi9yDQpNUjI8LUdSMi9yMg0KTVIyDQojICAgICBYX18xICAgICBYX18yICAgMA0KIyA0LjUzMzAxMiAzLjI5NTI2NCBJbmYNCmBgYA0KDQojIyMgUHJvZHV0byB0aXBvIElJDQoNCmBgYHtyfQ0KIyBtdWx0aXBsaWNhZG9yIGRlIHByb2R1dG86ZWZlaXRvIGRpcmV0byBlIGluZGlyZXRvOiANCiMgc29tYSBkb3MgY29lZmljaWVudGVzIGRhIG1hdHJpeiBCMiBlbSBjYWRhIGNvbHVuYQ0KDQpNUDIgPC0gY29sU3VtcyhCMikNCk1QMg0KIyBbMV0gNS4zNjM4MDQgNS4xNTk0NjMgNi4xNzk4OTcNCiMgbyByZXN1bHRhZG8gZGEgY29sdW5hIDMgcG9kZSBzZXIgaWdub3JhZG8uDQojIGZvaSB1c2FkbyBhcGVuYXMgcGFyYSBhcyBjb250YXMNCg0KIyBFZmVpdG8gcmVuZGEgbm8gZW1wcmVnbw0KRVIgPSBNRTJbLDE6Ml0tTUUNCkVSDQojIDEuNDE5NTU5IDIuNTA3MzcyDQpgYGANCg0KIyMgU2V0b3Jlcy1jaGF2ZSAtIEluZGljYWRvcmVzIGRlIExpZ2HDp8OjbyBkZSBSYXNtdXNzZW4tSGlyc2NobWFuDQoNCk9zIGVmZWl0b3MgcGFyYSB0csOhcyBzw6NvIGEgZm9ybWEgZW5jb250cmFkYSBwb3IgSGlyc2NobWFuICgxOTU4KSBwYXJhIGV4cHJlc3NhciBhcyBleHRlcm5hbGlkYWRlcyBkZWNvcnJlbnRlcyBkYSBpbXBsYW50YcOnw6NvIGRlIGluZMO6c3RyaWFzLCBxdWUsIGFvIGF1bWVudGFyZW0gYSBkZW1hbmRhIGRlIGluc3Vtb3Mgbm8gc2V0b3IgYSBtb250YW50ZSAocGFyYSB0csOhcyBvdSBwYXJhIG5hc2NlbnRlKSAsIHZpYWJpbGl6YXJpYW0gc3VhcyBlc2NhbGFzIG3DrW5pbWFzIGRlIHByb2R1w6fDo28gbmEgcmVnacOjbyBkZXRlcm1pbmFkYS4gICAgDQoNCk9zIGVmZWl0b3MgcGFyYSBmcmVudGUsIHBvciBzdWEgdmV6LCByZXN1bHRhcmlhbSBkYSBvZmVydGEgZGUgaW5zdW1vcywgcXVlIHRvcm5hcmlhIHZpw6F2ZWlzIG9zIHNldG9yZXMgcXVlIHNlIHBvc2ljaW9uYXNzZW0gYSBqdXNhbnRlIChwYXJhIGEgZnJlbnRlIG91IHBhcmEgcG9lbnRlKS4gTyBpbnZlc3RpbWVudG8gZGV2ZSBwcmlvcml6YXIgbyBzZXRvciBjaGF2ZSBkYSBlY29ub21pYSwgbyBxdWFsIHRlbSBlZmVpdG9zIGRlIGVuY2FkZWFtZW50b3MgKGxpZ2HDp8OjbykgcGFyYSB0csOhcyBlIHBhcmEgZnJlbnRlIG5vIHByb2Nlc3NvIHByb2R1dGl2byBhY2ltYSBkYSBtw6lkaWEgKGdyYXUgZGUgaW50ZXJkZXBlbmTDqm5jaWEgZW50cmUgc2V0b3JlcykuIEEgaW5kw7pzdHJpYSBjaGF2ZSAobWVzdHJlKSBwb2RlIGluZHV6aXIgbyBzdXJnaW1lbnRvIGRlIHbDoXJpYXMgb3V0cmFzLCBjaGFtYWRhcyBpbmTDunN0cmlhcyBzYXTDqWxpdGVzLiAgICANCg0KQSBmYWx0YSBkZSBpbnRlcmRlcGVuZMOqbmNpYSBzZXRvcmlhbCBlLCBjb25zZXF1ZW50ZW1lbnRlLCBvcyBiYWl4b3MgKmxpbmthZ2UgZWZmZWN0cyosIGNvbnN0aXR1ZW0gdW1hIGRhcyBwcmluY2lwYWlzIGNhcmFjdGVyw61zdGljYXMgZGFzIGVjb25vbWlhcyBzdWJkZXNlbnZvbHZpZGFzIGUgZG9taW5hZGFzIHBvciBhdGl2aWRhZGVzIHRyYWRpY2lvbmFpcyAodMOqeHRpbCwgYWxpbWVudG9zLCBjYWzDp2Fkb3MgZXRjKS4NCkEgYWRvw6fDo28gZGUgcG9sw610aWNhcyBpbnRlcnZlbmNpb25pc3RhcyAodGFyaWZhcywgc3Vic8OtZGlvcywgZXRjLikgZGUgZXN0w61tdWxvcyBhbyBkZXNlbnZvbHZpbWVudG8gZGUgaW5kw7pzdHJpYXMgbWVzdHJlcyBub3MgcGHDrXNlcyBzdWJkZXNlbnZvbHZpZG9zIMOpIG5lY2Vzc8OhcmlhIHBhcmEgcXVlIGVzdGVzIHNldG9yZXMgY2hhdmUgbWF4aW1pemVtIG9zICpsaW5rYWdlIGVmZmVjdHMqLg0KDQoNCg0KIyMjIExpZ2HDp8OjbyBwYXJhIGZyZW50ZQ0KDQpgYGB7cn0NCiMgbWVkaWEgZG9zIGNvZWZpY2llbnRlcyBkYSBsaW5oYSBkbyBzZXRvciBpIC8gbcOpZGlhIGRlIHRvZG9zIG9zIGNvZWZpY2llbnRlcyBkZSBCDQptZWFuX0I8LW1lYW4oQikNCm1lYW5fQg0KbnNldG9yZXMgPC0gbmNvbChCKQ0KVWk8LW1hdHJpeCgwLG5yb3cgPSBuc2V0b3JlcyxuY29sID0gMSkNCmZvcihpIGluIDE6bnNldG9yZXMpew0KICBVZjwtbWVhbihCW2ksXSkvbWVhbl9CDQogIFVpW2ksMV08LVVmDQp9DQpVaQ0KYGBgDQoNCmBgYA0KIyAgICAgICAgICAgWywxXQ0KIyBbMSxdIDAuOTgwNzIwOQ0KIyBbMixdIDEuMDE5Mjc5MQ0KYGBgDQoNCiMjIyBMaWdhw6fDo28gcGFyYSB0csOhcw0KDQpgYGB7cn0NCiMgbWVkaWEgZG9zIGNvZWZpY2llbnRlcyBkYSBjb2x1bmEgZG8gc2V0b3IgaiAvIG3DqWRpYSBkZSB0b2RvcyBvcyBjb2VmaWNpZW50ZXMgZGUgQg0KVWo8LW1hdHJpeCgwLG5yb3cgPSBuc2V0b3JlcyxuY29sID0gMSkNCmZvcihqIGluIDE6bnNldG9yZXMpew0KICBVdDwtbWVhbihCWyxqXSkvbWVhbl9CDQogIFVqW2osMV08LVV0DQp9DQpVag0KYGBgDQoNCiMjIyBUYWJlbGEgUmVzdW1vIGRlIGxpZ2HDp8O1ZXMNCg0KYGBge3J9DQpsaWdhY29lc19mcmVudGVfdHJhczwtIGNiaW5kKFVpLFVqKQ0Kcm91bmQobGlnYWNvZXNfZnJlbnRlX3RyYXMsMykNCmBgYA0KDQpgYGANCiMgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgIA0KIyAgfC0tLS0tLS0tLTp8LS0tLS0tLS0tOnwgICAgICANCiMgIHwgMC45ODA3MjA5fCAxLjEwMzEwMTR8ICAgIA0KIyAgfCAxLjAxOTI3OTF8IDAuODk2ODk4NnwgDQpgYGANCg0KT3Ugc2VqYSwgbmVzc2UgY2FzbywgdmFsb3JlcyBtYWlvcmVzIHF1ZSAxIGluZGljYW0gbWFpb3IgbGlnYcOnw6NvLiBBIHByaW1laXJhIGNvbHVuYSDDqSBwYXJhIGZyZW50ZSBlIGEgc2VndW5kYSBwYXJhIHRyw6FzLg0KDQpSZWZlcsOqbmNpYXMgey0jUmVmZXLDqm5jaWFzfQ0KPT09PT09PT09PT09PT09PT09PT09PT09DQoNCg==