This version is for the final check before submitting to Journal lancet psychiatry

library('lmtest');
library(astsa)
library(forecast)
library(dplyr)
library(zoo)
library(TSstudio)

In the below, DTPANIC is the master data sheet, from which all variables are derived. OCD and PTSD are same. Please see denominator is the monthly number of total population.

require(readxl)
setwd("~/Dropbox/gitLab/studyDepressionBigData")
DTPANIC<- read_xlsx("PanicWholePopu.xlsx",sheet = "PANIC")
mTotPopulation=DTPANIC$totN1;
nPrevPANIC4=DTPANIC$prevN4/mTotPopulation*100;
nNPrevPANIC4=DTPANIC$inciN4/mTotPopulation*100;
nPrevPANIC3=DTPANIC$prevN3/mTotPopulation*100;
nNPrevPANIC3=DTPANIC$inciN3/mTotPopulation*100;
nPrevPANIC2=DTPANIC$prevN2/mTotPopulation*100;
nNPrevPANIC2=DTPANIC$inciN2/mTotPopulation*100;
nPrevPANIC1=DTPANIC$prevN1/mTotPopulation*100;
nNPrevPANIC1=DTPANIC$inciN1/mTotPopulation*100;
DTOCD<- read_xlsx("PanicWholePopu.xlsx",sheet = "OCD")
nPrevOCD4=DTOCD$prevN4/mTotPopulation*100;
nNPrevOCD4=DTOCD$inciN4/mTotPopulation*100;
nPrevOCD3=DTOCD$prevN3/mTotPopulation*100;
nNPrevOCD3=DTOCD$inciN3/mTotPopulation*100;
nPrevOCD2=DTOCD$prevN2/mTotPopulation*100;
nNPrevOCD2=DTOCD$inciN2/mTotPopulation*100;
nPrevOCD1=DTOCD$prevN1/mTotPopulation*100;
nNPrevOCD1=DTOCD$inciN1/mTotPopulation*100;
DTPTSD<- read_xlsx("PanicWholePopu.xlsx",sheet = "PTSD")
nPrevPTSD4=DTPTSD$prevN4/mTotPopulation*100;
nNPrevPTSD4=DTPTSD$inciN4/mTotPopulation*100;
nPrevPTSD3=DTPTSD$prevN3/mTotPopulation*100;
nNPrevPTSD3=DTPTSD$inciN3/mTotPopulation*100;
nPrevPTSD2=DTPTSD$prevN2/mTotPopulation*100;
nNPrevPTSD2=DTPTSD$inciN2/mTotPopulation*100;
nPrevPTSD1=DTPTSD$prevN1/mTotPopulation*100;
nNPrevPTSD1=DTPTSD$inciN1/mTotPopulation*100;

From the file name of the raw data, except search for diagnosis names, celebrities names seemed to be searched, combined with the names of diagnosis.

READ GOOGLE TREND and CELEB DISCLOSURE

sPanicDis=read.csv(file="~/Dropbox/gitLab/studyDepressionBigData/panicDisorder20142021.csv", header=FALSE);
sOCDDis=read.csv(file="~/Dropbox/gitLab/studyDepressionBigData/OCDDisorder20142029.csv", header=FALSE);
sPanicOCDDis=read.csv(file="~/Dropbox/gitLab/studyDepressionBigData/PanicOCDDisorder20142029.csv", header=FALSE);
sChaPanicDis=read.csv(file="~/Dropbox/gitLab/studyDepressionBigData/googChaPanicDis.csv", header=FALSE);
sLeePanicDis=read.csv(file="~/Dropbox/gitLab/studyDepressionBigData/googLeePanicDis.csv", header=FALSE);
sKimPanicDis=read.csv(file="~/Dropbox/gitLab/studyDepressionBigData/googKimPanicDis.csv", header=FALSE);

The number at the end of the file name represents the degree of inclusion criteria. The number four corresponds to the most inclusive criteria. .ts represents the date is converted to time series.

MAKE DATAFRAME FOR ALL GATHERED INFORMATION

data <- data.frame(
month = as.ts(sPanicDis$V1, format="%Y-%m"),
prevPANIC4 = nPrevPANIC4, 
prevPTSD4 = nPrevPTSD4, 
prevOCD4 = nPrevOCD4,
prevPANIC3 = nPrevPANIC3, 
prevPTSD3 = nPrevPTSD3, 
prevOCD3 = nPrevOCD3,
prevPANIC2 = nPrevPANIC2, 
prevPTSD2 = nPrevPTSD2, 
prevOCD2 = nPrevOCD2,
prevPANIC1 = nPrevPANIC1, 
prevPTSD1 = nPrevPTSD1, 
prevOCD1 = nPrevOCD1,

inciPANIC4 = nNPrevPANIC4, 
inciPTSD4 = nNPrevPTSD4, 
inciOCD4 = nNPrevOCD4,
inciPANIC3 = nNPrevPANIC3, 
inciPTSD3 = nNPrevPTSD3, 
inciOCD3 = nNPrevOCD3,
inciPANIC2 = nNPrevPANIC2, 
inciPTSD2 = nNPrevPTSD2, 
inciOCD2 = nNPrevOCD2,
inciPANIC1 = nNPrevPANIC1, 
inciPTSD1 = nNPrevPTSD1, 
inciOCD1 = nNPrevOCD1,

google = sPanicDis$V2,
googleOCD = sOCDDis$V2,
googleOCDrelative = sPanicOCDDis$V3,
googCha = c(sChaPanicDis$V2,rep(0,96)),
googLee = c(sLeePanicDis$V2,rep(0,96)),
googKim = c(sKimPanicDis$V2,rep(0,96))
)

google.ts=ts(data$google,frequency=12, start=c(2004,1))
googleOCD.ts=ts(data$googleOCD,frequency=12, start=c(2004,1))
googleOCDrelative.ts=ts(data$googleOCDrelative,frequency=12, start=c(2004,1))
prevPANIC4.ts=ts(data$prevPANIC4,frequency=12, start=c(2004,1))
prevPTSD4.ts=ts(data$prevPTSD4, frequency = 12, start = c(2004,1))
prevOCD4.ts=ts(data$prevOCD4, frequency = 12, start = c(2004,1))
prevPANIC3.ts=ts(data$prevPANIC3,frequency=12, start=c(2004,1))
prevPTSD3.ts=ts(data$prevPTSD3, frequency = 12, start = c(2004,1))
prevOCD3.ts=ts(data$prevOCD3, frequency = 12, start = c(2004,1))
prevPANIC2.ts=ts(data$prevPANIC2,frequency=12, start=c(2004,1))
prevPTSD2.ts=ts(data$prevPTSD2, frequency = 12, start = c(2004,1))
prevOCD2.ts=ts(data$prevOCD2, frequency = 12, start = c(2004,1))
prevPANIC1.ts=ts(data$prevPANIC1,frequency=12, start=c(2004,1))
prevPTSD1.ts=ts(data$prevPTSD1, frequency = 12, start = c(2004,1))
prevOCD1.ts=ts(data$prevOCD1, frequency = 12, start = c(2004,1))

inciPANIC4.ts=ts(data$inciPANIC4,frequency=12, start=c(2004,1) )
inciPTSD4.ts=ts(data$inciPTSD4,frequency=12, start=c(2004,1) )
inciOCD4.ts=ts(data$inciOCD4,frequency=12, start=c(2004,1) )
inciPANIC3.ts=ts(data$inciPANIC3,frequency=12, start=c(2004,1) )
inciPTSD3.ts=ts(data$inciPTSD3,frequency=12, start=c(2004,1) )
inciOCD3.ts=ts(data$inciOCD3,frequency=12, start=c(2004,1) )
inciPANIC2.ts=ts(data$inciPANIC2,frequency=12, start=c(2004,1) )
inciPTSD2.ts=ts(data$inciPTSD2,frequency=12, start=c(2004,1) )
inciOCD2.ts=ts(data$inciOCD2,frequency=12, start=c(2004,1) )
inciPANIC1.ts=ts(data$inciPANIC1,frequency=12, start=c(2004,1) )
inciPTSD1.ts=ts(data$inciPTSD1,frequency=12, start=c(2004,1) )
inciOCD1.ts=ts(data$inciOCD1,frequency=12, start=c(2004,1) )

Below is the just the visualization of the data.

Draw graph of prevalence

prevNEURO4_3.ts=ts.union(prevPANIC4.ts, prevPTSD4.ts, prevOCD4.ts);
inciNEURO4_3.ts=ts.union(inciPANIC4.ts, inciPTSD4.ts, inciOCD4.ts);
#jpeg(file="~/Dropbox/gitLab/studyDepressionBigData/prevNEURO4_3.jpeg")
plot(prevNEURO4_3.ts, type="l", plot.type="s", col=c("blue","magenta","cyan"), xlab="Month", ylab="Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(prevNEURO4_3.ts[,1])))
Warning in plot.window(xlim, ylim, log, ...) :
  "linetype" is not a graphical parameter
Warning in title(main = main, xlab = xlab, ylab = ylab, ...) :
  "linetype" is not a graphical parameter
Warning in axis(1, ...) : "linetype" is not a graphical parameter
Warning in axis(2, ...) : "linetype" is not a graphical parameter
Warning in box(...) : "linetype" is not a graphical parameter
legend("topleft", inset = 0.02, legend=c("PANIC","OCD", "PTSD"),
       col=c("blue", "cyan","magenta"), lty=1, cex=0.8)
lines(google.ts/100*max(inciNEURO4_3.ts[,1]),col="green")
# Add vertical lines indicating date of celerbity disclosures
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)

#dev.off()

Doing changing the inclusion criteria.

prevNEURO3_3.ts=ts.union(prevPANIC3.ts, prevPTSD3.ts, prevOCD3.ts);
inciNEURO3_3.ts=ts.union(inciPANIC3.ts, inciPTSD3.ts, inciOCD3.ts);
#jpeg(file="~/Dropbox/gitLab/studyDepressionBigData/prevNEURO3_3.jpeg")
plot(prevNEURO3_3.ts, type="l", plot.type="s", col=c("blue","magenta","cyan"), xlab="Month", ylab="Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(prevNEURO3_3.ts[,1])))
Warning in plot.window(xlim, ylim, log, ...) :
  "linetype" is not a graphical parameter
Warning in title(main = main, xlab = xlab, ylab = ylab, ...) :
  "linetype" is not a graphical parameter
Warning in axis(1, ...) : "linetype" is not a graphical parameter
Warning in axis(2, ...) : "linetype" is not a graphical parameter
Warning in box(...) : "linetype" is not a graphical parameter
legend("topleft", inset = 0.02, legend=c("PANIC","OCD", "PTSD"),
       col=c("blue", "cyan","magenta"), lty=1, cex=0.8)
#lines(google.ts/100*max(prevNEURO3.ts[,1]),col="green")
# Add vertical lines indicating date of celerbity disclosures
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)

#dev.off()
prevNEURO2_3.ts=ts.union(prevPANIC2.ts, prevPTSD2.ts, prevOCD2.ts);
inciNEURO2_3.ts=ts.union(inciPANIC2.ts, inciPTSD2.ts, inciOCD2.ts);
#jpeg(file="~/Dropbox/gitLab/studyDepressionBigData/prevNEURO2_3.jpeg")
plot(prevNEURO2_3.ts, type="l", plot.type="s", col=c("blue","magenta","cyan"), xlab="Month", ylab="Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(prevNEURO2_3.ts[,1])))
Warning in plot.window(xlim, ylim, log, ...) :
  "linetype" is not a graphical parameter
Warning in title(main = main, xlab = xlab, ylab = ylab, ...) :
  "linetype" is not a graphical parameter
Warning in axis(1, ...) : "linetype" is not a graphical parameter
Warning in axis(2, ...) : "linetype" is not a graphical parameter
Warning in box(...) : "linetype" is not a graphical parameter
legend("topleft", inset = 0.02, legend=c("PANIC","OCD", "PTSD"),
       col=c("blue", "cyan","magenta"), lty=1, cex=0.8)
#lines(google.ts/100*max(prevNEURO3.ts[,1]),col="green")
# Add vertical lines indicating date of celerbity disclosures
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)

#dev.off()
prevNEURO1_3.ts=ts.union(prevPANIC1.ts, prevPTSD1.ts, prevOCD1.ts);
inciNEURO1_3.ts=ts.union(inciPANIC1.ts, inciPTSD1.ts, inciOCD1.ts);
#jpeg(file="~/Dropbox/gitLab/studyDepressionBigData/prevNEURO1_3.jpeg")
plot(prevNEURO1_3.ts, type="l", plot.type="s", col=c("blue","magenta","cyan"), xlab="Month", ylab="Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(prevNEURO1_3.ts[,1])))
Warning in plot.window(xlim, ylim, log, ...) :
  "linetype" is not a graphical parameter
Warning in title(main = main, xlab = xlab, ylab = ylab, ...) :
  "linetype" is not a graphical parameter
Warning in axis(1, ...) : "linetype" is not a graphical parameter
Warning in axis(2, ...) : "linetype" is not a graphical parameter
Warning in box(...) : "linetype" is not a graphical parameter
legend("topleft", inset = 0.02, legend=c("PANIC","OCD", "PTSD"),
       col=c("blue", "cyan","magenta"), lty=1, cex=0.8)
#lines(google.ts/100*max(prevNEURO3.ts[,1]),col="green")
# Add vertical lines indicating date of celerbity disclosures
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)

#dev.off()

PREVALENCE ALL

prevPANIC1234_OCD4.ts=ts.union(prevPANIC4.ts, prevPANIC3.ts, prevPANIC2.ts, prevPANIC1.ts,prevOCD4.ts);
#jpeg(file="~/Dropbox/gitLab/studyDepressionBigData/prevPANIC1234_OCD4.jpeg")
plot(prevPANIC1234_OCD4.ts, type="l", plot.type="s", col=c("blue4", "blue3","blue2","blue","magenta"), xlab="Month", ylab="Pat. %", linetype=c("solid","dashed"), ylim=c(0,max(prevNEURO4_3.ts[,1])))
Warning in plot.window(xlim, ylim, log, ...) :
  "linetype" is not a graphical parameter
Warning in title(main = main, xlab = xlab, ylab = ylab, ...) :
  "linetype" is not a graphical parameter
Warning in axis(1, ...) : "linetype" is not a graphical parameter
Warning in axis(2, ...) : "linetype" is not a graphical parameter
Warning in box(...) : "linetype" is not a graphical parameter
legend("topleft", inset = 0.02, legend=c("PANIC4","PANIC3", "PANIC2", "PANIC1","OCD4"),
       col=c("blue4", "blue3","blue2","blue","magenta"), lty=1, cex=0.8)
#lines(google.ts/100*max(prevNEURO3.ts[,1]),col="green")
# Add vertical lines indicating date of celerbity disclosures
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)

#dev.off()

INCIDENCE ALL

inciPANIC1234_OCD1234.ts=ts.union(inciPANIC4.ts, inciPANIC3.ts, inciPANIC2.ts, inciPANIC1.ts,inciOCD4.ts,inciOCD3.ts,inciOCD2.ts,inciOCD1.ts);
#jpeg(file="~/Dropbox/gitLab/studyDepressionBigData/inciPANIC1234_OCD1234.jpeg")
plot(inciPANIC1234_OCD1234.ts, type="l", plot.type="s", col=c("blue4", "blue3","blue2","blue","darkorchid4","darkorchid3","darkorchid2","darkorchid1"), xlab="Month", ylab="New Pat. %", linetype=c("solid","dashed"), ylim=c(0,max(inciPANIC1234_OCD1234.ts[,1])))
Warning in plot.window(xlim, ylim, log, ...) :
  "linetype" is not a graphical parameter
Warning in title(main = main, xlab = xlab, ylab = ylab, ...) :
  "linetype" is not a graphical parameter
Warning in axis(1, ...) : "linetype" is not a graphical parameter
Warning in axis(2, ...) : "linetype" is not a graphical parameter
Warning in box(...) : "linetype" is not a graphical parameter
legend("topleft", inset = 0.02, legend=c("PANIC4","PANIC3", "PANIC2", "PANIC1","OCD4","OCD3","OCD2","OCD1"),
       col=c("blue4", "blue3","blue2","blue","darkorchid4","darkorchid3","darkorchid2","darkorchid1"), lty=1, cex=0.8)
#lines(google.ts/100*max(prevNEURO3.ts[,1]),col="green")
# Add vertical lines indicating date of celerbity disclosures
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)

#dev.off()

PREVALENCE ALL PANIC OCD

prevPANIC1234_OCD1234.ts=ts.union(prevPANIC4.ts, prevPANIC3.ts, prevPANIC2.ts, prevPANIC1.ts,prevOCD4.ts,prevOCD3.ts,prevOCD2.ts,prevOCD1.ts);
#jpeg(file="~/Dropbox/gitLab/studyDepressionBigData/prevPANIC1234_OCD1234.jpeg")
plot(prevPANIC1234_OCD1234.ts, type="l", plot.type="s", col=c("blue4", "blue3","blue2","blue","darkorchid4","darkorchid3","darkorchid2","darkorchid1"), xlab="Month", ylab="New Pat. %", linetype=c("solid","dashed"), ylim=c(0,max(prevPANIC1234_OCD1234.ts[,1])))
Warning in plot.window(xlim, ylim, log, ...) :
  "linetype" is not a graphical parameter
Warning in title(main = main, xlab = xlab, ylab = ylab, ...) :
  "linetype" is not a graphical parameter
Warning in axis(1, ...) : "linetype" is not a graphical parameter
Warning in axis(2, ...) : "linetype" is not a graphical parameter
Warning in box(...) : "linetype" is not a graphical parameter
legend("topleft", inset = 0.02, legend=c("PANIC4","PANIC3", "PANIC2", "PANIC1","OCD4","OCD3","OCD2","OCD1"),
       col=c("blue4", "blue3","blue2","blue","darkorchid4","darkorchid3","darkorchid2","darkorchid1"), lty=1, cex=0.8)
#lines(google.ts/100*max(prevNEURO3.ts[,1]),col="green")
# Add vertical lines indicating date of celerbity disclosures
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)

#dev.off()

Draw graph of incidence and google data

inciNEURO3.ts=ts.union(inciPANIC.ts, inciPTSD.ts, inciOCD.ts);
#pdf(file="~/Dropbox/gitLab/studyDepressionBigData/inciNEURO320042021.pdf")
plot(inciNEURO3.ts, type="l", plot.type="s", col=c("blue","magenta","cyan"), xlab="Month", ylab="Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(inciPANIC.ts)))
Warning in plot.window(xlim, ylim, log, ...) :
  "linetype" is not a graphical parameter
Warning in title(main = main, xlab = xlab, ylab = ylab, ...) :
  "linetype" is not a graphical parameter
Warning in axis(1, ...) : "linetype" is not a graphical parameter
Warning in axis(2, ...) : "linetype" is not a graphical parameter
Warning in box(...) : "linetype" is not a graphical parameter
legend("topleft", inset = 0.02, legend=c("PANIC","OCD", "PTSD"),
       col=c("blue", "cyan","magenta"), lty=1, cex=0.8)
polygon(c(min(index(google.ts)),index(google.ts), max(index(google.ts))), c(0, google.ts*max(inciPANIC.ts)/100,0),col="blue")
polygon(c(min(index(googleOCDrelative.ts)),index(googleOCDrelative.ts), max(index(googleOCDrelative.ts))), c(0, googleOCDrelative.ts*max(inciPANIC.ts)/100,0),col="green")
# Add vertical lines indicating date of celerbity disclosures
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)

