Instructions: This is an open-book midterm. You can ask questions of the instructor only. Compete the midterm questions in this R Notebook. Change the filename to use your lastname and firstname. The code needed to answer the questions is at the bottom of the notebook.

Question 1

Redo Problem 1, Exercise 6.1, from Homework 4.

  1. Change to, “suppose we get a tail.”

Answers:

  1. Change to, “flip again and get a tail.”

Answers:

  1. Change to, “third time and get a head.”

Answers:

  1. Change to, “the order H, T, T instead of T, T, H.”

Answers:

Question 2

  1. What is the Bayesian model presented in the Rose Garden Event model? What data is used?

Answers:

  1. State the likelihood for the data.

Answers:

  1. What are the other parameters, et, theta, and nu?

Answers:

  1. What prior are used for the parameters in the model?

Answers:

  1. What are the posterior estimates and 95% HDIs for each parameter in the model?

Answers:

parameter | estimate | 95% HDI

eta | | theta | | nu | | Py | |

  1. Describe what the Py values are in the JAGS code. Give the posterior estimate and 95% HDI for Py.

Answers:

Question 1 Code

Problem 1

Do Exercise 6.1

source("DBDA2E-utilities.R")  # Load definitions of graphics functions etc.
source("BernBeta.R")          # Load the definition of the BernBeta function
  1. Start with a prior distribution that expresses some uncertainty that a coin is fair: beta( theta | 4,4). Flip the coin once; suppose we get a head. What is the posterior distribution?
# Specify the prior:
a = 4
b = 4

Prior = c(a,b)       # Specify Prior as vector with the two shape parameters.

# Specify the data:
N = 1                          # The total number of flips.
z = 1                          # The number of heads.
Data = c(rep(0,N-z),rep(1,z))  # Convert N and z into vector of 0's and 1's.

#openGraph(width=5,height=7)
posterior = BernBeta( priorBetaAB=Prior, Data=Data , plotType="Bars" , 
                      showCentTend="Mode" , showHDI=TRUE , showpD=FALSE )
#saveGraph(file="BernBetaExample",type="png")
  1. Use the posterior from the previous flip as the prior for the next flip. Suppose we flip again and get a head. Now what is the new posterior?
# Specify the prior:
a = 5
b = 4

Prior = c(a,b)       # Specify Prior as vector with the two shape parameters.

# Specify the data:
N = 1                          # The total number of flips.
z = 1                          # The number of heads.
Data = c(rep(0,N-z),rep(1,z))  # Convert N and z into vector of 0's and 1's.

#openGraph(width=5,height=7)
posterior = BernBeta( priorBetaAB=Prior, Data=Data , plotType="Bars" , 
                      showCentTend="Mode" , showHDI=TRUE , showpD=FALSE )
#saveGraph(file="BernBetaExample",type="png")
  1. Using that posterior as the prior for the next flip, flip a third time and get a tail. Now what is the new posterior? (Hint: Type post = BernBeta(posterior, c(0)).)
# Specify the prior:
a = 6
b = 4

Prior = c(a,b)       # Specify Prior as vector with the two shape parameters.

# Specify the data:
N = 1                          # The total number of flips.
z = 0                          # The number of heads.
Data = c(rep(0,N-z),rep(1,z))  # Convert N and z into vector of 0's and 1's.

#openGraph(width=5,height=7)
posterior = BernBeta( priorBetaAB=Prior, Data=Data , plotType="Bars" , 
                      showCentTend="Mode" , showHDI=TRUE , showpD=FALSE )
#saveGraph(file="BernBetaExample",type="png")

post = BernBeta(posterior, c(0))
  1. Do the same three updates but in the order T, H, H instead of H, H, T. Is the final posterior distribution the same for both orderings of the flip results?
# Specify the prior:
a = 4
b = 4

Prior = c(a,b)       # Specify Prior as vector with the two shape parameters.

# Specify the data:
N = 3                          # The total number of flips.
z = 2                          # The number of heads.
Data = c(rep(0,N-z),rep(1,z))  # Convert N and z into vector of 0's and 1's.

