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