#First Steps with R activity (Basic calculations)
# Addition
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
#Question_1: Compute the log base 5 of 10 and the log of 10.
log(10) / log(5)
[1] 1.430677
log(10)
[1] 2.302585
#Batting Average=(No. of Hits)/(No. of At Bats)
#What is the batting average of a player that bats 29 hits in 112 at bats?
BA=(29)/(112)
BA
[1] 0.2589286
Batting_Average=round(BA,digits = 3)
Batting_Average
[1] 0.259
#Question_2:What is the batting average of a player that bats 42 hits in 212 at bats?
BA=(42/212)
BA
[1] 0.1981132
Batting_Average=round(BA,digits = 3)
Batting_Average
[1] 0.198
#On Base Percentage
#OBP=(H+BB+HBP)/(At Bats+H+BB+HBP+SF)
#Let us compute the OBP for a player with the following general stats
#AB=515,H=172,BB=84,HBP=5,SF=6
OBP=(172+84+5)/(515+172+84+5+6)
OBP
[1] 0.3337596
On_Base_Percentage=round(OBP,digits = 3)
On_Base_Percentage
[1] 0.334
#Question_3:Compute the OBP for a player with the following general stats:
#AB=565,H=156,BB=65,HBP=3,SF=7
OBP=(156+65+3)/(565+156+65+3+7)
OBP
[1] 0.281407
On_Base_Percentage=round(OBP,digits = 3)
On_Base_Percentage
[1] 0.281
#Often you will want to test whether something is less than, greater than or equal to something.
3 == 8 # Does 3 equals 8?
[1] FALSE
3 != 8# Is 3 different from 8?
[1] TRUE
3 <= 8# Is 3 less than or equal to 8?
[1] TRUE
3>4
[1] FALSE
# The logical operators are & for logical AND, | for logical OR, and ! for NOT. These are some examples:
# Logical Disjunction (or)
FALSE | FALSE # False OR False
[1] FALSE
# Logical Conjunction (and)
TRUE & FALSE #True AND False
[1] FALSE
# Negation
! FALSE # Not False
[1] TRUE
# Combination of statements
2 < 3 | 1 == 5 # 2<3 is True, 1==5 is False, True OR False is True
[1] TRUE
#Assigning Values to Variables
Total_Bases <- 6 + 5
Total_Bases*3
[1] 33
#To see the variables that are currently defined, use ls (as in “list”)
ls()
[1] "BA" "bar" "barsample" "Batting_Average" "game_day"
[6] "getMode" "hits_per_9innings" "n" "OBP" "On_Base_Percentage"
[11] "pitches_by_innings" "player_positions" "runs_per_9innings" "sals" "samplerows"
[16] "strikes_by_innings" "survey_summary" "Total_Bases" "x"
#To delete a variable, use rm (as in “remove”)
rm(Total_Bases)
# Either <- or = can be used to assign a value to a variable, but I prefer <- because is less likely to be confused with the logical operator ==
#VECTORS
pitches_by_innings <- c(12, 15, 10, 20, 10)
pitches_by_innings
[1] 12 15 10 20 10
strikes_by_innings <- c(9, 12, 6, 14, 9)
strikes_by_innings
[1] 9 12 6 14 9
#Question_4: Define two vectors,runs_per_9innings and hits_per_9innings, each with five elements.
# Define two vectors
runs_per_9innings <- c(4, 3, 5, 6, 2)
hits_per_9innings <- c(8, 7, 9, 6, 7)
# There are also some functions that will create vectors with regular patterns, like repeated elements.
# replicate function
rep(2, 5)
[1] 2 2 2 2 2
rep(1,4)
[1] 1 1 1 1
# consecutive numbers
1:5
[1] 1 2 3 4 5
2:10
[1] 2 3 4 5 6 7 8 9 10
# sequence from 1 to 10 with a step of 2
seq(1, 10, by=2)
[1] 1 3 5 7 9
seq(2,13,by=3)
[1] 2 5 8 11
#Many functions and operators like + or - will work on all elements of the vector.
# add vectors
pitches_by_innings+strikes_by_innings
[1] 21 27 16 34 19
# compare vectors
pitches_by_innings == strikes_by_innings
[1] FALSE FALSE FALSE FALSE FALSE
# find length of vector
length(pitches_by_innings)
[1] 5
# find minimum value in vector
min(pitches_by_innings)
[1] 10
# find average value in vector
mean(pitches_by_innings)
[1] 13.4
#You can access parts of a vector by using [. Recall what the value is of the vector pitches_by_innings.
pitches_by_innings
[1] 12 15 10 20 10
# If you want to get the first element:
pitches_by_innings[1]
[1] 12
#Question_5: Get the first element of hits_per_9innings.
hits_per_9innings[1]
[1] 8
#If you want to get the last element of pitches_by_innings without explicitly typing the number of elements of pitches_by_innings, make use of the length function, which calculates the length of a vector:
pitches_by_innings[length(pitches_by_innings)]
[1] 10
#Question_6: Get the last element of hits_per_9innings.
hits_per_9innings[length(hits_per_9innings)]
[1] 7
#You can also extract multiple values from a vector. For instance to get the 2nd through 4th values use
pitches_by_innings[c(2, 3, 4)]
[1] 15 10 20
#Vectors can also be strings or logical values
player_positions <- c("catcher", "pitcher", "infielders", "outfielders")
#DATA FRAMES
#In statistical applications, data is often stored as a data frame, which is like a spreadsheet, with rows as observations and columns as variables.To manually create a data frame, use the data.frame() function.
data.frame(bonus = c(2, 3, 1),#in millions
active_roster = c("yes", "no", "yes"),
salary = c(1.5, 2.5, 1))#in millions
# How to Make a Random Sample
sample(1:10, size=5)
[1] 3 9 8 2 6
bar <- data.frame(var1 = LETTERS[1:10], var2 = 1:10)
# Check data frame
bar
#Suppose you want to select a random sample of size 5. First, define a variable n with the size of the sample, i.e. 5
n <- 5
samplerows <- sample(1:nrow(bar), size=n)
# print sample rows
samplerows
[1] 3 6 8 5 1
# extract rows
barsample <- bar[samplerows, ]
# print sample
print(barsample)
bar[sample(1:nrow(bar), n), ]
#USING TABLES
x <- c("Yes","No","No","Yes","Yes")
table(x)
x
No Yes
2 3
#Numerical measures of center and spread
sals <- c(12, .4, 5, 2, 50, 8, 3, 1, 4, 0.25)
# the average
mean(sals)
[1] 8.565
# the variance
var(sals)
[1] 225.5145
# the standard deviation
sd(sals)
[1] 15.01714
# the median
median(sals)
[1] 3.5
# Tukey's five number summary, usefull for boxplots
# five numbers: min, lower hinge, median, upper hinge, max
fivenum(sals)
[1] 0.25 1.00 3.50 8.00 50.00
# summary statistics
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?
# Function to find the mode, i.e. most frequent value
getMode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
#As an example, we can use the function defined above to find the most frequent value of the number of pitches_by_innings
# Most frequent value in pitches_by_innings
getMode(pitches_by_innings)
[1] 10
#Question_7: Find the most frequent value of hits_per_9innings.
getMode(hits_per_9innings)
[1] 7
#Question_8: Summarize the following survey with the `table()` command:
#What is your favorite day of the week to watch baseball? A total of 10 fans submitted this survey.
#Saturday, Saturday, Sunday, Monday, Saturday,Tuesday, Sunday, Friday, Friday, Monday
game_day<-c("Saturday", "Saturday", "Sunday", "Monday", "Saturday","Tuesday", "Sunday", "Friday", "Friday", "Monday")
# Summarize the survey with the table() command
survey_summary <- table(game_day)
survey_summary
game_day
Friday Monday Saturday Sunday Tuesday
2 2 3 2 1
#Question_9: What is the most frequent answer recorded in the survey? Use the getMode function to compute results.
getMode(game_day)
[1] "Saturday"
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQojRmlyc3QgU3RlcHMgd2l0aCBSIGFjdGl2aXR5IChCYXNpYyBjYWxjdWxhdGlvbnMpCiMgQWRkaXRpb24KMi0zCiMgRGl2aXNpb24KMi8zCiMgRXhwb25lbnRpYXRpb24KMl4zIAojIFNxdWFyZSByb290CnNxcnQoMikKIyBMb2dhcml0aG1zCmxvZygyKQojUXVlc3Rpb25fMTogQ29tcHV0ZSB0aGUgbG9nIGJhc2UgNSBvZiAxMCBhbmQgdGhlIGxvZyBvZiAxMC4KbG9nKDEwKSAvIGxvZyg1KQpsb2coMTApCiNCYXR0aW5nIEF2ZXJhZ2U9KE5vLiBvZiBIaXRzKS8oTm8uIG9mIEF0IEJhdHMpCiNXaGF0IGlzIHRoZSBiYXR0aW5nIGF2ZXJhZ2Ugb2YgYSBwbGF5ZXIgdGhhdCBiYXRzIDI5IGhpdHMgaW4gMTEyIGF0IGJhdHM/CkJBPSgyOSkvKDExMikKQkEKQmF0dGluZ19BdmVyYWdlPXJvdW5kKEJBLGRpZ2l0cyA9IDMpCkJhdHRpbmdfQXZlcmFnZQojUXVlc3Rpb25fMjpXaGF0IGlzIHRoZSBiYXR0aW5nIGF2ZXJhZ2Ugb2YgYSBwbGF5ZXIgdGhhdCBiYXRzIDQyIGhpdHMgaW4gMjEyIGF0IGJhdHM/CkJBPSg0Mi8yMTIpCkJBCkJhdHRpbmdfQXZlcmFnZT1yb3VuZChCQSxkaWdpdHMgPSAzKQpCYXR0aW5nX0F2ZXJhZ2UKI09uIEJhc2UgUGVyY2VudGFnZQojT0JQPShIK0JCK0hCUCkvKEF0IEJhdHMrSCtCQitIQlArU0YpCiNMZXQgdXMgY29tcHV0ZSB0aGUgT0JQIGZvciBhIHBsYXllciB3aXRoIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbCBzdGF0cwojQUI9NTE1LEg9MTcyLEJCPTg0LEhCUD01LFNGPTYKT0JQPSgxNzIrODQrNSkvKDUxNSsxNzIrODQrNSs2KQpPQlAKT25fQmFzZV9QZXJjZW50YWdlPXJvdW5kKE9CUCxkaWdpdHMgPSAzKQpPbl9CYXNlX1BlcmNlbnRhZ2UKI1F1ZXN0aW9uXzM6Q29tcHV0ZSB0aGUgT0JQIGZvciBhIHBsYXllciB3aXRoIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbCBzdGF0czoKI0FCPTU2NSxIPTE1NixCQj02NSxIQlA9MyxTRj03Ck9CUD0oMTU2KzY1KzMpLyg1NjUrMTU2KzY1KzMrNykKT0JQCk9uX0Jhc2VfUGVyY2VudGFnZT1yb3VuZChPQlAsZGlnaXRzID0gMykKT25fQmFzZV9QZXJjZW50YWdlCiNPZnRlbiB5b3Ugd2lsbCB3YW50IHRvIHRlc3Qgd2hldGhlciBzb21ldGhpbmcgaXMgbGVzcyB0aGFuLCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gc29tZXRoaW5nLgozID09IDggIyBEb2VzIDMgZXF1YWxzIDg/CjMgIT0gOCMgSXMgMyBkaWZmZXJlbnQgZnJvbSA4PwozIDw9IDgjIElzIDMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDg/CjM+NAojIFRoZSBsb2dpY2FsIG9wZXJhdG9ycyBhcmUgJiBmb3IgbG9naWNhbCBBTkQsIHwgZm9yIGxvZ2ljYWwgT1IsIGFuZCAhIGZvciBOT1QuIFRoZXNlIGFyZSBzb21lIGV4YW1wbGVzOgojIExvZ2ljYWwgRGlzanVuY3Rpb24gKG9yKQpGQUxTRSB8IEZBTFNFICMgRmFsc2UgT1IgRmFsc2UKIyBMb2dpY2FsIENvbmp1bmN0aW9uIChhbmQpClRSVUUgJiBGQUxTRSAjVHJ1ZSBBTkQgRmFsc2UKIyBOZWdhdGlvbgohIEZBTFNFICMgTm90IEZhbHNlCiMgQ29tYmluYXRpb24gb2Ygc3RhdGVtZW50cwoyIDwgMyB8IDEgPT0gNSAjIDI8MyBpcyBUcnVlLCAxPT01IGlzIEZhbHNlLCBUcnVlIE9SIEZhbHNlIGlzIFRydWUKI0Fzc2lnbmluZyBWYWx1ZXMgdG8gVmFyaWFibGVzClRvdGFsX0Jhc2VzIDwtIDYgKyA1ClRvdGFsX0Jhc2VzKjMKI1RvIHNlZSB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIGN1cnJlbnRseSBkZWZpbmVkLCB1c2UgbHMgKGFzIGluIOKAnGxpc3TigJ0pCmxzKCkKI1RvIGRlbGV0ZSBhIHZhcmlhYmxlLCB1c2Ugcm0gKGFzIGluIOKAnHJlbW92ZeKAnSkKcm0oVG90YWxfQmFzZXMpCiMgRWl0aGVyIDwtIG9yID0gY2FuIGJlIHVzZWQgdG8gYXNzaWduIGEgdmFsdWUgdG8gYSB2YXJpYWJsZSwgYnV0IEkgcHJlZmVyIDwtIGJlY2F1c2UgaXMgbGVzcyBsaWtlbHkgdG8gYmUgY29uZnVzZWQgd2l0aCB0aGUgbG9naWNhbCBvcGVyYXRvciA9PQojVkVDVE9SUwpwaXRjaGVzX2J5X2lubmluZ3MgPC0gYygxMiwgMTUsIDEwLCAyMCwgMTApIApwaXRjaGVzX2J5X2lubmluZ3MKc3RyaWtlc19ieV9pbm5pbmdzIDwtIGMoOSwgMTIsIDYsIDE0LCA5KQpzdHJpa2VzX2J5X2lubmluZ3MKI1F1ZXN0aW9uXzQ6IERlZmluZSB0d28gdmVjdG9ycyxydW5zX3Blcl85aW5uaW5ncyBhbmQgaGl0c19wZXJfOWlubmluZ3MsIGVhY2ggd2l0aCBmaXZlIGVsZW1lbnRzLgojIERlZmluZSB0d28gdmVjdG9ycwpydW5zX3Blcl85aW5uaW5ncyA8LSBjKDQsIDMsIDUsIDYsIDIpCmhpdHNfcGVyXzlpbm5pbmdzIDwtIGMoOCwgNywgOSwgNiwgNykKIyBUaGVyZSBhcmUgYWxzbyBzb21lIGZ1bmN0aW9ucyB0aGF0IHdpbGwgY3JlYXRlIHZlY3RvcnMgd2l0aCByZWd1bGFyIHBhdHRlcm5zLCBsaWtlIHJlcGVhdGVkIGVsZW1lbnRzLgojIHJlcGxpY2F0ZSBmdW5jdGlvbgpyZXAoMiwgNSkKcmVwKDEsNCkKIyBjb25zZWN1dGl2ZSBudW1iZXJzCjE6NQoyOjEwCiMgc2VxdWVuY2UgZnJvbSAxIHRvIDEwIHdpdGggYSBzdGVwIG9mIDIKc2VxKDEsIDEwLCBieT0yKQpzZXEoMiwxMyxieT0zKQojTWFueSBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycyBsaWtlICsgb3IgLSB3aWxsIHdvcmsgb24gYWxsIGVsZW1lbnRzIG9mIHRoZSB2ZWN0b3IuCiMgYWRkIHZlY3RvcnMKcGl0Y2hlc19ieV9pbm5pbmdzK3N0cmlrZXNfYnlfaW5uaW5ncwojIGNvbXBhcmUgdmVjdG9ycwpwaXRjaGVzX2J5X2lubmluZ3MgPT0gc3RyaWtlc19ieV9pbm5pbmdzCiMgZmluZCBsZW5ndGggb2YgdmVjdG9yCmxlbmd0aChwaXRjaGVzX2J5X2lubmluZ3MpCiMgZmluZCBtaW5pbXVtIHZhbHVlIGluIHZlY3RvcgptaW4ocGl0Y2hlc19ieV9pbm5pbmdzKQojIGZpbmQgYXZlcmFnZSB2YWx1ZSBpbiB2ZWN0b3IKbWVhbihwaXRjaGVzX2J5X2lubmluZ3MpCiNZb3UgY2FuIGFjY2VzcyBwYXJ0cyBvZiBhIHZlY3RvciBieSB1c2luZyBbLiBSZWNhbGwgd2hhdCB0aGUgdmFsdWUgaXMgb2YgdGhlIHZlY3RvciBwaXRjaGVzX2J5X2lubmluZ3MuCnBpdGNoZXNfYnlfaW5uaW5ncwojIElmIHlvdSB3YW50IHRvIGdldCB0aGUgZmlyc3QgZWxlbWVudDoKcGl0Y2hlc19ieV9pbm5pbmdzWzFdCiNRdWVzdGlvbl81OiBHZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgaGl0c19wZXJfOWlubmluZ3MuCmhpdHNfcGVyXzlpbm5pbmdzWzFdCiNJZiB5b3Ugd2FudCB0byBnZXQgdGhlIGxhc3QgZWxlbWVudCBvZiBwaXRjaGVzX2J5X2lubmluZ3Mgd2l0aG91dCBleHBsaWNpdGx5IHR5cGluZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHBpdGNoZXNfYnlfaW5uaW5ncywgbWFrZSB1c2Ugb2YgdGhlIGxlbmd0aCBmdW5jdGlvbiwgd2hpY2ggY2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjdG9yOgpwaXRjaGVzX2J5X2lubmluZ3NbbGVuZ3RoKHBpdGNoZXNfYnlfaW5uaW5ncyldCiNRdWVzdGlvbl82OiBHZXQgdGhlIGxhc3QgZWxlbWVudCBvZiBoaXRzX3Blcl85aW5uaW5ncy4KaGl0c19wZXJfOWlubmluZ3NbbGVuZ3RoKGhpdHNfcGVyXzlpbm5pbmdzKV0KI1lvdSBjYW4gYWxzbyBleHRyYWN0IG11bHRpcGxlIHZhbHVlcyBmcm9tIGEgdmVjdG9yLiBGb3IgaW5zdGFuY2UgdG8gZ2V0IHRoZSAybmQgdGhyb3VnaCA0dGggdmFsdWVzIHVzZQpwaXRjaGVzX2J5X2lubmluZ3NbYygyLCAzLCA0KV0KI1ZlY3RvcnMgY2FuIGFsc28gYmUgc3RyaW5ncyBvciBsb2dpY2FsIHZhbHVlcwpwbGF5ZXJfcG9zaXRpb25zIDwtIGMoImNhdGNoZXIiLCAicGl0Y2hlciIsICJpbmZpZWxkZXJzIiwgIm91dGZpZWxkZXJzIikKI0RBVEEgRlJBTUVTCiNJbiBzdGF0aXN0aWNhbCBhcHBsaWNhdGlvbnMsIGRhdGEgaXMgb2Z0ZW4gc3RvcmVkIGFzIGEgZGF0YSBmcmFtZSwgd2hpY2ggaXMgbGlrZSBhIHNwcmVhZHNoZWV0LCB3aXRoIHJvd3MgYXMgb2JzZXJ2YXRpb25zIGFuZCBjb2x1bW5zIGFzIHZhcmlhYmxlcy5UbyBtYW51YWxseSBjcmVhdGUgYSBkYXRhIGZyYW1lLCB1c2UgdGhlIGRhdGEuZnJhbWUoKSBmdW5jdGlvbi4KZGF0YS5mcmFtZShib251cyA9IGMoMiwgMywgMSksI2luIG1pbGxpb25zIAogICAgICAgICAgIGFjdGl2ZV9yb3N0ZXIgPSBjKCJ5ZXMiLCAibm8iLCAieWVzIiksIAogICAgICAgICAgIHNhbGFyeSA9IGMoMS41LCAyLjUsIDEpKSNpbiBtaWxsaW9ucyAKIyBIb3cgdG8gTWFrZSBhIFJhbmRvbSBTYW1wbGUKc2FtcGxlKDE6MTAsIHNpemU9NSkKYmFyIDwtIGRhdGEuZnJhbWUodmFyMSA9IExFVFRFUlNbMToxMF0sIHZhcjIgPSAxOjEwKQojIENoZWNrIGRhdGEgZnJhbWUKYmFyCiNTdXBwb3NlIHlvdSB3YW50IHRvIHNlbGVjdCBhIHJhbmRvbSBzYW1wbGUgb2Ygc2l6ZSA1LiBGaXJzdCwgZGVmaW5lIGEgdmFyaWFibGUgbiB3aXRoIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUsIGkuZS4gNQpuIDwtIDUKc2FtcGxlcm93cyA8LSBzYW1wbGUoMTpucm93KGJhciksIHNpemU9bikgCiMgcHJpbnQgc2FtcGxlIHJvd3MKc2FtcGxlcm93cwojIGV4dHJhY3Qgcm93cwpiYXJzYW1wbGUgPC0gYmFyW3NhbXBsZXJvd3MsIF0KIyBwcmludCBzYW1wbGUKcHJpbnQoYmFyc2FtcGxlKQpiYXJbc2FtcGxlKDE6bnJvdyhiYXIpLCBuKSwgXQojVVNJTkcgVEFCTEVTCnggPC0gYygiWWVzIiwiTm8iLCJObyIsIlllcyIsIlllcyIpIAp0YWJsZSh4KQojTnVtZXJpY2FsIG1lYXN1cmVzIG9mIGNlbnRlciBhbmQgc3ByZWFkCnNhbHMgPC0gYygxMiwgLjQsIDUsIDIsIDUwLCA4LCAzLCAxLCA0LCAwLjI1KQojIHRoZSBhdmVyYWdlCm1lYW4oc2FscykgCiMgdGhlIHZhcmlhbmNlCnZhcihzYWxzKQojIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24Kc2Qoc2FscykKIyB0aGUgbWVkaWFuCm1lZGlhbihzYWxzKQojIFR1a2V5J3MgZml2ZSBudW1iZXIgc3VtbWFyeSwgdXNlZnVsbCBmb3IgYm94cGxvdHMKIyBmaXZlIG51bWJlcnM6IG1pbiwgbG93ZXIgaGluZ2UsIG1lZGlhbiwgdXBwZXIgaGluZ2UsIG1heApmaXZlbnVtKHNhbHMpCiMgc3VtbWFyeSBzdGF0aXN0aWNzCnN1bW1hcnkoc2FscykKI0hvdyBhYm91dCB0aGUgbW9kZT8KIyBGdW5jdGlvbiB0byBmaW5kIHRoZSBtb2RlLCBpLmUuIG1vc3QgZnJlcXVlbnQgdmFsdWUKZ2V0TW9kZSA8LSBmdW5jdGlvbih4KSB7CiAgICAgdXggPC0gdW5pcXVlKHgpCiAgICAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQp9CiNBcyBhbiBleGFtcGxlLCB3ZSBjYW4gdXNlIHRoZSBmdW5jdGlvbiBkZWZpbmVkIGFib3ZlIHRvIGZpbmQgdGhlIG1vc3QgZnJlcXVlbnQgdmFsdWUgb2YgdGhlIG51bWJlciBvZiBwaXRjaGVzX2J5X2lubmluZ3MKIyBNb3N0IGZyZXF1ZW50IHZhbHVlIGluIHBpdGNoZXNfYnlfaW5uaW5ncwpnZXRNb2RlKHBpdGNoZXNfYnlfaW5uaW5ncykKI1F1ZXN0aW9uXzc6IEZpbmQgdGhlIG1vc3QgZnJlcXVlbnQgdmFsdWUgb2YgaGl0c19wZXJfOWlubmluZ3MuCmdldE1vZGUoaGl0c19wZXJfOWlubmluZ3MpCiNRdWVzdGlvbl84OiBTdW1tYXJpemUgdGhlIGZvbGxvd2luZyBzdXJ2ZXkgd2l0aCB0aGUgYHRhYmxlKClgIGNvbW1hbmQ6CiNXaGF0IGlzIHlvdXIgZmF2b3JpdGUgZGF5IG9mIHRoZSB3ZWVrIHRvIHdhdGNoIGJhc2ViYWxsPyBBIHRvdGFsIG9mIDEwIGZhbnMgc3VibWl0dGVkIHRoaXMgc3VydmV5LgojU2F0dXJkYXksIFNhdHVyZGF5LCBTdW5kYXksIE1vbmRheSwgU2F0dXJkYXksVHVlc2RheSwgU3VuZGF5LCBGcmlkYXksIEZyaWRheSwgTW9uZGF5CmdhbWVfZGF5PC1jKCJTYXR1cmRheSIsICJTYXR1cmRheSIsICJTdW5kYXkiLCAiTW9uZGF5IiwgIlNhdHVyZGF5IiwiVHVlc2RheSIsICJTdW5kYXkiLCAiRnJpZGF5IiwgIkZyaWRheSIsICJNb25kYXkiKQoKIyBTdW1tYXJpemUgdGhlIHN1cnZleSB3aXRoIHRoZSB0YWJsZSgpIGNvbW1hbmQKc3VydmV5X3N1bW1hcnkgPC0gdGFibGUoZ2FtZV9kYXkpCnN1cnZleV9zdW1tYXJ5CiNRdWVzdGlvbl85OiBXaGF0IGlzIHRoZSBtb3N0IGZyZXF1ZW50IGFuc3dlciByZWNvcmRlZCBpbiB0aGUgc3VydmV5PyBVc2UgdGhlIGdldE1vZGUgZnVuY3Rpb24gdG8gY29tcHV0ZSByZXN1bHRzLiAKZ2V0TW9kZShnYW1lX2RheSkKYGBg