1 Sample Estimation version: 20180718

This document should make clear the suitability of this Pseudomonas data for differential expression analyses. It should also give some ideas about the depth and distribution of the data.

rownames(pa14_annot) <- make.names(pa14_annot[["sysName"]], unique=TRUE)
pa_expt <- create_expt(metadata="sample_sheets/rna_new_old_samples.xlsx",
                       gene_info=all_annot)
## Reading the sample metadata.
## The sample definitions comprises: 20 rows(samples) and 27 columns(metadata fields).
## Reading count tables.
## Reading count tables with read.table().
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0975/outputs/bowtie2_paeruginosa_pa14/hpgl0975.count.xz contains 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0976/outputs/bowtie2_paeruginosa_pa14/hpgl0976.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0977/outputs/bowtie2_paeruginosa_pa14/hpgl0977.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0978/outputs/bowtie2_paeruginosa_pa14/hpgl0978.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0979/outputs/bowtie2_paeruginosa_pa14/hpgl0979.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0980/outputs/bowtie2_paeruginosa_pa14/hpgl0980.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0981/outputs/bowtie2_paeruginosa_pa14/hpgl0981.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0982/outputs/bowtie2_paeruginosa_pa14/hpgl0982.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0983/outputs/bowtie2_paeruginosa_pa14/hpgl0983.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0984/outputs/bowtie2_paeruginosa_pa14/hpgl0984.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0985/outputs/bowtie2_paeruginosa_pa14/hpgl0985.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/new_large/hpgl0986/outputs/bowtie2_paeruginosa_pa14/hpgl0986.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/previous_large/vl05_pa14/outputs/bowtie2_paeruginosa_pa14/vl05_pa14.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/previous_large/vl06_pa14/outputs/bowtie2_paeruginosa_pa14/vl06_pa14.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/previous_large/vl07_pa14/outputs/bowtie2_paeruginosa_pa14/vl07_pa14.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/previous_large/vl08_pa14/outputs/bowtie2_paeruginosa_pa14/vl08_pa14.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/previous_large/vl09_orn/outputs/bowtie2_paeruginosa_pa14/vl09_orn.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/previous_large/vl10_orn/outputs/bowtie2_paeruginosa_pa14/vl10_orn.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/previous_large/vl11_orn/outputs/bowtie2_paeruginosa_pa14/vl11_orn.count.xz contains 5984 rows and merges to 5984 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/paeruginosa_201710/preprocessing/previous_large/vl12_orn/outputs/bowtie2_paeruginosa_pa14/vl12_orn.count.xz contains 5984 rows and merges to 5984 rows.
## Finished reading count tables.
## Matched 5972 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
new_expt <- subset_expt(pa_expt, subset="batch=='new'")
## There were 20, now there are 12 samples.
old_expt <- subset_expt(pa_expt, subset="batch=='previous'")
## There were 20, now there are 8 samples.
written_expt <- write_expt(pa_expt, excel=paste0("excel/rna_reads-v", ver, ".xlsx"))
## Writing the legend.

## Writing the raw reads.
## Graphing the raw reads.
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Writing the normalized reads.
## Graphing the normalized reads.

## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Writing the median reads by factor.
## The factor mt_st has 3 rows.
## The factor wt_st has 3 rows.
## The factor mt_ex has 3 rows.
## The factor wt_ex has 3 rows.
## The factor wt_undef has 4 rows.
## The factor mt_undef has 4 rows.

all_nobatch <- write_expt(pa_expt, transform="log2", convert="cpm", filter=TRUE,
                          norm="raw", batch=FALSE,
                          excel=paste0("excel/rna_reads_l2cpmfilt-v", ver, ".xlsx"))
## Writing the legend.

## Writing the raw reads.
## Graphing the raw reads.
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Writing the normalized reads.
## Graphing the normalized reads.

## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Writing the median reads by factor.
## The factor mt_st has 3 rows.
## The factor wt_st has 3 rows.
## The factor mt_ex has 3 rows.
## The factor wt_ex has 3 rows.
## The factor wt_undef has 4 rows.
## The factor mt_undef has 4 rows.

1.1 Create some plots of the new data

The following blocks will plot and print a few common metrics of the new data.

