Learning Objectives


Upon completing today’s lab activity, students should be able to do the following using R and RStudio:

  1. Navigate through the RStudio interface and perform basic computations in the R console.

  2. Install and load R packages.

  3. Load data sets from packages and csv files and perform basic data subsetting.

  4. Perform basic plotting of histograms and scatterplots.


The RStudio Interface


R is a programming language for statistical computing and data visualization. It is free and widely used by statisticians and data scientist for data analysis, software development for statistical methods, and statistical application in research.

RStudio is an open-source Integrated Development Environment (IDE) for R. It is a desktop application where it allows using R as easy as possible. Below is a screen shot of what RStudio looks like.

RStudio is composed of three main panels.

  • Console (left or lower-left) where you can put all of your R commands after the prompt symbol >.

  • Environment (upper-right) where it contains a history of the commands you have previously entered and all of the variables you declared.

  • Files, Plots, Packages, Help, Viewer (lower-right) where you can browse files, access help for R functions, install and manage packages, and viewing visualizations.


Using R as a Calculator


Basic Math Computations

1+41
## [1] 42


Variables

x <- 1
y <- 2
z = (x+2)+(y+1)
print(z)
## [1] 6


Vectors

vector_1 <- c(1,2,3,4,5)
print(vector_1)
## [1] 1 2 3 4 5


R Packages


Installing Packages

install.packages("tidyverse")
install.packages("openintro")


Loading Packages

library(tidyverse)
library(openintro)


Loading Datasets


In this section, we are using the Loan data from Lending Club. The loans_full_schema is a data frame already embedded into the openintro package.


Datasets from Existing Packages

glimpse(loans_full_schema)
## Rows: 10,000
## Columns: 55
## $ emp_title                        <chr> "global config engineer ", "warehouse…
## $ emp_length                       <dbl> 3, 10, 3, 1, 10, NA, 10, 10, 10, 3, 1…
## $ state                            <fct> NJ, HI, WI, PA, CA, KY, MI, AZ, NV, I…
## $ homeownership                    <fct> MORTGAGE, RENT, RENT, RENT, RENT, OWN…
## $ annual_income                    <dbl> 90000, 40000, 40000, 30000, 35000, 34…
## $ verified_income                  <fct> Verified, Not Verified, Source Verifi…
## $ debt_to_income                   <dbl> 18.01, 5.04, 21.15, 10.16, 57.96, 6.4…
## $ annual_income_joint              <dbl> NA, NA, NA, NA, 57000, NA, 155000, NA…
## $ verification_income_joint        <fct> , , , , Verified, , Not Verified, , ,…
## $ debt_to_income_joint             <dbl> NA, NA, NA, NA, 37.66, NA, 13.12, NA,…
## $ delinq_2y                        <int> 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0…
## $ months_since_last_delinq         <int> 38, NA, 28, NA, NA, 3, NA, 19, 18, NA…
## $ earliest_credit_line             <dbl> 2001, 1996, 2006, 2007, 2008, 1990, 2…
## $ inquiries_last_12m               <int> 6, 1, 4, 0, 7, 6, 1, 1, 3, 0, 4, 4, 8…
## $ total_credit_lines               <int> 28, 30, 31, 4, 22, 32, 12, 30, 35, 9,…
## $ open_credit_lines                <int> 10, 14, 10, 4, 16, 12, 10, 15, 21, 6,…
## $ total_credit_limit               <int> 70795, 28800, 24193, 25400, 69839, 42…
## $ total_credit_utilized            <int> 38767, 4321, 16000, 4997, 52722, 3898…
## $ num_collections_last_12m         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ num_historical_failed_to_pay     <int> 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0…
## $ months_since_90d_late            <int> 38, NA, 28, NA, NA, 60, NA, 71, 18, N…
## $ current_accounts_delinq          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ total_collection_amount_ever     <int> 1250, 0, 432, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ current_installment_accounts     <int> 2, 0, 1, 1, 1, 0, 2, 2, 6, 1, 2, 1, 2…
## $ accounts_opened_24m              <int> 5, 11, 13, 1, 6, 2, 1, 4, 10, 5, 6, 7…
## $ months_since_last_credit_inquiry <int> 5, 8, 7, 15, 4, 5, 9, 7, 4, 17, 3, 4,…
## $ num_satisfactory_accounts        <int> 10, 14, 10, 4, 16, 12, 10, 15, 21, 6,…
## $ num_accounts_120d_past_due       <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, …
## $ num_accounts_30d_past_due        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ num_active_debit_accounts        <int> 2, 3, 3, 2, 10, 1, 3, 5, 11, 3, 2, 2,…
## $ total_debit_limit                <int> 11100, 16500, 4300, 19400, 32700, 272…
## $ num_total_cc_accounts            <int> 14, 24, 14, 3, 20, 27, 8, 16, 19, 7, …
## $ num_open_cc_accounts             <int> 8, 14, 8, 3, 15, 12, 7, 12, 14, 5, 8,…
## $ num_cc_carrying_balance          <int> 6, 4, 6, 2, 13, 5, 6, 10, 14, 3, 5, 3…
## $ num_mort_accounts                <int> 1, 0, 0, 0, 0, 3, 2, 7, 2, 0, 2, 3, 3…
## $ account_never_delinq_percent     <dbl> 92.9, 100.0, 93.5, 100.0, 100.0, 78.1…
## $ tax_liens                        <int> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ public_record_bankrupt           <int> 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0…
## $ loan_purpose                     <fct> moving, debt_consolidation, other, de…
## $ application_type                 <fct> individual, individual, individual, i…
## $ loan_amount                      <int> 28000, 5000, 2000, 21600, 23000, 5000…
## $ term                             <dbl> 60, 36, 36, 36, 36, 36, 60, 60, 36, 3…
## $ interest_rate                    <dbl> 14.07, 12.61, 17.09, 6.72, 14.07, 6.7…
## $ installment                      <dbl> 652.53, 167.54, 71.40, 664.19, 786.87…
## $ grade                            <fct> C, C, D, A, C, A, C, B, C, A, C, B, C…
## $ sub_grade                        <fct> C3, C1, D1, A3, C3, A3, C2, B5, C2, A…
## $ issue_month                      <fct> Mar-2018, Feb-2018, Feb-2018, Jan-201…
## $ loan_status                      <fct> Current, Current, Current, Current, C…
## $ initial_listing_status           <fct> whole, whole, fractional, whole, whol…
## $ disbursement_method              <fct> Cash, Cash, Cash, Cash, Cash, Cash, C…
## $ balance                          <dbl> 27015.86, 4651.37, 1824.63, 18853.26,…
## $ paid_total                       <dbl> 1999.330, 499.120, 281.800, 3312.890,…
## $ paid_principal                   <dbl> 984.14, 348.63, 175.37, 2746.74, 1569…
## $ paid_interest                    <dbl> 1015.19, 150.49, 106.43, 566.15, 754.…
## $ paid_late_fees                   <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…


