3.3 Exercises 3 & 4 on page 52 (Questions 1 - 4 in Section 3.3 were covered in Assignment 1)

3.5 Exercises 1, 3 & 5 on pages 58 & 59 (Questions 1 & 3 in Section 3.5 were covered in assignment 1. Question 5 follows. )

3.5.5.
We saw that the region column stores a factor.
You can corroborate this by typing:
class(murders$region) With one line of code,
use the function levels and length to ### determine
the number of regions defined by this dataset.
A: 4 regions (code follows)
library(dslabs)
data(murders)

with(murders, length(levels(region)))

3.8 Exercises 1, 8 & 12 on page 63 ( Questions 1 - 6, 9 &12 in Section 3.8 were covered by assignment 1. Question 8 follows. )

3.8.8. Create a vector of numbers that starts at 6,
does not pass 55, and adds numbers in increments of 4/7:
6, 6+4/7, 6+8/7, etc.. How many numbers does the list have? ### Hint: use seq and length.
A: 86 elements (code follows)
my_vector = seq(6, 55, 4/7)
length(my_vector)

3.10 Exercises 5 & 7 on page 66 (Questions 1, 2, 5 & 7 in Section 3.10 were covered in assignment 1)

3.12 Exercises 2 & 3 on page 68
3.12.2. What is the following sum 1 + 1/2^2 +
1/3^2 + . . . 1/100^2?
Hint: thanks to Euler, we know it should be
close to (pi^2)/6.
A: 1.634984 (code follows)

sum(1 / seq(1, 100) ^2)
3.12.3 Compute the per 100,000 murder rate for
each state and store it in the object murder_rate.
Then compute the average murder rate for the US
using the function mean. What is the average?
A: The average is 2.779125 (code follows)
murders$murder_rate<- with(murders, total/population * 10^5)

mean(murders$murder_rate)

3.14 Exercises 7 & 8 on page 71

3.14.7 Use the %in% operator to create a logical
vector that answers the question: which of the
following are actual abbreviations: MA, ME, MI, MO, MU ?
A: MU is not a valid abbreviation. (Code follows)
abbreviations = c("MA", "ME", "MI", "MO", "MU")
abbreviations %in% murders$abb
3.14.8. Extend the code you used in exercise 7
to report the one entry that is not an actual
abbreviation.
Hint: use the ! operator, which turns FALSE into TRUE and ### vice versa, then which to obtain an index.
A: (see code)
abbreviations[which(!abbreviations %in% murders$abb)]

3.16 Exercises 1 - 3 on page 74 (Questions 1 - 3 in Section 3.16 were covered in Assignment 1)

4.6 Exercises 1, 2 & 4 on pages 81 & 82 ##### 4.6.6 After running the code below, what is the ##### value of x? ##### x <- 3 ##### my_func <- function(y){ ##### x <- 5 ##### y+5 ##### }

A: The value of x remains three because the
function is never called
5.15 Exercise 4 on page 103
Write tidyverse code that is equivalent to this code:
exp(mean(log(murders$population))). Write
it using the pipe so that each function is called
without arguments. Use the dot operator to access the
population.
Hint: The code should start with murders %>%.
A: Code follows
##### install.packages("tidyverse")
library(tidyverse)
murders %>% 
  .$population %>%
  log  %>% 
  mean %>% 
  exp 
###install.packages('NHANES')
library("NHANES")
data("na_example")
mean(na_example, na.rm = TRUE)
sd(na_example, na.rm = TRUE)
5.9.1. We will provide some basic facts about blood
pressure. First let’s select a group to set the
standard.
We will use 20-29 year old females. AgeDecade is
a categorical variable with these ages. Note that
the category is coded like ” 20-29“, with a space
in front! What is the average and standard deviation
of systolic blood pressure as saved in the BPSysAve
variable? Save it to a variable called ref.
Hint: Use filter and summarize and use the na.rm = TRUE
argument when computing the average and standard
deviation. You can also filter the NA values using filter.
data("NHANES")