#openGraph(width=5,height=7)
posterior = BernBeta( priorBetaAB=Prior, Data=Data , plotType="Bars" , 
                      showCentTend="Mode" , showHDI=TRUE , showpD=FALSE )
#saveGraph(file="BernBetaExample",type="png")

Question 2 Code

Rose Garden Event - Gibbs Sampler - Predictive Distribution

Simualted Data

require(rjags) 

source("DBDA2E-utilities.R") 

Now simulate the sum assuming a particular probability of a positive test.

prob_nu <- 0.05
n <- 300 

y <- rbinom(1, n, prob_nu)
y

JAGS need the data to be in a list of values, vectors, and matrices.

dataList <- list(
  y = y,
  Ntotal = n
)

dataList

Model

modelString <- "
model {
  y ~ dbin( nu, Ntotal )   # Likelihood in code
  nu = eta*pi + (1 - theta)*(1-pi)
  pi ~ dbeta( 1 , 1 )                # prior
  eta ~ dbeta( 910 , 90 )            # prior
  theta ~ dbeta( 950 , 50 )          # prior
  Py ~ dbin( nu, Ntotal )            # Predictive distribution
}
"

Inits

pi_init <- 0.004
eta_init <- 0.91
theta_init <- 0.95

initsList = list( pi=pi_init,
                  eta=eta_init,
                  theta=theta_init) 

Updates

jagsModel <- jags.model( file = textConnection(modelString), 
                         data = dataList, 
                         inits = initsList, 
                         n.chains = 5, 
                         n.adapt = 10000 )

update( jagsModel , n.iter=5000 )

codaSamples = coda.samples( jagsModel,
                            variable.names=c("nu","pi","eta","theta","Py"),
                            n.iter=5000 )

save( codaSamples , file=paste0("Mcmc.Rdata") )

Examine the chains:

Convergence diagnostics:

plot(codaSamples)
diagMCMC( codaObject=codaSamples, parName="nu" )
diagMCMC( codaObject=codaSamples, parName="pi" )
diagMCMC( codaObject=codaSamples, parName="eta" )
diagMCMC( codaObject=codaSamples, parName="theta" )
traceplot(codaSamples)
plotPost( codaSamples[,"nu"], main="nu", xlab=bquote(nu) )
plotPost( codaSamples[,"pi"], main="pi", xlab=bquote(pi) )
plotPost( codaSamples[,"eta"], main="eta", xlab=bquote(eta) )
plotPost( codaSamples[,"theta"], main="theta", xlab=bquote(theta) )
plotPost( codaSamples[,"nu"] , main="nu" , xlab=bquote(nu) , 
          cenTend="median"  )
plotPost( codaSamples[,"pi"] , main="pi" , xlab=bquote(pi) , 
          cenTend="median"  )
plotPost( codaSamples[,"eta"] , main="eta" , xlab=bquote(eta) , 
          cenTend="median"  )
plotPost( codaSamples[,"theta"] , main="theta" , xlab=bquote(theta) , 
          cenTend="median"  )
summary(codaSamples)

Examine the chains:

Convergence diagnostics:

diagMCMC( codaObject=codaSamples , parName="nu" )
diagMCMC( codaObject=codaSamples , parName="pi" )
diagMCMC( codaObject=codaSamples , parName="eta" )
diagMCMC( codaObject=codaSamples , parName="theta" )

Posterior descriptives:

plotPost( codaSamples[,"nu"] , main="nu" , xlab=bquote(nu) )
plotPost( codaSamples[,"pi"] , main="pi" , xlab=bquote(pi) )
plotPost( codaSamples[,"eta"] , main="eta" , xlab=bquote(eta) )
plotPost( codaSamples[,"theta"] , main="theta" , xlab=bquote(theta) )

Re-plot with different annotations:


plotPost( codaSamples[,"nu"] , main="nu" , xlab=bquote(nu) , 
          cenTend="median"  )