Datasets from a csv File

First, download the loans_full_schema csv file.

loans_full_schema <- read.csv(file='data-sets/loans_full_schema.csv',header=TRUE)
glimpse(loans_full_schema)
## Rows: 10,000
## Columns: 55
## $ emp_title                        <chr> "global config engineer ", "warehouse…
## $ emp_length                       <int> 3, 10, 3, 1, 10, NA, 10, 10, 10, 3, 1…
## $ state                            <chr> "NJ", "HI", "WI", "PA", "CA", "KY", "…
## $ homeownership                    <chr> "MORTGAGE", "RENT", "RENT", "RENT", "…
## $ annual_income                    <dbl> 90000, 40000, 40000, 30000, 35000, 34…
## $ verified_income                  <chr> "Verified", "Not Verified", "Source V…
## $ debt_to_income                   <dbl> 18.01, 5.04, 21.15, 10.16, 57.96, 6.4…
## $ annual_income_joint              <dbl> NA, NA, NA, NA, 57000, NA, 155000, NA…
## $ verification_income_joint        <chr> "", "", "", "", "Verified", "", "Not …
## $ debt_to_income_joint             <dbl> NA, NA, NA, NA, 37.66, NA, 13.12, NA,…
## $ delinq_2y                        <int> 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0…
## $ months_since_last_delinq         <int> 38, NA, 28, NA, NA, 3, NA, 19, 18, NA…
## $ earliest_credit_line             <int> 2001, 1996, 2006, 2007, 2008, 1990, 2…
## $ inquiries_last_12m               <int> 6, 1, 4, 0, 7, 6, 1, 1, 3, 0, 4, 4, 8…
## $ total_credit_lines               <int> 28, 30, 31, 4, 22, 32, 12, 30, 35, 9,…
## $ open_credit_lines                <int> 10, 14, 10, 4, 16, 12, 10, 15, 21, 6,…
## $ total_credit_limit               <int> 70795, 28800, 24193, 25400, 69839, 42…
## $ total_credit_utilized            <int> 38767, 4321, 16000, 4997, 52722, 3898…
## $ num_collections_last_12m         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ num_historical_failed_to_pay     <int> 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0…
## $ months_since_90d_late            <int> 38, NA, 28, NA, NA, 60, NA, 71, 18, N…
## $ current_accounts_delinq          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ total_collection_amount_ever     <int> 1250, 0, 432, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ current_installment_accounts     <int> 2, 0, 1, 1, 1, 0, 2, 2, 6, 1, 2, 1, 2…
## $ accounts_opened_24m              <int> 5, 11, 13, 1, 6, 2, 1, 4, 10, 5, 6, 7…
## $ months_since_last_credit_inquiry <int> 5, 8, 7, 15, 4, 5, 9, 7, 4, 17, 3, 4,…
## $ num_satisfactory_accounts        <int> 10, 14, 10, 4, 16, 12, 10, 15, 21, 6,…
## $ num_accounts_120d_past_due       <int> 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, …
## $ num_accounts_30d_past_due        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ num_active_debit_accounts        <int> 2, 3, 3, 2, 10, 1, 3, 5, 11, 3, 2, 2,…
## $ total_debit_limit                <int> 11100, 16500, 4300, 19400, 32700, 272…
## $ num_total_cc_accounts            <int> 14, 24, 14, 3, 20, 27, 8, 16, 19, 7, …
## $ num_open_cc_accounts             <int> 8, 14, 8, 3, 15, 12, 7, 12, 14, 5, 8,…
## $ num_cc_carrying_balance          <int> 6, 4, 6, 2, 13, 5, 6, 10, 14, 3, 5, 3…
## $ num_mort_accounts                <int> 1, 0, 0, 0, 0, 3, 2, 7, 2, 0, 2, 3, 3…
## $ account_never_delinq_percent     <dbl> 92.9, 100.0, 93.5, 100.0, 100.0, 78.1…
## $ tax_liens                        <int> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ public_record_bankrupt           <int> 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0…
## $ loan_purpose                     <chr> "moving", "debt_consolidation", "othe…
## $ application_type                 <chr> "individual", "individual", "individu…
## $ loan_amount                      <int> 28000, 5000, 2000, 21600, 23000, 5000…
## $ term                             <int> 60, 36, 36, 36, 36, 36, 60, 60, 36, 3…
## $ interest_rate                    <dbl> 14.07, 12.61, 17.09, 6.72, 14.07, 6.7…
## $ installment                      <dbl> 652.53, 167.54, 71.40, 664.19, 786.87…
## $ grade                            <chr> "C", "C", "D", "A", "C", "A", "C", "B…
## $ sub_grade                        <chr> "C3", "C1", "D1", "A3", "C3", "A3", "…
## $ issue_month                      <chr> "Mar-2018", "Feb-2018", "Feb-2018", "…
## $ loan_status                      <chr> "Current", "Current", "Current", "Cur…
## $ initial_listing_status           <chr> "whole", "whole", "fractional", "whol…
## $ disbursement_method              <chr> "Cash", "Cash", "Cash", "Cash", "Cash…
## $ balance                          <dbl> 27015.86, 4651.37, 1824.63, 18853.26,…
## $ paid_total                       <dbl> 1999.330, 499.120, 281.800, 3312.890,…
## $ paid_principal                   <dbl> 984.14, 348.63, 175.37, 2746.74, 1569…
## $ paid_interest                    <dbl> 1015.19, 150.49, 106.43, 566.15, 754.…
## $ paid_late_fees                   <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…


Subsetting of Data


Accessing Rows and Columns


  • Using brackets to access specific indices of the data frame with the first 3 rows.
loans_full_schema[1:3,1:5]
##                 emp_title emp_length state homeownership annual_income
## 1 global config engineer           3    NJ      MORTGAGE         90000
## 2  warehouse office clerk         10    HI          RENT         40000
## 3                assembly          3    WI          RENT         40000


  • Using brackets to access specific column labels of the data frame with the first 3 rows.
loans_full_schema[1:3,c("loan_amount","loan_purpose","loan_status")]
##   loan_amount       loan_purpose loan_status
## 1       28000             moving     Current
## 2        5000 debt_consolidation     Current
## 3        2000              other     Current


Accessing Entire Columns


  • Using the $ command to access a specific column label of the data.
glimpse(loans_full_schema$annual_income)
##  num [1:10000] 90000 40000 40000 30000 35000 34000 35000 110000 65000 30000 ...


  • Using brackets to access entire columns using specific column labels.
glimpse(loans_full_schema[,c("loan_amount","loan_purpose","loan_status")])
## Rows: 10,000
## Columns: 3
## $ loan_amount  <int> 28000, 5000, 2000, 21600, 23000, 5000, 24000, 20000, 2000…
## $ loan_purpose <chr> "moving", "debt_consolidation", "other", "debt_consolidat…
## $ loan_status  <chr> "Current", "Current", "Current", "Current", "Current", "C…


Basic Descriptive Statistics


  • Using $ command to summarize one column.
summary(loans_full_schema$annual_income)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0   45000   65000   79222   95000 2300000


  • Using brackets to summarize multiple columns.
summary(loans_full_schema[,c("loan_amount","loan_purpose","loan_status")])
##   loan_amount    loan_purpose       loan_status       
##  Min.   : 1000   Length:10000       Length:10000      
##  1st Qu.: 8000   Class :character   Class :character  
##  Median :14500   Mode  :character   Mode  :character  
##  Mean   :16362                                        
##  3rd Qu.:24000                                        
##  Max.   :40000


  • Computing Mean and Standard Deviation of one column.
mean(loans_full_schema$loan_amount)
## [1] 16361.92
sd(loans_full_schema$loan_amount)
## [1] 10301.96


Basic Data Visualization


Histograms

ggplot(data = loans_full_schema, aes(x = total_credit_limit)) + geom_histogram(bins=60)

You can also use hist. Use ?hist for details and usage.


Scatterplots

ggplot(data = loans_full_schema, aes(x = annual_income, y = total_credit_limit)) + geom_point()

You can also use plot.


Lab Exercises


I. Iris Flowers

  1. Load the iris dataset. Note that this dataset is in the datasets package which is already included in the base R installation.

  2. How many rows and columns does this data set have?

  3. Produce 3 scatterplots and describe them. What pattern(s) do you observe? Does it look linear or nonlinear? Are any points clustered together?

  4. Produce 3 histograms and describe them. What shape(s) does it show? Does it have one peak or multiple peaks?


II. Economic Regression

  1. Load the longley dataset. Note that this dataset is in the datasets package which is already included in the base R installation.

  2. How many rows and columns does this data set have?

  3. Produce 3 scatterplots and describe them. What pattern(s) do you observe? Does it look linear or nonlinear? Are any points clustered together?

  4. Produce 3 histograms and describe them. What shape(s) does it show? Does it have one peak or multiple peaks?


III. United States Counties

  1. Load the county dataset from the csv file.

  2. How many rows and columns does this data set have?

  3. Produce 2 scatterplots and describe them. What pattern(s) do you observe? Does it look linear or nonlinear? Are any points clustered together?

  4. Produce 2 histograms and describe them. What shape(s) does it show? Does it have one peak or multiple peaks?


LS0tCnRpdGxlOiAiMSAtIEludHJvZHVjdGlvbiB0byBSIgphdXRob3I6ICJBbGV4IEpvaG4gUXVpamFubyIKZGF0ZTogIjA4LzMxLzIwMjEiCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0Ci0tLQoKIyMgKipMZWFybmluZyBPYmplY3RpdmVzKioKCjxicj4KClVwb24gY29tcGxldGluZyB0b2RheSdzIGxhYiBhY3Rpdml0eSwgc3R1ZGVudHMgc2hvdWxkIGJlIGFibGUgdG8gZG8gdGhlIGZvbGxvd2luZyB1c2luZyBSIGFuZCBSU3R1ZGlvOgoKICAxLiBOYXZpZ2F0ZSB0aHJvdWdoIHRoZSBSU3R1ZGlvIGludGVyZmFjZSBhbmQgcGVyZm9ybSBiYXNpYyBjb21wdXRhdGlvbnMgaW4gdGhlIFIgY29uc29sZS4KICAKICAyLiBJbnN0YWxsIGFuZCBsb2FkIFIgcGFja2FnZXMuCiAgCiAgMy4gTG9hZCBkYXRhIHNldHMgZnJvbSBwYWNrYWdlcyBhbmQgY3N2IGZpbGVzIGFuZCBwZXJmb3JtIGJhc2ljIGRhdGEgc3Vic2V0dGluZy4KICAKICA0LiBQZXJmb3JtIGJhc2ljIHBsb3R0aW5nIG9mIGhpc3RvZ3JhbXMgYW5kIHNjYXR0ZXJwbG90cy4KICAKPGJyPgoKIyMgKipUaGUgUlN0dWRpbyBJbnRlcmZhY2UqKgoKPGJyPgoKKipSKiogaXMgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBmb3Igc3RhdGlzdGljYWwgY29tcHV0aW5nIGFuZCBkYXRhIHZpc3VhbGl6YXRpb24uIEl0IGlzIGZyZWUgYW5kIHdpZGVseSB1c2VkIGJ5IHN0YXRpc3RpY2lhbnMgYW5kIGRhdGEgc2NpZW50aXN0IGZvciBkYXRhIGFuYWx5c2lzLCBzb2Z0d2FyZSBkZXZlbG9wbWVudCBmb3Igc3RhdGlzdGljYWwgbWV0aG9kcywgYW5kIHN0YXRpc3RpY2FsIGFwcGxpY2F0aW9uIGluIHJlc2VhcmNoLgoKKipSU3R1ZGlvKiogaXMgYW4gb3Blbi1zb3VyY2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKSBmb3IgUi4gSXQgaXMgYSBkZXNrdG9wIGFwcGxpY2F0aW9uIHdoZXJlIGl0IGFsbG93cyB1c2luZyBSIGFzIGVhc3kgYXMgcG9zc2libGUuIEJlbG93IGlzIGEgc2NyZWVuIHNob3Qgb2Ygd2hhdCBSU3R1ZGlvIGxvb2tzIGxpa2UuCgpgYGB7ciByc3R1ZGlvLWludGVyZmFjZSwgZWNobz1GQUxTRSwgZmlnLmNhcD0iIiwgb3V0LndpZHRoPSI2MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIxLWZpbGVzL3JzdHVkaW8taW50ZXJmYWNlLnBuZyIpCmBgYAoKUlN0dWRpbyBpcyBjb21wb3NlZCBvZiB0aHJlZSBtYWluIHBhbmVscy4KCiAgKiAqKkNvbnNvbGUqKiAobGVmdCBvciBsb3dlci1sZWZ0KSB3aGVyZSB5b3UgY2FuIHB1dCBhbGwgb2YgeW91ciBSIGNvbW1hbmRzIGFmdGVyIHRoZSAqcHJvbXB0KiBzeW1ib2wgKio+KiouCiAgCiAgKiAqKkVudmlyb25tZW50KiogKHVwcGVyLXJpZ2h0KSB3aGVyZSBpdCBjb250YWlucyBhIGhpc3Rvcnkgb2YgdGhlIGNvbW1hbmRzIHlvdSBoYXZlIHByZXZpb3VzbHkgZW50ZXJlZCBhbmQgYWxsIG9mIHRoZSB2YXJpYWJsZXMgeW91IGRlY2xhcmVkLgogIAogICogKipGaWxlcywgUGxvdHMsIFBhY2thZ2VzLCBIZWxwLCBWaWV3ZXIqKiAobG93ZXItcmlnaHQpIHdoZXJlIHlvdSBjYW4gYnJvd3NlIGZpbGVzLCBhY2Nlc3MgaGVscCBmb3IgUiBmdW5jdGlvbnMsIGluc3RhbGwgYW5kIG1hbmFnZSBwYWNrYWdlcywgYW5kIHZpZXdpbmcgdmlzdWFsaXphdGlvbnMuCgo8YnI+CgojIyAqKlVzaW5nIFIgYXMgYSBDYWxjdWxhdG9yKioKCjxicj4KCiMjIyBCYXNpYyBNYXRoIENvbXB1dGF0aW9ucwpgYGB7ciBjYWxjdWxhdG9yLTEsIG1lc3NhZ2U9RkFMU0V9CjErNDEKYGBgCgo8YnI+CgojIyMgVmFyaWFibGVzCmBgYHtyIGNhbGN1bGF0b3ItMiwgbWVzc2FnZT1GQUxTRX0KeCA8LSAxCnkgPC0gMgp6ID0gKHgrMikrKHkrMSkKcHJpbnQoeikKYGBgCgo8YnI+CgojIyMgVmVjdG9ycwpgYGB7ciBjYWxjdWxhdG9yLTMsIG1lc3NhZ2U9RkFMU0V9CnZlY3Rvcl8xIDwtIGMoMSwyLDMsNCw1KQpwcmludCh2ZWN0b3JfMSkKYGBgCgo8YnI+CgojIyAqKlIgUGFja2FnZXMqKgoKPGJyPgoKIyMjIEluc3RhbGxpbmcgUGFja2FnZXMKCmBgYHtyIGluc3RhbGwtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIGV2YWw9RkFMU0V9Cmluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCmluc3RhbGwucGFja2FnZXMoIm9wZW5pbnRybyIpCmBgYAoKPGJyPgoKIyMjIExvYWRpbmcgUGFja2FnZXMKCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KG9wZW5pbnRybykKYGBgCgo8YnI+CgojIyAqKkxvYWRpbmcgRGF0YXNldHMqKgoKPGJyPgoKSW4gdGhpcyBzZWN0aW9uLCB3ZSBhcmUgdXNpbmcgdGhlIFtMb2FuIGRhdGEgZnJvbSBMZW5kaW5nIENsdWJdKGh0dHBzOi8vd3d3Lm9wZW5pbnRyby5vcmcvZGF0YS9pbmRleC5waHA/ZGF0YT1sb2Fuc19mdWxsX3NjaGVtYSl7dGFyZ2V0PSJfYmxhbmsifS4gClRoZSBgbG9hbnNfZnVsbF9zY2hlbWFgIGlzIGEgZGF0YSBmcmFtZSBhbHJlYWR5IGVtYmVkZGVkIGludG8gdGhlIGBvcGVuaW50cm9gIHBhY2thZ2UuCgo8YnI+CgojIyMgRGF0YXNldHMgZnJvbSBFeGlzdGluZyBQYWNrYWdlcwoKYGBge3IgbG9hZGluZy1kYXRhLWZyb20tcGFja2FnZSwgbWVzc2FnZT1GQUxTRX0KZ2xpbXBzZShsb2Fuc19mdWxsX3NjaGVtYSkKYGBgCgo8YnI+CgojIyMgRGF0YXNldHMgZnJvbSBhIGNzdiBGaWxlCgpGaXJzdCwgZG93bmxvYWQgdGhlIFtsb2Fuc19mdWxsX3NjaGVtYV0oZGF0YS1zZXRzL2xvYW5zX2Z1bGxfc2NoZW1hLmNzdikgY3N2IGZpbGUuCgpgYGB7ciBsb2FkaW5nLWRhdGEtZnJvbS1jc3YtZmlsZSwgbWVzc2FnZT1GQUxTRX0KbG9hbnNfZnVsbF9zY2hlbWEgPC0gcmVhZC5jc3YoZmlsZT0nZGF0YS1zZXRzL2xvYW5zX2Z1bGxfc2NoZW1hLmNzdicsaGVhZGVyPVRSVUUpCmdsaW1wc2UobG9hbnNfZnVsbF9zY2hlbWEpCmBgYAoKPGJyPgoKIyMgKipTdWJzZXR0aW5nIG9mIERhdGEqKgoKPGJyPgoKIyMjIEFjY2Vzc2luZyBSb3dzIGFuZCBDb2x1bW5zCgo8YnI+CgogICogVXNpbmcgYnJhY2tldHMgdG8gYWNjZXNzICoqc3BlY2lmaWMgaW5kaWNlcyoqIG9mIHRoZSBkYXRhIGZyYW1lIHdpdGggdGhlIGZpcnN0IDMgcm93cy4KYGBge3Igcm93cy1hbmQtY29sdW1ucy0xLCBtZXNzYWdlPUZBTFNFfQpsb2Fuc19mdWxsX3NjaGVtYVsxOjMsMTo1XQpgYGAKCjxicj4KCiAgKiBVc2luZyBicmFja2V0cyB0byBhY2Nlc3MgKipzcGVjaWZpYyBjb2x1bW4gbGFiZWxzKiogb2YgdGhlIGRhdGEgZnJhbWUgd2l0aCB0aGUgZmlyc3QgMyByb3dzLgpgYGB7ciByb3dzLWFuZC1jb2x1bW5zLTIsIG1lc3NhZ2U9RkFMU0V9CmxvYW5zX2Z1bGxfc2NoZW1hWzE6MyxjKCJsb2FuX2Ftb3VudCIsImxvYW5fcHVycG9zZSIsImxvYW5fc3RhdHVzIildCmBgYAoKPGJyPgoKIyMjIEFjY2Vzc2luZyBFbnRpcmUgQ29sdW1ucwoKPGJyPgoKICAqIFVzaW5nIHRoZSBgJGAgY29tbWFuZCB0byBhY2Nlc3MgYSAqKnNwZWNpZmljIGNvbHVtbiBsYWJlbCoqIG9mIHRoZSBkYXRhLgpgYGB7ciByb3dzLWFuZC1jb2x1bW5zLTMsIG1lc3NhZ2U9RkFMU0V9CmdsaW1wc2UobG9hbnNfZnVsbF9zY2hlbWEkYW5udWFsX2luY29tZSkKYGBgCgo8YnI+CgogICogVXNpbmcgYnJhY2tldHMgdG8gYWNjZXNzICoqZW50aXJlIGNvbHVtbnMqKiB1c2luZyAqKnNwZWNpZmljIGNvbHVtbiBsYWJlbHMqKi4KYGBge3Igcm93cy1hbmQtY29sdW1ucy00LCBtZXNzYWdlPUZBTFNFfQpnbGltcHNlKGxvYW5zX2Z1bGxfc2NoZW1hWyxjKCJsb2FuX2Ftb3VudCIsImxvYW5fcHVycG9zZSIsImxvYW5fc3RhdHVzIildKQpgYGAKCjxicj4KCiMjICoqQmFzaWMgRGVzY3JpcHRpdmUgU3RhdGlzdGljcyoqCgo8YnI+CgogICogVXNpbmcgYCRgIGNvbW1hbmQgdG8gKipzdW1tYXJpemUgb25lIGNvbHVtbioqLgpgYGB7ciBzdW1tYXJpemUtZGF0YS0xLCBtZXNzYWdlPUZBTFNFfQpzdW1tYXJ5KGxvYW5zX2Z1bGxfc2NoZW1hJGFubnVhbF9pbmNvbWUpCmBgYAoKPGJyPgoKICAqIFVzaW5nIGJyYWNrZXRzIHRvICoqc3VtbWFyaXplIG11bHRpcGxlIGNvbHVtbnMqKi4KYGBge3Igc3VtbWFyaXplLWRhdGEtMiwgbWVzc2FnZT1GQUxTRX0Kc3VtbWFyeShsb2Fuc19mdWxsX3NjaGVtYVssYygibG9hbl9hbW91bnQiLCJsb2FuX3B1cnBvc2UiLCJsb2FuX3N0YXR1cyIpXSkKYGBgCgo8YnI+CgogICogQ29tcHV0aW5nICoqTWVhbiBhbmQgU3RhbmRhcmQgRGV2aWF0aW9uIG9mIG9uZSBjb2x1bW4qKi4KYGBge3IgbWVhbnMtYW5kLXN0YW5kYXJkLWRldmlhdGlvbnMtMSwgbWVzc2FnZT1GQUxTRX0KbWVhbihsb2Fuc19mdWxsX3NjaGVtYSRsb2FuX2Ftb3VudCkKc2QobG9hbnNfZnVsbF9zY2hlbWEkbG9hbl9hbW91bnQpCmBgYAoKPGJyPgoKIyMgKipCYXNpYyBEYXRhIFZpc3VhbGl6YXRpb24qKgoKPGJyPgoKIyMjIEhpc3RvZ3JhbXMKCmBgYHtyIGJhc2ljLWRhdGEtdmlzdWFsaXphdGlvbi0xLCBtZXNzYWdlPUZBTFNFfQpnZ3Bsb3QoZGF0YSA9IGxvYW5zX2Z1bGxfc2NoZW1hLCBhZXMoeCA9IHRvdGFsX2NyZWRpdF9saW1pdCkpICsgZ2VvbV9oaXN0b2dyYW0oYmlucz02MCkKYGBgCgpZb3UgY2FuIGFsc28gdXNlIGBoaXN0YC4gVXNlIGA/aGlzdGAgZm9yIGRldGFpbHMgYW5kIHVzYWdlLgoKPGJyPgoKIyMjIFNjYXR0ZXJwbG90cwoKYGBge3IgYmFzaWMtZGF0YS12aXN1YWxpemF0aW9uLTIsIG1lc3NhZ2U9RkFMU0V9CmdncGxvdChkYXRhID0gbG9hbnNfZnVsbF9zY2hlbWEsIGFlcyh4ID0gYW5udWFsX2luY29tZSwgeSA9IHRvdGFsX2NyZWRpdF9saW1pdCkpICsgZ2VvbV9wb2ludCgpCmBgYAoKWW91IGNhbiBhbHNvIHVzZSBgcGxvdGAuCgo8YnI+CgojIyAqKkxhYiBFeGVyY2lzZXMqKgoKPGJyPgoKIyMjIEkuIElyaXMgRmxvd2VycwoKICAxLiBMb2FkIHRoZSBgaXJpc2AgZGF0YXNldC4gTm90ZSB0aGF0IHRoaXMgZGF0YXNldCBpcyBpbiB0aGUgYGRhdGFzZXRzYCBwYWNrYWdlIHdoaWNoIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIGJhc2UgUiBpbnN0YWxsYXRpb24uCiAgCiAgMi4gSG93IG1hbnkgcm93cyBhbmQgY29sdW1ucyBkb2VzIHRoaXMgZGF0YSBzZXQgaGF2ZT8KICAKICAzLiBQcm9kdWNlIDMgc2NhdHRlcnBsb3RzIGFuZCBkZXNjcmliZSB0aGVtLiBXaGF0IHBhdHRlcm4ocykgZG8geW91IG9ic2VydmU/IERvZXMgaXQgbG9vayBsaW5lYXIgb3Igbm9ubGluZWFyPyBBcmUgYW55IHBvaW50cyBjbHVzdGVyZWQgdG9nZXRoZXI/CiAgCiAgNC4gUHJvZHVjZSAzIGhpc3RvZ3JhbXMgYW5kIGRlc2NyaWJlIHRoZW0uIFdoYXQgc2hhcGUocykgZG9lcyBpdCBzaG93PyBEb2VzIGl0IGhhdmUgb25lIHBlYWsgb3IgbXVsdGlwbGUgcGVha3M/CiAgCjxicj4KICAKIyMjIElJLiBFY29ub21pYyBSZWdyZXNzaW9uCgogIDEuIExvYWQgdGhlIGBsb25nbGV5YCBkYXRhc2V0LiBOb3RlIHRoYXQgdGhpcyBkYXRhc2V0IGlzIGluIHRoZSBgZGF0YXNldHNgIHBhY2thZ2Ugd2hpY2ggaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgYmFzZSBSIGluc3RhbGxhdGlvbi4KICAKICAyLiBIb3cgbWFueSByb3dzIGFuZCBjb2x1bW5zIGRvZXMgdGhpcyBkYXRhIHNldCBoYXZlPwogIAogIDMuIFByb2R1Y2UgMyBzY2F0dGVycGxvdHMgYW5kIGRlc2NyaWJlIHRoZW0uIFdoYXQgcGF0dGVybihzKSBkbyB5b3Ugb2JzZXJ2ZT8gRG9lcyBpdCBsb29rIGxpbmVhciBvciBub25saW5lYXI/IEFyZSBhbnkgcG9pbnRzIGNsdXN0ZXJlZCB0b2dldGhlcj8KICAKICA0LiBQcm9kdWNlIDMgaGlzdG9ncmFtcyBhbmQgZGVzY3JpYmUgdGhlbS4gV2hhdCBzaGFwZShzKSBkb2VzIGl0IHNob3c/IERvZXMgaXQgaGF2ZSBvbmUgcGVhayBvciBtdWx0aXBsZSBwZWFrcz8KICAKPGJyPgoKIyMjIElJSS4gVW5pdGVkIFN0YXRlcyBDb3VudGllcwoKICAxLiBMb2FkIHRoZSBbY291bnR5XShkYXRhLXNldHMvY291bnR5LmNzdil7dGFyZ2V0PSJfYmxhbmsifSBkYXRhc2V0IGZyb20gdGhlIGNzdiBmaWxlLgogIAogIDIuIEhvdyBtYW55IHJvd3MgYW5kIGNvbHVtbnMgZG9lcyB0aGlzIGRhdGEgc2V0IGhhdmU/CiAgCiAgMy4gUHJvZHVjZSAyIHNjYXR0ZXJwbG90cyBhbmQgZGVzY3JpYmUgdGhlbS4gV2hhdCBwYXR0ZXJuKHMpIGRvIHlvdSBvYnNlcnZlPyBEb2VzIGl0IGxvb2sgbGluZWFyIG9yIG5vbmxpbmVhcj8gQXJlIGFueSBwb2ludHMgY2x1c3RlcmVkIHRvZ2V0aGVyPwogIAogIDQuIFByb2R1Y2UgMiBoaXN0b2dyYW1zIGFuZCBkZXNjcmliZSB0aGVtLiBXaGF0IHNoYXBlKHMpIGRvZXMgaXQgc2hvdz8gRG9lcyBpdCBoYXZlIG9uZSBwZWFrIG9yIG11bHRpcGxlIHBlYWtzPwogIAo8YnI+Cg==