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.
## Reading count tables with read.table().
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/mmusculus_iprgc_2019/preprocessing/iprgc_01/outputs/hisat2_mm38_95/r1_trimmed.count.xz contains 25788 rows.
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/mmusculus_iprgc_2019/preprocessing/iprgc_02/outputs/hisat2_mm38_95/r1_trimmed.count.xz contains 25788 rows and merges to 25788 rows.
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/mmusculus_iprgc_2019/preprocessing/iprgc_03/outputs/hisat2_mm38_95/r1_trimmed.count.xz contains 25788 rows and merges to 25788 rows.
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/mmusculus_iprgc_2019/preprocessing/iprgc_04/outputs/hisat2_mm38_95/r1_trimmed.count.xz contains 25788 rows and merges to 25788 rows.
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/mmusculus_iprgc_2019/preprocessing/iprgc_05/outputs/hisat2_mm38_95/r1_trimmed.count.xz contains 25788 rows and merges to 25788 rows.
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/mmusculus_iprgc_2019/preprocessing/iprgc_06/outputs/hisat2_mm38_95/r1_trimmed.count.xz contains 25788 rows and merges to 25788 rows.
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/mmusculus_iprgc_2019/preprocessing/iprgc_07/outputs/hisat2_mm38_95/r1_trimmed.count.xz contains 25788 rows and merges to 25788 rows.
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/mmusculus_iprgc_2019/preprocessing/iprgc_08/outputs/hisat2_mm38_95/r1_trimmed.count.xz contains 25788 rows and merges to 25788 rows.
## Finished reading count tables.
## Matched 25554 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 25783 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.

1.4.1 Initial salmon plots

## 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.4.2 Initial hisat2 plots

## 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 12233 low-count genes (13550 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 19 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.

1.5 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.

These differential expression analyses are EXPLICITLY NOT what you care about. However, they are useful for two purposes:

  1. Seeing that the three tissue types are indeed different.
  2. Setting up the table of results with appropriate rows/columns of (rows)genes and (columns) annotations. We will therefore add to these tables the results of the expression analyses that you actually do care about.

When we receive full replicate sets, this cheater method of encapsulating the data will not longer be required.

1.5.1 With salmon

## 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.

1.6 Set up for initial analysis

Until we get full replicates, I will do simple subtractions.

1.6.1 Term definition

In an attempt to keep some clarity in the terms used, I want to define them now. There are three contexts in which we will consider the data:

  1. The individual sample type. When considering individual samples, I will use three terms in this and only this context: wild-type (wt), het, and mut.

  2. The individual translatome. These are defines as something / baseline. I will exclusively call the wt samples ‘baseline’ when speaking in this context. I will exclusively state ‘normal’ when referring to het / wt samples, and I will state ‘ko’ when referring to mut / wt samples in the translatome context.

  3. Translatome vs. translatome. Whenever comparing translatomes, I will use the names as in #2 and always put the numerator first when writing the name of a comparison.

The most complex example of the above nomenclature is:

“normko_retdlgn is defined as normret_vs_normdlgn - koret_vs_kodlgn”

This states we are examining at the translatome context: (norm(retina translatome) - norm(dlgn translatome)) - (ko(retina translatome) - ko(dlgn translatome))

Which in turn is synonymous to the following at the sample context: ((rethet - retwt) - (dlgnhet - dlgnwt)) - ((retko - retwt) - (dlgnko - dlgnwt))

Now let us associate the various variable names with the appropriate samples:

Give these variable names, now lets associate columns of the expression data with them. These are at the sample context, so the appropriate names are: ‘wt’, ‘het’, and ‘mut’. In each case I will prefix the genotype with the tissue type: ‘ret’, ‘dlgn’, and ‘scn’. Thus ‘retwt’ refers to the sample used to calculate the translatome retina baseline; in contrast ‘dlgnmut’ is the sample which provides the dlgn knockout.

Each of the above 8 variables provides 1 column of information. We have 3 baseline comparisons available to us. In each of these we compare one wt sample to another.

Simultaneously, we have 5 available translatomes. This are provided by comparing each het or mut to the associated wt. These will therefore receive names: ‘norm’ and ‘ko’ instead of ‘het’ and ‘mut’.

Given these translatomes, there are a few contrasts of likely interest. These are performed by comparing the relevant translatomes.

Will will split these into 4 separate categories: het vs het, ko vs ko, ko vs het, and ratio vs ratio.

Finally, note that we are being explicitly redundant in these definitions. I am making variable names for both the a/b ratio and the b/a ratio. Thus we have some redundantly redundant (haha) flexibility when deciding on what we want to plot.

On the other hand, I am assuming we always want the normals as denominators and kos as numerators.

Finally, here is the ratio of ratios example I printed above:

I named it ‘normko_retdlgn’ in an attempt to make clear that it is actually: (normret/normdlgn)/(koret/kodlgn)

or stated differently: “norm divided by ko for ret divided by dlgn.”

1.9 Add the matrix to the differential expression

I will use my function combine_de_tables() to add this information to my existing annotation data along with the results from the statistically valid comparison of the three tissue types.

2 Plots of interesting comparisons

3 Translatome level comparisons

3.1 Make a generic plotter for this stuff.

  1. X-axis: Always retina.
  2. Y-axis: Always a target tissue.

First plot: KO scn translatome on y axis vs. KO retina translatome on x axis.

3.2 Scn knockout translatome vs retina knockout translatome.

## No fc/lfc was provided, defaulting to 10 fold.
## Warning: Removed 1 rows containing missing values (geom_point).

## Performing gProfiler GO search of 70 genes against mmusculus.
## GO search found 0 hits.
## Performing gProfiler KEGG search of 70 genes against mmusculus.
## KEGG search found 0 hits.
## Performing gProfiler REAC search of 70 genes against mmusculus.
## REAC search found 0 hits.
## Performing gProfiler MI search of 70 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 70 genes against mmusculus.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 70 genes against mmusculus.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 70 genes against mmusculus.
## HP search found 0 hits.
## Performing gProfiler GO search of 42 genes against mmusculus.
## GO search found 2 hits.
## Performing gProfiler KEGG search of 42 genes against mmusculus.
## KEGG search found 1 hits.
## Performing gProfiler REAC search of 42 genes against mmusculus.
## REAC search found 0 hits.
## Performing gProfiler MI search of 42 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 42 genes against mmusculus.
## TF search found 10 hits.
## Performing gProfiler CORUM search of 42 genes against mmusculus.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 42 genes against mmusculus.
## HP search found 0 hits.
##   query.number significant p.value term.size query.size overlap.size precision
## 1            1        TRUE  0.0202        40          3            2     0.667
## 2            1        TRUE  0.0128        32          3            2     0.667
##   recall    term.id domain subgraph.number                        term.name
## 1  0.050 GO:0035136     BP               1           forelimb morphogenesis
## 2  0.062 GO:0035115     BP               1 embryonic forelimb morphogenesis
##   relative.depth                          intersection
## 1              1 ENSMUSG00000013584,ENSMUSG00000021469
## 2              2 ENSMUSG00000013584,ENSMUSG00000021469
##   query.number significant p.value term.size query.size overlap.size precision
## 1            1        TRUE  0.0334        71         11            2     0.182
##   recall    term.id domain subgraph.number             term.name relative.depth
## 1  0.028 KEGG:04115    keg               1 p53 signaling pathway              1
##                            intersection
## 1 ENSMUSG00000024521,ENSMUSG00000032009
##   query.number significant p.value term.size query.size overlap.size precision
## 1            1        TRUE  0.0249         1         16            1     0.062
##   recall    term.id domain subgraph.number                term.name
## 1      1 CORUM:6829    cor               1 Klotho-Kdr-Trpc1 complex
##   relative.depth       intersection
## 1              1 ENSMUSG00000058488

3.3 dlgn normal translatome vs retina normal translatome.

## No fc/lfc was provided, defaulting to 10 fold.
## Warning: Removed 1 rows containing missing values (geom_point).

## Performing gProfiler GO search of 59 genes against mmusculus.
## GO search found 3 hits.
## Performing gProfiler KEGG search of 59 genes against mmusculus.
## KEGG search found 0 hits.
## Performing gProfiler REAC search of 59 genes against mmusculus.
## REAC search found 2 hits.
## Performing gProfiler MI search of 59 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 59 genes against mmusculus.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 59 genes against mmusculus.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 59 genes against mmusculus.
## HP search found 0 hits.
## Performing gProfiler GO search of 69 genes against mmusculus.
## GO search found 14 hits.
## Performing gProfiler KEGG search of 69 genes against mmusculus.
## KEGG search found 1 hits.
## Performing gProfiler REAC search of 69 genes against mmusculus.
## REAC search found 3 hits.
## Performing gProfiler MI search of 69 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 69 genes against mmusculus.
## TF search found 4 hits.
## Performing gProfiler CORUM search of 69 genes against mmusculus.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 69 genes against mmusculus.
## HP search found 47 hits.
##    query.number significant  p.value term.size query.size overlap.size
## 1             1        TRUE 2.11e-02       366         45            7
## 2             1        TRUE 1.97e-02       362         45            7
## 3             1        TRUE 1.97e-02       362         45            7
## 4             1        TRUE 2.65e-08       142         45            9
## 5             1        TRUE 2.04e-08       138         45            9
## 6             1        TRUE 1.39e-02       115         23            4
## 7             1        TRUE 1.34e-02       114         23            4
## 8             1        TRUE 3.77e-04        47         23            4
## 9             1        TRUE 1.67e-02        36         23            3
## 10            1        TRUE 1.32e-03       148         45            6
## 11            1        TRUE 1.39e-02       126         45            5
## 12            1        TRUE 3.64e-03        96         45            5
## 13            1        TRUE 3.45e-03        95         45            5
## 14            1        TRUE 8.05e-04        71         45            5
##    precision recall    term.id domain subgraph.number
## 1      0.156  0.019 GO:0048880     BP               1
## 2      0.156  0.019 GO:0150063     BP               1
## 3      0.156  0.019 GO:0001654     BP               1
## 4      0.200  0.063 GO:0050953     BP               3
## 5      0.200  0.065 GO:0007601     BP               3
## 6      0.174  0.035 GO:0009581     BP               2
## 7      0.174  0.035 GO:0009582     BP               2
## 8      0.174  0.085 GO:0009583     BP               2
## 9      0.130  0.083 GO:0009584     BP               2
## 10     0.133  0.041 GO:0060041     BP               5
## 11     0.111  0.040 GO:0097730     CC               4
## 12     0.111  0.052 GO:0097731     CC               4
## 13     0.111  0.053 GO:0097733     CC               4
## 14     0.111  0.070 GO:0001750     CC               4
##                                term.name relative.depth
## 1             sensory system development              1
## 2              visual system development              2
## 3                        eye development              1
## 4   sensory perception of light stimulus              1
## 5                      visual perception              2
## 6         detection of external stimulus              1
## 7          detection of abiotic stimulus              1
## 8            detection of light stimulus              2
## 9             detection of visible light              3
## 10 retina development in camera-type eye              1
## 11                     non-motile cilium              1
## 12                 9+0 non-motile cilium              2
## 13             photoreceptor cell cilium              1
## 14           photoreceptor outer segment              1
##                                                                                                                                                                  intersection
## 1                                        ENSMUSG00000021099,ENSMUSG00000023978,ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446,ENSMUSG00000048015,ENSMUSG00000071648
## 2                                        ENSMUSG00000021099,ENSMUSG00000023978,ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446,ENSMUSG00000048015,ENSMUSG00000071648
## 3                                        ENSMUSG00000021099,ENSMUSG00000023978,ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446,ENSMUSG00000048015,ENSMUSG00000071648
## 4  ENSMUSG00000021804,ENSMUSG00000023978,ENSMUSG00000025386,ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446,ENSMUSG00000041534,ENSMUSG00000053773,ENSMUSG00000071648
## 5  ENSMUSG00000021804,ENSMUSG00000023978,ENSMUSG00000025386,ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446,ENSMUSG00000041534,ENSMUSG00000053773,ENSMUSG00000071648
## 6                                                                                                 ENSMUSG00000021804,ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446
## 7                                                                                                 ENSMUSG00000021804,ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446
## 8                                                                                                 ENSMUSG00000021804,ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446
## 9                                                                                                                    ENSMUSG00000021804,ENSMUSG00000031293,ENSMUSG00000037446
## 10                                                          ENSMUSG00000023978,ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446,ENSMUSG00000048015,ENSMUSG00000071648
## 11                                                                             ENSMUSG00000023978,ENSMUSG00000028777,ENSMUSG00000029491,ENSMUSG00000037446,ENSMUSG00000071648
## 12                                                                             ENSMUSG00000023978,ENSMUSG00000028777,ENSMUSG00000029491,ENSMUSG00000037446,ENSMUSG00000071648
## 13                                                                             ENSMUSG00000023978,ENSMUSG00000028777,ENSMUSG00000029491,ENSMUSG00000037446,ENSMUSG00000071648
## 14                                                                             ENSMUSG00000023978,ENSMUSG00000028777,ENSMUSG00000029491,ENSMUSG00000037446,ENSMUSG00000071648