ref = NHANES %>%
  filter(AgeDecade == " 20-29" & Gender == 'female') %>% 
  summarize(average=mean(BPSysAve, na.rm=TRUE), std_dev=sd(BPSysAve, na.rm=TRUE) )
  
ref
5.9.2. Using a pipe, assign the average to a numeric
variable ref_avg.
Hint: Use the code similar to above and then pull.
data("NHANES")

ref_avg = ref %>% pull(average)
  
ref_avg
5.9.3. Now report the min and max values for the same group.
NHANES %>%
  filter(AgeDecade == " 20-29" & Gender == 'female') %>% 
  summarize(min=min(BPSysAve, na.rm=TRUE), max=max(BPSysAve, na.rm=TRUE) )
5.9.4. Compute the average and standard deviation for females,
but for each age group separately rather than a selected decade
as in question 1.
Note that the age groups are defined by AgeDecade.
Hint: rather than filtering by age and gender, filter by Gender
and then use group_by.
NHANES %>% 
  filter(Gender=='female') %>%
  group_by(AgeDecade) %>%
  summarize(average=mean(BPSysAve, na.rm=TRUE), 
            std_dev=sd(BPSysAve, na.rm=TRUE) )
  
5.9.5. Repeat exercise 4 for males.
NHANES %>% 
  filter(Gender=='male') %>%
  group_by(AgeDecade) %>%
  summarize(average=mean(BPSysAve, na.rm=TRUE), 
            std_dev=sd(BPSysAve, na.rm=TRUE) )
  
5.9.6. We can actually combine both summaries for exercises 4 and 5
into one line of code. This is because group_by permits us to
group by more than one variable. Obtain one big summary table
using group_by(AgeDecade, Gender).
NHANES %>% 

  group_by(AgeDecade, Gender) %>%
  summarize(average=mean(BPSysAve, na.rm=TRUE), 
            std_dev=sd(BPSysAve, na.rm=TRUE) )
  
5.9.7. For males between the ages of 40-49, compare systolic
blood pressure across race as reported in the Race1 variable.
Order the resulting table from lowest to highest average
systolic blood pressure.

