Recap

In this section we will use the following files

  • background.csv containing one row for each gene in the comparison Basal.pregnant vs Basal.lactation (27,179 rows).
  • B.preg_vs_lactation.csv containing one row for each found to be DE in the contrast Basal.pregnant vs Basal.Lactation.

It will be helpful to have both these files open in Excel.

Enrichment and Pathways Analysis

The differential expression step is concerned with being able to say with confidence whether an individual gene has a different level of expression between biological groups. However, in this section we move towards discovering if our results are biologically significant. Are the genes that we have picked statistical flukes, or are there some commonalities?

It can be informative to scan (manually) through the gene lists we generate through Degust and use our Biological intuition to look for themes. We might also look for previously-published genes, or genes that we have intentionally-manipulated (e.g. by knocking-out that gene). However, sometimes we can mislead ourselves into thinking our results are more significant than they really are.

In order to infer biological significance from our data, we need some way of being able to group genes together based on their function. The two main sources of these are:-

The GO database defines the relationships between sets of genes in a tree-like structure starting with the most-general biological definition to increasingly specific cases.

The ontologies are split into three categories

  • (MF) Molecular Function: the molecular activities of individual gene products
  • (CC) Cellular Component: where the gene products are active
  • (BP) Biological Process: the pathways and larger processes to which that gene product’s activity contributes

The KEGG database also defines sets of genes. There is no defined relationship between KEGG pathways. There is however a complex network between genes belonging to the same pathway which does not exist in GO.

The choice of database does not actually affect how the statistical testing works. We test of significant collections regardless of how the collections have been defined.

The “cell cycle process” Gene Ontology has many hundreds of genes belonging to it. If we were to pick a set of genes at random of equivalent size as our list of differentially-expressed genes we should not be surprised to see a lot of cell-cycle genes appearing in the list. This is just due to the fact that we had a lot of possible cell-cycle genes to choose from. The key question is whether the number of cell-cycle (or any other pathway) is more than we would expect by chance.

In this section we will use the following files

  • background.csv containing one row for each gene in the comparison Basal.pregnant vs Basal.lactation (27,179 rows).
  • B.preg_vs_lactation.csv containing one row for each found to be DE in the contrast Basal.pregnant vs Basal.Lactation.

It will be helpful to have both these files open in Excel.

There are two different approaches one might use, and we will cover the theory behind both. The distinction is whether you are happy to use a hard (and arbitrary) threshold to identify DE genes.

Over-representation analysis (ORA)

“Threshold-based” methods require definition of a statistical threshold to define list of genes to test (e.g. FDR < 0.01). Then a hypergeometric test or Fisher’s Exact test is generally used. These methods require plenty of DE genes as an input, so people often use more-relaxed criteria for identifying DE genes (e.g. raw rather than adjusted p-values or FDR value but in conjuction with a fold-change cut-off)

The question we are asking here is;

“Are the number of DE genes associated with Gene Set X significantly greater than what we might expect by chance alone?”

We can answer this question by knowing

  • the total number of DE genes
  • the number of genes in the gene set (pathway or process)
  • the number of genes in the gene set that are found to be DE
  • the total number of tested genes (background)

You will never need to know this, but for those interested the formula for Fishers exact test is;

\[ p = \frac{\binom{a + b}{a}\binom{c +d}{c}}{\binom{n}{a +c}} = \frac{(a+b)!(c+d)!(a+c)!(b+d)!}{a!b!c!d!n!} \]

with:-

Differentially Expressed Not Differentially Expressed Total
In Gene Set a b a + b
Not in Gene Set c d c + d
Total a + c b +d a + b + c + d (=n)

As a worked example, consider a Gene Set with 634 genes. After performing differential expression, we find that our list of differentially-expressed genes comprises 4595 genes. Amongst this gene list, 233 belong to our Gene Set. Plugging-in the numbers we get:-

Differentially Expressed Not Differentially Expressed
In Gene Set 233 388
Not in Gene Set 4362 22196

Which yields a significant p-value with a Fishers’ test.

Another way of thinking about this is to randomly pick a set of 4595 genes (i.e. without using a p-value cut-off) and see how many belong to our gene set.

The first time we do this, we get 100 genes in our set. The second time we get 112 and so on…

If we repeat enough time we can make a histogram:-

We see that a value of 233 is extremely unlikely. In other words, using our p-value cut-off to generate our gene list has resulted in about twice as many of our gene set than we would expect by chance

Using WebGestalt for ORA

N.B. Previous version of this course used the website GOrilla for this section. However, at the time of writing this site no longer seems to be working. We have switched to using WebGestalt which can perform the same statistical tests as GOrilla and has a nicer interface.

There are several popular online tools for performing enrichment analysis We will be using the online tool WebGestalt to perform the pathways analysis. It supports various types of analyses; the first of which accepts a list of pre-selected genes to perform an ORA.

  1. Go to https://www.webgestalt.org/#
  2. Choose the ORA Sample Run Tab

  1. Choose Organism: Mus Musculus
  2. Make sure that Method of interest is set to Over-Representation Analysis (ORA)
  3. Select Functional Database geneontology and Biological Process non-redundant
  • you can change this later if you wish
  1. Keep Select Gene ID Type as Gene symbol
  2. Paste the gene symbols corresponding to DE genes in Basal pregnant vs Basal Lactation from your Excel spreadsheet into the Upload Gene List box.
  • The shortcut CTRL + SPACE will let you select an entire column
  • Do not paste the column heading SYMBOL
  1. In Select Reference Set make sure genome protein-coding is selected.
  2. Under Advanced Parameters, make sure that the FDR option is selected as Significance otherwise you will only get the top 10 pathways reported.
  3. Click Submit

The page that appears can give a summary of the analysis performed (i.e. the number of genes that were used as input and how many names were recognised as valid gene names) along with various visualisations. The summary tab can be useful to check that you have supplied the correct kind of IDs (e.g. Gene symbol vs Ensembl, Entrez) and selected the correct organism. If few IDs are reported as being mapped, you should check your settings.

The bar plot shows the amount of enrichment for the pathways identified as being significant. A larger enrichment score indicates for a pathway indicates that genes are found in the list of gene names more than you would expect by chance. However, the pathways with the largest enrichment are not necessarily the most significant.

The table output shows details of the most over-represented pathways. Clicking on a pathway name in the left-hand column gives more information on the genes belonging to that pathway - including the names of genes in that pathway that were found in the list of genes. The Expect and Ratio columns indicate how many genes in a pathway that are expected to be found in the uploaded gene list, and how many more times genes in the pathway actually occur in the gene list. All columns in the table can be sorted.

Exercise: Use WebGestalt to find enriched pathways in the Basal pregnant vs lactation analysis and take some time to understand the results.

Threshold-free analysis

This type of analysis is popular for datasets where differential expression analysis does not reveal many genes that are differentially-expressed on their own. Instead, it seeks to identify genes that as a group have a tendency to be near the extremes of the log-fold changes. The results are typically presented in the following way.

The “barcode”-like panel represents where genes from a particular pathway (HALLMARK_E2F_TARGETS in this case) are located in a gene list ranked from most up-regulated to most down-regulated. The peak in the green curve is used to indicate where the majority of genes are located. If this is shifted to the left or the right it indicates that genes belonging to this gene set have a tendency to be up- or down-regulated. The set of genes for a given pathway that contribute most to the enrichment are called the leading edge.

One reason for the popularity of this method is that it does not rely on having to impose arbitrary cut-offs on the data. Instead, we need to provide a measure of the importance of each gene such as it’s fold-change. These are then used the rank the genes.

The Broad institute has made this analysis method popular and provides a version of GSEA that can be run via a java application. However, the application can be a bit fiddly to run, so we will use the Webgestalt website again

https://www.webgestalt.org/#

  • Open the file background.csv in Excel and delete all columns except the SYMBOL and basal.lactation column.
  • Go to the Webgestalt website, and select GSEA Sample Run from the front page
  • Check that Organism of interest is Mus musculus
  • Make sure Method of interest is set to Gene Set Enrichment Analysis (GSEA)
  • Select Functional Database as geneontology
    • feel free to try other databases if you have time
  • Make sure that Select Gene ID Type is Gene symbol
  • Paste the contents of your modified excel file into the text box under Upload Gene List.

    Do not paste the header line of SYMBOL and basal.lactation into the box

  • Click Submit

If the GSEA analysis is taking too long, you might be able to spend up the process by choosing KEGG pathways as the database of choice and / or decreasing the number of permutations in the Advanced Parameters tab

The results are presented in a similar way to the ORA from the previous section. However, the enrichment scores presented can either be positive or negative - indicating that genes from a given pathway tend to up- or down-regulated. Selecting a pathway from the Table of results or bar chart will given information about the enrichment of the pathway and the leading genes (set of genes in the pathway responsible for the enrichment).

Exercise: Use Webgestalt to identify enriched pathways in the Basal Pregnant vs Lactation contrast. Compare the results from the most extreme positive and negative enrichment score, and make sure that you can interpret corresponding the barcode plots.

If the GSEA analysis is taking too long, please use this link to view some results from the same dataset

Alternative web-sites

The performance of WebGestalt can be a bit variable. Here are a couple of suggestions for alternative websites that work in a similar fashion and require the same data input

  • ShinyGO, for Over-representation analysis only
  • GeneTrail, for both Over-representation Analysis or GSEA depending on type of input data
LS0tCnRpdGxlOiAiT250b2xvZ2llcyBhbmQgRW5yaWNobWVudCIKYXV0aG9yOiAiTWFyayBEdW5uaW5nIgpkYXRlOiAnYHIgZm9ybWF0KFN5cy50aW1lKCksICJMYXN0IG1vZGlmaWVkOiAlZCAlYiAlWSIpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgY3NzOiBzdHlsZXNoZWV0cy9zdHlsZXMuY3NzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShsaW1tYSkKYGBgCgojIFJlY2FwCgpJbiB0aGlzIHNlY3Rpb24gd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBmaWxlcwoKLSBbYGJhY2tncm91bmQuY3N2YF0oYmFja2dyb3VuZC5jc3YpIGNvbnRhaW5pbmcgb25lIHJvdyBmb3IgZWFjaCBnZW5lIGluIHRoZSBjb21wYXJpc29uIEJhc2FsLnByZWduYW50IHZzIEJhc2FsLmxhY3RhdGlvbiAoMjcsMTc5IHJvd3MpLgotIFtgQi5wcmVnX3ZzX2xhY3RhdGlvbi5jc3ZgXShCLnByZWdfdnNfbGFjdGF0aW9uLmNzdikgY29udGFpbmluZyBvbmUgcm93IGZvciBlYWNoIGZvdW5kIHRvIGJlIERFIGluIHRoZSBjb250cmFzdCBCYXNhbC5wcmVnbmFudCB2cyBCYXNhbC5MYWN0YXRpb24uCgpJdCB3aWxsIGJlIGhlbHBmdWwgdG8gaGF2ZSBib3RoIHRoZXNlIGZpbGVzIG9wZW4gaW4gRXhjZWwuCgojIEVucmljaG1lbnQgYW5kIFBhdGh3YXlzIEFuYWx5c2lzCgpUaGUgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gc3RlcCBpcyBjb25jZXJuZWQgd2l0aCBiZWluZyBhYmxlIHRvIHNheSB3aXRoIGNvbmZpZGVuY2Ugd2hldGhlciBhbiBpbmRpdmlkdWFsIGdlbmUgaGFzIGEgZGlmZmVyZW50IGxldmVsIG9mIGV4cHJlc3Npb24gYmV0d2VlbiBiaW9sb2dpY2FsIGdyb3Vwcy4gSG93ZXZlciwgaW4gdGhpcyBzZWN0aW9uIHdlIG1vdmUgdG93YXJkcyBkaXNjb3ZlcmluZyBpZiBvdXIgcmVzdWx0cyBhcmUgKioqYmlvbG9naWNhbGx5IHNpZ25pZmljYW50KioqLiBBcmUgdGhlIGdlbmVzIHRoYXQgd2UgaGF2ZSBwaWNrZWQgc3RhdGlzdGljYWwgZmx1a2VzLCBvciBhcmUgdGhlcmUgc29tZSBjb21tb25hbGl0aWVzPwoKSXQgY2FuIGJlIGluZm9ybWF0aXZlIHRvIHNjYW4gKG1hbnVhbGx5KSB0aHJvdWdoIHRoZSBnZW5lIGxpc3RzIHdlIGdlbmVyYXRlIHRocm91Z2ggRGVndXN0IGFuZCB1c2Ugb3VyIEJpb2xvZ2ljYWwgaW50dWl0aW9uIHRvIGxvb2sgZm9yIHRoZW1lcy4gV2UgbWlnaHQgYWxzbyBsb29rIGZvciBwcmV2aW91c2x5LXB1Ymxpc2hlZCBnZW5lcywgb3IgZ2VuZXMgdGhhdCB3ZSBoYXZlIGludGVudGlvbmFsbHktbWFuaXB1bGF0ZWQgKGUuZy4gYnkga25vY2tpbmctb3V0IHRoYXQgZ2VuZSkuIEhvd2V2ZXIsIHNvbWV0aW1lcyB3ZSBjYW4gbWlzbGVhZCBvdXJzZWx2ZXMgaW50byB0aGlua2luZyBvdXIgcmVzdWx0cyBhcmUgbW9yZSBzaWduaWZpY2FudCB0aGFuIHRoZXkgcmVhbGx5IGFyZS4KCkluIG9yZGVyIHRvIGluZmVyIGJpb2xvZ2ljYWwgc2lnbmlmaWNhbmNlIGZyb20gb3VyIGRhdGEsIHdlIG5lZWQgc29tZSB3YXkgb2YgYmVpbmcgYWJsZSB0byBncm91cCBnZW5lcyB0b2dldGhlciBiYXNlZCBvbiB0aGVpciBmdW5jdGlvbi4gVGhlIHR3byBtYWluIHNvdXJjZXMgb2YgdGhlc2UgYXJlOi0KCgotIFtHZW5lIE9udG9sb2d5XShodHRwOi8vZ2VuZW9udG9sb2d5Lm9yZy8pCi0gW0tFR0ddKGh0dHBzOi8vd3d3Lmdlbm9tZS5qcC9rZWdnL2tlZ2cxYS5odG1sKQoKClRoZSBHTyBkYXRhYmFzZSBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gc2V0cyBvZiBnZW5lcyBpbiBhIHRyZWUtbGlrZSBzdHJ1Y3R1cmUgc3RhcnRpbmcgd2l0aCB0aGUgbW9zdC1nZW5lcmFsIGJpb2xvZ2ljYWwgZGVmaW5pdGlvbiB0byBpbmNyZWFzaW5nbHkgc3BlY2lmaWMgY2FzZXMuCgohW10oaHR0cDovL2dlbmVvbnRvbG9neS5vcmcvYXNzZXRzL2hleG9zZS1iaW9zeW50aGV0aWMtcHJvY2Vzcy5wbmcpCgpUaGUgb250b2xvZ2llcyBhcmUgc3BsaXQgaW50byB0aHJlZSBjYXRlZ29yaWVzCgotICgqKk1GKiopIE1vbGVjdWxhciBGdW5jdGlvbjogdGhlIG1vbGVjdWxhciBhY3Rpdml0aWVzIG9mIGluZGl2aWR1YWwgZ2VuZSBwcm9kdWN0cwotICgqKkNDKiopIENlbGx1bGFyIENvbXBvbmVudDogd2hlcmUgdGhlIGdlbmUgcHJvZHVjdHMgYXJlIGFjdGl2ZQotICgqKkJQKiopIEJpb2xvZ2ljYWwgUHJvY2VzczogdGhlIHBhdGh3YXlzIGFuZCBsYXJnZXIgcHJvY2Vzc2VzIHRvIHdoaWNoIHRoYXQgZ2VuZSBwcm9kdWN04oCZcyBhY3Rpdml0eSBjb250cmlidXRlcwoKVGhlIEtFR0cgZGF0YWJhc2UgYWxzbyBkZWZpbmVzIHNldHMgb2YgZ2VuZXMuIFRoZXJlIGlzIG5vIGRlZmluZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gS0VHRyBwYXRod2F5cy4gVGhlcmUgaXMgaG93ZXZlciBhIGNvbXBsZXggbmV0d29yayBiZXR3ZWVuIGdlbmVzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBwYXRod2F5IHdoaWNoIGRvZXMgbm90IGV4aXN0IGluIEdPLgoKLSBbZS5nLiBQYXRod2F5cyBpbiBjYW5jZXJdKGh0dHBzOi8vd3d3Lmdlbm9tZS5qcC9rZWdnLWJpbi9zaG93X3BhdGh3YXk/aHNhMDUyMDApCgpUaGUgY2hvaWNlIG9mIGRhdGFiYXNlIGRvZXMgbm90IGFjdHVhbGx5IGFmZmVjdCBob3cgdGhlIHN0YXRpc3RpY2FsIHRlc3Rpbmcgd29ya3MuIFdlIHRlc3Qgb2Ygc2lnbmlmaWNhbnQgY29sbGVjdGlvbnMgcmVnYXJkbGVzcyBvZiBob3cgdGhlIGNvbGxlY3Rpb25zIGhhdmUgYmVlbiBkZWZpbmVkLgoKClRoZSAiY2VsbCBjeWNsZSBwcm9jZXNzIiBHZW5lIE9udG9sb2d5IGhhcyBtYW55IGh1bmRyZWRzIG9mIGdlbmVzIGJlbG9uZ2luZyB0byBpdC4gSWYgd2Ugd2VyZSB0byBwaWNrIGEgc2V0IG9mIGdlbmVzICoqYXQgcmFuZG9tKiogb2YgZXF1aXZhbGVudCBzaXplIGFzIG91ciBsaXN0IG9mIGRpZmZlcmVudGlhbGx5LWV4cHJlc3NlZCBnZW5lcyAqKndlIHNob3VsZCBub3QgYmUgc3VycHJpc2VkKiogdG8gc2VlIGEgbG90IG9mIGNlbGwtY3ljbGUgZ2VuZXMgYXBwZWFyaW5nIGluIHRoZSBsaXN0LiBUaGlzIGlzIGp1c3QgZHVlIHRvIHRoZSBmYWN0IHRoYXQgd2UgaGFkIGEgbG90IG9mIHBvc3NpYmxlIGNlbGwtY3ljbGUgZ2VuZXMgdG8gY2hvb3NlIGZyb20uIFRoZSBrZXkgcXVlc3Rpb24gaXMgd2hldGhlciB0aGUgbnVtYmVyIG9mIGNlbGwtY3ljbGUgKG9yIGFueSBvdGhlciBwYXRod2F5KSBpcyAqbW9yZSB0aGFuIHdlIHdvdWxkIGV4cGVjdCBieSBjaGFuY2UqLgoKCkluIHRoaXMgc2VjdGlvbiB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIGZpbGVzCgotICAgW2BiYWNrZ3JvdW5kLmNzdmBdKGJhY2tncm91bmQuY3N2KSBjb250YWluaW5nIG9uZSByb3cgZm9yIGVhY2ggZ2VuZSBpbiB0aGUgY29tcGFyaXNvbiBCYXNhbC5wcmVnbmFudCB2cyBCYXNhbC5sYWN0YXRpb24gKDI3LDE3OSByb3dzKS4KLSAgIFtgQi5wcmVnX3ZzX2xhY3RhdGlvbi5jc3ZgXShCLnByZWdfdnNfbGFjdGF0aW9uLmNzdikgY29udGFpbmluZyBvbmUgcm93IGZvciBlYWNoIGZvdW5kIHRvIGJlIERFIGluIHRoZSBjb250cmFzdCBCYXNhbC5wcmVnbmFudCB2cyBCYXNhbC5MYWN0YXRpb24uCgpJdCB3aWxsIGJlIGhlbHBmdWwgdG8gaGF2ZSBib3RoIHRoZXNlIGZpbGVzIG9wZW4gaW4gRXhjZWwuCgoKClRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGFwcHJvYWNoZXMgb25lIG1pZ2h0IHVzZSwgYW5kIHdlIHdpbGwgY292ZXIgdGhlIHRoZW9yeSBiZWhpbmQgYm90aC4gVGhlIGRpc3RpbmN0aW9uIGlzIHdoZXRoZXIgeW91IGFyZSBoYXBweSB0byB1c2UgYSBoYXJkIChhbmQgYXJiaXRyYXJ5KSB0aHJlc2hvbGQgdG8gaWRlbnRpZnkgREUgZ2VuZXMuCgojIyBPdmVyLXJlcHJlc2VudGF0aW9uIGFuYWx5c2lzIChPUkEpCgoiVGhyZXNob2xkLWJhc2VkIiBtZXRob2RzIHJlcXVpcmUgZGVmaW5pdGlvbiBvZiBhIHN0YXRpc3RpY2FsIHRocmVzaG9sZCB0byBkZWZpbmUgbGlzdCBvZiBnZW5lcyB0byB0ZXN0IChlLmcuIEZEUiBcPCAwLjAxKS4gVGhlbiBhICpoeXBlcmdlb21ldHJpYyogdGVzdCBvciAqRmlzaGVyJ3MgRXhhY3QqIHRlc3QgaXMgZ2VuZXJhbGx5IHVzZWQuIFRoZXNlIG1ldGhvZHMgcmVxdWlyZSBwbGVudHkgb2YgREUgZ2VuZXMgYXMgYW4gaW5wdXQsIHNvIHBlb3BsZSBvZnRlbiB1c2UgbW9yZS1yZWxheGVkIGNyaXRlcmlhIGZvciBpZGVudGlmeWluZyBERSBnZW5lcyAoZS5nLiByYXcgcmF0aGVyIHRoYW4gYWRqdXN0ZWQgcC12YWx1ZXMgb3IgRkRSIHZhbHVlIGJ1dCBpbiBjb25qdWN0aW9uIHdpdGggYSBmb2xkLWNoYW5nZSBjdXQtb2ZmKQoKVGhlIHF1ZXN0aW9uIHdlIGFyZSBhc2tpbmcgaGVyZSBpczsKCj4gKioqIkFyZSB0aGUgbnVtYmVyIG9mIERFIGdlbmVzIGFzc29jaWF0ZWQgd2l0aCBHZW5lIFNldCBYIHNpZ25pZmljYW50bHkgZ3JlYXRlciB0aGFuIHdoYXQgd2UgbWlnaHQgZXhwZWN0IGJ5IGNoYW5jZSBhbG9uZT8iKioqCgpXZSBjYW4gYW5zd2VyIHRoaXMgcXVlc3Rpb24gYnkga25vd2luZwoKLSAgIHRoZSB0b3RhbCBudW1iZXIgb2YgREUgZ2VuZXMKLSAgIHRoZSBudW1iZXIgb2YgZ2VuZXMgaW4gdGhlIGdlbmUgc2V0IChwYXRod2F5IG9yIHByb2Nlc3MpCi0gICB0aGUgbnVtYmVyIG9mIGdlbmVzIGluIHRoZSBnZW5lIHNldCB0aGF0IGFyZSBmb3VuZCB0byBiZSBERQotICAgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0ZWQgZ2VuZXMgKGJhY2tncm91bmQpCgpZb3Ugd2lsbCBuZXZlciBuZWVkIHRvIGtub3cgdGhpcywgYnV0IGZvciB0aG9zZSBpbnRlcmVzdGVkICB0aGUgZm9ybXVsYSBmb3IgRmlzaGVycyBleGFjdCB0ZXN0IGlzOwoKJCQgcCA9IFxmcmFje1xiaW5vbXthICsgYn17YX1cYmlub217YyArZH17Y319e1xiaW5vbXtufXthICtjfX0gPSBcZnJhY3soYStiKSEoYytkKSEoYStjKSEoYitkKSF9e2EhYiFjIWQhbiF9ICQkCgp3aXRoOi0KCnwgKipEaWZmZXJlbnRpYWxseSBFeHByZXNzZWQqKiB8ICoqTm90IERpZmZlcmVudGlhbGx5IEV4cHJlc3NlZCoqIHwgKipUb3RhbCoqIHwgICAgICAgICAgICAgICAgICAgICAgICB8Cnw6LS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLTp8CnwgICAgICAgICBJbiBHZW5lIFNldCAgICAgICAgICB8ICAgICAgICAgICAgICAgIGEgICAgICAgICAgICAgICAgIHwgICAgIGIgICAgIHwgICAgICAgICBhICsgYiAgICAgICAgICB8CnwgICAgICAgTm90IGluIEdlbmUgU2V0ICAgICAgICB8ICAgICAgICAgICAgICAgIGMgICAgICAgICAgICAgICAgIHwgICAgIGQgICAgIHwgICAgICAgICBjICsgZCAgICAgICAgICB8CnwgICAgICAgICAgKipUb3RhbCoqICAgICAgICAgICB8ICAgICAgICAgICAgKiphICsgYyoqICAgICAgICAgICAgIHwgKipiICtkKiogIHwgKiphICsgYiArIGMgKyBkICg9bikqKiB8CgoKQXMgYSB3b3JrZWQgZXhhbXBsZSwgY29uc2lkZXIgYSBHZW5lIFNldCB3aXRoICoqNjM0KiogZ2VuZXMuIEFmdGVyIHBlcmZvcm1pbmcgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24sIHdlIGZpbmQgdGhhdCBvdXIgbGlzdCBvZiBkaWZmZXJlbnRpYWxseS1leHByZXNzZWQgZ2VuZXMgY29tcHJpc2VzICoqNDU5NSoqIGdlbmVzLiBBbW9uZ3N0IHRoaXMgZ2VuZSBsaXN0LCAqKjIzMyoqIGJlbG9uZyB0byBvdXIgR2VuZSBTZXQuIFBsdWdnaW5nLWluIHRoZSBudW1iZXJzIHdlIGdldDotCgoKCnwgICAgICAgICAgICAgICAgIHwgRGlmZmVyZW50aWFsbHkgRXhwcmVzc2VkIHwgTm90IERpZmZlcmVudGlhbGx5IEV4cHJlc3NlZCB8CnwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgSW4gR2VuZSBTZXQgICAgIHwgMjMzICAgICAgICAgICAgICAgICAgICAgIHwgMzg4ICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgTm90IGluIEdlbmUgU2V0IHwgNDM2MiAgICAgICAgICAgICAgICAgICAgIHwgMjIxOTYgICAgICAgICAgICAgICAgICAgICAgICB8CgoKV2hpY2ggeWllbGRzIGEgKipzaWduaWZpY2FudCBwLXZhbHVlKiogd2l0aCBhIEZpc2hlcnMnIHRlc3QuCgpBbm90aGVyIHdheSBvZiB0aGlua2luZyBhYm91dCB0aGlzIGlzIHRvICpyYW5kb21seSogcGljayBhIHNldCBvZiAqKjQ1OTUqKiBnZW5lcyAoaS5lLiB3aXRob3V0IHVzaW5nIGEgcC12YWx1ZSBjdXQtb2ZmKSBhbmQgc2VlIGhvdyBtYW55IGJlbG9uZyB0byBvdXIgZ2VuZSBzZXQuCgoKVGhlIGZpcnN0IHRpbWUgd2UgZG8gdGhpcywgd2UgZ2V0ICoqMTAwKiogZ2VuZXMgaW4gb3VyIHNldC4gVGhlIHNlY29uZCB0aW1lIHdlIGdldCAqKjExMioqIGFuZCBzbyBvbi4uLgoKSWYgd2UgcmVwZWF0IGVub3VnaCB0aW1lIHdlIGNhbiBtYWtlIGEgaGlzdG9ncmFtOi0KCiFbXShtZWRpYS9nZW5lc2V0X3JhbmRvbUhpc3QucG5nKQoKV2Ugc2VlIHRoYXQgYSB2YWx1ZSBvZiAyMzMgaXMgZXh0cmVtZWx5IHVubGlrZWx5LiBJbiBvdGhlciB3b3JkcywgdXNpbmcgb3VyIHAtdmFsdWUgY3V0LW9mZiB0byBnZW5lcmF0ZSBvdXIgZ2VuZSBsaXN0IGhhcyByZXN1bHRlZCBpbiBhYm91dCAqKnR3aWNlIGFzIG1hbnkgb2Ygb3VyIGdlbmUgc2V0IHRoYW4gd2Ugd291bGQgZXhwZWN0IGJ5IGNoYW5jZSoqCgotIFtSIHNjcmlwdCBmb3IgdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZC4uLl0oc2FtcGxlX2dlbmVzZXQuUikKCiMjIFVzaW5nIFdlYkdlc3RhbHQgZm9yIE9SQQoKPGRpdiBjbGFzcz0iaW5mb3JtYXRpb24iPgoqKk4uQi4qKiBQcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgY291cnNlIHVzZWQgdGhlIHdlYnNpdGUgR09yaWxsYSBmb3IgdGhpcyBzZWN0aW9uLiBIb3dldmVyLCBhdCB0aGUgdGltZSBvZiB3cml0aW5nIHRoaXMgc2l0ZSBubyBsb25nZXIgc2VlbXMgdG8gYmUgd29ya2luZy4gV2UgaGF2ZSBzd2l0Y2hlZCB0byB1c2luZyBXZWJHZXN0YWx0IHdoaWNoIGNhbiBwZXJmb3JtIHRoZSBzYW1lIHN0YXRpc3RpY2FsIHRlc3RzIGFzIEdPcmlsbGEgYW5kIGhhcyBhIG5pY2VyIGludGVyZmFjZS4KPC9kaXY+CgpUaGVyZSBhcmUgc2V2ZXJhbCBwb3B1bGFyIG9ubGluZSB0b29scyBmb3IgcGVyZm9ybWluZyBlbnJpY2htZW50IGFuYWx5c2lzIFdlIHdpbGwgYmUgdXNpbmcgdGhlIG9ubGluZSB0b29sIFtXZWJHZXN0YWx0XShodHRwczovL3d3dy53ZWJnZXN0YWx0Lm9yZy8pIHRvIHBlcmZvcm0gdGhlIHBhdGh3YXlzIGFuYWx5c2lzLiBJdCBzdXBwb3J0cyB2YXJpb3VzIHR5cGVzIG9mIGFuYWx5c2VzOyB0aGUgZmlyc3Qgb2Ygd2hpY2ggYWNjZXB0cyBhIGxpc3Qgb2YgcHJlLXNlbGVjdGVkIGdlbmVzIHRvIHBlcmZvcm0gYW4gKk9SQSouCgoxLiAgR28gdG8gPGh0dHBzOi8vd3d3LndlYmdlc3RhbHQub3JnLyM+CjIuICBDaG9vc2UgdGhlICoqT1JBIFNhbXBsZSBSdW4qKiBUYWIKCiFbXShtZWRpYS93ZWJnZXN0YWx0XzEucG5nKQoKMy4gIENob29zZSBPcmdhbmlzbTogYE11cyBNdXNjdWx1c2AKNC4gIE1ha2Ugc3VyZSB0aGF0ICoqTWV0aG9kIG9mIGludGVyZXN0KiogaXMgc2V0IHRvIGBPdmVyLVJlcHJlc2VudGF0aW9uIEFuYWx5c2lzIChPUkEpYAo1LiAgU2VsZWN0ICoqRnVuY3Rpb25hbCBEYXRhYmFzZSoqIGBnZW5lb250b2xvZ3lgIGFuZCBgQmlvbG9naWNhbCBQcm9jZXNzIG5vbi1yZWR1bmRhbnRgCiAgKyB5b3UgY2FuIGNoYW5nZSB0aGlzIGxhdGVyIGlmIHlvdSB3aXNoCjYuICBLZWVwICoqU2VsZWN0IEdlbmUgSUQgVHlwZSoqIGFzIGBHZW5lIHN5bWJvbGAKNy4gIFBhc3RlIHRoZSBnZW5lIHN5bWJvbHMgY29ycmVzcG9uZGluZyB0byBERSBnZW5lcyBpbiAqQmFzYWwgcHJlZ25hbnQgdnMgQmFzYWwgTGFjdGF0aW9uKiBmcm9tIHlvdXIgRXhjZWwgc3ByZWFkc2hlZXQgaW50byB0aGUgVXBsb2FkIEdlbmUgTGlzdCBib3guCgotICAgKipUaGUgc2hvcnRjdXQgQ1RSTCArIFNQQUNFIHdpbGwgbGV0IHlvdSBzZWxlY3QgYW4gZW50aXJlIGNvbHVtbioqCi0gRG8gbm90IHBhc3RlIHRoZSBjb2x1bW4gaGVhZGluZyBgU1lNQk9MYAo4LiBJbiAqKlNlbGVjdCBSZWZlcmVuY2UgU2V0KiogbWFrZSBzdXJlICpnZW5vbWUgcHJvdGVpbi1jb2RpbmcqIGlzIHNlbGVjdGVkLgo5LiBVbmRlciAqKkFkdmFuY2VkIFBhcmFtZXRlcnMqKiwgbWFrZSBzdXJlIHRoYXQgdGhlICpGRFIqIG9wdGlvbiBpcyBzZWxlY3RlZCBhcyBTaWduaWZpY2FuY2Ugb3RoZXJ3aXNlIHlvdSB3aWxsIG9ubHkgZ2V0IHRoZSB0b3AgMTAgcGF0aHdheXMgcmVwb3J0ZWQuCjEwLiBDbGljayBTdWJtaXQKCgpUaGUgcGFnZSB0aGF0IGFwcGVhcnMgY2FuIGdpdmUgYSBzdW1tYXJ5IG9mIHRoZSBhbmFseXNpcyBwZXJmb3JtZWQgKGkuZS4gdGhlIG51bWJlciBvZiBnZW5lcyB0aGF0IHdlcmUgdXNlZCBhcyBpbnB1dCBhbmQgaG93IG1hbnkgbmFtZXMgd2VyZSByZWNvZ25pc2VkIGFzIHZhbGlkIGdlbmUgbmFtZXMpIGFsb25nIHdpdGggdmFyaW91cyB2aXN1YWxpc2F0aW9ucy4gVGhlIHN1bW1hcnkgdGFiIGNhbiBiZSB1c2VmdWwgdG8gY2hlY2sgdGhhdCB5b3UgaGF2ZSBzdXBwbGllZCB0aGUgY29ycmVjdCBraW5kIG9mIElEcyAoZS5nLiBHZW5lIHN5bWJvbCB2cyBFbnNlbWJsLCBFbnRyZXopIGFuZCBzZWxlY3RlZCB0aGUgY29ycmVjdCBvcmdhbmlzbS4gSWYgZmV3IElEcyBhcmUgcmVwb3J0ZWQgYXMgYmVpbmcgbWFwcGVkLCB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc2V0dGluZ3MuCgpUaGUgKmJhciBwbG90KiBzaG93cyB0aGUgYW1vdW50IG9mIGVucmljaG1lbnQgZm9yIHRoZSBwYXRod2F5cyBpZGVudGlmaWVkIGFzIGJlaW5nIHNpZ25pZmljYW50LiBBIGxhcmdlciBlbnJpY2htZW50IHNjb3JlIGluZGljYXRlcyBmb3IgYSBwYXRod2F5IGluZGljYXRlcyB0aGF0IGdlbmVzIGFyZSBmb3VuZCBpbiB0aGUgbGlzdCBvZiBnZW5lIG5hbWVzICoqbW9yZSB0aGFuIHlvdSB3b3VsZCBleHBlY3QgYnkgY2hhbmNlKiouIEhvd2V2ZXIsIHRoZSBwYXRod2F5cyB3aXRoIHRoZSBsYXJnZXN0IGVucmljaG1lbnQgYXJlIG5vdCBuZWNlc3NhcmlseSB0aGUgbW9zdCBzaWduaWZpY2FudC4KCiFbXShtZWRpYS93ZWJnZXN0YWx0XzIucG5nKQoKVGhlIHRhYmxlIG91dHB1dCBzaG93cyBkZXRhaWxzIG9mIHRoZSBtb3N0IG92ZXItcmVwcmVzZW50ZWQgcGF0aHdheXMuIENsaWNraW5nIG9uIGEgcGF0aHdheSBuYW1lIGluIHRoZSBsZWZ0LWhhbmQgY29sdW1uIGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGdlbmVzIGJlbG9uZ2luZyB0byB0aGF0IHBhdGh3YXkgLSBpbmNsdWRpbmcgdGhlIG5hbWVzIG9mIGdlbmVzIGluIHRoYXQgcGF0aHdheSB0aGF0IHdlcmUgZm91bmQgaW4gdGhlIGxpc3Qgb2YgZ2VuZXMuIFRoZSAqKkV4cGVjdCoqIGFuZCAqKlJhdGlvKiogY29sdW1ucyBpbmRpY2F0ZSBob3cgbWFueSBnZW5lcyBpbiBhIHBhdGh3YXkgdGhhdCBhcmUgKmV4cGVjdGVkKiB0byBiZSBmb3VuZCBpbiB0aGUgdXBsb2FkZWQgZ2VuZSBsaXN0LCBhbmQgaG93IG1hbnkgbW9yZSB0aW1lcyBnZW5lcyBpbiB0aGUgcGF0aHdheSAqYWN0dWFsbHkgb2NjdXIqIGluIHRoZSBnZW5lIGxpc3QuIEFsbCBjb2x1bW5zIGluIHRoZSB0YWJsZSBjYW4gYmUgc29ydGVkLgoKIVtdKG1lZGlhL3dlYmdlc3RhbHRfMy5wbmcpCgoKOjo6IGV4ZXJjaXNlCioqRXhlcmNpc2U6KiogVXNlIFdlYkdlc3RhbHQgdG8gZmluZCBlbnJpY2hlZCBwYXRod2F5cyBpbiB0aGUgQmFzYWwgcHJlZ25hbnQgdnMgbGFjdGF0aW9uIGFuYWx5c2lzIGFuZCB0YWtlIHNvbWUgdGltZSB0byB1bmRlcnN0YW5kIHRoZSByZXN1bHRzLgo6OjoKCgoKIyMgVGhyZXNob2xkLWZyZWUgYW5hbHlzaXMKClRoaXMgdHlwZSBvZiBhbmFseXNpcyBpcyBwb3B1bGFyIGZvciBkYXRhc2V0cyB3aGVyZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcyBkb2VzIG5vdCByZXZlYWwgbWFueSBnZW5lcyB0aGF0IGFyZSBkaWZmZXJlbnRpYWxseS1leHByZXNzZWQgb24gdGhlaXIgb3duLiBJbnN0ZWFkLCBpdCBzZWVrcyB0byBpZGVudGlmeSBnZW5lcyB0aGF0IGFzIGEgZ3JvdXAgaGF2ZSBhIHRlbmRlbmN5IHRvIGJlIG5lYXIgdGhlIGV4dHJlbWVzIG9mIHRoZSBsb2ctZm9sZCBjaGFuZ2VzLiBUaGUgcmVzdWx0cyBhcmUgdHlwaWNhbGx5IHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHdheS4KCiFbXShtZWRpYS9vdmVyZXhwcmVzc2VkLWdzZWEucG5nKQoKVGhlICJiYXJjb2RlIi1saWtlIHBhbmVsIHJlcHJlc2VudHMgd2hlcmUgZ2VuZXMgZnJvbSBhIHBhcnRpY3VsYXIgcGF0aHdheSAoKipIQUxMTUFSS19FMkZfVEFSR0VUUyoqIGluIHRoaXMgY2FzZSkgYXJlIGxvY2F0ZWQgaW4gYSBnZW5lIGxpc3QgKnJhbmtlZCogZnJvbSBtb3N0IHVwLXJlZ3VsYXRlZCB0byBtb3N0IGRvd24tcmVndWxhdGVkLiBUaGUgcGVhayBpbiB0aGUgZ3JlZW4gY3VydmUgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgbWFqb3JpdHkgb2YgZ2VuZXMgYXJlIGxvY2F0ZWQuIElmIHRoaXMgaXMgc2hpZnRlZCB0byB0aGUgbGVmdCBvciB0aGUgcmlnaHQgaXQgaW5kaWNhdGVzIHRoYXQgZ2VuZXMgYmVsb25naW5nIHRvIHRoaXMgZ2VuZSBzZXQgaGF2ZSBhIHRlbmRlbmN5IHRvIGJlIHVwLSBvciBkb3duLXJlZ3VsYXRlZC4gVGhlIHNldCBvZiBnZW5lcyBmb3IgYSBnaXZlbiBwYXRod2F5IHRoYXQgY29udHJpYnV0ZSBtb3N0IHRvIHRoZSBlbnJpY2htZW50IGFyZSBjYWxsZWQgdGhlICoqbGVhZGluZyBlZGdlKiouCgpPbmUgcmVhc29uIGZvciB0aGUgcG9wdWxhcml0eSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IGl0IGRvZXMgbm90IHJlbHkgb24gaGF2aW5nIHRvIGltcG9zZSBhcmJpdHJhcnkgY3V0LW9mZnMgb24gdGhlIGRhdGEuIEluc3RlYWQsIHdlIG5lZWQgdG8gcHJvdmlkZSBhIG1lYXN1cmUgb2YgdGhlIGltcG9ydGFuY2Ugb2YgZWFjaCBnZW5lIHN1Y2ggYXMgaXQncyBmb2xkLWNoYW5nZS4gVGhlc2UgYXJlIHRoZW4gdXNlZCB0aGUgcmFuayB0aGUgZ2VuZXMuCgpUaGUgQnJvYWQgaW5zdGl0dXRlIGhhcyBtYWRlIHRoaXMgYW5hbHlzaXMgbWV0aG9kIHBvcHVsYXIgYW5kIHByb3ZpZGVzIFthIHZlcnNpb24gb2YgR1NFQV0oaHR0cDovL3NvZnR3YXJlLmJyb2FkaW5zdGl0dXRlLm9yZy9nc2VhL2luZGV4LmpzcCkgdGhhdCBjYW4gYmUgcnVuIHZpYSBhIGphdmEgYXBwbGljYXRpb24uIEhvd2V2ZXIsIHRoZSBhcHBsaWNhdGlvbiBjYW4gYmUgYSBiaXQgZmlkZGx5IHRvIHJ1biwgc28gd2Ugd2lsbCB1c2UgdGhlIFdlYmdlc3RhbHQgd2Vic2l0ZSBhZ2FpbgoKPGh0dHBzOi8vd3d3LndlYmdlc3RhbHQub3JnLyM+CgotICAgT3BlbiB0aGUgZmlsZSBgYmFja2dyb3VuZC5jc3ZgIGluIEV4Y2VsIGFuZCBkZWxldGUgYWxsIGNvbHVtbnMgZXhjZXB0IHRoZSBgU1lNQk9MYCBhbmQgYGJhc2FsLmxhY3RhdGlvbmAgY29sdW1uLiA8aW1nIHNyYz0ibWVkaWEvd2ViZ2VzdGFsdF80LnBuZyIvPgotICAgR28gdG8gdGhlIFdlYmdlc3RhbHQgd2Vic2l0ZSwgYW5kIHNlbGVjdCAqKkdTRUEgU2FtcGxlIFJ1bioqIGZyb20gdGhlIGZyb250IHBhZ2UKLSAgIENoZWNrIHRoYXQgKipPcmdhbmlzbSBvZiBpbnRlcmVzdCoqIGlzIGBNdXMgbXVzY3VsdXNgCi0gICBNYWtlIHN1cmUgKipNZXRob2Qgb2YgaW50ZXJlc3QqKiBpcyBzZXQgdG8gYEdlbmUgU2V0IEVucmljaG1lbnQgQW5hbHlzaXMgKEdTRUEpYAotICBTZWxlY3QgKipGdW5jdGlvbmFsIERhdGFiYXNlKiogYXMgYGdlbmVvbnRvbG9neWAKICAgICsgZmVlbCBmcmVlIHRvIHRyeSBvdGhlciBkYXRhYmFzZXMgaWYgeW91IGhhdmUgdGltZQotICBNYWtlIHN1cmUgdGhhdCAqKlNlbGVjdCBHZW5lIElEIFR5cGUqKiBpcyBgR2VuZSBzeW1ib2xgIAotICAgUGFzdGUgdGhlIGNvbnRlbnRzIG9mIHlvdXIgbW9kaWZpZWQgZXhjZWwgZmlsZSBpbnRvIHRoZSB0ZXh0IGJveCB1bmRlciAqKlVwbG9hZCBHZW5lIExpc3QqKi4gCjxkaXYgY2xhc3MgPSJpbmZvcm1hdGlvbiI+CkRvIG5vdCBwYXN0ZSB0aGUgaGVhZGVyIGxpbmUgb2YgKipTWU1CT0wqKiBhbmQgKipiYXNhbC5sYWN0YXRpb24qKiBpbnRvIHRoZSBib3gKPC9kaXY+Ci0gICBDbGljayAqKlN1Ym1pdCoqCgo8ZGl2IGNsYXNzPSJpbmZvcm1hdGlvbiI+CklmIHRoZSBHU0VBIGFuYWx5c2lzIGlzIHRha2luZyB0b28gbG9uZywgeW91IG1pZ2h0IGJlIGFibGUgdG8gc3BlbmQgdXAgdGhlIHByb2Nlc3MgYnkgY2hvb3NpbmcgS0VHRyBwYXRod2F5cyBhcyB0aGUgZGF0YWJhc2Ugb2YgY2hvaWNlIGFuZCAvIG9yIGRlY3JlYXNpbmcgdGhlIG51bWJlciBvZiBwZXJtdXRhdGlvbnMgaW4gdGhlIEFkdmFuY2VkIFBhcmFtZXRlcnMgdGFiCjwvZGl2PgoKVGhlIHJlc3VsdHMgYXJlIHByZXNlbnRlZCBpbiBhIHNpbWlsYXIgd2F5IHRvIHRoZSBPUkEgZnJvbSB0aGUgcHJldmlvdXMgc2VjdGlvbi4gSG93ZXZlciwgdGhlIGVucmljaG1lbnQgc2NvcmVzIHByZXNlbnRlZCBjYW4gZWl0aGVyIGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIC0gaW5kaWNhdGluZyB0aGF0IGdlbmVzIGZyb20gYSBnaXZlbiBwYXRod2F5IHRlbmQgdG8gdXAtIG9yIGRvd24tcmVndWxhdGVkLiBTZWxlY3RpbmcgYSBwYXRod2F5IGZyb20gdGhlIFRhYmxlIG9mIHJlc3VsdHMgb3IgYmFyIGNoYXJ0IHdpbGwgZ2l2ZW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVucmljaG1lbnQgb2YgdGhlIHBhdGh3YXkgYW5kIHRoZSAqbGVhZGluZyBnZW5lcyogKHNldCBvZiBnZW5lcyBpbiB0aGUgcGF0aHdheSByZXNwb25zaWJsZSBmb3IgdGhlIGVucmljaG1lbnQpLgoKCjxpbWcgc3JjPSJtZWRpYS93ZWJnZXN0YWx0XzUucG5nIi8+CgoKCjo6OiBleGVyY2lzZQoqKkV4ZXJjaXNlOioqIFVzZSBXZWJnZXN0YWx0IHRvIGlkZW50aWZ5IGVucmljaGVkIHBhdGh3YXlzIGluIHRoZSBCYXNhbCBQcmVnbmFudCB2cyBMYWN0YXRpb24gY29udHJhc3QuIENvbXBhcmUgdGhlIHJlc3VsdHMgZnJvbSB0aGUgbW9zdCBleHRyZW1lIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBlbnJpY2htZW50IHNjb3JlLCBhbmQgbWFrZSBzdXJlIHRoYXQgeW91IGNhbiBpbnRlcnByZXQgY29ycmVzcG9uZGluZyB0aGUgYmFyY29kZSBwbG90cy4KOjo6CgpJZiB0aGUgR1NFQSBhbmFseXNpcyBpcyB0YWtpbmcgdG9vIGxvbmcsIHBsZWFzZSB1c2UgdGhpcyBsaW5rIHRvIHZpZXcgc29tZSByZXN1bHRzIGZyb20gdGhlIHNhbWUgZGF0YXNldAoKLSBbUHJlLWdlbmVyYXRlZCBHU0VBIHJlc3VsdHNdKGh0dHBzOi8vd3d3LndlYmdlc3RhbHQub3JnL3Jlc3VsdHMvMTcwNzA1NDEyMy8jKQoKIyBBbHRlcm5hdGl2ZSB3ZWItc2l0ZXMKClRoZSBwZXJmb3JtYW5jZSBvZiBXZWJHZXN0YWx0IGNhbiBiZSBhIGJpdCB2YXJpYWJsZS4gSGVyZSBhcmUgYSBjb3VwbGUgb2Ygc3VnZ2VzdGlvbnMgZm9yIGFsdGVybmF0aXZlIHdlYnNpdGVzIHRoYXQgd29yayBpbiBhIHNpbWlsYXIgZmFzaGlvbiBhbmQgcmVxdWlyZSB0aGUgc2FtZSBkYXRhIGlucHV0CgotIFtTaGlueUdPXShodHRwOi8vYmlvaW5mb3JtYXRpY3Muc2RzdGF0ZS5lZHUvZ28vKSwgZm9yICoqT3Zlci1yZXByZXNlbnRhdGlvbiBhbmFseXNpcyoqIG9ubHkKLSBbR2VuZVRyYWlsXShodHRwczovL2dlbmV0cmFpbC5iaW9pbmYudW5pLXNiLmRlL2luZGV4P3BpcGVsaW5lPWdlbmUpLCBmb3IgYm90aCBPdmVyLXJlcHJlc2VudGF0aW9uIEFuYWx5c2lzIG9yIEdTRUEgZGVwZW5kaW5nIG9uIHR5cGUgb2YgaW5wdXQgZGF0YQoK