Introductory Statistics (CRN: 6896)



Objective

Today we learn about the R language and Rstudio. We familiarize ourselves with this environment and perform some basic operations.

 

What is R?

R is a programming language that can perform statistical analyses. It is open source, which means that it can be modified and improved by anyone. Of course, any modification has to go through multiple rounds of reviews and only those deemed necessary will be accepted. You can learn about it here. But you rarely need to change R itself. Instead, you are likely to use packages, which are essentially toolboxes that facilitate certain operations. If you analyse a certain type of data and re-use similar functions and data formats, you can place them in a package and make it available publicly. Then other people who find your package useful can contribute to your package as well. On top of these benefits, R is free. You can download it and use it anywhere and anytime.


What is Rstudio?

Rstudio is a development environment. Just as you can use the English language in MS Word or Google docs, you can use R language in different environments. But you probably type in your letters or papers or essays in a Word or Google doc because they provide you with tools that simplify your task, and allow you to do more than just type text. Similarly, Rstudio is a software that gives us useful tools when we are using R. It’s also free!


Getting started

Through the course, you will learn about many of rstudio’s tools and features. But one impressive feature that you’ll learn about in this very first step is that rstudio can be run on cloud… wow… What does this mean? It means, we don’t have to go to https://cran.r-project.org/ to download the R language, and we don’t have to go to https://rstudio.com to download the software and install it on our system. Instead, we simply go to https://rstudio.cloud/, and open an account. Then we can run rstudio in our browser (ie.e. Safari, Chrome, Firefox, etc).

So go to https://rstudio.cloud/ and see this:

And press on the Get started and open an account. Then you’ll see something like this:

And there. You have your own workspace. As it says on the right corner,

This your personal workspace, where you can create a virtually unlimited number of projects.

On the left side you have a few useful things:

The first one is your default workspace. You can create new workspaces to organize your projects. But what is a project? It is all of your data files, R Code, packages and whatnot that you created as part of a project in one unit.

Not only is this super helpful with organizing multiple projects, it allows you to share your projects with your team members. You can do this by clicking on Members where you’ll see this:

You can invite people via email, and set their access levels:

So here is what each of the options can do:

  • Admin: can manage membership and can view, edit and manage all projects in the space.
  • Moderator: can view, edit and manage all projects in the space.
  • Contributor: can create, edit and manage their own projects. This is the default.
  • Viewer: can view projects shared with everyone in the space.

Ok, so now let’s create a new project by, guess what, clicking on New Project button!

Here is an incredible feature: over time, you become used to a setting that you like to start your projects with — meaning you like certain packages and files to be present for new projects in a workspace. It can be excruciatingly painful to have to load these packages each time (not really but still). So what can we do in face of such an ordeal?

Rstudio has a solution. Once you create a project, load your packages and files, but before you write any code, cick on the cog icon on the upper right side of the screen. This will take you to space Settings. Here you can set this empty but pre-loaded project as base project (see below). Now, everytime you


Rmarkdown

Ok, so now that we are familiar with rstudio .cloud environmetn, let’s use it for something.

Let’s first talk a bit about statistical analysis, and creating reports in R. Often times, your job is to analyze a dataset, answer af ew questions, and write a report where you talk about what you found. Reports can’t be just a bunch of numbers and plots. You need to describe things in lay terms. Other people should be able to read your reprot and make sense of it. Doing this is not easy but as with anything else, you geet better overtime.

Fortunately, we have rstudio to help us. The document you’re reading is generated in rstudio. This document is in a format called R Markdown. This format allows you to create reports that contain the code you wrote for your analysis, the results the analysis, and the narrative that eplaines what you did. This could come in the form of introduction, findings, comments, strategy, etc. All of this will bein one place. A huge contribution of this is that it allows you to analyse and write at the same time.

There is a ton of material on Rmarkdown. You can see this one for reference: (https://bookdown.org/yihui/rmarkdown/). You can also use cheatsheets that show you how to create proper formatting. Rstudio.cloud has one here.

So a report in Rmarkdown has three types of content:

  • text
  • verbatim code
  • results

Text is obvious. You’re reading it now. You can make it look italic, bold, strikethrough. You can add equations in tex that look nice: \(A = \pi*r^{2}\). Pretty much anything you can do in a text editor like MS word or google docs is doable here.

The code you use in your analysis can also be part of your report. Look at the code cute single line code below:

plot(cars)

It is in a different format, in a box, and you might be able to hide it. You might say, well, why not just write code in text form? The reason is, the code you write is exectuable. It can be Run to produce results. You decide whether to show the code, its output or results in your report.

If we execute hte code above, and show the reuslts in the report but not the code, it’ll liook like this:

Some tips:

  • You can run a chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.
  • When you execute code within the notebook, the results appear beneath the code.
  • Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.
  • When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).
  • The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.


#### Lab Exercise:

Let’s load a dataset and run some commands. Tere is a dataset in the Lab 1 folder called Film_Permits.csv.

We can load it using the code below:

films<-read.csv("../Lab 1/Film_Permits.csv", header = T, sep = ",")

Note that there is no output. How do I know I opened the data file then? Well, on the top right window, under the Environment tab, there is a new line that says, films and 50728 obs. of 14 variables.

How about we take sneak peek of what the dataset looks like? Run the code below:

View(films)

Woha, see what happened? You should see somthing like this:

This is what the dataset looks like in memory. Spend sometime and get familiar with each variable. What do you see. What do you think wach variable means? How is it measured?

There are other ways to look at our dataset. For example, run the command below:

str(films)

Note that we can see the code’s output in the text. Have a look at what changed. I made a small change and now the output is showing in the text. Cna you spot the difference? We’ll get back to this later.

Ok, how about a summary?

summary(films)

summary is a very useful command. It basically tells you what each column in your dataset holds, their format, and the number of times each case occours in each column.

One other way to check your dataset is to look at the first few rows. Run this:

head(films)

Head command shows you the first five rows by default. You can ask for more. Run this:

head(films, 10)

Now, let’s run a the codes below, and write down what each of them do:

dim(films)
nrow(films)
ncol(films)
print(films$Borough)
table(films$Borough)
LS0tCnRpdGxlOiAiTGFiIDEiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CkF1dGhvcjogTW9zdGFmYSBTYWxhcmkgUmFkCi0tLQoKIyMjIEludHJvZHVjdG9yeSBTdGF0aXN0aWNzIChDUk46IDY4OTYpCgpcClwKCiMjIyMgT2JqZWN0aXZlClRvZGF5IHdlIGxlYXJuIGFib3V0IHRoZSBSIGxhbmd1YWdlIGFuZCBSc3R1ZGlvLiBXZSBmYW1pbGlhcml6ZSBvdXJzZWx2ZXMgd2l0aCB0aGlzIGVudmlyb25tZW50IGFuZCBwZXJmb3JtIHNvbWUgYmFzaWMgb3BlcmF0aW9ucy4gCgpcIAoKIyMjIyBXaGF0IGlzIFI/ClIgaXMgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGF0IGNhbiBwZXJmb3JtIHN0YXRpc3RpY2FsIGFuYWx5c2VzLiBJdCBpcyBvcGVuIHNvdXJjZSwgd2hpY2ggbWVhbnMgdGhhdCBpdCBjYW4gYmUgbW9kaWZpZWQgYW5kIGltcHJvdmVkIGJ5IGFueW9uZS4gT2YgY291cnNlLCBhbnkgbW9kaWZpY2F0aW9uIGhhcyB0byBnbyB0aHJvdWdoIG11bHRpcGxlIHJvdW5kcyBvZiByZXZpZXdzIGFuZCBvbmx5IHRob3NlIGRlZW1lZCBuZWNlc3Nhcnkgd2lsbCBiZSBhY2NlcHRlZC4gWW91IGNhbiBsZWFybiBhYm91dCBpdCBbaGVyZV0oaHR0cHM6Ly93d3cuci1wcm9qZWN0Lm9yZy9hYm91dC5odG1sKS4gQnV0IHlvdSByYXJlbHkgbmVlZCB0byBjaGFuZ2UgUiBpdHNlbGYuIEluc3RlYWQsIHlvdSBhcmUgbGlrZWx5IHRvIHVzZSBwYWNrYWdlcywgd2hpY2ggYXJlIGVzc2VudGlhbGx5IHRvb2xib3hlcyB0aGF0IGZhY2lsaXRhdGUgY2VydGFpbiBvcGVyYXRpb25zLiBJZiB5b3UgYW5hbHlzZSBhIGNlcnRhaW4gdHlwZSBvZiBkYXRhIGFuZCByZS11c2Ugc2ltaWxhciBmdW5jdGlvbnMgYW5kIGRhdGEgZm9ybWF0cywgeW91IGNhbiBwbGFjZSB0aGVtIGluIGEgcGFja2FnZSBhbmQgbWFrZSBpdCBhdmFpbGFibGUgcHVibGljbHkuIFRoZW4gb3RoZXIgcGVvcGxlIHdobyBmaW5kIHlvdXIgcGFja2FnZSB1c2VmdWwgY2FuIGNvbnRyaWJ1dGUgdG8geW91ciBwYWNrYWdlIGFzIHdlbGwuIE9uIHRvcCBvZiB0aGVzZSBiZW5lZml0cywgUiBpcyBmcmVlLiBZb3UgY2FuIGRvd25sb2FkIGl0IGFuZCB1c2UgaXQgYW55d2hlcmUgYW5kIGFueXRpbWUuIAoKXAoKIyMjIyBXaGF0IGlzIFJzdHVkaW8/ClJzdHVkaW8gaXMgYSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gSnVzdCBhcyB5b3UgY2FuIHVzZSB0aGUgRW5nbGlzaCBsYW5ndWFnZSBpbiBNUyBXb3JkIG9yIEdvb2dsZSBkb2NzLCB5b3UgY2FuIHVzZSBSIGxhbmd1YWdlIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuIEJ1dCB5b3UgcHJvYmFibHkgdHlwZSBpbiB5b3VyIGxldHRlcnMgb3IgcGFwZXJzIG9yIGVzc2F5cyBpbiBhIFdvcmQgb3IgR29vZ2xlIGRvYyBiZWNhdXNlIHRoZXkgcHJvdmlkZSB5b3Ugd2l0aCB0b29scyB0aGF0IHNpbXBsaWZ5IHlvdXIgdGFzaywgYW5kIGFsbG93IHlvdSB0byBkbyBtb3JlIHRoYW4ganVzdCB0eXBlIHRleHQuIFNpbWlsYXJseSwgUnN0dWRpbyBpcyBhIHNvZnR3YXJlIHRoYXQgZ2l2ZXMgdXMgdXNlZnVsIHRvb2xzIHdoZW4gd2UgYXJlIHVzaW5nIFIuIEl04oCZcyBhbHNvIGZyZWUhIAoKXAoKIyMjIyBHZXR0aW5nIHN0YXJ0ZWQKVGhyb3VnaCB0aGUgY291cnNlLCB5b3Ugd2lsbCBsZWFybiBhYm91dCBtYW55IG9mIHJzdHVkaW/igJlzIHRvb2xzIGFuZCBmZWF0dXJlcy4gQnV0IG9uZSBpbXByZXNzaXZlIGZlYXR1cmUgdGhhdCB5b3XigJlsbCBsZWFybiBhYm91dCBpbiB0aGlzIHZlcnkgZmlyc3Qgc3RlcCBpcyB0aGF0IHJzdHVkaW8gY2FuIGJlIHJ1biBvbiBjbG91ZC4uLiB3b3cuLi4gV2hhdCBkb2VzIHRoaXMgbWVhbj8gSXQgbWVhbnMsIHdlIGRvbuKAmXQgaGF2ZSB0byBnbyB0byBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy8gdG8gZG93bmxvYWQgdGhlIFIgbGFuZ3VhZ2UsIGFuZCB3ZSBkb27igJl0IGhhdmUgdG8gZ28gdG8gaHR0cHM6Ly9yc3R1ZGlvLmNvbSB0byBkb3dubG9hZCB0aGUgc29mdHdhcmUgYW5kIGluc3RhbGwgaXQgb24gb3VyIHN5c3RlbS4gSW5zdGVhZCwgd2Ugc2ltcGx5IGdvIHRvIGh0dHBzOi8vcnN0dWRpby5jbG91ZC8sIGFuZCBvcGVuIGFuIGFjY291bnQuIFRoZW4gd2UgY2FuIHJ1biByc3R1ZGlvIGluIG91ciBicm93c2VyIChpZS5lLiBTYWZhcmksIENocm9tZSwgRmlyZWZveCwgZXRjKS4gCgpTbyBnbyB0byBodHRwczovL3JzdHVkaW8uY2xvdWQvIGFuZCBzZWUgdGhpczoKCgohW10oaW1hZ2VzL2ltYWdlMS5wbmcpCgoKQW5kIHByZXNzIG9uIHRoZSAqKkdldCBzdGFydGVkKiogYW5kIG9wZW4gYW4gYWNjb3VudC4gVGhlbiB5b3XigJlsbCBzZWUgc29tZXRoaW5nIGxpa2UgdGhpczoKCgohW10oaW1hZ2VzL2ltYWdlMi5wbmcpCgoKQW5kIHRoZXJlLiBZb3UgaGF2ZSB5b3VyIG93biB3b3Jrc3BhY2UuIEFzIGl0IHNheXMgb24gdGhlIHJpZ2h0IGNvcm5lciwKCj4iKlRoaXMgeW91ciBwZXJzb25hbCB3b3Jrc3BhY2UsIHdoZXJlIHlvdSBjYW4gY3JlYXRlIGEgdmlydHVhbGx5IHVubGltaXRlZCBudW1iZXIgb2YgcHJvamVjdHMuKiIKCk9uIHRoZSBsZWZ0IHNpZGUgeW91IGhhdmUgYSBmZXcgdXNlZnVsIHRoaW5nczoKCgohW10oaW1hZ2VzL2ltYWdlMy5wbmcpCgpUaGUgZmlyc3Qgb25lIGlzIHlvdXIgZGVmYXVsdCB3b3Jrc3BhY2UuIFlvdSBjYW4gY3JlYXRlIG5ldyB3b3Jrc3BhY2VzIHRvIG9yZ2FuaXplIHlvdXIgcHJvamVjdHMuIEJ1dCB3aGF0IGlzIGEgcHJvamVjdD8gSXQgaXMgYWxsIG9mIHlvdXIgZGF0YSBmaWxlcywgUiBDb2RlLCBwYWNrYWdlcyBhbmQgd2hhdG5vdCB0aGF0IHlvdSBjcmVhdGVkIGFzIHBhcnQgb2YgYSBwcm9qZWN0IGluIG9uZSB1bml0LiAKCk5vdCBvbmx5IGlzIHRoaXMgc3VwZXIgaGVscGZ1bCB3aXRoIG9yZ2FuaXppbmcgbXVsdGlwbGUgcHJvamVjdHMsIGl0IGFsbG93cyB5b3UgdG8gc2hhcmUgeW91ciBwcm9qZWN0cyB3aXRoIHlvdXIgdGVhbSBtZW1iZXJzLiBZb3UgY2FuIGRvIHRoaXMgYnkgY2xpY2tpbmcgb24gKipNZW1iZXJzKiogd2hlcmUgeW914oCZbGwgc2VlIHRoaXM6CgoKIVtdKGltYWdlcy9pbWFnZTQucG5nKQoKCiBZb3UgY2FuIGludml0ZSBwZW9wbGUgdmlhIGVtYWlsLCBhbmQgc2V0IHRoZWlyIGFjY2VzcyBsZXZlbHM6CgoKIVtdKGltYWdlcy9pbWFnZTUucG5nKQoKU28gaGVyZSBpcyB3aGF0IGVhY2ggb2YgdGhlIG9wdGlvbnMgY2FuIGRvOiAKCi0gKipBZG1pbioqOiBjYW4gbWFuYWdlIG1lbWJlcnNoaXAgYW5kIGNhbiB2aWV3LCBlZGl0IGFuZCBtYW5hZ2UgYWxsIHByb2plY3RzIGluIHRoZSBzcGFjZS4KLSAqKk1vZGVyYXRvcioqOiBjYW4gdmlldywgZWRpdCBhbmQgbWFuYWdlIGFsbCBwcm9qZWN0cyBpbiB0aGUgc3BhY2UuCi0gKipDb250cmlidXRvcioqOiBjYW4gY3JlYXRlLCBlZGl0IGFuZCBtYW5hZ2UgdGhlaXIgb3duIHByb2plY3RzLiBUaGlzIGlzIHRoZSBkZWZhdWx0LgotICoqVmlld2VyKio6IGNhbiB2aWV3IHByb2plY3RzIHNoYXJlZCB3aXRoIGV2ZXJ5b25lIGluIHRoZSBzcGFjZS4KCgpPaywgc28gbm93IGxldCdzIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IGJ5LCBndWVzcyB3aGF0LCBjbGlja2luZyBvbiAqKk5ldyBQcm9qZWN0KiogIGJ1dHRvbiEgCgpIZXJlIGlzIGFuIGluY3JlZGlibGUgZmVhdHVyZTogb3ZlciB0aW1lLCB5b3UgYmVjb21lIHVzZWQgdG8gYSBzZXR0aW5nIHRoYXQgeW91IGxpa2UgdG8gc3RhcnQgeW91ciBwcm9qZWN0cyB3aXRoIOKAlCBtZWFuaW5nIHlvdSBsaWtlIGNlcnRhaW4gcGFja2FnZXMgYW5kIGZpbGVzIHRvIGJlIHByZXNlbnQgZm9yIG5ldyBwcm9qZWN0cyBpbiBhIHdvcmtzcGFjZS4gSXQgY2FuIGJlIGV4Y3J1Y2lhdGluZ2x5IHBhaW5mdWwgdG8gaGF2ZSB0byBsb2FkIHRoZXNlIHBhY2thZ2VzIGVhY2ggdGltZSAobm90IHJlYWxseSBidXQgc3RpbGwpLiBTbyB3aGF0IGNhbiB3ZSBkbyBpbiBmYWNlIG9mIHN1Y2ggYW4gb3JkZWFsPwoKUnN0dWRpbyBoYXMgYSBzb2x1dGlvbi4gT25jZSB5b3UgY3JlYXRlIGEgcHJvamVjdCwgbG9hZCB5b3VyIHBhY2thZ2VzIGFuZCBmaWxlcywgYnV0IGJlZm9yZSB5b3Ugd3JpdGUgYW55IGNvZGUsIGNpY2sgb24gdGhlIGNvZyBpY29uIG9uIHRoZSB1cHBlciByaWdodCBzaWRlIG9mIHRoZSBzY3JlZW4uIFRoaXMgd2lsbCB0YWtlIHlvdSB0byAqc3BhY2UgU2V0dGluZ3MqLiBIZXJlIHlvdSBjYW4gc2V0IHRoaXMgZW1wdHkgYnV0IHByZS1sb2FkZWQgcHJvamVjdCBhcyBiYXNlIHByb2plY3QgKHNlZSBiZWxvdykuIE5vdywgZXZlcnl0aW1lIHlvdSAKCgohW10oaW1hZ2VzL2ltYWdlNi5wbmcpCgpcCgojIyMjIFJtYXJrZG93bgpPaywgc28gbm93IHRoYXQgd2UgYXJlIGZhbWlsaWFyIHdpdGggcnN0dWRpbyAuY2xvdWQgZW52aXJvbm1ldG4sIGxldCdzIHVzZSBpdCBmb3Igc29tZXRoaW5nLgoKTGV0J3MgZmlyc3QgdGFsayBhIGJpdCBhYm91dCBzdGF0aXN0aWNhbCBhbmFseXNpcywgYW5kIGNyZWF0aW5nIHJlcG9ydHMgaW4gUi4gT2Z0ZW4gdGltZXMsIHlvdXIgam9iIGlzIHRvIGFuYWx5emUgYSBkYXRhc2V0LCBhbnN3ZXIgYWYgZXcgcXVlc3Rpb25zLCBhbmQgd3JpdGUgYSByZXBvcnQgd2hlcmUgeW91IHRhbGsgYWJvdXQgd2hhdCB5b3UgZm91bmQuIFJlcG9ydHMgY2FuJ3QgYmUganVzdCBhIGJ1bmNoIG9mIG51bWJlcnMgYW5kIHBsb3RzLiBZb3UgbmVlZCB0byBkZXNjcmliZSB0aGluZ3MgaW4gbGF5IHRlcm1zLiBPdGhlciBwZW9wbGUgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB5b3VyIHJlcHJvdCBhbmQgbWFrZSBzZW5zZSBvZiBpdC4gRG9pbmcgdGhpcyBpcyBub3QgZWFzeSBidXQgYXMgd2l0aCBhbnl0aGluZyBlbHNlLCB5b3UgZ2VldCBiZXR0ZXIgb3ZlcnRpbWUuIAoKRm9ydHVuYXRlbHksIHdlIGhhdmUgcnN0dWRpbyB0byBoZWxwIHVzLiBUaGUgZG9jdW1lbnQgeW91J3JlIHJlYWRpbmcgaXMgZ2VuZXJhdGVkIGluIHJzdHVkaW8uIFRoaXMgZG9jdW1lbnQgaXMgaW4gYSBmb3JtYXQgY2FsbGVkIFsqKlIgTWFya2Rvd24qKl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkuIFRoaXMgZm9ybWF0IGFsbG93cyB5b3UgdG8gY3JlYXRlIHJlcG9ydHMgdGhhdCBjb250YWluIHRoZSBjb2RlIHlvdSB3cm90ZSBmb3IgeW91ciBhbmFseXNpcywgdGhlIHJlc3VsdHMgdGhlIGFuYWx5c2lzLCBhbmQgdGhlIG5hcnJhdGl2ZSB0aGF0IGVwbGFpbmVzIHdoYXQgeW91IGRpZC4gVGhpcyBjb3VsZCBjb21lIGluIHRoZSBmb3JtIG9mIGludHJvZHVjdGlvbiwgZmluZGluZ3MsIGNvbW1lbnRzLCBzdHJhdGVneSwgZXRjLiBBbGwgb2YgdGhpcyB3aWxsIGJlaW4gb25lIHBsYWNlLiBBIGh1Z2UgY29udHJpYnV0aW9uIG9mIHRoaXMgaXMgdGhhdCBpdCBhbGxvd3MgeW91IHRvIGFuYWx5c2UgYW5kIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUuIAoKVGhlcmUgaXMgYSB0b24gb2YgbWF0ZXJpYWwgb24gUm1hcmtkb3duLiBZb3UgY2FuIHNlZSB0aGlzIG9uZSBmb3IgcmVmZXJlbmNlOiAoaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLykuIFlvdSBjYW4gYWxzbyB1c2UgY2hlYXRzaGVldHMgdGhhdCBzaG93IHlvdSBob3cgdG8gY3JlYXRlIHByb3BlciBmb3JtYXR0aW5nLiBSc3R1ZGlvLmNsb3VkIGhhcyBvbmUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL2NoZWF0c2hlZXRzL3Jhdy9tYXN0ZXIvcm1hcmtkb3duLTIuMC5wZGYpLiAKClNvIGEgcmVwb3J0IGluIFJtYXJrZG93biBoYXMgdGhyZWUgdHlwZXMgb2YgY29udGVudDogCgotIHRleHQKLSBgdmVyYmF0aW0gY29kZWAgCi0gcmVzdWx0cwoKVGV4dCBpcyBvYnZpb3VzLiBZb3UncmUgcmVhZGluZyBpdCBub3cuIFlvdSBjYW4gbWFrZSBpdCBsb29rICppdGFsaWMqLCAqKmJvbGQqKiwgfn5zdHJpa2V0aHJvdWdofn4uIFlvdSBjYW4gYWRkIGVxdWF0aW9ucyBpbiB0ZXggdGhhdCBsb29rIG5pY2U6ICRBID0gXHBpKnJeezJ9JC4gUHJldHR5IG11Y2ggYW55dGhpbmcgeW91IGNhbiBkbyBpbiBhIHRleHQgZWRpdG9yIGxpa2UgTVMgd29yZCBvciBnb29nbGUgZG9jcyBpcyBkb2FibGUgaGVyZS4gCgpUaGUgY29kZSB5b3UgdXNlIGluIHlvdXIgYW5hbHlzaXMgY2FuIGFsc28gYmUgcGFydCBvZiB5b3VyIHJlcG9ydC4gTG9vayBhdCB0aGUgY29kZSBjdXRlIHNpbmdsZSBsaW5lIGNvZGUgYmVsb3c6CgpgYGB7cn0KcGxvdChjYXJzKQpgYGAKCkl0IGlzIGluIGEgZGlmZmVyZW50IGZvcm1hdCwgaW4gYSBib3gsIGFuZCB5b3UgbWlnaHQgYmUgYWJsZSB0byBoaWRlIGl0LiBZb3UgbWlnaHQgc2F5LCB3ZWxsLCB3aHkgbm90IGp1c3Qgd3JpdGUgY29kZSBpbiB0ZXh0IGZvcm0/IFRoZSByZWFzb24gaXMsIHRoZSBjb2RlIHlvdSB3cml0ZSBpcyBleGVjdHVhYmxlLiBJdCBjYW4gYmUgKlJ1biogdG8gcHJvZHVjZSByZXN1bHRzLiBZb3UgZGVjaWRlIHdoZXRoZXIgdG8gc2hvdyB0aGUgY29kZSwgaXRzIG91dHB1dCBvciByZXN1bHRzIGluIHlvdXIgcmVwb3J0LgoKSWYgd2UgZXhlY3V0ZSBodGUgY29kZSBhYm92ZSwgYW5kIHNob3cgdGhlIHJldXNsdHMgaW4gdGhlIHJlcG9ydCBidXQgbm90IHRoZSBjb2RlLCBpdCdsbCBsaW9vayBsaWtlIHRoaXM6CgpgYGB7ciwgZWNobz1GQUxTRX0KcGxvdChjYXJzKQpgYGAKCgojIyMjIFNvbWUgdGlwczogCgotIFlvdSBjYW4gcnVuIGEgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCi0gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgKipub3RlYm9vayoqLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCi0gQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCi0gV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4KLSBUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgpcCiMjIyMgTGFiIEV4ZXJjaXNlOgoKTGV0J3MgbG9hZCBhIGRhdGFzZXQgYW5kIHJ1biBzb21lIGNvbW1hbmRzLiBUZXJlIGlzIGEgZGF0YXNldCBpbiB0aGUgKipMYWIgMSoqIGZvbGRlciBjYWxsZWQgYEZpbG1fUGVybWl0cy5jc3ZgLgoKV2UgY2FuIGxvYWQgaXQgdXNpbmcgdGhlIGNvZGUgYmVsb3c6CgpgYGB7cn0KZmlsbXM8LXJlYWQuY3N2KCIuLi9MYWIgMS9GaWxtX1Blcm1pdHMuY3N2IiwgaGVhZGVyID0gVCwgc2VwID0gIiwiKQpgYGAKCk5vdGUgdGhhdCB0aGVyZSBpcyBubyBvdXRwdXQuIEhvdyBkbyBJIGtub3cgSSBvcGVuZWQgdGhlIGRhdGEgZmlsZSB0aGVuPyBXZWxsLCBvbiB0aGUgdG9wIHJpZ2h0IHdpbmRvdywgdW5kZXIgdGhlICoqRW52aXJvbm1lbnQqKiB0YWIsIHRoZXJlIGlzIGEgbmV3IGxpbmUgdGhhdCBzYXlzLCBmaWxtcyBhbmQgNTA3Mjggb2JzLiBvZiAxNCB2YXJpYWJsZXMuIAoKSG93IGFib3V0IHdlIHRha2Ugc25lYWsgcGVlayBvZiB3aGF0IHRoZSBkYXRhc2V0IGxvb2tzIGxpa2U/IFJ1biB0aGUgY29kZSBiZWxvdzoKCmBgYHtyfQpWaWV3KGZpbG1zKQpgYGAKCldvaGEsIHNlZSB3aGF0IGhhcHBlbmVkPyBZb3Ugc2hvdWxkIHNlZSBzb210aGluZyBsaWtlIHRoaXM6CgohW10oaW1hZ2VzL1NjcmVlbiBTaG90IDIwMjAtMDItMDUgYXQgNC41MS4xOSBQTS5wbmcpCgpUaGlzIGlzIHdoYXQgdGhlIGRhdGFzZXQgbG9va3MgbGlrZSBpbiBtZW1vcnkuIFNwZW5kIHNvbWV0aW1lIGFuZCBnZXQgZmFtaWxpYXIgd2l0aCBlYWNoIHZhcmlhYmxlLiBXaGF0IGRvIHlvdSBzZWUuIFdoYXQgZG8geW91IHRoaW5rIHdhY2ggdmFyaWFibGUgbWVhbnM/IEhvdyBpcyBpdCBtZWFzdXJlZD8KClRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGxvb2sgYXQgb3VyIGRhdGFzZXQuIEZvciBleGFtcGxlLCBydW4gdGhlIGNvbW1hbmQgYmVsb3c6CgpgYGB7ciwgaW5jbHVkZT1UUlVFfQpzdHIoZmlsbXMpCmBgYAoKCk5vdGUgdGhhdCB3ZSBjYW4gc2VlIHRoZSBjb2RlJ3Mgb3V0cHV0IGluIHRoZSB0ZXh0LiBIYXZlIGEgbG9vayBhdCB3aGF0IGNoYW5nZWQuIEkgbWFkZSBhIHNtYWxsIGNoYW5nZSBhbmQgbm93IHRoZSBvdXRwdXQgaXMgc2hvd2luZyBpbiB0aGUgdGV4dC4gQ25hIHlvdSBzcG90IHRoZSBkaWZmZXJlbmNlPyBXZSdsbCBnZXQgYmFjayB0byB0aGlzIGxhdGVyLiAKCk9rLCBob3cgYWJvdXQgYSBzdW1tYXJ5PyAKCmBgYHtyLH0Kc3VtbWFyeShmaWxtcykKYGBgCgpgc3VtbWFyeWAgaXMgYSB2ZXJ5IHVzZWZ1bCBjb21tYW5kLiBJdCBiYXNpY2FsbHkgdGVsbHMgeW91IHdoYXQgZWFjaCBjb2x1bW4gaW4geW91ciBkYXRhc2V0IGhvbGRzLCB0aGVpciBmb3JtYXQsIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggY2FzZSBvY2NvdXJzIGluIGVhY2ggY29sdW1uLgoKT25lIG90aGVyIHdheSB0byBjaGVjayB5b3VyIGRhdGFzZXQgaXMgdG8gbG9vayBhdCB0aGUgZmlyc3QgZmV3IHJvd3MuIFJ1biB0aGlzOgoKYGBge3IsIGluY2x1ZGU9VFJVRX0KaGVhZChmaWxtcykKYGBgCgpgSGVhZGAgY29tbWFuZCBzaG93cyB5b3UgdGhlIGZpcnN0IGZpdmUgcm93cyBieSBkZWZhdWx0LiBZb3UgY2FuIGFzayBmb3IgbW9yZS4gUnVuIHRoaXM6IAoKYGBge3IsIGluY2x1ZGU9VFJVRX0KaGVhZChmaWxtcywgMTApCmBgYAoKTm93LCBsZXQncyBydW4gYSB0aGUgY29kZXMgYmVsb3csIGFuZCB3cml0ZSBkb3duIHdoYXQgZWFjaCBvZiB0aGVtIGRvOgoKYGBge3J9CmRpbShmaWxtcykKYGBgCgoKYGBge3J9Cm5yb3coZmlsbXMpCmBgYAoKCmBgYHtyfQpuY29sKGZpbG1zKQpgYGAKCmBgYHtyfQpwcmludChmaWxtcyRCb3JvdWdoKQpgYGAKCmBgYHtyfQp0YWJsZShmaWxtcyRCb3JvdWdoKQpgYGAKCgoKCg==