NHANES %>% 
  filter(Gender=='male', AgeDecade==' 40-49')%>% 
  group_by(Race1) %>%
  summarize(average=mean(BPSysAve, na.rm=TRUE), 
            std_dev=sd(BPSysAve, na.rm=TRUE) ) %>%
  arrange(average)
  
  
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCg0KDQoNCjMuMyBFeGVyY2lzZXMgMyAmIDQgb24gcGFnZSA1MiANCihRdWVzdGlvbnMgMSAtIDQgaW4gU2VjdGlvbiAzLjMgd2VyZSBjb3ZlcmVkIGluIEFzc2lnbm1lbnQgMSkNCg0KMy41IEV4ZXJjaXNlcyAxLCAzICYgNSBvbiBwYWdlcyA1OCAmIDU5IA0KKFF1ZXN0aW9ucyAxICYgMyBpbiBTZWN0aW9uIDMuNSAgd2VyZSBjb3ZlcmVkIGluIGFzc2lnbm1lbnQgMS4gUXVlc3Rpb24gNSBmb2xsb3dzLiApDQoNCg0KDQojIyMjIyAzLjUuNS4gDQojIyMjIyBXZSBzYXcgdGhhdCB0aGUgcmVnaW9uIGNvbHVtbiBzdG9yZXMgYSBmYWN0b3IuIA0KIyMjIyMgWW91IGNhbiBjb3Jyb2JvcmF0ZSB0aGlzIGJ5IHR5cGluZzoNCiMjIyMjIGNsYXNzKG11cmRlcnMkcmVnaW9uKSBXaXRoIG9uZSBsaW5lIG9mIGNvZGUsIA0KIyMjIyMgdXNlIHRoZSBmdW5jdGlvbiBsZXZlbHMgYW5kIGxlbmd0aCB0byAjIyMgZGV0ZXJtaW5lIA0KIyMjIyMgdGhlIG51bWJlciBvZiByZWdpb25zIGRlZmluZWQgYnkgdGhpcyBkYXRhc2V0Lg0KDQojIyMjIyBBOiA0IHJlZ2lvbnMgKGNvZGUgZm9sbG93cykNCg0KYGBge3J9DQpsaWJyYXJ5KGRzbGFicykNCmRhdGEobXVyZGVycykNCg0Kd2l0aChtdXJkZXJzLCBsZW5ndGgobGV2ZWxzKHJlZ2lvbikpKQ0KYGBgDQoNCg0KMy44IEV4ZXJjaXNlcyAxLCA4ICYgMTIgb24gcGFnZSA2MyANCiggUXVlc3Rpb25zIDEgLSA2LCA5ICYxMiBpbiBTZWN0aW9uIDMuOCB3ZXJlIGNvdmVyZWQgYnkgYXNzaWdubWVudCAxLiBRdWVzdGlvbiA4IGZvbGxvd3MuICkNCg0KDQojIyMjIyAzLjguOC4gQ3JlYXRlIGEgdmVjdG9yIG9mIG51bWJlcnMgdGhhdCBzdGFydHMgYXQgNiwNCiMjIyMjIGRvZXMgbm90IHBhc3MgNTUsIGFuZCBhZGRzIG51bWJlcnMgaW4gaW5jcmVtZW50cyBvZiA0Lzc6DQojIyMjIyA2LCA2KzQvNywgNis4LzcsIGV0Yy4uIEhvdyBtYW55IG51bWJlcnMgZG9lcyB0aGUgbGlzdCBoYXZlPyAjIyMgSGludDogdXNlIHNlcSBhbmQgbGVuZ3RoLg0KDQojIyMjIyBBOiA4NiBlbGVtZW50cyAoY29kZSBmb2xsb3dzKQ0KDQpgYGB7cn0NCm15X3ZlY3RvciA9IHNlcSg2LCA1NSwgNC83KQ0KbGVuZ3RoKG15X3ZlY3RvcikNCg0KDQoNCmBgYA0KDQozLjEwIEV4ZXJjaXNlcyA1ICYgNyBvbiBwYWdlIDY2IA0KKFF1ZXN0aW9ucyAxLCAyLCA1ICYgNyBpbiBTZWN0aW9uIDMuMTAgd2VyZSBjb3ZlcmVkIGluIGFzc2lnbm1lbnQgMSkNCg0KIyMjIyMgMy4xMiBFeGVyY2lzZXMgMiAmIDMgb24gcGFnZSA2OA0KDQojIyMjIyAzLjEyLjIuIFdoYXQgaXMgdGhlIGZvbGxvd2luZyBzdW0gMSArIDEvMl4yICsgDQojIyMjIyAxLzNeMiArIC4gLiAuIDEvMTAwXjI/IA0KIyMjIyMgSGludDogdGhhbmtzIHRvIEV1bGVyLCB3ZSBrbm93IGl0IHNob3VsZCBiZQ0KIyMjIyMgY2xvc2UgdG8gKHBpXjIpLzYuDQoNCiMjIyMjIEE6IDEuNjM0OTg0IChjb2RlIGZvbGxvd3MpDQoNCiANCmBgYHtyfQ0KDQpzdW0oMSAvIHNlcSgxLCAxMDApIF4yKQ0KDQoNCmBgYA0KDQojIyMjIyAzLjEyLjMgQ29tcHV0ZSB0aGUgcGVyIDEwMCwwMDAgbXVyZGVyIHJhdGUgZm9yIA0KIyMjIyMgZWFjaCBzdGF0ZSBhbmQgc3RvcmUgaXQgaW4gdGhlIG9iamVjdCBtdXJkZXJfcmF0ZS4NCiMjIyMjIFRoZW4gY29tcHV0ZSB0aGUgYXZlcmFnZSBtdXJkZXIgcmF0ZSBmb3IgdGhlIFVTIA0KIyMjIyMgdXNpbmcgdGhlIGZ1bmN0aW9uIG1lYW4uIFdoYXQgaXMgdGhlIGF2ZXJhZ2U/DQoNCiMjIyMjIEE6IFRoZSBhdmVyYWdlIGlzIDIuNzc5MTI1IChjb2RlIGZvbGxvd3MpDQpgYGB7cn0NCm11cmRlcnMkbXVyZGVyX3JhdGU8LSB3aXRoKG11cmRlcnMsIHRvdGFsL3BvcHVsYXRpb24gKiAxMF41KQ0KDQptZWFuKG11cmRlcnMkbXVyZGVyX3JhdGUpDQoNCg0KYGBgDQoNCg0KMy4xNCBFeGVyY2lzZXMgNyAmIDggb24gcGFnZSA3MQ0KDQojIyMjIyAzLjE0LjcgVXNlIHRoZSAlaW4lIG9wZXJhdG9yIHRvIGNyZWF0ZSBhIGxvZ2ljYWwgDQojIyMjIyB2ZWN0b3IgdGhhdCBhbnN3ZXJzIHRoZSBxdWVzdGlvbjogd2hpY2ggb2YgdGhlIA0KIyMjIyMgZm9sbG93aW5nIGFyZSBhY3R1YWwgYWJicmV2aWF0aW9uczogTUEsIE1FLCBNSSwgTU8sIE1VID8NCg0KIyMjIyMgQTogTVUgaXMgbm90IGEgdmFsaWQgYWJicmV2aWF0aW9uLiAoQ29kZSBmb2xsb3dzKQ0KYGBge3J9DQphYmJyZXZpYXRpb25zID0gYygiTUEiLCAiTUUiLCAiTUkiLCAiTU8iLCAiTVUiKQ0KYWJicmV2aWF0aW9ucyAlaW4lIG11cmRlcnMkYWJiDQoNCmBgYA0KDQojIyMjIyAzLjE0LjguIEV4dGVuZCB0aGUgY29kZSB5b3UgdXNlZCBpbiBleGVyY2lzZSA3IA0KIyMjIyMgdG8gcmVwb3J0IHRoZSBvbmUgZW50cnkgdGhhdCBpcyBub3QgYW4gYWN0dWFsIA0KIyMjIyMgYWJicmV2aWF0aW9uLg0KIyMjIyMgSGludDogdXNlIHRoZSAhIG9wZXJhdG9yLCB3aGljaCB0dXJucyBGQUxTRSBpbnRvIFRSVUUgYW5kICMjIyB2aWNlIHZlcnNhLCB0aGVuIHdoaWNoIHRvIG9idGFpbiBhbiBpbmRleC4NCg0KIyMjIyMgQTogKHNlZSBjb2RlKQ0KDQpgYGB7cn0NCmFiYnJldmlhdGlvbnNbd2hpY2goIWFiYnJldmlhdGlvbnMgJWluJSBtdXJkZXJzJGFiYildDQoNCmBgYA0KDQozLjE2IEV4ZXJjaXNlcyAxIC0gMyBvbiBwYWdlIDc0DQooUXVlc3Rpb25zIDEgLSAzIGluIFNlY3Rpb24gMy4xNiB3ZXJlIGNvdmVyZWQgaW4gQXNzaWdubWVudCAxKQ0KDQo0LjYgRXhlcmNpc2VzIDEsIDIgJiA0IG9uIHBhZ2VzIDgxICYgODINCiMjIyMjIDQuNi42IEFmdGVyIHJ1bm5pbmcgdGhlIGNvZGUgYmVsb3csIHdoYXQgaXMgdGhlDQojIyMjIyB2YWx1ZSBvZiB4Pw0KIyMjIyMgeCA8LSAzDQojIyMjIyAgbXlfZnVuYyA8LSBmdW5jdGlvbih5KXsNCiMjIyMjIHggPC0gNQ0KIyMjIyMgeSs1DQojIyMjIyB9DQoNCiMjIyMjIEE6IFRoZSB2YWx1ZSBvZiB4IHJlbWFpbnMgdGhyZWUgYmVjYXVzZSB0aGUgDQojIyMjIyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQNCg0KDQojIyMjIyA1LjE1IEV4ZXJjaXNlIDQgb24gcGFnZSAxMDMNCg0KIyMjIyMgV3JpdGUgdGlkeXZlcnNlIGNvZGUgdGhhdCBpcyBlcXVpdmFsZW50IHRvIHRoaXMgY29kZTogDQojIyMjIyBleHAobWVhbihsb2cobXVyZGVycyRwb3B1bGF0aW9uKSkpLiBXcml0ZQ0KIyMjIyMgaXQgdXNpbmcgdGhlIHBpcGUgc28gdGhhdCBlYWNoIGZ1bmN0aW9uIGlzIGNhbGxlZCANCiMjIyMjIHdpdGhvdXQgYXJndW1lbnRzLiBVc2UgdGhlIGRvdCBvcGVyYXRvciB0byBhY2Nlc3MgdGhlDQojIyMjIyBwb3B1bGF0aW9uLiBcDQoNCiMjIyMjIEhpbnQ6IFRoZSBjb2RlIHNob3VsZCBzdGFydCB3aXRoIG11cmRlcnMgJT4lLg0KDQojIyMjIyBBOiBDb2RlIGZvbGxvd3MNCmBgYHtyfQ0KIyMjIyMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbXVyZGVycyAlPiUgDQogIC4kcG9wdWxhdGlvbiAlPiUNCiAgbG9nICAlPiUgDQogIG1lYW4gJT4lIA0KICBleHAgDQpgYGANCg0KDQoNCmBgYHtyfQ0KIyMjaW5zdGFsbC5wYWNrYWdlcygnTkhBTkVTJykNCmxpYnJhcnkoIk5IQU5FUyIpDQpkYXRhKCJuYV9leGFtcGxlIikNCmBgYA0KYGBge3J9DQptZWFuKG5hX2V4YW1wbGUsIG5hLnJtID0gVFJVRSkNCmBgYA0KDQoNCmBgYHtyfQ0Kc2QobmFfZXhhbXBsZSwgbmEucm0gPSBUUlVFKQ0KYGBgDQojIyMjIyA1LjkuMS4gV2Ugd2lsbCBwcm92aWRlIHNvbWUgYmFzaWMgZmFjdHMgYWJvdXQgYmxvb2QgDQojIyMjIyBwcmVzc3VyZS4gRmlyc3QgbGV04oCZcyBzZWxlY3QgYSBncm91cCB0byBzZXQgdGhlIA0KIyMjIyMgc3RhbmRhcmQuDQoNCiMjIyMjIFdlIHdpbGwgdXNlIDIwLTI5IHllYXIgb2xkIGZlbWFsZXMuIEFnZURlY2FkZSBpcyANCiMjIyMjIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUgd2l0aCB0aGVzZSBhZ2VzLiBOb3RlIHRoYXQgDQojIyMjIyB0aGUgY2F0ZWdvcnkgaXMgY29kZWQgbGlrZSDigJ0gMjAtMjnigJwsIHdpdGggYSBzcGFjZSANCiMjIyMjIGluIGZyb250ISBXaGF0IGlzIHRoZSBhdmVyYWdlIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gDQojIyMjIyBvZiBzeXN0b2xpYyBibG9vZCBwcmVzc3VyZSBhcyBzYXZlZCBpbiB0aGUgQlBTeXNBdmUgDQojIyMjIyB2YXJpYWJsZT8gU2F2ZSBpdCB0byBhIHZhcmlhYmxlIGNhbGxlZCByZWYuDQoNCiMjIyMjIEhpbnQ6IFVzZSBmaWx0ZXIgYW5kIHN1bW1hcml6ZSBhbmQgdXNlIHRoZSBuYS5ybSA9IFRSVUUgDQojIyMjIyBhcmd1bWVudCB3aGVuIGNvbXB1dGluZyB0aGUgYXZlcmFnZSBhbmQgc3RhbmRhcmQgDQojIyMjIyBkZXZpYXRpb24uIFlvdSBjYW4gYWxzbyBmaWx0ZXIgdGhlIE5BIHZhbHVlcyB1c2luZyBmaWx0ZXIuDQoNCmBgYHtyfQ0KZGF0YSgiTkhBTkVTIikNCg0KcmVmID0gTkhBTkVTICU+JQ0KICBmaWx0ZXIoQWdlRGVjYWRlID09ICIgMjAtMjkiICYgR2VuZGVyID09ICdmZW1hbGUnKSAlPiUgDQogIHN1bW1hcml6ZShhdmVyYWdlPW1lYW4oQlBTeXNBdmUsIG5hLnJtPVRSVUUpLCBzdGRfZGV2PXNkKEJQU3lzQXZlLCBuYS5ybT1UUlVFKSApDQogIA0KcmVmDQoNCmBgYA0KDQoNCiMjIyMjIDUuOS4yLiBVc2luZyBhIHBpcGUsIGFzc2lnbiB0aGUgYXZlcmFnZSB0byBhIG51bWVyaWMgDQojIyMjIyB2YXJpYWJsZSByZWZfYXZnLiANCiMjIyMjIEhpbnQ6IFVzZSB0aGUgY29kZSBzaW1pbGFyIHRvIGFib3ZlIGFuZCB0aGVuIHB1bGwuDQoNCmBgYHtyfQ0KZGF0YSgiTkhBTkVTIikNCg0KcmVmX2F2ZyA9IHJlZiAlPiUgcHVsbChhdmVyYWdlKQ0KICANCnJlZl9hdmcNCg0KYGBgDQojIyMjIyA1LjkuMy4gTm93IHJlcG9ydCB0aGUgbWluIGFuZCBtYXggdmFsdWVzIGZvciB0aGUgc2FtZSBncm91cC4NCg0KYGBge3J9DQpOSEFORVMgJT4lDQogIGZpbHRlcihBZ2VEZWNhZGUgPT0gIiAyMC0yOSIgJiBHZW5kZXIgPT0gJ2ZlbWFsZScpICU+JSANCiAgc3VtbWFyaXplKG1pbj1taW4oQlBTeXNBdmUsIG5hLnJtPVRSVUUpLCBtYXg9bWF4KEJQU3lzQXZlLCBuYS5ybT1UUlVFKSApDQpgYGANCg0KDQojIyMjIyA1LjkuNC4gQ29tcHV0ZSB0aGUgYXZlcmFnZSBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBmZW1hbGVzLCANCiMjIyMjIGJ1dCBmb3IgZWFjaCBhZ2UgZ3JvdXAgc2VwYXJhdGVseSByYXRoZXIgdGhhbiBhIHNlbGVjdGVkIGRlY2FkZQ0KIyMjIyMgYXMgaW4gcXVlc3Rpb24gMS4gDQoNCiMjIyMjIE5vdGUgdGhhdCB0aGUgYWdlIGdyb3VwcyBhcmUgZGVmaW5lZCBieSBBZ2VEZWNhZGUuIA0KDQojIyMjIyBIaW50OiByYXRoZXIgdGhhbiBmaWx0ZXJpbmcgYnkgYWdlIGFuZCBnZW5kZXIsIGZpbHRlciBieSBHZW5kZXIgDQojIyMjIyBhbmQgdGhlbiB1c2UgZ3JvdXBfYnkuDQoNCmBgYHtyfQ0KTkhBTkVTICU+JSANCiAgZmlsdGVyKEdlbmRlcj09J2ZlbWFsZScpICU+JQ0KICBncm91cF9ieShBZ2VEZWNhZGUpICU+JQ0KICBzdW1tYXJpemUoYXZlcmFnZT1tZWFuKEJQU3lzQXZlLCBuYS5ybT1UUlVFKSwgDQogICAgICAgICAgICBzdGRfZGV2PXNkKEJQU3lzQXZlLCBuYS5ybT1UUlVFKSApDQogIA0KYGBgDQoNCiMjIyMjIDUuOS41LiBSZXBlYXQgZXhlcmNpc2UgNCBmb3IgbWFsZXMuDQpgYGB7cn0NCk5IQU5FUyAlPiUgDQogIGZpbHRlcihHZW5kZXI9PSdtYWxlJykgJT4lDQogIGdyb3VwX2J5KEFnZURlY2FkZSkgJT4lDQogIHN1bW1hcml6ZShhdmVyYWdlPW1lYW4oQlBTeXNBdmUsIG5hLnJtPVRSVUUpLCANCiAgICAgICAgICAgIHN0ZF9kZXY9c2QoQlBTeXNBdmUsIG5hLnJtPVRSVUUpICkNCiAgDQpgYGANCiMjIyMjIDUuOS42LiBXZSBjYW4gYWN0dWFsbHkgY29tYmluZSBib3RoIHN1bW1hcmllcyBmb3IgZXhlcmNpc2VzIDQgYW5kIDUgDQojIyMjIyBpbnRvIG9uZSBsaW5lIG9mIGNvZGUuIFRoaXMgaXMgYmVjYXVzZSBncm91cF9ieSBwZXJtaXRzIHVzIHRvIA0KIyMjIyMgZ3JvdXAgYnkgbW9yZSB0aGFuIG9uZSB2YXJpYWJsZS4gT2J0YWluIG9uZSBiaWcgc3VtbWFyeSB0YWJsZSANCiMjIyMjIHVzaW5nIGdyb3VwX2J5KEFnZURlY2FkZSwgR2VuZGVyKS4NCmBgYHtyfQ0KTkhBTkVTICU+JSANCg0KICBncm91cF9ieShBZ2VEZWNhZGUsIEdlbmRlcikgJT4lDQogIHN1bW1hcml6ZShhdmVyYWdlPW1lYW4oQlBTeXNBdmUsIG5hLnJtPVRSVUUpLCANCiAgICAgICAgICAgIHN0ZF9kZXY9c2QoQlBTeXNBdmUsIG5hLnJtPVRSVUUpICkNCiAgDQpgYGANCg0KIyMjIyMgNS45LjcuIEZvciBtYWxlcyBiZXR3ZWVuIHRoZSBhZ2VzIG9mIDQwLTQ5LCBjb21wYXJlIHN5c3RvbGljIA0KIyMjIyMgYmxvb2QgcHJlc3N1cmUgYWNyb3NzIHJhY2UgYXMgcmVwb3J0ZWQgaW4gdGhlIFJhY2UxIHZhcmlhYmxlLiANCiMjIyMjIE9yZGVyIHRoZSByZXN1bHRpbmcgdGFibGUgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCBhdmVyYWdlIA0KIyMjIyMgc3lzdG9saWMgYmxvb2QgcHJlc3N1cmUuDQoNCmBgYHtyfQ0KDQpOSEFORVMgJT4lIA0KICBmaWx0ZXIoR2VuZGVyPT0nbWFsZScsIEFnZURlY2FkZT09JyA0MC00OScpJT4lIA0KICBncm91cF9ieShSYWNlMSkgJT4lDQogIHN1bW1hcml6ZShhdmVyYWdlPW1lYW4oQlBTeXNBdmUsIG5hLnJtPVRSVUUpLCANCiAgICAgICAgICAgIHN0ZF9kZXY9c2QoQlBTeXNBdmUsIG5hLnJtPVRSVUUpICkgJT4lDQogIGFycmFuZ2UoYXZlcmFnZSkNCiAgDQogIA0KYGBgDQoNCg0K