Ensemble e Estacionariedade

A função média de um modelo de série temporal é dada por \[\begin{equation} \mu(t)=E[(x_t)]\,. \end{equation}\] Tal valor esperado é a média do ensemble de todas as possíveis séries temporais que podem ser geradas pelo modelo de série temporal. O ensemble constitui toda a população. Se temos um modelo de série temporal, podemos simular mais de uma série. No entanto, com dados históricos, temos somente uma série e tudo que podemos fazer é, sem supor uma estrutura matemática para a tendência, estimar a média para em cada ponto amostral pelo correspondente valor observado.

Na prática fazemos estimativas de qualquer tendência e efeitos sazonais aparentes e os removemos, usando decomposição, para então obtermos a série temporal da componente aleatória. Neste caso, modelos de série temporal com média constante serão apropriados.

Se a função média é constante, dizemo o modelo de série temporal é estacionário na média. A estimação amostral da média populacional \(\mu\) é a média amostral \(\bar{x}\): \[\begin{equation} \bar{x}=\sum_{t=1}^N \frac{x_t}{N} \end{equation}\] Tal equação se baseia na suposição de que uma série temporal suficientemente longa caracteriza o modelo. Tais modelos são chamados ergódicos. De maneira mais formal, um modelo de série temporal que é estacionário na média é dito ergódico na média se a média temporal para uma única série temporal tende à média do ensemble quanto o comprimento da série temporal aumenta: \[\begin{equation} \lim_{N\rightarrow \infty}\frac{1}{N}\sum_{t=1}^N x_t = \mu\,. \end{equation}\] Neste caso a média temporal é independente do ponto de partida. Dado que usualmente temos somente uma série temporal, poderíamos nos perguntar em que caso um modelo de série temporal deixa de ser ergódico ou porque usaríamos um modelo não ergódico.

Séries temporais econômicas e ambientais são realizações únicas de modelos hipotéticos de séries temporais. Simplesmente definimos o modelo como sendo ergódico. Há casos, entretanto, onde podemos ter várias séries temporais diferentes originadas a partir do mesmo modelo de série temporal. Por exemplo, suponhamos que queremos investigar a aceleração em uma assento de piloto em um novo desenho de avião em rajadas de vento aleatórias, simuladas em um túnel de vento. Mesmo que tenhamos dois protótipos com o mesmo design, não temos como nos assegurar de que em ambos os casos teremos a mesma aceleração média, devido a pequenas diferenças na manufatura.

In such cases, the number of time series is equal to the number of prototypes. Another example is an experiment investigating turbulent flows in some complex system. It is possible that we will obtain qualitatively different results from different runs because they do depend on initial conditions. It would seem better to run an experiment involving turbulence many times than to run it once for a much longer time. The number of runs is the number of time series. It is straightforward to adapt

Padrões de correlação
Fig.1: Ensemble de uma série temporal

Função de correlação

Uma vez que tivermos identificado os efeitos de tendência e sazonalidade em uma série temporal, podemos remover estes efeitos antes de prosseguir com a análise. Se usarmos a decomposição aditiva, inicialmente determinamos a série com sazonalidade removida e em seguida removemos a tendência por subtração. Isso nos deixa somente com a componente aleatória. No entanto, tal componente não é necessariamente bem modelada por variáveis aleatórias independentes. Em muitos casos variáveis consecutivas são correlacionadas. Ao indentificarmos tais correlções podemos melhorar nossas previsões tanto melhor quanto maiores forem as correlações. Tais correlações devem ser estimadas para obtermos séries sintéticas realísticas. A estrutura de correlação de um modelo de série temporal é definido pela função de correlação, que é estimada a partir da série observada.

Consideremos distribuições discretas. Denotando o valor esperado de um ensemble com variável aleatória \(X\) por \(\mu = E(X)\), a sua variância é dada por \[\begin{equation} \sigma^2=E[(X-\mu)^2]\,. \end{equation}\] A quantidade \(\sigma\) é chamada desvio padrão. A covariância entre duas variáveis aleatórias \(X\) e \(Y\) (da mesma distribuição ou distribuições diferentes) é definida por \[\begin{equation} \sigma_{XY}=E[(X-\mu_X)(Y-\mu_Y)]\,. \end{equation}\]

Se temos amostras \((x_i,y_i)\) com \(N\) elementos, associadas às variáveis aleatórias \(X\) e \(Y\), a covariância amostral é dada por \[\begin{align} s_{xy}=\frac{1}{N-1}\sum_{i=1}^{N}(x_i-\bar{x})(y_i-\bar{y})\,. \end{align}\] Se pares de dados são colocados no gráfico, as linhas \(x=\bar{x}\) e \(y=\bar{y}\) dividem o gráfico em dois quadrantes. Pontos no quadrante esquerdo inferior têm ambos \(x_i-\bar{x}\) e \(y_i-\bar{y}\) negativos, de modo que seu produto contribui positivamente no somatório. Pontos no quadrante superior direito também dão contribuição positiva. Por outro lado, pontos no quadrante superior esquerdo e quadrante inferior direito dão contribuição negativa para a convariância.

Portanto, se \(y\) tende a aumentar quando \(x\) aumenta, a maior parte dos pontos estarão no quadrante inferior esquerdo e no quandrante superior direito e a contribuição será positiva. Inversamente, se \(y\) decresce quando \(x\) aumenta, a covariância será negativa. Se não há tal relação, a covariância será pequena relativamente aos desvios padrão de \(x\) e \(y\).

A covariância é uma medida de associação linear entre duas variáveis aleatórias. Notemos que uma associação linear não implica causalidade. Notemos ainda que se a relação entre as variáveis aleatórias é não-linear, a covariância não será sensível a tal característica. Pode haver um padrão de relação entre as variáves, mesmo que a covariância seja próxima a zero.

A correlação entre duas variáveis aleatórias \(X\) e \(Y\) é uma grandeza adimensional dada por \[ \rho_{XY}=\frac{\sigma_{XY}}{\sigma_X \sigma_Y} \] A correlação, além de normalizar a covariância, é adimensional, pondendo, portanto, ser usada para comparar relações lineares entre variáveis aleatórias em unidades físicas diferentes. Podemos mostrar que \[ -1\leq\rho_{XY}\leq 1\,. \] A correlação amostral é dada por \[ r_{xy}=\frac{s_{xy}}{s_x s_y}\,, \] sendo \[ s_x^2=\frac{1}{N-1}\sum_{i=1}^N(x_i-\bar{x})^2\,,\qquad s_y^2=\frac{1}{N-1}\sum_{i=1}^N(y_i-\bar{y})^2\,. \] Padrões típicos de correlação entre variáveis são mostrados na Fig. 1 (Ashutosh Tripathi):

Padrões de correlação
Fig.1 - Variáveis linearmente correlacionadas.

Se duas variáveis aleatórias são independentes, sua correlação é aproximadamente zero. Um caso típico é mostrado na Fig. 2.

Correlação nula
Fig.2 - Variáveis independentes.

Notemos que, por outro lado, que se a correlação é zero, isso não necessariamente implica que as variáveis sejam independentes. Isso ocorre no caso de correlação não linear, como ilustrado na Fig. 3.

É fundamental que qualquer conclusão baseada no cálculo de um coeficiente de correlação seja sempre baseada no correspondente scatterplot. Veja o seguinte artigo seguinte artigo para diferentes scatterplots correspondentes ao mesmo número de correlação.

Vejamos alguns exemplos que ilustram o conceito de autocorrelação de séries temporais.

Exemplo 1: Precipitação

Consideremos o exemplo que descreve a pricipitação anual em Los Angeles. Usaremos a biblioteca TSA que contém as funções e datasets usadas no livro “Time Series Analysis with Applications in R, 2nd. Ed.” por Jonathan Cryer e Kung-Sik Chan.

library(TSA)

Attaching package: ‘TSA’

The following objects are masked from ‘package:stats’:

    acf, arima

The following object is masked from ‘package:utils’:

    tar

Carregamos os dados de precipitação e fazemos um gráfico da série temporal:

data(larain); 
plot(larain,ylab='Inches',xlab='Ano',type='o')

Para fins de análise e modelagem normalmente estamos interessados de dados em anos consecutivos estão ou não relacionados. Se houver uma relação entre dados históricos, possivelmente poderemos dados do ano presente para fazer predições de precipitação no ano seguinte.

Um modo de investigar tal questão é plotar pares de valores anuais consecutivos. Este tipo de gráfico é chamado scatterplot:

plot(y=larain,x=zlag(larain),ylab='Inches',xlab='Anos anteriores (Inches)')

Aqui o comando zlag foi usado para plotar o lag (atraso) do vetor larain. Vejamos inicialmente como tal comando funciona:

f<-1:10
f
 [1]  1  2  3  4  5  6  7  8  9 10
zlag(f)
 [1] NA  1  2  3  4  5  6  7  8  9
zlag(f,2)
 [1] NA NA  1  2  3  4  5  6  7  8
zlag(f,3)
 [1] NA NA NA  1  2  3  4  5  6  7

Voltando ao nosso problema, a primeira impressão que obtemos do gráfico de scatterplot é que há pouca ou nenhuma relação entre a precipitação de um dado mês de um ano com o anterior. Ou seja, o gráfico não mostra tendências. Dizemos que há pouca correlação entre a precipitação de um dado ano e o anterior. Do ponto de vista de predições, esta não é uma série temporal muito interessante. Calculemos medida de correlação. Definimos as séries e calculemos o seu comprimento:

y<-larain
x<-zlag(larain)
length(x)
[1] 115

A correlação entre as séries é dada por:

cov(x[2:115],y[2:115])/sd(x[2:115])/sd(y[2:115])
[1] -0.03308892

ou diretamente,

cor(x[2:115],y[2:115])
[1] -0.03308892

que é um valor muito pequeno, como esperado. Vejamos agora um exemplo onde existe uma correlação entre dados:

Exemplo 2: Processo químico industrial

Consideremos variáveis que medem um propriedade de cor a partir de sequências (batches) consecutivas no processo.

data(color)

Vejamos que tipo de dado é color:

class(color)
[1] "ts"

Isso mostra que color é uma série temporal. Examinemos o comprimento da série:

length(color)
[1] 35

Como ela é uma série relativamente pequena, podemos examiná-la em sua totalidade:

color
Time Series:
Start = 1 
End = 35 
Frequency = 1 
 [1] 67 63 76 66 69 71 72 71 72 72 83 87 76 79 74 81 76 77 68 68 74 68 69 75 80 81 86 86 79 78
[31] 77 77 80 76 67

Façamos o gráfico desta série:

plot(color,ylab='Propriedade de cor', xlab='Batch',type='o')

Valores vizinhos parecem estar correlacionados. Isso pode ser visto mais claramente usando o gráfico scatterplot para valores vizinhos:

plot(y=color,x=zlag(color),ylab='Propriedade de cor',xlab='Propriedade de cor do batch anterior')

Vemos que há uma leve tendência neste gráfico:

Calculemos a correlação entre dados vizinhos. Examinemos as séries:

y=color
x=zlag(color)
y
x

Calculemos o número de elementos das séries:

length(x)

Calculemos a correlação entre as séries:

 cor(x[2:35],y[2:35])

Ou seja, a correlação não é muito forte mas significativa.

Exemplo 3: Abundância de lebres canadenses

Consideremos a série temporal que fornece a abundância de lebres canadenses ao longo de 30 anos:

data(hare); 
plot(hare,ylab='Abundance',xlab='Year',type='o')

Vemos agora que grandes mudanças não ocorrem de um ano para o outro. Esta correlação entre anos vizinhos é mais claramente vista em um scatterplot:

plot(y=hare,x=zlag(hare),ylab='Abundância',xlab='Abundância nos anos anteriores')

Tal como no exemplo anterior, vemos que há uma tendência positiva: valores baixos de abundância em um dado ano tendem a serem seguidos por valores baixos no ano seguinte e similarmente com valores médios e altos.

Calculemos a correlação entre as duas séries temporais:

y<-hare
x<-zlag(hare)
L <-length(x)
cor(y[2:L],x[2:L])
[1] 0.7025777

Como esperado, temos uma correlação um pouco maior do que a do exemplo anterior.

Exemplo 4: Médias mensais de temperatura em Dubuque, Iowa.

As médias mensais de temperaturas (em graus Fahrenheit) ao longo dos anos, registrada em Dubuque, Iowa, são mostradas a seguir:

data(tempdub); 
plot(tempdub,ylab='Temperature',type='o')

Tal série mostra um padrão bastante regular chamado sazonalidade. A sazonalidade para valores mensais ocorre quando as observações separadas por 12 meses estão relacionadas. Em todos os anos os meses de janeiro e fevereiro temos temperaturas baixas, enquanto que sempre em junho, julho e agosto temos temperaturas altas. Há uma variação entre os meses de janeiro de diferentes anos, assim como junho. Modelos para séries temporais como esta devem prever estas variações, preservando também as similaridades.

Vejamos a correlação entre meses vizinhos:

plot(y=tempdub,x=zlag(tempdub),ylab='Temperatura',xlab='Temperatura nos anos anteriores')

Vemos aqui uma correlação significativa:

y<-tempdub
x<-zlag(tempdub)
L <-length(x)
cor(y[2:L],x[2:L])

Função de Autocorrelação em séries temporais

Nos exemplos da seção anterior estudamos caracterizamos visualmente a correlação dos dados de uma série temporal com os da mesma série, de um período atrás, através do scatterplot. Além disso, quantificamos a medida de correlação entre as duas séries temporais calculando a quantidade \[ r_{x_t,x_{t-1}}=\frac{s_{x_{t},x_{t-1}}}{s_{x_t} s_{x_{t-1}}}=\frac{s_{x_{t},x_{t-1}}}{s_{x_{t}}^2}\,, \] sendo \[ s_{x_t}^2=\frac{1}{N-1}\sum_{i=1}^N(x_i-\bar{x})^2 \] com \[s_{x_t}=s_{x_{t-1}}\], pois a série é estacionária por hipótese e \[ s_{x_t, x_{t-1}}=\frac{1}{N-1}\sum_{i=1}^{N}(x_t-\bar{x})(x_{t-1}-\bar{x})\,. \] Esta idéia pode ser generalizada. Consideremos uma série que é estacionária na média e na variância. As variáveis podem ser correlacionadas e o modelo é dito ser estacionário de segunda ordem se a correlação entre as variáveis depende somente do número de períodos entre eles, ou lag. A correlação de uma variável com ela mesma em tempos diferente é conhecida como autocorrelação. A função de autocovariância de lag \(k\) é dada por

LS0tCnRpdGxlOiAiQ29ycmVsYcOnw6NvIGVudHJlICBTw6lyaWVzIFRlbXBvcmFpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogIkZlcm5hbmRvIERlZWtlIFNhc3NlIgpmaWdfY2FwdGlvbjogeWVzCi0tLQoKPGgzPkVuc2VtYmxlIGUgRXN0YWNpb25hcmllZGFkZTwvaDM+CkEgZnVuw6fDo28gKm3DqWRpYSogZGUgdW0gbW9kZWxvIGRlIHPDqXJpZSB0ZW1wb3JhbCDDqSBkYWRhIHBvcgpcYmVnaW57ZXF1YXRpb259ClxtdSh0KT1FWyh4X3QpXVwsLgpcZW5ke2VxdWF0aW9ufQpUYWwgdmFsb3IgZXNwZXJhZG8gw6kgYSBtw6lkaWEgZG8gZW5zZW1ibGUgZGUgdG9kYXMgYXMgcG9zc8OtdmVpcyBzw6lyaWVzIHRlbXBvcmFpcyBxdWUgcG9kZW0gc2VyIGdlcmFkYXMgcGVsbyBtb2RlbG8gZGUgc8OpcmllIHRlbXBvcmFsLiBPIGVuc2VtYmxlIGNvbnN0aXR1aSB0b2RhIGEgcG9wdWxhw6fDo28uIFNlIHRlbW9zIHVtIG1vZGVsbyBkZSBzw6lyaWUgdGVtcG9yYWwsIHBvZGVtb3Mgc2ltdWxhciBtYWlzIGRlIHVtYSBzw6lyaWUuIE5vIGVudGFudG8sIGNvbSBkYWRvcyBoaXN0w7NyaWNvcywgdGVtb3Mgc29tZW50ZSB1bWEgc8OpcmllIGUgdHVkbyBxdWUgcG9kZW1vcyBmYXplciDDqSwgc2VtIHN1cG9yIHVtYSBlc3RydXR1cmEgbWF0ZW3DoXRpY2EgcGFyYSBhIHRlbmTDqm5jaWEsIGVzdGltYXIgYSBtw6lkaWEgcGFyYSBlbSBjYWRhIHBvbnRvIGFtb3N0cmFsIHBlbG8gY29ycmVzcG9uZGVudGUgdmFsb3Igb2JzZXJ2YWRvLiAKCk5hIHByw6F0aWNhIGZhemVtb3MgZXN0aW1hdGl2YXMgZGUgcXVhbHF1ZXIgdGVuZMOqbmNpYSBlIGVmZWl0b3Mgc2F6b25haXMgYXBhcmVudGVzIGUgb3MgcmVtb3ZlbW9zLCB1c2FuZG8gZGVjb21wb3Npw6fDo28sIHBhcmEgZW50w6NvIG9idGVybW9zIGEgc8OpcmllIHRlbXBvcmFsIGRhIGNvbXBvbmVudGUgYWxlYXTDs3JpYS4gTmVzdGUgY2FzbywgbW9kZWxvcyBkZSBzw6lyaWUgdGVtcG9yYWwgY29tIG3DqWRpYSBjb25zdGFudGUgc2Vyw6NvIGFwcm9wcmlhZG9zLiAKClNlIGEgZnVuw6fDo28gbcOpZGlhIMOpIGNvbnN0YW50ZSwgZGl6ZW1vIG8gbW9kZWxvIGRlIHPDqXJpZSB0ZW1wb3JhbCDDqSBlc3RhY2lvbsOhcmlvIG5hIG3DqWRpYS4gQSBlc3RpbWHDp8OjbyBhbW9zdHJhbCBkYSBtw6lkaWEgcG9wdWxhY2lvbmFsICRcbXUkIMOpIGEgbcOpZGlhIGFtb3N0cmFsICRcYmFye3h9JDoKXGJlZ2lue2VxdWF0aW9ufQpcYmFye3h9PVxzdW1fe3Q9MX1eTiBcZnJhY3t4X3R9e059ClxlbmR7ZXF1YXRpb259ClRhbCBlcXVhw6fDo28gc2UgYmFzZWlhIG5hIHN1cG9zacOnw6NvIGRlIHF1ZSB1bWEgc8OpcmllIHRlbXBvcmFsIHN1ZmljaWVudGVtZW50ZSBsb25nYSBjYXJhY3Rlcml6YSBvIG1vZGVsby4gVGFpcyBtb2RlbG9zIHPDo28gY2hhbWFkb3MgKmVyZ8OzZGljb3MqLiBEZSBtYW5laXJhIG1haXMgZm9ybWFsLCB1bSBtb2RlbG8gZGUgc8OpcmllIHRlbXBvcmFsIHF1ZSDDqSBlc3RhY2lvbsOhcmlvIG5hIG3DqWRpYSDDqSBkaXRvICplcmfDs2RpY28gbmEgbcOpZGlhKiBzZSBhIG3DqWRpYSB0ZW1wb3JhbCBwYXJhIHVtYSDDum5pY2Egc8OpcmllIHRlbXBvcmFsIHRlbmRlIMOgIG3DqWRpYSBkbyBlbnNlbWJsZSBxdWFudG8gbyBjb21wcmltZW50byBkYSBzw6lyaWUgdGVtcG9yYWwgYXVtZW50YTogClxiZWdpbntlcXVhdGlvbn0KXGxpbV97TlxyaWdodGFycm93IFxpbmZ0eX1cZnJhY3sxfXtOfVxzdW1fe3Q9MX1eTiB4X3QgPSBcbXVcLC4KXGVuZHtlcXVhdGlvbn0KIE5lc3RlIGNhc28gYSBtw6lkaWEgdGVtcG9yYWwgw6kgaW5kZXBlbmRlbnRlIGRvIHBvbnRvIGRlIHBhcnRpZGEuIERhZG8gcXVlIHVzdWFsbWVudGUgdGVtb3Mgc29tZW50ZSB1bWEgc8OpcmllIHRlbXBvcmFsLCBwb2RlcsOtYW1vcyBub3MgcGVyZ3VudGFyIGVtIHF1ZSBjYXNvIHVtIG1vZGVsbyBkZSBzw6lyaWUgdGVtcG9yYWwgZGVpeGEgZGUgc2VyIGVyZ8OzZGljbyBvdSBwb3JxdWUgdXNhcsOtYW1vcyB1bSBtb2RlbG8gbsOjbyBlcmfDs2RpY28uIAogClPDqXJpZXMgdGVtcG9yYWlzIGVjb27DtG1pY2FzIGUgYW1iaWVudGFpcyBzw6NvIHJlYWxpemHDp8O1ZXMgw7puaWNhcyBkZSBtb2RlbG9zIGhpcG90w6l0aWNvcyBkZSBzw6lyaWVzIHRlbXBvcmFpcy4gU2ltcGxlc21lbnRlICBkZWZpbmltb3MgbyBtb2RlbG8gY29tbyBzZW5kbyBlcmfDs2RpY28uIEjDoSBjYXNvcywgZW50cmV0YW50bywgb25kZSBwb2RlbW9zIHRlciB2w6FyaWFzIHPDqXJpZXMgdGVtcG9yYWlzIGRpZmVyZW50ZXMgb3JpZ2luYWRhcyBhIHBhcnRpciBkbyBtZXNtbyBtb2RlbG8gZGUgc8OpcmllIHRlbXBvcmFsLiAgUG9yIGV4ZW1wbG8sIHN1cG9uaGFtb3MgcXVlIHF1ZXJlbW9zIGludmVzdGlnYXIgYSBhY2VsZXJhw6fDo28gZW0gdW1hIGFzc2VudG8gZGUgcGlsb3RvIGVtIHVtIG5vdm8gZGVzZW5obyBkZSBhdmnDo28gZW0gcmFqYWRhcyBkZSB2ZW50byBhbGVhdMOzcmlhcywgc2ltdWxhZGFzIGVtIHVtIHTDum5lbCBkZSB2ZW50by4gTWVzbW8gcXVlIHRlbmhhbW9zIGRvaXMgcHJvdMOzdGlwb3MgY29tIG8gbWVzbW8gZGVzaWduLCBuw6NvIHRlbW9zIGNvbW8gbm9zIGFzc2VndXJhciBkZSBxdWUgZW0gYW1ib3Mgb3MgY2Fzb3MgdGVyZW1vcyBhIG1lc21hIGFjZWxlcmHDp8OjbyBtw6lkaWEsIGRldmlkbyBhIHBlcXVlbmFzIGRpZmVyZW7Dp2FzIG5hIG1hbnVmYXR1cmEuIAoKIEluIHN1Y2ggY2FzZXMsIHRoZSBudW1iZXIgb2YgdGltZQpzZXJpZXMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBwcm90b3R5cGVzLiBBbm90aGVyIGV4YW1wbGUgaXMgYW4gZXhwZXJpbWVudAppbnZlc3RpZ2F0aW5nIHR1cmJ1bGVudCBmbG93cyBpbiBzb21lIGNvbXBsZXggc3lzdGVtLiBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlCndpbGwgb2J0YWluIHF1YWxpdGF0aXZlbHkgZGlmZmVyZW50IHJlc3VsdHMgZnJvbSBkaWZmZXJlbnQgcnVucyBiZWNhdXNlIHRoZXkgZG8KZGVwZW5kIG9uIGluaXRpYWwgY29uZGl0aW9ucy4gSXQgd291bGQgc2VlbSBiZXR0ZXIgdG8gcnVuIGFuIGV4cGVyaW1lbnQgaW52b2x2aW5nCnR1cmJ1bGVuY2UgbWFueSB0aW1lcyB0aGFuIHRvIHJ1biBpdCBvbmNlIGZvciBhIG11Y2ggbG9uZ2VyIHRpbWUuClRoZSBudW1iZXIgb2YgcnVucyBpcyB0aGUgbnVtYmVyIG9mIHRpbWUgc2VyaWVzLiBJdCBpcyBzdHJhaWdodGZvcndhcmQgdG8gYWRhcHQKPHA+CjxjZW50ZXI+CiFbUGFkcsO1ZXMgZGUgY29ycmVsYcOnw6NvXSgvVXNlcnMvZmVybmFuZG9kZWVrZS9Ecm9wYm94L1Nhc3NlX3NsaWRlcy90c19lbnNlbWJsZS5wbmcpe3dpZHRoPTYwJX08ZmlnY2FwdGlvbj5GaWcuMTogRW5zZW1ibGUgZGUgdW1hIHPDqXJpZSB0ZW1wb3JhbDwvZmlnY2FwdGlvbj48L2NlbnRlcj4KCjxoMz5GdW7Dp8OjbyBkZSBjb3JyZWxhw6fDo288L2gzPgpVbWEgdmV6IHF1ZSB0aXZlcm1vcyBpZGVudGlmaWNhZG8gb3MgZWZlaXRvcyBkZSB0ZW5kw6puY2lhIGUgc2F6b25hbGlkYWRlIGVtIHVtYSBzw6lyaWUgdGVtcG9yYWwsIHBvZGVtb3MgcmVtb3ZlciBlc3RlcyBlZmVpdG9zIGFudGVzIGRlIHByb3NzZWd1aXIgY29tIGEgYW7DoWxpc2UuIApTZSB1c2FybW9zIGEgZGVjb21wb3Npw6fDo28gYWRpdGl2YSwgaW5pY2lhbG1lbnRlIGRldGVybWluYW1vcyBhIHPDqXJpZSBjb20gc2F6b25hbGlkYWRlIHJlbW92aWRhIGUgZW0gc2VndWlkYSByZW1vdmVtb3MgYSB0ZW5kw6puY2lhIHBvciBzdWJ0cmHDp8Ojby4gSXNzbyBub3MgZGVpeGEgc29tZW50ZSBjb20gYSBjb21wb25lbnRlIGFsZWF0w7NyaWEuIE5vIGVudGFudG8sIHRhbCBjb21wb25lbnRlIG7Do28gw6kgbmVjZXNzYXJpYW1lbnRlIGJlbSBtb2RlbGFkYSBwb3IgdmFyacOhdmVpcyBhbGVhdMOzcmlhcyBpbmRlcGVuZGVudGVzLiBFbSBtdWl0b3MgY2Fzb3MgdmFyacOhdmVpcyBjb25zZWN1dGl2YXMgc8OjbyBjb3JyZWxhY2lvbmFkYXMuIEFvIGluZGVudGlmaWNhcm1vcyB0YWlzIGNvcnJlbMOnw7VlcyBwb2RlbW9zIG1lbGhvcmFyIG5vc3NhcyBwcmV2aXPDtWVzIHRhbnRvIG1lbGhvciBxdWFudG8gbWFpb3JlcyBmb3JlbSBhcyBjb3JyZWxhw6fDtWVzLiBUYWlzIGNvcnJlbGHDp8O1ZXMgZGV2ZW0gc2VyIGVzdGltYWRhcyBwYXJhIG9idGVybW9zIHPDqXJpZXMgc2ludMOpdGljYXMgcmVhbMOtc3RpY2FzLiBBIGVzdHJ1dHVyYSBkZSBjb3JyZWxhw6fDo28gZGUgdW0gbW9kZWxvIGRlIHPDqXJpZSB0ZW1wb3JhbCDDqSBkZWZpbmlkbyBwZWxhIGZ1bsOnw6NvIGRlIGNvcnJlbGHDp8OjbywgcXVlIMOpIGVzdGltYWRhIGEgcGFydGlyIGRhIHPDqXJpZSBvYnNlcnZhZGEuIAoKQ29uc2lkZXJlbW9zIGRpc3RyaWJ1acOnw7VlcyBkaXNjcmV0YXMuIERlbm90YW5kbyBvIHZhbG9yIGVzcGVyYWRvIGRlIHVtIGVuc2VtYmxlIGNvbSB2YXJpw6F2ZWwgYWxlYXTDs3JpYSAkWCQgcG9yICRcbXUgPSBFKFgpJCwgYSBzdWEgKnZhcmnDom5jaWEqIMOpIGRhZGEgcG9yClxiZWdpbntlcXVhdGlvbn0KXHNpZ21hXjI9RVsoWC1cbXUpXjJdXCwuClxlbmR7ZXF1YXRpb259CkEgcXVhbnRpZGFkZSAkXHNpZ21hJCDDqSBjaGFtYWRhICpkZXN2aW8gcGFkcsOjbyouIEEgKmNvdmFyacOibmNpYSogZW50cmUgZHVhcyB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzICRYJCBlICRZJCAoZGEgbWVzbWEgZGlzdHJpYnVpw6fDo28gb3UgZGlzdHJpYnVpw6fDtWVzIGRpZmVyZW50ZXMpIMOpIGRlZmluaWRhIHBvciAKXGJlZ2lue2VxdWF0aW9ufQpcc2lnbWFfe1hZfT1FWyhYLVxtdV9YKShZLVxtdV9ZKV1cLC4KXGVuZHtlcXVhdGlvbn0KClNlIHRlbW9zICBhbW9zdHJhcyAkKHhfaSx5X2kpJCBjb20gJE4kIGVsZW1lbnRvcywgYXNzb2NpYWRhcyDDoHMgdmFyacOhdmVpcyBhbGVhdMOzcmlhcyAkWCQgZSAkWSQsIGEgKmNvdmFyacOibmNpYSBhbW9zdHJhbCogw6kgZGFkYSBwb3IgClxiZWdpbnthbGlnbn0Kc197eHl9PVxmcmFjezF9e04tMX1cc3VtX3tpPTF9XntOfSh4X2ktXGJhcnt4fSkoeV9pLVxiYXJ7eX0pXCwuClxlbmR7YWxpZ259ClNlIHBhcmVzIGRlIGRhZG9zIHPDo28gY29sb2NhZG9zIG5vIGdyw6FmaWNvLCBhcyBsaW5oYXMgJHg9XGJhcnt4fSQgZSAkeT1cYmFye3l9JCBkaXZpZGVtIG8gZ3LDoWZpY28gZW0gZG9pcyBxdWFkcmFudGVzLiBQb250b3Mgbm8gcXVhZHJhbnRlIGVzcXVlcmRvIGluZmVyaW9yIHTDqm0gYW1ib3MgJHhfaS1cYmFye3h9JCBlICR5X2ktXGJhcnt5fSQgbmVnYXRpdm9zLCBkZSBtb2RvIHF1ZSBzZXUgcHJvZHV0byBjb250cmlidWkgcG9zaXRpdmFtZW50ZSBubyBzb21hdMOzcmlvLiBQb250b3Mgbm8gcXVhZHJhbnRlIHN1cGVyaW9yIGRpcmVpdG8gdGFtYsOpbSBkw6NvIGNvbnRyaWJ1acOnw6NvIHBvc2l0aXZhLiBQb3Igb3V0cm8gbGFkbywgcG9udG9zIG5vIHF1YWRyYW50ZSBzdXBlcmlvciBlc3F1ZXJkbyBlIHF1YWRyYW50ZSBpbmZlcmlvciBkaXJlaXRvIGTDo28gY29udHJpYnVpw6fDo28gbmVnYXRpdmEgcGFyYSBhIGNvbnZhcmnDom5jaWEuCgpQb3J0YW50bywgc2UgJHkkIHRlbmRlIGEgYXVtZW50YXIgcXVhbmRvICR4JCBhdW1lbnRhLCBhIG1haW9yIHBhcnRlIGRvcyBwb250b3MgZXN0YXLDo28gbm8gcXVhZHJhbnRlIGluZmVyaW9yIGVzcXVlcmRvIGUgbm8gcXVhbmRyYW50ZSBzdXBlcmlvciBkaXJlaXRvIGUgYSBjb250cmlidWnDp8OjbyBzZXLDoSBwb3NpdGl2YS4gSW52ZXJzYW1lbnRlLCBzZSAkeSQgZGVjcmVzY2UgcXVhbmRvICR4JCBhdW1lbnRhLCBhIGNvdmFyacOibmNpYSBzZXLDoSBuZWdhdGl2YS4gU2UgbsOjbyBow6EgdGFsIHJlbGHDp8OjbywgYSBjb3ZhcmnDom5jaWEgc2Vyw6EgcGVxdWVuYSByZWxhdGl2YW1lbnRlIGFvcyBkZXN2aW9zIHBhZHLDo28gZGUgJHgkIGUgJHkkLgoKQSBjb3ZhcmnDom5jaWEgw6kgdW1hIG1lZGlkYSBkZSBhc3NvY2lhw6fDo28gbGluZWFyIGVudHJlIGR1YXMgdmFyacOhdmVpcyBhbGVhdMOzcmlhcy4gTm90ZW1vcyBxdWUgdW1hIGFzc29jaWHDp8OjbyBsaW5lYXIgbsOjbyBpbXBsaWNhIGNhdXNhbGlkYWRlLiBOb3RlbW9zIGFpbmRhIHF1ZSBzZSBhIHJlbGHDp8OjbyBlbnRyZSBhcyB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzIMOpIG7Do28tbGluZWFyLCBhIGNvdmFyacOibmNpYSBuw6NvIHNlcsOhIHNlbnPDrXZlbCBhIHRhbCBjYXJhY3RlcsOtc3RpY2EuIFBvZGUgaGF2ZXIgdW0gcGFkcsOjbyBkZSByZWxhw6fDo28gZW50cmUgYXMgdmFyacOhdmVzLCBtZXNtbyBxdWUgYSBjb3ZhcmnDom5jaWEgc2VqYSBwcsOzeGltYSBhIHplcm8uIAoKQSAqY29ycmVsYcOnw6NvKiBlbnRyZSBkdWFzIHZhcmnDoXZlaXMgYWxlYXTDs3JpYXMgJFgkIGUgJFkkIMOpIHVtYSBncmFuZGV6YSBhZGltZW5zaW9uYWwgZGFkYSBwb3IgCiQkClxyaG9fe1hZfT1cZnJhY3tcc2lnbWFfe1hZfX17XHNpZ21hX1ggXHNpZ21hX1l9CiQkCkEgY29ycmVsYcOnw6NvLCBhbMOpbSBkZSBub3JtYWxpemFyIGEgY292YXJpw6JuY2lhLCDDqSBhZGltZW5zaW9uYWwsIHBvbmRlbmRvLCBwb3J0YW50bywgc2VyIHVzYWRhIHBhcmEgY29tcGFyYXIgcmVsYcOnw7VlcyBsaW5lYXJlcyBlbnRyZSB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzIGVtIHVuaWRhZGVzIGbDrXNpY2FzIGRpZmVyZW50ZXMuIFBvZGVtb3MgbW9zdHJhciBxdWUKJCQKLTFcbGVxXHJob197WFl9XGxlcSAxXCwuCiQkCkEgKmNvcnJlbGHDp8OjbyBhbW9zdHJhbCogw6kgZGFkYSBwb3IgCiQkCnJfe3h5fT1cZnJhY3tzX3t4eX19e3NfeCBzX3l9XCwsCiQkCnNlbmRvCiQkCnNfeF4yPVxmcmFjezF9e04tMX1cc3VtX3tpPTF9Xk4oeF9pLVxiYXJ7eH0pXjJcLCxccXF1YWQgc195XjI9XGZyYWN7MX17Ti0xfVxzdW1fe2k9MX1eTih5X2ktXGJhcnt5fSleMlwsLgokJApQYWRyw7VlcyB0w61waWNvcyBkZSBjb3JyZWxhw6fDo28gZW50cmUgdmFyacOhdmVpcyBzw6NvIG1vc3RyYWRvcyBuYSBGaWcuIDEgWyhBc2h1dG9zaCBUcmlwYXRoaSldKGh0dHBzOi8vYXNodXRvc2h0cmlwYXRoaS5jb20vMjAxOS8wMS8xNS9jb3ZhcmlhbmNlLWFuZC1jb3JyZWxhdGlvbi8pOgo8cD4KPGNlbnRlcj4KIVtQYWRyw7VlcyBkZSBjb3JyZWxhw6fDo29dKC9Vc2Vycy9mZXJuYW5kb2RlZWtlL0Ryb3Bib3gvU2Fzc2Vfc2xpZGVzL2NvcnJlbGF0aW9ucy5wbmcpPGZpZ2NhcHRpb24+RmlnLjEgLSBWYXJpw6F2ZWlzIGxpbmVhcm1lbnRlIGNvcnJlbGFjaW9uYWRhcy48L2ZpZ2NhcHRpb24+PC9jZW50ZXI+CjxwPgpTZSBkdWFzIHZhcmnDoXZlaXMgYWxlYXTDs3JpYXMgc8OjbyBpbmRlcGVuZGVudGVzLCBzdWEgY29ycmVsYcOnw6NvIMOpIGFwcm94aW1hZGFtZW50ZSB6ZXJvLiBVbSBjYXNvIHTDrXBpY28gw6kgbW9zdHJhZG8gbmEgRmlnLiAyLiAKPGNlbnRlcj4KIVtDb3JyZWxhw6fDo28gbnVsYV0oL1VzZXJzL2Zlcm5hbmRvZGVla2UvRHJvcGJveC9TYXNzZV9zbGlkZXMvY29ycmVsYXRpb24yLnBuZyl7d2lkdGg9MjAlfTxmaWdjYXB0aW9uPkZpZy4yIC0gVmFyacOhdmVpcyBpbmRlcGVuZGVudGVzLjwvZmlnY2FwdGlvbj48L2NlbnRlcj4KPHA+Ck5vdGVtb3MgcXVlLCBwb3Igb3V0cm8gbGFkbywgcXVlIHNlIGEgY29ycmVsYcOnw6NvIMOpIHplcm8sIGlzc28gbsOjbyBuZWNlc3NhcmlhbWVudGUgaW1wbGljYSBxdWUgYXMgdmFyacOhdmVpcyBzZWphbSBpbmRlcGVuZGVudGVzLiBJc3NvIG9jb3JyZSBubyBjYXNvIGRlIGNvcnJlbGHDp8OjbyBuw6NvIGxpbmVhciwgY29tbyBpbHVzdHJhZG8gbmEgRmlnLiAzLiAKCsOJIGZ1bmRhbWVudGFsIHF1ZSBxdWFscXVlciBjb25jbHVzw6NvIGJhc2VhZGEgbm8gY8OhbGN1bG8gZGUgdW0gY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIHNlamEgc2VtcHJlIGJhc2VhZGEgbm8gY29ycmVzcG9uZGVudGUgKnNjYXR0ZXJwbG90Ki4gVmVqYSBvIHNlZ3VpbnRlIGFydGlnbyBbc2VndWludGUgYXJ0aWdvXShodHRwczovL2phbmhvdmUuZ2l0aHViLmlvL3RlYWNoaW5nLzIwMTYvMTEvMjEvd2hhdC1jb3JyZWxhdGlvbnMtbG9vay1saWtlKSBwYXJhIGRpZmVyZW50ZXMgc2NhdHRlcnBsb3RzIGNvcnJlc3BvbmRlbnRlcyBhbyBtZXNtbyBuw7ptZXJvIGRlIGNvcnJlbGHDp8Ojby4gCgoKClZlamFtb3MgYWxndW5zIGV4ZW1wbG9zIHF1ZSBpbHVzdHJhbSBvIGNvbmNlaXRvIGRlIGF1dG9jb3JyZWxhw6fDo28gIGRlIHPDqXJpZXMgdGVtcG9yYWlzLiAKCjxoMz5FeGVtcGxvIDE6IFByZWNpcGl0YcOnw6NvPC9oMz4KCkNvbnNpZGVyZW1vcyBvIGV4ZW1wbG8gcXVlIGRlc2NyZXZlIGEgcHJpY2lwaXRhw6fDo28gYW51YWwgZW0gTG9zIEFuZ2VsZXMuICBVc2FyZW1vcyBhIGJpYmxpb3RlY2EgVFNBIHF1ZSBjb250w6ltIGFzIGZ1bsOnw7VlcyBlICpkYXRhc2V0cyogdXNhZGFzIG5vIGxpdnJvICIqVGltZSBTZXJpZXMgQW5hbHlzaXMgd2l0aCBBcHBsaWNhdGlvbnMgaW4gUiosIDJuZC4gRWQuIiBwb3IgSm9uYXRoYW4gQ3J5ZXIgZSBLdW5nLVNpayBDaGFuLgpgYGB7cn0KbGlicmFyeShUU0EpCmBgYApDYXJyZWdhbW9zIG9zIGRhZG9zIGRlIHByZWNpcGl0YcOnw6NvIGUgZmF6ZW1vcyB1bSBncsOhZmljbyBkYSBzw6lyaWUgdGVtcG9yYWw6CmBgYHtyfQpkYXRhKGxhcmFpbik7IApwbG90KGxhcmFpbix5bGFiPSdJbmNoZXMnLHhsYWI9J0FubycsdHlwZT0nbycpCmBgYApQYXJhIGZpbnMgZGUgYW7DoWxpc2UgZSBtb2RlbGFnZW0gbm9ybWFsbWVudGUgZXN0YW1vcyBpbnRlcmVzc2Fkb3MgZGUgZGFkb3MgZW0gYW5vcyBjb25zZWN1dGl2b3MgZXN0w6NvIG91IG7Do28gcmVsYWNpb25hZG9zLiBTZSBob3V2ZXIgdW1hIHJlbGHDp8OjbyBlbnRyZSBkYWRvcyBoaXN0w7NyaWNvcywgcG9zc2l2ZWxtZW50ZSBwb2RlcmVtb3MgZGFkb3MgZG8gYW5vIHByZXNlbnRlIHBhcmEgZmF6ZXIgcHJlZGnDp8O1ZXMgZGUgcHJlY2lwaXRhw6fDo28gbm8gYW5vIHNlZ3VpbnRlLiAKClVtIG1vZG8gZGUgaW52ZXN0aWdhciB0YWwgcXVlc3TDo28gw6kgcGxvdGFyIHBhcmVzIGRlIHZhbG9yZXMgYW51YWlzIGNvbnNlY3V0aXZvcy4gRXN0ZSB0aXBvIGRlIGdyw6FmaWNvIMOpICBjaGFtYWRvICpzY2F0dGVycGxvdCo6CmBgYHtyfQpwbG90KHk9bGFyYWluLHg9emxhZyhsYXJhaW4pLHlsYWI9J0luY2hlcycseGxhYj0nQW5vcyBhbnRlcmlvcmVzIChJbmNoZXMpJykKYGBgCkFxdWkgbyBjb21hbmRvIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTpDb3VyYW50OyBmb250LXNpemU6MWVtOyI+emxhZzwvc3Bhbj4gZm9pIHVzYWRvIHBhcmEgcGxvdGFyIG8gKmxhZyogKGF0cmFzbykgZG8gdmV0b3IgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OkNvdXJhbnQ7IGZvbnQtc2l6ZToxZW07Ij5sYXJhaW48L3NwYW4+LiBWZWphbW9zIGluaWNpYWxtZW50ZSBjb21vIHRhbCBjb21hbmRvIGZ1bmNpb25hOiAKYGBge3J9CmY8LTE6MTAKZgp6bGFnKGYpCnpsYWcoZiwyKQp6bGFnKGYsMykKYGBgClZvbHRhbmRvIGFvIG5vc3NvIHByb2JsZW1hLCBhIHByaW1laXJhIGltcHJlc3PDo28gcXVlIG9idGVtb3MgZG8gZ3LDoWZpY28gZGUgc2NhdHRlcnBsb3Qgw6kgcXVlIGjDoSBwb3VjYSBvdSBuZW5odW1hIHJlbGHDp8OjbyBlbnRyZSBhIHByZWNpcGl0YcOnw6NvIGRlIHVtIGRhZG8gbcOqcyBkZSB1bSBhbm8gY29tIG8gYW50ZXJpb3IuIE91IHNlamEsIG8gZ3LDoWZpY28gbsOjbyBtb3N0cmEgdGVuZMOqbmNpYXMuIERpemVtb3MgcXVlIGjDoSBwb3VjYSAqY29ycmVsYcOnw6NvKiBlbnRyZSBhIHByZWNpcGl0YcOnw6NvIGRlIHVtIGRhZG8gYW5vIGUgbyBhbnRlcmlvci4gRG8gcG9udG8gZGUgdmlzdGEgZGUgcHJlZGnDp8O1ZXMsIGVzdGEgbsOjbyDDqSB1bWEgc8OpcmllIHRlbXBvcmFsIG11aXRvIGludGVyZXNzYW50ZS4gQ2FsY3VsZW1vcyBtZWRpZGEgZGUgY29ycmVsYcOnw6NvLiBEZWZpbmltb3MgYXMgc8OpcmllcyBlIGNhbGN1bGVtb3MgbyBzZXUgY29tcHJpbWVudG86IApgYGB7cn0KeTwtbGFyYWluCng8LXpsYWcobGFyYWluKQpsZW5ndGgoeCkKYGBgCkEgY29ycmVsYcOnw6NvIGVudHJlIGFzIHPDqXJpZXMgw6kgZGFkYSBwb3I6IApgYGB7cn0KY292KHhbMjoxMTVdLHlbMjoxMTVdKS9zZCh4WzI6MTE1XSkvc2QoeVsyOjExNV0pCmBgYApvdSBkaXJldGFtZW50ZSwgCmBgYHtyfQpjb3IoeFsyOjExNV0seVsyOjExNV0pCmBgYApxdWUgw6kgdW0gdmFsb3IgbXVpdG8gcGVxdWVubywgY29tbyBlc3BlcmFkby4gClZlamFtb3MgYWdvcmEgdW0gZXhlbXBsbyBvbmRlIGV4aXN0ZSB1bWEgY29ycmVsYcOnw6NvIGVudHJlIGRhZG9zOiAKCjxoMz5FeGVtcGxvIDI6IFByb2Nlc3NvIHF1w61taWNvIGluZHVzdHJpYWw8L2gzPgoKQ29uc2lkZXJlbW9zIHZhcmnDoXZlaXMgcXVlIG1lZGVtIHVtIHByb3ByaWVkYWRlIGRlIGNvciBhIHBhcnRpciBkZSBzZXF1w6puY2lhcyAoKmJhdGNoZXMqKSBjb25zZWN1dGl2YXMgbm8gcHJvY2Vzc28uIApgYGB7cn0KZGF0YShjb2xvcikKYGBgClZlamFtb3MgcXVlIHRpcG8gZGUgZGFkbyDDqSAqY29sb3IqOgpgYGB7cn0KY2xhc3MoY29sb3IpCmBgYApJc3NvIG1vc3RyYSBxdWUgY29sb3Igw6kgdW1hIHPDqXJpZSB0ZW1wb3JhbC4gRXhhbWluZW1vcyBvIGNvbXByaW1lbnRvIGRhIHPDqXJpZToKYGBge3J9Cmxlbmd0aChjb2xvcikKYGBgCkNvbW8gZWxhIMOpIHVtYSBzw6lyaWUgcmVsYXRpdmFtZW50ZSBwZXF1ZW5hLCBwb2RlbW9zIGV4YW1pbsOhLWxhIGVtIHN1YSB0b3RhbGlkYWRlOgpgYGB7cn0KY29sb3IKYGBgCkZhw6dhbW9zIG8gZ3LDoWZpY28gZGVzdGEgc8OpcmllOgpgYGB7cn0KcGxvdChjb2xvcix5bGFiPSdQcm9wcmllZGFkZSBkZSBjb3InLCB4bGFiPSdCYXRjaCcsdHlwZT0nbycpCmBgYApWYWxvcmVzIHZpemluaG9zIHBhcmVjZW0gZXN0YXIgY29ycmVsYWNpb25hZG9zLiBJc3NvIHBvZGUgc2VyIHZpc3RvIG1haXMgY2xhcmFtZW50ZSB1c2FuZG8gbyBncsOhZmljbyAqc2NhdHRlcnBsb3QqIHBhcmEgdmFsb3JlcyB2aXppbmhvczoKYGBge3J9CnBsb3QoeT1jb2xvcix4PXpsYWcoY29sb3IpLHlsYWI9J1Byb3ByaWVkYWRlIGRlIGNvcicseGxhYj0nUHJvcHJpZWRhZGUgZGUgY29yIGRvIGJhdGNoIGFudGVyaW9yJykKYGBgClZlbW9zIHF1ZSBow6EgdW1hIGxldmUgdGVuZMOqbmNpYSBuZXN0ZSBncsOhZmljbzogCgoqIEJhaXhvcyB2YWxvcmVzIGVtIHVtIGJhdGNoIHRlbmRlbSBhIHNlciBzZWd1aWRvcyBwb3IgYmFpeG9zIHZhbG9yZXMgbm8gYmF0Y2ggc2VndWludGUuCiogTcOpZGlvcyB2YWxvcmVzIGVtIHVtIGJhdGNoIHRlbmRlbSBhIHNlciBzZWd1aWRvcyBwb3IgbcOpZGlvcyB2YWxvcmVzIG5vIGJhdGNoIHNlZ3VpbnRlLgoqIEFsdG9zIHZhbG9yZXMgZW0gdW0gYmF0Y2ggdGVuZGVtIGEgc2VyIHNlZ3VpZG9zIHBvciBhbHRvcyB2YWxvcmVzIG5vIGJhdGNoIHNlZ3VpbnRlLgoKQ2FsY3VsZW1vcyBhIGNvcnJlbGHDp8OjbyBlbnRyZSBkYWRvcyB2aXppbmhvcy4gRXhhbWluZW1vcyBhcyBzw6lyaWVzOiAKYGBge3J9Cnk9Y29sb3IKeD16bGFnKGNvbG9yKQp5CngKYGBgCkNhbGN1bGVtb3MgbyBuw7ptZXJvIGRlIGVsZW1lbnRvcyBkYXMgc8OpcmllczogCmBgYHtyfQpsZW5ndGgoeCkKYGBgCiBDYWxjdWxlbW9zIGEgY29ycmVsYcOnw6NvIGVudHJlIGFzIHPDqXJpZXM6IApgYGB7cn0KIGNvcih4WzI6MzVdLHlbMjozNV0pCmBgYAogT3Ugc2VqYSwgYSBjb3JyZWxhw6fDo28gbsOjbyDDqSBtdWl0byBmb3J0ZSBtYXMgc2lnbmlmaWNhdGl2YS4gCiAKIDxoMz5FeGVtcGxvIDM6IEFidW5kw6JuY2lhIGRlIGxlYnJlcyBjYW5hZGVuc2VzIDwvaDM+CiBDb25zaWRlcmVtb3MgYSBzw6lyaWUgdGVtcG9yYWwgcXVlIGZvcm5lY2UgYSBhYnVuZMOibmNpYSBkZSBsZWJyZXMgY2FuYWRlbnNlcyBhbyBsb25nbyBkZSAzMCBhbm9zOgpgYGB7cn0gCmRhdGEoaGFyZSk7IApwbG90KGhhcmUseWxhYj0nQWJ1bmRhbmNlJyx4bGFiPSdZZWFyJyx0eXBlPSdvJykKYGBgCiBWZW1vcyBhZ29yYSBxdWUgZ3JhbmRlcyBtdWRhbsOnYXMgbsOjbyBvY29ycmVtIGRlIHVtIGFubyBwYXJhIG8gb3V0cm8uIEVzdGEgY29ycmVsYcOnw6NvIGVudHJlIGFub3Mgdml6aW5ob3Mgw6kgbWFpcyBjbGFyYW1lbnRlIHZpc3RhIGVtIHVtICpzY2F0dGVycGxvdCo6IApgYGB7cn0gCnBsb3QoeT1oYXJlLHg9emxhZyhoYXJlKSx5bGFiPSdBYnVuZMOibmNpYScseGxhYj0nQWJ1bmTDom5jaWEgbm9zIGFub3MgYW50ZXJpb3JlcycpCmBgYApUYWwgY29tbyBubyBleGVtcGxvIGFudGVyaW9yLCB2ZW1vcyBxdWUgaMOhIHVtYSB0ZW5kw6puY2lhIHBvc2l0aXZhOiB2YWxvcmVzIGJhaXhvcyBkZSBhYnVuZMOibmNpYSBlbSB1bSBkYWRvIGFubyB0ZW5kZW0gYSBzZXJlbSBzZWd1aWRvcyBwb3IgdmFsb3JlcyBiYWl4b3Mgbm8gYW5vIHNlZ3VpbnRlIGUgc2ltaWxhcm1lbnRlIGNvbSB2YWxvcmVzIG3DqWRpb3MgZSBhbHRvcy4gIAoKQ2FsY3VsZW1vcyBhIGNvcnJlbGHDp8OjbyBlbnRyZSBhcyBkdWFzIHPDqXJpZXMgdGVtcG9yYWlzOiAKYGBge3J9IAp5PC1oYXJlCng8LXpsYWcoaGFyZSkKTCA8LWxlbmd0aCh4KQpjb3IoeVsyOkxdLHhbMjpMXSkKYGBgCkNvbW8gZXNwZXJhZG8sIHRlbW9zIHVtYSBjb3JyZWxhw6fDo28gdW0gcG91Y28gbWFpb3IgZG8gcXVlIGEgZG8gZXhlbXBsbyBhbnRlcmlvci4gCgo8aDM+IEV4ZW1wbG8gNDogTcOpZGlhcyBtZW5zYWlzIGRlIHRlbXBlcmF0dXJhIGVtIER1YnVxdWUsIElvd2EuPC9oMz4KQXMgbcOpZGlhcyBtZW5zYWlzIGRlIHRlbXBlcmF0dXJhcyAoZW0gZ3JhdXMgRmFocmVuaGVpdCkgYW8gbG9uZ28gZG9zIGFub3MsIHJlZ2lzdHJhZGEgZW0gCkR1YnVxdWUsIElvd2EsIHPDo28gbW9zdHJhZGFzIGEgc2VndWlyOgpgYGB7cn0KZGF0YSh0ZW1wZHViKTsgCnBsb3QodGVtcGR1Yix5bGFiPSdUZW1wZXJhdHVyZScsdHlwZT0nbycpCmBgYApUYWwgc8OpcmllIG1vc3RyYSB1bSBwYWRyw6NvIGJhc3RhbnRlIHJlZ3VsYXIgY2hhbWFkbyAqc2F6b25hbGlkYWRlKi4gQSBzYXpvbmFsaWRhZGUgcGFyYSB2YWxvcmVzIG1lbnNhaXMgb2NvcnJlIHF1YW5kbyBhcyBvYnNlcnZhw6fDtWVzIHNlcGFyYWRhcyBwb3IgMTIgbWVzZXMgZXN0w6NvIHJlbGFjaW9uYWRhcy4gRW0gdG9kb3Mgb3MgYW5vcyBvcyBtZXNlcyBkZSBqYW5laXJvIGUgZmV2ZXJlaXJvIHRlbW9zIHRlbXBlcmF0dXJhcyBiYWl4YXMsIGVucXVhbnRvIHF1ZSBzZW1wcmUgZW0ganVuaG8sIGp1bGhvIGUgYWdvc3RvIHRlbW9zIHRlbXBlcmF0dXJhcyBhbHRhcy4gSMOhIHVtYSB2YXJpYcOnw6NvIGVudHJlIG9zIG1lc2VzIGRlIGphbmVpcm8gZGUgZGlmZXJlbnRlcyBhbm9zLCBhc3NpbSBjb21vIGp1bmhvLiBNb2RlbG9zIHBhcmEgc8OpcmllcyB0ZW1wb3JhaXMgY29tbyBlc3RhIGRldmVtIHByZXZlciBlc3RhcyB2YXJpYcOnw7VlcywgcHJlc2VydmFuZG8gdGFtYsOpbSBhcyBzaW1pbGFyaWRhZGVzLiAKClZlamFtb3MgYSBjb3JyZWxhw6fDo28gZW50cmUgbWVzZXMgdml6aW5ob3M6CmBgYHtyfSAKcGxvdCh5PXRlbXBkdWIseD16bGFnKHRlbXBkdWIpLHlsYWI9J1RlbXBlcmF0dXJhJyx4bGFiPSdUZW1wZXJhdHVyYSBub3MgYW5vcyBhbnRlcmlvcmVzJykKYGBgClZlbW9zIGFxdWkgdW1hIGNvcnJlbGHDp8OjbyBzaWduaWZpY2F0aXZhOgpgYGB7cn0gCnk8LXRlbXBkdWIKeDwtemxhZyh0ZW1wZHViKQpMIDwtbGVuZ3RoKHgpCmNvcih5WzI6TF0seFsyOkxdKQpgYGAKCgo8aDM+IEZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gZW0gc8OpcmllcyB0ZW1wb3JhaXM8L2gzPgoKTm9zIGV4ZW1wbG9zIGRhICBzZcOnw6NvIGFudGVyaW9yIGVzdHVkYW1vcyBjYXJhY3Rlcml6YW1vcyB2aXN1YWxtZW50ZSBhIGNvcnJlbGHDp8OjbyBkb3MgZGFkb3MgZGUgdW1hIHPDqXJpZSB0ZW1wb3JhbCBjb20gb3MgZGEgbWVzbWEgc8OpcmllLCBkZSB1bSBwZXLDrW9kbyBhdHLDoXMsIGF0cmF2w6lzIGRvICpzY2F0dGVycGxvdCouIEFsw6ltIGRpc3NvLCBxdWFudGlmaWNhbW9zIGEgbWVkaWRhIGRlIGNvcnJlbGHDp8OjbyBlbnRyZSBhcyBkdWFzIHPDqXJpZXMgdGVtcG9yYWlzIGNhbGN1bGFuZG8gYSBxdWFudGlkYWRlCiQkCnJfe3hfdCx4X3t0LTF9fT1cZnJhY3tzX3t4X3t0fSx4X3t0LTF9fX17c197eF90fSBzX3t4X3t0LTF9fX09XGZyYWN7c197eF97dH0seF97dC0xfX19e3Nfe3hfe3R9fV4yfVwsLAokJApzZW5kbwokJApzX3t4X3R9XjI9XGZyYWN7MX17Ti0xfVxzdW1fe2k9MX1eTih4X2ktXGJhcnt4fSleMgokJApjb20gXFtzX3t4X3R9PXNfe3hfe3QtMX19XF0sIHBvaXMgYSBzw6lyaWUgw6kgZXN0YWNpb27DoXJpYSBwb3IgaGlww7N0ZXNlIGUgCiQkCnNfe3hfdCwgeF97dC0xfX09XGZyYWN7MX17Ti0xfVxzdW1fe2k9MX1ee059KHhfdC1cYmFye3h9KSh4X3t0LTF9LVxiYXJ7eH0pXCwuCiQkCkVzdGEgaWTDqWlhIHBvZGUgc2VyIGdlbmVyYWxpemFkYS4gQ29uc2lkZXJlbW9zIHVtYSBzw6lyaWUgcXVlIMOpIGVzdGFjaW9uw6FyaWEgbmEgbcOpZGlhIGUgbmEgdmFyacOibmNpYS4gQXMgdmFyacOhdmVpcyBwb2RlbSBzZXIgY29ycmVsYWNpb25hZGFzIGUgbyBtb2RlbG8gw6kgZGl0byBzZXIgZXN0YWNpb27DoXJpbyBkZSBzZWd1bmRhIG9yZGVtIHNlIGEgY29ycmVsYcOnw6NvIGVudHJlIGFzIHZhcmnDoXZlaXMgZGVwZW5kZSBzb21lbnRlIGRvIG7Dum1lcm8gZGUgcGVyw61vZG9zIGVudHJlIGVsZXMsIG91ICpsYWcqLiBBIGNvcnJlbGHDp8OjbyBkZSB1bWEgdmFyacOhdmVsIGNvbSBlbGEgbWVzbWEgZW0gdGVtcG9zIGRpZmVyZW50ZSDDqSBjb25oZWNpZGEgY29tbyAqYXV0b2NvcnJlbGHDp8OjbyouIEEgZnVuw6fDo28gZGUgYXV0b2NvdmFyacOibmNpYSBkZSAqbGFnKiAkayQgw6kgZGFkYSBwb3IgCgoK