plotPost( codaSamples[,"pi"] , main="pi" , xlab=bquote(pi) , 
          cenTend="median"  )
plotPost( codaSamples[,"eta"] , main="eta" , xlab=bquote(eta) , 
          cenTend="median"  )
plotPost( codaSamples[,"theta"] , main="theta" , xlab=bquote(theta) , 
          cenTend="median"  )
LS0tCnRpdGxlOiAiU3RhdC4gNDgxIE1pZHRlcm0iCmF1dGhvcjogIllvdXIgbmFtZSIKZGF0ZTogIk9jdG9iZXIgMTQsIDIwMjAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgoqKkluc3RydWN0aW9uczoqKiAgVGhpcyBpcyBhbiBvcGVuLWJvb2sgbWlkdGVybS4gIFlvdSBjYW4gYXNrIHF1ZXN0aW9ucyBvZiB0aGUgaW5zdHJ1Y3RvciBvbmx5LiAgQ29tcGV0ZSB0aGUgbWlkdGVybSBxdWVzdGlvbnMgaW4gdGhpcyBSIE5vdGVib29rLiAgQ2hhbmdlIHRoZSBmaWxlbmFtZSB0byB1c2UgeW91ciBsYXN0bmFtZSBhbmQgZmlyc3RuYW1lLiAgVGhlIGNvZGUgbmVlZGVkIHRvIGFuc3dlciB0aGUgcXVlc3Rpb25zIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIG5vdGVib29rLgoKCiMgUXVlc3Rpb24gMQoKUmVkbyBQcm9ibGVtIDEsIEV4ZXJjaXNlIDYuMSwgZnJvbSBIb21ld29yayA0LiAgCgpBKSBDaGFuZ2UgdG8sICJzdXBwb3NlIHdlIGdldCBhIHRhaWwuIgoKKipBbnN3ZXJzOioqCgpCKSBDaGFuZ2UgdG8sICJmbGlwIGFnYWluIGFuZCBnZXQgYSB0YWlsLiIKCioqQW5zd2VyczoqKgoKQykgQ2hhbmdlIHRvLCAidGhpcmQgdGltZSBhbmQgZ2V0IGEgaGVhZC4iCgoqKkFuc3dlcnM6KioKCkQpIENoYW5nZSB0bywgInRoZSBvcmRlciBILCBULCBUICBpbnN0ZWFkIG9mIFQsIFQsIEguIgoKKipBbnN3ZXJzOioqCgojIFF1ZXN0aW9uIDIKCgoKQSkgV2hhdCBpcyB0aGUgQmF5ZXNpYW4gbW9kZWwgcHJlc2VudGVkIGluIHRoZSBSb3NlIEdhcmRlbiBFdmVudCBtb2RlbD8gIFdoYXQgZGF0YSBpcyB1c2VkPwoKKipBbnN3ZXJzOioqCgpCKSBTdGF0ZSB0aGUgbGlrZWxpaG9vZCBmb3IgdGhlIGRhdGEuCgoqKkFuc3dlcnM6KioKCkMpIFdoYXQgYXJlIHRoZSBvdGhlciBwYXJhbWV0ZXJzLCBldCwgdGhldGEsIGFuZCBudT8KCioqQW5zd2VyczoqKgoKRCkgV2hhdCBwcmlvciBhcmUgdXNlZCBmb3IgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIG1vZGVsPwoKKipBbnN3ZXJzOioqCgpFKSBXaGF0IGFyZSB0aGUgcG9zdGVyaW9yIGVzdGltYXRlcyBhbmQgOTUlIEhESXMgZm9yIGVhY2ggcGFyYW1ldGVyIGluIHRoZSBtb2RlbD8KCioqQW5zd2VyczoqKgoKcGFyYW1ldGVyICAgIHwgICBlc3RpbWF0ZSAgIHwgOTUlIEhESQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpldGEgICAgICAgICAgfCAgICAgICAgICAgICAgfAp0aGV0YSAgICAgICAgfCAgICAgICAgICAgICAgfApudSAgICAgICAgICAgfCAgICAgICAgICAgICAgfApQeSAgICAgICAgICAgfCAgICAgICAgICAgICAgfAoKRikgRGVzY3JpYmUgd2hhdCB0aGUgUHkgdmFsdWVzIGFyZSBpbiB0aGUgSkFHUyBjb2RlLiAgR2l2ZSB0aGUgcG9zdGVyaW9yIGVzdGltYXRlIGFuZCA5NSUgSERJIGZvciBQeS4KCioqQW5zd2VyczoqKgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBRdWVzdGlvbiAxIENvZGUKCiMgUHJvYmxlbSAxCgojIyBEbyBFeGVyY2lzZSA2LjEKCmBgYHtyfQpzb3VyY2UoIkRCREEyRS11dGlsaXRpZXMuUiIpICAjIExvYWQgZGVmaW5pdGlvbnMgb2YgZ3JhcGhpY3MgZnVuY3Rpb25zIGV0Yy4Kc291cmNlKCJCZXJuQmV0YS5SIikgICAgICAgICAgIyBMb2FkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBCZXJuQmV0YSBmdW5jdGlvbgpgYGAKCihBKSBTdGFydCB3aXRoIGEgcHJpb3IgZGlzdHJpYnV0aW9uIHRoYXQgZXhwcmVzc2VzIHNvbWUgdW5jZXJ0YWludHkgdGhhdCBhIGNvaW4gaXMgZmFpcjogYmV0YSggdGhldGEgfCA0LDQpLiBGbGlwIHRoZSBjb2luIG9uY2U7IHN1cHBvc2Ugd2UgZ2V0IGEgaGVhZC4gV2hhdCBpcyB0aGUgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbj8KCmBgYHtyfQojIFNwZWNpZnkgdGhlIHByaW9yOgphID0gNApiID0gNAoKUHJpb3IgPSBjKGEsYikgICAgICAgIyBTcGVjaWZ5IFByaW9yIGFzIHZlY3RvciB3aXRoIHRoZSB0d28gc2hhcGUgcGFyYW1ldGVycy4KCiMgU3BlY2lmeSB0aGUgZGF0YToKTiA9IDEgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHRvdGFsIG51bWJlciBvZiBmbGlwcy4KeiA9IDEgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG51bWJlciBvZiBoZWFkcy4KRGF0YSA9IGMocmVwKDAsTi16KSxyZXAoMSx6KSkgICMgQ29udmVydCBOIGFuZCB6IGludG8gdmVjdG9yIG9mIDAncyBhbmQgMSdzLgoKI29wZW5HcmFwaCh3aWR0aD01LGhlaWdodD03KQpwb3N0ZXJpb3IgPSBCZXJuQmV0YSggcHJpb3JCZXRhQUI9UHJpb3IsIERhdGE9RGF0YSAsIHBsb3RUeXBlPSJCYXJzIiAsIAogICAgICAgICAgICAgICAgICAgICAgc2hvd0NlbnRUZW5kPSJNb2RlIiAsIHNob3dIREk9VFJVRSAsIHNob3dwRD1GQUxTRSApCiNzYXZlR3JhcGgoZmlsZT0iQmVybkJldGFFeGFtcGxlIix0eXBlPSJwbmciKQoKYGBgCgooQikgVXNlIHRoZSBwb3N0ZXJpb3IgZnJvbSB0aGUgcHJldmlvdXMgZmxpcCBhcyB0aGUgcHJpb3IgZm9yIHRoZSBuZXh0IGZsaXAuIFN1cHBvc2Ugd2UgZmxpcCBhZ2FpbiBhbmQgZ2V0IGEgaGVhZC4gTm93IHdoYXQgaXMgdGhlIG5ldyBwb3N0ZXJpb3I/IAoKYGBge3J9CiMgU3BlY2lmeSB0aGUgcHJpb3I6CmEgPSA1CmIgPSA0CgpQcmlvciA9IGMoYSxiKSAgICAgICAjIFNwZWNpZnkgUHJpb3IgYXMgdmVjdG9yIHdpdGggdGhlIHR3byBzaGFwZSBwYXJhbWV0ZXJzLgoKIyBTcGVjaWZ5IHRoZSBkYXRhOgpOID0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgdG90YWwgbnVtYmVyIG9mIGZsaXBzLgp6ID0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbnVtYmVyIG9mIGhlYWRzLgpEYXRhID0gYyhyZXAoMCxOLXopLHJlcCgxLHopKSAgIyBDb252ZXJ0IE4gYW5kIHogaW50byB2ZWN0b3Igb2YgMCdzIGFuZCAxJ3MuCgojb3BlbkdyYXBoKHdpZHRoPTUsaGVpZ2h0PTcpCnBvc3RlcmlvciA9IEJlcm5CZXRhKCBwcmlvckJldGFBQj1QcmlvciwgRGF0YT1EYXRhICwgcGxvdFR5cGU9IkJhcnMiICwgCiAgICAgICAgICAgICAgICAgICAgICBzaG93Q2VudFRlbmQ9Ik1vZGUiICwgc2hvd0hEST1UUlVFICwgc2hvd3BEPUZBTFNFICkKI3NhdmVHcmFwaChmaWxlPSJCZXJuQmV0YUV4YW1wbGUiLHR5cGU9InBuZyIpCgpgYGAKCihDKSAgVXNpbmcgdGhhdCBwb3N0ZXJpb3IgYXMgdGhlIHByaW9yIGZvciB0aGUgbmV4dCBmbGlwLCBmbGlwIGEgdGhpcmQgdGltZSBhbmQgZ2V0IGEgdGFpbC4gTm93IHdoYXQgaXMgdGhlIG5ldyBwb3N0ZXJpb3I/IChIaW50OiBUeXBlIHBvc3QgPSBCZXJuQmV0YShwb3N0ZXJpb3IsIGMoMCkpLikKCmBgYHtyfQojIFNwZWNpZnkgdGhlIHByaW9yOgphID0gNgpiID0gNAoKUHJpb3IgPSBjKGEsYikgICAgICAgIyBTcGVjaWZ5IFByaW9yIGFzIHZlY3RvciB3aXRoIHRoZSB0d28gc2hhcGUgcGFyYW1ldGVycy4KCiMgU3BlY2lmeSB0aGUgZGF0YToKTiA9IDEgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHRvdGFsIG51bWJlciBvZiBmbGlwcy4KeiA9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG51bWJlciBvZiBoZWFkcy4KRGF0YSA9IGMocmVwKDAsTi16KSxyZXAoMSx6KSkgICMgQ29udmVydCBOIGFuZCB6IGludG8gdmVjdG9yIG9mIDAncyBhbmQgMSdzLgoKI29wZW5HcmFwaCh3aWR0aD01LGhlaWdodD03KQpwb3N0ZXJpb3IgPSBCZXJuQmV0YSggcHJpb3JCZXRhQUI9UHJpb3IsIERhdGE9RGF0YSAsIHBsb3RUeXBlPSJCYXJzIiAsIAogICAgICAgICAgICAgICAgICAgICAgc2hvd0NlbnRUZW5kPSJNb2RlIiAsIHNob3dIREk9VFJVRSAsIHNob3dwRD1GQUxTRSApCiNzYXZlR3JhcGgoZmlsZT0iQmVybkJldGFFeGFtcGxlIix0eXBlPSJwbmciKQoKcG9zdCA9IEJlcm5CZXRhKHBvc3RlcmlvciwgYygwKSkKYGBgCgooRCkgRG8gdGhlIHNhbWUgdGhyZWUgdXBkYXRlcyBidXQgaW4gdGhlIG9yZGVyIFQsIEgsIEggaW5zdGVhZCBvZiBILCBILCBULiBJcyB0aGUgZmluYWwgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiB0aGUgc2FtZSBmb3IgYm90aCBvcmRlcmluZ3Mgb2YgdGhlIGZsaXAgcmVzdWx0cz8KCgpgYGB7cn0KIyBTcGVjaWZ5IHRoZSBwcmlvcjoKYSA9IDQKYiA9IDQKClByaW9yID0gYyhhLGIpICAgICAgICMgU3BlY2lmeSBQcmlvciBhcyB2ZWN0b3Igd2l0aCB0aGUgdHdvIHNoYXBlIHBhcmFtZXRlcnMuCgojIFNwZWNpZnkgdGhlIGRhdGE6Ck4gPSAzICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSB0b3RhbCBudW1iZXIgb2YgZmxpcHMuCnogPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBudW1iZXIgb2YgaGVhZHMuCkRhdGEgPSBjKHJlcCgwLE4teikscmVwKDEseikpICAjIENvbnZlcnQgTiBhbmQgeiBpbnRvIHZlY3RvciBvZiAwJ3MgYW5kIDEncy4KCiNvcGVuR3JhcGgod2lkdGg9NSxoZWlnaHQ9NykKcG9zdGVyaW9yID0gQmVybkJldGEoIHByaW9yQmV0YUFCPVByaW9yLCBEYXRhPURhdGEgLCBwbG90VHlwZT0iQmFycyIgLCAKICAgICAgICAgICAgICAgICAgICAgIHNob3dDZW50VGVuZD0iTW9kZSIgLCBzaG93SERJPVRSVUUgLCBzaG93cEQ9RkFMU0UgKQojc2F2ZUdyYXBoKGZpbGU9IkJlcm5CZXRhRXhhbXBsZSIsdHlwZT0icG5nIikKCmBgYAoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBRdWVzdGlvbiAyIENvZGUKCiMjICBSb3NlIEdhcmRlbiBFdmVudCAtIEdpYmJzIFNhbXBsZXIgLSBQcmVkaWN0aXZlIERpc3RyaWJ1dGlvbgoKIyBTaW11YWx0ZWQgRGF0YQoKYGBge3J9CnJlcXVpcmUocmphZ3MpIAoKc291cmNlKCJEQkRBMkUtdXRpbGl0aWVzLlIiKSAKYGBgCgpOb3cgc2ltdWxhdGUgdGhlIHN1bSBhc3N1bWluZyBhIHBhcnRpY3VsYXIgcHJvYmFiaWxpdHkgb2YgYSBwb3NpdGl2ZSB0ZXN0LgoKYGBge3J9CnByb2JfbnUgPC0gMC4wNQpuIDwtIDMwMCAKCnkgPC0gcmJpbm9tKDEsIG4sIHByb2JfbnUpCnkKYGBgCgpKQUdTIG5lZWQgdGhlIGRhdGEgdG8gYmUgaW4gYSBsaXN0IG9mIHZhbHVlcywgdmVjdG9ycywgYW5kIG1hdHJpY2VzLgoKYGBge3J9CmRhdGFMaXN0IDwtIGxpc3QoCiAgeSA9IHksCiAgTnRvdGFsID0gbgopCgpkYXRhTGlzdApgYGAKCiMgTW9kZWwKCmBgYHtyfQptb2RlbFN0cmluZyA8LSAiCm1vZGVsIHsKICB5IH4gZGJpbiggbnUsIE50b3RhbCApICAgIyBMaWtlbGlob29kIGluIGNvZGUKICBudSA9IGV0YSpwaSArICgxIC0gdGhldGEpKigxLXBpKQogIHBpIH4gZGJldGEoIDEgLCAxICkgICAgICAgICAgICAgICAgIyBwcmlvcgogIGV0YSB+IGRiZXRhKCA5MTAgLCA5MCApICAgICAgICAgICAgIyBwcmlvcgogIHRoZXRhIH4gZGJldGEoIDk1MCAsIDUwICkgICAgICAgICAgIyBwcmlvcgogIFB5IH4gZGJpbiggbnUsIE50b3RhbCApICAgICAgICAgICAgIyBQcmVkaWN0aXZlIGRpc3RyaWJ1dGlvbgp9CiIKYGBgCgojIEluaXRzCgpgYGB7cn0KcGlfaW5pdCA8LSAwLjAwNApldGFfaW5pdCA8LSAwLjkxCnRoZXRhX2luaXQgPC0gMC45NQoKaW5pdHNMaXN0ID0gbGlzdCggcGk9cGlfaW5pdCwKICAgICAgICAgICAgICAgICAgZXRhPWV0YV9pbml0LAogICAgICAgICAgICAgICAgICB0aGV0YT10aGV0YV9pbml0KSAKYGBgCgojIFVwZGF0ZXMKCmBgYHtyfQpqYWdzTW9kZWwgPC0gamFncy5tb2RlbCggZmlsZSA9IHRleHRDb25uZWN0aW9uKG1vZGVsU3RyaW5nKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YUxpc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdHMgPSBpbml0c0xpc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgbi5jaGFpbnMgPSA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgIG4uYWRhcHQgPSAxMDAwMCApCgp1cGRhdGUoIGphZ3NNb2RlbCAsIG4uaXRlcj01MDAwICkKCmNvZGFTYW1wbGVzID0gY29kYS5zYW1wbGVzKCBqYWdzTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lcz1jKCJudSIsInBpIiwiZXRhIiwidGhldGEiLCJQeSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyPTUwMDAgKQoKc2F2ZSggY29kYVNhbXBsZXMgLCBmaWxlPXBhc3RlMCgiTWNtYy5SZGF0YSIpICkKYGBgCgojIEV4YW1pbmUgdGhlIGNoYWluczoKIyBDb252ZXJnZW5jZSBkaWFnbm9zdGljczoKCmBgYHtyfQpwbG90KGNvZGFTYW1wbGVzKQpgYGAKCmBgYHtyfQpkaWFnTUNNQyggY29kYU9iamVjdD1jb2RhU2FtcGxlcywgcGFyTmFtZT0ibnUiICkKZGlhZ01DTUMoIGNvZGFPYmplY3Q9Y29kYVNhbXBsZXMsIHBhck5hbWU9InBpIiApCmRpYWdNQ01DKCBjb2RhT2JqZWN0PWNvZGFTYW1wbGVzLCBwYXJOYW1lPSJldGEiICkKZGlhZ01DTUMoIGNvZGFPYmplY3Q9Y29kYVNhbXBsZXMsIHBhck5hbWU9InRoZXRhIiApCmBgYAoKYGBge3J9CnRyYWNlcGxvdChjb2RhU2FtcGxlcykKYGBgCgpgYGB7cn0KcGxvdFBvc3QoIGNvZGFTYW1wbGVzWywibnUiXSwgbWFpbj0ibnUiLCB4bGFiPWJxdW90ZShudSkgKQpwbG90UG9zdCggY29kYVNhbXBsZXNbLCJwaSJdLCBtYWluPSJwaSIsIHhsYWI9YnF1b3RlKHBpKSApCnBsb3RQb3N0KCBjb2RhU2FtcGxlc1ssImV0YSJdLCBtYWluPSJldGEiLCB4bGFiPWJxdW90ZShldGEpICkKcGxvdFBvc3QoIGNvZGFTYW1wbGVzWywidGhldGEiXSwgbWFpbj0idGhldGEiLCB4bGFiPWJxdW90ZSh0aGV0YSkgKQpgYGAKCmBgYHtyfQpwbG90UG9zdCggY29kYVNhbXBsZXNbLCJudSJdICwgbWFpbj0ibnUiICwgeGxhYj1icXVvdGUobnUpICwgCiAgICAgICAgICBjZW5UZW5kPSJtZWRpYW4iICApCnBsb3RQb3N0KCBjb2RhU2FtcGxlc1ssInBpIl0gLCBtYWluPSJwaSIgLCB4bGFiPWJxdW90ZShwaSkgLCAKICAgICAgICAgIGNlblRlbmQ9Im1lZGlhbiIgICkKcGxvdFBvc3QoIGNvZGFTYW1wbGVzWywiZXRhIl0gLCBtYWluPSJldGEiICwgeGxhYj1icXVvdGUoZXRhKSAsIAogICAgICAgICAgY2VuVGVuZD0ibWVkaWFuIiAgKQpwbG90UG9zdCggY29kYVNhbXBsZXNbLCJ0aGV0YSJdICwgbWFpbj0idGhldGEiICwgeGxhYj1icXVvdGUodGhldGEpICwgCiAgICAgICAgICBjZW5UZW5kPSJtZWRpYW4iICApCmBgYAoKYGBge3J9CnN1bW1hcnkoY29kYVNhbXBsZXMpCmBgYAoKIyBFeGFtaW5lIHRoZSBjaGFpbnM6CiMgQ29udmVyZ2VuY2UgZGlhZ25vc3RpY3M6CgpgYGB7cn0KZGlhZ01DTUMoIGNvZGFPYmplY3Q9Y29kYVNhbXBsZXMgLCBwYXJOYW1lPSJudSIgKQpkaWFnTUNNQyggY29kYU9iamVjdD1jb2RhU2FtcGxlcyAsIHBhck5hbWU9InBpIiApCmRpYWdNQ01DKCBjb2RhT2JqZWN0PWNvZGFTYW1wbGVzICwgcGFyTmFtZT0iZXRhIiApCmRpYWdNQ01DKCBjb2RhT2JqZWN0PWNvZGFTYW1wbGVzICwgcGFyTmFtZT0idGhldGEiICkKYGBgCgojIFBvc3RlcmlvciBkZXNjcmlwdGl2ZXM6CgpgYGB7cn0KcGxvdFBvc3QoIGNvZGFTYW1wbGVzWywibnUiXSAsIG1haW49Im51IiAsIHhsYWI9YnF1b3RlKG51KSApCnBsb3RQb3N0KCBjb2RhU2FtcGxlc1ssInBpIl0gLCBtYWluPSJwaSIgLCB4bGFiPWJxdW90ZShwaSkgKQpwbG90UG9zdCggY29kYVNhbXBsZXNbLCJldGEiXSAsIG1haW49ImV0YSIgLCB4bGFiPWJxdW90ZShldGEpICkKcGxvdFBvc3QoIGNvZGFTYW1wbGVzWywidGhldGEiXSAsIG1haW49InRoZXRhIiAsIHhsYWI9YnF1b3RlKHRoZXRhKSApCmBgYAoKIyBSZS1wbG90IHdpdGggZGlmZmVyZW50IGFubm90YXRpb25zOgoKYGBge3J9CgpwbG90UG9zdCggY29kYVNhbXBsZXNbLCJudSJdICwgbWFpbj0ibnUiICwgeGxhYj1icXVvdGUobnUpICwgCiAgICAgICAgICBjZW5UZW5kPSJtZWRpYW4iICApCnBsb3RQb3N0KCBjb2RhU2FtcGxlc1ssInBpIl0gLCBtYWluPSJwaSIgLCB4bGFiPWJxdW90ZShwaSkgLCAKICAgICAgICAgIGNlblRlbmQ9Im1lZGlhbiIgICkKcGxvdFBvc3QoIGNvZGFTYW1wbGVzWywiZXRhIl0gLCBtYWluPSJldGEiICwgeGxhYj1icXVvdGUoZXRhKSAsIAogICAgICAgICAgY2VuVGVuZD0ibWVkaWFuIiAgKQpwbG90UG9zdCggY29kYVNhbXBsZXNbLCJ0aGV0YSJdICwgbWFpbj0idGhldGEiICwgeGxhYj1icXVvdGUodGhldGEpICwgCiAgICAgICAgICBjZW5UZW5kPSJtZWRpYW4iICApCmBgYAoKCgoKCgo=