1 M. musculus

This will be a very minimal analysis until we get some replicates.

1.2 Metadata

I am going to write a quick sample sheet in the current working directory called ‘all_samples.xlsx’ and put the names of the count tables in it.

1.3 Create expressionsets

Here I combine the metadata, count data, and annotations.

It is worth noting that the gene IDs from htseq-count probably do not match the annotations retrieved because they are likely exon-based rather than gene based. This is not really a problem, but don’t forget it!

## Reading the sample metadata.
## The sample definitions comprises: 8 rows(samples) and 8 columns(metadata fields).
## Reading count tables.
## Using the transcript to gene mapping.
## Reading salmon data with tximport.
## Finished reading count tables.
## Matched 6764 annotations and counts.
## Bringing together the count matrix and gene information.
## The mapped IDs are not the rownames of your gene information, changing them now.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 6764 rows and 8 columns.
## Reading the sample metadata.
## The sample definitions comprises: 8 rows(samples) and 8 columns(metadata fields).
## Reading count tables.
## Reading salmon data with tximport.
## Finished reading count tables.
## Matched 6897 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 56886 rows and 8 columns.

1.4 Query expressionsets

In this block I will calculate all the diagnostic plots, but not show them. I will show them next with a little annotation.

I will leave the output for the first of each invocation and silence it for the second.

