Synopsis

For this document the Storm Data dataset by the National Weather Service has been analysed to find the most expensive and the most harmful types of weather events. The analysis is restricted to the years from 1993 and 2011, because the

The most harmfull weather events are tornadoes with on average 1230 injuries per year, while excessive heat is the deadliest weather event with on average 110 fatalities per year. The flash flood caused by Hurricane Madeline (1998) was the single most harmful event with over 6000 injuries.

The weather event with the most damages to properties and crops was Hurricane Kathrina (2005), single-handedly making Hurricanes the most expensive weather event type. Property damage is the prevalent damage type (over 80 % of the combined damage). Droughts caused the most crop damage over the years.

Data Processing

Data has been downloaded from https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2

Load the raw data:

library(tidyverse)
library(lubridate)
raw_df <- read_csv("repdata_data_StormData.csv.bz2",
                   col_types = cols(.default = col_character(),
                                    #BGN_DATE = col_date(format = "%d/%m/%Y %H:%M:%S"),
                                    #BGN_TIME = col_time(format = "%H%M"),
                                    STATE__ = col_double(),
                                    COUNTY = col_double(),
                                    BGN_RANGE = col_double(),
                                    COUNTY_END = col_double(),
                                    END_RANGE = col_double(),
                                    LENGTH = col_double(),
                                    WIDTH = col_double(),
                                    F = col_integer(),
                                    MAG = col_double(),
                                    FATALITIES = col_double(),
                                    INJURIES = col_double(),
                                    PROPDMG = col_double(),
                                    CROPDMG = col_double(),
                                    LATITUDE = col_double(),
                                    LONGITUDE = col_double(),
                                    LATITUDE_E = col_double(),
                                    LONGITUDE_ = col_double(),
                                    REFNUM = col_double()))
# Parse date and time
raw_df <- raw_df %>%
    #mutate(BGN_TIME = parse_time(BGN_TIME, format = "%H%M")) %>%
    mutate(BGN_DATE = parse_datetime(BGN_DATE, format = "%m/%d/%Y %H:%M:%S"))

For both property and crop damage the damage and damage exponent columns are aggregated into a single columen containing the damage in dollars.

# K is interpreted as 1,000, M as 1,000,000 and B as 1,000,000,000
df <- raw_df %>%
    mutate(property_dmg = case_when(
        is.na(PROPDMGEXP) ~ PROPDMG,
        !is.na(as.numeric(PROPDMGEXP)) ~ PROPDMG*(10^as.numeric(PROPDMGEXP)),
        PROPDMGEXP == "K" | PROPDMGEXP == "k" ~ PROPDMG*1000,
        PROPDMGEXP == "M" | PROPDMGEXP == "m" ~ PROPDMG*1000000,
        PROPDMGEXP == "B" | PROPDMGEXP == "b" ~ PROPDMG*1000000000,
        TRUE ~ PROPDMG
    )) %>%
    select(-PROPDMG, -PROPDMGEXP) %>%
    mutate(crop_dmg = case_when(
        is.na(CROPDMGEXP) ~ CROPDMG,
        !is.na(as.numeric(CROPDMGEXP)) ~ CROPDMG*(10^as.numeric(CROPDMGEXP)),
        CROPDMGEXP == "K" | CROPDMGEXP == "k" ~ CROPDMG*1000,
        CROPDMGEXP == "M" | CROPDMGEXP == "m" ~ CROPDMG*1000000,
        CROPDMGEXP == "B" | CROPDMGEXP == "b" ~ CROPDMG*1000000000,
        TRUE ~ CROPDMG
    )) %>%
    select(-CROPDMG, -CROPDMGEXP) 
NAs durch Umwandlung erzeugtNAs durch Umwandlung erzeugtNAs durch Umwandlung erzeugtNAs durch Umwandlung erzeugt

Summarise both damage types into one column.

df <- df %>%
    mutate(all_dmg = property_dmg + crop_dmg)

Before 1993 only 3 event types have been recorded: Thunderstorm, Tornado, and Hail. To be able to compare all event types with each other the data before 1993 is excluded.

df <- df %>%
    filter(BGN_DATE >= as.Date("1993-01-01"))

There are over 900 different event types. Some of them are combined into a single event type.

df <- df %>%
    mutate(EVTYPE = replace(EVTYPE, EVTYPE=="THUNDERSTORM WIND", "TSTM WIND")) %>%
    mutate(EVTYPE = replace(EVTYPE, EVTYPE=="MARINE THUNDERSTORM WIND", "TSTM WIND")) %>%
    mutate(EVTYPE = replace(EVTYPE, EVTYPE=="THUNDERSTORM WINDS", "TSTM WIND")) %>%
    mutate(EVTYPE = replace(EVTYPE, EVTYPE=="RIP CURRENTS", "RIP CURRENT")) %>%
    mutate(EVTYPE = replace(EVTYPE, EVTYPE=="EXTREME HEAT", "EXCESSIVE HEAT")) %>%
    mutate(EVTYPE = replace(EVTYPE, EVTYPE=="HURRICANE/TYPHOON", "HURRICANE")) %>%
    mutate(EVTYPE = replace(EVTYPE, EVTYPE=="FLASH FLOODING", "FLASH FLOOD"))

Results

Research Question 1: Casualities

Across the United States, which types of events (as indicated in the EVTYP variable) are most harmful with respect to population health?

# Plot the 20 events with the most injuries, all other event types are
# aggregated under 'OTHER'
most_dangerous <- df %>%
    group_by(EVTYPE) %>%
    summarise(sum = sum(INJURIES)) %>%
    arrange(desc(sum)) 
most_dangerous <- most_dangerous$EVTYPE[1:20]
p1 <- df %>%
    mutate(new_events = ifelse(EVTYPE %in% most_dangerous, EVTYPE, "OTHER")) %>%
    group_by(new_events) %>%
    summarise(sum = sum(INJURIES)) %>%
    ggplot(aes(x = reorder(new_events, sum), y = sum)) + 
    geom_bar(stat = "identity") + 
    labs(title = "Injuries per Event Type since 1993",
         x = "Event Type",
         y = "Total Injuries") + 
    coord_flip()
# Plot the 20 events with the most fatalities, all other event types are
# aggregated under 'OTHER'
most_dangerous <- df %>%
    group_by(EVTYPE) %>%
    summarise(sum = sum(FATALITIES)) %>%
    arrange(desc(sum)) 
most_dangerous <- most_dangerous$EVTYPE[1:20]
p2 <- df %>%
    mutate(new_events = ifelse(EVTYPE %in% most_dangerous, EVTYPE, "OTHER")) %>%
    group_by(new_events) %>%
    summarise(sum = sum(FATALITIES)) %>%
    ggplot(aes(x = reorder(new_events, sum), y = sum)) + 
    geom_bar(stat = "identity") + 
    labs(title = "Fatalities per Event Type since 1993",
         x = "Event Type",
         y = "Total Fatalities") + 
    coord_flip()
# package cowplot is used arrange both plots inside one figure
cowplot::plot_grid(p1, p2, nrow=2, align='v')

# average number of injuries per year from tornados
df %>%
    mutate(year = year(BGN_DATE)) %>%
    group_by(year, EVTYPE) %>%
    summarise(sum = sum(INJURIES)) %>%
    filter(EVTYPE == 'TORNADO') %>%
    ungroup() %>%
    summarise(average = mean(sum))
# average number of fatalities per year from excessive heat
df %>%
    mutate(year = year(BGN_DATE)) %>%
    group_by(year, EVTYPE) %>%
    summarise(sum = sum(FATALITIES)) %>%
    filter(EVTYPE == 'EXCESSIVE HEAT') %>%
    ungroup() %>%
    summarise(average = mean(sum))

Tornado is the event type with the most injuries (1230 per year on average). Excessive Heat is the most deadly event type with an average of 110 fatalities per year.

Overall Tornado is the most harmfull event type.

Research Question 2: Economic Consequences

Across the United States, which types of events have the greatest economic consequences?

