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. Séries Temporais com R: Conceitos iniciais. Campo Grande-MS, Brasil: Posit/Rpubs, 2023. Disponível em https://rpubs.com/amrofi/conceitos_time_series_intro2.

1 Apresentação

O objetivo deste material é capacitar o estudante a realizar aplicações com séries temporais, previsões futuras e decomposição da sazonalidade, tendência e ciclos em séries econômicas. Também trabalha-se a modelagem multivariada de fenômenos econômicos temporais.

Inicialmente, faz-se a apresentação do histórico e a evolução do pensamento em séries temporais, além de detalhar alguns conceitos básicos em séries temporais.

O leitor é encorajado a utilizar o RStudio, e desta forma, espera-se que já tenha instalado o R e o RStudio atualizados.

2 Iniciando um projeto em RStudio

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

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

Figura 1. do RStudio na tela inicial.

Considerando que o usuário já tenha instalado corretamente o R e o RStudio, o próximo passo recomendado é criar um projeto. A opção está no menu File \ New Project conforme a Figura 2.

Figura 2. RStudio File New Project

Na sequência, o RStudio abre janelas para escolher se deseja o projeto em novo diretório ou em um diretório existente. Se escolher novo (New Directory), aparecerão as opções (Figura 3) de projeto vazio (Empty Project), ou um pacote ou uma aplicação Shiny, e escolhe-se a opção Empty Project. Assim, o software criará uma pasta de trabalho e dentro desta haverá a criação do novo projeto. A janela Create New Project permitirá que o usuário escolha onde será criada a nova pasta e o nome do diretório desejado. Feito isso, clica-se em Create Project e abrirá o novo projeto, em seu próprio ambiente (ou diretório) de trabalho.

Figura 3. RStudio: Janela de criação do novo projeto

O ambiente básico de trabalho, conforme a Figura 4, é separado em quadrantes: à esquerda superior estão os códigos e scripts; à direita superior estão os dados, valores e funções; à direita inferior têm-se abas para os arquivos (Files), gráficos (Plots), Pacotes (Packages), ajuda (Help) e visualização (Viewer); à esquerda inferior, tem-se o console e as saídas da execução do script. No topo da tela pode-se visualizar o caminho ou diretório de trabalho.

Figura 4. RStudio: Novo projeto

O próximo passo sugerido é colocar, por meio do Explorador de Arquivos do Windows, o arquivo xlsx (ou outro formato) no diretório onde está o projeto. Feito isto, ele aparecerá na janela Files (Figura 5).

Figura 5. RStudio: Arquivos no ambiente de trabalho

Agora chame um script para ajustar ao seu objetivo. Abra em File/Open file e escolha um script (o arquivo com extensão .R). Como dica, escolha um script que se assemelhe ao que pretende fazer (Figura 6).

Figura 6. RStudio: escolhendo o script

Abra-o e salve em seu diretório de trabalho (Figura 7).

Figura 7. RStudio: salvando o script

Feito isto, inicie as alterações em seu script conforme seu objetivo. O ajuste do script depende do que pretende fazer Neste caso, pretendemos abrir os dados do Consumo do varejo de São Paulo utilizado no livro de Morettin e Toloi (2006), que está no Excel (xlsx), que colocamos numa planilha chamada “dados”. Uma dica: arrume o Excel antes de começar o script do R.

#primeiro chamamos os packages necessarios. Outra opcao é chama-los na medida do necessario
# seguirei os passos semelhante ao livro do Hyndman no https://www.otexts.org/fpp/2/1
# fpp: Data for "Forecasting: principles and practice"
# install.packages("fpp")
library(fpp2)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## ── Attaching packages ────────────────────────────────────────────── fpp2 2.4 ──
## ✔ ggplot2   3.4.1     ✔ fma       2.4  
## ✔ forecast  8.19      ✔ expsmooth 2.3
## 
#vou puxar os libraries que tenho costume de usar: destaque para o readxl e tseries
library(readxl)
# library(foreign);library(dynlm);library(car);library(lmtest)
# library(sandwich);library(tseries) 
library(lattice)
dados <- read_excel("CONSUMO morettin R.xlsx", 
                    sheet = "dados")
attach(dados)
dados2<- matrix(consumo)
dados.ts<- ts(dados2,start=c(1984,1), frequency = 12)
plot(dados.ts,main="Consumo do varejo de São Paulo, 
     Morettin e Toloi (2006)",
              xlab="Ano",ylab="índice")

