1 Combined Data

loan01 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational01.csv", header = TRUE)[, -1]
loan02 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational02.csv", header = TRUE)[, -1]
loan03 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational03.csv", header = TRUE)[, -1]
loan04 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational04.csv", header = TRUE)[, -1]
loan05 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational05.csv", header = TRUE)[, -1]
loan06 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational06.csv", header = TRUE)[, -1]
loan07 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational07.csv", header = TRUE)[, -1]
loan08 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational08.csv", header = TRUE)[, -1]
loan09 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational09.csv", header = TRUE)[, -1]
loan = rbind(loan01, loan02, loan03, loan04, loan05, loan06, loan07, loan08, loan09)
# dim(bankLoan)
#names(bankLoan)

2 Mis_Status Missing

loan <- loan[!is.na(loan$MIS_Status), ]

Mis_Status is the status of the persons loan. This is one of the most important variables in our dataset. It ensures us that when we do our analysis we have a complete observation telling us if the loan was approved, paid, or defaulted. So we remove any observations with loan status missing for clarity.

3 Convert Variables

currency_vars <- c("DisbursementGross", "BalanceGross", "ChgOffPrinGr", "GrAppv", "SBA_Appv")

loan[currency_vars] <- lapply(loan[currency_vars], function(x) as.numeric(gsub("[$,]", "", x)))

Since DisbursementGross, BalanceGross, ChgOffPrinGr, GrAppv, and SBA_Appv are important measures for our analysis we want to be able to use them more methodically. So we convert these categorical variables to numeric variables and remove any character values. Working with numbers as opposed to charterers is better for statistical analysis, visualization, and overall modeling. ## Categorical Variable rework

loan <- loan %>%
  mutate(BankRegion = case_when(
    BankState %in% c("CT", "ME", "MA", "NH", "NJ", "NY", "PA", "RI", "VT") ~ "Northeast",
    BankState %in% c("IL", "IN", "IA", "KS", "MI", "MN", "MO", "NE", "ND", "OH", "SD", "WI") ~ "Midwest",
    BankState %in% c("AL", "AR", "DE", "DC", "FL", "GA", "KY", "LA", "MD", "MS", "NC", "OK", "SC", "TN", "TX", "VA", "WV") ~ "South",
    BankState %in% c("AK", "AZ", "CA", "CO", "HI", "ID", "MT", "NV", "NM", "OR", "UT", "WA", "WY") ~ "West",
    TRUE ~ "Unknown"
  ))

table(loan$BankRegion)

  Midwest Northeast     South   Unknown      West 
   269885    150560    275751      1730    201238 

I decided to make 4 regional categories of the states. These categories being Northeast, Midwest, South, West and also an unknown. By doing this we can see if there are any patterns for any specific region. We can use this to compare approval rates, default rates, or average loan amounts by region. This also makes it easier for data visualization to again see if there is any disparities by region.

4 Default Rates based on Region

default_rates <- loan %>%
  group_by(BankRegion) %>%
  summarise(
    Total_Loans = n(),
    Defaults = sum(MIS_Status == "CHGOFF", na.rm = TRUE),
    Default_Rate = Defaults / Total_Loans * 100
  )

print(default_rates)
# A tibble: 5 × 4
  BankRegion Total_Loans Defaults Default_Rate
  <chr>            <int>    <int>        <dbl>
1 Midwest         269885    42537        15.8 
2 Northeast       150560    21021        14.0 
3 South           275751    58751        21.3 
4 Unknown           1730      106         6.13
5 West            201238    35143        17.5 

This code calculates the default rate of SBA-backed loans for each region. With this code it helps us to compare which regions have higher or lower default rates. It also gives insight into regional economic trends and lending practices. We see that in the South the default rate is the highest at 21% meaning that more loans go unpaid here than in any other region.

5 Discretize GrApprv

loan <- loan %>%
  mutate(GrAppv_Cat = cut(GrAppv, 
                          breaks = quantile(GrAppv, probs = seq(0, 1, by = 0.2), na.rm = TRUE),
                          include.lowest = TRUE,
                          labels = c("Very Low", "Low", "Medium", "High", "Very High")))

table(loan$GrAppv_Cat)

 Very Low       Low    Medium      High Very High 
   180997    179102    179575    179677    179813 

In the code above we categorize the SBA guaranteed approval amount into five groups. By categorizing and making this variable into small intervals we convert it from a continuous variable we now have a discretized variable. Discretized variables are easier to interpret. We see from the output above that they are evenly distributed meaning our approval spans a wide range of amounts.