## Graphing number of non-zero genes with respect to CPM by library.
## Graphing library sizes.
## Graphing a boxplot.
## 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 21398 zero count features.
## Graphing a correlation heatmap.
## Graphing a standard median correlation.
## Performing correlation.
## Graphing a distance heatmap.
## Graphing a standard median distance.
## Performing distance.
## Graphing a PCA plot.
## Graphing a T-SNE plot.
## Plotting a density plot.
## 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, setting them to 0.5.
## Changed 21398 zero count features.
## Plotting a CV plot.
## Naively calculating coefficient of variation/dispersion with respect to condition.
## Finished calculating dispersion estimates.
## Plotting the representation of the top-n genes.
## Plotting the expression of the top-n PC loaded genes.
## Printing a color to condition legend.
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 2794 low-count genes (3970 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 1105 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.

1.6 Do a simple DE

The only interesting DE I see in this is to compare the retinas to the dlgns. I can treat them as replicates and compare.

## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 2794 low-count genes (3970 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 1105 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 2794 low-count genes (3970 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 1105 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Plotting a PCA before surrogates/batch inclusion.
## Not putting labels on the plot.
## Assuming no batch in model for testing pca.
## Not putting labels on the plot.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
dlgn_ko <- "iprgc_06"
dlgn_wt <- "iprgc_01"
dlgn_ht <- "iprgc_04"
scn_ko <- "iprgc_08"
scn_wt <- "iprgc_03"
retina_ko <- "iprgc_07"
retina_wt <- "iprgc_02"
retina_ht <- "iprgc_05"

het_retina_vs_het_dlgn <- exprs(mm38_norm)[, retina_ht] - exprs(mm38_norm)[, dlgn_ht]
ko_retina_vs_ko_dlgn <- exprs(mm38_norm)[, retina_ko] - exprs(mm38_norm)[, dlgn_ko]
ko_retina_vs_ko_scn <- exprs(mm38_norm)[, retina_ko] - exprs(mm38_norm)[, scn_ko]
het_retina_vs_ko_retina <- exprs(mm38_norm)[, retina_ht] - exprs(mm38_norm)[, retina_ko]
het_dlgn_vs_ko_scn <- exprs(mm38_norm)[, dlgn_ht] - exprs(mm38_norm)[, scn_ko]
ko_dlgn_vs_ko_scn <- exprs(mm38_norm)[, dlgn_ko] - exprs(mm38_norm)[, scn_ko]

dlgn_kowt <- exprs(mm38_norm)[, dlgn_ko] - exprs(mm38_norm)[, dlgn_wt]
dlgn_htwt <- exprs(mm38_norm)[, dlgn_ht] - exprs(mm38_norm)[, dlgn_wt]
dlgn_koht <- exprs(mm38_norm)[, dlgn_ko] - exprs(mm38_norm)[, dlgn_ht]
scn_kowt <- exprs(mm38_norm)[, scn_ko] - exprs(mm38_norm)[, scn_wt]
retina_kowt <- exprs(mm38_norm)[, retina_ko] - exprs(mm38_norm)[, retina_wt]
retina_htwt <- exprs(mm38_norm)[, retina_ht] - exprs(mm38_norm)[, retina_wt]
retina_koht <- exprs(mm38_norm)[, retina_ko] - exprs(mm38_norm)[, retina_ht]

pair_mtrx <- cbind(het_retina_vs_het_dlgn,
                   ko_retina_vs_ko_dlgn,
                   ko_retina_vs_ko_scn,
                   het_retina_vs_ko_retina,
                   het_dlgn_vs_ko_scn,
                   ko_dlgn_vs_ko_scn,
                   dlgn_kowt, dlgn_htwt, dlgn_koht,
                   scn_kowt,
                   retina_kowt, retina_htwt, retina_koht)

mm_tables <- combine_de_tables(mm_de, extra_annot=pair_mtrx,
                               excel=glue::glue("excel/{rundate}mm_tables.xlsx"))
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on table 1/3: retina_vs_dlgn
## Working on table 2/3: scn_vs_dlgn
## Working on table 3/3: scn_vs_retina
## Adding venn plots for retina_vs_dlgn.
## Limma expression coefficients for retina_vs_dlgn; R^2: 0.934; equation: y = 0.967x + 0.0347
## Warning: Removed 1 rows containing missing values (geom_vline).
## Warning: Removed 1 rows containing missing values (geom_hline).
## Warning: Removed 1 rows containing missing values (geom_vline).
## Warning: Removed 1 rows containing missing values (geom_hline).
## Deseq expression coefficients for retina_vs_dlgn; R^2: 0.822; equation: y = 0.955x + 0.0956
## Edger expression coefficients for retina_vs_dlgn; R^2: 0.917; equation: y = 0.977x + 0.0265
## Warning: Removed 1 rows containing missing values (geom_hline).

## Warning: Removed 1 rows containing missing values (geom_hline).
## Adding venn plots for scn_vs_dlgn.
## Limma expression coefficients for scn_vs_dlgn; R^2: 0.934; equation: y = 0.967x + 0.0347
## Warning: Removed 1 rows containing missing values (geom_vline).

## Warning: Removed 1 rows containing missing values (geom_hline).
## Warning: Removed 1 rows containing missing values (geom_vline).
## Warning: Removed 1 rows containing missing values (geom_hline).
## Deseq expression coefficients for scn_vs_dlgn; R^2: 0.822; equation: y = 0.955x + 0.0956
## Edger expression coefficients for scn_vs_dlgn; R^2: 0.917; equation: y = 0.977x + 0.0265
## Warning: Removed 1 rows containing missing values (geom_hline).

## Warning: Removed 1 rows containing missing values (geom_hline).
## Adding venn plots for scn_vs_retina.
## Limma expression coefficients for scn_vs_retina; R^2: 0.934; equation: y = 0.967x + 0.0347
## Warning: Removed 1 rows containing missing values (geom_vline).

## Warning: Removed 1 rows containing missing values (geom_hline).
## Warning: Removed 1 rows containing missing values (geom_vline).
## Warning: Removed 1 rows containing missing values (geom_hline).
## Deseq expression coefficients for scn_vs_retina; R^2: 0.822; equation: y = 0.955x + 0.0956
## Edger expression coefficients for scn_vs_retina; R^2: 0.917; equation: y = 0.977x + 0.0265
## Warning: Removed 1 rows containing missing values (geom_hline).

## Warning: Removed 1 rows containing missing values (geom_hline).
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20200108mm_tables.xlsx.
LS0tCnRpdGxlOiAiTS4gbXVzY3VsdXMgMyBjZWxsIHR5cGVzLCAxIHRpbWVwb2ludCwgMyBnZW5vdHlwZXMsIGFuZCAxIHJlcGxpY2F0ZS4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIi9kYXRhL2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gInVuZGVmaW5lZC5SbWQiCnZlciA8LSAiMjAxOTEyMTYiCgojI3RtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKIyNybWRfZmlsZSA8LSAiMDNfZXhwcmVzc2lvbl9pbmZlY3Rpb25fMjAxODA4MjIuUm1kIgpgYGAKCiMgTS4gbXVzY3VsdXMKClRoaXMgd2lsbCBiZSBhIHZlcnkgbWluaW1hbCBhbmFseXNpcyB1bnRpbCB3ZSBnZXQgc29tZSByZXBsaWNhdGVzLgoKIyMgQW5ub3RhdGlvbnMKCkkgYW0gdXNpbmcgbW0zOF85NS4KCmBgYHtyIGFubm90YXRpb25zfQojIyBNeSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoKSBmdW5jdGlvbiBkZWZhdWx0cyB0byBodW1hbiwgc28gdGhhdCB3aWxsIGJlIHF1aWNrLgptbV9hbm5vdCA8LSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoc3BlY2llcz0ibW11c2N1bHVzIikKbW1fYW5ub3QgPC0gbW1fYW5ub3RbWyJhbm5vdGF0aW9uIl1dCm1tX2Fubm90W1sidHhpZCJdXSA8LSBwYXN0ZTAobW1fYW5ub3RbWyJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiXV0sICIuIiwgbW1fYW5ub3RbWyJ2ZXJzaW9uIl1dKQpyb3duYW1lcyhtbV9hbm5vdCkgPC0gbWFrZS5uYW1lcyhtbV9hbm5vdFtbImVuc2VtYmxfZ2VuZV9pZCJdXSwgdW5pcXVlPVRSVUUpCgp0eF9nZW5lX21hcCA8LSBtbV9hbm5vdFssIGMoInR4aWQiLCAiZW5zZW1ibF9nZW5lX2lkIildCmBgYAoKU28sIEkgbm93IGhhdmUgMiBkYXRhIGZyYW1lcyBvZiBwYXJhc2l0ZSBhbm5vdGF0aW9ucyBhbmQgMSBodW1hbi4KCiMjIE1ldGFkYXRhCgpJIGFtIGdvaW5nIHRvIHdyaXRlIGEgcXVpY2sgc2FtcGxlIHNoZWV0IGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGNhbGxlZAonYWxsX3NhbXBsZXMueGxzeCcgYW5kIHB1dCB0aGUgbmFtZXMgb2YgdGhlIGNvdW50IHRhYmxlcyBpbiBpdC4KCiMjIENyZWF0ZSBleHByZXNzaW9uc2V0cwoKSGVyZSBJIGNvbWJpbmUgdGhlIG1ldGFkYXRhLCBjb3VudCBkYXRhLCBhbmQgYW5ub3RhdGlvbnMuCgpJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgZ2VuZSBJRHMgZnJvbSBodHNlcS1jb3VudCBwcm9iYWJseSBkbyBub3QgbWF0Y2ggdGhlCmFubm90YXRpb25zIHJldHJpZXZlZCBiZWNhdXNlIHRoZXkgYXJlIGxpa2VseSBleG9uLWJhc2VkIHJhdGhlciB0aGFuIGdlbmUKYmFzZWQuICBUaGlzIGlzIG5vdCByZWFsbHkgYSBwcm9ibGVtLCBidXQgZG9uJ3QgZm9yZ2V0IGl0IQoKYGBge3IgZXhwdH0KbW0zOF9leHB0IDwtIGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLnhsc3giLCB0eF9nZW5lX21hcD10eF9nZW5lX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1tbV9hbm5vdCwgZmlsZV9jb2x1bW49InNhbG1vbmZpbGUiKQoKbW10eF9hbm5vdCA8LSBtbV9hbm5vdApyb3duYW1lcyhtbXR4X2Fubm90KSA8LSBtbV9hbm5vdFtbInR4aWQiXV0KbW0zOF90eCA8LSBjcmVhdGVfZXhwdCgic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1tbXR4X2Fubm90LCBmaWxlX2NvbHVtbj0ic2FsbW9uZmlsZSIpCmBgYAoKIyMgUXVlcnkgZXhwcmVzc2lvbnNldHMKCkluIHRoaXMgYmxvY2sgSSB3aWxsIGNhbGN1bGF0ZSBhbGwgdGhlIGRpYWdub3N0aWMgcGxvdHMsIGJ1dCBub3Qgc2hvdyB0aGVtLiAgSQp3aWxsIHNob3cgdGhlbSBuZXh0IHdpdGggYSBsaXR0bGUgYW5ub3RhdGlvbi4KCkkgd2lsbCBsZWF2ZSB0aGUgb3V0cHV0IGZvciB0aGUgZmlyc3Qgb2YgZWFjaCBpbnZvY2F0aW9uIGFuZCBzaWxlbmNlIGl0IGZvciB0aGUgc2Vjb25kLgoKYGBge3IgcXVlcnksIGZpZy5zaG93PSJoaWRlIn0KbW0zOF9wbG90cyA8LSBncmFwaF9tZXRyaWNzKG1tMzhfZXhwdCkKCm1tMzhfbm9ybSA8LSBub3JtYWxpemVfZXhwdChtbTM4X2V4cHQsIG5vcm09InF1YW50IiwgY29udmVydD0iY3BtIiwgdHJhbnNmb3JtPSJsb2cyIiwgZmlsdGVyPVRSVUUpCgptbTM4bl9wbG90cyA8LSBzbShncmFwaF9tZXRyaWNzKG1tMzhfbm9ybSkpCmBgYAoKIyMgU2hvdyBzb21lIHBsb3RzCgpgYGB7ciBzaG93X3Bsb3RzfQptbTM4X3Bsb3RzJGxlZ2VuZAptbTM4X3Bsb3RzJGxpYnNpemUKbW0zOF9wbG90cyRub256ZXJvCm1tMzhuX3Bsb3RzJGRlbnNpdHkKbW0zOG5fcGxvdHMkcGNfcGxvdApgYGAKCiMjIERvIGEgc2ltcGxlIERFCgpUaGUgb25seSBpbnRlcmVzdGluZyBERSBJIHNlZSBpbiB0aGlzIGlzIHRvIGNvbXBhcmUgdGhlIHJldGluYXMgdG8gdGhlIGRsZ25zLgpJIGNhbiB0cmVhdCB0aGVtIGFzIHJlcGxpY2F0ZXMgYW5kIGNvbXBhcmUuCgpgYGB7ciBkZSwgZmlnLnNob3c9ImhpZGUifQptbSA8LSBzZXRfZXhwdF9jb25kaXRpb25zKG1tMzhfZXhwdCwgZmFjdD0iY2VsbHR5cGUiKQptbV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KG1tLCBub3JtPSJxdWFudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgdHJhbnNmb3JtPSJsb2cyIiwgZmlsdGVyPVRSVUUpCnBsb3RfcGNhKG1tX25vcm0pJHBsb3QKCm1tX2RlIDwtIGFsbF9wYWlyd2lzZShtbSwgbW9kZWxfYmF0Y2g9RkFMU0UpCgpkbGduX2tvIDwtICJpcHJnY18wNiIKZGxnbl93dCA8LSAiaXByZ2NfMDEiCmRsZ25faHQgPC0gImlwcmdjXzA0IgpzY25fa28gPC0gImlwcmdjXzA4IgpzY25fd3QgPC0gImlwcmdjXzAzIgpyZXRpbmFfa28gPC0gImlwcmdjXzA3IgpyZXRpbmFfd3QgPC0gImlwcmdjXzAyIgpyZXRpbmFfaHQgPC0gImlwcmdjXzA1IgoKaGV0X3JldGluYV92c19oZXRfZGxnbiA8LSBleHBycyhtbTM4X25vcm0pWywgcmV0aW5hX2h0XSAtIGV4cHJzKG1tMzhfbm9ybSlbLCBkbGduX2h0XQprb19yZXRpbmFfdnNfa29fZGxnbiA8LSBleHBycyhtbTM4X25vcm0pWywgcmV0aW5hX2tvXSAtIGV4cHJzKG1tMzhfbm9ybSlbLCBkbGduX2tvXQprb19yZXRpbmFfdnNfa29fc2NuIDwtIGV4cHJzKG1tMzhfbm9ybSlbLCByZXRpbmFfa29dIC0gZXhwcnMobW0zOF9ub3JtKVssIHNjbl9rb10KaGV0X3JldGluYV92c19rb19yZXRpbmEgPC0gZXhwcnMobW0zOF9ub3JtKVssIHJldGluYV9odF0gLSBleHBycyhtbTM4X25vcm0pWywgcmV0aW5hX2tvXQpoZXRfZGxnbl92c19rb19zY24gPC0gZXhwcnMobW0zOF9ub3JtKVssIGRsZ25faHRdIC0gZXhwcnMobW0zOF9ub3JtKVssIHNjbl9rb10Ka29fZGxnbl92c19rb19zY24gPC0gZXhwcnMobW0zOF9ub3JtKVssIGRsZ25fa29dIC0gZXhwcnMobW0zOF9ub3JtKVssIHNjbl9rb10KCmRsZ25fa293dCA8LSBleHBycyhtbTM4X25vcm0pWywgZGxnbl9rb10gLSBleHBycyhtbTM4X25vcm0pWywgZGxnbl93dF0KZGxnbl9odHd0IDwtIGV4cHJzKG1tMzhfbm9ybSlbLCBkbGduX2h0XSAtIGV4cHJzKG1tMzhfbm9ybSlbLCBkbGduX3d0XQpkbGduX2tvaHQgPC0gZXhwcnMobW0zOF9ub3JtKVssIGRsZ25fa29dIC0gZXhwcnMobW0zOF9ub3JtKVssIGRsZ25faHRdCnNjbl9rb3d0IDwtIGV4cHJzKG1tMzhfbm9ybSlbLCBzY25fa29dIC0gZXhwcnMobW0zOF9ub3JtKVssIHNjbl93dF0KcmV0aW5hX2tvd3QgPC0gZXhwcnMobW0zOF9ub3JtKVssIHJldGluYV9rb10gLSBleHBycyhtbTM4X25vcm0pWywgcmV0aW5hX3d0XQpyZXRpbmFfaHR3dCA8LSBleHBycyhtbTM4X25vcm0pWywgcmV0aW5hX2h0XSAtIGV4cHJzKG1tMzhfbm9ybSlbLCByZXRpbmFfd3RdCnJldGluYV9rb2h0IDwtIGV4cHJzKG1tMzhfbm9ybSlbLCByZXRpbmFfa29dIC0gZXhwcnMobW0zOF9ub3JtKVssIHJldGluYV9odF0KCnBhaXJfbXRyeCA8LSBjYmluZChoZXRfcmV0aW5hX3ZzX2hldF9kbGduLAogICAgICAgICAgICAgICAgICAga29fcmV0aW5hX3ZzX2tvX2RsZ24sCiAgICAgICAgICAgICAgICAgICBrb19yZXRpbmFfdnNfa29fc2NuLAogICAgICAgICAgICAgICAgICAgaGV0X3JldGluYV92c19rb19yZXRpbmEsCiAgICAgICAgICAgICAgICAgICBoZXRfZGxnbl92c19rb19zY24sCiAgICAgICAgICAgICAgICAgICBrb19kbGduX3ZzX2tvX3NjbiwKICAgICAgICAgICAgICAgICAgIGRsZ25fa293dCwgZGxnbl9odHd0LCBkbGduX2tvaHQsCiAgICAgICAgICAgICAgICAgICBzY25fa293dCwKICAgICAgICAgICAgICAgICAgIHJldGluYV9rb3d0LCByZXRpbmFfaHR3dCwgcmV0aW5hX2tvaHQpCgptbV90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMobW1fZGUsIGV4dHJhX2Fubm90PXBhaXJfbXRyeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfW1tX3RhYmxlcy54bHN4IikpCmBgYAoKCmBgYHtyIHNhdmVtZSwgZXZhbD1GQUxTRX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpgYGAK