Reference, Resources and Data

Nature Protocols volume 8, pages 1494-1512 (2013)

Machine: CentOS Linux 7 on Virtual Box

Starting directory and subdirectory contents

trinity2$ ls -l

drwxrwxr-x. 3 bdash bdash 149 Mar 24 17:58 Sp_ds

-rwxrwx—. 1 bdash bdash 175846179 Mar 24 13:01 Sp.ds.1M.left.fq

-rwxrwx—. 1 bdash bdash 175846179 Mar 24 13:01 Sp.ds.1M.right.fq

drwxrwxr-x. 3 bdash bdash 149 Mar 24 18:11 Sp_hs

-rwxrwx—. 1 bdash bdash 175736042 Mar 24 13:02 Sp.hs.1M.left.fq

-rwxrwx—. 1 bdash bdash 175736042 Mar 24 13:02 Sp.hs.1M.right.fq

drwxrwxr-x. 3 bdash bdash 149 Mar 24 18:28 Sp_log

-rwxrwx—. 1 bdash bdash 175741215 Mar 24 13:03 Sp.log.1M.left.fq

-rwxrwx—. 1 bdash bdash 175741215 Mar 24 13:03 Sp.log.1M.right.fq

drwxrwxr-x. 3 bdash bdash 149 Mar 24 18:20 Sp_plat

-rwxrwx—. 1 bdash bdash 175899533 Mar 24 13:03 Sp.plat.1M.left.fq

-rwxrwx—. 1 bdash bdash 175899533 Mar 24 13:03 Sp.plat.1M.right.fq

drwxr-xr-x. 2 bdash bdash 4096 Mar 25 11:27 trinity_out_dir

Combine RSEM-computed fragment counts into a matrix file

trinity2$ abundance_estimates_to_matrix.pl –est_method RSEM Sp_ds/RSEM.genes.results Sp_hs/RSEM.genes.results Sp_plat/RSEM.genes.results Sp_log/RSEM.ge nes.results –gene_trans_map trinity_out_dir/Trinity.fasta.gene_trans_map –name_sample_by_basedir –out_prefix genes

Some log readouts

-reading file: Sp_ds/RSEM.genes.results

-reading file: Sp_hs/RSEM.genes.results

-reading file: Sp_plat/RSEM.genes.results

-reading file: Sp_log/RSEM.genes.results

  • Outputting combined matrix.

/home/bdash/miniconda2/opt/trinity-2.5.1/util/support_scripts/run_TMM_scale_matrix.pl –matrix genes.isoform.TPM.not_cross_norm > genes.isoform.TMM.EXPR.matrixCMD: R –vanilla -q < __tmp_runTMM.R 1>&2

library(edgeR)

Loading required package: limma

rnaseqMatrix = read.table(“genes.isoform.TPM.not_cross_norm”, header=T, row.names=1, com=’’, check.names=F)

rnaseqMatrix = as.matrix(rnaseqMatrix)

rnaseqMatrix = round(rnaseqMatrix)

exp_study = DGEList(counts=rnaseqMatrix, group=factor(colnames(rnaseqMatrix)))

exp_study = calcNormFactors(exp_study)

exp_study\(samples\)eff.lib.size = exp_study\(samples\)lib.size * exp_study\(samples\)norm.factors