There is an error in the data. The property damage of the Napa River Flooding was not 115 Billion Dollar, but more likely 115 Million Dollar (see e.g. https://en.wikipedia.org/wiki/Napa_River_flood_of_1986 or https://books.google.at/books?id=nh-vCgAAQBAJ&pg=PA193&lpg=PA193&dq=napa+river+flooding+2005+damage&source=bl&ots=1KO-Q1JPMC&sig=yuw_W2Djij7KR1YaOTpWEs1FluQ&hl=de&sa=X&ved=2ahUKEwihqP3u8ZndAhVRJFAKHQ07DhQ4FBDoATAAegQIARAB#v=onepage&q=napa%20river%20flooding%202005%20damage&f=false ).

There are actually 2 entries for the Napa River flooding one with the correct numbers and one with the incorrect ones.

How reliable is the data?

# filter entry about the napa river flooding on the 2006.01.01.
df <- df %>% 
    filter(!(COUNTYNAME == 'NAPA' & BGN_DATE == as.Date('2006-01-01')))

What is the relation between crop and property damage?

sum_crop <- summarise(df, sum = sum(crop_dmg))[[1]]
sum_prop <- summarise(df, sum = sum(property_dmg))[[1]]
sum_crop/(sum_crop + sum_prop)* 100
[1] 14.79407

The crop damage is only 14.8 % of the overall damage. The property damage is dominating.

most_prop_dmg <- df %>%
    group_by(EVTYPE) %>%
    summarise(sum = sum(property_dmg)) %>%
    arrange(desc(sum)) 
most_prop_dmg <- most_prop_dmg$EVTYPE[1:20]
p1 <- df %>%
    mutate(new_events = ifelse(EVTYPE %in% most_prop_dmg, EVTYPE, "OTHER")) %>%
    group_by(new_events) %>%
    summarise(sum = sum(property_dmg)) %>%
    ggplot(aes(x = reorder(new_events, sum), y = sum/(10^9))) + 
    geom_bar(stat = "identity") + 
    labs(title = "Property Damage since 1993.",
         x = "Event Type",
         y = "Damage in Billion USD") + 
    coord_flip()
most_crop_dmg <- df %>%
    group_by(EVTYPE) %>%
    summarise(sum = sum(crop_dmg)) %>%
    arrange(desc(sum)) 
most_crop_dmg <- most_crop_dmg$EVTYPE[1:20]
p2 <- df %>%
    mutate(new_events = ifelse(EVTYPE %in% most_crop_dmg, EVTYPE, "OTHER")) %>%
    group_by(new_events) %>%
    summarise(sum = sum(crop_dmg)) %>%
    ggplot(aes(x = reorder(new_events, sum), y = sum/(10^9))) + 
    geom_bar(stat = "identity") + 
    labs(title = "Crop Damage since 1993.",
         x = "Event Type",
         y = "Damage in Billion USD") + 
    coord_flip()
# package cowplot is used arange both plots inside one figure
cowplot::plot_grid(p1, p2, nrow=2, align='v')

Hurricanes did the most damage to properties, while droughts are the most expensive event type for crop damage.

Yearly casualties and damages

How are casualties and damages distributed over the years?

p1 <- df %>%
    mutate(year = year(BGN_DATE)) %>%
    group_by(year) %>%
    summarise(FAT = sum(FATALITIES), INJ = sum(INJURIES)) %>%
    ggplot() +
    geom_bar(aes(year, INJ, fill = "Casualties"),  stat = "identity") + 
    geom_bar(aes(year, FAT, fill = 'Fatalities'), stat = "identity") + 
    theme(legend.position = "right") + 
    labs(title = "Casualties per year",
         x = "Year",
         y = "Casualties") + 
    scale_fill_manual(name = "Injury Type", 
                    values = c("lightcoral", "black"))
p2 <- df %>%
    mutate(year = year(BGN_DATE)) %>%
    group_by(year) %>%
    summarise(sum = sum(all_dmg)) %>%
    ggplot() +
    geom_bar(aes(year, sum/1000000000, fill = "All Damages"),  stat = "identity") + 
    scale_y_continuous(labels = scales::dollar) + 
    labs(title = "Damage per Year",
         x = "Year",
         y = "Damages in Billion USD") + 
    scale_fill_manual(name = "Damage Type", 
                    values = c("lightcoral", "black"))
cowplot::plot_grid(p1, p2, nrow=2, align='v')

What are the causes for the peaks in 1998, 2005 and 2011, respectively?

# damages during Kathrina
df %>%
    filter(BGN_DATE >= as.Date('2005-08-23') & BGN_DATE <= as.Date('2005-08-30')) %>%
    summarise(sum = sum(all_dmg)/1E9)

The high damages in 2005 are dominated by Hurricane Kathrina (https://en.wikipedia.org/wiki/Hurricane_Katrina). Over USD 75 Billion of damages occured in the week between the 23. and 30. of August.

# Injuries during Hurrican Madeline
df %>%
    filter(BGN_DATE >= as.Date('1998-10-16') & BGN_DATE <= as.Date('1998-10-20')) %>%
    summarise(sum = sum(INJURIES))

The high number of injuries in 1998 can be attributed to Hurricane Madeline ( https://en.wikipedia.org/wiki/Hurricane_Madeline_(1998) )

The large number of injuries in 2011 are related to the 2011 Super Outbreak, one of the largest, costliest and deadliest tornado outbreaks ever recorded (https://en.wikipedia.org/wiki/2011_Super_Outbreak).

LS0tCnRpdGxlOiAiVGhlIG1vc3QgaGFybWZ1bGwgYW5kIGV4cGVuc2l2ZSB3ZWF0aGVyIGV2ZW50cyBiZXR3ZWVuIDE5OTMgYW5kIDIwMTEiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIFN5bm9wc2lzCkZvciB0aGlzIGRvY3VtZW50IHRoZSBTdG9ybSBEYXRhIGRhdGFzZXQgYnkgdGhlIE5hdGlvbmFsIFdlYXRoZXIgU2VydmljZSBoYXMgYmVlbiBhbmFseXNlZCB0byBmaW5kIHRoZSBtb3N0IGV4cGVuc2l2ZSBhbmQgdGhlIG1vc3QgaGFybWZ1bCB0eXBlcyBvZiB3ZWF0aGVyIGV2ZW50cy4gVGhlIGFuYWx5c2lzIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHllYXJzIGZyb20gMTk5MyBhbmQgMjAxMSwgYmVjYXVzZSB0aGUgCgpUaGUgbW9zdCBoYXJtZnVsbCB3ZWF0aGVyIGV2ZW50cyBhcmUgdG9ybmFkb2VzIHdpdGggb24gYXZlcmFnZSAxMjMwIGluanVyaWVzIHBlciB5ZWFyLCB3aGlsZSBleGNlc3NpdmUgaGVhdCBpcyB0aGUgIGRlYWRsaWVzdCB3ZWF0aGVyIGV2ZW50IHdpdGggb24gYXZlcmFnZSAxMTAgZmF0YWxpdGllcyBwZXIgeWVhci4gVGhlIGZsYXNoIGZsb29kIGNhdXNlZCBieSBIdXJyaWNhbmUgTWFkZWxpbmUgKDE5OTgpIHdhcyB0aGUgc2luZ2xlIG1vc3QgaGFybWZ1bCBldmVudCB3aXRoIG92ZXIgNjAwMCBpbmp1cmllcy4KClRoZSB3ZWF0aGVyIGV2ZW50IHdpdGggdGhlIG1vc3QgZGFtYWdlcyB0byBwcm9wZXJ0aWVzIGFuZCBjcm9wcyB3YXMgSHVycmljYW5lIEthdGhyaW5hICgyMDA1KSwgc2luZ2xlLWhhbmRlZGx5IG1ha2luZyBIdXJyaWNhbmVzIHRoZSBtb3N0IGV4cGVuc2l2ZSB3ZWF0aGVyIGV2ZW50IHR5cGUuIFByb3BlcnR5IGRhbWFnZSBpcyB0aGUgcHJldmFsZW50IGRhbWFnZSB0eXBlIChvdmVyIDgwICUgb2YgdGhlIGNvbWJpbmVkIGRhbWFnZSkuIERyb3VnaHRzIGNhdXNlZCB0aGUgbW9zdCBjcm9wIGRhbWFnZSBvdmVyIHRoZSB5ZWFycy4KCiMjIERhdGEgUHJvY2Vzc2luZwoKRGF0YSBoYXMgYmVlbiBkb3dubG9hZGVkIGZyb20gaHR0cHM6Ly9kMzk2cXVzemE0MG9yYy5jbG91ZGZyb250Lm5ldC9yZXBkYXRhJTJGZGF0YSUyRlN0b3JtRGF0YS5jc3YuYnoyIAoKTG9hZCB0aGUgcmF3IGRhdGE6CmBgYHtyLCByZXN1bHRzPSdoaWRlJ30KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQoKcmF3X2RmIDwtIHJlYWRfY3N2KCJyZXBkYXRhX2RhdGFfU3Rvcm1EYXRhLmNzdi5iejIiLAogICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyguZGVmYXVsdCA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0JHTl9EQVRFID0gY29sX2RhdGUoZm9ybWF0ID0gIiVkLyVtLyVZICVIOiVNOiVTIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNCR05fVElNRSA9IGNvbF90aW1lKGZvcm1hdCA9ICIlSCVNIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFX18gPSBjb2xfZG91YmxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPVU5UWSA9IGNvbF9kb3VibGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkdOX1JBTkdFID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1VOVFlfRU5EID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfUkFOR0UgPSBjb2xfZG91YmxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFTkdUSCA9IGNvbF9kb3VibGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lEVEggPSBjb2xfZG91YmxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYgPSBjb2xfaW50ZWdlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUcgPSBjb2xfZG91YmxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMSVRJRVMgPSBjb2xfZG91YmxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSlVSSUVTID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRE1HID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUk9QRE1HID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVRJVFVERSA9IGNvbF9kb3VibGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9OR0lUVURFID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVRJVFVERV9FID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HSVRVREVfID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZOVU0gPSBjb2xfZG91YmxlKCkpKQoKIyBQYXJzZSBkYXRlIGFuZCB0aW1lCnJhd19kZiA8LSByYXdfZGYgJT4lCiAgICAjbXV0YXRlKEJHTl9USU1FID0gcGFyc2VfdGltZShCR05fVElNRSwgZm9ybWF0ID0gIiVIJU0iKSkgJT4lCiAgICBtdXRhdGUoQkdOX0RBVEUgPSBwYXJzZV9kYXRldGltZShCR05fREFURSwgZm9ybWF0ID0gIiVtLyVkLyVZICVIOiVNOiVTIikpCmBgYAoKRm9yIGJvdGggcHJvcGVydHkgYW5kIGNyb3AgZGFtYWdlIHRoZSBkYW1hZ2UgYW5kIGRhbWFnZSBleHBvbmVudCBjb2x1bW5zIGFyZSBhZ2dyZWdhdGVkIGludG8gYSBzaW5nbGUgY29sdW1lbiBjb250YWluaW5nIHRoZSBkYW1hZ2UgaW4gZG9sbGFycy4gCmBgYHtyfQojIEsgaXMgaW50ZXJwcmV0ZWQgYXMgMSwwMDAsIE0gYXMgMSwwMDAsMDAwIGFuZCBCIGFzIDEsMDAwLDAwMCwwMDAKZGYgPC0gcmF3X2RmICU+JQogICAgbXV0YXRlKHByb3BlcnR5X2RtZyA9IGNhc2Vfd2hlbigKICAgICAgICBpcy5uYShQUk9QRE1HRVhQKSB+IFBST1BETUcsCiAgICAgICAgIWlzLm5hKGFzLm51bWVyaWMoUFJPUERNR0VYUCkpIH4gUFJPUERNRyooMTBeYXMubnVtZXJpYyhQUk9QRE1HRVhQKSksCiAgICAgICAgUFJPUERNR0VYUCA9PSAiSyIgfCBQUk9QRE1HRVhQID09ICJrIiB+IFBST1BETUcqMTAwMCwKICAgICAgICBQUk9QRE1HRVhQID09ICJNIiB8IFBST1BETUdFWFAgPT0gIm0iIH4gUFJPUERNRyoxMDAwMDAwLAogICAgICAgIFBST1BETUdFWFAgPT0gIkIiIHwgUFJPUERNR0VYUCA9PSAiYiIgfiBQUk9QRE1HKjEwMDAwMDAwMDAsCiAgICAgICAgVFJVRSB+IFBST1BETUcKICAgICkpICU+JQogICAgc2VsZWN0KC1QUk9QRE1HLCAtUFJPUERNR0VYUCkgJT4lCiAgICBtdXRhdGUoY3JvcF9kbWcgPSBjYXNlX3doZW4oCiAgICAgICAgaXMubmEoQ1JPUERNR0VYUCkgfiBDUk9QRE1HLAogICAgICAgICFpcy5uYShhcy5udW1lcmljKENST1BETUdFWFApKSB+IENST1BETUcqKDEwXmFzLm51bWVyaWMoQ1JPUERNR0VYUCkpLAogICAgICAgIENST1BETUdFWFAgPT0gIksiIHwgQ1JPUERNR0VYUCA9PSAiayIgfiBDUk9QRE1HKjEwMDAsCiAgICAgICAgQ1JPUERNR0VYUCA9PSAiTSIgfCBDUk9QRE1HRVhQID09ICJtIiB+IENST1BETUcqMTAwMDAwMCwKICAgICAgICBDUk9QRE1HRVhQID09ICJCIiB8IENST1BETUdFWFAgPT0gImIiIH4gQ1JPUERNRyoxMDAwMDAwMDAwLAogICAgICAgIFRSVUUgfiBDUk9QRE1HCiAgICApKSAlPiUKICAgIHNlbGVjdCgtQ1JPUERNRywgLUNST1BETUdFWFApIApgYGAKU3VtbWFyaXNlIGJvdGggZGFtYWdlIHR5cGVzIGludG8gb25lIGNvbHVtbi4KYGBge3J9CmRmIDwtIGRmICU+JQogICAgbXV0YXRlKGFsbF9kbWcgPSBwcm9wZXJ0eV9kbWcgKyBjcm9wX2RtZykKYGBgCgpCZWZvcmUgMTk5MyBvbmx5IDMgZXZlbnQgdHlwZXMgaGF2ZSBiZWVuIHJlY29yZGVkOiBUaHVuZGVyc3Rvcm0sIFRvcm5hZG8sIGFuZCBIYWlsLiBUbyBiZSBhYmxlIHRvIGNvbXBhcmUgYWxsIGV2ZW50IHR5cGVzIHdpdGggZWFjaCBvdGhlciB0aGUgZGF0YSBiZWZvcmUgMTk5MyBpcyBleGNsdWRlZC4KYGBge3J9CmRmIDwtIGRmICU+JQogICAgZmlsdGVyKEJHTl9EQVRFID49IGFzLkRhdGUoIjE5OTMtMDEtMDEiKSkKYGBgCgpUaGVyZSBhcmUgb3ZlciA5MDAgZGlmZmVyZW50IGV2ZW50IHR5cGVzLiBTb21lIG9mIHRoZW0gYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgZXZlbnQgdHlwZS4KYGBge3J9CmRmIDwtIGRmICU+JQogICAgbXV0YXRlKEVWVFlQRSA9IHJlcGxhY2UoRVZUWVBFLCBFVlRZUEU9PSJUSFVOREVSU1RPUk0gV0lORCIsICJUU1RNIFdJTkQiKSkgJT4lCiAgICBtdXRhdGUoRVZUWVBFID0gcmVwbGFjZShFVlRZUEUsIEVWVFlQRT09Ik1BUklORSBUSFVOREVSU1RPUk0gV0lORCIsICJUU1RNIFdJTkQiKSkgJT4lCiAgICBtdXRhdGUoRVZUWVBFID0gcmVwbGFjZShFVlRZUEUsIEVWVFlQRT09IlRIVU5ERVJTVE9STSBXSU5EUyIsICJUU1RNIFdJTkQiKSkgJT4lCiAgICBtdXRhdGUoRVZUWVBFID0gcmVwbGFjZShFVlRZUEUsIEVWVFlQRT09IlJJUCBDVVJSRU5UUyIsICJSSVAgQ1VSUkVOVCIpKSAlPiUKICAgIG11dGF0ZShFVlRZUEUgPSByZXBsYWNlKEVWVFlQRSwgRVZUWVBFPT0iRVhUUkVNRSBIRUFUIiwgIkVYQ0VTU0lWRSBIRUFUIikpICU+JQogICAgbXV0YXRlKEVWVFlQRSA9IHJlcGxhY2UoRVZUWVBFLCBFVlRZUEU9PSJIVVJSSUNBTkUvVFlQSE9PTiIsICJIVVJSSUNBTkUiKSkgJT4lCiAgICBtdXRhdGUoRVZUWVBFID0gcmVwbGFjZShFVlRZUEUsIEVWVFlQRT09IkZMQVNIIEZMT09ESU5HIiwgIkZMQVNIIEZMT09EIikpCmBgYAoKIyMgUmVzdWx0cwoKIyMjIFJlc2VhcmNoIFF1ZXN0aW9uIDE6IENhc3VhbGl0aWVzCkFjcm9zcyB0aGUgVW5pdGVkIFN0YXRlcywgd2hpY2ggdHlwZXMgb2YgZXZlbnRzIChhcyBpbmRpY2F0ZWQgaW4gdGhlIEVWVFlQIHZhcmlhYmxlKSBhcmUgbW9zdCBoYXJtZnVsIHdpdGggcmVzcGVjdCB0byBwb3B1bGF0aW9uIGhlYWx0aD8KCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNCwgZmlnLndpZHRoPTV9CiMgUGxvdCB0aGUgMjAgZXZlbnRzIHdpdGggdGhlIG1vc3QgaW5qdXJpZXMsIGFsbCBvdGhlciBldmVudCB0eXBlcyBhcmUKIyBhZ2dyZWdhdGVkIHVuZGVyICdPVEhFUicKbW9zdF9kYW5nZXJvdXMgPC0gZGYgJT4lCiAgICBncm91cF9ieShFVlRZUEUpICU+JQogICAgc3VtbWFyaXNlKHN1bSA9IHN1bShJTkpVUklFUykpICU+JQogICAgYXJyYW5nZShkZXNjKHN1bSkpIAptb3N0X2Rhbmdlcm91cyA8LSBtb3N0X2Rhbmdlcm91cyRFVlRZUEVbMToyMF0KCnAxIDwtIGRmICU+JQogICAgbXV0YXRlKG5ld19ldmVudHMgPSBpZmVsc2UoRVZUWVBFICVpbiUgbW9zdF9kYW5nZXJvdXMsIEVWVFlQRSwgIk9USEVSIikpICU+JQogICAgZ3JvdXBfYnkobmV3X2V2ZW50cykgJT4lCiAgICBzdW1tYXJpc2Uoc3VtID0gc3VtKElOSlVSSUVTKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKG5ld19ldmVudHMsIHN1bSksIHkgPSBzdW0pKSArIAogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgICBsYWJzKHRpdGxlID0gIkluanVyaWVzIHBlciBFdmVudCBUeXBlIHNpbmNlIDE5OTMiLAogICAgICAgICB4ID0gIkV2ZW50IFR5cGUiLAogICAgICAgICB5ID0gIlRvdGFsIEluanVyaWVzIikgKyAKICAgIGNvb3JkX2ZsaXAoKQoKIyBQbG90IHRoZSAyMCBldmVudHMgd2l0aCB0aGUgbW9zdCBmYXRhbGl0aWVzLCBhbGwgb3RoZXIgZXZlbnQgdHlwZXMgYXJlCiMgYWdncmVnYXRlZCB1bmRlciAnT1RIRVInCm1vc3RfZGFuZ2Vyb3VzIDwtIGRmICU+JQogICAgZ3JvdXBfYnkoRVZUWVBFKSAlPiUKICAgIHN1bW1hcmlzZShzdW0gPSBzdW0oRkFUQUxJVElFUykpICU+JQogICAgYXJyYW5nZShkZXNjKHN1bSkpIAptb3N0X2Rhbmdlcm91cyA8LSBtb3N0X2Rhbmdlcm91cyRFVlRZUEVbMToyMF0KCnAyIDwtIGRmICU+JQogICAgbXV0YXRlKG5ld19ldmVudHMgPSBpZmVsc2UoRVZUWVBFICVpbiUgbW9zdF9kYW5nZXJvdXMsIEVWVFlQRSwgIk9USEVSIikpICU+JQogICAgZ3JvdXBfYnkobmV3X2V2ZW50cykgJT4lCiAgICBzdW1tYXJpc2Uoc3VtID0gc3VtKEZBVEFMSVRJRVMpKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobmV3X2V2ZW50cywgc3VtKSwgeSA9IHN1bSkpICsgCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAKICAgIGxhYnModGl0bGUgPSAiRmF0YWxpdGllcyBwZXIgRXZlbnQgVHlwZSBzaW5jZSAxOTkzIiwKICAgICAgICAgeCA9ICJFdmVudCBUeXBlIiwKICAgICAgICAgeSA9ICJUb3RhbCBGYXRhbGl0aWVzIikgKyAKICAgIGNvb3JkX2ZsaXAoKQoKIyBwYWNrYWdlIGNvd3Bsb3QgaXMgdXNlZCBhcnJhbmdlIGJvdGggcGxvdHMgaW5zaWRlIG9uZSBmaWd1cmUKY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgbnJvdz0yLCBhbGlnbj0ndicpCmBgYApgYGB7cn0KIyBhdmVyYWdlIG51bWJlciBvZiBpbmp1cmllcyBwZXIgeWVhciBmcm9tIHRvcm5hZG9zCmRmICU+JQogICAgbXV0YXRlKHllYXIgPSB5ZWFyKEJHTl9EQVRFKSkgJT4lCiAgICBncm91cF9ieSh5ZWFyLCBFVlRZUEUpICU+JQogICAgc3VtbWFyaXNlKHN1bSA9IHN1bShJTkpVUklFUykpICU+JQogICAgZmlsdGVyKEVWVFlQRSA9PSAnVE9STkFETycpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgc3VtbWFyaXNlKGF2ZXJhZ2UgPSBtZWFuKHN1bSkpCgojIGF2ZXJhZ2UgbnVtYmVyIG9mIGZhdGFsaXRpZXMgcGVyIHllYXIgZnJvbSBleGNlc3NpdmUgaGVhdApkZiAlPiUKICAgIG11dGF0ZSh5ZWFyID0geWVhcihCR05fREFURSkpICU+JQogICAgZ3JvdXBfYnkoeWVhciwgRVZUWVBFKSAlPiUKICAgIHN1bW1hcmlzZShzdW0gPSBzdW0oRkFUQUxJVElFUykpICU+JQogICAgZmlsdGVyKEVWVFlQRSA9PSAnRVhDRVNTSVZFIEhFQVQnKSAlPiUKICAgIHVuZ3JvdXAoKSAlPiUKICAgIHN1bW1hcmlzZShhdmVyYWdlID0gbWVhbihzdW0pKQpgYGAKClRvcm5hZG8gaXMgdGhlIGV2ZW50IHR5cGUgd2l0aCB0aGUgbW9zdCBpbmp1cmllcyAoMTIzMCBwZXIgeWVhciBvbiBhdmVyYWdlKS4gRXhjZXNzaXZlIEhlYXQgaXMgdGhlIG1vc3QgZGVhZGx5IGV2ZW50IHR5cGUgd2l0aCBhbiBhdmVyYWdlIG9mIDExMCBmYXRhbGl0aWVzIHBlciB5ZWFyLiAKCk92ZXJhbGwgVG9ybmFkbyBpcyB0aGUgbW9zdCBoYXJtZnVsbCBldmVudCB0eXBlLgogIAojIyMgUmVzZWFyY2ggUXVlc3Rpb24gMjogRWNvbm9taWMgQ29uc2VxdWVuY2VzCkFjcm9zcyB0aGUgVW5pdGVkIFN0YXRlcywgd2hpY2ggdHlwZXMgb2YgZXZlbnRzIGhhdmUgdGhlIGdyZWF0ZXN0IGVjb25vbWljIGNvbnNlcXVlbmNlcz8KClRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBkYXRhLiBUaGUgcHJvcGVydHkgZGFtYWdlIG9mIHRoZSBOYXBhIFJpdmVyIEZsb29kaW5nIHdhcyBub3QgMTE1IEJpbGxpb24gRG9sbGFyLCBidXQgbW9yZSBsaWtlbHkgMTE1IE1pbGxpb24gRG9sbGFyIChzZWUgZS5nLiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OYXBhX1JpdmVyX2Zsb29kX29mXzE5ODYgb3IgaHR0cHM6Ly9ib29rcy5nb29nbGUuYXQvYm9va3M/aWQ9bmgtdkNnQUFRQkFKJnBnPVBBMTkzJmxwZz1QQTE5MyZkcT1uYXBhK3JpdmVyK2Zsb29kaW5nKzIwMDUrZGFtYWdlJnNvdXJjZT1ibCZvdHM9MUtPLVExSlBNQyZzaWc9eXV3X1cyRGppajdLUjFZYU9UcFdFczFGbHVRJmhsPWRlJnNhPVgmdmVkPTJhaFVLRXdpaHFQM3U4Wm5kQWhWUkpGQUtIUTA3RGhRNEZCRG9BVEFBZWdRSUFSQUIjdj1vbmVwYWdlJnE9bmFwYSUyMHJpdmVyJTIwZmxvb2RpbmclMjAyMDA1JTIwZGFtYWdlJmY9ZmFsc2UgKS4KClRoZXJlIGFyZSBhY3R1YWxseSAyIGVudHJpZXMgZm9yIHRoZSBOYXBhIFJpdmVyIGZsb29kaW5nIG9uZSB3aXRoIHRoZSBjb3JyZWN0IG51bWJlcnMgYW5kIG9uZSB3aXRoIHRoZSBpbmNvcnJlY3Qgb25lcy4KCkhvdyByZWxpYWJsZSBpcyB0aGUgZGF0YT8KCmBgYHtyfQojIGZpbHRlciBlbnRyeSBhYm91dCB0aGUgbmFwYSByaXZlciBmbG9vZGluZyBvbiB0aGUgMjAwNi4wMS4wMS4KZGYgPC0gZGYgJT4lIAogICAgZmlsdGVyKCEoQ09VTlRZTkFNRSA9PSAnTkFQQScgJiBCR05fREFURSA9PSBhcy5EYXRlKCcyMDA2LTAxLTAxJykpKQpgYGAKCldoYXQgaXMgdGhlIHJlbGF0aW9uIGJldHdlZW4gY3JvcCBhbmQgcHJvcGVydHkgZGFtYWdlPwpgYGB7cn0Kc3VtX2Nyb3AgPC0gc3VtbWFyaXNlKGRmLCBzdW0gPSBzdW0oY3JvcF9kbWcpKVtbMV1dCnN1bV9wcm9wIDwtIHN1bW1hcmlzZShkZiwgc3VtID0gc3VtKHByb3BlcnR5X2RtZykpW1sxXV0Kc3VtX2Nyb3AvKHN1bV9jcm9wICsgc3VtX3Byb3ApKiAxMDAKYGBgClRoZSBjcm9wIGRhbWFnZSBpcyBvbmx5IDE0LjggJSBvZiB0aGUgb3ZlcmFsbCBkYW1hZ2UuIFRoZSBwcm9wZXJ0eSBkYW1hZ2UgaXMgZG9taW5hdGluZy4KCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNCwgZmlnLndpZHRoPTV9Cm1vc3RfcHJvcF9kbWcgPC0gZGYgJT4lCiAgICBncm91cF9ieShFVlRZUEUpICU+JQogICAgc3VtbWFyaXNlKHN1bSA9IHN1bShwcm9wZXJ0eV9kbWcpKSAlPiUKICAgIGFycmFuZ2UoZGVzYyhzdW0pKSAKbW9zdF9wcm9wX2RtZyA8LSBtb3N0X3Byb3BfZG1nJEVWVFlQRVsxOjIwXQoKcDEgPC0gZGYgJT4lCiAgICBtdXRhdGUobmV3X2V2ZW50cyA9IGlmZWxzZShFVlRZUEUgJWluJSBtb3N0X3Byb3BfZG1nLCBFVlRZUEUsICJPVEhFUiIpKSAlPiUKICAgIGdyb3VwX2J5KG5ld19ldmVudHMpICU+JQogICAgc3VtbWFyaXNlKHN1bSA9IHN1bShwcm9wZXJ0eV9kbWcpKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobmV3X2V2ZW50cywgc3VtKSwgeSA9IHN1bS8oMTBeOSkpKSArIAogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgICBsYWJzKHRpdGxlID0gIlByb3BlcnR5IERhbWFnZSBzaW5jZSAxOTkzLiIsCiAgICAgICAgIHggPSAiRXZlbnQgVHlwZSIsCiAgICAgICAgIHkgPSAiRGFtYWdlIGluIEJpbGxpb24gVVNEIikgKyAKICAgIGNvb3JkX2ZsaXAoKQoKbW9zdF9jcm9wX2RtZyA8LSBkZiAlPiUKICAgIGdyb3VwX2J5KEVWVFlQRSkgJT4lCiAgICBzdW1tYXJpc2Uoc3VtID0gc3VtKGNyb3BfZG1nKSkgJT4lCiAgICBhcnJhbmdlKGRlc2Moc3VtKSkgCm1vc3RfY3JvcF9kbWcgPC0gbW9zdF9jcm9wX2RtZyRFVlRZUEVbMToyMF0KCnAyIDwtIGRmICU+JQogICAgbXV0YXRlKG5ld19ldmVudHMgPSBpZmVsc2UoRVZUWVBFICVpbiUgbW9zdF9jcm9wX2RtZywgRVZUWVBFLCAiT1RIRVIiKSkgJT4lCiAgICBncm91cF9ieShuZXdfZXZlbnRzKSAlPiUKICAgIHN1bW1hcmlzZShzdW0gPSBzdW0oY3JvcF9kbWcpKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobmV3X2V2ZW50cywgc3VtKSwgeSA9IHN1bS8oMTBeOSkpKSArIAogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgICBsYWJzKHRpdGxlID0gIkNyb3AgRGFtYWdlIHNpbmNlIDE5OTMuIiwKICAgICAgICAgeCA9ICJFdmVudCBUeXBlIiwKICAgICAgICAgeSA9ICJEYW1hZ2UgaW4gQmlsbGlvbiBVU0QiKSArIAogICAgY29vcmRfZmxpcCgpCgojIHBhY2thZ2UgY293cGxvdCBpcyB1c2VkIGFyYW5nZSBib3RoIHBsb3RzIGluc2lkZSBvbmUgZmlndXJlCmNvd3Bsb3Q6OnBsb3RfZ3JpZChwMSwgcDIsIG5yb3c9MiwgYWxpZ249J3YnKQpgYGAKSHVycmljYW5lcyBkaWQgdGhlIG1vc3QgZGFtYWdlIHRvIHByb3BlcnRpZXMsIHdoaWxlIGRyb3VnaHRzIGFyZSB0aGUgbW9zdCBleHBlbnNpdmUgZXZlbnQgdHlwZSBmb3IgY3JvcCBkYW1hZ2UuCgojIyMgWWVhcmx5IGNhc3VhbHRpZXMgYW5kIGRhbWFnZXMKCkhvdyBhcmUgY2FzdWFsdGllcyBhbmQgZGFtYWdlcyBkaXN0cmlidXRlZCBvdmVyIHRoZSB5ZWFycz8KYGBge3IsIGZpZy5oZWlnaHQgPSAzLCBmaWcud2lkdGg9NH0KCnAxIDwtIGRmICU+JQogICAgbXV0YXRlKHllYXIgPSB5ZWFyKEJHTl9EQVRFKSkgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICAgIHN1bW1hcmlzZShGQVQgPSBzdW0oRkFUQUxJVElFUyksIElOSiA9IHN1bShJTkpVUklFUykpICU+JQogICAgZ2dwbG90KCkgKwogICAgZ2VvbV9iYXIoYWVzKHllYXIsIElOSiwgZmlsbCA9ICJDYXN1YWx0aWVzIiksICBzdGF0ID0gImlkZW50aXR5IikgKyAKICAgIGdlb21fYmFyKGFlcyh5ZWFyLCBGQVQsIGZpbGwgPSAnRmF0YWxpdGllcycpLCBzdGF0ID0gImlkZW50aXR5IikgKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsgCiAgICBsYWJzKHRpdGxlID0gIkNhc3VhbHRpZXMgcGVyIHllYXIiLAogICAgICAgICB4ID0gIlllYXIiLAogICAgICAgICB5ID0gIkNhc3VhbHRpZXMiKSArIAogICAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJJbmp1cnkgVHlwZSIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImxpZ2h0Y29yYWwiLCAiYmxhY2siKSkKCnAyIDwtIGRmICU+JQogICAgbXV0YXRlKHllYXIgPSB5ZWFyKEJHTl9EQVRFKSkgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICAgIHN1bW1hcmlzZShzdW0gPSBzdW0oYWxsX2RtZykpICU+JQogICAgZ2dwbG90KCkgKwogICAgZ2VvbV9iYXIoYWVzKHllYXIsIHN1bS8xMDAwMDAwMDAwLCBmaWxsID0gIkFsbCBEYW1hZ2VzIiksICBzdGF0ID0gImlkZW50aXR5IikgKyAKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcikgKyAKICAgIGxhYnModGl0bGUgPSAiRGFtYWdlIHBlciBZZWFyIiwKICAgICAgICAgeCA9ICJZZWFyIiwKICAgICAgICAgeSA9ICJEYW1hZ2VzIGluIEJpbGxpb24gVVNEIikgKyAKICAgIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiRGFtYWdlIFR5cGUiLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJsaWdodGNvcmFsIiwgImJsYWNrIikpCgpjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBucm93PTIsIGFsaWduPSd2JykKYGBgCgpXaGF0IGFyZSB0aGUgY2F1c2VzIGZvciB0aGUgcGVha3MgaW4gMTk5OCwgMjAwNSBhbmQgMjAxMSwgcmVzcGVjdGl2ZWx5PwpgYGB7cn0KIyBkYW1hZ2VzIGR1cmluZyBLYXRocmluYQpkZiAlPiUKICAgIGZpbHRlcihCR05fREFURSA+PSBhcy5EYXRlKCcyMDA1LTA4LTIzJykgJiBCR05fREFURSA8PSBhcy5EYXRlKCcyMDA1LTA4LTMwJykpICU+JQogICAgc3VtbWFyaXNlKHN1bSA9IHN1bShhbGxfZG1nKS8xRTkpCmBgYApUaGUgaGlnaCBkYW1hZ2VzIGluIDIwMDUgYXJlIGRvbWluYXRlZCBieSBIdXJyaWNhbmUgS2F0aHJpbmEgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1cnJpY2FuZV9LYXRyaW5hKS4gT3ZlciBVU0QgNzUgQmlsbGlvbiBvZiBkYW1hZ2VzIG9jY3VyZWQgaW4gdGhlIHdlZWsgYmV0d2VlbiB0aGUgMjMuIGFuZCAzMC4gb2YgQXVndXN0LgpgYGB7cn0KIyBJbmp1cmllcyBkdXJpbmcgSHVycmljYW4gTWFkZWxpbmUKZGYgJT4lCiAgICBmaWx0ZXIoQkdOX0RBVEUgPj0gYXMuRGF0ZSgnMTk5OC0xMC0xNicpICYgQkdOX0RBVEUgPD0gYXMuRGF0ZSgnMTk5OC0xMC0yMCcpKSAlPiUKICAgIHN1bW1hcmlzZShzdW0gPSBzdW0oSU5KVVJJRVMpKQpgYGAKVGhlIGhpZ2ggbnVtYmVyIG9mIGluanVyaWVzIGluIDE5OTggY2FuIGJlIGF0dHJpYnV0ZWQgdG8gSHVycmljYW5lIE1hZGVsaW5lICggaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVycmljYW5lX01hZGVsaW5lXygxOTk4KSApIAoKVGhlIGxhcmdlIG51bWJlciBvZiBpbmp1cmllcyBpbiAyMDExIGFyZSByZWxhdGVkIHRvIHRoZSAyMDExIFN1cGVyIE91dGJyZWFrLCBvbmUgb2YgdGhlIGxhcmdlc3QsIGNvc3RsaWVzdCBhbmQgZGVhZGxpZXN0IHRvcm5hZG8gb3V0YnJlYWtzIGV2ZXIgcmVjb3JkZWQgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLzIwMTFfU3VwZXJfT3V0YnJlYWspLg==