1 Preprocessing DIA data via the instructions at: http://dia-swath-course.ethz.ch/tutorials2017/

2 Generating a high-res (HCD) spectral search library.

2.1 Reading metadata

For this set of data I will look only at the April 20 samples.

sample_sheet <- "sample_sheets/dda_samples.xlsx"
savefile <- "mzxml_dda_data_201805.rda"

metadata <- openxlsx::read.xlsx(sample_sheet)
keeper_idx <- metadata[["sampledate"]] == "20180420"
metadata <- metadata[keeper_idx, ]

knitr::kable(metadata)
sampleid sampletype condition batch enzyme sampledate rundate runinfo rawfile mzxmlfile note
3 2018_0420Briken01 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken07.raw mzXML/dda_201805_whole/2018_0420Briken01.mzXML NA
4 2018_0420Briken02 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken07.raw mzXML/dda_201805_whole/2018_0420Briken02.mzXML NA
5 2018_0420Briken03 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken07.raw mzXML/dda_201805_whole/2018_0420Briken03.mzXML NA
6 2018_0420Briken04 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken07.raw mzXML/dda_201805_whole/2018_0420Briken04.mzXML NA
7 2018_0420Briken05 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken07.raw mzXML/dda_201805_whole/2018_0420Briken05.mzXML NA
8 2018_0420Briken06 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken07.raw mzXML/dda_201805_whole/2018_0420Briken06.mzXML NA
9 2018_0420Briken07 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken07.raw mzXML/dda_201805_whole/2018_0420Briken07.mzXML NA
10 2018_0420Briken08 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken08.raw mzXML/dda_201805_whole/2018_0420Briken08.mzXML NA
11 2018_0420Briken11 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken11.raw mzXML/dda_201805_cf/2018_0420Briken11.mzXML NA
12 2018_0420Briken12 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken12.raw mzXML/dda_201805_cf/2018_0420Briken12.mzXML NA
13 2018_0420Briken13 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken13.raw mzXML/dda_201805_cf/2018_0420Briken13.mzXML NA
14 2018_0420Briken14 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken14.raw mzXML/dda_201805_cf/2018_0420Briken14.mzXML NA
15 2018_0420Briken15 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken15.raw mzXML/dda_201805_cf/2018_0420Briken15.mzXML NA
16 2018_0420Briken16 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken16.raw mzXML/dda_201805_cf/2018_0420Briken16.mzXML NA
17 2018_0420Briken17 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken17.raw mzXML/dda_201805_cf/2018_0420Briken17.mzXML NA
18 2018_0420Briken18 WT H37Rv Whole Cell Lysate wt e Trypsin 20180420 20180420 High resolution MS2 raw/2018_0420Briken18.raw mzXML/dda_201805_cf/2018_0420Briken18.mzXML NA

2.2 Gather data and plot metrics

if (file.exists(savefile)) {
  load(savefile)
} else {
  mzxml_data <- sm(extract_mzxml_data(metadata,
                                      file_column="mzxmlfile",
                                      savefile=savefile))
}

intensity_boxplot <- sm(plot_mzxml_boxplot(mzxml_data))
pp(file="images/mzxml_intensities.png", image=intensity_boxplot)
## Writing the image to: images/mzxml_intensities.png and calling dev.off().

retention_boxplot <- sm(plot_mzxml_boxplot(mzxml_data, table="scans", column="peakscount"))
pp(file="images/mzxml_retention.png", image=retention_boxplot)
## Writing the image to: images/mzxml_retention.png and calling dev.off().

mz_boxplot <- sm(plot_mzxml_boxplot(mzxml_data, table="scans", column="basepeakmz"))
pp(file="images/mzxml_mzbase.png", image=mz_boxplot)
## Writing the image to: images/mzxml_mzbase.png and calling dev.off().

scanintensity_boxplot <- sm(plot_mzxml_boxplot(mzxml_data, table="scans", column="basepeakintensity"))
pp(file="images/mzxml_scanintensity.png", image=scanintensity_boxplot)
## Writing the image to: images/mzxml_scanintensity.png and calling dev.off().

