What is R?


After installing the software, open RStudio


Set the folder RStudio uses when not in a project

  • From “Preferences” set the default folder to your documents or other convenient folder.

  • I set mine to my Dropbox folder.

  • After you have set the folder, quit and reopen RStudio.


Make a “project” for this course


Click “New Directory” for your project


Select “New Project”


Give the project folder a name


Your desktop should look something like this


Set the “Project Options”


Set the three options to “Yes”


RStudio has four panes


Packages

install.packages("AER", "dynlm", "fGarch", "FinCal", "kableExtra", "MASS", "reshape2", "stargazer", "tidyquant", "tidyverse", "wesanderson", "xtable", dependencies = TRUE)

library(AER)


Where are my files?

getwd()

setwd("/Users/Clinton/Dropbox/syncd_r_data/econometrics")

Special HIDDEN R files in your working directory


Using the “.Rprofile” file to configure an R session

# Portfolio Management .Rprofile file

# Auto-load packages:
library(AER)
library(broom)
library(data.table)
library(dynlm)
library(fBasics)
library(fGarch)
library(FinCal)
library(ggplot2)
library(kableExtra)
library(magrittr)
library(MASS)
library(matrixStats)
library(quadprog)
library(quantmod)
library(RColorBrewer)
library(reshape2)
library(rmarkdown)
library(stargazer)
library(timeSeries)
library(tseries)
library(wesanderson)
library(xtable)
library(xts)
library(tidyquant)
library(tidyverse)

# Set some of R options:
options(prompt="R> ", scipen=999, digits=4, width=80)


Rmarkdown and Notebooks


Install TinyTeX using the package called tinytex

tinytex::install_tinytex()


Test your Rmarkdown environment


Information on Rmarkdown and TinyTeX


Resources for R


CRAN Task Views


Books on R


R-Bloggers


RStudio Keyboard Shortcuts (for Mac)


© Copyright Clinton Watkins 2021


References

Andrecut, M. 2010. Portfolio Optimization in R.” Cornell University, arXiv:1307.0450 [q-fin.PM]. https://doi.org/10.1201/b17178.
Bennett, Mark J., and Dirk L. Hugen. 2016. Financial analytics with R : building a laptop laboratory for data science. Cambridge University Press. https://op.lib.kobe-u.ac.jp/opac/opac_link/bibid/2002211471.
Cowpertwait, Paul S. P., and Andrew V. Metcalfe. 2009. Introductory Time Series with R. Springer. https://doi.org/10.1007/978-0-387-88698-5.
Kleiber, Christian, and Achim Zeileis. 2008. Applied Econometrics with R. 1st ed. New York: Springer US. https://doi.org/10.1007/978-0-387-77318-6.
Matloff, Norman. 2011. The Art of R Programming: A Tour of Statistical Software Design. No Starch Press. https://www.nostarch.com/artofr.htm.
Tsay, Ruey S. 2010. Analysis of financial time series. Wiley.
———. 2014. Multivariate time series analysis : with R and financial applications. Wiley.
Venables, W. N., D. M. Smith, and R Core Team. 2019. An Introduction to R.” https://doi.org/10.1201/9781420035025.ch1.
LS0tCnRpdGxlOiAiUG9ydGZvbGlvIE1hbmFnZW1lbnQgW0VDTjM0N10iCnN1YnRpdGxlOiAiQSBHdWlkZSB0byBTZXR0aW5nLXVwIFIgYW5kIFJTdHVkaW8iCmF1dGhvcjogPGJyPiBDbGludG9uIFdhdGtpbnMKb3V0cHV0OiBodG1sX25vdGVib29rCmJpYmxpb2dyYXBoeTogLi4vLi4vLi4vLi4vLi4vLi4vYmlidGV4L1BvcnRmb2xpb01hbmFnZW1lbnQuYmliCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KaDEudGl0bGUgewogIGZvbnQtc2l6ZTogMjRwdDsKICBjb2xvcjogZGFya2JsdWU7Cn0KCmgzLnN1YnRpdGxlIHsKICBmb250LXNpemU6IDI0cHQ7CiAgY29sb3I6IGRhcmtibHVlOwp9CgpoMiB7CiAgZm9udC1zaXplOiAxOHB0Owp9Cgpib2R5LCB0ZCB7CiAgIGZvbnQtc2l6ZTogMTFwdDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiA5cHQ7Cn0KcHJlIHsKICBmb250LXNpemU6IDlwdAp9Cjwvc3R5bGU+CgpgYGB7ciwgaW5jbHVkZT1GfQpybShsaXN0ID0gbHMoKSkKYGBgCgo8YnI+CgotLS0tCgojIyBXaGF0IGlzIFI/Cgo8cD4KCi0gX19SX18gaXMgYW4gb3BlbnNvdXJjZSBwb3dlcmZ1bCBwcm9ncmFtbWluZyBsYW5ndWFnZSBzdWl0ZWQgdG8gbWF0aGVtYXRpY2FsIGFuZCBzdGF0aXN0aWNhbCBjb21wdXRpbmcsIGFuYWx5c2lzIGFuZCBncmFwaGljcy4gCgogICAgLSBEb3dubG9hZCBSIGZyb20gaGVyZTogaHR0cHM6Ly93d3cuci1wcm9qZWN0Lm9yZy8gCiAgICAKPHA+CgotIF9fUlN0dWRpb19fIHByb3ZpZGVzIGEgY29udmVuaWVudCBpbnRlcmZhY2UgZm9yIHVzaW5nIFIuIEJvdGggUiBhbmQgUlN0dWRpbyBhcmUgZnJlZS4KCiAgICAtIERvd25sb2FkIFJTdHVkaW8gKGZyZWUgRGVza3RvcCBPcGVuIFNvdXJjZSBFZGl0aW9uKSBmcm9tIGhlcmU6IGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tLyAgCiAgICAtIF9fUlN0dWRpbyBDbG91ZF9fIHByb3ZpZGVzIFIgYW5kIFJTdHVkaW8gdmlhIGEgd2ViIGJyb3dzZXIuIFlvdSBjYW4gbWFrZSBhIGZyZWUgYWNjb3VudCBidXQgdGhlIGFtb3VudCBvZiB0aW1lIHlvdSBjYW4gdXNlIHRoZSBzZXJ2aWNlIGZvciBmcmVlIGlzIGxpbWl0ZWQuIFRoaXMgbWF5IGJlIGEgZ29vZCBvcHRpb24gaWYgeW91IGhhdmUgZGlmZmljdWx0aWVzIHNldHRpbmcgdXAgdGhlIHNvZnR3YXJlIG9uIHlvdXIgb3duIGNvbXB1dGVyLiBSZW1lbWJlciB0byBjb3B5IGFueSBmaWxlcyB5b3UgbWFrZSBmcm9tIFJTdHVkaW8gQ2xvdWQgdG8geW91ciBvd24gY29tcHV0ZXIgc28gdGhhdCB5b3UgZG8gbm90IHJpc2sgbG9zaW5nIHlvdXIgd29yay4gUlN0dWRpbyBDbG91ZCBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9yc3R1ZGlvLmNsb3VkLwoKPHA+CgotIFdlIHdpbGwgdXNlIFIgdmlhIFJTdHVkaW8gaW4gdGhpcyBjb3Vyc2UgdG8gYW5hbHlzZSBzZWN1cml0aWVzIHJpc2sgYW5kIHJldHVybnMsIGFuZCBjb25zdHJ1Y3QgYW5kIHBvcnRmb2xpb3MuCgo8IS0tIFlvdSBhcmUgd2VsY29tZSB0byBicmluZyB5b3VyIG93biBub3RlYm9vayBjb21wdXRlciB0byB0aGUgbGFiIHNlc3Npb25zIGlmIHlvdSB3aXNoLiBZb3Ugd2lsbCBiZWVuIHRvIGNvbm5lY3QgdG8gdGhlIGludGVybmV0LiAtLT4KCi0tLS0KCiMjIEFmdGVyIGluc3RhbGxpbmcgdGhlIHNvZnR3YXJlLCBvcGVuIFJTdHVkaW8KCjxwPgoKLSBJdCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzLgoKPHA+CgohW10oYXNzZXRzL3AxLnBuZykKCi0tLS0KCiMjIyBTZXQgdGhlIGZvbGRlciBSU3R1ZGlvIHVzZXMgd2hlbiBub3QgaW4gYSBwcm9qZWN0Cgo8cD4KCi0gRnJvbSAiUHJlZmVyZW5jZXMiIHNldCB0aGUgZGVmYXVsdCBmb2xkZXIgdG8geW91ciBkb2N1bWVudHMgb3Igb3RoZXIgY29udmVuaWVudCBmb2xkZXIuIAoKLSBJIHNldCBtaW5lIHRvIG15IERyb3Bib3ggZm9sZGVyLgoKLSBBZnRlciB5b3UgaGF2ZSBzZXQgdGhlIGZvbGRlciwgcXVpdCBhbmQgcmVvcGVuIFJTdHVkaW8uCgo8cD4KCiFbXShhc3NldHMvcDIucG5nKQoKLS0tLQoKIyMgTWFrZSBhICJwcm9qZWN0IiBmb3IgdGhpcyBjb3Vyc2UKCjxwPgoKLSBBIHByb2plY3QgaXMgYSBmb2xkZXIgd2hlcmUgeW91IGNhbiBrZWVwIGRhdGEsIGNvZGUgYW5kIGRvY3VtZW50cyB0b2dldGhlci4KCi0gWW91IGNhbiBoYXZlIHNldmVyYWwgZGlmZmVyZW50IHByb2plY3RzIGFuZCBzZXQgUiB0byBzdGFydCB1cCBkaWZmZXJlbnRseSBmb3IgZWFjaCBwcm9qZWN0LiBQcm9qZWN0cyBhbGxvdyB5b3UgdG8ga2VlcCB5b3VyIGZpbGVzIG9yZ2FuaXNlZCwgYW5kIGxldCB5b3UgY3VzdG9taXNlIGhvdyBSIHdvcmtzLiAKCi0gSWYgeW91IHVzZSBSIGZvciBvdGhlciBjbGFzc2VzLCB5b3VyIHNlbWluYXIgb3Igb3RoZXIgcHVycG9zZXMsIHlvdSBjYW4gY3JlYXRlIG90aGVyIHByb2plY3RzIGZvciB0aG9zZS4gCgotIEVhY2ggcHJvamVjdCB3aWxsIGhhdmUgYSBzZXBhcmF0ZSBmb2xkZXIgYW5kIGZpbGVzIHRvIHNhdmUgdGhlIGRhdGEgaW4geW91ciBlbnZpcm9ubWVudCwgeW91ciBoaXN0b3J5IG9mIGNvZGUgZXhlY3V0ZWQgaW4gdGhlIGNvbnNvbGUsIGFuZCB0aGUgd2F5IHlvdSBoYXZlIFIgY29uZmlndXJlZC4KCi0gTWFrZSBhIG5ldyBwcm9qZWN0IGZyb20gdGhlIFByb2plY3RzIG1lbnUgYXQgdGhlIHRvcC1yaWdodCBvZiB0aGUgc2NyZWVuLgoKPHA+CgohW10oYXNzZXRzL3AzLnBuZykKCi0tLS0KCiMjIENsaWNrICJOZXcgRGlyZWN0b3J5IiBmb3IgeW91ciBwcm9qZWN0Cgo8cD4KCiFbXShhc3NldHMvcDQucG5nKQoKLS0tLQoKIyMgU2VsZWN0ICJOZXcgUHJvamVjdCIKCjxwPgoKIVtdKGFzc2V0cy9wNS5wbmcpCgotLS0tCgojIyBHaXZlIHRoZSBwcm9qZWN0IGZvbGRlciBhIG5hbWUKCjxwPgoKLSBJIHVzZSB0aGUgbmFtZSAicG9ydGZvbGlvbW5ndCIuCgotIENsaWNrICJDcmVhdGUgUHJvamVjdCIuCgo8cD4KCiFbXShhc3NldHMvcDYucG5nKQoKLS0tLQoKIyMgWW91ciBkZXNrdG9wIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMKCjxwPgoKIVtdKGFzc2V0cy9wNy5wbmcpCgo8IS0tIDxicj4gLS0+Cgo8IS0tIC0gVXNlIHRoZSBmb2xsb3dpbmcgY29kZSB0byBjaGVjayB0aGF0IHlvdXIgUiBzZXNzaW9uIGlzIG9wZXJhdGluZyBpbiB5b3VyIHByb2plY3QgZm9sZGVyLiAtLT4KCjwhLS0gPHA+IC0tPgoKPCEtLSBgYGB7ciwgZXZhbD1GQUxTRX0gLS0+CjwhLS0gZ2V0d2QoKSAtLT4KPCEtLSBgYGAgLS0+CgotLS0tCgojIyBTZXQgdGhlICJQcm9qZWN0IE9wdGlvbnMiCgo8cD4KCi0gRmluZCB0aGUgIlByb2plY3QgT3B0aW9ucyIgZnJvbSB0aGUgcHJvamVjdCBtZW51IGF0IHRoZSB0b3AtcmlnaHQgb2YgeW91ciBzY3JlZW4uCgo8cD4KCiFbXShhc3NldHMvcDgucG5nKQoKLS0tLQoKIyMgU2V0IHRoZSB0aHJlZSBvcHRpb25zIHRvICJZZXMiCgo8cD4KCi0gVGhpcyBtZWFucyB5b3VyIGRhdGEgYW5kIGhpc3Rvcnkgb2YgY29tbWFuZHMgd2lsbCBiZSBzYXZlZCBxdWVuIHlvdSBxdWl0IGFuZCByZXN0b3JlZCB3aGVuIHlvdSBvcGVuIHlvdXIgcHJvamVjdCB0aGUgbmV4dCB0aW1lLgoKPHA+CgohW10oYXNzZXRzL3A5LnBuZykKCi0tLS0KCiMjIFJTdHVkaW8gaGFzIGZvdXIgcGFuZXMKCjxwPgoKIVtdKGFzc2V0cy9wMTAucG5nKQoKPHA+CgotIFBhbmUgMSBpcyB0aGUgc291cmNlIHBhbmUgd2hlcmUgeW91IGNhbiBvcGVuIGFuZCB3b3JrIG9uIHZhcmlvdXMgdHlwZXMgb2YgY29kZSBmaWxlcyBvciBkb2N1bWVudHMuIFlvdSBhbHNvIGRpc3BsYXkgb2JqZWN0cyBpbiB0aGUgc291cmNlIHBhbmUuIAoKICAgIC0gUiBpcyBhbiBvYmplY3Qgb3JpZW50ZWQgbGFuZ3VhZ2Ugd2hpY2ggbWVhbnMgZXZlcnl0aGluZyBpcyBhbiBvYmplY3Qgd2l0aCBjZXJ0YWluIGF0dHJpYnV0ZXMsIGUuZy4gYSBtYXRyaXggb2YgZGF0YSBvciBhIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyBkYXRhLgogICAgCiAgICAtIE9iamVjdHMgY2FuIGludGVyYWN0IHdpdGggZWFjaCBvdGhlciB0byBjaGFuZ2UgdGhlaXIgYXR0cmlidXRlcywgb3IgY3JlYXRlIG90aGVyIG9iamVjdHMuCiAgICAKICAgIC0gU29tZSBpbXBvcnRhbnQgdHlwZXMgb2Ygb2JqZWN0cyBhcmU6IHZlY3RvcnMsIGxpc3RzLCBhcnJheXMsIG1hdHJpY2VzLCB0YWJsZXMsIGRhdGEgZnJhbWVzLCBmdW5jdGlvbnMuCgo8cD4KCi0gUGFuZSAyIGlzIHRoZSBjb25zb2xlIHdoZXJlIHlvdSBjYW4gZW50ZXIgYW5kIGV4ZWN1dGUgY29kZS4KCi0gUGFuZSAzIGNvbnRhaW5zIHRoZSBlbnZpcm9ubWVudCBhbmQgaGlzdG9yeSB0YWJzLiBUaGUgZW52aXJvbm1lbnQgc2hvd3MgYWxsIG9iamVjdHMgdGhhdCBhcmUgbG9hZGVkIGZvciB1c2UgKGl0IGlzIGVtcHR5IG5vdykuIFRoZSBoaXN0b3J5IHRhYiBzaG93cyB0aGUgY29kZSB5b3UgaGF2ZSBleGVjdXRlZCBpbiB0aGUgY29uc29sZS4gCgotIFBhbmUgNCBjb250YWlucyBhIG51bWJlciBvZiB0YWJzIHNob3dpbmcgeW91ciBmb2xkZXJzIGFuZCBmaWxlcywgcGxvdHMgeW91IGhhdmUgZHJhd24sIHBhY2thZ2VzLCBhIGhlbHAgd2luZG93LgoKLS0tLQoKIyMgUGFja2FnZXMKCjxwPgoKIVtdKGFzc2V0cy9wMTEucG5nKQoKPHA+CgotIFBhY2thZ2VzIGV4dGVuZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBSLgoKLSBQYWNrYWdlcyBjb250YWluIGZ1bmN0aW9ucywgZGF0YSBhbmQgb3RoZXIgb2JqZWN0cy4gVGhleSBhcmUgZGVzaWduZWQgdG8gcGVyZm9ybSBjZXJ0YWluIHR5cGVzIG9mIGRhdGEgbWFuaXB1bGF0aW9uLCBhbmFseXNpcywgZXN0aW1hdGlvbiwgdmlzdWFsaXNhdGlvbiwgb3B0aW1pc2F0aW9uLCBkb2N1bWVudCBjcmVhdGlvbiwgZXRjLiAKCi0gU29tZSBwYWNrYWdlcyBhcmUgcGFydCBvZiB0aGUgZGVmYXVsdCBSIGluc3RhbGxhdGlvbiwgY2FsbGVkICJCYXNlIFIiLCBhbmQgdGhlcmUgYXJlIGEgaHVnZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYWNrYWdlcyBhdmFpbGFibGUgdGhhdCBhbGxvdyB5b3UgdG8gZG8gYWxtb3N0IGFueXRoaW5nIHdpdGggUi4KCi0gV2Ugd2lsbCB1c2Ugc2V2ZXJhbCBwYWNrYWdlcyBpbiB0aGlzIGNvdXJzZS4KCi0gVGhlcmUgYXJlIHR3byBzdGVwcyB0byB1c2luZyBhIHBhY2thZ2UuCgogICAgMS4gSW5zdGFsbCB0aGUgcGFja2FnZS4gVGhpcyBkb3dubG9hZHMgdGhlIGxhdGVzdCB2ZXJzb24gb2YgdGhlIHBhY2thZ2UgZnJvbSBhbiBSIHJlcG9zaXRvcnkgYW5kIHNhdmVzIGl0IG9uIHlvdXIgY29tcHV0ZXIuCgogICAgMi4gTG9hZCBhIHBhY2thZ2UgZm9yIHVzZS4gV2hlbiB5b3Ugd2FudCB0byB1c2UgYSBwYWNrYWdlIHlvdSBtdXN0IGxvYWQgaXQgZmlyc3Qgd2l0aCB0aGUgbGlicmFyeSBjb21tYW5kLiAKCjxwPgoKLSBUbyBpbnN0YWxsIGEgcGFja2FnZSwgY2xpY2sgdGhlIGluc3RhbGwgYnV0dG9uLCB0eXBlIGluIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGFuZCBoaXQgaW5zdGFsbC4KCi0gSW5zdGFsbCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOiBBRVIsIGR5bmxtLCBmR2FyY2gsIEZpbkNhbCwga2FibGVFeHRyYSwgTUFTUywgcmVzaGFwZTIsIHN0YXJnYXplciwgdGlkeXF1YW50LCB0aWR5dmVyc2UsIHdlc2FuZGVyc29uLCB4dGFibGUuCgogICAgLSBOb3RlIHRoYXQgUiBpcyBjYXNlLXNlbnNpdGl2ZSwgdGh1cyB1cHBlci0gYW5kIGxvd2VyLWNhc2UgbGV0dGVycyBhcmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgZGlmZmVyZW50LgoKPHA+CgohW10oYXNzZXRzL3AxMi5wbmcpCgo8cD4KCi0gQWx0ZXJuYXRpdmVseSwgaW5zdGFsbCB0aGUgcGFja2FnZXMgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nIGNvZGUgaW4gdGhlIGNvbnNvbGUuCgo8cD4KCmBgYHtyLCBldmFsPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzKCJBRVIiLCAiZHlubG0iLCAiZkdhcmNoIiwgIkZpbkNhbCIsICJrYWJsZUV4dHJhIiwgIk1BU1MiLCAicmVzaGFwZTIiLCAic3RhcmdhemVyIiwgInRpZHlxdWFudCIsICJ0aWR5dmVyc2UiLCAid2VzYW5kZXJzb24iLCAieHRhYmxlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKYGBgCgo8cD4KCi0gSW5zdGFsbGF0aW9uIG9mIHBhY2thZ2VzIHdpbGwgdGFrZSBzb21lIHRpbWUuIE91ciBsaXN0IG9mIHBhY2thZ2VzIHdpbGwgcmVxdWlyZSBzZXZlcmFsIGFkZGl0aW9uYWwgcGFja2FnZXMsIGNhbGxlZGUgZGVwZW5kZW5jaWVzLCB0byBiZSBkb3dubG9hZGVkLgoKICAgIC0gSWYgeW91IGFyZSBhc2tlZCBfIkRvIHlvdSB3YW50IHRvIGluc3RhbGwgZnJvbSBzb3VyY2VzIHRoZSBwYWNrYWdlcyB3aGljaCBuZWVkIGNvbXBpbGF0aW9uPyAoWWVzL25vL2NhbmNlbCkiXyBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24sIHlvdSBjYW4gYW5zd2VyICJuIi4KCiAgICAtIElmIGFuIGluc3RhbGxhdGlvbiByZXN1bHRzIGluIGEgbWVzc2FnZSBsaWtlIF8iSW5zdGFsbGF0aW9uIG9mIHBhY2thZ2UgWCBoYWQgbm9uLXplcm8gZXhpdCBzdGF0dXMiXyB0aGUgcGFja2FnZSB3YXMgbm90IGluc3RhbGxlZC4gVHJ5IGFnYWluLiBJZiB5b3Ugc3RpbGwgaGF2ZSBhIHByb2JsZW0sIGNvbnRhY3QgbWUuCiAgICAKICAgIC0gQSBtZXNzYWdlIGxpa2UgXyJUaGUgZG93bmxvYWRlZCBzb3VyY2UgcGFja2FnZXMgYXJlIGluICdmb2xkZXIgbG9jYXRpb24nIl8gbWVhbnMgdGhlIHBhY2thZ2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4KICAgIAo8cD4KCi0gUGFja2FnZXMgbmVlZCBvbmx5IGJlIGluc3RhbGxlZCBvbiB5b3VyIGNvbXB1dGVyIG9uY2UsIGJ1dCB0aGV5IHNob3VsZCBiZSB1cGRhdGVkIGZyb20gdGltZSB0byB0aW1lLiAKCi0gV2hlbiB5b3Ugd2lzaCB0byB1c2UgYSBwYWNrYWdlLCBpdCBtdXN0IGJlIGxvYWRlZCB1c2luZyB0aGUgbGlicmFyeSBjb21tYW5kLiBGb3IgZXhhbXBsZSwgdG8gbG9hZCB0aGUgQUVSIHBhY2thZ2U6Cgo8cD4KCmBgYHtyLCBldmFsPUZBTFNFfQpsaWJyYXJ5KEFFUikKYGBgCgo8cD4KCi0gQW5vdGhlciB3YXkgdG8gbG9hZCBhIHBhY2thZ2UgaXMgdG8gdGljayB0aGUgYm94IG5leHQgdG8gdGhlIHBhY2thZ2UgaW4gdGhlIFBhY2thZ2VzIHRhYi4gVGhlIHBhY2thZ2VzIHRhYiBzaG93cyB5b3UgYWxsIHBhY2thZ2VzIHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkLgoKPHA+CgohW10oYXNzZXRzL3AxMy5wbmcpCgo8cD4KCi0gSWYgeW91IGdldCBhbiBlcnJvciBzYXlpbmcgUiBjYW5ub3QgZmluZCBhIGZ1bmN0aW9uIHdoZW4geW91IGFyZSB0cnlpbmcgdG8gZXhlY3V0ZSBjb2RlLCBpdCBpcyBhbG1vc3QgYWx3YXlzIGJlY2F1c2UgeW91IGhhdmUgZWl0aGVyIGEpIF9fbm90IGxvYWRlZCB0aGUgcGFja2FnZV9fIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uLCBvciBiKSBfX21pc3R5cGVkIHRoZSBmdW5jdGlvbl9fLgoKLS0tLQoKIyMgV2hlcmUgYXJlIG15IGZpbGVzPwoKPHA+CgotIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyB3aGVyZSBSIHdpbGwgbG9vayBmb3IgeW91ciBmaWxlcyBhbmQgc2F2ZSBmaWxlcy4KCi0gU2hvdyB5b3VyIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6Cgo8cD4KCmBgYHtyLCBldmFsPUZBTFNFfQpnZXR3ZCgpCmBgYAogCiA8cD4KIAotIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyBzZXQgYnkgeW91ciBwcm9qZWN0LgogCi0gSWYgeW91IHdhbnQgdG8gY2hhbmdlIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdGVtcG9yYXJpbHkgeW91IGNhbiBzZXQgaXQgdG8gYW5vdGhlciBwYXRoLiBIZXJlIGlzIGFuIGV4YW1wbGUgZm9yIG15IGZvbGRlcnM6CgpgYGB7cixldmFsPUZBTFNFfQpzZXR3ZCgiL1VzZXJzL0NsaW50b24vRHJvcGJveC9zeW5jZF9yX2RhdGEvZWNvbm9tZXRyaWNzIikKYGBgCgotIElmIHlvdSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGEgZm9sZGVyIG9uIGEgbmV0d29yayBkcml2ZSBvciBvbiB0aGUgY2xvdWQgKGxpa2UgRHJvcGJveCBvciBHb29nbGUgRHJpdmUpIHRoYXQgaXMgc3luY2VkIHRvIHlvdXIgY29tcHV0ZXIncyBoYXJkIGRyaXZlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSBpdCB3aXRoIFJTdHVkaW8gb24gbXVsdGlwbGUgY29tcHV0ZXJzLgoKLS0tLSAgCgojIyBTcGVjaWFsIEhJRERFTiBSIGZpbGVzIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgIAoKPHA+CgotIFJTdHVkaW8gdXNlcyB0aHJlZSBpbXBvcnRhbnQgaGlkZGVuIGZpbGVzLiBZb3UgY2FuIHNlZSB0aGVtIGluIHRoZSBSU3R1ZGlvIGZpbGVzIHBhbmUgYnV0IHVzdWFsbHkgbm90IGluIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KCiAgICAtIF9fLlJEYXRhX18gaG9sZHMgdGhlIG9iamVjdHMgdGhhdCBhcmUgbG9hZGVkIGluIHlvdXIgZW52aXJvbm1lbnQuCgogICAgLSBfXy5SSGlzdG9yeV9fIGhvbGRzIHRoZSBoaXN0b3J5IG9mIHRoZSBjb2RlIHlvdSBoYXZlIGV4ZWN1dGVkIGluIHRoZSBjb25zb2xlLgoKICAgIC0gX18uUnByb2ZpbGVfXyBob2xkcyBzcGVjaWZpYyBzZXQtdXAgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0IHlvdSBhcmUgd29ya2luZyBpbi4KCjxwPgoKLSBIZXJlIGFyZSB0aGUgaGlkZGVuIGZpbGVzIGluIG15IHdvcmtpbmcgZGlyZWN0b3J5IHNob3duIGluIHJlZCBhbmQgdGhlIHByb2plY3QgZmlsZSB3aGljaCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBteSBwcm9qZWN0IGluIGJsdWUuOgoKPHA+CgohW10oYXNzZXRzL3AxNC5wbmcpCgotLS0tCgojIyBVc2luZyB0aGUgIi5ScHJvZmlsZSIgZmlsZSB0byBjb25maWd1cmUgYW4gUiBzZXNzaW9uCgo8cD4KCi0gVGhlIC5ScHJvZmlsZSBmaWxlIGV4ZWN1dGVzIGNvZGUgYXMgUiBzdGFydHMgdXAuIFlvdSBjYW4gdXNlIHRoaXMgZmlsZSB0byBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIHBhY2thZ2VzIHlvdSB3aWxsIG5lZWQgdG8gdXNlIGZvciB0aGlzIGNvdXJzZSBhbmQgdG8gc2V0IHNvbWUgUiBvcHRpb25zLiBUaHVzIC5ScHJvZmlsZSBhbGxvd3MgeW91IHRvIGN1c3RvbWlzZSB0aGUgc3RhcnQtdXAgb2YgUi4KCiAgICAtIFJlbWVtYmVyIHRoYXQgdGhlIHBhY2thZ2VzIG11c3QgYWxyZWFkeSBiZSBpbnN0YWxsZWQgb24geW91ciBjb21wdXRlciB0byBiZSBsb2FkZWQgYnkgdGhlIC5ScHJvZmlsZSBmaWxlLgogICAgCjxwPgoKLSBIZXJlIGlzIHRoZSBjb2RlIHlvdSB3aWxsIG5lZWQgaW4geW91ciAuUnByb2ZpbGUgZmlsZSBmb3IgdGhpcyBjb3Vyc2UuCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBQb3J0Zm9saW8gTWFuYWdlbWVudCAuUnByb2ZpbGUgZmlsZQoKIyBBdXRvLWxvYWQgcGFja2FnZXM6CmxpYnJhcnkoQUVSKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZHlubG0pCmxpYnJhcnkoZkJhc2ljcykKbGlicmFyeShmR2FyY2gpCmxpYnJhcnkoRmluQ2FsKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShNQVNTKQpsaWJyYXJ5KG1hdHJpeFN0YXRzKQpsaWJyYXJ5KHF1YWRwcm9nKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KHRpbWVTZXJpZXMpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeSh3ZXNhbmRlcnNvbikKbGlicmFyeSh4dGFibGUpCmxpYnJhcnkoeHRzKQpsaWJyYXJ5KHRpZHlxdWFudCkKbGlicmFyeSh0aWR5dmVyc2UpCgojIFNldCBzb21lIG9mIFIgb3B0aW9uczoKb3B0aW9ucyhwcm9tcHQ9IlI+ICIsIHNjaXBlbj05OTksIGRpZ2l0cz00LCB3aWR0aD04MCkKYGBgCgo8cD4KCi0gVG8gbWFrZSB5b3VyIC5ScHJvZmlsZSBmaWxlLCBmb2xsb3cgdGhlc2Ugc3RlcHMuCgotIENyZWF0ZSBhIG5ldyBSIFNjcmlwdCBmaWxlLgogICAgCjxwPgoKIVtdKGFzc2V0cy9wMTUucG5nKQoKPHA+CgotIFlvdXIgUiBTY3JpcHQgZmlsZSBpcyBzaG93biBiZWxvdy4gQW4gUiBTY3JpcHQgZmlsZSBpcyBhIHRleHQgZmlsZSB0aGF0IHlvdSBjYW4gc2F2ZSBjb2RlIGluLgoKPHA+CgohW10oYXNzZXRzL3AxNi5wbmcpCgo8cD4KCi0gQ29weSBhbGwgb2YgdGhlIGNvZGUgZnJvbSB0aGUgUG9ydGZvbGlvIE1hbmFnZW1lbnQgLlJwcm9maWxlIGZpbGUgYWJvdmUgYW5kIHBhc3RlIGl0IGludG8geW91ciBSIFNjcmlwdCBmaWxlLiAKCjxwPgoKIVtdKGFzc2V0cy9wMTcucG5nKQoKPHA+CgotIFNhdmUgdGhlIFIgU2NyaXB0IGZpbGUgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeSAoeW91ciBwcm9qZWN0IGRpcmVjdG9yeSkuIFRoZSBmaWxlIG5hbWUgZG9lcyBub3QgbWF0dGVyIGZvciBub3cuCgo8cD4KCiFbXShhc3NldHMvcDE4LnBuZykKPHA+CgohW10oYXNzZXRzL3AxOS5wbmcpCgo8cD4KCi0gUmVuYW1lIHRoZSBmaWxlIGFzICIuUnByb2ZpbGUiLgoKPHA+CgohW10oYXNzZXRzL3AyMC5wbmcpCjxwPgoKIVtdKGFzc2V0cy9wMjEucG5nKQo8cD4KCi0gWW91IHNob3VsZCBub3cgaGF2ZSB5b3VyIC5ScHJvZmlsZSBmaWxlIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuIElmIHlvdSByZXN0YXJ0IFJTdHVkaW8sIHlvdXIgcGFja2FnZXMgc2hvdWxkIGxvYWQgYXV0b21hdGljYWxseS4KCi0gWW91IG1heSBlZGl0IHRoZSAuUnByb2ZpbGUgZmlsZSB0byBhZGQgbGlicmFyeSBjb21tYW5kcyBmb3IgYWRkaXRpb25hbCBwYWNrYWdlcyB5b3UgbWlnaHQgd2FudCB0byBsb2FkIHdoZW4gUiBzdGFydHMgdXAuCgotLS0tCgojIyBSbWFya2Rvd24gYW5kIE5vdGVib29rcwoKPHA+CgotIF9fUm1hcmtkb3duX18gYWxsb3dzIGR5bmFtaWMgZG9jdW1lbnRzIHRvIGJlIGNyZWF0ZWQgaW4gUiB0aGF0IGNvbnRhaW4gd3JpdHRlbiB0ZXh0LCBSIGNvZGUgYW5kIG91dHB1dCBmcm9tIHRoZSBjb2RlLiAKCi0gSSB3aWxsIGFzayB5b3UgdG8gZG8gc29tZSBhc3NpZ25tZW50cyBpbiBhbiBSIE5vdGVib29rIHVzaW5nIG1hcmtkb3duLiAKCiAgICAtIFRoaXMgZ3VpZGUgZm9yIHNldHRpbmctdXAgUiBhbmQgUlN0dWRpbyB3YXMgbWFkZSBpbiBhbiBSIE5vdGVib29rLiBJZiB5b3UgbG9vayBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHlvdSBjYW4gc2VlIGEgYnV0dG9uIGxhYmVsbGVkICJDb2RlIiB3aGljaCBhbG93cyB5b3UgdG8gZG93bmxvYWQgdGhlIGNvZGUgSSB1c2VkIHRvIG1ha2UgdGhpcyBIVE1MIGZpbGUuCiAgICAKPHA+CgotIEEgbWFya2Rvd24gZG9jdW1lbnQgaXMgd3JpdHRlbiBpbiB1c2luZyBjb2RpbmcgY2FsbGVkIG1hcmtkb3duLCB3aGljaCBpcyBhbiBlYXN5LXRvLXdyaXRlIHBsYWluIHRleHQgZm9ybWF0IHRoYXQgaXMgcmVsYXRlZCB0byBUZVggKG9yIExhVGVYKS4KCi0gQSBUZVggaW5zdGFsbGF0aW9uIGlzIHJlcXVpcmVkIHRvIHVzZSBSbWFya2Rvd24sIHN1Y2ggYXMgTWFjVGV4IChmb3IgTWFjIE9TKSBodHRwOi8vd3d3LnR1Zy5vcmcvbWFjdGV4LyBvciBNaUtUZVggKGNyb3NzLXBsYXRmb3JtKSBodHRwczovL21pa3RleC5vcmcvZG93bmxvYWQuIElmIHlvdSB1c2UgTGFUZVggdG8gd3JpdGUgZG9jdW1lbnRzLCB5b3Ugd2lsbCBhbHJlYWR5IGhhdmUgdGhpcy4gSWYgbm90LCB0aGUgZWFzaWVzdCB3YXkgdG8gZ2V0IGEgVGVYIGluc3RhbGxhdGlvbiBmb3IgbWFya2Rvd24gaXMgdmlhIHRoZSBUaW55VGVYIHBhY2thZ2UuCgotLS0tCgojIyBJbnN0YWxsIFRpbnlUZVggdXNpbmcgdGhlIHBhY2thZ2UgY2FsbGVkIHRpbnl0ZXgKCjxwPgoKLSBZb3UgaGF2ZSBhbHJlYWR5IGluc3RhbGxlZCB0aGUgcGFja2FnZSBjYWxsZWQgdGlueXRleC4gRXhlY3V0aW5nIHRoZSBjb2RlIGJlbG93IGluIHRoZSBjb25zb2xlIHdpbGwgZG93bmxvYWQgdGhlIFRpbnlUZVggZmlsZXMgZnJvbSB0aGUgaW50ZXJuZXQgYW5kIGluc3RhbGwgdGhlbSBvbiB5b3VyIGNvbXB1dGVyIHNvIHRoYXQgeW91IGNhbiBtYWtlIG1hcmtkb3duIGRvY3VtZW50cy4gCgo8cD4KCmBgYHtyLCBldmFsPUYsIG1lc3NhZ2U9RkFMU0V9CnRpbnl0ZXg6Omluc3RhbGxfdGlueXRleCgpCmBgYAoKPHA+CgotIFRoaXMgd2lsbCB0YWtlIHNvbWUgdGltZSB0byBkb3dubG9hZC4KCi0gTm90ZSB0aGF0IHlvdSBkbyBub3QgbmVlZCB0byBkbyB0aGlzIGlmIHlvdSB1c2UgUlN0dWRpbyBDbG91ZCBhcyBUaW55VGVYIGlzIHByZS1pbnN0YWxsZWQuCgotIFdoZW4gdGhlIGluc3RhbGxhdGlvbiBoYXMgZmluaXNoZWQsIHJlc3RhcnQgUlN0dWRpby4KCi0tLS0KCiMjIFRlc3QgeW91ciBSbWFya2Rvd24gZW52aXJvbm1lbnQKCi0gUnVuIHRocm91Z2ggYSBzaW1wbGUgdGVzdCB0byBzZWUgaWYgeW91IGNhbiBtYWtlIGFuIFIgTm90ZWJvb2ssIGFzIGZvbGxvd3MuCgotIE9wZW4gYSBuZXcgUiBOb3RlYm9vay4KCjxwPgoKIVtdKGFzc2V0cy9wMjIucG5nKQoKPHA+CgotIFRoZSBub3RlYm9vayBhbHJlYWR5IGNvbnRhaW5zIGV4YW1wbGUgdGV4dCBhbmQgUiBjb2RlIHRoYXQgcGxvdHMgYSBzaW1wbGUgY2hhcnQuCgo8cD4KCiFbXShhc3NldHMvcDIzLnBuZykKCjxwPgoKLSBSdW4gdGhlIGNvZGUgYnkgcHJlc3NpbmcgIlJ1biBBbGwiIGZyb20gdGhlICJSdW4iIG1lbnUuCgo8cD4KCiFbXShhc3NldHMvcDI0LnBuZykKCjxwPgoKLSBBZnRlciB5b3UgaGF2ZSBydW4gdGhlIGNvZGUsIHlvdSAgc2hvdWxkIHNlZSB0aGUgcGxvdCBhcHBlYXIuCgotIEluY2x1ZGUgeW91ciBuYW1lIGFzIEkgaGF2ZSBhdCB0aGUgdG9wIG9mIHRoZSBOb3RlYm9vay4KCjxwPgoKIVtdKGFzc2V0cy9wMjUucG5nKQoKPHA+CgotIFNhdmUgdGhlIGZpbGUgdG8geW91ciB3b3JraW5nIGRpcmVjdG9yeS4gCgo8cD4KCiFbXShhc3NldHMvcDI2LnBuZykKCjxwPgoKLSBZb3Ugc2hvdWxkIHNlZSB0d28gZmlsZXMgYXBwZWFyLiAKCiAgICAtIFlvdXIgY29kZSBpcyBpbiB0aGUgZmlsZSB3aXRoIHRoZSBleHRlbnNpb24gIi5SbWQiLgogICAgCiAgICAtIFlvdXIgSFRNTCBSIE5vdGVib29rIGhhcyB0aGUgZXh0ZW5zaW9uICIubmIuaHRtbCIuIAogICAgCiAgICA8cD4KCiFbXShhc3NldHMvcDI3LnBuZykKCjxwPgoKLSBPcGVuIHRoZSBIVE1MIGZpbGUgd2l0aCB5b3VyIGJyb3dzZXIuIEl0IHNob3VsZCBsb29rIGxpa2UgdGhpczoKCjxwPgoKIVtdKGFzc2V0cy9wMjgucG5nKQoKPHA+CgotIFdlbGwgZG9uZSEgWW91IGhhdmUgY3JlYXRlZCBhIE5vdGVib29rLgoKLS0tLQoKIyMgSW5mb3JtYXRpb24gb24gUm1hcmtkb3duIGFuZCBUaW55VGVYCgotIEluZm9ybWF0aW9uIG9uIFJtYXJrZG93biBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vIGFuZCBhIHVzZWZ1bCBndWlkZSBpcyBhdCBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vIGFuZCBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2svIGFuZCBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vLiBFYXN5IGFuZCBoZWxwZnVsIHZpZGVvIGxlc3NvbnMgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tL2xlc3Nvbi0xLmh0bWwuCgotIFJlZmVyZW5jZSBtYXRlcmlhbCBmb3IgVGlueVRlWCBpcyBhdCBodHRwczovL3lpaHVpLm5hbWUvdGlueXRleC8uCgotLS0tCgojIyBSZXNvdXJjZXMgZm9yIFIKCjxwPgoKLSBUaGVyZSBhcmUgbWFueSBndWlkZXMgdG8gdXNpbmcgUiBhdmFpbGFibGUgb25saW5lLCBib3RoIGRvY3VtZW50cyBhbmQgdmlkZW9zLiAKCi0gQSBjb21wcmVoZW5zaXZlIGludHJvZHVjdGlvbiBpcyBhdmFpbGFibGUgb24gQUlNUyBAVmVuYWJsZXMyMDE5IGFuZCBhdCBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9kb2MvbWFudWFscy9yLXJlbGVhc2UvUi1pbnRyby5wZGYuIAoKLSBPdGhlciBSIGRvY3VtZW50YXRpb24gYW5kIGd1aWRlcyBmb3IgdmFyaW91cyBhcHBsaWNhdGlvbnMgY29udHJpYnV0ZWQgYnkgUiB1c2VycyBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvb3RoZXItZG9jcy5odG1sI2VuZ2xpc2guCgotIE15IFRBIGF0IEtvYmUgVW5pdmVyc2l0eSBwcm9kdWNlZCB0aGUgZm9sbG93aW5nIGd1aWRlcywgYXZhaWxhYmxlIGF0IFtNYXNzaW1pbGlhbm8ncyBSIFBhZ2Ugb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vbWFzc2ltaWxpYW5vai9SX2JlZ2lubmVycykuCgogICAgLSBSIGZvciBCZWdpbm5lcnMgIAogICAgLSBSIE1hcmtkb3duOiBOb3RlcyBmb3IgRWRpdGluZyAgCiAgICAtIExhVGVYOiBFZGl0aW5nIGZvciBNYXRoZW1hdGljcyAgCgotLS0tCgojIyBDUkFOIFRhc2sgVmlld3MKCjxwPgoKLSBDUkFOIFRhc2sgVmlld3MgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggUi4gUGFja2FnZXMgZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFIuIFRoZXkgcHJvdmlkZSByb3V0aW5lcyBmb3IgdmFyaW91cyB0eXBlcyBvZiBkYXRhIG1hbmlwdWxhdGlvbiwgbWF0aGVtYXRpY2FsIGFuZCBlY29ub21ldHJpYyBtb2RlbHMsIG9wdGltaXNhdGlvbiBtZXRob2RzLCBmaW5hbmNpYWwgbW9kZWxzIGFuZCBtb3JlLiBQYWNrYWdlcyBhcmUgY29uc3RhbnRseSBiZWluZyBkZXZlbG9wZWQgYW5kIHVwZGF0ZWQgYnkgUiB1c2Vycy4KCi0gVGhyZWUgVGFzayBWaWV3cyBhcmUgdXNlZnVsIHRoaXMgY291cnNlOiAgCgogICAgLSBFbXBpcmljYWwgZmluYW5jZTogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3ZpZXdzL0ZpbmFuY2UuaHRtbCAKCiAgICAtIEVjb25vbWV0cmljczogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3ZpZXdzL0Vjb25vbWV0cmljcy5odG1sICAKCiAgICAtIFRpbWUgc2VyaWVzOiBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvdmlld3MvVGltZVNlcmllcy5odG1sICAKIAotLS0tCgojIyBCb29rcyBvbiBSCgo8cD4KCi0gTWFueSBib29rcyBoYXZlIGJlZW4gcHVibGlzaGVkIG9uIHVzaW5nIFIsIHByb2dyYW1taW5nIHdpdGggUiwgYW5kIHVzaW5nIFIgZm9yIGZpbmFuY2UuCgogICAgLSBGaW5hbmNlOiBAQmVubmV0dDIwMTYsIEBBbmRyZWN1dDIwMTAsIEBUc2F5MjAxMCwgQFRzYXkyMDE0CgogICAgLSBFY29ub21ldHJpY3M6IEBLbGVpYmVyMjAwOCwgQEhvcm5pazIwMDkKICAgIAogICAgLSBDb2Rpbmc6IEBNYXRsb2ZmMjAxMQoKLS0tLQoKIyMgUi1CbG9nZ2VycyAgCgo8cD4KCi0gUi1CbG9nZ2VycyBpcyBhIGJsb2cgc2l0ZSBjb250YWluaW5nIG1hbnkgaGVscGZ1bCBwb3N0cyBvbiB1c2luZyBSOiBodHRwOi8vd3d3LnItYmxvZ2dlcnMuY29tLyAgCgotIFRoZSBwb3N0cyBvbiB0aGUgc2l0ZSBzaG93IHRoZSB3aWRlIHZhcmlldHkgb2YgcHJvYmxlbXMgdGhhdCBjb2RpbmcgaW4gUiBjYW4gYmUgYXBwbGllZCB0byAobm90IGp1c3QgZmluYW5jZSkuIEZvciBleGFtcGxlOgoKICAgIC0gaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vd2hvLXdyb3RlLXRoYXQtYW5vbnltb3VzLW55dC1vcC1lZC10ZXh0LXNpbWlsYXJpdHktYW5hbHlzZXMtd2l0aC1yLwoKICAgIC0gaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vaG93LXRvLWJ1aWxkLWFuaW1hdGVkLWJhci1wbG90cy11c2luZy1yLwoKPHA+CgotIEEgZ29vZCBpbnRyb2R1Y3Rpb24gdG8gbGVhcm5pbmcgUjogaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vaG93LXRvLWxlYXJuLXItMi8KCi0tLS0KCiMjIFNlYXJjaCAgCgo8cD4KCi0gTG90cyBvZiBpbmZvcm1hdGlvbiBpcyBwb3N0ZWQgb25saW5lIGJ5IFIgdXNlcnMgaW5jbHVkaW5nIHF1ZXN0aW9ucyBhbmQgYW5zd2Vycy4gIAoKLSBJZiB5b3UgYXJlIHN0dWNrLCBzZWFyY2ggZm9yIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBoZWxwIHlvdSBhbnN3ZXIgeW91ciBxdWVzdGlvbi4gCgotIHJzZWVrIGlzIGEgc2VhcmNoIGVuZ2luZSBmb3IgUjogd3d3LnJzZWVrLm9yZwoKLSBVc2luZyBhbm90aGVyIHNlYXJjaCBlbmdpbmUgbGlrZSBHb29nbGU6ICAKCiAgICAtICJmaWxldHlwZTpSIHJlZ3Jlc3Npb24g4oCTcmVib2wiICAKCiAgICAtICJDUkFOIHJlZ3Jlc3Npb24iICAgCgotLS0tCgojIyBSU3R1ZGlvIEtleWJvYXJkIFNob3J0Y3V0cyAoZm9yIE1hYykKCjxwPgoKLSBDb2RlIGNvbXBsZXRpb246CiAgICAtIFR5cGUgcGFydCBvZiB0aGUgZnVuY3Rpb24geW91IHdhbnQgYW5kIHRoZW4gcHJlc3MgdGhlIFRhYiBrZXkuICAKICAgIC0gQWxzbyB3b3JrcyBmb3IgZnVuY3Rpb24gYXJndW1lbnRzLCB0aGF0IGlzIHByZXNzIFRhYiB3aGVuIHlvIHVhcmUgaW5zaWRlIHRoZSBicmFja2V0cyBvZiBhIGZ1bmN0aW9uLiAgCiAgICAtIEFsc28gcmVjYWxscyBvYmplY3QgbmFtZXMuCgo8cD4KCi0gUHJlc3MgRjEgKG9yIGZuK0YxKSBmb3IgaGVscCBvbiBhIGZ1bmN0aW9uLiAKICAKLSBSZXRyaWV2ZSBwcmV2aW91cyBjb21tYW5kczogIAogICAgLSBQcmVzcyB0aGUgdXAgb3IgZG93biBhcnJvd3MgdG8gc2Nyb2xsIHRocm91Z2ggeW91ciBjb2RlIGhpc3RvcnkuCiAgCjxwPgoKLSBWaWV3IGEgbGlzdCBvZiBwcmV2aW91cyBjb21tYW5kczogIAogICAgLSBQcmVzcyBDb250cm9sIChvciBDb21tYW5kKSBhbmQgdGhlIHVwIGFycm93LgoKPHA+CgotIFZpZXcgYSBsaXN0IG9mIHByZXZpb3VzIGNvbW1hbmRzIHRoYXQgbWF0Y2ggYSBwcmVmaXg6ICAKICAgIC0gVHlwZSB0aGUgcHJlZml4IGFuZCBwcmVzcyBDb250cm9sIChvckNvbW1hbmQpIGFuZCB0aGUgdXAgYXJyb3cuIAoKPHA+CgotIEVudGVyIGEgbGluZSBvZiBjb2RlIGZyb20gYW4gUiBzY3JpcHQgdG8gdGhlIGNvbnNvbGU6CiAgICAtIENvbW1hbmQgYW5kIGVudGVyLgoKPHA+CgotIEVudGVyIGEgbGluZSBvZiBjb2RlIGZyb20gaGlzdG9yeSB0byBhbmQgUiBzY3JpcHQ6CiAgICAtIFNoaWZ0IGFuZCBlbnRlci4KCjxwPgoKLSBNb3JlOiAgCiAgICAtIFRvb2xzIC0+IEtleWJvYXJkIFNob3J0Y3V0cyBIZWxwICAKICAgIC0gaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIwMDcxMTg1MyAgCiAgICAKLS0tLQoKPHA+CgogwqkgQ29weXJpZ2h0IENsaW50b24gV2F0a2lucyAyMDIxCiAKLS0tLQoKIyMgUmVmZXJlbmNlcwoKPHA+Cg==