diff --git a/cheatsheet.Rmd b/cheatsheet.Rmd
index dd5b644..99d59c0 100644
--- a/cheatsheet.Rmd
+++ b/cheatsheet.Rmd
@@ -2,18 +2,18 @@
title: "Introduction to R for Biologists cheatsheet"
author: "Maria Doyle"
date: "`r format(Sys.time(), '%d %B %Y')`"
-output:
+output:
html_notebook:
toc: yes
- toc_float: yes
toc_depth: 4
+ toc_float: yes
subtitle: glossary of vocabulary used in the course
---
## Packages
**dplyr**
-tidyverse package for manipulating data, contains the `mutate()` and `filter()` functions and the `%>%` operator
+tidyverse package for manipulating data, contains the `mutate()`, `filter()`, `select()`, `full_join()` functions and the `%>%` operator
**ggplot2**
tidyverse package for data visualisation
@@ -57,12 +57,15 @@ convert values to factor data type (from base R)
**`filter()`**
choose rows (from dplyr)
-**`full_join()`**
+**`full_join()`**
joins 2 tables returning all rows and all columns from both tables.
**`gather()`**
function that enables converting from wide to long (tidy) format (from dplyr)
+**`getwd()`**
+find out what the working directory is (get working directory)
+
**`ggplot()`**
function used to create a ggplot (from ggplot2)
@@ -96,6 +99,9 @@ read a comma-separated file into R (from readr)
**`read_tsv()`**
read a tab-separated file into R (from readr)
+**`select()`**
+choose columns (from dplyr)
+
**`str()`**
showing the structure of an object (from base R). Useful for checking data types.
@@ -113,7 +119,7 @@ invoke a spreadsheet-like viewer on an R object (from base R)
## Terms
-**argument**
+**argument**
an input to a function
**assignment operator**
@@ -128,7 +134,7 @@ a window where you can interactively type in commands and the output is returned
**double**
a data type in R, used to represent numbers containing a decimal point (integer is the data type for numbers without decimal point)
-**factor**
+**factor**
a data type in R, used to represent categories
**function**
@@ -140,7 +146,7 @@ type of ggplot e.g. `geom_line()`, `geom_point()`, `geom_jitter()`, `geom_boxplo
**object**
everything in R is an object. The assignment operator `<-` can be used to create objects. Note that what R calls objects are called variables in other languages such as Python.
-**package**
+**package**
a package is a collection of functions and usually includes code, documentation, tests and example datasets.
**pipe**
@@ -155,7 +161,7 @@ a text file containing commands, in R a script filename ends with .R
**themes**
the non-data components of a ggplot e.g. background, grid lines, font size and font type
-**working directory**
+**working directory**
the location (path) where R looks to read in data and save files
\
diff --git a/cheatsheet.nb.html b/cheatsheet.nb.html
index 07f2bf4..9519593 100644
--- a/cheatsheet.nb.html
+++ b/cheatsheet.nb.html
@@ -11,7 +11,7 @@
-
+
Introduction to R for Biologists cheatsheet
@@ -273,7 +273,7 @@
Introduction to R for Biologists cheatsheet
glossary of vocabulary used in the course
Maria Doyle
-02 October 2019
+03 October 2019
@@ -282,7 +282,7 @@ 02 October 2019
Packages
dplyr
-tidyverse package for manipulating data, contains the mutate()
and filter()
functions and the %>%
operator
+tidyverse package for manipulating data, contains the
mutate()
,
filter()
,
select()
,
full_join()
functions and the
%>%
operator
ggplot2
tidyverse package for data visualisation
readr
@@ -311,9 +311,12 @@
Functions
convert values to factor data type (from base R)
filter()
choose rows (from dplyr)
-
full_join()
joins 2 tables returning all rows and all columns from both tables.
+
full_join()
+joins 2 tables returning all rows and all columns from both tables.
gather()
function that enables converting from wide to long (tidy) format (from dplyr)
+
getwd()
+find out what the working directory is (get working directory)
ggplot()
function used to create a ggplot (from ggplot2)
head()
@@ -336,6 +339,8 @@
Functions
read a comma-separated file into R (from readr)
read_tsv()
read a tab-separated file into R (from readr)
+
select()
+choose columns (from dplyr)
str()
showing the structure of an object (from base R). Useful for checking data types.
summary()
@@ -348,7 +353,8 @@
Functions
Terms
-
argument an input to a function
+
argument
+an input to a function
assignment operator
<-
assigns values to objects, assigns a value on the right to an object on the left (from base R)
character
@@ -357,14 +363,16 @@
Terms
a window where you can interactively type in commands and the output is returned
double
a data type in R, used to represent numbers containing a decimal point (integer is the data type for numbers without decimal point)
-
factor a data type in R, used to represent categories
+
factor
+a data type in R, used to represent categories
function
a pre-defined set of commands used to perform a task, can be loaded in from packages or user-created
geom
type of ggplot e.g. geom_line()
, geom_point()
, geom_jitter()
, geom_boxplot()
, geom_violin()
object
everything in R is an object. The assignment operator <-
can be used to create objects. Note that what R calls objects are called variables in other languages such as Python.
-
package a package is a collection of functions and usually includes code, documentation, tests and example datasets.
+
package
+a package is a collection of functions and usually includes code, documentation, tests and example datasets.
pipe
%>%
operator chains together tidyverse commands (from dplyr)
scales
@@ -373,7 +381,8 @@
Terms
a text file containing commands, in R a script filename ends with .R
themes
the non-data components of a ggplot e.g. background, grid lines, font size and font type
-
working directory the location (path) where R looks to read in data and save files
+
working directory
+the location (path) where R looks to read in data and save files
@@ -404,7 +413,7 @@
Symbols
-LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIFIgZm9yIEJpb2xvZ2lzdHMgY2hlYXRzaGVldCIKYXV0aG9yOiAiTWFyaWEgRG95bGUiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCICVZJylgIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIHRvY19kZXB0aDogNApzdWJ0aXRsZTogZ2xvc3Nhcnkgb2Ygdm9jYWJ1bGFyeSB1c2VkIGluIHRoZSBjb3Vyc2UKLS0tCgojIyBQYWNrYWdlcwoKKipkcGx5cioqICAKdGlkeXZlcnNlIHBhY2thZ2UgZm9yIG1hbmlwdWxhdGluZyBkYXRhLCBjb250YWlucyB0aGUgYG11dGF0ZSgpYCBhbmQgYGZpbHRlcigpYCBmdW5jdGlvbnMgYW5kIHRoZSBgJT4lYCBvcGVyYXRvcgoKKipnZ3Bsb3QyKiogIAp0aWR5dmVyc2UgcGFja2FnZSBmb3IgZGF0YSB2aXN1YWxpc2F0aW9uIAoKKipyZWFkcioqICAKdGlkeXZlcnNlIHBhY2thZ2UgZm9yIHJlYWRpbmcgZGF0YSBpbnRvIFIsIGNvbnRhaW5zIHRoZSBgcmVhZF90c3YoKWAgZnVuY3Rpb24KCioqdGlkeXIqKiAgCnRpZHl2ZXJzZSBwYWNrYWdlIGZvciBkYXRhIHRpZHlpbmcsIGNvbnRhaW5zIHRoZSBgZ2F0aGVyKClgIGZ1bmN0aW9uCgoqKnRpZHl2ZXJzZSoqICAKYSBjb2xsZWN0aW9uIG9mIHBhY2thZ2VzIHRoYXQgd29yayB0b2dldGhlciBmb3IgZGF0YSByZWFkaW5nLCB0aWR5aW5nLCBtYW5pcHVsYXRpbmcgYW5kIHZpc3VhbGlzaW5nCgoKXCAKCgojIyBGdW5jdGlvbnMKCioqYGMoKWAqKiAgCmNvbWJpbmUgdmFsdWVzIChmcm9tIGJhc2UgUikgIAogIAoqKmBjYXNlX3doZW4oKWAqKiAgCnRlc3QgbXVsdGlwbGUgY29uZGl0aW9ucyAoZnJvbSBkcGx5ciksIHVzZWZ1bCBpbnNpZGUgYG11dGF0ZSgpYCB3aGVuIGNyZWF0aW5nIGNvbHVtbnMKICAKKipgY29sbmFtZXMoKWAqKiAgCmFjY2VzcyBjb2x1bW4gbmFtZXMgKGZyb20gYmFzZSBSKQogIAoqKmBjb2xvdXJzKClgKiogIApzZWUgdGhlIGJ1aWx0LWluIFIgY29sb3VycyAoZnJvbSBiYXNlIFIpCiAgCioqYGRldi5vZmYoKWAqKiAgCnR1cm4gb2ZmIHRoZSBSIGdyYXBoaWNzIGRldmljZSAoZnJvbSBiYXNlIFIpLiBVc2VkIGFmdGVyIGUuZy4gYHBkZigpYCwgYHBuZygpYC4KICAKKipgZGltKClgKiogIApyZXRyaWV2ZSB0aGUgZGltZW5zaW9ucyBvZiBhbiBvYmplY3QsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgKGZyb20gYmFzZSBSKQogIAoqKmBmYWN0b3IoKWAqKiAgCmNvbnZlcnQgdmFsdWVzIHRvIGZhY3RvciBkYXRhIHR5cGUgKGZyb20gYmFzZSBSKQoKKipgZmlsdGVyKClgKiogIApjaG9vc2Ugcm93cyAoZnJvbSBkcGx5cikKCioqYGZ1bGxfam9pbigpYCoqCmpvaW5zIDIgdGFibGVzIHJldHVybmluZyBhbGwgcm93cyBhbmQgYWxsIGNvbHVtbnMgZnJvbSBib3RoIHRhYmxlcy4KCioqYGdhdGhlcigpYCoqICAKZnVuY3Rpb24gdGhhdCBlbmFibGVzIGNvbnZlcnRpbmcgZnJvbSB3aWRlIHRvIGxvbmcgKHRpZHkpIGZvcm1hdCAoZnJvbSBkcGx5cikKCioqYGdncGxvdCgpYCoqICAKZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYSBnZ3Bsb3QgKGZyb20gZ2dwbG90MikKCioqYGhlYWQoKWAqKiAgCnNlbGVjdGluZyB0aGUgZmlyc3QgcGFydCBvZiBhbiBvYmplY3QgKGZyb20gYmFzZSBSKS4gRGVmYXVsdCBpcyB0byBzaG93IHRoZSBmaXJzdCA2IGl0ZW1zLgoKKipgbGFicygpYCoqICAKbW9kaWZ5IHRpdGxlLCBheGlzIGFuZCBsZWdlbmQgbGFiZWxzIG9uIGEgZ2dwbG90IChmcm9tIGdncGxvdDIpCgoqKmBsZXZlbHMoKWAqKiAgCnJldHJpZXZlIHRoZSBsZXZlbHMgKGNhdGVnb3J5IG5hbWVzKSBvZiBhIGZhY3RvciAoZnJvbSBiYXNlIFIpCgoqKmBsaWJyYXJ5KClgKiogIApsb2FkIHBhY2thZ2VzIChmcm9tIGJhc2UgUikKCioqYGxvZzIoKWAqKiAgCmNvbXB1dGUgdGhlIGxvZzIgKGJhc2UgMikgbG9nYXJpdGhtcyAoZnJvbSBiYXNlIFIpCgoqKmBtdXRhdGUoKWAqKiAgCmFkZCBjb2x1bW5zIChmcm9tIGRwbHlyKQoKKipgcGRmKClgKiogIApjcmVhdGUgYSBwZGYsIHVzZWQgd2l0aCBgZGV2Lm9mZigpYCAoZnJvbSBiYXNlIFIpCgoqKmBwdWxsKClgKiogIApleHRyYWN0IHZhbHVlcyBlLmcuIG91dCBvZiBhIGNvbHVtbiAoZnJvbSBkcGx5cikKCioqYHJlYWRfY3N2KClgKiogIApyZWFkIGEgY29tbWEtc2VwYXJhdGVkIGZpbGUgaW50byBSIChmcm9tIHJlYWRyKQoKKipgcmVhZF90c3YoKWAqKiAgCnJlYWQgYSB0YWItc2VwYXJhdGVkIGZpbGUgaW50byBSIChmcm9tIHJlYWRyKQoKKipgc3RyKClgKiogIApzaG93aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgYW4gb2JqZWN0IChmcm9tIGJhc2UgUikuIFVzZWZ1bCBmb3IgY2hlY2tpbmcgZGF0YSB0eXBlcy4KCioqYHN1bW1hcnkoKWAqKiAgCnByb2R1Y2luZyBhIHN1bW1hcnkgb2YgYW4gb2JqZWN0IChmcm9tIGJhc2UgUikuIFVzZWZ1bCBmb3IgZ2V0dGluZyBzdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgbnVtZXJpYyBjb2x1bW5zIChtaW4sIG1heCwgbWVhbiwgbWVkaWFuKQoKKipgdGFpbCgpYCoqICAKc2VsZWN0aW5nIHRoZSBsYXN0IHBhcnQgb2YgYW4gb2JqZWN0IChmcm9tIGJhc2UgUikuIERlZmF1bHQgaXMgdG8gc2hvdyB0aGUgbGFzdCA2IGl0ZW1zLgoKKipgVmlldygpYCoqICAKaW52b2tlIGEgc3ByZWFkc2hlZXQtbGlrZSB2aWV3ZXIgb24gYW4gUiBvYmplY3QgKGZyb20gYmFzZSBSKQoKClwgCgojIyBUZXJtcwoKKiphcmd1bWVudCoqCmFuIGlucHV0IHRvIGEgZnVuY3Rpb24KCioqYXNzaWdubWVudCBvcGVyYXRvcioqICAKYDwtYCBhc3NpZ25zIHZhbHVlcyB0byBvYmplY3RzLCBhc3NpZ25zIGEgdmFsdWUgb24gdGhlIHJpZ2h0IHRvIGFuIG9iamVjdCBvbiB0aGUgbGVmdCAoZnJvbSBiYXNlIFIpIAoKKipjaGFyYWN0ZXIqKiAgCmEgZGF0YSB0eXBlIGluIFIsIHVzZWQgdG8gcmVwcmVzZW50IGNoYXJhY3RlciBzdHJpbmdzLCBxdW90ZXMgaW5kaWNhdGUgdGhlIGRhdGEgdHlwZSBpcyBjaGFyYWN0ZXIKCioqY29uc29sZSoqICAKYSB3aW5kb3cgd2hlcmUgeW91IGNhbiBpbnRlcmFjdGl2ZWx5IHR5cGUgaW4gY29tbWFuZHMgYW5kIHRoZSBvdXRwdXQgaXMgcmV0dXJuZWQKCioqZG91YmxlKiogIAphIGRhdGEgdHlwZSBpbiBSLCB1c2VkIHRvIHJlcHJlc2VudCBudW1iZXJzIGNvbnRhaW5pbmcgYSBkZWNpbWFsIHBvaW50IChpbnRlZ2VyIGlzIHRoZSBkYXRhIHR5cGUgZm9yIG51bWJlcnMgd2l0aG91dCBkZWNpbWFsIHBvaW50KQoKKipmYWN0b3IqKgphIGRhdGEgdHlwZSBpbiBSLCB1c2VkIHRvIHJlcHJlc2VudCBjYXRlZ29yaWVzCgoqKmZ1bmN0aW9uKiogICAKYSBwcmUtZGVmaW5lZCBzZXQgb2YgY29tbWFuZHMgdXNlZCB0byBwZXJmb3JtIGEgdGFzaywgY2FuIGJlIGxvYWRlZCBpbiBmcm9tIHBhY2thZ2VzIG9yIHVzZXItY3JlYXRlZAoKKipnZW9tKiogIAp0eXBlIG9mIGdncGxvdCBlLmcuIGBnZW9tX2xpbmUoKWAsIGBnZW9tX3BvaW50KClgLCBgZ2VvbV9qaXR0ZXIoKWAsIGBnZW9tX2JveHBsb3QoKWAsIGBnZW9tX3Zpb2xpbigpYAoKKipvYmplY3QqKiAgCmV2ZXJ5dGhpbmcgaW4gUiBpcyBhbiBvYmplY3QuIFRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIGA8LWAgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG9iamVjdHMuIE5vdGUgdGhhdCB3aGF0IFIgY2FsbHMgb2JqZWN0cyBhcmUgY2FsbGVkIHZhcmlhYmxlcyBpbiBvdGhlciBsYW5ndWFnZXMgc3VjaCBhcyBQeXRob24uCgoqKnBhY2thZ2UqKgphIHBhY2thZ2UgaXMgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyBhbmQgdXN1YWxseSBpbmNsdWRlcyBjb2RlLCBkb2N1bWVudGF0aW9uLCB0ZXN0cyBhbmQgZXhhbXBsZSBkYXRhc2V0cy4KCioqcGlwZSoqICAKYCU+JWAgb3BlcmF0b3IgY2hhaW5zIHRvZ2V0aGVyIHRpZHl2ZXJzZSBjb21tYW5kcyAoZnJvbSBkcGx5cikKCioqc2NhbGVzKiogIApzY2FsZV9maWxsX21hbnVhbCgpLCBzY2FsZV9jb2xvdXJfbWFudWFsKCksIHNjYWxlX2ZpbGxfYnJld2VyKCksIHNjYWxlX2NvbG91cl9icmV3ZXIoKS4gVXNlIHRvIHNwZWNpZnkgY29sb3Vycy4KCioqc2NyaXB0KiogIAphIHRleHQgZmlsZSBjb250YWluaW5nIGNvbW1hbmRzLCBpbiBSIGEgc2NyaXB0IGZpbGVuYW1lIGVuZHMgd2l0aCAuUgoKKip0aGVtZXMqKiAgCnRoZSBub24tZGF0YSBjb21wb25lbnRzIG9mIGEgZ2dwbG90IGUuZy4gYmFja2dyb3VuZCwgZ3JpZCBsaW5lcywgZm9udCBzaXplIGFuZCBmb250IHR5cGUKCioqd29ya2luZyBkaXJlY3RvcnkqKgp0aGUgbG9jYXRpb24gKHBhdGgpIHdoZXJlIFIgbG9va3MgdG8gcmVhZCBpbiBkYXRhIGFuZCBzYXZlIGZpbGVzCgpcIAoKIyNTeW1ib2xzIyMKCioqYD5gKiogIApwcm9tcHQgaW4gY29uc29sZSwgbWVhbnMgUiBpcyByZWFkeSB0byB0YWtlIGEgY29tbWFuZAogICAKXCAgICAKKipgK2AqKiAgCnVzZWQgdG8gYWRkIGxheWVycyB0byBhIGdncGxvdC4gQWxzbyB0aGUgcHJvbXB0IHN5bWJvbCBSIHVzZXMgd2hlbiB0aGUgY29tbWFuZCBpcyBub3QgY29tcGxldGUsIHN1Y2ggYXMgbWlzc2luZyBhIGApYAogIApcICAgIAoqKmA8LWAqKiAgCmFzc2lnbm1lbnQgb3BlcmF0b3IsIHNlZSBUZXJtcyBhYm92ZSAgCgpcICAgIAoqKmAjYCoqICAKY29tbWVudCwgdG8gYWRkIG5vdGVzIHRvIGEgc2NyaXB0ICAKICAKXCAgIAoqKmAkYCoqICAKd2F5IHRvIGFjY2VzcyBhIHNpbmdsZSBjb2x1bW4gd2l0aCBiYXNlIFIgZS5nLiBgY291bnRzJGdlbmVfc3ltYm9sYCAgCiAgClwgICAKKipgJWluJWAqKiAgCm9wZXJhdG9yIHVzZWQgdG8gdGVzdCBpZiBhIHZhbHVlIGlzIGluIGEgc2V0IG9mIHZhbHVlcyAgCiAgClwgICAKKipgJT4lYCoqICAKZHBseXIgcGlwZSBvcGVyYXRvciwgc2VlIFRlcm1zIGFib3ZlICAKICAKXCAgIAoqKmB+YCoqICAKc3ltYm9sIHRvIHVzZSB3aGVuIGZhY2V0aW5nIGluIGdncGxvdDIsIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGNvbHVtbiB0byB1c2UgdG8gZmFjZXQK
+LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIFIgZm9yIEJpb2xvZ2lzdHMgY2hlYXRzaGVldCIKYXV0aG9yOiAiTWFyaWEgRG95bGUiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCnN1YnRpdGxlOiBnbG9zc2FyeSBvZiB2b2NhYnVsYXJ5IHVzZWQgaW4gdGhlIGNvdXJzZQotLS0KCiMjIFBhY2thZ2VzCgoqKmRwbHlyKiogIAp0aWR5dmVyc2UgcGFja2FnZSBmb3IgbWFuaXB1bGF0aW5nIGRhdGEsIGNvbnRhaW5zIHRoZSBgbXV0YXRlKClgLCBgZmlsdGVyKClgLCBgc2VsZWN0KClgLCBgZnVsbF9qb2luKClgIGZ1bmN0aW9ucyBhbmQgdGhlIGAlPiVgIG9wZXJhdG9yCgoqKmdncGxvdDIqKiAgCnRpZHl2ZXJzZSBwYWNrYWdlIGZvciBkYXRhIHZpc3VhbGlzYXRpb24gCgoqKnJlYWRyKiogIAp0aWR5dmVyc2UgcGFja2FnZSBmb3IgcmVhZGluZyBkYXRhIGludG8gUiwgY29udGFpbnMgdGhlIGByZWFkX3RzdigpYCBmdW5jdGlvbgoKKip0aWR5cioqICAKdGlkeXZlcnNlIHBhY2thZ2UgZm9yIGRhdGEgdGlkeWluZywgY29udGFpbnMgdGhlIGBnYXRoZXIoKWAgZnVuY3Rpb24KCioqdGlkeXZlcnNlKiogIAphIGNvbGxlY3Rpb24gb2YgcGFja2FnZXMgdGhhdCB3b3JrIHRvZ2V0aGVyIGZvciBkYXRhIHJlYWRpbmcsIHRpZHlpbmcsIG1hbmlwdWxhdGluZyBhbmQgdmlzdWFsaXNpbmcKCgpcIAoKCiMjIEZ1bmN0aW9ucwoKKipgYygpYCoqICAKY29tYmluZSB2YWx1ZXMgKGZyb20gYmFzZSBSKSAgCiAgCioqYGNhc2Vfd2hlbigpYCoqICAKdGVzdCBtdWx0aXBsZSBjb25kaXRpb25zIChmcm9tIGRwbHlyKSwgdXNlZnVsIGluc2lkZSBgbXV0YXRlKClgIHdoZW4gY3JlYXRpbmcgY29sdW1ucwogIAoqKmBjb2xuYW1lcygpYCoqICAKYWNjZXNzIGNvbHVtbiBuYW1lcyAoZnJvbSBiYXNlIFIpCiAgCioqYGNvbG91cnMoKWAqKiAgCnNlZSB0aGUgYnVpbHQtaW4gUiBjb2xvdXJzIChmcm9tIGJhc2UgUikKICAKKipgZGV2Lm9mZigpYCoqICAKdHVybiBvZmYgdGhlIFIgZ3JhcGhpY3MgZGV2aWNlIChmcm9tIGJhc2UgUikuIFVzZWQgYWZ0ZXIgZS5nLiBgcGRmKClgLCBgcG5nKClgLgogIAoqKmBkaW0oKWAqKiAgCnJldHJpZXZlIHRoZSBkaW1lbnNpb25zIG9mIGFuIG9iamVjdCwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyAoZnJvbSBiYXNlIFIpCiAgCioqYGZhY3RvcigpYCoqICAKY29udmVydCB2YWx1ZXMgdG8gZmFjdG9yIGRhdGEgdHlwZSAoZnJvbSBiYXNlIFIpCgoqKmBmaWx0ZXIoKWAqKiAgCmNob29zZSByb3dzIChmcm9tIGRwbHlyKQoKKipgZnVsbF9qb2luKClgKiogIApqb2lucyAyIHRhYmxlcyByZXR1cm5pbmcgYWxsIHJvd3MgYW5kIGFsbCBjb2x1bW5zIGZyb20gYm90aCB0YWJsZXMuCgoqKmBnYXRoZXIoKWAqKiAgCmZ1bmN0aW9uIHRoYXQgZW5hYmxlcyBjb252ZXJ0aW5nIGZyb20gd2lkZSB0byBsb25nICh0aWR5KSBmb3JtYXQgKGZyb20gZHBseXIpCgoqKmBnZXR3ZCgpYCoqICAKZmluZCBvdXQgd2hhdCB0aGUgd29ya2luZyBkaXJlY3RvcnkgaXMgKGdldCB3b3JraW5nIGRpcmVjdG9yeSkKCioqYGdncGxvdCgpYCoqICAKZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYSBnZ3Bsb3QgKGZyb20gZ2dwbG90MikKCioqYGhlYWQoKWAqKiAgCnNlbGVjdGluZyB0aGUgZmlyc3QgcGFydCBvZiBhbiBvYmplY3QgKGZyb20gYmFzZSBSKS4gRGVmYXVsdCBpcyB0byBzaG93IHRoZSBmaXJzdCA2IGl0ZW1zLgoKKipgbGFicygpYCoqICAKbW9kaWZ5IHRpdGxlLCBheGlzIGFuZCBsZWdlbmQgbGFiZWxzIG9uIGEgZ2dwbG90IChmcm9tIGdncGxvdDIpCgoqKmBsZXZlbHMoKWAqKiAgCnJldHJpZXZlIHRoZSBsZXZlbHMgKGNhdGVnb3J5IG5hbWVzKSBvZiBhIGZhY3RvciAoZnJvbSBiYXNlIFIpCgoqKmBsaWJyYXJ5KClgKiogIApsb2FkIHBhY2thZ2VzIChmcm9tIGJhc2UgUikKCioqYGxvZzIoKWAqKiAgCmNvbXB1dGUgdGhlIGxvZzIgKGJhc2UgMikgbG9nYXJpdGhtcyAoZnJvbSBiYXNlIFIpCgoqKmBtdXRhdGUoKWAqKiAgCmFkZCBjb2x1bW5zIChmcm9tIGRwbHlyKQoKKipgcGRmKClgKiogIApjcmVhdGUgYSBwZGYsIHVzZWQgd2l0aCBgZGV2Lm9mZigpYCAoZnJvbSBiYXNlIFIpCgoqKmBwdWxsKClgKiogIApleHRyYWN0IHZhbHVlcyBlLmcuIG91dCBvZiBhIGNvbHVtbiAoZnJvbSBkcGx5cikKCioqYHJlYWRfY3N2KClgKiogIApyZWFkIGEgY29tbWEtc2VwYXJhdGVkIGZpbGUgaW50byBSIChmcm9tIHJlYWRyKQoKKipgcmVhZF90c3YoKWAqKiAgCnJlYWQgYSB0YWItc2VwYXJhdGVkIGZpbGUgaW50byBSIChmcm9tIHJlYWRyKQoKKipgc2VsZWN0KClgKiogIApjaG9vc2UgY29sdW1ucyAoZnJvbSBkcGx5cikKCioqYHN0cigpYCoqICAKc2hvd2luZyB0aGUgc3RydWN0dXJlIG9mIGFuIG9iamVjdCAoZnJvbSBiYXNlIFIpLiBVc2VmdWwgZm9yIGNoZWNraW5nIGRhdGEgdHlwZXMuCgoqKmBzdW1tYXJ5KClgKiogIApwcm9kdWNpbmcgYSBzdW1tYXJ5IG9mIGFuIG9iamVjdCAoZnJvbSBiYXNlIFIpLiBVc2VmdWwgZm9yIGdldHRpbmcgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIG51bWVyaWMgY29sdW1ucyAobWluLCBtYXgsIG1lYW4sIG1lZGlhbikKCioqYHRhaWwoKWAqKiAgCnNlbGVjdGluZyB0aGUgbGFzdCBwYXJ0IG9mIGFuIG9iamVjdCAoZnJvbSBiYXNlIFIpLiBEZWZhdWx0IGlzIHRvIHNob3cgdGhlIGxhc3QgNiBpdGVtcy4KCioqYFZpZXcoKWAqKiAgCmludm9rZSBhIHNwcmVhZHNoZWV0LWxpa2Ugdmlld2VyIG9uIGFuIFIgb2JqZWN0IChmcm9tIGJhc2UgUikKCgpcIAoKIyMgVGVybXMKCioqYXJndW1lbnQqKiAgCmFuIGlucHV0IHRvIGEgZnVuY3Rpb24KCioqYXNzaWdubWVudCBvcGVyYXRvcioqICAKYDwtYCBhc3NpZ25zIHZhbHVlcyB0byBvYmplY3RzLCBhc3NpZ25zIGEgdmFsdWUgb24gdGhlIHJpZ2h0IHRvIGFuIG9iamVjdCBvbiB0aGUgbGVmdCAoZnJvbSBiYXNlIFIpIAoKKipjaGFyYWN0ZXIqKiAgCmEgZGF0YSB0eXBlIGluIFIsIHVzZWQgdG8gcmVwcmVzZW50IGNoYXJhY3RlciBzdHJpbmdzLCBxdW90ZXMgaW5kaWNhdGUgdGhlIGRhdGEgdHlwZSBpcyBjaGFyYWN0ZXIKCioqY29uc29sZSoqICAKYSB3aW5kb3cgd2hlcmUgeW91IGNhbiBpbnRlcmFjdGl2ZWx5IHR5cGUgaW4gY29tbWFuZHMgYW5kIHRoZSBvdXRwdXQgaXMgcmV0dXJuZWQKCioqZG91YmxlKiogIAphIGRhdGEgdHlwZSBpbiBSLCB1c2VkIHRvIHJlcHJlc2VudCBudW1iZXJzIGNvbnRhaW5pbmcgYSBkZWNpbWFsIHBvaW50IChpbnRlZ2VyIGlzIHRoZSBkYXRhIHR5cGUgZm9yIG51bWJlcnMgd2l0aG91dCBkZWNpbWFsIHBvaW50KQoKKipmYWN0b3IqKiAgCmEgZGF0YSB0eXBlIGluIFIsIHVzZWQgdG8gcmVwcmVzZW50IGNhdGVnb3JpZXMKCioqZnVuY3Rpb24qKiAgIAphIHByZS1kZWZpbmVkIHNldCBvZiBjb21tYW5kcyB1c2VkIHRvIHBlcmZvcm0gYSB0YXNrLCBjYW4gYmUgbG9hZGVkIGluIGZyb20gcGFja2FnZXMgb3IgdXNlci1jcmVhdGVkCgoqKmdlb20qKiAgCnR5cGUgb2YgZ2dwbG90IGUuZy4gYGdlb21fbGluZSgpYCwgYGdlb21fcG9pbnQoKWAsIGBnZW9tX2ppdHRlcigpYCwgYGdlb21fYm94cGxvdCgpYCwgYGdlb21fdmlvbGluKClgCgoqKm9iamVjdCoqICAKZXZlcnl0aGluZyBpbiBSIGlzIGFuIG9iamVjdC4gVGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IgYDwtYCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgb2JqZWN0cy4gTm90ZSB0aGF0IHdoYXQgUiBjYWxscyBvYmplY3RzIGFyZSBjYWxsZWQgdmFyaWFibGVzIGluIG90aGVyIGxhbmd1YWdlcyBzdWNoIGFzIFB5dGhvbi4KCioqcGFja2FnZSoqICAKYSBwYWNrYWdlIGlzIGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgYW5kIHVzdWFsbHkgaW5jbHVkZXMgY29kZSwgZG9jdW1lbnRhdGlvbiwgdGVzdHMgYW5kIGV4YW1wbGUgZGF0YXNldHMuCgoqKnBpcGUqKiAgCmAlPiVgIG9wZXJhdG9yIGNoYWlucyB0b2dldGhlciB0aWR5dmVyc2UgY29tbWFuZHMgKGZyb20gZHBseXIpCgoqKnNjYWxlcyoqICAKc2NhbGVfZmlsbF9tYW51YWwoKSwgc2NhbGVfY29sb3VyX21hbnVhbCgpLCBzY2FsZV9maWxsX2JyZXdlcigpLCBzY2FsZV9jb2xvdXJfYnJld2VyKCkuIFVzZSB0byBzcGVjaWZ5IGNvbG91cnMuCgoqKnNjcmlwdCoqICAKYSB0ZXh0IGZpbGUgY29udGFpbmluZyBjb21tYW5kcywgaW4gUiBhIHNjcmlwdCBmaWxlbmFtZSBlbmRzIHdpdGggLlIKCioqdGhlbWVzKiogIAp0aGUgbm9uLWRhdGEgY29tcG9uZW50cyBvZiBhIGdncGxvdCBlLmcuIGJhY2tncm91bmQsIGdyaWQgbGluZXMsIGZvbnQgc2l6ZSBhbmQgZm9udCB0eXBlCgoqKndvcmtpbmcgZGlyZWN0b3J5KiogIAp0aGUgbG9jYXRpb24gKHBhdGgpIHdoZXJlIFIgbG9va3MgdG8gcmVhZCBpbiBkYXRhIGFuZCBzYXZlIGZpbGVzCgpcIAoKIyNTeW1ib2xzIyMKCioqYD5gKiogIApwcm9tcHQgaW4gY29uc29sZSwgbWVhbnMgUiBpcyByZWFkeSB0byB0YWtlIGEgY29tbWFuZAogICAKXCAgICAKKipgK2AqKiAgCnVzZWQgdG8gYWRkIGxheWVycyB0byBhIGdncGxvdC4gQWxzbyB0aGUgcHJvbXB0IHN5bWJvbCBSIHVzZXMgd2hlbiB0aGUgY29tbWFuZCBpcyBub3QgY29tcGxldGUsIHN1Y2ggYXMgbWlzc2luZyBhIGApYAogIApcICAgIAoqKmA8LWAqKiAgCmFzc2lnbm1lbnQgb3BlcmF0b3IsIHNlZSBUZXJtcyBhYm92ZSAgCgpcICAgIAoqKmAjYCoqICAKY29tbWVudCwgdG8gYWRkIG5vdGVzIHRvIGEgc2NyaXB0ICAKICAKXCAgIAoqKmAkYCoqICAKd2F5IHRvIGFjY2VzcyBhIHNpbmdsZSBjb2x1bW4gd2l0aCBiYXNlIFIgZS5nLiBgY291bnRzJGdlbmVfc3ltYm9sYCAgCiAgClwgICAKKipgJWluJWAqKiAgCm9wZXJhdG9yIHVzZWQgdG8gdGVzdCBpZiBhIHZhbHVlIGlzIGluIGEgc2V0IG9mIHZhbHVlcyAgCiAgClwgICAKKipgJT4lYCoqICAKZHBseXIgcGlwZSBvcGVyYXRvciwgc2VlIFRlcm1zIGFib3ZlICAKICAKXCAgIAoqKmB+YCoqICAKc3ltYm9sIHRvIHVzZSB3aGVuIGZhY2V0aW5nIGluIGdncGxvdDIsIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGNvbHVtbiB0byB1c2UgdG8gZmFjZXQK