intensity_wrt_mz <- sm(plot_intensity_mz(mzxml_data, x_scale="log", y_scale="log"))
pp(file="images/intensity_wrt_mz_dia.png", image=intensity_wrt_mz$plot)
## Writing the image to: images/intensity_wrt_mz_dia.png and calling dev.off().
## Warning in guide_merge.legend(init, x[[i]]): Duplicated override.aes is
## ignored.

## Warning in guide_merge.legend(init, x[[i]]): Duplicated override.aes is
## ignored.

3 Get DIA metrics

Don’t forget that extract_mzxml_data() writes the acquisition window files required for openswathworkflow to run, so do not forget to run it.

3.1 Read dia metadata

sample_sheet <- "sample_sheets/Mtb_dia_samples.xlsx"
savefile <- "mzxml_dia_data_201805.rda"

metadata <- openxlsx::read.xlsx(sample_sheet)
keeper_idx <- metadata[["expt_id"]] == "may2018"
keeper_idx[is.na(keeper_idx)] <- FALSE
metadata <- metadata[keeper_idx, ]
knitr::kable(metadata)
sampleid TubeID Sample.Description BioReplicate techinical_replicate Run expt_id Condition batch windowsize enzyme harvestdate prepdate rundate runinfo rawfile Filename filtered_result unfiltered_result note
31 2018_0502BrikenDIA07 4.4.18–1 H37Rv ΔEsx-5A; Whole Cell Lysate br8 tr5 2018_0502BrikenDIA07 may2018 delta_whole unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA07.raw mzXML/dia_201805/2018_0502BrikenDIA07.mzXML NA NA for trypsin samples, instrument cleaned two days before. New trap column installed, analytical column relatively new
32 2018_0502BrikenDIA08 4.4.18–2 H37Rv ΔEsx-5A; Whole Cell Lysate br9 tr5 2018_0502BrikenDIA08 may2018 delta_whole unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA08.raw mzXML/dia_201805/2018_0502BrikenDIA08.mzXML NA NA NA
33 2018_0502BrikenDIA09 4.4.18–3 H37Rv ΔEsx-5A; Whole Cell Lysate br10 tr5 2018_0502BrikenDIA09 may2018 delta_whole unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA09.raw mzXML/dia_201805/2018_0502BrikenDIA09.mzXML NA NA NA
34 2018_0502BrikenDIA10 4.4.18–4 H37Rv ΔEsx-5A Complement; Whole Cell Lysate br11 tr5 2018_0502BrikenDIA10 may2018 comp_whole unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA10.raw mzXML/dia_201805/2018_0502BrikenDIA10.mzXML NA NA NA
35 2018_0502BrikenDIA11 4.4.18–5 H37Rv ΔEsx-5A Complement; Whole Cell Lysate br12 tr5 2018_0502BrikenDIA11 may2018 comp_whole unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA11.raw mzXML/dia_201805/2018_0502BrikenDIA11.mzXML NA NA NA
36 2018_0502BrikenDIA12 4.4.18–6 H37Rv ΔEsx-5A Complement; Whole Cell Lysate br13 tr5 2018_0502BrikenDIA12 may2018 comp_whole unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA12.raw mzXML/dia_201805/2018_0502BrikenDIA12.mzXML NA NA NA
37 2018_0502BrikenDIA01 4.4.18–7 H37Rv ΔEsx-5A; Culture Filtrate br14 tr5 2018_0502BrikenDIA01 may2018 delta_cf unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA01.raw mzXML/dia_201805/2018_0502BrikenDIA01.mzXML NA NA NA
38 2018_0502BrikenDIA02 4.4.18–8 H37Rv ΔEsx-5A; Culture Filtrate br15 tr5 2018_0502BrikenDIA02 may2018 delta_cf unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA02.raw mzXML/dia_201805/2018_0502BrikenDIA02.mzXML NA NA NA
39 2018_0502BrikenDIA03 4.4.18–9 H37Rv ΔEsx-5A; Culture Filtrate br16 tr5 2018_0502BrikenDIA03 may2018 delta_cf unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA03.raw mzXML/dia_201805/2018_0502BrikenDIA03.mzXML NA NA NA
40 2018_0502BrikenDIA04 4.4.18–10 H37Rv ΔEsx-5A Complement; Culture Filtrate br17 tr5 2018_0502BrikenDIA04 may2018 comp_cf unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA04.raw mzXML/dia_201805/2018_0502BrikenDIA04.mzXML NA NA NA
41 2018_0502BrikenDIA05 4.4.18–11 H37Rv ΔEsx-5A Complement; Culture Filtrate br18 tr5 2018_0502BrikenDIA05 may2018 comp_cf unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA05.raw mzXML/dia_201805/2018_0502BrikenDIA05.mzXML NA NA NA
42 2018_0502BrikenDIA06 4.4.18–12 H37Rv ΔEsx-5A Complement; Culture Filtrate br19 tr5 2018_0502BrikenDIA06 may2018 comp_cf unknown 8 Trypsin 20171019 20180403 20180502 NA raw/2018_0502BrikenDIA06.raw mzXML/dia_201805/2018_0502BrikenDIA06.mzXML NA NA NA