3.4 dlgn knockout translatome vs retina knockout translatome.

## No fc/lfc was provided, defaulting to 10 fold.

## Performing gProfiler GO search of 78 genes against mmusculus.
## GO search found 2 hits.
## Performing gProfiler KEGG search of 78 genes against mmusculus.
## KEGG search found 3 hits.
## Performing gProfiler REAC search of 78 genes against mmusculus.
## REAC search found 2 hits.
## Performing gProfiler MI search of 78 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 78 genes against mmusculus.
## TF search found 2 hits.
## Performing gProfiler CORUM search of 78 genes against mmusculus.
## CORUM search found 2 hits.
## Performing gProfiler HP search of 78 genes against mmusculus.
## HP search found 0 hits.
##   query.number significant  p.value term.size query.size overlap.size precision
## 1            1        TRUE 0.033300        88         12            3      0.25
## 2            1        TRUE 0.000871         3          8            2      0.25
##   recall    term.id domain subgraph.number                   term.name
## 1  0.034 GO:1903008     BP               2       organelle disassembly
## 2  0.667 GO:0031493     MF               1 nucleosomal histone binding
##   relative.depth                                             intersection
## 1              1 ENSMUSG00000000628,ENSMUSG00000021115,ENSMUSG00000022789
## 2              1                    ENSMUSG00000001228,ENSMUSG00000021115
##   query.number significant p.value term.size query.size overlap.size precision
## 1            1        TRUE  0.0352         5          2            1     0.500
## 2            1        TRUE  0.0403        33         21            2     0.095
## 3            1        TRUE  0.0454        35         21            2     0.095
##   recall    term.id domain subgraph.number
## 1  0.200 KEGG:00524    keg               2
## 2  0.061 KEGG:00052    keg               3
## 3  0.057 KEGG:00051    keg               1
##                                         term.name relative.depth
## 1 Neomycin, kanamycin and gentamicin biosynthesis              1
## 2                            Galactose metabolism              1
## 3                 Fructose and mannose metabolism              1
##                            intersection
## 1                    ENSMUSG00000000628
## 2 ENSMUSG00000000628,ENSMUSG00000029762
## 3 ENSMUSG00000000628,ENSMUSG00000029762
##   query.number significant p.value term.size query.size overlap.size precision
## 1            1        TRUE  0.0328        54         49            3     0.061
## 2            1        TRUE  0.0293        52         49            3     0.061
##   recall            term.id domain subgraph.number
## 1  0.056 REAC:R-MMU-6806667    rea               1
## 2  0.058  REAC:R-MMU-975634    rea               1
##                            term.name relative.depth
## 1 Metabolism of fat-soluble vitamins              1
## 2  Retinoid metabolism and transport              1
##                                               intersection
## 1 ENSMUSG00000028003,ENSMUSG00000029762,ENSMUSG00000055653
## 2 ENSMUSG00000028003,ENSMUSG00000029762,ENSMUSG00000055653
## Performing gProfiler GO search of 51 genes against mmusculus.
## GO search found 4 hits.
## Performing gProfiler KEGG search of 51 genes against mmusculus.
## KEGG search found 9 hits.
## Performing gProfiler REAC search of 51 genes against mmusculus.
## REAC search found 2 hits.
## Performing gProfiler MI search of 51 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 51 genes against mmusculus.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 51 genes against mmusculus.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 51 genes against mmusculus.
## HP search found 0 hits.
##   query.number significant p.value term.size query.size overlap.size precision
## 1            1        TRUE 0.04480       319         12            4     0.333
## 2            1        TRUE 0.01250       194         14            4     0.286
## 3            1        TRUE 0.00675       166         14            4     0.286
## 4            1        TRUE 0.00161       116         14            4     0.286
##   recall    term.id domain subgraph.number
## 1  0.013 GO:0071496     BP               1
## 2  0.021 GO:0007249     BP               2
## 3  0.024 GO:0043122     BP               2
## 4  0.034 GO:0043123     BP               2
##                                                    term.name relative.depth
## 1                     cellular response to external stimulus              1
## 2                        I-kappaB kinase/NF-kappaB signaling              1
## 3          regulation of I-kappaB kinase/NF-kappaB signaling              1
## 4 positive regulation of I-kappaB kinase/NF-kappaB signaling              1
##                                                                  intersection
## 1 ENSMUSG00000026029,ENSMUSG00000026989,ENSMUSG00000027398,ENSMUSG00000032009
## 2 ENSMUSG00000026029,ENSMUSG00000027398,ENSMUSG00000032496,ENSMUSG00000035186
## 3 ENSMUSG00000026029,ENSMUSG00000027398,ENSMUSG00000032496,ENSMUSG00000035186
## 4 ENSMUSG00000026029,ENSMUSG00000027398,ENSMUSG00000032496,ENSMUSG00000035186
##   query.number significant  p.value term.size query.size overlap.size precision
## 1            1        TRUE 0.000369        99         10            3     0.300
## 2            1        TRUE 0.017500        61         10            2     0.200
## 3            1        TRUE 0.006040       251         10            3     0.300
## 4            1        TRUE 0.028600        78         10            2     0.200
## 5            1        TRUE 0.015200        57         10            2     0.200
## 6            1        TRUE 0.002690        94         24            3     0.125
## 7            1        TRUE 0.048800       102         10            2     0.200
## 8            1        TRUE 0.039200        71         12            2     0.167
## 9            1        TRUE 0.049800       103         10            2     0.200
##   recall    term.id domain subgraph.number
## 1  0.030 KEGG:04620    keg               9
## 2  0.033 KEGG:04623    keg               3
## 3  0.012 KEGG:05163    keg               4
## 4  0.026 KEGG:05132    keg               8
## 5  0.035 KEGG:05134    keg               6
## 6  0.032 KEGG:04657    keg               5
## 7  0.020 KEGG:05142    keg               1
## 8  0.028 KEGG:04115    keg               2
## 9  0.019 KEGG:04064    keg               7
##                                   term.name relative.depth
## 1      Toll-like receptor signaling pathway              1
## 2             Cytosolic DNA-sensing pathway              1
## 3           Human cytomegalovirus infection              1
## 4                      Salmonella infection              1
## 5                             Legionellosis              1
## 6                   IL-17 signaling pathway              1
## 7 Chagas disease (American trypanosomiasis)              1
## 8                     p53 signaling pathway              1
## 9              NF-kappa B signaling pathway              1
##                                               intersection
## 1 ENSMUSG00000018930,ENSMUSG00000026029,ENSMUSG00000027398
## 2                    ENSMUSG00000018930,ENSMUSG00000027398
## 3 ENSMUSG00000018930,ENSMUSG00000026029,ENSMUSG00000027398
## 4                    ENSMUSG00000018930,ENSMUSG00000027398
## 5                    ENSMUSG00000026029,ENSMUSG00000027398
## 6 ENSMUSG00000026029,ENSMUSG00000027398,ENSMUSG00000056054
## 7                    ENSMUSG00000026029,ENSMUSG00000027398
## 8                    ENSMUSG00000026029,ENSMUSG00000032009
## 9                    ENSMUSG00000018930,ENSMUSG00000027398
##   query.number significant  p.value term.size query.size overlap.size precision
## 1            1        TRUE 0.000516         3         24            2     0.083
## 2            1        TRUE 0.000172         4         10            2     0.200
##   recall            term.id domain subgraph.number
## 1  0.667 REAC:R-MMU-6799990    rea               1
## 2  0.500 REAC:R-MMU-5660668    rea               2
##                                       term.name relative.depth
## 1 Metal sequestration by antimicrobial proteins              1
## 2                   CLEC7A/inflammasome pathway              1
##                            intersection
## 1 ENSMUSG00000032496,ENSMUSG00000056054
## 2 ENSMUSG00000026029,ENSMUSG00000027398

3.5 Normal dlgn translatome vs knockout dlgn translatome.

## No fc/lfc was provided, defaulting to 10 fold.

## Performing gProfiler GO search of 14 genes against mmusculus.
## GO search found 0 hits.
## Performing gProfiler KEGG search of 14 genes against mmusculus.
## KEGG search found 0 hits.
## Performing gProfiler REAC search of 14 genes against mmusculus.
## REAC search found 1 hits.
## Performing gProfiler MI search of 14 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 14 genes against mmusculus.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 14 genes against mmusculus.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 14 genes against mmusculus.
## HP search found 0 hits.
## Performing gProfiler GO search of 17 genes against mmusculus.
## GO search found 3 hits.
## Performing gProfiler KEGG search of 17 genes against mmusculus.
## KEGG search found 0 hits.
## Performing gProfiler REAC search of 17 genes against mmusculus.
## REAC search found 0 hits.
## Performing gProfiler MI search of 17 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 17 genes against mmusculus.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 17 genes against mmusculus.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 17 genes against mmusculus.
## HP search found 0 hits.
##   query.number significant p.value term.size query.size overlap.size precision
## 1            1        TRUE 0.01190       154          6            3       0.5
## 2            1        TRUE 0.01800        29          4            2       0.5
## 3            1        TRUE 0.00932        21          4            2       0.5
##   recall    term.id domain subgraph.number                 term.name
## 1  0.019 GO:0045471     BP               1       response to ethanol
## 2  0.069 GO:0070717     MF               2 poly-purine tract binding
## 3  0.095 GO:0008143     MF               2           poly(A) binding
##   relative.depth                                             intersection
## 1              1 ENSMUSG00000021609,ENSMUSG00000026029,ENSMUSG00000037727
## 2              1                    ENSMUSG00000021012,ENSMUSG00000023025
## 3              2                    ENSMUSG00000021012,ENSMUSG00000023025

3.6 dlgn knockout translatome vs. scn knockout translatome.

## No fc/lfc was provided, defaulting to 10 fold.
## Warning: Removed 1 rows containing missing values (geom_point).

## Performing gProfiler GO search of 69 genes against mmusculus.
## GO search found 18 hits.
## Performing gProfiler KEGG search of 69 genes against mmusculus.
## KEGG search found 1 hits.
## Performing gProfiler REAC search of 69 genes against mmusculus.
## REAC search found 1 hits.
## Performing gProfiler MI search of 69 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 69 genes against mmusculus.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 69 genes against mmusculus.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 69 genes against mmusculus.
## HP search found 0 hits.
##    query.number significant  p.value term.size query.size overlap.size
## 1             1        TRUE 0.012600        89          9            3
## 2             1        TRUE 0.007540        75          9            3
## 3             1        TRUE 0.000911       558         20            7
## 4             1        TRUE 0.009520      3235         23           13
## 5             1        TRUE 0.003780        47         40            4
## 6             1        TRUE 0.018600      3444         26           14
## 7             1        TRUE 0.003890       295         16            5
## 8             1        TRUE 0.009500      1329         23            9
## 9             1        TRUE 0.012100       588         18            6
## 10            1        TRUE 0.011900       587         18            6
## 11            1        TRUE 0.011700       585         18            6
## 12            1        TRUE 0.011700       585         18            6
## 13            1        TRUE 0.004730       443         20            6
## 14            1        TRUE 0.008770      3212         23           13
## 15            1        TRUE 0.007800      3773         23           14
## 16            1        TRUE 0.000434       500         20            7
## 17            1        TRUE 0.016900      1689         20            9
## 18            1        TRUE 0.000293       472         20            7
##    precision recall    term.id domain subgraph.number
## 1      0.333  0.034 GO:0015844     BP               1
## 2      0.333  0.040 GO:0051937     BP               1
## 3      0.350  0.013 GO:0010469     BP               7
## 4      0.565  0.004 GO:0023051     BP               4
## 5      0.100  0.085 GO:0009583     BP               9
## 6      0.538  0.004 GO:0065008     BP               5
## 7      0.312  0.017 GO:0001505     BP               5
## 8      0.391  0.007 GO:0007267     BP               6
## 9      0.333  0.010 GO:0099536     BP               6
## 10     0.333  0.010 GO:0099537     BP               6
## 11     0.333  0.010 GO:0098916     BP               6
## 12     0.333  0.010 GO:0007268     BP               6
## 13     0.300  0.014 GO:0023061     BP               6
## 14     0.565  0.004 GO:0010646     BP               2
## 15     0.609  0.004 GO:0048583     BP               8
## 16     0.350  0.014 GO:0030545     MF               3
## 17     0.450  0.005 GO:0005102     MF               3
## 18     0.350  0.015 GO:0048018     MF               3
##                                    term.name relative.depth
## 1                        monoamine transport              1
## 2                    catecholamine transport              2
## 3  regulation of signaling receptor activity              1
## 4                    regulation of signaling              1
## 5                detection of light stimulus              1
## 6           regulation of biological quality              1
## 7      regulation of neurotransmitter levels              2
## 8                        cell-cell signaling              1
## 9                         synaptic signaling              2
## 10                  trans-synaptic signaling              3
## 11      anterograde trans-synaptic signaling              4
## 12            chemical synaptic transmission              5
## 13                            signal release              2
## 14          regulation of cell communication              1
## 15        regulation of response to stimulus              1
## 16               receptor regulator activity              1
## 17                signaling receptor binding              1
## 18                  receptor ligand activity              2
##                                                                                                                                                                                                                                                                 intersection
## 1                                                                                                                                                                                                                   ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000023064
## 2                                                                                                                                                                                                                   ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000023064
## 3                                                                                                                                       ENSMUSG00000018930,ENSMUSG00000021647,ENSMUSG00000023078,ENSMUSG00000024784,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304
## 4                     ENSMUSG00000018930,ENSMUSG00000021647,ENSMUSG00000023064,ENSMUSG00000023078,ENSMUSG00000024519,ENSMUSG00000024784,ENSMUSG00000025610,ENSMUSG00000026029,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304,ENSMUSG00000031293,ENSMUSG00000035451
## 5                                                                                                                                                                                                ENSMUSG00000029491,ENSMUSG00000031293,ENSMUSG00000037446,ENSMUSG00000056043
## 6  ENSMUSG00000006764,ENSMUSG00000018930,ENSMUSG00000021012,ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000023064,ENSMUSG00000023078,ENSMUSG00000024519,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304,ENSMUSG00000029491,ENSMUSG00000035451,ENSMUSG00000037446
## 7                                                                                                                                                                             ENSMUSG00000006764,ENSMUSG00000021609,ENSMUSG00000023064,ENSMUSG00000024519,ENSMUSG00000027398
## 8                                                                                                 ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000023064,ENSMUSG00000023078,ENSMUSG00000024519,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304,ENSMUSG00000035451
## 9                                                                                                                                                          ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000023064,ENSMUSG00000024519,ENSMUSG00000027398,ENSMUSG00000028963
## 10                                                                                                                                                         ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000023064,ENSMUSG00000024519,ENSMUSG00000027398,ENSMUSG00000028963
## 11                                                                                                                                                         ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000023064,ENSMUSG00000024519,ENSMUSG00000027398,ENSMUSG00000028963
## 12                                                                                                                                                         ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000023064,ENSMUSG00000024519,ENSMUSG00000027398,ENSMUSG00000028963
## 13                                                                                                                                                         ENSMUSG00000021647,ENSMUSG00000023064,ENSMUSG00000024519,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304
## 14                    ENSMUSG00000018930,ENSMUSG00000021647,ENSMUSG00000023064,ENSMUSG00000023078,ENSMUSG00000024519,ENSMUSG00000024784,ENSMUSG00000025610,ENSMUSG00000026029,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304,ENSMUSG00000031293,ENSMUSG00000035451
## 15 ENSMUSG00000018930,ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000022661,ENSMUSG00000023064,ENSMUSG00000023078,ENSMUSG00000024784,ENSMUSG00000025610,ENSMUSG00000026029,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304,ENSMUSG00000031293,ENSMUSG00000035451
## 16                                                                                                                                      ENSMUSG00000018930,ENSMUSG00000021647,ENSMUSG00000023078,ENSMUSG00000024784,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304
## 17                                                                                                ENSMUSG00000018930,ENSMUSG00000021609,ENSMUSG00000021647,ENSMUSG00000023078,ENSMUSG00000024784,ENSMUSG00000026029,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304
## 18                                                                                                                                      ENSMUSG00000018930,ENSMUSG00000021647,ENSMUSG00000023078,ENSMUSG00000024784,ENSMUSG00000027398,ENSMUSG00000028963,ENSMUSG00000029304

## Performing gProfiler GO search of 67 genes against mmusculus.
## GO search found 2 hits.
## Performing gProfiler KEGG search of 67 genes against mmusculus.
## KEGG search found 0 hits.
## Performing gProfiler REAC search of 67 genes against mmusculus.
## REAC search found 1 hits.
## Performing gProfiler MI search of 67 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 67 genes against mmusculus.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 67 genes against mmusculus.
## CORUM search found 3 hits.
## Performing gProfiler HP search of 67 genes against mmusculus.
## HP search found 0 hits.
##   query.number significant p.value term.size query.size overlap.size precision
## 1            1        TRUE  0.0205         8         13            2     0.154
## 2            1        TRUE  0.0108        27         27            3     0.111
##   recall    term.id domain subgraph.number                          term.name
## 1  0.250 GO:0001758     MF               2     retinal dehydrogenase activity
## 2  0.111 GO:0005520     MF               1 insulin-like growth factor binding
##   relative.depth                                             intersection
## 1              1                    ENSMUSG00000013584,ENSMUSG00000029762
## 2              1 ENSMUSG00000035551,ENSMUSG00000037362,ENSMUSG00000042379

4 Some pictures

As I understand it, there is some interest in an ontology search using the ratio of ratios.

## [1] 1877
## [1] 476
## Performing gProfiler GO search of 1877 genes against mmusculus.
## GO search found 271 hits.
## Performing gProfiler KEGG search of 1877 genes against mmusculus.
## KEGG search found 8 hits.
## Performing gProfiler REAC search of 1877 genes against mmusculus.
## REAC search found 11 hits.
## Performing gProfiler MI search of 1877 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 1877 genes against mmusculus.
## TF search found 376 hits.
## Performing gProfiler CORUM search of 1877 genes against mmusculus.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 1877 genes against mmusculus.
## HP search found 5 hits.
## Writing data to: excel/20200116mm_ror_gpfoiler_up-v20200114.xlsx.
## Finished writing data.

## Warning: Removed 1 rows containing missing values (geom_col).

## Performing gProfiler GO search of 476 genes against mmusculus.
## GO search found 82 hits.
## Performing gProfiler KEGG search of 476 genes against mmusculus.
## KEGG search found 7 hits.
## Performing gProfiler REAC search of 476 genes against mmusculus.
## REAC search found 2 hits.
## Performing gProfiler MI search of 476 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 476 genes against mmusculus.
## TF search found 6 hits.
## Performing gProfiler CORUM search of 476 genes against mmusculus.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 476 genes against mmusculus.
## HP search found 0 hits.
## Writing data to: excel/20200116mm_ror_gpfoiler_down-v20200114.xlsx.
## Finished writing data.

LS0tCnRpdGxlOiAiTS4gbXVzY3VsdXMgMyBjZWxsIHR5cGVzLCAxIHRpbWVwb2ludCwgMyBnZW5vdHlwZXMsIGFuZCAxIHJlcGxpY2F0ZS4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIi9kYXRhL2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gInVuZGVmaW5lZC5SbWQiCnZlciA8LSAiMjAyMDAxMTQiCgojI3RtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKcm1kX2ZpbGUgPC0gImluZGV4LlJtZCIKYGBgCgojIE0uIG11c2N1bHVzCgpUaGlzIHdpbGwgYmUgYSB2ZXJ5IG1pbmltYWwgYW5hbHlzaXMgdW50aWwgd2UgZ2V0IHNvbWUgcmVwbGljYXRlcy4KCiMjIEFubm90YXRpb25zCgpJIGFtIHVzaW5nIG1tMzhfOTUuCgpgYGB7ciBhbm5vdGF0aW9uc30KIyMgTXkgbG9hZF9iaW9tYXJ0X2Fubm90YXRpb25zKCkgZnVuY3Rpb24gZGVmYXVsdHMgdG8gaHVtYW4sIHNvIHRoYXQgd2lsbCBiZSBxdWljay4KbW1fYW5ub3QgPC0gbG9hZF9iaW9tYXJ0X2Fubm90YXRpb25zKHNwZWNpZXM9Im1tdXNjdWx1cyIpCm1tX2Fubm90IDwtIG1tX2Fubm90W1siYW5ub3RhdGlvbiJdXQptbV9hbm5vdFtbInR4aWQiXV0gPC0gcGFzdGUwKG1tX2Fubm90W1siZW5zZW1ibF90cmFuc2NyaXB0X2lkIl1dLCAiLiIsIG1tX2Fubm90W1sidmVyc2lvbiJdXSkKcm93bmFtZXMobW1fYW5ub3QpIDwtIG1ha2UubmFtZXMobW1fYW5ub3RbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQoKdHhfZ2VuZV9tYXAgPC0gbW1fYW5ub3RbLCBjKCJ0eGlkIiwgImVuc2VtYmxfZ2VuZV9pZCIpXQpgYGAKClNvLCBJIG5vdyBoYXZlIDIgZGF0YSBmcmFtZXMgb2YgcGFyYXNpdGUgYW5ub3RhdGlvbnMgYW5kIDEgaHVtYW4uCgojIyBNZXRhZGF0YQoKSSBhbSBnb2luZyB0byB3cml0ZSBhIHF1aWNrIHNhbXBsZSBzaGVldCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBjYWxsZWQKJ2FsbF9zYW1wbGVzLnhsc3gnIGFuZCBwdXQgdGhlIG5hbWVzIG9mIHRoZSBjb3VudCB0YWJsZXMgaW4gaXQuCgojIyBDcmVhdGUgZXhwcmVzc2lvbnNldHMKCkhlcmUgSSBjb21iaW5lIHRoZSBtZXRhZGF0YSwgY291bnQgZGF0YSwgYW5kIGFubm90YXRpb25zLgoKSXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIGdlbmUgSURzIGZyb20gaHRzZXEtY291bnQgcHJvYmFibHkgZG8gbm90IG1hdGNoIHRoZQphbm5vdGF0aW9ucyByZXRyaWV2ZWQgYmVjYXVzZSB0aGV5IGFyZSBsaWtlbHkgZXhvbi1iYXNlZCByYXRoZXIgdGhhbiBnZW5lCmJhc2VkLiAgVGhpcyBpcyBub3QgcmVhbGx5IGEgcHJvYmxlbSwgYnV0IGRvbid0IGZvcmdldCBpdCEKCmBgYHtyIGV4cHR9Cm1tMzhfc2FsbW9uIDwtIHNtKGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLnhsc3giLCB0eF9nZW5lX21hcD10eF9nZW5lX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPW1tX2Fubm90LCBmaWxlX2NvbHVtbj0ic2FsbW9uZmlsZSIpKQoKbW10eF9hbm5vdCA8LSBtbV9hbm5vdApyb3duYW1lcyhtbXR4X2Fubm90KSA8LSBtbV9hbm5vdFtbInR4aWQiXV0KbW0zOF9zYWx0eCA8LSBzbShjcmVhdGVfZXhwdCgic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89bW10eF9hbm5vdCwgZmlsZV9jb2x1bW49InNhbG1vbmZpbGUiKSkKCmhpc2F0X2Fubm90IDwtIG1tX2Fubm90CnJvd25hbWVzKGhpc2F0X2Fubm90KSA8LSBwYXN0ZTAoImdlbmUuIiwgcm93bmFtZXMoaGlzYXRfYW5ub3QpKQptbTM4X2hpc2F0IDwtIGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1oaXNhdF9hbm5vdCkKYGBgCgojIyBRdWVyeSBleHByZXNzaW9uc2V0cwoKSW4gdGhpcyBibG9jayBJIHdpbGwgY2FsY3VsYXRlIGFsbCB0aGUgZGlhZ25vc3RpYyBwbG90cywgYnV0IG5vdCBzaG93IHRoZW0uICBJCndpbGwgc2hvdyB0aGVtIG5leHQgd2l0aCBhIGxpdHRsZSBhbm5vdGF0aW9uLgoKSSB3aWxsIGxlYXZlIHRoZSBvdXRwdXQgZm9yIHRoZSBmaXJzdCBvZiBlYWNoIGludm9jYXRpb24gYW5kIHNpbGVuY2UgaXQgZm9yIHRoZSBzZWNvbmQuCgojIyMgSW5pdGlhbCBzYWxtb24gcGxvdHMKCmBgYHtyIHF1ZXJ5X3NhbG1vbiwgZmlnLnNob3c9ImhpZGUifQptbTM4X3Bsb3RzX3NhIDwtIHNtKGdyYXBoX21ldHJpY3MobW0zOF9zYWxtb24pKQoKbW0zOF9ub3JtX3NhIDwtIG5vcm1hbGl6ZV9leHB0KG1tMzhfc2FsbW9uLCBub3JtPSJxdWFudCIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBmaWx0ZXI9VFJVRSkKCm1tMzhuX3Bsb3RzX3NhIDwtIHNtKGdyYXBoX21ldHJpY3MobW0zOF9ub3JtX3NhKSkKYGBgCgpgYGB7ciBzaG93X3Bsb3RzX3NhbG1vbn0KbW0zOF9wbG90c19zYSRsZWdlbmQKbW0zOF9wbG90c19zYSRsaWJzaXplCm1tMzhfcGxvdHNfc2Ekbm9uemVybwptbTM4bl9wbG90c19zYSRkZW5zaXR5Cm1tMzhuX3Bsb3RzX3NhJHBjX3Bsb3QKYGBgCgojIyMgSW5pdGlhbCBoaXNhdDIgcGxvdHMKCmBgYHtyIHF1ZXJ5X2hpc2F0LCBmaWcuc2hvdz0iaGlkZSJ9Cm1tMzhfcGxvdHNfaGkgPC0gc20oZ3JhcGhfbWV0cmljcyhtbTM4X2hpc2F0KSkKCm1tMzhfbm9ybV9oaSA8LSBub3JtYWxpemVfZXhwdChtbTM4X2hpc2F0LCBub3JtPSJxdWFudCIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBmaWx0ZXI9VFJVRSkKCm1tMzhuX3Bsb3RzX2hpIDwtIHNtKGdyYXBoX21ldHJpY3MobW0zOF9ub3JtX2hpKSkKYGBgCgpgYGB7ciBzaG93X3Bsb3RzX2hpc2F0fQptbTM4X3Bsb3RzX2hpJGxpYnNpemUKbW0zOF9wbG90c19oaSRub256ZXJvCm1tMzhuX3Bsb3RzX2hpJGRlbnNpdHkKbW0zOG5fcGxvdHNfaGkkcGNfcGxvdApgYGAKCiMjIERvIGEgc2ltcGxlIERFCgpUaGUgb25seSBpbnRlcmVzdGluZyBERSBJIHNlZSBpbiB0aGlzIGlzIHRvIGNvbXBhcmUgdGhlIHJldGluYXMgdG8gdGhlIGRsZ25zLgpJIGNhbiB0cmVhdCB0aGVtIGFzIHJlcGxpY2F0ZXMgYW5kIGNvbXBhcmUuCgpUaGVzZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNlcyBhcmUgX0VYUExJQ0lUTFlfIF9OT1RfIHdoYXQgeW91IGNhcmUKYWJvdXQuICBIb3dldmVyLCB0aGV5IGFyZSB1c2VmdWwgZm9yIHR3byBwdXJwb3NlczoKCjEuICBTZWVpbmcgdGhhdCB0aGUgdGhyZWUgdGlzc3VlIHR5cGVzIGFyZSBpbmRlZWQgZGlmZmVyZW50LgoyLiAgU2V0dGluZyB1cCB0aGUgdGFibGUgb2YgcmVzdWx0cyB3aXRoIGFwcHJvcHJpYXRlIHJvd3MvY29sdW1ucyBvZiAocm93cylnZW5lcwogICAgYW5kIChjb2x1bW5zKSBhbm5vdGF0aW9ucy4gIFdlIHdpbGwgdGhlcmVmb3JlIGFkZCB0byB0aGVzZSB0YWJsZXMgdGhlCiAgICByZXN1bHRzIG9mIHRoZSBleHByZXNzaW9uIGFuYWx5c2VzIHRoYXQgeW91IGFjdHVhbGx5IGRvIGNhcmUgYWJvdXQuCgpXaGVuIHdlIHJlY2VpdmUgZnVsbCByZXBsaWNhdGUgc2V0cywgdGhpcyBjaGVhdGVyIG1ldGhvZCBvZiBlbmNhcHN1bGF0aW5nIHRoZQpkYXRhIHdpbGwgbm90IGxvbmdlciBiZSByZXF1aXJlZC4KCiMjIyBXaXRoIHNhbG1vbgoKYGBge3IgZGVfc2EsIGZpZy5zaG93PSJoaWRlIn0KbW1fc2EgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhtbTM4X3NhbG1vbiwgZmFjdD0iY2VsbHR5cGUiKQptbV9ub3JtX3NhIDwtIHNtKG5vcm1hbGl6ZV9leHB0KG1tX3NhLCBjb252ZXJ0PSJycGttIiwgdHJhbnNmb3JtPSJsb2cyIiwgY29sdW1uPSJjZHNfbGVuZ3RoIikpCnBsb3RfcGNhKG1tX25vcm1fc2EpJHBsb3QKCm1tX2RlX3NhIDwtIGFsbF9wYWlyd2lzZShtbV9zYSwgbW9kZWxfYmF0Y2g9RkFMU0UpCmBgYAoKIyMjIFdpdGggaGlzYXQyCgpgYGB7ciBkZV9oaSwgZmlnLnNob3c9ImhpZGUifQptbV9oaSA8LSBzZXRfZXhwdF9jb25kaXRpb25zKG1tMzhfaGlzYXQsIGZhY3Q9ImNlbGx0eXBlIikKbW1fbm9ybV9oaSA8LSBzbShub3JtYWxpemVfZXhwdChtbV9oaSwgY29udmVydD0icnBrbSIsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbHVtbj0iY2RzX2xlbmd0aCIpKQpwbG90X3BjYShtbV9ub3JtX2hpKSRwbG90CgptbV9kZV9oaSA8LSBzbShhbGxfcGFpcndpc2UobW1faGksIG1vZGVsX2JhdGNoPUZBTFNFKSkKYGBgCgojIyBTZXQgdXAgZm9yIGluaXRpYWwgYW5hbHlzaXMKClVudGlsIHdlIGdldCBmdWxsIHJlcGxpY2F0ZXMsIEkgd2lsbCBkbyBzaW1wbGUgc3VidHJhY3Rpb25zLgoKIyMjIFRlcm0gZGVmaW5pdGlvbgoKSW4gYW4gYXR0ZW1wdCB0byBrZWVwIHNvbWUgY2xhcml0eSBpbiB0aGUgdGVybXMgdXNlZCwgSSB3YW50IHRvIGRlZmluZSB0aGVtCm5vdy4gIFRoZXJlIGFyZSB0aHJlZSBjb250ZXh0cyBpbiB3aGljaCB3ZSB3aWxsIGNvbnNpZGVyIHRoZSBkYXRhOgoKMS4gIFRoZSBpbmRpdmlkdWFsIHNhbXBsZSB0eXBlLiAgV2hlbiBjb25zaWRlcmluZyBpbmRpdmlkdWFsIHNhbXBsZXMsIEkgd2lsbCB1c2UKICAgIHRocmVlIHRlcm1zIGluIHRoaXMgYW5kIG9ubHkgdGhpcyBjb250ZXh0OiB3aWxkLXR5cGUgKHd0KSwgaGV0LCBhbmQgbXV0LgoKMi4gIFRoZSBpbmRpdmlkdWFsIHRyYW5zbGF0b21lLiAgVGhlc2UgYXJlIGRlZmluZXMgYXMgc29tZXRoaW5nIC8gYmFzZWxpbmUuICBJCiAgICB3aWxsIGV4Y2x1c2l2ZWx5IGNhbGwgdGhlIHd0IHNhbXBsZXMgJ2Jhc2VsaW5lJyB3aGVuIHNwZWFraW5nIGluIHRoaXMKICAgIGNvbnRleHQuICBJIHdpbGwgZXhjbHVzaXZlbHkgc3RhdGUgJ25vcm1hbCcgd2hlbiByZWZlcnJpbmcgdG8gaGV0IC8gd3QKICAgIHNhbXBsZXMsIGFuZCBJIHdpbGwgc3RhdGUgJ2tvJyB3aGVuIHJlZmVycmluZyB0byBtdXQgLyB3dCBzYW1wbGVzIGluIHRoZQogICAgdHJhbnNsYXRvbWUgY29udGV4dC4KCjMuICBUcmFuc2xhdG9tZSB2cy4gdHJhbnNsYXRvbWUuICBXaGVuZXZlciBjb21wYXJpbmcgdHJhbnNsYXRvbWVzLCBJIHdpbGwgdXNlCiAgICB0aGUgbmFtZXMgYXMgaW4gIzIgYW5kIGFsd2F5cyBwdXQgdGhlIG51bWVyYXRvciBmaXJzdCB3aGVuIHdyaXRpbmcgdGhlIG5hbWUKICAgIG9mIGEgY29tcGFyaXNvbi4KClRoZSBtb3N0IGNvbXBsZXggZXhhbXBsZSBvZiB0aGUgYWJvdmUgbm9tZW5jbGF0dXJlIGlzOgoKIm5vcm1rb19yZXRkbGduIGlzIGRlZmluZWQgYXMgbm9ybXJldF92c19ub3JtZGxnbiAtIGtvcmV0X3ZzX2tvZGxnbiIKClRoaXMgc3RhdGVzIHdlIGFyZSBleGFtaW5pbmcgYXQgdGhlIHRyYW5zbGF0b21lIGNvbnRleHQ6CiAgIChub3JtKHJldGluYSB0cmFuc2xhdG9tZSkgLSBub3JtKGRsZ24gdHJhbnNsYXRvbWUpKSAtCiAgIChrbyhyZXRpbmEgdHJhbnNsYXRvbWUpIC0ga28oZGxnbiB0cmFuc2xhdG9tZSkpCgpXaGljaCBpbiB0dXJuIGlzIHN5bm9ueW1vdXMgdG8gdGhlIGZvbGxvd2luZyBhdCB0aGUgc2FtcGxlIGNvbnRleHQ6CiAgKChyZXRoZXQgLSByZXR3dCkgIC0gIChkbGduaGV0IC0gZGxnbnd0KSkgIC0KICAoKHJldGtvIC0gcmV0d3QpICAtICAoZGxnbmtvIC0gZGxnbnd0KSkKCk5vdyBsZXQgdXMgYXNzb2NpYXRlIHRoZSB2YXJpb3VzIHZhcmlhYmxlIG5hbWVzIHdpdGggdGhlIGFwcHJvcHJpYXRlIHNhbXBsZXM6CgpgYGB7ciBzYW1wbGVfbmFtZXN9CmRsZ253dCA8LSAiaXByZ2NfMDEiCnJldHd0IDwtICJpcHJnY18wMiIKc2Nud3QgPC0gImlwcmdjXzAzIgoKZGxnbmhldCA8LSAiaXByZ2NfMDQiCnJldGhldCA8LSAiaXByZ2NfMDUiCnNjbmhldCA8LSBOVUxMICAjIyBEb2VzIG5vdCB5ZXQgZXhpc3QuCgpkbGdubXV0IDwtICJpcHJnY18wNiIKcmV0bXV0IDwtICJpcHJnY18wNyIKc2NubXV0IDwtICJpcHJnY18wOCIKYGBgCgpHaXZlIHRoZXNlIHZhcmlhYmxlIG5hbWVzLCBub3cgbGV0cyBhc3NvY2lhdGUgY29sdW1ucyBvZiB0aGUgZXhwcmVzc2lvbiBkYXRhCndpdGggdGhlbS4gIFRoZXNlIGFyZSBhdCB0aGUgc2FtcGxlIGNvbnRleHQsIHNvIHRoZSBhcHByb3ByaWF0ZSBuYW1lcyBhcmU6Cid3dCcsICdoZXQnLCBhbmQgJ211dCcuICBJbiBlYWNoIGNhc2UgSSB3aWxsIHByZWZpeCB0aGUgZ2Vub3R5cGUgd2l0aCB0aGUgdGlzc3VlCnR5cGU6ICdyZXQnLCAnZGxnbicsIGFuZCAnc2NuJy4gIFRodXMgJ3JldHd0JyByZWZlcnMgdG8gdGhlIHNhbXBsZSB1c2VkCnRvIGNhbGN1bGF0ZSB0aGUgdHJhbnNsYXRvbWUgcmV0aW5hIGJhc2VsaW5lOyBpbiBjb250cmFzdCAnZGxnbm11dCcgaXMgdGhlCnNhbXBsZSB3aGljaCBwcm92aWRlcyB0aGUgZGxnbiBrbm9ja291dC4KCmBgYHtyIHNhbXBsZV9jb2x1bW5zfQojIyBTYW1wbGUgY29udGV4dAptbTM4X25vcm0gPC0gbW1fbm9ybV9zYQpkbGdud3QgPC0gZXhwcnMobW0zOF9ub3JtKVssIGRsZ253dF0KcmV0d3QgPC0gZXhwcnMobW0zOF9ub3JtKVssIHJldHd0XQpzY253dCA8LSBleHBycyhtbTM4X25vcm0pWywgc2Nud3RdCmRsZ25oZXQgPC0gZXhwcnMobW0zOF9ub3JtKVssIGRsZ25oZXRdCnJldGhldCA8LSBleHBycyhtbTM4X25vcm0pWywgcmV0aGV0XQpkbGdubXV0IDwtIGV4cHJzKG1tMzhfbm9ybSlbLCBkbGdubXV0XQpyZXRtdXQgPC0gZXhwcnMobW0zOF9ub3JtKVssIHJldG11dF0Kc2NubXV0IDwtIGV4cHJzKG1tMzhfbm9ybSlbLCBzY25tdXRdCmBgYAoKRWFjaCBvZiB0aGUgYWJvdmUgOCB2YXJpYWJsZXMgcHJvdmlkZXMgMSBjb2x1bW4gb2YgaW5mb3JtYXRpb24uIFdlIGhhdmUgMwpiYXNlbGluZSBjb21wYXJpc29ucyBhdmFpbGFibGUgdG8gdXMuICBJbiBlYWNoIG9mIHRoZXNlIHdlIGNvbXBhcmUgb25lIHd0CnNhbXBsZSB0byBhbm90aGVyLgoKYGBge3IgYmFzZWxpbmVfY29tcGFyaXNvbnN9CiMjIEJhc2VsaW5lIGNvbXBhcmlzb25zCnd0X2RsZ25yZXQgPC0gZGxnbnd0IC0gcmV0d3QKd3Rfc2NucmV0IDwtIHNjbnd0IC0gcmV0d3QKd3RfZGxnbnNjbiA8LSBkbGdud3QgLSBzY253dApgYGAKClNpbXVsdGFuZW91c2x5LCB3ZSBoYXZlIDUgYXZhaWxhYmxlIHRyYW5zbGF0b21lcy4gIFRoaXMgYXJlIHByb3ZpZGVkIGJ5CmNvbXBhcmluZyBlYWNoIGhldCBvciBtdXQgdG8gdGhlIGFzc29jaWF0ZWQgd3QuICBUaGVzZSB3aWxsIHRoZXJlZm9yZSByZWNlaXZlCm5hbWVzOiAnbm9ybScgYW5kICdrbycgaW5zdGVhZCBvZiAnaGV0JyBhbmQgJ211dCcuCgpgYGB7ciB0cmFuc2xhdG9tZXN9CiMjIFRyYW5zbGF0b21lIGNvbnRleHQKbm9ybXJldCA8LSByZXRoZXQgLSByZXR3dAprb3JldCA8LSByZXRtdXQgLSByZXR3dAprb3NjbiA8LSBzY25tdXQgLSBzY253dApub3JtZGxnbiA8LSBkbGduaGV0IC0gZGxnbnd0CmtvZGxnbiA8LSBkbGdubXV0IC0gZGxnbnd0CmBgYAoKR2l2ZW4gdGhlc2UgdHJhbnNsYXRvbWVzLCB0aGVyZSBhcmUgYSBmZXcgY29udHJhc3RzIG9mIGxpa2VseSBpbnRlcmVzdC4gIFRoZXNlCmFyZSBwZXJmb3JtZWQgYnkgY29tcGFyaW5nIHRoZSByZWxldmFudCB0cmFuc2xhdG9tZXMuCgpXaWxsIHdpbGwgc3BsaXQgdGhlc2UgaW50byA0IHNlcGFyYXRlIGNhdGVnb3JpZXM6CmhldCB2cyBoZXQsIGtvIHZzIGtvLCBrbyB2cyBoZXQsIGFuZCByYXRpbyB2cyByYXRpby4KCkZpbmFsbHksIG5vdGUgdGhhdCB3ZSBhcmUgYmVpbmcgZXhwbGljaXRseSByZWR1bmRhbnQgaW4gdGhlc2UgZGVmaW5pdGlvbnMuICBJIGFtCm1ha2luZyB2YXJpYWJsZSBuYW1lcyBmb3IgYm90aCB0aGUgYS9iIHJhdGlvIGFuZCB0aGUgYi9hIHJhdGlvLiAgVGh1cyB3ZSBoYXZlCnNvbWUgcmVkdW5kYW50bHkgcmVkdW5kYW50IChoYWhhKSBmbGV4aWJpbGl0eSB3aGVuIGRlY2lkaW5nIG9uIHdoYXQgd2Ugd2FudCB0byBwbG90LgoKYGBge3Igbm9ybV92c19ub3JtfQojIyBub3JtIHZzIG5vcm0Kbm9ybWRsZ25fdnNfbm9ybXJldCA8LSBub3JtZGxnbiAtIG5vcm1yZXQKbm9ybXJldF92c19ub3JtZGxnbiA8LSBub3JtcmV0IC0gbm9ybWRsZ24KYGBgCgpgYGB7ciBrb192c19rb30KIyMga28gdnMga28Ka29yZXRfdnNfa29kbGduIDwtIGtvcmV0IC0ga29kbGduCmtvZGxnbl92c19rb3JldCA8LSBrb2RsZ24gLSBrb3JldAoKa29yZXRfdnNfa29zY24gPC0ga29yZXQgLSBrb3Njbgprb3Njbl92c19rb3JldCA8LSBrb3NjbiAtIGtvcmV0Cgprb2RsZ25fdnNfa29zY24gPC0ga29kbGduIC0ga29zY24Ka29zY25fdnNfa29kbGduIDwtIGtvc2NuIC0ga29kbGduCmBgYAoKT24gdGhlIG90aGVyIGhhbmQsIEkgYW0gYXNzdW1pbmcgd2UgYWx3YXlzIHdhbnQgdGhlIG5vcm1hbHMgYXMgZGVub21pbmF0b3JzIGFuZAprb3MgYXMgbnVtZXJhdG9ycy4KCmBgYHtyIGtvX3ZzX25vcm19CiMjIGtvIHZzIG5vcm0Ka29yZXRfdnNfbm9ybXJldCA8LSBrb3JldCAtIG5vcm1yZXQKCmtvZGxnbl92c19ub3JtZGxnbiA8LSBrb2RsZ24gLSBub3JtZGxnbgpgYGAKCkZpbmFsbHksIGhlcmUgaXMgdGhlIHJhdGlvIG9mIHJhdGlvcyBleGFtcGxlIEkgcHJpbnRlZCBhYm92ZToKCkkgbmFtZWQgaXQgJ25vcm1rb19yZXRkbGduJyBpbiBhbiBhdHRlbXB0IHRvIG1ha2UgY2xlYXIgdGhhdCBpdCBpcyBhY3R1YWxseToKIChub3JtcmV0L25vcm1kbGduKS8oa29yZXQva29kbGduKQoKb3Igc3RhdGVkIGRpZmZlcmVudGx5OiAibm9ybSBkaXZpZGVkIGJ5IGtvIGZvciByZXQgZGl2aWRlZCBieSBkbGduLiIKCmBgYHtyIHJvcn0KIyMgcmF0aW8gb2YgcmF0aW9zCm5vcm1rb19yZXRkbGduIDwtIG5vcm1yZXRfdnNfbm9ybWRsZ24gLSBrb3JldF92c19rb2RsZ24KYGBgCgojIyBEZWZpbmUgYSBtYXRyaXggb2YgdGhlc2UgdmFsdWVzLgoKTXkgbWF0cml4IG9mIGRhdGEgd2lsbCBub3cgY29udGFpbiAxIGNvbHVtbiBmb3IgZWFjaCBvZiB0aGUgYWJvdmUgMjcKc2FtcGxlcy9jb21wYXJpc29ucy4KCmBgYHtyIG1hdHJpeF9vZl92YWx1ZXN9CnBhaXJfbXRyeCA8LSBjYmluZCgKICAjIyBJbmRpdmlkdWFsIHNhbXBsZXMKICBkbGdud3QsIHJldHd0LCBzY253dCwgZGxnbmhldCwgcmV0aGV0LCBkbGdubXV0LCByZXRtdXQsIHNjbm11dCwKICAjIyBCYXNlbGluZSBjb21wYXJpc29ucwogIHd0X2RsZ25yZXQsIHd0X3NjbnJldCwgd3RfZGxnbnNjbiwKICAjIyBCYXNlbGluZSBzdWJ0cmFjdGlvbnMKICBub3JtZGxnbiwgbm9ybXJldCwga29kbGduLCBrb3JldCwga29zY24sCiAgIyMgaGV0X3ZzX2hldCwgb2Ygd2hpY2ggdGhlcmUgaXMgb25seSAxIGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgaGV0c2NuCiAgbm9ybWRsZ25fdnNfbm9ybXJldCwgbm9ybXJldF92c19ub3JtZGxnbiwKICAjIyBrb192c19rbywgb2Ygd2hpY2ggd2UgaGF2ZSAzCiAga29yZXRfdnNfa29kbGduLCBrb2RsZ25fdnNfa29yZXQsCiAga29yZXRfdnNfa29zY24sIGtvc2NuX3ZzX2tvcmV0LAogIGtvZGxnbl92c19rb3Njbiwga29zY25fdnNfa29kbGduLAogICMjIGtvX3ZzX2hldCwgMyBpbmNsdWRpbmcgb25lIGdldHRpbmcgYXJvdW5kIG1pc3NpbmcgaGV0c2NuCiAga29yZXRfdnNfbm9ybXJldCwga29kbGduX3ZzX25vcm1kbGduLAogICMjIHJhdGlvIG9mIHJhdGlvcwogIG5vcm1rb19yZXRkbGduKQpgYGAKCiMjIEN1dG9mZnMKCkkgYW0gbm90IHN1cmUgaWYgd2Ugd2lsbCB1c2UgdGhlc2UgaW5kZXhlcywgYnV0IEkgYW0gd3JpdGluZyB0aGVzZSBvdXQgYXMKc3Vic2V0cyBvZiBnZW5lcyB0byBsb29rIGF0LiAgVGhlc2UgaW5kZXhlcyBhcmUgc3RhdGluZyB0aGF0LCBnaXZlbiBhIGN1dG9mZgooMCksIHdlIHdhbnQgdG8gbG9vayBhdCBvbmx5IHRoZSBnZW5lcyB3aGljaCBoYXZlIGhpZ2hlciB4IC8gYmFzZWxpbmUgdmFsdWVzCnRoYW4gdGhlIGN1dG9mZi4KCgpgYGB7ciBjdXRvZmZzfQojIyBRdWVyaWVzIGFib3V0IGdlbmUgc3Vic2V0cy4KIyMgVGhlc2UgYXJlIGFsbCBpbiB0aGUgY29udGV4dCBvZiB0cmFuc2xhdG9tZXMuCmN1dG9mZiA8LSAwCnJldF9rZXB0X2lkeCA8LSBub3JtcmV0ID4gY3V0b2ZmICYga29yZXQgPiBjdXRvZmYKc2NuX2tlcHRfaWR4IDwtIGtvc2NuID4gY3V0b2ZmCmRsZ25fa2VwdF9pZHggPC0gbm9ybWRsZ24gPiBjdXRvZmYgJiBrb2RsZ24gPiBjdXRvZmYKcmV0X2RsZ25fa2VwdF9pZHggPC0gcmV0X2tlcHRfaWR4ICYgZGxnbl9rZXB0X2lkeApyZXRfc2NuX2tlcHRfaWR4IDwtIHJldF9rZXB0X2lkeCAmIHNjbl9rZXB0X2lkeApkbGduX3Njbl9rZXB0X2lkeCA8LSBkbGduX2tlcHRfaWR4ICYgc2NuX2tlcHRfaWR4CgojI25vcm1kbGduX3ZzX25vcm1yZXRbIXJldF9kbGduX2tlcHRfaWR4XSA8LSBOQQojI25vcm1yZXRfdnNfbm9ybWRsZ25bIXJldF9kbGduX2tlcHRfaWR4XSA8LSBOQQojI2tvcmV0X3ZzX2tvZGxnblshcmV0X2RsZ25fa2VwdF9pZHhdIDwtIE5BCiMja29kbGduX3ZzX2tvcmV0WyFyZXRfZGxnbl9rZXB0X2lkeF0gPC0gTkEKIyNrb3JldF92c19rb3NjblshcmV0X3Njbl9rZXB0X2lkeF0gPC0gTkEKIyNrb3Njbl92c19rb3JldFshcmV0X3Njbl9rZXB0X2lkeF0gPC0gTkEKIyNrb2RsZ25fdnNfa29zY25bIWRsZ25fc2NuX2tlcHRfaWR4XSA8LSBOQQojI2tvc2NuX3ZzX2tvZGxnblshZGxnbl9zY25fa2VwdF9pZHhdIDwtIE5BCiMja29yZXRfdnNfbm9ybXJldFshcmV0X2tlcHRfaWR4XSA8LSBOQQojI2tvZGxnbl92c19ub3JtZGxnblshZGxnbl9rZXB0X2lkeF0gPC0gTkEKIyNub3Jta29fcmV0ZGxnbiA8LSBub3Jta29fcmV0ZGxnblshcmV0X2RsZ25fa2VwdF9pZHhdIDwtIE5BCmBgYAoKIyMgQWRkIHRoZSBtYXRyaXggdG8gdGhlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uCgpJIHdpbGwgdXNlIG15IGZ1bmN0aW9uIGNvbWJpbmVfZGVfdGFibGVzKCkgdG8gYWRkIHRoaXMgaW5mb3JtYXRpb24gdG8gbXkKZXhpc3RpbmcgYW5ub3RhdGlvbiBkYXRhIGFsb25nIHdpdGggdGhlIHJlc3VsdHMgZnJvbSB0aGUgc3RhdGlzdGljYWxseSB2YWxpZApjb21wYXJpc29uIG9mIHRoZSB0aHJlZSB0aXNzdWUgdHlwZXMuCgpgYGB7ciBhZGRfbWF0cml4X2RlLCBmaWcuc2hvdz0iaGlkZSJ9Cm1tX3RhYmxlcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBtbV9kZV9zYSwgZXh0cmFfYW5ub3Q9cGFpcl9tdHJ4LAogIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfW1tX3NhbG1vbl90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkpCmBgYAoKIyBQbG90cyBvZiBpbnRlcmVzdGluZyBjb21wYXJpc29ucwoKIyMgUmV0aW5hLCBoZXQgdnMuIHd0LgoKYGBge3IgcmV0X2hldHd0X3Bsb3R9CiMjIFB1dCByZXRpbmEgYmFzZWxpbmUgb24geSBheGlzIGFzIGJsYWNrLCByZXRpbmEgaGV0IG9uIHggYXhpcyBhcyBibGFjay4KIyMgVGhlbiByZWNvbG9yIGEgc3Vic2V0IG9mIHRoZXNlIGFzIHJlZCwgdGhlIHJlZHMgYXJlIHdoZW4gbm9ybXJldCA+IDAKbGlicmFyeShnZ3Bsb3QyKQoKcGxvdHRlZCA8LSBhcy5kYXRhLmZyYW1lKHBhaXJfbXRyeFssIGMoInJldGhldCIsICJyZXR3dCIpXSkKcmVkX2lkeCA8LSBub3JtcmV0ID4gMApwbG90dGVkWywgImNvbG9yIl0gPC0gaWZlbHNlKHJlZF9pZHgsICJyZWQiLCAiYmxhY2siKQpwbG90dGVkW1sibGFiZWwiXV0gPC0gcm93bmFtZXMocGxvdHRlZCkKcmV0X2hldHd0IDwtIGdncGxvdCgKICBwbG90dGVkLAogIGFlc19zdHJpbmcoeD0icmV0aGV0IiwgeT0icmV0d3QiLCBsYWJlbD0ibGFiZWwiLCBjb2xvcj0iY29sb3IiKSkgKwogIGdlb21fcG9pbnQoYWxwaGE9MC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibGFjayIsICJyZWQiKSkKcmV0X2hldHd0CnJldF9oZXR3dF9jbGlja3kgPC0gZ2dwbG90bHlfdXJsKAogIHJldF9oZXR3dCwgInJldF9oZXR3dC5odG1sIiwgdGl0bGU9IlJldGluYSBleHByZXNzaW9uLCBoZXQgdnMuIHd0LiIsCiAgdXJsX2RhdGE9Imh0dHA6Ly91c2Vhc3QuZW5zZW1ibC5vcmcvTXVzX211c2N1bHVzL0dlbmUvU3VtbWFyeT9nPXtpZHN9IikKYGBgCgojIyBSZXRpbmEsIG11dCB2cyB3dC4KCmBgYHtyIHJldF9oZXRtdXRfcGxvdH0KcGxvdHRlZCA8LSBhcy5kYXRhLmZyYW1lKHBhaXJfbXRyeFssIGMoInJldG11dCIsICJyZXR3dCIpXSkKcGxvdHRlZFtbImxhYmVsIl1dIDwtIHJvd25hbWVzKHBsb3R0ZWQpCnBsb3R0ZWRbWyJjb2xvciJdXSA8LSAiYmxhY2siCnJldF9tdXR3dCA8LSBnZ3Bsb3QoCiAgcGxvdHRlZCwKICBhZXNfc3RyaW5nKHg9InJldG11dCIsIHk9InJldHd0IiwgbGFiZWw9ImxhYmVsIiwgY29sb3I9ImNvbG9yIikpICsKICBnZW9tX3BvaW50KGFscGhhPTAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmxhY2siLCAicmVkIikpCnJldF9tdXR3dApyZXRfbXV0d3RfY2xpY2t5IDwtIGdncGxvdGx5X3VybCgKICByZXRfbXV0d3QsICJyZXRfbXV0d3QuaHRtbCIsIHRpdGxlPSJSZXRpbmEgZXhwcmVzc2lvbiwgbXV0YW50IHZzLiB3dC4iLAogIHVybF9kYXRhPSJodHRwOi8vdXNlYXN0LmVuc2VtYmwub3JnL011c19tdXNjdWx1cy9HZW5lL1N1bW1hcnk/Zz17aWRzfSIpCmBgYAoKIyMgZGxnbiwgaGV0IHZzLiB3dC4KCmBgYHtyIGRsZ25faGV0X3d0X3Bsb3R9CnBsb3R0ZWQgPC0gYXMuZGF0YS5mcmFtZShwYWlyX210cnhbLCBjKCJkbGduaGV0IiwgImRsZ253dCIpXSkKcGxvdHRlZFtbImxhYmVsIl1dIDwtIHJvd25hbWVzKHBsb3R0ZWQpCnBsb3R0ZWRbWyJjb2xvciJdXSA8LSAiYmxhY2siCmRsZ25faGV0d3QgPC0gZ2dwbG90KAogIHBsb3R0ZWQsCiAgYWVzX3N0cmluZyh4PSJkbGduaGV0IiwgeT0iZGxnbnd0IiwgbGFiZWw9ImxhYmVsIiwgY29sb3I9ImNvbG9yIikpICsKICBnZW9tX3BvaW50KGFscGhhPTAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmxhY2siLCAicmVkIikpCmRsZ25faGV0d3QKZGxnbl9oZXR3dF9jbGlja3kgPC0gZ2dwbG90bHlfdXJsKAogIGRsZ25faGV0d3QsICJkbGduX2hldHd0Lmh0bWwiLCB0aXRsZT0iZGxnbiBleHByZXNzaW9uLCBoZXQgdnMuIHd0LiIsCiAgdXJsX2RhdGE9Imh0dHA6Ly91c2Vhc3QuZW5zZW1ibC5vcmcvTXVzX211c2N1bHVzL0dlbmUvU3VtbWFyeT9nPXtpZHN9IikKYGBgCgojIyBkbGduLCBtdXQgdnMuIHd0LgoKYGBge3IgZGxnbl9tdXRfd3RfcGxvdH0KcGxvdHRlZCA8LSBhcy5kYXRhLmZyYW1lKHBhaXJfbXRyeFssIGMoImRsZ25tdXQiLCAiZGxnbnd0IildKQpwbG90dGVkW1sibGFiZWwiXV0gPC0gcm93bmFtZXMocGxvdHRlZCkKcGxvdHRlZFtbImNvbG9yIl1dIDwtICJibGFjayIKZGxnbl9tdXR3dCA8LSBnZ3Bsb3QoCiAgcGxvdHRlZCwKICBhZXNfc3RyaW5nKHg9ImRsZ25tdXQiLCB5PSJkbGdud3QiLCBsYWJlbD0ibGFiZWwiLCBjb2xvcj0iY29sb3IiKSkgKwogIGdlb21fcG9pbnQoYWxwaGE9MC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibGFjayIsICJyZWQiKSkKZGxnbl9tdXR3dApkbGduX211dHd0X2NsaWNreSA8LSBnZ3Bsb3RseV91cmwoCiAgZGxnbl9tdXR3dCwgImRsZ25fbXV0d3QuaHRtbCIsIHRpdGxlPSJkbGduIGV4cHJlc3Npb24sIG11dCB2cy4gd3QuIiwKICB1cmxfZGF0YT0iaHR0cDovL3VzZWFzdC5lbnNlbWJsLm9yZy9NdXNfbXVzY3VsdXMvR2VuZS9TdW1tYXJ5P2c9e2lkc30iKQpgYGAKCiMjIHNjbiwgbXV0IHZzLiB3dC4KCmBgYHtyIHNjbl9tdXRfd3RfcGxvdH0KcGxvdHRlZCA8LSBhcy5kYXRhLmZyYW1lKHBhaXJfbXRyeFssIGMoInNjbm11dCIsICJzY253dCIpXSkKcGxvdHRlZFtbImxhYmVsIl1dIDwtIHJvd25hbWVzKHBsb3R0ZWQpCnBsb3R0ZWRbWyJjb2xvciJdXSA8LSAiYmxhY2siCnNjbl9tdXR3dCA8LSBnZ3Bsb3QoCiAgcGxvdHRlZCwKICBhZXNfc3RyaW5nKHg9InNjbm11dCIsIHk9InNjbnd0IiwgbGFiZWw9ImxhYmVsIiwgY29sb3I9ImNvbG9yIikpICsKICBnZW9tX3BvaW50KGFscGhhPTAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmxhY2siLCAicmVkIikpCnNjbl9tdXR3dApzY25fbXV0d3RfY2xpY2t5IDwtIGdncGxvdGx5X3VybCgKICBzY25fbXV0d3QsICJzY25fbXV0d3QuaHRtbCIsIHRpdGxlPSJzY24gZXhwcmVzc2lvbiwgbXV0IHZzLiB3dC4iLAogIHVybF9kYXRhPSJodHRwOi8vdXNlYXN0LmVuc2VtYmwub3JnL011c19tdXNjdWx1cy9HZW5lL1N1bW1hcnk/Zz17aWRzfSIpCmBgYAoKIyMgQXhvbiB0cmFuc2xhdG9tZSBzcGVjaWZpYwoKYGBge3IgYXhvbl90cmFuc2xhdG9tZV9wbG90fQojIyAgeC1heGlzOiBub3JtZGxnbl92c19ub3JtcmV0IG9yIG5vcm1yZXRfdnNfbm9ybWRsZ24sCiMjICAgICAgICAgICAgICBeXl5eCiMjICB5LWF4aXM6IGRsZ253dC1yZXR3dCAoYmFzZWxpbmUgZGxnbiAtIGJhc2VsaW5lIHJldGluYSkKcGxvdHRlZCA8LSBhcy5kYXRhLmZyYW1lKHBhaXJfbXRyeFssIGMoIm5vcm1kbGduX3ZzX25vcm1yZXQiLCAid3RfZGxnbnJldCIpXSkKcmVkX2lkeCA8LSBub3JtcmV0ID4gMAojIyBOb3RlIHRoYXQgdGhpcyBvcmRlciBpcyBvcHBvc2l0ZSBvZiBhYm92ZS4KcGxvdHRlZFssICJjb2xvciJdIDwtIGlmZWxzZShyZWRfaWR4LCAiYmxhY2siLCAicmVkIikKcGxvdHRlZFtbImxhYmVsIl1dIDwtIHJvd25hbWVzKHBsb3R0ZWQpCmF4b25fdHJhbnNfcmV0X3RhcmdldCA8LSBnZ3Bsb3QoCiAgcGxvdHRlZCwKICBhZXNfc3RyaW5nKHg9Im5vcm1kbGduX3ZzX25vcm1yZXQiLCB5PSJ3dF9kbGducmV0IiwgbGFiZWw9ImxhYmVsIiwgY29sb3I9ImNvbG9yIikpICsKICBnZW9tX3BvaW50KGFscGhhPTAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmxhY2siLCAicmVkIikpCmF4b25fdHJhbnNfcmV0X3RhcmdldApheG9uX3RyYW5zX3JldF90YXJnZXRfY2xpY2t5IDwtIGdncGxvdGx5X3VybCgKICBheG9uX3RyYW5zX3JldF90YXJnZXQsICJheG9uX3RyYW5zX3JldF90YXJnZXQuaHRtbCIsIHRpdGxlPSJBeG9uIHRyYW5zbGF0b21lLCByZXRpbmEgdGFyZ2V0LiIsCiAgdXJsX2RhdGE9Imh0dHA6Ly91c2Vhc3QuZW5zZW1ibC5vcmcvTXVzX211c2N1bHVzL0dlbmUvU3VtbWFyeT9nPXtpZHN9IikKYGBgCgojIyBETEdOIHRyYW5zbGF0b21lIHdydC4gUmV0aW5hIHRyYW5zbGF0b21lCgpgYGB7ciBkbGduX3RyYW5zbGF0b21lX3Bsb3R9CnBsb3R0ZWQgPC0gYXMuZGF0YS5mcmFtZShwYWlyX210cnhbLCBjKCJub3JtcmV0IiwgIm5vcm1kbGduIildKQpwbG90dGVkW1sibGFiZWwiXV0gPC0gcm93bmFtZXMocGxvdHRlZCkKcGxvdHRlZFtbImNvbG9yIl1dIDwtICJibGFjayIKbm9ybXJldF9ub3JtZGxnbiA8LSBnZ3Bsb3QoCiAgcGxvdHRlZCwKICBhZXNfc3RyaW5nKHg9Im5vcm1yZXQiLCB5PSJub3JtZGxnbiIsIGxhYmVsPSJsYWJlbCIsIGNvbG9yPSJjb2xvciIpKSArCiAgZ2VvbV9wb2ludChhbHBoYT0wLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImJsYWNrIiwgInJlZCIpKQpub3JtcmV0X25vcm1kbGduCm5vcm1yZXRfbm9ybWRsZ25fY2xpY2t5IDwtIGdncGxvdGx5X3VybCgKICBub3JtcmV0X25vcm1kbGduLCAibm9ybXJldF9ub3JtZGxnbi5odG1sIiwgdGl0bGU9Ik5vcm1hbCByZXRpbmEgdHJhbnNsYXRvbWUgdnMgbm9ybWFsIGRsZ24gdHJhbnNsYXRvbWUuIiwKICB1cmxfZGF0YT0iaHR0cDovL3VzZWFzdC5lbnNlbWJsLm9yZy9NdXNfbXVzY3VsdXMvR2VuZS9TdW1tYXJ5P2c9e2lkc30iKQpgYGAKCiMjIGtvcmV0IGtvZGxnbgoKYGBge3Iga29yZXRfa29kbGduX3NvbWV0aGluZ3NvbWV0aGluZ3Bsb3R9CnBsb3R0ZWQgPC0gYXMuZGF0YS5mcmFtZShwYWlyX210cnhbLCBjKCJrb3JldCIsICJrb2RsZ24iKV0pCnBsb3R0ZWRbWyJsYWJlbCJdXSA8LSByb3duYW1lcyhwbG90dGVkKQpwbG90dGVkW1siY29sb3IiXV0gPC0gImJsYWNrIgprb3JldF9rb2RsZ24gPC0gZ2dwbG90KAogIHBsb3R0ZWQsCiAgYWVzX3N0cmluZyh4PSJrb3JldCIsIHk9ImtvZGxnbiIsIGxhYmVsPSJsYWJlbCIsIGNvbG9yPSJjb2xvciIpKSArCiAgZ2VvbV9wb2ludChhbHBoYT0wLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImJsYWNrIiwgInJlZCIpKQprb3JldF9rb2RsZ24Ka29yZXRfa29kbGduX2NsaWNreSA8LSBnZ3Bsb3RseV91cmwoCiAga29yZXRfa29kbGduLCAia29yZXRfa29kbGduLmh0bWwiLCB0aXRsZT0iS08gcmV0aW5hIHRyYW5zbGF0b21lIHZzIEtPIGRsZ24gdHJhbnNsYXRvbWUuIiwKICB1cmxfZGF0YT0iaHR0cDovL3VzZWFzdC5lbnNlbWJsLm9yZy9NdXNfbXVzY3VsdXMvR2VuZS9TdW1tYXJ5P2c9e2lkc30iKQpgYAoKIyMgS08gUmV0aW5hIHZzIEtPIFNDTgoKYGBge3Iga29yZXRfa29zY25fcGxvdF9yYXdyfQpwbG90dGVkIDwtIGFzLmRhdGEuZnJhbWUocGFpcl9tdHJ4WywgYygia29yZXQiLCAia29zY24iKV0pCnBsb3R0ZWRbWyJsYWJlbCJdXSA8LSByb3duYW1lcyhwbG90dGVkKQpwbG90dGVkW1siY29sb3IiXV0gPC0gImJsYWNrIgprb3JldF9rb3NjbiA8LSBnZ3Bsb3QoCiAgcGxvdHRlZCwKICBhZXNfc3RyaW5nKHg9ImtvcmV0IiwgeT0ia29zY24iLCBsYWJlbD0ibGFiZWwiLCBjb2xvcj0iY29sb3IiKSkgKwogIGdlb21fcG9pbnQoYWxwaGE9MC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibGFjayIsICJyZWQiKSkKa29yZXRfa29zY24Ka29yZXRfa29zY25fY2xpY2t5IDwtIGdncGxvdGx5X3VybCgKICBrb3JldF9rb3NjbiwgImtvcmV0X2tvc2NuLmh0bWwiLCB0aXRsZT0iS08gcmV0aW5hIHRyYW5zbGF0b21lIHZzIEtPIHNjbiB0cmFuc2xhdG9tZS4iLAogIHVybF9kYXRhPSJodHRwOi8vdXNlYXN0LmVuc2VtYmwub3JnL011c19tdXNjdWx1cy9HZW5lL1N1bW1hcnk/Zz17aWRzfSIpCmBgYAoKIyMgTm9ybSBkbGduIGtvIGRsZ24KCmBgYHtyIG5vcm1kbGduX2tvZGxnbl9wbG90fQpwbG90dGVkIDwtIGFzLmRhdGEuZnJhbWUocGFpcl9tdHJ4WywgYygibm9ybWRsZ24iLCAia29kbGduIildKQpwbG90dGVkW1sibGFiZWwiXV0gPC0gcm93bmFtZXMocGxvdHRlZCkKcGxvdHRlZFtbImNvbG9yIl1dIDwtICJibGFjayIKbm9ybWRsZ25fa29kbGduIDwtIGdncGxvdCgKICBwbG90dGVkLAogIGFlc19zdHJpbmcoeD0ibm9ybWRsZ24iLCB5PSJrb2RsZ24iLCBsYWJlbD0ibGFiZWwiLCBjb2xvcj0iY29sb3IiKSkgKwogIGdlb21fcG9pbnQoYWxwaGE9MC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibGFjayIsICJyZWQiKSkKbm9ybWRsZ25fa29kbGduCm5vcm1kbGduX2tvZGxnbl9jbGlja3kgPC0gZ2dwbG90bHlfdXJsKAogIG5vcm1kbGduX2tvZGxnbiwgIm5vcm1kbGduX2tvZGxnbi5odG1sIiwgdGl0bGU9Ik5vcm1hbCBkbGduIHRyYW5zbGF0b21lIHZzIEtPIGRsZ24gdHJhbnNsYXRvbWUuIiwKICB1cmxfZGF0YT0iaHR0cDovL3VzZWFzdC5lbnNlbWJsLm9yZy9NdXNfbXVzY3VsdXMvR2VuZS9TdW1tYXJ5P2c9e2lkc30iKQpgYGAKCiMjIE5vcm0gcmV0IHZzIGtvIHJldAoKYGBge3Igbm9ybV9yZXRfa29fcmV0X3Bsb3R9CnBsb3R0ZWQgPC0gYXMuZGF0YS5mcmFtZShwYWlyX210cnhbLCBjKCJub3JtcmV0IiwgImtvcmV0IildKQpwbG90dGVkW1sibGFiZWwiXV0gPC0gcm93bmFtZXMocGxvdHRlZCkKcGxvdHRlZFtbImNvbG9yIl1dIDwtICJibGFjayIKbm9ybXJldF9rb3JldCA8LSBnZ3Bsb3QoCiAgcGxvdHRlZCwKICBhZXNfc3RyaW5nKHg9Im5vcm1yZXQiLCB5PSJrb3JldCIsIGxhYmVsPSJsYWJlbCIsIGNvbG9yPSJjb2xvciIpKSArCiAgZ2VvbV9wb2ludChhbHBoYT0wLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImJsYWNrIiwgInJlZCIpKQpub3JtcmV0X2tvcmV0Cm5vcm1yZXRfa29yZXRfY2xpY2t5IDwtIGdncGxvdGx5X3VybCgKICBub3JtcmV0X2tvcmV0LCAibm9ybXJldF9rb3JldC5odG1sIiwgdGl0bGU9Ik5vcm1hbCByZXRpbmEgdHJhbnNsYXRvbWUgdnMgS08gcmV0aW5hIHRyYW5zbGF0b21lLiIsCiAgdXJsX2RhdGE9Imh0dHA6Ly91c2Vhc3QuZW5zZW1ibC5vcmcvTXVzX211c2N1bHVzL0dlbmUvU3VtbWFyeT9nPXtpZHN9IikKYGBgCgojIyByb3IKCmBgYHtyIHJvcl9wbG90fQpwbG90dGVkIDwtIGFzLmRhdGEuZnJhbWUocGFpcl9tdHJ4WywgYygibm9ybXJldF92c19ub3JtZGxnbiIsICJrb3JldF92c19rb2RsZ24iKV0pCnBsb3R0ZWRbWyJsYWJlbCJdXSA8LSByb3duYW1lcyhwbG90dGVkKQpwbG90dGVkW1siY29sb3IiXV0gPC0gImJsYWNrIgpub3JtYWxfa29fYXhvbl90cmFuc2xhdG9tZSA8LSBnZ3Bsb3QoCiAgcGxvdHRlZCwKICBhZXNfc3RyaW5nKHg9Im5vcm1yZXRfdnNfbm9ybWRsZ24iLCB5PSJrb3JldF92c19rb2RsZ24iLCBsYWJlbD0ibGFiZWwiLCBjb2xvcj0iY29sb3IiKSkgKwogIGdlb21fcG9pbnQoYWxwaGE9MC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibGFjayIsICJyZWQiKSkKbm9ybWFsX2tvX2F4b25fdHJhbnNsYXRvbWUKbm9ybWFsX2tvX2F4b25fdHJhbnNsYXRvbWVfY2xpY2t5IDwtIGdncGxvdGx5X3VybCgKICBub3JtYWxfa29fYXhvbl90cmFuc2xhdG9tZSwgIm5vcm1hbF9rb19heG9uX3RyYW5zbGF0b21lLmh0bWwiLAogIHRpdGxlPSJOb3JtYWwgcmV0aW5hIGtvIGF4b24gdHJhbnNsYXRvbWUuIiwKICB1cmxfZGF0YT0iaHR0cDovL3VzZWFzdC5lbnNlbWJsLm9yZy9NdXNfbXVzY3VsdXMvR2VuZS9TdW1tYXJ5P2c9e2lkc30iKQpgYGAKCiMgVHJhbnNsYXRvbWUgbGV2ZWwgY29tcGFyaXNvbnMKCiMjIE1ha2UgYSBnZW5lcmljIHBsb3R0ZXIgZm9yIHRoaXMgc3R1ZmYuCgpgYGB7ciBnZW5lcmljX3Bsb3R0ZXJ9CnRyYW5zbGF0b21lX3Bsb3R0ZXIgPC0gZnVuY3Rpb24ocGFpcl9tdHJ4LCB4X2F4aXM9ImtvcmV0IiwgeV9heGlzPSJrb3NjbiIsIGxmYz1OVUxMLCBmYz1OVUxMLCBsaW5ld2lkdGg9MS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwX2NvbG9yPSJyZWQiLCBkb3duX2NvbG9yPSIjMDk4NTM0IiwgbGluZV9jb2xvcj0iI2ZjYmEwMyIsIGFscGhhPTAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2xpbWl0PWMoLTcsIDcpLCB5X2xpbWl0PWMoLTcsIDcpKSB7CiAgaWYgKGlzLm51bGwoZmMpICYgaXMubnVsbChsZmMpKSB7CiAgICBtZXNzYWdlKCJObyBmYy9sZmMgd2FzIHByb3ZpZGVkLCBkZWZhdWx0aW5nIHRvIDEwIGZvbGQuIikKICAgIGxmYyA8LSBsb2cyKDEwKQogIH0gZWxzZSBpZiAoaXMubnVsbChsZmMpKSB7CiAgICBsZmMgPC0gbG9nMihmYykKICB9CiAgcGxvdHRlZCA8LSBhcy5kYXRhLmZyYW1lKHBhaXJfbXRyeFssIGMoeF9heGlzLCB5X2F4aXMpXSkKICBuYV9pZHggPC0gaXMubmEocGxvdHRlZCkKICBwbG90dGVkW25hX2lkeF0gPC0gMAogIHVwX2lkeCA8LSBwbG90dGVkWywgeV9heGlzXSAtIHBsb3R0ZWRbLCB4X2F4aXNdID49IGxmYwogIGRvd25faWR4IDwtIHBsb3R0ZWRbLCB5X2F4aXNdIC0gcGxvdHRlZFssIHhfYXhpc10gPD0gKGxmYyAqIC0xKQogIHVwX2dlbmVzIDwtIHJvd25hbWVzKHBsb3R0ZWQpW3VwX2lkeF0KICBkb3duX2dlbmVzIDwtIHJvd25hbWVzKHBsb3R0ZWQpW2Rvd25faWR4XQogICMjIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGlzIG9wcG9zaXRlIG9mIGFib3ZlLgogIHBsb3R0ZWRbWyJjb2xvciJdXSA8LSAiYmxhY2siCiAgcGxvdHRlZFt1cF9pZHgsICJjb2xvciJdIDwtIHVwX2NvbG9yCiAgcGxvdHRlZFtkb3duX2lkeCwgImNvbG9yIl0gPC0gZG93bl9jb2xvcgogIHBsb3R0ZWRbWyJjb2xvciJdXSA8LSBhcy5mYWN0b3IocGxvdHRlZFtbImNvbG9yIl1dKQogIGxldmVscyhwbG90dGVkW1siY29sb3IiXV0pIDwtIGMoImJsYWNrIiwgdXBfY29sb3IsIGRvd25fY29sb3IpCiAgcGx0IDwtIGdncGxvdDI6OmdncGxvdChwbG90dGVkLCBhZXNfc3RyaW5nKHg9eF9heGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PXlfYXhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9ImNvbG9yIikpICsKICAgIGdlb21fYWJsaW5lKHNpemU9MS4xLCBzbG9wZT0xLCBpbnRlcmNlcHQ9bGZjLCBjb2xvcj0ib3JhbmdlIikgKwogICAgZ2VvbV9hYmxpbmUoc2l6ZT0xLjEsIHNsb3BlPTEsIGludGVyY2VwdD0oLTEgKiBsZmMpLCBjb2xvcj0ib3JhbmdlIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKHhfbGltaXQpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoeV9saW1pdCkpICsKICAgIGdlb21fcG9pbnQoYWxwaGE9YWxwaGEpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Yyhkb3duX2NvbG9yLCAiYmxhY2siLCB1cF9jb2xvcikpCiAgcmV0bGlzdCA8LSBsaXN0KAogICAgIm10cngiID0gcGxvdHRlZCwKICAgICJ1cHMiID0gdXBfZ2VuZXMsCiAgICAiZG93bnMiID0gZG93bl9nZW5lcywKICAgICJwbG90IiA9IHBsdCkKICByZXR1cm4ocmV0bGlzdCkKfQpgYGAKCjEuIFgtYXhpczogQWx3YXlzIHJldGluYS4KMi4gWS1heGlzOiBBbHdheXMgYSB0YXJnZXQgdGlzc3VlLgoKRmlyc3QgcGxvdDogS08gc2NuIHRyYW5zbGF0b21lIG9uIHkgYXhpcyB2cy4gS08gcmV0aW5hIHRyYW5zbGF0b21lIG9uIHggYXhpcy4KCiMjIFNjbiBrbm9ja291dCB0cmFuc2xhdG9tZSB2cyByZXRpbmEga25vY2tvdXQgdHJhbnNsYXRvbWUuCgpgYGB7ciBzY25fa29fd3J0X3JldGluYV9rb190cmFuc2xhdG9tZV9ncHJvZmlsZXJ9CnNjbmtvX3dydF9yZXRrb190cmFuc2xhdG9tZSA8LSB0cmFuc2xhdG9tZV9wbG90dGVyKHBhaXJfbXRyeCkKc2Nua29fd3J0X3JldGtvX3RyYW5zbGF0b21lJHBsb3QKc2Nua29fd3J0X3JldGtvX3VwX2dvIDwtIHNpbXBsZV9ncHJvZmlsZXIoc2lnX2dlbmVzPXNjbmtvX3dydF9yZXRrb190cmFuc2xhdG9tZSR1cHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXM9Im1tdXNjdWx1cyIpCnNjbmtvX3dydF9yZXRrb19kb3duX2dvIDwtIHNpbXBsZV9ncHJvZmlsZXIoc2lnX2dlbmVzPXNjbmtvX3dydF9yZXRrb190cmFuc2xhdG9tZSRkb3ducywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzPSJtbXVzY3VsdXMiKQpzY25rb193cnRfcmV0a29fZG93bl9nbyRnbwpzY25rb193cnRfcmV0a29fZG93bl9nbyRrZWdnCnNjbmtvX3dydF9yZXRrb19kb3duX2dvJGNvcnVtCmBgYAoKIyMgZGxnbiBub3JtYWwgdHJhbnNsYXRvbWUgdnMgcmV0aW5hIG5vcm1hbCB0cmFuc2xhdG9tZS4KCmBgYHtyIGRsZ25fbm9ybV90cmFuc2xhdG9tZV92c19yZXRfbm9ybWFsX3RyYW5zbGF0b21lX2dwcm9maWxlcn0KZGxnbm5vcm1fd3J0X3JldG5vcm1fdHJhbnNsYXRvbWUgPC0gdHJhbnNsYXRvbWVfcGxvdHRlcihwYWlyX210cngsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9heGlzPSJub3JtcmV0IiwgeV9heGlzPSJub3JtZGxnbiIpCmRsZ25ub3JtX3dydF9yZXRub3JtX3RyYW5zbGF0b21lJHBsb3QKZGxnbm5vcm1fd3J0X3JldG5vcm1fdXBfZ28gPC0gc2ltcGxlX2dwcm9maWxlcihzaWdfZ2VuZXM9ZGxnbm5vcm1fd3J0X3JldG5vcm1fdHJhbnNsYXRvbWUkdXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXM9Im1tdXNjdWx1cyIpCmRsZ25ub3JtX3dydF9yZXRub3JtX2Rvd25fZ28gPC0gc2ltcGxlX2dwcm9maWxlcihzaWdfZ2VuZXM9ZGxnbm5vcm1fd3J0X3JldG5vcm1fdHJhbnNsYXRvbWUkZG93bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzPSJtbXVzY3VsdXMiKQpkbGdubm9ybV93cnRfcmV0bm9ybV9kb3duX2dvJGdvCmRsZ25ub3JtX3dydF9yZXRub3JtX2Rvd25fZ28kcHZhbHVlX3Bsb3RzJGJwcF9wbG90X292ZXIKZGxnbm5vcm1fd3J0X3JldG5vcm1fZG93bl9nbyRwdmFsdWVfcGxvdHMkY2NwX3Bsb3Rfb3ZlcgpgYGAKCiMjIGRsZ24ga25vY2tvdXQgdHJhbnNsYXRvbWUgdnMgcmV0aW5hIGtub2Nrb3V0IHRyYW5zbGF0b21lLgoKYGBge3IgZGxnbl9rb190cmFuc2xhdG9tZV92c19yZXRpbmFfa29fdHJhbnNsYXRvbWVfZ3Byb2ZpbGVyfQpkbGdua29fd3J0X3JldGtvX3RyYW5zbGF0b21lIDwtIHRyYW5zbGF0b21lX3Bsb3R0ZXIocGFpcl9tdHJ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9heGlzPSJrb3JldCIsIHlfYXhpcz0ia29kbGduIikKZGxnbmtvX3dydF9yZXRrb190cmFuc2xhdG9tZSRwbG90CmRsZ25rb193cnRfcmV0a29fdXBfZ28gPC0gc2ltcGxlX2dwcm9maWxlcihzaWdfZ2VuZXM9ZGxnbmtvX3dydF9yZXRrb190cmFuc2xhdG9tZSR1cHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzPSJtbXVzY3VsdXMiKQpkbGdua29fd3J0X3JldGtvX3VwX2dvJGdvCmRsZ25rb193cnRfcmV0a29fdXBfZ28ka2VnZwpkbGdua29fd3J0X3JldGtvX3VwX2dvJHJlYWMKZGxnbmtvX3dydF9yZXRrb19kb3duX2dvIDwtIHNpbXBsZV9ncHJvZmlsZXIoc2lnX2dlbmVzPWRsZ25rb193cnRfcmV0a29fdHJhbnNsYXRvbWUkZG93bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXM9Im1tdXNjdWx1cyIpCmRsZ25rb193cnRfcmV0a29fZG93bl9nbyRnbwpkbGdua29fd3J0X3JldGtvX2Rvd25fZ28ka2VnZwpkbGdua29fd3J0X3JldGtvX2Rvd25fZ28kcmVhYwpgYGAKCiMjIE5vcm1hbCBkbGduIHRyYW5zbGF0b21lIHZzIGtub2Nrb3V0IGRsZ24gdHJhbnNsYXRvbWUuCgpgYGB7ciBub3JtX2RsZ25fdHJhbnNsYXRvbWVfdnNfa29fZGxnbl90cmFuc2xhdG9tZV9nZnByb2ZpbGVyfQpkbGdubm9ybV93cnRfZGxnbmtvX3RyYW5zbGF0b21lIDwtIHRyYW5zbGF0b21lX3Bsb3R0ZXIocGFpcl9tdHJ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9heGlzPSJub3JtZGxnbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X2F4aXM9ImtvZGxnbiIpCmRsZ25ub3JtX3dydF9kbGdua29fdHJhbnNsYXRvbWUkcGxvdApkbGdubm9ybV93cnRfZGxnbmtvX3VwX2dvIDwtIHNpbXBsZV9ncHJvZmlsZXIoc2lnX2dlbmVzPWRsZ25ub3JtX3dydF9kbGdua29fdHJhbnNsYXRvbWUkdXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcz0ibW11c2N1bHVzIikKZGxnbm5vcm1fd3J0X2RsZ25rb19kb3duX2dvIDwtIHNpbXBsZV9ncHJvZmlsZXIoc2lnX2dlbmVzPWRsZ25ub3JtX3dydF9kbGdua29fdHJhbnNsYXRvbWUkZG93bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXM9Im1tdXNjdWx1cyIpCmRsZ25ub3JtX3dydF9kbGdua29fZG93bl9nbyRnbwpgYGAKCiMjIGRsZ24ga25vY2tvdXQgdHJhbnNsYXRvbWUgdnMuIHNjbiBrbm9ja291dCB0cmFuc2xhdG9tZS4KCmBgYHtyIGRsZ25fa29fdHJhbnNsYXRvbWVfdnNfc2NuX2tvX3RyYW5zbGF0b21lX2dwcm9maWxlcn0KZGxnbmtvX3dydF9zY25rb190cmFuc2xhdG9tZSA8LSB0cmFuc2xhdG9tZV9wbG90dGVyKHBhaXJfbXRyeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfYXhpcz0ia29kbGduIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfYXhpcz0ia29zY24iKQpkbGdua29fd3J0X3NjbmtvX3RyYW5zbGF0b21lJHBsb3QKZGxnbmtvX3dydF9zY25rb191cF9nbyA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHNpZ19nZW5lcz1kbGdua29fd3J0X3NjbmtvX3RyYW5zbGF0b21lJHVwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXM9Im1tdXNjdWx1cyIpCmRsZ25rb193cnRfc2Nua29fdXBfZ28kZ28KZGxnbmtvX3dydF9zY25rb191cF9nbyRwdmFsdWVfcGxvdHMkYnBwX3Bsb3Rfb3ZlcgpkbGdua29fd3J0X3NjbmtvX2Rvd25fZ28gPC0gc2ltcGxlX2dwcm9maWxlcihzaWdfZ2VuZXM9ZGxnbmtvX3dydF9zY25rb190cmFuc2xhdG9tZSRkb3ducywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcz0ibW11c2N1bHVzIikKZGxnbmtvX3dydF9zY25rb19kb3duX2dvJGdvCmBgYAoKIyBTb21lIHBpY3R1cmVzCgpBcyBJIHVuZGVyc3RhbmQgaXQsIHRoZXJlIGlzIHNvbWUgaW50ZXJlc3QgaW4gYW4gb250b2xvZ3kgc2VhcmNoIHVzaW5nIHRoZSByYXRpbyBvZiByYXRpb3MuCgpgYGB7ciBvdGhlcl9jb250cmFzdHN9CnJvciA8LSBub3Jta29fcmV0ZGxnbgp1cF9pZHggPC0gcm9yID49IDEKZG93bl9pZHggPC0gcm9yIDw9IC0xCnJvcl91cCA8LSByb3JbdXBfaWR4XQpsZW5ndGgocm9yX3VwKQpyb3JfZG93biA8LSByb3JbZG93bl9pZHhdCmxlbmd0aChyb3JfZG93bikKCnJvcl9ncHJvZmlsZXJfdXAgPC0gc2ltcGxlX2dwcm9maWxlcigKICBzaWdfZ2VuZXM9cm9yX3VwLCBzcGVjaWVzPSJtbXVzY3VsdXMiLAogIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfW1tX3Jvcl9ncGZvaWxlcl91cC12e3Zlcn0ueGxzeCIpKQpyb3JfZ3Byb2ZpbGVyX3VwJHB2YWx1ZV9wbG90cyRtZnBfcGxvdF9vdmVyCnJvcl9ncHJvZmlsZXJfdXAkcHZhbHVlX3Bsb3RzJGJwcF9wbG90X292ZXIKcm9yX2dwcm9maWxlcl91cCRwdmFsdWVfcGxvdHMkY2NwX3Bsb3Rfb3Zlcgpyb3JfZ3Byb2ZpbGVyX3VwJHB2YWx1ZV9wbG90cyR0Zl9wbG90X292ZXIKcm9yX2dwcm9maWxlcl91cCRwdmFsdWVfcGxvdHMkaHBfcGxvdF9vdmVyCgpyb3JfZ3Byb2ZpbGVyX2Rvd24gPC0gc2ltcGxlX2dwcm9maWxlcigKICBzaWdfZ2VuZXM9cm9yX2Rvd24sIHNwZWNpZXM9Im1tdXNjdWx1cyIsCiAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9bW1fcm9yX2dwZm9pbGVyX2Rvd24tdnt2ZXJ9Lnhsc3giKSkKcm9yX2dwcm9maWxlcl9kb3duJHB2YWx1ZV9wbG90cyRtZnBfcGxvdF9vdmVyCnJvcl9ncHJvZmlsZXJfZG93biRwdmFsdWVfcGxvdHMkYnBwX3Bsb3Rfb3Zlcgpyb3JfZ3Byb2ZpbGVyX2Rvd24kcHZhbHVlX3Bsb3RzJHJlYWN0b21lX3Bsb3Rfb3Zlcgpyb3JfZ3Byb2ZpbGVyX2Rvd24kcHZhbHVlX3Bsb3RzJGNjcF9wbG90X292ZXIKcm9yX2dwcm9maWxlcl9kb3duJHB2YWx1ZV9wbG90cyR0Zl9wbG90X292ZXIKYGBgCgpgYGB7ciBzYXZlbWUsIGV2YWw9RkFMU0V9CnBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCm1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQp0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1ybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQptZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHRoaXNfc2F2ZSkpCnRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKSkKYGBgCgpgYGB7ciBsb2FkbWUsIGV2YWw9RkFMU0V9CmxvYWRtZShmaWxlbmFtZT10aGlzX3NhdmUpCmBgYAo=