Arithmetic Operators Section

Subtraction

2-3
[1] -1

Division

2/3
[1] 0.6666667

Exponentiation

2^3
[1] 8

Square Root

sqrt(2)
[1] 1.414214

#logarithms

log(2)
[1] 0.6931472

Rational Operators section is to test whether something is less than, greater than or equal.

Checking to see if 3 is equal to 8 since it is not equal returns FALSE

3==8
[1] FALSE

Check to see if 3 is not equal to 8, in this case 3 is not equal returns TRUE

3 != 8
[1] TRUE

Check to see if 3 is less than or equal to 8, this shows that 3 is less than 8 so it is TRUE.

3 <= 8
[1] TRUE

Logical operators Section: logical AND, | for logical OR, and ! for NOT.

Logical Conjuction (OR). FALSE OR FALSE returns a FALSE

FALSE | FALSE
[1] FALSE

Logical Conjuction (AND). A TRUE AND FALSE will be equal to FALSE.

TRUE & FALSE
[1] FALSE

Negation. If not FALSE is TRUE

! FALSE
[1] TRUE

Combination of statements. This can be 2 less than 2 OR 1 == 5, if one is true then it true, if both are true it is true but if both are FALSE then it is FALSE

2 < 3 | 1 == 5
[1] TRUE

Assigning Values to Variables

foo will hold the value of 2 + 2 which would be 4, the you multiply foo by 3 gives a result of 12

foo * 3
[1] 12

Use ls function to obtaine a list variables currently defined.

ls()
 [1] "a"              "anova_out"      "anxiety_ak"     "anxiety_hi"     "assets.df"      "b"             
 [7] "Batteries"      "coffeeA"        "coffeeB"        "crop_out"       "d"              "data"          
[13] "df"             "DFAsg1"         "dif"            "domestic_rate"  "e"              "f"             
[19] "file"           "first_matrix"   "flu_med"        "flu_nomed"      "foo"            "foreign_rate"  
[25] "g"              "gardens"        "growth"         "h"              "Is_x1_greater"  "isWinnerTaller"
[31] "k"              "metal_data"     "myvector"       "myvector1"      "myvector1a"     "myvector2"     
[37] "myvector2a"     "opponent"       "pooledSD"       "presid_name"    "sample1"        "sample2"       
[43] "score_buli"     "score_bull"     "score_normal"   "second_matrix"  "spcoffe"        "sumAB"         
[49] "sumTotal"       "temp_matrix"    "test_matrix"    "test_vector"    "Two_Means_Ex1"  "Two_Means_Ex2" 
[55] "twoway_out"     "winner"         "x"              "x1"             "x2"             "y"             
[61] "year"          

To remove a variable from the list, use rm = remove

Show list of variable to see if foo was removed.

ls()
 [1] "a"              "anova_out"      "anxiety_ak"     "anxiety_hi"     "assets.df"      "b"             
 [7] "Batteries"      "coffeeA"        "coffeeB"        "crop_out"       "d"              "data"          
[13] "df"             "DFAsg1"         "dif"            "domestic_rate"  "e"              "f"             
[19] "file"           "first_matrix"   "flu_med"        "flu_nomed"      "foreign_rate"   "g"             
[25] "gardens"        "growth"         "h"              "Is_x1_greater"  "isWinnerTaller" "k"             
[31] "metal_data"     "myvector"       "myvector1"      "myvector1a"     "myvector2"      "myvector2a"    
[37] "opponent"       "pooledSD"       "presid_name"    "sample1"        "sample2"        "score_buli"    
[43] "score_bull"     "score_normal"   "second_matrix"  "spcoffe"        "sumAB"          "sumTotal"      
[49] "temp_matrix"    "test_matrix"    "test_vector"    "Two_Means_Ex1"  "Two_Means_Ex2"  "twoway_out"    
[55] "winner"         "x"              "x1"             "x2"             "y"              "year"          

Vectors

A vector is a sequence of elements that share the same data type.

Use the c() function as in concatenate or combine. bar will be the vector containing 2,5,10,2,1

Then to see the values in bar just type bar

bar
[1]  2  5 10  2  1

Here will create the vector baz with values 2,2,3,3,3

Then type baz to disply the vector.

baz
[1] 2 2 3 3 3

Use the replicate Function to replicate 2 5 times

rep(2,5)
[1] 2 2 2 2 2

Consecutive Numbers will give create a list of number in this case from 1 to 5

1:5
[1] 1 2 3 4 5

Sequence from 1 to 10 with a step by two or list numbers adding 2 to each number.

Example first number is 1 then 1 + 2 = 3, 3 is your next number and then 3 + 2 = 5, so next number is 5 etc..

seq(1,10,by=2)
[1] 1 3 5 7 9

Adding vectors in this case we will add the bar + baz vector, it will add 1st item 2 in bar to 1st items 2 in baz which is = to 4, then adds the second item in bar to second item in baz 5 + 2 = 7 etc..

bar + baz
[1]  4  7 13  5  4

Compare Vectors here we are compare 1st item in bar to 1st item in baz, the second item in bar to second item in baz, since item 1 in bar is 2 and item 1 in baz is 2 then returns TRUE, Item 1 in bar is 5 and Item 2 in baz is 2 then since they are not equal will return FALSE.

bar == baz
[1]  TRUE FALSE FALSE FALSE FALSE

Find the length or size of the vector use length, there are 5 items in bar so 5 is returned.

length(bar)
[1] 5

Find the minium value in a vector. Looking for the minimum/smallest value bar which is 1 in this case.

min(bar)
[1] 1

Find the average or mean of a vector, in this case the average of bar is 4

mean(bar)
[1] 4

Access parts of a vector or recalling a value of the vector bar.

First we display the vector bar to recall what values bar holds.

bar
[1]  2  5 10  2  1

To recall a value from the vector bar we use bar brackets inside the brackets the position of the value you want to recall. This case we are recalling position 1 of the vector which 2.

bar[1]
[1] 2

To obtain the value of the last position we use length of bar which is the last position 5 and obtaining the value of the last position in bar. The value of the last position in the vector bar is 1.

bar[length(bar)]
[1] 1

Extract multiple values from a vector, sample would be the 2nd and 4th values of bar vector. Here we are extracting the values from the 2nd position, 3rd position and the 4th position in bar vector. Which is 5 , 10, 2.

bar[c(2,3,4)]
[1]  5 10  2

Vectors allow to store string values or logical values.

quxx
[1] "a"   "b"   "cde" "fg" 

DATA FRAMES Section:

Data Frames are like spreadsheets, with rows as observation and columns as variables.

To Create a data frame, we use the data.frame() function.

Most often you be using data frames loaded from a file. Here we loaded the schoolsurvey from a web site and called it dat.

HOW TO MAKE A RANDOM SAMPLE

Select a random sample by using the sample() function.

Here we are going to randomly select 5 values between 1 and 10.

The first argument give the vector of data to select elements from 1:10

The second argument (size) gives the size of the sample(s) to select.

sample(1:10, size=5)
[1] 4 1 2 8 6

Taking a sample from a data frame is a little more complicated, having two steps

1. Use sample() to select a sample of size n from a vector of the row numbers of the data frame.

2. Use the index operator [ to selext those rows from the data frame.

Check the data frame bar

Suppose we like to select a random sample of size 5. First, define a variable in this case n with the size of the sample, ie 5.

Now, select a sample of the size 5 from the vector with 1 to 10 (the number of rows in bar). Use the thection nrow(0) this will find the number of rows in bar instead of manually entering the number.

To Vreate a vector with all the integers between 1 and the number of row in bar use samplerows <- sample(1:nrow(bar), size=n)

To display/print sample rows

samplerows
[1] 10  6  9  8  7

The variable samplerows contains the rows of bar which make a randm sample from all the rows in bar.

Create a new data frame called barsample with a random sample of rows from bar.

Extract those rows from bar with the following command:

Extract rows

The same code above can be done in one line of code.

USING TABLES SECTION

The table commands table() to look at tables, Its simplest usage looks like table(x) where x is a categorical variable.

For example, a survey asks peple if the smoke or not. The data is

Yes, No, No, Yes, Yes

We can enter this into R with the c() command, and summarize with the table command as follows:

table(x)
x
 No Yes 
  2   3 

NUMERIC MEASURES OF CENTER AND SPREAD

Suppose, CEO yearly comensations are sampled and the following are found (in millions)

12.4, 5, 2, 50, 8, 3, 1, 4, 0.25

To get the means of sals

mean(sals)
[1] 8.565

To find the variance of sals

var(sals)
[1] 225.5145

Find the Standard Deviation of sals

sd(sals)
[1] 15.01714

Find the median of sals

median(sals)
[1] 3.5

Tukey’s five number summary, useful for boxplots

Five numbers: min, lower hinge, median, upper hinge, max

fivenum(sals)
[1]  0.25  1.00  3.50  8.00 50.00

To obtain summary statistics for sals

summary(sals)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.250   1.250   3.500   8.565   7.250  50.000 

HOW ABOUT THE MODE SECTION:

In R we can write our own functions, and a first example of a function is shown below in order to compute the mode of a vector of observations x.

Create a function to find the mode. i.e. most frequent value

  ux[which.max(tabulate(match(x,ux)))]
Error: object 'ux' not found

Find the most frequent value in te vector baz by using function getMode.

getMode(baz)
[1] 3
LS0tDQp0aXRsZTogIkhhbmRvdXQgMSBCYXNpYyBDYWxjdWxhdGlvbnMgUiBOb3RlYm9vayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojIEFyaXRobWV0aWMgT3BlcmF0b3JzIFNlY3Rpb24NCiMgU3VidHJhY3Rpb24gDQoNCmBgYHtyfQ0KMi0zDQpgYGANCiMgRGl2aXNpb24NCmBgYHtyfQ0KMi8zDQpgYGANCiMgRXhwb25lbnRpYXRpb24NCmBgYHtyfQ0KMl4zDQpgYGANCiMgU3F1YXJlIFJvb3QNCmBgYHtyfQ0Kc3FydCgyKQ0KYGBgDQojbG9nYXJpdGhtcw0KYGBge3J9DQpsb2coMikNCmBgYA0KIyBSYXRpb25hbCBPcGVyYXRvcnMgc2VjdGlvbiBpcyB0byB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzIGxlc3MgdGhhbiwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsLg0KDQojIENoZWNraW5nIHRvIHNlZSBpZiAgMyBpcyBlcXVhbCB0byA4IHNpbmNlIGl0IGlzIG5vdCBlcXVhbCByZXR1cm5zIEZBTFNFDQpgYGB7cn0NCjMgPT0gOA0KYGBgDQojIENoZWNrIHRvIHNlZSBpZiAzIGlzIG5vdCBlcXVhbCB0byA4LCBpbiB0aGlzIGNhc2UgMyBpcyBub3QgZXF1YWwgcmV0dXJucyBUUlVFDQoNCmBgYHtyfQ0KMyAhPSA4DQpgYGANCiMgQ2hlY2sgdG8gc2VlIGlmIDMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDgsIHRoaXMgc2hvd3MgdGhhdCAzIGlzIGxlc3MgdGhhbiA4IHNvIGl0IGlzIFRSVUUuDQpgYGB7cn0NCjMgPD0gOA0KYGBgDQojIExvZ2ljYWwgb3BlcmF0b3JzIFNlY3Rpb246IGxvZ2ljYWwgQU5ELCB8IGZvciBsb2dpY2FsIE9SLCBhbmQgISBmb3IgTk9ULiANCg0KIyBMb2dpY2FsIENvbmp1Y3Rpb24gKE9SKS4gRkFMU0UgT1IgRkFMU0UgcmV0dXJucyBhIEZBTFNFDQpgYGB7cn0NCkZBTFNFIHwgRkFMU0UNCmBgYA0KIyBMb2dpY2FsIENvbmp1Y3Rpb24gKEFORCkuIEEgVFJVRSBBTkQgRkFMU0Ugd2lsbCBiZSBlcXVhbCB0byBGQUxTRS4NCg0KYGBge3J9DQpUUlVFICYgRkFMU0UNCmBgYA0KIyBOZWdhdGlvbi4gSWYgbm90IEZBTFNFIGlzIFRSVUUNCg0KYGBge3J9DQohIEZBTFNFDQpgYGANCiMgQ29tYmluYXRpb24gb2Ygc3RhdGVtZW50cy4gVGhpcyBjYW4gYmUgMiBsZXNzIHRoYW4gMiBPUiAxID09IDUsIGlmIG9uZSBpcyB0cnVlIHRoZW4gaXQgdHJ1ZSwgaWYgYm90aCBhcmUgdHJ1ZSBpdCBpcyB0cnVlIGJ1dCBpZiBib3RoIGFyZSBGQUxTRSB0aGVuIGl0IGlzIEZBTFNFDQpgYGB7cn0NCjIgPCAzIHwgMSA9PSA1DQpgYGANCiMgQXNzaWduaW5nIFZhbHVlcyB0byBWYXJpYWJsZXMNCg0KIyBmb28gd2lsbCBob2xkIHRoZSB2YWx1ZSBvZiAyICsgMiB3aGljaCB3b3VsZCBiZSA0LCB0aGUgeW91IG11bHRpcGx5IGZvbyBieSAzIGdpdmVzIGEgcmVzdWx0IG9mIDEyDQpgYGB7cn0NCmZvbyA8LSAyICsgMg0KZm9vICogMw0KYGBgDQojIFVzZSBscyBmdW5jdGlvbiB0byBvYnRhaW5lIGEgbGlzdCB2YXJpYWJsZXMgY3VycmVudGx5IGRlZmluZWQuDQpgYGB7cn0NCmxzKCkNCmBgYA0KIyBUbyByZW1vdmUgYSB2YXJpYWJsZSBmcm9tIHRoZSBsaXN0LCB1c2Ugcm0gPSByZW1vdmUNCmBgYHtyfQ0Kcm0oZm9vKQ0KYGBgDQoNCiMgU2hvdyBsaXN0IG9mIHZhcmlhYmxlIHRvIHNlZSBpZiBmb28gd2FzIHJlbW92ZWQuDQpgYGB7cn0NCmxzKCkNCmBgYA0KIyBWZWN0b3JzDQojIEEgdmVjdG9yIGlzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBkYXRhIHR5cGUuDQoNCiMgVXNlIHRoZSBjKCkgZnVuY3Rpb24gYXMgaW4gY29uY2F0ZW5hdGUgb3IgY29tYmluZS4gYmFyIHdpbGwgYmUgdGhlIHZlY3RvciBjb250YWluaW5nIDIsNSwxMCwyLDENCiMgVGhlbiB0byBzZWUgdGhlIHZhbHVlcyBpbiBiYXIganVzdCB0eXBlIGJhcg0KYGBge3J9DQpiYXIgPC0gYygyLDUsMTAsMiwxKQ0KYmFyDQpgYGANCiMgSGVyZSB3aWxsIGNyZWF0ZSB0aGUgdmVjdG9yIGJheiB3aXRoIHZhbHVlcyAyLDIsMywzLDMNCiMgVGhlbiB0eXBlIGJheiB0byBkaXNwbHkgdGhlIHZlY3Rvci4NCg0KYGBge3J9DQpiYXogPC0gYygyLDIsMywzLDMpDQpiYXoNCmBgYA0KIyBVc2UgdGhlIHJlcGxpY2F0ZSBGdW5jdGlvbiB0byByZXBsaWNhdGUgMiA1IHRpbWVzDQpgYGB7cn0NCnJlcCgyLDUpDQpgYGANCiMgQ29uc2VjdXRpdmUgTnVtYmVycyB3aWxsIGdpdmUgY3JlYXRlIGEgbGlzdCBvZiBudW1iZXIgaW4gdGhpcyBjYXNlIGZyb20gMSB0byA1DQpgYGB7cn0NCjE6NQ0KYGBgDQojIFNlcXVlbmNlIGZyb20gMSB0byAxMCB3aXRoIGEgc3RlcCBieSB0d28gb3IgbGlzdCBudW1iZXJzIGFkZGluZyAyIHRvIGVhY2ggbnVtYmVyLg0KIyBFeGFtcGxlIGZpcnN0IG51bWJlciBpcyAxIHRoZW4gMSArIDIgPSAzLCAzIGlzIHlvdXIgbmV4dCBudW1iZXIgYW5kIHRoZW4gMyArIDIgPSA1LCBzbyBuZXh0IG51bWJlciBpcyA1IGV0Yy4uDQpgYGB7cn0NCnNlcSgxLDEwLGJ5PTIpDQpgYGANCiMgQWRkaW5nIHZlY3RvcnMgaW4gdGhpcyBjYXNlIHdlIHdpbGwgYWRkIHRoZSBiYXIgKyBiYXogdmVjdG9yLCBpdCB3aWxsIGFkZCAxc3QgaXRlbSAyIGluIGJhciB0byAxc3QgaXRlbXMgMiBpbiBiYXogd2hpY2ggaXMgPSB0byA0LCB0aGVuIGFkZHMgdGhlIHNlY29uZCBpdGVtIGluIGJhciB0byBzZWNvbmQgaXRlbSBpbiBiYXogNSArIDIgPSA3IGV0Yy4uDQoNCmBgYHtyfQ0KYmFyICsgYmF6DQpgYGANCiMgQ29tcGFyZSBWZWN0b3JzIGhlcmUgd2UgYXJlIGNvbXBhcmUgMXN0IGl0ZW0gaW4gYmFyIHRvIDFzdCBpdGVtIGluIGJheiwgdGhlIHNlY29uZCBpdGVtIGluIGJhciB0byBzZWNvbmQgaXRlbSBpbiBiYXosIHNpbmNlIGl0ZW0gMSBpbiBiYXIgaXMgMiBhbmQgaXRlbSAxIGluIGJheiBpcyAyIHRoZW4gcmV0dXJucyBUUlVFLCBJdGVtIDEgaW4gYmFyIGlzIDUgYW5kIEl0ZW0gMiBpbiBiYXogaXMgMiB0aGVuIHNpbmNlIHRoZXkgYXJlIG5vdCBlcXVhbCB3aWxsIHJldHVybiBGQUxTRS4NCmBgYHtyfQ0KYmFyID09IGJheg0KYGBgDQojIEZpbmQgdGhlIGxlbmd0aCBvciBzaXplIG9mIHRoZSB2ZWN0b3IgdXNlIGxlbmd0aCwgdGhlcmUgYXJlIDUgaXRlbXMgaW4gYmFyIHNvIDUgaXMgcmV0dXJuZWQuDQpgYGB7cn0NCmxlbmd0aChiYXIpDQpgYGANCiMgRmluZCB0aGUgbWluaXVtIHZhbHVlIGluIGEgdmVjdG9yLiBMb29raW5nIGZvciB0aGUgbWluaW11bS9zbWFsbGVzdCB2YWx1ZSBiYXIgd2hpY2ggaXMgMSBpbiB0aGlzIGNhc2UuDQpgYGB7cn0NCm1pbihiYXIpDQpgYGANCiMgRmluZCB0aGUgYXZlcmFnZSBvciBtZWFuIG9mIGEgdmVjdG9yLCBpbiB0aGlzIGNhc2UgdGhlIGF2ZXJhZ2Ugb2YgYmFyIGlzIDQNCmBgYHtyfQ0KbWVhbihiYXIpDQpgYGANCiMgQWNjZXNzIHBhcnRzIG9mIGEgdmVjdG9yIG9yIHJlY2FsbGluZyBhIHZhbHVlIG9mIHRoZSB2ZWN0b3IgYmFyLg0KIyBGaXJzdCB3ZSBkaXNwbGF5IHRoZSB2ZWN0b3IgYmFyIHRvIHJlY2FsbCB3aGF0IHZhbHVlcyBiYXIgaG9sZHMuDQpgYGB7cn0NCmJhcg0KYGBgDQojIFRvIHJlY2FsbCBhIHZhbHVlIGZyb20gdGhlIHZlY3RvciBiYXIgd2UgdXNlIGJhciBicmFja2V0cyBpbnNpZGUgdGhlIGJyYWNrZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcmVjYWxsLiBUaGlzIGNhc2Ugd2UgYXJlIHJlY2FsbGluZyBwb3NpdGlvbiAxIG9mIHRoZSB2ZWN0b3Igd2hpY2ggMi4NCmBgYHtyfQ0KYmFyWzFdDQpgYGANCiMgVG8gb2J0YWluIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBwb3NpdGlvbiB3ZSB1c2UgbGVuZ3RoIG9mIGJhciB3aGljaCBpcyB0aGUgbGFzdCBwb3NpdGlvbiA1IGFuZCBvYnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IHBvc2l0aW9uIGluIGJhci4gVGhlIHZhbHVlIG9mIHRoZSBsYXN0IHBvc2l0aW9uIGluIHRoZSB2ZWN0b3IgYmFyIGlzIDEuDQpgYGB7cn0NCmJhcltsZW5ndGgoYmFyKV0NCmBgYA0KIyBFeHRyYWN0IG11bHRpcGxlIHZhbHVlcyBmcm9tIGEgdmVjdG9yLCBzYW1wbGUgd291bGQgYmUgdGhlIDJuZCBhbmQgNHRoIHZhbHVlcyBvZiBiYXIgdmVjdG9yLiBIZXJlIHdlIGFyZSBleHRyYWN0aW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgMm5kIHBvc2l0aW9uLCAzcmQgcG9zaXRpb24gYW5kIHRoZSA0dGggcG9zaXRpb24gaW4gYmFyIHZlY3Rvci4gV2hpY2ggaXMgNSAsIDEwLCAyLg0KYGBge3J9DQpiYXJbYygyLDMsNCldDQpgYGANCiMgVmVjdG9ycyBhbGxvdyB0byBzdG9yZSBzdHJpbmcgdmFsdWVzIG9yIGxvZ2ljYWwgdmFsdWVzLg0KYGBge3J9DQpxdXh4IDwtIGMoImEiLCJiIiwiY2RlIiwiZmciKQ0KcXV4eA0KYGBgDQojIERBVEEgRlJBTUVTIFNlY3Rpb246DQojIERhdGEgRnJhbWVzIGFyZSBsaWtlIHNwcmVhZHNoZWV0cywgd2l0aCByb3dzIGFzIG9ic2VydmF0aW9uIGFuZCBjb2x1bW5zIGFzIHZhcmlhYmxlcy4NCiMgVG8gQ3JlYXRlIGEgZGF0YSBmcmFtZSwgd2UgdXNlIHRoZSBkYXRhLmZyYW1lKCkgZnVuY3Rpb24uDQoNCmBgYHtyfQ0KZGF0YS5mcmFtZShmb28gPSBjKDEsMiwzKSwNCiAgICAgICAgICAgYmFyID0gYygiYSIsImIiLCJjIiksDQogICAgICAgICAgIGJheiA9IGMoMS41LDIuNSwzKSkNCmBgYA0KDQojIE1vc3Qgb2Z0ZW4geW91IGJlIHVzaW5nIGRhdGEgZnJhbWVzIGxvYWRlZCBmcm9tIGEgZmlsZS4gSGVyZSB3ZSBsb2FkZWQgdGhlIHNjaG9vbHN1cnZleSBmcm9tIGEgd2ViIHNpdGUgYW5kIGNhbGxlZCBpdCBkYXQuDQpgYGB7cn0NCmRhdCA8LSByZWFkLmNzdigiaHR0cDovL3d3dzIuaGF3YWlpLmVkdS9+Z2VvcmdlaGEvSGFuZG91dHMvU2Nob29sU3VydmV5LmNzdiIpDQpkYXQNCmBgYA0KDQojIEhPVyBUTyBNQUtFIEEgUkFORE9NIFNBTVBMRQ0KIyBTZWxlY3QgYSByYW5kb20gc2FtcGxlIGJ5IHVzaW5nIHRoZSBzYW1wbGUoKSBmdW5jdGlvbi4NCiMgSGVyZSB3ZSBhcmUgZ29pbmcgdG8gcmFuZG9tbHkgc2VsZWN0IDUgdmFsdWVzIGJldHdlZW4gMSBhbmQgMTAuDQojIFRoZSBmaXJzdCBhcmd1bWVudCBnaXZlIHRoZSB2ZWN0b3Igb2YgZGF0YSB0byBzZWxlY3QgZWxlbWVudHMgZnJvbSAxOjEwDQojIFRoZSBzZWNvbmQgYXJndW1lbnQgKHNpemUpIGdpdmVzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUocykgdG8gc2VsZWN0Lg0KDQoNCmBgYHtyfQ0Kc2FtcGxlKDE6MTAsIHNpemU9NSkNCmBgYA0KIyBUYWtpbmcgYSBzYW1wbGUgZnJvbSBhIGRhdGEgZnJhbWUgaXMgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZCwgaGF2aW5nIHR3byBzdGVwcw0KIyAxLiBVc2Ugc2FtcGxlKCkgdG8gc2VsZWN0IGEgc2FtcGxlIG9mIHNpemUgbiBmcm9tIGEgdmVjdG9yIG9mIHRoZSByb3cgbnVtYmVycyBvZiB0aGUgZGF0YSBmcmFtZS4NCiMgMi4gVXNlIHRoZSBpbmRleCBvcGVyYXRvciBbIHRvIHNlbGV4dCB0aG9zZSByb3dzIGZyb20gdGhlIGRhdGEgZnJhbWUuDQpgYGB7cn0NCmJhciA8LSBkYXRhLmZyYW1lKHZhcjEgPSBMRVRURVJTWzE6MTBdLCB2YXIyID0gMToxMCkNCmBgYA0KDQojIENoZWNrIHRoZSBkYXRhIGZyYW1lIGJhcg0KYGBge3J9DQpiYXINCmBgYA0KDQojIFN1cHBvc2Ugd2UgbGlrZSB0byBzZWxlY3QgYSByYW5kb20gc2FtcGxlIG9mIHNpemUgNS4gRmlyc3QsIGRlZmluZSBhIHZhcmlhYmxlIGluIHRoaXMgY2FzZSBuIHdpdGggdGhlIHNpemUgb2YgdGhlIHNhbXBsZSwgaWUgNS4NCmBgYHtyfQ0KbiA8LSA1DQpgYGANCg0KIyBOb3csIHNlbGVjdCBhIHNhbXBsZSBvZiB0aGUgc2l6ZSA1IGZyb20gdGhlIHZlY3RvciB3aXRoIDEgdG8gMTAgKHRoZSBudW1iZXIgb2Ygcm93cyBpbiBiYXIpLiBVc2UgdGhlIHRoZWN0aW9uIG5yb3coMCkgdGhpcyB3aWxsIGZpbmQgdGhlIG51bWJlciBvZiByb3dzIGluIGJhciBpbnN0ZWFkIG9mIG1hbnVhbGx5IGVudGVyaW5nIHRoZSBudW1iZXIuDQoNCiMgVG8gVnJlYXRlIGEgdmVjdG9yIHdpdGggYWxsIHRoZSBpbnRlZ2VycyBiZXR3ZWVuIDEgYW5kIHRoZSBudW1iZXIgb2Ygcm93IGluIGJhciB1c2Ugc2FtcGxlcm93cyA8LSBzYW1wbGUoMTpucm93KGJhciksIHNpemU9bikNCmBgYHtyfQ0Kc2FtcGxlcm93cyA8LSBzYW1wbGUoMTpucm93KGJhciksIHNpemU9bikNCmBgYA0KDQojIFRvIGRpc3BsYXkvcHJpbnQgc2FtcGxlIHJvd3MNCg0KYGBge3J9DQpzYW1wbGVyb3dzDQpgYGANCiMgVGhlIHZhcmlhYmxlIHNhbXBsZXJvd3MgY29udGFpbnMgdGhlIHJvd3Mgb2YgYmFyIHdoaWNoIG1ha2UgYSByYW5kbSBzYW1wbGUgZnJvbSBhbGwgdGhlIHJvd3MgaW4gYmFyLg0KIyBDcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSBjYWxsZWQgYmFyc2FtcGxlIHdpdGggYSByYW5kb20gc2FtcGxlIG9mIHJvd3MgZnJvbSBiYXIuDQojIEV4dHJhY3QgdGhvc2Ugcm93cyBmcm9tIGJhciB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoNCiMgRXh0cmFjdCByb3dzDQpgYGB7cn0NCmJhcnNhbXBsZSA8LSBiYXJbc2FtcGxlcm93cyxdDQpgYGANCg0KIyBQcmludCBiYXJzYW1wbGUNCmBgYHtyfQ0KcHJpbnQoYmFyc2FtcGxlKQ0KYGBgDQojIFRoZSBzYW1lIGNvZGUgYWJvdmUgY2FuIGJlIGRvbmUgaW4gb25lIGxpbmUgb2YgY29kZS4NCg0KYGBge3J9DQpiYXJbc2FtcGxlKDE6bnJvdyhiYXIpLCBuKSxdDQpgYGANCiMgVVNJTkcgVEFCTEVTIFNFQ1RJT04NCiMgVGhlIHRhYmxlIGNvbW1hbmRzIHRhYmxlKCkgdG8gbG9vayBhdCB0YWJsZXMsIEl0cyBzaW1wbGVzdCB1c2FnZSBsb29rcyBsaWtlIHRhYmxlKHgpIHdoZXJlIHggaXMgYSBjYXRlZ29yaWNhbCB2YXJpYWJsZS4NCiMgRm9yIGV4YW1wbGUsIGEgc3VydmV5IGFza3MgcGVwbGUgaWYgdGhlIHNtb2tlIG9yIG5vdC4gVGhlIGRhdGEgaXMgDQojIFllcywgTm8sIE5vLCBZZXMsIFllcw0KIyBXZSBjYW4gZW50ZXIgdGhpcyBpbnRvIFIgd2l0aCB0aGUgYygpIGNvbW1hbmQsIGFuZCBzdW1tYXJpemUgd2l0aCB0aGUgdGFibGUgY29tbWFuZCBhcyBmb2xsb3dzOg0KYGBge3J9DQp4IDwtIGMoIlllcyIsICJObyIsICJObyIsICJZZXMiLCAiWWVzIikNCnRhYmxlKHgpDQpgYGANCiMgTlVNRVJJQyBNRUFTVVJFUyBPRiBDRU5URVIgQU5EIFNQUkVBRA0KIyBTdXBwb3NlLCBDRU8geWVhcmx5IGNvbWVuc2F0aW9ucyBhcmUgc2FtcGxlZCBhbmQgdGhlIGZvbGxvd2luZyBhcmUgZm91bmQgKGluIG1pbGxpb25zKQ0KIyAxMi40LCA1LCAyLCA1MCwgOCwgMywgMSwgNCwgMC4yNQ0KYGBge3J9DQpzYWxzIDwtIGMoMTIsIC40LCA1LCAyLCA1MCwgOCwgMywgMSwgNCwgMC4yNSkNCmBgYA0KDQojIFRvIGdldCB0aGUgbWVhbnMgb2Ygc2Fscw0KYGBge3J9DQptZWFuKHNhbHMpDQpgYGANCiMgVG8gZmluZCB0aGUgdmFyaWFuY2Ugb2Ygc2Fscw0KYGBge3J9DQp2YXIoc2FscykNCmBgYA0KIyBGaW5kIHRoZSBTdGFuZGFyZCBEZXZpYXRpb24gb2Ygc2Fscw0KYGBge3J9DQpzZChzYWxzKQ0KYGBgDQojIEZpbmQgdGhlIG1lZGlhbiBvZiBzYWxzDQpgYGB7cn0NCm1lZGlhbihzYWxzKQ0KYGBgDQojIFR1a2V5J3MgZml2ZSBudW1iZXIgIHN1bW1hcnksIHVzZWZ1bCBmb3IgYm94cGxvdHMNCiMgRml2ZSBudW1iZXJzOiBtaW4sIGxvd2VyIGhpbmdlLCBtZWRpYW4sIHVwcGVyIGhpbmdlLCBtYXgNCg0KYGBge3J9DQpmaXZlbnVtKHNhbHMpDQpgYGANCiMgVG8gb2J0YWluIHN1bW1hcnkgc3RhdGlzdGljcyBmb3Igc2Fscw0KYGBge3J9DQpzdW1tYXJ5KHNhbHMpDQpgYGANCiMgSE9XIEFCT1VUIFRIRSBNT0RFIFNFQ1RJT046DQojIEluIFIgd2UgY2FuIHdyaXRlIG91ciBvd24gZnVuY3Rpb25zLCBhbmQgYSBmaXJzdCBleGFtcGxlIG9mIGEgZnVuY3Rpb24gaXMgc2hvd24gYmVsb3cgaW4gb3JkZXIgdG8gY29tcHV0ZSB0aGUgbW9kZSBvZiBhIHZlY3RvciBvZiBvYnNlcnZhdGlvbnMgeC4NCiMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gZmluZCB0aGUgbW9kZS4gaS5lLiBtb3N0IGZyZXF1ZW50IHZhbHVlDQpgYGB7cn0NCmdldE1vZGUgPC0gZnVuY3Rpb24oeCl7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCx1eCkpKV0NCn0NCmBgYA0KDQojIEZpbmQgdGhlIG1vc3QgZnJlcXVlbnQgdmFsdWUgaW4gdGUgdmVjdG9yIGJheiBieSB1c2luZyBmdW5jdGlvbiBnZXRNb2RlLg0KYGBge3J9DQpnZXRNb2RlKGJheikNCmBgYA0KDQo=