1. Defining malnutrition

1.1. Prerequisites

library(tidyverse)
library(zscorer)
library(readr)
library(dplyr)
library (lubridate)
library (ggplot2)
library (rmarkdown)
PSFI_df_malnutrition <- read_csv("Ben_cut_4_27.csv")
  PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    date_present = as.POSIXct(date_present, format = "%d%b%Y:%H:%M:%S", tz = "UTC"),
    dob = mdy(dob),
    age_days_exact = as.numeric(difftime(date_present, dob, units = "days"))
  )
  
  
summary(PSFI_df_malnutrition$age_days_exact)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  32.03  289.19  604.61 1124.44 1461.64 5452.40 
View(PSFI_df_malnutrition)

1.2. Anthroprometric analysis

# Layout to split the screen
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
 
# Draw the boxplot and the histogram 
par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$ht , horizontal=TRUE , ylim=c(0,200), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$ht
     , breaks=40 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Height (cm)", xlim=c(0,200))

layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
 par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$wt , horizontal=TRUE , ylim=c(0,200), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$wt
     , breaks=40 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Weight (kg)", xlim=c(0,100))

layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$muac , horizontal=TRUE , ylim=c(0,200), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$muac
     , breaks=20 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Mid-upper arm circumference (cm)", xlim=c(0,30))
abline(v = 11.5, col = "red", lwd = 2, lty = 2)   # severe
abline(v = 12.5, col = "blue", lwd = 2, lty = 2)  # moderate

PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(age_years = age_days_exact / 365.25)

summary(PSFI_df_malnutrition$age_years)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
 0.08768  0.79176  1.65535  3.07854  4.00176 14.92786 
layout(mat = matrix(c(1,2),2,1, byrow=TRUE),  height = c(1,8))
 par(mar=c(0, 3.1, 1.1, 2.1))
boxplot(PSFI_df_malnutrition$age_years , horizontal=TRUE , ylim=c(0,300), xaxt="n" , col=rgb(0.8,0.8,0,0.5) , frame=F)
par(mar=c(4, 3.1, 1.1, 2.1))
hist(PSFI_df_malnutrition$age_years
     , breaks=40 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Age (years)", xlim=c(0,15))

1.3. Z-scorer

PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(sex_who = if_else(sex == 1, 1, 2))

summary(PSFI_df_malnutrition$sex_who)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.000   1.000   1.427   2.000   2.000 
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    wflz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      index = "wfl"
    )$wflz,
    
    wfhz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      index = "wfh"
    )$wfhz,
    
    baz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      thirdPart = "age_days_exact",
      index = "bfa"
    )$bfaz,
  )
========================================================================================
========================================================================================
========================================================================================
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    wflz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      index = "wfl"
    )$wflz,
    
    wfhz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      index = "wfh"
    )$wfhz,
    
    baz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      thirdPart = "age_days_exact",
      index = "bfa"
    )$bfaz,
  )
========================================================================================
========================================================================================
========================================================================================
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    muacz = case_when(
      muac >= 12.5 ~ 0,
      muac >= 11.5 & muac < 12.5 ~ -2.5,
      muac < 11.5 ~ -4,
      TRUE ~ NA_real_
    )
  )
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    zscore_unified = case_when(
      age_group == 0 & ht >= 45 & ht < 65 ~ wflz,
      age_group == 0 & ht >= 65 & ht < 120 ~ wfhz,
      age_group == 0 & (ht < 45 | ht >= 120 | is.na(ht)) ~ muacz,
      age_group == 1 ~ baz,
      TRUE ~ NA_real_
    )
  )
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    malnutrition = case_when(
  is.na(zscore_unified) ~ NA_integer_,
  zscore_unified < -3 ~ 2L,
  zscore_unified >= -3 & zscore_unified < -2 ~ 1L,
  TRUE ~ 0L
    )
  )
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    malnutrition_source = case_when(
      age_group == 0 & ht >= 45 & ht < 65  ~ "WFL",
      age_group == 0 & ht >= 65 & ht < 120 ~ "WFH",
      age_group == 0 & (ht < 45 | ht >= 120 | is.na(ht)) ~ "MUAC",
      age_group == 1 ~ "BFA",
      TRUE ~ NA_character_
    )
  )

