library(data.table)
library(readr)

macauResults <- read_delim("~/Documents/RobertsLab/TrinityGraph/10x-result.assoc.txt", 
    "\t", escape_double = FALSE, trim_ws = TRUE)

samples <- c("EPI-103", "EPI-104", "EPI-127", "EPI-128", "EPI-119", "EPI-120", "EPI-135", "EPI-136", "EPI-111", "EPI-113", "EPI-143", "EPI-145")

ambSamps <- c("EPI-119", "EPI-120", "EPI-135", "EPI-136")
  
lowSamps <- c("EPI-103", "EPI-104", "EPI-127", "EPI-128")

slowSamps <- c("EPI-111", "EPI-113", "EPI-143", "EPI-145")

sig.results <- macauResults[macauResults$pvalue < 0.05,]

for(i in 1:length(samples))   {
  
  name <- samples[i]
  temp <- read_delim(paste0("~/Documents/RobertsLab/TrinityGraph/", samples[i], "-percmeth.bedgraph.txt"), 
    "\t", escape_double = FALSE, col_names = FALSE, 
    trim_ws = TRUE)
  assign(name, as.data.table(temp))
}

amb.sig.results <- as.data.table(sig.results$id[sig.results$pvalue < 0.05])
colnames(amb.sig.results) <- "Loc"

for(i in 1:length(ambSamps))   {
  
  temp <- read_delim(paste0("~/Documents/RobertsLab/TrinityGraph/", ambSamps[i], "-percmeth.bedgraph.txt"), 
    "\t", escape_double = FALSE, col_names = FALSE, 
    trim_ws = TRUE) 
  
  temp$Loc <- paste0(temp$X1,"-",temp$X2)
  temp_DMRs <- temp[temp$Loc %in% amb.sig.results$Loc,]
  
  amb.sig.results$temp <- temp_DMRs$X4
  colnames(amb.sig.results)[i + 1] <- ambSamps[i]  
}

low.sig.results <- as.data.table(sig.results$id[sig.results$pvalue < 0.05])
colnames(low.sig.results) <- "Loc"

for(i in 1:length(lowSamps))   {

  temp <- read_delim(paste0("~/Documents/RobertsLab/TrinityGraph/", lowSamps[i], "-percmeth.bedgraph.txt"), 
    "\t", escape_double = FALSE, col_names = FALSE, col_types = cols(X4 = col_double()),
    trim_ws = TRUE) 
  
  temp$Loc <- paste0(temp$X1,"-",temp$X2)
  temp_DMRs <- temp[temp$Loc %in% low.sig.results$Loc,]
  
  low.sig.results$temp <- temp_DMRs$X4
  colnames(low.sig.results)[i + 1] <- lowSamps[i]  
}

slow.sig.results <- as.data.table(sig.results$id[sig.results$pvalue < 0.05])
colnames(slow.sig.results) <- "Loc"

for(i in 1:length(slowSamps))   {
  

  temp <- read_delim(paste0("~/Documents/RobertsLab/TrinityGraph/", slowSamps[i], "-percmeth.bedgraph.txt"), 
    "\t", escape_double = FALSE, col_names = FALSE, col_types = cols(X4 = col_double()),
    trim_ws = TRUE) 
  
  temp$Loc <- paste0(temp$X1,"-",temp$X2)
  temp_DMRs <- temp[temp$Loc %in% slow.sig.results$Loc,]
  
  slow.sig.results$temp <- temp_DMRs$X4
  colnames(slow.sig.results)[i + 1] <- slowSamps[i]  
}
head(amb.sig.results)
head(low.sig.results)
head(slow.sig.results)
for(i in 1:nrow(amb.sig.results))   {
  
  amb.sig.results$Mean[i] <- mean(amb.sig.results$`EPI-119`[i], amb.sig.results$`EPI-120`[i], amb.sig.results$`EPI-135`[i], amb.sig.results$`EPI-136`[i])
  
}
for(i in 1:nrow(slow.sig.results))   {
  
  low.sig.results$Mean[i] <- mean(low.sig.results$`EPI-103`[i], low.sig.results$`EPI-104`[i], low.sig.results$`EPI-127`[i], low.sig.results$`EPI-128`[i])
  
}
for(i in 1:nrow(slow.sig.results))   {
  
  slow.sig.results$Mean[i] <- mean(slow.sig.results$`EPI-111`[i], slow.sig.results$`EPI-113`[i], slow.sig.results$`EPI-143`[i], slow.sig.results$`EPI-145`[i])
  
}
head(amb.sig.results)
head(low.sig.results)
head(slow.sig.results)
amb.sig.results$Loc <- as.factor(amb.sig.results$Loc)
low.sig.results$Loc <- as.factor(low.sig.results$Loc)
slow.sig.results$Loc <- as.factor(slow.sig.results$Loc)
colnames(amb.sig.results) <- c("Loc", "EPI_119", "EPI_120", "EPI_135", "EPI_136", "Mean")
colnames(low.sig.results) <- c("Loc", "EPI_103", "EPI_104", "EPI_127", "EPI_128", "Mean")
colnames(slow.sig.results) <- c("Loc", "EPI_111", "EPI_113", "EPI_143", "EPI_145", "Mean")