write.table(exp_study$samples, file=“genes.isoform.TPM.not_cross_norm.TMM_info.txt”, quote=F, sep=", row.names=F)

/home/bdash/miniconda2/opt/trinity-2.5.1/util/support_scripts/run_TMM_scale_matrix.pl –matrix genes.gene.TPM.not_cross_norm genes.gene.TMM.EXPR.matrixCMD: R –vanilla -q < __tmp_runTMM.R 1>&2

library(edgeR)

Loading required package: limma

rnaseqMatrix = read.table(“genes.gene.TPM.not_cross_norm”, header=T, row.names=1, com=’’, check.names=F)

rnaseqMatrix = as.matrix(rnaseqMatrix)

rnaseqMatrix = round(rnaseqMatrix)

exp_study = DGEList(counts=rnaseqMatrix, group=factor(colnames(rnaseqMatrix)))

exp_study = calcNormFactors(exp_study)

exp_study\(samples\)eff.lib.size = exp_study\(samples\)lib.size * exp_study\(samples\)norm.factors

write.table(exp_study$samples, file=“genes.gene.TPM.not_cross_norm.TMM_info.txt”, quote=F, sep=", row.names=F)

Additional directory/subdirectory/files created following the above run

trinity2$ ls -l

-rw-rw-r–. 1 bdash bdash 384230 Mar 25 11:31 genes.gene.counts.matrix

-rw-rw-r–. 1 bdash bdash 419995 Mar 25 11:31 genes.gene.TMM.EXPR.matrix

-rw-rw-r–. 1 bdash bdash 361306 Mar 25 11:31 genes.gene.TPM.not_cross_norm

-rw-rw-r–. 1 bdash bdash 234 Mar 25 11:31 genes.gene.TPM.not_cross_norm.TMM_info.txt

-rw-rw-r–. 1 bdash bdash 431596 Mar 25 11:31 genes.isoform.counts.matrix

-rw-rw-r–. 1 bdash bdash 475183 Mar 25 11:31 genes.isoform.TMM.EXPR.matrix

-rw-rw-r–. 1 bdash bdash 411944 Mar 25 11:31 genes.isoform.TPM.not_cross_norm

-rw-rw-r–. 1 bdash bdash 234 Mar 25 11:31 genes.isoform.TPM.not_cross_norm.TMM_info.txt

-rw-rw-r–. 1 bdash bdash 520 Mar 25 11:31 __tmp_runTMM.R

A file readout

trinity2$ head genes.isoform.counts.matrix

                Sp_ds   Sp_hs   Sp_plat Sp_log

TRINITY_DN2933_c0_g1_i1 35.00 34.00 16.00 74.00

TRINITY_DN2950_c0_g3_i1 0.00 0.00 2.00 0.00

TRINITY_DN401_c0_g1_i1 0.00 0.00 1.00 0.00

TRINITY_DN3102_c0_g1_i1 285.00 223.00 225.00 493.00

TRINITY_DN3859_c1_g2_i1 0.00 0.00 8.50 6.59

TRINITY_DN3417_c0_g1_i1 165.00 184.00 89.00 168.00

TRINITY_DN1415_c0_g1_i1 73.57 55.63 30.38 82.86

TRINITY_DN1540_c0_g1_i1 58.00 34.00 68.00 15.00

TRINITY_DN3251_c0_g4_i1 8.00 1.00 4.00 3.00

Run DE analysis for the genes: Produces volcano plots and other results

run_DE_analysis.pl –matrix isoforms.isoform.counts.matrix –output isoforms_DE –dispersion 0.1 –method edgeR

Partial readout of the log

-note, no biological replicates identified, so setting min reps = 2.

Got 4 samples, and got: 5 data fields.

Header: Sp_ds Sp_hs Sp_plat Sp_log

Next: TRINITY_DN2933_c0_g1_i1 35.00 34.00 16.00 74.00

$VAR1 = { ‘Sp_log’ => 4, ‘Sp_plat’ => 3, ‘Sp_ds’ => 1, ‘Sp_hs’ => 2 };

$VAR1 = { ‘Sp_log’ => [ ‘Sp_log’ ], ‘Sp_ds’ => [ ‘Sp_ds’ ], ‘Sp_plat’ => [ ‘Sp_plat’ ], ‘Sp_hs’ => [ ‘Sp_hs’ ] };

Contrasts to perform are: $VAR1 = [ [ ‘Sp_ds’, ‘Sp_hs’ ],

      [
        'Sp_ds',
        'Sp_log'
      ],
      
      [
        'Sp_ds',
        'Sp_plat'
      ],
      
      [
        'Sp_hs',
        'Sp_log'
      ],
      
      [
        'Sp_hs',
        'Sp_plat'
      ],
      
      [
        'Sp_log',
        'Sp_plat'
      ]
    ];

CMD: R –vanilla -q < genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.Sp_ds.vs.Sp_hs.EdgeR.Rscript

CMD: R –vanilla -q < genes.isoform.counts.matrix.Sp_ds_vs_Sp_log.Sp_ds.vs.Sp_log.EdgeR.Rscript

CMD: R –vanilla -q < genes.isoform.counts.matrix.Sp_ds_vs_Sp_plat.Sp_ds.vs.Sp_plat.EdgeR.Rscript

CMD: R –vanilla -q < genes.isoform.counts.matrix.Sp_hs_vs_Sp_log.Sp_hs.vs.Sp_log.EdgeR.Rscript

CMD: R –vanilla -q < genes.isoform.counts.matrix.Sp_hs_vs_Sp_plat.Sp_hs.vs.Sp_plat.EdgeR.Rscript

CMD: R –vanilla -q < genes.isoform.counts.matrix.Sp_log_vs_Sp_plat.Sp_log.vs.Sp_plat.EdgeR.Rscript

Additional directory/subdirectory/files created following the above run

trinity2]$ ls -l

drwxrwxr-x. 2 bdash bdash 4096 Mar 25 11:38 genes_DE

trinity2$ ls -l genes_DE/

-rw-rw-r–. 1 bdash bdash 232175 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.count_matrix

-rw-rw-r–. 1 bdash bdash 744943 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results

-rw-rw-r–. 1 bdash bdash 56194 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.MA_n_Volcano.pdf

-rw-rw-r–. 1 bdash bdash 1234 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.Sp_ds.vs.Sp_hs.EdgeR.Rscript

-rw-rw-r–. 1 bdash bdash 236512 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_log.edgeR.count_matrix

-rw-rw-r–. 1 bdash bdash 785584 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_log.edgeR.DE_results

-rw-rw-r–. 1 bdash bdash 58462 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_log.edgeR.DE_results.MA_n_Volcano.pdf

-rw-rw-r–. 1 bdash bdash 1240 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_log.Sp_ds.vs.Sp_log.EdgeR.Rscript

-rw-rw-r–. 1 bdash bdash 238730 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_plat.edgeR.count_matrix

-rw-rw-r–. 1 bdash bdash 750585 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_plat.edgeR.DE_results

-rw-rw-r–. 1 bdash bdash 54153 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_plat.edgeR.DE_results.MA_n_Volcano.pdf

-rw-rw-r–. 1 bdash bdash 1246 Mar 25 11:38 genes.isoform.counts.matrix.Sp_ds_vs_Sp_plat.Sp_ds.vs.Sp_plat.EdgeR.Rscript

-rw-rw-r–. 1 bdash bdash 231199 Mar 25 11:38 genes.isoform.counts.matrix.Sp_hs_vs_Sp_log.edgeR.count_matrix

-rw-rw-r–. 1 bdash bdash 743784 Mar 25 11:38 genes.isoform.counts.matrix.Sp_hs_vs_Sp_log.edgeR.DE_results

-rw-rw-r–. 1 bdash bdash 55135 Mar 25 11:38 genes.isoform.counts.matrix.Sp_hs_vs_Sp_log.edgeR.DE_results.MA_n_Volcano.pdf

-rw-rw-r–. 1 bdash bdash 1240 Mar 25 11:38 genes.isoform.counts.matrix.Sp_hs_vs_Sp_log.Sp_hs.vs.Sp_log.EdgeR.Rscript

-rw-rw-r–. 1 bdash bdash 235014 Mar 25 11:38 genes.isoform.counts.matrix.Sp_hs_vs_Sp_plat.edgeR.count_matrix

-rw-rw-r–. 1 bdash bdash 795142 Mar 25 11:38 genes.isoform.counts.matrix.Sp_hs_vs_Sp_plat.edgeR.DE_results

-rw-rw-r–. 1 bdash bdash 58927 Mar 25 11:38 genes.isoform.counts.matrix.Sp_hs_vs_Sp_plat.edgeR.DE_results.MA_n_Volcano.pdf

-rw-rw-r–. 1 bdash bdash 1246 Mar 25 11:38 genes.isoform.counts.matrix.Sp_hs_vs_Sp_plat.Sp_hs.vs.Sp_plat.EdgeR.Rscript

-rw-rw-r–. 1 bdash bdash 240471 Mar 25 11:38 genes.isoform.counts.matrix.Sp_log_vs_Sp_plat.edgeR.count_matrix

-rw-rw-r–. 1 bdash bdash 833522 Mar 25 11:38 genes.isoform.counts.matrix.Sp_log_vs_Sp_plat.edgeR.DE_results

-rw-rw-r–. 1 bdash bdash 62074 Mar 25 11:38 genes.isoform.counts.matrix.Sp_log_vs_Sp_plat.edgeR.DE_results.MA_n_Volcano.pdf

-rw-rw-r–. 1 bdash bdash 1252 Mar 25 11:38 genes.isoform.counts.matrix.Sp_log_vs_Sp_plat.Sp_log.vs.Sp_plat.EdgeR.Rscript

“png”, “jpeg”, “jpg”, “tiff”, “pnm”

pdf_convert('genes_DE/genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.MA_n_Volcano.pdf', format = "tiff", pages = NULL, filenames = NULL, dpi = 300, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
Converting page 1 to genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.MA_n_Volcano_1.tiff... done!
Converting page 2 to genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.MA_n_Volcano_2.tiff... done!
[1] "genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.MA_n_Volcano_1.tiff"
[2] "genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.MA_n_Volcano_2.tiff"

Analyze differentail expression of genes: Produces heatmap and other results

genes_DE$analyze_diff_expr.pl –matrix ../genes.isoform.TMM.EXPR.matrix –output DE_genes

** Found 568 features as differentially expressed.

CMD: /home/bdash/miniconda2/opt/trinity-2.5.1/Analysis/DifferentialExpression/PtR -m DE_genes.matrix –log2 –heatmap –min_colSums 0 –min_rowSums 0 –gene_dist euclidean –sample_dist euclidean –sample_cor_matrix –center_rows –save CMD: R –vanilla -q < DE_genes.matrix.R

library(cluster)

library(Biobase)

……………………

library(qvalue)

……………………

source(“/home/bdash/miniconda2/opt/trinity-2.5.1/Analysis/DifferentialExpression/R/heatmap.3.R”)

source(“/home/bdash/miniconda2/opt/trinity-2.5.1/Analysis/DifferentialExpression/R/misc_rnaseq_funcs.R”)

source(“/home/bdash/miniconda2/opt/trinity-2.5.1/Analysis/DifferentialExpression/R/pairs3.R”)

source(“/home/bdash/miniconda2/opt/trinity-2.5.1/Analysis/DifferentialExpression/R/vioplot2.R”)

Additional directrories/subdirectories/files crated following aobe run

genes_DE$ ls -l

-rw-rw-r–. 1 bdash bdash 107 Mar 25 11:44 DE_feature_counts.P0.001_C2.matrix

-rw-rw-r–. 1 bdash bdash 30267 Mar 25 11:44 DE_genes.matrix

-rw-rw-r–. 1 bdash bdash 53939 Mar 25 11:44 DE_genes.matrix.log2.centered.dat

-rw-rw-r–. 1 bdash bdash 36613 Mar 25 11:44 DE_genes.matrix.log2.centered.genes_vs_samples_heatmap.pdf

-rw-rw-r–. 1 bdash bdash 290 Mar 25 11:44 DE_genes.matrix.log2.centered.sample_cor.dat

-rw-rw-r–. 1 bdash bdash 5864 Mar 25 11:44 DE_genes.matrix.log2.centered.sample_cor_matrix.pdf

-rw-rw-r–. 1 bdash bdash 3857 Mar 25 11:44 DE_genes.matrix.R

-rw-rw-r–. 1 bdash bdash 1342218 Mar 25 11:44 DE_genes.matrix.RData

-rw-rw-r–. 1 bdash bdash 10031 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.P0.001_C2.DE.subset

-rw-rw-r–. 1 bdash bdash 5830 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.P0.001_C2.Sp_ds-UP.subset

-rw-rw-r–. 1 bdash bdash 4268 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.P0.001_C2.Sp_hs-UP.subset

-rw-rw-r–. 1 bdash bdash 24 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_hs.edgeR.DE_results.samples

-rw-rw-r–. 1 bdash bdash 28526 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_log.edgeR.DE_results.P0.001_C2.DE.subset

-rw-rw-r–. 1 bdash bdash 19319 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_log.edgeR.DE_results.P0.001_C2.Sp_ds-UP.subset

-rw-rw-r–. 1 bdash bdash 9274 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_log.edgeR.DE_results.P0.001_C2.Sp_log-UP.subset

-rw-rw-r–. 1 bdash bdash 26 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_log.edgeR.DE_results.samples

-rw-rw-r–. 1 bdash bdash 6892 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_plat.edgeR.DE_results.P0.001_C2.DE.subset

-rw-rw-r–. 1 bdash bdash 2225 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_plat.edgeR.DE_results.P0.001_C2.Sp_ds-UP.subset

-rw-rw-r–. 1 bdash bdash 4734 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_plat.edgeR.DE_results.P0.001_C2.Sp_plat-UP.subset

-rw-rw-r–. 1 bdash bdash 28 Mar 25 11:44 genes.isoform.counts.matrix.Sp_ds_vs_Sp_plat.edgeR.DE_results.samples

-rw-rw-r–. 1 bdash bdash 21828 Mar 25 11:44 genes.isoform.counts.matrix.Sp_hs_vs_Sp_log.edgeR.DE_results.P0.001_C2.DE.subset

-rw-rw-r–. 1 bdash bdash 17739 Mar 25 11:44 genes.isoform.counts.matrix.Sp_hs_vs_Sp_log.edgeR.DE_results.P0.001_C2.Sp_hs-UP.subset

-rw-rw-r–. 1 bdash bdash 4156 Mar 25 11:44 genes.isoform.counts.matrix.Sp_hs_vs_Sp_log.edgeR.DE_results.P0.001_C2.Sp_log-UP.subset

-rw-rw-r–. 1 bdash bdash 26 Mar 25 11:44 genes.isoform.counts.matrix.Sp_hs_vs_Sp_log.edgeR.DE_results.samples

-rw-rw-r–. 1 bdash bdash 35385 Mar 25 11:44 genes.isoform.counts.matrix.Sp_hs_vs_Sp_plat.edgeR.DE_results.P0.001_C2.DE.subset

-rw-rw-r–. 1 bdash bdash 17568 Mar 25 11:44 genes.isoform.counts.matrix.Sp_hs_vs_Sp_plat.edgeR.DE_results.P0.001_C2.Sp_hs-UP.subset

-rw-rw-r–. 1 bdash bdash 17884 Mar 25 11:44 genes.isoform.counts.matrix.Sp_hs_vs_Sp_plat.edgeR.DE_results.P0.001_C2.Sp_plat-UP.subset

-rw-rw-r–. 1 bdash bdash 28 Mar 25 11:44 genes.isoform.counts.matrix.Sp_hs_vs_Sp_plat.edgeR.DE_results.samples

-rw-rw-r–. 1 bdash bdash 52861 Mar 25 11:44 genes.isoform.counts.matrix.Sp_log_vs_Sp_plat.edgeR.DE_results.P0.001_C2.DE.subset

-rw-rw-r–. 1 bdash bdash 19495 Mar 25 11:44 genes.isoform.counts.matrix.Sp_log_vs_Sp_plat.edgeR.DE_results.P0.001_C2.Sp_log-UP.subset

-rw-rw-r–. 1 bdash bdash 33433 Mar 25 11:44 genes.isoform.counts.matrix.Sp_log_vs_Sp_plat.edgeR.DE_results.P0.001_C2.Sp_plat-UP.subset

-rw-rw-r–. 1 bdash bdash 30 Mar 25 11:44 genes.isoform.counts.matrix.Sp_log_vs_Sp_plat.edgeR.DE_results.samples

library(pdftools)
pdf_convert('genes_DE/DE_genes.matrix.log2.centered.genes_vs_samples_heatmap.pdf', format = "jpeg", pages = NULL, filenames = NULL, dpi = 300, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
Converting page 1 to DE_genes.matrix.log2.centered.genes_vs_samples_heatmap_1.jpeg... done!
[1] "DE_genes.matrix.log2.centered.genes_vs_samples_heatmap_1.jpeg"
DE_genes.matrix.heatmap

DE_genes.matrix.heatmap

pdf_convert('genes_DE/DE_genes.matrix.log2.centered.sample_cor_matrix.pdf', format = "jpeg", pages = NULL, filenames = NULL, dpi = 300, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
Converting page 1 to DE_genes.matrix.log2.centered.sample_cor_matrix_1.jpeg... done!
[1] "DE_genes.matrix.log2.centered.sample_cor_matrix_1.jpeg"
DE_genes.cor_matrix

DE_genes.cor_matrix

LS0tDQp0aXRsZTogIlRyaW5pdHkgdG9vbHMgKFBhcnQgSUlJLUIpOiBBbmFseXNpcyBvZiBkZSBub3ZvIHRyYW5zY3JpcHQvZ2VuZXMgYXNzZW1ibHkgdXNpbmcgZWRnZVIiDQphdXRob3I6ICJCaGFnaXJhdGhpIERhc2giDQpkYXRlOiAiTWFyY2ggMTksIDIwMTkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyBSZWZlcmVuY2UsIFJlc291cmNlcyBhbmQgRGF0YQ0KDQojIyMgTmF0dXJlIFByb3RvY29scyB2b2x1bWUgOCwgcGFnZXMgMTQ5NC0xNTEyICgyMDEzKQ0KDQojIyMgRGF0YTogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90cmluaXR5cm5hc2VxL2ZpbGVzL21pc2MvVHJpbml0eU5hdHVyZVByb3RvY29sVHV0b3JpYWwudGd6DQoNCiMjIyBNYWNoaW5lOiBDZW50T1MgTGludXggNyBvbiBWaXJ0dWFsIEJveCANCg0KDQojIyBTdGFydGluZyBkaXJlY3RvcnkgYW5kIHN1YmRpcmVjdG9yeSBjb250ZW50cw0KDQojIyMgdHJpbml0eTIkIGxzIC1sDQoNCg0KZHJ3eHJ3eHIteC4gMyBiZGFzaCBiZGFzaCAgICAgICAxNDkgTWFyIDI0IDE3OjU4IFNwX2RzDQoNCi1yd3hyd3gtLS0uIDEgYmRhc2ggYmRhc2ggMTc1ODQ2MTc5IE1hciAyNCAxMzowMSBTcC5kcy4xTS5sZWZ0LmZxDQoNCi1yd3hyd3gtLS0uIDEgYmRhc2ggYmRhc2ggMTc1ODQ2MTc5IE1hciAyNCAxMzowMSBTcC5kcy4xTS5yaWdodC5mcQ0KDQpkcnd4cnd4ci14LiAzIGJkYXNoIGJkYXNoICAgICAgIDE0OSBNYXIgMjQgMTg6MTEgU3BfaHMNCg0KLXJ3eHJ3eC0tLS4gMSBiZGFzaCBiZGFzaCAxNzU3MzYwNDIgTWFyIDI0IDEzOjAyIFNwLmhzLjFNLmxlZnQuZnENCg0KLXJ3eHJ3eC0tLS4gMSBiZGFzaCBiZGFzaCAxNzU3MzYwNDIgTWFyIDI0IDEzOjAyIFNwLmhzLjFNLnJpZ2h0LmZxDQoNCmRyd3hyd3hyLXguIDMgYmRhc2ggYmRhc2ggICAgICAgMTQ5IE1hciAyNCAxODoyOCBTcF9sb2cNCg0KLXJ3eHJ3eC0tLS4gMSBiZGFzaCBiZGFzaCAxNzU3NDEyMTUgTWFyIDI0IDEzOjAzIFNwLmxvZy4xTS5sZWZ0LmZxDQoNCi1yd3hyd3gtLS0uIDEgYmRhc2ggYmRhc2ggMTc1NzQxMjE1IE1hciAyNCAxMzowMyBTcC5sb2cuMU0ucmlnaHQuZnENCg0KZHJ3eHJ3eHIteC4gMyBiZGFzaCBiZGFzaCAgICAgICAxNDkgTWFyIDI0IDE4OjIwIFNwX3BsYXQNCg0KLXJ3eHJ3eC0tLS4gMSBiZGFzaCBiZGFzaCAxNzU4OTk1MzMgTWFyIDI0IDEzOjAzIFNwLnBsYXQuMU0ubGVmdC5mcQ0KDQotcnd4cnd4LS0tLiAxIGJkYXNoIGJkYXNoIDE3NTg5OTUzMyBNYXIgMjQgMTM6MDMgU3AucGxhdC4xTS5yaWdodC5mcQ0KDQpkcnd4ci14ci14LiAyIGJkYXNoIGJkYXNoICAgICAgNDA5NiBNYXIgMjUgMTE6MjcgdHJpbml0eV9vdXRfZGlyDQoNCg0KDQoNCiMjIENvbWJpbmUgUlNFTS1jb21wdXRlZCBmcmFnbWVudCBjb3VudHMgaW50byBhIG1hdHJpeCBmaWxlDQoNCg0KIyMjIHRyaW5pdHkyJCBhYnVuZGFuY2VfZXN0aW1hdGVzX3RvX21hdHJpeC5wbCAtLWVzdF9tZXRob2QgUlNFTSBTcF9kcy9SU0VNLmdlbmVzLnJlc3VsdHMgU3BfaHMvUlNFTS5nZW5lcy5yZXN1bHRzIFNwX3BsYXQvUlNFTS5nZW5lcy5yZXN1bHRzIFNwX2xvZy9SU0VNLmdlICBuZXMucmVzdWx0cyAtLWdlbmVfdHJhbnNfbWFwIHRyaW5pdHlfb3V0X2Rpci9UcmluaXR5LmZhc3RhLmdlbmVfdHJhbnNfbWFwIC0tbmFtZV9zYW1wbGVfYnlfYmFzZWRpciAtLW91dF9wcmVmaXggZ2VuZXMNCg0KIyMjIyBTb21lIGxvZyByZWFkb3V0cw0KDQotcmVhZGluZyBmaWxlOiBTcF9kcy9SU0VNLmdlbmVzLnJlc3VsdHMNCg0KLXJlYWRpbmcgZmlsZTogU3BfaHMvUlNFTS5nZW5lcy5yZXN1bHRzDQoNCi1yZWFkaW5nIGZpbGU6IFNwX3BsYXQvUlNFTS5nZW5lcy5yZXN1bHRzDQoNCi1yZWFkaW5nIGZpbGU6IFNwX2xvZy9SU0VNLmdlbmVzLnJlc3VsdHMNCg0KDQoqIE91dHB1dHRpbmcgY29tYmluZWQgbWF0cml4Lg0KDQovaG9tZS9iZGFzaC9taW5pY29uZGEyL29wdC90cmluaXR5LTIuNS4xL3V0aWwvc3VwcG9ydF9zY3JpcHRzL3J1bl9UTU1fc2NhbGVfbWF0cml4LnBsIC0tbWF0cml4IGdlbmVzLmlzb2Zvcm0uVFBNLm5vdF9jcm9zc19ub3JtID4gZ2VuZXMuaXNvZm9ybS5UTU0uRVhQUi5tYXRyaXhDTUQ6IFIgLS12YW5pbGxhIC1xIDwgX190bXBfcnVuVE1NLlIgMT4mMiANCg0KPiBsaWJyYXJ5KGVkZ2VSKQ0KDQpMb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2U6IGxpbW1hDQoNCj4gcm5hc2VxTWF0cml4ID0gcmVhZC50YWJsZSgiZ2VuZXMuaXNvZm9ybS5UUE0ubm90X2Nyb3NzX25vcm0iLCBoZWFkZXI9VCwgcm93Lm5hbWVzPTEsIGNvbT0nJywgY2hlY2submFtZXM9RikNCg0KPiBybmFzZXFNYXRyaXggPSBhcy5tYXRyaXgocm5hc2VxTWF0cml4KQ0KDQo+IHJuYXNlcU1hdHJpeCA9IHJvdW5kKHJuYXNlcU1hdHJpeCkNCg0KPiBleHBfc3R1ZHkgPSBER0VMaXN0KGNvdW50cz1ybmFzZXFNYXRyaXgsIGdyb3VwPWZhY3Rvcihjb2xuYW1lcyhybmFzZXFNYXRyaXgpKSkNCg0KPiBleHBfc3R1ZHkgPSBjYWxjTm9ybUZhY3RvcnMoZXhwX3N0dWR5KQ0KDQo+IGV4cF9zdHVkeSRzYW1wbGVzJGVmZi5saWIuc2l6ZSA9IGV4cF9zdHVkeSRzYW1wbGVzJGxpYi5zaXplICogZXhwX3N0dWR5JHNhbXBsZXMkbm9ybS5mYWN0b3JzDQoNCj4gd3JpdGUudGFibGUoZXhwX3N0dWR5JHNhbXBsZXMsIGZpbGU9ImdlbmVzLmlzb2Zvcm0uVFBNLm5vdF9jcm9zc19ub3JtLlRNTV9pbmZvLnR4dCIsIHF1b3RlPUYsIHNlcD0iXHQiLCByb3cubmFtZXM9RikNCg0KPiANCi9ob21lL2JkYXNoL21pbmljb25kYTIvb3B0L3RyaW5pdHktMi41LjEvdXRpbC9zdXBwb3J0X3NjcmlwdHMvcnVuX1RNTV9zY2FsZV9tYXRyaXgucGwgLS1tYXRyaXggZ2VuZXMuZ2VuZS5UUE0ubm90X2Nyb3NzX25vcm0gDQo+IGdlbmVzLmdlbmUuVE1NLkVYUFIubWF0cml4Q01EOiBSIC0tdmFuaWxsYSAtcSA8IF9fdG1wX3J1blRNTS5SIDE+JjIgDQoNCj4gbGlicmFyeShlZGdlUikNCg0KTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBsaW1tYQ0KDQo+IHJuYXNlcU1hdHJpeCA9IHJlYWQudGFibGUoImdlbmVzLmdlbmUuVFBNLm5vdF9jcm9zc19ub3JtIiwgaGVhZGVyPVQsIHJvdy5uYW1lcz0xLCBjb209JycsIGNoZWNrLm5hbWVzPUYpDQoNCj4gcm5hc2VxTWF0cml4ID0gYXMubWF0cml4KHJuYXNlcU1hdHJpeCkNCg0KPiBybmFzZXFNYXRyaXggPSByb3VuZChybmFzZXFNYXRyaXgpDQoNCj4gZXhwX3N0dWR5ID0gREdFTGlzdChjb3VudHM9cm5hc2VxTWF0cml4LCBncm91cD1mYWN0b3IoY29sbmFtZXMocm5hc2VxTWF0cml4KSkpDQoNCj4gZXhwX3N0dWR5ID0gY2FsY05vcm1GYWN0b3JzKGV4cF9zdHVkeSkNCg0KPiBleHBfc3R1ZHkkc2FtcGxlcyRlZmYubGliLnNpemUgPSBleHBfc3R1ZHkkc2FtcGxlcyRsaWIuc2l6ZSAqIGV4cF9zdHVkeSRzYW1wbGVzJG5vcm0uZmFjdG9ycw0KDQo+IHdyaXRlLnRhYmxlKGV4cF9zdHVkeSRzYW1wbGVzLCBmaWxlPSJnZW5lcy5nZW5lLlRQTS5ub3RfY3Jvc3Nfbm9ybS5UTU1faW5mby50eHQiLCBxdW90ZT1GLCBzZXA9Ilx0Iiwgcm93Lm5hbWVzPUYpDQoNCg0KIyMjIEFkZGl0aW9uYWwgZGlyZWN0b3J5L3N1YmRpcmVjdG9yeS9maWxlcyBjcmVhdGVkIGZvbGxvd2luZyB0aGUgYWJvdmUgcnVuDQoNCiMjIyMgdHJpbml0eTIkIGxzIC1sDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgMzg0MjMwIE1hciAyNSAxMTozMSBnZW5lcy5nZW5lLmNvdW50cy5tYXRyaXgNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA0MTk5OTUgTWFyIDI1IDExOjMxIGdlbmVzLmdlbmUuVE1NLkVYUFIubWF0cml4DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgMzYxMzA2IE1hciAyNSAxMTozMSBnZW5lcy5nZW5lLlRQTS5ub3RfY3Jvc3Nfbm9ybQ0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICAgIDIzNCBNYXIgMjUgMTE6MzEgZ2VuZXMuZ2VuZS5UUE0ubm90X2Nyb3NzX25vcm0uVE1NX2luZm8udHh0DQoNCioqLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA0MzE1OTYgTWFyIDI1IDExOjMxIGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeCoqDQoNCioqLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA0NzUxODMgTWFyIDI1IDExOjMxIGdlbmVzLmlzb2Zvcm0uVE1NLkVYUFIubWF0cml4KioNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA0MTE5NDQgTWFyIDI1IDExOjMxIGdlbmVzLmlzb2Zvcm0uVFBNLm5vdF9jcm9zc19ub3JtDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgICAgMjM0IE1hciAyNSAxMTozMSBnZW5lcy5pc29mb3JtLlRQTS5ub3RfY3Jvc3Nfbm9ybS5UTU1faW5mby50eHQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgICA1MjAgTWFyIDI1IDExOjMxIF9fdG1wX3J1blRNTS5SDQoNCg0KDQojIyMgQSBmaWxlIHJlYWRvdXQNCg0KIyMjIyB0cmluaXR5MiQgaGVhZCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXggDQoNCgkgICAgICAgICAgICAgICAgU3BfZHMJU3BfaHMJU3BfcGxhdAlTcF9sb2cNCgkNClRSSU5JVFlfRE4yOTMzX2MwX2cxX2kxCTM1LjAwCTM0LjAwCTE2LjAwCTc0LjAwDQoNClRSSU5JVFlfRE4yOTUwX2MwX2czX2kxCTAuMDAJMC4wMAkyLjAwCTAuMDANCg0KVFJJTklUWV9ETjQwMV9jMF9nMV9pMQkwLjAwCTAuMDAJMS4wMAkwLjAwDQoNClRSSU5JVFlfRE4zMTAyX2MwX2cxX2kxCTI4NS4wMAkyMjMuMDAJMjI1LjAwCTQ5My4wMA0KDQpUUklOSVRZX0ROMzg1OV9jMV9nMl9pMQkwLjAwCTAuMDAJOC41MAk2LjU5DQoNClRSSU5JVFlfRE4zNDE3X2MwX2cxX2kxCTE2NS4wMAkxODQuMDAJODkuMDAJMTY4LjAwDQoNClRSSU5JVFlfRE4xNDE1X2MwX2cxX2kxCTczLjU3CTU1LjYzCTMwLjM4CTgyLjg2DQoNClRSSU5JVFlfRE4xNTQwX2MwX2cxX2kxCTU4LjAwCTM0LjAwCTY4LjAwCTE1LjAwDQoNClRSSU5JVFlfRE4zMjUxX2MwX2c0X2kxCTguMDAJMS4wMAk0LjAwCTMuMDANCg0KDQoNCiMjIFJ1biBERSBhbmFseXNpcyBmb3IgdGhlIGdlbmVzOiBQcm9kdWNlcyB2b2xjYW5vIHBsb3RzIGFuZCBvdGhlciByZXN1bHRzDQoNCiMjIyBydW5fREVfYW5hbHlzaXMucGwgLS1tYXRyaXggaXNvZm9ybXMuaXNvZm9ybS5jb3VudHMubWF0cml4IC0tb3V0cHV0IGlzb2Zvcm1zX0RFIC0tZGlzcGVyc2lvbiAwLjEgLS1tZXRob2QgZWRnZVINCg0KDQojIyMgUGFydGlhbCByZWFkb3V0IG9mIHRoZSBsb2cNCg0KLW5vdGUsIG5vIGJpb2xvZ2ljYWwgcmVwbGljYXRlcyBpZGVudGlmaWVkLCBzbyBzZXR0aW5nIG1pbiByZXBzID0gMi4NCg0KR290IDQgc2FtcGxlcywgYW5kIGdvdDogNSBkYXRhIGZpZWxkcy4NCg0KSGVhZGVyOiBTcF9kcwlTcF9ocwlTcF9wbGF0CVNwX2xvZw0KDQpOZXh0OiBUUklOSVRZX0ROMjkzM19jMF9nMV9pMQkzNS4wMAkzNC4wMAkxNi4wMAk3NC4wMA0KDQokVkFSMSA9IHsNCiAgICAgICAgICAnU3BfbG9nJyA9PiA0LA0KICAgICAgICAgICdTcF9wbGF0JyA9PiAzLA0KICAgICAgICAgICdTcF9kcycgPT4gMSwNCiAgICAgICAgICAnU3BfaHMnID0+IDINCiAgICAgICAgfTsNCiAgICAgICAgDQokVkFSMSA9IHsNCiAgICAgICAgICAnU3BfbG9nJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAnU3BfbG9nJw0KICAgICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgJ1NwX2RzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICdTcF9kcycNCiAgICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgJ1NwX3BsYXQnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAnU3BfcGxhdCcNCiAgICAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAnU3BfaHMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgJ1NwX2hzJw0KICAgICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICB9Ow0KICAgICAgICANCkNvbnRyYXN0cyB0byBwZXJmb3JtIGFyZTogJFZBUjEgPSBbDQogICAgICAgICAgWw0KICAgICAgICAgICAgJ1NwX2RzJywNCiAgICAgICAgICAgICdTcF9ocycNCiAgICAgICAgICBdLA0KICAgICAgICAgIA0KICAgICAgICAgIFsNCiAgICAgICAgICAgICdTcF9kcycsDQogICAgICAgICAgICAnU3BfbG9nJw0KICAgICAgICAgIF0sDQogICAgICAgICAgDQogICAgICAgICAgWw0KICAgICAgICAgICAgJ1NwX2RzJywNCiAgICAgICAgICAgICdTcF9wbGF0Jw0KICAgICAgICAgIF0sDQogICAgICAgICAgDQogICAgICAgICAgWw0KICAgICAgICAgICAgJ1NwX2hzJywNCiAgICAgICAgICAgICdTcF9sb2cnDQogICAgICAgICAgXSwNCiAgICAgICAgICANCiAgICAgICAgICBbDQogICAgICAgICAgICAnU3BfaHMnLA0KICAgICAgICAgICAgJ1NwX3BsYXQnDQogICAgICAgICAgXSwNCiAgICAgICAgICANCiAgICAgICAgICBbDQogICAgICAgICAgICAnU3BfbG9nJywNCiAgICAgICAgICAgICdTcF9wbGF0Jw0KICAgICAgICAgIF0NCiAgICAgICAgXTsNCg0KQ01EOiBSIC0tdmFuaWxsYSAtcSA8IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9ocy5TcF9kcy52cy5TcF9ocy5FZGdlUi5Sc2NyaXB0DQoNCkNNRDogUiAtLXZhbmlsbGEgLXEgPCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfbG9nLlNwX2RzLnZzLlNwX2xvZy5FZGdlUi5Sc2NyaXB0DQoNCkNNRDogUiAtLXZhbmlsbGEgLXEgPCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfcGxhdC5TcF9kcy52cy5TcF9wbGF0LkVkZ2VSLlJzY3JpcHQNCg0KQ01EOiBSIC0tdmFuaWxsYSAtcSA8IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9sb2cuU3BfaHMudnMuU3BfbG9nLkVkZ2VSLlJzY3JpcHQNCg0KQ01EOiBSIC0tdmFuaWxsYSAtcSA8IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9wbGF0LlNwX2hzLnZzLlNwX3BsYXQuRWRnZVIuUnNjcmlwdA0KDQpDTUQ6IFIgLS12YW5pbGxhIC1xIDwgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2xvZ192c19TcF9wbGF0LlNwX2xvZy52cy5TcF9wbGF0LkVkZ2VSLlJzY3JpcHQNCg0KDQojIyMgQWRkaXRpb25hbCBkaXJlY3Rvcnkvc3ViZGlyZWN0b3J5L2ZpbGVzIGNyZWF0ZWQgZm9sbG93aW5nIHRoZSBhYm92ZSBydW4NCg0KIyMjIyB0cmluaXR5Ml0kIGxzIC1sDQoNCioqZHJ3eHJ3eHIteC4gMiBiZGFzaCBiZGFzaCAgICAgIDQwOTYgTWFyIDI1IDExOjM4IGdlbmVzX0RFKioNCg0KDQojIyMjIHRyaW5pdHkyJCBscyAtbCBnZW5lc19ERS8NCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAyMzIxNzUgTWFyIDI1IDExOjM4IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9ocy5lZGdlUi5jb3VudF9tYXRyaXgNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA3NDQ5NDMgTWFyIDI1IDExOjM4IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9ocy5lZGdlUi5ERV9yZXN1bHRzDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggIDU2MTk0IE1hciAyNSAxMTozOCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfaHMuZWRnZVIuREVfcmVzdWx0cy5NQV9uX1ZvbGNhbm8ucGRmDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAxMjM0IE1hciAyNSAxMTozOCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfaHMuU3BfZHMudnMuU3BfaHMuRWRnZVIuUnNjcmlwdA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoIDIzNjUxMiBNYXIgMjUgMTE6MzggZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2RzX3ZzX1NwX2xvZy5lZGdlUi5jb3VudF9tYXRyaXgNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA3ODU1ODQgTWFyIDI1IDExOjM4IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9sb2cuZWRnZVIuREVfcmVzdWx0cw0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICA1ODQ2MiBNYXIgMjUgMTE6MzggZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2RzX3ZzX1NwX2xvZy5lZGdlUi5ERV9yZXN1bHRzLk1BX25fVm9sY2Fuby5wZGYNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgIDEyNDAgTWFyIDI1IDExOjM4IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9sb2cuU3BfZHMudnMuU3BfbG9nLkVkZ2VSLlJzY3JpcHQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAyMzg3MzAgTWFyIDI1IDExOjM4IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9wbGF0LmVkZ2VSLmNvdW50X21hdHJpeA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoIDc1MDU4NSBNYXIgMjUgMTE6MzggZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2RzX3ZzX1NwX3BsYXQuZWRnZVIuREVfcmVzdWx0cw0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICA1NDE1MyBNYXIgMjUgMTE6MzggZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2RzX3ZzX1NwX3BsYXQuZWRnZVIuREVfcmVzdWx0cy5NQV9uX1ZvbGNhbm8ucGRmDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAxMjQ2IE1hciAyNSAxMTozOCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfcGxhdC5TcF9kcy52cy5TcF9wbGF0LkVkZ2VSLlJzY3JpcHQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAyMzExOTkgTWFyIDI1IDExOjM4IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9sb2cuZWRnZVIuY291bnRfbWF0cml4DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggNzQzNzg0IE1hciAyNSAxMTozOCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfaHNfdnNfU3BfbG9nLmVkZ2VSLkRFX3Jlc3VsdHMNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgNTUxMzUgTWFyIDI1IDExOjM4IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9sb2cuZWRnZVIuREVfcmVzdWx0cy5NQV9uX1ZvbGNhbm8ucGRmDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAxMjQwIE1hciAyNSAxMTozOCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfaHNfdnNfU3BfbG9nLlNwX2hzLnZzLlNwX2xvZy5FZGdlUi5Sc2NyaXB0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggMjM1MDE0IE1hciAyNSAxMTozOCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfaHNfdnNfU3BfcGxhdC5lZGdlUi5jb3VudF9tYXRyaXgNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA3OTUxNDIgTWFyIDI1IDExOjM4IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgNTg5MjcgTWFyIDI1IDExOjM4IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMuTUFfbl9Wb2xjYW5vLnBkZg0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgMTI0NiBNYXIgMjUgMTE6MzggZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2hzX3ZzX1NwX3BsYXQuU3BfaHMudnMuU3BfcGxhdC5FZGdlUi5Sc2NyaXB0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggMjQwNDcxIE1hciAyNSAxMTozOCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfbG9nX3ZzX1NwX3BsYXQuZWRnZVIuY291bnRfbWF0cml4DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggODMzNTIyIE1hciAyNSAxMTozOCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfbG9nX3ZzX1NwX3BsYXQuZWRnZVIuREVfcmVzdWx0cw0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICA2MjA3NCBNYXIgMjUgMTE6MzggZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2xvZ192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMuTUFfbl9Wb2xjYW5vLnBkZg0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgMTI1MiBNYXIgMjUgMTE6MzggZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2xvZ192c19TcF9wbGF0LlNwX2xvZy52cy5TcF9wbGF0LkVkZ2VSLlJzY3JpcHQNCg0KDQojIyAg4oCccG5n4oCdLCDigJxqcGVn4oCdLCDigJxqcGfigJ0sIOKAnHRpZmbigJ0sIOKAnHBubeKAnQ0KDQpgYGB7cn0NCnBkZl9jb252ZXJ0KCdnZW5lc19ERS9nZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfaHMuZWRnZVIuREVfcmVzdWx0cy5NQV9uX1ZvbGNhbm8ucGRmJywgZm9ybWF0ID0gInRpZmYiLCBwYWdlcyA9IE5VTEwsIGZpbGVuYW1lcyA9IE5VTEwsIGRwaSA9IDMwMCwgYW50aWFsaWFzID0gVFJVRSwgb3B3ID0gIiIsIHVwdyA9ICIiLCB2ZXJib3NlID0gVFJVRSkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiMjIEFuYWx5emUgZGlmZmVyZW50YWlsIGV4cHJlc3Npb24gb2YgZ2VuZXM6IFByb2R1Y2VzIGhlYXRtYXAgYW5kIG90aGVyIHJlc3VsdHMNCg0KDQoNCiMjIyBnZW5lc19ERSRhbmFseXplX2RpZmZfZXhwci5wbCAtLW1hdHJpeCAuLi9nZW5lcy5pc29mb3JtLlRNTS5FWFBSLm1hdHJpeCAtLW91dHB1dCBERV9nZW5lcw0KDQoNCioqIEZvdW5kIDU2OCBmZWF0dXJlcyBhcyBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQuDQoNCkNNRDogL2hvbWUvYmRhc2gvbWluaWNvbmRhMi9vcHQvdHJpbml0eS0yLjUuMS9BbmFseXNpcy9EaWZmZXJlbnRpYWxFeHByZXNzaW9uL1B0UiAtbSBERV9nZW5lcy5tYXRyaXggLS1sb2cyIC0taGVhdG1hcCAtLW1pbl9jb2xTdW1zIDAgLS1taW5fcm93U3VtcyAwIC0tZ2VuZV9kaXN0IGV1Y2xpZGVhbiAtLXNhbXBsZV9kaXN0IGV1Y2xpZGVhbiAtLXNhbXBsZV9jb3JfbWF0cml4IC0tY2VudGVyX3Jvd3MgLS1zYXZlIA0KQ01EOiBSIC0tdmFuaWxsYSAtcSA8IERFX2dlbmVzLm1hdHJpeC5SDQoNCj4gbGlicmFyeShjbHVzdGVyKQ0KDQo+IGxpYnJhcnkoQmlvYmFzZSkNCg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KPiBsaWJyYXJ5KHF2YWx1ZSkNCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCj4gc291cmNlKCIvaG9tZS9iZGFzaC9taW5pY29uZGEyL29wdC90cmluaXR5LTIuNS4xL0FuYWx5c2lzL0RpZmZlcmVudGlhbEV4cHJlc3Npb24vUi9oZWF0bWFwLjMuUiIpDQoNCj4gc291cmNlKCIvaG9tZS9iZGFzaC9taW5pY29uZGEyL29wdC90cmluaXR5LTIuNS4xL0FuYWx5c2lzL0RpZmZlcmVudGlhbEV4cHJlc3Npb24vUi9taXNjX3JuYXNlcV9mdW5jcy5SIikNCg0KPiBzb3VyY2UoIi9ob21lL2JkYXNoL21pbmljb25kYTIvb3B0L3RyaW5pdHktMi41LjEvQW5hbHlzaXMvRGlmZmVyZW50aWFsRXhwcmVzc2lvbi9SL3BhaXJzMy5SIikNCg0KPiBzb3VyY2UoIi9ob21lL2JkYXNoL21pbmljb25kYTIvb3B0L3RyaW5pdHktMi41LjEvQW5hbHlzaXMvRGlmZmVyZW50aWFsRXhwcmVzc2lvbi9SL3Zpb3Bsb3QyLlIiKQ0KDQoNCiMjIyBBZGRpdGlvbmFsIGRpcmVjdHJvcmllcy9zdWJkaXJlY3Rvcmllcy9maWxlcyBjcmF0ZWQgZm9sbG93aW5nIGFvYmUgcnVuDQoNCmdlbmVzX0RFJCBscyAtbA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICAxMDcgTWFyIDI1IDExOjQ0IERFX2ZlYXR1cmVfY291bnRzLlAwLjAwMV9DMi5tYXRyaXgNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgIDMwMjY3IE1hciAyNSAxMTo0NCBERV9nZW5lcy5tYXRyaXgNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgIDUzOTM5IE1hciAyNSAxMTo0NCBERV9nZW5lcy5tYXRyaXgubG9nMi5jZW50ZXJlZC5kYXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgIDM2NjEzIE1hciAyNSAxMTo0NCBERV9nZW5lcy5tYXRyaXgubG9nMi5jZW50ZXJlZC5nZW5lc192c19zYW1wbGVzX2hlYXRtYXAucGRmDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgIDI5MCBNYXIgMjUgMTE6NDQgREVfZ2VuZXMubWF0cml4LmxvZzIuY2VudGVyZWQuc2FtcGxlX2Nvci5kYXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA1ODY0IE1hciAyNSAxMTo0NCBERV9nZW5lcy5tYXRyaXgubG9nMi5jZW50ZXJlZC5zYW1wbGVfY29yX21hdHJpeC5wZGYNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAzODU3IE1hciAyNSAxMTo0NCBERV9nZW5lcy5tYXRyaXguUg0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoIDEzNDIyMTggTWFyIDI1IDExOjQ0IERFX2dlbmVzLm1hdHJpeC5SRGF0YQ0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgMTAwMzEgTWFyIDI1IDExOjQ0IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9ocy5lZGdlUi5ERV9yZXN1bHRzLlAwLjAwMV9DMi5ERS5zdWJzZXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA1ODMwIE1hciAyNSAxMTo0NCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfaHMuZWRnZVIuREVfcmVzdWx0cy5QMC4wMDFfQzIuU3BfZHMtVVAuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgNDI2OCBNYXIgMjUgMTE6NDQgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2RzX3ZzX1NwX2hzLmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLlNwX2hzLVVQLnN1YnNldA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICAgMjQgTWFyIDI1IDExOjQ0IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9ocy5lZGdlUi5ERV9yZXN1bHRzLnNhbXBsZXMNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgIDI4NTI2IE1hciAyNSAxMTo0NCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfbG9nLmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLkRFLnN1YnNldA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgMTkzMTkgTWFyIDI1IDExOjQ0IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9sb2cuZWRnZVIuREVfcmVzdWx0cy5QMC4wMDFfQzIuU3BfZHMtVVAuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgOTI3NCBNYXIgMjUgMTE6NDQgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2RzX3ZzX1NwX2xvZy5lZGdlUi5ERV9yZXN1bHRzLlAwLjAwMV9DMi5TcF9sb2ctVVAuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgICAyNiBNYXIgMjUgMTE6NDQgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2RzX3ZzX1NwX2xvZy5lZGdlUi5ERV9yZXN1bHRzLnNhbXBsZXMNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA2ODkyIE1hciAyNSAxMTo0NCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfcGxhdC5lZGdlUi5ERV9yZXN1bHRzLlAwLjAwMV9DMi5ERS5zdWJzZXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAyMjI1IE1hciAyNSAxMTo0NCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfcGxhdC5lZGdlUi5ERV9yZXN1bHRzLlAwLjAwMV9DMi5TcF9kcy1VUC5zdWJzZXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA0NzM0IE1hciAyNSAxMTo0NCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfZHNfdnNfU3BfcGxhdC5lZGdlUi5ERV9yZXN1bHRzLlAwLjAwMV9DMi5TcF9wbGF0LVVQLnN1YnNldA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICAgMjggTWFyIDI1IDExOjQ0IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9kc192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMuc2FtcGxlcw0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgMjE4MjggTWFyIDI1IDExOjQ0IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9sb2cuZWRnZVIuREVfcmVzdWx0cy5QMC4wMDFfQzIuREUuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAxNzczOSBNYXIgMjUgMTE6NDQgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2hzX3ZzX1NwX2xvZy5lZGdlUi5ERV9yZXN1bHRzLlAwLjAwMV9DMi5TcF9ocy1VUC5zdWJzZXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA0MTU2IE1hciAyNSAxMTo0NCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfaHNfdnNfU3BfbG9nLmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLlNwX2xvZy1VUC5zdWJzZXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgIDI2IE1hciAyNSAxMTo0NCBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguU3BfaHNfdnNfU3BfbG9nLmVkZ2VSLkRFX3Jlc3VsdHMuc2FtcGxlcw0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgMzUzODUgTWFyIDI1IDExOjQ0IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLkRFLnN1YnNldA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgMTc1NjggTWFyIDI1IDExOjQ0IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLlNwX2hzLVVQLnN1YnNldA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgMTc4ODQgTWFyIDI1IDExOjQ0IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9oc192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLlNwX3BsYXQtVVAuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgICAyOCBNYXIgMjUgMTE6NDQgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2hzX3ZzX1NwX3BsYXQuZWRnZVIuREVfcmVzdWx0cy5zYW1wbGVzDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICA1Mjg2MSBNYXIgMjUgMTE6NDQgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2xvZ192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLkRFLnN1YnNldA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgMTk0OTUgTWFyIDI1IDExOjQ0IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5TcF9sb2dfdnNfU3BfcGxhdC5lZGdlUi5ERV9yZXN1bHRzLlAwLjAwMV9DMi5TcF9sb2ctVVAuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAzMzQzMyBNYXIgMjUgMTE6NDQgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2xvZ192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLlNwX3BsYXQtVVAuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgICAzMCBNYXIgMjUgMTE6NDQgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LlNwX2xvZ192c19TcF9wbGF0LmVkZ2VSLkRFX3Jlc3VsdHMuc2FtcGxlcw0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHBkZnRvb2xzKQ0KYGBgDQoNCg0KYGBge3J9DQpwZGZfY29udmVydCgnZ2VuZXNfREUvREVfZ2VuZXMubWF0cml4LmxvZzIuY2VudGVyZWQuZ2VuZXNfdnNfc2FtcGxlc19oZWF0bWFwLnBkZicsIGZvcm1hdCA9ICJqcGVnIiwgcGFnZXMgPSBOVUxMLCBmaWxlbmFtZXMgPSBOVUxMLCBkcGkgPSAzMDAsIGFudGlhbGlhcyA9IFRSVUUsIG9wdyA9ICIiLCB1cHcgPSAiIiwgdmVyYm9zZSA9IFRSVUUpDQpgYGANCg0KDQohW0RFX2dlbmVzLm1hdHJpeC5oZWF0bWFwXShERV9nZW5lcy5tYXRyaXgubG9nMi5jZW50ZXJlZC5nZW5lc192c19zYW1wbGVzX2hlYXRtYXBfMS5qcGVnKQ0KDQoNCmBgYHtyfQ0KcGRmX2NvbnZlcnQoJ2dlbmVzX0RFL0RFX2dlbmVzLm1hdHJpeC5sb2cyLmNlbnRlcmVkLnNhbXBsZV9jb3JfbWF0cml4LnBkZicsIGZvcm1hdCA9ICJqcGVnIiwgcGFnZXMgPSBOVUxMLCBmaWxlbmFtZXMgPSBOVUxMLCBkcGkgPSAzMDAsIGFudGlhbGlhcyA9IFRSVUUsIG9wdyA9ICIiLCB1cHcgPSAiIiwgdmVyYm9zZSA9IFRSVUUpDQpgYGANCg0KIVtERV9nZW5lcy5jb3JfbWF0cml4XShERV9nZW5lcy5tYXRyaXgubG9nMi5jZW50ZXJlZC5zYW1wbGVfY29yX21hdHJpeF8xLmpwZWcpDQoNCg0KDQoNCg0KDQoNCg==