#dev.off()
# check autocorrelation
acf2(inciPANIC4.ts, max.lag=24)
     [,1] [,2]  [,3]  [,4]  [,5] [,6]  [,7] [,8]  [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
ACF  0.98 0.96  0.95  0.93  0.91 0.90  0.89 0.88  0.87  0.85  0.84  0.84  0.82  0.81  0.80  0.79  0.77  0.76  0.74  0.73  0.72  0.71  0.70  0.69
PACF 0.98 0.17 -0.01 -0.01 -0.02 0.08 -0.01 0.11 -0.02 -0.10  0.09  0.09 -0.15  0.02 -0.03  0.00 -0.04 -0.06  0.07  0.03 -0.03  0.07 -0.03 -0.02

# View ACF/PACF plots of differenced/seasonally differenced data
acf2(diff(inciPANIC4.ts,lag=12), max.lag=24)
     [,1] [,2] [,3] [,4] [,5] [,6]  [,7]  [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
ACF  0.69 0.57 0.45 0.39 0.34 0.35  0.30  0.23 0.26  0.14  0.08 -0.05  0.05  0.08  0.07  0.08  0.07  0.05  0.08  0.06  0.00 -0.06 -0.09 -0.17
PACF 0.69 0.18 0.01 0.07 0.02 0.12 -0.02 -0.07 0.14 -0.21 -0.07 -0.18  0.26  0.10 -0.13  0.09  0.02  0.01  0.09 -0.14  0.04 -0.28 -0.07 -0.16

acf2(diff(diff(inciPANIC4.ts,lag=12)), max.lag=24)
      [,1]  [,2]  [,3] [,4]  [,5]  [,6] [,7]  [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
ACF  -0.31 -0.01 -0.10  0.0 -0.09  0.08 0.03 -0.16 0.24 -0.08  0.10 -0.36  0.11  0.08 -0.05  0.04  0.00 -0.07  0.09  0.07  0.00 -0.06  0.09 -0.22
PACF -0.31 -0.12 -0.16 -0.1 -0.17 -0.03 0.02 -0.20 0.15  0.02  0.12 -0.31 -0.14  0.11 -0.12 -0.06 -0.04 -0.12  0.12 -0.06  0.23  0.02  0.11 -0.29

transferF.ts is the time series of transfer function from the celebrities’ disclosures.

make transfer fuction matrix

countN=1:216;
monthCha=which(data$googCha == 100);
monthKim=which(data$googKim == 100);
monthLee=which(data$googLee == 100);

stepCha = as.numeric(countN > monthCha)
stepKim = as.numeric(countN > monthKim)
stepLee = as.numeric(countN > monthLee)
rampCha <- append(rep(0,monthCha), seq(1,216-monthCha,1))
rampKim <- append(rep(0,monthKim), seq(1,216-monthKim,1))
rampLee <- append(rep(0,monthLee), seq(1,216-monthLee,1))
transferF=cbind(stepCha,stepKim,stepLee,rampCha,rampKim,rampLee)
transferF.ts=ts(transferF,frequency=12, start=c(2004,1))
transferFGoogle=as.numeric(google.ts)
transferFGoogle.ts=ts(transferF,frequency=12, start=c(2004,1))

plot(transferF.ts)

# model 1 is for statistical analysis result is (1 0 0) , (0,0,1) 
incimodel1 <- auto.arima(inciPANIC1.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
# Check residuals
checkresiduals(incimodel1)
Box.test(incimodel1$residuals, lag = 24, type = "Ljung-Box")
# Estimate parameters and confidence intervals
summary(incimodel1)
confint(incimodel1)
coeftest(incimodel1)
# model 1 is for statistical analysis result is (1 0 0) , (0,0,1) 
incimodel2 <- auto.arima(inciPANIC2.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
# Check residuals
checkresiduals(incimodel2)
Box.test(incimodel2$residuals, lag = 24, type = "Ljung-Box")
# Estimate parameters and confidence intervals
summary(incimodel2)
confint(incimodel2)
coeftest(incimodel2)
# model 1 is for statistical analysis result is (1 0 0) , (0,0,1) 
incimodel3 <- auto.arima(inciPANIC3.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
# Check residuals
checkresiduals(incimodel3)
Box.test(incimodel3$residuals, lag = 24, type = "Ljung-Box")
# Estimate parameters and confidence intervals
summary(incimodel3)
confint(incimodel3)
coeftest(incimodel3)

Below is the selected model of incidence. In the text:Only the first celebrity disclosure significantly increased both the level (0·0058%, 95% CI: 0·0022%–0·0095%, p < 0·005) and slope of the monthly incidence of panic disorder (0·00078% per month, 95% CI 0·00019%–0·0014% per month, p < 0·01).

# model 1 is for statistical analysis result is (1 0 0) , (0,0,1) 
incimodel4 <- auto.arima(inciPANIC4.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);

 Fitting models using approximations to speed things up...

 Regression with ARIMA(0,0,0)            errors : -1744.304
 Regression with ARIMA(0,0,0)            errors : -1985.792
 Regression with ARIMA(0,0,0)(0,0,1)[12] errors : -1858.405
 Regression with ARIMA(0,0,0)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,0)(0,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,0)(0,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,0)(1,0,0)[12] errors : -1959.339
 Regression with ARIMA(0,0,0)(1,0,0)[12] errors : -2008.507
 Regression with ARIMA(0,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,0)(2,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,0)(2,0,0)[12] errors : -1994.217
 Regression with ARIMA(0,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,0)(2,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,0)(2,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,1)            errors : -1847.789
 Regression with ARIMA(0,0,1)            errors : -2010.496
 Regression with ARIMA(0,0,1)(0,0,1)[12] errors : -1932.638
 Regression with ARIMA(0,0,1)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,1)(0,0,2)[12] errors : -1939.038
 Regression with ARIMA(0,0,1)(0,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,1)(1,0,0)[12] errors : -1988.242
 Regression with ARIMA(0,0,1)(1,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,1)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,1)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,1)(2,0,0)[12] errors : -1988.01
 Regression with ARIMA(0,0,1)(2,0,0)[12] errors : -2018.107
 Regression with ARIMA(0,0,1)(2,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,1)(2,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,1)(2,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,1)(2,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,2)            errors : -1903.597
 Regression with ARIMA(0,0,2)            errors : -2019.842
 Regression with ARIMA(0,0,2)(0,0,1)[12] errors : -1967.178
 Regression with ARIMA(0,0,2)(0,0,1)[12] errors : -2045.423
 Regression with ARIMA(0,0,2)(0,0,2)[12] errors : -1971.703
 Regression with ARIMA(0,0,2)(0,0,2)[12] errors : -2043.368
 Regression with ARIMA(0,0,2)(1,0,0)[12] errors : -1998.789
 Regression with ARIMA(0,0,2)(1,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,2)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,2)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,2)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,2)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,2)(2,0,0)[12] errors : -1995.719
 Regression with ARIMA(0,0,2)(2,0,0)[12] errors : -2024.098
 Regression with ARIMA(0,0,2)(2,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,2)(2,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,3)            errors : -1922.74
 Regression with ARIMA(0,0,3)            errors : -2018.631
 Regression with ARIMA(0,0,3)(0,0,1)[12] errors : -1972.909
 Regression with ARIMA(0,0,3)(0,0,1)[12] errors : -2043.221
 Regression with ARIMA(0,0,3)(0,0,2)[12] errors : -1975.712
 Regression with ARIMA(0,0,3)(0,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,3)(1,0,0)[12] errors : -1997.949
 Regression with ARIMA(0,0,3)(1,0,0)[12] errors : -2036.07
 Regression with ARIMA(0,0,3)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,3)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,3)(2,0,0)[12] errors : -1995.971
 Regression with ARIMA(0,0,3)(2,0,0)[12] errors : -2022.258
 Regression with ARIMA(0,0,4)            errors : -1952.324
 Regression with ARIMA(0,0,4)            errors : -2020.341
 Regression with ARIMA(0,0,4)(0,0,1)[12] errors : -1987.812
 Regression with ARIMA(0,0,4)(0,0,1)[12] errors : -2042.719
 Regression with ARIMA(0,0,4)(1,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,4)(1,0,0)[12] errors : -2035.261
 Regression with ARIMA(0,0,5)            errors : -1955.125
 Regression with ARIMA(0,0,5)            errors : -2019.298
 Regression with ARIMA(1,0,0)            errors : -1970.125
 Regression with ARIMA(1,0,0)            errors : -2020.553
 Regression with ARIMA(1,0,0)(0,0,1)[12] errors : -2001.39
 Regression with ARIMA(1,0,0)(0,0,1)[12] errors : -2046.35
 Regression with ARIMA(1,0,0)(0,0,2)[12] errors : -1999.806
 Regression with ARIMA(1,0,0)(0,0,2)[12] errors : -2044.226
 Regression with ARIMA(1,0,0)(1,0,0)[12] errors : -2004.667
 Regression with ARIMA(1,0,0)(1,0,0)[12] errors : -2038.168
 Regression with ARIMA(1,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,0)(2,0,0)[12] errors : -2000.331
 Regression with ARIMA(1,0,0)(2,0,0)[12] errors : -2024.353
 Regression with ARIMA(1,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,0)(2,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,0)(2,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,1)            errors : -1992.489
 Regression with ARIMA(1,0,1)            errors : -2019.92
 Regression with ARIMA(1,0,1)(0,0,1)[12] errors : -2017.553
 Regression with ARIMA(1,0,1)(0,0,1)[12] errors : -2044.645
 Regression with ARIMA(1,0,1)(0,0,2)[12] errors : -2015.614
 Regression with ARIMA(1,0,1)(0,0,2)[12] errors : -2042.519
 Regression with ARIMA(1,0,1)(1,0,0)[12] errors : -2012.4
 Regression with ARIMA(1,0,1)(1,0,0)[12] errors : -2036.382
 Regression with ARIMA(1,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,1)(1,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,1)(1,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,1)(2,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,1)(2,0,0)[12] errors : -2022.615
 Regression with ARIMA(1,0,1)(2,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,1)(2,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,2)            errors : Inf
 Regression with ARIMA(1,0,2)            errors : -2019.528
 Regression with ARIMA(1,0,2)(0,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,2)(0,0,1)[12] errors : -2043.212
 Regression with ARIMA(1,0,2)(0,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,2)(0,0,2)[12] errors : -2041.137
 Regression with ARIMA(1,0,2)(1,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,2)(1,0,0)[12] errors : -2035.216
 Regression with ARIMA(1,0,2)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,2)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,2)(2,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,2)(2,0,0)[12] errors : -2021.33
 Regression with ARIMA(1,0,3)            errors : Inf
 Regression with ARIMA(1,0,3)            errors : -2017.311
 Regression with ARIMA(1,0,3)(0,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,3)(0,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,3)(1,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,3)(1,0,0)[12] errors : -2032.969
 Regression with ARIMA(1,0,4)            errors : Inf
 Regression with ARIMA(1,0,4)            errors : -2017.901
 Regression with ARIMA(2,0,0)            errors : -1988.929
 Regression with ARIMA(2,0,0)            errors : -2019.861
 Regression with ARIMA(2,0,0)(0,0,1)[12] errors : -2012.632
 Regression with ARIMA(2,0,0)(0,0,1)[12] errors : -2043.92
 Regression with ARIMA(2,0,0)(0,0,2)[12] errors : -2010.963
 Regression with ARIMA(2,0,0)(0,0,2)[12] errors : -2041.798
 Regression with ARIMA(2,0,0)(1,0,0)[12] errors : -2008.986
 Regression with ARIMA(2,0,0)(1,0,0)[12] errors : -2035.697
 Regression with ARIMA(2,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(2,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(2,0,0)(2,0,0)[12] errors : -2001.12
 Regression with ARIMA(2,0,0)(2,0,0)[12] errors : -2021.75
 Regression with ARIMA(2,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,1)            errors : Inf
 Regression with ARIMA(2,0,1)            errors : Inf
 Regression with ARIMA(2,0,1)(0,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,1)(0,0,1)[12] errors : -2043.49
 Regression with ARIMA(2,0,1)(0,0,2)[12] errors : Inf
 Regression with ARIMA(2,0,1)(0,0,2)[12] errors : -2041.354
 Regression with ARIMA(2,0,1)(1,0,0)[12] errors : Inf
 Regression with ARIMA(2,0,1)(1,0,0)[12] errors : -2035.222
 Regression with ARIMA(2,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,1)(2,0,0)[12] errors : Inf
 Regression with ARIMA(2,0,1)(2,0,0)[12] errors : Inf
 Regression with ARIMA(2,0,2)            errors : Inf
 Regression with ARIMA(2,0,2)            errors : Inf
 Regression with ARIMA(2,0,2)(0,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,2)(0,0,1)[12] errors : -2041.453
 Regression with ARIMA(2,0,2)(1,0,0)[12] errors : Inf
 Regression with ARIMA(2,0,2)(1,0,0)[12] errors : -2033.302
 Regression with ARIMA(2,0,3)            errors : Inf
 Regression with ARIMA(2,0,3)            errors : Inf
 Regression with ARIMA(3,0,0)            errors : -1986.945
 Regression with ARIMA(3,0,0)            errors : -2018.366
 Regression with ARIMA(3,0,0)(0,0,1)[12] errors : -2010.631
 Regression with ARIMA(3,0,0)(0,0,1)[12] errors : -2042.003
 Regression with ARIMA(3,0,0)(0,0,2)[12] errors : -2008.829
 Regression with ARIMA(3,0,0)(0,0,2)[12] errors : -2039.925
 Regression with ARIMA(3,0,0)(1,0,0)[12] errors : -2006.866
 Regression with ARIMA(3,0,0)(1,0,0)[12] errors : -2033.831
 Regression with ARIMA(3,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(3,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(3,0,0)(2,0,0)[12] errors : -1998.163
 Regression with ARIMA(3,0,0)(2,0,0)[12] errors : -2019.462
 Regression with ARIMA(3,0,1)            errors : Inf
 Regression with ARIMA(3,0,1)            errors : -2018.521
 Regression with ARIMA(3,0,1)(0,0,1)[12] errors : Inf
 Regression with ARIMA(3,0,1)(0,0,1)[12] errors : -2040.779
 Regression with ARIMA(3,0,1)(1,0,0)[12] errors : Inf
 Regression with ARIMA(3,0,1)(1,0,0)[12] errors : -2032.228
 Regression with ARIMA(3,0,2)            errors : Inf
 Regression with ARIMA(3,0,2)            errors : Inf
 Regression with ARIMA(4,0,0)            errors : -1985.683
 Regression with ARIMA(4,0,0)            errors : -2016.055
 Regression with ARIMA(4,0,0)(0,0,1)[12] errors : -2011.971
 Regression with ARIMA(4,0,0)(0,0,1)[12] errors : Inf
 Regression with ARIMA(4,0,0)(1,0,0)[12] errors : -2006.8
 Regression with ARIMA(4,0,0)(1,0,0)[12] errors : Inf
 Regression with ARIMA(4,0,1)            errors : Inf
 Regression with ARIMA(4,0,1)            errors : -2016.639
 Regression with ARIMA(5,0,0)            errors : -1982.65
 Regression with ARIMA(5,0,0)            errors : -2019.662

 Now re-fitting the best model(s) without approximations...




 Best model: Regression with ARIMA(1,0,0)(0,0,1)[12] errors 
# Check residuals
checkresiduals(incimodel4)

    Ljung-Box test

data:  Residuals from Regression with ARIMA(1,0,0)(0,0,1)[12] errors
Q* = 20.216, df = 22, p-value = 0.5695

Model df: 2.   Total lags used: 24

Box.test(incimodel4$residuals, lag = 24, type = "Ljung-Box")

    Box-Ljung test

data:  incimodel4$residuals
X-squared = 20.216, df = 24, p-value = 0.6844
# Estimate parameters and confidence intervals
summary(incimodel4)
Series: inciPANIC4.ts 
Regression with ARIMA(1,0,0)(0,0,1)[12] errors 

Coefficients:
         ar1    sma1  intercept  stepCha  stepKim  stepLee  rampCha  rampKim  rampLee
      0.3953  0.3734     0.0055   0.0058  -0.0039    8e-04    8e-04  -0.0001  -0.0004
s.e.  0.0662  0.1349     0.0005   0.0019   0.0030    2e-03    3e-04   0.0015   0.0013

sigma^2 = 4.25e-06:  log likelihood = 1032.92
AIC=-2045.84   AICc=-2044.77   BIC=-2012.09

Training set error measures:
                       ME        RMSE         MAE       MPE    MAPE      MASE        ACF1
Training set 1.431561e-05 0.002018219 0.001366502 -1.071599 7.48214 0.4412333 -0.02085657
confint(incimodel4)
                  2.5 %      97.5 %
ar1        0.2654833303 0.525096435
sma1       0.1090416493 0.637782243
intercept  0.0045494745 0.006443885
stepCha    0.0021693392 0.009495776
stepKim   -0.0096708467 0.001970305
stepLee   -0.0030503483 0.004735527
rampCha    0.0001911517 0.001369437
rampKim   -0.0029191621 0.002799575
rampLee   -0.0030324226 0.002144572
coeftest(incimodel4)

z test of coefficients:

             Estimate  Std. Error z value  Pr(>|z|)    
ar1        3.9529e-01  6.6229e-02  5.9685 2.394e-09 ***
sma1       3.7341e-01  1.3489e-01  2.7684  0.005634 ** 
intercept  5.4967e-03  4.8328e-04 11.3738 < 2.2e-16 ***
stepCha    5.8326e-03  1.8690e-03  3.1206  0.001805 ** 
stepKim   -3.8503e-03  2.9697e-03 -1.2965  0.194802    
stepLee    8.4259e-04  1.9862e-03  0.4242  0.671409    
rampCha    7.8029e-04  3.0059e-04  2.5959  0.009435 ** 
rampKim   -5.9794e-05  1.4589e-03 -0.0410  0.967307    
rampLee   -4.4393e-04  1.3207e-03 -0.3361  0.736771    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

OCD model

# model 1 is for statistical analysis result is (1 0 0) , (0,0,1) 
modelOCD4 <- auto.arima(inciOCD4.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);

 Fitting models using approximations to speed things up...

 Regression with ARIMA(0,0,0)            errors : -2148.121
 Regression with ARIMA(0,0,0)            errors : -2523.449
 Regression with ARIMA(0,0,0)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,0)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,0)(0,0,2)[12] errors : -2385.86
 Regression with ARIMA(0,0,0)(0,0,2)[12] errors : -2577.604
 Regression with ARIMA(0,0,0)(1,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,0)(1,0,0)[12] errors : -2599.654
 Regression with ARIMA(0,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,0)(1,0,1)[12] errors : -2599.844
 Regression with ARIMA(0,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,0)(2,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,0)(2,0,0)[12] errors : -2595.71
 Regression with ARIMA(0,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,0)(2,0,1)[12] errors : -2597.981
 Regression with ARIMA(0,0,0)(2,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,0)(2,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,1)            errors : -2336.93
 Regression with ARIMA(0,0,1)            errors : -2618.476
 Regression with ARIMA(0,0,1)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,1)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,1)(0,0,2)[12] errors : -2507.29
 Regression with ARIMA(0,0,1)(0,0,2)[12] errors : -2658.691
 Regression with ARIMA(0,0,1)(1,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,1)(1,0,0)[12] errors : -2674.429
 Regression with ARIMA(0,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,1)(1,0,1)[12] errors : -2678.233
 Regression with ARIMA(0,0,1)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,1)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,1)(2,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,1)(2,0,0)[12] errors : -2669.216
 Regression with ARIMA(0,0,1)(2,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,1)(2,0,1)[12] errors : -2668.942
 Regression with ARIMA(0,0,1)(2,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,1)(2,0,2)[12] errors : -2670.428
 Regression with ARIMA(0,0,2)            errors : -2457.059
 Regression with ARIMA(0,0,2)            errors : -2670.056
 Regression with ARIMA(0,0,2)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,2)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,2)(0,0,2)[12] errors : -2574.302
 Regression with ARIMA(0,0,2)(0,0,2)[12] errors : -2699.261
 Regression with ARIMA(0,0,2)(1,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,2)(1,0,0)[12] errors : -2708.346
 Regression with ARIMA(0,0,2)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,2)(1,0,1)[12] errors : -2714.069
 Regression with ARIMA(0,0,2)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,2)(1,0,2)[12] errors : Inf
 Regression with ARIMA(0,0,2)(2,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,2)(2,0,0)[12] errors : -2703.993
 Regression with ARIMA(0,0,2)(2,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,2)(2,0,1)[12] errors : -2705.174
 Regression with ARIMA(0,0,3)            errors : -2524.534
 Regression with ARIMA(0,0,3)            errors : -2698.39
 Regression with ARIMA(0,0,3)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,3)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,3)(0,0,2)[12] errors : -2613.538
 Regression with ARIMA(0,0,3)(0,0,2)[12] errors : -2725.548
 Regression with ARIMA(0,0,3)(1,0,0)[12] errors : -2681.029
 Regression with ARIMA(0,0,3)(1,0,0)[12] errors : -2730.69
 Regression with ARIMA(0,0,3)(1,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,3)(1,0,1)[12] errors : -2738.47
 Regression with ARIMA(0,0,3)(2,0,0)[12] errors : Inf
 Regression with ARIMA(0,0,3)(2,0,0)[12] errors : -2727.269
 Regression with ARIMA(0,0,4)            errors : -2572.36
 Regression with ARIMA(0,0,4)            errors : -2715.39
 Regression with ARIMA(0,0,4)(0,0,1)[12] errors : -2623.834
 Regression with ARIMA(0,0,4)(0,0,1)[12] errors : Inf
 Regression with ARIMA(0,0,4)(1,0,0)[12] errors : -2689.17
 Regression with ARIMA(0,0,4)(1,0,0)[12] errors : -2737.927
 Regression with ARIMA(0,0,5)            errors : -2599.208
 Regression with ARIMA(0,0,5)            errors : -2716.066
 Regression with ARIMA(1,0,0)            errors : Inf
 Regression with ARIMA(1,0,0)            errors : -2724.109
 Regression with ARIMA(1,0,0)(0,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,0)(0,0,1)[12] errors : -2739.879
 Regression with ARIMA(1,0,0)(0,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,0)(0,0,2)[12] errors : -2742.747
 Regression with ARIMA(1,0,0)(1,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,0)(1,0,0)[12] errors : -2741.106
 Regression with ARIMA(1,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,0)(2,0,0)[12] errors : -2717.176
 Regression with ARIMA(1,0,0)(2,0,0)[12] errors : -2736.119
 Regression with ARIMA(1,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,0)(2,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,0)(2,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,1)            errors : Inf
 Regression with ARIMA(1,0,1)            errors : -2745.844
 Regression with ARIMA(1,0,1)(0,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,1)(0,0,1)[12] errors : -2758.654
 Regression with ARIMA(1,0,1)(0,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,1)(0,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,1)(1,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,1)(1,0,0)[12] errors : -2755.162
 Regression with ARIMA(1,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,1)(1,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,1)(1,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,1)(2,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,1)(2,0,0)[12] errors : -2749.621
 Regression with ARIMA(1,0,1)(2,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,1)(2,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,2)            errors : Inf
 Regression with ARIMA(1,0,2)            errors : -2745.433
 Regression with ARIMA(1,0,2)(0,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,2)(0,0,1)[12] errors : -2757.567
 Regression with ARIMA(1,0,2)(0,0,2)[12] errors : Inf
 Regression with ARIMA(1,0,2)(0,0,2)[12] errors : -2760.122
 Regression with ARIMA(1,0,2)(1,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,2)(1,0,0)[12] errors : -2754.307
 Regression with ARIMA(1,0,2)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,2)(1,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,2)(2,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,2)(2,0,0)[12] errors : -2748.369
 Regression with ARIMA(1,0,3)            errors : Inf
 Regression with ARIMA(1,0,3)            errors : -2744.643
 Regression with ARIMA(1,0,3)(0,0,1)[12] errors : Inf
 Regression with ARIMA(1,0,3)(0,0,1)[12] errors : -2756.089
 Regression with ARIMA(1,0,3)(1,0,0)[12] errors : Inf
 Regression with ARIMA(1,0,3)(1,0,0)[12] errors : -2752.201
 Regression with ARIMA(1,0,4)            errors : Inf
 Regression with ARIMA(1,0,4)            errors : -2744.941
 Regression with ARIMA(2,0,0)            errors : -2738.803
 Regression with ARIMA(2,0,0)            errors : Inf
 Regression with ARIMA(2,0,0)(0,0,1)[12] errors : -2750.093
 Regression with ARIMA(2,0,0)(0,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,0)(0,0,2)[12] errors : Inf
 Regression with ARIMA(2,0,0)(0,0,2)[12] errors : Inf
 Regression with ARIMA(2,0,0)(1,0,0)[12] errors : Inf
 Regression with ARIMA(2,0,0)(1,0,0)[12] errors : -2755.598
 Regression with ARIMA(2,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(2,0,0)(1,0,2)[12] errors : Inf
 Regression with ARIMA(2,0,0)(2,0,0)[12] errors : Inf
 Regression with ARIMA(2,0,0)(2,0,0)[12] errors : -2749.36
 Regression with ARIMA(2,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,0)(2,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,1)            errors : -2737.883
 Regression with ARIMA(2,0,1)            errors : Inf
 Regression with ARIMA(2,0,1)(0,0,1)[12] errors : -2750.012
 Regression with ARIMA(2,0,1)(0,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,1)(0,0,2)[12] errors : -2753.916
 Regression with ARIMA(2,0,1)(0,0,2)[12] errors : Inf
 Regression with ARIMA(2,0,1)(1,0,0)[12] errors : -2744.796
 Regression with ARIMA(2,0,1)(1,0,0)[12] errors : -2753.439
 Regression with ARIMA(2,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,1)(1,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,1)(2,0,0)[12] errors : Inf
 Regression with ARIMA(2,0,1)(2,0,0)[12] errors : -2747.356
 Regression with ARIMA(2,0,2)            errors : Inf
 Regression with ARIMA(2,0,2)            errors : -2742.99
 Regression with ARIMA(2,0,2)(0,0,1)[12] errors : Inf
 Regression with ARIMA(2,0,2)(0,0,1)[12] errors : -2754.726
 Regression with ARIMA(2,0,2)(1,0,0)[12] errors : -2743
 Regression with ARIMA(2,0,2)(1,0,0)[12] errors : -2751.178
 Regression with ARIMA(2,0,3)            errors : Inf
 Regression with ARIMA(2,0,3)            errors : Inf
 Regression with ARIMA(3,0,0)            errors : -2736.805
 Regression with ARIMA(3,0,0)            errors : Inf
 Regression with ARIMA(3,0,0)(0,0,1)[12] errors : -2748.312
 Regression with ARIMA(3,0,0)(0,0,1)[12] errors : Inf
 Regression with ARIMA(3,0,0)(0,0,2)[12] errors : -2752.098
 Regression with ARIMA(3,0,0)(0,0,2)[12] errors : Inf
 Regression with ARIMA(3,0,0)(1,0,0)[12] errors : Inf
 Regression with ARIMA(3,0,0)(1,0,0)[12] errors : -2752.783
 Regression with ARIMA(3,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(3,0,0)(1,0,1)[12] errors : Inf
 Regression with ARIMA(3,0,0)(2,0,0)[12] errors : Inf
 Regression with ARIMA(3,0,0)(2,0,0)[12] errors : -2746.496
 Regression with ARIMA(3,0,1)            errors : Inf
 Regression with ARIMA(3,0,1)            errors : Inf
 Regression with ARIMA(3,0,1)(0,0,1)[12] errors : Inf
 Regression with ARIMA(3,0,1)(0,0,1)[12] errors : Inf
 Regression with ARIMA(3,0,1)(1,0,0)[12] errors : Inf
 Regression with ARIMA(3,0,1)(1,0,0)[12] errors : -2750.564
 Regression with ARIMA(3,0,2)            errors : Inf
 Regression with ARIMA(3,0,2)            errors : Inf
 Regression with ARIMA(4,0,0)            errors : -2734.031
 Regression with ARIMA(4,0,0)            errors : -2741.434
 Regression with ARIMA(4,0,0)(0,0,1)[12] errors : -2745.509
 Regression with ARIMA(4,0,0)(0,0,1)[12] errors : -2753.125
 Regression with ARIMA(4,0,0)(1,0,0)[12] errors : -2741.077
 Regression with ARIMA(4,0,0)(1,0,0)[12] errors : -2749.589
 Regression with ARIMA(4,0,1)            errors : Inf
 Regression with ARIMA(4,0,1)            errors : Inf
 Regression with ARIMA(5,0,0)            errors : Inf
 Regression with ARIMA(5,0,0)            errors : -2738.468

 Now re-fitting the best model(s) without approximations...




 Best model: Regression with ARIMA(1,0,2)(0,0,2)[12] errors 
# Check residuals
checkresiduals(modelOCD4)

    Ljung-Box test

data:  Residuals from Regression with ARIMA(1,0,2)(0,0,2)[12] errors
Q* = 16.208, df = 19, p-value = 0.6433

Model df: 5.   Total lags used: 24

Box.test(modelOCD4$residuals, lag = 24, type = "Ljung-Box")

    Box-Ljung test

data:  modelOCD4$residuals
X-squared = 16.208, df = 24, p-value = 0.8804
# Estimate parameters and confidence intervals
summary(modelOCD4)
Series: inciOCD4.ts 
Regression with ARIMA(1,0,2)(0,0,2)[12] errors 

Coefficients:
         ar1      ma1     ma2    sma1    sma2  intercept  stepCha  stepKim  stepLee  rampCha  rampKim  rampLee
      0.8865  -0.3684  0.0845  0.2223  0.1885     0.0022    1e-04    2e-04    4e-04        0   -1e-04    1e-04
s.e.  0.0451   0.0775  0.0787  0.0781  0.0766     0.0003    4e-04    5e-04    4e-04        0    3e-04    2e-04

sigma^2 = 1.532e-07:  log likelihood = 1393.15
AIC=-2760.29   AICc=-2758.49   BIC=-2716.42

Training set error measures:
                       ME         RMSE          MAE        MPE     MAPE      MASE         ACF1
Training set 7.749073e-06 0.0003803332 0.0002557093 -0.8780508 7.511036 0.5063964 -0.005505008
confint(modelOCD4)
                  2.5 %        97.5 %
ar1        7.980910e-01  9.748648e-01
ma1       -5.203974e-01 -2.164610e-01
ma2       -6.971391e-02  2.386206e-01
sma1       6.919980e-02  3.754006e-01
sma2       3.836636e-02  3.385606e-01
intercept  1.577551e-03  2.881159e-03
stepCha   -7.107179e-04  8.381240e-04
stepKim   -7.377225e-04  1.216371e-03
stepLee   -2.739021e-04  1.127489e-03
rampCha   -4.520873e-05  4.977057e-05
rampKim   -5.833641e-04  4.217350e-04
rampLee   -3.526964e-04  5.653215e-04
coeftest(modelOCD4)

z test of coefficients:

             Estimate  Std. Error z value  Pr(>|z|)    
ar1        8.8648e-01  4.5096e-02 19.6575 < 2.2e-16 ***
ma1       -3.6843e-01  7.7536e-02 -4.7517 2.017e-06 ***
ma2        8.4453e-02  7.8658e-02  1.0737  0.282968    
sma1       2.2230e-01  7.8114e-02  2.8458  0.004429 ** 
sma2       1.8846e-01  7.6582e-02  2.4610  0.013857 *  
intercept  2.2294e-03  3.3256e-04  6.7036 2.033e-11 ***
stepCha    6.3703e-05  3.9512e-04  0.1612  0.871916    
stepKim    2.3932e-04  4.9850e-04  0.4801  0.631166    
stepLee    4.2679e-04  3.5750e-04  1.1938  0.232551    
rampCha    2.2809e-06  2.4230e-05  0.0941  0.925001    
rampKim   -8.0814e-05  2.5641e-04 -0.3152  0.752625    
rampLee    1.0631e-04  2.3419e-04  0.4540  0.649862    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Significance was found in two cases:grangertest(diff(prevPANIC4.ts) ~ google.ts[-216], order=2) and grangertest(diff(prevPANIC4.ts) ~ google.ts[-216], order=3). A significant p-value in the context of the ADF test suggests that the time series is likely stationary. A significant p-value was found in google.ts and diff(prevPANIC4.ts) diff(inciPANIC4.ts). In the manuscript: The monthly incidence and prevalence were nonstationary (ADF = -2·98, p = 0·17 and ADF = -0·73, p = 0·97 for incidence and prevalence, respectively); the first-order differences in the monthly incidence and prevalence of panic disorder were stationary (ADF = -8·19, p < 0·05 and ADF = -7·14, p < 0·05 for incidence and prevalence, respectively).

correlation between Google trend and incidence

library(tseries)
adf.test(google.ts, alternative = "stationary") 
Warning in adf.test(google.ts, alternative = "stationary") :
  p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  google.ts
Dickey-Fuller = -4.1402, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary
adf.test(inciPANIC4.ts, alternative = "stationary") 

    Augmented Dickey-Fuller Test

data:  inciPANIC4.ts
Dickey-Fuller = -2.9771, Lag order = 5, p-value = 0.1661
alternative hypothesis: stationary
adf.test(prevPANIC4.ts, alternative = "stationary") 

    Augmented Dickey-Fuller Test

data:  prevPANIC4.ts
Dickey-Fuller = -0.72732, Lag order = 5, p-value = 0.9668
alternative hypothesis: stationary
#adf.test(inciPANIC3.ts, alternative = "stationary") 
#adf.test(prevPANIC3.ts, alternative = "stationary") 

#adf.test(inciPANIC2.ts, alternative = "stationary") 
#adf.test(prevPANIC2.ts, alternative = "stationary") 

#adf.test(inciPANIC1.ts, alternative = "stationary") 
#adf.test(prevPANIC1.ts, alternative = "stationary") 

adf.test(diff(inciPANIC4.ts), alternative = "stationary") 
Warning in adf.test(diff(inciPANIC4.ts), alternative = "stationary") :
  p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  diff(inciPANIC4.ts)
Dickey-Fuller = -8.1899, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary
adf.test(diff(prevPANIC4.ts), alternative = "stationary")
Warning in adf.test(diff(prevPANIC4.ts), alternative = "stationary") :
  p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  diff(prevPANIC4.ts)
Dickey-Fuller = -7.1425, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary
#adf.test(diff(inciPANIC3.ts), alternative = "stationary") 
#adf.test(diff(prevPANIC3.ts), alternative = "stationary")

#adf.test(diff(inciPANIC2.ts), alternative = "stationary") 
#adf.test(diff(prevPANIC2.ts), alternative = "stationary")

#adf.test(diff(inciPANIC1.ts), alternative = "stationary") 
#adf.test(diff(prevPANIC1.ts), alternative = "stationary")


#cor.test(inciPANIC1.ts, google.ts,  method="kendall")
cor.test(diff(inciPANIC4.ts), google.ts[-216],  method="spearman", exact=FALSE)

    Spearman's rank correlation rho

data:  diff(inciPANIC4.ts) and google.ts[-216]
S = 1647882, p-value = 0.9405
alternative hypothesis: true rho is not equal to 0
sample estimates:
        rho 
0.005118754 
cor.test(diff(prevPANIC4.ts), google.ts[-216],  method="spearman", exact=FALSE)

    Spearman's rank correlation rho

data:  diff(prevPANIC4.ts) and google.ts[-216]
S = 1342497, p-value = 0.005311
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.1894897 
#cor.test(diff(inciPANIC3.ts), google.ts[-216],  method="spearman", exact=FALSE)
#cor.test(diff(prevPANIC3.ts), google.ts[-216],  method="spearman", exact=FALSE)

#cor.test(diff(inciPANIC2.ts), google.ts[-216],  method="spearman", exact=FALSE)
#cor.test(diff(prevPANIC2.ts), google.ts[-216],  method="spearman", exact=FALSE)

#cor.test(diff(inciPANIC1.ts), google.ts[-216],  method="spearman", exact=FALSE)
#cor.test(diff(prevPANIC1.ts), google.ts[-216],  method="spearman", exact=FALSE)

grangertest(diff(prevPANIC4.ts) ~ google.ts[-216], order=4)
Granger causality test

Model 1: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:4) + Lags(google.ts[-216], 1:4)
Model 2: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:4)
  Res.Df Df      F  Pr(>F)  
1    202                    
2    206 -4 1.9743 0.09979 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
grangertest(google.ts[-216] ~ diff(prevPANIC4.ts), order=4)
Granger causality test

Model 1: google.ts[-216] ~ Lags(google.ts[-216], 1:4) + Lags(diff(prevPANIC4.ts), 1:4)
Model 2: google.ts[-216] ~ Lags(google.ts[-216], 1:4)
  Res.Df Df      F Pr(>F)
1    202                 
2    206 -4 0.7346 0.5694
#grangertest(inciPANIC1.ts ~ google.ts, order=3)
#grangertest(inciPANIC1.ts ~ google.ts, order=2)
#grangertest(inciPANIC1.ts ~ google.ts, order=1)

grangertest(diff(prevPANIC4.ts) ~ google.ts[-216], order=3)
Granger causality test

Model 1: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:3) + Lags(google.ts[-216], 1:3)
Model 2: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:3)
  Res.Df Df      F  Pr(>F)  
1    205                    
2    208 -3 3.1082 0.02748 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#grangertest(diff(prevPANIC1.ts) ~ google.ts[-216], order=3)
grangertest(diff(prevPANIC4.ts) ~ google.ts[-216], order=2)
Granger causality test

Model 1: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:2) + Lags(google.ts[-216], 1:2)
Model 2: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:2)
  Res.Df Df      F  Pr(>F)  
1    208                    
2    210 -2 4.2575 0.01541 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#grangertest(diff(prevPANIC1.ts) ~ google.ts[-216], order=2)
grangertest(diff(prevPANIC4.ts) ~ google.ts[-216], order=1)
Granger causality test

Model 1: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:1) + Lags(google.ts[-216], 1:1)
Model 2: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:1)
  Res.Df Df      F Pr(>F)
1    211                 
2    212 -1 2.4692 0.1176
#grangertest(diff(prevPANIC1.ts) ~ google.ts[-216], order=1)

grangertest(google.ts[-216] ~ diff(prevPANIC4.ts), order=3)
Granger causality test

Model 1: google.ts[-216] ~ Lags(google.ts[-216], 1:3) + Lags(diff(prevPANIC4.ts), 1:3)
Model 2: google.ts[-216] ~ Lags(google.ts[-216], 1:3)
  Res.Df Df      F Pr(>F)
1    205                 
2    208 -3 0.9343  0.425
grangertest(diff(prevPANIC4.ts) ~ google.ts[-216], order=2)
Granger causality test

Model 1: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:2) + Lags(google.ts[-216], 1:2)
Model 2: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:2)
  Res.Df Df      F  Pr(>F)  
1    208                    
2    210 -2 4.2575 0.01541 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
grangertest(google.ts[-216] ~ diff(prevPANIC4.ts), order=2)
Granger causality test

Model 1: google.ts[-216] ~ Lags(google.ts[-216], 1:2) + Lags(diff(prevPANIC4.ts), 1:2)
Model 2: google.ts[-216] ~ Lags(google.ts[-216], 1:2)
  Res.Df Df      F Pr(>F)
1    208                 
2    210 -2 1.3733 0.2556
grangertest(diff(prevPANIC4.ts) ~ google.ts[-216], order=1)
Granger causality test

Model 1: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:1) + Lags(google.ts[-216], 1:1)
Model 2: diff(prevPANIC4.ts) ~ Lags(diff(prevPANIC4.ts), 1:1)
  Res.Df Df      F Pr(>F)
1    211                 
2    212 -1 2.4692 0.1176
grangertest(google.ts[-216] ~ diff(prevPANIC4.ts), order=1)
Granger causality test

Model 1: google.ts[-216] ~ Lags(google.ts[-216], 1:1) + Lags(diff(prevPANIC4.ts), 1:1)
Model 2: google.ts[-216] ~ Lags(google.ts[-216], 1:1)
  Res.Df Df      F Pr(>F)
1    211                 
2    212 -1 2.0554 0.1532
grangertest(diff(inciPANIC4.ts) ~ google.ts[-216], order=1)
Granger causality test

Model 1: diff(inciPANIC4.ts) ~ Lags(diff(inciPANIC4.ts), 1:1) + Lags(google.ts[-216], 1:1)
Model 2: diff(inciPANIC4.ts) ~ Lags(diff(inciPANIC4.ts), 1:1)
  Res.Df Df      F Pr(>F)
1    211                 
2    212 -1 0.2089 0.6481
grangertest(google.ts[-216] ~ diff(inciPANIC4.ts), order=1)
Granger causality test

Model 1: google.ts[-216] ~ Lags(google.ts[-216], 1:1) + Lags(diff(inciPANIC4.ts), 1:1)
Model 2: google.ts[-216] ~ Lags(google.ts[-216], 1:1)
  Res.Df Df      F Pr(>F)
1    211                 
2    212 -1 2.1757 0.1417
grangertest(diff(inciPANIC4.ts) ~ google.ts[-216], order=2)
Granger causality test

Model 1: diff(inciPANIC4.ts) ~ Lags(diff(inciPANIC4.ts), 1:2) + Lags(google.ts[-216], 1:2)
Model 2: diff(inciPANIC4.ts) ~ Lags(diff(inciPANIC4.ts), 1:2)
  Res.Df Df     F Pr(>F)
1    208                
2    210 -2 0.748 0.4746
grangertest(google.ts[-216] ~ diff(inciPANIC4.ts), order=2)
Granger causality test

Model 1: google.ts[-216] ~ Lags(google.ts[-216], 1:2) + Lags(diff(inciPANIC4.ts), 1:2)
Model 2: google.ts[-216] ~ Lags(google.ts[-216], 1:2)
  Res.Df Df      F Pr(>F)
1    208                 
2    210 -2 1.0948 0.3365

influence of celebrities disclosures on Google search for panic disorder

