A base de dados

Importando

rm(list=ls())
base <- read.csv("C:/Users/raphael.fernandez/Downloads/Advertising.csv")
base$X = NULL
kable(head(base)) %>%
  kable() %>%
  kable_styling()
Error in as.data.frame.default(x) : 
  cannot coerce class ‘"knitr_kable"’ to a data.frame


Avaliando as variáveis

Como não há informações a priori no quis respeito a natureza das variáveis, faz-se necessária a investigação de algumas características das mesmas.

str(base)
'data.frame':   200 obs. of  4 variables:
 $ TV       : num  230.1 44.5 17.2 151.5 180.8 ...
 $ radio    : num  37.8 39.3 45.9 41.3 10.8 48.9 32.8 19.6 2.1 2.6 ...
 $ newspaper: num  69.2 45.1 69.3 58.5 58.4 75 23.5 11.6 1 21.2 ...
 $ sales    : num  22.1 10.4 9.3 18.5 12.9 7.2 11.8 13.2 4.8 10.6 ...

Verifica-se que todas as variáveis são contínuas e não há evidências empíricas que apontem a presença de observações não-positivas


Visualizacão gráfica

par(mfrow=c(2,2))
plot(density(base$TV),main="Densidade da TV")
plot(density(base$radio),main="Densidade da radio")
plot(density(base$newspaper),main="Densidade do Jornal")
plot(density(base$sales),main="Densidade das Vendas")

A densidade da Televisão e do Rádio apontam para uma mistura de distribuições, mas como é considerado anti ético a observação do conjunto dos dados antes da modelagem a priori, iremos apenas nos ater a variável resposta, que demonstra comportamento assimétrico, com decaimento rápido, comportamento comumente observado em um distribuições da família Gama.


Não-normalidade

jarque.bera.test(base$sales)

    Jarque Bera Test

data:  base$sales
X-squared = 6.9848, df = 2, p-value = 0.03043
hist(base$sales,main="Histograma das Vendas")

qqnorm(base$sales)
qqline(base$sales)

Embora seja possível afrouxar a condição de normalidade, em termos visuais, o teste Jarque Bera elimina qualquer hipótese da mesma, ao nível de 0,05.


Modelo proposto

O modelo ajustado será um Modelo Linear Generalizado através da abordagem bayesiana, com a seguinte equação \(Y_i = \beta_0+\beta_1x_i+\beta_2x_i+\beta_3x_i + e_i\)


Verossimilhança

Posto que a distribuição da variável resposta não pode ser assumida como normal, o conceito de subjetividade da filosofia Bayesiana nos permite atribuir uma distribuição para verossimilhança \(Y|\phi, \beta_0,\beta_1,\beta_2, \sigma^2\), onde todos os parâmetros mencionados são desconhecidos.

Logo, será assumida para a mesma uma distribuição Gamma reparametrizada, com parâmetro de escala \(\phi\) e parâmetro de dispersão \(\cfrac{\phi}{\mu}\)

De modo que \(\mu = e^{\beta_0+\beta_1x_i+\beta_2x_i+\beta_3x_i}\), isto é, o preditor linear de uma regressão linear gama usual supondo a inclusão na família exponencial para garantia das propriedades de converg?ncia.


Prioris hierárquicas

Em inferência bayesiana, quantidades desconhecidas são atribuídas com distribuição, chamadas de priori.

Para os casos estudados:

\(\phi \sim Gamma(1;0,1)\)

\(\beta_0 \sim Gamma(1;0,1)\)

\(\beta_1 \sim Gamma(1;0,1)\)

\(\beta_2 \sim Gamma(1;0,1)\)

\(\beta_3 \sim Gamma(1;0,1)\)

\(\sigma^2 \sim Gamma(1;0,1)\)

Atribui-se os seguintes parâmetros de forma a obter-se média 10 e variância 100, garantindo o que é chamado de priori não informativa, utilizada quando não há informação sob a base trabalhada, o que é o caso.