3.2 Plot dia metrics

Now let us plot the dia sample data.

if (file.exists(savefile)) {
  load(savefile)
} else {
  mzxml_data <- sm(extract_mzxml_data(metadata,
                                      file_column="Filename",
                                      savefile=savefile))
}

intensity_boxplot <- plot_mzxml_boxplot(mzxml_data)
## Adding 2018_0502BrikenDIA07
## Adding 2018_0502BrikenDIA08
## Adding 2018_0502BrikenDIA09
## Adding 2018_0502BrikenDIA10
## Adding 2018_0502BrikenDIA11
## Adding 2018_0502BrikenDIA12
## Adding 2018_0502BrikenDIA01
## Adding 2018_0502BrikenDIA02
## Adding 2018_0502BrikenDIA03
## Adding 2018_0502BrikenDIA04
## Adding 2018_0502BrikenDIA05
## Adding 2018_0502BrikenDIA06
## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some entries are 0.  We are on log scale, adding 1 to the data.
## Changed 213990 zero count features.
pp(file="images/201805_dia_mzxml_intensities.png", image=intensity_boxplot)
## Writing the image to: images/201805_dia_mzxml_intensities.png and calling dev.off().

retention_boxplot <- plot_mzxml_boxplot(mzxml_data, table="scans", column="peakscount")
## Adding 2018_0502BrikenDIA07
## Adding 2018_0502BrikenDIA08
## Adding 2018_0502BrikenDIA09
## Adding 2018_0502BrikenDIA10
## Adding 2018_0502BrikenDIA11
## Adding 2018_0502BrikenDIA12
## Adding 2018_0502BrikenDIA01
## Adding 2018_0502BrikenDIA02
## Adding 2018_0502BrikenDIA03
## Adding 2018_0502BrikenDIA04
## Adding 2018_0502BrikenDIA05
## Adding 2018_0502BrikenDIA06
pp(file="images/201805_dia_mzxml_retention.png", image=retention_boxplot)
## Writing the image to: images/201805_dia_mzxml_retention.png and calling dev.off().

mz_boxplot <- plot_mzxml_boxplot(mzxml_data, table="scans", column="basepeakmz")
## Adding 2018_0502BrikenDIA07
## Adding 2018_0502BrikenDIA08
## Adding 2018_0502BrikenDIA09
## Adding 2018_0502BrikenDIA10
## Adding 2018_0502BrikenDIA11
## Adding 2018_0502BrikenDIA12
## Adding 2018_0502BrikenDIA01
## Adding 2018_0502BrikenDIA02
## Adding 2018_0502BrikenDIA03
## Adding 2018_0502BrikenDIA04
## Adding 2018_0502BrikenDIA05
## Adding 2018_0502BrikenDIA06
pp(file="images/201805_dia_mzxml_mzbase.png", image=mz_boxplot)
## Writing the image to: images/201805_dia_mzxml_mzbase.png and calling dev.off().

scanintensity_boxplot <- plot_mzxml_boxplot(mzxml_data, table="scans", column="basepeakintensity")
## Adding 2018_0502BrikenDIA07
## Adding 2018_0502BrikenDIA08
## Adding 2018_0502BrikenDIA09
## Adding 2018_0502BrikenDIA10
## Adding 2018_0502BrikenDIA11
## Adding 2018_0502BrikenDIA12
## Adding 2018_0502BrikenDIA01
## Adding 2018_0502BrikenDIA02
## Adding 2018_0502BrikenDIA03
## Adding 2018_0502BrikenDIA04
## Adding 2018_0502BrikenDIA05
## Adding 2018_0502BrikenDIA06
pp(file="images/201805_dia_mzxml_scanintensity.png", image=scanintensity_boxplot)
## Writing the image to: images/201805_dia_mzxml_scanintensity.png and calling dev.off().

intensity_wrt_mz <- plot_intensity_mz(mzxml_data, x_scale="log", y_scale="log")
## Adding 2018_0502BrikenDIA07
## Adding 2018_0502BrikenDIA08
## Adding 2018_0502BrikenDIA09
## Adding 2018_0502BrikenDIA10
## Adding 2018_0502BrikenDIA11
## Adding 2018_0502BrikenDIA12
## Adding 2018_0502BrikenDIA01
## Adding 2018_0502BrikenDIA02
## Adding 2018_0502BrikenDIA03
## Adding 2018_0502BrikenDIA04
## Adding 2018_0502BrikenDIA05
## Adding 2018_0502BrikenDIA06
pp(file="images/201805_dia_intensity_wrt_mz_dia.png", image=intensity_wrt_mz)
## Writing the image to: images/201805_dia_intensity_wrt_mz_dia.png and calling dev.off().
## Warning in guide_merge.legend(init, x[[i]]): Duplicated override.aes is
## ignored.

## Warning in guide_merge.legend(init, x[[i]]): Duplicated override.aes is
## ignored.

export type="whole"
./transition_library_201805.sh 2>&1 1>transition_library_hcd_201805.out
cat transition_library_hcd_201805.out

3.3 Run openSwath separately

export type="whole"
./dia_invocation_hcd_201805.sh 2>&1 1>openswath_invocation_201805.out

3.4 Repeat, this time for the cell fractions.

export type="cf"
./transition_library_201805.sh 2>&1 1>transition_library_hcd_201805.out
cat transition_library_hcd_201805.out

./dia_invocation_hcd_201805.sh 2>&1 1>openswath_invocation_201805.out

4 Index version: 20180215

5 TODO

  • 2017-06-14:
if (!isTRUE(get0("skip_load"))) {
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
  message(paste0("Saving to ", this_save))
  tmp <- sm(saveme(filename=this_save))
  pander::pander(sessionInfo())
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 8de6008c66ed31502abbdef703c69345f86a6eed
## R> packrat::restore()
## This is hpgltools commit: Thu May 17 11:08:19 2018 -0400: 8de6008c66ed31502abbdef703c69345f86a6eed
## Saving to 01_preprocessing_comet_20180508-v20180215.rda.xz

R version 3.4.4 (2018-03-15)

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: hpgltools(v.2018.03)

loaded via a namespace (and not attached): Rcpp(v.0.12.16), RColorBrewer(v.1.1-2), compiler(v.3.4.4), pillar(v.1.2.2), plyr(v.1.8.4), highr(v.0.6), base64enc(v.0.1-3), iterators(v.1.0.9), tools(v.3.4.4), digest(v.0.6.15), evaluate(v.0.10.1), memoise(v.1.1.0), tibble(v.1.4.2), gtable(v.0.2.0), rlang(v.0.2.0.9001), openxlsx(v.4.0.17), foreach(v.1.4.4), commonmark(v.1.5), yaml(v.2.1.19), parallel(v.3.4.4), withr(v.2.1.2), stringr(v.1.3.1), knitr(v.1.20), roxygen2(v.6.0.1), xml2(v.1.2.0), devtools(v.1.13.5), rprojroot(v.1.3-2), grid(v.3.4.4), data.table(v.1.11.2), Biobase(v.2.38.0), R6(v.2.2.2), rmarkdown(v.1.9), pander(v.0.6.1), ggplot2(v.2.2.1), magrittr(v.1.5), backports(v.1.1.2), scales(v.0.5.0.9000), codetools(v.0.2-15), htmltools(v.0.3.6), BiocGenerics(v.0.24.0), colorspace(v.1.3-2), stringi(v.1.2.2), lazyeval(v.0.2.1) and munsell(v.0.4.3)

LS0tCnRpdGxlOiAiTS50dWJlcmN1bG9zaXMgMjAxODA1OiBQcmVwcm9jZXNzaW5nIERJQSBkYXRhIHdpdGggYSBjb21ldCBoaWdocmVzIGxpYnJhcnkgKG1vcmUgc2FtcGxlcykuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiBodG1sX2RvY3VtZW50OgogIGNvZGVfZG93bmxvYWQ6IHRydWUKICBjb2RlX2ZvbGRpbmc6IHNob3cKICBmaWdfY2FwdGlvbjogdHJ1ZQogIGZpZ19oZWlnaHQ6IDcKICBmaWdfd2lkdGg6IDcKICBoaWdobGlnaHQ6IGRlZmF1bHQKICBrZWVwX21kOiBmYWxzZQogIG1vZGU6IHNlbGZjb250YWluZWQKICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHRoZW1lOiByZWFkYWJsZQogIHRvYzogdHJ1ZQogIHRvY19mbG9hdDoKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4OwogIH0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIGxpYnJhcnkoaHBnbHRvb2xzKQogIHR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQogIGtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKICBrbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQ9OCwKICAgICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQogIG9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCiAgZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCiAgdmVyIDwtICIyMDE4MDIxNSIKICBwcmV2aW91c19maWxlIDwtICIwMV9hbm5vdGF0aW9uLlJtZCIKCiAgdG1wIDwtIHRyeShzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkpCiAgcm1kX2ZpbGUgPC0gIjAxX3ByZXByb2Nlc3NpbmdfY29tZXRfMjAxODA1MDguUm1kIgp9CmBgYAoKUHJlcHJvY2Vzc2luZyBESUEgZGF0YSB2aWEgdGhlIGluc3RydWN0aW9ucyBhdDogaHR0cDovL2RpYS1zd2F0aC1jb3Vyc2UuZXRoei5jaC90dXRvcmlhbHMyMDE3Lwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIEdlbmVyYXRpbmcgYSBoaWdoLXJlcyAoSENEKSBzcGVjdHJhbCBzZWFyY2ggbGlicmFyeS4KCiMjIFJlYWRpbmcgbWV0YWRhdGEKCkZvciB0aGlzIHNldCBvZiBkYXRhIEkgd2lsbCBsb29rIG9ubHkgYXQgdGhlIEFwcmlsIDIwIHNhbXBsZXMuCgpgYGB7ciBteV9kZGFfbWV0cmljc30Kc2FtcGxlX3NoZWV0IDwtICJzYW1wbGVfc2hlZXRzL2RkYV9zYW1wbGVzLnhsc3giCnNhdmVmaWxlIDwtICJtenhtbF9kZGFfZGF0YV8yMDE4MDUucmRhIgoKbWV0YWRhdGEgPC0gb3Blbnhsc3g6OnJlYWQueGxzeChzYW1wbGVfc2hlZXQpCmtlZXBlcl9pZHggPC0gbWV0YWRhdGFbWyJzYW1wbGVkYXRlIl1dID09ICIyMDE4MDQyMCIKbWV0YWRhdGEgPC0gbWV0YWRhdGFba2VlcGVyX2lkeCwgXQoKa25pdHI6OmthYmxlKG1ldGFkYXRhKQpgYGAKCiMjIEdhdGhlciBkYXRhIGFuZCBwbG90IG1ldHJpY3MKCmBgYHtyIGRkYV9wbG90c30KaWYgKGZpbGUuZXhpc3RzKHNhdmVmaWxlKSkgewogIGxvYWQoc2F2ZWZpbGUpCn0gZWxzZSB7CiAgbXp4bWxfZGF0YSA8LSBzbShleHRyYWN0X216eG1sX2RhdGEobWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW49Im16eG1sZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGU9c2F2ZWZpbGUpKQp9CgppbnRlbnNpdHlfYm94cGxvdCA8LSBzbShwbG90X216eG1sX2JveHBsb3QobXp4bWxfZGF0YSkpCnBwKGZpbGU9ImltYWdlcy9tenhtbF9pbnRlbnNpdGllcy5wbmciLCBpbWFnZT1pbnRlbnNpdHlfYm94cGxvdCkKCnJldGVudGlvbl9ib3hwbG90IDwtIHNtKHBsb3RfbXp4bWxfYm94cGxvdChtenhtbF9kYXRhLCB0YWJsZT0ic2NhbnMiLCBjb2x1bW49InBlYWtzY291bnQiKSkKcHAoZmlsZT0iaW1hZ2VzL216eG1sX3JldGVudGlvbi5wbmciLCBpbWFnZT1yZXRlbnRpb25fYm94cGxvdCkKCm16X2JveHBsb3QgPC0gc20ocGxvdF9tenhtbF9ib3hwbG90KG16eG1sX2RhdGEsIHRhYmxlPSJzY2FucyIsIGNvbHVtbj0iYmFzZXBlYWtteiIpKQpwcChmaWxlPSJpbWFnZXMvbXp4bWxfbXpiYXNlLnBuZyIsIGltYWdlPW16X2JveHBsb3QpCgpzY2FuaW50ZW5zaXR5X2JveHBsb3QgPC0gc20ocGxvdF9tenhtbF9ib3hwbG90KG16eG1sX2RhdGEsIHRhYmxlPSJzY2FucyIsIGNvbHVtbj0iYmFzZXBlYWtpbnRlbnNpdHkiKSkKcHAoZmlsZT0iaW1hZ2VzL216eG1sX3NjYW5pbnRlbnNpdHkucG5nIiwgaW1hZ2U9c2NhbmludGVuc2l0eV9ib3hwbG90KQoKaW50ZW5zaXR5X3dydF9teiA8LSBzbShwbG90X2ludGVuc2l0eV9teihtenhtbF9kYXRhLCB4X3NjYWxlPSJsb2ciLCB5X3NjYWxlPSJsb2ciKSkKcHAoZmlsZT0iaW1hZ2VzL2ludGVuc2l0eV93cnRfbXpfZGlhLnBuZyIsIGltYWdlPWludGVuc2l0eV93cnRfbXokcGxvdCkKYGBgCgojIEdldCBESUEgbWV0cmljcwoKRG9uJ3QgZm9yZ2V0IHRoYXQgZXh0cmFjdF9tenhtbF9kYXRhKCkgd3JpdGVzIHRoZSBhY3F1aXNpdGlvbiB3aW5kb3cgZmlsZXMKcmVxdWlyZWQgZm9yIG9wZW5zd2F0aHdvcmtmbG93IHRvIHJ1biwgc28gZG8gbm90IGZvcmdldCB0byBydW4gaXQuCgojIyBSZWFkIGRpYSBtZXRhZGF0YQoKYGBge3IgZGlhX21ldHJpY3N9CnNhbXBsZV9zaGVldCA8LSAic2FtcGxlX3NoZWV0cy9NdGJfZGlhX3NhbXBsZXMueGxzeCIKc2F2ZWZpbGUgPC0gIm16eG1sX2RpYV9kYXRhXzIwMTgwNS5yZGEiCgptZXRhZGF0YSA8LSBvcGVueGxzeDo6cmVhZC54bHN4KHNhbXBsZV9zaGVldCkKa2VlcGVyX2lkeCA8LSBtZXRhZGF0YVtbImV4cHRfaWQiXV0gPT0gIm1heTIwMTgiCmtlZXBlcl9pZHhbaXMubmEoa2VlcGVyX2lkeCldIDwtIEZBTFNFCm1ldGFkYXRhIDwtIG1ldGFkYXRhW2tlZXBlcl9pZHgsIF0Ka25pdHI6OmthYmxlKG1ldGFkYXRhKQpgYGAKCiMjIFBsb3QgZGlhIG1ldHJpY3MKCk5vdyBsZXQgdXMgcGxvdCB0aGUgZGlhIHNhbXBsZSBkYXRhLgoKYGBge3IgZGlhX3Bsb3RzfQppZiAoZmlsZS5leGlzdHMoc2F2ZWZpbGUpKSB7CiAgbG9hZChzYXZlZmlsZSkKfSBlbHNlIHsKICBtenhtbF9kYXRhIDwtIHNtKGV4dHJhY3RfbXp4bWxfZGF0YShtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbj0iRmlsZW5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVmaWxlPXNhdmVmaWxlKSkKfQoKaW50ZW5zaXR5X2JveHBsb3QgPC0gcGxvdF9tenhtbF9ib3hwbG90KG16eG1sX2RhdGEpCnBwKGZpbGU9ImltYWdlcy8yMDE4MDVfZGlhX216eG1sX2ludGVuc2l0aWVzLnBuZyIsIGltYWdlPWludGVuc2l0eV9ib3hwbG90KQoKcmV0ZW50aW9uX2JveHBsb3QgPC0gcGxvdF9tenhtbF9ib3hwbG90KG16eG1sX2RhdGEsIHRhYmxlPSJzY2FucyIsIGNvbHVtbj0icGVha3Njb3VudCIpCnBwKGZpbGU9ImltYWdlcy8yMDE4MDVfZGlhX216eG1sX3JldGVudGlvbi5wbmciLCBpbWFnZT1yZXRlbnRpb25fYm94cGxvdCkKCm16X2JveHBsb3QgPC0gcGxvdF9tenhtbF9ib3hwbG90KG16eG1sX2RhdGEsIHRhYmxlPSJzY2FucyIsIGNvbHVtbj0iYmFzZXBlYWtteiIpCnBwKGZpbGU9ImltYWdlcy8yMDE4MDVfZGlhX216eG1sX216YmFzZS5wbmciLCBpbWFnZT1tel9ib3hwbG90KQoKc2NhbmludGVuc2l0eV9ib3hwbG90IDwtIHBsb3RfbXp4bWxfYm94cGxvdChtenhtbF9kYXRhLCB0YWJsZT0ic2NhbnMiLCBjb2x1bW49ImJhc2VwZWFraW50ZW5zaXR5IikKcHAoZmlsZT0iaW1hZ2VzLzIwMTgwNV9kaWFfbXp4bWxfc2NhbmludGVuc2l0eS5wbmciLCBpbWFnZT1zY2FuaW50ZW5zaXR5X2JveHBsb3QpCgppbnRlbnNpdHlfd3J0X216IDwtIHBsb3RfaW50ZW5zaXR5X216KG16eG1sX2RhdGEsIHhfc2NhbGU9ImxvZyIsIHlfc2NhbGU9ImxvZyIpCnBwKGZpbGU9ImltYWdlcy8yMDE4MDVfZGlhX2ludGVuc2l0eV93cnRfbXpfZGlhLnBuZyIsIGltYWdlPWludGVuc2l0eV93cnRfbXopCmBgYAoKYGBge2Jhc2ggbWFrZV90cmFuc2l0aW9uc18wMSwgZXZhbD1GQUxTRX0KZXhwb3J0IHR5cGU9Indob2xlIgouL3RyYW5zaXRpb25fbGlicmFyeV8yMDE4MDUuc2ggMj4mMSAxPnRyYW5zaXRpb25fbGlicmFyeV9oY2RfMjAxODA1Lm91dApjYXQgdHJhbnNpdGlvbl9saWJyYXJ5X2hjZF8yMDE4MDUub3V0CmBgYAoKIyMgUnVuIG9wZW5Td2F0aCBzZXBhcmF0ZWx5CgpgYGB7YmFzaCBydW5fb3BlbnN3YXRoLCBldmFsPUZBTFNFfQpleHBvcnQgdHlwZT0id2hvbGUiCi4vZGlhX2ludm9jYXRpb25faGNkXzIwMTgwNS5zaCAyPiYxIDE+b3BlbnN3YXRoX2ludm9jYXRpb25fMjAxODA1Lm91dApgYGAKCiMjIFJlcGVhdCwgdGhpcyB0aW1lIGZvciB0aGUgY2VsbCBmcmFjdGlvbnMuCgpgYGB7YmFzaCBtYWtlX3RyYW5zaXRpb25zXzAyLCBldmFsPUZBTFNFfQpleHBvcnQgdHlwZT0iY2YiCi4vdHJhbnNpdGlvbl9saWJyYXJ5XzIwMTgwNS5zaCAyPiYxIDE+dHJhbnNpdGlvbl9saWJyYXJ5X2hjZF8yMDE4MDUub3V0CmNhdCB0cmFuc2l0aW9uX2xpYnJhcnlfaGNkXzIwMTgwNS5vdXQKCi4vZGlhX2ludm9jYXRpb25faGNkXzIwMTgwNS5zaCAyPiYxIDE+b3BlbnN3YXRoX2ludm9jYXRpb25fMjAxODA1Lm91dApgYGAKCiMgSW5kZXggdmVyc2lvbjogYHIgdmVyYAoKIyBUT0RPCgoqIDIwMTctMDYtMTQ6CgpgYGB7ciBzYXZlbWV9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIG1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQogIHRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCiAgbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQogIHRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKSkKICBwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQp9CmBgYAo=