The below plot shows just the ambient samoples, with a bold line representing the mean and the grey lines showing individual samples.

plot(amb.sig.results$Loc, amb.sig.results$Mean, type = "b")

plot1 <- ggplot(data = amb.sig.results, aes(x = Loc, y = Mean, group = 1))
plot1 + geom_line(aes(size = 2), color = "dark blue") + geom_line(data = amb.sig.results, aes(x = Loc, y = EPI_119, group = 2), position = "jitter", color = "gray") +
  geom_line(data = amb.sig.results, aes(x = Loc, y = EPI_120, group = 2), position = "jitter", color = "gray")+ geom_line(data = amb.sig.results, aes(x = Loc, y = EPI_135, group = 2), position = "jitter", color = "gray") + geom_line(data = amb.sig.results, aes(x = Loc, y = EPI_136, group = 2), position = "jitter", color = "gray") + theme(axis.title.x=element_blank(),     axis.text.x=element_blank(), axis.ticks.x=element_blank()) + ggtitle("Ambient group means by significant location") + scale_y_continuous(limits = c(0.15, 1.01))

Bold line represents mean, grey lines represent individual samples

plot1 <- ggplot(data = low.sig.results, aes(x = Loc, y = Mean, group = 1))
plot1 + geom_line(aes(size = 2), color = "dark green") + geom_line(data = low.sig.results, aes(x = Loc, y = EPI_103, group = 2), position = "jitter", color = "gray") +
  geom_line(data = low.sig.results, aes(x = Loc, y = EPI_104, group = 2), position = "jitter", color = "gray")+ geom_line(data = low.sig.results, aes(x = Loc, y = EPI_127, group = 2), position = "jitter", color = "gray") + geom_line(data = low.sig.results, aes(x = Loc, y = EPI_128, group = 2), position = "jitter", color = "gray") + theme(axis.title.x=element_blank(),     axis.text.x=element_blank(), axis.ticks.x=element_blank()) + ggtitle("Low group means by significant location") + scale_y_continuous(limits = c(0.15, 1.01))

Bold line represents mean, grey lines represent individual samples

plot1 <- ggplot(data = slow.sig.results, aes(x = Loc, y = Mean, group = 1))
plot1 + geom_line(aes(size = 2), color = "maroon") + geom_line(data = slow.sig.results, aes(x = Loc, y = EPI_111), position = "jitter", color = "gray") + geom_line(data = slow.sig.results, aes(x = Loc, y = EPI_113), position = "jitter", color = "gray")+ geom_line(data = slow.sig.results, aes(x = Loc, y = EPI_143), position = "jitter", color = "gray") + geom_line(data = slow.sig.results, aes(x = Loc, y = EPI_145), position = "jitter", color = "gray") + theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank()) + ggtitle("Super Low group means by significant location") + scale_y_continuous(limits = c(0.15, 1.01))

The plot below shows means by treatment group blue is ambient, green is low, and red is super low.

plot1 <- ggplot(data = amb.sig.results, aes(x = Loc, y = Mean, group = 1))
plot1 + geom_line(color = "dark blue") + geom_line(data = low.sig.results, aes(x = Loc, y = Mean, group = 2), position = "jitter", color = "dark green") +
  geom_line(data = slow.sig.results, aes(x = Loc, y = Mean, group = 2), position = "jitter", color = "maroon") + theme(axis.title.x=element_blank(),     axis.text.x=element_blank(), axis.ticks.x=element_blank()) + ggtitle("Means by Treatment Group") + scale_y_continuous(limits = c(0.15, 1.01))

So, all of that was wrong! Nevermind.

sig.results2 <- as.data.frame(cbind(amb.sig.results[,1:5], low.sig.results[,2:5], slow.sig.results[,2:5]))
head(sig.results2)
sig.results.t <- as.data.frame(t(sig.results2))
colnames(sig.results.t) <- sig.results2$Loc
sig.results.t <- sig.results.t[2:13,]
sig.results3 <- as.data.frame(colnames(sig.results2)[2:13])
sig.results3 <- as.data.frame(cbind(sig.results3, sig.results.t))
colnames(sig.results3)[1] <- "Sample"

The grah below is… difficult to read. Each line is a DMR and each group of four samples is a Treatment group, first Ambient, second low and third Super Low