# model 1 is for statistical analysis result is (3 0 0) , (2,0,0) 
modelG <- auto.arima(google.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
# Check residuals
checkresiduals(modelG)
Box.test(modelG$residuals, lag = 24, type = "Ljung-Box")
# Estimate parameters and confidence intervals
summary(modelG)
confint(modelG)
coeftest(modelG)

model0inci4 represents best fit model with its parameter using only pre-disclosure period. Best model: ARIMA(1,1,0)(1,0,0)[12]
fmodel0inci4 means modeled time series using model0 fc0inci4 and fc0inci4.ts is the forecasted series using the fmodel0inci4 inciPANIC4.ts.2 .2 indicates combined time series with forecast

Prediction model 1 : only using pre-disclosure period

# model 0 is for prediction 
model0inci4 <- auto.arima(window(inciPANIC4.ts, end=c(2010,12)), seasonal=TRUE, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
fmodel0inci4 <- Arima(window(inciPANIC4.ts, end=c(2010,12)), order=c(1,1,0), seasonal=list(order=c(1,0,0), period=12))
fc0inci4 <- forecast(fmodel0inci4, h=(216-monthCha))
fc0inci4.ts <- ts(as.numeric(fc0inci4$mean), start=c(2011,1), frequency=12)
inciPANIC4.ts.2 <- ts.union(inciPANIC4.ts, fc0inci4.ts)

# for prevalence
# model 0 is for prediction 
model0prev4 <- auto.arima(window(prevPANIC4.ts, end=c(2010,12)), seasonal=TRUE, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
# ARIMA(0,1,4)(1,0,0)[12] with drift 
fmodel0prev4 <- Arima(window(prevPANIC4.ts, end=c(2010,12)), order=c(0,1,4), seasonal=list(order=c(1,0,0), period=12))
fc0prev4 <- forecast(fmodel0prev4, h=(216-monthCha))
fc0prev4.ts <- ts(as.numeric(fc0prev4$mean), start=c(2011,1), frequency=12)
prevPANIC4.ts.2 <- ts.union(prevPANIC4.ts, fc0prev4.ts)

Due to the rounding of numbers, 0.6054839 was calculated 0.61 so 572.3712 % increase was presented as 577.78 % as following: The observed annual incidence of 0·61% in 2021 was an 577.77% higher than the predicted incidence of 0·09% (95% CI: -0·11%–0·29%).

Below one too:The observed annual prevalence of 7·53% in 2021 was a 775·58% higher than the forecasted incidence of 0·86% (95% CI:0·33%–1·40%).

# forecast annual incidence in 2021 with 95% CI, supposing denominator-the number of total population does not vary across months
# CI lower upper is the second colums of fc0inci4$lower[,2] and 
# forcast 2021 annual incidence
sum(tail(fc0inci4$mean,12))
# its CI 95%
sum(tail(fc0inci4$lower[,2],12))
sum(tail(fc0inci4$upper[,2],12))
# Percent increase of observed value from 
(sum(tail(inciPANIC4.ts,12)) - sum(tail(fc0inci4$mean,12)))/sum(tail(fc0inci4$mean,12)) * 100 


# forcast 2021 annual prevalence
sum(tail(fc0prev4$mean,12))
# its CI 95%
sum(tail(fc0prev4$lower[,2],12))
sum(tail(fc0prev4$upper[,2],12))
# Percent increase of observed value from 
(sum(tail(prevPANIC4.ts,12)) - sum(tail(fc0prev4$mean,12)))/sum(tail(fc0prev4$mean,12)) * 100
# instead used one (7.53-0.86)*100/0.86 =775.58 %

Below is the raw material of Figure2.2.ai

pdf(file="~/Dropbox/gitLab/studyDepressionBigData/inciPanicPrediction20042021_2.pdf")
plot(inciPANIC4.ts.2, type="l", plot.type="s", col=c('blue','deepskyblue'), xlab="Month", ylab="New Panic Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(inciPANIC4.ts)))
# add confidence interval
tmp <- seq(from = 2011, to =2021.99, by = 1/12)
# below is drawing polygon supplying outline x,y coordinates
polygon(c(tmp,rev(tmp)),c(fc0inci4$lower[,2],rev(fc0inci4$upper[,2])), col=rgb(0, 0.75, 1,0.1), border = FALSE)
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)
dev.off()

pdf(file="~/Dropbox/gitLab/studyDepressionBigData/prevPanicPrediction20042021_2.pdf")
plot(prevPANIC4.ts.2, type="l", plot.type="s", col=c('blue','deepskyblue'), xlab="Month", ylab="New Panic Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(prevPANIC4.ts)))
# add confidence interval
tmp <- seq(from = 2011, to =2021.99, by = 1/12)
# below is drawing polygon supplying outline x,y coordinates
polygon(c(tmp,rev(tmp)),c(fc0prev4$lower[,2],rev(fc0prev4$upper[,2])), col=rgb(0, 0.75, 1,0.1), border = FALSE)
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)
dev.off()

Below is applying the same procedure using inciPANIC1.ts, Best model: ARIMA(0,1,1)(2,1,0)[12]

# model 1 is for prediction with primary only
model0inci1 <- auto.arima(window(inciPANIC1.ts, end=c(2010,12)), seasonal=TRUE, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
fmodel0inci1 <- Arima(window(inciPANIC1.ts, end=c(2010,12)), order=c(0,1,1), seasonal=list(order=c(2,1,0), period=12))
incifc1 <- forecast(fmodel0inci1, h=(216-monthCha))
incifc1.ts <- ts(as.numeric(incifc1$mean), start=c(2011,1), frequency=12)
inciPANIC1.ts.2 <- ts.union(inciPANIC1.ts, incifc1.ts)
#pdf(file="~/Dropbox/gitLab/studyDepressionBigData/inciPanicPrediction1.pdf")
plot(inciPANIC1.ts.2, type="l", plot.type="s", col=c('blue','deepskyblue'), xlab="Month", ylab="New Panic Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(inciPANIC4.ts)))
# add confidence interval
tmp <- seq(from = 2011, to =2021.99, by = 1/12)
# below is drawing polygon supplying outline x,y coordinates
polygon(c(tmp,rev(tmp)),c(incifc1$lower[,2],rev(incifc1$upper[,2])), col=rgb(0, 0.75, 1,0.1), border = FALSE)
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)
lines(fitted(fmodel0inci1),col="red",lwd=1, lty="dotted")
#dev.off()

if we use the ARIMA MODEL of whole time series, best model was (1 0 0) (0 0 1), however, prediction should be done using only data by pre-disclosure period.

# model 4 is for prediction with whole time series
incifmodel4 <- Arima(window(inciPANIC4.ts, end=c(2010,12)), order=c(1,0,0), seasonal=list(order=c(0,0,1), period=12))
incifc4 <- forecast(incifmodel4, h=(216-monthCha))
incifc4.ts <- ts(as.numeric(incifc4$mean), start=c(2011,1), frequency=12)
inciPANIC4.ts.1 <- ts.union(inciPANIC4.ts, incifc4.ts)

below is thus a wrong image

#pdf(file="~/Dropbox/gitLab/studyDepressionBigData/inciPanicPrediction4.pdf")
plot(inciPANIC4.ts.1, type="l", plot.type="s", col=c('blue','deepskyblue'), xlab="Month", ylab="New Panic Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(inciPANIC4.ts)))
# add confidence interval
tmp <- seq(from = 2011, to =2021.99, by = 1/12)
# below is drawing polygon supplying outline x,y coordinates
polygon(c(tmp,rev(tmp)),c(incifc4$lower[,2],rev(incifc4$upper[,2])), col=rgb(0, 0.75, 1,0.1), border = FALSE)
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)
lines(fitted(incimodel4),col="red",lwd=1, lty="dotted")
#dev.off()

Comparison of observed value, inciPANIC4.ts versus prediction values, fc0inci4. This is for the following contents of the manuscript: The monthly incidence of panic disorder was stable from January 2004 to December 2010 (0·0054 ± 0·00086%).

The trend of increasing incidence rates continued, reaching an annual rate of 0·61% in 2021. This represents an increase of 838·46% compared with the average annual incidence of 0·065% (± 0·0082%) recorded between 2004 and 2010.

… The observed monthly incidences were 35·48% (an observed monthly incidence of 0·0084% vs. the predicted 0·0062%, 95% CI:0·0053%–0·0072%), 33·33% (0·0084% vs. 0·0063%%, 95% CI:0·0052%–0·0075%), and 157·14% (0·018% vs. 0·0070%%, 95% CI:0·0055%–0·0084%) higher than the counterfactual predicted incidences for January 2011, February 2011, and March 2011, respectively.

values case by case

# incidence values during pre-disclosure period
# below is the monthly values of pre-disclosure period
mean(window(inciPANIC4.ts, start = c(2004, 1), end = c(2010, 12)))
sd(window(inciPANIC4.ts, start = c(2004, 1), end = c(2010, 12)))

#increase from December 2010 to January, February, March, April, 2011  
# observed value on April 2011 
valInci201104 <- window(inciPANIC4.ts, start = c(2011, 4), end = c(2011, 4))
(0.0084-0.0065)*100/0.0065
(0.018-0.0065)*100/0.0065

# for prevalence
valPrev201101 <- window(prevPANIC4.ts, start = c(2011, 1), end = c(2011, 1))


# observed value in 2021 = annual incidence in 2021
valInci2021 <- sum(window(inciPANIC4.ts, start = c(2021, 1), end = c(2021, 12)))
(0.026-0.0065)*100/0.0065

# observed value on January 2011 
valInci201101 <- window(inciPANIC4.ts, start = c(2011, 1), end = c(2011, 1))
# predicted value on January 2011
valInci201101fc <- window(fc0inci4.ts, start = c(2011, 1), end = c(2011, 1))
#% increase
100*(0.0084-0.0062)/0.0062

# observed value on February 2011 
valInci201102 <- window(inciPANIC4.ts, start = c(2011, 2), end = c(2011, 2))
# predicted value on February 2011
valInci201102fc <- window(fc0inci4.ts, start = c(2011, 2), end = c(2011, 2))
#% increase
100*(0.0084-0.0063)/0.0063

# observed value on March 2011 
valInci201103 <- window(inciPANIC4.ts, start = c(2011, 3), end = c(2011, 3))
# predicted value on March 2011
valInci201103fc <- window(fc0inci4.ts, start = c(2011, 3), end = c(2011, 3))
#% increase
100*(0.018-0.0070)/0.0070

# for comparison with OCD, values of OCD were examined. 
inciOCD4.ts


# belows seem not to be used in the manuscript: from the review at 20231219 
mean(window(inciPANIC4.ts, end=c(2010,12)))
sd(window(inciPANIC4.ts, end=c(2010,12)))

# annual values 
val201011 <- window(inciPANIC.ts, start = c(2010, 11), end = c(2010, 11))
as.numeric(val201011)
val201101 <- window(inciPANIC4.ts, start = c(2011, 1), end = c(2011, 1))
as.numeric(val201101)
val201102 <- window(inciPANIC.ts, start = c(2011, 2), end = c(2011, 2))
as.numeric(val201102)

# increase from Nov 2010 to Dec 2010 in percent
val201012 <- window(inciPANIC.ts, start = c(2010, 12), end = c(2010, 12))
as.numeric(val201012)/as.numeric(val201011)*100

# increase from Dec 2010 to Jan 2011 in percent
as.numeric(val201101)/as.numeric(val201012)*100

# increase from Dec 2010 to Feb 2011 in percent
as.numeric(val201102)/as.numeric(val201012)*100

# increase from Dec 2010 to march 2011 in percent
val201103 <- window(inciPANIC.ts, start = c(2011, 3), end = c(2011, 3))
as.numeric(val201103)/as.numeric(val201012)*100

as.numeric(val201101)/as.numeric(val201012)*100

# increase from Dec 2010 to April 2011 in percent
val201104 <- window(inciPANIC.ts, start = c(2011, 4), end = c(2011, 4))
as.numeric(val201104)/as.numeric(val201012)*100

# yearly incidence of 2021
val2021 <- window(inciPANIC4.ts, start = c(2021, 1), end = c(2021, 12))
sum(val2021)

# yearly incidence of 2010
val2010 <- window(inciPANIC.ts, start = c(2010, 1), end = c(2010, 12))
sum(val2010)

# yearly incidence of 2004
val2004 <- window(inciPANIC.ts, start = c(2004, 1), end = c(2004, 12))
sum(val2004)

# increas from 2004 to 2021
0.61/0.053*100


# number of patients in 2010
numInciPANIC.ts=ts(DTPANIC$inciN4,frequency=12, start=c(2004,1))
numInciPANIC2010=window(numInciPANIC.ts, start = c(2010, 1), end = c(2010, 12))
sum(numInciPANIC2010)

# number of patients in 2021
numInciPANIC2021=window(numInciPANIC.ts, start = c(2021, 1), end = c(2021, 12))
sum(numInciPANIC2021)


# forecasted 
fval201101= window(incifc4.ts, start = c(2011, 1), end = c(2011, 1)) 
fval201102= window(incifc4.ts, start = c(2011, 2), end = c(2011, 2)) 
fval201103= window(incifc4.ts, start = c(2011, 3), end = c(2011, 3)) 
fval201104= window(incifc4.ts, start = c(2011, 4), end = c(2011, 4)) 

fval2021= sum(window(incifc4.ts, start = c(2021, 1), end = c(2021, 12)))
val2021 =sum(val2021)
(as.numeric(val201101)-as.numeric(fval201101))/as.numeric(fval201101)*100
(as.numeric(val201102)-as.numeric(fval201102))/as.numeric(fval201102)*100
(as.numeric(val201103)-as.numeric(fval201103))/as.numeric(fval201103)*100

(as.numeric(val2021)-as.numeric(fval2021))/as.numeric(fval2021)*100

# increase from Dec 2010 to Jan 2011 in OCD percent
valOCD201012 <- window(inciOCD.ts, start = c(2010, 12), end = c(2010, 12))
valOCD201101 <- window(inciOCD.ts, start = c(2011, 1), end = c(2011, 1))
as.numeric(valOCD201012)
as.numeric(valOCD201101)

# number of OCD patients in 2010
numInciOCD.ts=ts(DTOCD$inciN4,frequency=12, start=c(2004,1))
numInciOCD2010=window(numInciOCD.ts, start = c(2010, 1), end = c(2010, 12))
sum(numInciOCD2010)

# number of OCD patients in 2011
numInciOCD2011=window(numInciOCD.ts, start = c(2011, 1), end = c(2011, 12))
sum(numInciOCD2011)

# number of OCD patients in 2012
numInciOCD2012=window(numInciOCD.ts, start = c(2012, 1), end = c(2012, 12))
sum(numInciOCD2012)

# number of OCD patients in 2013
numInciOCD2013=window(numInciOCD.ts, start = c(2013, 1), end = c(2013, 12))
sum(numInciOCD2013)

# number of OCD patients in 2014
numInciOCD2014=window(numInciOCD.ts, start = c(2014, 1), end = c(2014, 12))
sum(numInciOCD2014)

# number of OCD patients in 2015
numInciOCD2015=window(numInciOCD.ts, start = c(2015, 1), end = c(2015, 12))
sum(numInciOCD2015)


# number of OCD patients in 2021
numInciOCD2021=window(numInciOCD.ts, start = c(2021, 1), end = c(2021, 12))
sum(numInciOCD2021)


# yearly incidence of OCD in 2021
valOCD.2021 <- window(inciOCD4.ts, start = c(2021, 1), end = c(2021, 12))
sum(valOCD.2021)

# yearly incidence of 2010
valOCD.2010 <- window(inciOCD.ts, start = c(2010, 1), end = c(2010, 12))
sum(valOCD.2010)

# yearly incidence of 20
valOCD.2004 <- window(inciOCD.ts, start = c(2004, 1), end = c(2004, 12))
sum(valOCD.2004)

making annual incidence and prevalence table.

inciOCD <- list(inciOCD1.ts, inciOCD2.ts,inciOCD3.ts, inciOCD4.ts );
prevOCD <- list(prevOCD1.ts, prevOCD2.ts, prevOCD3.ts, prevOCD4.ts );
inciPANIC <- list(inciPANIC1.ts, inciPANIC2.ts,inciPANIC3.ts, inciPANIC4.ts );
prevPANIC <- list(prevPANIC1.ts, prevPANIC2.ts,prevPANIC3.ts, prevPANIC4.ts );
years = 2004:2021;

inciOCDTable=matrix(nrow=18,ncol=4);

for (d in 1:4)  {
 for (year in 1:18) {
  
  yearWindow=window(inciOCD[[d]], start = c(years[year], 1), end = c(years[year], 12))
  inciOCDTable[year,d] = sum(yearWindow);
}
}

prevOCDTable=matrix(nrow=18,ncol=4);

for (d in 1:4)  {
 for (year in 1:18) {
  
  yearWindow=window(prevOCD[[d]], start = c(years[year], 1), end = c(years[year], 12))
  prevOCDTable[year,d] = sum(yearWindow);
}
}

inciPANICTable=matrix(nrow=18,ncol=4);

for (d in 1:4)  {
 for (year in 1:18) {
  
  yearWindow=window(inciPANIC[[d]], start = c(years[year], 1), end = c(years[year], 12))
  inciPANICTable[year,d] = sum(yearWindow);
}
}

prevPANICTable=matrix(nrow=18,ncol=4);

for (d in 1:4)  {
 for (year in 1:18) {
  
  yearWindow=window(prevPANIC[[d]], start = c(years[year], 1), end = c(years[year], 12))
  prevPANICTable[year,d] = sum(yearWindow);
}
}

inciOCDTable=data.frame(inciOCDTable)
colnames(inciOCDTable) = c('Primary Dx only', '~ Secondary Dx','~ Tertiary Dx', '~ Quaternary Dx');
row.names(inciOCDTable) = 2004:2021

prevOCDTable=data.frame(prevOCDTable)
colnames(prevOCDTable) = c('Primary Dx only', '~ Secondary Dx','~ Tertiary Dx', '~ Quaternary Dx');
row.names(prevOCDTable) = 2004:2021

inciPANICTable=data.frame(inciPANICTable)
colnames(inciPANICTable) = c('Primary Dx only', '~ Secondary Dx','~ Tertiary Dx', '~ Quaternary Dx');
row.names(inciPANICTable) = 2004:2021

prevPANICTable=data.frame(prevPANICTable)
colnames(prevPANICTable) = c('Primary Dx only', '~ Secondary Dx','~ Tertiary Dx', '~ Quaternary Dx');
row.names(prevPANICTable) = 2004:2021

install.packages("flextable")
library(flextable)
library(dplyr)
library(tibble)
inciPANICft = flextable(inciPANICTable %>% rownames_to_column("Year")) 
inciPANICft <- colformat_double(
  x = inciPANICft,
  big.mark = ",", digits = 3, na_str = "N/A"
)
inciPANICft = autofit(inciPANICft)
inciPANICft <- theme_vanilla(inciPANICft)
inciPANICft <- set_caption(inciPANICft, caption = "Annual Incidence of Panic Disorder (%)")

prevPANICft = flextable(prevPANICTable %>% rownames_to_column("Year")) 
prevPANICft <- colformat_double(
  x = prevPANICft,
  big.mark = ",", digits = 3, na_str = "N/A"
)
prevPANICft = autofit(prevPANICft)
prevPANICft <- theme_vanilla(prevPANICft)
prevPANICft <- set_caption(prevPANICft, caption = "Annual Prevalence of Panic Disorder (%)")

inciOCDft = flextable(inciOCDTable %>% rownames_to_column("Year")) 
inciOCDft <- colformat_double(
  x = inciOCDft,
  big.mark = ",", digits = 3, na_str = "N/A"
)
inciOCDft = autofit(inciOCDft)
inciOCDft <- theme_vanilla(inciOCDft)
inciOCDft <- set_caption(inciOCDft, caption = "Annual Prevalence of OCD (%)")

prevOCDft = flextable(prevOCDTable %>% rownames_to_column("Year")) 
prevOCDft <- colformat_double(
  x = prevOCDft,
  big.mark = ",", digits = 3, na_str = "N/A"
)
prevOCDft = autofit(prevOCDft)
prevOCDft <- theme_vanilla(prevOCDft)
prevOCDft <- set_caption(prevOCDft, caption = "Annual Prevalence of OCD (%)")

library(officer)
save_as_docx(inciPANICft, prevPANICft, inciOCDft, prevOCDft,  path = "PanicTableSuppl1V2.docx")

calculating mean and sd of annual incidence and prevalence before 2011

# 2004 2005 2006 2007 2008 2009 2010 - total 7 years
mean(inciPANICTable$`~ Quaternary Dx`[1:7])
sd(inciPANICTable$`~ Quaternary Dx`[1:7])

100*(0.61-0.065)/0.065 

mean(prevPANICTable$`~ Quaternary Dx`[1:7])
sd(prevPANICTable$`~ Quaternary Dx`[1:7])

# calculating annual prevalence change from 2010 to 2011, 2012,2013
(1.20-0.74)*100/0.74
(1.85-0.74)*100/0.74

making table showing

the impact of the disclosure on prevalence according to the forecasting

# make a function to calculate monthly observed incidence and predicted incidence, the difference and its percentage with confidence interval. 

pedictMonthlyDiff = function(firstTs, forecasted, yearMonth) {
  observed = window(firstTs, start = yearMonth, end = yearMonth)
  forecasted.ts <- ts(as.numeric(forecasted$mean), start=c(2011,1), frequency=12)
  forecasted97Low.ts <- ts(as.numeric(forecasted$lower[,2]), start=c(2011,1), frequency=12)
  forecasted97High.ts <- ts(as.numeric(forecasted$upper[,2]), start=c(2011,1), frequency=12)
  
  predicted = window(forecasted.ts, start = yearMonth, end = yearMonth)
  percent = 100* (observed - predicted) / predicted
  
  low95 <- window(forecasted97Low.ts, start = yearMonth, end = yearMonth)
  high95 <- window(forecasted97High.ts, start = yearMonth, end = yearMonth)
  
  my_list <- list("observed" = observed, "predicted" = predicted, "percent"= percent, "low95" = low95, "high95" = high95)
  return(my_list) 
  
}

# yearly prevalence of 2021
valPrev2021 <- window(prevPANIC4.ts, start = c(2021, 1), end = c(2021, 12))
sum(valPrev2021)

# yearly prevalence of 2010
valPrev2010 <- window(prevPANIC.ts, start = c(2010, 1), end = c(2010, 12))
sum(valPrev2010)

# yearly prevalence of 2006
valPrev2006 <- window(prevPANIC.ts, start = c(2006, 1), end = c(2006, 12))
sum(valPrev2006)

# yearly prevalence of 2007
valPrev2007 <- window(prevPANIC.ts, start = c(2007, 1), end = c(2007, 12))
sum(valPrev2007)


# yearly prevalence of 2007
valPrev2011 <- window(prevPANIC.ts, start = c(2011, 1), end = c(2011, 12))
sum(valPrev2011)



0.74/0.36*100

# yearly prevalence of 2004
valPrev2004 <- window(prevPANIC.ts, start = c(2004, 1), end = c(2004, 12))
sum(valPrev2004)

7.53/0.36*100

# yearly forecasted incidence of 2021
valPrevForecasted2021 <- window(fcPrev1.ts, start = c(2021, 1), end = c(2021, 12))
sum(valPrevForecasted2021)



# 95% CI
fc1Prev97Low.ts <- ts(as.numeric(fcPrev1$lower[,2]), start=c(2011,1), frequency=12)
fc1Prev97High.ts <- ts(as.numeric(fcPrev1$upper[,2]), start=c(2011,1), frequency=12)
sum(valPrev2021low)
sum(valPrev2021high)

change point analysis

install.packages("changepoint")
library('changepoint')
ansmeanOCD=cpt.mean(inciOCD.ts);
plot(ansmeanOCD)
ansmeanPANIC=cpt.mean(inciPANIC.ts);
plot(ansmeanPANIC)

pdf(file="~/Dropbox/gitLab/studyDepressionBigData/inciPanic4CPA.pdf")
ansmeanvarPANIC=cpt.meanvar(inciPANIC.ts);
plot(ansmeanvarPANIC)
dev.off()

ansmeanvarOCD=cpt.meanvar(inciOCD.ts);
plot(ansmeanvarOCD)

peak detection

install.packages('cardidates') 
library('cardidates')
x=1:14;
y=window(google.ts, start = c(2010, 12), end = c(2012, 1));
peaks <- peakwindow(x, y)
peaks$peaks
# model 1 is for statistical analysis result is (1 0 0) , (0,0,1) 
modelOCD <- auto.arima(inciOCD.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
# Check residuals
checkresiduals(modelOCD)
Box.test(modelOCD$residuals, lag = 24, type = "Ljung-Box")
# Estimate parameters and confidence intervals
summary(modelOCD)
confint(modelOCD)
coeftest(modelOCD)

the impact of the disclosure according to the forecasting

# yearly incidence of 2021
val2021 <- window(inciPANIC4.ts, start = c(2021, 1), end = c(2021, 12))
sum(val2021)

# yearly forecasted incidence of 2021
valForecasted2021 <- window(fc1.ts, start = c(2021, 1), end = c(2021, 12))
sum(valForecasted2021)
# 95% CI
0.00363*12
0.00714*12

now, prevalence data

# model 1 is for statistical analysis for prevalence result is (0 1 1) , (0,0,1)[12] 
modelPrev1 <- auto.arima(prevPANIC4.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
# Check residuals
checkresiduals(modelPrev1)
Box.test(modelPrev1$residuals, lag = 24, type = "Ljung-Box")
# Estimate parameters and confidence intervals
summary(modelPrev1)
confint(modelPrev1)
coeftest(modelPrev1)


modelPrev1OCD = auto.arima(prevOCD4.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
summary(modelPrev1OCD)
coeftest(modelPrev1OCD)
# model 1 is for prediction with whole time series
fmodelPrev1 <- Arima(window(prevPANIC.ts, end=c(2010,12)), order=c(0,1,1), seasonal=list(order=c(0,0,1), period=12))
fcPrev1 <- forecast(fmodelPrev1, h=(216-monthCha))
fcPrev1.ts <- ts(as.numeric(fcPrev1$mean), start=c(2011,1), frequency=12)
prevPANIC.ts.1 <- ts.union(prevPANIC.ts, fcPrev1.ts)
pdf(file="~/Dropbox/gitLab/studyDepressionBigData/prevPanicPrediction20042021.pdf")
plot(prevPANIC.ts.1, type="l", plot.type="s", col=c('blue','deepskyblue'), xlab="Month", ylab="New Panic Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(prevPANIC.ts)))
# add confidence interval
tmp <- seq(from = 2011, to =2021.99, by = 1/12)
# below is drawing polygon supplying outline x,y coordinates
polygon(c(tmp,rev(tmp)),c(fcPrev1$lower[,2],rev(fcPrev1$upper[,2])), col=rgb(0, 0.75, 1,0.1), border = FALSE)
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)
lines(fitted(modelPrev1),col="red",lwd=1, lty="dotted")
dev.off()
# 95 CI  of prevalence data
fc1Prev97Low.ts <- ts(as.numeric(fcPrev1$lower[,2]), start=c(2011,1), frequency=12)
fc1Prev97High.ts <- ts(as.numeric(fcPrev1$upper[,2]), start=c(2011,1), frequency=12)
valPrev2021low <- window(fc1Prev97Low.ts, start = c(2021, 1), end = c(2021, 12))
valPrev2021high <- window(fc1Prev97High.ts, start = c(2021, 1), end = c(2021, 12))
sum(valPrev2021low)
sum(valPrev2021high)

OCD prevalence graph for comparison

pdf(file="~/Dropbox/gitLab/studyDepressionBigData/prevPANICOCD20042021.pdf")
prevPANICOCD.ts <- ts.union(prevPANIC.ts, prevOCD.ts)
plot(prevPANICOCD.ts, type="l", plot.type="s", col=c('blue','red'), xlab="Month", ylab="New Panic Pat. N", linetype=c("solid","solid"), ylim=c(0,max(prevPANIC.ts)))
# add confidence interval
tmp <- seq(from = 2011, to =2021.99, by = 1/12)
# below is drawing polygon supplying outline x,y coordinates
abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)
dev.off()

7.53

the impact of the disclosure on prevalence according to the forecasting

# yearly prevalence of 2021
valPrev2021 <- window(prevPANIC4.ts, start = c(2021, 1), end = c(2021, 12))
sum(valPrev2021)

# yearly prevalence of 2010
valPrev2010 <- window(prevPANIC.ts, start = c(2010, 1), end = c(2010, 12))
sum(valPrev2010)

# yearly prevalence of 2006
valPrev2006 <- window(prevPANIC.ts, start = c(2006, 1), end = c(2006, 12))
sum(valPrev2006)

# yearly prevalence of 2007
valPrev2007 <- window(prevPANIC.ts, start = c(2007, 1), end = c(2007, 12))
sum(valPrev2007)


# yearly prevalence of 2007
valPrev2011 <- window(prevPANIC.ts, start = c(2011, 1), end = c(2011, 12))
sum(valPrev2011)



0.74/0.36*100

# yearly prevalence of 2004
valPrev2004 <- window(prevPANIC.ts, start = c(2004, 1), end = c(2004, 12))
sum(valPrev2004)/mean(head(mTotPopulation,12))*100

7.53/0.36*100

# yearly forecasted incidence of 2021
valPrevForecasted2021 <- window(fcPrev1.ts, start = c(2021, 1), end = c(2021, 12))
sum(valPrevForecasted2021)
sum(valPrevForecasted2021)/mean(tail(mTotPopulation,12))*100

# 95% CI
fc1Prev97Low.ts <- ts(as.numeric(fcPrev1$lower[,2]), start=c(2011,1), frequency=12)
fc1Prev97High.ts <- ts(as.numeric(fcPrev1$upper[,2]), start=c(2011,1), frequency=12)
sum(valPrev2021low)
sum(valPrev2021high)

chnage point analysis for prevalence

#install.packages("changepoint")
library('changepoint')

ansmeanvarPrevPANIC=cpt.meanvar(prevPANIC.ts);
pdf(file="~/Dropbox/gitLab/studyDepressionBigData/prevPanic4CPA.pdf")
plot(ansmeanvarPrevPANIC)
dev.off()
ansmeanvarPrevPANIC

ansmeanvarPrevOCD=cpt.meanvar(prevOCD.ts);
plot(ansmeanvarPrevOCD)

now, prevalence data of OCD

# model 1 is for statistical analysis for prevalence result is (0 1 1) , (0,0,1)[12] 
modelPrevOCD1 <- auto.arima(prevOCD.ts, seasonal=TRUE, xreg=transferF, max.d=3, max.D=3, stepwise=FALSE, trace=TRUE);
# Check residuals
checkresiduals(modelPrevOCD1)
Box.test(modelPrevOCD1$residuals, lag = 24, type = "Ljung-Box")
# Estimate parameters and confidence intervals
summary(modelPrevOCD1)
confint(modelPrevOCD1)
coeftest(modelPrevOCD1)
# yearly incidence of OCD in 2021
valPrevOCD2021 <- window(prevOCD.ts, start = c(2021, 1), end = c(2021, 12))
sum(valPrevOCD2021)

# yearly incidence of 2004
valPrevOCD2004 <- window(prevOCD.ts, start = c(2004, 1), end = c(2004, 12))
sum(valPrevOCD2004)

1/0.36*100

correlation between Google trend and incidence

library(tseries)
adf.test(google.ts, alternative = "stationary") 
adf.test(inciPANIC.ts, alternative = "stationary") 
adf.test(prevPANIC.ts, alternative = "stationary") 

adf.test(diff(inciPANIC.ts), alternative = "stationary") 
adf.test(diff(prevPANIC.ts), alternative = "stationary")


cor.test(inciPANIC.ts, google.ts,  method="kendall")
cor.test(diff(inciPANIC.ts), google.ts[-216],  method="spearman", exact=FALSE)
cor.test(diff(prevPANIC.ts), google.ts[-216],  method="spearman", exact=FALSE)

grangertest(diff(prevPANIC.ts) ~ google.ts[-216], order=4)
grangertest(google.ts[-216] ~ diff(prevPANIC.ts), order=4)


grangertest(diff(prevPANIC.ts) ~ google.ts[-216], order=3)
grangertest(google.ts[-216] ~ diff(prevPANIC.ts), order=3)

grangertest(diff(prevPANIC.ts) ~ google.ts[-216], order=2)
grangertest(google.ts[-216] ~ diff(prevPANIC.ts), order=2)

grangertest(diff(prevPANIC.ts) ~ google.ts[-216], order=1)
grangertest(google.ts[-216] ~ diff(prevPANIC.ts), order=1)

grangertest(diff(inciPANIC.ts) ~ google.ts[-216], order=1)
grangertest(google.ts[-216] ~ diff(inciPANIC.ts), order=1)

grangertest(diff(inciPANIC.ts) ~ google.ts[-216], order=2)
grangertest(google.ts[-216] ~ diff(inciPANIC.ts), order=2)

grangertest(diff(prevOCD.ts) ~ google.ts[-length(google.ts)], order=2)
grangertest(diff(prevOCD.ts) ~ google.ts[-length(google.ts)], order=3)
grangertest(diff(prevOCD.ts) ~ google.ts[-length(google.ts)], order=1)
grangertest(diff(inciOCD.ts) ~ google.ts[-length(google.ts)], order=2)
grangertest(diff(inciOCD.ts) ~ google.ts[-length(google.ts)], order=3)
grangertest(diff(inciOCD.ts) ~ google.ts[-length(google.ts)], order=1)
pdf(file="~/Dropbox/gitLab/studyDepressionBigData/prevPanicDifference.pdf")
prevPANICdiff.ts = diff(prevPANIC.ts)
prevPANICdiff.ts.1 <- ts.union(prevPANIC.ts[-216], prevPANICdiff.ts)
plot(prevPANICdiff.ts.1, type="l", plot.type="s", col=c('blue','deepskyblue'), xlab="Month", ylab="New Panic Pat. N", linetype=c("solid","dashed"), ylim=c(0,max(prevPANIC.ts)))
 # add confidence interval
 tmp <- seq(from = 2011, to =2021.99, by = 1/12)
 # below is drawing polygon supplying outline x,y coordinates
 polygon(c(min(index(google.ts[-216])),index(google.ts[-216]), max(index(google.ts[-216]))), c(0, google.ts[-216]*max(inciPANIC.ts[-216])/10,0),col="blue")
 abline(v=c(2004+(which(data$googCha == 100)-1)/120*10,2004+(which(data$googKim == 100)-1)/120*10,2004+(which(data$googLee == 100)-1)/120*10), col="gray", lty="dashed", lwd=2)
 lines(fitted(modelPrev1),col="red",lwd=1, lty="dotted")
 dev.off()

For the following contents of the manuscript: Following the first celebrity disclosure in December 2010, there was an increases in Google search volume (4·12 ± 8·06 during the period from 2004 to 2010 versus 10·46 ± 9·24, from 2011 to 2021, t = -5·32, p < 0·001) and in the magnitude of the first-order difference in monthly prevalence (0·0012% ± 0·00099% versus 0·0089% ± 0·0082%, t = -10·67, p < 0·001) (Figure 4).

Divide pre- and post-intervention period


pre.prevPANIC.ts <- window(prevPANIC4.ts, start = c(2004, 1), end = c(2010, 12))
post.prevPANIC.ts <- window(prevPANIC4.ts, start = c(2011, 1), end = c(2021, 12))
prevDiff = t.test(abs(diff(pre.prevPANIC.ts)),abs(diff(post.prevPANIC.ts)))
mean(abs(diff(pre.prevPANIC.ts)))
mean(abs(diff(post.prevPANIC.ts)))
sd(abs(diff(pre.prevPANIC.ts)))
sd(abs(diff(post.prevPANIC.ts)))

pre.google.ts <- window(google.ts, start = c(2004, 1), end = c(2010, 12))
post.google.ts <- window(google.ts, start = c(2011, 1), end = c(2021, 12))
googleDiff = t.test(pre.google.ts,post.google.ts)
mean(pre.google.ts)
mean(post.google.ts)

sd(pre.google.ts)
sd(post.google.ts)


grangertest(diff(pre.prevPANIC.ts) ~ pre.google.ts[-length(pre.google.ts)], order=3)
grangertest(diff(post.prevPANIC.ts) ~ post.google.ts[-length(post.google.ts)], order=3)

grangertest(diff(pre.prevPANIC.ts) ~ pre.google.ts[-length(pre.google.ts)], order=2)
grangertest(diff(post.prevPANIC.ts) ~ post.google.ts[-length(post.google.ts)], order=2)

grangertest(diff(pre.prevPANIC.ts) ~ pre.google.ts[-length(pre.google.ts)], order=1)
grangertest(diff(post.prevPANIC.ts) ~ post.google.ts[-length(post.google.ts)], order=1)


cor.test(diff(pre.prevPANIC.ts), pre.google.ts[-length(pre.google.ts)],  method="spearman", exact=FALSE)
cor.test(diff(post.prevPANIC.ts), post.google.ts[-length(post.google.ts)],  method="spearman", exact=FALSE)
require(bayesforecast)
require(coda)
m1 <- auto.sarima(inciPANIC.ts, seasonal=TRUE, xreg=transferF, max.d=2, max.D=2, stepwise=FALSE, trace=TRUE)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayBmb3IgcGFuaWMgc2NyaXB0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIHZlcnNpb24gaXMgZm9yIHRoZSBmaW5hbCBjaGVjayBiZWZvcmUgc3VibWl0dGluZyB0byBKb3VybmFsIGxhbmNldCBwc3ljaGlhdHJ5CgpgYGB7cn0KbGlicmFyeSgnbG10ZXN0Jyk7CmxpYnJhcnkoYXN0c2EpCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoem9vKQpsaWJyYXJ5KFRTc3R1ZGlvKQpgYGAKCkluIHRoZSBiZWxvdywgRFRQQU5JQyBpcyB0aGUgbWFzdGVyIGRhdGEgc2hlZXQsIGZyb20gd2hpY2ggYWxsIHZhcmlhYmxlcyBhcmUgZGVyaXZlZC4gCk9DRCBhbmQgUFRTRCBhcmUgc2FtZS4gUGxlYXNlIHNlZSBkZW5vbWluYXRvciBpcyB0aGUgbW9udGhseSBudW1iZXIgb2YgdG90YWwgcG9wdWxhdGlvbi4KCmBgYHtyfQpyZXF1aXJlKHJlYWR4bCkKc2V0d2QoIn4vRHJvcGJveC9naXRMYWIvc3R1ZHlEZXByZXNzaW9uQmlnRGF0YSIpCkRUUEFOSUM8LSByZWFkX3hsc3goIlBhbmljV2hvbGVQb3B1Lnhsc3giLHNoZWV0ID0gIlBBTklDIikKbVRvdFBvcHVsYXRpb249RFRQQU5JQyR0b3ROMTsKblByZXZQQU5JQzQ9RFRQQU5JQyRwcmV2TjQvbVRvdFBvcHVsYXRpb24qMTAwOwpuTlByZXZQQU5JQzQ9RFRQQU5JQyRpbmNpTjQvbVRvdFBvcHVsYXRpb24qMTAwOwpuUHJldlBBTklDMz1EVFBBTklDJHByZXZOMy9tVG90UG9wdWxhdGlvbioxMDA7Cm5OUHJldlBBTklDMz1EVFBBTklDJGluY2lOMy9tVG90UG9wdWxhdGlvbioxMDA7Cm5QcmV2UEFOSUMyPURUUEFOSUMkcHJldk4yL21Ub3RQb3B1bGF0aW9uKjEwMDsKbk5QcmV2UEFOSUMyPURUUEFOSUMkaW5jaU4yL21Ub3RQb3B1bGF0aW9uKjEwMDsKblByZXZQQU5JQzE9RFRQQU5JQyRwcmV2TjEvbVRvdFBvcHVsYXRpb24qMTAwOwpuTlByZXZQQU5JQzE9RFRQQU5JQyRpbmNpTjEvbVRvdFBvcHVsYXRpb24qMTAwOwpEVE9DRDwtIHJlYWRfeGxzeCgiUGFuaWNXaG9sZVBvcHUueGxzeCIsc2hlZXQgPSAiT0NEIikKblByZXZPQ0Q0PURUT0NEJHByZXZONC9tVG90UG9wdWxhdGlvbioxMDA7Cm5OUHJldk9DRDQ9RFRPQ0QkaW5jaU40L21Ub3RQb3B1bGF0aW9uKjEwMDsKblByZXZPQ0QzPURUT0NEJHByZXZOMy9tVG90UG9wdWxhdGlvbioxMDA7Cm5OUHJldk9DRDM9RFRPQ0QkaW5jaU4zL21Ub3RQb3B1bGF0aW9uKjEwMDsKblByZXZPQ0QyPURUT0NEJHByZXZOMi9tVG90UG9wdWxhdGlvbioxMDA7Cm5OUHJldk9DRDI9RFRPQ0QkaW5jaU4yL21Ub3RQb3B1bGF0aW9uKjEwMDsKblByZXZPQ0QxPURUT0NEJHByZXZOMS9tVG90UG9wdWxhdGlvbioxMDA7Cm5OUHJldk9DRDE9RFRPQ0QkaW5jaU4xL21Ub3RQb3B1bGF0aW9uKjEwMDsKRFRQVFNEPC0gcmVhZF94bHN4KCJQYW5pY1dob2xlUG9wdS54bHN4IixzaGVldCA9ICJQVFNEIikKblByZXZQVFNEND1EVFBUU0QkcHJldk40L21Ub3RQb3B1bGF0aW9uKjEwMDsKbk5QcmV2UFRTRDQ9RFRQVFNEJGluY2lONC9tVG90UG9wdWxhdGlvbioxMDA7Cm5QcmV2UFRTRDM9RFRQVFNEJHByZXZOMy9tVG90UG9wdWxhdGlvbioxMDA7Cm5OUHJldlBUU0QzPURUUFRTRCRpbmNpTjMvbVRvdFBvcHVsYXRpb24qMTAwOwpuUHJldlBUU0QyPURUUFRTRCRwcmV2TjIvbVRvdFBvcHVsYXRpb24qMTAwOwpuTlByZXZQVFNEMj1EVFBUU0QkaW5jaU4yL21Ub3RQb3B1bGF0aW9uKjEwMDsKblByZXZQVFNEMT1EVFBUU0QkcHJldk4xL21Ub3RQb3B1bGF0aW9uKjEwMDsKbk5QcmV2UFRTRDE9RFRQVFNEJGluY2lOMS9tVG90UG9wdWxhdGlvbioxMDA7CmBgYAoKRnJvbSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByYXcgZGF0YSwgZXhjZXB0IHNlYXJjaCBmb3IgZGlhZ25vc2lzIG5hbWVzLCBjZWxlYnJpdGllcyBuYW1lcyBzZWVtZWQgdG8gYmUgc2VhcmNoZWQsIGNvbWJpbmVkIHdpdGggdGhlIG5hbWVzIG9mIGRpYWdub3Npcy4KCiMgUkVBRCBHT09HTEUgVFJFTkQgYW5kIENFTEVCIERJU0NMT1NVUkUKYGBge3J9CnNQYW5pY0Rpcz1yZWFkLmNzdihmaWxlPSJ+L0Ryb3Bib3gvZ2l0TGFiL3N0dWR5RGVwcmVzc2lvbkJpZ0RhdGEvcGFuaWNEaXNvcmRlcjIwMTQyMDIxLmNzdiIsIGhlYWRlcj1GQUxTRSk7CnNPQ0REaXM9cmVhZC5jc3YoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL09DRERpc29yZGVyMjAxNDIwMjkuY3N2IiwgaGVhZGVyPUZBTFNFKTsKc1BhbmljT0NERGlzPXJlYWQuY3N2KGZpbGU9In4vRHJvcGJveC9naXRMYWIvc3R1ZHlEZXByZXNzaW9uQmlnRGF0YS9QYW5pY09DRERpc29yZGVyMjAxNDIwMjkuY3N2IiwgaGVhZGVyPUZBTFNFKTsKc0NoYVBhbmljRGlzPXJlYWQuY3N2KGZpbGU9In4vRHJvcGJveC9naXRMYWIvc3R1ZHlEZXByZXNzaW9uQmlnRGF0YS9nb29nQ2hhUGFuaWNEaXMuY3N2IiwgaGVhZGVyPUZBTFNFKTsKc0xlZVBhbmljRGlzPXJlYWQuY3N2KGZpbGU9In4vRHJvcGJveC9naXRMYWIvc3R1ZHlEZXByZXNzaW9uQmlnRGF0YS9nb29nTGVlUGFuaWNEaXMuY3N2IiwgaGVhZGVyPUZBTFNFKTsKc0tpbVBhbmljRGlzPXJlYWQuY3N2KGZpbGU9In4vRHJvcGJveC9naXRMYWIvc3R1ZHlEZXByZXNzaW9uQmlnRGF0YS9nb29nS2ltUGFuaWNEaXMuY3N2IiwgaGVhZGVyPUZBTFNFKTsKCmBgYAoKVGhlIG51bWJlciBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUgcmVwcmVzZW50cyB0aGUgZGVncmVlIG9mIGluY2x1c2lvbiBjcml0ZXJpYS4gVGhlIG51bWJlciBmb3VyIGNvcnJlc3BvbmRzIHRvIHRoZSBtb3N0IGluY2x1c2l2ZSBjcml0ZXJpYS4KLnRzIHJlcHJlc2VudHMgdGhlIGRhdGUgaXMgY29udmVydGVkIHRvIHRpbWUgc2VyaWVzLgoKIyBNQUtFIERBVEFGUkFNRSBGT1IgQUxMIEdBVEhFUkVEIElORk9STUFUSU9OCmBgYHtyfQpkYXRhIDwtIGRhdGEuZnJhbWUoCm1vbnRoID0gYXMudHMoc1BhbmljRGlzJFYxLCBmb3JtYXQ9IiVZLSVtIiksCnByZXZQQU5JQzQgPSBuUHJldlBBTklDNCwgCnByZXZQVFNENCA9IG5QcmV2UFRTRDQsIApwcmV2T0NENCA9IG5QcmV2T0NENCwKcHJldlBBTklDMyA9IG5QcmV2UEFOSUMzLCAKcHJldlBUU0QzID0gblByZXZQVFNEMywgCnByZXZPQ0QzID0gblByZXZPQ0QzLApwcmV2UEFOSUMyID0gblByZXZQQU5JQzIsIApwcmV2UFRTRDIgPSBuUHJldlBUU0QyLCAKcHJldk9DRDIgPSBuUHJldk9DRDIsCnByZXZQQU5JQzEgPSBuUHJldlBBTklDMSwgCnByZXZQVFNEMSA9IG5QcmV2UFRTRDEsIApwcmV2T0NEMSA9IG5QcmV2T0NEMSwKCmluY2lQQU5JQzQgPSBuTlByZXZQQU5JQzQsIAppbmNpUFRTRDQgPSBuTlByZXZQVFNENCwgCmluY2lPQ0Q0ID0gbk5QcmV2T0NENCwKaW5jaVBBTklDMyA9IG5OUHJldlBBTklDMywgCmluY2lQVFNEMyA9IG5OUHJldlBUU0QzLCAKaW5jaU9DRDMgPSBuTlByZXZPQ0QzLAppbmNpUEFOSUMyID0gbk5QcmV2UEFOSUMyLCAKaW5jaVBUU0QyID0gbk5QcmV2UFRTRDIsIAppbmNpT0NEMiA9IG5OUHJldk9DRDIsCmluY2lQQU5JQzEgPSBuTlByZXZQQU5JQzEsIAppbmNpUFRTRDEgPSBuTlByZXZQVFNEMSwgCmluY2lPQ0QxID0gbk5QcmV2T0NEMSwKCmdvb2dsZSA9IHNQYW5pY0RpcyRWMiwKZ29vZ2xlT0NEID0gc09DRERpcyRWMiwKZ29vZ2xlT0NEcmVsYXRpdmUgPSBzUGFuaWNPQ0REaXMkVjMsCmdvb2dDaGEgPSBjKHNDaGFQYW5pY0RpcyRWMixyZXAoMCw5NikpLApnb29nTGVlID0gYyhzTGVlUGFuaWNEaXMkVjIscmVwKDAsOTYpKSwKZ29vZ0tpbSA9IGMoc0tpbVBhbmljRGlzJFYyLHJlcCgwLDk2KSkKKQoKZ29vZ2xlLnRzPXRzKGRhdGEkZ29vZ2xlLGZyZXF1ZW5jeT0xMiwgc3RhcnQ9YygyMDA0LDEpKQpnb29nbGVPQ0QudHM9dHMoZGF0YSRnb29nbGVPQ0QsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkpCmdvb2dsZU9DRHJlbGF0aXZlLnRzPXRzKGRhdGEkZ29vZ2xlT0NEcmVsYXRpdmUsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkpCnByZXZQQU5JQzQudHM9dHMoZGF0YSRwcmV2UEFOSUM0LGZyZXF1ZW5jeT0xMiwgc3RhcnQ9YygyMDA0LDEpKQpwcmV2UFRTRDQudHM9dHMoZGF0YSRwcmV2UFRTRDQsIGZyZXF1ZW5jeSA9IDEyLCBzdGFydCA9IGMoMjAwNCwxKSkKcHJldk9DRDQudHM9dHMoZGF0YSRwcmV2T0NENCwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDA0LDEpKQpwcmV2UEFOSUMzLnRzPXRzKGRhdGEkcHJldlBBTklDMyxmcmVxdWVuY3k9MTIsIHN0YXJ0PWMoMjAwNCwxKSkKcHJldlBUU0QzLnRzPXRzKGRhdGEkcHJldlBUU0QzLCBmcmVxdWVuY3kgPSAxMiwgc3RhcnQgPSBjKDIwMDQsMSkpCnByZXZPQ0QzLnRzPXRzKGRhdGEkcHJldk9DRDMsIGZyZXF1ZW5jeSA9IDEyLCBzdGFydCA9IGMoMjAwNCwxKSkKcHJldlBBTklDMi50cz10cyhkYXRhJHByZXZQQU5JQzIsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkpCnByZXZQVFNEMi50cz10cyhkYXRhJHByZXZQVFNEMiwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDA0LDEpKQpwcmV2T0NEMi50cz10cyhkYXRhJHByZXZPQ0QyLCBmcmVxdWVuY3kgPSAxMiwgc3RhcnQgPSBjKDIwMDQsMSkpCnByZXZQQU5JQzEudHM9dHMoZGF0YSRwcmV2UEFOSUMxLGZyZXF1ZW5jeT0xMiwgc3RhcnQ9YygyMDA0LDEpKQpwcmV2UFRTRDEudHM9dHMoZGF0YSRwcmV2UFRTRDEsIGZyZXF1ZW5jeSA9IDEyLCBzdGFydCA9IGMoMjAwNCwxKSkKcHJldk9DRDEudHM9dHMoZGF0YSRwcmV2T0NEMSwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDA0LDEpKQoKaW5jaVBBTklDNC50cz10cyhkYXRhJGluY2lQQU5JQzQsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkgKQppbmNpUFRTRDQudHM9dHMoZGF0YSRpbmNpUFRTRDQsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkgKQppbmNpT0NENC50cz10cyhkYXRhJGluY2lPQ0Q0LGZyZXF1ZW5jeT0xMiwgc3RhcnQ9YygyMDA0LDEpICkKaW5jaVBBTklDMy50cz10cyhkYXRhJGluY2lQQU5JQzMsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkgKQppbmNpUFRTRDMudHM9dHMoZGF0YSRpbmNpUFRTRDMsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkgKQppbmNpT0NEMy50cz10cyhkYXRhJGluY2lPQ0QzLGZyZXF1ZW5jeT0xMiwgc3RhcnQ9YygyMDA0LDEpICkKaW5jaVBBTklDMi50cz10cyhkYXRhJGluY2lQQU5JQzIsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkgKQppbmNpUFRTRDIudHM9dHMoZGF0YSRpbmNpUFRTRDIsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkgKQppbmNpT0NEMi50cz10cyhkYXRhJGluY2lPQ0QyLGZyZXF1ZW5jeT0xMiwgc3RhcnQ9YygyMDA0LDEpICkKaW5jaVBBTklDMS50cz10cyhkYXRhJGluY2lQQU5JQzEsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkgKQppbmNpUFRTRDEudHM9dHMoZGF0YSRpbmNpUFRTRDEsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkgKQppbmNpT0NEMS50cz10cyhkYXRhJGluY2lPQ0QxLGZyZXF1ZW5jeT0xMiwgc3RhcnQ9YygyMDA0LDEpICkKCmBgYAoKQmVsb3cgaXMgdGhlIGp1c3QgdGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIGRhdGEuCgojIERyYXcgZ3JhcGggb2YgcHJldmFsZW5jZSAKYGBge3J9CnByZXZORVVSTzRfMy50cz10cy51bmlvbihwcmV2UEFOSUM0LnRzLCBwcmV2UFRTRDQudHMsIHByZXZPQ0Q0LnRzKTsKaW5jaU5FVVJPNF8zLnRzPXRzLnVuaW9uKGluY2lQQU5JQzQudHMsIGluY2lQVFNENC50cywgaW5jaU9DRDQudHMpOwojanBlZyhmaWxlPSJ+L0Ryb3Bib3gvZ2l0TGFiL3N0dWR5RGVwcmVzc2lvbkJpZ0RhdGEvcHJldk5FVVJPNF8zLmpwZWciKQpwbG90KHByZXZORVVSTzRfMy50cywgdHlwZT0ibCIsIHBsb3QudHlwZT0icyIsIGNvbD1jKCJibHVlIiwibWFnZW50YSIsImN5YW4iKSwgeGxhYj0iTW9udGgiLCB5bGFiPSJQYXQuIE4iLCBsaW5ldHlwZT1jKCJzb2xpZCIsImRhc2hlZCIpLCB5bGltPWMoMCxtYXgocHJldk5FVVJPNF8zLnRzWywxXSkpKQpsZWdlbmQoInRvcGxlZnQiLCBpbnNldCA9IDAuMDIsIGxlZ2VuZD1jKCJQQU5JQyIsIk9DRCIsICJQVFNEIiksCiAgICAgICBjb2w9YygiYmx1ZSIsICJjeWFuIiwibWFnZW50YSIpLCBsdHk9MSwgY2V4PTAuOCkKbGluZXMoZ29vZ2xlLnRzLzEwMCptYXgoaW5jaU5FVVJPNF8zLnRzWywxXSksY29sPSJncmVlbiIpCiMgQWRkIHZlcnRpY2FsIGxpbmVzIGluZGljYXRpbmcgZGF0ZSBvZiBjZWxlcmJpdHkgZGlzY2xvc3VyZXMKYWJsaW5lKHY9YygyMDA0Kyh3aGljaChkYXRhJGdvb2dDaGEgPT0gMTAwKS0xKS8xMjAqMTAsMjAwNCsod2hpY2goZGF0YSRnb29nS2ltID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0xlZSA9PSAxMDApLTEpLzEyMCoxMCksIGNvbD0iZ3JheSIsIGx0eT0iZGFzaGVkIiwgbHdkPTIpCiNkZXYub2ZmKCkKYGBgCkRvaW5nIGNoYW5naW5nIHRoZSBpbmNsdXNpb24gY3JpdGVyaWEuIAoKYGBge3J9CnByZXZORVVSTzNfMy50cz10cy51bmlvbihwcmV2UEFOSUMzLnRzLCBwcmV2UFRTRDMudHMsIHByZXZPQ0QzLnRzKTsKaW5jaU5FVVJPM18zLnRzPXRzLnVuaW9uKGluY2lQQU5JQzMudHMsIGluY2lQVFNEMy50cywgaW5jaU9DRDMudHMpOwojanBlZyhmaWxlPSJ+L0Ryb3Bib3gvZ2l0TGFiL3N0dWR5RGVwcmVzc2lvbkJpZ0RhdGEvcHJldk5FVVJPM18zLmpwZWciKQpwbG90KHByZXZORVVSTzNfMy50cywgdHlwZT0ibCIsIHBsb3QudHlwZT0icyIsIGNvbD1jKCJibHVlIiwibWFnZW50YSIsImN5YW4iKSwgeGxhYj0iTW9udGgiLCB5bGFiPSJQYXQuIE4iLCBsaW5ldHlwZT1jKCJzb2xpZCIsImRhc2hlZCIpLCB5bGltPWMoMCxtYXgocHJldk5FVVJPM18zLnRzWywxXSkpKQpsZWdlbmQoInRvcGxlZnQiLCBpbnNldCA9IDAuMDIsIGxlZ2VuZD1jKCJQQU5JQyIsIk9DRCIsICJQVFNEIiksCiAgICAgICBjb2w9YygiYmx1ZSIsICJjeWFuIiwibWFnZW50YSIpLCBsdHk9MSwgY2V4PTAuOCkKI2xpbmVzKGdvb2dsZS50cy8xMDAqbWF4KHByZXZORVVSTzMudHNbLDFdKSxjb2w9ImdyZWVuIikKIyBBZGQgdmVydGljYWwgbGluZXMgaW5kaWNhdGluZyBkYXRlIG9mIGNlbGVyYml0eSBkaXNjbG9zdXJlcwphYmxpbmUodj1jKDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0NoYSA9PSAxMDApLTEpLzEyMCoxMCwyMDA0Kyh3aGljaChkYXRhJGdvb2dLaW0gPT0gMTAwKS0xKS8xMjAqMTAsMjAwNCsod2hpY2goZGF0YSRnb29nTGVlID09IDEwMCktMSkvMTIwKjEwKSwgY29sPSJncmF5IiwgbHR5PSJkYXNoZWQiLCBsd2Q9MikKI2Rldi5vZmYoKQpgYGAKYGBge3J9CnByZXZORVVSTzJfMy50cz10cy51bmlvbihwcmV2UEFOSUMyLnRzLCBwcmV2UFRTRDIudHMsIHByZXZPQ0QyLnRzKTsKaW5jaU5FVVJPMl8zLnRzPXRzLnVuaW9uKGluY2lQQU5JQzIudHMsIGluY2lQVFNEMi50cywgaW5jaU9DRDIudHMpOwojanBlZyhmaWxlPSJ+L0Ryb3Bib3gvZ2l0TGFiL3N0dWR5RGVwcmVzc2lvbkJpZ0RhdGEvcHJldk5FVVJPMl8zLmpwZWciKQpwbG90KHByZXZORVVSTzJfMy50cywgdHlwZT0ibCIsIHBsb3QudHlwZT0icyIsIGNvbD1jKCJibHVlIiwibWFnZW50YSIsImN5YW4iKSwgeGxhYj0iTW9udGgiLCB5bGFiPSJQYXQuIE4iLCBsaW5ldHlwZT1jKCJzb2xpZCIsImRhc2hlZCIpLCB5bGltPWMoMCxtYXgocHJldk5FVVJPMl8zLnRzWywxXSkpKQpsZWdlbmQoInRvcGxlZnQiLCBpbnNldCA9IDAuMDIsIGxlZ2VuZD1jKCJQQU5JQyIsIk9DRCIsICJQVFNEIiksCiAgICAgICBjb2w9YygiYmx1ZSIsICJjeWFuIiwibWFnZW50YSIpLCBsdHk9MSwgY2V4PTAuOCkKI2xpbmVzKGdvb2dsZS50cy8xMDAqbWF4KHByZXZORVVSTzMudHNbLDFdKSxjb2w9ImdyZWVuIikKIyBBZGQgdmVydGljYWwgbGluZXMgaW5kaWNhdGluZyBkYXRlIG9mIGNlbGVyYml0eSBkaXNjbG9zdXJlcwphYmxpbmUodj1jKDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0NoYSA9PSAxMDApLTEpLzEyMCoxMCwyMDA0Kyh3aGljaChkYXRhJGdvb2dLaW0gPT0gMTAwKS0xKS8xMjAqMTAsMjAwNCsod2hpY2goZGF0YSRnb29nTGVlID09IDEwMCktMSkvMTIwKjEwKSwgY29sPSJncmF5IiwgbHR5PSJkYXNoZWQiLCBsd2Q9MikKI2Rldi5vZmYoKQpgYGAKCmBgYHtyfQpwcmV2TkVVUk8xXzMudHM9dHMudW5pb24ocHJldlBBTklDMS50cywgcHJldlBUU0QxLnRzLCBwcmV2T0NEMS50cyk7CmluY2lORVVSTzFfMy50cz10cy51bmlvbihpbmNpUEFOSUMxLnRzLCBpbmNpUFRTRDEudHMsIGluY2lPQ0QxLnRzKTsKI2pwZWcoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL3ByZXZORVVSTzFfMy5qcGVnIikKcGxvdChwcmV2TkVVUk8xXzMudHMsIHR5cGU9ImwiLCBwbG90LnR5cGU9InMiLCBjb2w9YygiYmx1ZSIsIm1hZ2VudGEiLCJjeWFuIiksIHhsYWI9Ik1vbnRoIiwgeWxhYj0iUGF0LiBOIiwgbGluZXR5cGU9Yygic29saWQiLCJkYXNoZWQiKSwgeWxpbT1jKDAsbWF4KHByZXZORVVSTzFfMy50c1ssMV0pKSkKbGVnZW5kKCJ0b3BsZWZ0IiwgaW5zZXQgPSAwLjAyLCBsZWdlbmQ9YygiUEFOSUMiLCJPQ0QiLCAiUFRTRCIpLAogICAgICAgY29sPWMoImJsdWUiLCAiY3lhbiIsIm1hZ2VudGEiKSwgbHR5PTEsIGNleD0wLjgpCiNsaW5lcyhnb29nbGUudHMvMTAwKm1heChwcmV2TkVVUk8zLnRzWywxXSksY29sPSJncmVlbiIpCiMgQWRkIHZlcnRpY2FsIGxpbmVzIGluZGljYXRpbmcgZGF0ZSBvZiBjZWxlcmJpdHkgZGlzY2xvc3VyZXMKYWJsaW5lKHY9YygyMDA0Kyh3aGljaChkYXRhJGdvb2dDaGEgPT0gMTAwKS0xKS8xMjAqMTAsMjAwNCsod2hpY2goZGF0YSRnb29nS2ltID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0xlZSA9PSAxMDApLTEpLzEyMCoxMCksIGNvbD0iZ3JheSIsIGx0eT0iZGFzaGVkIiwgbHdkPTIpCiNkZXYub2ZmKCkKYGBgCgojIFBSRVZBTEVOQ0UgQUxMCgpgYGB7cn0KcHJldlBBTklDMTIzNF9PQ0Q0LnRzPXRzLnVuaW9uKHByZXZQQU5JQzQudHMsIHByZXZQQU5JQzMudHMsIHByZXZQQU5JQzIudHMsIHByZXZQQU5JQzEudHMscHJldk9DRDQudHMpOwojanBlZyhmaWxlPSJ+L0Ryb3Bib3gvZ2l0TGFiL3N0dWR5RGVwcmVzc2lvbkJpZ0RhdGEvcHJldlBBTklDMTIzNF9PQ0Q0LmpwZWciKQpwbG90KHByZXZQQU5JQzEyMzRfT0NENC50cywgdHlwZT0ibCIsIHBsb3QudHlwZT0icyIsIGNvbD1jKCJibHVlNCIsICJibHVlMyIsImJsdWUyIiwiYmx1ZSIsIm1hZ2VudGEiKSwgeGxhYj0iTW9udGgiLCB5bGFiPSJQYXQuICUiLCBsaW5ldHlwZT1jKCJzb2xpZCIsImRhc2hlZCIpLCB5bGltPWMoMCxtYXgocHJldk5FVVJPNF8zLnRzWywxXSkpKQpsZWdlbmQoInRvcGxlZnQiLCBpbnNldCA9IDAuMDIsIGxlZ2VuZD1jKCJQQU5JQzQiLCJQQU5JQzMiLCAiUEFOSUMyIiwgIlBBTklDMSIsIk9DRDQiKSwKICAgICAgIGNvbD1jKCJibHVlNCIsICJibHVlMyIsImJsdWUyIiwiYmx1ZSIsIm1hZ2VudGEiKSwgbHR5PTEsIGNleD0wLjgpCiNsaW5lcyhnb29nbGUudHMvMTAwKm1heChwcmV2TkVVUk8zLnRzWywxXSksY29sPSJncmVlbiIpCiMgQWRkIHZlcnRpY2FsIGxpbmVzIGluZGljYXRpbmcgZGF0ZSBvZiBjZWxlcmJpdHkgZGlzY2xvc3VyZXMKYWJsaW5lKHY9YygyMDA0Kyh3aGljaChkYXRhJGdvb2dDaGEgPT0gMTAwKS0xKS8xMjAqMTAsMjAwNCsod2hpY2goZGF0YSRnb29nS2ltID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0xlZSA9PSAxMDApLTEpLzEyMCoxMCksIGNvbD0iZ3JheSIsIGx0eT0iZGFzaGVkIiwgbHdkPTIpCiNkZXYub2ZmKCkKYGBgCiMgSU5DSURFTkNFIEFMTAoKYGBge3J9CmluY2lQQU5JQzEyMzRfT0NEMTIzNC50cz10cy51bmlvbihpbmNpUEFOSUM0LnRzLCBpbmNpUEFOSUMzLnRzLCBpbmNpUEFOSUMyLnRzLCBpbmNpUEFOSUMxLnRzLGluY2lPQ0Q0LnRzLGluY2lPQ0QzLnRzLGluY2lPQ0QyLnRzLGluY2lPQ0QxLnRzKTsKI2pwZWcoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL2luY2lQQU5JQzEyMzRfT0NEMTIzNC5qcGVnIikKcGxvdChpbmNpUEFOSUMxMjM0X09DRDEyMzQudHMsIHR5cGU9ImwiLCBwbG90LnR5cGU9InMiLCBjb2w9YygiYmx1ZTQiLCAiYmx1ZTMiLCJibHVlMiIsImJsdWUiLCJkYXJrb3JjaGlkNCIsImRhcmtvcmNoaWQzIiwiZGFya29yY2hpZDIiLCJkYXJrb3JjaGlkMSIpLCB4bGFiPSJNb250aCIsIHlsYWI9Ik5ldyBQYXQuICUiLCBsaW5ldHlwZT1jKCJzb2xpZCIsImRhc2hlZCIpLCB5bGltPWMoMCxtYXgoaW5jaVBBTklDMTIzNF9PQ0QxMjM0LnRzWywxXSkpKQpsZWdlbmQoInRvcGxlZnQiLCBpbnNldCA9IDAuMDIsIGxlZ2VuZD1jKCJQQU5JQzQiLCJQQU5JQzMiLCAiUEFOSUMyIiwgIlBBTklDMSIsIk9DRDQiLCJPQ0QzIiwiT0NEMiIsIk9DRDEiKSwKICAgICAgIGNvbD1jKCJibHVlNCIsICJibHVlMyIsImJsdWUyIiwiYmx1ZSIsImRhcmtvcmNoaWQ0IiwiZGFya29yY2hpZDMiLCJkYXJrb3JjaGlkMiIsImRhcmtvcmNoaWQxIiksIGx0eT0xLCBjZXg9MC44KQojbGluZXMoZ29vZ2xlLnRzLzEwMCptYXgocHJldk5FVVJPMy50c1ssMV0pLGNvbD0iZ3JlZW4iKQojIEFkZCB2ZXJ0aWNhbCBsaW5lcyBpbmRpY2F0aW5nIGRhdGUgb2YgY2VsZXJiaXR5IGRpc2Nsb3N1cmVzCmFibGluZSh2PWMoMjAwNCsod2hpY2goZGF0YSRnb29nQ2hhID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0tpbSA9PSAxMDApLTEpLzEyMCoxMCwyMDA0Kyh3aGljaChkYXRhJGdvb2dMZWUgPT0gMTAwKS0xKS8xMjAqMTApLCBjb2w9ImdyYXkiLCBsdHk9ImRhc2hlZCIsIGx3ZD0yKQojZGV2Lm9mZigpCmBgYAojIFBSRVZBTEVOQ0UgQUxMIFBBTklDIE9DRApgYGB7cn0KcHJldlBBTklDMTIzNF9PQ0QxMjM0LnRzPXRzLnVuaW9uKHByZXZQQU5JQzQudHMsIHByZXZQQU5JQzMudHMsIHByZXZQQU5JQzIudHMsIHByZXZQQU5JQzEudHMscHJldk9DRDQudHMscHJldk9DRDMudHMscHJldk9DRDIudHMscHJldk9DRDEudHMpOwojanBlZyhmaWxlPSJ+L0Ryb3Bib3gvZ2l0TGFiL3N0dWR5RGVwcmVzc2lvbkJpZ0RhdGEvcHJldlBBTklDMTIzNF9PQ0QxMjM0LmpwZWciKQpwbG90KHByZXZQQU5JQzEyMzRfT0NEMTIzNC50cywgdHlwZT0ibCIsIHBsb3QudHlwZT0icyIsIGNvbD1jKCJibHVlNCIsICJibHVlMyIsImJsdWUyIiwiYmx1ZSIsImRhcmtvcmNoaWQ0IiwiZGFya29yY2hpZDMiLCJkYXJrb3JjaGlkMiIsImRhcmtvcmNoaWQxIiksIHhsYWI9Ik1vbnRoIiwgeWxhYj0iTmV3IFBhdC4gJSIsIGxpbmV0eXBlPWMoInNvbGlkIiwiZGFzaGVkIiksIHlsaW09YygwLG1heChwcmV2UEFOSUMxMjM0X09DRDEyMzQudHNbLDFdKSkpCmxlZ2VuZCgidG9wbGVmdCIsIGluc2V0ID0gMC4wMiwgbGVnZW5kPWMoIlBBTklDNCIsIlBBTklDMyIsICJQQU5JQzIiLCAiUEFOSUMxIiwiT0NENCIsIk9DRDMiLCJPQ0QyIiwiT0NEMSIpLAogICAgICAgY29sPWMoImJsdWU0IiwgImJsdWUzIiwiYmx1ZTIiLCJibHVlIiwiZGFya29yY2hpZDQiLCJkYXJrb3JjaGlkMyIsImRhcmtvcmNoaWQyIiwiZGFya29yY2hpZDEiKSwgbHR5PTEsIGNleD0wLjgpCiNsaW5lcyhnb29nbGUudHMvMTAwKm1heChwcmV2TkVVUk8zLnRzWywxXSksY29sPSJncmVlbiIpCiMgQWRkIHZlcnRpY2FsIGxpbmVzIGluZGljYXRpbmcgZGF0ZSBvZiBjZWxlcmJpdHkgZGlzY2xvc3VyZXMKYWJsaW5lKHY9YygyMDA0Kyh3aGljaChkYXRhJGdvb2dDaGEgPT0gMTAwKS0xKS8xMjAqMTAsMjAwNCsod2hpY2goZGF0YSRnb29nS2ltID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0xlZSA9PSAxMDApLTEpLzEyMCoxMCksIGNvbD0iZ3JheSIsIGx0eT0iZGFzaGVkIiwgbHdkPTIpCiNkZXYub2ZmKCkKYGBgCgoKIyBEcmF3IGdyYXBoIG9mIGluY2lkZW5jZSBhbmQgZ29vZ2xlIGRhdGEKYGBge3J9CmluY2lORVVSTzMudHM9dHMudW5pb24oaW5jaVBBTklDLnRzLCBpbmNpUFRTRC50cywgaW5jaU9DRC50cyk7CiNwZGYoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL2luY2lORVVSTzMyMDA0MjAyMS5wZGYiKQpwbG90KGluY2lORVVSTzMudHMsIHR5cGU9ImwiLCBwbG90LnR5cGU9InMiLCBjb2w9YygiYmx1ZSIsIm1hZ2VudGEiLCJjeWFuIiksIHhsYWI9Ik1vbnRoIiwgeWxhYj0iUGF0LiBOIiwgbGluZXR5cGU9Yygic29saWQiLCJkYXNoZWQiKSwgeWxpbT1jKDAsbWF4KGluY2lQQU5JQy50cykpKQpsZWdlbmQoInRvcGxlZnQiLCBpbnNldCA9IDAuMDIsIGxlZ2VuZD1jKCJQQU5JQyIsIk9DRCIsICJQVFNEIiksCiAgICAgICBjb2w9YygiYmx1ZSIsICJjeWFuIiwibWFnZW50YSIpLCBsdHk9MSwgY2V4PTAuOCkKcG9seWdvbihjKG1pbihpbmRleChnb29nbGUudHMpKSxpbmRleChnb29nbGUudHMpLCBtYXgoaW5kZXgoZ29vZ2xlLnRzKSkpLCBjKDAsIGdvb2dsZS50cyptYXgoaW5jaVBBTklDLnRzKS8xMDAsMCksY29sPSJibHVlIikKcG9seWdvbihjKG1pbihpbmRleChnb29nbGVPQ0RyZWxhdGl2ZS50cykpLGluZGV4KGdvb2dsZU9DRHJlbGF0aXZlLnRzKSwgbWF4KGluZGV4KGdvb2dsZU9DRHJlbGF0aXZlLnRzKSkpLCBjKDAsIGdvb2dsZU9DRHJlbGF0aXZlLnRzKm1heChpbmNpUEFOSUMudHMpLzEwMCwwKSxjb2w9ImdyZWVuIikKIyBBZGQgdmVydGljYWwgbGluZXMgaW5kaWNhdGluZyBkYXRlIG9mIGNlbGVyYml0eSBkaXNjbG9zdXJlcwphYmxpbmUodj1jKDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0NoYSA9PSAxMDApLTEpLzEyMCoxMCwyMDA0Kyh3aGljaChkYXRhJGdvb2dLaW0gPT0gMTAwKS0xKS8xMjAqMTAsMjAwNCsod2hpY2goZGF0YSRnb29nTGVlID09IDEwMCktMSkvMTIwKjEwKSwgY29sPSJncmF5IiwgbHR5PSJkYXNoZWQiLCBsd2Q9MikKI2Rldi5vZmYoKQpgYGAKYGBge3J9CiMgY2hlY2sgYXV0b2NvcnJlbGF0aW9uCmFjZjIoaW5jaVBBTklDNC50cywgbWF4LmxhZz0yNCkKIyBWaWV3IEFDRi9QQUNGIHBsb3RzIG9mIGRpZmZlcmVuY2VkL3NlYXNvbmFsbHkgZGlmZmVyZW5jZWQgZGF0YQphY2YyKGRpZmYoaW5jaVBBTklDNC50cyxsYWc9MTIpLCBtYXgubGFnPTI0KQphY2YyKGRpZmYoZGlmZihpbmNpUEFOSUM0LnRzLGxhZz0xMikpLCBtYXgubGFnPTI0KQpgYGAKCnRyYW5zZmVyRi50cyBpcyB0aGUgdGltZSBzZXJpZXMgb2YgdHJhbnNmZXIgZnVuY3Rpb24gZnJvbSB0aGUgY2VsZWJyaXRpZXMnIGRpc2Nsb3N1cmVzLgoKIyBtYWtlIHRyYW5zZmVyIGZ1Y3Rpb24gbWF0cml4CmBgYHtyfQpjb3VudE49MToyMTY7Cm1vbnRoQ2hhPXdoaWNoKGRhdGEkZ29vZ0NoYSA9PSAxMDApOwptb250aEtpbT13aGljaChkYXRhJGdvb2dLaW0gPT0gMTAwKTsKbW9udGhMZWU9d2hpY2goZGF0YSRnb29nTGVlID09IDEwMCk7CgpzdGVwQ2hhID0gYXMubnVtZXJpYyhjb3VudE4gPiBtb250aENoYSkKc3RlcEtpbSA9IGFzLm51bWVyaWMoY291bnROID4gbW9udGhLaW0pCnN0ZXBMZWUgPSBhcy5udW1lcmljKGNvdW50TiA+IG1vbnRoTGVlKQpyYW1wQ2hhIDwtIGFwcGVuZChyZXAoMCxtb250aENoYSksIHNlcSgxLDIxNi1tb250aENoYSwxKSkKcmFtcEtpbSA8LSBhcHBlbmQocmVwKDAsbW9udGhLaW0pLCBzZXEoMSwyMTYtbW9udGhLaW0sMSkpCnJhbXBMZWUgPC0gYXBwZW5kKHJlcCgwLG1vbnRoTGVlKSwgc2VxKDEsMjE2LW1vbnRoTGVlLDEpKQp0cmFuc2ZlckY9Y2JpbmQoc3RlcENoYSxzdGVwS2ltLHN0ZXBMZWUscmFtcENoYSxyYW1wS2ltLHJhbXBMZWUpCnRyYW5zZmVyRi50cz10cyh0cmFuc2ZlckYsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkpCnRyYW5zZmVyRkdvb2dsZT1hcy5udW1lcmljKGdvb2dsZS50cykKdHJhbnNmZXJGR29vZ2xlLnRzPXRzKHRyYW5zZmVyRixmcmVxdWVuY3k9MTIsIHN0YXJ0PWMoMjAwNCwxKSkKCnBsb3QodHJhbnNmZXJGLnRzKQpgYGAKCmBgYHtyfQojIG1vZGVsIDEgaXMgZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzIHJlc3VsdCBpcyAoMSAwIDApICwgKDAsMCwxKSAKaW5jaW1vZGVsMSA8LSBhdXRvLmFyaW1hKGluY2lQQU5JQzEudHMsIHNlYXNvbmFsPVRSVUUsIHhyZWc9dHJhbnNmZXJGLCBtYXguZD0zLCBtYXguRD0zLCBzdGVwd2lzZT1GQUxTRSwgdHJhY2U9VFJVRSk7CiMgQ2hlY2sgcmVzaWR1YWxzCmNoZWNrcmVzaWR1YWxzKGluY2ltb2RlbDEpCkJveC50ZXN0KGluY2ltb2RlbDEkcmVzaWR1YWxzLCBsYWcgPSAyNCwgdHlwZSA9ICJManVuZy1Cb3giKQojIEVzdGltYXRlIHBhcmFtZXRlcnMgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCnN1bW1hcnkoaW5jaW1vZGVsMSkKY29uZmludChpbmNpbW9kZWwxKQpjb2VmdGVzdChpbmNpbW9kZWwxKQpgYGAKCgpgYGB7cn0KIyBtb2RlbCAxIGlzIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcyByZXN1bHQgaXMgKDEgMCAwKSAsICgwLDAsMSkgCmluY2ltb2RlbDIgPC0gYXV0by5hcmltYShpbmNpUEFOSUMyLnRzLCBzZWFzb25hbD1UUlVFLCB4cmVnPXRyYW5zZmVyRiwgbWF4LmQ9MywgbWF4LkQ9Mywgc3RlcHdpc2U9RkFMU0UsIHRyYWNlPVRSVUUpOwojIENoZWNrIHJlc2lkdWFscwpjaGVja3Jlc2lkdWFscyhpbmNpbW9kZWwyKQpCb3gudGVzdChpbmNpbW9kZWwyJHJlc2lkdWFscywgbGFnID0gMjQsIHR5cGUgPSAiTGp1bmctQm94IikKIyBFc3RpbWF0ZSBwYXJhbWV0ZXJzIGFuZCBjb25maWRlbmNlIGludGVydmFscwpzdW1tYXJ5KGluY2ltb2RlbDIpCmNvbmZpbnQoaW5jaW1vZGVsMikKY29lZnRlc3QoaW5jaW1vZGVsMikKYGBgCmBgYHtyfQojIG1vZGVsIDEgaXMgZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzIHJlc3VsdCBpcyAoMSAwIDApICwgKDAsMCwxKSAKaW5jaW1vZGVsMyA8LSBhdXRvLmFyaW1hKGluY2lQQU5JQzMudHMsIHNlYXNvbmFsPVRSVUUsIHhyZWc9dHJhbnNmZXJGLCBtYXguZD0zLCBtYXguRD0zLCBzdGVwd2lzZT1GQUxTRSwgdHJhY2U9VFJVRSk7CiMgQ2hlY2sgcmVzaWR1YWxzCmNoZWNrcmVzaWR1YWxzKGluY2ltb2RlbDMpCkJveC50ZXN0KGluY2ltb2RlbDMkcmVzaWR1YWxzLCBsYWcgPSAyNCwgdHlwZSA9ICJManVuZy1Cb3giKQojIEVzdGltYXRlIHBhcmFtZXRlcnMgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCnN1bW1hcnkoaW5jaW1vZGVsMykKY29uZmludChpbmNpbW9kZWwzKQpjb2VmdGVzdChpbmNpbW9kZWwzKQpgYGAKCkJlbG93IGlzIHRoZSBzZWxlY3RlZCBtb2RlbCBvZiBpbmNpZGVuY2UuIEluIHRoZSB0ZXh0Ok9ubHkgdGhlIGZpcnN0IGNlbGVicml0eSBkaXNjbG9zdXJlIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkIGJvdGggdGhlIGxldmVsICgwwrcwMDU4JSwgOTUlIENJOiAwwrcwMDIyJeKAkzDCtzAwOTUlLCBwIDwgMMK3MDA1KSBhbmQgc2xvcGUgb2YgdGhlIG1vbnRobHkgaW5jaWRlbmNlIG9mIHBhbmljIGRpc29yZGVyICgwwrcwMDA3OCUgcGVyIG1vbnRoLCA5NSUgQ0kgMMK3MDAwMTkl4oCTMMK3MDAxNCUgcGVyIG1vbnRoLCBwIDwgMMK3MDEpLiAKCmBgYHtyfQojIG1vZGVsIDEgaXMgZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzIHJlc3VsdCBpcyAoMSAwIDApICwgKDAsMCwxKSAKaW5jaW1vZGVsNCA8LSBhdXRvLmFyaW1hKGluY2lQQU5JQzQudHMsIHNlYXNvbmFsPVRSVUUsIHhyZWc9dHJhbnNmZXJGLCBtYXguZD0zLCBtYXguRD0zLCBzdGVwd2lzZT1GQUxTRSwgdHJhY2U9VFJVRSk7CiMgQ2hlY2sgcmVzaWR1YWxzCmNoZWNrcmVzaWR1YWxzKGluY2ltb2RlbDQpCkJveC50ZXN0KGluY2ltb2RlbDQkcmVzaWR1YWxzLCBsYWcgPSAyNCwgdHlwZSA9ICJManVuZy1Cb3giKQojIEVzdGltYXRlIHBhcmFtZXRlcnMgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCnN1bW1hcnkoaW5jaW1vZGVsNCkKY29uZmludChpbmNpbW9kZWw0KQpjb2VmdGVzdChpbmNpbW9kZWw0KQpgYGAKCgojIE9DRCBtb2RlbApgYGB7cn0KIyBtb2RlbCAxIGlzIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcyByZXN1bHQgaXMgKDEgMCAwKSAsICgwLDAsMSkgCm1vZGVsT0NENCA8LSBhdXRvLmFyaW1hKGluY2lPQ0Q0LnRzLCBzZWFzb25hbD1UUlVFLCB4cmVnPXRyYW5zZmVyRiwgbWF4LmQ9MywgbWF4LkQ9Mywgc3RlcHdpc2U9RkFMU0UsIHRyYWNlPVRSVUUpOwojIENoZWNrIHJlc2lkdWFscwpjaGVja3Jlc2lkdWFscyhtb2RlbE9DRDQpCkJveC50ZXN0KG1vZGVsT0NENCRyZXNpZHVhbHMsIGxhZyA9IDI0LCB0eXBlID0gIkxqdW5nLUJveCIpCiMgRXN0aW1hdGUgcGFyYW1ldGVycyBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMKc3VtbWFyeShtb2RlbE9DRDQpCmNvbmZpbnQobW9kZWxPQ0Q0KQpjb2VmdGVzdChtb2RlbE9DRDQpCmBgYAoKClNpZ25pZmljYW5jZSB3YXMgZm91bmQgaW4gdHdvIGNhc2VzOmdyYW5nZXJ0ZXN0KGRpZmYocHJldlBBTklDNC50cykgfiBnb29nbGUudHNbLTIxNl0sIG9yZGVyPTIpIGFuZCBncmFuZ2VydGVzdChkaWZmKHByZXZQQU5JQzQudHMpIH4gZ29vZ2xlLnRzWy0yMTZdLCBvcmRlcj0zKS4KQSBzaWduaWZpY2FudCBwLXZhbHVlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBBREYgdGVzdCBzdWdnZXN0cyB0aGF0IHRoZSB0aW1lIHNlcmllcyBpcyBsaWtlbHkgc3RhdGlvbmFyeS4KQSBzaWduaWZpY2FudCBwLXZhbHVlIHdhcyBmb3VuZCBpbiBnb29nbGUudHMgYW5kIGRpZmYocHJldlBBTklDNC50cykgZGlmZihpbmNpUEFOSUM0LnRzKS4KSW4gdGhlIG1hbnVzY3JpcHQ6IFRoZSBtb250aGx5IGluY2lkZW5jZSBhbmQgcHJldmFsZW5jZSB3ZXJlIG5vbnN0YXRpb25hcnkgKEFERiA9IC0ywrc5OCwgcCA9IDDCtzE3IGFuZCBBREYgPSAtMMK3NzMsIHAgPSAwwrc5NyBmb3IgaW5jaWRlbmNlIGFuZCBwcmV2YWxlbmNlLCByZXNwZWN0aXZlbHkpOyB0aGUgZmlyc3Qtb3JkZXIgZGlmZmVyZW5jZXMgaW4gdGhlIG1vbnRobHkgaW5jaWRlbmNlIGFuZCBwcmV2YWxlbmNlIG9mIHBhbmljIGRpc29yZGVyIHdlcmUgc3RhdGlvbmFyeSAoQURGID0gLTjCtzE5LCBwIDwgMMK3MDUgYW5kIEFERiA9IC03wrcxNCwgcCA8IDDCtzA1IGZvciBpbmNpZGVuY2UgYW5kIHByZXZhbGVuY2UsIHJlc3BlY3RpdmVseSkuIAoKCiMgY29ycmVsYXRpb24gYmV0d2VlbiBHb29nbGUgdHJlbmQgYW5kIGluY2lkZW5jZQpgYGB7cn0KbGlicmFyeSh0c2VyaWVzKQphZGYudGVzdChnb29nbGUudHMsIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKSAKYWRmLnRlc3QoaW5jaVBBTklDNC50cywgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpIAphZGYudGVzdChwcmV2UEFOSUM0LnRzLCBhbHRlcm5hdGl2ZSA9ICJzdGF0aW9uYXJ5IikgCgojYWRmLnRlc3QoaW5jaVBBTklDMy50cywgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpIAojYWRmLnRlc3QocHJldlBBTklDMy50cywgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpIAoKI2FkZi50ZXN0KGluY2lQQU5JQzIudHMsIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKSAKI2FkZi50ZXN0KHByZXZQQU5JQzIudHMsIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKSAKCiNhZGYudGVzdChpbmNpUEFOSUMxLnRzLCBhbHRlcm5hdGl2ZSA9ICJzdGF0aW9uYXJ5IikgCiNhZGYudGVzdChwcmV2UEFOSUMxLnRzLCBhbHRlcm5hdGl2ZSA9ICJzdGF0aW9uYXJ5IikgCgphZGYudGVzdChkaWZmKGluY2lQQU5JQzQudHMpLCBhbHRlcm5hdGl2ZSA9ICJzdGF0aW9uYXJ5IikgCmFkZi50ZXN0KGRpZmYocHJldlBBTklDNC50cyksIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQoKI2FkZi50ZXN0KGRpZmYoaW5jaVBBTklDMy50cyksIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKSAKI2FkZi50ZXN0KGRpZmYocHJldlBBTklDMy50cyksIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQoKI2FkZi50ZXN0KGRpZmYoaW5jaVBBTklDMi50cyksIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKSAKI2FkZi50ZXN0KGRpZmYocHJldlBBTklDMi50cyksIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQoKI2FkZi50ZXN0KGRpZmYoaW5jaVBBTklDMS50cyksIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKSAKI2FkZi50ZXN0KGRpZmYocHJldlBBTklDMS50cyksIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQoKCiNjb3IudGVzdChpbmNpUEFOSUMxLnRzLCBnb29nbGUudHMsICBtZXRob2Q9ImtlbmRhbGwiKQpjb3IudGVzdChkaWZmKGluY2lQQU5JQzQudHMpLCBnb29nbGUudHNbLTIxNl0sICBtZXRob2Q9InNwZWFybWFuIiwgZXhhY3Q9RkFMU0UpCmNvci50ZXN0KGRpZmYocHJldlBBTklDNC50cyksIGdvb2dsZS50c1stMjE2XSwgIG1ldGhvZD0ic3BlYXJtYW4iLCBleGFjdD1GQUxTRSkKCiNjb3IudGVzdChkaWZmKGluY2lQQU5JQzMudHMpLCBnb29nbGUudHNbLTIxNl0sICBtZXRob2Q9InNwZWFybWFuIiwgZXhhY3Q9RkFMU0UpCiNjb3IudGVzdChkaWZmKHByZXZQQU5JQzMudHMpLCBnb29nbGUudHNbLTIxNl0sICBtZXRob2Q9InNwZWFybWFuIiwgZXhhY3Q9RkFMU0UpCgojY29yLnRlc3QoZGlmZihpbmNpUEFOSUMyLnRzKSwgZ29vZ2xlLnRzWy0yMTZdLCAgbWV0aG9kPSJzcGVhcm1hbiIsIGV4YWN0PUZBTFNFKQojY29yLnRlc3QoZGlmZihwcmV2UEFOSUMyLnRzKSwgZ29vZ2xlLnRzWy0yMTZdLCAgbWV0aG9kPSJzcGVhcm1hbiIsIGV4YWN0PUZBTFNFKQoKI2Nvci50ZXN0KGRpZmYoaW5jaVBBTklDMS50cyksIGdvb2dsZS50c1stMjE2XSwgIG1ldGhvZD0ic3BlYXJtYW4iLCBleGFjdD1GQUxTRSkKI2Nvci50ZXN0KGRpZmYocHJldlBBTklDMS50cyksIGdvb2dsZS50c1stMjE2XSwgIG1ldGhvZD0ic3BlYXJtYW4iLCBleGFjdD1GQUxTRSkKCmdyYW5nZXJ0ZXN0KGRpZmYocHJldlBBTklDNC50cykgfiBnb29nbGUudHNbLTIxNl0sIG9yZGVyPTQpCmdyYW5nZXJ0ZXN0KGdvb2dsZS50c1stMjE2XSB+IGRpZmYocHJldlBBTklDNC50cyksIG9yZGVyPTQpCgojZ3JhbmdlcnRlc3QoaW5jaVBBTklDMS50cyB+IGdvb2dsZS50cywgb3JkZXI9MykKI2dyYW5nZXJ0ZXN0KGluY2lQQU5JQzEudHMgfiBnb29nbGUudHMsIG9yZGVyPTIpCiNncmFuZ2VydGVzdChpbmNpUEFOSUMxLnRzIH4gZ29vZ2xlLnRzLCBvcmRlcj0xKQoKZ3JhbmdlcnRlc3QoZGlmZihwcmV2UEFOSUM0LnRzKSB+IGdvb2dsZS50c1stMjE2XSwgb3JkZXI9MykKI2dyYW5nZXJ0ZXN0KGRpZmYocHJldlBBTklDMS50cykgfiBnb29nbGUudHNbLTIxNl0sIG9yZGVyPTMpCmdyYW5nZXJ0ZXN0KGRpZmYocHJldlBBTklDNC50cykgfiBnb29nbGUudHNbLTIxNl0sIG9yZGVyPTIpCiNncmFuZ2VydGVzdChkaWZmKHByZXZQQU5JQzEudHMpIH4gZ29vZ2xlLnRzWy0yMTZdLCBvcmRlcj0yKQpncmFuZ2VydGVzdChkaWZmKHByZXZQQU5JQzQudHMpIH4gZ29vZ2xlLnRzWy0yMTZdLCBvcmRlcj0xKQojZ3JhbmdlcnRlc3QoZGlmZihwcmV2UEFOSUMxLnRzKSB+IGdvb2dsZS50c1stMjE2XSwgb3JkZXI9MSkKCmdyYW5nZXJ0ZXN0KGdvb2dsZS50c1stMjE2XSB+IGRpZmYocHJldlBBTklDNC50cyksIG9yZGVyPTMpCgpncmFuZ2VydGVzdChkaWZmKHByZXZQQU5JQzQudHMpIH4gZ29vZ2xlLnRzWy0yMTZdLCBvcmRlcj0yKQpncmFuZ2VydGVzdChnb29nbGUudHNbLTIxNl0gfiBkaWZmKHByZXZQQU5JQzQudHMpLCBvcmRlcj0yKQoKZ3JhbmdlcnRlc3QoZGlmZihwcmV2UEFOSUM0LnRzKSB+IGdvb2dsZS50c1stMjE2XSwgb3JkZXI9MSkKZ3JhbmdlcnRlc3QoZ29vZ2xlLnRzWy0yMTZdIH4gZGlmZihwcmV2UEFOSUM0LnRzKSwgb3JkZXI9MSkKCmdyYW5nZXJ0ZXN0KGRpZmYoaW5jaVBBTklDNC50cykgfiBnb29nbGUudHNbLTIxNl0sIG9yZGVyPTEpCmdyYW5nZXJ0ZXN0KGdvb2dsZS50c1stMjE2XSB+IGRpZmYoaW5jaVBBTklDNC50cyksIG9yZGVyPTEpCgpncmFuZ2VydGVzdChkaWZmKGluY2lQQU5JQzQudHMpIH4gZ29vZ2xlLnRzWy0yMTZdLCBvcmRlcj0yKQpncmFuZ2VydGVzdChnb29nbGUudHNbLTIxNl0gfiBkaWZmKGluY2lQQU5JQzQudHMpLCBvcmRlcj0yKQoKYGBgCgoKCiMgaW5mbHVlbmNlIG9mIGNlbGVicml0aWVzIGRpc2Nsb3N1cmVzIG9uIEdvb2dsZSBzZWFyY2ggZm9yIHBhbmljIGRpc29yZGVyCmBgYHtyfQojIG1vZGVsIDEgaXMgZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzIHJlc3VsdCBpcyAoMyAwIDApICwgKDIsMCwwKSAKbW9kZWxHIDwtIGF1dG8uYXJpbWEoZ29vZ2xlLnRzLCBzZWFzb25hbD1UUlVFLCB4cmVnPXRyYW5zZmVyRiwgbWF4LmQ9MywgbWF4LkQ9Mywgc3RlcHdpc2U9RkFMU0UsIHRyYWNlPVRSVUUpOwojIENoZWNrIHJlc2lkdWFscwpjaGVja3Jlc2lkdWFscyhtb2RlbEcpCkJveC50ZXN0KG1vZGVsRyRyZXNpZHVhbHMsIGxhZyA9IDI0LCB0eXBlID0gIkxqdW5nLUJveCIpCiMgRXN0aW1hdGUgcGFyYW1ldGVycyBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMKc3VtbWFyeShtb2RlbEcpCmNvbmZpbnQobW9kZWxHKQpjb2VmdGVzdChtb2RlbEcpCmBgYAptb2RlbDBpbmNpNCByZXByZXNlbnRzIGJlc3QgZml0IG1vZGVsIHdpdGggaXRzIHBhcmFtZXRlciB1c2luZyBvbmx5IHByZS1kaXNjbG9zdXJlIHBlcmlvZC4gQmVzdCBtb2RlbDogQVJJTUEoMSwxLDApKDEsMCwwKVsxMl0gICAKZm1vZGVsMGluY2k0IG1lYW5zIG1vZGVsZWQgdGltZSBzZXJpZXMgdXNpbmcgbW9kZWwwCmZjMGluY2k0IGFuZCBmYzBpbmNpNC50cyBpcyB0aGUgZm9yZWNhc3RlZCBzZXJpZXMgdXNpbmcgdGhlIGZtb2RlbDBpbmNpNAppbmNpUEFOSUM0LnRzLjIgLjIgaW5kaWNhdGVzIGNvbWJpbmVkIHRpbWUgc2VyaWVzIHdpdGggZm9yZWNhc3QKCiMgUHJlZGljdGlvbiBtb2RlbCAxIDogb25seSB1c2luZyBwcmUtZGlzY2xvc3VyZSBwZXJpb2QgCmBgYHtyfQojIG1vZGVsIDAgaXMgZm9yIHByZWRpY3Rpb24gCm1vZGVsMGluY2k0IDwtIGF1dG8uYXJpbWEod2luZG93KGluY2lQQU5JQzQudHMsIGVuZD1jKDIwMTAsMTIpKSwgc2Vhc29uYWw9VFJVRSwgbWF4LmQ9MywgbWF4LkQ9Mywgc3RlcHdpc2U9RkFMU0UsIHRyYWNlPVRSVUUpOwpmbW9kZWwwaW5jaTQgPC0gQXJpbWEod2luZG93KGluY2lQQU5JQzQudHMsIGVuZD1jKDIwMTAsMTIpKSwgb3JkZXI9YygxLDEsMCksIHNlYXNvbmFsPWxpc3Qob3JkZXI9YygxLDAsMCksIHBlcmlvZD0xMikpCmZjMGluY2k0IDwtIGZvcmVjYXN0KGZtb2RlbDBpbmNpNCwgaD0oMjE2LW1vbnRoQ2hhKSkKZmMwaW5jaTQudHMgPC0gdHMoYXMubnVtZXJpYyhmYzBpbmNpNCRtZWFuKSwgc3RhcnQ9YygyMDExLDEpLCBmcmVxdWVuY3k9MTIpCmluY2lQQU5JQzQudHMuMiA8LSB0cy51bmlvbihpbmNpUEFOSUM0LnRzLCBmYzBpbmNpNC50cykKCiMgZm9yIHByZXZhbGVuY2UKIyBtb2RlbCAwIGlzIGZvciBwcmVkaWN0aW9uIAptb2RlbDBwcmV2NCA8LSBhdXRvLmFyaW1hKHdpbmRvdyhwcmV2UEFOSUM0LnRzLCBlbmQ9YygyMDEwLDEyKSksIHNlYXNvbmFsPVRSVUUsIG1heC5kPTMsIG1heC5EPTMsIHN0ZXB3aXNlPUZBTFNFLCB0cmFjZT1UUlVFKTsKIyBBUklNQSgwLDEsNCkoMSwwLDApWzEyXSB3aXRoIGRyaWZ0IApmbW9kZWwwcHJldjQgPC0gQXJpbWEod2luZG93KHByZXZQQU5JQzQudHMsIGVuZD1jKDIwMTAsMTIpKSwgb3JkZXI9YygwLDEsNCksIHNlYXNvbmFsPWxpc3Qob3JkZXI9YygxLDAsMCksIHBlcmlvZD0xMikpCmZjMHByZXY0IDwtIGZvcmVjYXN0KGZtb2RlbDBwcmV2NCwgaD0oMjE2LW1vbnRoQ2hhKSkKZmMwcHJldjQudHMgPC0gdHMoYXMubnVtZXJpYyhmYzBwcmV2NCRtZWFuKSwgc3RhcnQ9YygyMDExLDEpLCBmcmVxdWVuY3k9MTIpCnByZXZQQU5JQzQudHMuMiA8LSB0cy51bmlvbihwcmV2UEFOSUM0LnRzLCBmYzBwcmV2NC50cykKCmBgYAoKRHVlIHRvIHRoZSByb3VuZGluZyBvZiBudW1iZXJzLCAwLjYwNTQ4Mzkgd2FzIGNhbGN1bGF0ZWQgMC42MSBzbyA1NzIuMzcxMiAlIGluY3JlYXNlIHdhcyBwcmVzZW50ZWQgYXMgNTc3Ljc4ICUgYXMgZm9sbG93aW5nOgpUaGUgb2JzZXJ2ZWQgYW5udWFsIGluY2lkZW5jZSBvZiAwwrc2MSUgaW4gMjAyMSB3YXMgYW4gNTc3Ljc3JSBoaWdoZXIgdGhhbiB0aGUgcHJlZGljdGVkIGluY2lkZW5jZSBvZiAwwrcwOSUgKDk1JSBDSTogLTDCtzExJeKAkzDCtzI5JSkuIAoKQmVsb3cgb25lIHRvbzpUaGUgb2JzZXJ2ZWQgYW5udWFsIHByZXZhbGVuY2Ugb2YgN8K3NTMlIGluIDIwMjEgd2FzIGEgNzc1wrc1OCUgaGlnaGVyIHRoYW4gdGhlIGZvcmVjYXN0ZWQgaW5jaWRlbmNlIG9mIDDCtzg2JSAoOTUlIENJOjDCtzMzJeKAkzHCtzQwJSkuIAoKYGBge3J9CiMgZm9yZWNhc3QgYW5udWFsIGluY2lkZW5jZSBpbiAyMDIxIHdpdGggOTUlIENJLCBzdXBwb3NpbmcgZGVub21pbmF0b3ItdGhlIG51bWJlciBvZiB0b3RhbCBwb3B1bGF0aW9uIGRvZXMgbm90IHZhcnkgYWNyb3NzIG1vbnRocwojIENJIGxvd2VyIHVwcGVyIGlzIHRoZSBzZWNvbmQgY29sdW1zIG9mIGZjMGluY2k0JGxvd2VyWywyXSBhbmQgCiMgZm9yY2FzdCAyMDIxIGFubnVhbCBpbmNpZGVuY2UKc3VtKHRhaWwoZmMwaW5jaTQkbWVhbiwxMikpCiMgaXRzIENJIDk1JQpzdW0odGFpbChmYzBpbmNpNCRsb3dlclssMl0sMTIpKQpzdW0odGFpbChmYzBpbmNpNCR1cHBlclssMl0sMTIpKQojIFBlcmNlbnQgaW5jcmVhc2Ugb2Ygb2JzZXJ2ZWQgdmFsdWUgZnJvbSAKKHN1bSh0YWlsKGluY2lQQU5JQzQudHMsMTIpKSAtIHN1bSh0YWlsKGZjMGluY2k0JG1lYW4sMTIpKSkvc3VtKHRhaWwoZmMwaW5jaTQkbWVhbiwxMikpICogMTAwIAoKCiMgZm9yY2FzdCAyMDIxIGFubnVhbCBwcmV2YWxlbmNlCnN1bSh0YWlsKGZjMHByZXY0JG1lYW4sMTIpKQojIGl0cyBDSSA5NSUKc3VtKHRhaWwoZmMwcHJldjQkbG93ZXJbLDJdLDEyKSkKc3VtKHRhaWwoZmMwcHJldjQkdXBwZXJbLDJdLDEyKSkKIyBQZXJjZW50IGluY3JlYXNlIG9mIG9ic2VydmVkIHZhbHVlIGZyb20gCihzdW0odGFpbChwcmV2UEFOSUM0LnRzLDEyKSkgLSBzdW0odGFpbChmYzBwcmV2NCRtZWFuLDEyKSkpL3N1bSh0YWlsKGZjMHByZXY0JG1lYW4sMTIpKSAqIDEwMAojIGluc3RlYWQgdXNlZCBvbmUgKDcuNTMtMC44NikqMTAwLzAuODYgPTc3NS41OCAlCmBgYAoKQmVsb3cgaXMgdGhlIHJhdyBtYXRlcmlhbCBvZiBGaWd1cmUyLjIuYWkKCmBgYHtyfQpwZGYoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL2luY2lQYW5pY1ByZWRpY3Rpb24yMDA0MjAyMV8yLnBkZiIpCnBsb3QoaW5jaVBBTklDNC50cy4yLCB0eXBlPSJsIiwgcGxvdC50eXBlPSJzIiwgY29sPWMoJ2JsdWUnLCdkZWVwc2t5Ymx1ZScpLCB4bGFiPSJNb250aCIsIHlsYWI9Ik5ldyBQYW5pYyBQYXQuIE4iLCBsaW5ldHlwZT1jKCJzb2xpZCIsImRhc2hlZCIpLCB5bGltPWMoMCxtYXgoaW5jaVBBTklDNC50cykpKQojIGFkZCBjb25maWRlbmNlIGludGVydmFsCnRtcCA8LSBzZXEoZnJvbSA9IDIwMTEsIHRvID0yMDIxLjk5LCBieSA9IDEvMTIpCiMgYmVsb3cgaXMgZHJhd2luZyBwb2x5Z29uIHN1cHBseWluZyBvdXRsaW5lIHgseSBjb29yZGluYXRlcwpwb2x5Z29uKGModG1wLHJldih0bXApKSxjKGZjMGluY2k0JGxvd2VyWywyXSxyZXYoZmMwaW5jaTQkdXBwZXJbLDJdKSksIGNvbD1yZ2IoMCwgMC43NSwgMSwwLjEpLCBib3JkZXIgPSBGQUxTRSkKYWJsaW5lKHY9YygyMDA0Kyh3aGljaChkYXRhJGdvb2dDaGEgPT0gMTAwKS0xKS8xMjAqMTAsMjAwNCsod2hpY2goZGF0YSRnb29nS2ltID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0xlZSA9PSAxMDApLTEpLzEyMCoxMCksIGNvbD0iZ3JheSIsIGx0eT0iZGFzaGVkIiwgbHdkPTIpCmRldi5vZmYoKQoKcGRmKGZpbGU9In4vRHJvcGJveC9naXRMYWIvc3R1ZHlEZXByZXNzaW9uQmlnRGF0YS9wcmV2UGFuaWNQcmVkaWN0aW9uMjAwNDIwMjFfMi5wZGYiKQpwbG90KHByZXZQQU5JQzQudHMuMiwgdHlwZT0ibCIsIHBsb3QudHlwZT0icyIsIGNvbD1jKCdibHVlJywnZGVlcHNreWJsdWUnKSwgeGxhYj0iTW9udGgiLCB5bGFiPSJOZXcgUGFuaWMgUGF0LiBOIiwgbGluZXR5cGU9Yygic29saWQiLCJkYXNoZWQiKSwgeWxpbT1jKDAsbWF4KHByZXZQQU5JQzQudHMpKSkKIyBhZGQgY29uZmlkZW5jZSBpbnRlcnZhbAp0bXAgPC0gc2VxKGZyb20gPSAyMDExLCB0byA9MjAyMS45OSwgYnkgPSAxLzEyKQojIGJlbG93IGlzIGRyYXdpbmcgcG9seWdvbiBzdXBwbHlpbmcgb3V0bGluZSB4LHkgY29vcmRpbmF0ZXMKcG9seWdvbihjKHRtcCxyZXYodG1wKSksYyhmYzBwcmV2NCRsb3dlclssMl0scmV2KGZjMHByZXY0JHVwcGVyWywyXSkpLCBjb2w9cmdiKDAsIDAuNzUsIDEsMC4xKSwgYm9yZGVyID0gRkFMU0UpCmFibGluZSh2PWMoMjAwNCsod2hpY2goZGF0YSRnb29nQ2hhID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0tpbSA9PSAxMDApLTEpLzEyMCoxMCwyMDA0Kyh3aGljaChkYXRhJGdvb2dMZWUgPT0gMTAwKS0xKS8xMjAqMTApLCBjb2w9ImdyYXkiLCBsdHk9ImRhc2hlZCIsIGx3ZD0yKQpkZXYub2ZmKCkKCgoKYGBgCgoKQmVsb3cgaXMgYXBwbHlpbmcgdGhlIHNhbWUgcHJvY2VkdXJlIHVzaW5nIGluY2lQQU5JQzEudHMsIEJlc3QgbW9kZWw6IEFSSU1BKDAsMSwxKSgyLDEsMClbMTJdICAgIAoKYGBge3J9CiMgbW9kZWwgMSBpcyBmb3IgcHJlZGljdGlvbiB3aXRoIHByaW1hcnkgb25seQptb2RlbDBpbmNpMSA8LSBhdXRvLmFyaW1hKHdpbmRvdyhpbmNpUEFOSUMxLnRzLCBlbmQ9YygyMDEwLDEyKSksIHNlYXNvbmFsPVRSVUUsIG1heC5kPTMsIG1heC5EPTMsIHN0ZXB3aXNlPUZBTFNFLCB0cmFjZT1UUlVFKTsKZm1vZGVsMGluY2kxIDwtIEFyaW1hKHdpbmRvdyhpbmNpUEFOSUMxLnRzLCBlbmQ9YygyMDEwLDEyKSksIG9yZGVyPWMoMCwxLDEpLCBzZWFzb25hbD1saXN0KG9yZGVyPWMoMiwxLDApLCBwZXJpb2Q9MTIpKQppbmNpZmMxIDwtIGZvcmVjYXN0KGZtb2RlbDBpbmNpMSwgaD0oMjE2LW1vbnRoQ2hhKSkKaW5jaWZjMS50cyA8LSB0cyhhcy5udW1lcmljKGluY2lmYzEkbWVhbiksIHN0YXJ0PWMoMjAxMSwxKSwgZnJlcXVlbmN5PTEyKQppbmNpUEFOSUMxLnRzLjIgPC0gdHMudW5pb24oaW5jaVBBTklDMS50cywgaW5jaWZjMS50cykKYGBgCgoKYGBge3J9CiNwZGYoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL2luY2lQYW5pY1ByZWRpY3Rpb24xLnBkZiIpCnBsb3QoaW5jaVBBTklDMS50cy4yLCB0eXBlPSJsIiwgcGxvdC50eXBlPSJzIiwgY29sPWMoJ2JsdWUnLCdkZWVwc2t5Ymx1ZScpLCB4bGFiPSJNb250aCIsIHlsYWI9Ik5ldyBQYW5pYyBQYXQuIE4iLCBsaW5ldHlwZT1jKCJzb2xpZCIsImRhc2hlZCIpLCB5bGltPWMoMCxtYXgoaW5jaVBBTklDNC50cykpKQojIGFkZCBjb25maWRlbmNlIGludGVydmFsCnRtcCA8LSBzZXEoZnJvbSA9IDIwMTEsIHRvID0yMDIxLjk5LCBieSA9IDEvMTIpCiMgYmVsb3cgaXMgZHJhd2luZyBwb2x5Z29uIHN1cHBseWluZyBvdXRsaW5lIHgseSBjb29yZGluYXRlcwpwb2x5Z29uKGModG1wLHJldih0bXApKSxjKGluY2lmYzEkbG93ZXJbLDJdLHJldihpbmNpZmMxJHVwcGVyWywyXSkpLCBjb2w9cmdiKDAsIDAuNzUsIDEsMC4xKSwgYm9yZGVyID0gRkFMU0UpCmFibGluZSh2PWMoMjAwNCsod2hpY2goZGF0YSRnb29nQ2hhID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0tpbSA9PSAxMDApLTEpLzEyMCoxMCwyMDA0Kyh3aGljaChkYXRhJGdvb2dMZWUgPT0gMTAwKS0xKS8xMjAqMTApLCBjb2w9ImdyYXkiLCBsdHk9ImRhc2hlZCIsIGx3ZD0yKQpsaW5lcyhmaXR0ZWQoZm1vZGVsMGluY2kxKSxjb2w9InJlZCIsbHdkPTEsIGx0eT0iZG90dGVkIikKI2Rldi5vZmYoKQpgYGAKCmlmIHdlIHVzZSB0aGUgQVJJTUEgTU9ERUwgb2Ygd2hvbGUgdGltZSBzZXJpZXMsIGJlc3QgbW9kZWwgd2FzICgxIDAgMCkgKDAgMCAxKSwgCmhvd2V2ZXIsIHByZWRpY3Rpb24gc2hvdWxkIGJlIGRvbmUgdXNpbmcgb25seSBkYXRhIGJ5IHByZS1kaXNjbG9zdXJlIHBlcmlvZC4gIAoKYGBge3J9CiMgbW9kZWwgNCBpcyBmb3IgcHJlZGljdGlvbiB3aXRoIHdob2xlIHRpbWUgc2VyaWVzCmluY2lmbW9kZWw0IDwtIEFyaW1hKHdpbmRvdyhpbmNpUEFOSUM0LnRzLCBlbmQ9YygyMDEwLDEyKSksIG9yZGVyPWMoMSwwLDApLCBzZWFzb25hbD1saXN0KG9yZGVyPWMoMCwwLDEpLCBwZXJpb2Q9MTIpKQppbmNpZmM0IDwtIGZvcmVjYXN0KGluY2lmbW9kZWw0LCBoPSgyMTYtbW9udGhDaGEpKQppbmNpZmM0LnRzIDwtIHRzKGFzLm51bWVyaWMoaW5jaWZjNCRtZWFuKSwgc3RhcnQ9YygyMDExLDEpLCBmcmVxdWVuY3k9MTIpCmluY2lQQU5JQzQudHMuMSA8LSB0cy51bmlvbihpbmNpUEFOSUM0LnRzLCBpbmNpZmM0LnRzKQpgYGAKCmJlbG93IGlzIHRodXMgYSB3cm9uZyBpbWFnZQoKYGBge3J9CiNwZGYoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL2luY2lQYW5pY1ByZWRpY3Rpb240LnBkZiIpCnBsb3QoaW5jaVBBTklDNC50cy4xLCB0eXBlPSJsIiwgcGxvdC50eXBlPSJzIiwgY29sPWMoJ2JsdWUnLCdkZWVwc2t5Ymx1ZScpLCB4bGFiPSJNb250aCIsIHlsYWI9Ik5ldyBQYW5pYyBQYXQuIE4iLCBsaW5ldHlwZT1jKCJzb2xpZCIsImRhc2hlZCIpLCB5bGltPWMoMCxtYXgoaW5jaVBBTklDNC50cykpKQojIGFkZCBjb25maWRlbmNlIGludGVydmFsCnRtcCA8LSBzZXEoZnJvbSA9IDIwMTEsIHRvID0yMDIxLjk5LCBieSA9IDEvMTIpCiMgYmVsb3cgaXMgZHJhd2luZyBwb2x5Z29uIHN1cHBseWluZyBvdXRsaW5lIHgseSBjb29yZGluYXRlcwpwb2x5Z29uKGModG1wLHJldih0bXApKSxjKGluY2lmYzQkbG93ZXJbLDJdLHJldihpbmNpZmM0JHVwcGVyWywyXSkpLCBjb2w9cmdiKDAsIDAuNzUsIDEsMC4xKSwgYm9yZGVyID0gRkFMU0UpCmFibGluZSh2PWMoMjAwNCsod2hpY2goZGF0YSRnb29nQ2hhID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0tpbSA9PSAxMDApLTEpLzEyMCoxMCwyMDA0Kyh3aGljaChkYXRhJGdvb2dMZWUgPT0gMTAwKS0xKS8xMjAqMTApLCBjb2w9ImdyYXkiLCBsdHk9ImRhc2hlZCIsIGx3ZD0yKQpsaW5lcyhmaXR0ZWQoaW5jaW1vZGVsNCksY29sPSJyZWQiLGx3ZD0xLCBsdHk9ImRvdHRlZCIpCiNkZXYub2ZmKCkKYGBgCkNvbXBhcmlzb24gb2Ygb2JzZXJ2ZWQgdmFsdWUsIGluY2lQQU5JQzQudHMgdmVyc3VzIHByZWRpY3Rpb24gdmFsdWVzLCBmYzBpbmNpNC4KVGhpcyBpcyBmb3IgdGhlIGZvbGxvd2luZyBjb250ZW50cyBvZiB0aGUgbWFudXNjcmlwdDogClRoZSBtb250aGx5IGluY2lkZW5jZSBvZiBwYW5pYyBkaXNvcmRlciB3YXMgc3RhYmxlIGZyb20gSmFudWFyeSAyMDA0IHRvIERlY2VtYmVyIDIwMTAgKDDCtzAwNTQgwrEgMMK3MDAwODYlKS4gCgpUaGUgdHJlbmQgb2YgaW5jcmVhc2luZyBpbmNpZGVuY2UgcmF0ZXMgY29udGludWVkLCByZWFjaGluZyBhbiBhbm51YWwgcmF0ZSBvZiAwwrc2MSUgaW4gMjAyMS4gVGhpcyByZXByZXNlbnRzIGFuIGluY3JlYXNlIG9mIDgzOMK3NDYlIGNvbXBhcmVkIHdpdGggdGhlIGF2ZXJhZ2UgYW5udWFsIGluY2lkZW5jZSBvZiAwwrcwNjUlICjCsSAwwrcwMDgyJSkgcmVjb3JkZWQgYmV0d2VlbiAyMDA0IGFuZCAyMDEwLiAKCi4uLgpUaGUgb2JzZXJ2ZWQgbW9udGhseSBpbmNpZGVuY2VzIHdlcmUgMzXCtzQ4JSAoYW4gb2JzZXJ2ZWQgbW9udGhseSBpbmNpZGVuY2Ugb2YgMMK3MDA4NCUgdnMuIHRoZSBwcmVkaWN0ZWQgMMK3MDA2MiUsIDk1JSBDSTowwrcwMDUzJeKAkzDCtzAwNzIlKSwgMzPCtzMzJSAoMMK3MDA4NCUgdnMuIDDCtzAwNjMlJSwgOTUlIENJOjDCtzAwNTIl4oCTMMK3MDA3NSUpLCBhbmQgMTU3wrcxNCUgKDDCtzAxOCUgdnMuIDDCtzAwNzAlJSwgOTUlIENJOjDCtzAwNTUl4oCTMMK3MDA4NCUpIGhpZ2hlciB0aGFuIHRoZSBjb3VudGVyZmFjdHVhbCBwcmVkaWN0ZWQgaW5jaWRlbmNlcyBmb3IgSmFudWFyeSAyMDExLCBGZWJydWFyeSAyMDExLCBhbmQgTWFyY2ggMjAxMSwgcmVzcGVjdGl2ZWx5LiAKCiMgdmFsdWVzIGNhc2UgYnkgY2FzZQpgYGB7cn0KIyBpbmNpZGVuY2UgdmFsdWVzIGR1cmluZyBwcmUtZGlzY2xvc3VyZSBwZXJpb2QKIyBiZWxvdyBpcyB0aGUgbW9udGhseSB2YWx1ZXMgb2YgcHJlLWRpc2Nsb3N1cmUgcGVyaW9kCm1lYW4od2luZG93KGluY2lQQU5JQzQudHMsIHN0YXJ0ID0gYygyMDA0LCAxKSwgZW5kID0gYygyMDEwLCAxMikpKQpzZCh3aW5kb3coaW5jaVBBTklDNC50cywgc3RhcnQgPSBjKDIwMDQsIDEpLCBlbmQgPSBjKDIwMTAsIDEyKSkpCgojaW5jcmVhc2UgZnJvbSBEZWNlbWJlciAyMDEwIHRvIEphbnVhcnksIEZlYnJ1YXJ5LCBNYXJjaCwgQXByaWwsIDIwMTEgIAojIG9ic2VydmVkIHZhbHVlIG9uIEFwcmlsIDIwMTEgCnZhbEluY2kyMDExMDQgPC0gd2luZG93KGluY2lQQU5JQzQudHMsIHN0YXJ0ID0gYygyMDExLCA0KSwgZW5kID0gYygyMDExLCA0KSkKKDAuMDA4NC0wLjAwNjUpKjEwMC8wLjAwNjUKKDAuMDE4LTAuMDA2NSkqMTAwLzAuMDA2NQoKIyBmb3IgcHJldmFsZW5jZQp2YWxQcmV2MjAxMTAxIDwtIHdpbmRvdyhwcmV2UEFOSUM0LnRzLCBzdGFydCA9IGMoMjAxMSwgMSksIGVuZCA9IGMoMjAxMSwgMSkpCgoKIyBvYnNlcnZlZCB2YWx1ZSBpbiAyMDIxID0gYW5udWFsIGluY2lkZW5jZSBpbiAyMDIxCnZhbEluY2kyMDIxIDwtIHN1bSh3aW5kb3coaW5jaVBBTklDNC50cywgc3RhcnQgPSBjKDIwMjEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkpCigwLjAyNi0wLjAwNjUpKjEwMC8wLjAwNjUKCiMgb2JzZXJ2ZWQgdmFsdWUgb24gSmFudWFyeSAyMDExIAp2YWxJbmNpMjAxMTAxIDwtIHdpbmRvdyhpbmNpUEFOSUM0LnRzLCBzdGFydCA9IGMoMjAxMSwgMSksIGVuZCA9IGMoMjAxMSwgMSkpCiMgcHJlZGljdGVkIHZhbHVlIG9uIEphbnVhcnkgMjAxMQp2YWxJbmNpMjAxMTAxZmMgPC0gd2luZG93KGZjMGluY2k0LnRzLCBzdGFydCA9IGMoMjAxMSwgMSksIGVuZCA9IGMoMjAxMSwgMSkpCiMlIGluY3JlYXNlCjEwMCooMC4wMDg0LTAuMDA2MikvMC4wMDYyCgojIG9ic2VydmVkIHZhbHVlIG9uIEZlYnJ1YXJ5IDIwMTEgCnZhbEluY2kyMDExMDIgPC0gd2luZG93KGluY2lQQU5JQzQudHMsIHN0YXJ0ID0gYygyMDExLCAyKSwgZW5kID0gYygyMDExLCAyKSkKIyBwcmVkaWN0ZWQgdmFsdWUgb24gRmVicnVhcnkgMjAxMQp2YWxJbmNpMjAxMTAyZmMgPC0gd2luZG93KGZjMGluY2k0LnRzLCBzdGFydCA9IGMoMjAxMSwgMiksIGVuZCA9IGMoMjAxMSwgMikpCiMlIGluY3JlYXNlCjEwMCooMC4wMDg0LTAuMDA2MykvMC4wMDYzCgojIG9ic2VydmVkIHZhbHVlIG9uIE1hcmNoIDIwMTEgCnZhbEluY2kyMDExMDMgPC0gd2luZG93KGluY2lQQU5JQzQudHMsIHN0YXJ0ID0gYygyMDExLCAzKSwgZW5kID0gYygyMDExLCAzKSkKIyBwcmVkaWN0ZWQgdmFsdWUgb24gTWFyY2ggMjAxMQp2YWxJbmNpMjAxMTAzZmMgPC0gd2luZG93KGZjMGluY2k0LnRzLCBzdGFydCA9IGMoMjAxMSwgMyksIGVuZCA9IGMoMjAxMSwgMykpCiMlIGluY3JlYXNlCjEwMCooMC4wMTgtMC4wMDcwKS8wLjAwNzAKCiMgZm9yIGNvbXBhcmlzb24gd2l0aCBPQ0QsIHZhbHVlcyBvZiBPQ0Qgd2VyZSBleGFtaW5lZC4gCmluY2lPQ0Q0LnRzCgoKIyBiZWxvd3Mgc2VlbSBub3QgdG8gYmUgdXNlZCBpbiB0aGUgbWFudXNjcmlwdDogZnJvbSB0aGUgcmV2aWV3IGF0IDIwMjMxMjE5IAptZWFuKHdpbmRvdyhpbmNpUEFOSUM0LnRzLCBlbmQ9YygyMDEwLDEyKSkpCnNkKHdpbmRvdyhpbmNpUEFOSUM0LnRzLCBlbmQ9YygyMDEwLDEyKSkpCgojIGFubnVhbCB2YWx1ZXMgCnZhbDIwMTAxMSA8LSB3aW5kb3coaW5jaVBBTklDLnRzLCBzdGFydCA9IGMoMjAxMCwgMTEpLCBlbmQgPSBjKDIwMTAsIDExKSkKYXMubnVtZXJpYyh2YWwyMDEwMTEpCnZhbDIwMTEwMSA8LSB3aW5kb3coaW5jaVBBTklDNC50cywgc3RhcnQgPSBjKDIwMTEsIDEpLCBlbmQgPSBjKDIwMTEsIDEpKQphcy5udW1lcmljKHZhbDIwMTEwMSkKdmFsMjAxMTAyIDwtIHdpbmRvdyhpbmNpUEFOSUMudHMsIHN0YXJ0ID0gYygyMDExLCAyKSwgZW5kID0gYygyMDExLCAyKSkKYXMubnVtZXJpYyh2YWwyMDExMDIpCgojIGluY3JlYXNlIGZyb20gTm92IDIwMTAgdG8gRGVjIDIwMTAgaW4gcGVyY2VudAp2YWwyMDEwMTIgPC0gd2luZG93KGluY2lQQU5JQy50cywgc3RhcnQgPSBjKDIwMTAsIDEyKSwgZW5kID0gYygyMDEwLCAxMikpCmFzLm51bWVyaWModmFsMjAxMDEyKS9hcy5udW1lcmljKHZhbDIwMTAxMSkqMTAwCgojIGluY3JlYXNlIGZyb20gRGVjIDIwMTAgdG8gSmFuIDIwMTEgaW4gcGVyY2VudAphcy5udW1lcmljKHZhbDIwMTEwMSkvYXMubnVtZXJpYyh2YWwyMDEwMTIpKjEwMAoKIyBpbmNyZWFzZSBmcm9tIERlYyAyMDEwIHRvIEZlYiAyMDExIGluIHBlcmNlbnQKYXMubnVtZXJpYyh2YWwyMDExMDIpL2FzLm51bWVyaWModmFsMjAxMDEyKSoxMDAKCiMgaW5jcmVhc2UgZnJvbSBEZWMgMjAxMCB0byBtYXJjaCAyMDExIGluIHBlcmNlbnQKdmFsMjAxMTAzIDwtIHdpbmRvdyhpbmNpUEFOSUMudHMsIHN0YXJ0ID0gYygyMDExLCAzKSwgZW5kID0gYygyMDExLCAzKSkKYXMubnVtZXJpYyh2YWwyMDExMDMpL2FzLm51bWVyaWModmFsMjAxMDEyKSoxMDAKCmFzLm51bWVyaWModmFsMjAxMTAxKS9hcy5udW1lcmljKHZhbDIwMTAxMikqMTAwCgojIGluY3JlYXNlIGZyb20gRGVjIDIwMTAgdG8gQXByaWwgMjAxMSBpbiBwZXJjZW50CnZhbDIwMTEwNCA8LSB3aW5kb3coaW5jaVBBTklDLnRzLCBzdGFydCA9IGMoMjAxMSwgNCksIGVuZCA9IGMoMjAxMSwgNCkpCmFzLm51bWVyaWModmFsMjAxMTA0KS9hcy5udW1lcmljKHZhbDIwMTAxMikqMTAwCgojIHllYXJseSBpbmNpZGVuY2Ugb2YgMjAyMQp2YWwyMDIxIDwtIHdpbmRvdyhpbmNpUEFOSUM0LnRzLCBzdGFydCA9IGMoMjAyMSwgMSksIGVuZCA9IGMoMjAyMSwgMTIpKQpzdW0odmFsMjAyMSkKCiMgeWVhcmx5IGluY2lkZW5jZSBvZiAyMDEwCnZhbDIwMTAgPC0gd2luZG93KGluY2lQQU5JQy50cywgc3RhcnQgPSBjKDIwMTAsIDEpLCBlbmQgPSBjKDIwMTAsIDEyKSkKc3VtKHZhbDIwMTApCgojIHllYXJseSBpbmNpZGVuY2Ugb2YgMjAwNAp2YWwyMDA0IDwtIHdpbmRvdyhpbmNpUEFOSUMudHMsIHN0YXJ0ID0gYygyMDA0LCAxKSwgZW5kID0gYygyMDA0LCAxMikpCnN1bSh2YWwyMDA0KQoKIyBpbmNyZWFzIGZyb20gMjAwNCB0byAyMDIxCjAuNjEvMC4wNTMqMTAwCgoKIyBudW1iZXIgb2YgcGF0aWVudHMgaW4gMjAxMApudW1JbmNpUEFOSUMudHM9dHMoRFRQQU5JQyRpbmNpTjQsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkpCm51bUluY2lQQU5JQzIwMTA9d2luZG93KG51bUluY2lQQU5JQy50cywgc3RhcnQgPSBjKDIwMTAsIDEpLCBlbmQgPSBjKDIwMTAsIDEyKSkKc3VtKG51bUluY2lQQU5JQzIwMTApCgojIG51bWJlciBvZiBwYXRpZW50cyBpbiAyMDIxCm51bUluY2lQQU5JQzIwMjE9d2luZG93KG51bUluY2lQQU5JQy50cywgc3RhcnQgPSBjKDIwMjEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkKc3VtKG51bUluY2lQQU5JQzIwMjEpCgoKIyBmb3JlY2FzdGVkIApmdmFsMjAxMTAxPSB3aW5kb3coaW5jaWZjNC50cywgc3RhcnQgPSBjKDIwMTEsIDEpLCBlbmQgPSBjKDIwMTEsIDEpKSAKZnZhbDIwMTEwMj0gd2luZG93KGluY2lmYzQudHMsIHN0YXJ0ID0gYygyMDExLCAyKSwgZW5kID0gYygyMDExLCAyKSkgCmZ2YWwyMDExMDM9IHdpbmRvdyhpbmNpZmM0LnRzLCBzdGFydCA9IGMoMjAxMSwgMyksIGVuZCA9IGMoMjAxMSwgMykpIApmdmFsMjAxMTA0PSB3aW5kb3coaW5jaWZjNC50cywgc3RhcnQgPSBjKDIwMTEsIDQpLCBlbmQgPSBjKDIwMTEsIDQpKSAKCmZ2YWwyMDIxPSBzdW0od2luZG93KGluY2lmYzQudHMsIHN0YXJ0ID0gYygyMDIxLCAxKSwgZW5kID0gYygyMDIxLCAxMikpKQp2YWwyMDIxID1zdW0odmFsMjAyMSkKKGFzLm51bWVyaWModmFsMjAxMTAxKS1hcy5udW1lcmljKGZ2YWwyMDExMDEpKS9hcy5udW1lcmljKGZ2YWwyMDExMDEpKjEwMAooYXMubnVtZXJpYyh2YWwyMDExMDIpLWFzLm51bWVyaWMoZnZhbDIwMTEwMikpL2FzLm51bWVyaWMoZnZhbDIwMTEwMikqMTAwCihhcy5udW1lcmljKHZhbDIwMTEwMyktYXMubnVtZXJpYyhmdmFsMjAxMTAzKSkvYXMubnVtZXJpYyhmdmFsMjAxMTAzKSoxMDAKCihhcy5udW1lcmljKHZhbDIwMjEpLWFzLm51bWVyaWMoZnZhbDIwMjEpKS9hcy5udW1lcmljKGZ2YWwyMDIxKSoxMDAKCiMgaW5jcmVhc2UgZnJvbSBEZWMgMjAxMCB0byBKYW4gMjAxMSBpbiBPQ0QgcGVyY2VudAp2YWxPQ0QyMDEwMTIgPC0gd2luZG93KGluY2lPQ0QudHMsIHN0YXJ0ID0gYygyMDEwLCAxMiksIGVuZCA9IGMoMjAxMCwgMTIpKQp2YWxPQ0QyMDExMDEgPC0gd2luZG93KGluY2lPQ0QudHMsIHN0YXJ0ID0gYygyMDExLCAxKSwgZW5kID0gYygyMDExLCAxKSkKYXMubnVtZXJpYyh2YWxPQ0QyMDEwMTIpCmFzLm51bWVyaWModmFsT0NEMjAxMTAxKQoKIyBudW1iZXIgb2YgT0NEIHBhdGllbnRzIGluIDIwMTAKbnVtSW5jaU9DRC50cz10cyhEVE9DRCRpbmNpTjQsZnJlcXVlbmN5PTEyLCBzdGFydD1jKDIwMDQsMSkpCm51bUluY2lPQ0QyMDEwPXdpbmRvdyhudW1JbmNpT0NELnRzLCBzdGFydCA9IGMoMjAxMCwgMSksIGVuZCA9IGMoMjAxMCwgMTIpKQpzdW0obnVtSW5jaU9DRDIwMTApCgojIG51bWJlciBvZiBPQ0QgcGF0aWVudHMgaW4gMjAxMQpudW1JbmNpT0NEMjAxMT13aW5kb3cobnVtSW5jaU9DRC50cywgc3RhcnQgPSBjKDIwMTEsIDEpLCBlbmQgPSBjKDIwMTEsIDEyKSkKc3VtKG51bUluY2lPQ0QyMDExKQoKIyBudW1iZXIgb2YgT0NEIHBhdGllbnRzIGluIDIwMTIKbnVtSW5jaU9DRDIwMTI9d2luZG93KG51bUluY2lPQ0QudHMsIHN0YXJ0ID0gYygyMDEyLCAxKSwgZW5kID0gYygyMDEyLCAxMikpCnN1bShudW1JbmNpT0NEMjAxMikKCiMgbnVtYmVyIG9mIE9DRCBwYXRpZW50cyBpbiAyMDEzCm51bUluY2lPQ0QyMDEzPXdpbmRvdyhudW1JbmNpT0NELnRzLCBzdGFydCA9IGMoMjAxMywgMSksIGVuZCA9IGMoMjAxMywgMTIpKQpzdW0obnVtSW5jaU9DRDIwMTMpCgojIG51bWJlciBvZiBPQ0QgcGF0aWVudHMgaW4gMjAxNApudW1JbmNpT0NEMjAxND13aW5kb3cobnVtSW5jaU9DRC50cywgc3RhcnQgPSBjKDIwMTQsIDEpLCBlbmQgPSBjKDIwMTQsIDEyKSkKc3VtKG51bUluY2lPQ0QyMDE0KQoKIyBudW1iZXIgb2YgT0NEIHBhdGllbnRzIGluIDIwMTUKbnVtSW5jaU9DRDIwMTU9d2luZG93KG51bUluY2lPQ0QudHMsIHN0YXJ0ID0gYygyMDE1LCAxKSwgZW5kID0gYygyMDE1LCAxMikpCnN1bShudW1JbmNpT0NEMjAxNSkKCgojIG51bWJlciBvZiBPQ0QgcGF0aWVudHMgaW4gMjAyMQpudW1JbmNpT0NEMjAyMT13aW5kb3cobnVtSW5jaU9DRC50cywgc3RhcnQgPSBjKDIwMjEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkKc3VtKG51bUluY2lPQ0QyMDIxKQoKCiMgeWVhcmx5IGluY2lkZW5jZSBvZiBPQ0QgaW4gMjAyMQp2YWxPQ0QuMjAyMSA8LSB3aW5kb3coaW5jaU9DRDQudHMsIHN0YXJ0ID0gYygyMDIxLCAxKSwgZW5kID0gYygyMDIxLCAxMikpCnN1bSh2YWxPQ0QuMjAyMSkKCiMgeWVhcmx5IGluY2lkZW5jZSBvZiAyMDEwCnZhbE9DRC4yMDEwIDwtIHdpbmRvdyhpbmNpT0NELnRzLCBzdGFydCA9IGMoMjAxMCwgMSksIGVuZCA9IGMoMjAxMCwgMTIpKQpzdW0odmFsT0NELjIwMTApCgojIHllYXJseSBpbmNpZGVuY2Ugb2YgMjAKdmFsT0NELjIwMDQgPC0gd2luZG93KGluY2lPQ0QudHMsIHN0YXJ0ID0gYygyMDA0LCAxKSwgZW5kID0gYygyMDA0LCAxMikpCnN1bSh2YWxPQ0QuMjAwNCkKYGBgCgoKIyBtYWtpbmcgYW5udWFsIGluY2lkZW5jZSBhbmQgcHJldmFsZW5jZSB0YWJsZS4gCmBgYHtyfQppbmNpT0NEIDwtIGxpc3QoaW5jaU9DRDEudHMsIGluY2lPQ0QyLnRzLGluY2lPQ0QzLnRzLCBpbmNpT0NENC50cyApOwpwcmV2T0NEIDwtIGxpc3QocHJldk9DRDEudHMsIHByZXZPQ0QyLnRzLCBwcmV2T0NEMy50cywgcHJldk9DRDQudHMgKTsKaW5jaVBBTklDIDwtIGxpc3QoaW5jaVBBTklDMS50cywgaW5jaVBBTklDMi50cyxpbmNpUEFOSUMzLnRzLCBpbmNpUEFOSUM0LnRzICk7CnByZXZQQU5JQyA8LSBsaXN0KHByZXZQQU5JQzEudHMsIHByZXZQQU5JQzIudHMscHJldlBBTklDMy50cywgcHJldlBBTklDNC50cyApOwp5ZWFycyA9IDIwMDQ6MjAyMTsKCmluY2lPQ0RUYWJsZT1tYXRyaXgobnJvdz0xOCxuY29sPTQpOwoKZm9yIChkIGluIDE6NCkgIHsKIGZvciAoeWVhciBpbiAxOjE4KSB7CiAgCiAgeWVhcldpbmRvdz13aW5kb3coaW5jaU9DRFtbZF1dLCBzdGFydCA9IGMoeWVhcnNbeWVhcl0sIDEpLCBlbmQgPSBjKHllYXJzW3llYXJdLCAxMikpCiAgaW5jaU9DRFRhYmxlW3llYXIsZF0gPSBzdW0oeWVhcldpbmRvdyk7Cn0KfQoKcHJldk9DRFRhYmxlPW1hdHJpeChucm93PTE4LG5jb2w9NCk7Cgpmb3IgKGQgaW4gMTo0KSAgewogZm9yICh5ZWFyIGluIDE6MTgpIHsKICAKICB5ZWFyV2luZG93PXdpbmRvdyhwcmV2T0NEW1tkXV0sIHN0YXJ0ID0gYyh5ZWFyc1t5ZWFyXSwgMSksIGVuZCA9IGMoeWVhcnNbeWVhcl0sIDEyKSkKICBwcmV2T0NEVGFibGVbeWVhcixkXSA9IHN1bSh5ZWFyV2luZG93KTsKfQp9CgppbmNpUEFOSUNUYWJsZT1tYXRyaXgobnJvdz0xOCxuY29sPTQpOwoKZm9yIChkIGluIDE6NCkgIHsKIGZvciAoeWVhciBpbiAxOjE4KSB7CiAgCiAgeWVhcldpbmRvdz13aW5kb3coaW5jaVBBTklDW1tkXV0sIHN0YXJ0ID0gYyh5ZWFyc1t5ZWFyXSwgMSksIGVuZCA9IGMoeWVhcnNbeWVhcl0sIDEyKSkKICBpbmNpUEFOSUNUYWJsZVt5ZWFyLGRdID0gc3VtKHllYXJXaW5kb3cpOwp9Cn0KCnByZXZQQU5JQ1RhYmxlPW1hdHJpeChucm93PTE4LG5jb2w9NCk7Cgpmb3IgKGQgaW4gMTo0KSAgewogZm9yICh5ZWFyIGluIDE6MTgpIHsKICAKICB5ZWFyV2luZG93PXdpbmRvdyhwcmV2UEFOSUNbW2RdXSwgc3RhcnQgPSBjKHllYXJzW3llYXJdLCAxKSwgZW5kID0gYyh5ZWFyc1t5ZWFyXSwgMTIpKQogIHByZXZQQU5JQ1RhYmxlW3llYXIsZF0gPSBzdW0oeWVhcldpbmRvdyk7Cn0KfQoKaW5jaU9DRFRhYmxlPWRhdGEuZnJhbWUoaW5jaU9DRFRhYmxlKQpjb2xuYW1lcyhpbmNpT0NEVGFibGUpID0gYygnUHJpbWFyeSBEeCBvbmx5JywgJ34gU2Vjb25kYXJ5IER4JywnfiBUZXJ0aWFyeSBEeCcsICd+IFF1YXRlcm5hcnkgRHgnKTsKcm93Lm5hbWVzKGluY2lPQ0RUYWJsZSkgPSAyMDA0OjIwMjEKCnByZXZPQ0RUYWJsZT1kYXRhLmZyYW1lKHByZXZPQ0RUYWJsZSkKY29sbmFtZXMocHJldk9DRFRhYmxlKSA9IGMoJ1ByaW1hcnkgRHggb25seScsICd+IFNlY29uZGFyeSBEeCcsJ34gVGVydGlhcnkgRHgnLCAnfiBRdWF0ZXJuYXJ5IER4Jyk7CnJvdy5uYW1lcyhwcmV2T0NEVGFibGUpID0gMjAwNDoyMDIxCgppbmNpUEFOSUNUYWJsZT1kYXRhLmZyYW1lKGluY2lQQU5JQ1RhYmxlKQpjb2xuYW1lcyhpbmNpUEFOSUNUYWJsZSkgPSBjKCdQcmltYXJ5IER4IG9ubHknLCAnfiBTZWNvbmRhcnkgRHgnLCd+IFRlcnRpYXJ5IER4JywgJ34gUXVhdGVybmFyeSBEeCcpOwpyb3cubmFtZXMoaW5jaVBBTklDVGFibGUpID0gMjAwNDoyMDIxCgpwcmV2UEFOSUNUYWJsZT1kYXRhLmZyYW1lKHByZXZQQU5JQ1RhYmxlKQpjb2xuYW1lcyhwcmV2UEFOSUNUYWJsZSkgPSBjKCdQcmltYXJ5IER4IG9ubHknLCAnfiBTZWNvbmRhcnkgRHgnLCd+IFRlcnRpYXJ5IER4JywgJ34gUXVhdGVybmFyeSBEeCcpOwpyb3cubmFtZXMocHJldlBBTklDVGFibGUpID0gMjAwNDoyMDIxCgppbnN0YWxsLnBhY2thZ2VzKCJmbGV4dGFibGUiKQpsaWJyYXJ5KGZsZXh0YWJsZSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWJibGUpCmluY2lQQU5JQ2Z0ID0gZmxleHRhYmxlKGluY2lQQU5JQ1RhYmxlICU+JSByb3duYW1lc190b19jb2x1bW4oIlllYXIiKSkgCmluY2lQQU5JQ2Z0IDwtIGNvbGZvcm1hdF9kb3VibGUoCiAgeCA9IGluY2lQQU5JQ2Z0LAogIGJpZy5tYXJrID0gIiwiLCBkaWdpdHMgPSAzLCBuYV9zdHIgPSAiTi9BIgopCmluY2lQQU5JQ2Z0ID0gYXV0b2ZpdChpbmNpUEFOSUNmdCkKaW5jaVBBTklDZnQgPC0gdGhlbWVfdmFuaWxsYShpbmNpUEFOSUNmdCkKaW5jaVBBTklDZnQgPC0gc2V0X2NhcHRpb24oaW5jaVBBTklDZnQsIGNhcHRpb24gPSAiQW5udWFsIEluY2lkZW5jZSBvZiBQYW5pYyBEaXNvcmRlciAoJSkiKQoKcHJldlBBTklDZnQgPSBmbGV4dGFibGUocHJldlBBTklDVGFibGUgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigiWWVhciIpKSAKcHJldlBBTklDZnQgPC0gY29sZm9ybWF0X2RvdWJsZSgKICB4ID0gcHJldlBBTklDZnQsCiAgYmlnLm1hcmsgPSAiLCIsIGRpZ2l0cyA9IDMsIG5hX3N0ciA9ICJOL0EiCikKcHJldlBBTklDZnQgPSBhdXRvZml0KHByZXZQQU5JQ2Z0KQpwcmV2UEFOSUNmdCA8LSB0aGVtZV92YW5pbGxhKHByZXZQQU5JQ2Z0KQpwcmV2UEFOSUNmdCA8LSBzZXRfY2FwdGlvbihwcmV2UEFOSUNmdCwgY2FwdGlvbiA9ICJBbm51YWwgUHJldmFsZW5jZSBvZiBQYW5pYyBEaXNvcmRlciAoJSkiKQoKaW5jaU9DRGZ0ID0gZmxleHRhYmxlKGluY2lPQ0RUYWJsZSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJZZWFyIikpIAppbmNpT0NEZnQgPC0gY29sZm9ybWF0X2RvdWJsZSgKICB4ID0gaW5jaU9DRGZ0LAogIGJpZy5tYXJrID0gIiwiLCBkaWdpdHMgPSAzLCBuYV9zdHIgPSAiTi9BIgopCmluY2lPQ0RmdCA9IGF1dG9maXQoaW5jaU9DRGZ0KQppbmNpT0NEZnQgPC0gdGhlbWVfdmFuaWxsYShpbmNpT0NEZnQpCmluY2lPQ0RmdCA8LSBzZXRfY2FwdGlvbihpbmNpT0NEZnQsIGNhcHRpb24gPSAiQW5udWFsIFByZXZhbGVuY2Ugb2YgT0NEICglKSIpCgpwcmV2T0NEZnQgPSBmbGV4dGFibGUocHJldk9DRFRhYmxlICU+JSByb3duYW1lc190b19jb2x1bW4oIlllYXIiKSkgCnByZXZPQ0RmdCA8LSBjb2xmb3JtYXRfZG91YmxlKAogIHggPSBwcmV2T0NEZnQsCiAgYmlnLm1hcmsgPSAiLCIsIGRpZ2l0cyA9IDMsIG5hX3N0ciA9ICJOL0EiCikKcHJldk9DRGZ0ID0gYXV0b2ZpdChwcmV2T0NEZnQpCnByZXZPQ0RmdCA8LSB0aGVtZV92YW5pbGxhKHByZXZPQ0RmdCkKcHJldk9DRGZ0IDwtIHNldF9jYXB0aW9uKHByZXZPQ0RmdCwgY2FwdGlvbiA9ICJBbm51YWwgUHJldmFsZW5jZSBvZiBPQ0QgKCUpIikKCmxpYnJhcnkob2ZmaWNlcikKc2F2ZV9hc19kb2N4KGluY2lQQU5JQ2Z0LCBwcmV2UEFOSUNmdCwgaW5jaU9DRGZ0LCBwcmV2T0NEZnQsICBwYXRoID0gIlBhbmljVGFibGVTdXBwbDFWMi5kb2N4IikKCmBgYAoKCgojIGNhbGN1bGF0aW5nIG1lYW4gYW5kIHNkIG9mIGFubnVhbCBpbmNpZGVuY2UgYW5kIHByZXZhbGVuY2UgYmVmb3JlIDIwMTEgCmBgYHtyfQojIDIwMDQgMjAwNSAyMDA2IDIwMDcgMjAwOCAyMDA5IDIwMTAgLSB0b3RhbCA3IHllYXJzCm1lYW4oaW5jaVBBTklDVGFibGUkYH4gUXVhdGVybmFyeSBEeGBbMTo3XSkKc2QoaW5jaVBBTklDVGFibGUkYH4gUXVhdGVybmFyeSBEeGBbMTo3XSkKCjEwMCooMC42MS0wLjA2NSkvMC4wNjUgCgptZWFuKHByZXZQQU5JQ1RhYmxlJGB+IFF1YXRlcm5hcnkgRHhgWzE6N10pCnNkKHByZXZQQU5JQ1RhYmxlJGB+IFF1YXRlcm5hcnkgRHhgWzE6N10pCgojIGNhbGN1bGF0aW5nIGFubnVhbCBwcmV2YWxlbmNlIGNoYW5nZSBmcm9tIDIwMTAgdG8gMjAxMSwgMjAxMiwyMDEzCigxLjIwLTAuNzQpKjEwMC8wLjc0CigxLjg1LTAuNzQpKjEwMC8wLjc0CgpgYGAKCiMgbWFraW5nIHRhYmxlIHNob3dpbmcKIyB0aGUgaW1wYWN0IG9mIHRoZSBkaXNjbG9zdXJlIG9uIHByZXZhbGVuY2UgYWNjb3JkaW5nIHRvIHRoZSBmb3JlY2FzdGluZwpgYGB7cn0KIyBtYWtlIGEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIG1vbnRobHkgb2JzZXJ2ZWQgaW5jaWRlbmNlIGFuZCBwcmVkaWN0ZWQgaW5jaWRlbmNlLCB0aGUgZGlmZmVyZW5jZSBhbmQgaXRzIHBlcmNlbnRhZ2Ugd2l0aCBjb25maWRlbmNlIGludGVydmFsLiAKCnBlZGljdE1vbnRobHlEaWZmID0gZnVuY3Rpb24oZmlyc3RUcywgZm9yZWNhc3RlZCwgeWVhck1vbnRoKSB7CiAgb2JzZXJ2ZWQgPSB3aW5kb3coZmlyc3RUcywgc3RhcnQgPSB5ZWFyTW9udGgsIGVuZCA9IHllYXJNb250aCkKICBmb3JlY2FzdGVkLnRzIDwtIHRzKGFzLm51bWVyaWMoZm9yZWNhc3RlZCRtZWFuKSwgc3RhcnQ9YygyMDExLDEpLCBmcmVxdWVuY3k9MTIpCiAgZm9yZWNhc3RlZDk3TG93LnRzIDwtIHRzKGFzLm51bWVyaWMoZm9yZWNhc3RlZCRsb3dlclssMl0pLCBzdGFydD1jKDIwMTEsMSksIGZyZXF1ZW5jeT0xMikKICBmb3JlY2FzdGVkOTdIaWdoLnRzIDwtIHRzKGFzLm51bWVyaWMoZm9yZWNhc3RlZCR1cHBlclssMl0pLCBzdGFydD1jKDIwMTEsMSksIGZyZXF1ZW5jeT0xMikKICAKICBwcmVkaWN0ZWQgPSB3aW5kb3coZm9yZWNhc3RlZC50cywgc3RhcnQgPSB5ZWFyTW9udGgsIGVuZCA9IHllYXJNb250aCkKICBwZXJjZW50ID0gMTAwKiAob2JzZXJ2ZWQgLSBwcmVkaWN0ZWQpIC8gcHJlZGljdGVkCiAgCiAgbG93OTUgPC0gd2luZG93KGZvcmVjYXN0ZWQ5N0xvdy50cywgc3RhcnQgPSB5ZWFyTW9udGgsIGVuZCA9IHllYXJNb250aCkKICBoaWdoOTUgPC0gd2luZG93KGZvcmVjYXN0ZWQ5N0hpZ2gudHMsIHN0YXJ0ID0geWVhck1vbnRoLCBlbmQgPSB5ZWFyTW9udGgpCiAgCiAgbXlfbGlzdCA8LSBsaXN0KCJvYnNlcnZlZCIgPSBvYnNlcnZlZCwgInByZWRpY3RlZCIgPSBwcmVkaWN0ZWQsICJwZXJjZW50Ij0gcGVyY2VudCwgImxvdzk1IiA9IGxvdzk1LCAiaGlnaDk1IiA9IGhpZ2g5NSkKICByZXR1cm4obXlfbGlzdCkgCiAgCn0KCiMgeWVhcmx5IHByZXZhbGVuY2Ugb2YgMjAyMQp2YWxQcmV2MjAyMSA8LSB3aW5kb3cocHJldlBBTklDNC50cywgc3RhcnQgPSBjKDIwMjEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkKc3VtKHZhbFByZXYyMDIxKQoKIyB5ZWFybHkgcHJldmFsZW5jZSBvZiAyMDEwCnZhbFByZXYyMDEwIDwtIHdpbmRvdyhwcmV2UEFOSUMudHMsIHN0YXJ0ID0gYygyMDEwLCAxKSwgZW5kID0gYygyMDEwLCAxMikpCnN1bSh2YWxQcmV2MjAxMCkKCiMgeWVhcmx5IHByZXZhbGVuY2Ugb2YgMjAwNgp2YWxQcmV2MjAwNiA8LSB3aW5kb3cocHJldlBBTklDLnRzLCBzdGFydCA9IGMoMjAwNiwgMSksIGVuZCA9IGMoMjAwNiwgMTIpKQpzdW0odmFsUHJldjIwMDYpCgojIHllYXJseSBwcmV2YWxlbmNlIG9mIDIwMDcKdmFsUHJldjIwMDcgPC0gd2luZG93KHByZXZQQU5JQy50cywgc3RhcnQgPSBjKDIwMDcsIDEpLCBlbmQgPSBjKDIwMDcsIDEyKSkKc3VtKHZhbFByZXYyMDA3KQoKCiMgeWVhcmx5IHByZXZhbGVuY2Ugb2YgMjAwNwp2YWxQcmV2MjAxMSA8LSB3aW5kb3cocHJldlBBTklDLnRzLCBzdGFydCA9IGMoMjAxMSwgMSksIGVuZCA9IGMoMjAxMSwgMTIpKQpzdW0odmFsUHJldjIwMTEpCgoKCjAuNzQvMC4zNioxMDAKCiMgeWVhcmx5IHByZXZhbGVuY2Ugb2YgMjAwNAp2YWxQcmV2MjAwNCA8LSB3aW5kb3cocHJldlBBTklDLnRzLCBzdGFydCA9IGMoMjAwNCwgMSksIGVuZCA9IGMoMjAwNCwgMTIpKQpzdW0odmFsUHJldjIwMDQpCgo3LjUzLzAuMzYqMTAwCgojIHllYXJseSBmb3JlY2FzdGVkIGluY2lkZW5jZSBvZiAyMDIxCnZhbFByZXZGb3JlY2FzdGVkMjAyMSA8LSB3aW5kb3coZmNQcmV2MS50cywgc3RhcnQgPSBjKDIwMjEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkKc3VtKHZhbFByZXZGb3JlY2FzdGVkMjAyMSkKCgoKIyA5NSUgQ0kKZmMxUHJldjk3TG93LnRzIDwtIHRzKGFzLm51bWVyaWMoZmNQcmV2MSRsb3dlclssMl0pLCBzdGFydD1jKDIwMTEsMSksIGZyZXF1ZW5jeT0xMikKZmMxUHJldjk3SGlnaC50cyA8LSB0cyhhcy5udW1lcmljKGZjUHJldjEkdXBwZXJbLDJdKSwgc3RhcnQ9YygyMDExLDEpLCBmcmVxdWVuY3k9MTIpCnN1bSh2YWxQcmV2MjAyMWxvdykKc3VtKHZhbFByZXYyMDIxaGlnaCkKCmBgYAoKIyBjaGFuZ2UgcG9pbnQgYW5hbHlzaXMgCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJjaGFuZ2Vwb2ludCIpCmxpYnJhcnkoJ2NoYW5nZXBvaW50JykKYW5zbWVhbk9DRD1jcHQubWVhbihpbmNpT0NELnRzKTsKcGxvdChhbnNtZWFuT0NEKQphbnNtZWFuUEFOSUM9Y3B0Lm1lYW4oaW5jaVBBTklDLnRzKTsKcGxvdChhbnNtZWFuUEFOSUMpCgpwZGYoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL2luY2lQYW5pYzRDUEEucGRmIikKYW5zbWVhbnZhclBBTklDPWNwdC5tZWFudmFyKGluY2lQQU5JQy50cyk7CnBsb3QoYW5zbWVhbnZhclBBTklDKQpkZXYub2ZmKCkKCmFuc21lYW52YXJPQ0Q9Y3B0Lm1lYW52YXIoaW5jaU9DRC50cyk7CnBsb3QoYW5zbWVhbnZhck9DRCkKCmBgYAoKIyBwZWFrIGRldGVjdGlvbiAKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoJ2NhcmRpZGF0ZXMnKSAKbGlicmFyeSgnY2FyZGlkYXRlcycpCng9MToxNDsKeT13aW5kb3coZ29vZ2xlLnRzLCBzdGFydCA9IGMoMjAxMCwgMTIpLCBlbmQgPSBjKDIwMTIsIDEpKTsKcGVha3MgPC0gcGVha3dpbmRvdyh4LCB5KQpwZWFrcyRwZWFrcwoKYGBgCgpgYGB7cn0KIyBtb2RlbCAxIGlzIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcyByZXN1bHQgaXMgKDEgMCAwKSAsICgwLDAsMSkgCm1vZGVsT0NEIDwtIGF1dG8uYXJpbWEoaW5jaU9DRC50cywgc2Vhc29uYWw9VFJVRSwgeHJlZz10cmFuc2ZlckYsIG1heC5kPTMsIG1heC5EPTMsIHN0ZXB3aXNlPUZBTFNFLCB0cmFjZT1UUlVFKTsKIyBDaGVjayByZXNpZHVhbHMKY2hlY2tyZXNpZHVhbHMobW9kZWxPQ0QpCkJveC50ZXN0KG1vZGVsT0NEJHJlc2lkdWFscywgbGFnID0gMjQsIHR5cGUgPSAiTGp1bmctQm94IikKIyBFc3RpbWF0ZSBwYXJhbWV0ZXJzIGFuZCBjb25maWRlbmNlIGludGVydmFscwpzdW1tYXJ5KG1vZGVsT0NEKQpjb25maW50KG1vZGVsT0NEKQpjb2VmdGVzdChtb2RlbE9DRCkKYGBgCgojIHRoZSBpbXBhY3Qgb2YgdGhlIGRpc2Nsb3N1cmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JlY2FzdGluZwpgYGB7cn0KIyB5ZWFybHkgaW5jaWRlbmNlIG9mIDIwMjEKdmFsMjAyMSA8LSB3aW5kb3coaW5jaVBBTklDNC50cywgc3RhcnQgPSBjKDIwMjEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkKc3VtKHZhbDIwMjEpCgojIHllYXJseSBmb3JlY2FzdGVkIGluY2lkZW5jZSBvZiAyMDIxCnZhbEZvcmVjYXN0ZWQyMDIxIDwtIHdpbmRvdyhmYzEudHMsIHN0YXJ0ID0gYygyMDIxLCAxKSwgZW5kID0gYygyMDIxLCAxMikpCnN1bSh2YWxGb3JlY2FzdGVkMjAyMSkKIyA5NSUgQ0kKMC4wMDM2MyoxMgowLjAwNzE0KjEyCmBgYAoKIyBub3csIHByZXZhbGVuY2UgZGF0YQpgYGB7cn0KIyBtb2RlbCAxIGlzIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcyBmb3IgcHJldmFsZW5jZSByZXN1bHQgaXMgKDAgMSAxKSAsICgwLDAsMSlbMTJdIAptb2RlbFByZXYxIDwtIGF1dG8uYXJpbWEocHJldlBBTklDNC50cywgc2Vhc29uYWw9VFJVRSwgeHJlZz10cmFuc2ZlckYsIG1heC5kPTMsIG1heC5EPTMsIHN0ZXB3aXNlPUZBTFNFLCB0cmFjZT1UUlVFKTsKIyBDaGVjayByZXNpZHVhbHMKY2hlY2tyZXNpZHVhbHMobW9kZWxQcmV2MSkKQm94LnRlc3QobW9kZWxQcmV2MSRyZXNpZHVhbHMsIGxhZyA9IDI0LCB0eXBlID0gIkxqdW5nLUJveCIpCiMgRXN0aW1hdGUgcGFyYW1ldGVycyBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMKc3VtbWFyeShtb2RlbFByZXYxKQpjb25maW50KG1vZGVsUHJldjEpCmNvZWZ0ZXN0KG1vZGVsUHJldjEpCgoKbW9kZWxQcmV2MU9DRCA9IGF1dG8uYXJpbWEocHJldk9DRDQudHMsIHNlYXNvbmFsPVRSVUUsIHhyZWc9dHJhbnNmZXJGLCBtYXguZD0zLCBtYXguRD0zLCBzdGVwd2lzZT1GQUxTRSwgdHJhY2U9VFJVRSk7CnN1bW1hcnkobW9kZWxQcmV2MU9DRCkKY29lZnRlc3QobW9kZWxQcmV2MU9DRCkKCmBgYAoKCgoKYGBge3J9CiMgbW9kZWwgMSBpcyBmb3IgcHJlZGljdGlvbiB3aXRoIHdob2xlIHRpbWUgc2VyaWVzCmZtb2RlbFByZXYxIDwtIEFyaW1hKHdpbmRvdyhwcmV2UEFOSUMudHMsIGVuZD1jKDIwMTAsMTIpKSwgb3JkZXI9YygwLDEsMSksIHNlYXNvbmFsPWxpc3Qob3JkZXI9YygwLDAsMSksIHBlcmlvZD0xMikpCmZjUHJldjEgPC0gZm9yZWNhc3QoZm1vZGVsUHJldjEsIGg9KDIxNi1tb250aENoYSkpCmZjUHJldjEudHMgPC0gdHMoYXMubnVtZXJpYyhmY1ByZXYxJG1lYW4pLCBzdGFydD1jKDIwMTEsMSksIGZyZXF1ZW5jeT0xMikKcHJldlBBTklDLnRzLjEgPC0gdHMudW5pb24ocHJldlBBTklDLnRzLCBmY1ByZXYxLnRzKQpgYGAKCmBgYHtyfQpwZGYoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL3ByZXZQYW5pY1ByZWRpY3Rpb24yMDA0MjAyMS5wZGYiKQpwbG90KHByZXZQQU5JQy50cy4xLCB0eXBlPSJsIiwgcGxvdC50eXBlPSJzIiwgY29sPWMoJ2JsdWUnLCdkZWVwc2t5Ymx1ZScpLCB4bGFiPSJNb250aCIsIHlsYWI9Ik5ldyBQYW5pYyBQYXQuIE4iLCBsaW5ldHlwZT1jKCJzb2xpZCIsImRhc2hlZCIpLCB5bGltPWMoMCxtYXgocHJldlBBTklDLnRzKSkpCiMgYWRkIGNvbmZpZGVuY2UgaW50ZXJ2YWwKdG1wIDwtIHNlcShmcm9tID0gMjAxMSwgdG8gPTIwMjEuOTksIGJ5ID0gMS8xMikKIyBiZWxvdyBpcyBkcmF3aW5nIHBvbHlnb24gc3VwcGx5aW5nIG91dGxpbmUgeCx5IGNvb3JkaW5hdGVzCnBvbHlnb24oYyh0bXAscmV2KHRtcCkpLGMoZmNQcmV2MSRsb3dlclssMl0scmV2KGZjUHJldjEkdXBwZXJbLDJdKSksIGNvbD1yZ2IoMCwgMC43NSwgMSwwLjEpLCBib3JkZXIgPSBGQUxTRSkKYWJsaW5lKHY9YygyMDA0Kyh3aGljaChkYXRhJGdvb2dDaGEgPT0gMTAwKS0xKS8xMjAqMTAsMjAwNCsod2hpY2goZGF0YSRnb29nS2ltID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0xlZSA9PSAxMDApLTEpLzEyMCoxMCksIGNvbD0iZ3JheSIsIGx0eT0iZGFzaGVkIiwgbHdkPTIpCmxpbmVzKGZpdHRlZChtb2RlbFByZXYxKSxjb2w9InJlZCIsbHdkPTEsIGx0eT0iZG90dGVkIikKZGV2Lm9mZigpCmBgYAoKYGBge3J9CiMgOTUgQ0kgIG9mIHByZXZhbGVuY2UgZGF0YQpmYzFQcmV2OTdMb3cudHMgPC0gdHMoYXMubnVtZXJpYyhmY1ByZXYxJGxvd2VyWywyXSksIHN0YXJ0PWMoMjAxMSwxKSwgZnJlcXVlbmN5PTEyKQpmYzFQcmV2OTdIaWdoLnRzIDwtIHRzKGFzLm51bWVyaWMoZmNQcmV2MSR1cHBlclssMl0pLCBzdGFydD1jKDIwMTEsMSksIGZyZXF1ZW5jeT0xMikKdmFsUHJldjIwMjFsb3cgPC0gd2luZG93KGZjMVByZXY5N0xvdy50cywgc3RhcnQgPSBjKDIwMjEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkKdmFsUHJldjIwMjFoaWdoIDwtIHdpbmRvdyhmYzFQcmV2OTdIaWdoLnRzLCBzdGFydCA9IGMoMjAyMSwgMSksIGVuZCA9IGMoMjAyMSwgMTIpKQpzdW0odmFsUHJldjIwMjFsb3cpCnN1bSh2YWxQcmV2MjAyMWhpZ2gpCgpgYGAKCgojIE9DRCBwcmV2YWxlbmNlIGdyYXBoIGZvciBjb21wYXJpc29uCmBgYHtyfQpwZGYoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL3ByZXZQQU5JQ09DRDIwMDQyMDIxLnBkZiIpCnByZXZQQU5JQ09DRC50cyA8LSB0cy51bmlvbihwcmV2UEFOSUMudHMsIHByZXZPQ0QudHMpCnBsb3QocHJldlBBTklDT0NELnRzLCB0eXBlPSJsIiwgcGxvdC50eXBlPSJzIiwgY29sPWMoJ2JsdWUnLCdyZWQnKSwgeGxhYj0iTW9udGgiLCB5bGFiPSJOZXcgUGFuaWMgUGF0LiBOIiwgbGluZXR5cGU9Yygic29saWQiLCJzb2xpZCIpLCB5bGltPWMoMCxtYXgocHJldlBBTklDLnRzKSkpCiMgYWRkIGNvbmZpZGVuY2UgaW50ZXJ2YWwKdG1wIDwtIHNlcShmcm9tID0gMjAxMSwgdG8gPTIwMjEuOTksIGJ5ID0gMS8xMikKIyBiZWxvdyBpcyBkcmF3aW5nIHBvbHlnb24gc3VwcGx5aW5nIG91dGxpbmUgeCx5IGNvb3JkaW5hdGVzCmFibGluZSh2PWMoMjAwNCsod2hpY2goZGF0YSRnb29nQ2hhID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0tpbSA9PSAxMDApLTEpLzEyMCoxMCwyMDA0Kyh3aGljaChkYXRhJGdvb2dMZWUgPT0gMTAwKS0xKS8xMjAqMTApLCBjb2w9ImdyYXkiLCBsdHk9ImRhc2hlZCIsIGx3ZD0yKQpkZXYub2ZmKCkKYGBgCjcuNTMKCiMgdGhlIGltcGFjdCBvZiB0aGUgZGlzY2xvc3VyZSBvbiBwcmV2YWxlbmNlIGFjY29yZGluZyB0byB0aGUgZm9yZWNhc3RpbmcKYGBge3J9CiMgeWVhcmx5IHByZXZhbGVuY2Ugb2YgMjAyMQp2YWxQcmV2MjAyMSA8LSB3aW5kb3cocHJldlBBTklDNC50cywgc3RhcnQgPSBjKDIwMjEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkKc3VtKHZhbFByZXYyMDIxKQoKIyB5ZWFybHkgcHJldmFsZW5jZSBvZiAyMDEwCnZhbFByZXYyMDEwIDwtIHdpbmRvdyhwcmV2UEFOSUMudHMsIHN0YXJ0ID0gYygyMDEwLCAxKSwgZW5kID0gYygyMDEwLCAxMikpCnN1bSh2YWxQcmV2MjAxMCkKCiMgeWVhcmx5IHByZXZhbGVuY2Ugb2YgMjAwNgp2YWxQcmV2MjAwNiA8LSB3aW5kb3cocHJldlBBTklDLnRzLCBzdGFydCA9IGMoMjAwNiwgMSksIGVuZCA9IGMoMjAwNiwgMTIpKQpzdW0odmFsUHJldjIwMDYpCgojIHllYXJseSBwcmV2YWxlbmNlIG9mIDIwMDcKdmFsUHJldjIwMDcgPC0gd2luZG93KHByZXZQQU5JQy50cywgc3RhcnQgPSBjKDIwMDcsIDEpLCBlbmQgPSBjKDIwMDcsIDEyKSkKc3VtKHZhbFByZXYyMDA3KQoKCiMgeWVhcmx5IHByZXZhbGVuY2Ugb2YgMjAwNwp2YWxQcmV2MjAxMSA8LSB3aW5kb3cocHJldlBBTklDLnRzLCBzdGFydCA9IGMoMjAxMSwgMSksIGVuZCA9IGMoMjAxMSwgMTIpKQpzdW0odmFsUHJldjIwMTEpCgoKCjAuNzQvMC4zNioxMDAKCiMgeWVhcmx5IHByZXZhbGVuY2Ugb2YgMjAwNAp2YWxQcmV2MjAwNCA8LSB3aW5kb3cocHJldlBBTklDLnRzLCBzdGFydCA9IGMoMjAwNCwgMSksIGVuZCA9IGMoMjAwNCwgMTIpKQpzdW0odmFsUHJldjIwMDQpL21lYW4oaGVhZChtVG90UG9wdWxhdGlvbiwxMikpKjEwMAoKNy41My8wLjM2KjEwMAoKIyB5ZWFybHkgZm9yZWNhc3RlZCBpbmNpZGVuY2Ugb2YgMjAyMQp2YWxQcmV2Rm9yZWNhc3RlZDIwMjEgPC0gd2luZG93KGZjUHJldjEudHMsIHN0YXJ0ID0gYygyMDIxLCAxKSwgZW5kID0gYygyMDIxLCAxMikpCnN1bSh2YWxQcmV2Rm9yZWNhc3RlZDIwMjEpCnN1bSh2YWxQcmV2Rm9yZWNhc3RlZDIwMjEpL21lYW4odGFpbChtVG90UG9wdWxhdGlvbiwxMikpKjEwMAoKIyA5NSUgQ0kKZmMxUHJldjk3TG93LnRzIDwtIHRzKGFzLm51bWVyaWMoZmNQcmV2MSRsb3dlclssMl0pLCBzdGFydD1jKDIwMTEsMSksIGZyZXF1ZW5jeT0xMikKZmMxUHJldjk3SGlnaC50cyA8LSB0cyhhcy5udW1lcmljKGZjUHJldjEkdXBwZXJbLDJdKSwgc3RhcnQ9YygyMDExLDEpLCBmcmVxdWVuY3k9MTIpCnN1bSh2YWxQcmV2MjAyMWxvdykKc3VtKHZhbFByZXYyMDIxaGlnaCkKCmBgYAojIGNobmFnZSBwb2ludCBhbmFseXNpcyBmb3IgcHJldmFsZW5jZQpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoImNoYW5nZXBvaW50IikKbGlicmFyeSgnY2hhbmdlcG9pbnQnKQoKYW5zbWVhbnZhclByZXZQQU5JQz1jcHQubWVhbnZhcihwcmV2UEFOSUMudHMpOwpwZGYoZmlsZT0ifi9Ecm9wYm94L2dpdExhYi9zdHVkeURlcHJlc3Npb25CaWdEYXRhL3ByZXZQYW5pYzRDUEEucGRmIikKcGxvdChhbnNtZWFudmFyUHJldlBBTklDKQpkZXYub2ZmKCkKYW5zbWVhbnZhclByZXZQQU5JQwoKYW5zbWVhbnZhclByZXZPQ0Q9Y3B0Lm1lYW52YXIocHJldk9DRC50cyk7CnBsb3QoYW5zbWVhbnZhclByZXZPQ0QpCgpgYGAKCiMgbm93LCBwcmV2YWxlbmNlIGRhdGEgb2YgT0NECmBgYHtyfQojIG1vZGVsIDEgaXMgZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzIGZvciBwcmV2YWxlbmNlIHJlc3VsdCBpcyAoMCAxIDEpICwgKDAsMCwxKVsxMl0gCm1vZGVsUHJldk9DRDEgPC0gYXV0by5hcmltYShwcmV2T0NELnRzLCBzZWFzb25hbD1UUlVFLCB4cmVnPXRyYW5zZmVyRiwgbWF4LmQ9MywgbWF4LkQ9Mywgc3RlcHdpc2U9RkFMU0UsIHRyYWNlPVRSVUUpOwojIENoZWNrIHJlc2lkdWFscwpjaGVja3Jlc2lkdWFscyhtb2RlbFByZXZPQ0QxKQpCb3gudGVzdChtb2RlbFByZXZPQ0QxJHJlc2lkdWFscywgbGFnID0gMjQsIHR5cGUgPSAiTGp1bmctQm94IikKIyBFc3RpbWF0ZSBwYXJhbWV0ZXJzIGFuZCBjb25maWRlbmNlIGludGVydmFscwpzdW1tYXJ5KG1vZGVsUHJldk9DRDEpCmNvbmZpbnQobW9kZWxQcmV2T0NEMSkKY29lZnRlc3QobW9kZWxQcmV2T0NEMSkKYGBgCmBgYHtyfQojIHllYXJseSBpbmNpZGVuY2Ugb2YgT0NEIGluIDIwMjEKdmFsUHJldk9DRDIwMjEgPC0gd2luZG93KHByZXZPQ0QudHMsIHN0YXJ0ID0gYygyMDIxLCAxKSwgZW5kID0gYygyMDIxLCAxMikpCnN1bSh2YWxQcmV2T0NEMjAyMSkKCiMgeWVhcmx5IGluY2lkZW5jZSBvZiAyMDA0CnZhbFByZXZPQ0QyMDA0IDwtIHdpbmRvdyhwcmV2T0NELnRzLCBzdGFydCA9IGMoMjAwNCwgMSksIGVuZCA9IGMoMjAwNCwgMTIpKQpzdW0odmFsUHJldk9DRDIwMDQpCgoxLzAuMzYqMTAwCgoKYGBgCgojIGNvcnJlbGF0aW9uIGJldHdlZW4gR29vZ2xlIHRyZW5kIGFuZCBpbmNpZGVuY2UKYGBge3J9CmxpYnJhcnkodHNlcmllcykKYWRmLnRlc3QoZ29vZ2xlLnRzLCBhbHRlcm5hdGl2ZSA9ICJzdGF0aW9uYXJ5IikgCmFkZi50ZXN0KGluY2lQQU5JQy50cywgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpIAphZGYudGVzdChwcmV2UEFOSUMudHMsIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKSAKCmFkZi50ZXN0KGRpZmYoaW5jaVBBTklDLnRzKSwgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpIAphZGYudGVzdChkaWZmKHByZXZQQU5JQy50cyksIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQoKCmNvci50ZXN0KGluY2lQQU5JQy50cywgZ29vZ2xlLnRzLCAgbWV0aG9kPSJrZW5kYWxsIikKY29yLnRlc3QoZGlmZihpbmNpUEFOSUMudHMpLCBnb29nbGUudHNbLTIxNl0sICBtZXRob2Q9InNwZWFybWFuIiwgZXhhY3Q9RkFMU0UpCmNvci50ZXN0KGRpZmYocHJldlBBTklDLnRzKSwgZ29vZ2xlLnRzWy0yMTZdLCAgbWV0aG9kPSJzcGVhcm1hbiIsIGV4YWN0PUZBTFNFKQoKZ3JhbmdlcnRlc3QoZGlmZihwcmV2UEFOSUMudHMpIH4gZ29vZ2xlLnRzWy0yMTZdLCBvcmRlcj00KQpncmFuZ2VydGVzdChnb29nbGUudHNbLTIxNl0gfiBkaWZmKHByZXZQQU5JQy50cyksIG9yZGVyPTQpCgoKZ3JhbmdlcnRlc3QoZGlmZihwcmV2UEFOSUMudHMpIH4gZ29vZ2xlLnRzWy0yMTZdLCBvcmRlcj0zKQpncmFuZ2VydGVzdChnb29nbGUudHNbLTIxNl0gfiBkaWZmKHByZXZQQU5JQy50cyksIG9yZGVyPTMpCgpncmFuZ2VydGVzdChkaWZmKHByZXZQQU5JQy50cykgfiBnb29nbGUudHNbLTIxNl0sIG9yZGVyPTIpCmdyYW5nZXJ0ZXN0KGdvb2dsZS50c1stMjE2XSB+IGRpZmYocHJldlBBTklDLnRzKSwgb3JkZXI9MikKCmdyYW5nZXJ0ZXN0KGRpZmYocHJldlBBTklDLnRzKSB+IGdvb2dsZS50c1stMjE2XSwgb3JkZXI9MSkKZ3JhbmdlcnRlc3QoZ29vZ2xlLnRzWy0yMTZdIH4gZGlmZihwcmV2UEFOSUMudHMpLCBvcmRlcj0xKQoKZ3JhbmdlcnRlc3QoZGlmZihpbmNpUEFOSUMudHMpIH4gZ29vZ2xlLnRzWy0yMTZdLCBvcmRlcj0xKQpncmFuZ2VydGVzdChnb29nbGUudHNbLTIxNl0gfiBkaWZmKGluY2lQQU5JQy50cyksIG9yZGVyPTEpCgpncmFuZ2VydGVzdChkaWZmKGluY2lQQU5JQy50cykgfiBnb29nbGUudHNbLTIxNl0sIG9yZGVyPTIpCmdyYW5nZXJ0ZXN0KGdvb2dsZS50c1stMjE2XSB+IGRpZmYoaW5jaVBBTklDLnRzKSwgb3JkZXI9MikKCmdyYW5nZXJ0ZXN0KGRpZmYocHJldk9DRC50cykgfiBnb29nbGUudHNbLWxlbmd0aChnb29nbGUudHMpXSwgb3JkZXI9MikKZ3JhbmdlcnRlc3QoZGlmZihwcmV2T0NELnRzKSB+IGdvb2dsZS50c1stbGVuZ3RoKGdvb2dsZS50cyldLCBvcmRlcj0zKQpncmFuZ2VydGVzdChkaWZmKHByZXZPQ0QudHMpIH4gZ29vZ2xlLnRzWy1sZW5ndGgoZ29vZ2xlLnRzKV0sIG9yZGVyPTEpCmdyYW5nZXJ0ZXN0KGRpZmYoaW5jaU9DRC50cykgfiBnb29nbGUudHNbLWxlbmd0aChnb29nbGUudHMpXSwgb3JkZXI9MikKZ3JhbmdlcnRlc3QoZGlmZihpbmNpT0NELnRzKSB+IGdvb2dsZS50c1stbGVuZ3RoKGdvb2dsZS50cyldLCBvcmRlcj0zKQpncmFuZ2VydGVzdChkaWZmKGluY2lPQ0QudHMpIH4gZ29vZ2xlLnRzWy1sZW5ndGgoZ29vZ2xlLnRzKV0sIG9yZGVyPTEpCgpgYGAKCgpgYGB7cn0KcGRmKGZpbGU9In4vRHJvcGJveC9naXRMYWIvc3R1ZHlEZXByZXNzaW9uQmlnRGF0YS9wcmV2UGFuaWNEaWZmZXJlbmNlLnBkZiIpCnByZXZQQU5JQ2RpZmYudHMgPSBkaWZmKHByZXZQQU5JQy50cykKcHJldlBBTklDZGlmZi50cy4xIDwtIHRzLnVuaW9uKHByZXZQQU5JQy50c1stMjE2XSwgcHJldlBBTklDZGlmZi50cykKcGxvdChwcmV2UEFOSUNkaWZmLnRzLjEsIHR5cGU9ImwiLCBwbG90LnR5cGU9InMiLCBjb2w9YygnYmx1ZScsJ2RlZXBza3libHVlJyksIHhsYWI9Ik1vbnRoIiwgeWxhYj0iTmV3IFBhbmljIFBhdC4gTiIsIGxpbmV0eXBlPWMoInNvbGlkIiwiZGFzaGVkIiksIHlsaW09YygwLG1heChwcmV2UEFOSUMudHMpKSkKICMgYWRkIGNvbmZpZGVuY2UgaW50ZXJ2YWwKIHRtcCA8LSBzZXEoZnJvbSA9IDIwMTEsIHRvID0yMDIxLjk5LCBieSA9IDEvMTIpCiAjIGJlbG93IGlzIGRyYXdpbmcgcG9seWdvbiBzdXBwbHlpbmcgb3V0bGluZSB4LHkgY29vcmRpbmF0ZXMKIHBvbHlnb24oYyhtaW4oaW5kZXgoZ29vZ2xlLnRzWy0yMTZdKSksaW5kZXgoZ29vZ2xlLnRzWy0yMTZdKSwgbWF4KGluZGV4KGdvb2dsZS50c1stMjE2XSkpKSwgYygwLCBnb29nbGUudHNbLTIxNl0qbWF4KGluY2lQQU5JQy50c1stMjE2XSkvMTAsMCksY29sPSJibHVlIikKIGFibGluZSh2PWMoMjAwNCsod2hpY2goZGF0YSRnb29nQ2hhID09IDEwMCktMSkvMTIwKjEwLDIwMDQrKHdoaWNoKGRhdGEkZ29vZ0tpbSA9PSAxMDApLTEpLzEyMCoxMCwyMDA0Kyh3aGljaChkYXRhJGdvb2dMZWUgPT0gMTAwKS0xKS8xMjAqMTApLCBjb2w9ImdyYXkiLCBsdHk9ImRhc2hlZCIsIGx3ZD0yKQogbGluZXMoZml0dGVkKG1vZGVsUHJldjEpLGNvbD0icmVkIixsd2Q9MSwgbHR5PSJkb3R0ZWQiKQogZGV2Lm9mZigpCmBgYAoKRm9yIHRoZSBmb2xsb3dpbmcgY29udGVudHMgb2YgdGhlIG1hbnVzY3JpcHQ6CkZvbGxvd2luZyB0aGUgZmlyc3QgY2VsZWJyaXR5IGRpc2Nsb3N1cmUgaW4gRGVjZW1iZXIgMjAxMCwgdGhlcmUgd2FzIGFuIGluY3JlYXNlcyBpbiBHb29nbGUgc2VhcmNoIHZvbHVtZSAoNMK3MTIgwrEgOMK3MDYgZHVyaW5nIHRoZSBwZXJpb2QgZnJvbSAyMDA0IHRvIDIwMTAgdmVyc3VzIDEwwrc0NiDCsSA5wrcyNCwgZnJvbSAyMDExIHRvIDIwMjEsIHQgPSAtNcK3MzIsIHAgPCAwwrcwMDEpIGFuZCBpbiB0aGUgbWFnbml0dWRlIG9mIHRoZSBmaXJzdC1vcmRlciBkaWZmZXJlbmNlIGluIG1vbnRobHkgcHJldmFsZW5jZSAoMMK3MDAxMiUgwrEgMMK3MDAwOTklIHZlcnN1cyAwwrcwMDg5JSDCsSAwwrcwMDgyJSwgdCA9IC0xMMK3NjcsIHAgPCAwwrcwMDEpIChGaWd1cmUgNCkuIAoKIyBEaXZpZGUgcHJlLSBhbmQgcG9zdC1pbnRlcnZlbnRpb24gcGVyaW9kIAoKYGBge3J9CgpwcmUucHJldlBBTklDLnRzIDwtIHdpbmRvdyhwcmV2UEFOSUM0LnRzLCBzdGFydCA9IGMoMjAwNCwgMSksIGVuZCA9IGMoMjAxMCwgMTIpKQpwb3N0LnByZXZQQU5JQy50cyA8LSB3aW5kb3cocHJldlBBTklDNC50cywgc3RhcnQgPSBjKDIwMTEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkKcHJldkRpZmYgPSB0LnRlc3QoYWJzKGRpZmYocHJlLnByZXZQQU5JQy50cykpLGFicyhkaWZmKHBvc3QucHJldlBBTklDLnRzKSkpCm1lYW4oYWJzKGRpZmYocHJlLnByZXZQQU5JQy50cykpKQptZWFuKGFicyhkaWZmKHBvc3QucHJldlBBTklDLnRzKSkpCnNkKGFicyhkaWZmKHByZS5wcmV2UEFOSUMudHMpKSkKc2QoYWJzKGRpZmYocG9zdC5wcmV2UEFOSUMudHMpKSkKCnByZS5nb29nbGUudHMgPC0gd2luZG93KGdvb2dsZS50cywgc3RhcnQgPSBjKDIwMDQsIDEpLCBlbmQgPSBjKDIwMTAsIDEyKSkKcG9zdC5nb29nbGUudHMgPC0gd2luZG93KGdvb2dsZS50cywgc3RhcnQgPSBjKDIwMTEsIDEpLCBlbmQgPSBjKDIwMjEsIDEyKSkKZ29vZ2xlRGlmZiA9IHQudGVzdChwcmUuZ29vZ2xlLnRzLHBvc3QuZ29vZ2xlLnRzKQptZWFuKHByZS5nb29nbGUudHMpCm1lYW4ocG9zdC5nb29nbGUudHMpCgpzZChwcmUuZ29vZ2xlLnRzKQpzZChwb3N0Lmdvb2dsZS50cykKCgpncmFuZ2VydGVzdChkaWZmKHByZS5wcmV2UEFOSUMudHMpIH4gcHJlLmdvb2dsZS50c1stbGVuZ3RoKHByZS5nb29nbGUudHMpXSwgb3JkZXI9MykKZ3JhbmdlcnRlc3QoZGlmZihwb3N0LnByZXZQQU5JQy50cykgfiBwb3N0Lmdvb2dsZS50c1stbGVuZ3RoKHBvc3QuZ29vZ2xlLnRzKV0sIG9yZGVyPTMpCgpncmFuZ2VydGVzdChkaWZmKHByZS5wcmV2UEFOSUMudHMpIH4gcHJlLmdvb2dsZS50c1stbGVuZ3RoKHByZS5nb29nbGUudHMpXSwgb3JkZXI9MikKZ3JhbmdlcnRlc3QoZGlmZihwb3N0LnByZXZQQU5JQy50cykgfiBwb3N0Lmdvb2dsZS50c1stbGVuZ3RoKHBvc3QuZ29vZ2xlLnRzKV0sIG9yZGVyPTIpCgpncmFuZ2VydGVzdChkaWZmKHByZS5wcmV2UEFOSUMudHMpIH4gcHJlLmdvb2dsZS50c1stbGVuZ3RoKHByZS5nb29nbGUudHMpXSwgb3JkZXI9MSkKZ3JhbmdlcnRlc3QoZGlmZihwb3N0LnByZXZQQU5JQy50cykgfiBwb3N0Lmdvb2dsZS50c1stbGVuZ3RoKHBvc3QuZ29vZ2xlLnRzKV0sIG9yZGVyPTEpCgoKY29yLnRlc3QoZGlmZihwcmUucHJldlBBTklDLnRzKSwgcHJlLmdvb2dsZS50c1stbGVuZ3RoKHByZS5nb29nbGUudHMpXSwgIG1ldGhvZD0ic3BlYXJtYW4iLCBleGFjdD1GQUxTRSkKY29yLnRlc3QoZGlmZihwb3N0LnByZXZQQU5JQy50cyksIHBvc3QuZ29vZ2xlLnRzWy1sZW5ndGgocG9zdC5nb29nbGUudHMpXSwgIG1ldGhvZD0ic3BlYXJtYW4iLCBleGFjdD1GQUxTRSkKCgpgYGAKCgpgYGB7cn0KcmVxdWlyZShiYXllc2ZvcmVjYXN0KQpyZXF1aXJlKGNvZGEpCm0xIDwtIGF1dG8uc2FyaW1hKGluY2lQQU5JQy50cywgc2Vhc29uYWw9VFJVRSwgeHJlZz10cmFuc2ZlckYsIG1heC5kPTIsIG1heC5EPTIsIHN0ZXB3aXNlPUZBTFNFLCB0cmFjZT1UUlVFKQoKYGBg