Note: modified from Sam White’s code in 00.00-D-Apul-RNAseq-reads-FastQC-MultiQC
This Rmd file will download raw RNA-seq FastQs for A.pulchra and evaluate them using FastQC and MultiQC(Ewels et al. 2016).
Create a Bash variables file
This allows usage of Bash variables across R Markdown chunks.
{
echo "#### Assign Variables ####"
echo ""
echo "# Data directories"
echo 'export timeseries_dir=/home/shared/8TB_HDD_02/shedurkin/timeseries_molecular'
echo 'export output_dir_top=${timeseries_dir}/D-Apul/output/00.10-D-Apul-sRNAseq-reads-FastQC-MultiQC'
echo 'export raw_fastqc_dir=${output_dir_top}/raw-fastqc-sRNA'
echo 'export raw_reads_dir=${timeseries_dir}/D-Apul/data/raw-fastqs-sRNA'
echo 'export raw_reads_url="https://owl.fish.washington.edu/nightingales/E5-coral-time-series/30-1069297013/"'
echo ""
echo "# Paths to programs"
echo 'export fastqc=/home/shared/FastQC-0.12.1/fastqc'
echo 'export multiqc=/home/sam/programs/mambaforge/bin/multiqc'
echo ""
echo "# Set FastQ filename patterns"
echo "export fastq_pattern='*.fastq.gz'"
echo "export R1_fastq_pattern='*_R1_*.fastq.gz'"
echo "export R2_fastq_pattern='*_R2_*.fastq.gz'"
echo ""
echo "# Set number of CPUs to use"
echo 'export threads=40'
echo ""
echo "## Inititalize arrays"
echo 'export fastq_array_R1=()'
echo 'export fastq_array_R2=()'
echo 'export raw_fastqs_array=()'
echo 'export R1_names_array=()'
echo 'export R2_names_array=()'
echo ""
echo "# Programs associative array"
echo "declare -A programs_array"
echo "programs_array=("
echo '[fastqc]="${fastqc}" \'
echo '[multiqc]="${multiqc}" \'
echo ")"
echo ""
echo "# Print formatting"
echo 'export line="--------------------------------------------------------"'
echo ""
} > .bashvars
cat .bashvars
#### Assign Variables ####
# Data directories
export timeseries_dir=/home/shared/8TB_HDD_02/shedurkin/timeseries_molecular
export output_dir_top=${timeseries_dir}/D-Apul/output/00.10-D-Apul-sRNAseq-reads-FastQC-MultiQC
export raw_fastqc_dir=${output_dir_top}/raw-fastqc-sRNA
export raw_reads_dir=${timeseries_dir}/D-Apul/data/raw-fastqs-sRNA
export raw_reads_url="https://owl.fish.washington.edu/nightingales/E5-coral-time-series/30-1069297013/"
# Paths to programs
export fastqc=/home/shared/FastQC-0.12.1/fastqc
export multiqc=/home/sam/programs/mambaforge/bin/multiqc
# Set FastQ filename patterns
export fastq_pattern='*.fastq.gz'
export R1_fastq_pattern='*_R1_*.fastq.gz'
export R2_fastq_pattern='*_R2_*.fastq.gz'
# Set number of CPUs to use
export threads=40
## Inititalize arrays
export fastq_array_R1=()
export fastq_array_R2=()
export raw_fastqs_array=()
export R1_names_array=()
export R2_names_array=()
# Programs associative array
declare -A programs_array
programs_array=(
[fastqc]="${fastqc}" \
[multiqc]="${multiqc}" \
)
# Print formatting
export line="--------------------------------------------------------"
Download A.pulchra sRNA-seq FastQs
Download raw sRNA-seq reads
Reads are downloaded from https://owl.fish.washington.edu/nightingales/E5-coral-time-series/30-1069297013/
Since sequencing included multiple species, the code will also parse only those that are A.pulchra.
The --cut-dirs 3
command cuts the preceding directory structure (i.e. nightingales/E5-coral-time-series/30-1047560508/
) so that we just end up with the reads.
# Load bash variables into memory
source .bashvars
# Make output directory if it doesn't exist
mkdir --parents ${raw_reads_dir}
# Create list of only A.pulchra sample names
sample_list=$(awk -F "," '$6 ~ /^ACR/ {print $5}' ${timeseries_dir}/M-multi-species/data/rna_metadata.csv)
echo ""
echo "${line}"
echo ""
echo "Sample list:"
echo ""
echo "${sample_list}"
echo ""
echo "${line}"
echo ""
# Use printf to format each item for use in wget
formatted_list=$(printf "%s_*," ${sample_list})
# Remove the trailing comma
formatted_list=${formatted_list%,}
# Output the final wget command
echo ""
echo "${line}"
echo ""
echo "Formatted wget accept list:"
echo ""
echo "wget --accept=\"$formatted_list\""
echo ""
echo "${line}"
echo ""
# Run wget to retrieve FastQs and MD5 files
# Note: the --no-clobber command will skip re-downloading any files that are already present in the output directory
wget \
--directory-prefix ${raw_reads_dir} \
--recursive \
--no-check-certificate \
--continue \
--cut-dirs 3 \
--no-host-directories \
--no-parent \
--quiet \
--no-clobber \
--accept=${formatted_list} ${raw_reads_url}
ls -lh "${raw_reads_dir}"
Check number of files
We have 40 A.pulchra samples (10 colonies, 4 timepoints each), so there should be 80 total sequence files (forward and reverse read for each sample).
# Load bash variables into memory
source .bashvars
echo "Number of fastq files:"
ls ${raw_reads_dir}/${fastq_pattern} | wc -l
echo "Number of md5 files:"
ls ${raw_reads_dir}/*.md5 | wc -l
We’re good!
Verify raw read checksums
# Load bash variables into memory
source .bashvars
cd "${raw_reads_dir}"
# Checksums file contains other files, so this just looks for the sRNAseq files.
for file in *.md5
do
md5sum --check "${file}"
done
FastQC/MultiQC on raw reads
# Load bash variables into memory
source .bashvars
# Make output directory if it doesn't exist
mkdir --parents "${raw_fastqc_dir}"
############ RUN FASTQC ############
# Create array of trimmed FastQs
raw_fastqs_array=(${raw_reads_dir}/${fastq_pattern})
# Pass array contents to new variable as space-delimited list
raw_fastqc_list=$(echo "${raw_fastqs_array[*]}")
echo "Beginning FastQC on raw reads..."
echo ""
# Run FastQC
### NOTE: Do NOT quote raw_fastqc_list
${programs_array[fastqc]} \
--threads ${threads} \
--outdir ${raw_fastqc_dir} \
--quiet \
${raw_fastqc_list}
echo "FastQC on raw reads complete!"
echo ""
############ END FASTQC ############
############ RUN MULTIQC ############
echo "Beginning MultiQC on raw FastQC..."
echo ""
${programs_array[multiqc]} ${raw_fastqc_dir} -o ${raw_fastqc_dir}
echo ""
echo "MultiQC on raw FastQs complete."
echo ""
############ END MULTIQC ############
echo "Removing FastQC zip files."
echo ""
rm ${raw_fastqc_dir}/*.zip
echo "FastQC zip files removed."
echo ""
# View directory contents
ls -lh ${raw_fastqc_dir}
Ewels, Philip, Måns Magnusson, Sverker Lundin, and Max Käller. 2016.
“MultiQC: Summarize Analysis Results for Multiple Tools and Samples in a Single Report.” Bioinformatics 32 (19): 3047–48.
https://doi.org/10.1093/bioinformatics/btw354.
LS0tCnRpdGxlOiAiMDAuMTAtRC1BcHVsLXNSTkFzZXEtcmVhZHMtRmFzdFFDLU11bHRpUUMuUm1kIgphdXRob3I6ICJLYXRobGVlbiBEdXJraW4iCmRhdGU6ICIyMDI0LTEyLTE4IgpvdXRwdXQ6IAogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgZ2l0aHViX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYgotLS0KCk5vdGU6IG1vZGlmaWVkIGZyb20gU2FtIFdoaXRlJ3MgY29kZSBpbiBgMDAuMDAtRC1BcHVsLVJOQXNlcS1yZWFkcy1GYXN0UUMtTXVsdGlRQ2AKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IFRSVUUsICAgICAgICAgIyBEaXNwbGF5IGNvZGUgY2h1bmtzCiAgZXZhbCA9IEZBTFNFLCAgICAgICAgIyBFdmFsdWF0ZSBjb2RlIGNodW5rcwogIHdhcm5pbmcgPSBGQUxTRSwgICAgICMgSGlkZSB3YXJuaW5ncwogIG1lc3NhZ2UgPSBGQUxTRSwgICAgICMgSGlkZSBtZXNzYWdlcwogIGNvbW1lbnQgPSAiIiAgICAgICAgICMgUHJldmVudHMgYXBwZW5kaW5nICcjIycgdG8gYmVnaW5uaW5nIG9mIGxpbmVzIGluIGNvZGUgb3V0cHV0CikKYGBgCgpUaGlzIFJtZCBmaWxlIHdpbGwgZG93bmxvYWQgcmF3IFJOQS1zZXEgRmFzdFFzIGZvciAqQS5wdWxjaHJhKiBhbmQgZXZhbHVhdGUgdGhlbSB1c2luZyBbRmFzdFFDXShodHRwczovL2dpdGh1Yi5jb20vcy1hbmRyZXdzL0Zhc3RRQykgYW5kIFtNdWx0aVFDXShodHRwczovL211bHRpcWMuaW5mby8pW0Bld2VsczIwMTZdLgoKIyBDcmVhdGUgYSBCYXNoIHZhcmlhYmxlcyBmaWxlCgpUaGlzIGFsbG93cyB1c2FnZSBvZiBCYXNoIHZhcmlhYmxlcyBhY3Jvc3MgUiBNYXJrZG93biBjaHVua3MuCgpgYGB7ciBzYXZlLWJhc2gtdmFyaWFibGVzLXRvLXJ2YXJzLWZpbGUsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KewplY2hvICIjIyMjIEFzc2lnbiBWYXJpYWJsZXMgIyMjIyIKZWNobyAiIgoKZWNobyAiIyBEYXRhIGRpcmVjdG9yaWVzIgplY2hvICdleHBvcnQgdGltZXNlcmllc19kaXI9L2hvbWUvc2hhcmVkLzhUQl9IRERfMDIvc2hlZHVya2luL3RpbWVzZXJpZXNfbW9sZWN1bGFyJwplY2hvICdleHBvcnQgb3V0cHV0X2Rpcl90b3A9JHt0aW1lc2VyaWVzX2Rpcn0vRC1BcHVsL291dHB1dC8wMC4xMC1ELUFwdWwtc1JOQXNlcS1yZWFkcy1GYXN0UUMtTXVsdGlRQycKZWNobyAnZXhwb3J0IHJhd19mYXN0cWNfZGlyPSR7b3V0cHV0X2Rpcl90b3B9L3Jhdy1mYXN0cWMtc1JOQScKZWNobyAnZXhwb3J0IHJhd19yZWFkc19kaXI9JHt0aW1lc2VyaWVzX2Rpcn0vRC1BcHVsL2RhdGEvcmF3LWZhc3Rxcy1zUk5BJwplY2hvICdleHBvcnQgcmF3X3JlYWRzX3VybD0iaHR0cHM6Ly9vd2wuZmlzaC53YXNoaW5ndG9uLmVkdS9uaWdodGluZ2FsZXMvRTUtY29yYWwtdGltZS1zZXJpZXMvMzAtMTA2OTI5NzAxMy8iJwplY2hvICIiCgplY2hvICIjIFBhdGhzIHRvIHByb2dyYW1zIgplY2hvICdleHBvcnQgZmFzdHFjPS9ob21lL3NoYXJlZC9GYXN0UUMtMC4xMi4xL2Zhc3RxYycKZWNobyAnZXhwb3J0IG11bHRpcWM9L2hvbWUvc2FtL3Byb2dyYW1zL21hbWJhZm9yZ2UvYmluL211bHRpcWMnCmVjaG8gIiIKCmVjaG8gIiMgU2V0IEZhc3RRIGZpbGVuYW1lIHBhdHRlcm5zIgplY2hvICJleHBvcnQgZmFzdHFfcGF0dGVybj0nKi5mYXN0cS5neiciCmVjaG8gImV4cG9ydCBSMV9mYXN0cV9wYXR0ZXJuPScqX1IxXyouZmFzdHEuZ3onIgplY2hvICJleHBvcnQgUjJfZmFzdHFfcGF0dGVybj0nKl9SMl8qLmZhc3RxLmd6JyIKZWNobyAiIgoKZWNobyAiIyBTZXQgbnVtYmVyIG9mIENQVXMgdG8gdXNlIgplY2hvICdleHBvcnQgdGhyZWFkcz00MCcKZWNobyAiIgoKCmVjaG8gIiMjIEluaXRpdGFsaXplIGFycmF5cyIKZWNobyAnZXhwb3J0IGZhc3RxX2FycmF5X1IxPSgpJwplY2hvICdleHBvcnQgZmFzdHFfYXJyYXlfUjI9KCknCmVjaG8gJ2V4cG9ydCByYXdfZmFzdHFzX2FycmF5PSgpJwplY2hvICdleHBvcnQgUjFfbmFtZXNfYXJyYXk9KCknCmVjaG8gJ2V4cG9ydCBSMl9uYW1lc19hcnJheT0oKScKZWNobyAiIgoKZWNobyAiIyBQcm9ncmFtcyBhc3NvY2lhdGl2ZSBhcnJheSIKZWNobyAiZGVjbGFyZSAtQSBwcm9ncmFtc19hcnJheSIKZWNobyAicHJvZ3JhbXNfYXJyYXk9KCIKZWNobyAnW2Zhc3RxY109IiR7ZmFzdHFjfSIgXCcKZWNobyAnW211bHRpcWNdPSIke211bHRpcWN9IiBcJwplY2hvICIpIgplY2hvICIiCgplY2hvICIjIFByaW50IGZvcm1hdHRpbmciCmVjaG8gJ2V4cG9ydCBsaW5lPSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSInCmVjaG8gIiIKfSA+IC5iYXNodmFycwoKY2F0IC5iYXNodmFycwpgYGAKCiMgRG93bmxvYWQgKkEucHVsY2hyYSogc1JOQS1zZXEgRmFzdFFzCgojIyBEb3dubG9hZCByYXcgc1JOQS1zZXEgcmVhZHMKClJlYWRzIGFyZSBkb3dubG9hZGVkIGZyb20gPGh0dHBzOi8vb3dsLmZpc2gud2FzaGluZ3Rvbi5lZHUvbmlnaHRpbmdhbGVzL0U1LWNvcmFsLXRpbWUtc2VyaWVzLzMwLTEwNjkyOTcwMTMvPgoKU2luY2Ugc2VxdWVuY2luZyBpbmNsdWRlZCBtdWx0aXBsZSBzcGVjaWVzLCB0aGUgY29kZSB3aWxsIGFsc28gcGFyc2Ugb25seSB0aG9zZSB0aGF0IGFyZSAqQS5wdWxjaHJhKi4KClRoZSBgLS1jdXQtZGlycyAzYCBjb21tYW5kIGN1dHMgdGhlIHByZWNlZGluZyBkaXJlY3Rvcnkgc3RydWN0dXJlIChpLmUuIGBuaWdodGluZ2FsZXMvRTUtY29yYWwtdGltZS1zZXJpZXMvMzAtMTA0NzU2MDUwOC9gKSBzbyB0aGF0IHdlIGp1c3QgZW5kIHVwIHdpdGggdGhlIHJlYWRzLgoKYGBge2Jhc2ggZG93bmxvYWQtcmF3LXJlYWRzLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKIyBNYWtlIG91dHB1dCBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdApta2RpciAtLXBhcmVudHMgJHtyYXdfcmVhZHNfZGlyfQoKIyBDcmVhdGUgbGlzdCBvZiBvbmx5IEEucHVsY2hyYSBzYW1wbGUgbmFtZXMKc2FtcGxlX2xpc3Q9JChhd2sgLUYgIiwiICckNiB+IC9eQUNSLyB7cHJpbnQgJDV9JyAke3RpbWVzZXJpZXNfZGlyfS9NLW11bHRpLXNwZWNpZXMvZGF0YS9ybmFfbWV0YWRhdGEuY3N2KQoKZWNobyAiIgplY2hvICIke2xpbmV9IgplY2hvICIiCmVjaG8gIlNhbXBsZSBsaXN0OiIKZWNobyAiIgplY2hvICIke3NhbXBsZV9saXN0fSIKZWNobyAiIgplY2hvICIke2xpbmV9IgplY2hvICIiCgoKIyBVc2UgcHJpbnRmIHRvIGZvcm1hdCBlYWNoIGl0ZW0gZm9yIHVzZSBpbiB3Z2V0CmZvcm1hdHRlZF9saXN0PSQocHJpbnRmICIlc18qLCIgJHtzYW1wbGVfbGlzdH0pCgojIFJlbW92ZSB0aGUgdHJhaWxpbmcgY29tbWEKZm9ybWF0dGVkX2xpc3Q9JHtmb3JtYXR0ZWRfbGlzdCUsfQoKIyBPdXRwdXQgdGhlIGZpbmFsIHdnZXQgY29tbWFuZAplY2hvICIiCmVjaG8gIiR7bGluZX0iCmVjaG8gIiIKZWNobyAiRm9ybWF0dGVkIHdnZXQgYWNjZXB0IGxpc3Q6IgplY2hvICIiCmVjaG8gIndnZXQgLS1hY2NlcHQ9XCIkZm9ybWF0dGVkX2xpc3RcIiIKZWNobyAiIgplY2hvICIke2xpbmV9IgplY2hvICIiCgojIFJ1biB3Z2V0IHRvIHJldHJpZXZlIEZhc3RRcyBhbmQgTUQ1IGZpbGVzCiMgTm90ZTogdGhlIC0tbm8tY2xvYmJlciBjb21tYW5kIHdpbGwgc2tpcCByZS1kb3dubG9hZGluZyBhbnkgZmlsZXMgdGhhdCBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5CndnZXQgXAotLWRpcmVjdG9yeS1wcmVmaXggJHtyYXdfcmVhZHNfZGlyfSBcCi0tcmVjdXJzaXZlIFwKLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSBcCi0tY29udGludWUgXAotLWN1dC1kaXJzIDMgXAotLW5vLWhvc3QtZGlyZWN0b3JpZXMgXAotLW5vLXBhcmVudCBcCi0tcXVpZXQgXAotLW5vLWNsb2JiZXIgXAotLWFjY2VwdD0ke2Zvcm1hdHRlZF9saXN0fSAke3Jhd19yZWFkc191cmx9CgpscyAtbGggIiR7cmF3X3JlYWRzX2Rpcn0iCmBgYAoKIyMgQ2hlY2sgbnVtYmVyIG9mIGZpbGVzCgpXZSBoYXZlIDQwIEEucHVsY2hyYSBzYW1wbGVzICgxMCBjb2xvbmllcywgNCB0aW1lcG9pbnRzIGVhY2gpLCBzbyB0aGVyZSBzaG91bGQgYmUgODAgdG90YWwgc2VxdWVuY2UgZmlsZXMgKGZvcndhcmQgYW5kIHJldmVyc2UgcmVhZCBmb3IgZWFjaCBzYW1wbGUpLgoKYGBge3IsIGVuZ2luZT0nYmFzaCd9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgplY2hvICJOdW1iZXIgb2YgZmFzdHEgZmlsZXM6IgpscyAke3Jhd19yZWFkc19kaXJ9LyR7ZmFzdHFfcGF0dGVybn0gfCB3YyAtbAoKZWNobyAiTnVtYmVyIG9mIG1kNSBmaWxlczoiCmxzICR7cmF3X3JlYWRzX2Rpcn0vKi5tZDUgfCB3YyAtbApgYGAKV2UncmUgZ29vZCEKCiMjIFZlcmlmeSByYXcgcmVhZCBjaGVja3N1bXMKCmBgYHtiYXNoIHZlcmlmeS1yYXctcmVhZC1jaGVja3N1bXMsIGVuZ2luZT0nYmFzaCd9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgpjZCAiJHtyYXdfcmVhZHNfZGlyfSIKCiMgQ2hlY2tzdW1zIGZpbGUgY29udGFpbnMgb3RoZXIgZmlsZXMsIHNvIHRoaXMganVzdCBsb29rcyBmb3IgdGhlIHNSTkFzZXEgZmlsZXMuCmZvciBmaWxlIGluICoubWQ1CmRvCiAgbWQ1c3VtIC0tY2hlY2sgIiR7ZmlsZX0iCmRvbmUKYGBgCgojIEZhc3RRQy9NdWx0aVFDIG9uIHJhdyByZWFkcwoKYGBge2Jhc2ggcmF3LWZhc3RxYy1tdWx0aXFjLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKIyBNYWtlIG91dHB1dCBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdApta2RpciAtLXBhcmVudHMgIiR7cmF3X2Zhc3RxY19kaXJ9IgoKIyMjIyMjIyMjIyMjIFJVTiBGQVNUUUMgIyMjIyMjIyMjIyMjCgoKIyBDcmVhdGUgYXJyYXkgb2YgdHJpbW1lZCBGYXN0UXMKcmF3X2Zhc3Rxc19hcnJheT0oJHtyYXdfcmVhZHNfZGlyfS8ke2Zhc3RxX3BhdHRlcm59KQoKIyBQYXNzIGFycmF5IGNvbnRlbnRzIHRvIG5ldyB2YXJpYWJsZSBhcyBzcGFjZS1kZWxpbWl0ZWQgbGlzdApyYXdfZmFzdHFjX2xpc3Q9JChlY2hvICIke3Jhd19mYXN0cXNfYXJyYXlbKl19IikKCmVjaG8gIkJlZ2lubmluZyBGYXN0UUMgb24gcmF3IHJlYWRzLi4uIgplY2hvICIiCgojIFJ1biBGYXN0UUMKIyMjIE5PVEU6IERvIE5PVCBxdW90ZSByYXdfZmFzdHFjX2xpc3QKJHtwcm9ncmFtc19hcnJheVtmYXN0cWNdfSBcCi0tdGhyZWFkcyAke3RocmVhZHN9IFwKLS1vdXRkaXIgJHtyYXdfZmFzdHFjX2Rpcn0gXAotLXF1aWV0IFwKJHtyYXdfZmFzdHFjX2xpc3R9CgplY2hvICJGYXN0UUMgb24gcmF3IHJlYWRzIGNvbXBsZXRlISIKZWNobyAiIgoKIyMjIyMjIyMjIyMjIEVORCBGQVNUUUMgIyMjIyMjIyMjIyMjCgojIyMjIyMjIyMjIyMgUlVOIE1VTFRJUUMgIyMjIyMjIyMjIyMjCmVjaG8gIkJlZ2lubmluZyBNdWx0aVFDIG9uIHJhdyBGYXN0UUMuLi4iCmVjaG8gIiIKCiR7cHJvZ3JhbXNfYXJyYXlbbXVsdGlxY119ICR7cmF3X2Zhc3RxY19kaXJ9IC1vICR7cmF3X2Zhc3RxY19kaXJ9CgplY2hvICIiCmVjaG8gIk11bHRpUUMgb24gcmF3IEZhc3RRcyBjb21wbGV0ZS4iCmVjaG8gIiIKCiMjIyMjIyMjIyMjIyBFTkQgTVVMVElRQyAjIyMjIyMjIyMjIyMKCmVjaG8gIlJlbW92aW5nIEZhc3RRQyB6aXAgZmlsZXMuIgplY2hvICIiCnJtICR7cmF3X2Zhc3RxY19kaXJ9LyouemlwCmVjaG8gIkZhc3RRQyB6aXAgZmlsZXMgcmVtb3ZlZC4iCmVjaG8gIiIKCiMgVmlldyBkaXJlY3RvcnkgY29udGVudHMKbHMgLWxoICR7cmF3X2Zhc3RxY19kaXJ9CgpgYGAK