Markov Chain Monte Carlo

Segue do Teorema de Bayes que

\(\pi(\theta|x) = \cfrac{\pi(x|\theta)\pi(\theta)}{\pi(x)}\)

\(\propto\)

\(\pi(x|\theta)\pi(\theta)\)

Onde

\(\pi(\theta|x)\) é um vetor paramétrico da distribuição a posteriori, desconhecida

\(\pi(x|\theta)\) é a verossimilhaça dos dados, observado

\(\pi(x)\) é um vetor paramétrico de distribuições a priori

Em geral, não é possível a obtenção direta da distribuição a posteriori, que é o grande interesse. Para estas situações, a metodologia de Markov Chain Monte Carlo oferece uma convergência garantida via simulaçao por processos estocásticos.


Simulação da Distribuição a Posteriori

Utilizaremos o pacote R2WinBugs para efeito de c?lculo

y=base$sales
x1=base$newspaper
#Modelo do tipo BUGS
sink("mod1.txt")        
cat("
    MODEL LR1 {
    #Verossimilhan?a 
    for(i in 1:N) {
    y[i] ~ dgamma(mu[i],tau)
    mu[i] <- beta0 + beta1*x1[i]
    }
    #Proris
    beta0 ~ dgamma(1,0.1)
    beta1 ~ dgamma(1,0.1)
    tau ~ dgamma(1,0.1)
    
    #Transforma??o para vari?ncia
    sigma2 <- 1/tau
    } ", fill = TRUE)
sink()
#Obeservação: A dist normal no bugs está definida para a precisão. 
#Tamanho amostral
N = length(y)
#Conjunto de dados observados
data = list("N","y","x1")
#Parâmetros estudados
params = c("beta0", "beta1","tau","sigma2")  
#Valores iniciais
inits <- function () {list(beta0 = rnorm(1),
                           beta1 = rnorm(1),
                           tau = 1)
                           sigma2 = 1}
#Modelo final
result <- bugs(data = data, inits = inits, parameters.to.save = params,
               model.file = "mod1.txt", n.chains = 3, n.iter = 10000,
               n.burnin = 1000, n.thin=9, bugs.directory = "C:/WinBUGS14",
               debug = TRUE, save.history = TRUE, DIC = FALSE)

Foram excluídas da análise as covariáveis onde acreditase, antecipadamente, que estas sejam composições, isto é, soma de outras variáveis. São estas: Radio e TV. Permaneceu no modelo apenas o Jornal como priori, por apresentar um comportamento cujo um modelo mais simples, como o aqui apresentado, é mais adequado.

Todas as atribuições aqui definidas foram retiradas de Gelman et al. 2004


Modelo final

Sumário da distribuição a posteriori

result$summary %>%
  kable() %>%
  kable_styling()
mean sd 2.5% 25% 50% 75% 97.5% Rhat n.eff
beta0 6.2581520 0.6621779 5.015625 5.7970000 6.243000 6.683000 7.6200500 1.004490 500
beta1 0.0278669 0.0089434 0.010609 0.0219275 0.027775 0.033960 0.0455605 1.000811 3000
tau 0.5070021 0.0507519 0.412195 0.4731750 0.505950 0.539025 0.6136000 1.004720 510
sigma2 1.9924600 0.2029242 1.630000 1.8550000 1.976500 2.113250 2.4260250 1.004718 510


Convergência das cadeias

bugs = result$sims.list
bugs_b0 = bugs$beta0
bugs_b1 = bugs$beta1
bugs_phi = bugs$tau
plot(bugs_b0,type = "l",main=expression(beta[0]),ylab="",
     xlab="",cex.main=2)

plot(bugs_b1,type = "l",main=expression(beta[1]),ylab="",
     xlab="",cex.main=2)

plot(bugs_phi,type = "l",main=expression(phi),ylab="",
     xlab="",cex.main=2)

Verifca-se uma boa convergência, embora usualmente seja feito critérios, aqui não o será. Apenas critérios visuais.


Densidade das distribuições a posteriori

densplot(as.mcmc(bugs_b0),main=expression(beta[0]),xlab="",ylab="",cex.main=2)

densplot(as.mcmc(bugs_b1),main=expression(beta[1]),xlab="",ylab="",cex.main=2)

densplot(as.mcmc(bugs_phi),main=expression(phi),xlab="",ylab="",cex.main=2)

O comportamento “normal” das posterioris simuladas é esperado. Com as prioris impostas, o resultado analático esperado é de uma distribuição Gama para os parâmetros, maginalmente.


Equação do modelo

Na abordagem bayesiana, considera-se alguma função perda para atribuir a estimação de parâmetros. Aqui, foi utilizado a média, isto é, a perda quadrática.

\(Yi = 6,25 + 0,03Xi\)


Interpretação do modelo

Como a função de ligação é a exponencial, um acréscimo de 1 em TV, significa um acréscimo de \(e^{6,25 + 0,03}\) nas vendas

LS0tDQp0aXRsZTogIlRyYWJhbGhvIDEgLSBJbnRlbGlnw6puY2lhIENvbXB1dGFjaW9uYWwiDQphdXRob3I6ICJSYWZhZWwgQ2FicmFsIEZlcm5hbmRleiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KCJrYWJsZUV4dHJhIikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KFIyV2luQlVHUykNCg0KYGBgDQo8YnI+DQo8YnI+DQoNCiMgQSBiYXNlIGRlIGRhZG9zDQoNCiMjSW1wb3J0YW5kbw0KYGBge3IgY2Fyc30NCnJtKGxpc3Q9bHMoKSkNCmJhc2UgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL3JhcGhhZWwuZmVybmFuZGV6L0Rvd25sb2Fkcy9BZHZlcnRpc2luZy5jc3YiKQ0KYmFzZSRYID0gTlVMTA0Ka2FibGUoaGVhZChiYXNlKSkNCg0KYGBgDQo8YnI+DQoNCiMgQXZhbGlhbmRvIGFzIHZhcmnDoXZlaXMgDQoNCkNvbW8gbsOjbyBow6EgaW5mb3JtYcOnw7VlcyBhIHByaW9yaSBubyBxdWlzIHJlc3BlaXRvIGEgbmF0dXJlemEgZGFzIHZhcmnDoXZlaXMsIGZhei1zZSBuZWNlc3PDoXJpYSBhIGludmVzdGlnYcOnw6NvIGRlIGFsZ3VtYXMgY2FyYWN0ZXLDrXN0aWNhcyBkYXMgbWVzbWFzLg0KPGJyPg0KDQpgYGB7cn0NCnN0cihiYXNlKQ0KYGBgDQoNClZlcmlmaWNhLXNlIHF1ZSB0b2RhcyBhcyB2YXJpw6F2ZWlzIHPDo28gY29udMOtbnVhcyBlIG7Do28gaMOhIGV2aWTDqm5jaWFzIGVtcMOtcmljYXMgcXVlIGFwb250ZW0gYSBwcmVzZW7Dp2EgZGUgb2JzZXJ2YcOnw7VlcyBuw6NvLXBvc2l0aXZhcw0KDQo8YnI+DQoNCiNWaXN1YWxpemFjw6NvIGdyw6FmaWNhDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0V9DQpwYXIobWZyb3c9YygyLDIpKQ0KcGxvdChkZW5zaXR5KGJhc2UkVFYpLG1haW49IkRlbnNpZGFkZSBkYSBUViIpDQpwbG90KGRlbnNpdHkoYmFzZSRyYWRpbyksbWFpbj0iRGVuc2lkYWRlIGRhIHJhZGlvIikNCnBsb3QoZGVuc2l0eShiYXNlJG5ld3NwYXBlciksbWFpbj0iRGVuc2lkYWRlIGRvIEpvcm5hbCIpDQpwbG90KGRlbnNpdHkoYmFzZSRzYWxlcyksbWFpbj0iRGVuc2lkYWRlIGRhcyBWZW5kYXMiKQ0KYGBgDQoNCg0KQSBkZW5zaWRhZGUgZGEgVGVsZXZpc8OjbyBlIGRvIFLDoWRpbyBhcG9udGFtIHBhcmEgdW1hIG1pc3R1cmEgZGUgZGlzdHJpYnVpw6fDtWVzLCBtYXMgY29tbyDDqSBjb25zaWRlcmFkbyBhbnRpIMOpdGljbyBhIG9ic2VydmHDp8OjbyBkbyBjb25qdW50byBkb3MgZGFkb3MgYW50ZXMgZGEgbW9kZWxhZ2VtIGEgcHJpb3JpLCBpcmVtb3MgYXBlbmFzIG5vcyBhdGVyIGEgdmFyacOhdmVsIHJlc3Bvc3RhLCBxdWUgZGVtb25zdHJhIGNvbXBvcnRhbWVudG8gYXNzaW3DqXRyaWNvLCBjb20gZGVjYWltZW50byByw6FwaWRvLCBjb21wb3J0YW1lbnRvIGNvbXVtZW50ZSBvYnNlcnZhZG8gZW0gdW0gZGlzdHJpYnVpw6fDtWVzIGRhIGZhbcOtbGlhIEdhbWEuIA0KDQo8YnI+DQoNCiMgTsOjby1ub3JtYWxpZGFkZQ0KYGBge3J9DQpqYXJxdWUuYmVyYS50ZXN0KGJhc2Ukc2FsZXMpDQpoaXN0KGJhc2Ukc2FsZXMsbWFpbj0iSGlzdG9ncmFtYSBkYXMgVmVuZGFzIikNCnFxbm9ybShiYXNlJHNhbGVzKQ0KcXFsaW5lKGJhc2Ukc2FsZXMpDQpgYGANCg0KRW1ib3JhIHNlamEgcG9zc8OtdmVsIGFmcm91eGFyIGEgY29uZGnDp8OjbyBkZSBub3JtYWxpZGFkZSwgZW0gdGVybW9zIHZpc3VhaXMsIG8gdGVzdGUgSmFycXVlIEJlcmEgZWxpbWluYSBxdWFscXVlciBoaXDDs3Rlc2UgZGEgbWVzbWEsIGFvIG7DrXZlbCBkZSAwLDA1Lg0KDQo8YnI+DQoNCg0KI01vZGVsbyBwcm9wb3N0bw0KDQpPIG1vZGVsbyBhanVzdGFkbyBzZXLDoSB1bSBNb2RlbG8gTGluZWFyIEdlbmVyYWxpemFkbyBhdHJhdsOpcyBkYSBhYm9yZGFnZW0gYmF5ZXNpYW5hLCBjb20gYSBzZWd1aW50ZSBlcXVhw6fDo28gJFlfaSA9IFxiZXRhXzArXGJldGFfMXhfaStcYmV0YV8yeF9pK1xiZXRhXzN4X2kgKyBlX2kkDQoNCjxicj4NCg0KI1Zlcm9zc2ltaWxoYW7Dp2ENCg0KUG9zdG8gcXVlIGEgZGlzdHJpYnVpw6fDo28gZGEgdmFyacOhdmVsIHJlc3Bvc3RhIG7Do28gcG9kZSBzZXIgYXNzdW1pZGEgY29tbyBub3JtYWwsIG8gY29uY2VpdG8gZGUgc3ViamV0aXZpZGFkZSBkYSBmaWxvc29maWEgQmF5ZXNpYW5hIG5vcyBwZXJtaXRlIGF0cmlidWlyIHVtYSBkaXN0cmlidWnDp8OjbyBwYXJhIHZlcm9zc2ltaWxoYW7Dp2EgJFl8XHBoaSwgXGJldGFfMCxcYmV0YV8xLFxiZXRhXzIsIFxzaWdtYV4yJCwgb25kZSB0b2RvcyBvcyBwYXLDom1ldHJvcyBtZW5jaW9uYWRvcyBzw6NvIGRlc2NvbmhlY2lkb3MuIA0KDQpMb2dvLCBzZXLDoSBhc3N1bWlkYSBwYXJhIGEgbWVzbWEgdW1hIGRpc3RyaWJ1acOnw6NvIEdhbW1hIHJlcGFyYW1ldHJpemFkYSwgY29tIHBhcsOibWV0cm8gZGUgZXNjYWxhICRccGhpJCBlIHBhcsOibWV0cm8gZGUgZGlzcGVyc8OjbyAkXGNmcmFje1xwaGl9e1xtdX0kDQoNCkRlIG1vZG8gcXVlICRcbXUgPSBlXntcYmV0YV8wK1xiZXRhXzF4X2krXGJldGFfMnhfaStcYmV0YV8zeF9pfSQsIGlzdG8gw6ksIG8gcHJlZGl0b3IgbGluZWFyIGRlIHVtYSByZWdyZXNzw6NvIGxpbmVhciBnYW1hIHVzdWFsIHN1cG9uZG8gYSBpbmNsdXPDo28gbmEgZmFtw61saWEgZXhwb25lbmNpYWwgcGFyYSBnYXJhbnRpYSBkYXMgcHJvcHJpZWRhZGVzIGRlIGNvbnZlcmc/bmNpYS4gDQoNCjxicj4NCg0KDQojUHJpb3JpcyBoaWVyw6FycXVpY2FzDQoNCkVtIGluZmVyw6puY2lhIGJheWVzaWFuYSwgcXVhbnRpZGFkZXMgZGVzY29uaGVjaWRhcyBzw6NvIGF0cmlidcOtZGFzIGNvbSBkaXN0cmlidWnDp8OjbywgY2hhbWFkYXMgZGUgcHJpb3JpLiANCg0KUGFyYSBvcyBjYXNvcyBlc3R1ZGFkb3M6DQoNCiRccGhpIFxzaW0gR2FtbWEoMTswLDEpJA0KDQokXGJldGFfMCBcc2ltIEdhbW1hKDE7MCwxKSQNCg0KJFxiZXRhXzEgXHNpbSBHYW1tYSgxOzAsMSkkDQoNCiRcYmV0YV8yIFxzaW0gR2FtbWEoMTswLDEpJA0KDQokXGJldGFfMyBcc2ltIEdhbW1hKDE7MCwxKSQNCg0KJFxzaWdtYV4yIFxzaW0gR2FtbWEoMTswLDEpJA0KDQpBdHJpYnVpLXNlIG9zIHNlZ3VpbnRlcyBwYXLDom1ldHJvcyBkZSBmb3JtYSBhIG9idGVyLXNlIG3DqWRpYSAxMCBlIHZhcmnDom5jaWEgMTAwLCBnYXJhbnRpbmRvIG8gcXVlIMOpIGNoYW1hZG8gZGUgcHJpb3JpIG7Do28gaW5mb3JtYXRpdmEsIHV0aWxpemFkYSBxdWFuZG8gbsOjbyBow6EgaW5mb3JtYcOnw6NvIHNvYiBhIGJhc2UgdHJhYmFsaGFkYSwgbyBxdWUgw6kgbyBjYXNvLiANCg0KPGJyPg0KDQoNCiNNYXJrb3YgQ2hhaW4gTW9udGUgQ2FybG8NCg0KU2VndWUgZG8gVGVvcmVtYSBkZSBCYXllcyBxdWUgDQoNCiRccGkoXHRoZXRhfHgpID0gXGNmcmFje1xwaSh4fFx0aGV0YSlccGkoXHRoZXRhKX17XHBpKHgpfSQNCg0KJFxwcm9wdG8kDQoNCiRccGkoeHxcdGhldGEpXHBpKFx0aGV0YSkkDQoNCk9uZGUgDQoNCiRccGkoXHRoZXRhfHgpJCDDqSB1bSB2ZXRvciBwYXJhbcOpdHJpY28gZGEgZGlzdHJpYnVpw6fDo28gYSBwb3N0ZXJpb3JpLCBkZXNjb25oZWNpZGENCg0KJFxwaSh4fFx0aGV0YSkkIMOpIGEgdmVyb3NzaW1pbGhhw6dhIGRvcyBkYWRvcywgb2JzZXJ2YWRvDQoNCiRccGkoeCkkIMOpIHVtIHZldG9yIHBhcmFtw6l0cmljbyBkZSBkaXN0cmlidWnDp8O1ZXMgYSBwcmlvcmkNCg0KDQpFbSBnZXJhbCwgbsOjbyDDqSBwb3Nzw612ZWwgYSBvYnRlbsOnw6NvIGRpcmV0YSBkYSBkaXN0cmlidWnDp8OjbyBhIHBvc3RlcmlvcmksIHF1ZSDDqSBvIGdyYW5kZSBpbnRlcmVzc2UuIFBhcmEgZXN0YXMgc2l0dWHDp8O1ZXMsIGEgbWV0b2RvbG9naWEgZGUgTWFya292IENoYWluIE1vbnRlIENhcmxvIG9mZXJlY2UgdW1hIGNvbnZlcmfDqm5jaWEgZ2FyYW50aWRhIHZpYSBzaW11bGHDp2FvIHBvciBwcm9jZXNzb3MgZXN0b2PDoXN0aWNvcy4gDQoNCjxicj4NCg0KI1NpbXVsYcOnw6NvIGRhIERpc3RyaWJ1acOnw6NvIGEgUG9zdGVyaW9yaQ0KDQpVdGlsaXphcmVtb3MgbyBwYWNvdGUgUjJXaW5CdWdzIHBhcmEgZWZlaXRvIGRlIGM/bGN1bG8NCg0KYGBge3IsZXZhbD1GQUxTRX0NCg0KDQp5PWJhc2Ukc2FsZXMNCngxPWJhc2UkbmV3c3BhcGVyDQojTW9kZWxvIGRvIHRpcG8gQlVHUw0Kc2luaygibW9kMS50eHQiKSAgICAgICAgDQpjYXQoIg0KICAgIE1PREVMIExSMSB7DQogICAgI1Zlcm9zc2ltaWxoYW4/YSANCiAgICBmb3IoaSBpbiAxOk4pIHsNCiAgICB5W2ldIH4gZGdhbW1hKG11W2ldLHRhdSkNCiAgICBtdVtpXSA8LSBiZXRhMCArIGJldGExKngxW2ldDQogICAgfQ0KICAgICNQcm9yaXMNCiAgICBiZXRhMCB+IGRnYW1tYSgxLDAuMSkNCiAgICBiZXRhMSB+IGRnYW1tYSgxLDAuMSkNCiAgICB0YXUgfiBkZ2FtbWEoMSwwLjEpDQogICAgDQogICAgI1RyYW5zZm9ybWE/P28gcGFyYSB2YXJpP25jaWENCiAgICBzaWdtYTIgPC0gMS90YXUNCiAgICB9ICIsIGZpbGwgPSBUUlVFKQ0Kc2luaygpDQojT2Jlc2VydmHDp8OjbzogQSBkaXN0IG5vcm1hbCBubyBidWdzIGVzdMOhIGRlZmluaWRhIHBhcmEgYSBwcmVjaXPDo28uIA0KI1RhbWFuaG8gYW1vc3RyYWwNCk4gPSBsZW5ndGgoeSkNCiNDb25qdW50byBkZSBkYWRvcyBvYnNlcnZhZG9zDQpkYXRhID0gbGlzdCgiTiIsInkiLCJ4MSIpDQojUGFyw6JtZXRyb3MgZXN0dWRhZG9zDQpwYXJhbXMgPSBjKCJiZXRhMCIsICJiZXRhMSIsInRhdSIsInNpZ21hMiIpICANCiNWYWxvcmVzIGluaWNpYWlzDQppbml0cyA8LSBmdW5jdGlvbiAoKSB7bGlzdChiZXRhMCA9IHJub3JtKDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YTEgPSBybm9ybSgxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhdSA9IDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdtYTIgPSAxfQ0KI01vZGVsbyBmaW5hbA0KcmVzdWx0IDwtIGJ1Z3MoZGF0YSA9IGRhdGEsIGluaXRzID0gaW5pdHMsIHBhcmFtZXRlcnMudG8uc2F2ZSA9IHBhcmFtcywNCiAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSAibW9kMS50eHQiLCBuLmNoYWlucyA9IDMsIG4uaXRlciA9IDEwMDAwLA0KICAgICAgICAgICAgICAgbi5idXJuaW4gPSAxMDAwLCBuLnRoaW49OSwgYnVncy5kaXJlY3RvcnkgPSAiQzovV2luQlVHUzE0IiwNCiAgICAgICAgICAgICAgIGRlYnVnID0gVFJVRSwgc2F2ZS5oaXN0b3J5ID0gVFJVRSwgRElDID0gRkFMU0UpDQoNCg0KDQpgYGANCg0KRm9yYW0gZXhjbHXDrWRhcyBkYSBhbsOhbGlzZSBhcyBjb3ZhcmnDoXZlaXMgb25kZSBhY3JlZGl0YXNlLCBhbnRlY2lwYWRhbWVudGUsIHF1ZSBlc3RhcyBzZWphbSBjb21wb3Npw6fDtWVzLCBpc3RvIMOpLCBzb21hIGRlIG91dHJhcyB2YXJpw6F2ZWlzLiBTw6NvIGVzdGFzOiBSYWRpbyBlIFRWLiBQZXJtYW5lY2V1IG5vIG1vZGVsbyBhcGVuYXMgbyBKb3JuYWwgY29tbyBwcmlvcmksIHBvciBhcHJlc2VudGFyIHVtIGNvbXBvcnRhbWVudG8gY3VqbyB1bSBtb2RlbG8gbWFpcyBzaW1wbGVzLCBjb21vIG8gYXF1aSBhcHJlc2VudGFkbywgw6kgbWFpcyBhZGVxdWFkby4gDQoNClRvZGFzIGFzIGF0cmlidWnDp8O1ZXMgYXF1aSBkZWZpbmlkYXMgZm9yYW0gcmV0aXJhZGFzIGRlIEdlbG1hbiBldCBhbC4gMjAwNA0KDQo8YnI+DQoNCiNNb2RlbG8gZmluYWwNCg0KIyMgU3Vtw6FyaW8gZGEgZGlzdHJpYnVpw6fDo28gYSBwb3N0ZXJpb3JpDQoNCg0KYGBge3IgbG9hZCByZXN1bHR9DQpyZXN1bHQkc3VtbWFyeSAlPiUNCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZygpDQpgYGANCg0KPGJyPg0KDQojI0NvbnZlcmfDqm5jaWEgZGFzIGNhZGVpYXMNCmBgYHtyfQ0KYnVncyA9IHJlc3VsdCRzaW1zLmxpc3QNCmJ1Z3NfYjAgPSBidWdzJGJldGEwDQpidWdzX2IxID0gYnVncyRiZXRhMQ0KYnVnc19waGkgPSBidWdzJHRhdQ0KcGxvdChidWdzX2IwLHR5cGUgPSAibCIsbWFpbj1leHByZXNzaW9uKGJldGFbMF0pLHlsYWI9IiIsDQogICAgIHhsYWI9IiIsY2V4Lm1haW49MikNCnBsb3QoYnVnc19iMSx0eXBlID0gImwiLG1haW49ZXhwcmVzc2lvbihiZXRhWzFdKSx5bGFiPSIiLA0KICAgICB4bGFiPSIiLGNleC5tYWluPTIpDQpwbG90KGJ1Z3NfcGhpLHR5cGUgPSAibCIsbWFpbj1leHByZXNzaW9uKHBoaSkseWxhYj0iIiwNCiAgICAgeGxhYj0iIixjZXgubWFpbj0yKQ0KDQpgYGANCg0KVmVyaWZjYS1zZSB1bWEgYm9hIGNvbnZlcmfDqm5jaWEsIGVtYm9yYSB1c3VhbG1lbnRlIHNlamEgZmVpdG8gY3JpdMOpcmlvcywgYXF1aSBuw6NvIG8gc2Vyw6EuIEFwZW5hcyBjcml0w6lyaW9zIHZpc3VhaXMuDQoNCjxicj4NCg0KIyNEZW5zaWRhZGUgZGFzIGRpc3RyaWJ1acOnw7VlcyBhIHBvc3RlcmlvcmkNCmBgYHtyfQ0KZGVuc3Bsb3QoYXMubWNtYyhidWdzX2IwKSxtYWluPWV4cHJlc3Npb24oYmV0YVswXSkseGxhYj0iIix5bGFiPSIiLGNleC5tYWluPTIpDQpkZW5zcGxvdChhcy5tY21jKGJ1Z3NfYjEpLG1haW49ZXhwcmVzc2lvbihiZXRhWzFdKSx4bGFiPSIiLHlsYWI9IiIsY2V4Lm1haW49MikNCmRlbnNwbG90KGFzLm1jbWMoYnVnc19waGkpLG1haW49ZXhwcmVzc2lvbihwaGkpLHhsYWI9IiIseWxhYj0iIixjZXgubWFpbj0yKQ0KYGBgDQoNCk8gY29tcG9ydGFtZW50byAibm9ybWFsIiBkYXMgcG9zdGVyaW9yaXMgc2ltdWxhZGFzIMOpIGVzcGVyYWRvLiBDb20gYXMgcHJpb3JpcyBpbXBvc3RhcywgbyByZXN1bHRhZG8gYW5hbMOhdGljbyBlc3BlcmFkbyDDqSBkZSB1bWEgZGlzdHJpYnVpw6fDo28gR2FtYSBwYXJhIG9zIHBhcsOibWV0cm9zLCBtYWdpbmFsbWVudGUuIA0KDQo8YnI+DQoNCiNFcXVhw6fDo28gZG8gbW9kZWxvDQoNCk5hIGFib3JkYWdlbSBiYXllc2lhbmEsIGNvbnNpZGVyYS1zZSBhbGd1bWEgZnVuw6fDo28gcGVyZGEgcGFyYSBhdHJpYnVpciBhIGVzdGltYcOnw6NvIGRlIHBhcsOibWV0cm9zLiBBcXVpLCBmb2kgdXRpbGl6YWRvIGEgbcOpZGlhLCBpc3RvIMOpLCBhIHBlcmRhIHF1YWRyw6F0aWNhLg0KDQokWWkgPSA2LDI1ICsgMCwwM1hpJA0KDQo8YnI+DQoNCiMjSW50ZXJwcmV0YcOnw6NvIGRvIG1vZGVsbyANCg0KQ29tbyBhIGZ1bsOnw6NvIGRlIGxpZ2HDp8OjbyDDqSBhIGV4cG9uZW5jaWFsLCB1bSBhY3LDqXNjaW1vIGRlIDEgZW0gVFYsIHNpZ25pZmljYSB1bSBhY3LDqXNjaW1vIGRlICRlXns2LDI1ICsgMCwwM30kIG5hcyB2ZW5kYXMNCg0K