new_raw <- sm(graph_metrics(new_expt))
new_norm <- sm(normalize_expt(new_expt, transform="log2", norm="quant", filter=TRUE))
new_plots <- sm(graph_metrics(new_norm))

1.2 Now show the plots!

pp(file="images/legend.png", image=new_raw$legend)
## Writing the image to: images/legend.png and calling dev.off().

pp(file="images/new_libsize.png", image=new_raw$libsize)
## Writing the image to: images/new_libsize.png and calling dev.off().

pp(file="images/new_raw_corheat.png", image=new_raw$corheat)
## Writing the image to: images/new_raw_corheat.png and calling dev.off().

pp(file="images/new_boxplot.png", image=new_raw$boxplot)
## Writing the image to: images/new_boxplot.png and calling dev.off().

pp(file="images/norm_pca.png", image=new_plots$pcaplot)
## Writing the image to: images/norm_pca.png and calling dev.off().
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

1.3 Perform some plots of both the old and new data together.

Spoiler alert: I already looked at these plots and it seems to me that the previous data has a much more subtle split between the wt/delta samples than the new data. This will likely limit the sensitivity of any analyses performed using both sets of data. We can perform a bunch of other analyses (variance partition etc) to try to get further into it and understand where the variance is coming from; but that can be difficult and time consuming.

pa_graph_raw <- sm(graph_metrics(pa_expt))
pa_norm <- sm(normalize_expt(pa_expt, transform="log2", convert="cpm",
                             norm="quant", filter=TRUE))
pa_graph_norm <- sm(graph_metrics(pa_norm))
pa_nb <- sm(normalize_expt(pa_expt, transform="log2", convert="cpm",
                           norm="quant", filter=TRUE, batch="limma"))
pa_nb_graph <- sm(graph_metrics(pa_nb))

1.3.1 Collected plots

pa_graph_norm$pcaplot
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

pa_graph_norm$tsneplot
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

pa_nb_graph$pcaplot
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

pp(file="images/all_libsize.png", image=pa_graph_raw$libsize)
## Writing the image to: images/all_libsize.png and calling dev.off().

pp(file="images/all_density.png", image=pa_graph_raw$density)
## Writing the image to: images/all_density.png and calling dev.off().

pp(file="images/norm_corheat.png", image=pa_graph_norm$corheat)
## Writing the image to: images/norm_corheat.png and calling dev.off().

pp(file="images/all_legend.png", image=pa_graph_raw$legend)
## Writing the image to: images/all_legend.png and calling dev.off().

pp(file="images/all_pca.png", image=pa_graph_norm$pcaplot)
## Writing the image to: images/all_pca.png and calling dev.off().
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

pp(file="images/all_batch_pca.png", image=pa_nb_graph$pcaplot)
## Writing the image to: images/all_batch_pca.png and calling dev.off().
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

pander::pander(sessionInfo())

R version 3.5.1 (2018-07-02)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.utf8, LC_NUMERIC=C, LC_TIME=en_US.utf8, LC_COLLATE=en_US.utf8, LC_MONETARY=en_US.utf8, LC_MESSAGES=en_US.utf8, LC_PAPER=en_US.utf8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.utf8 and LC_IDENTIFICATION=C

attached base packages: stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: ruv(v.0.9.7), bindrcpp(v.0.2.2) and hpgltools(v.2018.03)