1.4. Data check

PSFI_df_malnutrition%>%
  group_by(malnutrition) %>%
  summarize(
    malnutrition_missing = sum(is.na(malnutrition)),
    mort_inhosp_missing = sum(is.na(mort_inhosp)), #103 mort_inhosp_miissing  = controls
  )
PSFI_df_malnutrition %>%
  drop_na(mort_inhosp) %>%
  group_by(malnutrition_source) %>%
  summarize(
    count_malnut = n()
  )

# NA due to child with height of 20 cm (under WHO curve for wfh/wfl) and 38 days old (too young for MUAC)
PSFI_df_malnutrition %>%
  drop_na(mort_inhosp) %>%
  group_by(malnutrition) %>%
  summarize(
    count_malnut = n()
  )
PSFI_df_malnutrition %>%
  drop_na(malnutrition, mort_inhosp) %>%
  ggplot(aes(x = factor(malnutrition))) +
  geom_bar() +
  labs(
    x = "Malnutrition",
    y = "N"
  )

PSFI_df_malnutrition%>%
  drop_na(mort_inhosp) %>% #drops controls
  count(malnutrition, mort_inhosp) %>%
  group_by(malnutrition) %>%
  mutate(prop = n / sum(n))
PSFI_df_malnutrition %>%
  drop_na(mort_inhosp, malnutrition) %>% #only cases & minus the one previously mentioned NA
  ggplot +
  (aes(x = factor(malnutrition), fill = factor(mort_inhosp))) +
  geom_bar(stat = "count", position = "fill") +
  labs(
    x = "Malnutrition",
    y = "Proportion",
    fill = "Mortality"
  )

PSFI_df_malnutrition %>%
  count(malnutrition, case_control) %>%
  group_by(malnutrition) %>%
  mutate(prop = n / sum(n))
PSFI_df_malnutrition %>%
  drop_na(malnutrition) %>%
  ggplot +
  (aes(x = factor(malnutrition), fill = factor(case_control))) +
  geom_bar(stat = "count", position = "fill") +
  labs(
    x = "Malnutrition",
    y = "Proportion",
    fill = "Case/Control"
  )

LS0tDQp0aXRsZTogIlRoZSBEb3VibGUgQnVyZGVuIG9mIE1hbG51dHJpdGlvbiBhbmQgUGVkaWF0cmljIFNlcHNpcyBpbiBUYW56YW5pYSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCiMgMS4gRGVmaW5pbmcgbWFsbnV0cml0aW9uDQoNCiMjIDEuMS4gUHJlcmVxdWlzaXRlcw0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh6c2NvcmVyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5IChsdWJyaWRhdGUpDQpsaWJyYXJ5IChnZ3Bsb3QyKQ0KbGlicmFyeSAocm1hcmtkb3duKQ0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gPC0gcmVhZF9jc3YoIkJlbl9jdXRfNF8yNy5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KICBQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgbXV0YXRlKA0KICAgIGRhdGVfcHJlc2VudCA9IGFzLlBPU0lYY3QoZGF0ZV9wcmVzZW50LCBmb3JtYXQgPSAiJWQlYiVZOiVIOiVNOiVTIiwgdHogPSAiVVRDIiksDQogICAgZG9iID0gbWR5KGRvYiksDQogICAgYWdlX2RheXNfZXhhY3QgPSBhcy5udW1lcmljKGRpZmZ0aW1lKGRhdGVfcHJlc2VudCwgZG9iLCB1bml0cyA9ICJkYXlzIikpDQogICkNCiAgDQogIA0Kc3VtbWFyeShQU0ZJX2RmX21hbG51dHJpdGlvbiRhZ2VfZGF5c19leGFjdCkNCmBgYA0KDQpgYGB7cn0NClZpZXcoUFNGSV9kZl9tYWxudXRyaXRpb24pDQoNCmBgYA0KDQojIyAxLjIuIEFudGhyb3Byb21ldHJpYyBhbmFseXNpcw0KDQpgYGB7cn0NCiMgTGF5b3V0IHRvIHNwbGl0IHRoZSBzY3JlZW4NCmxheW91dChtYXQgPSBtYXRyaXgoYygxLDIpLDIsMSwgYnlyb3c9VFJVRSksICBoZWlnaHQgPSBjKDEsOCkpDQogDQojIERyYXcgdGhlIGJveHBsb3QgYW5kIHRoZSBoaXN0b2dyYW0gDQpwYXIobWFyPWMoMCwgMy4xLCAxLjEsIDIuMSkpDQpib3hwbG90KFBTRklfZGZfbWFsbnV0cml0aW9uJGh0ICwgaG9yaXpvbnRhbD1UUlVFICwgeWxpbT1jKDAsMjAwKSwgeGF4dD0ibiIgLCBjb2w9cmdiKDAuOCwwLjgsMCwwLjUpICwgZnJhbWU9RikNCnBhcihtYXI9Yyg0LCAzLjEsIDEuMSwgMi4xKSkNCmhpc3QoUFNGSV9kZl9tYWxudXRyaXRpb24kaHQNCiAgICAgLCBicmVha3M9NDAgLCBjb2w9cmdiKDEsMC44LDAuOCwxKSAsIGJvcmRlcj1GICwgbWFpbj0iIiAsIHhsYWI9IkhlaWdodCAoY20pIiwgeGxpbT1jKDAsMjAwKSkNCmBgYA0KDQpgYGB7cn0NCmxheW91dChtYXQgPSBtYXRyaXgoYygxLDIpLDIsMSwgYnlyb3c9VFJVRSksICBoZWlnaHQgPSBjKDEsOCkpDQogcGFyKG1hcj1jKDAsIDMuMSwgMS4xLCAyLjEpKQ0KYm94cGxvdChQU0ZJX2RmX21hbG51dHJpdGlvbiR3dCAsIGhvcml6b250YWw9VFJVRSAsIHlsaW09YygwLDIwMCksIHhheHQ9Im4iICwgY29sPXJnYigwLjgsMC44LDAsMC41KSAsIGZyYW1lPUYpDQpwYXIobWFyPWMoNCwgMy4xLCAxLjEsIDIuMSkpDQpoaXN0KFBTRklfZGZfbWFsbnV0cml0aW9uJHd0DQogICAgICwgYnJlYWtzPTQwICwgY29sPXJnYigxLDAuOCwwLjgsMSkgLCBib3JkZXI9RiAsIG1haW49IiIgLCB4bGFiPSJXZWlnaHQgKGtnKSIsIHhsaW09YygwLDEwMCkpDQpgYGANCg0KYGBge3J9DQpsYXlvdXQobWF0ID0gbWF0cml4KGMoMSwyKSwyLDEsIGJ5cm93PVRSVUUpLCAgaGVpZ2h0ID0gYygxLDgpKQ0KcGFyKG1hcj1jKDAsIDMuMSwgMS4xLCAyLjEpKQ0KYm94cGxvdChQU0ZJX2RmX21hbG51dHJpdGlvbiRtdWFjICwgaG9yaXpvbnRhbD1UUlVFICwgeWxpbT1jKDAsMjAwKSwgeGF4dD0ibiIgLCBjb2w9cmdiKDAuOCwwLjgsMCwwLjUpICwgZnJhbWU9RikNCnBhcihtYXI9Yyg0LCAzLjEsIDEuMSwgMi4xKSkNCmhpc3QoUFNGSV9kZl9tYWxudXRyaXRpb24kbXVhYw0KICAgICAsIGJyZWFrcz0yMCAsIGNvbD1yZ2IoMSwwLjgsMC44LDEpICwgYm9yZGVyPUYgLCBtYWluPSIiICwgeGxhYj0iTWlkLXVwcGVyIGFybSBjaXJjdW1mZXJlbmNlIChjbSkiLCB4bGltPWMoMCwzMCkpDQphYmxpbmUodiA9IDExLjUsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgICMgc2V2ZXJlDQphYmxpbmUodiA9IDEyLjUsIGNvbCA9ICJibHVlIiwgbHdkID0gMiwgbHR5ID0gMikgICMgbW9kZXJhdGUNCmBgYA0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoYWdlX3llYXJzID0gYWdlX2RheXNfZXhhY3QgLyAzNjUuMjUpDQoNCnN1bW1hcnkoUFNGSV9kZl9tYWxudXRyaXRpb24kYWdlX3llYXJzKQ0KYGBgDQoNCmBgYHtyfQ0KbGF5b3V0KG1hdCA9IG1hdHJpeChjKDEsMiksMiwxLCBieXJvdz1UUlVFKSwgIGhlaWdodCA9IGMoMSw4KSkNCiBwYXIobWFyPWMoMCwgMy4xLCAxLjEsIDIuMSkpDQpib3hwbG90KFBTRklfZGZfbWFsbnV0cml0aW9uJGFnZV95ZWFycyAsIGhvcml6b250YWw9VFJVRSAsIHlsaW09YygwLDMwMCksIHhheHQ9Im4iICwgY29sPXJnYigwLjgsMC44LDAsMC41KSAsIGZyYW1lPUYpDQpwYXIobWFyPWMoNCwgMy4xLCAxLjEsIDIuMSkpDQpoaXN0KFBTRklfZGZfbWFsbnV0cml0aW9uJGFnZV95ZWFycw0KICAgICAsIGJyZWFrcz00MCAsIGNvbD1yZ2IoMSwwLjgsMC44LDEpICwgYm9yZGVyPUYgLCBtYWluPSIiICwgeGxhYj0iQWdlICh5ZWFycykiLCB4bGltPWMoMCwxNSkpDQpgYGANCg0KIyMgMS4zLiBaLXNjb3Jlcg0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoc2V4X3dobyA9IGlmX2Vsc2Uoc2V4ID09IDEsIDEsIDIpKQ0KDQpzdW1tYXJ5KFBTRklfZGZfbWFsbnV0cml0aW9uJHNleF93aG8pDQpgYGANCg0KYGBge3J9DQpQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgbXV0YXRlKA0KICAgIGFnZV9ncm91cCA9IGNhc2Vfd2hlbigNCiAgICAgIGFnZV9kYXlzX2V4YWN0IDwgNSAqIDM2NS4yNSB+IDBMLA0KICAgICAgYWdlX2RheXNfZXhhY3QgPj0gNSAqIDM2NS4yNSB+IDFMLA0KICAgICAgVFJVRSB+IE5BX2ludGVnZXJfDQogICAgKQ0KICApDQoNCmBgYA0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoDQogICAgd2ZseiA9IGFkZFdHU1IoDQogICAgICBkYXRhID0gLiwNCiAgICAgIHNleCA9ICJzZXhfd2hvIiwNCiAgICAgIGZpcnN0UGFydCA9ICJ3dCIsDQogICAgICBzZWNvbmRQYXJ0ID0gImh0IiwNCiAgICAgIGluZGV4ID0gIndmbCINCiAgICApJHdmbHosDQogICAgDQogICAgd2ZoeiA9IGFkZFdHU1IoDQogICAgICBkYXRhID0gLiwNCiAgICAgIHNleCA9ICJzZXhfd2hvIiwNCiAgICAgIGZpcnN0UGFydCA9ICJ3dCIsDQogICAgICBzZWNvbmRQYXJ0ID0gImh0IiwNCiAgICAgIGluZGV4ID0gIndmaCINCiAgICApJHdmaHosDQogICAgDQogICAgYmF6ID0gYWRkV0dTUigNCiAgICAgIGRhdGEgPSAuLA0KICAgICAgc2V4ID0gInNleF93aG8iLA0KICAgICAgZmlyc3RQYXJ0ID0gInd0IiwNCiAgICAgIHNlY29uZFBhcnQgPSAiaHQiLA0KICAgICAgdGhpcmRQYXJ0ID0gImFnZV9kYXlzX2V4YWN0IiwNCiAgICAgIGluZGV4ID0gImJmYSINCiAgICApJGJmYXosDQogICkNCg0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIG11dGF0ZSgNCiAgICBtdWFjeiA9IGNhc2Vfd2hlbigNCiAgICAgIG11YWMgPj0gMTIuNSB+IDAsDQogICAgICBtdWFjID49IDExLjUgJiBtdWFjIDwgMTIuNSB+IC0yLjUsDQogICAgICBtdWFjIDwgMTEuNSB+IC00LA0KICAgICAgVFJVRSB+IE5BX3JlYWxfDQogICAgKQ0KICApDQpgYGANCg0KYGBge3J9DQpQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgbXV0YXRlKA0KICAgIHpzY29yZV91bmlmaWVkID0gY2FzZV93aGVuKA0KICAgICAgYWdlX2dyb3VwID09IDAgJiBodCA+PSA0NSAmIGh0IDwgNjUgfiB3Zmx6LA0KICAgICAgYWdlX2dyb3VwID09IDAgJiBodCA+PSA2NSAmIGh0IDwgMTIwIH4gd2ZoeiwNCiAgICAgIGFnZV9ncm91cCA9PSAwICYgKGh0IDwgNDUgfCBodCA+PSAxMjAgfCBpcy5uYShodCkpIH4gbXVhY3osDQogICAgICBhZ2VfZ3JvdXAgPT0gMSB+IGJheiwNCiAgICAgIFRSVUUgfiBOQV9yZWFsXw0KICAgICkNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIG11dGF0ZSgNCiAgICBtYWxudXRyaXRpb24gPSBjYXNlX3doZW4oDQogIGlzLm5hKHpzY29yZV91bmlmaWVkKSB+IE5BX2ludGVnZXJfLA0KICB6c2NvcmVfdW5pZmllZCA8IC0zIH4gMkwsDQogIHpzY29yZV91bmlmaWVkID49IC0zICYgenNjb3JlX3VuaWZpZWQgPCAtMiB+IDFMLA0KICBUUlVFIH4gMEwNCiAgICApDQogICkNCmBgYA0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoDQogICAgbWFsbnV0cml0aW9uX3NvdXJjZSA9IGNhc2Vfd2hlbigNCiAgICAgIGFnZV9ncm91cCA9PSAwICYgaHQgPj0gNDUgJiBodCA8IDY1ICB+ICJXRkwiLA0KICAgICAgYWdlX2dyb3VwID09IDAgJiBodCA+PSA2NSAmIGh0IDwgMTIwIH4gIldGSCIsDQogICAgICBhZ2VfZ3JvdXAgPT0gMCAmIChodCA8IDQ1IHwgaHQgPj0gMTIwIHwgaXMubmEoaHQpKSB+ICJNVUFDIiwNCiAgICAgIGFnZV9ncm91cCA9PSAxIH4gIkJGQSIsDQogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXw0KICAgICkNCiAgKQ0KYGBgDQoNCiMjIDEuNC4gRGF0YSBjaGVjaw0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uJT4lDQogIGdyb3VwX2J5KG1hbG51dHJpdGlvbikgJT4lDQogIHN1bW1hcml6ZSgNCiAgICBtYWxudXRyaXRpb25fbWlzc2luZyA9IHN1bShpcy5uYShtYWxudXRyaXRpb24pKSwNCiAgICBtb3J0X2luaG9zcF9taXNzaW5nID0gc3VtKGlzLm5hKG1vcnRfaW5ob3NwKSksICMxMDMgbW9ydF9pbmhvc3BfbWlpc3NpbmcgID0gY29udHJvbHMNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGRyb3BfbmEobW9ydF9pbmhvc3ApICU+JQ0KICBncm91cF9ieShtYWxudXRyaXRpb25fc291cmNlKSAlPiUNCiAgc3VtbWFyaXplKA0KICAgIGNvdW50X21hbG51dCA9IG4oKQ0KICApDQoNCiMgTkEgZHVlIHRvIGNoaWxkIHdpdGggaGVpZ2h0IG9mIDIwIGNtICh1bmRlciBXSE8gY3VydmUgZm9yIHdmaC93ZmwpIGFuZCAzOCBkYXlzIG9sZCAodG9vIHlvdW5nIGZvciBNVUFDKQ0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGRyb3BfbmEobW9ydF9pbmhvc3ApICU+JQ0KICBncm91cF9ieShtYWxudXRyaXRpb24pICU+JQ0KICBzdW1tYXJpemUoDQogICAgY291bnRfbWFsbnV0ID0gbigpDQogICkNCmBgYA0KDQpgYGB7cn0NClBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBkcm9wX25hKG1hbG51dHJpdGlvbiwgbW9ydF9pbmhvc3ApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IobWFsbnV0cml0aW9uKSkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGxhYnMoDQogICAgeCA9ICJNYWxudXRyaXRpb24iLA0KICAgIHkgPSAiTiINCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24lPiUNCiAgZHJvcF9uYShtb3J0X2luaG9zcCkgJT4lICNkcm9wcyBjb250cm9scw0KICBjb3VudChtYWxudXRyaXRpb24sIG1vcnRfaW5ob3NwKSAlPiUNCiAgZ3JvdXBfYnkobWFsbnV0cml0aW9uKSAlPiUNCiAgbXV0YXRlKHByb3AgPSBuIC8gc3VtKG4pKQ0KYGBgDQoNCmBgYHtyfQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGRyb3BfbmEobW9ydF9pbmhvc3AsIG1hbG51dHJpdGlvbikgJT4lICNvbmx5IGNhc2VzICYgbWludXMgdGhlIG9uZSBwcmV2aW91c2x5IG1lbnRpb25lZCBOQQ0KICBnZ3Bsb3QgKw0KICAoYWVzKHggPSBmYWN0b3IobWFsbnV0cml0aW9uKSwgZmlsbCA9IGZhY3Rvcihtb3J0X2luaG9zcCkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLCBwb3NpdGlvbiA9ICJmaWxsIikgKw0KICBsYWJzKA0KICAgIHggPSAiTWFsbnV0cml0aW9uIiwNCiAgICB5ID0gIlByb3BvcnRpb24iLA0KICAgIGZpbGwgPSAiTW9ydGFsaXR5Ig0KICApDQpgYGANCg0KYGBge3J9DQpQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgY291bnQobWFsbnV0cml0aW9uLCBjYXNlX2NvbnRyb2wpICU+JQ0KICBncm91cF9ieShtYWxudXRyaXRpb24pICU+JQ0KICBtdXRhdGUocHJvcCA9IG4gLyBzdW0obikpDQpgYGANCg0KYGBge3J9DQpQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZHJvcF9uYShtYWxudXRyaXRpb24pICU+JQ0KICBnZ3Bsb3QgKw0KICAoYWVzKHggPSBmYWN0b3IobWFsbnV0cml0aW9uKSwgZmlsbCA9IGZhY3RvcihjYXNlX2NvbnRyb2wpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImNvdW50IiwgcG9zaXRpb24gPSAiZmlsbCIpICsNCiAgbGFicygNCiAgICB4ID0gIk1hbG51dHJpdGlvbiIsDQogICAgeSA9ICJQcm9wb3J0aW9uIiwNCiAgICBmaWxsID0gIkNhc2UvQ29udHJvbCINCiAgKQ0KYGBgDQo=