sig.results3$Sample <- reorder(sig.results3$Sample, c(1,2,3,4,5,6,7,8,9,10,11,12))
ggplot(data = sig.results3, aes(x = Sample, y = sig.results3[,2], group = 1)) + geom_line() + geom_line(aes(x = Sample, y = sig.results3[,3])) + geom_line(aes(x = Sample, y = sig.results3[,4])) + geom_line(aes(x = Sample, y = sig.results3[,5])) + geom_line(aes(x = Sample, y = sig.results3[,6])) + geom_line(aes(x = Sample, y = sig.results3[,7])) + geom_line(aes(x = Sample, y = sig.results3[,8])) + geom_line(aes(x = Sample, y = sig.results3[,9])) + geom_line(aes(x = Sample, y = sig.results3[,10])) + geom_line(aes(x = Sample, y = sig.results3[,11])) + geom_line(aes(x = Sample, y = sig.results3[,12])) + geom_line(aes(x = Sample, y = sig.results3[,13])) + geom_line(aes(x = Sample, y = sig.results3[,14])) + geom_line(aes(x = Sample, y = sig.results3[,15])) + geom_line(aes(x = Sample, y = sig.results3[,16])) + geom_line(aes(x = Sample, y = sig.results3[,17])) + geom_line(aes(x = Sample, y = sig.results3[,18])) + geom_line(aes(x = Sample, y = sig.results3[,19])) + geom_line(aes(x = Sample, y = sig.results3[,20])) + geom_line(aes(x = Sample, y = sig.results3[,21])) + geom_line(aes(x = Sample, y = sig.results3[,22])) + geom_line(aes(x = Sample, y = sig.results3[,23])) + geom_line(aes(x = Sample, y = sig.results3[,24])) + geom_line(aes(x = Sample, y = sig.results3[,25])) + geom_line(aes(x = Sample, y = sig.results3[,26])) + geom_line(aes(x = Sample, y = sig.results3[,27])) + geom_line(aes(x = Sample, y = sig.results3[,28])) + geom_line(aes(x = Sample, y = sig.results3[,29])) + geom_line(aes(x = Sample, y = sig.results3[,30])) + geom_line(aes(x = Sample, y = sig.results3[,31])) + geom_line(aes(x = Sample, y = sig.results3[,32])) + geom_line(aes(x = Sample, y = sig.results3[,33])) + geom_line(aes(x = Sample, y = sig.results3[,34])) + geom_line(aes(x = Sample, y = sig.results3[,35])) + geom_line(aes(x = Sample, y = sig.results3[,36])) + geom_line(aes(x = Sample, y = sig.results3[,37])) + geom_line(aes(x = Sample, y = sig.results3[,38])) + geom_line(aes(x = Sample, y = sig.results3[,39])) + geom_line(aes(x = Sample, y = sig.results3[,40])) + geom_line(aes(x = Sample, y = sig.results3[,41])) + geom_line(aes(x = Sample, y = sig.results3[,42])) + theme(axis.title.y=element_blank(), axis.text.y=element_blank(), axis.ticks.y=element_blank()) +
  ggtitle("Proportion of Methylation by sample. Each line represents a DMR") + geom_vline(xintercept = 8.1, linetype = "longdash", color = "blue") + ggtitle(colnames(sig.results3[i])) + geom_vline(xintercept = 4.1, linetype = "longdash", color = "blue")

The graphs below look at individual DMRs by samples, the blue lines are there to just serve to mark between Ambient, Low, and Super Low groups.

for(i in 2:41)   {
  
  graph <- ggplot(data = sig.results3, aes(x = Sample, y = sig.results3[,i], group = 1)) + geom_line() + geom_vline(xintercept = 4.1, linetype = "longdash", color = "blue") + geom_vline(xintercept = 8.1, linetype = "longdash", color = "blue") + ggtitle(colnames(sig.results3[i]))
  
  print(graph)
  
}

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