loaded via a namespace (and not attached): nlme(v.3.1-137), bitops(v.1.0-6), matrixStats(v.0.54.0), devtools(v.1.13.6), bit64(v.0.9-7), RColorBrewer(v.1.1-2), progress(v.1.2.0), httr(v.1.3.1), rprojroot(v.1.3-2), GenomeInfoDb(v.1.16.0), tools(v.3.5.1), backports(v.1.1.2), R6(v.2.2.2), KernSmooth(v.2.23-15), mgcv(v.1.8-24), DBI(v.1.0.0), lazyeval(v.0.2.1), BiocGenerics(v.0.26.0), colorspace(v.1.3-2), withr(v.2.1.2), gridExtra(v.2.3), tidyselect(v.0.2.4), prettyunits(v.1.0.2), bit(v.1.1-14), compiler(v.3.5.1), preprocessCore(v.1.42.0), Biobase(v.2.40.0), xml2(v.1.2.0), DelayedArray(v.0.6.4), rtracklayer(v.1.40.5), labeling(v.0.3), scales(v.1.0.0), genefilter(v.1.62.0), quadprog(v.1.5-5), commonmark(v.1.5), stringr(v.1.3.1), digest(v.0.6.15), Rsamtools(v.1.32.2), rmarkdown(v.1.10), XVector(v.0.20.0), base64enc(v.0.1-3), pkgconfig(v.2.0.1), htmltools(v.0.3.6), limma(v.3.36.2), rlang(v.0.2.1), RSQLite(v.2.1.1), bindr(v.0.1.1), BiocParallel(v.1.14.2), gtools(v.3.8.1), dplyr(v.0.7.6), zip(v.1.0.0), RCurl(v.1.95-4.11), magrittr(v.1.5), GenomeInfoDbData(v.1.1.0), Matrix(v.1.2-14), Rcpp(v.0.12.18), munsell(v.0.5.0), S4Vectors(v.0.18.3), stringi(v.1.2.4), yaml(v.2.2.0), edgeR(v.3.22.3), MASS(v.7.3-50), SummarizedExperiment(v.1.10.1), zlibbioc(v.1.26.0), Rtsne(v.0.13), plyr(v.1.8.4), grid(v.3.5.1), blob(v.1.1.1), parallel(v.3.5.1), ggrepel(v.0.8.0), crayon(v.1.3.4), lattice(v.0.20-35), splines(v.3.5.1), Biostrings(v.2.48.0), pander(v.0.6.2), annotate(v.1.58.0), GenomicFeatures(v.1.32.2), hms(v.0.4.2), locfit(v.1.5-9.1), knitr(v.1.20), pillar(v.1.3.0), GenomicRanges(v.1.32.6), corpcor(v.1.6.9), reshape2(v.1.4.3), codetools(v.0.2-15), biomaRt(v.2.36.1), stats4(v.3.5.1), XML(v.3.98-1.16), glue(v.1.3.0), evaluate(v.0.11), data.table(v.1.11.4), foreach(v.1.4.4), gtable(v.0.2.0), purrr(v.0.2.5), assertthat(v.0.2.0), ggplot2(v.3.0.0), openxlsx(v.4.1.0), xtable(v.1.8-2), roxygen2(v.6.1.0), survival(v.2.42-6), tibble(v.1.4.2), iterators(v.1.0.10), GenomicAlignments(v.1.16.0), AnnotationDbi(v.1.42.1), memoise(v.1.1.0), IRanges(v.2.14.10), sva(v.3.28.0) and directlabels(v.2018.05.22)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 2266d4aa924d9d04edcd360e0ca8216aceb8c9ae
## R> packrat::restore()
## This is hpgltools commit: Thu Aug 23 17:56:20 2018 -0400: 2266d4aa924d9d04edcd360e0ca8216aceb8c9ae
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
message(paste0("Saving to ", this_save))
## Saving to 02_sample_estimation_20180718-v20180718.rda.xz
tmp <- sm(saveme(filename=this_save))
LS0tCnRpdGxlOiAiMjAxODA3MTg6IGtQLiBhZXJ1Z2lub3NhIHNhbXBsZSBlc3RpbWF0aW9uLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogaHRtbF9kb2N1bWVudDoKICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgY29kZV9mb2xkaW5nOiBzaG93CiAgZmlnX2NhcHRpb246IHRydWUKICBmaWdfaGVpZ2h0OiA3CiAgZmlnX3dpZHRoOiA3CiAgaGlnaGxpZ2h0OiBkZWZhdWx0CiAga2VlcF9tZDogZmFsc2UKICBtb2RlOiBzZWxmY29udGFpbmVkCiAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgc2VsZl9jb250YWluZWQ6IHRydWUKICB0aGVtZTogcmVhZGFibGUKICB0b2M6IHRydWUKICB0b2NfZmxvYXQ6CiAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZT4KICBib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgICBtYXgtd2lkdGg6IDE2MDBweDsKICB9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIn4vaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQoCiAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgd2lkdGg9OTAsCiAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAgICAgICAgICAgICAgICAgICBlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgIGZpZy53aWR0aD04LAogICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQ9OCwKICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoCiAgZGlnaXRzPTQsCiAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnZlciA8LSAiMjAxODA3MTgiCnByZXZpb3VzX2ZpbGUgPC0gIjAxX2Fubm90YXRpb25fMjAxODA3MTguUm1kIgoKdG1wIDwtIHRyeShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKcm1kX2ZpbGUgPC0gIjAyX3NhbXBsZV9lc3RpbWF0aW9uXzIwMTgwNzE4LlJtZCIKYGBgCgojIFNhbXBsZSBFc3RpbWF0aW9uIHZlcnNpb246IGByIHZlcmAKClRoaXMgZG9jdW1lbnQgc2hvdWxkIG1ha2UgY2xlYXIgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgUHNldWRvbW9uYXMgZGF0YSBmb3IKZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzZXMuICBJdCBzaG91bGQgYWxzbyBnaXZlIHNvbWUgaWRlYXMgYWJvdXQgdGhlCmRlcHRoIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGEuCgpgYGB7ciBjcmVhdGVfZXhwdH0Kcm93bmFtZXMocGExNF9hbm5vdCkgPC0gbWFrZS5uYW1lcyhwYTE0X2Fubm90W1sic3lzTmFtZSJdXSwgdW5pcXVlPVRSVUUpCnBhX2V4cHQgPC0gY3JlYXRlX2V4cHQobWV0YWRhdGE9InNhbXBsZV9zaGVldHMvcm5hX25ld19vbGRfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89YWxsX2Fubm90KQpuZXdfZXhwdCA8LSBzdWJzZXRfZXhwdChwYV9leHB0LCBzdWJzZXQ9ImJhdGNoPT0nbmV3JyIpCm9sZF9leHB0IDwtIHN1YnNldF9leHB0KHBhX2V4cHQsIHN1YnNldD0iYmF0Y2g9PSdwcmV2aW91cyciKQoKd3JpdHRlbl9leHB0IDwtIHdyaXRlX2V4cHQocGFfZXhwdCwgZXhjZWw9cGFzdGUwKCJleGNlbC9ybmFfcmVhZHMtdiIsIHZlciwgIi54bHN4IikpCgphbGxfbm9iYXRjaCA8LSB3cml0ZV9leHB0KHBhX2V4cHQsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InJhdyIsIGJhdGNoPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPXBhc3RlMCgiZXhjZWwvcm5hX3JlYWRzX2wyY3BtZmlsdC12IiwgdmVyLCAiLnhsc3giKSkKYGBgCgojIyBDcmVhdGUgc29tZSBwbG90cyBvZiB0aGUgbmV3IGRhdGEKClRoZSBmb2xsb3dpbmcgYmxvY2tzIHdpbGwgcGxvdCBhbmQgcHJpbnQgYSBmZXcgY29tbW9uIG1ldHJpY3Mgb2YgdGhlIG5ldyBkYXRhLgoKYGBge3IgbmV3X2RhdGEsIGZpZy5zaG93PSJoaWRlIn0KbmV3X3JhdyA8LSBzbShncmFwaF9tZXRyaWNzKG5ld19leHB0KSkKbmV3X25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobmV3X2V4cHQsIHRyYW5zZm9ybT0ibG9nMiIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKQpuZXdfcGxvdHMgPC0gc20oZ3JhcGhfbWV0cmljcyhuZXdfbm9ybSkpCmBgYAoKIyMgTm93IHNob3cgdGhlIHBsb3RzIQoKYGBge3Igc2hvd19kYXRhfQpwcChmaWxlPSJpbWFnZXMvbGVnZW5kLnBuZyIsIGltYWdlPW5ld19yYXckbGVnZW5kKQpwcChmaWxlPSJpbWFnZXMvbmV3X2xpYnNpemUucG5nIiwgaW1hZ2U9bmV3X3JhdyRsaWJzaXplKQpwcChmaWxlPSJpbWFnZXMvbmV3X3Jhd19jb3JoZWF0LnBuZyIsIGltYWdlPW5ld19yYXckY29yaGVhdCkKcHAoZmlsZT0iaW1hZ2VzL25ld19ib3hwbG90LnBuZyIsIGltYWdlPW5ld19yYXckYm94cGxvdCkKcHAoZmlsZT0iaW1hZ2VzL25vcm1fcGNhLnBuZyIsIGltYWdlPW5ld19wbG90cyRwY2FwbG90KQpgYGAKCiMjIFBlcmZvcm0gc29tZSBwbG90cyBvZiBib3RoIHRoZSBvbGQgYW5kIG5ldyBkYXRhIHRvZ2V0aGVyLgoKU3BvaWxlciBhbGVydDogIEkgYWxyZWFkeSBsb29rZWQgYXQgdGhlc2UgcGxvdHMgYW5kIGl0IHNlZW1zIHRvIG1lIHRoYXQgdGhlCnByZXZpb3VzIGRhdGEgaGFzIGEgbXVjaCBtb3JlIHN1YnRsZSBzcGxpdCBiZXR3ZWVuIHRoZSB3dC9kZWx0YSBzYW1wbGVzIHRoYW4gdGhlCm5ldyBkYXRhLiAgVGhpcyB3aWxsIGxpa2VseSBsaW1pdCB0aGUgc2Vuc2l0aXZpdHkgb2YgYW55IGFuYWx5c2VzIHBlcmZvcm1lZAp1c2luZyBib3RoIHNldHMgb2YgZGF0YS4gIFdlIGNhbiBwZXJmb3JtIGEgYnVuY2ggb2Ygb3RoZXIgYW5hbHlzZXMgKHZhcmlhbmNlCnBhcnRpdGlvbiBldGMpIHRvIHRyeSB0byBnZXQgZnVydGhlciBpbnRvIGl0IGFuZCB1bmRlcnN0YW5kIHdoZXJlIHRoZSB2YXJpYW5jZQppcyBjb21pbmcgZnJvbTsgYnV0IHRoYXQgY2FuIGJlIGRpZmZpY3VsdCBhbmQgdGltZSBjb25zdW1pbmcuCgpgYGB7ciBncmFwaF9yYXcsIGZpZy5zaG93PSJoaWRlIn0KcGFfZ3JhcGhfcmF3IDwtIHNtKGdyYXBoX21ldHJpY3MocGFfZXhwdCkpCgpwYV9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHBhX2V4cHQsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpCnBhX2dyYXBoX25vcm0gPC0gc20oZ3JhcGhfbWV0cmljcyhwYV9ub3JtKSkKcGFfbmIgPC0gc20obm9ybWFsaXplX2V4cHQocGFfZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSwgYmF0Y2g9ImxpbW1hIikpCnBhX25iX2dyYXBoIDwtIHNtKGdyYXBoX21ldHJpY3MocGFfbmIpKQpgYGAKCiMjIyBDb2xsZWN0ZWQgcGxvdHMKCmBgYHtyIGNvbGxlY3RlZH0KcGFfZ3JhcGhfbm9ybSRwY2FwbG90CnBhX2dyYXBoX25vcm0kdHNuZXBsb3QKCnBhX25iX2dyYXBoJHBjYXBsb3QKCnBwKGZpbGU9ImltYWdlcy9hbGxfbGlic2l6ZS5wbmciLCBpbWFnZT1wYV9ncmFwaF9yYXckbGlic2l6ZSkKcHAoZmlsZT0iaW1hZ2VzL2FsbF9kZW5zaXR5LnBuZyIsIGltYWdlPXBhX2dyYXBoX3JhdyRkZW5zaXR5KQpwcChmaWxlPSJpbWFnZXMvbm9ybV9jb3JoZWF0LnBuZyIsIGltYWdlPXBhX2dyYXBoX25vcm0kY29yaGVhdCkKcHAoZmlsZT0iaW1hZ2VzL2FsbF9sZWdlbmQucG5nIiwgaW1hZ2U9cGFfZ3JhcGhfcmF3JGxlZ2VuZCkKcHAoZmlsZT0iaW1hZ2VzL2FsbF9wY2EucG5nIiwgaW1hZ2U9cGFfZ3JhcGhfbm9ybSRwY2FwbG90KQpwcChmaWxlPSJpbWFnZXMvYWxsX2JhdGNoX3BjYS5wbmciLCBpbWFnZT1wYV9uYl9ncmFwaCRwY2FwbG90KQpgYGAKCmBgYHtyIHNhdmVtZX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpgYGAK