Este material tem como objetivo contribuir para o entendimento sobre Modelos de Heterocedasticidade Condicional. Para tanto, vamos mostrar como modelar o segundo momento condicional de uma série temporal e as diferenças entre dois dos principais modelos econométricos de séries temporais univariadas para este caso: Modelo de Heterocedasticidade Condicional Autorregressiva (ARCH) e Modelo de Heterocedasticidade Condicional Autorregressiva Generalizado (GARCH).
INTRODUÇÃO
Anteriormente, estudamos modelos econométricos de séries temporais univariadas que se preocupavam apenas com o primeiro momento condicional da série. Para o caso da série temporal dos retornos de um ativo financeiro, nosso objetivo era modelar a média condicional, ou seja, o valor esperado do retorno. Contudo, sabemos que a série temporal dos retornos apresenta fatos estilizados o que implica que a variância dos retornos tendem a mudar ao longo do tempo, fazendo com que fatores tais como risco e incerteza também oscilem.
Estes fatores têm grande importância para a tomada de decisão de compra e venda de ativos e na montagem de uma carteira de investimentos como mostrado pela teoria moderna do portfólio. Neste sentido, técnicas econométricas de séries temporais foram desenvolvidas fundamentando-se na estimação da variância condicional ao invés de considerá-la constante ao longo do tempo como fizemos anteriormente para os modelos \(AR(p)\), \(MA(q)\), \(ARMA(p,q)\), \(ARIMA(p,d,q)\) e \(SARIMA(p,d,q)(P,D,Q)_s\).
Ao longo do texto, vamos mostrar uma breve descrição do conceito de volatilidade de ativos financeiros bem como suas características. Além disso, vamos estudar o Modelo de Heterocedasticidade Condicional Autorregressiva (ARCH) proposto por Engle (1982) e o Modelo Heterocedasticidade Condicional Autorregressiva Generalizado de Bollerslev (1986).
VOLATILIDADE E SUAS CARACTERÍSTICAS
Uma característica importante da volatilidade de um ativo financeiro é que ela não é observada diretamente. Por exemplo, considere o logaritmo dos retornos diários de uma ação qualquer. A volatilidade diária desta ação não é diretamente observável dado que temos apenas uma observação do retorno da ação durante o dia.
Você poderia pensar em usar dados intradiários para estimar a volatilidade diária, mas mesmo assim teria uma estimativa da volatilidade e não a observação da real volatilidade. Embora a volatilidade não seja observável, ela tem algumas características que são comumente vistas em retornos de ativos financeiros:
- Existem clusters de volatilidade: ela pode ser maior em certos períodos e baixa em outros;
- A volatilidade se densenvolve continuamente ao longo do tempo: saltos de volatilidade são raros
- A volatilidade não diverge para o infinito: ela oscila em torno de um intervalo fixo (estatisticamente falando, isso significa que a volatilidade é estacionária)
- A volatilidade reage de forma diferente a um grande aumento nos preços do que uma grande queda nos preços.
Abaixo, alguns gráficos do índice IBOVESPA que podem ajudar no entendimento das características da volatilidade. Para o caso de clusters, observe que há períodos de grande volatilidade na série (entre \(2008\) e \(2009\)) enquanto nos demais períodos a volatilidade se manteve.
Outra característica importante é que existe uma tendência de mudanças nos preços de um ativo financeiros serem negativamente correlacionadas com mudanças na volatilidade do ativo. Isso também fica evidente ao observarmos os gráficos do índice IBOVESPA e seus retornos (o período de maior volatilidade está associado com o período de menor cotação do índice, por volta de 2009).
Além disso, observe a relação entre os três gráficos acima. O período de maior volatilidade está associado com menor cotação do índice (como já comentado) e também com maior retorno ao quadrado. Isso nos confirma que usar os retornos ao quadrado como uma proxy para verificar a existência de heterocedasticidade condicional é justificável dada a relação entre esta variável e a volatilidade de um ativo financeiro.
Por fim, mostramos abaixo os gráficos da densidade dos retornos do IBOVESPA comparando com a distribuição Normal bem como a função de autocorrelação (FAC) para os retornos normais e retornos elevado ao quadrado.
É possível confirmar, conforme esperado, que a autocorrelação entre os retornos é praticamente nula, mas para os retornos ao quadrado ela fica evidente o que nos mostra certa dependência entre os retornos. Além disso, ao compararmos a densidade dos retornos com a densidade de uma distribuição Normal percebemos a diferença entre elas. Isso é ocasionado principalmente pelos fatos estilizados já documentamos anteriormente.

ESTRUTURA DE UM MODELO DE HETEROCEDASTICIDADE CONDICIONAL
Como mostramos anteriormente, uma das principais características de séries temporais financeiras, em particular o retorno de ativos, é a existência de clusters de volatilidade. Isto significa que retornos não muito longe um do outro no tempo tendem a ter níveis de volatilidade semelhantes. Portanto, “bons” modelos deveriam incorporar esta característica em sua estrutura, pois informações valiosas poderiam ser desperdiçadas e os modelos seriam incapazes de detectar satisfatoriamente as mudanças de volatilidade ao longo do tempo.
Para colocar um modelo que se preocupe com a volatilidade em uma perspectiva adequada, suponha que \(r_{t}\) é o logaritmo do retorno de um ativo financeiro em \(t\). A idéia básica por trás destes modelos é que a série \(\left\{ r_{t}\right\}_{t=1}^{t}\) é não autocorrelacionada ou com correlação em ordens menores, mas ela é dependente. Suponha que a média condicional e variância condicional de \(r_{t}\) são dadas por:
\[
\begin{aligned}
&&& \mu_{t} = E\left(r_{t}|F_{t-1}\right) \\
&&& \sigma_{t}^{2} = Var\left(r_{t}|F_{t-1}\right)=E[\left(r_{t}-\mu_{t}\right)^2 |F_{t-1}]
\end{aligned}
\]
onde \(F_{t-1}\) representa as informações disponíveis até \(t-1\).
Para a equação da média condicional acima, poderíamos assumir que \(r_{t}\) segue um modelo \(ARMA(p,q)\), como segue:
\[
\begin{aligned}
&&& r_{t} = \mu_{t} + a_{t} \\
&&& \mu_{t} = \phi_{0} + \sum_{i=1}^{p}{\phi_{i}r_{t-i}} + \sum_{j=1}^{q}{\theta_{j}a_{t-j}}
\end{aligned}
\] onde \(p\) e \(q\) são as ordens da parte autorregressiva e de médias móveis, respectivamente. Além da parte ARMA de \(\mu_{t}\), poderíamos adicionar variáveis explicativas na equação da média condicional e usar um modelo de regressão linear com erros se comportando como uma série temporal para capturar o comportamento de \(\mu_{t}\). Neste caso, \(\mu_{t}\) seria:
\[
\begin{aligned}
&&& \mu_{t} = \phi_{0} + \sum_{i=1}^{k}{\beta_{i}x_{it}} + \sum_{i=1}^{p}{\phi_{i}r_{t-i}} + \sum_{j=1}^{q}{\theta_{j}a_{t-j}}
\end{aligned}
\] Por exemplo, poderíamos usar uma variável dummy para as segundas-feiras e estudar o efeito do final de semana sobre retornos diários de um ativo qualquer. Combinando a equação da média condicional com a variância condicional, temos:
\[
\begin{aligned}
&&& \sigma_{t}^{2} = Var\left(r_{t}|F_{t-1}\right) = Var\left(a_{t}|F_{t-1}\right)
\end{aligned}
\]
Os modelos de heterocedasticidade condicional estudados aqui estão preocupados com a evolução de \(\sigma_{t}^{2}\). A maneira pela qual \(\sigma_{t}^{2}\) evolui ao longo do tempo distingue um modelo do outro.
TESTE PARA VERIFICAR HETEROCEDASTICIDADE CONDICIONAL AUTORREGRESSIVA (EFEITO ARCH)
Suponha que \(a_t=r_t - \mu_t\) seja os resíduos da equação da média condicional. A série ao quadrado, \(a_t^2\), é então usada para verificar a presença de heterocedasticidade condicional, que chamamos de efeito ARCH. Temos dois testes possíveis. O primeiro deles é o usual teste \(Q\left(m\right)\) da série \(\left\{a_t^2\right\}_{t=1}^{t}\). A hipótese nula deste teste é que as primeiras \(m\) defasagens da FAC da série são zero. A forma mais fácil de verificar isto é criando o gráfico da FAC desta série. Se qualquer defasagem a partir de \(1\) for estatisticamente significante (acima da linha pontilhada), há heterocedasticidade condicional em \(a_t^2\).
Outro teste possível é o teste de multiplicador de Lagrange (LM) de Engle (1982). Este teste é equivalente ao usual teste \(F\) para testar se \(\alpha_{i}=0\), para \(i=1,...,m\) na seguinte regressão linear:
\[
a_{t}^{2} = \alpha_{0} + \alpha_{1}a_{t-1}^{2}+...+\alpha_{m}a_{t-m}^{2} + e_t~\text{;}~~t=m+1,...,T
\] onde \(e_t\) denota o termo de erro, \(m\) é um número inteiro e positivo e \(T\) o tamanho da amostra. Especificamente, temos as seguintes hipóteses:
\[
\begin{aligned}
&&& H_{0}: \alpha_1=...=\alpha_m=0\\
&&& H_{1}: \alpha_i \neq 0 ~\text{para algum}~i~\text{entre}~1~\text{e}~m\\
\end{aligned}
\] Assim, se o p-valor do teste para alguma defasagem qualquer (\(i\)) for menor que \(0.05\), dizemos que ao nível de significância de \(5\%\) podemos rejeitar a hipótese nula. Tal resultado confirma a existência de heterocedasticidade condicional em \(a_t^2\).
MODELO DE HETEROCEDASTICIDADE CONDICIONAL AUTORREGRESSIVA (ARCH)
O primeiro modelo a fornecer uma abordagem sistemática para modelar a volatilidade é o modelo ARCH de Engle (1982). A ideia básica do modelo ARCH é que o termo de erro \(a_t\) dos retornos de um ativo financeiro não é autocorrelacionado, mas dependente do tempo e esta dependência de \(a_t\) pode ser descrita como uma função quadrática de seus valores passados. Especificamente, um modelo \(ARCH(m)\) assume que:
\[
\begin{aligned}
&&& a_{t}=\sigma_t\epsilon_t \\
&&& \sigma_{t}^{2} = \alpha_{0} + \alpha_{1}a_{t-1}^{2}+...+\alpha_{m}a_{t-m}^{2}
\end{aligned}
\]
onde \(\left\{\epsilon_t \right\}_{t=1}^{t}\) é uma sequência de variáveis aleatórias independente e identicamente distribuídas (iid) com média \(0\) e variância \(1\), \(\alpha_{0}>0\) e \(\alpha_{i}\geq 0\) para \(i>0\). Os coeficientes \(\alpha_i\) devem satisfazer algumas condições para garantir que a variância incondicional de \(a_{t}\) seja finita. Na prática, podemos assumir que \(\epsilon_t\) segue uma distribuição Normal ou t-Student. Em algumas aplicações, podemos usar também distribuições assimétricas para \(\epsilon_t\).
A partir da estrutura do modelo podemos perceber que um grande choque ao quadrado (\(\left\{a_{t-i}^2 \right\}_{i=1}^{m}\)) leva a uma grande variância condicional (\(\sigma_{t}^{2}\)) para o termo de erro \(a_{t}\). Consequentemente, \(a_t\) tende a assumir um valor grande em módulo. Isto significa que, sob a abordagem ARCH, grandes choques tendem a ser seguidos por outro grande choque. Esta característica é similar aos clusters de volatilidade apresentados anteriormente para os retornos de ativos.
- PROPRIEDADES DO MODELO ARCH
Para entender o modelo ARCH vale a pena estudar cuidadosamente o modelo \(ARCH(1)\) que é:
\[
\begin{aligned}
&&& a_t = \sigma_{t}\epsilon_{t} \\
&&& \sigma_{t}^2 = \alpha_{0} + \alpha_{1}a_{t-1}^2
\end{aligned}
\] onde \(\alpha_0 >0\), \(\alpha_{1} \geq 0\), \(E\left(a_t\right)=0\), \(Var\left(a_t\right)=Var\left(a_{t-1}\right)=E\left[a_{t-1}^{2}\right]\), \(E\left(\epsilon_t\right)=0\) e \(Var\left(\epsilon_t\right)=E\left[\epsilon_{t}^{2}\right]=1\). Primeiro, a média incondicional de \(a_t\) permanece \(0\) porque:
\[
E\left(a_t\right) = \sigma_tE(\epsilon_t) = 0
\] Segundo, a variância incondicional de \(a_t\) pode ser obtida como:
\[
\begin{split}
Var\left(a_t\right) & = E\left(a_{t}^{2}\right) = E\left(\sigma_{t}^{2}\epsilon_t^{2}\right) \\
& = E\left(\sigma_{t}^{2}\right)\times E\left(\epsilon_{t}^{2}\right)~\text{pois são duas variáveis iid} \\
& = E\left(\sigma_{t}^{2}\right) ~\text{pois}~Var\left(\epsilon_t\right)=1 \\
& = E\left(\alpha_{0} + \alpha_{1}a_{t-1}^2\right) \\
& = \alpha_{0} + \alpha_{1}E\left(a_{t-1}^2\right) \\
& = \alpha_{0} + \alpha_{1}Var\left(a_t\right) \\
& = \frac{\alpha_{0}}{1-\alpha_{1}} \\
\end{split}
\] Sabemos que a variância não pode ser negativa. Assim, precisamos que \(0\leq \alpha_{1} < 1\).
Dependendo da aplicação dos modelos ARCH, é preciso que os momentos de maior ordem de \(a_t\) existam. Assim, \(\alpha_{1}\) deve satisfazer algumas restrições adicionais. Por exemplo, para estudar seu comportamento nas caudas, precisamos que o quarto momento incondicional de \(a_t\) seja finito. Sob a hipóte de que \(\epsilon_{t}\) segue uma distribuição Normal, temos que o quarto momento incondicional é igual a 3, ou seja:
\[
\begin{split}
\frac{m_4}{m_2^{2}} & = \frac{E\left(a_t- \bar{a_t}\right)^4}{\left[E\left(a_t- \bar{a_t}\right)^2\right]^2} = 3 \\
& \\
E\left(a_{t}^{4}\right) & = 3E\left(a_t^2\right)^2 ~\text{pois}~\bar{a_t}=0 \\
& \\
& = 3E\left(\alpha_{0} + \alpha_{1}a_{t-1}^2\right)^2 \\
& \\
& = 3E\left(\alpha_{0}^2 + 2\alpha_{0}\alpha_{1}a_{t-1}^2+\alpha_{1}^{2}a_{t-1}^{4}\right) \\
\end{split}
\]
Se \(a_t\) é estacionário no quarto momento com \(m_4 = E\left(a_{t}^4\right)=E\left(a_{t-1}^4\right)\) e sabendo que \(E\left(a_t^2\right)=Var\left(a_t\right)\) então temos:
\[
\begin{split}
m_4 & = 3\left(\alpha_{0}^2 + 2\alpha_{0}\alpha_{1}Var(a_t)+\alpha_{1}^{2}m_4\right) \\
& \\
& = 3\alpha_{0}^2+6\alpha_0\alpha_1\left(\frac{\alpha_0}{1-\alpha_1}\right) + 3\alpha_{1}^{2}m_4\\
& \\
& = 3\alpha_{0}^{2}\left(1+\frac{2\alpha_1}{1-\alpha_1}\right) + 3\alpha_{1}^{2}m_4 \\
& \\
m_4 - 3\alpha_{1}^{2}m_4 & = 3\alpha_{0}^{2}+\frac{3\alpha_{0}^{2}\left(2\alpha_1\right)}{{1-\alpha_1}} \\
& \\
\left(1-3\alpha_{1}^{2}\right)m_4 & = \frac{\left(1-\alpha_1\right)3\alpha_{0}^{2}+3\alpha_{0}^{2}\left(2\alpha_1\right)}{1-\alpha_1} \\
& \\
m_4 & = \frac{3\alpha_0^2-3\alpha_0^2\alpha_1+6\alpha_0^2\alpha_1}{\left(1-\alpha_1\right)\left(1-3\alpha_1^{2}\right)}\\
& \\
m_4 & = \frac{3\alpha_{0}^{2}\left(1+\alpha_1\right)}{\left(1-\alpha_1\right)\left(1-3\alpha_1^{2}\right)}
\end{split}
\]
Como o quarto momento de \(a_t\) é positivo, \(\alpha_1\) deve satisfazer a condição \(1-3\alpha_{1}^{2}>0\), pois da variância incondicional já temos que \(\left(1-\alpha_1\right)\). Isso implica que \(\alpha_{1}^{2} < \frac{1}{3}\) e juntando as duas condições, \(0\leq \alpha_{1}^{2} < \frac{1}{3}\). Com tais condições podemos encontrar a curtose incondicional de \(a_t\):
\[
\frac{E\left[a_t^4\right]}{\left[Var(a_t)\right]^2} = \frac{3\alpha_{0}^{2}\left(1+\alpha_1\right)}{\left(1-\alpha_1\right)\left(1-3\alpha_1^{2}\right)} \times \frac{\left(1-\alpha_1\right)^2}{\alpha_{0}^{2}} = \frac{3\left(1-\alpha_1^2\right)}{1-3\alpha_1^{2}} > 3
\]
Assim, o excesso de curtose de \(a_t\) é positivo e cauda de sua distribuição é mais pesada que a da distribuição da Normal que tem assimetria igual a \(0\) e curtose \(3\). Isso está de acordo com os resultados empíricos que nos mostram que outliers ocorrem com maior frequência na série temporal de retornos do que em uma série que segue uma distribuição Normal. Tais propriedades são mantidas para modelos ARCH de ordem superior, mas as fórmulas se tornam mais complicadas.
- VANTAGENS E FRAQUEZAS DE UM MODELO ARCH
Como discutido nas seções anteriores, modelos ARCH tem muitas vantagens na análise de retornos de ativos financeiros. As principais vantagens são:
- O modelo pode produzir clusters de volatilidade
- Os choques do modelo, representados por \(a_t\), tem caudas pesadas
Porém, temos também algumas fraquezas, que são:
- O modelo assume que choques positivos e negativos tem o mesmo efeito sobre a volatilidade porque ele depende apenas dos quadrados de choques passados. Na prática, sabemos que os preços de ativos financeiros respondem diferentemente a choques positivos ou negativos.
- O modelo ARCH é bastante restritivo. Por exemplo, \(\alpha_{1}^{2}\) de um modelo \(ARCH(1)\) deve estar no intervalo \(\left[0,\frac{1}{3}\right]\) se a série tem o quarto momento finito. Na prática, tal restrição limita a habilidade do modelo ARCH com erros se distribuindo Normalmente em capturar o excesso de curtose comumente encontrado na distribuição dos retornos de ativos financeiros.
- O modelo ARCH não fornece qualquer insight para entender a fonte de variação de uma série temporal financeira. Ele apenas proporciona uma maneira de descrever o comportamento da variância condicional.
Se encontrarmos que os efeitos ARCH são significantes, pode-se usar a função de autocorrelação parcial (FACP) de \(a_{t}^{2}\) para determinar a ordem \(m\) do modelo \(ARCH(m)\). A justificativa para o uso da FACP pode ser delineada, como segue. Suponha o modelo ARCH(m):
\[
\sigma_{t}^{2} = \alpha_{0} + \alpha_{1}a_{t-1}^{2} + ... + \alpha_{m}a_{t-m}^{2}
\] Para uma dada amostra, \(a_{t}^{2}\) é uma estimativa não enviesada de \(\sigma_{t}^{2}\). Portanto, esperamos que \(a_{t}^{2}\) seja linearmente relacionado a \(a_{t-1}^{2},...,a_{t-m}^{2}\) em uma maneira similar a de um modelo autorregressivo de ordem \(m\). Assim, como estudamos para os modelos autorregressivos, \(AR(p)\), podemos usar a FACP para determinar a ordem \(m\) do modelo \(ARCH(m)\) como você pode observar neste Link.
Já a estimação de tal modelo pode ser realizada por meio do princípio da máxima verossimilhança. Como estudamos neste link, a verossimilhança geral de uma série temporal de retornos pode ser escrita da seguinte forma:
\[
\begin{aligned}
f(r_{t},r_{t-1},...,r_{2},r_{1}) = \left[\prod_{t=2}^{T}{f(r_{t}|r_{t-1},...r_{1})}\right]f(r_{1})
\end{aligned}
\] Se \(r_{t}|r_{t-1},...r_{1}\) segue uma distribuição normal com média \(\mu\) e variância \(\sigma^{2}\) a função de verossimilhança condicional se torna, para \(R = \left\{r_{t}\right\}_{t=1}^{T}\):
\[
L(R|\boldsymbol{\theta}) = f(r_{t},r_{t-1},...,r_{1} | \boldsymbol{\theta}) = f(r_{1}|\boldsymbol{\theta}) \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma^{2}}}exp\left\{-\frac{(r_{t}-\mu)^2}{2\sigma^{2}} \right\}}
\]
Se ignoramos \(f(r_{1})\), a função de verossimilhança condicional dos retornos sob hipótese de normalidade será:
\[
L(R|\boldsymbol{\theta}) = f(r_{t},r_{t-1},...,r_{1}|\boldsymbol{\theta}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma^{2}}}exp\left\{-\frac{(r_{t}-\mu)^2}{2\sigma^{2}} \right\}}
\]
Para o caso específico do modelo \(ARCH(m)\), o ponto crucial é que a função de verossimilhança passa agora a ter \(\sigma_{t}^{2}\) e não assumi-lo constante como anteriormente. Isso implica em:
\[
L(R|\boldsymbol{\theta}) = f(r_{t},r_{t-1},...,r_{1}|\boldsymbol{\theta}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma_{t}^{2}}}exp\left\{-\frac{(r_{t}-\mu)^2}{2\sigma_{t}^{2}} \right\}}
\]
No momento que observamos a amostra de dados da nossa série temporal de retornos, o objetivo no processo de otimização da função de verossimilhança é encontrar o vetor de parâmetros \(\boldsymbol{\theta}\) que maximiza tal função. Como exemplo, suponha que temos o modelo \(ARMA(1,1)-ARCH(1)\) abaixo:
\[
\begin{aligned}
&&& r_{t} = \mu_{t} + a_{t} \\
&&& \mu_{t} = \phi_{0} + \phi_{1}r_{t-1} + \theta_{1}a_{t-1} \\
&&& a_t = \sigma_{t}\epsilon_{t} \\
&&& \sigma_{t}^2 = \alpha_{0} + \alpha_{1}a_{t-1}^2
\end{aligned}
\] Com tais informações, a função de verossimilhança após observar a amostra de retornos será:
\[
\begin{aligned}
&&& L(\boldsymbol{\theta}|R) = f(\boldsymbol{\theta}| r_{t},r_{t-1},...,r_{1}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma_{t}^{2}}}exp\left\{-\frac{(r_{t}-\mu)^2}{2\sigma_{t}^{2}} \right\}} \\
&&& \\
&&& L(\boldsymbol{\theta}|R) = f(\boldsymbol{\theta}| r_{t},r_{t-1},...,r_{1}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma_{t}^{2}}}exp\left\{-\frac{a_{t}^2}{2\sigma_{t}^{2}} \right\}} \\
&&& \\
&&& L(\boldsymbol{\theta}|R) = f(\boldsymbol{\theta}| r_{t},r_{t-1},...,r_{1}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\left(\alpha_{0} + \alpha_{1}a_{t-1}^2\right)}}exp\left\{-\frac{(r_t-\phi_{0} - \phi_{1}r_{t-1} - \theta_{1}a_{t-1})^2}{2\left(\alpha_{0} + \alpha_{1}a_{t-1}^2\right)} \right\}} \\
&&& \\
&&& L(\boldsymbol{\theta}|R) = f(\boldsymbol{\theta}| r_{t},r_{t-1},...,r_{1}|) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\left(\alpha_{0} + \alpha_{1}\left[r_{t-1}-\phi_{0} - \phi_{1}r_{t-2} - \theta_{1}a_{t-2}\right]^2\right)}}exp\left\{-\frac{(r_t-\phi_{0} - \phi_{1}r_{t-1} - \theta_{1}a_{t-1})^2}{2\left(\alpha_{0} + \alpha_{1}\left[r_{t-1}-\phi_{0} - \phi_{1}r_{t-2} - \theta_{1}a_{t-2}\right]^2\right)} \right\}} \\
\end{aligned}
\]
Isso permitirá encontrar o vetor de parâmetros \(\boldsymbol{\theta} = \left(\phi_0, \phi_1, \theta_1, \alpha_0, \alpha_1\right)\) por meio da otimização da função de verossimilhança.
Uma vez estimado o modelo, precisamos verificar a sua adequação. Para tanto, podemos avaliar a série \(\left\{\hat{a}_t\right\}\), ou seja, os resíduos do modelo \(ARCH(m)\) estimado. Em particular, estatísticas de \(\hat{a}_t\) podem ser usadas para verificar a adequação da equação da média e \(\hat{a}_t^{2}\) pode ser usado para testar a validade da equação da volatilidade.
MODELO DE HETEROCEDASTICIDADE CONDICIONAL AUTORREGRESSIVA GENERALIZADO (GARCH)
Embora o modelo \(ARCH(m)\) seja simples, ele frequentemente requer muitos parâmetros para descrever adequadamente a volatilidade condicional dos retornos de um ativo financeiro. Em função disso, Bollerslev (1986) propôs uma extensão do modelo \(ARCH(m)\) conhecida como modelo de heterocedasticidade condicional autorregressiva generalizado (GARCH).
Como distcutimos na seção estrutura de um modelo de heterocedasticidade condicional, temos duas equações que precisam ser estimadas nestes modelos: média condicional e variância condicional. Para a equação da média condicional, assim como nos modelos \(ARCH(m)\), podemos assumir um modelo \(ARMA(p,q)\), neste formato:
\[
\begin{aligned}
&&& r_{t} = \mu_{t} + a_{t} \\
&&& \mu_{t} = \phi_{0} + \sum_{i=1}^{p}{\phi_{i}r_{t-i}} + \sum_{j=1}^{q}{\theta_{j}a_{t-j}}
\end{aligned}
\]
Já para a variância condicional, Bollerslev (1986) definiu tal equação como segue:
\[
\begin{aligned}
&&& a_{t}=\sigma_t\epsilon_t \\
&&& \sigma_{t}^{2} = \alpha_{0} + \sum_{i=1}^{m}{}\alpha_{i}a_{t-i}^{2}+\sum_{j=1}^{n}{\beta_j\sigma^{2}_{t-j}}
\end{aligned}
\] onde, novamente \(\left\{\epsilon_t \right\}_{t=1}^{t}\) é uma sequência de variáveis aleatórias independente e identicamente distribuídas (iid) com média \(0\) e variância \(1\), \(\alpha_{0}>0\), \(\alpha_{i}\geq 0\), \(\beta_{j}\geq 0\) para \(i>0\) e \(j>0\). Além disso, \(\sum_{i=1}^{max(m,n)}{(\alpha_i+\beta_i)<1}\) que garante que a variância incondicional de \(a_t\) é finita. Como antes, podemos assumir que \(\epsilon_t\) segue uma distribuição Normal ou t-Student. Em algumas aplicações, podemos usar também distribuições assimétricas para \(\epsilon_t\).
Observe que se \(n=0\) a equação da variância condicional se comporta como um modelo \(ARCH(m)\). Por outro lado, para \(n>0\) o modelo é escrito como \(GARCH(m,n)\) também conhecido como modelo de heterocedasticidade condicional autorregressiva generalizado.
- PROPRIEDADES DO MODELO GARCH
Para entender o modelo \(GARCH(m,n)\) vale a pena estudar cuidadosamente o modelo \(GARCH(1,1)\) que é:
\[
\begin{aligned}
&&& a_t = \sigma_{t}\epsilon_{t} \\
&&& \sigma_{t}^2 = \alpha_{0} + \alpha_{1}a_{t-1}^2 + \beta_1\sigma_{t-1}^{2}
\end{aligned}
\] onde \(\alpha_0 >0\), \(\alpha_{1} \geq 0\), \(\beta_{1} \geq 0\), \(\alpha_1+\beta_1 <1\), \(E\left(a_t\right)=0\), \(Var\left(a_t\right)=Var\left(a_{t-1}\right)=E\left[a_{t-1}^{2}\right]\), \(E\left(\epsilon_t\right)=0\) e \(Var\left(\epsilon_t\right)=E\left[\epsilon_{t}^{2}\right]=1\). Primeiro, a média incondicional de \(a_t\) permanece \(0\) porque:
\[
E\left(a_t\right) = \sigma_tE(\epsilon_t) = 0
\] Segundo, para entender a variância incondicional de \(a_t\), deixe \(\eta_t = a_t^2 - \sigma_t^2\) de modo que \(\sigma_t^2 = a_t^2 - \eta_t\) e \(\sigma_{t-i}^2 = a_{t-i}^2 - \eta_{t-i}\) para \(i=0,1,...,n\). Com tais definições podemos fazer:
\[
\begin{aligned}
&&& \sigma_{t}^{2} = \alpha_{0} + \alpha_{1}a_{t-1}^{2}+\beta_1\sigma^{2}_{t-1} \\
&&& \\
&&& a_t^2-\eta_t=\alpha_{0} + \alpha_{1}a_{t-1}^{2}+\beta_1\left(a_{t-1}^2-\eta_{t-1}\right) \\
&&& \\
&&& a_t^2=\alpha_{0}+\alpha_{1}a_{t-1}^{2}+\beta_1a_{t-1}^2+\eta_t-\beta_1\eta_{t-1} \\
&&& \\
&&& a_t^2=\alpha_{0}+\left(\alpha_{1}+\beta_1\right)a_{t-1}^{2}+\eta_t-\beta_1\eta_{t-1} \\
\end{aligned}
\] Observe que a equação acima está no formato de um modelo \(ARMA(1,1)\), mas para \(a_t^2\). Assim, o modelo \(GARCH(1,1)\) pode ser visto como uma aplicação da ideia do \(ARMA(1,1)\) à série de \(a_t^2\). A média incondicional do modelo \(ARMA(1,1)\) encontrada neste link é:
\[
E\left[r_t\right]=\frac{\phi_0}{1-\phi_1}
\]
Assim, a média do modelo \(GARCH(1,1)\) escrito como \(ARMA(1,1)\) para \(a_{t}^{2}\) será:
\[
E\left[a_t^2\right]=\frac{\alpha_0}{1-\left(\alpha_1+\beta_1\right)}
\] que fornece a variância incondicional de \(a_t\) e a restrição já apresentada de que \(\alpha_1+\beta_1<1\) para que ela seja positiva. Já a curtose incondicional de \(a_t\), sob a hipóte de que \(\epsilon_{t}\) segue uma distribuição Normal, temos que o quarto momento incondicional é igual a 3, ou seja:
\[
\begin{split}
\frac{m_4}{m_2^{2}} & = \frac{E\left(a_t- \bar{a_t}\right)^4}{\left[E\left(a_t- \bar{a_t}\right)^2\right]^2} = 3 \\
& \\
E\left(a_{t}^{4}\right) & = 3E\left(a_t^2\right)^2 ~\text{pois}~\bar{a_t}=0 \\
& \\
& = 3E\left(\alpha_{0} + \alpha_{1}a_{t-1}^2+\beta_1\sigma^{2}_{t} \right)^2
\end{split}
\]
que se derivarmos semelhante ao que fizemos para o modelo \(ARCH(m)\), será:
\[
\frac{E\left[a_t^4\right]}{\left[E(a_t^2)\right]^2} = 3\left(\frac{1-\left(\alpha_1+\beta_1\right)^2}{1-\left(\alpha_1+\beta_1\right)^2-2\alpha_1^2}\right) > 3
\]
Consequentemente, similar ao modelo \(ARCH(m)\), a cauda da distribuição de um processo \(GARCH(1,1)\) é mais pesada do que a cauda da distribuição Normal cuja curtose é igual a \(3\).
- VANTAGENS DO MODELO GARCH
Para facilitar o entendimento, suponha que continuamos com um modelo \(GARCH(1,1)\), conforme abaixo.
\[
\begin{aligned}
&&& a_t = \sigma_{t}\epsilon_{t} \\
&&& \sigma_{t}^2 = \alpha_{0} + \alpha_{1}a_{t-1}^2 + \beta_1\sigma_{t-1}^{2}
\end{aligned}
\] Assim, as principais vantagens são:
- Um grande \(a_{t}^2\) ou \(\sigma_{t-1}^2\) gerará um grande \(\sigma_{t}^2\), o que significa que um grande \(a_{t-1}^2\) tende a ser seguido por outro grande \(a_{t}^2\). Isso gera o comportamento de cluster de volatilidade já estudado.
- Os choques do modelo, representados por \(a_t\), tem caudas pesadas
- O modelo fornece uma função paramétrica simples que pode ser usada para descrever a evolução da volatilidade
- ESTIMANDO UM MODELO GARCH
O mesmo procedimento (máxima verossimilhança) para estimar o modelo \(ARCH(m)\) pode ser usado para estimar um modelo \(GARCH(m,n)\), mas a especificação se torna mais complicada. Lembre-se que escrevemos o modelo \(GARCH(m,n)\) como um modelo ARMA e que para este a definição da especificação (ordens do modelo) é feita por meio de critérios de informação.
Assim, utilizaremos a mesma abordagem para os modelos \(GARCH(m,n)\), ou seja, estimamos diversas combinações de \(m\) e \(n\) usando as funções de autocorrelação (FAC) e autocorrelação parcial (FACP). Após isso, escolheremos o modelo com menor AIC e/ou BIC.
No momento que observamos a amostra de dados da nossa série temporal de retornos, o objetivo no processo de otimização da função de verossimilhança é encontrar o vetor de parâmetros \(\boldsymbol{\theta}\) que maximiza tal função. Como exemplo, suponha que temos o modelo \(AR(1)-GARCH(1,1)\) abaixo:
\[
\begin{aligned}
&&& r_{t} = \mu_{t} + a_{t} \\
&&& \mu_{t} = \phi_{0} + \phi_{1}r_{t-1} \\
&&& a_t = \sigma_{t}\epsilon_{t} \\
&&& \sigma_{t}^2 = \alpha_{0} + \alpha_{1}a_{t-1}^2 + \beta_{1}\sigma_{t-1}^{2}
\end{aligned}
\] Com tais informações, a função de verossimilhança após observar a amostra de retornos será:
\[
\begin{aligned}
&&& L(\boldsymbol{\theta}|R) = f(\boldsymbol{\theta}| r_{t},r_{t-1},...,r_{1}|) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma_{t}^{2}}}exp\left\{-\frac{(r_{t}-\mu)^2}{2\sigma_{t}^{2}} \right\}} \\
&&& \\
&&& L(\boldsymbol{\theta}|R) = f(\boldsymbol{\theta}| r_{t},r_{t-1},...,r_{1}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma_{t}^{2}}}exp\left\{-\frac{a_{t}^2}{2\sigma_{t}^{2}} \right\}} \\
&&& \\
&&& L(\boldsymbol{\theta}|R) = f(\boldsymbol{\theta}| r_{t},r_{t-1},...,r_{1}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\left(\alpha_{0} + \alpha_{1}a_{t-1}^2 + \beta_{1}\sigma_{t-1}^{2}\right)}}exp\left\{-\frac{(r_t-\phi_{0} - \phi_{1}r_{t-1})^2}{2\left(\alpha_{0} + \alpha_{1}a_{t-1}^2+ \beta_{1}\sigma_{t-1}^{2}\right)} \right\}} \\
&&& \\
&&& L(\boldsymbol{\theta}|R) = f(\boldsymbol{\theta}| r_{t},r_{t-1},...,r_{1}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\left(\alpha_{0} + \alpha_{1}\left[r_{t-1}-\phi_{0} - \phi_{1}r_{t-2} \right]^2+\beta_{1}\sigma_{t-1}^{2}\right)}}exp\left\{-\frac{(r_t-\phi_{0} - \phi_{1}r_{t-1})^2}{2\left(\alpha_{0} + \alpha_{1}\left[r_{t-1}-\phi_{0} - \phi_{1}r_{t-2} \right]^2 +\beta_{1}\sigma_{t-1}^{2}\right)} \right\}} \\
\end{aligned}
\]
e \(\sigma_{t}^{2}\) pode ser calculado recursivamente dado que assumimos os valores iniciais \(r_0\), \(a_0\) e \(\sigma_0\). Isso permitirá encontrar o vetor de parâmetros \(\boldsymbol{\theta} = \left(\phi_0, \phi_1, \alpha_0, \alpha_1, \beta_1\right)\).
CONSTRUÇÃO DO MODELO DE HETEROCEDASTICIDADE CONDICIONAL
Construir um modelo de volatilidade para o retorno de uma série temporal financeira consiste de 4 passos:
- Especificar a equação para a média condicional (\(\mu_{t}\)):
- Visualizar os dados e identificar observações fora do padrão (outliers ou dados faltantes) e eliminá-las.
- Se necessário, transformar os dados para estabilizar a variância (logaritmo dos dados, variação ou retorno, por exemplo)
- Testar se os dados são estacionários. Caso tenha raiz unitária é preciso diferenciar os dados até se tornarem estacionários. Para isso, testa-se novamente se a série diferenciada se tornou estacionária.
- Examinar as funções de autocorrelação (FAC) e autocorrelação parcial (FACP) para determinar as ordens máximas \(P\) e \(Q\) para os componentes AR e MA da série estacionária (diferenciada, se necessário).
- Estimar todas as combinações para \(p\), \(d\) e \(q\). Aqui, \(d\) será fixo e igual ao número de vezes necessárias para tornar a série original estacionáira. Se não foi preciso diferenciar a série, \(d=0\).
- Escolher dentre todos os modelos estimados no passo anterior, o modelo com menor AIC e/ou BIC.
- Caso a especificação escolhida seja \(ARMA(0,0)\) teremos apenas um parâmetro do tipo \(\phi_{0}\) para a média condicional
- Examinar se os resíduos se comportam como um ruído branco:
- Testar autocorrelação nos resíduos: visualizar a função de autocorrelação (FAC) dos resíduos. Se existem defasagens estatisticamente significante (acima da linha pontilhada), há autocorrelação serial.
- Testar heterocedasticidade condicional: visualizar a função de autocorrelação (FAC) dos resíduos ao quadrado. Se existem defasagens estatisticamente significante (acima da linha pontilhada), há heterocedasticidade condicional. Outra alternativa é o teste LM de Engle (1982).
- Verificar a distribuição de probabilidade assumida no processo de estimação: realizar teste que verifique se os resíduos se comportam de acordo com a distribuição de probabilidade adotada.
- Se os resíduos são bem comportados (ruído branco), obter as previsões apenas com a estimação da média condicional. Caso contrário, revisar os passos anteriores para certificar que foram realizados corretamente. Se mesmo assim existir heterocedasticidade condicional e a distribuição de probabilidade não condiz com a hipótese assumida (geralmente uma distribuição Normal), avançar para o próximo passo e estimar a variância condicional também.
- Especificar um modelo de volatilidade e estimar conjuntamente as equações da média e variância condicional:
- Examinar as funções de autocorrelação (FAC) e autocorrelação parcial (FACP) dos resíduos ao quadrado (obtidos da estimação da média condicional) para determinar as ordens máximas \(M\) e \(N\) para os componentes ARCH e GARCH, respectivamente.
- Examinar o histograma dos resíduos juntamente com a densidade das distribuições Normal e t-Student para determinar qual a melhor distribuição se ajusta aos dados. Outras distribuições de probabilidade também podem ser usadas, tal como a Cauchy. Além disso, você pode usar a versão assimétrica destas distribuições caso perceba assimetria no histograma dos resíduos.
- Estimar todas as combinações para \(m=1,..,M\) e \(n=0,...,N\) para a variância condicional juntamente com a especificação ARMA(p,q) escolhida no passo 1
- Escolher o modelo com menor AIC e/ou BIC
- Verificar o modelo estimado
- Avaliar o gráfico da função de autocorrelação do quadrado dos resíduos padronizados estimados no passo 2. O ideal é que as defasagens não ultrapassem a linha pontilhada.
- Avaliar se as restrições impostas sobre os parâmetros são atendidas
- Testar se os resíduos padronizados se comportam conforme a hipóte de distribuição de probabilidade assumida no passo 2 no momento de estimar conjuntamente a média condicional e a variância condicional.
- Visualizar os resultados
- Gráfico da volatilidade condicional
- Obter as previsões
REFERÊNCIAS
Bollerslev, Tim. 1986. “Generalized Autoregressive Conditional Heteroskedasticity.” Journal of econometrics.
Campbell, John Y, Andrew Wen-Chuan Lo, and Archie Craig MacKinlay. 1997. The Econometrics of Financial Markets. Princeton (NJ) Princeton University Press.
Engle, Robert F. 1982. “Autoregressive Conditional Heteroscedasticity with Estimates of the Variance of United Kingdom Inflation.” Econometrica Journal of the Econometric Society.
Morettin, Pedro Alberto. 2008. Econometria Financeira Um Curso Em Séries Temporais Financeiras. Edgard Blucher.
Tsay, Ruey S. 2010. Analysis of Financial Time Series. John Wiley & Sons.
———. 2014. An Introduction to Analysis of Financial Data with R. John Wiley & Sons.
LS0tCnRpdGxlOiA8Y2VudGVyPiA8aDI+IDxiPiBNb2RlbG9zIEFSQ0ggZSBHQVJDSCA8L2I+IDwvaDI+IDwvY2VudGVyPiAKYXV0aG9yOiA8Y2VudGVyPiBGcmFuayBNYWdhbGjDo2VzIGRlIFBpbmhvIC0gSUJNRUMvTUcgPC9jZW50ZXI+CmdyYXBoaWNzOiB5ZXMKbGlua2NvbG9yOiBibHVlCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgZmlnX2NhcHRpb246IHllcwpyZWZlcmVuY2VzOgotIGlkOiB0c2F5MjAxNGludHJvZHVjdGlvbgogIHRpdGxlOiBBbiBpbnRyb2R1Y3Rpb24gdG8gYW5hbHlzaXMgb2YgZmluYW5jaWFsIGRhdGEgd2l0aCBSCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBUc2F5CiAgICBnaXZlbjogUnVleSBTCiAgcHVibGlzaGVyOiBKb2huIFdpbGV5IFwmIFNvbnMKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMjAxNAotIGlkOiBjYW1wYmVsbDE5OTdlY29ub21ldHJpY3MKICB0aXRsZTogVGhlIGVjb25vbWV0cmljcyBvZiBmaW5hbmNpYWwgbWFya2V0cwogIGF1dGhvcjoKICAtIGZhbWlseTogQ2FtcGJlbGwKICAgIGdpdmVuOiBKb2huIFkKICAtIGZhbWlseTogTG8KICAgIGdpdmVuOiBBbmRyZXcgV2VuLUNodWFuCiAgLSBmYW1pbHk6IE1hY0tpbmxheQogICAgZ2l2ZW46IEFyY2hpZSBDcmFpZwogIHB1Ymxpc2hlcjogUHJpbmNldG9uIChOSikgUHJpbmNldG9uIFVuaXZlcnNpdHkgUHJlc3MKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMTk5NwotIGlkOiBtb3JldHRpbjIwMDhlY29ub21ldHJpYQogIHRpdGxlOiBFY29ub21ldHJpYSBmaW5hbmNlaXJhIHVtIGN1cnNvIGVtIHPDqXJpZXMgdGVtcG9yYWlzIGZpbmFuY2VpcmFzCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBNb3JldHRpbgogICAgZ2l2ZW46IFBlZHJvIEFsYmVydG8KICBwdWJsaXNoZXI6IEVkZ2FyZCBCbHVjaGVyCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMDgKLSBpZDogdHNheTIwMTBhbmFseXNpcwogIHRpdGxlOiBBbmFseXNpcyBvZiBmaW5hbmNpYWwgdGltZSBzZXJpZXMKICBhdXRob3I6CiAgLSBmYW1pbHk6IFRzYXkKICAgIGdpdmVuOiBSdWV5IFMKICBwdWJsaXNoZXI6IEpvaG4gV2lsZXkgXCYgU29ucwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDEwCi0gaWQ6IGVuZ2xlMTk4MmF1dG9yZWdyZXNzaXZlCiAgdGl0bGU6IEF1dG9yZWdyZXNzaXZlIGNvbmRpdGlvbmFsIGhldGVyb3NjZWRhc3RpY2l0eSB3aXRoIGVzdGltYXRlcyBvZiB0aGUgdmFyaWFuY2Ugb2YgVW5pdGVkIEtpbmdkb20gaW5mbGF0aW9uCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBFbmdsZQogICAgZ2l2ZW46IFJvYmVydCBGCiAgcHVibGlzaGVyOiBFY29ub21ldHJpY2EgSm91cm5hbCBvZiB0aGUgRWNvbm9tZXRyaWMgU29jaWV0eQogIHR5cGU6IGFydGljbGUKICBpc3N1ZWQ6CiAgICB5ZWFyOiAxOTgyCi0gaWQ6IGJvbGxlcnNsZXYxOTg2Z2VuZXJhbGl6ZWQKICB0aXRsZTogR2VuZXJhbGl6ZWQgYXV0b3JlZ3Jlc3NpdmUgY29uZGl0aW9uYWwgaGV0ZXJvc2tlZGFzdGljaXR5CiAgYXV0aG9yOgogIC0gZmFtaWx5OiBCb2xsZXJzbGV2CiAgICBnaXZlbjogVGltCiAgcHVibGlzaGVyOiBKb3VybmFsIG9mIGVjb25vbWV0cmljcwogIHR5cGU6IGFydGljbGUKICBpc3N1ZWQ6CiAgICB5ZWFyOiAxOTg2Cm5vY2l0ZTogfCAKICBAdHNheTIwMTRpbnRyb2R1Y3Rpb24sIEBjYW1wYmVsbDE5OTdlY29ub21ldHJpY3MsIEBtb3JldHRpbjIwMDhlY29ub21ldHJpYSwgQHRzYXkyMDEwYW5hbHlzaXMsIEBlbmdsZTE5ODJhdXRvcmVncmVzc2l2ZSwgQGJvbGxlcnNsZXYxOTg2Z2VuZXJhbGl6ZWQKLS0tCgpFc3RlIG1hdGVyaWFsIHRlbSBjb21vIG9iamV0aXZvIGNvbnRyaWJ1aXIgcGFyYSBvIGVudGVuZGltZW50byBzb2JyZSAqKk1vZGVsb3MgZGUgSGV0ZXJvY2VkYXN0aWNpZGFkZSBDb25kaWNpb25hbCoqLiBQYXJhIHRhbnRvLCB2YW1vcyBtb3N0cmFyIGNvbW8gbW9kZWxhciBvIHNlZ3VuZG8gbW9tZW50byBjb25kaWNpb25hbCBkZSB1bWEgc8OpcmllIHRlbXBvcmFsIGUgYXMgZGlmZXJlbsOnYXMgZW50cmUgZG9pcyBkb3MgcHJpbmNpcGFpcyBtb2RlbG9zIGVjb25vbcOpdHJpY29zIGRlIHPDqXJpZXMgdGVtcG9yYWlzIHVuaXZhcmlhZGFzIHBhcmEgZXN0ZSBjYXNvOiAqKk1vZGVsbyBkZSBIZXRlcm9jZWRhc3RpY2lkYWRlIENvbmRpY2lvbmFsIEF1dG9ycmVncmVzc2l2YSAoQVJDSCkqKiBlICoqTW9kZWxvIGRlIEhldGVyb2NlZGFzdGljaWRhZGUgQ29uZGljaW9uYWwgQXV0b3JyZWdyZXNzaXZhIEdlbmVyYWxpemFkbyAoR0FSQ0gpKiouCgojIyMjIyAqKklOVFJPRFXDh8ODTyoqCgpBbnRlcmlvcm1lbnRlLCBlc3R1ZGFtb3MgbW9kZWxvcyBlY29ub23DqXRyaWNvcyBkZSBzw6lyaWVzIHRlbXBvcmFpcyB1bml2YXJpYWRhcyBxdWUgc2UgcHJlb2N1cGF2YW0gYXBlbmFzIGNvbSBvIHByaW1laXJvIG1vbWVudG8gY29uZGljaW9uYWwgZGEgc8OpcmllLiBQYXJhIG8gY2FzbyBkYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zIGRlIHVtIGF0aXZvIGZpbmFuY2Vpcm8sIG5vc3NvIG9iamV0aXZvIGVyYSBtb2RlbGFyIGEgbcOpZGlhIGNvbmRpY2lvbmFsLCBvdSBzZWphLCBvIHZhbG9yIGVzcGVyYWRvIGRvIHJldG9ybm8uIENvbnR1ZG8sIHNhYmVtb3MgcXVlIGEgc8OpcmllIHRlbXBvcmFsIGRvcyByZXRvcm5vcyBhcHJlc2VudGEgW2ZhdG9zIGVzdGlsaXphZG9zXShbbGlua10oaHR0cHM6Ly9ycHVicy5jb20vaHVkc29uY2hhdnMvdGltZXNlcmllczEpKSBvIHF1ZSBpbXBsaWNhIHF1ZSBhIHZhcmnDom5jaWEgZG9zIHJldG9ybm9zIHRlbmRlbSBhIG11ZGFyIGFvIGxvbmdvIGRvIHRlbXBvLCBmYXplbmRvIGNvbSBxdWUgZmF0b3JlcyB0YWlzIGNvbW8gcmlzY28gZSBpbmNlcnRlemEgdGFtYsOpbSBvc2NpbGVtLiAKCkVzdGVzIGZhdG9yZXMgdMOqbSBncmFuZGUgaW1wb3J0w6JuY2lhIHBhcmEgYSB0b21hZGEgZGUgZGVjaXPDo28gZGUgY29tcHJhIGUgdmVuZGEgZGUgYXRpdm9zIGUgbmEgbW9udGFnZW0gZGUgdW1hIGNhcnRlaXJhIGRlIGludmVzdGltZW50b3MgY29tbyBtb3N0cmFkbyBwZWxhIFt0ZW9yaWEgbW9kZXJuYSBkbyBwb3J0ZsOzbGlvXShodHRwczovL3d3dy5jYXNoY293Y291cGxlLmNvbS93aGF0LWlzLW1vZGVybi1wb3J0Zm9saW8tdGhlb3J5LykuIE5lc3RlIHNlbnRpZG8sIHTDqWNuaWNhcyBlY29ub23DqXRyaWNhcyBkZSBzw6lyaWVzIHRlbXBvcmFpcyBmb3JhbSBkZXNlbnZvbHZpZGFzIGZ1bmRhbWVudGFuZG8tc2UgbmEgZXN0aW1hw6fDo28gZGEgdmFyacOibmNpYSBjb25kaWNpb25hbCBhbyBpbnbDqXMgZGUgY29uc2lkZXLDoS1sYSBjb25zdGFudGUgYW8gbG9uZ28gZG8gdGVtcG8gY29tbyBmaXplbW9zIGFudGVyaW9ybWVudGUgcGFyYSBvcyBtb2RlbG9zICRBUihwKSQsICRNQShxKSQsICRBUk1BKHAscSkkLCAkQVJJTUEocCxkLHEpJCBlICRTQVJJTUEocCxkLHEpKFAsRCxRKV9zJC4gCgpBbyBsb25nbyBkbyB0ZXh0bywgdmFtb3MgbW9zdHJhciB1bWEgYnJldmUgZGVzY3Jpw6fDo28gZG8gY29uY2VpdG8gZGUgdm9sYXRpbGlkYWRlIGRlIGF0aXZvcyBmaW5hbmNlaXJvcyBiZW0gY29tbyBzdWFzIGNhcmFjdGVyw61zdGljYXMuIEFsw6ltIGRpc3NvLCB2YW1vcyBlc3R1ZGFyIG8gTW9kZWxvIGRlIEhldGVyb2NlZGFzdGljaWRhZGUgQ29uZGljaW9uYWwgQXV0b3JyZWdyZXNzaXZhIChBUkNIKSBwcm9wb3N0byBwb3IgQGVuZ2xlMTk4MmF1dG9yZWdyZXNzaXZlIGUgbyBNb2RlbG8gSGV0ZXJvY2VkYXN0aWNpZGFkZSBDb25kaWNpb25hbCBBdXRvcnJlZ3Jlc3NpdmEgR2VuZXJhbGl6YWRvIGRlIEBib2xsZXJzbGV2MTk4NmdlbmVyYWxpemVkLgoKIyMjIyMgKipWT0xBVElMSURBREUgRSBTVUFTIENBUkFDVEVSw41TVElDQVMqKgoKVW1hIGNhcmFjdGVyw61zdGljYSBpbXBvcnRhbnRlIGRhIHZvbGF0aWxpZGFkZSBkZSB1bSBhdGl2byBmaW5hbmNlaXJvIMOpIHF1ZSBlbGEgbsOjbyDDqSBvYnNlcnZhZGEgZGlyZXRhbWVudGUuIFBvciBleGVtcGxvLCBjb25zaWRlcmUgbyBsb2dhcml0bW8gZG9zIHJldG9ybm9zIGRpw6FyaW9zIGRlIHVtYSBhw6fDo28gcXVhbHF1ZXIuIEEgdm9sYXRpbGlkYWRlIGRpw6FyaWEgZGVzdGEgYcOnw6NvIG7Do28gw6kgZGlyZXRhbWVudGUgb2JzZXJ2w6F2ZWwgZGFkbyBxdWUgdGVtb3MgYXBlbmFzIHVtYSBvYnNlcnZhw6fDo28gZG8gcmV0b3JubyBkYSBhw6fDo28gZHVyYW50ZSBvIGRpYS4gCgpWb2PDqiBwb2RlcmlhIHBlbnNhciBlbSB1c2FyIGRhZG9zIGludHJhZGnDoXJpb3MgcGFyYSBlc3RpbWFyIGEgdm9sYXRpbGlkYWRlIGRpw6FyaWEsIG1hcyBtZXNtbyBhc3NpbSB0ZXJpYSB1bWEgZXN0aW1hdGl2YSBkYSB2b2xhdGlsaWRhZGUgZSBuw6NvIGEgb2JzZXJ2YcOnw6NvIGRhIHJlYWwgdm9sYXRpbGlkYWRlLiBFbWJvcmEgYSB2b2xhdGlsaWRhZGUgbsOjbyBzZWphIG9ic2VydsOhdmVsLCBlbGEgdGVtIGFsZ3VtYXMgY2FyYWN0ZXLDrXN0aWNhcyBxdWUgc8OjbyBjb211bWVudGUgdmlzdGFzIGVtIHJldG9ybm9zIGRlIGF0aXZvcyBmaW5hbmNlaXJvczoKCiogRXhpc3RlbSBjbHVzdGVycyBkZSB2b2xhdGlsaWRhZGU6IGVsYSBwb2RlIHNlciBtYWlvciBlbSBjZXJ0b3MgcGVyw61vZG9zIGUgYmFpeGEgZW0gb3V0cm9zOwoqIEEgdm9sYXRpbGlkYWRlIHNlIGRlbnNlbnZvbHZlIGNvbnRpbnVhbWVudGUgYW8gbG9uZ28gZG8gdGVtcG86IHNhbHRvcyBkZSB2b2xhdGlsaWRhZGUgc8OjbyByYXJvcwoqIEEgdm9sYXRpbGlkYWRlIG7Do28gZGl2ZXJnZSBwYXJhIG8gaW5maW5pdG86IGVsYSBvc2NpbGEgZW0gdG9ybm8gZGUgdW0gaW50ZXJ2YWxvIGZpeG8gKGVzdGF0aXN0aWNhbWVudGUgZmFsYW5kbywgaXNzbyBzaWduaWZpY2EgcXVlIGEgdm9sYXRpbGlkYWRlIMOpIGVzdGFjaW9uw6FyaWEpCiogQSB2b2xhdGlsaWRhZGUgcmVhZ2UgZGUgZm9ybWEgZGlmZXJlbnRlIGEgdW0gZ3JhbmRlIGF1bWVudG8gbm9zIHByZcOnb3MgZG8gcXVlIHVtYSBncmFuZGUgcXVlZGEgbm9zIHByZcOnb3MuIAoKQWJhaXhvLCBhbGd1bnMgZ3LDoWZpY29zIGRvIMOtbmRpY2UgSUJPVkVTUEEgcXVlIHBvZGVtIGFqdWRhciBubyBlbnRlbmRpbWVudG8gZGFzIGNhcmFjdGVyw61zdGljYXMgZGEgdm9sYXRpbGlkYWRlLiBQYXJhIG8gY2FzbyBkZSBjbHVzdGVycywgb2JzZXJ2ZSBxdWUgaMOhIHBlcsOtb2RvcyBkZSBncmFuZGUgdm9sYXRpbGlkYWRlIG5hIHPDqXJpZSAoZW50cmUgJDIwMDgkIGUgJDIwMDkkKSBlbnF1YW50byBub3MgZGVtYWlzIHBlcsOtb2RvcyBhIHZvbGF0aWxpZGFkZSBzZSBtYW50ZXZlLiAKCk91dHJhIGNhcmFjdGVyw61zdGljYSBpbXBvcnRhbnRlIMOpIHF1ZSBleGlzdGUgdW1hIHRlbmTDqm5jaWEgZGUgbXVkYW7Dp2FzIG5vcyBwcmXDp29zIGRlIHVtIGF0aXZvIGZpbmFuY2Vpcm9zIHNlcmVtIG5lZ2F0aXZhbWVudGUgY29ycmVsYWNpb25hZGFzIGNvbSBtdWRhbsOnYXMgbmEgdm9sYXRpbGlkYWRlIGRvIGF0aXZvLiBJc3NvIHRhbWLDqW0gZmljYSBldmlkZW50ZSBhbyBvYnNlcnZhcm1vcyBvcyBncsOhZmljb3MgZG8gw61uZGljZSBJQk9WRVNQQSBlIHNldXMgcmV0b3Jub3MgKG8gcGVyw61vZG8gZGUgbWFpb3Igdm9sYXRpbGlkYWRlIGVzdMOhIGFzc29jaWFkbyBjb20gbyBwZXLDrW9kbyBkZSBtZW5vciBjb3Rhw6fDo28gZG8gw61uZGljZSwgcG9yIHZvbHRhIGRlIDIwMDkpLiAKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUocXVhbnRtb2QpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoRFQpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoZHBseXIpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUobWFncml0dHIpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoaGlnaGNoYXJ0ZXIpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoUGVyZm9ybWFuY2VBbmFseXRpY3MpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoaHRtbHRvb2xzKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGZHYXJjaCkpCgpib3Zlc3BhX2RheSA8LSBxdWFudG1vZDo6Z2V0U3ltYm9scygiXkJWU1AiLCBzcmMgPSAieWFob28iLCBhdXRvLmFzc2lnbj1GQUxTRSkKYm92ZXNwYV9sb2dfZGF5X3JldHVybiA8LSBQZXJmb3JtYW5jZUFuYWx5dGljczo6UmV0dXJuLmNhbGN1bGF0ZShib3Zlc3BhX2RheSRCVlNQLkNsb3NlLCBtZXRob2QgPSAibG9nIikKYm92ZXNwYV9sb2dfZGF5X3JldHVybl9zcXVhZCA8LSBib3Zlc3BhX2xvZ19kYXlfcmV0dXJuXjIKCmhjIDwtIGhpZ2hjaGFydCh0eXBlID0gInN0b2NrIikgJT4lIAogIGhjX3RpdGxlKHRleHQgPSAiw41uZGljZSBJQk9WRVNQQSIpICU+JSAKICBoY19zdWJ0aXRsZSh0ZXh0ID0gIkRhZG9zIGV4dHJhw61kb3MgdXNhbmRvIG8gcGFjb3RlIHF1YW50bW9kIGRvIFIiKSAlPiUgCiAgaGNfYWRkX3NlcmllcyhuYW1lID0gIsOtbmRpY2UiLCBib3Zlc3BhX2RheSRCVlNQLkNsb3NlLCBpZCA9ICJ0cyIsIGNvbG9yID0gImdyZWVuIikKCmhjMCA8LSBoaWdoY2hhcnQodHlwZSA9ICJzdG9jayIpICU+JSAKICBoY190aXRsZSh0ZXh0ID0gIkxvZ2FyaXRtbyBkb3MgcmV0b3Jub3MgZG8gSUJPVkVTUEEiKSAlPiUgCiAgaGNfc3VidGl0bGUodGV4dCA9ICJEYWRvcyBleHRyYcOtZG9zIHVzYW5kbyBvIHBhY290ZSBxdWFudG1vZCBkbyBSIikgJT4lIAogIGhjX2FkZF9zZXJpZXMobmFtZSA9ICJsb2dhcml0bW8gZG9zIHJldG9ybm9zIiwgYm92ZXNwYV9sb2dfZGF5X3JldHVybiwgaWQgPSAidHMiLCBjb2xvciA9ICJibHVlIikKCgpoYzEgPC0gaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUgCiAgaGNfdGl0bGUodGV4dCA9ICJRdWFkcmFkbyBkbyBsb2dhcml0bW8gZG9zIHJldG9ybm9zIGRvIElCT1ZFU1BBIikgJT4lIAogIGhjX3N1YnRpdGxlKHRleHQgPSAiRGFkb3MgZXh0cmHDrWRvcyB1c2FuZG8gbyBwYWNvdGUgcXVhbnRtb2QgZG8gUiIpICU+JSAKICBoY19hZGRfc2VyaWVzKG5hbWUgPSAibG9nYXJpdG1vIGRvcyByZXRvcm5vcyBhbyBxdWFkcmFkbyIsIGJvdmVzcGFfbG9nX2RheV9yZXR1cm5fc3F1YWQsIGlkID0gInRzIiwgY29sb3IgPSAiYmxhY2siKQoKCmxzdCA8LSBsaXN0KGhjLGhjMCxoYzEpCgpod19ncmlkKGxzdCwgbmNvbCA9IDEsIHJvd2hlaWdodCA9IDUwMCkgICU+JSBicm93c2FibGUoKQpgYGAKCkFsw6ltIGRpc3NvLCBvYnNlcnZlIGEgcmVsYcOnw6NvIGVudHJlIG9zIHRyw6pzIGdyw6FmaWNvcyBhY2ltYS4gTyBwZXLDrW9kbyBkZSBtYWlvciB2b2xhdGlsaWRhZGUgZXN0w6EgYXNzb2NpYWRvIGNvbSBtZW5vciBjb3Rhw6fDo28gZG8gw61uZGljZSAoY29tbyBqw6EgY29tZW50YWRvKSBlIHRhbWLDqW0gY29tIG1haW9yIHJldG9ybm8gYW8gcXVhZHJhZG8uIElzc28gbm9zIGNvbmZpcm1hIHF1ZSB1c2FyIG9zIHJldG9ybm9zIGFvIHF1YWRyYWRvIGNvbW8gdW1hICpwcm94eSogcGFyYSB2ZXJpZmljYXIgYSBleGlzdMOqbmNpYSBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsIMOpIGp1c3RpZmljw6F2ZWwgZGFkYSBhIHJlbGHDp8OjbyBlbnRyZSBlc3RhIHZhcmnDoXZlbCBlIGEgdm9sYXRpbGlkYWRlIGRlIHVtIGF0aXZvIGZpbmFuY2Vpcm8uIAoKUG9yIGZpbSwgbW9zdHJhbW9zIGFiYWl4byBvcyBncsOhZmljb3MgZGEgZGVuc2lkYWRlIGRvcyByZXRvcm5vcyBkbyBJQk9WRVNQQSBjb21wYXJhbmRvIGNvbSBhIGRpc3RyaWJ1acOnw6NvIE5vcm1hbCBiZW0gY29tbyBhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gKEZBQykgcGFyYSBvcyByZXRvcm5vcyBub3JtYWlzIGUgcmV0b3Jub3MgZWxldmFkbyBhbyBxdWFkcmFkby4gCgrDiSBwb3Nzw612ZWwgY29uZmlybWFyLCBjb25mb3JtZSBlc3BlcmFkbywgcXVlIGEgYXV0b2NvcnJlbGHDp8OjbyBlbnRyZSBvcyByZXRvcm5vcyDDqSBwcmF0aWNhbWVudGUgbnVsYSwgbWFzIHBhcmEgb3MgcmV0b3Jub3MgYW8gcXVhZHJhZG8gZWxhIGZpY2EgZXZpZGVudGUgbyBxdWUgbm9zIG1vc3RyYSBjZXJ0YSBkZXBlbmTDqm5jaWEgZW50cmUgb3MgcmV0b3Jub3MuIEFsw6ltIGRpc3NvLCBhbyBjb21wYXJhcm1vcyBhIGRlbnNpZGFkZSBkb3MgcmV0b3Jub3MgY29tIGEgZGVuc2lkYWRlIGRlIHVtYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwgcGVyY2ViZW1vcyBhIGRpZmVyZW7Dp2EgZW50cmUgZWxhcy4gSXNzbyDDqSBvY2FzaW9uYWRvIHByaW5jaXBhbG1lbnRlIHBlbG9zIGZhdG9zIGVzdGlsaXphZG9zIGrDoSBkb2N1bWVudGFtb3MgYW50ZXJpb3JtZW50ZS4KCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9N30KIyBGdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIGRvIGxvZ2FyaXRtbyBkb3MgcmV0b3Jub3MgZSBzZXUgcXVhZHJhZG8KYWNmX2xvZ19yZXR1cm5zIDwtIHN0YXRzOjphY2YoYm92ZXNwYV9sb2dfZGF5X3JldHVybiwgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMjApCmFjZl9sb2dfcmV0dXJuc19zcXVhZCA8LSBzdGF0czo6YWNmKGJvdmVzcGFfbG9nX2RheV9yZXR1cm5fc3F1YWQsIG5hLmFjdGlvbiA9IG5hLnBhc3MsIHBsb3QgPSBGQUxTRSwgbGFnLm1heCA9IDIwKQoKCmxheW91dChtYXRyaXgoYygxLDEsMiwzKSwgMiwgMiwgYnlyb3cgPSBUUlVFKSkKCiMgZ3LDoWZpY28gZG8gaGlzdG9ncmFtYSBkb3MgcmV0b3Jub3MgZSBjb21wYXJhdGl2byBkZSBkZW5zaWRhZGUgCmhpc3QoYm92ZXNwYV9sb2dfZGF5X3JldHVybiwgcHJvYmFiaWxpdHkgPSBUUlVFLCBtYWluID0gIkhpc3RvZ3JhbWEgZG9zIHJldG9ybm9zIGUgZGVuc2lkYWRlIGRhIE5vcm1hbCIsIHhsYWIgPSAiIiwgeWxhYiA9ICIiLCB5bGltID0gYygwLCAzMikpCmQgPC0gZGVuc2l0eShib3Zlc3BhX2xvZ19kYXlfcmV0dXJuLCBrZXJuZWwgPSAiZ2F1c3NpYW4iLCBuYS5ybSA9IFRSVUUpCmxpbmVzKGQsIGNvbCA9ICJyZWQiKQoKIyBHcsOhZmljbyBkYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvLgpwbG90KGFjZl9sb2dfcmV0dXJucywgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZBQyBkbyBsb2cgZG9zIHJldG9ybm9zIiwgYWRqID0gMC41LCBsaW5lID0gMSkKcGxvdChhY2ZfbG9nX3JldHVybnNfc3F1YWQsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGQUMgZG8gcXVhZHJhZG8gZG8gbG9nIGRvcyByZXRvcm5vcyIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCmBgYAoKIyMjIyMgKipFU1RSVVRVUkEgREUgVU0gTU9ERUxPIERFIEhFVEVST0NFREFTVElDSURBREUgQ09ORElDSU9OQUwqKgoKQ29tbyBtb3N0cmFtb3MgYW50ZXJpb3JtZW50ZSwgdW1hIGRhcyBwcmluY2lwYWlzIGNhcmFjdGVyw61zdGljYXMgZGUgc8OpcmllcyB0ZW1wb3JhaXMgZmluYW5jZWlyYXMsIGVtIHBhcnRpY3VsYXIgbyByZXRvcm5vIGRlIGF0aXZvcywgw6kgYSBleGlzdMOqbmNpYSBkZSBjbHVzdGVycyBkZSB2b2xhdGlsaWRhZGUuIElzdG8gc2lnbmlmaWNhIHF1ZSByZXRvcm5vcyBuw6NvIG11aXRvIGxvbmdlIHVtIGRvIG91dHJvIG5vIHRlbXBvIHRlbmRlbSBhIHRlciBuw612ZWlzIGRlIHZvbGF0aWxpZGFkZSBzZW1lbGhhbnRlcy4gUG9ydGFudG8sICJib25zIiBtb2RlbG9zIGRldmVyaWFtIGluY29ycG9yYXIgZXN0YSBjYXJhY3RlcsOtc3RpY2EgZW0gc3VhIGVzdHJ1dHVyYSwgcG9pcyBpbmZvcm1hw6fDtWVzIHZhbGlvc2FzIHBvZGVyaWFtIHNlciBkZXNwZXJkacOnYWRhcyBlIG9zIG1vZGVsb3Mgc2VyaWFtIGluY2FwYXplcyBkZSBkZXRlY3RhciBzYXRpc2ZhdG9yaWFtZW50ZSBhcyBtdWRhbsOnYXMgZGUgdm9sYXRpbGlkYWRlIGFvIGxvbmdvIGRvIHRlbXBvLiAKClBhcmEgY29sb2NhciB1bSBtb2RlbG8gcXVlIHNlIHByZW9jdXBlIGNvbSBhIHZvbGF0aWxpZGFkZSBlbSB1bWEgcGVyc3BlY3RpdmEgYWRlcXVhZGEsIHN1cG9uaGEgcXVlICRyX3t0fSQgw6kgbyBsb2dhcml0bW8gZG8gcmV0b3JubyBkZSB1bSBhdGl2byBmaW5hbmNlaXJvIGVtICR0JC4gQSBpZMOpaWEgYsOhc2ljYSBwb3IgdHLDoXMgZGVzdGVzIG1vZGVsb3Mgw6kgcXVlIGEgc8OpcmllICRcbGVmdFx7ICByX3t0fVxyaWdodFx9X3t0PTF9Xnt0fSQgw6kgbsOjbyBhdXRvY29ycmVsYWNpb25hZGEgb3UgY29tIGNvcnJlbGHDp8OjbyBlbSBvcmRlbnMgbWVub3JlcywgbWFzIGVsYSDDqSBkZXBlbmRlbnRlLiBTdXBvbmhhIHF1ZSBhIG3DqWRpYSBjb25kaWNpb25hbCBlIHZhcmnDom5jaWEgY29uZGljaW9uYWwgZGUgJHJfe3R9JCBzw6NvIGRhZGFzIHBvcjoKCiQkClxiZWdpbnthbGlnbmVkfQomJiYgXG11X3t0fSA9IEVcbGVmdChyX3t0fXxGX3t0LTF9XHJpZ2h0KSBcXAomJiYgXHNpZ21hX3t0fV57Mn0gPSBWYXJcbGVmdChyX3t0fXxGX3t0LTF9XHJpZ2h0KT1FW1xsZWZ0KHJfe3R9LVxtdV97dH1ccmlnaHQpXjIgfEZfe3QtMX1dIApcZW5ke2FsaWduZWR9CiQkCgpvbmRlICRGX3t0LTF9JCByZXByZXNlbnRhIGFzIGluZm9ybWHDp8O1ZXMgZGlzcG9uw612ZWlzIGF0w6kgJHQtMSQuCgpQYXJhIGEgZXF1YcOnw6NvIGRhIG3DqWRpYSBjb25kaWNpb25hbCBhY2ltYSwgcG9kZXLDrWFtb3MgYXNzdW1pciBxdWUgJHJfe3R9JCBzZWd1ZSB1bSBtb2RlbG8gJEFSTUEocCxxKSQsIGNvbW8gc2VndWU6CgokJApcYmVnaW57YWxpZ25lZH0KJiYmIHJfe3R9ID0gXG11X3t0fSArIGFfe3R9IFxcCiYmJiBcbXVfe3R9ID0gXHBoaV97MH0gKyBcc3VtX3tpPTF9XntwfXtccGhpX3tpfXJfe3QtaX19ICsgXHN1bV97aj0xfV57cX17XHRoZXRhX3tqfWFfe3Qtan19ClxlbmR7YWxpZ25lZH0KJCQKb25kZSAkcCQgZSAkcSQgc8OjbyBhcyBvcmRlbnMgZGEgcGFydGUgYXV0b3JyZWdyZXNzaXZhIGUgZGUgbcOpZGlhcyBtw7N2ZWlzLCByZXNwZWN0aXZhbWVudGUuIEFsw6ltIGRhIHBhcnRlIEFSTUEgZGUgJFxtdV97dH0kLCBwb2RlcsOtYW1vcyBhZGljaW9uYXIgdmFyacOhdmVpcyBleHBsaWNhdGl2YXMgbmEgZXF1YcOnw6NvIGRhIG3DqWRpYSBjb25kaWNpb25hbCBlIHVzYXIgdW0gbW9kZWxvIGRlIHJlZ3Jlc3PDo28gbGluZWFyIGNvbSBlcnJvcyBzZSBjb21wb3J0YW5kbyBjb21vIHVtYSBzw6lyaWUgdGVtcG9yYWwgcGFyYSBjYXB0dXJhciBvIGNvbXBvcnRhbWVudG8gZGUgJFxtdV97dH0kLiBOZXN0ZSBjYXNvLCAkXG11X3t0fSQgc2VyaWE6CgokJApcYmVnaW57YWxpZ25lZH0KJiYmIFxtdV97dH0gPSBccGhpX3swfSArIFxzdW1fe2k9MX1ee2t9e1xiZXRhX3tpfXhfe2l0fX0gKyBcc3VtX3tpPTF9XntwfXtccGhpX3tpfXJfe3QtaX19ICsgXHN1bV97aj0xfV57cX17XHRoZXRhX3tqfWFfe3Qtan19ClxlbmR7YWxpZ25lZH0KJCQKUG9yIGV4ZW1wbG8sIHBvZGVyw61hbW9zIHVzYXIgdW1hIHZhcmnDoXZlbCAqZHVtbXkqIHBhcmEgYXMgc2VndW5kYXMtZmVpcmFzIGUgZXN0dWRhciBvIGVmZWl0byBkbyBmaW5hbCBkZSBzZW1hbmEgc29icmUgcmV0b3Jub3MgZGnDoXJpb3MgZGUgdW0gYXRpdm8gcXVhbHF1ZXIuIENvbWJpbmFuZG8gYSBlcXVhw6fDo28gZGEgbcOpZGlhIGNvbmRpY2lvbmFsIGNvbSBhIHZhcmnDom5jaWEgY29uZGljaW9uYWwsIHRlbW9zOgoKJCQKXGJlZ2lue2FsaWduZWR9CiYmJiBcc2lnbWFfe3R9XnsyfSA9IFZhclxsZWZ0KHJfe3R9fEZfe3QtMX1ccmlnaHQpID0gVmFyXGxlZnQoYV97dH18Rl97dC0xfVxyaWdodCkKXGVuZHthbGlnbmVkfQokJAoKT3MgbW9kZWxvcyBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsIGVzdHVkYWRvcyBhcXVpIGVzdMOjbyBwcmVvY3VwYWRvcyBjb20gYSBldm9sdcOnw6NvIGRlICRcc2lnbWFfe3R9XnsyfSQuIEEgbWFuZWlyYSBwZWxhIHF1YWwgJFxzaWdtYV97dH1eezJ9JCBldm9sdWkgYW8gbG9uZ28gZG8gdGVtcG8gZGlzdGluZ3VlIHVtIG1vZGVsbyBkbyBvdXRyby4gCgojIyMjIyAqKlRFU1RFIFBBUkEgVkVSSUZJQ0FSIEhFVEVST0NFREFTVElDSURBREUgQ09ORElDSU9OQUwgQVVUT1JSRUdSRVNTSVZBIChFRkVJVE8gQVJDSCkqKgoKU3Vwb25oYSBxdWUgJGFfdD1yX3QgLSBcbXVfdCQgc2VqYSBvcyByZXPDrWR1b3MgZGEgZXF1YcOnw6NvIGRhIG3DqWRpYSBjb25kaWNpb25hbC4gQSBzw6lyaWUgYW8gcXVhZHJhZG8sICRhX3ReMiQsIMOpIGVudMOjbyB1c2FkYSBwYXJhIHZlcmlmaWNhciBhIHByZXNlbsOnYSBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsLCBxdWUgY2hhbWFtb3MgZGUgZWZlaXRvIEFSQ0guIFRlbW9zIGRvaXMgdGVzdGVzIHBvc3PDrXZlaXMuIE8gcHJpbWVpcm8gZGVsZXMgw6kgbyB1c3VhbCB0ZXN0ZSAkUVxsZWZ0KG1ccmlnaHQpJCBkYSBzw6lyaWUgJFxsZWZ0XHthX3ReMlxyaWdodFx9X3t0PTF9Xnt0fSQuIEEgaGlww7N0ZXNlIG51bGEgZGVzdGUgdGVzdGUgw6kgcXVlIGFzIHByaW1laXJhcyAkbSQgZGVmYXNhZ2VucyBkYSBGQUMgZGEgc8OpcmllIHPDo28gemVyby4gQSBmb3JtYSBtYWlzIGbDoWNpbCBkZSB2ZXJpZmljYXIgaXN0byDDqSBjcmlhbmRvIG8gZ3LDoWZpY28gZGEgRkFDIGRlc3RhIHPDqXJpZS4gU2UgcXVhbHF1ZXIgZGVmYXNhZ2VtIGEgcGFydGlyIGRlICQxJCBmb3IgZXN0YXRpc3RpY2FtZW50ZSBzaWduaWZpY2FudGUgKGFjaW1hIGRhIGxpbmhhIHBvbnRpbGhhZGEpLCBow6EgaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbCBlbSAkYV90XjIkLgoKT3V0cm8gdGVzdGUgcG9zc8OtdmVsIMOpIG8gdGVzdGUgZGUgbXVsdGlwbGljYWRvciBkZSBMYWdyYW5nZSAoTE0pIGRlIEBlbmdsZTE5ODJhdXRvcmVncmVzc2l2ZS4gRXN0ZSB0ZXN0ZSDDqSBlcXVpdmFsZW50ZSBhbyB1c3VhbCB0ZXN0ZSAkRiQgcGFyYSB0ZXN0YXIgc2UgJFxhbHBoYV97aX09MCQsIHBhcmEgJGk9MSwuLi4sbSQgbmEgc2VndWludGUgcmVncmVzc8OjbyBsaW5lYXI6CgokJAphX3t0fV57Mn0gPSBcYWxwaGFfezB9ICsgXGFscGhhX3sxfWFfe3QtMX1eezJ9Ky4uLitcYWxwaGFfe219YV97dC1tfV57Mn0gKyBlX3R+XHRleHR7O31+fnQ9bSsxLC4uLixUCiQkCm9uZGUgJGVfdCQgZGVub3RhIG8gdGVybW8gZGUgZXJybywgJG0kIMOpIHVtIG7Dum1lcm8gaW50ZWlybyBlIHBvc2l0aXZvIGUgJFQkIG8gdGFtYW5obyBkYSBhbW9zdHJhLiBFc3BlY2lmaWNhbWVudGUsIHRlbW9zIGFzIHNlZ3VpbnRlcyBoaXDDs3Rlc2VzOgoKJCQKXGJlZ2lue2FsaWduZWR9CiYmJiBIX3swfTogXGFscGhhXzE9Li4uPVxhbHBoYV9tPTBcXAomJiYgSF97MX06IFxhbHBoYV9pIFxuZXEgMCB+XHRleHR7cGFyYSBhbGd1bX1+aX5cdGV4dHtlbnRyZX1+MX5cdGV4dHtlfX5tXFwKXGVuZHthbGlnbmVkfQokJApBc3NpbSwgc2UgbyBwLXZhbG9yIGRvIHRlc3RlIHBhcmEgYWxndW1hIGRlZmFzYWdlbSBxdWFscXVlciAoJGkkKSBmb3IgbWVub3IgcXVlICQwLjA1JCwgZGl6ZW1vcyBxdWUgYW8gbsOtdmVsIGRlIHNpZ25pZmljw6JuY2lhIGRlICQ1XCUkIHBvZGVtb3MgcmVqZWl0YXIgYSBoaXDDs3Rlc2UgbnVsYS4gVGFsIHJlc3VsdGFkbyBjb25maXJtYSBhIGV4aXN0w6puY2lhIGRlIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwgZW0gJGFfdF4yJC4KCiMjIyMjICoqTU9ERUxPIERFIEhFVEVST0NFREFTVElDSURBREUgQ09ORElDSU9OQUwgQVVUT1JSRUdSRVNTSVZBIChBUkNIKSoqCgpPIHByaW1laXJvIG1vZGVsbyBhIGZvcm5lY2VyIHVtYSBhYm9yZGFnZW0gc2lzdGVtw6F0aWNhIHBhcmEgbW9kZWxhciBhIHZvbGF0aWxpZGFkZSDDqSBvIG1vZGVsbyBBUkNIIGRlIEBlbmdsZTE5ODJhdXRvcmVncmVzc2l2ZS4gQSBpZGVpYSBiw6FzaWNhIGRvIG1vZGVsbyBBUkNIIMOpIHF1ZSBvIHRlcm1vIGRlIGVycm8gJGFfdCQgZG9zIHJldG9ybm9zIGRlIHVtIGF0aXZvIGZpbmFuY2Vpcm8gbsOjbyDDqSBhdXRvY29ycmVsYWNpb25hZG8sIG1hcyBkZXBlbmRlbnRlIGRvIHRlbXBvIGUgZXN0YSBkZXBlbmTDqm5jaWEgZGUgJGFfdCQgcG9kZSBzZXIgZGVzY3JpdGEgY29tbyB1bWEgZnVuw6fDo28gcXVhZHLDoXRpY2EgZGUgc2V1cyB2YWxvcmVzIHBhc3NhZG9zLiBFc3BlY2lmaWNhbWVudGUsIHVtIG1vZGVsbyAkQVJDSChtKSQgYXNzdW1lIHF1ZToKCiQkClxiZWdpbnthbGlnbmVkfQomJiYgYV97dH09XHNpZ21hX3RcZXBzaWxvbl90IFxcCiYmJiBcc2lnbWFfe3R9XnsyfSA9IFxhbHBoYV97MH0gKyBcYWxwaGFfezF9YV97dC0xfV57Mn0rLi4uK1xhbHBoYV97bX1hX3t0LW19XnsyfQpcZW5ke2FsaWduZWR9CiQkCgpvbmRlICRcbGVmdFx7XGVwc2lsb25fdCBccmlnaHRcfV97dD0xfV57dH0kIMOpIHVtYSBzZXF1w6puY2lhIGRlIHZhcmnDoXZlaXMgYWxlYXTDs3JpYXMgaW5kZXBlbmRlbnRlIGUgaWRlbnRpY2FtZW50ZSBkaXN0cmlidcOtZGFzIChpaWQpIGNvbSBtw6lkaWEgJDAkIGUgdmFyacOibmNpYSAkMSQsICRcYWxwaGFfezB9PjAkIGUgJFxhbHBoYV97aX1cZ2VxIDAkIHBhcmEgJGk+MCQuIE9zIGNvZWZpY2llbnRlcyAkXGFscGhhX2kkIGRldmVtIHNhdGlzZmF6ZXIgYWxndW1hcyBjb25kacOnw7VlcyBwYXJhIGdhcmFudGlyIHF1ZSBhIHZhcmnDom5jaWEgaW5jb25kaWNpb25hbCBkZSAkYV97dH0kIHNlamEgZmluaXRhLiBOYSBwcsOhdGljYSwgcG9kZW1vcyBhc3N1bWlyIHF1ZSAkXGVwc2lsb25fdCQgc2VndWUgdW1hIGRpc3RyaWJ1acOnw6NvIE5vcm1hbCBvdSB0LVN0dWRlbnQuIEVtIGFsZ3VtYXMgYXBsaWNhw6fDtWVzLCBwb2RlbW9zIHVzYXIgdGFtYsOpbSBkaXN0cmlidWnDp8O1ZXMgYXNzaW3DqXRyaWNhcyBwYXJhICRcZXBzaWxvbl90JC4KCkEgcGFydGlyIGRhIGVzdHJ1dHVyYSBkbyBtb2RlbG8gcG9kZW1vcyBwZXJjZWJlciBxdWUgdW0gZ3JhbmRlIGNob3F1ZSBhbyBxdWFkcmFkbyAoJFxsZWZ0XHthX3t0LWl9XjIgXHJpZ2h0XH1fe2k9MX1ee219JCkgbGV2YSBhIHVtYSBncmFuZGUgdmFyacOibmNpYSBjb25kaWNpb25hbCAoJFxzaWdtYV97dH1eezJ9JCkgcGFyYSBvIHRlcm1vIGRlIGVycm8gJGFfe3R9JC4gQ29uc2VxdWVudGVtZW50ZSwgJGFfdCQgdGVuZGUgYSBhc3N1bWlyIHVtIHZhbG9yIGdyYW5kZSBlbSBtw7NkdWxvLiBJc3RvIHNpZ25pZmljYSBxdWUsIHNvYiBhIGFib3JkYWdlbSBBUkNILCBncmFuZGVzIGNob3F1ZXMgdGVuZGVtIGEgc2VyIHNlZ3VpZG9zIHBvciBvdXRybyBncmFuZGUgY2hvcXVlLiBFc3RhIGNhcmFjdGVyw61zdGljYSDDqSBzaW1pbGFyIGFvcyBjbHVzdGVycyBkZSB2b2xhdGlsaWRhZGUgYXByZXNlbnRhZG9zIGFudGVyaW9ybWVudGUgcGFyYSBvcyByZXRvcm5vcyBkZSBhdGl2b3MuCgoqICoqUFJPUFJJRURBREVTIERPIE1PREVMTyBBUkNIKioKClBhcmEgZW50ZW5kZXIgbyBtb2RlbG8gQVJDSCB2YWxlIGEgcGVuYSBlc3R1ZGFyIGN1aWRhZG9zYW1lbnRlIG8gbW9kZWxvICRBUkNIKDEpJCBxdWUgw6k6CgokJApcYmVnaW57YWxpZ25lZH0KJiYmIGFfdCA9IFxzaWdtYV97dH1cZXBzaWxvbl97dH0gXFwKJiYmIFxzaWdtYV97dH1eMiA9IFxhbHBoYV97MH0gKyBcYWxwaGFfezF9YV97dC0xfV4yClxlbmR7YWxpZ25lZH0KJCQKb25kZSAkXGFscGhhXzAgPjAkLCAkXGFscGhhX3sxfSBcZ2VxIDAkLCAkRVxsZWZ0KGFfdFxyaWdodCk9MCQsICRWYXJcbGVmdChhX3RccmlnaHQpPVZhclxsZWZ0KGFfe3QtMX1ccmlnaHQpPUVcbGVmdFthX3t0LTF9XnsyfVxyaWdodF0kLCAkRVxsZWZ0KFxlcHNpbG9uX3RccmlnaHQpPTAkIGUgJFZhclxsZWZ0KFxlcHNpbG9uX3RccmlnaHQpPUVcbGVmdFtcZXBzaWxvbl97dH1eezJ9XHJpZ2h0XT0xJC4gUHJpbWVpcm8sIGEgKiptw6lkaWEgaW5jb25kaWNpb25hbCoqIGRlICRhX3QkIHBlcm1hbmVjZSAkMCQgcG9ycXVlOgoKJCQKRVxsZWZ0KGFfdFxyaWdodCkgPSBcc2lnbWFfdEUoXGVwc2lsb25fdCkgPSAwCiQkClNlZ3VuZG8sIGEgKip2YXJpw6JuY2lhIGluY29uZGljaW9uYWwqKiBkZSAkYV90JCBwb2RlIHNlciBvYnRpZGEgY29tbzoKCiQkClxiZWdpbntzcGxpdH0KVmFyXGxlZnQoYV90XHJpZ2h0KSAmID0gRVxsZWZ0KGFfe3R9XnsyfVxyaWdodCkgPSBFXGxlZnQoXHNpZ21hX3t0fV57Mn1cZXBzaWxvbl90XnsyfVxyaWdodCkgXFwKJiAgICA9IEVcbGVmdChcc2lnbWFfe3R9XnsyfVxyaWdodClcdGltZXMgRVxsZWZ0KFxlcHNpbG9uX3t0fV57Mn1ccmlnaHQpflx0ZXh0e3BvaXMgc8OjbyBkdWFzIHZhcmnDoXZlaXMgaWlkfSBcXAomICAgPSBFXGxlZnQoXHNpZ21hX3t0fV57Mn1ccmlnaHQpIH5cdGV4dHtwb2lzfX5WYXJcbGVmdChcZXBzaWxvbl90XHJpZ2h0KT0xIFxcCiYgICA9IEVcbGVmdChcYWxwaGFfezB9ICsgXGFscGhhX3sxfWFfe3QtMX1eMlxyaWdodCkgXFwKJiAgID0gXGFscGhhX3swfSArIFxhbHBoYV97MX1FXGxlZnQoYV97dC0xfV4yXHJpZ2h0KSBcXAomICAgPSBcYWxwaGFfezB9ICsgXGFscGhhX3sxfVZhclxsZWZ0KGFfdFxyaWdodCkgXFwKJiAgID0gXGZyYWN7XGFscGhhX3swfX17MS1cYWxwaGFfezF9fSBcXApcZW5ke3NwbGl0fQokJApTYWJlbW9zIHF1ZSBhIHZhcmnDom5jaWEgbsOjbyBwb2RlIHNlciBuZWdhdGl2YS4gQXNzaW0sIHByZWNpc2Ftb3MgcXVlICQwXGxlcSBcYWxwaGFfezF9IDwgMSQuIAoKRGVwZW5kZW5kbyBkYSBhcGxpY2HDp8OjbyBkb3MgbW9kZWxvcyBBUkNILCDDqSBwcmVjaXNvIHF1ZSBvcyBtb21lbnRvcyBkZSBtYWlvciBvcmRlbSBkZSAkYV90JCBleGlzdGFtLiBBc3NpbSwgJFxhbHBoYV97MX0kIGRldmUgc2F0aXNmYXplciBhbGd1bWFzIHJlc3RyacOnw7VlcyBhZGljaW9uYWlzLiBQb3IgZXhlbXBsbywgcGFyYSBlc3R1ZGFyIHNldSBjb21wb3J0YW1lbnRvIG5hcyBjYXVkYXMsIHByZWNpc2Ftb3MgcXVlIG8gKipxdWFydG8gbW9tZW50byBpbmNvbmRpY2lvbmFsKiogZGUgJGFfdCQgc2VqYSBmaW5pdG8uIFNvYiBhIGhpcMOzdGUgZGUgcXVlICRcZXBzaWxvbl97dH0kIHNlZ3VlIHVtYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwsIHRlbW9zIHF1ZSBvIHF1YXJ0byBtb21lbnRvIGluY29uZGljaW9uYWwgw6kgaWd1YWwgYSAzLCBvdSBzZWphOgoKJCQKXGJlZ2lue3NwbGl0fQpcZnJhY3ttXzR9e21fMl57Mn19ICYgPSBcZnJhY3tFXGxlZnQoYV90LSBcYmFye2FfdH1ccmlnaHQpXjR9e1xsZWZ0W0VcbGVmdChhX3QtIFxiYXJ7YV90fVxyaWdodCleMlxyaWdodF1eMn0gPSAzIFxcCiYgXFwKRVxsZWZ0KGFfe3R9Xns0fVxyaWdodCkgJiA9IDNFXGxlZnQoYV90XjJccmlnaHQpXjIgIH5cdGV4dHtwb2lzfX5cYmFye2FfdH09MCBcXAomIFxcCiYgPSAzRVxsZWZ0KFxhbHBoYV97MH0gKyBcYWxwaGFfezF9YV97dC0xfV4yXHJpZ2h0KV4yIFxcCiYgXFwKJiA9IDNFXGxlZnQoXGFscGhhX3swfV4yICsgMlxhbHBoYV97MH1cYWxwaGFfezF9YV97dC0xfV4yK1xhbHBoYV97MX1eezJ9YV97dC0xfV57NH1ccmlnaHQpIFxcClxlbmR7c3BsaXR9CiQkCgpTZSAkYV90JCDDqSBlc3RhY2lvbsOhcmlvIG5vIHF1YXJ0byBtb21lbnRvIGNvbSAkbV80ID0gRVxsZWZ0KGFfe3R9XjRccmlnaHQpPUVcbGVmdChhX3t0LTF9XjRccmlnaHQpJCBlIHNhYmVuZG8gcXVlICRFXGxlZnQoYV90XjJccmlnaHQpPVZhclxsZWZ0KGFfdFxyaWdodCkkIGVudMOjbyB0ZW1vczoKCiQkClxiZWdpbntzcGxpdH0KbV80ICYgPSAzXGxlZnQoXGFscGhhX3swfV4yICsgMlxhbHBoYV97MH1cYWxwaGFfezF9VmFyKGFfdCkrXGFscGhhX3sxfV57Mn1tXzRccmlnaHQpIFxcCiYgXFwKJiA9IDNcYWxwaGFfezB9XjIrNlxhbHBoYV8wXGFscGhhXzFcbGVmdChcZnJhY3tcYWxwaGFfMH17MS1cYWxwaGFfMX1ccmlnaHQpICsgM1xhbHBoYV97MX1eezJ9bV80XFwKJiBcXAomID0gM1xhbHBoYV97MH1eezJ9XGxlZnQoMStcZnJhY3syXGFscGhhXzF9ezEtXGFscGhhXzF9XHJpZ2h0KSArIDNcYWxwaGFfezF9XnsyfW1fNCBcXAomIFxcCm1fNCAtIDNcYWxwaGFfezF9XnsyfW1fNCAmID0gM1xhbHBoYV97MH1eezJ9K1xmcmFjezNcYWxwaGFfezB9XnsyfVxsZWZ0KDJcYWxwaGFfMVxyaWdodCl9e3sxLVxhbHBoYV8xfX0gIFxcCiYgXFwKXGxlZnQoMS0zXGFscGhhX3sxfV57Mn1ccmlnaHQpbV80ICYgPSBcZnJhY3tcbGVmdCgxLVxhbHBoYV8xXHJpZ2h0KTNcYWxwaGFfezB9XnsyfSszXGFscGhhX3swfV57Mn1cbGVmdCgyXGFscGhhXzFccmlnaHQpfXsxLVxhbHBoYV8xfSBcXAomIFxcCm1fNCAmID0gXGZyYWN7M1xhbHBoYV8wXjItM1xhbHBoYV8wXjJcYWxwaGFfMSs2XGFscGhhXzBeMlxhbHBoYV8xfXtcbGVmdCgxLVxhbHBoYV8xXHJpZ2h0KVxsZWZ0KDEtM1xhbHBoYV8xXnsyfVxyaWdodCl9XFwKJiBcXAptXzQgJiA9IFxmcmFjezNcYWxwaGFfezB9XnsyfVxsZWZ0KDErXGFscGhhXzFccmlnaHQpfXtcbGVmdCgxLVxhbHBoYV8xXHJpZ2h0KVxsZWZ0KDEtM1xhbHBoYV8xXnsyfVxyaWdodCl9ClxlbmR7c3BsaXR9CiQkCgpDb21vIG8gcXVhcnRvIG1vbWVudG8gZGUgJGFfdCQgw6kgcG9zaXRpdm8sICRcYWxwaGFfMSQgZGV2ZSBzYXRpc2ZhemVyIGEgY29uZGnDp8OjbyAkMS0zXGFscGhhX3sxfV57Mn0+MCQsIHBvaXMgZGEgdmFyacOibmNpYSBpbmNvbmRpY2lvbmFsIGrDoSB0ZW1vcyBxdWUgJFxsZWZ0KDEtXGFscGhhXzFccmlnaHQpJC4gSXNzbyBpbXBsaWNhIHF1ZSAkXGFscGhhX3sxfV57Mn0gPCBcZnJhY3sxfXszfSQgZSBqdW50YW5kbyBhcyBkdWFzIGNvbmRpw6fDtWVzLCAgJDBcbGVxIFxhbHBoYV97MX1eezJ9IDwgXGZyYWN7MX17M30kLiBDb20gdGFpcyBjb25kacOnw7VlcyBwb2RlbW9zIGVuY29udHJhciBhIGN1cnRvc2UgaW5jb25kaWNpb25hbCBkZSAkYV90JDoKCiQkClxmcmFje0VcbGVmdFthX3ReNFxyaWdodF19e1xsZWZ0W1ZhcihhX3QpXHJpZ2h0XV4yfSA9IFxmcmFjezNcYWxwaGFfezB9XnsyfVxsZWZ0KDErXGFscGhhXzFccmlnaHQpfXtcbGVmdCgxLVxhbHBoYV8xXHJpZ2h0KVxsZWZ0KDEtM1xhbHBoYV8xXnsyfVxyaWdodCl9IFx0aW1lcyBcZnJhY3tcbGVmdCgxLVxhbHBoYV8xXHJpZ2h0KV4yfXtcYWxwaGFfezB9XnsyfX0gPSBcZnJhY3szXGxlZnQoMS1cYWxwaGFfMV4yXHJpZ2h0KX17MS0zXGFscGhhXzFeezJ9fSA+IDMKJCQKCkFzc2ltLCBvIGV4Y2Vzc28gZGUgY3VydG9zZSBkZSAkYV90JCDDqSBwb3NpdGl2byBlIGNhdWRhIGRlIHN1YSBkaXN0cmlidWnDp8OjbyDDqSBtYWlzIHBlc2FkYSBxdWUgYSBkYSBkaXN0cmlidWnDp8OjbyBkYSBOb3JtYWwgcXVlIHRlbSBhc3NpbWV0cmlhIGlndWFsIGEgJDAkIGUgY3VydG9zZSAkMyQuIElzc28gZXN0w6EgZGUgYWNvcmRvIGNvbSBvcyByZXN1bHRhZG9zIGVtcMOtcmljb3MgcXVlIG5vcyBtb3N0cmFtIHF1ZSAqKm91dGxpZXJzKiogb2NvcnJlbSBjb20gbWFpb3IgZnJlcXXDqm5jaWEgbmEgc8OpcmllIHRlbXBvcmFsIGRlIHJldG9ybm9zIGRvIHF1ZSBlbSB1bWEgc8OpcmllIHF1ZSBzZWd1ZSB1bWEgZGlzdHJpYnVpw6fDo28gTm9ybWFsLiBUYWlzIHByb3ByaWVkYWRlcyBzw6NvIG1hbnRpZGFzIHBhcmEgbW9kZWxvcyBBUkNIIGRlIG9yZGVtIHN1cGVyaW9yLCBtYXMgYXMgZsOzcm11bGFzIHNlIHRvcm5hbSBtYWlzIGNvbXBsaWNhZGFzLiAKCiogKipWQU5UQUdFTlMgRSBGUkFRVUVaQVMgREUgVU0gTU9ERUxPIEFSQ0gqKgoKQ29tbyBkaXNjdXRpZG8gbmFzIHNlw6fDtWVzIGFudGVyaW9yZXMsIG1vZGVsb3MgQVJDSCB0ZW0gbXVpdGFzIHZhbnRhZ2VucyBuYSBhbsOhbGlzZSBkZSByZXRvcm5vcyBkZSBhdGl2b3MgZmluYW5jZWlyb3MuIEFzIHByaW5jaXBhaXMgdmFudGFnZW5zIHPDo286CgoxLiBPIG1vZGVsbyBwb2RlIHByb2R1emlyIGNsdXN0ZXJzIGRlIHZvbGF0aWxpZGFkZQoyLiBPcyBjaG9xdWVzIGRvIG1vZGVsbywgcmVwcmVzZW50YWRvcyBwb3IgJGFfdCQsIHRlbSBjYXVkYXMgcGVzYWRhcwoKUG9yw6ltLCB0ZW1vcyB0YW1iw6ltIGFsZ3VtYXMgZnJhcXVlemFzLCBxdWUgc8OjbzoKCjEuIE8gbW9kZWxvIGFzc3VtZSBxdWUgY2hvcXVlcyBwb3NpdGl2b3MgZSBuZWdhdGl2b3MgdGVtIG8gbWVzbW8gZWZlaXRvIHNvYnJlIGEgdm9sYXRpbGlkYWRlIHBvcnF1ZSBlbGUgZGVwZW5kZSBhcGVuYXMgZG9zIHF1YWRyYWRvcyBkZSBjaG9xdWVzIHBhc3NhZG9zLiBOYSBwcsOhdGljYSwgc2FiZW1vcyBxdWUgb3MgcHJlw6dvcyBkZSBhdGl2b3MgZmluYW5jZWlyb3MgcmVzcG9uZGVtIGRpZmVyZW50ZW1lbnRlIGEgY2hvcXVlcyBwb3NpdGl2b3Mgb3UgbmVnYXRpdm9zLgoyLiBPIG1vZGVsbyBBUkNIIMOpIGJhc3RhbnRlIHJlc3RyaXRpdm8uIFBvciBleGVtcGxvLCAkXGFscGhhX3sxfV57Mn0kIGRlIHVtIG1vZGVsbyAkQVJDSCgxKSQgZGV2ZSBlc3RhciBubyBpbnRlcnZhbG8gJFxsZWZ0WzAsXGZyYWN7MX17M31ccmlnaHRdJCBzZSBhIHPDqXJpZSB0ZW0gbyBxdWFydG8gbW9tZW50byBmaW5pdG8uIE5hIHByw6F0aWNhLCB0YWwgcmVzdHJpw6fDo28gbGltaXRhIGEgaGFiaWxpZGFkZSBkbyBtb2RlbG8gQVJDSCBjb20gZXJyb3Mgc2UgZGlzdHJpYnVpbmRvIE5vcm1hbG1lbnRlIGVtIGNhcHR1cmFyIG8gZXhjZXNzbyBkZSBjdXJ0b3NlIGNvbXVtZW50ZSBlbmNvbnRyYWRvIG5hIGRpc3RyaWJ1acOnw6NvIGRvcyByZXRvcm5vcyBkZSBhdGl2b3MgZmluYW5jZWlyb3MuCjMuIE8gbW9kZWxvIEFSQ0ggbsOjbyBmb3JuZWNlIHF1YWxxdWVyICppbnNpZ2h0KiBwYXJhIGVudGVuZGVyIGEgZm9udGUgZGUgdmFyaWHDp8OjbyBkZSB1bWEgc8OpcmllIHRlbXBvcmFsIGZpbmFuY2VpcmEuIEVsZSBhcGVuYXMgcHJvcG9yY2lvbmEgdW1hIG1hbmVpcmEgZGUgZGVzY3JldmVyIG8gY29tcG9ydGFtZW50byBkYSB2YXJpw6JuY2lhIGNvbmRpY2lvbmFsLgoKKiAqKkVTVElNQU5ETyBVTSBNT0RFTE8gQVJDSCoqCgpTZSBlbmNvbnRyYXJtb3MgcXVlIG9zIGVmZWl0b3MgQVJDSCBzw6NvIHNpZ25pZmljYW50ZXMsIHBvZGUtc2UgdXNhciBhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCAoRkFDUCkgZGUgJGFfe3R9XnsyfSQgcGFyYSBkZXRlcm1pbmFyIGEgb3JkZW0gJG0kIGRvIG1vZGVsbyAkQVJDSChtKSQuIEEganVzdGlmaWNhdGl2YSBwYXJhIG8gdXNvIGRhIEZBQ1AgcG9kZSBzZXIgZGVsaW5lYWRhLCBjb21vIHNlZ3VlLiBTdXBvbmhhIG8gbW9kZWxvIEFSQ0gobSk6CgokJApcc2lnbWFfe3R9XnsyfSA9IFxhbHBoYV97MH0gKyBcYWxwaGFfezF9YV97dC0xfV57Mn0gKyAuLi4gKyBcYWxwaGFfe219YV97dC1tfV57Mn0KJCQKUGFyYSB1bWEgZGFkYSBhbW9zdHJhLCAkYV97dH1eezJ9JCDDqSB1bWEgZXN0aW1hdGl2YSBuw6NvIGVudmllc2FkYSBkZSAkXHNpZ21hX3t0fV57Mn0kLiBQb3J0YW50bywgZXNwZXJhbW9zIHF1ZSAkYV97dH1eezJ9JCBzZWphIGxpbmVhcm1lbnRlIHJlbGFjaW9uYWRvIGEgJGFfe3QtMX1eezJ9LC4uLixhX3t0LW19XnsyfSQgZW0gdW1hIG1hbmVpcmEgc2ltaWxhciBhIGRlIHVtIG1vZGVsbyBhdXRvcnJlZ3Jlc3Npdm8gZGUgb3JkZW0gJG0kLiBBc3NpbSwgY29tbyBlc3R1ZGFtb3MgcGFyYSBvcyBtb2RlbG9zIGF1dG9ycmVncmVzc2l2b3MsICRBUihwKSQsIHBvZGVtb3MgdXNhciBhIEZBQ1AgcGFyYSBkZXRlcm1pbmFyIGEgb3JkZW0gJG0kIGRvIG1vZGVsbyAkQVJDSChtKSQgY29tbyB2b2PDqiBwb2RlIG9ic2VydmFyIG5lc3RlIFtMaW5rXShodHRwczovL3JwdWJzLmNvbS9odWRzb25jaGF2cy9hcikuIAoKSsOhIGEgZXN0aW1hw6fDo28gZGUgdGFsIG1vZGVsbyBwb2RlIHNlciByZWFsaXphZGEgcG9yIG1laW8gZG8gcHJpbmPDrXBpbyBkYSBtw6F4aW1hIHZlcm9zc2ltaWxoYW7Dp2EuIENvbW8gZXN0dWRhbW9zIG5lc3RlIFtsaW5rXShodHRwczovL3JwdWJzLmNvbS9odWRzb25jaGF2cy9tYXh2ZXJvc2ltaWxoYW5jYSksIGEgdmVyb3NzaW1pbGhhbsOnYSBnZXJhbCBkZSB1bWEgc8OpcmllIHRlbXBvcmFsIGRlIHJldG9ybm9zIHBvZGUgc2VyIGVzY3JpdGEgZGEgc2VndWludGUgZm9ybWE6CgoKJCQKXGJlZ2lue2FsaWduZWR9CmYocl97dH0scl97dC0xfSwuLi4scl97Mn0scl97MX0pID0gXGxlZnRbXHByb2Rfe3Q9Mn1ee1R9e2Yocl97dH18cl97dC0xfSwuLi5yX3sxfSl9XHJpZ2h0XWYocl97MX0pClxlbmR7YWxpZ25lZH0KJCQKU2UgJHJfe3R9fHJfe3QtMX0sLi4ucl97MX0kIHNlZ3VlIHVtYSBkaXN0cmlidWnDp8OjbyBub3JtYWwgY29tIG3DqWRpYSAkXG11JCBlIHZhcmnDom5jaWEgJFxzaWdtYV57Mn0kIGEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSBjb25kaWNpb25hbCBzZSB0b3JuYSwgcGFyYSAkUiA9IFxsZWZ0XHtyX3t0fVxyaWdodFx9X3t0PTF9XntUfSQ6CgokJApMKFJ8XGJvbGRzeW1ib2x7XHRoZXRhfSkgPSBmKHJfe3R9LHJfe3QtMX0sLi4uLHJfezF9IHwgXGJvbGRzeW1ib2x7XHRoZXRhfSkgPSBmKHJfezF9fFxib2xkc3ltYm9se1x0aGV0YX0pIFxwcm9kX3t0PTJ9XntUfXsgXGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYV57Mn19fWV4cFxsZWZ0XHstXGZyYWN7KHJfe3R9LVxtdSleMn17MlxzaWdtYV57Mn19ICBccmlnaHRcfX0gCiQkCgpTZSBpZ25vcmFtb3MgJGYocl97MX0pJCwgYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIGNvbmRpY2lvbmFsIGRvcyByZXRvcm5vcyBzb2IgaGlww7N0ZXNlIGRlIG5vcm1hbGlkYWRlIHNlcsOhOgoKJCQKTChSfFxib2xkc3ltYm9se1x0aGV0YX0pID0gZihyX3t0fSxyX3t0LTF9LC4uLixyX3sxfXxcYm9sZHN5bWJvbHtcdGhldGF9KSA9IFxwcm9kX3t0PTJ9XntUfXsgXGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYV57Mn19fWV4cFxsZWZ0XHstXGZyYWN7KHJfe3R9LVxtdSleMn17MlxzaWdtYV57Mn19ICBccmlnaHRcfX0gCiQkCgpQYXJhIG8gY2FzbyBlc3BlY8OtZmljbyBkbyBtb2RlbG8gJEFSQ0gobSkkLCBvIHBvbnRvIGNydWNpYWwgw6kgcXVlIGEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSBwYXNzYSBhZ29yYSBhIHRlciAkXHNpZ21hX3t0fV57Mn0kIGUgbsOjbyBhc3N1bWktbG8gY29uc3RhbnRlIGNvbW8gYW50ZXJpb3JtZW50ZS4gSXNzbyBpbXBsaWNhIGVtOgoKJCQKTChSfFxib2xkc3ltYm9se1x0aGV0YX0pID0gZihyX3t0fSxyX3t0LTF9LC4uLixyX3sxfXxcYm9sZHN5bWJvbHtcdGhldGF9KSA9IFxwcm9kX3t0PTJ9XntUfXsgXGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYV97dH1eezJ9fX1leHBcbGVmdFx7LVxmcmFjeyhyX3t0fS1cbXUpXjJ9ezJcc2lnbWFfe3R9XnsyfX0gIFxyaWdodFx9fSAKJCQKCk5vIG1vbWVudG8gcXVlIG9ic2VydmFtb3MgYSBhbW9zdHJhIGRlIGRhZG9zIGRhIG5vc3NhIHPDqXJpZSB0ZW1wb3JhbCBkZSByZXRvcm5vcywgbyBvYmpldGl2byBubyBwcm9jZXNzbyBkZSBvdGltaXphw6fDo28gZGEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSDDqSBlbmNvbnRyYXIgbyB2ZXRvciBkZSBwYXLDom1ldHJvcyAkXGJvbGRzeW1ib2x7XHRoZXRhfSQgcXVlIG1heGltaXphIHRhbCBmdW7Dp8Ojby4gQ29tbyBleGVtcGxvLCBzdXBvbmhhIHF1ZSB0ZW1vcyBvIG1vZGVsbyAkQVJNQSgxLDEpLUFSQ0goMSkkIGFiYWl4bzoKCiQkClxiZWdpbnthbGlnbmVkfQomJiYgcl97dH0gPSBcbXVfe3R9ICsgYV97dH0gXFwKJiYmIFxtdV97dH0gPSBccGhpX3swfSArIFxwaGlfezF9cl97dC0xfSArIFx0aGV0YV97MX1hX3t0LTF9IFxcCiYmJiBhX3QgPSBcc2lnbWFfe3R9XGVwc2lsb25fe3R9IFxcCiYmJiBcc2lnbWFfe3R9XjIgPSBcYWxwaGFfezB9ICsgXGFscGhhX3sxfWFfe3QtMX1eMgpcZW5ke2FsaWduZWR9CiQkCkNvbSB0YWlzIGluZm9ybWHDp8O1ZXMsIGEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSBhcMOzcyBvYnNlcnZhciBhIGFtb3N0cmEgZGUgcmV0b3Jub3Mgc2Vyw6E6CgokJApcYmVnaW57YWxpZ25lZH0KJiYmIEwoXGJvbGRzeW1ib2x7XHRoZXRhfXxSKSA9IGYoXGJvbGRzeW1ib2x7XHRoZXRhfXwgcl97dH0scl97dC0xfSwuLi4scl97MX0pID0gXHByb2Rfe3Q9Mn1ee1R9eyBcZnJhY3sxfXtcc3FydHsyXHBpXHNpZ21hX3t0fV57Mn19fWV4cFxsZWZ0XHstXGZyYWN7KHJfe3R9LVxtdSleMn17MlxzaWdtYV97dH1eezJ9fSAgXHJpZ2h0XH19IFxcCiYmJiBcXAomJiYgTChcYm9sZHN5bWJvbHtcdGhldGF9fFIpID0gZihcYm9sZHN5bWJvbHtcdGhldGF9fCByX3t0fSxyX3t0LTF9LC4uLixyX3sxfSkgPSBccHJvZF97dD0yfV57VH17IFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWFfe3R9XnsyfX19ZXhwXGxlZnRcey1cZnJhY3thX3t0fV4yfXsyXHNpZ21hX3t0fV57Mn19ICBccmlnaHRcfX0gXFwKJiYmIFxcCiYmJiBMKFxib2xkc3ltYm9se1x0aGV0YX18UikgPSBmKFxib2xkc3ltYm9se1x0aGV0YX18IHJfe3R9LHJfe3QtMX0sLi4uLHJfezF9KSA9IFxwcm9kX3t0PTJ9XntUfXsgXGZyYWN7MX17XHNxcnR7MlxwaVxsZWZ0KFxhbHBoYV97MH0gKyBcYWxwaGFfezF9YV97dC0xfV4yXHJpZ2h0KX19ZXhwXGxlZnRcey1cZnJhY3socl90LVxwaGlfezB9IC0gXHBoaV97MX1yX3t0LTF9IC0gXHRoZXRhX3sxfWFfe3QtMX0pXjJ9ezJcbGVmdChcYWxwaGFfezB9ICsgXGFscGhhX3sxfWFfe3QtMX1eMlxyaWdodCl9ICBccmlnaHRcfX0gXFwKJiYmIFxcCiYmJiBMKFxib2xkc3ltYm9se1x0aGV0YX18UikgPSBmKFxib2xkc3ltYm9se1x0aGV0YX18IHJfe3R9LHJfe3QtMX0sLi4uLHJfezF9fCkgPSBccHJvZF97dD0yfV57VH17IFxmcmFjezF9e1xzcXJ0ezJccGlcbGVmdChcYWxwaGFfezB9ICsgXGFscGhhX3sxfVxsZWZ0W3Jfe3QtMX0tXHBoaV97MH0gLSBccGhpX3sxfXJfe3QtMn0gLSBcdGhldGFfezF9YV97dC0yfVxyaWdodF1eMlxyaWdodCl9fWV4cFxsZWZ0XHstXGZyYWN7KHJfdC1ccGhpX3swfSAtIFxwaGlfezF9cl97dC0xfSAtIFx0aGV0YV97MX1hX3t0LTF9KV4yfXsyXGxlZnQoXGFscGhhX3swfSArIFxhbHBoYV97MX1cbGVmdFtyX3t0LTF9LVxwaGlfezB9IC0gXHBoaV97MX1yX3t0LTJ9IC0gXHRoZXRhX3sxfWFfe3QtMn1ccmlnaHRdXjJccmlnaHQpfSAgXHJpZ2h0XH19IFxcClxlbmR7YWxpZ25lZH0KJCQKCklzc28gcGVybWl0aXLDoSBlbmNvbnRyYXIgbyB2ZXRvciBkZSBwYXLDom1ldHJvcyAkXGJvbGRzeW1ib2x7XHRoZXRhfSA9IFxsZWZ0KFxwaGlfMCwgXHBoaV8xLCBcdGhldGFfMSwgXGFscGhhXzAsIFxhbHBoYV8xXHJpZ2h0KSQgcG9yIG1laW8gZGEgb3RpbWl6YcOnw6NvIGRhIGZ1bsOnw6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2EuIAoKVW1hIHZleiBlc3RpbWFkbyBvIG1vZGVsbywgcHJlY2lzYW1vcyB2ZXJpZmljYXIgYSBzdWEgYWRlcXVhw6fDo28uIFBhcmEgdGFudG8sIHBvZGVtb3MgYXZhbGlhciBhIHPDqXJpZSAkXGxlZnRce1xoYXR7YX1fdFxyaWdodFx9JCwgb3Ugc2VqYSwgb3MgcmVzw61kdW9zIGRvIG1vZGVsbyAkQVJDSChtKSQgZXN0aW1hZG8uIEVtIHBhcnRpY3VsYXIsIGVzdGF0w61zdGljYXMgZGUgJFxoYXR7YX1fdCQgcG9kZW0gc2VyIHVzYWRhcyBwYXJhIHZlcmlmaWNhciBhIGFkZXF1YcOnw6NvIGRhIGVxdWHDp8OjbyBkYSBtw6lkaWEgZSAkXGhhdHthfV90XnsyfSQgcG9kZSBzZXIgdXNhZG8gcGFyYSB0ZXN0YXIgYSB2YWxpZGFkZSBkYSBlcXVhw6fDo28gZGEgdm9sYXRpbGlkYWRlLiAKCiMjIyMjICoqTU9ERUxPIERFIEhFVEVST0NFREFTVElDSURBREUgQ09ORElDSU9OQUwgQVVUT1JSRUdSRVNTSVZBIEdFTkVSQUxJWkFETyAoR0FSQ0gpKioKCkVtYm9yYSBvIG1vZGVsbyAkQVJDSChtKSQgc2VqYSBzaW1wbGVzLCBlbGUgZnJlcXVlbnRlbWVudGUgcmVxdWVyIG11aXRvcyBwYXLDom1ldHJvcyBwYXJhIGRlc2NyZXZlciBhZGVxdWFkYW1lbnRlIGEgdm9sYXRpbGlkYWRlIGNvbmRpY2lvbmFsIGRvcyByZXRvcm5vcyBkZSB1bSBhdGl2byBmaW5hbmNlaXJvLiBFbSBmdW7Dp8OjbyBkaXNzbywgQGJvbGxlcnNsZXYxOTg2Z2VuZXJhbGl6ZWQgcHJvcMO0cyB1bWEgZXh0ZW5zw6NvIGRvIG1vZGVsbyAkQVJDSChtKSQgY29uaGVjaWRhIGNvbW8gbW9kZWxvIGRlIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwgYXV0b3JyZWdyZXNzaXZhIGdlbmVyYWxpemFkbyAoR0FSQ0gpLiAKCkNvbW8gZGlzdGN1dGltb3MgbmEgc2XDp8OjbyAqKmVzdHJ1dHVyYSBkZSB1bSBtb2RlbG8gZGUgaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbCoqLCB0ZW1vcyBkdWFzIGVxdWHDp8O1ZXMgcXVlIHByZWNpc2FtIHNlciBlc3RpbWFkYXMgbmVzdGVzIG1vZGVsb3M6IG3DqWRpYSBjb25kaWNpb25hbCBlIHZhcmnDom5jaWEgY29uZGljaW9uYWwuIFBhcmEgYSBlcXVhw6fDo28gZGEgbcOpZGlhIGNvbmRpY2lvbmFsLCBhc3NpbSBjb21vIG5vcyBtb2RlbG9zICRBUkNIKG0pJCwgcG9kZW1vcyBhc3N1bWlyIHVtIG1vZGVsbyAkQVJNQShwLHEpJCwgbmVzdGUgZm9ybWF0bzoKCiQkClxiZWdpbnthbGlnbmVkfQomJiYgcl97dH0gPSBcbXVfe3R9ICsgYV97dH0gXFwKJiYmIFxtdV97dH0gPSBccGhpX3swfSArIFxzdW1fe2k9MX1ee3B9e1xwaGlfe2l9cl97dC1pfX0gKyBcc3VtX3tqPTF9XntxfXtcdGhldGFfe2p9YV97dC1qfX0KXGVuZHthbGlnbmVkfQokJAoKSsOhIHBhcmEgYSB2YXJpw6JuY2lhIGNvbmRpY2lvbmFsLCBAYm9sbGVyc2xldjE5ODZnZW5lcmFsaXplZCBkZWZpbml1IHRhbCBlcXVhw6fDo28gY29tbyBzZWd1ZToKCiQkClxiZWdpbnthbGlnbmVkfQomJiYgYV97dH09XHNpZ21hX3RcZXBzaWxvbl90IFxcCiYmJiBcc2lnbWFfe3R9XnsyfSA9IFxhbHBoYV97MH0gKyBcc3VtX3tpPTF9XnttfXt9XGFscGhhX3tpfWFfe3QtaX1eezJ9K1xzdW1fe2o9MX1ee259e1xiZXRhX2pcc2lnbWFeezJ9X3t0LWp9fQpcZW5ke2FsaWduZWR9CiQkCm9uZGUsIG5vdmFtZW50ZSAkXGxlZnRce1xlcHNpbG9uX3QgXHJpZ2h0XH1fe3Q9MX1ee3R9JCDDqSB1bWEgc2VxdcOqbmNpYSBkZSB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzIGluZGVwZW5kZW50ZSBlIGlkZW50aWNhbWVudGUgZGlzdHJpYnXDrWRhcyAoaWlkKSBjb20gbcOpZGlhICQwJCBlIHZhcmnDom5jaWEgJDEkLCAkXGFscGhhX3swfT4wJCwgJFxhbHBoYV97aX1cZ2VxIDAkLCAkXGJldGFfe2p9XGdlcSAwJCBwYXJhICRpPjAkIGUgJGo+MCQuIEFsw6ltIGRpc3NvLCAkXHN1bV97aT0xfV57bWF4KG0sbil9eyhcYWxwaGFfaStcYmV0YV9pKTwxfSQgcXVlIGdhcmFudGUgcXVlIGEgdmFyacOibmNpYSBpbmNvbmRpY2lvbmFsIGRlICRhX3QkIMOpIGZpbml0YS4gQ29tbyBhbnRlcywgcG9kZW1vcyBhc3N1bWlyIHF1ZSAkXGVwc2lsb25fdCQgc2VndWUgdW1hIGRpc3RyaWJ1acOnw6NvIE5vcm1hbCBvdSB0LVN0dWRlbnQuIEVtIGFsZ3VtYXMgYXBsaWNhw6fDtWVzLCBwb2RlbW9zIHVzYXIgdGFtYsOpbSBkaXN0cmlidWnDp8O1ZXMgYXNzaW3DqXRyaWNhcyBwYXJhICRcZXBzaWxvbl90JC4gCgpPYnNlcnZlIHF1ZSBzZSAkbj0wJCBhIGVxdWHDp8OjbyBkYSB2YXJpw6JuY2lhIGNvbmRpY2lvbmFsIHNlIGNvbXBvcnRhIGNvbW8gdW0gbW9kZWxvICRBUkNIKG0pJC4gUG9yIG91dHJvIGxhZG8sIHBhcmEgJG4+MCQgbyBtb2RlbG8gw6kgZXNjcml0byBjb21vICRHQVJDSChtLG4pJCB0YW1iw6ltIGNvbmhlY2lkbyBjb21vIG1vZGVsbyBkZSBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsIGF1dG9ycmVncmVzc2l2YSBnZW5lcmFsaXphZG8uIAoKKiAqKlBST1BSSUVEQURFUyBETyBNT0RFTE8gR0FSQ0gqKgoKUGFyYSBlbnRlbmRlciBvIG1vZGVsbyAkR0FSQ0gobSxuKSQgdmFsZSBhIHBlbmEgZXN0dWRhciBjdWlkYWRvc2FtZW50ZSBvIG1vZGVsbyAkR0FSQ0goMSwxKSQgcXVlIMOpOgoKJCQKXGJlZ2lue2FsaWduZWR9CiYmJiBhX3QgPSBcc2lnbWFfe3R9XGVwc2lsb25fe3R9IFxcCiYmJiBcc2lnbWFfe3R9XjIgPSBcYWxwaGFfezB9ICsgXGFscGhhX3sxfWFfe3QtMX1eMiArIFxiZXRhXzFcc2lnbWFfe3QtMX1eezJ9ClxlbmR7YWxpZ25lZH0KJCQKb25kZSAkXGFscGhhXzAgPjAkLCAkXGFscGhhX3sxfSBcZ2VxIDAkLCAkXGJldGFfezF9IFxnZXEgMCQsICRcYWxwaGFfMStcYmV0YV8xIDwxJCwgJEVcbGVmdChhX3RccmlnaHQpPTAkLCAkVmFyXGxlZnQoYV90XHJpZ2h0KT1WYXJcbGVmdChhX3t0LTF9XHJpZ2h0KT1FXGxlZnRbYV97dC0xfV57Mn1ccmlnaHRdJCwgJEVcbGVmdChcZXBzaWxvbl90XHJpZ2h0KT0wJCBlICRWYXJcbGVmdChcZXBzaWxvbl90XHJpZ2h0KT1FXGxlZnRbXGVwc2lsb25fe3R9XnsyfVxyaWdodF09MSQuIFByaW1laXJvLCBhICoqbcOpZGlhIGluY29uZGljaW9uYWwqKiBkZSAkYV90JCBwZXJtYW5lY2UgJDAkIHBvcnF1ZToKCiQkCkVcbGVmdChhX3RccmlnaHQpID0gXHNpZ21hX3RFKFxlcHNpbG9uX3QpID0gMAokJApTZWd1bmRvLCBwYXJhIGVudGVuZGVyIGEgKip2YXJpw6JuY2lhIGluY29uZGljaW9uYWwqKiBkZSAkYV90JCwgZGVpeGUgJFxldGFfdCA9IGFfdF4yIC0gXHNpZ21hX3ReMiQgZGUgbW9kbyBxdWUgJFxzaWdtYV90XjIgPSBhX3ReMiAtIFxldGFfdCQgZSAkXHNpZ21hX3t0LWl9XjIgPSBhX3t0LWl9XjIgLSBcZXRhX3t0LWl9JCBwYXJhICRpPTAsMSwuLi4sbiQuIENvbSB0YWlzIGRlZmluacOnw7VlcyBwb2RlbW9zIGZhemVyOgoKJCQKXGJlZ2lue2FsaWduZWR9CiYmJiBcc2lnbWFfe3R9XnsyfSA9IFxhbHBoYV97MH0gKyBcYWxwaGFfezF9YV97dC0xfV57Mn0rXGJldGFfMVxzaWdtYV57Mn1fe3QtMX0gXFwKJiYmIFxcCiYmJiBhX3ReMi1cZXRhX3Q9XGFscGhhX3swfSArIFxhbHBoYV97MX1hX3t0LTF9XnsyfStcYmV0YV8xXGxlZnQoYV97dC0xfV4yLVxldGFfe3QtMX1ccmlnaHQpIFxcCiYmJiBcXAomJiYgYV90XjI9XGFscGhhX3swfStcYWxwaGFfezF9YV97dC0xfV57Mn0rXGJldGFfMWFfe3QtMX1eMitcZXRhX3QtXGJldGFfMVxldGFfe3QtMX0gXFwKJiYmIFxcCiYmJiBhX3ReMj1cYWxwaGFfezB9K1xsZWZ0KFxhbHBoYV97MX0rXGJldGFfMVxyaWdodClhX3t0LTF9XnsyfStcZXRhX3QtXGJldGFfMVxldGFfe3QtMX0gXFwKXGVuZHthbGlnbmVkfQokJApPYnNlcnZlIHF1ZSBhIGVxdWHDp8OjbyBhY2ltYSBlc3TDoSBubyBmb3JtYXRvIGRlIHVtIG1vZGVsbyAkQVJNQSgxLDEpJCwgbWFzIHBhcmEgJGFfdF4yJC4gQXNzaW0sIG8gbW9kZWxvICRHQVJDSCgxLDEpJCBwb2RlIHNlciB2aXN0byBjb21vIHVtYSBhcGxpY2HDp8OjbyBkYSBpZGVpYSBkbyAkQVJNQSgxLDEpJCDDoCBzw6lyaWUgZGUgJGFfdF4yJC4gQSBtw6lkaWEgaW5jb25kaWNpb25hbCBkbyBtb2RlbG8gJEFSTUEoMSwxKSQgZW5jb250cmFkYSBuZXN0ZSBbbGlua10oaHR0cHM6Ly9ycHVicy5jb20vaHVkc29uY2hhdnMvYXJtYSkgw6k6CgokJApFXGxlZnRbcl90XHJpZ2h0XT1cZnJhY3tccGhpXzB9ezEtXHBoaV8xfQokJAoKQXNzaW0sIGEgbcOpZGlhIGRvIG1vZGVsbyAkR0FSQ0goMSwxKSQgZXNjcml0byBjb21vICRBUk1BKDEsMSkkIHBhcmEgJGFfe3R9XnsyfSQgc2Vyw6E6CgokJApFXGxlZnRbYV90XjJccmlnaHRdPVxmcmFje1xhbHBoYV8wfXsxLVxsZWZ0KFxhbHBoYV8xK1xiZXRhXzFccmlnaHQpfQokJApxdWUgZm9ybmVjZSBhICoqdmFyacOibmNpYSBpbmNvbmRpY2lvbmFsKiogZGUgJGFfdCQgZSBhIHJlc3RyacOnw6NvIGrDoSBhcHJlc2VudGFkYSBkZSBxdWUgJFxhbHBoYV8xK1xiZXRhXzE8MSQgcGFyYSBxdWUgZWxhIHNlamEgcG9zaXRpdmEuIErDoSBhICoqY3VydG9zZSBpbmNvbmRpY2lvbmFsKiogZGUgJGFfdCQsIHNvYiBhIGhpcMOzdGUgZGUgcXVlICRcZXBzaWxvbl97dH0kIHNlZ3VlIHVtYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwsIHRlbW9zIHF1ZSBvIHF1YXJ0byBtb21lbnRvIGluY29uZGljaW9uYWwgw6kgaWd1YWwgYSAzLCBvdSBzZWphOgoKJCQKXGJlZ2lue3NwbGl0fQpcZnJhY3ttXzR9e21fMl57Mn19ICYgPSBcZnJhY3tFXGxlZnQoYV90LSBcYmFye2FfdH1ccmlnaHQpXjR9e1xsZWZ0W0VcbGVmdChhX3QtIFxiYXJ7YV90fVxyaWdodCleMlxyaWdodF1eMn0gPSAzIFxcCiYgXFwKRVxsZWZ0KGFfe3R9Xns0fVxyaWdodCkgJiA9IDNFXGxlZnQoYV90XjJccmlnaHQpXjIgIH5cdGV4dHtwb2lzfX5cYmFye2FfdH09MCBcXAomIFxcCiYgPSAzRVxsZWZ0KFxhbHBoYV97MH0gKyBcYWxwaGFfezF9YV97dC0xfV4yK1xiZXRhXzFcc2lnbWFeezJ9X3t0fSBccmlnaHQpXjIgClxlbmR7c3BsaXR9CiQkCgpxdWUgc2UgZGVyaXZhcm1vcyBzZW1lbGhhbnRlIGFvIHF1ZSBmaXplbW9zIHBhcmEgbyBtb2RlbG8gJEFSQ0gobSkkLCBzZXLDoToKCiQkClxmcmFje0VcbGVmdFthX3ReNFxyaWdodF19e1xsZWZ0W0UoYV90XjIpXHJpZ2h0XV4yfSA9IDNcbGVmdChcZnJhY3sxLVxsZWZ0KFxhbHBoYV8xK1xiZXRhXzFccmlnaHQpXjJ9ezEtXGxlZnQoXGFscGhhXzErXGJldGFfMVxyaWdodCleMi0yXGFscGhhXzFeMn1ccmlnaHQpID4gMwokJAoKQ29uc2VxdWVudGVtZW50ZSwgc2ltaWxhciBhbyBtb2RlbG8gJEFSQ0gobSkkLCBhIGNhdWRhIGRhIGRpc3RyaWJ1acOnw6NvIGRlIHVtIHByb2Nlc3NvICRHQVJDSCgxLDEpJCDDqSBtYWlzIHBlc2FkYSBkbyBxdWUgYSBjYXVkYSBkYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwgY3VqYSBjdXJ0b3NlIMOpIGlndWFsIGEgJDMkLgoKKiAqKlZBTlRBR0VOUyBETyBNT0RFTE8gR0FSQ0gqKgoKUGFyYSBmYWNpbGl0YXIgbyBlbnRlbmRpbWVudG8sIHN1cG9uaGEgcXVlIGNvbnRpbnVhbW9zIGNvbSB1bSBtb2RlbG8gJEdBUkNIKDEsMSkkLCBjb25mb3JtZSBhYmFpeG8uIAoKJCQKXGJlZ2lue2FsaWduZWR9CiYmJiBhX3QgPSBcc2lnbWFfe3R9XGVwc2lsb25fe3R9IFxcCiYmJiBcc2lnbWFfe3R9XjIgPSBcYWxwaGFfezB9ICsgXGFscGhhX3sxfWFfe3QtMX1eMiArIFxiZXRhXzFcc2lnbWFfe3QtMX1eezJ9ClxlbmR7YWxpZ25lZH0KJCQKQXNzaW0sIGFzIHByaW5jaXBhaXMgdmFudGFnZW5zIHPDo286CgoxLiBVbSBncmFuZGUgJGFfe3R9XjIkIG91ICRcc2lnbWFfe3QtMX1eMiQgZ2VyYXLDoSB1bSBncmFuZGUgJFxzaWdtYV97dH1eMiQsIG8gcXVlIHNpZ25pZmljYSBxdWUgdW0gZ3JhbmRlICRhX3t0LTF9XjIkIHRlbmRlIGEgc2VyIHNlZ3VpZG8gcG9yIG91dHJvIGdyYW5kZSAkYV97dH1eMiQuIElzc28gZ2VyYSBvIGNvbXBvcnRhbWVudG8gZGUgY2x1c3RlciBkZSB2b2xhdGlsaWRhZGUgasOhIGVzdHVkYWRvLiAKMi4gT3MgY2hvcXVlcyBkbyBtb2RlbG8sIHJlcHJlc2VudGFkb3MgcG9yICRhX3QkLCB0ZW0gY2F1ZGFzIHBlc2FkYXMKMy4gTyBtb2RlbG8gZm9ybmVjZSB1bWEgZnVuw6fDo28gcGFyYW3DqXRyaWNhIHNpbXBsZXMgcXVlIHBvZGUgc2VyIHVzYWRhIHBhcmEgZGVzY3JldmVyIGEgZXZvbHXDp8OjbyBkYSB2b2xhdGlsaWRhZGUKCiogKipFU1RJTUFORE8gVU0gTU9ERUxPIEdBUkNIKioKCk8gbWVzbW8gcHJvY2VkaW1lbnRvIChtw6F4aW1hIHZlcm9zc2ltaWxoYW7Dp2EpIHBhcmEgZXN0aW1hciBvIG1vZGVsbyAkQVJDSChtKSQgcG9kZSBzZXIgdXNhZG8gcGFyYSBlc3RpbWFyIHVtIG1vZGVsbyAkR0FSQ0gobSxuKSQsIG1hcyBhIGVzcGVjaWZpY2HDp8OjbyBzZSB0b3JuYSBtYWlzIGNvbXBsaWNhZGEuIExlbWJyZS1zZSBxdWUgZXNjcmV2ZW1vcyBvIG1vZGVsbyAkR0FSQ0gobSxuKSQgY29tbyB1bSBtb2RlbG8gQVJNQSBlIHF1ZSBwYXJhIGVzdGUgYSBkZWZpbmnDp8OjbyBkYSBlc3BlY2lmaWNhw6fDo28gKG9yZGVucyBkbyBtb2RlbG8pIMOpIGZlaXRhIHBvciBtZWlvIGRlIGNyaXTDqXJpb3MgZGUgaW5mb3JtYcOnw6NvLgoKQXNzaW0sIHV0aWxpemFyZW1vcyBhIG1lc21hIGFib3JkYWdlbSBwYXJhIG9zIG1vZGVsb3MgJEdBUkNIKG0sbikkLCBvdSBzZWphLCBlc3RpbWFtb3MgZGl2ZXJzYXMgY29tYmluYcOnw7VlcyBkZSAkbSQgZSAkbiQgdXNhbmRvIGFzIGZ1bsOnw7VlcyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpIGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsIChGQUNQKS4gQXDDs3MgaXNzbywgZXNjb2xoZXJlbW9zIG8gbW9kZWxvIGNvbSBtZW5vciBBSUMgZS9vdSBCSUMuIAoKTm8gbW9tZW50byBxdWUgb2JzZXJ2YW1vcyBhIGFtb3N0cmEgZGUgZGFkb3MgZGEgbm9zc2Egc8OpcmllIHRlbXBvcmFsIGRlIHJldG9ybm9zLCBvIG9iamV0aXZvIG5vIHByb2Nlc3NvIGRlIG90aW1pemHDp8OjbyBkYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIMOpIGVuY29udHJhciBvIHZldG9yIGRlIHBhcsOibWV0cm9zICRcYm9sZHN5bWJvbHtcdGhldGF9JCBxdWUgbWF4aW1pemEgdGFsIGZ1bsOnw6NvLiBDb21vIGV4ZW1wbG8sIHN1cG9uaGEgcXVlIHRlbW9zIG8gbW9kZWxvICRBUigxKS1HQVJDSCgxLDEpJCBhYmFpeG86CgokJApcYmVnaW57YWxpZ25lZH0KJiYmIHJfe3R9ID0gXG11X3t0fSArIGFfe3R9IFxcCiYmJiBcbXVfe3R9ID0gXHBoaV97MH0gKyBccGhpX3sxfXJfe3QtMX0gIFxcCiYmJiBhX3QgPSBcc2lnbWFfe3R9XGVwc2lsb25fe3R9IFxcCiYmJiBcc2lnbWFfe3R9XjIgPSBcYWxwaGFfezB9ICsgXGFscGhhX3sxfWFfe3QtMX1eMiArIFxiZXRhX3sxfVxzaWdtYV97dC0xfV57Mn0KXGVuZHthbGlnbmVkfQokJApDb20gdGFpcyBpbmZvcm1hw6fDtWVzLCBhIGZ1bsOnw6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2EgYXDDs3Mgb2JzZXJ2YXIgYSBhbW9zdHJhIGRlIHJldG9ybm9zIHNlcsOhOgoKJCQKXGJlZ2lue2FsaWduZWR9CiYmJiBMKFxib2xkc3ltYm9se1x0aGV0YX18UikgPSBmKFxib2xkc3ltYm9se1x0aGV0YX18IHJfe3R9LHJfe3QtMX0sLi4uLHJfezF9fCkgPSBccHJvZF97dD0yfV57VH17IFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWFfe3R9XnsyfX19ZXhwXGxlZnRcey1cZnJhY3socl97dH0tXG11KV4yfXsyXHNpZ21hX3t0fV57Mn19ICBccmlnaHRcfX0gXFwKJiYmIFxcCiYmJiBMKFxib2xkc3ltYm9se1x0aGV0YX18UikgPSBmKFxib2xkc3ltYm9se1x0aGV0YX18IHJfe3R9LHJfe3QtMX0sLi4uLHJfezF9KSA9IFxwcm9kX3t0PTJ9XntUfXsgXGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYV97dH1eezJ9fX1leHBcbGVmdFx7LVxmcmFje2Ffe3R9XjJ9ezJcc2lnbWFfe3R9XnsyfX0gIFxyaWdodFx9fSBcXAomJiYgXFwKJiYmIEwoXGJvbGRzeW1ib2x7XHRoZXRhfXxSKSA9IGYoXGJvbGRzeW1ib2x7XHRoZXRhfXwgcl97dH0scl97dC0xfSwuLi4scl97MX0pID0gXHByb2Rfe3Q9Mn1ee1R9eyBcZnJhY3sxfXtcc3FydHsyXHBpXGxlZnQoXGFscGhhX3swfSArIFxhbHBoYV97MX1hX3t0LTF9XjIgKyBcYmV0YV97MX1cc2lnbWFfe3QtMX1eezJ9XHJpZ2h0KX19ZXhwXGxlZnRcey1cZnJhY3socl90LVxwaGlfezB9IC0gXHBoaV97MX1yX3t0LTF9KV4yfXsyXGxlZnQoXGFscGhhX3swfSArIFxhbHBoYV97MX1hX3t0LTF9XjIrIFxiZXRhX3sxfVxzaWdtYV97dC0xfV57Mn1ccmlnaHQpfSAgXHJpZ2h0XH19IFxcCiYmJiBcXAomJiYgTChcYm9sZHN5bWJvbHtcdGhldGF9fFIpID0gZihcYm9sZHN5bWJvbHtcdGhldGF9fCByX3t0fSxyX3t0LTF9LC4uLixyX3sxfSkgPSBccHJvZF97dD0yfV57VH17IFxmcmFjezF9e1xzcXJ0ezJccGlcbGVmdChcYWxwaGFfezB9ICsgXGFscGhhX3sxfVxsZWZ0W3Jfe3QtMX0tXHBoaV97MH0gLSBccGhpX3sxfXJfe3QtMn0gXHJpZ2h0XV4yK1xiZXRhX3sxfVxzaWdtYV97dC0xfV57Mn1ccmlnaHQpfX1leHBcbGVmdFx7LVxmcmFjeyhyX3QtXHBoaV97MH0gLSBccGhpX3sxfXJfe3QtMX0pXjJ9ezJcbGVmdChcYWxwaGFfezB9ICsgXGFscGhhX3sxfVxsZWZ0W3Jfe3QtMX0tXHBoaV97MH0gLSBccGhpX3sxfXJfe3QtMn0gXHJpZ2h0XV4yICtcYmV0YV97MX1cc2lnbWFfe3QtMX1eezJ9XHJpZ2h0KX0gIFxyaWdodFx9fSBcXApcZW5ke2FsaWduZWR9CiQkCgplICRcc2lnbWFfe3R9XnsyfSQgcG9kZSBzZXIgY2FsY3VsYWRvIHJlY3Vyc2l2YW1lbnRlIGRhZG8gcXVlIGFzc3VtaW1vcyBvcyB2YWxvcmVzIGluaWNpYWlzICRyXzAkLCAkYV8wJCBlICRcc2lnbWFfMCQuIElzc28gcGVybWl0aXLDoSBlbmNvbnRyYXIgbyB2ZXRvciBkZSBwYXLDom1ldHJvcyAkXGJvbGRzeW1ib2x7XHRoZXRhfSA9IFxsZWZ0KFxwaGlfMCwgXHBoaV8xLCBcYWxwaGFfMCwgXGFscGhhXzEsIFxiZXRhXzFccmlnaHQpJC4gIAoKCiMjIyMjICoqQ09OU1RSVcOHw4NPIERPIE1PREVMTyBERSBIRVRFUk9DRURBU1RJQ0lEQURFIENPTkRJQ0lPTkFMKioKCkNvbnN0cnVpciB1bSBtb2RlbG8gZGUgdm9sYXRpbGlkYWRlIHBhcmEgbyByZXRvcm5vIGRlIHVtYSBzw6lyaWUgdGVtcG9yYWwgZmluYW5jZWlyYSBjb25zaXN0ZSBkZSA0IHBhc3NvczoKCjEuIEVzcGVjaWZpY2FyIGEgZXF1YcOnw6NvIHBhcmEgYSBtw6lkaWEgY29uZGljaW9uYWwgKCRcbXVfe3R9JCk6CiAgICAqIFZpc3VhbGl6YXIgb3MgZGFkb3MgZSBpZGVudGlmaWNhciBvYnNlcnZhw6fDtWVzIGZvcmEgZG8gcGFkcsOjbyAoKm91dGxpZXJzKiBvdSBkYWRvcyBmYWx0YW50ZXMpIGUgZWxpbWluw6EtbGFzLgogICAgKiBTZSBuZWNlc3PDoXJpbywgdHJhbnNmb3JtYXIgb3MgZGFkb3MgcGFyYSBlc3RhYmlsaXphciBhIHZhcmnDom5jaWEgKGxvZ2FyaXRtbyBkb3MgZGFkb3MsIHZhcmlhw6fDo28gb3UgcmV0b3JubywgcG9yIGV4ZW1wbG8pCiAgICAqIFRlc3RhciBzZSBvcyBkYWRvcyBzw6NvIGVzdGFjaW9uw6FyaW9zLiBDYXNvIHRlbmhhIHJhaXogdW5pdMOhcmlhIMOpIHByZWNpc28gZGlmZXJlbmNpYXIgb3MgZGFkb3MgYXTDqSBzZSB0b3JuYXJlbSBlc3RhY2lvbsOhcmlvcy4gUGFyYSBpc3NvLCB0ZXN0YS1zZSBub3ZhbWVudGUgc2UgYSBzw6lyaWUgZGlmZXJlbmNpYWRhIHNlIHRvcm5vdSBlc3RhY2lvbsOhcmlhLgogICAgKiBFeGFtaW5hciBhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCAoRkFDUCkgcGFyYSBkZXRlcm1pbmFyIGFzIG9yZGVucyBtw6F4aW1hcyAkUCQgZSAkUSQgcGFyYSBvcyBjb21wb25lbnRlcyBBUiBlIE1BIGRhIHPDqXJpZSBlc3RhY2lvbsOhcmlhIChkaWZlcmVuY2lhZGEsIHNlIG5lY2Vzc8OhcmlvKS4KICAgICogRXN0aW1hciB0b2RhcyBhcyBjb21iaW5hw6fDtWVzIHBhcmEgJHAkLCAkZCQgZSAkcSQuIEFxdWksICRkJCBzZXLDoSBmaXhvIGUgaWd1YWwgYW8gbsO6bWVybyBkZSB2ZXplcyBuZWNlc3PDoXJpYXMgcGFyYSB0b3JuYXIgYSBzw6lyaWUgb3JpZ2luYWwgZXN0YWNpb27DoWlyYS4gU2UgbsOjbyBmb2kgcHJlY2lzbyBkaWZlcmVuY2lhciBhIHPDqXJpZSwgJGQ9MCQuCiAgICAqIEVzY29saGVyIGRlbnRyZSB0b2RvcyBvcyBtb2RlbG9zIGVzdGltYWRvcyBubyBwYXNzbyBhbnRlcmlvciwgbyBtb2RlbG8gY29tIG1lbm9yIEFJQyBlL291IEJJQy4KICAgICAgICAqIENhc28gYSBlc3BlY2lmaWNhw6fDo28gZXNjb2xoaWRhIHNlamEgJEFSTUEoMCwwKSQgdGVyZW1vcyBhcGVuYXMgdW0gcGFyw6JtZXRybyBkbyB0aXBvICRccGhpX3swfSQgcGFyYSBhIG3DqWRpYSBjb25kaWNpb25hbAogICAgKiBFeGFtaW5hciBzZSBvcyByZXPDrWR1b3Mgc2UgY29tcG9ydGFtIGNvbW8gdW0gcnXDrWRvIGJyYW5jbzoKICAgICAgICAqIFRlc3RhciBhdXRvY29ycmVsYcOnw6NvIG5vcyByZXPDrWR1b3M6IHZpc3VhbGl6YXIgYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIChGQUMpIGRvcyByZXPDrWR1b3MuIFNlIGV4aXN0ZW0gZGVmYXNhZ2VucyBlc3RhdGlzdGljYW1lbnRlIHNpZ25pZmljYW50ZSAoYWNpbWEgZGEgbGluaGEgcG9udGlsaGFkYSksIGjDoSBhdXRvY29ycmVsYcOnw6NvIHNlcmlhbC4KICAgICAgICAqIFRlc3RhciBoZXRlcm9jZWRhc3RpY2lkYWRlIGNvbmRpY2lvbmFsOiB2aXN1YWxpemFyIGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBkb3MgcmVzw61kdW9zIGFvIHF1YWRyYWRvLiBTZSBleGlzdGVtIGRlZmFzYWdlbnMgZXN0YXRpc3RpY2FtZW50ZSBzaWduaWZpY2FudGUgKGFjaW1hIGRhIGxpbmhhIHBvbnRpbGhhZGEpLCBow6EgaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbC4gT3V0cmEgYWx0ZXJuYXRpdmEgw6kgbyB0ZXN0ZSBMTSBkZSBAZW5nbGUxOTgyYXV0b3JlZ3Jlc3NpdmUuCiAgICAgICAgKiBWZXJpZmljYXIgYSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlIGFzc3VtaWRhIG5vIHByb2Nlc3NvIGRlIGVzdGltYcOnw6NvOiByZWFsaXphciB0ZXN0ZSBxdWUgdmVyaWZpcXVlIHNlIG9zIHJlc8OtZHVvcyBzZSBjb21wb3J0YW0gZGUgYWNvcmRvIGNvbSBhIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGUgYWRvdGFkYS4KICAgICogU2Ugb3MgcmVzw61kdW9zIHPDo28gYmVtIGNvbXBvcnRhZG9zIChydcOtZG8gYnJhbmNvKSwgKipvYnRlciBhcyBwcmV2aXPDtWVzIGFwZW5hcyBjb20gYSBlc3RpbWHDp8OjbyBkYSBtw6lkaWEgY29uZGljaW9uYWwqKi4gQ2FzbyBjb250csOhcmlvLCByZXZpc2FyIG9zIHBhc3NvcyBhbnRlcmlvcmVzIHBhcmEgY2VydGlmaWNhciBxdWUgZm9yYW0gcmVhbGl6YWRvcyBjb3JyZXRhbWVudGUuIFNlIG1lc21vIGFzc2ltIGV4aXN0aXIgaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbCBlIGEgZGlzdHJpYnVpw6fDo28gZGUgcHJvYmFiaWxpZGFkZSBuw6NvIGNvbmRpeiBjb20gYSBoaXDDs3Rlc2UgYXNzdW1pZGEgKGdlcmFsbWVudGUgdW1hIGRpc3RyaWJ1acOnw6NvIE5vcm1hbCksICoqYXZhbsOnYXIgcGFyYSBvIHByw7N4aW1vIHBhc3NvIGUgZXN0aW1hciBhIHZhcmnDom5jaWEgY29uZGljaW9uYWwgdGFtYsOpbSoqLiAKMi4gRXNwZWNpZmljYXIgdW0gbW9kZWxvIGRlIHZvbGF0aWxpZGFkZSBlIGVzdGltYXIgKipjb25qdW50YW1lbnRlKiogYXMgZXF1YcOnw7VlcyBkYSBtw6lkaWEgZSB2YXJpw6JuY2lhIGNvbmRpY2lvbmFsOgogICAgKiBFeGFtaW5hciBhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCAoRkFDUCkgZG9zIHJlc8OtZHVvcyBhbyBxdWFkcmFkbyAqKihvYnRpZG9zIGRhIGVzdGltYcOnw6NvIGRhIG3DqWRpYSBjb25kaWNpb25hbCkqKiBwYXJhIGRldGVybWluYXIgYXMgb3JkZW5zIG3DoXhpbWFzICRNJCBlICROJCBwYXJhIG9zIGNvbXBvbmVudGVzIEFSQ0ggZSBHQVJDSCwgcmVzcGVjdGl2YW1lbnRlLgogICAgKiBFeGFtaW5hciBvIGhpc3RvZ3JhbWEgZG9zIHJlc8OtZHVvcyBqdW50YW1lbnRlIGNvbSBhIGRlbnNpZGFkZSBkYXMgZGlzdHJpYnVpw6fDtWVzIE5vcm1hbCBlIHQtU3R1ZGVudCBwYXJhIGRldGVybWluYXIgcXVhbCBhIG1lbGhvciBkaXN0cmlidWnDp8OjbyBzZSBhanVzdGEgYW9zIGRhZG9zLiBPdXRyYXMgZGlzdHJpYnVpw6fDtWVzIGRlIHByb2JhYmlsaWRhZGUgdGFtYsOpbSBwb2RlbSBzZXIgdXNhZGFzLCB0YWwgY29tbyBhIFtDYXVjaHldKGh0dHBzOi8vcHQud2lraXBlZGlhLm9yZy93aWtpL0Rpc3RyaWJ1aSVDMyVBNyVDMyVBM29fZGVfQ2F1Y2h5KS4gQWzDqW0gZGlzc28sIHZvY8OqIHBvZGUgdXNhciBhIHZlcnPDo28gYXNzaW3DqXRyaWNhIGRlc3RhcyBkaXN0cmlidWnDp8O1ZXMgY2FzbyBwZXJjZWJhIGFzc2ltZXRyaWEgbm8gaGlzdG9ncmFtYSBkb3MgcmVzw61kdW9zLgogICAgKiBFc3RpbWFyIHRvZGFzIGFzIGNvbWJpbmHDp8O1ZXMgcGFyYSAkbT0xLC4uLE0kIGUgJG49MCwuLi4sTiQgcGFyYSBhIHZhcmnDom5jaWEgY29uZGljaW9uYWwganVudGFtZW50ZSBjb20gYSBlc3BlY2lmaWNhw6fDo28gQVJNQShwLHEpIGVzY29saGlkYSBubyBwYXNzbyAxCiAgICAqIEVzY29saGVyIG8gbW9kZWxvIGNvbSBtZW5vciBBSUMgZS9vdSBCSUMKMy4gVmVyaWZpY2FyIG8gbW9kZWxvIGVzdGltYWRvIAogICAgKiBBdmFsaWFyIG8gZ3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBkbyBxdWFkcmFkbyBkb3MgKipyZXPDrWR1b3MgcGFkcm9uaXphZG9zKiogZXN0aW1hZG9zIG5vIHBhc3NvIDIuIE8gaWRlYWwgw6kgcXVlIGFzIGRlZmFzYWdlbnMgbsOjbyB1bHRyYXBhc3NlbSBhIGxpbmhhIHBvbnRpbGhhZGEuCiAgICAqIEF2YWxpYXIgc2UgYXMgcmVzdHJpw6fDtWVzIGltcG9zdGFzIHNvYnJlIG9zIHBhcsOibWV0cm9zIHPDo28gYXRlbmRpZGFzCiAgICAqIFRlc3RhciBzZSBvcyAqKnJlc8OtZHVvcyBwYWRyb25pemFkb3MqKiBzZSBjb21wb3J0YW0gY29uZm9ybWUgYSBoaXDDs3RlIGRlIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGUgYXNzdW1pZGEgbm8gcGFzc28gMiBubyBtb21lbnRvIGRlIGVzdGltYXIgY29uanVudGFtZW50ZSBhIG3DqWRpYSBjb25kaWNpb25hbCBlIGEgdmFyacOibmNpYSBjb25kaWNpb25hbC4KNC4gVmlzdWFsaXphciBvcyByZXN1bHRhZG9zCiAgICAqIEdyw6FmaWNvIGRhIHZvbGF0aWxpZGFkZSBjb25kaWNpb25hbAo1LiBPYnRlciBhcyBwcmV2aXPDtWVzCiAgICAKCgojIyMjIyAqKlJFRkVSw4pOQ0lBUyoq