6 SBA_Appr Curves

ggplot(loan, aes(x = SBA_Appv, fill = GrAppv_Cat, color = GrAppv_Cat)) +
  geom_density(alpha = 0.3) + 
  labs(title = "Density Curves of SBA Approval Amount by Loan Size",
       x = "SBA Approval Amount (SBA_Appv)", 
       y = "Density") +
  theme_minimal() +
  theme(legend.title = element_blank()) +  
  coord_cartesian(xlim = c(0, 500000))

The code above shows a density plot of the distribution of SBA approval amounts, categorized by loan size. From the visualization above we can see which loan sizes are most common and helps us see if certain loan categories are higher. The density peaks tell us where most SBA approval amounts fall.

LS0tDQp0aXRsZTogIkVEQSBCYW5rIExvYW4iDQphdXRob3I6ICdUeWxlciBCYXR0YWdsaW5pJw0KZGF0ZTogIjIwMjUtMy0yIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgZmlnX3dpZHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovDQoNCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkYXRlICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAxIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCjwvc3R5bGU+DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIERldGVjdCwgaW5zdGFsbCBhbmQgbG9hZCBwYWNrYWdlcyBpZiBuZWVkZWQuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpDQogICBsaWJyYXJ5KE1BU1MpDQp9DQppZiAoIXJlcXVpcmUoIm5sZXFzbHYiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibmxlcXNsdiIpDQogICBsaWJyYXJ5KG5sZXFzbHYpDQp9DQojDQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQoNCmlmICghcmVxdWlyZSgicHN5Y2giKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpDQogICBsaWJyYXJ5KHBzeWNoKQ0KfQ0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpDQogICBsaWJyYXJ5KE1BU1MpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgiR0dhbGx5IikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCiAgIGxpYnJhcnkoR0dhbGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJjYXIiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKQ0KICAgbGlicmFyeShjYXIpDQp9DQppZiAoIXJlcXVpcmUoImRwbHlyIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KICAgbGlicmFyeShkcGx5cikNCn0NCmlmICghcmVxdWlyZSgiY2FyZXQiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpDQogICBsaWJyYXJ5KGNhcmV0KQ0KfQ0KaWYgKCFyZXF1aXJlKCJyZWFkeGwiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKQ0KICAgbGlicmFyeShyZWFkeGwpDQp9DQppZiAoIXJlcXVpcmUoIm9wZW54bHN4IikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygib3Blbnhsc3giKQ0KICAgbGlicmFyeShvcGVueGxzeCkNCn0NCmlmICghcmVxdWlyZSgiZm9yZWNhc3QiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpDQogICBsaWJyYXJ5KGZvcmVjYXN0KQ0KfQ0KIyBzcGVjaWZpY2F0aW9ucyBvZiBvdXRwdXRzIG9mIGNvZGUgaW4gY29kZSBjaHVua3MNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IEZBTFNFLCAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBGQUxTRSwgICMNCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQoNCiMjIENvbWJpbmVkIERhdGENCg0KYGBge3J9DQpsb2FuMDEgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1R5bGVyQmF0dGFnbGluaS9TVEEtMzIxL3JlZnMvaGVhZHMvbWFpbi93MDYtU0JBbmF0aW9uYWwwMS5jc3YiLCBoZWFkZXIgPSBUUlVFKVssIC0xXQ0KbG9hbjAyID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9UeWxlckJhdHRhZ2xpbmkvU1RBLTMyMS9yZWZzL2hlYWRzL21haW4vdzA2LVNCQW5hdGlvbmFsMDIuY3N2IiwgaGVhZGVyID0gVFJVRSlbLCAtMV0NCmxvYW4wMyA9IHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVHlsZXJCYXR0YWdsaW5pL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL3cwNi1TQkFuYXRpb25hbDAzLmNzdiIsIGhlYWRlciA9IFRSVUUpWywgLTFdDQpsb2FuMDQgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1R5bGVyQmF0dGFnbGluaS9TVEEtMzIxL3JlZnMvaGVhZHMvbWFpbi93MDYtU0JBbmF0aW9uYWwwNC5jc3YiLCBoZWFkZXIgPSBUUlVFKVssIC0xXQ0KbG9hbjA1ID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9UeWxlckJhdHRhZ2xpbmkvU1RBLTMyMS9yZWZzL2hlYWRzL21haW4vdzA2LVNCQW5hdGlvbmFsMDUuY3N2IiwgaGVhZGVyID0gVFJVRSlbLCAtMV0NCmxvYW4wNiA9IHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVHlsZXJCYXR0YWdsaW5pL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL3cwNi1TQkFuYXRpb25hbDA2LmNzdiIsIGhlYWRlciA9IFRSVUUpWywgLTFdDQpsb2FuMDcgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1R5bGVyQmF0dGFnbGluaS9TVEEtMzIxL3JlZnMvaGVhZHMvbWFpbi93MDYtU0JBbmF0aW9uYWwwNy5jc3YiLCBoZWFkZXIgPSBUUlVFKVssIC0xXQ0KbG9hbjA4ID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9UeWxlckJhdHRhZ2xpbmkvU1RBLTMyMS9yZWZzL2hlYWRzL21haW4vdzA2LVNCQW5hdGlvbmFsMDguY3N2IiwgaGVhZGVyID0gVFJVRSlbLCAtMV0NCmxvYW4wOSA9IHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVHlsZXJCYXR0YWdsaW5pL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL3cwNi1TQkFuYXRpb25hbDA5LmNzdiIsIGhlYWRlciA9IFRSVUUpWywgLTFdDQpsb2FuID0gcmJpbmQobG9hbjAxLCBsb2FuMDIsIGxvYW4wMywgbG9hbjA0LCBsb2FuMDUsIGxvYW4wNiwgbG9hbjA3LCBsb2FuMDgsIGxvYW4wOSkNCiMgZGltKGJhbmtMb2FuKQ0KI25hbWVzKGJhbmtMb2FuKQ0KDQoNCg0KYGBgDQoNCiMjIE1pc19TdGF0dXMgTWlzc2luZw0KDQpgYGB7cn0NCmxvYW4gPC0gbG9hblshaXMubmEobG9hbiRNSVNfU3RhdHVzKSwgXQ0KDQpgYGANCg0KTWlzX1N0YXR1cyBpcyB0aGUgc3RhdHVzIG9mIHRoZSBwZXJzb25zIGxvYW4uIFRoaXMgaXMgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCB2YXJpYWJsZXMgaW4gb3VyIGRhdGFzZXQuIEl0IGVuc3VyZXMgdXMgdGhhdCB3aGVuIHdlIGRvIG91ciBhbmFseXNpcyB3ZSBoYXZlIGEgY29tcGxldGUgb2JzZXJ2YXRpb24gdGVsbGluZyB1cyBpZiB0aGUgbG9hbiB3YXMgYXBwcm92ZWQsIHBhaWQsIG9yIGRlZmF1bHRlZC4gU28gd2UgcmVtb3ZlIGFueSBvYnNlcnZhdGlvbnMgd2l0aCBsb2FuIHN0YXR1cyBtaXNzaW5nIGZvciBjbGFyaXR5Lg0KDQojIyBDb252ZXJ0IFZhcmlhYmxlcw0KDQpgYGB7cn0NCmN1cnJlbmN5X3ZhcnMgPC0gYygiRGlzYnVyc2VtZW50R3Jvc3MiLCAiQmFsYW5jZUdyb3NzIiwgIkNoZ09mZlByaW5HciIsICJHckFwcHYiLCAiU0JBX0FwcHYiKQ0KDQpsb2FuW2N1cnJlbmN5X3ZhcnNdIDwtIGxhcHBseShsb2FuW2N1cnJlbmN5X3ZhcnNdLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKGdzdWIoIlskLF0iLCAiIiwgeCkpKQ0KDQpgYGANCg0KU2luY2UgRGlzYnVyc2VtZW50R3Jvc3MsIEJhbGFuY2VHcm9zcywgQ2hnT2ZmUHJpbkdyLCBHckFwcHYsIGFuZCBTQkFfQXBwdiBhcmUgaW1wb3J0YW50IG1lYXN1cmVzIGZvciBvdXIgYW5hbHlzaXMgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIG1vcmUgbWV0aG9kaWNhbGx5LiBTbyB3ZSBjb252ZXJ0IHRoZXNlIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyB0byBudW1lcmljIHZhcmlhYmxlcyBhbmQgcmVtb3ZlIGFueSBjaGFyYWN0ZXIgdmFsdWVzLiBXb3JraW5nIHdpdGggbnVtYmVycyBhcyBvcHBvc2VkIHRvIGNoYXJ0ZXJlcnMgaXMgYmV0dGVyIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcywgdmlzdWFsaXphdGlvbiwgYW5kIG92ZXJhbGwgbW9kZWxpbmcuDQojIyBDYXRlZ29yaWNhbCBWYXJpYWJsZSByZXdvcmsNCg0KYGBge3J9DQpsb2FuIDwtIGxvYW4gJT4lDQogIG11dGF0ZShCYW5rUmVnaW9uID0gY2FzZV93aGVuKA0KICAgIEJhbmtTdGF0ZSAlaW4lIGMoIkNUIiwgIk1FIiwgIk1BIiwgIk5IIiwgIk5KIiwgIk5ZIiwgIlBBIiwgIlJJIiwgIlZUIikgfiAiTm9ydGhlYXN0IiwNCiAgICBCYW5rU3RhdGUgJWluJSBjKCJJTCIsICJJTiIsICJJQSIsICJLUyIsICJNSSIsICJNTiIsICJNTyIsICJORSIsICJORCIsICJPSCIsICJTRCIsICJXSSIpIH4gIk1pZHdlc3QiLA0KICAgIEJhbmtTdGF0ZSAlaW4lIGMoIkFMIiwgIkFSIiwgIkRFIiwgIkRDIiwgIkZMIiwgIkdBIiwgIktZIiwgIkxBIiwgIk1EIiwgIk1TIiwgIk5DIiwgIk9LIiwgIlNDIiwgIlROIiwgIlRYIiwgIlZBIiwgIldWIikgfiAiU291dGgiLA0KICAgIEJhbmtTdGF0ZSAlaW4lIGMoIkFLIiwgIkFaIiwgIkNBIiwgIkNPIiwgIkhJIiwgIklEIiwgIk1UIiwgIk5WIiwgIk5NIiwgIk9SIiwgIlVUIiwgIldBIiwgIldZIikgfiAiV2VzdCIsDQogICAgVFJVRSB+ICJVbmtub3duIg0KICApKQ0KDQp0YWJsZShsb2FuJEJhbmtSZWdpb24pDQpgYGANCg0KSSBkZWNpZGVkIHRvIG1ha2UgNCByZWdpb25hbCBjYXRlZ29yaWVzIG9mIHRoZSBzdGF0ZXMuIFRoZXNlIGNhdGVnb3JpZXMgYmVpbmcgTm9ydGhlYXN0LCBNaWR3ZXN0LCBTb3V0aCwgV2VzdCBhbmQgYWxzbyBhbiB1bmtub3duLiBCeSBkb2luZyB0aGlzIHdlIGNhbiBzZWUgaWYgdGhlcmUgYXJlIGFueSBwYXR0ZXJucyBmb3IgYW55IHNwZWNpZmljIHJlZ2lvbi4gV2UgY2FuIHVzZSB0aGlzIHRvIGNvbXBhcmUgYXBwcm92YWwgcmF0ZXMsIGRlZmF1bHQgcmF0ZXMsIG9yIGF2ZXJhZ2UgbG9hbiBhbW91bnRzIGJ5IHJlZ2lvbi4gVGhpcyBhbHNvIG1ha2VzIGl0IGVhc2llciBmb3IgZGF0YSB2aXN1YWxpemF0aW9uIHRvIGFnYWluIHNlZSBpZiB0aGVyZSBpcyBhbnkgZGlzcGFyaXRpZXMgYnkgcmVnaW9uLiANCg0KIyMgRGVmYXVsdCBSYXRlcyBiYXNlZCBvbiBSZWdpb24NCg0KYGBge3J9DQpkZWZhdWx0X3JhdGVzIDwtIGxvYW4gJT4lDQogIGdyb3VwX2J5KEJhbmtSZWdpb24pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgVG90YWxfTG9hbnMgPSBuKCksDQogICAgRGVmYXVsdHMgPSBzdW0oTUlTX1N0YXR1cyA9PSAiQ0hHT0ZGIiwgbmEucm0gPSBUUlVFKSwNCiAgICBEZWZhdWx0X1JhdGUgPSBEZWZhdWx0cyAvIFRvdGFsX0xvYW5zICogMTAwDQogICkNCg0KcHJpbnQoZGVmYXVsdF9yYXRlcykNCmBgYA0KDQpUaGlzIGNvZGUgY2FsY3VsYXRlcyB0aGUgZGVmYXVsdCByYXRlIG9mIFNCQS1iYWNrZWQgbG9hbnMgZm9yIGVhY2ggcmVnaW9uLiBXaXRoIHRoaXMgY29kZSBpdCBoZWxwcyB1cyB0byBjb21wYXJlIHdoaWNoIHJlZ2lvbnMgaGF2ZSBoaWdoZXIgb3IgbG93ZXIgZGVmYXVsdCByYXRlcy4gSXQgYWxzbyBnaXZlcyBpbnNpZ2h0IGludG8gcmVnaW9uYWwgZWNvbm9taWMgdHJlbmRzIGFuZCBsZW5kaW5nIHByYWN0aWNlcy4gV2Ugc2VlIHRoYXQgaW4gdGhlIFNvdXRoIHRoZSBkZWZhdWx0IHJhdGUgaXMgdGhlIGhpZ2hlc3QgYXQgMjElIG1lYW5pbmcgdGhhdCBtb3JlIGxvYW5zIGdvIHVucGFpZCBoZXJlIHRoYW4gaW4gYW55IG90aGVyIHJlZ2lvbi4gDQoNCiMjIERpc2NyZXRpemUgR3JBcHBydg0KDQpgYGB7cn0NCmxvYW4gPC0gbG9hbiAlPiUNCiAgbXV0YXRlKEdyQXBwdl9DYXQgPSBjdXQoR3JBcHB2LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gcXVhbnRpbGUoR3JBcHB2LCBwcm9icyA9IHNlcSgwLCAxLCBieSA9IDAuMiksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVmVyeSBMb3ciLCAiTG93IiwgIk1lZGl1bSIsICJIaWdoIiwgIlZlcnkgSGlnaCIpKSkNCg0KdGFibGUobG9hbiRHckFwcHZfQ2F0KQ0KYGBgDQoNCkluIHRoZSBjb2RlIGFib3ZlIHdlIGNhdGVnb3JpemUgdGhlIFNCQSBndWFyYW50ZWVkIGFwcHJvdmFsIGFtb3VudCBpbnRvIGZpdmUgZ3JvdXBzLiBCeSBjYXRlZ29yaXppbmcgYW5kIG1ha2luZyB0aGlzIHZhcmlhYmxlIGludG8gc21hbGwgaW50ZXJ2YWxzIHdlIGNvbnZlcnQgaXQgZnJvbSBhIGNvbnRpbnVvdXMgdmFyaWFibGUgd2Ugbm93IGhhdmUgYSBkaXNjcmV0aXplZCB2YXJpYWJsZS4gRGlzY3JldGl6ZWQgdmFyaWFibGVzIGFyZSBlYXNpZXIgdG8gaW50ZXJwcmV0LiBXZSBzZWUgZnJvbSB0aGUgb3V0cHV0IGFib3ZlIHRoYXQgdGhleSBhcmUgZXZlbmx5IGRpc3RyaWJ1dGVkIG1lYW5pbmcgb3VyIGFwcHJvdmFsIHNwYW5zIGEgd2lkZSByYW5nZSBvZiBhbW91bnRzLiANCg0KIyMgU0JBX0FwcHIgQ3VydmVzDQoNCmBgYHtyfQ0KZ2dwbG90KGxvYW4sIGFlcyh4ID0gU0JBX0FwcHYsIGZpbGwgPSBHckFwcHZfQ2F0LCBjb2xvciA9IEdyQXBwdl9DYXQpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuMykgKyANCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IEN1cnZlcyBvZiBTQkEgQXBwcm92YWwgQW1vdW50IGJ5IExvYW4gU2l6ZSIsDQogICAgICAgeCA9ICJTQkEgQXBwcm92YWwgQW1vdW50IChTQkFfQXBwdikiLCANCiAgICAgICB5ID0gIkRlbnNpdHkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAgDQogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA1MDAwMDApKQ0KYGBgDQoNClRoZSBjb2RlIGFib3ZlIHNob3dzIGEgZGVuc2l0eSBwbG90IG9mIHRoZSBkaXN0cmlidXRpb24gb2YgU0JBIGFwcHJvdmFsIGFtb3VudHMsIGNhdGVnb3JpemVkIGJ5IGxvYW4gc2l6ZS4gRnJvbSB0aGUgdmlzdWFsaXphdGlvbiBhYm92ZSB3ZSBjYW4gc2VlIHdoaWNoIGxvYW4gc2l6ZXMgYXJlIG1vc3QgY29tbW9uIGFuZCBoZWxwcyB1cyBzZWUgaWYgY2VydGFpbiBsb2FuIGNhdGVnb3JpZXMgYXJlIGhpZ2hlci4gVGhlIGRlbnNpdHkgcGVha3MgdGVsbCB1cyB3aGVyZSBtb3N0IFNCQSBhcHByb3ZhbCBhbW91bnRzIGZhbGwuIA0KDQoNCg0KDQoNCg0K