plot(consumo, 
     main="Consumo do varejo de São Paulo, 
     Morettin e Toloi (2006)")

# verás que o objeto consumo não é compreendido como time series
# e o plot sai com bolhas inves de linha
#
# no pacote lattice
xyplot.ts(dados.ts,main="Consumo do varejo de São Paulo, 
     Morettin e Toloi (2006)")

#no ggplot
library(ggplot2)
datas <- seq(as.Date(paste(c(start(dados.ts),1), collapse="/")), 
             by = "month", length.out = length(consumo))
dados.df <- data.frame(date = datas, value = consumo)
ggplot(data=dados.df) + geom_line(aes(date, consumo)) + ggtitle("Consumo do varejo de São Paulo, 
     Morettin e Toloi (2006)"
)

Agora faremos um exemplo acompanhando a indicação de Hyndman e Athanasopoulus (2014).

#Outro exemplo do Hyndman: Vendas de drogas antidiabetes
# investigando padrões nos dados: tendência, sazonalidade e ciclo
plot(a10, ylab="$ million", xlab="Year", main="Antidiabetic drug sales")

#seasonal plots do Hyndman: 
seasonplot(a10,ylab="$ million", xlab="Year", 
           main="Seasonal plot: antidiabetic drug sales",
           year.labels=TRUE, year.labels.left=TRUE, col=1:20, pch=19)

# semelhante grafico sazonal do consumo do Morettin e Toloi:
seasonplot(dados.ts,ylab="indice", xlab="Ano", 
           main="Seasonal plot: Consumo do varejo de São Paulo,
           Morettin e Toloi (2006)",
           year.labels=TRUE, year.labels.left=TRUE, col=1:20, pch=19)

#Seasonal subseries plots: Hyndman:
monthplot(a10,ylab="$ million",xlab="Month",xaxt="n",
          main="Seasonal deviation plot: antidiabetic drug sales")
axis(1,at=1:12,labels=month.abb,cex=0.8)

#Seasonal subseries plots: consumo do Morettin e Toloi:
monthplot(consumo,ylab="indice",xlab="Mês",xaxt="n",
          main="Seasonal deviation plot: 
Consumo do varejo de São Paulo,
          Morettin e Toloi (2006)")
axis(1,at=1:12,labels=month.abb,cex=0.8)

3 Antecedentes

A análise estatística separa os conjuntos de observações com acompanhamento temporal como um tipo de série que requer análises específicas. Conforme Mattos (2016)1, a série temporal da variável aleatória Y apresentará uma dependência serial, uma ordenação específica que impedirá qualquer reordenação, diferentemente de uma amostra aleatória de observações independentes.

O modelo de série temporal aparece então como uma expressão matemática do comportamento da série e poderá ser utilizado para previsões de valores em determinados momentos no tempo, uma vez considerados seus padrões temporais. Na área econômica as séries temporais têm sido aplicadas em estudos principalmente onde se requer a variação temporal, estudos de mudança tecnológica, acompanhamentos macroeconômicos de inflação, contas nacionais, oferta e demanda de moeda, ativos financeiros, risco, cálculos de elasticidades entre outras variáveis econômicas temporais.

Mattos op. cit. ilustra os antecedentes históricos da análise de séries temporais, iniciada mais formalmente com os modelos de decomposição da tendência, do ciclo e a sazonalidade antes de 1955, aprofundada pelos modelos de Holt, Winters e Brown ou também chamados de modelos de alisamento ou suavização exponencial (do inglês exponential smoothing).

Já nas décadas de 1960-70, os modelos de Box-Jenkins2 e Granger e Newbold3 se tornaram predominantes, com análises incluindo termos autorregressivos e médias móveis nas análises, ou os chamados ARIMA (autorregressivo integrado média móvel).

Na década de 1980, os modelos estruturais e bayesianos começam a ser aplicados, simultaneamente aos desenvolvimentos relacionados a cointegração entre séries temporais. Com o passar dos anos, portanto, os econometristas perceberam a necessidade de livros técnicos específicos para tratar os problemas relacionados às séries temporais, surgindo célebres literaturas como o livro de MILLS (1990)4, HAMILTON (1994)5, HENDRY (1995)6, e MORETTIN e TOLOI (2006)7 no Brasil.

As séries temporais apresentam ênfase (mas não exclusividade) em métodos univariados, diferentemente da econometria em geral que se preocupa em explicar relações multivariadas, regressões múltiplas e mesmo sistema multiequacionais. A informação do modelo de séries temporais (ST) está nos dados, no comportamento ao longo do tempo, diferentemente da base teórica econômica a qual orienta o desenho dos modelos econométricos (Quadro 1).

Quadro 1. Diferenciação entre os modelos de série temporal daqueles da econometria em geral.

4 Conceitos básicos

4.1 Introdução

A série temporal tipicamente faz a relação de uma entidade em vários períodos de tempo. Por exemplo, a Figura 2.1 mostra os retornos das ações das Lojas Americanas (LAME4), das Lojas Renner (LREN3) e da Petrobras (PETR4).

library(readxl)
dados <- read_excel("ativos lame lren petr.xlsx", 
                    sheet = "dados")
attach(dados)
#View(dados)
lame4.ts<-ts(lame4,start=c(2005,10), frequency = 12)
lren3.ts<-ts(lren3,start=c(2005,10), frequency = 12)
petr4.ts<-ts(petr4,start=c(2005,10), frequency = 12)
plot(lame4.ts,main="Figura 2.1. Exemplo gráfico de séries temporais: 
     LAME4, LREN3 e PETR4, 2005-2012.", sub="Lojas Americanas (lame4), Lojas Renner (lren3) e Petrobras (petr4)",
              xlab="Mes/Ano",ylab="Retorno mensal", type="o",col = "black",lwd=2,lty=1)
lines(lren3.ts,type="o",col = "red",lwd=2,lty=2)
lines(petr4.ts,type="o",col = "green",lwd=2,lty=3)
# Adicionar a legenda
legend("topright",c("Lojas Americanas (lame4)", "Lojas Renner (lren3)", "Petrobras (petr4)"),lwd=2,lty=1:3,col=c(1,2,3),cex = 0.5) 

Em geral, as primeiras análises procuram observar padrões no tempo, como a tendência de (de)crescimento, ciclos de altas(baixas), ou sazonalidade (padrões repetitivos no curto prazo) e eventuais irregularidades. Seja uma relação de séries temporais \(y\) e \(x_k\):

\[{y_t} = {b_0} + {b_1}{x_{1t}} + \ldots + {b_k}{x_{kt}} + {u_t}\]

As séries temporais possuem uma ordenação explícita no tempo. As relações podem ser contemporâneas (mesmo tempo t) ou dinâmicas (tempos distintos):

\({y_t} = {b_0} + {b_1}{x_{1t}} + \ldots + {b_k}{x_{kt}} + {u_t}\) contemporâneas

\({y_t} = {a_0} + {d_0}{z_t} + {d_1}{z_{t - 1}} + {d_2}{z_{t - 2}} + {u_t}\) dinâmicas ou defasadas

O exemplo anterior é típico de defasagem distribuída de ordem 2. O processo genérico poderia ser de q defasagens de z, ou ordem q , dado por:

\({y_t} = {a_0} + {d_0}{z_t} + {d_1}{z_{t - 1}} + \ldots + {d_q}{z_{t - q}} + {u_t}\)

4.1.1 Passeio Aleatório (Random Walk)

O passeio ou caminho aleatório (Figura 8) é um processo \(\{X_t\}\) tal que depende apenas de seus valores passados e de um processo puramente aleatório \(\{ε_t\}\) com média \(\mu\) e variância \(σ^2_ε\) tal que:

  • \(X_t = X_{t-1} + ε_t\) caminho aleatório sem intercepto

  • \(X_t = \delta + X_{t-1} + ε_t\) caminho aleatório com intercepto

Substituindo a expressão de \(X_{t-1}\) em \(X_t\) tem-se \(X_t = X_{t-2} + ε_{t-1} + ε_t\). Generalizando tem-se \(X_t\) como função do valor inicial \(X_0=0\).

Figura 8. Passeio aleatório ilustrado.

Fonte: Adaptada de http://scifun.chem.wisc.edu/WOP/RandomWalk.html

4.1.1.1 Simulação de um passeio aleatório genérico

O passeio aleatório no R é feito numa simulação, neste caso, para uma função normal genérica. Ver script e Figura.

# SIMULANDO UM PASSEIO ALEATORIO GENERICO
# simulate random walk 
#
set.seed(321)
e = rnorm(250)
y.rw = cumsum(e)
ts.plot(y.rw, lwd=2, col="blue", main="Random Walk")
abline(h=0)

É possível verificar oscilações na série ao longo do tempo. A presença de eventuais tendências (se alterando ao longo de subamostras) e oscilações que indicam volatilidade ao longo das diferentes subamostras. Tais indicações, embora graficamente ainda representem apenas indicações, darão possíveis interpretações de não-estacionariedade da série.

4.1.1.2 Exemplo para a série do PIB Brasileiro

Neste exemplo utiliza-se a série n. 22109 do PIB a preços de mercado (SCN-2010, Trimestral, (1995=100), dados dessazonalizados ), de 1995T01 até 2016T04. Ver script e Figura. Por dificuldades operacionais com os pacotes BETS e ecoseries, optamos por baixar os dados diretamente do site do Banco Central do Brasil e chamar os dados para o R (Figura 9).

Figura 9. Site do Banco Central do Brasil.

# ver http://api.bcb.gov.br
# exemplo banco central do Brasil
# serie 22109  PIB a preços de mercado SCN-2010 (Trimestral) (1995=100)
# dados dessazonalizados # 01/01/1995 até 4º Trim. 2016  
library(ecoseries)
# series_bacen(x, from = "", to = "", save = "")
bacen <- series_bacen(x=c(22109),from = "31/12/1994", to = "01/01/2017")
#View(bacen)
#attach(bacen)
bacen.ts<-bacen$serie_22109
attach(bacen.ts)
pib.ts<-ts(valor, start = c(1996,1),frequency=4)
plot(pib.ts,main="BCB série 22109: PIB a preços de mercado SCN-2010 (Trimestral) (1995=100)",type = "o",col="black",lwd=2,lty=1, ylab = "Indice 1995=100",xlab="trimestre")

Por problemas operacionais do site, baixamos os dados em csv e depois chamamos para o R.

#Exemplo PIB - site com problemas
# baixei os dados em csv e vou chamar para o R
library(readxl)
bacen <- read_excel("pib_bacen.xlsx", 
                        sheet = "dados")
#View(bacen)
bacen<-bacen[,2]
attach(bacen)
## The following object is masked _by_ .GlobalEnv:
## 
##     bacen
pib.ts<-ts(bacen, start = c(1996,1),frequency=4)
plot(pib.ts,main="PIB a preços de mercado 
     SCN-2010 (Trimestral) (1995=100)",
     sub="BCB série 22109",type = "o",col="black",lwd=2,lty=1, 
     ylab = "Índice 1995=100",xlab="trimestre")

# Estacionariedade do PIB
dpib<-diff(pib.ts,1)
dpib2<-diff(pib.ts,2)
plot(dpib2,main="Séries de Diferenças do PIB",type = "o",col="black",lwd=2,lty=1, ylab = "Indice",xlab="trimestre")
lines(dpib,type="o",col = "red",lwd=2,lty=2)
legend("bottomleft",c("d(PIB,2)", "d(PIB)"),
       cex=0.7,lwd=2,lty=1:2,col=c(1,2))

4.1.2 Ruído Branco (White noise)

Assume-se em geral que os resíduos ut sejam bem comportados, ou seja, Ruído Branco: série de resíduos que representa um processo gaussiano, ou seja, com distribuição normal, média zero, variância constante e não-autocorrelacionados. O conceito de ruído branco será importante para compreender o conceito de estacionariedade de séries temporais.

\[ {u_t} \sim N(0,{\sigma ^2}) \]

4.1.2.1 Simulação de um processo Gaussiano White Noise

Utilizando o R/RStudio para gerar um White noise, pelo script. O resultado será como na Figura.

options(digits=4, width=70)
# simulate Gaussian White Noise process
set.seed(123)
y = rnorm(250)
ts.plot(y,main="Processo Gaussiano White Noise",
        xlab="time",ylab="y(t)",col="blue", lwd=2)
abline(h=0)

# plot equivalente usando a função plot()
plot(y, main="Processo Gaussiano White Noise", type="l",
     xlab="time",ylab="y(t)", col="blue", lwd=2)
abline(h=0)

4.1.3 Tendência determinística

Outro conceito é o de tendência (trend), que reflete as oscilações de longo prazo em uma série. No script e Figura, tem-se uma simulação de um processo de tendência determinística.

4.1.3.1 Simulação de um processo com tendência determinística

# SIMULANDO UMA TENDENCIA DETERMINÍSTICA
# 
set.seed(123)
e = rnorm(250)
y.dt = 0.2*seq(1,250) + e
ts.plot(y.dt, lwd=2, col="blue", main="Tendência Determinística + Ruído")
abline(a=0, b=0.2)

4.1.4 Estacionariedade

Em geral, a econometria tradicional (causa e efeito) pressupõe que todas as séries sejam estacionárias. Seja a seguinte série temporal \(X_t\): \[ X_t = \mu + ε_t \]

Em que \(ε_t\) é um ruído branco e \(\mu\) é uma constante. Tem-se uma série estacionária se o valor esperado da série \(X_t\) for constante no tempo, ou seja,

\[ E(X_t) = E(μ + ε_t ) = μ + E(ε_t ) = μ + 0 = μ \]

O caso da série não estacionária, por exemplo, seria o caso de uma série com tendência:

  • \(X_t = \alpha + βt + ε_t\) em que t denota tempo;

  • \(E(X_t) = E(\alpha + βt + ε_t) = E(\alpha + βt) + E(ε_t ) = μ + βt\) \(\ne\) constante

Este é um caso de tendência estacionária, pois uma vez retirada a tendência da série, esta se tornaria estacionária. Portanto, “será uma série estacionária se os dois primeiros momentos (média e variância) forem independentes do tempo e a autocovariância for dependente apenas da janela temporal (j) entre os dados”:

  • \(E(X_t) = μ\)
  • \(E\left[ {\left( {{X_t} - \mu } \right)\left( {{X_{t - j}} - \mu } \right)} \right] = \left\{ {\begin{array} {{\sigma^2},\;para\;\left( {j = 0} \right)}\\ {0\;\;,\;para\;\left( {j \ne 0} \right)} \end{array}} \right.\)

Resumidamente, a série não-estacionária tem uma raiz unitária e representa um processo estocástico. Mas, para esclarecer, são precisos outros conceitos auxiliares antes de esclarecer o que é ter uma raiz unitária. A utilização de séries não-estacionárias poderá gerar regressões espúrias, que serão explicadas mais a frente.

4.1.5 Operadores Diferença (difference) x Defasagem (lag)

Seja a série \(X_t\) em nível. O operador diferença é definido como segue: \[ ∆X_t=X_t-X_{t-1} \]

\[ ∆^2 X_t=∆X_t-∆X_{t-1}= (X_t-X_{t-1})-(X_{t-1}-X_{t-2})= X_t-2X_{t-1}+X_{t-2} \]

O operador de defasagem (L)8, ou lag operator, é definido como segue: \[ LX_t=X_{t-1} \]

\[ L^2 X_t=X_{t-2} \] e

\[ L^jX_t=X_{t-j} \]

Propriedades de L:

  • Se c é uma constante, então: \(L^j c=c\)

  • Propriedade distributiva: \((L^i+L^j)X_t=L^iX_t+L^jX_t=X_{t-i}-X_{t-j}\)

  • Propriedade multiplicativa: \(L^i(L^j)X_t=L^{i+j}X_t=X_{t-i-j}\)

  • Se \(|a|\gt 1: (1+a^{-1}L^{-1}+a^{-2}L^{-2}+a^{-3}L^{-3}+\ldots)X_t=\frac{-aLX_t}{(1-aL)}\)

  • Se \(|a|\lt 1: (1+aL+a^2L^2+a^3L^3+\ldots)X_t=\frac{X_t}{(1-aL)}\)

4.1.5.1 Operador defasagem (lag)

No R, pode-se obter a defasagem de uma série usando a função lag(x,y), em que x é a série e y é o número de períodos a defasar a série. Como exemplo, para a série de Consumo do varejo de São Paulo (Morettin e Toloi, 2006), seja a série temporal como: dados.ts<- ts(consumo,start=c(1984,1), frequency = 12). A defasagem de 6 períodos será: cons.l6<-lag(dados.ts, -6). Ver script e Figura.

# fazendo lag
consumo.ts<-dados.ts
cons.l6<-lag(consumo.ts, -6)
plot(consumo.ts, type="o",col = "black",lwd=2,lty=1)
lines(cons.l6,type="o",col = "red",lwd=2,lty=2)
legend("topright",c("Consumo varejo", "Consumo varejo t-6"),lwd=2,lty=1:2,col=c(1,2))

data.lag<-cbind(consumo.ts,cons.l6)
#View(data.lag)

Fonte: Elaboração própria com dados de Morettin e Toloi (2006).

4.1.5.2 Operador diferença (diff)

Já para fazer a diferença, faz-se, em R: diff(x, lag = 1, differences = 1). Ver script e Figura no exemplo do uso do operador diferença com séries do consumo de Morettin e Toloi (2006).

# Operador differença
consumo.ts<-ts(dados2,start = c(1984,1),frequency = 12)
consumo.ts
##         Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep
## 1984 114.13 110.79 116.46 111.57 120.66 121.15 121.27 127.02 129.04
## 1985 120.64 114.05 130.60 118.26 145.54 135.13 153.35 159.95 150.01
## 1986 134.26 133.11 147.84 164.46 181.86 170.44 186.64 174.21 181.62
## 1987 140.16 130.78 119.04 120.73 129.81 111.04 122.75 133.95 125.41
## 1988 110.09 113.25 124.03 110.63 116.72 124.63 124.38 130.27 119.87
## 1989 105.89 115.59 147.00 131.70 131.32 136.66 126.43 134.88 128.26
## 1990 116.25  96.93  89.27 101.87 125.57 113.31 109.39 127.33 120.56
## 1991 100.15  95.11 112.26 109.39 114.20 113.80 126.47 128.36 115.71
## 1992  87.08  85.67  82.02  98.20  96.44  90.23  97.15  95.08  94.00
## 1993  75.39  77.70  97.34  84.97  87.55  86.64  90.52  95.40  95.20
## 1994  85.63  82.77  96.55  81.33  96.91  83.76  90.19 114.84 108.40
## 1995  99.12  99.28 114.75 106.13 110.02 108.07 112.52 113.87 107.84
## 1996  92.24  93.56 107.37 102.89 114.78 102.88 118.41 119.23 117.36
##         Oct    Nov    Dec
## 1984 133.30 130.60 179.39
## 1985 164.93 170.37 220.96
## 1986 194.16 181.90 232.01
## 1987 132.05 129.54 176.37
## 1988 115.75 122.44 162.43
## 1989 125.32 124.61 166.11
## 1990 117.73 113.81 147.25
## 1991 116.09  99.53 127.27
## 1992  93.00  96.09 129.21
## 1993  95.80 101.23 128.49
## 1994 106.05 109.71 143.86
## 1995 112.12 112.03 139.37
## 1996 122.06
#View(consumo.ts)
dcons<-diff(consumo.ts,1)
dcons
##         Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep
## 1984         -3.34   5.67  -4.89   9.09   0.49   0.12   5.75   2.02
## 1985 -58.75  -6.59  16.55 -12.34  27.28 -10.41  18.22   6.60  -9.94
## 1986 -86.70  -1.15  14.73  16.62  17.40 -11.42  16.20 -12.43   7.41
## 1987 -91.85  -9.38 -11.74   1.69   9.08 -18.77  11.71  11.20  -8.54
## 1988 -66.28   3.16  10.78 -13.40   6.09   7.91  -0.25   5.89 -10.40
## 1989 -56.54   9.70  31.41 -15.30  -0.38   5.34 -10.23   8.45  -6.62
## 1990 -49.86 -19.32  -7.66  12.60  23.70 -12.26  -3.92  17.94  -6.77
## 1991 -47.10  -5.04  17.15  -2.87   4.81  -0.40  12.67   1.89 -12.65
## 1992 -40.19  -1.41  -3.65  16.18  -1.76  -6.21   6.92  -2.07  -1.08
## 1993 -53.82   2.31  19.64 -12.37   2.58  -0.91   3.88   4.88  -0.20
## 1994 -42.86  -2.86  13.78 -15.22  15.58 -13.15   6.43  24.65  -6.44
## 1995 -44.74   0.16  15.47  -8.62   3.89  -1.95   4.45   1.35  -6.03
## 1996 -47.13   1.32  13.81  -4.48  11.89 -11.90  15.53   0.82  -1.87
##         Oct    Nov    Dec
## 1984   4.26  -2.70  48.79
## 1985  14.92   5.44  50.59
## 1986  12.54 -12.26  50.11
## 1987   6.64  -2.51  46.83
## 1988  -4.12   6.69  39.99
## 1989  -2.94  -0.71  41.50
## 1990  -2.83  -3.92  33.44
## 1991   0.38 -16.56  27.74
## 1992  -1.00   3.09  33.12
## 1993   0.60   5.43  27.26
## 1994  -2.35   3.66  34.15
## 1995   4.28  -0.09  27.34
## 1996   4.70
plot(consumo.ts,type="o",col = "black",lwd=2,lty=1)
legend("topright",c("consumo do varejo SP"),lwd=2,lty=1,col=c(1))

plot(dcons,type="o",col = "red",lwd=2,lty=1)
legend("topright",c("dcons"),lwd=2,lty=1,col=c(2))

Fonte: elaboração própria com dados de Morettin e Toloi (2006).

4.1.6 Processo Estocástico

Pode-se definir o processo estocástico como “Aquele que não é determinístico, ou seja, refere-se a uma variável aleatória cujo valor futuro não pode ser previsto com certeza absoluta” (Buscarioli e Emerick, 2011, p.77). Ou seja, terá um termo de erro \(ε\) ( uma incerteza). Exemplo: Y = 100A + 0,1B + ε.

Imagine a taxa de câmbio \(R\$/US\$\) em cada instante de tempo t entre 17h e 18h neste dia seja aleatório. Pode-se interpretar este fato como uma realização \(Z_t(w)\) da variável aleatória \(Z_t\), e observar \(Z_t(w), 5\lt t\lt 6\). Para se fazer uma previsão às 18h acerca da taxa de câmbio \(Z_19(w)\) às 19h, é razoável olhar a evolução total de \(Z_t(w)\) entre 17h e 18h. O modelo matemático que descreve esta evolução é chamado de Processo Estocástico.

Ehlers (2009) definiu o Processo Estocástico como “uma coleção de variáveis aleatórias ordenadas no tempo e definidas em um conjunto de pontos T, que pode ser contínuo ou discreto”.

Está-se tentando modelar o caráter aleatório do processo e não uma descrição do tipo causa-efeito como no modelo de regressão. O comportamento pode ser obtido a partir de uma distribuição de probabilidades, e será tanto melhor quanto mais fiel estiver esta distribuição em relação à distribuição verdadeira.

No passeio aleatório, como exemplo, um choque temporário no PIB não se dissipará depois de vários anos e, desta forma, o choque teria efeito de um choque permanente. Se ele se revertesse à tendência, então apenas retirando a tendência o problema estaria resolvido para o uso econométrico.

Da discussão anterior sobre o passeio aleatório, obteve-se \(X_t\) como função do valor inicial \(X_0=0\), tal que: \[ X_t=X_0+\sum_{j=1}^t{ε_j} \]

Fazendo o valor esperado e a variância de \(X_t\) , tem-se a média e a variância dependentes do tempo:

\(E(X_t)=\sum_{j=1}^t{E(ε_j)} =tμ\)

\(Var(X_t)=\sum_{j=1}^t{Var{(ε_j)}} =tσ_ε^2\)

O comportamento futuro dos dados no processo estocástico serão descritos pela distribuição de probabilidade conjunta (\(F\)):

\(F(X_1,\ldots,X_t )=P(X_1 \le a_1,\ldots,X_t \le a_t)\)

Em que P denota a probabilidade.

Isto posto, pode-se definir a estacionariedade de modo mais explícito, como Estacionariedade Forte. O processo será estacionário forte:

  1. de primeira ordem se: \(F(X_{t_1})=F(X_{t_1+k})\)

  2. de segunda ordem se: \(F(X_{t_1},X_{t_2})=F(X_{t_1+k},X_{t_2+k})\)

  3. de ordem n se: \(F(X_{t_1},\ldots,X_{t_n})=F(X_{t_1+k},\ldots,X_{t_n+k})\)

A Estacionariedade fraca de ordem n pode ser definida quando:

  • A média e a variância do processo são constantes no tempo; e,

  • A estrutura de dependência linear depende apenas da distância entre os períodos e diminui com esta distância. Portanto, tem-se Estacionariedade fraca para:

\[ E(X_t) = μ = constante \]

\[ Var(X_t) = \sigma^2 = constante \]

\[ Corr(X_t,X_{t-k}) = \rho(k) \]

4.1.7 Regressão Espúria

Na estimação tradicional de \(Y=f(X)\), poderei ter um coeficiente de ajustamento \(R^2\) muito alto, próximo de 1, mas na verdade as variáveis podem ser não relacionadas. Pode ter ocorrido um \(R^2\) elevado em decorrência de outra variável relacionada a \(Y\) e a \(X\). Como exemplo, imagine que \(Y\) seja relacionada com \(Z\) e \(X\) seja relacionada com \(Z\), mas \(Y\) não seja relacionada com \(X\). Neste caso, \(Z\) poderá ser a tendência.

Em casos de regressão espúria, em geral, \(R^2\) é elevado, Durbin-Watson (\(DW\)) é afastado de 2, e \(R^2 \gt DW\). Se a série for integrada, poderei trabalhar com \(ΔY\) e \(ΔX\) fazendo \(ΔY =f(ΔX)\) e perderei as informações de longo prazo, pois as variáveis em diferenças representam tipicamente o curto prazo. É um problema típico de não-estacionariedade das séries.

4.1.8 Integração

Para melhor entendimento, falaremos sobre o Processo auto-regressivo. Seja uma série \(Y_t\) tal que

\[ Y_t = \phi_1Y_{t-1}+\ldots+\phi_pY_{t-p}+u_t+\theta_1u_{t-1}+\ldots+\theta_qu_{t-q} \]

Os termos associados a \(u_t\) são ditos termos de moving average ou \(MA(q)\), portanto:

  • \(MA(q): Y_t = u_t+\theta_1u_{t-1}+\ldots+\theta_qu_{t-q}\)

similarmente, os termos de \(Y_t\) são associados aos chamados termos auto-regressivos \(AR(p)\):

  • \(AR(p): Y_t = \phi_1Y_{t-1}+\ldots+\phi_pY_{t-p}+u_t\)

Se a série for estacionária, tem-se como estimar os momentos (média e variância) com as t observações. A variância será:

\[ Var(Y_t)= \frac{\sigma^2}{1-\phi^2} \]

Decorre disto que, se \(\phi=1\), a variância de \(Y_t\) será infinita, o que impossibilita o cálculo. Ou seja, é preciso que a série temporal tenha \(|\phi|\lt 1\). Se \(|\phi|\gt 1\), a variância seria negativa, o que é absurdo. Isto define se a série temporal é “estável” ou estacionária, ou melhor, que \(Y_t\) não “explode”.

A série será dita integrada se for possível obter uma série de diferença que é estacionária. Ou seja, se diferenciar \(X_t\) uma vez, obtendo \(ΔX_t\) , e esta série \(ΔX_t\) for estacionária, então diz-se que \(X_t\) é integrada de primeira ordem, simbolizando da forma: I(1).

Generalizando, se a série em diferenças \(Δ^jX_t\) for estacionária mas em ordens menores que j não forem, então diz-se que \(X_t\) é integrada de ordem j, simbolizada por I(j) e j é a ordem de integração. A ordem de integração é o número de raízes unitárias da série \(X_t\). A série estacionária em nível (sem diferenças) é dita integrada de ordem zero, denotada por I(0).

Isto está associado à idéia de ergodicidade. O Processo será ergódico quando o valor esperado da média para uma subamostra for igual ao valor esperado da série temporal. Portanto, se a média convergir para seu valor esperado em qualquer subamostra temporal.

4.2 Modelos clássicos de decomposição

Os modelos clássicos de decomposição tipicamente dividem a série em componentes: tendência (\(T_t\)), sazonalidade (\(S_t\)), ciclo (\(C_t\)) e irregularidades (\(e_t\)).

Tabela. Componentes de série temporal, definição, influência e duração. Fonte: Elaboração própria. A ideia é que essas componentes podem ser associadas em um modelo aditivo ou multiplicativo como nas expressões:

  • \({Y_t} = {T_t} + {C_t} + {S_t} + {e_t}\) modelo aditivo

  • \({Y_t} = {T_t} \cdot {C_t} \cdot {S_t} \cdot {e_t}\) modelo multiplicativo

Em geral, o que se faz é seguir os passos:   
  1. Plotar séries e ver comportamento temporal – tendência (Aumento, declínio, oscilação persistente da série)

  2. Fazer média móvel para expurgar efeitos sazonais e aleatórios da série

  3. Fazer índice estacional para avaliar o efeito sazonal

A média móvel é um artifício matemático interessante para análise pois apresenta a mesma tendência da série original, mostra as variações cíclicas da série original, elimina as flutuações de curtíssimo prazo ou aleatórias da série original, e será importante para verificar a tendência e o ciclo econômico.

A expressão usual para seu cálculo e, padrão na notação em R/Rstudio, seguirá a expressão de Morettin e Toloi (2006), para a média centrada de 12 meses:

\[ Z_7^{(12)} = {\textstyle{1 \over {12}}}\left( {\frac{{{Z_1} + {Z_2}}}{2} + \frac{{{Z_2} + {Z_3}}}{2} + \frac{{{Z_3} + {Z_4}}}{2} + ... + \frac{{{Z_{12}} + {Z_{13}}}}{2}} \right)\\ = {\textstyle{1 \over {24}}}\left( {{Z_1} + 2{Z_2} + 2{Z_3} + ... + 2{Z_{12}} + {Z_{13}}} \right) \]

Para a média centrada de um número impar de períodos, tem-se:

\[ Z_t^* = {\textstyle{1 \over {(2n + 1)}}}\sum\limits_{j = - n}^{j = + n} {{Z_{t + j}}} \\ Z_2^{(3)} = {\textstyle{1 \over 3}}\left( {{Z_1} + {Z_2} + {Z_3}} \right) \]

4.2.1 Médias móveis (rolling mean)

No script, utiliza-se primeiro a função rollmean do pacote zoo, e depois a função ma conforme Hyndman e Athanasopoulos (2017) . Observe que a expressão por rollmean apresenta uma dificuldade de posicionamento dos valores, pois calcula em fim de período (não centrada) e posiciona ao centro, enquanto por ma os cálculos ficam por default centrados e posicionados devidamente ao centro. Em um script do R/Rstudio:

# médias móveis com package zoo
library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
cons3<-rollmean(consumo.ts,3,align="center")
cons12<-rollmean(consumo.ts,12,align = "right")
plot(consumo.ts,main="Séries de consumo do varejo",type = "o",col="black",lwd=2,lty=1, ylab = "Indice",xlab="mês")
lines(cons3,type="o",col = "red",lwd=2,lty=2)
lines(cons12,type="o",col = "green",lwd=2,lty=3)
legend("topright",c("consumo", "cons3","cons12"),lwd=2,lty=1:3,col=c(1,2,3))

dados.cons<-cbind(consumo.ts,cons3,cons12)
#View(dados.cons)

# média móvel com operador ma(x, order, centre=TRUE)
cons12.ma<-ma(consumo.ts,12)
cons12.ma
##         Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep
## 1984     NA     NA     NA     NA     NA     NA 126.55 126.96 127.69
## 1985 133.41 136.12 138.36 140.55 143.53 146.92 149.22 150.58 152.09
## 1986 164.02 166.00 167.91 170.44 172.14 173.08 173.79 173.94 172.64
## 1987 155.85 151.51 147.49 142.56 137.79 133.29 129.72 127.73 127.21
## 1988 126.69 126.60 126.22 125.31 124.33 123.45 122.70 122.62 123.68
## 1989 128.69 128.97 129.51 130.26 130.75 130.99 131.58 131.23 128.05
## 1990 120.02 119.00 118.36 117.73 116.96 115.72 114.27 113.52 114.40
## 1991 115.79 116.55 116.39 116.12 115.45 114.03 112.65 111.71 110.06
## 1992 103.20 100.59  98.30  96.43  95.33  95.27  94.86  94.04  94.35
## 1993  92.57  92.30  92.37  92.53  92.86  93.05  93.45  94.08  94.26
## 1994  94.45  95.25  96.61  97.59  98.37  99.36 100.56 101.81 103.26
## 1995 110.13 111.02 110.96 111.19 111.54 111.45 110.97 110.45 109.90
## 1996 109.53 110.00 110.62 111.43     NA     NA     NA     NA     NA
##         Oct    Nov    Dec
## 1984 128.55 129.87 131.49
## 1985 154.73 158.17 161.16
## 1986 169.62 165.63 160.98
## 1987 127.00 126.03 126.05
## 1988 125.51 127.00 128.11
## 1989 124.40 122.92 121.71
## 1990 115.67 115.51 115.06
## 1991 108.33 107.13 105.40
## 1992  94.43  93.51  92.99
## 1993  94.08  94.32  94.59
## 1994 105.05 106.63 108.19
## 1995 109.46 109.52 109.51
## 1996     NA
plot(consumo.ts,main="Séries de consumo do varejo",type = "o",col="black",lwd=2,lty=1, ylab = "Indice",xlab="mês")
lines(cons3,type="o",col = "red",lwd=2,lty=2)
lines(cons12.ma,type="o",col = "green",lwd=2,lty=3)
legend("topright",c("consumo", "cons3","cons12.ma"),lwd=2,lty=1:3,col=c(1,2,3))

Referências

BOX, G.E.P.; JENKINS, G.M. Time series analysis: forecasting and control. Revised edition, San Francisco: Holden-Day, 1976.

GRANGER, C.W.J.; NEWBOLD, P. Forecasting economic time series. Academic Press, 1977.edition, 1987).

HAMILTON, James D. Time Series Analysis. Princeton University Press, 1994.

HENDRY, David F. Dynamic econometrics, Oxford University Press, 1995.

HYNDMAN, Rob J.; ATHANASOPOULOS, George . Forecasting: principles and practice. Otexts, 2014. Disponível em: https://www.otexts.org/fpp.

KENNEDY, Peter. A guide to econometrics. 4.ed. Cambridge: MIT Press, 1998. P. 278-279.

MATTOS, Rogério Silva. Decomposição com regressão (Apostila). Juiz de Fora: UFJF, 2016. Disponível em http://www.ufjf.br/rogerio_mattos/files/2009/06/Decomposição-com-Regressão.pdf. Acesso em 22/fev./2018.

MILLS, Terence C. time series techniques for economists. Cambridge University Press, 1990.

MORETTIN, Pedro A.; TOLOI, Clélia M.C. Análise de Séries Temporais. São Paulo: Edgard Blucher/ABE, 2006.

Notas


  1. MATTOS, Rogério Silva. Decomposição com regressão (Apostila). Juiz de Fora: UFJF, 2016. Disponível em http://www.ufjf.br/rogerio_mattos/files/2009/06/Decomposição-com-Regressão.pdf. Acesso em 22/fev./2018.↩︎

  2. BOX, G.E.P.; JENKINS, G.M. Time series analysis: forecasting and control. Revised edition, San Francisco: Holden-Day, 1976.↩︎

  3. GRANGER, C.W.J.; NEWBOLD, P. Forecasting economic time series. Academic Press, 1977.edition, 1987).↩︎

  4. MILLS, Terence C. time series techniques for economists. Cambridge University Press, 1990.↩︎

  5. HAMILTON, James D. Time Series Analysis. Princeton University Press, 1994.↩︎

  6. HENDRY, David F. Dynamic econometrics, Oxford University Press, 1995.↩︎

  7. MORETTIN, Pedro A.; TOLOI, Clélia M.C. Análise de Séries Temporais.São Paulo: Edgard Blucher/ABE, 2006.↩︎

  8. que em alguns livros usam a letra B ao invés de L, ver Pindyck & Rubinfeld, 2004: 618↩︎

LS0tDQp0aXRsZTogIlPDqXJpZXMgVGVtcG9yYWlzIGNvbSBSOiBDb25jZWl0b3MgaW5pY2lhaXMiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0KbGlua2NvbG9yOiBibHVlDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IG5vDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2NhcHRpb246IHRydWUgICAgDQogICAgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBMaWNlbsOnYSB7I0xpY2Vuw6dhIC51bm51bWJlcmVkfQ0KDQpUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0IDxodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvPiBvciBzZW5kIGEgbGV0dGVyIHRvIENyZWF0aXZlIENvbW1vbnMsIFBPIEJveCAxODY2LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MiwgVVNBLg0KDQohW0xpY2Vuc2U6IENDIEJZLVNBIDQuMF0oaHR0cHM6Ly9taXJyb3JzLmNyZWF0aXZlY29tbW9ucy5vcmcvcHJlc3NraXQvYnV0dG9ucy84OHgzMS9wbmcvYnktc2EucG5nKXt3aWR0aD0iMjUlIn0NCg0KIyBDaXRhw6fDo28geyNDaXRhw6fDo28gLnVubnVtYmVyZWR9DQoNClN1Z2VzdMOjbyBkZSBjaXRhw6fDo286IEZJR1VFSVJFRE8sIEFkcmlhbm8gTWFyY29zIFJvZHJpZ3Vlcy4gU8OpcmllcyBUZW1wb3JhaXMgY29tIFI6IENvbmNlaXRvcyBpbmljaWFpcy4gQ2FtcG8gR3JhbmRlLU1TLCBCcmFzaWw6IFBvc2l0L1JwdWJzLCAyMDIzLiBEaXNwb27DrXZlbCBlbSA8aHR0cHM6Ly9ycHVicy5jb20vYW1yb2ZpL2NvbmNlaXRvc190aW1lX3Nlcmllc19pbnRybzI+Lg0KDQoNCkFwcmVzZW50YcOnw6NvDQo9PT09PT09PT09PT09PT09PT09DQoNCk8gb2JqZXRpdm8gZGVzdGUgbWF0ZXJpYWwgw6kgY2FwYWNpdGFyIG8gZXN0dWRhbnRlIGEgcmVhbGl6YXIgYXBsaWNhw6fDtWVzIGNvbSBzw6lyaWVzIHRlbXBvcmFpcywgcHJldmlzw7VlcyBmdXR1cmFzIGUgZGVjb21wb3Npw6fDo28gZGEgc2F6b25hbGlkYWRlLCB0ZW5kw6puY2lhIGUgY2ljbG9zIGVtIHPDqXJpZXMgZWNvbsO0bWljYXMuIFRhbWLDqW0gdHJhYmFsaGEtc2UgYSBtb2RlbGFnZW0gbXVsdGl2YXJpYWRhIGRlIGZlbsO0bWVub3MgZWNvbsO0bWljb3MgdGVtcG9yYWlzLg0KDQpJbmljaWFsbWVudGUsIGZhei1zZSBhIGFwcmVzZW50YcOnw6NvIGRvIGhpc3TDs3JpY28gZSBhIGV2b2x1w6fDo28gZG8gcGVuc2FtZW50byBlbSBzw6lyaWVzIHRlbXBvcmFpcywgYWzDqW0gZGUgZGV0YWxoYXIgYWxndW5zIGNvbmNlaXRvcyBiw6FzaWNvcyBlbSBzw6lyaWVzIHRlbXBvcmFpcy4NCg0KDQpPIGxlaXRvciDDqSBlbmNvcmFqYWRvIGEgdXRpbGl6YXIgbyBSU3R1ZGlvLCBlIGRlc3RhIGZvcm1hLCBlc3BlcmEtc2UgcXVlIGrDoSB0ZW5oYSBpbnN0YWxhZG8gbyBSIGUgbyBSU3R1ZGlvIGF0dWFsaXphZG9zLiANCg0KDQpJbmljaWFuZG8gdW0gcHJvamV0byBlbSBSU3R1ZGlvDQo9PT09PT09PT09PT09PT09PT09DQoNCkluaWNpYWxtZW50ZSBvIGxlaXRvciBkZXZlIGJhaXhhciBvcyBwcm9ncmFtYXMgZSBwYWNvdGVzIG5lY2Vzc8OhcmlvcyBhbyBwcm9qZXRvLiBOZXN0ZSBjYXNvLCBzdWdlcmUtc2UgcXVlIHV0aWxpemUgbyBSU3R1ZGlvIGUgbyBSIGF0dWFsaXphZG9zLCBhIHBhcnRpciBkZTogaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZy9iaW4vd2luZG93cy9iYXNlLyBlIGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQzLy4gUXVhbmRvIGVzdGEgcmV2aXPDo28gZm9pIGZlaXRhLCBhIHZlcnPDo28gZG8gUlN0dWRpbyBlcmEgYSAqUlN0dWRpbyBEZXNrdG9wIDEuMS40MjMqIGUgZG8gKlItMy40LjMgZm9yIFdpbmRvd3MgKDMyLzY0IGJpdCkqLiANCg0KUHJpbWVpcm8gaW5zdGFsZSBvIFIgZSBwb3N0ZXJpb3JtZW50ZSBvIFJTdHVkaW8sIGRlIG1vZG8gcXVlIG8gc2VndW5kbyByZWNvbmhlw6dhIGF1dG9tYXRpY2FtZW50ZSBvIHByaW1laXJvLiBTZSB0dWRvIGVzdGl2ZXIgcGVyZmVpdG8sIGEgdGVsYSBpbmljaWFsIGRvIFJTdHVkaW8gbW9zdHJhcsOhIGNvcnJldGFtZW50ZSBhIHZlcnPDo28gZG8gUiAoRmlndXJhIDEpLg0KDQohWypGaWd1cmEgMS4gZG8gUlN0dWRpbyBuYSB0ZWxhIGluaWNpYWwuKl0oSW1hZ2VtMS5wbmcpDQoNCkNvbnNpZGVyYW5kbyBxdWUgbyB1c3XDoXJpbyBqw6EgdGVuaGEgaW5zdGFsYWRvIGNvcnJldGFtZW50ZSBvIFIgZSBvIFJTdHVkaW8sIG8gcHLDs3hpbW8gcGFzc28gcmVjb21lbmRhZG8gw6kgY3JpYXIgdW0gcHJvamV0by4gQSBvcMOnw6NvIGVzdMOhIG5vIG1lbnUgYEZpbGUgXCBOZXcgUHJvamVjdGAgY29uZm9ybWUgYSBGaWd1cmEgMi4NCg0KIVsqRmlndXJhIDIuIFJTdHVkaW8gRmlsZSBOZXcgUHJvamVjdCpdKEltYWdlbTIucG5nKQ0KDQpOYSBzZXF1w6puY2lhLCBvIFJTdHVkaW8gYWJyZSBqYW5lbGFzIHBhcmEgZXNjb2xoZXIgc2UgZGVzZWphIG8gcHJvamV0byBlbSBub3ZvIGRpcmV0w7NyaW8gb3UgZW0gdW0gZGlyZXTDs3JpbyBleGlzdGVudGUuIFNlIGVzY29saGVyIG5vdm8gKGBOZXcgRGlyZWN0b3J5YCksIGFwYXJlY2Vyw6NvIGFzIG9ww6fDtWVzIChGaWd1cmEgMykgZGUgcHJvamV0byB2YXppbyAoYEVtcHR5IFByb2plY3RgKSwgb3UgdW0gcGFjb3RlIG91IHVtYSBhcGxpY2HDp8OjbyBTaGlueSwgZSBlc2NvbGhlLXNlIGEgb3DDp8OjbyBgRW1wdHkgUHJvamVjdGAuIEFzc2ltLCBvIHNvZnR3YXJlIGNyaWFyw6EgdW1hIHBhc3RhIGRlIHRyYWJhbGhvIGUgZGVudHJvIGRlc3RhIGhhdmVyw6EgYSBjcmlhw6fDo28gZG8gbm92byBwcm9qZXRvLiBBIGphbmVsYSBgQ3JlYXRlIE5ldyBQcm9qZWN0YCBwZXJtaXRpcsOhIHF1ZSBvIHVzdcOhcmlvIGVzY29saGEgb25kZSBzZXLDoSBjcmlhZGEgYSBub3ZhIHBhc3RhIGUgbyBub21lIGRvIGRpcmV0w7NyaW8gZGVzZWphZG8uIEZlaXRvIGlzc28sIGNsaWNhLXNlIGVtIGBDcmVhdGUgUHJvamVjdGAgZSBhYnJpcsOhIG8gbm92byBwcm9qZXRvLCBlbSBzZXUgcHLDs3ByaW8gYW1iaWVudGUgKG91IGRpcmV0w7NyaW8pIGRlIHRyYWJhbGhvLg0KDQohWypGaWd1cmEgMy4gUlN0dWRpbzogSmFuZWxhIGRlIGNyaWHDp8OjbyBkbyBub3ZvIHByb2pldG8qXShJbWFnZW0zLnBuZykNCg0KTyBhbWJpZW50ZSBiw6FzaWNvIGRlIHRyYWJhbGhvLCBjb25mb3JtZSBhIEZpZ3VyYSA0LCDDqSBzZXBhcmFkbyBlbSBxdWFkcmFudGVzOiDDoCBlc3F1ZXJkYSBzdXBlcmlvciBlc3TDo28gb3MgY8OzZGlnb3MgZSBzY3JpcHRzOyDDoCBkaXJlaXRhIHN1cGVyaW9yIGVzdMOjbyBvcyBkYWRvcywgdmFsb3JlcyBlIGZ1bsOnw7Vlczsgw6AgZGlyZWl0YSBpbmZlcmlvciB0w6ptLXNlIGFiYXMgcGFyYSBvcyBhcnF1aXZvcyAoYEZpbGVzYCksIGdyw6FmaWNvcyAoYFBsb3RzYCksIFBhY290ZXMgKGBQYWNrYWdlc2ApLCBhanVkYSAoYEhlbHBgKSBlIHZpc3VhbGl6YcOnw6NvIChgVmlld2VyYCk7IMOgIGVzcXVlcmRhIGluZmVyaW9yLCB0ZW0tc2UgbyBjb25zb2xlIGUgYXMgc2HDrWRhcyBkYSBleGVjdcOnw6NvIGRvIHNjcmlwdC4gTm8gdG9wbyBkYSB0ZWxhIHBvZGUtc2UgdmlzdWFsaXphciBvIGNhbWluaG8gb3UgZGlyZXTDs3JpbyBkZSB0cmFiYWxoby4gICANCg0KIVsqRmlndXJhIDQuIFJTdHVkaW86IE5vdm8gcHJvamV0bypdKEltYWdlbTQucG5nKQ0KDQpPIHByw7N4aW1vIHBhc3NvIHN1Z2VyaWRvIMOpIGNvbG9jYXIsIHBvciBtZWlvIGRvIEV4cGxvcmFkb3IgZGUgQXJxdWl2b3MgZG8gV2luZG93cywgbyBhcnF1aXZvIHhsc3ggKG91IG91dHJvIGZvcm1hdG8pIG5vIGRpcmV0w7NyaW8gb25kZSBlc3TDoSBvIHByb2pldG8uIEZlaXRvIGlzdG8sIGVsZSBhcGFyZWNlcsOhIG5hIGphbmVsYSBgRmlsZXNgIChGaWd1cmEgNSkuDQoNCiFbKkZpZ3VyYSA1LiBSU3R1ZGlvOiBBcnF1aXZvcyBubyBhbWJpZW50ZSBkZSB0cmFiYWxobypdKEltYWdlbTUucG5nKQ0KDQpBZ29yYSBjaGFtZSB1bSBzY3JpcHQgcGFyYSBhanVzdGFyIGFvIHNldSBvYmpldGl2by4gQWJyYSBlbSBgRmlsZS9PcGVuIGZpbGVgICBlIGVzY29saGEgdW0gc2NyaXB0IChvIGFycXVpdm8gY29tIGV4dGVuc8OjbyAuUikuIENvbW8gZGljYSwgZXNjb2xoYSB1bSBzY3JpcHQgcXVlIHNlIGFzc2VtZWxoZSBhbyBxdWUgcHJldGVuZGUgZmF6ZXIgKEZpZ3VyYSA2KS4gDQoNCiFbKkZpZ3VyYSA2LiBSU3R1ZGlvOiBlc2NvbGhlbmRvIG8gc2NyaXB0Kl0oSW1hZ2VtNi5wbmcpDQoNCkFicmEtbyBlIHNhbHZlIGVtIHNldSBkaXJldMOzcmlvIGRlIHRyYWJhbGhvIChGaWd1cmEgNykuDQoNCiFbKkZpZ3VyYSA3LiBSU3R1ZGlvOiBzYWx2YW5kbyBvIHNjcmlwdCpdKEltYWdlbTcucG5nKQ0KDQpGZWl0byBpc3RvLCBpbmljaWUgYXMgYWx0ZXJhw6fDtWVzIGVtIHNldSBzY3JpcHQgY29uZm9ybWUgc2V1IG9iamV0aXZvLiBPIGFqdXN0ZSBkbyBzY3JpcHQgZGVwZW5kZSBkbyBxdWUgcHJldGVuZGUgZmF6ZXINCk5lc3RlIGNhc28sIHByZXRlbmRlbW9zIGFicmlyIG9zIGRhZG9zIGRvIENvbnN1bW8gZG8gdmFyZWpvIGRlIFPDo28gUGF1bG8gdXRpbGl6YWRvIG5vIGxpdnJvIGRlIE1vcmV0dGluIGUgVG9sb2kgKDIwMDYpLCBxdWUgZXN0w6Egbm8gRXhjZWwgKHhsc3gpLCBxdWUgY29sb2NhbW9zIG51bWEgcGxhbmlsaGEgY2hhbWFkYSDigJxkYWRvc+KAnS4gVW1hIGRpY2E6IGFycnVtZSBvIEV4Y2VsIGFudGVzIGRlIGNvbWXDp2FyIG8gc2NyaXB0IGRvIFIuDQoNCmBgYHtyfQ0KI3ByaW1laXJvIGNoYW1hbW9zIG9zIHBhY2thZ2VzIG5lY2Vzc2FyaW9zLiBPdXRyYSBvcGNhbyDDqSBjaGFtYS1sb3MgbmEgbWVkaWRhIGRvIG5lY2Vzc2FyaW8NCiMgc2VndWlyZWkgb3MgcGFzc29zIHNlbWVsaGFudGUgYW8gbGl2cm8gZG8gSHluZG1hbiBubyBodHRwczovL3d3dy5vdGV4dHMub3JnL2ZwcC8yLzENCiMgZnBwOiBEYXRhIGZvciAiRm9yZWNhc3Rpbmc6IHByaW5jaXBsZXMgYW5kIHByYWN0aWNlIg0KIyBpbnN0YWxsLnBhY2thZ2VzKCJmcHAiKQ0KbGlicmFyeShmcHAyKQ0KDQojdm91IHB1eGFyIG9zIGxpYnJhcmllcyBxdWUgdGVuaG8gY29zdHVtZSBkZSB1c2FyOiBkZXN0YXF1ZSBwYXJhIG8gcmVhZHhsIGUgdHNlcmllcw0KbGlicmFyeShyZWFkeGwpDQojIGxpYnJhcnkoZm9yZWlnbik7bGlicmFyeShkeW5sbSk7bGlicmFyeShjYXIpO2xpYnJhcnkobG10ZXN0KQ0KIyBsaWJyYXJ5KHNhbmR3aWNoKTtsaWJyYXJ5KHRzZXJpZXMpIA0KbGlicmFyeShsYXR0aWNlKQ0KZGFkb3MgPC0gcmVhZF9leGNlbCgiQ09OU1VNTyBtb3JldHRpbiBSLnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiZGFkb3MiKQ0KYXR0YWNoKGRhZG9zKQ0KZGFkb3MyPC0gbWF0cml4KGNvbnN1bW8pDQpkYWRvcy50czwtIHRzKGRhZG9zMixzdGFydD1jKDE5ODQsMSksIGZyZXF1ZW5jeSA9IDEyKQ0KcGxvdChkYWRvcy50cyxtYWluPSJDb25zdW1vIGRvIHZhcmVqbyBkZSBTw6NvIFBhdWxvLCANCiAgICAgTW9yZXR0aW4gZSBUb2xvaSAoMjAwNikiLA0KICAgICAgICAgICAgICB4bGFiPSJBbm8iLHlsYWI9IsOtbmRpY2UiKQ0KDQpwbG90KGNvbnN1bW8sIA0KICAgICBtYWluPSJDb25zdW1vIGRvIHZhcmVqbyBkZSBTw6NvIFBhdWxvLCANCiAgICAgTW9yZXR0aW4gZSBUb2xvaSAoMjAwNikiKQ0KIyB2ZXLDoXMgcXVlIG8gb2JqZXRvIGNvbnN1bW8gbsOjbyDDqSBjb21wcmVlbmRpZG8gY29tbyB0aW1lIHNlcmllcw0KIyBlIG8gcGxvdCBzYWkgY29tIGJvbGhhcyBpbnZlcyBkZSBsaW5oYQ0KIw0KIyBubyBwYWNvdGUgbGF0dGljZQ0KeHlwbG90LnRzKGRhZG9zLnRzLG1haW49IkNvbnN1bW8gZG8gdmFyZWpvIGRlIFPDo28gUGF1bG8sIA0KICAgICBNb3JldHRpbiBlIFRvbG9pICgyMDA2KSIpDQoNCiNubyBnZ3Bsb3QNCmxpYnJhcnkoZ2dwbG90MikNCmRhdGFzIDwtIHNlcShhcy5EYXRlKHBhc3RlKGMoc3RhcnQoZGFkb3MudHMpLDEpLCBjb2xsYXBzZT0iLyIpKSwgDQogICAgICAgICAgICAgYnkgPSAibW9udGgiLCBsZW5ndGgub3V0ID0gbGVuZ3RoKGNvbnN1bW8pKQ0KZGFkb3MuZGYgPC0gZGF0YS5mcmFtZShkYXRlID0gZGF0YXMsIHZhbHVlID0gY29uc3VtbykNCmdncGxvdChkYXRhPWRhZG9zLmRmKSArIGdlb21fbGluZShhZXMoZGF0ZSwgY29uc3VtbykpICsgZ2d0aXRsZSgiQ29uc3VtbyBkbyB2YXJlam8gZGUgU8OjbyBQYXVsbywgDQogICAgIE1vcmV0dGluIGUgVG9sb2kgKDIwMDYpIg0KKQ0KYGBgDQoNCkFnb3JhIGZhcmVtb3MgdW0gZXhlbXBsbyBhY29tcGFuaGFuZG8gYSBpbmRpY2HDp8OjbyBkZSBIeW5kbWFuIGUgQXRoYW5hc29wb3VsdXMgKDIwMTQpLg0KDQpgYGB7cn0NCg0KI091dHJvIGV4ZW1wbG8gZG8gSHluZG1hbjogVmVuZGFzIGRlIGRyb2dhcyBhbnRpZGlhYmV0ZXMNCiMgaW52ZXN0aWdhbmRvIHBhZHLDtWVzIG5vcyBkYWRvczogdGVuZMOqbmNpYSwgc2F6b25hbGlkYWRlIGUgY2ljbG8NCnBsb3QoYTEwLCB5bGFiPSIkIG1pbGxpb24iLCB4bGFiPSJZZWFyIiwgbWFpbj0iQW50aWRpYWJldGljIGRydWcgc2FsZXMiKQ0KDQojc2Vhc29uYWwgcGxvdHMgZG8gSHluZG1hbjogDQpzZWFzb25wbG90KGExMCx5bGFiPSIkIG1pbGxpb24iLCB4bGFiPSJZZWFyIiwgDQogICAgICAgICAgIG1haW49IlNlYXNvbmFsIHBsb3Q6IGFudGlkaWFiZXRpYyBkcnVnIHNhbGVzIiwNCiAgICAgICAgICAgeWVhci5sYWJlbHM9VFJVRSwgeWVhci5sYWJlbHMubGVmdD1UUlVFLCBjb2w9MToyMCwgcGNoPTE5KQ0KDQojIHNlbWVsaGFudGUgZ3JhZmljbyBzYXpvbmFsIGRvIGNvbnN1bW8gZG8gTW9yZXR0aW4gZSBUb2xvaToNCnNlYXNvbnBsb3QoZGFkb3MudHMseWxhYj0iaW5kaWNlIiwgeGxhYj0iQW5vIiwgDQogICAgICAgICAgIG1haW49IlNlYXNvbmFsIHBsb3Q6IENvbnN1bW8gZG8gdmFyZWpvIGRlIFPDo28gUGF1bG8sDQogICAgICAgICAgIE1vcmV0dGluIGUgVG9sb2kgKDIwMDYpIiwNCiAgICAgICAgICAgeWVhci5sYWJlbHM9VFJVRSwgeWVhci5sYWJlbHMubGVmdD1UUlVFLCBjb2w9MToyMCwgcGNoPTE5KQ0KDQojU2Vhc29uYWwgc3Vic2VyaWVzIHBsb3RzOiBIeW5kbWFuOg0KbW9udGhwbG90KGExMCx5bGFiPSIkIG1pbGxpb24iLHhsYWI9Ik1vbnRoIix4YXh0PSJuIiwNCiAgICAgICAgICBtYWluPSJTZWFzb25hbCBkZXZpYXRpb24gcGxvdDogYW50aWRpYWJldGljIGRydWcgc2FsZXMiKQ0KYXhpcygxLGF0PTE6MTIsbGFiZWxzPW1vbnRoLmFiYixjZXg9MC44KQ0KDQojU2Vhc29uYWwgc3Vic2VyaWVzIHBsb3RzOiBjb25zdW1vIGRvIE1vcmV0dGluIGUgVG9sb2k6DQptb250aHBsb3QoY29uc3Vtbyx5bGFiPSJpbmRpY2UiLHhsYWI9Ik3DqnMiLHhheHQ9Im4iLA0KICAgICAgICAgIG1haW49IlNlYXNvbmFsIGRldmlhdGlvbiBwbG90OiANCkNvbnN1bW8gZG8gdmFyZWpvIGRlIFPDo28gUGF1bG8sDQogICAgICAgICAgTW9yZXR0aW4gZSBUb2xvaSAoMjAwNikiKQ0KYXhpcygxLGF0PTE6MTIsbGFiZWxzPW1vbnRoLmFiYixjZXg9MC44KQ0KDQpgYGANCg0KQW50ZWNlZGVudGVzDQo9PT09PT09PT09PT09PT09PT09DQoNCkEgYW7DoWxpc2UgZXN0YXTDrXN0aWNhIHNlcGFyYSBvcyBjb25qdW50b3MgZGUgb2JzZXJ2YcOnw7VlcyBjb20gYWNvbXBhbmhhbWVudG8gdGVtcG9yYWwgY29tbyB1bSB0aXBvIGRlIHPDqXJpZSBxdWUgcmVxdWVyIGFuw6FsaXNlcyBlc3BlY8OtZmljYXMuIENvbmZvcm1lIE1hdHRvcyAoMjAxNileW01BVFRPUywgUm9nw6lyaW8gU2lsdmEuIERlY29tcG9zacOnw6NvIGNvbSByZWdyZXNzw6NvIChBcG9zdGlsYSkuIEp1aXogZGUgRm9yYTogVUZKRiwgMjAxNi4gRGlzcG9uw612ZWwgZW0gaHR0cDovL3d3dy51ZmpmLmJyL3JvZ2VyaW9fbWF0dG9zL2ZpbGVzLzIwMDkvMDYvRGVjb21wb3Npw6fDo28tY29tLVJlZ3Jlc3PDo28ucGRmLiBBY2Vzc28gZW0gMjIvZmV2Li8yMDE4Ll0sIGEgc8OpcmllIHRlbXBvcmFsIGRhIHZhcmnDoXZlbCBhbGVhdMOzcmlhIFkgYXByZXNlbnRhcsOhIHVtYSBkZXBlbmTDqm5jaWEgc2VyaWFsLCB1bWEgb3JkZW5hw6fDo28gZXNwZWPDrWZpY2EgcXVlIGltcGVkaXLDoSBxdWFscXVlciByZW9yZGVuYcOnw6NvLCBkaWZlcmVudGVtZW50ZSBkZSB1bWEgYW1vc3RyYSBhbGVhdMOzcmlhIGRlIG9ic2VydmHDp8O1ZXMgaW5kZXBlbmRlbnRlcy4gICANCg0KTyBtb2RlbG8gZGUgc8OpcmllIHRlbXBvcmFsIGFwYXJlY2UgZW50w6NvIGNvbW8gdW1hIGV4cHJlc3PDo28gbWF0ZW3DoXRpY2EgZG8gY29tcG9ydGFtZW50byBkYSBzw6lyaWUgZSBwb2RlcsOhIHNlciB1dGlsaXphZG8NCnBhcmEgcHJldmlzw7VlcyBkZSB2YWxvcmVzIGVtIGRldGVybWluYWRvcyBtb21lbnRvcyBubyB0ZW1wbywgdW1hIHZleiBjb25zaWRlcmFkb3Mgc2V1cyBwYWRyw7VlcyB0ZW1wb3JhaXMuIE5hIMOhcmVhDQplY29uw7RtaWNhIGFzIHPDqXJpZXMgdGVtcG9yYWlzIHTDqm0gc2lkbyBhcGxpY2FkYXMgZW0gZXN0dWRvcyBwcmluY2lwYWxtZW50ZSBvbmRlIHNlIHJlcXVlciBhIHZhcmlhw6fDo28gdGVtcG9yYWwsIGVzdHVkb3MNCmRlIG11ZGFuw6dhIHRlY25vbMOzZ2ljYSwgYWNvbXBhbmhhbWVudG9zIG1hY3JvZWNvbsO0bWljb3MgZGUgaW5mbGHDp8OjbywgY29udGFzIG5hY2lvbmFpcywgb2ZlcnRhIGUgZGVtYW5kYSBkZSBtb2VkYSwNCmF0aXZvcyBmaW5hbmNlaXJvcywgcmlzY28sIGPDoWxjdWxvcyBkZSBlbGFzdGljaWRhZGVzIGVudHJlIG91dHJhcyB2YXJpw6F2ZWlzIGVjb27DtG1pY2FzIHRlbXBvcmFpcy4NCg0KTWF0dG9zIG9wLiBjaXQuIGlsdXN0cmEgb3MgYW50ZWNlZGVudGVzIGhpc3TDs3JpY29zIGRhIGFuw6FsaXNlIGRlIHPDqXJpZXMgdGVtcG9yYWlzLCBpbmljaWFkYSBtYWlzIGZvcm1hbG1lbnRlIGNvbSBvcw0KbW9kZWxvcyBkZSBkZWNvbXBvc2nDp8OjbyBkYSB0ZW5kw6puY2lhLCBkbyBjaWNsbyBlIGEgc2F6b25hbGlkYWRlIGFudGVzIGRlIDE5NTUsIGFwcm9mdW5kYWRhIHBlbG9zIG1vZGVsb3MgZGUgSG9sdCwNCldpbnRlcnMgZSBCcm93biBvdSB0YW1iw6ltIGNoYW1hZG9zIGRlIG1vZGVsb3MgZGUgYWxpc2FtZW50byBvdSBzdWF2aXphw6fDo28gZXhwb25lbmNpYWwgKGRvIGluZ2zDqnMgZXhwb25lbnRpYWwNCnNtb290aGluZykuIA0KDQpKw6EgbmFzIGTDqWNhZGFzIGRlIDE5NjAtNzAsIG9zIG1vZGVsb3MgZGUgQm94LUplbmtpbnNeW0JPWCwgRy5FLlAuOyBKRU5LSU5TLCBHLk0uIFRpbWUgc2VyaWVzIGFuYWx5c2lzOiBmb3JlY2FzdGluZyBhbmQgY29udHJvbC4gUmV2aXNlZCBlZGl0aW9uLCBTYW4gRnJhbmNpc2NvOiBIb2xkZW4tRGF5LCAxOTc2Ll0gZSBHcmFuZ2VyIGUNCk5ld2JvbGReW0dSQU5HRVIsIEMuVy5KLjsgTkVXQk9MRCwgUC4gRm9yZWNhc3RpbmcgZWNvbm9taWMgdGltZSBzZXJpZXMuIEFjYWRlbWljIFByZXNzLCAxOTc3LmVkaXRpb24sIDE5ODcpLl0gc2UgdG9ybmFyYW0NCnByZWRvbWluYW50ZXMsIGNvbSBhbsOhbGlzZXMgaW5jbHVpbmRvIHRlcm1vcyBhdXRvcnJlZ3Jlc3Npdm9zIGUgbcOpZGlhcyBtw7N2ZWlzIG5hcyBhbsOhbGlzZXMsIG91IG9zIGNoYW1hZG9zIEFSSU1BDQooYXV0b3JyZWdyZXNzaXZvIGludGVncmFkbyBtw6lkaWEgbcOzdmVsKS4gDQoNCk5hIGTDqWNhZGEgZGUgMTk4MCwgb3MgbW9kZWxvcyBlc3RydXR1cmFpcyBlIGJheWVzaWFub3MgY29tZcOnYW0gYSBzZXIgYXBsaWNhZG9zLCBzaW11bHRhbmVhbWVudGUgYW9zIGRlc2Vudm9sdmltZW50b3MNCnJlbGFjaW9uYWRvcyBhIGNvaW50ZWdyYcOnw6NvIGVudHJlIHPDqXJpZXMgdGVtcG9yYWlzLiBDb20gbyBwYXNzYXIgZG9zIGFub3MsIHBvcnRhbnRvLCBvcyBlY29ub21ldHJpc3RhcyBwZXJjZWJlcmFtIGENCm5lY2Vzc2lkYWRlIGRlIGxpdnJvcyB0w6ljbmljb3MgZXNwZWPDrWZpY29zIHBhcmEgdHJhdGFyIG9zIHByb2JsZW1hcyByZWxhY2lvbmFkb3Mgw6BzIHPDqXJpZXMgdGVtcG9yYWlzLCBzdXJnaW5kbyBjw6lsZWJyZXMNCmxpdGVyYXR1cmFzIGNvbW8gbyBsaXZybyBkZSBNSUxMUyAoMTk5MCleW01JTExTLCBUZXJlbmNlIEMuIHRpbWUgc2VyaWVzIHRlY2huaXF1ZXMgZm9yIGVjb25vbWlzdHMuIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLCAxOTkwLl0sIEhBTUlMVE9OICgxOTk0KV5bSEFNSUxUT04sIEphbWVzIEQuIFRpbWUgU2VyaWVzIEFuYWx5c2lzLiBQcmluY2V0b24gVW5pdmVyc2l0eSBQcmVzcywgMTk5NC5dLCBIRU5EUlkNCigxOTk1KV5bSEVORFJZLCBEYXZpZCBGLiBEeW5hbWljIGVjb25vbWV0cmljcywgT3hmb3JkIFVuaXZlcnNpdHkgUHJlc3MsIDE5OTUuXSwgZSBNT1JFVFRJTiBlIFRPTE9JICgyMDA2KV5bTU9SRVRUSU4sIFBlZHJvIEEuOyBUT0xPSSwgQ2zDqWxpYSBNLkMuIEFuw6FsaXNlIGRlIFPDqXJpZXMgVGVtcG9yYWlzLlPDo28gUGF1bG86IEVkZ2FyZCBCbHVjaGVyL0FCRSwgMjAwNi5dIG5vIEJyYXNpbC4NCiANCkFzIHPDqXJpZXMgdGVtcG9yYWlzIGFwcmVzZW50YW0gw6puZmFzZSAobWFzIG7Do28gZXhjbHVzaXZpZGFkZSkgZW0gbcOpdG9kb3MgdW5pdmFyaWFkb3MsIGRpZmVyZW50ZW1lbnRlIGRhIGVjb25vbWV0cmlhIGVtDQpnZXJhbCBxdWUgc2UgcHJlb2N1cGEgZW0gZXhwbGljYXIgcmVsYcOnw7VlcyBtdWx0aXZhcmlhZGFzLCByZWdyZXNzw7VlcyBtw7psdGlwbGFzIGUgbWVzbW8gc2lzdGVtYSBtdWx0aWVxdWFjaW9uYWlzLiBBDQppbmZvcm1hw6fDo28gZG8gbW9kZWxvIGRlIHPDqXJpZXMgdGVtcG9yYWlzIChTVCkgZXN0w6Egbm9zIGRhZG9zLCBubyBjb21wb3J0YW1lbnRvIGFvIGxvbmdvIGRvIHRlbXBvLCBkaWZlcmVudGVtZW50ZSBkYQ0KYmFzZSB0ZcOzcmljYSBlY29uw7RtaWNhIGEgcXVhbCBvcmllbnRhIG8gZGVzZW5obyBkb3MgbW9kZWxvcyBlY29ub23DqXRyaWNvcyAoUXVhZHJvIDEpLiANCg0KDQohWypRdWFkcm8gMS4gRGlmZXJlbmNpYcOnw6NvIGVudHJlIG9zIG1vZGVsb3MgZGUgc8OpcmllIHRlbXBvcmFsIGRhcXVlbGVzIGRhIGVjb25vbWV0cmlhIGVtIGdlcmFsLipdKFF1YWRybzEucG5nKQ0KDQoNCkNvbmNlaXRvcyBiw6FzaWNvcw0KPT09PT09PT09PT09PT09PT09PQ0KDQojIyBJbnRyb2R1w6fDo28NCiAgDQpBIHPDqXJpZSB0ZW1wb3JhbCB0aXBpY2FtZW50ZSBmYXogYSByZWxhw6fDo28gZGUgdW1hIGVudGlkYWRlIGVtIHbDoXJpb3MgcGVyw61vZG9zIGRlIHRlbXBvLiBQb3IgZXhlbXBsbywgYSBGaWd1cmEgMi4xIG1vc3RyYSBvcyByZXRvcm5vcyBkYXMgYcOnw7VlcyBkYXMgTG9qYXMgQW1lcmljYW5hcyAoTEFNRTQpLCBkYXMgTG9qYXMgUmVubmVyIChMUkVOMykgZSBkYSBQZXRyb2JyYXMgKFBFVFI0KS4NCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmRhZG9zIDwtIHJlYWRfZXhjZWwoImF0aXZvcyBsYW1lIGxyZW4gcGV0ci54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gImRhZG9zIikNCmF0dGFjaChkYWRvcykNCiNWaWV3KGRhZG9zKQ0KbGFtZTQudHM8LXRzKGxhbWU0LHN0YXJ0PWMoMjAwNSwxMCksIGZyZXF1ZW5jeSA9IDEyKQ0KbHJlbjMudHM8LXRzKGxyZW4zLHN0YXJ0PWMoMjAwNSwxMCksIGZyZXF1ZW5jeSA9IDEyKQ0KcGV0cjQudHM8LXRzKHBldHI0LHN0YXJ0PWMoMjAwNSwxMCksIGZyZXF1ZW5jeSA9IDEyKQ0KcGxvdChsYW1lNC50cyxtYWluPSJGaWd1cmEgMi4xLiBFeGVtcGxvIGdyw6FmaWNvIGRlIHPDqXJpZXMgdGVtcG9yYWlzOiANCiAgICAgTEFNRTQsIExSRU4zIGUgUEVUUjQsIDIwMDUtMjAxMi4iLCBzdWI9IkxvamFzIEFtZXJpY2FuYXMgKGxhbWU0KSwgTG9qYXMgUmVubmVyIChscmVuMykgZSBQZXRyb2JyYXMgKHBldHI0KSIsDQogICAgICAgICAgICAgIHhsYWI9Ik1lcy9Bbm8iLHlsYWI9IlJldG9ybm8gbWVuc2FsIiwgdHlwZT0ibyIsY29sID0gImJsYWNrIixsd2Q9MixsdHk9MSkNCmxpbmVzKGxyZW4zLnRzLHR5cGU9Im8iLGNvbCA9ICJyZWQiLGx3ZD0yLGx0eT0yKQ0KbGluZXMocGV0cjQudHMsdHlwZT0ibyIsY29sID0gImdyZWVuIixsd2Q9MixsdHk9MykNCiMgQWRpY2lvbmFyIGEgbGVnZW5kYQ0KbGVnZW5kKCJ0b3ByaWdodCIsYygiTG9qYXMgQW1lcmljYW5hcyAobGFtZTQpIiwgIkxvamFzIFJlbm5lciAobHJlbjMpIiwgIlBldHJvYnJhcyAocGV0cjQpIiksbHdkPTIsbHR5PTE6Myxjb2w9YygxLDIsMyksY2V4ID0gMC41KSANCg0KYGBgDQoNCkVtIGdlcmFsLCBhcyBwcmltZWlyYXMgYW7DoWxpc2VzIHByb2N1cmFtIG9ic2VydmFyIHBhZHLDtWVzIG5vIHRlbXBvLCBjb21vIGEgdGVuZMOqbmNpYSBkZSAoZGUpY3Jlc2NpbWVudG8sIGNpY2xvcyBkZSBhbHRhcyhiYWl4YXMpLCBvdSBzYXpvbmFsaWRhZGUgKHBhZHLDtWVzIHJlcGV0aXRpdm9zIG5vIGN1cnRvIHByYXpvKSBlIGV2ZW50dWFpcyBpcnJlZ3VsYXJpZGFkZXMuDQpTZWphIHVtYSByZWxhw6fDo28gZGUgc8OpcmllcyB0ZW1wb3JhaXMgJHkkIGUgJHhfayQ6DQoNCiQke3lfdH0gPSB7Yl8wfSArIHtiXzF9e3hfezF0fX0gKyAgXGxkb3RzICArIHtiX2t9e3hfe2t0fX0gKyB7dV90fSQkDQoNCkFzIHPDqXJpZXMgdGVtcG9yYWlzIHBvc3N1ZW0gdW1hIG9yZGVuYcOnw6NvIGV4cGzDrWNpdGEgbm8gdGVtcG8uIEFzIHJlbGHDp8O1ZXMgcG9kZW0gc2VyIGNvbnRlbXBvcsOibmVhcyAobWVzbW8gdGVtcG8gdCkgb3UgZGluw6JtaWNhcyAodGVtcG9zIGRpc3RpbnRvcyk6DQoNCiR7eV90fSA9IHtiXzB9ICsge2JfMX17eF97MXR9fSArICBcbGRvdHMgICsge2Jfa317eF97a3R9fSArIHt1X3R9JCBjb250ZW1wb3LDom5lYXMNCg0KDQoke3lfdH0gPSB7YV8wfSArIHtkXzB9e3pfdH0gKyB7ZF8xfXt6X3t0IC0gMX19ICsge2RfMn17el97dCAtIDJ9fSArIHt1X3R9JCBkaW7Dom1pY2FzIG91IGRlZmFzYWRhcw0KDQpPIGV4ZW1wbG8gYW50ZXJpb3Igw6kgdMOtcGljbyBkZSBkZWZhc2FnZW0gZGlzdHJpYnXDrWRhIGRlIG9yZGVtIDIuIE8gcHJvY2Vzc28gZ2Vuw6lyaWNvIHBvZGVyaWEgc2VyIGRlIHEgZGVmYXNhZ2VucyBkZSB6LCBvdSBvcmRlbSAgcSAsIGRhZG8gcG9yOg0KDQoke3lfdH0gPSB7YV8wfSArIHtkXzB9e3pfdH0gKyB7ZF8xfXt6X3t0IC0gMX19ICsgIFxsZG90cyAgKyB7ZF9xfXt6X3t0IC0gcX19ICsge3VfdH0kDQoNCiMjIyBQYXNzZWlvIEFsZWF0w7NyaW8gKCpSYW5kb20gV2FsayopDQoNCk8gcGFzc2VpbyBvdSBjYW1pbmhvIGFsZWF0w7NyaW8gKEZpZ3VyYSA4KSDDqSB1bSBwcm9jZXNzbyAkXHtYX3RcfSQgdGFsIHF1ZSBkZXBlbmRlIGFwZW5hcyBkZSBzZXVzIHZhbG9yZXMgcGFzc2Fkb3MgZSBkZSB1bSBwcm9jZXNzbyBwdXJhbWVudGUgYWxlYXTDs3JpbyAkXHvOtV90XH0kIGNvbSBtw6lkaWEgJFxtdSQgZSB2YXJpw6JuY2lhICTPg14yX861JCAgdGFsIHF1ZToNCg0KKiAJICRYX3QgPSBYX3t0LTF9ICsgzrVfdCQJCWNhbWluaG8gYWxlYXTDs3JpbyBzZW0gaW50ZXJjZXB0bw0KDQoqICAgICRYX3QgPSBcZGVsdGEgKyBYX3t0LTF9ICsgzrVfdCQJCWNhbWluaG8gYWxlYXTDs3JpbyBjb20gaW50ZXJjZXB0bw0KDQpTdWJzdGl0dWluZG8gYSBleHByZXNzw6NvIGRlICRYX3t0LTF9JCBlbSAkWF90JCAgdGVtLXNlICRYX3QgPSBYX3t0LTJ9ICsgzrVfe3QtMX0gKyDOtV90JC4gR2VuZXJhbGl6YW5kbyB0ZW0tc2UgJFhfdCQgY29tbyBmdW7Dp8OjbyBkbyB2YWxvciBpbmljaWFsICRYXzA9MCQuDQoNCg0KIVsqRmlndXJhIDguIFBhc3NlaW8gYWxlYXTDs3JpbyBpbHVzdHJhZG8uKl0oSW1hZ2VtOC5wbmcpDQoNCkZvbnRlOiBBZGFwdGFkYSBkZSBodHRwOi8vc2NpZnVuLmNoZW0ud2lzYy5lZHUvV09QL1JhbmRvbVdhbGsuaHRtbA0KDQoNCiMjIyMgU2ltdWxhw6fDo28gZGUgdW0gcGFzc2VpbyBhbGVhdMOzcmlvIGdlbsOpcmljbw0KDQpPIHBhc3NlaW8gYWxlYXTDs3JpbyBubyBSIMOpIGZlaXRvIG51bWEgc2ltdWxhw6fDo28sIG5lc3RlIGNhc28sIHBhcmEgdW1hIGZ1bsOnw6NvIG5vcm1hbCBnZW7DqXJpY2EuIFZlciBzY3JpcHQgZSBGaWd1cmEuDQoNCmBgYHtyfQ0KIyBTSU1VTEFORE8gVU0gUEFTU0VJTyBBTEVBVE9SSU8gR0VORVJJQ08NCiMgc2ltdWxhdGUgcmFuZG9tIHdhbGsgDQojDQpzZXQuc2VlZCgzMjEpDQplID0gcm5vcm0oMjUwKQ0KeS5ydyA9IGN1bXN1bShlKQ0KdHMucGxvdCh5LnJ3LCBsd2Q9MiwgY29sPSJibHVlIiwgbWFpbj0iUmFuZG9tIFdhbGsiKQ0KYWJsaW5lKGg9MCkNCmBgYA0KDQrDiSBwb3Nzw612ZWwgdmVyaWZpY2FyIG9zY2lsYcOnw7VlcyBuYSBzw6lyaWUgYW8gbG9uZ28gZG8gdGVtcG8uIEEgcHJlc2Vuw6dhIGRlIGV2ZW50dWFpcyB0ZW5kw6puY2lhcyAoc2UgYWx0ZXJhbmRvIGFvIGxvbmdvIGRlIHN1YmFtb3N0cmFzKSBlIG9zY2lsYcOnw7VlcyBxdWUgaW5kaWNhbSB2b2xhdGlsaWRhZGUgYW8gbG9uZ28gZGFzIGRpZmVyZW50ZXMgc3ViYW1vc3RyYXMuIFRhaXMgaW5kaWNhw6fDtWVzLCBlbWJvcmEgZ3JhZmljYW1lbnRlIGFpbmRhIHJlcHJlc2VudGVtIGFwZW5hcyBpbmRpY2HDp8O1ZXMsIGRhcsOjbyBwb3Nzw612ZWlzIGludGVycHJldGHDp8O1ZXMgZGUgbsOjby1lc3RhY2lvbmFyaWVkYWRlIGRhIHPDqXJpZS4NCg0KIyMjIyBFeGVtcGxvIHBhcmEgYSBzw6lyaWUgZG8gUElCIEJyYXNpbGVpcm8NCg0KTmVzdGUgZXhlbXBsbyB1dGlsaXphLXNlIGEgc8OpcmllIG4uIDIyMTA5ICBkbyBQSUIgYSBwcmXDp29zIGRlIG1lcmNhZG8gKFNDTi0yMDEwLCBUcmltZXN0cmFsLCAoMTk5NT0xMDApLCBkYWRvcyBkZXNzYXpvbmFsaXphZG9zICksIGRlIDE5OTVUMDEgYXTDqSAyMDE2VDA0LiBWZXIgc2NyaXB0IGUgRmlndXJhLg0KUG9yIGRpZmljdWxkYWRlcyBvcGVyYWNpb25haXMgY29tIG9zIHBhY290ZXMgQkVUUyBlIGVjb3Nlcmllcywgb3B0YW1vcyBwb3IgYmFpeGFyIG9zIGRhZG9zIGRpcmV0YW1lbnRlIGRvIHNpdGUgZG8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwgZSBjaGFtYXIgb3MgZGFkb3MgcGFyYSBvIFIgKEZpZ3VyYSA5KS4NCg0KIVsqRmlndXJhIDkuIFNpdGUgZG8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwuKl0oSW1hZ2VtOS5wbmcpDQoNCmBgYHtyIGV2YWw9RkFMU0V9DQojIHZlciBodHRwOi8vYXBpLmJjYi5nb3YuYnINCiMgZXhlbXBsbyBiYW5jbyBjZW50cmFsIGRvIEJyYXNpbA0KIyBzZXJpZSAyMjEwOSAgUElCIGEgcHJlw6dvcyBkZSBtZXJjYWRvIFNDTi0yMDEwIChUcmltZXN0cmFsKSAoMTk5NT0xMDApDQojIGRhZG9zIGRlc3Nhem9uYWxpemFkb3MgIyAwMS8wMS8xOTk1IGF0w6kgNMK6IFRyaW0uIDIwMTYgIA0KbGlicmFyeShlY29zZXJpZXMpDQojIHNlcmllc19iYWNlbih4LCBmcm9tID0gIiIsIHRvID0gIiIsIHNhdmUgPSAiIikNCmJhY2VuIDwtIHNlcmllc19iYWNlbih4PWMoMjIxMDkpLGZyb20gPSAiMzEvMTIvMTk5NCIsIHRvID0gIjAxLzAxLzIwMTciKQ0KI1ZpZXcoYmFjZW4pDQojYXR0YWNoKGJhY2VuKQ0KYmFjZW4udHM8LWJhY2VuJHNlcmllXzIyMTA5DQphdHRhY2goYmFjZW4udHMpDQpwaWIudHM8LXRzKHZhbG9yLCBzdGFydCA9IGMoMTk5NiwxKSxmcmVxdWVuY3k9NCkNCnBsb3QocGliLnRzLG1haW49IkJDQiBzw6lyaWUgMjIxMDk6IFBJQiBhIHByZcOnb3MgZGUgbWVyY2FkbyBTQ04tMjAxMCAoVHJpbWVzdHJhbCkgKDE5OTU9MTAwKSIsdHlwZSA9ICJvIixjb2w9ImJsYWNrIixsd2Q9MixsdHk9MSwgeWxhYiA9ICJJbmRpY2UgMTk5NT0xMDAiLHhsYWI9InRyaW1lc3RyZSIpDQpgYGANCg0KIFBvciBwcm9ibGVtYXMgb3BlcmFjaW9uYWlzIGRvIHNpdGUsIGJhaXhhbW9zIG9zIGRhZG9zIGVtIGNzdiBlIGRlcG9pcyBjaGFtYW1vcyBwYXJhIG8gUi4NCg0KYGBge3J9DQojRXhlbXBsbyBQSUIgLSBzaXRlIGNvbSBwcm9ibGVtYXMNCiMgYmFpeGVpIG9zIGRhZG9zIGVtIGNzdiBlIHZvdSBjaGFtYXIgcGFyYSBvIFINCmxpYnJhcnkocmVhZHhsKQ0KYmFjZW4gPC0gcmVhZF9leGNlbCgicGliX2JhY2VuLnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gImRhZG9zIikNCiNWaWV3KGJhY2VuKQ0KYmFjZW48LWJhY2VuWywyXQ0KYXR0YWNoKGJhY2VuKQ0KcGliLnRzPC10cyhiYWNlbiwgc3RhcnQgPSBjKDE5OTYsMSksZnJlcXVlbmN5PTQpDQpwbG90KHBpYi50cyxtYWluPSJQSUIgYSBwcmXDp29zIGRlIG1lcmNhZG8gDQogICAgIFNDTi0yMDEwIChUcmltZXN0cmFsKSAoMTk5NT0xMDApIiwNCiAgICAgc3ViPSJCQ0Igc8OpcmllIDIyMTA5Iix0eXBlID0gIm8iLGNvbD0iYmxhY2siLGx3ZD0yLGx0eT0xLCANCiAgICAgeWxhYiA9ICLDjW5kaWNlIDE5OTU9MTAwIix4bGFiPSJ0cmltZXN0cmUiKQ0KDQojIEVzdGFjaW9uYXJpZWRhZGUgZG8gUElCDQpkcGliPC1kaWZmKHBpYi50cywxKQ0KZHBpYjI8LWRpZmYocGliLnRzLDIpDQpwbG90KGRwaWIyLG1haW49IlPDqXJpZXMgZGUgRGlmZXJlbsOnYXMgZG8gUElCIix0eXBlID0gIm8iLGNvbD0iYmxhY2siLGx3ZD0yLGx0eT0xLCB5bGFiID0gIkluZGljZSIseGxhYj0idHJpbWVzdHJlIikNCmxpbmVzKGRwaWIsdHlwZT0ibyIsY29sID0gInJlZCIsbHdkPTIsbHR5PTIpDQpsZWdlbmQoImJvdHRvbWxlZnQiLGMoImQoUElCLDIpIiwgImQoUElCKSIpLA0KICAgICAgIGNleD0wLjcsbHdkPTIsbHR5PTE6Mixjb2w9YygxLDIpKQ0KYGBgDQoNCiMjIyBSdcOtZG8gQnJhbmNvICgqV2hpdGUgbm9pc2UqKQ0KDQpBc3N1bWUtc2UgZW0gZ2VyYWwgcXVlIG9zIHJlc8OtZHVvcyB1dCAgc2VqYW0gYmVtIGNvbXBvcnRhZG9zLCBvdSBzZWphLCBSdcOtZG8gQnJhbmNvOiBzw6lyaWUgZGUgcmVzw61kdW9zIHF1ZSByZXByZXNlbnRhIHVtIHByb2Nlc3NvIGdhdXNzaWFubywgb3Ugc2VqYSwgY29tIGRpc3RyaWJ1acOnw6NvIG5vcm1hbCwgbcOpZGlhIHplcm8sIHZhcmnDom5jaWEgY29uc3RhbnRlIGUgbsOjby1hdXRvY29ycmVsYWNpb25hZG9zLiBPIGNvbmNlaXRvIGRlIHJ1w61kbyBicmFuY28gc2Vyw6EgaW1wb3J0YW50ZSBwYXJhIGNvbXByZWVuZGVyIG8gY29uY2VpdG8gZGUgZXN0YWNpb25hcmllZGFkZSBkZSBzw6lyaWVzIHRlbXBvcmFpcy4NCg0KJCQgCQ0Ke3VfdH0gXHNpbSBOKDAse1xzaWdtYSBeMn0pDQokJA0KDQojIyMjIFNpbXVsYcOnw6NvIGRlIHVtIHByb2Nlc3NvIEdhdXNzaWFubyBXaGl0ZSBOb2lzZSANCg0KVXRpbGl6YW5kbyBvIFIvUlN0dWRpbyBwYXJhIGdlcmFyIHVtIFdoaXRlIG5vaXNlLCBwZWxvIHNjcmlwdC4gTyByZXN1bHRhZG8gc2Vyw6EgY29tbyBuYSBGaWd1cmEuDQoNCmBgYHtyfQ0Kb3B0aW9ucyhkaWdpdHM9NCwgd2lkdGg9NzApDQojIHNpbXVsYXRlIEdhdXNzaWFuIFdoaXRlIE5vaXNlIHByb2Nlc3MNCnNldC5zZWVkKDEyMykNCnkgPSBybm9ybSgyNTApDQp0cy5wbG90KHksbWFpbj0iUHJvY2Vzc28gR2F1c3NpYW5vIFdoaXRlIE5vaXNlIiwNCiAgICAgICAgeGxhYj0idGltZSIseWxhYj0ieSh0KSIsY29sPSJibHVlIiwgbHdkPTIpDQphYmxpbmUoaD0wKQ0KDQojIHBsb3QgZXF1aXZhbGVudGUgdXNhbmRvIGEgZnVuw6fDo28gcGxvdCgpDQpwbG90KHksIG1haW49IlByb2Nlc3NvIEdhdXNzaWFubyBXaGl0ZSBOb2lzZSIsIHR5cGU9ImwiLA0KICAgICB4bGFiPSJ0aW1lIix5bGFiPSJ5KHQpIiwgY29sPSJibHVlIiwgbHdkPTIpDQphYmxpbmUoaD0wKQ0KYGBgDQoNCiMjIyBUZW5kw6puY2lhIGRldGVybWluw61zdGljYQ0KDQpPdXRybyBjb25jZWl0byDDqSBvIGRlIHRlbmTDqm5jaWEgKHRyZW5kKSwgcXVlIHJlZmxldGUgYXMgb3NjaWxhw6fDtWVzIGRlIGxvbmdvIHByYXpvIGVtIHVtYSBzw6lyaWUuIE5vIHNjcmlwdCBlIEZpZ3VyYSwgdGVtLXNlIHVtYSBzaW11bGHDp8OjbyBkZSB1bSBwcm9jZXNzbyBkZSB0ZW5kw6puY2lhIGRldGVybWluw61zdGljYS4NCg0KIyMjIyBTaW11bGHDp8OjbyBkZSB1bSBwcm9jZXNzbyBjb20gdGVuZMOqbmNpYSBkZXRlcm1pbsOtc3RpY2ENCg0KYGBge3J9DQojIFNJTVVMQU5ETyBVTUEgVEVOREVOQ0lBIERFVEVSTUlOw41TVElDQQ0KIyANCnNldC5zZWVkKDEyMykNCmUgPSBybm9ybSgyNTApDQp5LmR0ID0gMC4yKnNlcSgxLDI1MCkgKyBlDQp0cy5wbG90KHkuZHQsIGx3ZD0yLCBjb2w9ImJsdWUiLCBtYWluPSJUZW5kw6puY2lhIERldGVybWluw61zdGljYSArIFJ1w61kbyIpDQphYmxpbmUoYT0wLCBiPTAuMikNCmBgYA0KDQojIyMgRXN0YWNpb25hcmllZGFkZQ0KDQpFbSBnZXJhbCwgYSBlY29ub21ldHJpYSB0cmFkaWNpb25hbCAoY2F1c2EgZSBlZmVpdG8pIHByZXNzdXDDtWUgcXVlIHRvZGFzIGFzIHPDqXJpZXMgc2VqYW0gZXN0YWNpb27DoXJpYXMuIFNlamEgYSBzZWd1aW50ZSBzw6lyaWUgdGVtcG9yYWwgJFhfdCQ6DQoJJCQNCglYX3QgPSBcbXUgKyDOtV90DQoJJCQNCgkNCkVtIHF1ZSAkzrVfdCQgIMOpIHVtIHJ1w61kbyBicmFuY28gZSAkXG11JCDDqSB1bWEgY29uc3RhbnRlLg0KVGVtLXNlIHVtYSBzw6lyaWUgZXN0YWNpb27DoXJpYSBzZSBvIHZhbG9yIGVzcGVyYWRvIGRhIHPDqXJpZSAkWF90JCAgZm9yIGNvbnN0YW50ZSBubyB0ZW1wbywgb3Ugc2VqYSwNCg0KJCQNCglFKFhfdCkgPSBFKM68ICsgzrVfdCApID0gzrwgKyBFKM61X3QgKSA9IM68ICsgMCA9IM68DQokJA0KDQpPIGNhc28gZGEgc8OpcmllIG7Do28gZXN0YWNpb27DoXJpYSwgcG9yIGV4ZW1wbG8sIHNlcmlhIG8gY2FzbyBkZSB1bWEgc8OpcmllIGNvbSB0ZW5kw6puY2lhOg0KDQoqICAgJFhfdCA9IFxhbHBoYSArIM6ydCArIM61X3QkIGVtICBxdWUgdCBkZW5vdGEgdGVtcG87DQoNCiogICAkRShYX3QpID0gRShcYWxwaGEgKyDOsnQgKyDOtV90KSA9IEUoXGFscGhhICsgzrJ0KSArIEUozrVfdCApID0gzrwgKyDOsnQkICAkXG5lJCBjb25zdGFudGUNCg0KRXN0ZSDDqSB1bSBjYXNvIGRlIHRlbmTDqm5jaWEgZXN0YWNpb27DoXJpYSwgcG9pcyB1bWEgdmV6IHJldGlyYWRhIGEgdGVuZMOqbmNpYSBkYSBzw6lyaWUsIGVzdGEgc2UgdG9ybmFyaWEgZXN0YWNpb27DoXJpYS4gIFBvcnRhbnRvLCDigJwqc2Vyw6EgdW1hIHPDqXJpZSBlc3RhY2lvbsOhcmlhIHNlIG9zIGRvaXMgcHJpbWVpcm9zIG1vbWVudG9zIChtw6lkaWEgZSB2YXJpw6JuY2lhKSBmb3JlbSBpbmRlcGVuZGVudGVzIGRvIHRlbXBvIGUgYSBhdXRvY292YXJpw6JuY2lhIGZvciBkZXBlbmRlbnRlIGFwZW5hcyBkYSBqYW5lbGEgdGVtcG9yYWwgKGopIGVudHJlIG9zIGRhZG9zKuKAnToNCg0KKiAgICRFKFhfdCkgPSAgzrwkDQoqICAgJEVcbGVmdFsge1xsZWZ0KCB7e1hfdH0gLSBcbXUgfSBccmlnaHQpXGxlZnQoIHt7WF97dCAtIGp9fSAtIFxtdSB9IFxyaWdodCl9IFxyaWdodF0gPSBcbGVmdFx7IHtcYmVnaW57YXJyYXl9DQp7e1xzaWdtYV4yfSxcO3BhcmFcO1xsZWZ0KCB7aiA9IDB9IFxyaWdodCl9XFwNCnswXDtcOyxcO3BhcmFcO1xsZWZ0KCB7aiBcbmUgMH0gXHJpZ2h0KX0NClxlbmR7YXJyYXl9fSBccmlnaHQuJA0KDQpSZXN1bWlkYW1lbnRlLCBhIHPDqXJpZSBuw6NvLWVzdGFjaW9uw6FyaWEgdGVtIHVtYSByYWl6IHVuaXTDoXJpYSBlIHJlcHJlc2VudGEgdW0gcHJvY2Vzc28gZXN0b2PDoXN0aWNvLiBNYXMsIHBhcmEgZXNjbGFyZWNlciwgc8OjbyBwcmVjaXNvcyBvdXRyb3MgY29uY2VpdG9zIGF1eGlsaWFyZXMgYW50ZXMgZGUgZXNjbGFyZWNlciBvIHF1ZSDDqSB0ZXIgdW1hIHJhaXogdW5pdMOhcmlhLiBBIHV0aWxpemHDp8OjbyBkZSBzw6lyaWVzIG7Do28tZXN0YWNpb27DoXJpYXMgcG9kZXLDoSBnZXJhciByZWdyZXNzw7VlcyBlc3DDunJpYXMsIHF1ZSBzZXLDo28gZXhwbGljYWRhcyBtYWlzIGEgZnJlbnRlLg0KDQoNCiMjIyBPcGVyYWRvcmVzIERpZmVyZW7Dp2EgKGRpZmZlcmVuY2UpIHggRGVmYXNhZ2VtIChsYWcpDQoNClNlamEgYSBzw6lyaWUgJFhfdCQgIGVtIG7DrXZlbC4gTyBvcGVyYWRvciBkaWZlcmVuw6dhIMOpIGRlZmluaWRvIGNvbW8gc2VndWU6DQokJA0K4oiGWF90PVhfdC1YX3t0LTF9DQokJA0KDQokJA0K4oiGXjIgWF90PeKIhlhfdC3iiIZYX3t0LTF9PSAgIA0KKFhfdC1YX3t0LTF9KS0oWF97dC0xfS1YX3t0LTJ9KT0gWF90LTJYX3t0LTF9K1hfe3QtMn0NCiQkDQoNCk8gb3BlcmFkb3IgZGUgZGVmYXNhZ2VtIChMKV5bcXVlIGVtIGFsZ3VucyBsaXZyb3MgdXNhbSBhIGxldHJhIEIgYW8gaW52w6lzIGRlIEwsIHZlciBQaW5keWNrICYgUnViaW5mZWxkLCAyMDA0OiA2MThdLCBvdSAqbGFnIG9wZXJhdG9yKiwgw6kgZGVmaW5pZG8gY29tbyBzZWd1ZToNCiQkDQpMWF90PVhfe3QtMX0NCiQkDQoNCiQkDQpMXjIgWF90PVhfe3QtMn0NCiQkDQplDQoNCiQkDQpMXmpYX3Q9WF97dC1qfQ0KJCQNCg0KUHJvcHJpZWRhZGVzIGRlIEw6ICAgDQoNCiogICBTZSBjIMOpIHVtYSBjb25zdGFudGUsIGVudMOjbzogJExeaiBjPWMkDQoNCiogICBQcm9wcmllZGFkZSBkaXN0cmlidXRpdmE6ICQoTF5pK0xeailYX3Q9TF5pWF90K0xealhfdD1YX3t0LWl9LVhfe3Qtan0kDQoNCiogICBQcm9wcmllZGFkZSBtdWx0aXBsaWNhdGl2YTogJExeaShMXmopWF90PUxee2kran1YX3Q9WF97dC1pLWp9JA0KDQoqICAgU2UgJHxhfFxndCAxOiAoMSthXnstMX1MXnstMX0rYV57LTJ9TF57LTJ9K2Feey0zfUxeey0zfStcbGRvdHMpWF90PVxmcmFjey1hTFhfdH17KDEtYUwpfSQNCg0KKiAgIFNlICR8YXxcbHQgMTogKDErYUwrYV4yTF4yK2FeM0xeMytcbGRvdHMpWF90PVxmcmFje1hfdH17KDEtYUwpfSQgICAgDQoNCg0KDQojIyMjIE9wZXJhZG9yIGRlZmFzYWdlbSAobGFnKQ0KDQpObyBSLCBwb2RlLXNlIG9idGVyIGEgZGVmYXNhZ2VtIGRlIHVtYSBzw6lyaWUgdXNhbmRvIGEgZnVuw6fDo28gbGFnKHgseSksIGVtIHF1ZSB4IMOpIGEgc8OpcmllIGUgeSDDqSBvIG7Dum1lcm8gZGUgcGVyw61vZG9zIGEgZGVmYXNhciBhIHPDqXJpZS4gQ29tbyBleGVtcGxvLCBwYXJhIGEgc8OpcmllIGRlIENvbnN1bW8gZG8gdmFyZWpvIGRlIFPDo28gUGF1bG8gKE1vcmV0dGluIGUgVG9sb2ksIDIwMDYpLCBzZWphIGEgc8OpcmllIHRlbXBvcmFsIGNvbW86IGBkYWRvcy50czwtIHRzKGNvbnN1bW8sc3RhcnQ9YygxOTg0LDEpLCBmcmVxdWVuY3kgPSAxMilgLiBBIGRlZmFzYWdlbSBkZSA2IHBlcsOtb2RvcyBzZXLDoTogYGNvbnMubDY8LWxhZyhkYWRvcy50cywgLTYpYC4gVmVyIHNjcmlwdCBlIEZpZ3VyYS4NCg0KDQpgYGB7cn0NCiMgZmF6ZW5kbyBsYWcNCmNvbnN1bW8udHM8LWRhZG9zLnRzDQpjb25zLmw2PC1sYWcoY29uc3Vtby50cywgLTYpDQpwbG90KGNvbnN1bW8udHMsIHR5cGU9Im8iLGNvbCA9ICJibGFjayIsbHdkPTIsbHR5PTEpDQpsaW5lcyhjb25zLmw2LHR5cGU9Im8iLGNvbCA9ICJyZWQiLGx3ZD0yLGx0eT0yKQ0KbGVnZW5kKCJ0b3ByaWdodCIsYygiQ29uc3VtbyB2YXJlam8iLCAiQ29uc3VtbyB2YXJlam8gdC02IiksbHdkPTIsbHR5PTE6Mixjb2w9YygxLDIpKQ0KZGF0YS5sYWc8LWNiaW5kKGNvbnN1bW8udHMsY29ucy5sNikNCiNWaWV3KGRhdGEubGFnKQ0KYGBgDQpGb250ZTogRWxhYm9yYcOnw6NvIHByw7NwcmlhIGNvbSBkYWRvcyBkZSBNb3JldHRpbiBlIFRvbG9pICgyMDA2KS4NCg0KIyMjIyBPcGVyYWRvciBkaWZlcmVuw6dhIChkaWZmKQ0KDQpKw6EgcGFyYSBmYXplciBhIGRpZmVyZW7Dp2EsIGZhei1zZSwgZW0gUjogIGBkaWZmKHgsIGxhZyA9IDEsIGRpZmZlcmVuY2VzID0gMSlgLiBWZXIgc2NyaXB0IGUgRmlndXJhIG5vIGV4ZW1wbG8gZG8gdXNvIGRvIG9wZXJhZG9yIGRpZmVyZW7Dp2EgY29tIHPDqXJpZXMgZG8gY29uc3VtbyBkZSBNb3JldHRpbiBlIFRvbG9pICgyMDA2KS4NCg0KYGBge3J9DQojIE9wZXJhZG9yIGRpZmZlcmVuw6dhDQpjb25zdW1vLnRzPC10cyhkYWRvczIsc3RhcnQgPSBjKDE5ODQsMSksZnJlcXVlbmN5ID0gMTIpDQpjb25zdW1vLnRzDQojVmlldyhjb25zdW1vLnRzKQ0KZGNvbnM8LWRpZmYoY29uc3Vtby50cywxKQ0KZGNvbnMNCnBsb3QoY29uc3Vtby50cyx0eXBlPSJvIixjb2wgPSAiYmxhY2siLGx3ZD0yLGx0eT0xKQ0KbGVnZW5kKCJ0b3ByaWdodCIsYygiY29uc3VtbyBkbyB2YXJlam8gU1AiKSxsd2Q9MixsdHk9MSxjb2w9YygxKSkNCnBsb3QoZGNvbnMsdHlwZT0ibyIsY29sID0gInJlZCIsbHdkPTIsbHR5PTEpDQpsZWdlbmQoInRvcHJpZ2h0IixjKCJkY29ucyIpLGx3ZD0yLGx0eT0xLGNvbD1jKDIpKQ0KYGBgDQpGb250ZTogZWxhYm9yYcOnw6NvIHByw7NwcmlhIGNvbSBkYWRvcyBkZSBNb3JldHRpbiBlIFRvbG9pICgyMDA2KS4NCg0KIyMjIFByb2Nlc3NvIEVzdG9jw6FzdGljbw0KDQpQb2RlLXNlIGRlZmluaXIgbyBwcm9jZXNzbyBlc3RvY8Ohc3RpY28gY29tbyDigJxBcXVlbGUgcXVlIG7Do28gw6kgZGV0ZXJtaW7DrXN0aWNvLCBvdSBzZWphLCByZWZlcmUtc2UgYSB1bWEgdmFyacOhdmVsIGFsZWF0w7NyaWEgY3VqbyB2YWxvciBmdXR1cm8gbsOjbyBwb2RlIHNlciBwcmV2aXN0byBjb20gY2VydGV6YSBhYnNvbHV0YeKAnSAgKEJ1c2NhcmlvbGkgZSBFbWVyaWNrLCAyMDExLCBwLjc3KS4gT3Ugc2VqYSwgdGVyw6EgdW0gdGVybW8gZGUgZXJybyAkzrUkICggdW1hIGluY2VydGV6YSkuIEV4ZW1wbG86IFkgPSAxMDBBICsgMCwxQiArIM61Lg0KDQpJbWFnaW5lIGEgdGF4YSBkZSBjw6JtYmlvICRSXCQvVVNcJCQgZW0gY2FkYSBpbnN0YW50ZSBkZSB0ZW1wbyB0IGVudHJlIDE3aCBlIDE4aCBuZXN0ZSBkaWEgc2VqYSAqYWxlYXTDs3JpbyouICBQb2RlLXNlIGludGVycHJldGFyIGVzdGUgZmF0byBjb21vIHVtYSByZWFsaXphw6fDo28gJFpfdCh3KSQgZGEgdmFyacOhdmVsIGFsZWF0w7NyaWEgJFpfdCQsIGUgb2JzZXJ2YXIgJFpfdCh3KSwgNVxsdCB0XGx0IDYkLiBQYXJhIHNlIGZhemVyIHVtYSBwcmV2aXPDo28gw6BzIDE4aCBhY2VyY2EgZGEgdGF4YSBkZSBjw6JtYmlvICRaXzE5KHcpJCDDoHMgMTloLCDDqSByYXpvw6F2ZWwgb2xoYXIgYSBldm9sdcOnw6NvIHRvdGFsIGRlICRaX3QodykkIGVudHJlICAxN2ggZSAxOGguIE8gbW9kZWxvIG1hdGVtw6F0aWNvIHF1ZSBkZXNjcmV2ZSBlc3RhIGV2b2x1w6fDo28gw6kgY2hhbWFkbyBkZSAgKipQcm9jZXNzbyBFc3RvY8Ohc3RpY28qKi4NCg0KRWhsZXJzICgyMDA5KSBkZWZpbml1IG8gUHJvY2Vzc28gRXN0b2PDoXN0aWNvIGNvbW8g4oCcdW1hIGNvbGXDp8OjbyBkZSB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzIG9yZGVuYWRhcyBubyB0ZW1wbyBlIGRlZmluaWRhcyBlbSB1bSBjb25qdW50byBkZSBwb250b3MgVCwgcXVlIHBvZGUgc2VyIGNvbnTDrW51byBvdSBkaXNjcmV0b+KAnS4NCg0KRXN0w6Etc2UgdGVudGFuZG8gbW9kZWxhciBvIGNhcsOhdGVyIGFsZWF0w7NyaW8gZG8gcHJvY2Vzc28gZSBuw6NvIHVtYSBkZXNjcmnDp8OjbyBkbyB0aXBvIGNhdXNhLWVmZWl0byBjb21vIG5vIG1vZGVsbyBkZSByZWdyZXNzw6NvLiBPIGNvbXBvcnRhbWVudG8gcG9kZSBzZXIgb2J0aWRvIGEgcGFydGlyIGRlIHVtYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlcywgZSBzZXLDoSB0YW50byBtZWxob3IgcXVhbnRvIG1haXMgZmllbCBlc3RpdmVyIGVzdGEgZGlzdHJpYnVpw6fDo28gZW0gcmVsYcOnw6NvIMOgIGRpc3RyaWJ1acOnw6NvIHZlcmRhZGVpcmEuDQoNCk5vIHBhc3NlaW8gYWxlYXTDs3JpbywgY29tbyBleGVtcGxvLCB1bSBjaG9xdWUgdGVtcG9yw6FyaW8gbm8gUElCIG7Do28gc2UgZGlzc2lwYXLDoSBkZXBvaXMgZGUgdsOhcmlvcyBhbm9zIGUsIGRlc3RhIGZvcm1hLCBvIGNob3F1ZSB0ZXJpYSBlZmVpdG8gZGUgdW0gY2hvcXVlIHBlcm1hbmVudGUuIFNlIGVsZSBzZSByZXZlcnRlc3NlIMOgIHRlbmTDqm5jaWEsIGVudMOjbyBhcGVuYXMgcmV0aXJhbmRvIGEgdGVuZMOqbmNpYSBvIHByb2JsZW1hIGVzdGFyaWEgcmVzb2x2aWRvIHBhcmEgbyB1c28gZWNvbm9tw6l0cmljby4NCg0KRGEgZGlzY3Vzc8OjbyBhbnRlcmlvciBzb2JyZSBvIHBhc3NlaW8gYWxlYXTDs3Jpbywgb2J0ZXZlLXNlICRYX3QkIGNvbW8gZnVuw6fDo28gZG8gdmFsb3IgaW5pY2lhbCAkWF8wPTAkLCB0YWwgcXVlOg0KJCQNClhfdD1YXzArXHN1bV97aj0xfV50e861X2p9DQokJA0KDQpGYXplbmRvIG8gdmFsb3IgZXNwZXJhZG8gZSBhIHZhcmnDom5jaWEgZGUgJFhfdCQgLCB0ZW0tc2UgYSBtw6lkaWEgZSBhIHZhcmnDom5jaWEgZGVwZW5kZW50ZXMgZG8gdGVtcG86DQoNCg0KJEUoWF90KT1cc3VtX3tqPTF9XnR7RSjOtV9qKX0gPXTOvCQNCg0KJFZhcihYX3QpPVxzdW1fe2o9MX1edHtWYXJ7KM61X2opfX0gPXTPg1/OtV4yJA0KDQpPIGNvbXBvcnRhbWVudG8gZnV0dXJvIGRvcyBkYWRvcyBubyBwcm9jZXNzbyBlc3RvY8Ohc3RpY28gc2Vyw6NvIGRlc2NyaXRvcyBwZWxhIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGUgY29uanVudGEgKCRGJCk6DQoNCiRGKFhfMSxcbGRvdHMsWF90ICk9UChYXzEgXGxlIGFfMSxcbGRvdHMsWF90IFxsZSBhX3QpJA0KIA0KRW0gcXVlIFAgZGVub3RhIGEgcHJvYmFiaWxpZGFkZS4NCg0KSXN0byBwb3N0bywgcG9kZS1zZSBkZWZpbmlyIGEgZXN0YWNpb25hcmllZGFkZSBkZSBtb2RvIG1haXMgZXhwbMOtY2l0bywgY29tbyBFc3RhY2lvbmFyaWVkYWRlIEZvcnRlLiBPIHByb2Nlc3NvIHNlcsOhIGVzdGFjaW9uw6FyaW8gZm9ydGU6ICAgDQoNCmEuICAgZGUgcHJpbWVpcmEgb3JkZW0gc2U6ICRGKFhfe3RfMX0pPUYoWF97dF8xK2t9KSQNCg0KYi4gICBkZSBzZWd1bmRhIG9yZGVtIHNlOiAkRihYX3t0XzF9LFhfe3RfMn0pPUYoWF97dF8xK2t9LFhfe3RfMitrfSkkDQoNCmMuICAgZGUgb3JkZW0gbiBzZTogJEYoWF97dF8xfSxcbGRvdHMsWF97dF9ufSk9RihYX3t0XzEra30sXGxkb3RzLFhfe3RfbitrfSkkDQoNCkEgRXN0YWNpb25hcmllZGFkZSBmcmFjYSBkZSBvcmRlbSBuIHBvZGUgc2VyIGRlZmluaWRhIHF1YW5kbzoNCg0KKiAgIEEgbcOpZGlhIGUgYSB2YXJpw6JuY2lhIGRvIHByb2Nlc3NvIHPDo28gY29uc3RhbnRlcyBubyB0ZW1wbzsgZSwNCg0KKiAgIEEgZXN0cnV0dXJhIGRlIGRlcGVuZMOqbmNpYSBsaW5lYXIgZGVwZW5kZSBhcGVuYXMgZGEgZGlzdMOibmNpYSBlbnRyZSBvcyBwZXLDrW9kb3MgZSBkaW1pbnVpIGNvbSBlc3RhIGRpc3TDom5jaWEuDQpQb3J0YW50bywgdGVtLXNlIEVzdGFjaW9uYXJpZWRhZGUgZnJhY2EgcGFyYToNCg0KXFsgRShYX3QpID0gzrwgID0gY29uc3RhbnRlIFxdDQoNClxbIFZhcihYX3QpID0gXHNpZ21hXjIgID0gY29uc3RhbnRlICBcXQ0KDQpcWyBDb3JyKFhfdCxYX3t0LWt9KSA9IFxyaG8oaykgXF0NCg0KDQojIyMgUmVncmVzc8OjbyBFc3DDunJpYQ0KDQpOYSBlc3RpbWHDp8OjbyB0cmFkaWNpb25hbCBkZSAkWT1mKFgpJCwgcG9kZXJlaSB0ZXIgdW0gY29lZmljaWVudGUgZGUgYWp1c3RhbWVudG8gJFJeMiQgbXVpdG8gYWx0bywgcHLDs3hpbW8gZGUgMSwgbWFzIG5hIHZlcmRhZGUgYXMgdmFyacOhdmVpcyBwb2RlbSBzZXIgbsOjbyByZWxhY2lvbmFkYXMuIFBvZGUgdGVyIG9jb3JyaWRvIHVtICRSXjIkIGVsZXZhZG8gZW0gZGVjb3Jyw6puY2lhIGRlIG91dHJhIHZhcmnDoXZlbCByZWxhY2lvbmFkYSBhICRZJCBlIGEgJFgkLiBDb21vIGV4ZW1wbG8sIGltYWdpbmUgcXVlICRZJCBzZWphIHJlbGFjaW9uYWRhIGNvbSAkWiQgZSAkWCQgc2VqYSByZWxhY2lvbmFkYSBjb20gJFokLCBtYXMgJFkkIG7Do28gc2VqYSByZWxhY2lvbmFkYSBjb20gJFgkLiBOZXN0ZSBjYXNvLCAkWiQgcG9kZXLDoSBzZXIgYSB0ZW5kw6puY2lhLg0KDQpFbSBjYXNvcyBkZSByZWdyZXNzw6NvIGVzcMO6cmlhLCBlbSBnZXJhbCwgJFJeMiQgw6kgZWxldmFkbywgRHVyYmluLVdhdHNvbiAoJERXJCkgw6kgYWZhc3RhZG8gZGUgMiwgZSAkUl4yIFxndCBEVyQuIFNlIGEgc8OpcmllIGZvciBpbnRlZ3JhZGEsIHBvZGVyZWkgdHJhYmFsaGFyIGNvbSAkzpRZJCBlICTOlFgkIGZhemVuZG8gJM6UWSA9ZijOlFgpJCBlIHBlcmRlcmVpIGFzIGluZm9ybWHDp8O1ZXMgZGUgbG9uZ28gcHJhem8sIHBvaXMgYXMgdmFyacOhdmVpcyBlbSBkaWZlcmVuw6dhcyByZXByZXNlbnRhbSB0aXBpY2FtZW50ZSBvIGN1cnRvIHByYXpvLiDDiSB1bSBwcm9ibGVtYSB0w61waWNvIGRlIG7Do28tZXN0YWNpb25hcmllZGFkZSBkYXMgc8Opcmllcy4NCg0KIyMjIEludGVncmHDp8Ojbw0KDQpQYXJhIG1lbGhvciBlbnRlbmRpbWVudG8sIGZhbGFyZW1vcyBzb2JyZSBvIFByb2Nlc3NvIGF1dG8tcmVncmVzc2l2by4gU2VqYSB1bWEgc8OpcmllICRZX3QkIHRhbCBxdWUgDQoNCiQkDQpZX3QgPSBccGhpXzFZX3t0LTF9K1xsZG90cytccGhpX3BZX3t0LXB9K3VfdCtcdGhldGFfMXVfe3QtMX0rXGxkb3RzK1x0aGV0YV9xdV97dC1xfQ0KJCQNCg0KT3MgdGVybW9zIGFzc29jaWFkb3MgYSAkdV90JCBzw6NvIGRpdG9zIHRlcm1vcyBkZSAqbW92aW5nIGF2ZXJhZ2UqIG91ICRNQShxKSQsIHBvcnRhbnRvOg0KDQoqICAgJE1BKHEpOiBZX3QgPSB1X3QrXHRoZXRhXzF1X3t0LTF9K1xsZG90cytcdGhldGFfcXVfe3QtcX0kDQoNCnNpbWlsYXJtZW50ZSwgb3MgdGVybW9zIGRlICRZX3QkIHPDo28gYXNzb2NpYWRvcyBhb3MgY2hhbWFkb3MgdGVybW9zIGF1dG8tcmVncmVzc2l2b3MgJEFSKHApJDoNCg0KKiAgICRBUihwKTogWV90ID0gXHBoaV8xWV97dC0xfStcbGRvdHMrXHBoaV9wWV97dC1wfSt1X3QkDQoNClNlIGEgc8OpcmllIGZvciBlc3RhY2lvbsOhcmlhLCB0ZW0tc2UgY29tbyBlc3RpbWFyIG9zIG1vbWVudG9zIChtw6lkaWEgZSB2YXJpw6JuY2lhKSBjb20gYXMgdCBvYnNlcnZhw6fDtWVzLiBBIHZhcmnDom5jaWEgc2Vyw6E6DQoNCiQkDQpWYXIoWV90KT0gXGZyYWN7XHNpZ21hXjJ9ezEtXHBoaV4yfQ0KJCQNCg0KRGVjb3JyZSBkaXN0byBxdWUsIHNlICRccGhpPTEkLCBhIHZhcmnDom5jaWEgZGUgJFlfdCQgIHNlcsOhIGluZmluaXRhLCBvIHF1ZSBpbXBvc3NpYmlsaXRhIG8gY8OhbGN1bG8uIE91IHNlamEsIMOpIHByZWNpc28gcXVlIGEgc8OpcmllIHRlbXBvcmFsIHRlbmhhICAkfFxwaGl8XGx0IDEkLiBTZSAkfFxwaGl8XGd0IDEkLCBhIHZhcmnDom5jaWEgc2VyaWEgbmVnYXRpdmEsIG8gcXVlIMOpIGFic3VyZG8uIElzdG8gZGVmaW5lIHNlIGEgc8OpcmllIHRlbXBvcmFsIMOpIOKAnGVzdMOhdmVs4oCdIG91IGVzdGFjaW9uw6FyaWEsIG91IG1lbGhvciwgcXVlICRZX3QkICBuw6NvIOKAnGV4cGxvZGXigJ0uDQoNCkEgc8OpcmllIHNlcsOhIGRpdGEgaW50ZWdyYWRhIHNlIGZvciBwb3Nzw612ZWwgb2J0ZXIgdW1hIHPDqXJpZSBkZSBkaWZlcmVuw6dhIHF1ZSDDqSBlc3RhY2lvbsOhcmlhLiBPdSBzZWphLCBzZSBkaWZlcmVuY2lhciAkWF90JCAgdW1hIHZleiwgb2J0ZW5kbyAkzpRYX3QkICwgZSBlc3RhIHPDqXJpZSAkzpRYX3QkICBmb3IgZXN0YWNpb27DoXJpYSwgZW50w6NvIGRpei1zZSBxdWUgJFhfdCQgw6kgaW50ZWdyYWRhIGRlIHByaW1laXJhIG9yZGVtLCBzaW1ib2xpemFuZG8gZGEgZm9ybWE6IEkoMSkuDQoNCkdlbmVyYWxpemFuZG8sIHNlIGEgc8OpcmllIGVtIGRpZmVyZW7Dp2FzICTOlF5qWF90JCAgZm9yIGVzdGFjaW9uw6FyaWEgbWFzIGVtIG9yZGVucyBtZW5vcmVzIHF1ZSBqIG7Do28gZm9yZW0sIGVudMOjbyBkaXotc2UgcXVlICRYX3QkIMOpIGludGVncmFkYSBkZSBvcmRlbSBqLCBzaW1ib2xpemFkYSBwb3IgSShqKSBlIGogIMOpIGEgb3JkZW0gZGUgaW50ZWdyYcOnw6NvLiBBIG9yZGVtIGRlIGludGVncmHDp8OjbyDDqSBvIG7Dum1lcm8gZGUgcmHDrXplcyB1bml0w6FyaWFzIGRhIHPDqXJpZSAkWF90JC4gQSBzw6lyaWUgZXN0YWNpb27DoXJpYSBlbSBuw612ZWwgKHNlbSBkaWZlcmVuw6dhcykgw6kgZGl0YSBpbnRlZ3JhZGEgZGUgb3JkZW0gemVybywgZGVub3RhZGEgcG9yIEkoMCkuDQoNCklzdG8gZXN0w6EgYXNzb2NpYWRvIMOgIGlkw6lpYSBkZSBlcmdvZGljaWRhZGUuIE8gUHJvY2Vzc28gc2Vyw6EgZXJnw7NkaWNvIHF1YW5kbyBvIHZhbG9yIGVzcGVyYWRvIGRhIG3DqWRpYSBwYXJhIHVtYSBzdWJhbW9zdHJhIGZvciBpZ3VhbCBhbyB2YWxvciBlc3BlcmFkbyBkYSBzw6lyaWUgdGVtcG9yYWwuIFBvcnRhbnRvLCBzZSBhIG3DqWRpYSBjb252ZXJnaXIgcGFyYSBzZXUgdmFsb3IgZXNwZXJhZG8gZW0gcXVhbHF1ZXIgc3ViYW1vc3RyYSB0ZW1wb3JhbC4NCg0KIyMgTW9kZWxvcyBjbMOhc3NpY29zIGRlIGRlY29tcG9zacOnw6NvDQoNCk9zIG1vZGVsb3MgY2zDoXNzaWNvcyBkZSBkZWNvbXBvc2nDp8OjbyB0aXBpY2FtZW50ZSBkaXZpZGVtIGEgc8OpcmllIGVtIGNvbXBvbmVudGVzOiB0ZW5kw6puY2lhICgkVF90JCksIHNhem9uYWxpZGFkZSAoJFNfdCQpLCBjaWNsbyAoJENfdCQpIGUgaXJyZWd1bGFyaWRhZGVzICgkZV90JCkuIA0KDQohWypUYWJlbGEuIENvbXBvbmVudGVzIGRlIHPDqXJpZSB0ZW1wb3JhbCwgZGVmaW5pw6fDo28sIGluZmx1w6puY2lhIGUgZHVyYcOnw6NvLipdKEltYWdlbTEwLnBuZykNCkZvbnRlOiBFbGFib3Jhw6fDo28gcHLDs3ByaWEuDQoJQSBpZGVpYSDDqSBxdWUgZXNzYXMgY29tcG9uZW50ZXMgcG9kZW0gc2VyIGFzc29jaWFkYXMgZW0gdW0gbW9kZWxvIGFkaXRpdm8gb3UgbXVsdGlwbGljYXRpdm8gY29tbyBuYXMgZXhwcmVzc8O1ZXM6ICAgDQoJDQoqICAgICR7WV90fSA9IHtUX3R9ICsge0NfdH0gKyB7U190fSArIHtlX3R9JCAgIG1vZGVsbyBhZGl0aXZvDQoNCiogICAgJHtZX3R9ID0ge1RfdH0gXGNkb3Qge0NfdH0gXGNkb3Qge1NfdH0gXGNkb3Qge2VfdH0kICAgIG1vZGVsbyBtdWx0aXBsaWNhdGl2bw0KDQoJRW0gZ2VyYWwsIG8gcXVlIHNlIGZheiDDqSBzZWd1aXIgb3MgcGFzc29zOiAgIA0KCQ0KMS4JUGxvdGFyIHPDqXJpZXMgZSB2ZXIgY29tcG9ydGFtZW50byB0ZW1wb3JhbCDigJMgdGVuZMOqbmNpYSAoQXVtZW50bywgZGVjbMOtbmlvLCBvc2NpbGHDp8OjbyBwZXJzaXN0ZW50ZSBkYSBzw6lyaWUpDQoNCjIuCUZhemVyIG3DqWRpYSBtw7N2ZWwgcGFyYSBleHB1cmdhciBlZmVpdG9zIHNhem9uYWlzIGUgYWxlYXTDs3Jpb3MgZGEgc8OpcmllDQoNCjMuCUZhemVyIMOtbmRpY2UgZXN0YWNpb25hbCBwYXJhIGF2YWxpYXIgbyBlZmVpdG8gc2F6b25hbCAgIA0KICAgDQpBIG3DqWRpYSBtw7N2ZWwgw6kgdW0gYXJ0aWbDrWNpbyBtYXRlbcOhdGljbyBpbnRlcmVzc2FudGUgcGFyYSBhbsOhbGlzZSBwb2lzIGFwcmVzZW50YSBhIG1lc21hIHRlbmTDqm5jaWEgZGEgc8OpcmllIG9yaWdpbmFsLCBtb3N0cmEgYXMgdmFyaWHDp8O1ZXMgY8OtY2xpY2FzIGRhIHPDqXJpZSBvcmlnaW5hbCwgZWxpbWluYSBhcyBmbHV0dWHDp8O1ZXMgZGUgY3VydMOtc3NpbW8gcHJhem8gb3UgYWxlYXTDs3JpYXMgZGEgc8OpcmllIG9yaWdpbmFsLCBlIHNlcsOhIGltcG9ydGFudGUgcGFyYSB2ZXJpZmljYXIgYSB0ZW5kw6puY2lhIGUgbyBjaWNsbyBlY29uw7RtaWNvLiAgIA0KDQpBIGV4cHJlc3PDo28gdXN1YWwgcGFyYSBzZXUgY8OhbGN1bG8gZSwgcGFkcsOjbyBuYSBub3Rhw6fDo28gZW0gUi9Sc3R1ZGlvLCBzZWd1aXLDoSBhIGV4cHJlc3PDo28gZGUgTW9yZXR0aW4gZSBUb2xvaSAoMjAwNiksIHBhcmEgYSBtw6lkaWEgY2VudHJhZGEgZGUgMTIgbWVzZXM6DQoNCiQkDQpaXzdeeygxMil9ID0ge1x0ZXh0c3R5bGV7MSBcb3ZlciB7MTJ9fX1cbGVmdCgge1xmcmFje3t7Wl8xfSArIHtaXzJ9fX17Mn0gKyBcZnJhY3t7e1pfMn0gKyB7Wl8zfX19ezJ9ICsgXGZyYWN7e3taXzN9ICsge1pfNH19fXsyfSArIC4uLiArIFxmcmFje3t7Wl97MTJ9fSArIHtaX3sxM319fX17Mn19IFxyaWdodClcXA0KID0ge1x0ZXh0c3R5bGV7MSBcb3ZlciB7MjR9fX1cbGVmdCgge3taXzF9ICsgMntaXzJ9ICsgMntaXzN9ICsgLi4uICsgMntaX3sxMn19ICsge1pfezEzfX19IFxyaWdodCkNCiQkDQoNClBhcmEgYSBtw6lkaWEgY2VudHJhZGEgZGUgdW0gbsO6bWVybyBpbXBhciBkZSBwZXLDrW9kb3MsIHRlbS1zZTogDQoNCiQkDQpaX3ReKiA9IHtcdGV4dHN0eWxlezEgXG92ZXIgeygybiArIDEpfX19XHN1bVxsaW1pdHNfe2ogPSAgLSBufV57aiA9ICArIG59IHt7Wl97dCArIGp9fX0gXFwNClpfMl57KDMpfSA9IHtcdGV4dHN0eWxlezEgXG92ZXIgM319XGxlZnQoIHt7Wl8xfSArIHtaXzJ9ICsge1pfM319IFxyaWdodCkNCiQkDQoNCg0KIyMjIE3DqWRpYXMgbcOzdmVpcyAocm9sbGluZyBtZWFuKQ0KDQpObyBzY3JpcHQsIHV0aWxpemEtc2UgcHJpbWVpcm8gYSBmdW7Dp8OjbyByb2xsbWVhbiBkbyBwYWNvdGUgem9vLCBlIGRlcG9pcyBhIGZ1bsOnw6NvIG1hIGNvbmZvcm1lIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAxNykgLiBPYnNlcnZlIHF1ZSBhIGV4cHJlc3PDo28gcG9yIHJvbGxtZWFuIGFwcmVzZW50YSB1bWEgZGlmaWN1bGRhZGUgZGUgcG9zaWNpb25hbWVudG8gZG9zIHZhbG9yZXMsIHBvaXMgY2FsY3VsYSBlbSBmaW0gZGUgcGVyw61vZG8gKG7Do28gY2VudHJhZGEpIGUgcG9zaWNpb25hIGFvIGNlbnRybywgZW5xdWFudG8gcG9yIG1hIG9zIGPDoWxjdWxvcyBmaWNhbSBwb3IgZGVmYXVsdCBjZW50cmFkb3MgZSBwb3NpY2lvbmFkb3MgZGV2aWRhbWVudGUgYW8gY2VudHJvLiBFbSB1bSBzY3JpcHQgZG8gUi9Sc3R1ZGlvOg0KDQpgYGB7cn0NCiMgbcOpZGlhcyBtw7N2ZWlzIGNvbSBwYWNrYWdlIHpvbw0KbGlicmFyeSh6b28pDQpjb25zMzwtcm9sbG1lYW4oY29uc3Vtby50cywzLGFsaWduPSJjZW50ZXIiKQ0KY29uczEyPC1yb2xsbWVhbihjb25zdW1vLnRzLDEyLGFsaWduID0gInJpZ2h0IikNCnBsb3QoY29uc3Vtby50cyxtYWluPSJTw6lyaWVzIGRlIGNvbnN1bW8gZG8gdmFyZWpvIix0eXBlID0gIm8iLGNvbD0iYmxhY2siLGx3ZD0yLGx0eT0xLCB5bGFiID0gIkluZGljZSIseGxhYj0ibcOqcyIpDQpsaW5lcyhjb25zMyx0eXBlPSJvIixjb2wgPSAicmVkIixsd2Q9MixsdHk9MikNCmxpbmVzKGNvbnMxMix0eXBlPSJvIixjb2wgPSAiZ3JlZW4iLGx3ZD0yLGx0eT0zKQ0KbGVnZW5kKCJ0b3ByaWdodCIsYygiY29uc3VtbyIsICJjb25zMyIsImNvbnMxMiIpLGx3ZD0yLGx0eT0xOjMsY29sPWMoMSwyLDMpKQ0KZGFkb3MuY29uczwtY2JpbmQoY29uc3Vtby50cyxjb25zMyxjb25zMTIpDQojVmlldyhkYWRvcy5jb25zKQ0KDQojIG3DqWRpYSBtw7N2ZWwgY29tIG9wZXJhZG9yIG1hKHgsIG9yZGVyLCBjZW50cmU9VFJVRSkNCmNvbnMxMi5tYTwtbWEoY29uc3Vtby50cywxMikNCmNvbnMxMi5tYQ0KcGxvdChjb25zdW1vLnRzLG1haW49IlPDqXJpZXMgZGUgY29uc3VtbyBkbyB2YXJlam8iLHR5cGUgPSAibyIsY29sPSJibGFjayIsbHdkPTIsbHR5PTEsIHlsYWIgPSAiSW5kaWNlIix4bGFiPSJtw6pzIikNCmxpbmVzKGNvbnMzLHR5cGU9Im8iLGNvbCA9ICJyZWQiLGx3ZD0yLGx0eT0yKQ0KbGluZXMoY29uczEyLm1hLHR5cGU9Im8iLGNvbCA9ICJncmVlbiIsbHdkPTIsbHR5PTMpDQpsZWdlbmQoInRvcHJpZ2h0IixjKCJjb25zdW1vIiwgImNvbnMzIiwiY29uczEyLm1hIiksbHdkPTIsbHR5PTE6Myxjb2w9YygxLDIsMykpDQpgYGANCg0KUmVmZXLDqm5jaWFzIHstI1JlZmVyw6puY2lhc30NCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KQk9YLCBHLkUuUC47IEpFTktJTlMsIEcuTS4gVGltZSBzZXJpZXMgYW5hbHlzaXM6IGZvcmVjYXN0aW5nIGFuZCBjb250cm9sLiBSZXZpc2VkIGVkaXRpb24sIFNhbiBGcmFuY2lzY286IEhvbGRlbi1EYXksIDE5NzYuDQoNCkdSQU5HRVIsIEMuVy5KLjsgTkVXQk9MRCwgUC4gRm9yZWNhc3RpbmcgZWNvbm9taWMgdGltZSBzZXJpZXMuIEFjYWRlbWljIFByZXNzLCAxOTc3LmVkaXRpb24sIDE5ODcpLg0KICANCkhBTUlMVE9OLCBKYW1lcyBELiBUaW1lIFNlcmllcyBBbmFseXNpcy4gUHJpbmNldG9uIFVuaXZlcnNpdHkgUHJlc3MsIDE5OTQuDQoNCkhFTkRSWSwgRGF2aWQgRi4gRHluYW1pYyBlY29ub21ldHJpY3MsIE94Zm9yZCBVbml2ZXJzaXR5IFByZXNzLCAxOTk1Lg0KICANCkhZTkRNQU4sIFJvYiBKLjsgQVRIQU5BU09QT1VMT1MsIEdlb3JnZSAuIEZvcmVjYXN0aW5nOiBwcmluY2lwbGVzIGFuZCBwcmFjdGljZS4gT3RleHRzLCAyMDE0LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vd3d3Lm90ZXh0cy5vcmcvZnBwPi4NCg0KS0VOTkVEWSwgUGV0ZXIuIEEgZ3VpZGUgdG8gZWNvbm9tZXRyaWNzLiA0LmVkLiBDYW1icmlkZ2U6IE1JVCBQcmVzcywgMTk5OC4gUC4gMjc4LTI3OS4NCg0KTUFUVE9TLCBSb2fDqXJpbyBTaWx2YS4gRGVjb21wb3Npw6fDo28gY29tIHJlZ3Jlc3PDo28gKEFwb3N0aWxhKS4gSnVpeiBkZSBGb3JhOiBVRkpGLCAyMDE2LiBEaXNwb27DrXZlbCBlbSBodHRwOi8vd3d3LnVmamYuYnIvcm9nZXJpb19tYXR0b3MvZmlsZXMvMjAwOS8wNi9EZWNvbXBvc2nDp8Ojby1jb20tUmVncmVzc8Ojby5wZGYuIEFjZXNzbyBlbSAyMi9mZXYuLzIwMTguDQoNCk1JTExTLCBUZXJlbmNlIEMuIHRpbWUgc2VyaWVzIHRlY2huaXF1ZXMgZm9yIGVjb25vbWlzdHMuIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLCAxOTkwLg0KDQpNT1JFVFRJTiwgUGVkcm8gQS47IFRPTE9JLCBDbMOpbGlhICBNLkMuIEFuw6FsaXNlIGRlIFPDqXJpZXMgVGVtcG9yYWlzLiBTw6NvIFBhdWxvOiBFZGdhcmQgQmx1Y2hlci9BQkUsIDIwMDYuIA0KDQpOb3RhcyB7LSNOb3Rhc30NCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KICANCiAgDQogIA0KDQoNCg==