LS0tCnRpdGxlOiAiVHJpbml0eSBQYXBlciBzdHlsZSBncmFwaHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgoKCmBgYHtyfQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkocmVhZHIpCgptYWNhdVJlc3VsdHMgPC0gcmVhZF9kZWxpbSgifi9Eb2N1bWVudHMvUm9iZXJ0c0xhYi9UcmluaXR5R3JhcGgvMTB4LXJlc3VsdC5hc3NvYy50eHQiLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpCgpzYW1wbGVzIDwtIGMoIkVQSS0xMDMiLCAiRVBJLTEwNCIsICJFUEktMTI3IiwgIkVQSS0xMjgiLCAiRVBJLTExOSIsICJFUEktMTIwIiwgIkVQSS0xMzUiLCAiRVBJLTEzNiIsICJFUEktMTExIiwgIkVQSS0xMTMiLCAiRVBJLTE0MyIsICJFUEktMTQ1IikKCmFtYlNhbXBzIDwtIGMoIkVQSS0xMTkiLCAiRVBJLTEyMCIsICJFUEktMTM1IiwgIkVQSS0xMzYiKQogIApsb3dTYW1wcyA8LSBjKCJFUEktMTAzIiwgIkVQSS0xMDQiLCAiRVBJLTEyNyIsICJFUEktMTI4IikKCnNsb3dTYW1wcyA8LSBjKCJFUEktMTExIiwgIkVQSS0xMTMiLCAiRVBJLTE0MyIsICJFUEktMTQ1IikKCgpgYGAKCgoKYGBge3J9CgpzaWcucmVzdWx0cyA8LSBtYWNhdVJlc3VsdHNbbWFjYXVSZXN1bHRzJHB2YWx1ZSA8IDAuMDUsXQoKZm9yKGkgaW4gMTpsZW5ndGgoc2FtcGxlcykpICAgewogIAogIG5hbWUgPC0gc2FtcGxlc1tpXQogIHRlbXAgPC0gcmVhZF9kZWxpbShwYXN0ZTAoIn4vRG9jdW1lbnRzL1JvYmVydHNMYWIvVHJpbml0eUdyYXBoLyIsIHNhbXBsZXNbaV0sICItcGVyY21ldGguYmVkZ3JhcGgudHh0IiksIAogICAgIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCBjb2xfbmFtZXMgPSBGQUxTRSwgCiAgICB0cmltX3dzID0gVFJVRSkKICBhc3NpZ24obmFtZSwgYXMuZGF0YS50YWJsZSh0ZW1wKSkKfQoKCmBgYAoKCmBgYHtyfQoKYW1iLnNpZy5yZXN1bHRzIDwtIGFzLmRhdGEudGFibGUoc2lnLnJlc3VsdHMkaWRbc2lnLnJlc3VsdHMkcHZhbHVlIDwgMC4wNV0pCmNvbG5hbWVzKGFtYi5zaWcucmVzdWx0cykgPC0gIkxvYyIKCmZvcihpIGluIDE6bGVuZ3RoKGFtYlNhbXBzKSkgICB7CiAgCiAgdGVtcCA8LSByZWFkX2RlbGltKHBhc3RlMCgifi9Eb2N1bWVudHMvUm9iZXJ0c0xhYi9UcmluaXR5R3JhcGgvIiwgYW1iU2FtcHNbaV0sICItcGVyY21ldGguYmVkZ3JhcGgudHh0IiksIAogICAgIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCBjb2xfbmFtZXMgPSBGQUxTRSwgCiAgICB0cmltX3dzID0gVFJVRSkgCiAgCiAgdGVtcCRMb2MgPC0gcGFzdGUwKHRlbXAkWDEsIi0iLHRlbXAkWDIpCiAgdGVtcF9ETVJzIDwtIHRlbXBbdGVtcCRMb2MgJWluJSBhbWIuc2lnLnJlc3VsdHMkTG9jLF0KICAKICBhbWIuc2lnLnJlc3VsdHMkdGVtcCA8LSB0ZW1wX0RNUnMkWDQKICBjb2xuYW1lcyhhbWIuc2lnLnJlc3VsdHMpW2kgKyAxXSA8LSBhbWJTYW1wc1tpXSAgCn0KCmxvdy5zaWcucmVzdWx0cyA8LSBhcy5kYXRhLnRhYmxlKHNpZy5yZXN1bHRzJGlkW3NpZy5yZXN1bHRzJHB2YWx1ZSA8IDAuMDVdKQpjb2xuYW1lcyhsb3cuc2lnLnJlc3VsdHMpIDwtICJMb2MiCgpmb3IoaSBpbiAxOmxlbmd0aChsb3dTYW1wcykpICAgewoKICB0ZW1wIDwtIHJlYWRfZGVsaW0ocGFzdGUwKCJ+L0RvY3VtZW50cy9Sb2JlcnRzTGFiL1RyaW5pdHlHcmFwaC8iLCBsb3dTYW1wc1tpXSwgIi1wZXJjbWV0aC5iZWRncmFwaC50eHQiKSwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IEZBTFNFLCBjb2xfdHlwZXMgPSBjb2xzKFg0ID0gY29sX2RvdWJsZSgpKSwKICAgIHRyaW1fd3MgPSBUUlVFKSAKICAKICB0ZW1wJExvYyA8LSBwYXN0ZTAodGVtcCRYMSwiLSIsdGVtcCRYMikKICB0ZW1wX0RNUnMgPC0gdGVtcFt0ZW1wJExvYyAlaW4lIGxvdy5zaWcucmVzdWx0cyRMb2MsXQogIAogIGxvdy5zaWcucmVzdWx0cyR0ZW1wIDwtIHRlbXBfRE1ScyRYNAogIGNvbG5hbWVzKGxvdy5zaWcucmVzdWx0cylbaSArIDFdIDwtIGxvd1NhbXBzW2ldICAKfQoKc2xvdy5zaWcucmVzdWx0cyA8LSBhcy5kYXRhLnRhYmxlKHNpZy5yZXN1bHRzJGlkW3NpZy5yZXN1bHRzJHB2YWx1ZSA8IDAuMDVdKQpjb2xuYW1lcyhzbG93LnNpZy5yZXN1bHRzKSA8LSAiTG9jIgoKZm9yKGkgaW4gMTpsZW5ndGgoc2xvd1NhbXBzKSkgICB7CiAgCgogIHRlbXAgPC0gcmVhZF9kZWxpbShwYXN0ZTAoIn4vRG9jdW1lbnRzL1JvYmVydHNMYWIvVHJpbml0eUdyYXBoLyIsIHNsb3dTYW1wc1tpXSwgIi1wZXJjbWV0aC5iZWRncmFwaC50eHQiKSwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IEZBTFNFLCBjb2xfdHlwZXMgPSBjb2xzKFg0ID0gY29sX2RvdWJsZSgpKSwKICAgIHRyaW1fd3MgPSBUUlVFKSAKICAKICB0ZW1wJExvYyA8LSBwYXN0ZTAodGVtcCRYMSwiLSIsdGVtcCRYMikKICB0ZW1wX0RNUnMgPC0gdGVtcFt0ZW1wJExvYyAlaW4lIHNsb3cuc2lnLnJlc3VsdHMkTG9jLF0KICAKICBzbG93LnNpZy5yZXN1bHRzJHRlbXAgPC0gdGVtcF9ETVJzJFg0CiAgY29sbmFtZXMoc2xvdy5zaWcucmVzdWx0cylbaSArIDFdIDwtIHNsb3dTYW1wc1tpXSAgCn0KCmBgYAoKCmBgYHtyfQoKaGVhZChhbWIuc2lnLnJlc3VsdHMpCmhlYWQobG93LnNpZy5yZXN1bHRzKQpoZWFkKHNsb3cuc2lnLnJlc3VsdHMpCgpgYGAKCmBgYHtyfQoKZm9yKGkgaW4gMTpucm93KGFtYi5zaWcucmVzdWx0cykpICAgewogIAogIGFtYi5zaWcucmVzdWx0cyRNZWFuW2ldIDwtIG1lYW4oYW1iLnNpZy5yZXN1bHRzJGBFUEktMTE5YFtpXSwgYW1iLnNpZy5yZXN1bHRzJGBFUEktMTIwYFtpXSwgYW1iLnNpZy5yZXN1bHRzJGBFUEktMTM1YFtpXSwgYW1iLnNpZy5yZXN1bHRzJGBFUEktMTM2YFtpXSkKICAKfQoKZm9yKGkgaW4gMTpucm93KHNsb3cuc2lnLnJlc3VsdHMpKSAgIHsKICAKICBsb3cuc2lnLnJlc3VsdHMkTWVhbltpXSA8LSBtZWFuKGxvdy5zaWcucmVzdWx0cyRgRVBJLTEwM2BbaV0sIGxvdy5zaWcucmVzdWx0cyRgRVBJLTEwNGBbaV0sIGxvdy5zaWcucmVzdWx0cyRgRVBJLTEyN2BbaV0sIGxvdy5zaWcucmVzdWx0cyRgRVBJLTEyOGBbaV0pCiAgCn0KCmZvcihpIGluIDE6bnJvdyhzbG93LnNpZy5yZXN1bHRzKSkgICB7CiAgCiAgc2xvdy5zaWcucmVzdWx0cyRNZWFuW2ldIDwtIG1lYW4oc2xvdy5zaWcucmVzdWx0cyRgRVBJLTExMWBbaV0sIHNsb3cuc2lnLnJlc3VsdHMkYEVQSS0xMTNgW2ldLCBzbG93LnNpZy5yZXN1bHRzJGBFUEktMTQzYFtpXSwgc2xvdy5zaWcucmVzdWx0cyRgRVBJLTE0NWBbaV0pCiAgCn0KCmBgYAoKYGBge3J9CgpoZWFkKGFtYi5zaWcucmVzdWx0cykKaGVhZChsb3cuc2lnLnJlc3VsdHMpCmhlYWQoc2xvdy5zaWcucmVzdWx0cykKCmFtYi5zaWcucmVzdWx0cyRMb2MgPC0gYXMuZmFjdG9yKGFtYi5zaWcucmVzdWx0cyRMb2MpCmxvdy5zaWcucmVzdWx0cyRMb2MgPC0gYXMuZmFjdG9yKGxvdy5zaWcucmVzdWx0cyRMb2MpCnNsb3cuc2lnLnJlc3VsdHMkTG9jIDwtIGFzLmZhY3RvcihzbG93LnNpZy5yZXN1bHRzJExvYykKCmNvbG5hbWVzKGFtYi5zaWcucmVzdWx0cykgPC0gYygiTG9jIiwgIkVQSV8xMTkiLCAiRVBJXzEyMCIsICJFUElfMTM1IiwgIkVQSV8xMzYiLCAiTWVhbiIpCmNvbG5hbWVzKGxvdy5zaWcucmVzdWx0cykgPC0gYygiTG9jIiwgIkVQSV8xMDMiLCAiRVBJXzEwNCIsICJFUElfMTI3IiwgIkVQSV8xMjgiLCAiTWVhbiIpCmNvbG5hbWVzKHNsb3cuc2lnLnJlc3VsdHMpIDwtIGMoIkxvYyIsICJFUElfMTExIiwgIkVQSV8xMTMiLCAiRVBJXzE0MyIsICJFUElfMTQ1IiwgIk1lYW4iKQpgYGAKClRoZSBiZWxvdyBwbG90IHNob3dzIGp1c3QgdGhlIGFtYmllbnQgc2Ftb3BsZXMsIHdpdGggYSBib2xkIGxpbmUgcmVwcmVzZW50aW5nIHRoZSBtZWFuIGFuZCB0aGUgZ3JleSBsaW5lcyBzaG93aW5nIGluZGl2aWR1YWwgc2FtcGxlcy4KCmBgYHtyfQoKcGxvdChhbWIuc2lnLnJlc3VsdHMkTG9jLCBhbWIuc2lnLnJlc3VsdHMkTWVhbiwgdHlwZSA9ICJiIikKCnBsb3QxIDwtIGdncGxvdChkYXRhID0gYW1iLnNpZy5yZXN1bHRzLCBhZXMoeCA9IExvYywgeSA9IE1lYW4sIGdyb3VwID0gMSkpCgpwbG90MSArIGdlb21fbGluZShhZXMoc2l6ZSA9IDIpLCBjb2xvciA9ICJkYXJrIGJsdWUiKSArIGdlb21fbGluZShkYXRhID0gYW1iLnNpZy5yZXN1bHRzLCBhZXMoeCA9IExvYywgeSA9IEVQSV8xMTksIGdyb3VwID0gMiksIHBvc2l0aW9uID0gImppdHRlciIsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBhbWIuc2lnLnJlc3VsdHMsIGFlcyh4ID0gTG9jLCB5ID0gRVBJXzEyMCwgZ3JvdXAgPSAyKSwgcG9zaXRpb24gPSAiaml0dGVyIiwgY29sb3IgPSAiZ3JheSIpKyBnZW9tX2xpbmUoZGF0YSA9IGFtYi5zaWcucmVzdWx0cywgYWVzKHggPSBMb2MsIHkgPSBFUElfMTM1LCBncm91cCA9IDIpLCBwb3NpdGlvbiA9ICJqaXR0ZXIiLCBjb2xvciA9ICJncmF5IikgKyBnZW9tX2xpbmUoZGF0YSA9IGFtYi5zaWcucmVzdWx0cywgYWVzKHggPSBMb2MsIHkgPSBFUElfMTM2LCBncm91cCA9IDIpLCBwb3NpdGlvbiA9ICJqaXR0ZXIiLCBjb2xvciA9ICJncmF5IikgKyB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpKSArIGdndGl0bGUoIkFtYmllbnQgZ3JvdXAgbWVhbnMgYnkgc2lnbmlmaWNhbnQgbG9jYXRpb24iKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAuMTUsIDEuMDEpKQoKCmBgYAoKQm9sZCBsaW5lIHJlcHJlc2VudHMgbWVhbiwgZ3JleSBsaW5lcyByZXByZXNlbnQgaW5kaXZpZHVhbCBzYW1wbGVzCgpgYGB7cn0KCnBsb3QxIDwtIGdncGxvdChkYXRhID0gbG93LnNpZy5yZXN1bHRzLCBhZXMoeCA9IExvYywgeSA9IE1lYW4sIGdyb3VwID0gMSkpCgpwbG90MSArIGdlb21fbGluZShhZXMoc2l6ZSA9IDIpLCBjb2xvciA9ICJkYXJrIGdyZWVuIikgKyBnZW9tX2xpbmUoZGF0YSA9IGxvdy5zaWcucmVzdWx0cywgYWVzKHggPSBMb2MsIHkgPSBFUElfMTAzLCBncm91cCA9IDIpLCBwb3NpdGlvbiA9ICJqaXR0ZXIiLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fbGluZShkYXRhID0gbG93LnNpZy5yZXN1bHRzLCBhZXMoeCA9IExvYywgeSA9IEVQSV8xMDQsIGdyb3VwID0gMiksIHBvc2l0aW9uID0gImppdHRlciIsIGNvbG9yID0gImdyYXkiKSsgZ2VvbV9saW5lKGRhdGEgPSBsb3cuc2lnLnJlc3VsdHMsIGFlcyh4ID0gTG9jLCB5ID0gRVBJXzEyNywgZ3JvdXAgPSAyKSwgcG9zaXRpb24gPSAiaml0dGVyIiwgY29sb3IgPSAiZ3JheSIpICsgZ2VvbV9saW5lKGRhdGEgPSBsb3cuc2lnLnJlc3VsdHMsIGFlcyh4ID0gTG9jLCB5ID0gRVBJXzEyOCwgZ3JvdXAgPSAyKSwgcG9zaXRpb24gPSAiaml0dGVyIiwgY29sb3IgPSAiZ3JheSIpICsgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSkgKyBnZ3RpdGxlKCJMb3cgZ3JvdXAgbWVhbnMgYnkgc2lnbmlmaWNhbnQgbG9jYXRpb24iKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAuMTUsIDEuMDEpKQoKYGBgCgpCb2xkIGxpbmUgcmVwcmVzZW50cyBtZWFuLCBncmV5IGxpbmVzIHJlcHJlc2VudCBpbmRpdmlkdWFsIHNhbXBsZXMKCmBgYHtyfQpwbG90MSA8LSBnZ3Bsb3QoZGF0YSA9IHNsb3cuc2lnLnJlc3VsdHMsIGFlcyh4ID0gTG9jLCB5ID0gTWVhbiwgZ3JvdXAgPSAxKSkKCnBsb3QxICsgZ2VvbV9saW5lKGFlcyhzaXplID0gMiksIGNvbG9yID0gIm1hcm9vbiIpICsgZ2VvbV9saW5lKGRhdGEgPSBzbG93LnNpZy5yZXN1bHRzLCBhZXMoeCA9IExvYywgeSA9IEVQSV8xMTEpLCBwb3NpdGlvbiA9ICJqaXR0ZXIiLCBjb2xvciA9ICJncmF5IikgKyBnZW9tX2xpbmUoZGF0YSA9IHNsb3cuc2lnLnJlc3VsdHMsIGFlcyh4ID0gTG9jLCB5ID0gRVBJXzExMyksIHBvc2l0aW9uID0gImppdHRlciIsIGNvbG9yID0gImdyYXkiKSsgZ2VvbV9saW5lKGRhdGEgPSBzbG93LnNpZy5yZXN1bHRzLCBhZXMoeCA9IExvYywgeSA9IEVQSV8xNDMpLCBwb3NpdGlvbiA9ICJqaXR0ZXIiLCBjb2xvciA9ICJncmF5IikgKyBnZW9tX2xpbmUoZGF0YSA9IHNsb3cuc2lnLnJlc3VsdHMsIGFlcyh4ID0gTG9jLCB5ID0gRVBJXzE0NSksIHBvc2l0aW9uID0gImppdHRlciIsIGNvbG9yID0gImdyYXkiKSArIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSkgKyBnZ3RpdGxlKCJTdXBlciBMb3cgZ3JvdXAgbWVhbnMgYnkgc2lnbmlmaWNhbnQgbG9jYXRpb24iKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAuMTUsIDEuMDEpKQoKCmBgYAoKVGhlIHBsb3QgYmVsb3cgc2hvd3MgbWVhbnMgYnkgdHJlYXRtZW50IGdyb3VwIGJsdWUgaXMgYW1iaWVudCwgZ3JlZW4gaXMgbG93LCBhbmQgcmVkIGlzIHN1cGVyIGxvdy4KCmBgYHtyfQoKcGxvdDEgPC0gZ2dwbG90KGRhdGEgPSBhbWIuc2lnLnJlc3VsdHMsIGFlcyh4ID0gTG9jLCB5ID0gTWVhbiwgZ3JvdXAgPSAxKSkKCnBsb3QxICsgZ2VvbV9saW5lKGNvbG9yID0gImRhcmsgYmx1ZSIpICsgZ2VvbV9saW5lKGRhdGEgPSBsb3cuc2lnLnJlc3VsdHMsIGFlcyh4ID0gTG9jLCB5ID0gTWVhbiwgZ3JvdXAgPSAyKSwgcG9zaXRpb24gPSAiaml0dGVyIiwgY29sb3IgPSAiZGFyayBncmVlbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IHNsb3cuc2lnLnJlc3VsdHMsIGFlcyh4ID0gTG9jLCB5ID0gTWVhbiwgZ3JvdXAgPSAyKSwgcG9zaXRpb24gPSAiaml0dGVyIiwgY29sb3IgPSAibWFyb29uIikgKyB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpKSArIGdndGl0bGUoIk1lYW5zIGJ5IFRyZWF0bWVudCBHcm91cCIpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMC4xNSwgMS4wMSkpCgpgYGAKCgpTbywgYWxsIG9mIHRoYXQgd2FzIHdyb25nISBOZXZlcm1pbmQuCgpgYGB7cn0KCnNpZy5yZXN1bHRzMiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKGFtYi5zaWcucmVzdWx0c1ssMTo1XSwgbG93LnNpZy5yZXN1bHRzWywyOjVdLCBzbG93LnNpZy5yZXN1bHRzWywyOjVdKSkKCmhlYWQoc2lnLnJlc3VsdHMyKQoKc2lnLnJlc3VsdHMudCA8LSBhcy5kYXRhLmZyYW1lKHQoc2lnLnJlc3VsdHMyKSkKCmNvbG5hbWVzKHNpZy5yZXN1bHRzLnQpIDwtIHNpZy5yZXN1bHRzMiRMb2MKCnNpZy5yZXN1bHRzLnQgPC0gc2lnLnJlc3VsdHMudFsyOjEzLF0KCnNpZy5yZXN1bHRzMyA8LSBhcy5kYXRhLmZyYW1lKGNvbG5hbWVzKHNpZy5yZXN1bHRzMilbMjoxM10pCgpzaWcucmVzdWx0czMgPC0gYXMuZGF0YS5mcmFtZShjYmluZChzaWcucmVzdWx0czMsIHNpZy5yZXN1bHRzLnQpKQoKY29sbmFtZXMoc2lnLnJlc3VsdHMzKVsxXSA8LSAiU2FtcGxlIgpgYGAKClRoZSBncmFoIGJlbG93IGlzLi4uIGRpZmZpY3VsdCB0byByZWFkLiBFYWNoIGxpbmUgaXMgYSBETVIgYW5kIGVhY2ggZ3JvdXAgb2YgZm91ciBzYW1wbGVzIGlzIGEgVHJlYXRtZW50IGdyb3VwLCBmaXJzdCBBbWJpZW50LCBzZWNvbmQgbG93IGFuZCB0aGlyZCBTdXBlciBMb3cgCgpgYGB7cn0KCnNpZy5yZXN1bHRzMyRTYW1wbGUgPC0gcmVvcmRlcihzaWcucmVzdWx0czMkU2FtcGxlLCBjKDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyKSkKCgpnZ3Bsb3QoZGF0YSA9IHNpZy5yZXN1bHRzMywgYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDJdLCBncm91cCA9IDEpKSArIGdlb21fbGluZSgpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywzXSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWyw0XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWyw1XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWyw2XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWyw3XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWyw4XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWyw5XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywxMF0pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMTFdKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDEyXSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywxM10pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMTRdKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDE1XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywxNl0pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMTddKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDE4XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywxOV0pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMjBdKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDIxXSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywyMl0pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMjNdKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDI0XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywyNV0pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMjZdKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDI3XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywyOF0pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMjldKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDMwXSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywzMV0pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMzJdKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDMzXSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywzNF0pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMzVdKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDM2XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWywzN10pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssMzhdKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDM5XSkpICsgZ2VvbV9saW5lKGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWyw0MF0pKSArIGdlb21fbGluZShhZXMoeCA9IFNhbXBsZSwgeSA9IHNpZy5yZXN1bHRzM1ssNDFdKSkgKyBnZW9tX2xpbmUoYWVzKHggPSBTYW1wbGUsIHkgPSBzaWcucmVzdWx0czNbLDQyXSkpICsgdGhlbWUoYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiUHJvcG9ydGlvbiBvZiBNZXRoeWxhdGlvbiBieSBzYW1wbGUuIEVhY2ggbGluZSByZXByZXNlbnRzIGEgRE1SIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA4LjEsIGxpbmV0eXBlID0gImxvbmdkYXNoIiwgY29sb3IgPSAiYmx1ZSIpICsgZ2d0aXRsZShjb2xuYW1lcyhzaWcucmVzdWx0czNbaV0pKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQuMSwgbGluZXR5cGUgPSAibG9uZ2Rhc2giLCBjb2xvciA9ICJibHVlIikKCmBgYAoKVGhlIGdyYXBocyBiZWxvdyBsb29rIGF0IGluZGl2aWR1YWwgRE1ScyBieSBzYW1wbGVzLCB0aGUgYmx1ZSBsaW5lcyBhcmUgdGhlcmUgdG8ganVzdCBzZXJ2ZSB0byBtYXJrIGJldHdlZW4gQW1iaWVudCwgTG93LCBhbmQgU3VwZXIgTG93IGdyb3Vwcy4KCmBgYHtyfQoKZm9yKGkgaW4gMjo0MSkgICB7CiAgCiAgZ3JhcGggPC0gZ2dwbG90KGRhdGEgPSBzaWcucmVzdWx0czMsIGFlcyh4ID0gU2FtcGxlLCB5ID0gc2lnLnJlc3VsdHMzWyxpXSwgZ3JvdXAgPSAxKSkgKyBnZW9tX2xpbmUoKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQuMSwgbGluZXR5cGUgPSAibG9uZ2Rhc2giLCBjb2xvciA9ICJibHVlIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA4LjEsIGxpbmV0eXBlID0gImxvbmdkYXNoIiwgY29sb3IgPSAiYmx1ZSIpICsgZ2d0aXRsZShjb2xuYW1lcyhzaWcucmVzdWx0czNbaV0pKQogIAogIHByaW50KGdyYXBoKQogIAp9CgoKCmBgYAoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkNtZCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLgo=