Downloading, installing, and navigating Rstudio

In this series of workshops, we will be using the R programming language. In order to be able to complete the exercises in the workshops, you will need to download R onto your computer. You will also need to download RStudio, a programming environment that will make it easier to visualize what we are doing.

Downloading R

R is available for free at r-project.org. To maintain consistency among everyone in the class, please download R version 3.6.3: you can find it in the following links for Windows, Mac, Linux. Download and install it. You can open it to see if it worked. You enter commands by typing them and pressing enter. R should spit back a response of some kind. One thing you can do is type version and hit enter. It’ll respond with the version information.

Downloading Rstudio

R itself is pretty minimal, so we’ll want to download RStudio as well. RStudio is a graphical user interface (GUI) integrated development environment (IDE) for using R. RStudio will make it easier for us to write and edit our code, view plots, and make documents like this one. RStudio Desktop is also free.

Using Rstudio

(Figure borrowed from Principles of Econometrics with R)

  • Script Window: Where you write the code that you want to run and save

  • Console Window: Where the output of your code will appear (unless you’re using an R notebook, which we’ll discuss later). You can also run code here directly, but it won’t be saved.

  • Environment Window: Lists all the variables you’ve created. We’re going to be talking a lot more about this starting in the next class

  • Packages/Help/Plot Window: A catch-all for random stuff you might want to look at. We’ll mostly be using this window to get help on R functions, or to look at plots

Getting organized

Make yourself a folder for this work. AVOID using spaces, use ’_’ (my_directory) or CapitalizeEachWord (ThisIsCalledCamelCase). Why no spaces? They’re harder to type for when navigating directories from within R. Give directories informative names, it’ll help you later on. Use consistent naming schemes, choose either CamelCase or underscores.

Using R notebooks

R notebooks are a great way to keep track of a project. They provide a space where code, its output (e.g. plots) and clearly formatted explanations can be kept in one place. Think of it as a lab notebook for your code.

Just like lab notebooks, R notebooks make it much easier to reproduce your own–or another scientist’s–analysis. They can be viewed both as formatted html files (what you are seeing right now) and as an editable pieces of code that can be opened in RStudio. If you email a collaborator an html file of a notebook containing your analysis (together with the underlying data), they can open it up, re-run any part they are interested in, and easily tweak any anylysis you did to check something you may not have thought of.

In this class, every lesson will come with a pre-prepared R notebook. It is critical that you download each lesson’s R notebook at the beginning of class and write your code inside the notebook as we go along. Most of programming is recycling and repurposing code (either code you wrote, or code someone else wrote), and these notebooks will make sure that during the class, you always have access to your old code for repurposing.

To download this lecture’s R notebook, scroll to the top of this website, click ‘Code’, and select ‘Download Rmd’.

Starting a new notebook

Elements of a notebook:

The notebook contains 3 major parts:

  • YAML: title, author, date; also, any special options about how you’d like Rstudio to display things in the html document (e.g.: do you want the code to show up?)

  • Markdown Text: Your descriptions of what you’re doing! This is pretty straightforward. Just type here, and skip lines between paragraphs. You can use asterisks to do special formatting: put a single asterisk on each side of a piece of text for *italic*, two asterisks on each side for **bold**. Other things, like bulletpoints, hyperlinks, etc are also possible.

  • Code Chunks: These are the parts of your notebook where you include the actual code you want to run! By marking these, you are telling R to read the code and execute it. By default, this code will also show up in your html document, but in specially formatted sections so it can be easily seen as being separate from the main text. Mark code chunks by starting with three backticks ( `, on the top left of your keyboard, under the ~ ). Then type {r}, and start coding on the next line. At the end of your code chunk, on a new line, add 3 more backticks to let R know that the code chunk is over. In Rstudio, these code chunks should show up with gray background shading.

There are a couple of ways to run code from your code chunks inside the notebook. You can press the Run button at the top right of your editor window in Rstudio to see the options:

You can highlight specific line (or lines of code) and just run those; you can run an entire code chunk at a time; or you run all the code in the current notebook.

Once you’ve run your code, save your notebook in Rstudio. This will automatically update the formatted html file.

Try downloading this R notebook, opening it in Rstudio, adding yourself as an author, re-running it, saving it, and opening the resulting html file in your web browser. Notice that it won’t include the graphics: to get those, you have to go through the extra step of downloading the directory that contains them from github, since images are never embedded in the R notebook, but rather included as separate files.

Packages

One of the best things about R is that there is a huge community of scientists and programmers constantly developing new things and making them available (for free!) for everyone else to use. One of the most common ways these new functionalities are shared is in packages. These are essentially collections of various related functionalities–for example, for reshuffling data, doing some special statistical analysis, or making plots. For now, we will use two special R packages besides what automatically comes with the programming language: knitr, which is what makes R notebooks into the pretty HTML documents you’re reading now, and ggplot2, which allows you to beautifully and easily plot your data.

If you find a new package you like online, in most cases, R will automatically install it for you. Below is a piece of code that will install ggplot2 for you (if you selected “Run All” in your R notebook in Rstudio, the code should have already installed the knitr package, although I set it up so that this part isn’t visible in the html version.)

If you run the code for this lesson in Rstudio, it will automatically install gplot2.

#install.packages('ggplot2')

You don’t have to re-install packages every time you open R. However, you do have to tell R that you’re planning to use some function from a particular package and want R to look there when you’re asking it to do things:

library(ggplot2)

Trying some coding: R-ithmetic

It’s time to try some coding! Take a look at the code chunk below: if you run the first line, you’ll see that we can use R as a fancy calculator. Let’s practice that: highlight the line in the code chunk below, run just that line, and check the answer in the Console window.

5 + 3
[1] 8

Easy! Try some more math in the code chunk below:

# Often, you may want to write a note for yourself (and anyone else who may read
# your code!) about what each piece of code is doing

# But R interprets anything inside a code chunk as something it has to execute!

# Putting a pound sign in front of a line of code tells R to ignore anything you
# type there, which allows you to make notes for yourself 
# These lines are called comments. Comments are *REALLY* important to make code
# readable, write tons of them!

# Below, write a line of code that will add 1 and 5, and run it
1 + 5
[1] 6
# Write a line of code that will subtract 4 from 7, and run it
7-4
[1] 3

Now let’s level up

# In programming, division is usually written using the slash ( / ), and
# multiplication using the asterisk ( * )

# Try multiplying 8 by 7
8 * 7
[1] 56
# Try dividing 4589 by 124
4589 / 124
[1] 37.00806

One of the most important skills in programming is knowing how to find information. No amount of experience will teach you how to do everything, and it’s incredibly easy to forget how to do things that you’ve done many times before but haven’t had to use in a while. Fortunately, we have google!

Try searching online to find out how to do the exercises in the code chunk below:

# Take 3 to the 5th power
3^5
[1] 243
# Find the remainder when 8 is divided by 3
8%%3
[1] 2

As you google, you may have see some answers on a website called StackOverflow. This is a great site that allows people to ask questions and they are answered by members of the R community (or any other community–StackOverflow has sections for most programming languages, and subjects as diverse as Biology and Cooking!). In most cases, there was already someone who had your question at some point, which is why a clever google search can usually help you figure out how to do most things. There are also a ton of blogs online that teach you specific skills in R.

Finally, R has a built-in help page for every function. You can access it by typing a question mark, followed by the name of the function. We will use this a lot more later in the course. For now, try typing ?Arithmetic (capitalization matters!) into your Rstudio Console window and pressing enter. You will see the help text pop up in the bottom right Help window in Rstudio. In practice, this information can sometimes be a bit dense and technical. I usually find it most useful to read the ‘description’ on top, and then scroll all the way down to the ‘examples’ section at the bottom of the help page. Don’t worry if you don’t understand the examples in the arithmetic help section yet–we’re going to cover a lot of those in our next class.

LS0tCnRpdGxlOiAiSW50cm8gUiBDb3Vyc2UsIFdvcmtzaG9wIDE6IEludHJvZHVjdGlvbiIKc3VidGl0bGU6IHwKICAgIHwgICAtIGRvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nIFIgYW5kIFJzdHVkaW8KICAgIHwgICAtIGxlYXJuaW5nIHlvdXIgd2F5IGFyb3VuZCBSc3R1ZGlvCiAgICB8ICAgLSBwYWNrYWdlcwogICAgfCAgIC0gc2ltcGxlIG1hdGggaW4gUgphdXRob3I6Ci0gRXVnZW5lIFBsYXZza2luCi0gR3JhY2UgQXZlY2lsbGEKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRlcHRoOiAzCiAgICB0aWR5OiB5ZXMKICAgIHRvYzogeWVzCi0tLQpgYGB7ciBlY2hvPUZ9Cmluc3RhbGwucGFja2FnZXMoJ2tuaXRyJykKbGlicmFyeShrbml0cikKYGBgCgojIERvd25sb2FkaW5nLCBpbnN0YWxsaW5nLCBhbmQgbmF2aWdhdGluZyBSc3R1ZGlvCgpJbiB0aGlzIHNlcmllcyBvZiB3b3Jrc2hvcHMsIHdlIHdpbGwgYmUgdXNpbmcgdGhlICoqUioqIHByb2dyYW1taW5nIGxhbmd1YWdlLiBJbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbXBsZXRlIHRoZSBleGVyY2lzZXMgaW4gdGhlIHdvcmtzaG9wcywgeW91IHdpbGwgbmVlZCB0byBkb3dubG9hZCBSIG9udG8geW91ciBjb21wdXRlci4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIGRvd25sb2FkIFJTdHVkaW8sIGEgcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQgdGhhdCB3aWxsIG1ha2UgaXQgZWFzaWVyIHRvIHZpc3VhbGl6ZSB3aGF0IHdlIGFyZSBkb2luZy4KCiMjIERvd25sb2FkaW5nIFIKICAKUiBpcyBhdmFpbGFibGUgZm9yICoqZnJlZSoqIGF0CltyLXByb2plY3Qub3JnXShodHRwczovL2NyYW4ucnN0dWRpby5jb20pLiBUbyBtYWludGFpbiBjb25zaXN0ZW5jeSBhbW9uZyBldmVyeW9uZSBpbiB0aGUgY2xhc3MsIHBsZWFzZSBkb3dubG9hZCAqKlIgdmVyc2lvbiAzLjYuMyoqOiB5b3UgY2FuIGZpbmQgaXQgaW4gdGhlIGZvbGxvd2luZyBsaW5rcyBmb3IgW1dpbmRvd3NdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL2Jpbi93aW5kb3dzL2Jhc2Uvb2xkLzMuNi4zLyksIFtNYWNdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL2Jpbi9tYWNvc3gvUi0zLjYuMy5ubi5wa2cpLCBbTGludXhdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL2Jpbi9saW51eC8pLiBEb3dubG9hZCBhbmQgaW5zdGFsbCBpdC4gWW91IGNhbiBvcGVuIGl0IHRvIHNlZSBpZiBpdCB3b3JrZWQuCllvdSBlbnRlciBjb21tYW5kcyBieSB0eXBpbmcgdGhlbSBhbmQgcHJlc3NpbmcgZW50ZXIuIFIgc2hvdWxkIApzcGl0IGJhY2sgYSByZXNwb25zZSBvZiBzb21lIGtpbmQuIE9uZSB0aGluZyB5b3UgY2FuIGRvIGlzIHR5cGUKYHZlcnNpb25gIGFuZCBoaXQgZW50ZXIuIEl0J2xsIHJlc3BvbmQgd2l0aCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCiMjIERvd25sb2FkaW5nIFJzdHVkaW8KClIgaXRzZWxmIGlzIHByZXR0eSBtaW5pbWFsLCBzbyB3ZSdsbCB3YW50IHRvIGRvd25sb2FkIFtSU3R1ZGlvXShodHRwczovL3d3dy5yc3R1ZGlvLmNvbS9wcm9kdWN0cy9yc3R1ZGlvL2Rvd25sb2FkLykgYXMgd2VsbC4gKipSU3R1ZGlvKiogaXMgYSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgKEdVSSkgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCAoSURFKSBmb3IgdXNpbmcgUi4gUlN0dWRpbyB3aWxsIG1ha2UgaXQgZWFzaWVyIGZvciB1cyB0byB3cml0ZSBhbmQgZWRpdCBvdXIgY29kZSwgdmlldyBwbG90cywgYW5kIG1ha2UgZG9jdW1lbnRzIGxpa2UgdGhpcyBvbmUuIFJTdHVkaW8gRGVza3RvcCBpcyBhbHNvIGZyZWUuCgojIyBVc2luZyBSc3R1ZGlvCgpgYGB7ciBlY2hvPUZ9CmlmIChkaXIuZXhpc3RzKCdjbGFzc19maWd1cmVzJykpewogIGluY2x1ZGVfZ3JhcGhpY3MoJ2NsYXNzX2ZpZ3VyZXMvUlN0dWRpb19zY3JlZW4ucG5nJykKfQpgYGAKCihGaWd1cmUgYm9ycm93ZWQgZnJvbSBbKlByaW5jaXBsZXMgb2YgRWNvbm9tZXRyaWNzIHdpdGggUipdKGh0dHBzOi8vYm9va2Rvd24ub3JnL2Njb2xvbmVzY3UvUlBvRTQvaW50cm8uaHRtbCkpCgoqIF9fU2NyaXB0IFdpbmRvd19fOiBXaGVyZSB5b3Ugd3JpdGUgdGhlIGNvZGUgdGhhdCB5b3Ugd2FudCB0byBydW4gYW5kIHNhdmUKCiogX19Db25zb2xlIFdpbmRvd19fOiBXaGVyZSB0aGUgb3V0cHV0IG9mIHlvdXIgY29kZSB3aWxsIGFwcGVhciAodW5sZXNzIHlvdSdyZSB1c2luZyBhbiBSIG5vdGVib29rLCB3aGljaCB3ZSdsbCBkaXNjdXNzIGxhdGVyKS4gWW91IGNhbiBhbHNvIHJ1biBjb2RlIGhlcmUgZGlyZWN0bHksIGJ1dCBpdCB3b24ndCBiZSBzYXZlZC4KCiogX19FbnZpcm9ubWVudCBXaW5kb3dfXzogTGlzdHMgYWxsIHRoZSAqdmFyaWFibGVzKiB5b3UndmUgY3JlYXRlZC4gV2UncmUgZ29pbmcgdG8gYmUgdGFsa2luZyBhIGxvdCBtb3JlIGFib3V0IHRoaXMgc3RhcnRpbmcgaW4gdGhlIG5leHQgY2xhc3MKCiogX19QYWNrYWdlcy9IZWxwL1Bsb3QgV2luZG93X186IEEgY2F0Y2gtYWxsIGZvciByYW5kb20gc3R1ZmYgeW91IG1pZ2h0IHdhbnQgdG8gbG9vayBhdC4gV2UnbGwgbW9zdGx5IGJlIHVzaW5nIHRoaXMgd2luZG93IHRvIGdldCBoZWxwIG9uIFIgZnVuY3Rpb25zLCBvciB0byBsb29rIGF0IHBsb3RzCgojIEdldHRpbmcgb3JnYW5pemVkCgpNYWtlIHlvdXJzZWxmIGEgZm9sZGVyIGZvciB0aGlzIHdvcmsuIEFWT0lEIHVzaW5nIHNwYWNlcywgdXNlICdfJyAobXlfZGlyZWN0b3J5KSBvciBDYXBpdGFsaXplRWFjaFdvcmQgKFRoaXNJc0NhbGxlZENhbWVsQ2FzZSkuIFdoeSBubyBzcGFjZXM/IFRoZXkncmUgaGFyZGVyIHRvIHR5cGUgZm9yIHdoZW4gbmF2aWdhdGluZyBkaXJlY3RvcmllcyBmcm9tIHdpdGhpbiBSLiBHaXZlIGRpcmVjdG9yaWVzIGluZm9ybWF0aXZlIG5hbWVzLCBpdCdsbCBoZWxwIHlvdSBsYXRlciBvbi4gVXNlIGNvbnNpc3RlbnQgbmFtaW5nIHNjaGVtZXMsIGNob29zZSBlaXRoZXIgQ2FtZWxDYXNlIG9yIHVuZGVyc2NvcmVzLgoKIyBVc2luZyBSIG5vdGVib29rcwoKUiBub3RlYm9va3MgYXJlIGEgZ3JlYXQgd2F5IHRvIGtlZXAgdHJhY2sgb2YgYSBwcm9qZWN0LiBUaGV5IHByb3ZpZGUgYSBzcGFjZSB3aGVyZSBjb2RlLCBpdHMgb3V0cHV0IChlLmcuIHBsb3RzKSBhbmQgY2xlYXJseSBmb3JtYXR0ZWQgZXhwbGFuYXRpb25zIGNhbiBiZSBrZXB0IGluIG9uZSBwbGFjZS4gVGhpbmsgb2YgaXQgYXMgYSBsYWIgbm90ZWJvb2sgZm9yIHlvdXIgY29kZS4KCkp1c3QgbGlrZSBsYWIgbm90ZWJvb2tzLCBSIG5vdGVib29rcyBtYWtlIGl0IG11Y2ggZWFzaWVyIHRvIHJlcHJvZHVjZSB5b3VyIG93bi0tb3IgYW5vdGhlciBzY2llbnRpc3Qncy0tYW5hbHlzaXMuIFRoZXkgY2FuIGJlIHZpZXdlZCBib3RoIGFzIGZvcm1hdHRlZCBodG1sIGZpbGVzICh3aGF0IHlvdSBhcmUgc2VlaW5nIHJpZ2h0IG5vdykgYW5kIGFzIGFuIGVkaXRhYmxlIHBpZWNlcyBvZiBjb2RlIHRoYXQgY2FuIGJlIG9wZW5lZCBpbiBSU3R1ZGlvLiBJZiB5b3UgZW1haWwgYSBjb2xsYWJvcmF0b3IgYW4gaHRtbCBmaWxlIG9mIGEgbm90ZWJvb2sgY29udGFpbmluZyB5b3VyIGFuYWx5c2lzICh0b2dldGhlciB3aXRoIHRoZSB1bmRlcmx5aW5nIGRhdGEpLCB0aGV5IGNhbiBvcGVuIGl0IHVwLCByZS1ydW4gYW55IHBhcnQgdGhleSBhcmUgaW50ZXJlc3RlZCBpbiwgYW5kIGVhc2lseSB0d2VhayBhbnkgYW55bHlzaXMgeW91IGRpZCB0byBjaGVjayBzb21ldGhpbmcgeW91IG1heSBub3QgaGF2ZSB0aG91Z2h0IG9mLgoKSW4gdGhpcyBjbGFzcywgZXZlcnkgbGVzc29uIHdpbGwgY29tZSB3aXRoIGEgcHJlLXByZXBhcmVkIFIgbm90ZWJvb2suIEl0IGlzIGNyaXRpY2FsIHRoYXQgeW91IGRvd25sb2FkIGVhY2ggbGVzc29uJ3MgUiBub3RlYm9vayBhdCB0aGUgYmVnaW5uaW5nIG9mIGNsYXNzIGFuZCB3cml0ZSB5b3VyIGNvZGUgaW5zaWRlIHRoZSBub3RlYm9vayBhcyB3ZSBnbyBhbG9uZy4gTW9zdCBvZiBwcm9ncmFtbWluZyBpcyByZWN5Y2xpbmcgYW5kIHJlcHVycG9zaW5nIGNvZGUgKGVpdGhlciBjb2RlIHlvdSB3cm90ZSwgb3IgY29kZSBzb21lb25lIGVsc2Ugd3JvdGUpLCBhbmQgdGhlc2Ugbm90ZWJvb2tzIHdpbGwgbWFrZSBzdXJlIHRoYXQgZHVyaW5nIHRoZSBjbGFzcywgeW91IGFsd2F5cyBoYXZlIGFjY2VzcyB0byB5b3VyIG9sZCBjb2RlIGZvciByZXB1cnBvc2luZy4KClRvIGRvd25sb2FkIHRoaXMgbGVjdHVyZSdzIFIgbm90ZWJvb2ssIHNjcm9sbCB0byB0aGUgdG9wIG9mIHRoaXMgd2Vic2l0ZSwgY2xpY2sgJ0NvZGUnLCBhbmQgc2VsZWN0ICdEb3dubG9hZCBSbWQnLgoKIyMgU3RhcnRpbmcgYSBuZXcgbm90ZWJvb2sKYGBge3IgZWNobyA9IEZ9CmlmIChkaXIuZXhpc3RzKCdjbGFzc19maWd1cmVzJykpewogIGluY2x1ZGVfZ3JhcGhpY3MoJ2NsYXNzX2ZpZ3VyZXMvbmV3X25iLnBuZycpCn0KYGBgCiAKRWxlbWVudHMgb2YgYSBub3RlYm9vazoKYGBge3IgZWNobz1GfQppZiAoZGlyLmV4aXN0cygnY2xhc3NfZmlndXJlcycpKXsKICBpbmNsdWRlX2dyYXBoaWNzKCdjbGFzc19maWd1cmVzL25iX2VsZW1lbnRzLnBuZycpCn0KYGBgClRoZSBub3RlYm9vayBjb250YWlucyAzIG1ham9yIHBhcnRzOgoKKiBfX1lBTUxfXzogdGl0bGUsIGF1dGhvciwgZGF0ZTsgYWxzbywgYW55IHNwZWNpYWwgb3B0aW9ucyBhYm91dCBob3cgeW91J2QgbGlrZSBSc3R1ZGlvIHRvIGRpc3BsYXkgdGhpbmdzIGluIHRoZSBodG1sIGRvY3VtZW50IChlLmcuOiBkbyB5b3Ugd2FudCB0aGUgY29kZSB0byBzaG93IHVwPykKCiogX19NYXJrZG93biBUZXh0X186IFlvdXIgZGVzY3JpcHRpb25zIG9mIHdoYXQgeW91J3JlIGRvaW5nISBUaGlzIGlzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuIEp1c3QgdHlwZSBoZXJlLCBhbmQgc2tpcCBsaW5lcyBiZXR3ZWVuIHBhcmFncmFwaHMuIFlvdSBjYW4gdXNlIGFzdGVyaXNrcyB0byBkbyBzcGVjaWFsIGZvcm1hdHRpbmc6IHB1dCBhIHNpbmdsZSBhc3RlcmlzayBvbiBlYWNoIHNpZGUgb2YgYSBwaWVjZSBvZiB0ZXh0IGZvciAqXCppdGFsaWNcKiosIHR3byBhc3Rlcmlza3Mgb24gZWFjaCBzaWRlIGZvciAqKlwqXCpib2xkXCpcKioqLiBPdGhlciB0aGluZ3MsIGxpa2UgYnVsbGV0cG9pbnRzLCBoeXBlcmxpbmtzLCBldGMgYXJlIGFsc28gcG9zc2libGUuCgoqIF9fQ29kZSBDaHVua3NfXzogVGhlc2UgYXJlIHRoZSBwYXJ0cyBvZiB5b3VyIG5vdGVib29rIHdoZXJlIHlvdSBpbmNsdWRlIHRoZSBhY3R1YWwgY29kZSB5b3Ugd2FudCB0byBydW4hIEJ5IG1hcmtpbmcgdGhlc2UsIHlvdSBhcmUgdGVsbGluZyBSIHRvIHJlYWQgdGhlIGNvZGUgYW5kIGV4ZWN1dGUgaXQuIEJ5IGRlZmF1bHQsIHRoaXMgY29kZSB3aWxsIGFsc28gc2hvdyB1cCBpbiB5b3VyIGh0bWwgZG9jdW1lbnQsIGJ1dCBpbiBzcGVjaWFsbHkgZm9ybWF0dGVkIHNlY3Rpb25zIHNvIGl0IGNhbiBiZSBlYXNpbHkgc2VlbiBhcyBiZWluZyBzZXBhcmF0ZSBmcm9tIHRoZSBtYWluIHRleHQuIE1hcmsgY29kZSBjaHVua3MgYnkgc3RhcnRpbmcgd2l0aCB0aHJlZSBiYWNrdGlja3MgKCAqKlxgKiosIG9uIHRoZSB0b3AgbGVmdCBvZiB5b3VyIGtleWJvYXJkLCB1bmRlciB0aGUgKip+KiogKS4gVGhlbiB0eXBlICoqe3J9KiosIGFuZCBzdGFydCBjb2Rpbmcgb24gdGhlIG5leHQgbGluZS4gQXQgdGhlIGVuZCBvZiB5b3VyIGNvZGUgY2h1bmssIG9uIGEgbmV3IGxpbmUsIGFkZCAzIG1vcmUgYmFja3RpY2tzIHRvIGxldCBSIGtub3cgdGhhdCB0aGUgY29kZSBjaHVuayBpcyBvdmVyLiBJbiBSc3R1ZGlvLCB0aGVzZSBjb2RlIGNodW5rcyBzaG91bGQgc2hvdyB1cCB3aXRoIGdyYXkgYmFja2dyb3VuZCBzaGFkaW5nLgoKVGhlcmUgYXJlIGEgY291cGxlIG9mIHdheXMgdG8gcnVuIGNvZGUgZnJvbSB5b3VyIGNvZGUgY2h1bmtzIGluc2lkZSB0aGUgbm90ZWJvb2suIFlvdSBjYW4gcHJlc3MgdGhlICoqUnVuKiogYnV0dG9uIGF0IHRoZSB0b3AgcmlnaHQgb2YgeW91ciBlZGl0b3Igd2luZG93IGluIFJzdHVkaW8gdG8gc2VlIHRoZSBvcHRpb25zOgpgYGB7ciBlY2hvPUZ9CmlmIChkaXIuZXhpc3RzKCdjbGFzc19maWd1cmVzJykpewogIGluY2x1ZGVfZ3JhcGhpY3MoJ2NsYXNzX2ZpZ3VyZXMvY29kZV9ydW5uaW5nX29wdGlvbnMucG5nJykKfQpgYGAKWW91IGNhbiBoaWdobGlnaHQgc3BlY2lmaWMgbGluZSAob3IgbGluZXMgb2YgY29kZSkgYW5kIGp1c3QgcnVuIHRob3NlOyB5b3UgY2FuIHJ1biBhbiBlbnRpcmUgY29kZSBjaHVuayBhdCBhIHRpbWU7IG9yIHlvdSBydW4gYWxsIHRoZSBjb2RlIGluIHRoZSBjdXJyZW50IG5vdGVib29rLgoKT25jZSB5b3UndmUgcnVuIHlvdXIgY29kZSwgc2F2ZSB5b3VyIG5vdGVib29rIGluIFJzdHVkaW8uIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgZm9ybWF0dGVkIGh0bWwgZmlsZS4KCioqVHJ5IGRvd25sb2FkaW5nIHRoaXMgUiBub3RlYm9vaywgb3BlbmluZyBpdCBpbiBSc3R1ZGlvLCBhZGRpbmcgeW91cnNlbGYgYXMgYW4gYXV0aG9yLCByZS1ydW5uaW5nIGl0LCBzYXZpbmcgaXQsIGFuZCBvcGVuaW5nIHRoZSByZXN1bHRpbmcgaHRtbCBmaWxlIGluIHlvdXIgd2ViIGJyb3dzZXIuICoqIE5vdGljZSB0aGF0IGl0IHdvbid0IGluY2x1ZGUgdGhlIGdyYXBoaWNzOiB0byBnZXQgdGhvc2UsIHlvdSBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIGV4dHJhIHN0ZXAgb2YgZG93bmxvYWRpbmcgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZW0gZnJvbSBnaXRodWIsIHNpbmNlIGltYWdlcyBhcmUgbmV2ZXIgZW1iZWRkZWQgaW4gdGhlIFIgbm90ZWJvb2ssIGJ1dCByYXRoZXIgaW5jbHVkZWQgYXMgc2VwYXJhdGUgZmlsZXMuCgojIFBhY2thZ2VzCgpPbmUgb2YgdGhlIGJlc3QgdGhpbmdzIGFib3V0IFIgaXMgdGhhdCB0aGVyZSBpcyBhIGh1Z2UgY29tbXVuaXR5IG9mIHNjaWVudGlzdHMgYW5kIHByb2dyYW1tZXJzIGNvbnN0YW50bHkgZGV2ZWxvcGluZyBuZXcgdGhpbmdzIGFuZCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgKGZvciBmcmVlISkgZm9yIGV2ZXJ5b25lIGVsc2UgdG8gdXNlLiBPbmUgb2YgdGhlIG1vc3QgY29tbW9uIHdheXMgdGhlc2UgbmV3IGZ1bmN0aW9uYWxpdGllcyBhcmUgc2hhcmVkIGlzIGluICpwYWNrYWdlcyouIFRoZXNlIGFyZSBlc3NlbnRpYWxseSBjb2xsZWN0aW9ucyBvZiB2YXJpb3VzIHJlbGF0ZWQgZnVuY3Rpb25hbGl0aWVzLS1mb3IgZXhhbXBsZSwgZm9yIHJlc2h1ZmZsaW5nIGRhdGEsIGRvaW5nIHNvbWUgc3BlY2lhbCBzdGF0aXN0aWNhbCBhbmFseXNpcywgb3IgbWFraW5nIHBsb3RzLiBGb3Igbm93LCB3ZSB3aWxsIHVzZSB0d28gc3BlY2lhbCBSIHBhY2thZ2VzIGJlc2lkZXMgd2hhdCBhdXRvbWF0aWNhbGx5IGNvbWVzIHdpdGggdGhlIHByb2dyYW1taW5nIGxhbmd1YWdlOiAqKmtuaXRyKiosIHdoaWNoIGlzIHdoYXQgbWFrZXMgUiBub3RlYm9va3MgaW50byB0aGUgcHJldHR5IEhUTUwgZG9jdW1lbnRzIHlvdSdyZSByZWFkaW5nIG5vdywgYW5kICoqZ2dwbG90MioqLCB3aGljaCBhbGxvd3MgeW91IHRvIGJlYXV0aWZ1bGx5IGFuZCBlYXNpbHkgcGxvdCB5b3VyIGRhdGEuCgpJZiB5b3UgZmluZCBhIG5ldyBwYWNrYWdlIHlvdSBsaWtlIG9ubGluZSwgaW4gbW9zdCBjYXNlcywgUiB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBpdCBmb3IgeW91LiBCZWxvdyBpcyBhIHBpZWNlIG9mIGNvZGUgdGhhdCB3aWxsIGluc3RhbGwgKipnZ3Bsb3QyKiogZm9yIHlvdSAoaWYgeW91IHNlbGVjdGVkICJSdW4gQWxsIiBpbiB5b3VyIFIgbm90ZWJvb2sgaW4gUnN0dWRpbywgdGhlIGNvZGUgc2hvdWxkIGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgdGhlICoqa25pdHIqKiBwYWNrYWdlLCBhbHRob3VnaCBJIHNldCBpdCB1cCBzbyB0aGF0IHRoaXMgcGFydCBpc24ndCB2aXNpYmxlIGluIHRoZSBodG1sIHZlcnNpb24uKQoKSWYgeW91IHJ1biB0aGUgY29kZSBmb3IgdGhpcyBsZXNzb24gaW4gUnN0dWRpbywgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGluc3RhbGwgKipncGxvdDIqKi4KCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCdnZ3Bsb3QyJykKYGBgCgpZb3UgZG9uJ3QgaGF2ZSB0byByZS1pbnN0YWxsIHBhY2thZ2VzIGV2ZXJ5IHRpbWUgeW91IG9wZW4gUi4gSG93ZXZlciwgeW91ICpkbyogaGF2ZSB0byB0ZWxsIFIgdGhhdCB5b3UncmUgcGxhbm5pbmcgdG8gdXNlIHNvbWUgZnVuY3Rpb24gZnJvbSBhIHBhcnRpY3VsYXIgcGFja2FnZSBhbmQgd2FudCBSIHRvIGxvb2sgdGhlcmUgd2hlbiB5b3UncmUgYXNraW5nIGl0IHRvIGRvIHRoaW5nczoKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKIyBUcnlpbmcgc29tZSBjb2Rpbmc6IFItaXRobWV0aWMKCkl0J3MgdGltZSB0byB0cnkgc29tZSBjb2RpbmchIFRha2UgYSBsb29rIGF0IHRoZSBjb2RlIGNodW5rIGJlbG93OiBpZiB5b3UgcnVuIHRoZSBmaXJzdCBsaW5lLCB5b3UnbGwgc2VlIHRoYXQgd2UgY2FuIHVzZSBSIGFzIGEgZmFuY3kgY2FsY3VsYXRvci4gTGV0J3MgcHJhY3RpY2UgdGhhdDogaGlnaGxpZ2h0IHRoZSBsaW5lIGluIHRoZSBjb2RlIGNodW5rIGJlbG93LCBydW4ganVzdCB0aGF0IGxpbmUsIGFuZCBjaGVjayB0aGUgYW5zd2VyIGluIHRoZSBDb25zb2xlIHdpbmRvdy4KCmBgYHtyfQo1ICsgMwpgYGAKCkVhc3khIFRyeSBzb21lIG1vcmUgbWF0aCBpbiB0aGUgY29kZSBjaHVuayBiZWxvdzoKCmBgYHtyfQojIE9mdGVuLCB5b3UgbWF5IHdhbnQgdG8gd3JpdGUgYSBub3RlIGZvciB5b3Vyc2VsZiAoYW5kIGFueW9uZSBlbHNlIHdobyBtYXkgcmVhZAojIHlvdXIgY29kZSEpIGFib3V0IHdoYXQgZWFjaCBwaWVjZSBvZiBjb2RlIGlzIGRvaW5nCgojIEJ1dCBSIGludGVycHJldHMgYW55dGhpbmcgaW5zaWRlIGEgY29kZSBjaHVuayBhcyBzb21ldGhpbmcgaXQgaGFzIHRvIGV4ZWN1dGUhCgojIFB1dHRpbmcgYSBwb3VuZCBzaWduIGluIGZyb250IG9mIGEgbGluZSBvZiBjb2RlIHRlbGxzIFIgdG8gaWdub3JlIGFueXRoaW5nIHlvdQojIHR5cGUgdGhlcmUsIHdoaWNoIGFsbG93cyB5b3UgdG8gbWFrZSBub3RlcyBmb3IgeW91cnNlbGYgCiMgVGhlc2UgbGluZXMgYXJlIGNhbGxlZCBjb21tZW50cy4gQ29tbWVudHMgYXJlICpSRUFMTFkqIGltcG9ydGFudCB0byBtYWtlIGNvZGUKIyByZWFkYWJsZSwgd3JpdGUgdG9ucyBvZiB0aGVtIQoKIyBCZWxvdywgd3JpdGUgYSBsaW5lIG9mIGNvZGUgdGhhdCB3aWxsIGFkZCAxIGFuZCA1LCBhbmQgcnVuIGl0CjEgKyA1CiMgV3JpdGUgYSBsaW5lIG9mIGNvZGUgdGhhdCB3aWxsIHN1YnRyYWN0IDQgZnJvbSA3LCBhbmQgcnVuIGl0CjctNApgYGAKCk5vdyBsZXQncyBsZXZlbCB1cApgYGB7cn0KIyBJbiBwcm9ncmFtbWluZywgZGl2aXNpb24gaXMgdXN1YWxseSB3cml0dGVuIHVzaW5nIHRoZSBzbGFzaCAoIC8gKSwgYW5kCiMgbXVsdGlwbGljYXRpb24gdXNpbmcgdGhlIGFzdGVyaXNrICggKiApCgojIFRyeSBtdWx0aXBseWluZyA4IGJ5IDcKOCAqIDcKIyBUcnkgZGl2aWRpbmcgNDU4OSBieSAxMjQKNDU4OSAvIDEyNApgYGAKCk9uZSBvZiB0aGUgKm1vc3QqIGltcG9ydGFudCBza2lsbHMgaW4gcHJvZ3JhbW1pbmcgaXMga25vd2luZyBob3cgdG8gZmluZCBpbmZvcm1hdGlvbi4gTm8gYW1vdW50IG9mIGV4cGVyaWVuY2Ugd2lsbCB0ZWFjaCB5b3UgaG93IHRvIGRvICpldmVyeXRoaW5nKiwgYW5kIGl0J3MgaW5jcmVkaWJseSBlYXN5IHRvIGZvcmdldCBob3cgdG8gZG8gdGhpbmdzIHRoYXQgeW91J3ZlIGRvbmUgbWFueSB0aW1lcyBiZWZvcmUgYnV0IGhhdmVuJ3QgaGFkIHRvIHVzZSBpbiBhIHdoaWxlLiBGb3J0dW5hdGVseSwgd2UgaGF2ZSBnb29nbGUhCgpUcnkgc2VhcmNoaW5nIG9ubGluZSB0byBmaW5kIG91dCBob3cgdG8gZG8gdGhlIGV4ZXJjaXNlcyBpbiB0aGUgY29kZSBjaHVuayBiZWxvdzoKYGBge3J9CiMgVGFrZSAzIHRvIHRoZSA1dGggcG93ZXIKM141CiMgRmluZCB0aGUgcmVtYWluZGVyIHdoZW4gOCBpcyBkaXZpZGVkIGJ5IDMKOCUlMwpgYGAKCkFzIHlvdSBnb29nbGUsIHlvdSBtYXkgaGF2ZSBzZWUgc29tZSBhbnN3ZXJzIG9uIGEgd2Vic2l0ZSBjYWxsZWQgKlN0YWNrT3ZlcmZsb3cqLiBUaGlzIGlzIGEgZ3JlYXQgc2l0ZSB0aGF0IGFsbG93cyBwZW9wbGUgdG8gYXNrIHF1ZXN0aW9ucyBhbmQgdGhleSBhcmUgYW5zd2VyZWQgYnkgbWVtYmVycyBvZiB0aGUgUiBjb21tdW5pdHkgKG9yIGFueSBvdGhlciBjb21tdW5pdHktLVN0YWNrT3ZlcmZsb3cgaGFzIHNlY3Rpb25zIGZvciBtb3N0IHByb2dyYW1taW5nIGxhbmd1YWdlcywgYW5kIHN1YmplY3RzIGFzIGRpdmVyc2UgYXMgQmlvbG9neSBhbmQgQ29va2luZyEpLiBJbiBtb3N0IGNhc2VzLCB0aGVyZSB3YXMgYWxyZWFkeSBzb21lb25lIHdobyBoYWQgeW91ciBxdWVzdGlvbiBhdCBzb21lIHBvaW50LCB3aGljaCBpcyB3aHkgYSBjbGV2ZXIgZ29vZ2xlIHNlYXJjaCBjYW4gdXN1YWxseSBoZWxwIHlvdSBmaWd1cmUgb3V0IGhvdyB0byBkbyBtb3N0IHRoaW5ncy4gVGhlcmUgYXJlIGFsc28gYSB0b24gb2YgYmxvZ3Mgb25saW5lIHRoYXQgdGVhY2ggeW91IHNwZWNpZmljIHNraWxscyBpbiBSLgoKRmluYWxseSwgUiBoYXMgYSBidWlsdC1pbiBoZWxwIHBhZ2UgZm9yIGV2ZXJ5IGZ1bmN0aW9uLiBZb3UgY2FuIGFjY2VzcyBpdCBieSB0eXBpbmcgYSBxdWVzdGlvbiBtYXJrLCBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uIFdlIHdpbGwgdXNlIHRoaXMgYSBsb3QgbW9yZSBsYXRlciBpbiB0aGUgY291cnNlLiBGb3Igbm93LCB0cnkgdHlwaW5nICoqP0FyaXRobWV0aWMqKiAoY2FwaXRhbGl6YXRpb24gbWF0dGVycyEpIGludG8geW91ciBSc3R1ZGlvIENvbnNvbGUgd2luZG93IGFuZCBwcmVzc2luZyAqZW50ZXIqLiBZb3Ugd2lsbCBzZWUgdGhlIGhlbHAgdGV4dCBwb3AgdXAgaW4gdGhlIGJvdHRvbSByaWdodCBIZWxwIHdpbmRvdyBpbiBSc3R1ZGlvLiBJbiBwcmFjdGljZSwgdGhpcyBpbmZvcm1hdGlvbiBjYW4gc29tZXRpbWVzIGJlIGEgYml0IGRlbnNlIGFuZCB0ZWNobmljYWwuIEkgdXN1YWxseSBmaW5kIGl0IG1vc3QgdXNlZnVsIHRvIHJlYWQgdGhlICdkZXNjcmlwdGlvbicgb24gdG9wLCBhbmQgdGhlbiBzY3JvbGwgYWxsIHRoZSB3YXkgZG93biB0byB0aGUgJ2V4YW1wbGVzJyBzZWN0aW9uIGF0IHRoZSBib3R0b20gb2YgdGhlIGhlbHAgcGFnZS4gRG9uJ3Qgd29ycnkgaWYgeW91IGRvbid0IHVuZGVyc3RhbmQgdGhlIGV4YW1wbGVzIGluIHRoZSBhcml0aG1ldGljIGhlbHAgc2VjdGlvbiB5ZXQtLXdlJ3JlIGdvaW5nIHRvIGNvdmVyIGEgbG90IG9mIHRob3NlIGluIG91ciBuZXh0IGNsYXNzLgo=