1. Defining malnutrition

1.1. Prerequisites

library(tidyverse)
library(zscorer)
library(readr)
library(dplyr)
library (lubridate)
library (ggplot2)
library (rmarkdown)
library(openxlsx)
library(writexl)
library(rstatix)
library(eeptools)
library(ggpubr)
library(readxl)
install.packages("BlandAltmanLeh")
G2;WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/g
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.6/BlandAltmanLeh_0.3.1.zip'
Content type 'application/zip' length 407426 bytes (397 KB)
downloaded 397 KB
package ‘BlandAltmanLeh’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\jader\AppData\Local\Temp\Rtmpm8sLw2\downloaded_packages
library(BlandAltmanLeh)
PSFI_df_malnutrition <- read_xlsx("Ben_cut_4_27.xlsx")
Sys.setenv(LANGUAGE = "en")

1.2. Anthroprometric analysis

# CREATE NEW CATEGORY THAT CALCULATES AGE IN YEARS BASED ON AGE IN DAYS
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 
# CREATES A SUMMARY OF CASES (ht=height, wt=weight, age_years= age in years, muac)
PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  select(ht, wt, age_years, muac) %>%
  summary()
       ht               wt          age_years             muac      
 Min.   : 20.00   Min.   : 3.20   Min.   : 0.08768   Min.   : 9.00  
 1st Qu.: 67.00   1st Qu.: 7.00   1st Qu.: 0.73436   1st Qu.:14.00  
 Median : 78.00   Median : 9.50   Median : 1.40141   Median :15.00  
 Mean   : 85.23   Mean   :12.17   Mean   : 2.83539   Mean   :15.38  
 3rd Qu.: 98.00   3rd Qu.:14.00   3rd Qu.: 3.49267   3rd Qu.:17.00  
 Max.   :192.00   Max.   :72.00   Max.   :14.92786   Max.   :27.00  
 NAs    :1                                           NAs    :2      
# CREATES A HISTOGRAM AND BOXPLOT OF HEIGHT (CASES)
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$ht[PSFI_df_malnutrition$case_control == 1] , 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[PSFI_df_malnutrition$case_control == 1]
     , breaks=40 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Height (cm)", xlim=c(0,200))

# CREATES A HISTOGRAM AND BOXPLOT OF WEIGHT (CASES)
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[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(0,75), 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[PSFI_df_malnutrition$case_control == 1]
     , breaks=40 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Weight (kg)", xlim=c(0,75))

# CREATES A HISTOGRAM AND BOXPLOT OF MUAC (CASES)
## BLUE LINE OUTLINES MODERATE MALNUTRITION (12.5cm)
## RED LINE OUTLINES SEVERE MALNUTRITION (11.5cm)
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[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(5,30), 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[PSFI_df_malnutrition$case_control == 1]
     , breaks=20 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Mid-upper arm circumference (cm)", xlim=c(5,30))
abline(v = 11.5, col = "red", lwd = 2, lty = 2)   # severe
abline(v = 12.5, col = "blue", lwd = 2, lty = 2)  # moderate

# HISTOGRAM AND BOXPLOT OF AGE (CASES)
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[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(0,15), 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[PSFI_df_malnutrition$case_control == 1], breaks=40 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Age (years)", xlim=c(0,15))

1.3. Z-scorer

# CREATES A NEW CATEGORY DEFINING SEX AS 1/2, INSTEAD OF 0/1 (NECESSARY FOR ZSCORER PACKAGE)
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 
# CREATES A NEW CATEGORY CALCULATING AGE IN MONTHS BASED ON AGE IN DAYS
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(age_months = age_days_exact / 30.4375)

summary(PSFI_df_malnutrition$age_months)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.052   9.501  19.864  36.942  48.021 179.134 
# CREATES A NEW CATEGORY (AGE<6M = 0, AGE 6M - 5J = 1, AGE > 5J = 2)
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    age_group = case_when(
      age_months < 6 ~ 0L,
      age_months >= 6 & age_years < 5 ~ 1L,
      age_years >= 5 ~ 2L,
      TRUE ~ NA_integer_
    )
  )
# ZSCORER PACKAGE CALCULATES ZSCORE OF WEIGHT FOR LENGTH (wflz), WEIGHT FOR AGE (wfaz), HEIGHT FOR AGE (hfaz), WEIGHT FOR HEIGHT (wfhz), BMI FOR AGE (baz)
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    wflz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "ht",
      index = "wfl"
    )$wflz,
    
    wfaz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "wt",
      secondPart = "age_days_exact",
      index = "wfa"
    )$wfaz,
    
    hfaz = addWGSR(
      data = .,
      sex = "sex_who",
      firstPart = "ht",
      secondPart = "age_days_exact",
      index = "hfa"
    )$hfaz,

    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
  )
===========================================================================================================================================
===========================================================================================================================================
===========================================================================================================================================
===========================================================================================================================================
===========================================================================================================================================
# ASSIGNS Z-SCORE TO MUAC BASED ON THE 11.5 & 12.5CM LIMITS, THIS IS A PROXY AS LATER A Z-SCORE OF 0 WILL EQUAL NO MALNUTRITION, <-2 WILL EQUAL MODERATE MALNUTRITION AND <-3 WILL EQUAL SEVERE MALNUTRITION
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_
    )
  )
# CREATE MALNUTRITION ZSCORE BASED ON MERGED WFHLZ, BAZ, MUACZ (to be defined later)
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    zscore_unified = case_when(
      age_group == 1 & ht >= 45 & ht < 65 ~ wflz,
      age_group == 1 & ht >= 65 & ht < 120 ~ wfhz,
      age_group == 1 & (ht < 45 | ht >= 120 | is.na(ht)) ~ muacz,
      age_group == 2 ~ baz,
      TRUE ~ NA_real_
    )
  )
# CREATE MALNUTRITION CATEGORY BASED ON PREVIOUS Z SCORE
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
    )
  )
# ADD A MALNUTRITION SOURCE CATEGORY SO WE KNOW WHICH ANTHROPOMETRIC MEASURE IS BEING USED TO DEFINE MALNUTRITION
PSFI_df_malnutrition <- PSFI_df_malnutrition %>%
  mutate(
    malnutrition_source = case_when(
      age_group == 1 & ht >= 45 & ht < 65  ~ "WFL",
      age_group == 1 & ht >= 65 & ht < 120 ~ "WFH",
      age_group == 1 & (ht < 45 | ht >= 120 | is.na(ht)) ~ "MUAC",
      age_group == 2 ~ "BFA",
      TRUE ~ NA_character_
    )
  )

1.4 Z score check

subset_wfaz <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  pull(wfaz)

# SUMMARY OF WEIGHT FOR AGE Z-SCORE (CASES)
summary(subset_wfaz)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.     NAs 
-7.5400 -2.3050 -0.9700 -1.0971  0.0475 10.2500      49 
# NUMBER OF CASES IN WEIGHT FOR AGE Z SCORE
length(subset_wfaz)
[1] 755
subset_wfaz1 <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(wfaz) %>%
  pull(wfaz)

# NUMBER OF OUTLIERS IN WEIGHT FOR AGE Z SCORE
length(subset_wfaz1)
[1] 10
subset_hfaz <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  pull(hfaz)

# SUMMARY OF HEIGHT FOR AGE Z SCORE (CASES)
summary(subset_hfaz)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.      NAs 
-18.2600  -2.8700  -1.1800  -0.9338   0.6350  44.5600        1 
# NUMBER OF CASES IN HEIGHT FOR AGE Z SCORE
length(subset_hfaz)
[1] 755
subset_hfaz1 <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(hfaz) %>%
  pull(hfaz)

# NUMBER OF OUTLIERS FOR HEIGHT FOR AGE Z SCORE
length(subset_hfaz1)
[1] 29
subset_wfhz <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  pull(wfhz)

# SUMMARY OF WEIGHT FOR HEIGHT Z SCORE (CASES)
summary(subset_wfhz)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.      NAs 
-10.5900  -2.2300  -0.5700  -0.4132   1.1875  42.7700       93 
# NUMBER OF CASES IN WEIGHT FOR HEIGHT Z SCORE
length(subset_wfhz)
[1] 755
subset_wfhz1 <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(wfhz) %>%
  pull(wfhz)

# NUMBER OF OUTLIERS IN WEIGHT FOR HEIGHT Z SCORE
length(subset_wfhz1)
[1] 20
subset_baz <- PSFI_df_malnutrition %>%
  filter(case_control == 1 & age_years >=2) %>%
  pull(baz)

# SUMMARY OF BMI FOR AGE Z SCORE (CASES)
summary(subset_baz)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.      NAs 
-12.5600  -2.1800  -0.7500  -0.6988   0.7100  32.6700        1 
# NUMBER OF CASES IN BMI FOR AGE Z SCORE
length(subset_baz)
[1] 302
subset_baz1 <- PSFI_df_malnutrition %>%
  filter(case_control == 1 & age_years >=2) %>%
  identify_outliers(baz) %>%
  pull(baz)

# NUMBER OF OUTLIERS IN BMI FOR AGE Z SCORE
length(subset_baz1)
[1] 17
subset_muac <- PSFI_df_malnutrition %>%
  filter(age_group == 1 & case_control == 1) %>%
  pull(muac)

# SUMMARY OF MUAC (CASES, 6-59 MONTHS)
summary(subset_muac)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.     NAs 
   9.00   14.00   15.00   15.02   16.00   23.00       2 
# NUMBER OF CASES IN MUAC
length(subset_muac)
[1] 535
subset_muac1 <- PSFI_df_malnutrition %>%
  filter(age_group == 1 & case_control == 1) %>%
  identify_outliers(muac) %>%
  pull(muac)

# NUMBER OF OUTLIERS IN MUAC
length(subset_muac1)
[1] 18
# CREATES BOXPLOT AND HISTOGRAM FOR WEIGHT FOR HEIGHT Z SCORE (CASES)
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$wfhz[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(-11,43), 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$wfhz[PSFI_df_malnutrition$case_control == 1]
     , breaks=50 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Weight-for-height (z-score)", xlim=c(-11,43))

# CREATES BOXPLOT AND HISTOGRAM OF WEIGHT FOR AGE (CASES)
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$wfaz[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(-8,11), 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$wfaz[PSFI_df_malnutrition$case_control == 1]
     , breaks=50 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Weight-for-age (z-score)", xlim=c(-8,11))

# CREATES BOXPLOT AND HISTOGRAM OF BMI FOR AGE (CASES)
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$baz[PSFI_df_malnutrition$case_control == 1 & PSFI_df_malnutrition$age_years >=2] , horizontal=TRUE , ylim=c(-13,33), 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$baz[PSFI_df_malnutrition$case_control == 1 & PSFI_df_malnutrition$age_years >=2]
     , breaks=50 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="BMI-for-age (z-score)", xlim=c(-13,33))

# CREATE BOXPLOT AND HISTOGRAM OF HEIGHT FOR AGE 
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$hfaz[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(-19,45), 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$hfaz[PSFI_df_malnutrition$case_control == 1]
     , breaks=50 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Height-for-age (z-score)", xlim=c(-19,45))

# CREATES HISTOGRAM AND BOXPLOT OF MUAC (CASES, 6-59 MONTHS)
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[PSFI_df_malnutrition$case_control == 1] , horizontal=TRUE , ylim=c(5,30), 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[PSFI_df_malnutrition$case_control == 1]
     , breaks=20 , col=rgb(1,0.8,0.8,1) , border=F , main="" , xlab="Mid-upper arm circumference (cm)", xlim=c(5,30))
abline(v = 11.5, col = "red", lwd = 2, lty = 2)   # severe
abline(v = 12.5, col = "blue", lwd = 2, lty = 2)  # moderate

# MAKES A TABLE OF OUTLIERS FOR WEIGHT FOR HEIGHT
wfhz_outliers <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(wfhz) %>%
  select(record_id, ht, wt, age_months, age_years, sex, wfhz, is.outlier, is.extreme)

wfhz_outliers
# MAKES A TABLE OF OUTLIERS FOR WEIGHT FOR AGE
wfaz_outliers <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(wfaz) %>%
  select(record_id,ht, wt, age_months, age_years, sex, wfaz, is.outlier, is.extreme)

wfaz_outliers
# MAKES A TABLE OF OUTLIERS FOR HEIGHT FOR AGE
hfaz_outliers <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  identify_outliers(hfaz) %>%
  select(record_id, ht, wt, age_months, age_years, sex, hfaz, is.outlier, is.extreme)

hfaz_outliers
# MAKES A TABLE OF OUTLIERS FOR BMI FOR AGE
baz_outliers <- PSFI_df_malnutrition %>%
  filter(case_control == 1 & age_years >=2) %>%
  identify_outliers(baz) %>%
  select(record_id, ht, wt, baz, age_months, age_years, sex, is.outlier, is.extreme)

baz_outliers
# MAKES A TABLE OF OUTLIERS FOR MUAC

muac_outliers <- PSFI_df_malnutrition %>%
  filter(age_group == 1 & case_control == 1) %>%
  identify_outliers(muac) %>%
  select(record_id, ht, wt, age_months, age_years, sex, muac, is.outlier, is.extreme)

muac_outliers
# CREATE A SUMMARY TABLE OF OUTLIER STATUS FOR ALL ANTHROPOMETRIC INDICATORS

anthro_outlier_summary <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  
  mutate(
        muac_outlier = if_else(
      age_group == 1,
      muac %in% (
        PSFI_df_malnutrition %>%
          filter(age_group == 1 & case_control == 1) %>%
          identify_outliers(muac) %>%
          filter(is.outlier) %>%
          pull(muac)
      ),
      FALSE
    ),
    hfaz_outlier = hfaz %in% (
      PSFI_df_malnutrition %>%
        filter(case_control == 1) %>%
        identify_outliers(hfaz) %>%
        filter(is.outlier) %>%
        pull(hfaz)
    ),
        wfaz_outlier = wfaz %in% (
      PSFI_df_malnutrition %>%
        filter(case_control == 1) %>%
        identify_outliers(wfaz) %>%
        filter(is.outlier) %>%
        pull(wfaz)
    ),
        wfhz_outlier = wfhz %in% (
      PSFI_df_malnutrition %>%
        filter(case_control == 1) %>%
        identify_outliers(wfhz) %>%
        filter(is.outlier) %>%
        pull(wfhz)
    ),
        baz_outlier = if_else(
      age_years >= 2,
      baz %in% (
        PSFI_df_malnutrition %>%
          filter(case_control == 1 & age_years >= 2) %>%
          identify_outliers(baz) %>%
          filter(is.outlier) %>%
          pull(baz)
      ),
      FALSE
    )
  ) %>%

  filter(
    muac_outlier |
    hfaz_outlier |
    wfaz_outlier |
    wfhz_outlier |
    baz_outlier
  ) %>%
  
  # select useful columns
  select(
    record_id,
    age_months,
    age_years,
    sex,
    ht,
    wt,
    
    muac,
    muac_outlier,
    
    hfaz,
    hfaz_outlier,
    
    wfaz,
    wfaz_outlier,
    
    wfhz,
    wfhz_outlier,
    
    baz,
    baz_outlier
  )

anthro_outlier_summary
# CREATES AN EXCEL FILE OF ALL OUTLIER TABLES
write.xlsx(
  list(
    WFHZ = wfhz_outliers,
    WFAZ = wfaz_outliers,
    HAZ = hfaz_outliers,
    MUAC = muac_outliers, 
    BAZ = baz_outliers, 
    SUMMARY = anthro_outlier_summary
  ),
  file = "anthropometric_outliers.xlsx"
)
# CREATE A TABLE OF ALL NA'S
na_table <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  mutate(
    hfaz_missing = is.na(hfaz),
    wfaz_missing  = is.na(wfaz),
    wfhz_missing = is.na(wfhz), 
    muac_missing = is.na (muac), 
    baz_missing = is.na (baz)
  ) %>%
  filter(hfaz_missing | wfaz_missing | wfhz_missing | baz_missing | muac_missing) %>%
  select(
    record_id,
    ht,
    wt,
    age_months,
    hfaz,
    wfaz,
    wfhz,
    baz,
    muac, 
    hfaz_missing,
    wfaz_missing,
    wfhz_missing, 
    baz_missing,
    muac_missing
  )

na_table
# CREATES A TABLE THAT SUMMARIZES MISSINGNESS AND OUTLIERS DEPENDING ON ANTHROPOMETRIC MEASURE
anthro_vars <- c("hfaz", "wfaz", "wfhz", "baz", "muac")

cases_df <- PSFI_df_malnutrition %>%
  filter(case_control == 1)

anthro_summary <- lapply(anthro_vars, function(var) {

  df_var <- cases_df %>%
    filter(
      case_when(
        var == "muac" ~ age_group == 1,
        var == "baz"  ~ age_years >= 2,
        TRUE ~ TRUE
      )
    )

  x <- df_var[[var]]

  outlier_info <- df_var %>%
    select(all_of(var)) %>%
    identify_outliers(!!sym(var))

  tibble(
    measure = var,
    n_eligible = nrow(df_var),
    n = sum(!is.na(x)),
    n_missing = sum(is.na(x)),
    pct_missing = round(mean(is.na(x)) * 100, 2),
    n_outliers = sum(outlier_info$is.outlier, na.rm = TRUE),
    n_extreme_outliers = sum(outlier_info$is.extreme, na.rm = TRUE)
  )

}) %>%
  bind_rows()

anthro_summary
# MAKES EXCEL TABLE OF na_table AND anthro_summary
write.xlsx(
  list(
    Missing = na_table,
    Summary = anthro_summary
  ),
  file = "NA.xlsx")

1.5 Data check

# COMPARES MISSINGNESS ACROSS SCOTT'S Z-SCORES AND MINE
summary_df <- PSFI_df_malnutrition %>%
  filter(case_control == 1)

missing_summary <- tibble(

  comparison = c(
    "Weight-for-height z-score",
    "Weight-for-age z-score",
    "BMI-for-age z-score"
  ),

  n_total = c(
    nrow(summary_df),
    nrow(summary_df),
    sum(summary_df$age_years >= 2, na.rm = TRUE)
  ),

  missing_scott = c(
    sum(is.na(summary_df$whz)),
    sum(is.na(summary_df$waz)),
    sum(is.na(summary_df$bmiz) & summary_df$age_years >= 2, na.rm = TRUE)
  ),

  missing_benjamin = c(
    sum(is.na(summary_df$wfhz)),
    sum(is.na(summary_df$wfaz)),
    sum(is.na(summary_df$baz) & summary_df$age_years >= 2, na.rm = TRUE)
  ),

  missing_either = c(
    sum(is.na(summary_df$whz) | is.na(summary_df$wfhz)),
    sum(is.na(summary_df$waz) | is.na(summary_df$wfaz)),
    sum(
      (is.na(summary_df$bmiz) | is.na(summary_df$baz)) &
      summary_df$age_years >= 2,
      na.rm = TRUE
    )
  )
)

missing_summary
# CREATES BLAND-ALTMAN PLOT FOR SCOTTS' Z-SCORES AND MY Z-SCORES TO ASSESS DIFFERENCE IN OUR MEASUREMENTS

ba_wfh <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  filter(!is.na(whz), !is.na(wfhz)) %>%
  mutate(
    mean_z = (whz + wfhz) / 2,
    diff_z = whz - wfhz
  )

mean_diff <- mean(ba_wfh$diff_z)
sd_diff <- sd(ba_wfh$diff_z)

upper <- mean_diff + 1.96 * sd_diff
lower <- mean_diff - 1.96 * sd_diff

ggplot(ba_wfh, aes(x = mean_z, y = diff_z)) +
  geom_point(alpha = 0.5) +
  geom_hline(yintercept = mean_diff) +
  geom_hline(yintercept = upper, linetype = "dashed") +
  geom_hline(yintercept = lower, linetype = "dashed") +
  theme_minimal() +
  labs(
    title = "Weight-for-height: WHZ (Scott) vs WFHZ (Benjamin)",
    x = "Mean of WHZ and WFHZ",
    y = "Difference (WHZ - WFHZ)"
  )


ba_wfa <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  filter(!is.na(waz), !is.na(wfaz)) %>%
  mutate(
    mean_z = (waz + wfaz) / 2,
    diff_z = waz - wfaz
  )

mean_diff <- mean(ba_wfa$diff_z)
sd_diff <- sd(ba_wfa$diff_z)

upper <- mean_diff + 1.96 * sd_diff
lower <- mean_diff - 1.96 * sd_diff

ggplot(ba_wfa, aes(x = mean_z, y = diff_z)) +
  geom_point(alpha = 0.5) +
  geom_hline(yintercept = mean_diff) +
  geom_hline(yintercept = upper, linetype = "dashed") +
  geom_hline(yintercept = lower, linetype = "dashed") +
  theme_minimal() +
  labs(
    title = "Weight-for-age: WAZ (Scott) vs WFAZ (Benjamin)",
    x = "Mean of WAZ and WFAZ",
    y = "Difference (WAZ - WFAZ)"
  )


ba_baz <- PSFI_df_malnutrition %>%
  filter(case_control == 1 & age_years >=2) %>%
  filter(!is.na(bmiz), !is.na(baz)) %>%
  mutate(
    mean_z = (bmiz + baz) / 2,
    diff_z = bmiz - baz
  )

mean_diff <- mean(ba_baz$diff_z)
sd_diff <- sd(ba_baz$diff_z)

upper <- mean_diff + 1.96 * sd_diff
lower <- mean_diff - 1.96 * sd_diff

ggplot(ba_baz, aes(x = mean_z, y = diff_z)) +
  geom_point(alpha = 0.5) +
  geom_hline(yintercept = mean_diff) +
  geom_hline(yintercept = upper, linetype = "dashed") +
  geom_hline(yintercept = lower, linetype = "dashed") +
  theme_minimal() +
  labs(
    title = "BMI-for-age: BMIZ (Scott) vs BAZ (Benjamin)",
    x = "Mean of BMIZ and BAZ",
    y = "Difference (BMIZ - BAZ)"
  )

# CACLULATE MEAN DIFF AND CI 
ba_wfh <- PSFI_df_malnutrition %>%
  filter(case_control == 1, !is.na(whz), !is.na(wfhz))

bland.altman.stats(ba_wfh$whz, ba_wfh$wfhz)
$means
  [1]  -3.605445900  -3.488783450   2.439143850   1.267518250  -2.371564500  -2.321934250  -0.810732720   1.479451100   0.138198815
 [10]  -3.102076450   0.019295239  -2.628788300  -0.269554685  -0.973560270  -1.489720200  -1.502515250  -6.208495650   5.811026700
 [19]  -0.751110880   0.654646580  -3.070565950   1.620603450  -3.229475850  -1.029242650  -3.480320650  -1.511210500  10.814884150
 [28]  -0.630703305   3.797156400  -9.168009500   0.730485580  -3.966774050   1.427691700   2.188690650  -1.343790200   2.440360400
 [37]  -1.391675000   4.068104550   0.270611415  -5.612664850   2.957602500  -1.604430300  -0.385379310  -1.389025800  -3.355513850
 [46]  -3.960038000  -2.321623250  -2.577757050  -2.958679550   0.586913350  -5.098576650   0.640798190   2.679082350  -0.288762330
 [55]  -1.841541550  -2.110378100  -0.458781610  -7.641231750  -0.530507815  -7.316259700   2.650666750  -0.630703305   0.850440820
 [64]  -1.716355750  -1.437453150  -1.480461850  -0.857888570   1.311412000  -0.298176400  -1.580735050   2.278830650  -3.737506750
 [73]  -3.125076350  -1.723696000  -1.747956650   2.510750650   4.370479550   1.402039800  -2.140004100   0.339955995   1.478532600
 [82]   0.238109440   1.328299850  -0.380465255  -2.613721100  -0.458781610   1.308976400  -0.810732720  -4.344589350  -1.619270450
 [91]  -7.825877250  -3.582077550   4.431358600   2.879932800   7.095248200   1.560975350  -0.439019010  -1.841541550   1.878539550
[100]  -1.140028950   0.428720115  -3.227388000  -0.217198085  -4.922542200  29.140714000  -1.861673400  -8.708176100  -3.412840100
[109]  -1.580735050  -2.650990300   0.420754355   2.009409800   0.233613420  -2.249018550   0.402137975   1.700302400   4.111547300
[118]   2.921231250  -4.835218200   2.977385950   4.135959950  -2.978071700  -0.973560270  -5.206489300  -1.067820900   1.174528950
[127]  -0.451974175   0.444851245   0.529217825  -1.099916850  -0.529031915  -1.611205550  -3.671109600   1.451130800   1.513296600
[136]   0.049837973  -3.581829800  -4.558167500   0.978331825   3.504880300   1.640680450   3.114165850   1.008837900   0.338038265
[145]  -1.732454900   0.402335475   1.339544000   1.228660950   2.895760950   0.750892935  -1.732454900   0.539495190  -2.311810400
[154]  -0.042089251  -7.261357850   1.030466150   2.122472200  -0.816514980  -2.570313950  -3.207163000  -1.391675000  -1.542286050
[163]  -2.909863300  -4.580637200   0.178115925  -0.080683912   0.721350060  -0.608532780  -6.270526850  -1.000748850  -1.208162300
[172]  -2.140004100  -6.027845400  -1.140408450  -0.740779075   0.361390805   0.049837973   1.091234050  -6.071291650   1.540820200
[181]   5.585989250  -1.730213750  -5.882064350  -6.984400100   0.021903755  -2.321934250  -2.674345400  -3.827998800  -2.554303250
[190]  -3.698397650  -4.922542200  -0.089808277  -5.585275100   1.054949950  -2.504464200   4.515932250   0.482041530  -1.029242650
[199]  -0.392374435   3.098194050  -5.266718600  -0.467415440 -13.773105500  -2.950516250  -5.373898600  -3.388659950  -2.830741600
[208]  -5.329690650  -2.402209250  -7.164492350   1.791588750  -0.857888570  -1.877921400  -0.269617270  -6.325081700  -2.231256100
[217]  -1.321224400  -8.878845100   1.095828700  -0.849684880  -5.378911000   0.912055895   0.040662067  -1.702454000   1.628788000
[226]  -1.480461850  -5.266718600  -1.982036000   2.743102650   2.665021600  -4.078937300  -3.966774050  -2.658411700  -0.694610220
[235]  -2.418683650   1.311412000  -2.009895500  -2.440995300  -2.409759950   1.791588750   4.538283800  -2.304806200  -1.475040750
[244]   2.879938650   1.217814200  -1.990349050  -2.400372100  -1.439589650   0.912055895   1.970626750   1.478532600  -4.103004700
[253]   0.850586730   0.233613420  -0.979932240   1.118957300  -3.018650200   1.309299550  -2.593147600  -6.262337900   1.507333200
[262]   3.748610150  -0.458781610  -0.568736140   1.932088400  -3.033296850   5.994338800   4.166311500  -0.931092200  -3.999351450
[271]  -1.851626850  -1.869831300   0.388569720  -0.661093280  -1.297035400   0.640798190   2.508052700   0.918884060  -0.661093280
[280]  -1.297035400  -8.391170750   3.750956900  -0.317924175   0.489557940  -2.231256100   1.468012100  -0.499220460  -3.229475850
[289]  -0.979932240  -1.088938150  -3.032471550  -1.353259150  -1.297035400  -1.279515400  -0.549191915   1.562281000   1.147676650
[298]  -0.292254795  -0.090522924  -0.629145865   0.120804660  -0.912572825   1.451130800  -0.629145865  -5.065649750   0.621610280
[307]   1.259420200   0.699920660  -1.500309750  -1.132087000  -0.781791640  -5.987664900  -1.270950100  -0.443499590  -2.613007500
[316]   0.798143170  -0.549191915   0.049837973   0.798143170   3.067291400  -2.236626200  -2.409759950  -0.648613765  -1.161849200
[325]  -2.318603200  -0.408859880   2.022092850  -1.130378800  -5.093157000   0.079012313  -4.782737550   0.869165565   0.417533985
[334]   1.507333200   0.950522160  -0.190856795   3.115070400  -1.877921400   0.818404470   1.421452600   1.228660950   0.066632200
[343]  -4.634414250  -0.211327080  -2.562283450   1.180810400  -3.081438800  -0.810732720  -5.036577500  -3.576673650  -0.877744915
[352]  -3.599990750   1.058282350  -3.102076450  -2.950067750   2.699937900   0.230497990   0.441340805   3.581538200   1.478532600
[361]   0.391863785  -1.315223050  -5.987664900   2.821296250  -2.692131600  -0.467415440  -2.381394550   1.420635500   1.970626750
[370]  -1.798774450  -3.113388250   0.895728675   0.978074330   2.921231250  -0.661093280  -0.729815650   1.451130800  -1.861673400
[379]   3.201842300  -1.510117550  -1.987667750  -0.730086255  -0.221647500   0.747936755  -2.418245300   1.932088400  -2.071710500
[388]  -0.949740535   2.511125700   0.381166160   1.218961700  -0.317924175   3.748610150   0.444851245   1.627499950   0.609413170
[397]   1.289043450  -1.401283100   1.719337850  -0.962101530   1.749893000   2.051749350  -0.100227427  -1.050803100   2.237533550
[406]   8.598023300  -0.322488775  -3.227388000   1.451130800  -2.831783350  -0.170787645   2.619483050  -0.760930720   1.852098400
[415]   4.135556800  -2.402209250  -5.987664900   2.250818750   2.999700650   5.445005400   1.147930650   2.767334300  -4.371986700
[424]   2.091036950  -1.671208400   2.430357300  -2.617866800  -3.585674450  -1.299441300  -1.812354750   1.089740800   1.828659950
[433]  -0.865522775   3.097397250  11.537046200   7.914286550   1.778187150   7.159543900   2.448303900  -0.290552380   2.531168950
[442]  -0.452313610   9.315947300  -2.570313950   8.898930450  -2.321623250  -0.811685860   1.149872800   0.758393710   2.531168950
[451]   6.353862050   2.132172550   4.823069550   0.402335475   2.439143850   0.548304135  -1.110352150  -4.386605200   4.424898500
[460]  -2.411172750  -4.812188850  -3.744434150  -0.978614350  -2.992883600  -2.852325750   0.977797230   0.808422205  -1.951208500
[469]   3.875309900  -1.520197700  -1.401298100   1.891884050   0.008662369   1.301315450   1.144866900  -3.677478200  -0.889447160
[478]  -0.857888570   0.798143170   4.466554550   0.621610280   3.577596250   1.059976950  -0.273423385   0.798143170  -1.029242650
[487]  -2.700572100  -2.978071700   0.079012313  -3.931450200  -4.053061900   0.268100925  -0.120190215  -1.175229500  -1.930434600
[496]  -0.352148090  -1.421879750   8.557303250  -1.562060800  -1.040012550  -1.299587800  -3.814904750   0.501168935   0.360329040
[505]  -0.630703305  -1.840321500  -0.968004240   0.049837973  -1.841541550  -5.752892350  -1.611205550   0.798178280   3.507480400
[514]   1.228039200   1.540820200   4.368248550  -0.857888570  -2.401232300  -0.381964805  -2.300993250  -0.013780327   5.661159850
[523]  -1.942339000  -0.260534035   4.368248550   0.992438580   0.189438290  -1.391675000   2.448835600  -3.677478200  -1.341393700
[532]  -0.390008530  -0.230081795  -2.163587800   0.300735470   2.067915250   1.419812800   1.074134000  -0.089059541  -2.402033900
[541]  -0.292254795  -0.980103185  -1.049230695  -6.027845400  -0.499519765  -2.088316150   1.308523700  -1.358265200   0.060410142
[550]  -0.805803545  -0.575809170  -1.716355750  -0.390008530  -2.870621750  -1.953278950   1.569661650   2.679082350  -2.899061400
[559]  -2.402209250   2.448303900   2.302377250  -2.607836650  -5.649663800  -4.734601200   1.728368350   1.774017000  -1.438459500
[568]   1.247536000  -1.063901580  -0.874100425   1.818120700  -1.030292650  -1.029242650  -0.865522775  -3.224903700   3.612140600
[577]   2.379918650   1.289043450   1.839949300  -0.816514980   1.735155550   0.611922645  -3.220219450  -1.819653500  -3.850708850
[586]   0.040662067  -2.231256100  -1.161849200   1.990043600   1.421452600   1.659446150  -0.450813080  -2.287649900   0.227413560
[595]  -3.605445900   0.462078120   0.182067830   0.268100925   0.367552865   2.245474400   3.077738700  -2.039070400   2.701050600
[604]   0.444658070   2.049264200   2.448303900   7.346236650  -1.000748850  -3.343727750   1.050874900   0.760397470  -0.816514980
[613]  -3.404069500  -1.447523550  -6.048216550   1.759816300  -0.771403950   0.361390805   0.270611415  -3.271023400  -2.600894400
[622]  -0.203013375  -7.678023700   0.950522160  -5.583467900  -4.308483850  -4.881145400  -1.282258950  -5.486515450  -5.347951500
[631]  -1.063901580  -0.408859880   1.139583550   0.528282270

$diffs
  [1]  -0.050891800  -0.037566900  -0.001712300  -0.004963500   0.156871000  -0.003868500  -0.001465440  -0.001097800  -0.003602370
 [10]  -0.004152900  -0.001409522   0.002423400   0.000890630   0.152879460   0.000559600   0.154969500  -0.716991300  -0.437946600
 [19]  -0.002221760   0.169293160  -0.001131900   0.001206900  -0.018951700   0.001514700  -0.040641300   0.157579000  -4.130231700
 [28]  -0.001406610  -0.085687200  -2.356019000   0.000971160  -0.113548100  -0.004616600  -0.002618700   0.152419600   0.000720800
 [37]  -0.003350000  -0.143790900   0.001222830  -0.545329700  -0.004795000   0.151139400   0.149241380   0.001948400  -0.031027700
 [46]  -0.100076000  -0.003246500   0.004485900   0.002640900   0.153826700  -0.337153300   0.001596380  -0.001835300   0.162475340
 [55]  -0.003083100  -0.000756200   0.002436780  -1.402463500  -0.001015630  -1.272519400   0.141333500  -0.001406610   0.000881640
 [64]   0.147288500   0.185093700  -0.000923700   0.004222860   0.002824000   0.143647200  -0.001470100  -0.002338700   0.084986500
 [73]  -0.010152700   0.152608000   0.004086700   0.001501300  -0.219040900   0.004079600  -0.000008200   0.139911990  -0.002934800
 [82]  -0.003781120  -0.003400300  -0.000930510   0.152557800   0.002436780  -0.002047200  -0.001465440  -0.169178700   0.001459100
 [91]  -1.491754500  -0.044155100  -0.217282800  -0.000134400  -1.229503600   0.001950700   0.001961980  -0.003083100  -0.002920900
[100]  -0.000057900  -0.002559770  -0.014776000   0.145603830  -0.325084400 -27.258572000  -0.003346800  -2.156352200  -0.025680200
[109]  -0.001470100  -0.001980600   0.161508710  -0.001180400   0.147226840   0.001962900   0.004275950   0.000604800  -0.016905400
[118]   0.002462500  -0.130436400   0.134771900  -0.168080100   0.003856600   0.152879460  -0.412978600   0.004358200   0.149057900
[127]  -0.003948350   0.149702490  -0.001564350   0.000166300   0.001936170  -0.002411100  -0.062219200   0.002261600   0.146593200
[136]  -0.000324055  -0.043659600  -0.036335000  -0.003336350  -0.050239400   0.001360900  -0.011668300  -0.002324200  -0.003923470
[145]   0.155090200   0.004670950  -0.000912000  -0.002678100   0.151521900   0.001785870   0.155090200  -0.001009620  -0.003620800
[154]  -0.004178501  -1.202715700   0.000932300   0.004944400   0.166970040  -0.000627900   0.165674000  -0.003350000  -0.004572100
[163]   0.000273400  -0.241274400  -0.003768150   0.178632176   0.002700120   0.002934440  -0.741053700  -0.001497700   0.003675400
[172]  -0.000008200  -0.475690800  -0.000816900   0.158441850   0.142781610  -0.000324055   0.002468100  -0.722583300   0.001640400
[181]  -0.448021500  -0.000427500  -0.644128700  -1.148800200   0.003807509  -0.003868500   0.171309200  -0.075997600   0.171393500
[190]   0.083204700  -0.325084400   0.140383446  -0.490550200   0.149899900   0.151071600  -0.228135500   0.004083060   0.001514700
[199]  -0.004748870  -0.003611900  -0.193437200   0.145169120  -6.366211000   0.178967500  -0.427797200   0.122680100   0.158516800
[208]  -0.279381300  -0.004418500  -0.948984700   0.003177500   0.004222860   0.004157200   0.000765460  -0.710163400  -0.002512200
[217]  -0.002448800  -2.157690200   0.151657400   0.000630240  -0.337822000   0.004111790   0.001324135  -0.004908000  -0.002424000
[226]  -0.000923700  -0.193437200   0.155928000   0.146205300   0.150043200  -0.117874600  -0.113548100   0.003176600   0.150779560
[235]   0.162632700   0.002824000   0.160209000  -0.001990600   0.000480100   0.003177500  -0.263432400   0.170387600   0.169918500
[244]  -0.000122700  -0.004371600  -0.000698100  -0.000744200   0.000820700   0.004111790   0.001253500  -0.002934800  -0.126009400
[253]   0.001173460   0.147226840   0.000135520  -0.002085400   0.002699600  -0.001400900   0.153704800  -0.564675800   0.154666400
[262]  -0.082779700   0.002436780   0.002527720   0.004176800  -0.006593700  -0.791322400  -0.167377000  -0.002184400  -0.118702900
[271]   0.156746300   0.000337400  -0.002860560  -0.002186560   0.145929200   0.001596380  -0.003894600  -0.002231880  -0.002186560
[280]   0.145929200  -1.822341500  -0.078086200   0.004151650   0.159115880  -0.002512200  -0.003975800   0.001559080  -0.018951700
[289]   0.000135520   0.002123700  -0.004943100   0.153481700   0.145929200   0.160969200   0.001616170   0.004562000  -0.004646700
[298]  -0.004509590  -0.001045849   0.001708270   0.001609320   0.154854350   0.002261600   0.001708270  -0.211299500   0.003220560
[307]   0.138840400  -0.000158680  -0.000619500  -0.004174000  -0.003583280  -0.635329800  -0.001900200   0.153000820   0.153985000
[316]  -0.003713660   0.001616170  -0.000324055  -0.003713660  -0.005417200   0.146747600   0.000480100   0.002772470  -0.003698400
[325]   0.002793600   0.002280240   0.004185700  -0.000757600  -0.386314000  -0.001975374  -0.285475100  -0.001668870  -0.004932030
[334]   0.154666400   0.001044320  -0.001713590  -0.009859200   0.004157200  -0.003191060   0.002905200  -0.002678100   0.153264400
[343]  -0.108828500   0.157345840  -0.004566900   0.001620800  -0.002877600  -0.001465440  -0.333155000  -0.053347300   0.004510170
[352]  -0.059981500  -0.003435300  -0.004152900  -0.000135500  -0.000124200   0.000995980   0.002681610   0.103076400  -0.002934800
[361]   0.003727570   0.149553900  -0.635329800   0.002592500  -0.004263200   0.145169120  -0.002789100   0.001271000   0.001253500
[370]   0.002451100  -0.006776500   0.171457350  -0.003851340   0.002462500  -0.002186560   0.000368700   0.002261600  -0.003346800
[379]  -0.016315400  -0.000235100   0.004664500  -0.000172510  -0.003295000  -0.004126490   0.003509400   0.004176800  -0.003421000
[388]   0.000518930   0.002251400   0.002332320  -0.002076600   0.004151650  -0.082779700   0.149702490  -0.005000100  -0.001173660
[397]   0.158086900  -0.002566200  -0.001324300  -0.004203060  -0.000214000   0.003498700   0.159545146  -0.001606200  -0.004932900
[406]  -2.323953400  -0.004977550  -0.014776000   0.002261600   0.156433300  -0.001575290  -0.001033900  -0.001861440   0.004196800
[415]  -0.168886400  -0.004418500  -0.635329800   0.001637500  -0.000598700  -0.529989200  -0.004138700   0.134668600  -0.043973400
[424]   0.002073900  -0.002416800   0.000714600   0.004266400  -0.051348900   0.001117400  -0.004709500  -0.000518400  -0.002680100
[433]   0.148954450  -0.005205500  -4.465907600  -1.851426900  -0.003625700  -1.240912200   0.156607800  -0.001104760   0.002337900
[442]  -0.004627220  -2.828105400  -0.000627900  -2.262139100  -0.003246500  -0.003371720  -0.000254400  -0.003212580   0.002337900
[451]  -0.832275900   0.004345100  -0.193860900   0.004670950  -0.001712300  -0.003391730   0.159295700  -0.053210400  -0.210203000
[460]   0.197654500  -0.164377700   0.071131700   0.002771300   0.154232800  -0.004651500  -0.004405540  -0.003155590   0.157583000
[469]  -0.109380200  -0.000395400   0.157403800   0.003768100   0.157324739   0.002630900   0.149733800   0.105043600   0.001105680
[478]   0.004222860  -0.003713660  -0.246890900   0.003220560  -0.064807500  -0.000046100   0.153153230  -0.003713660   0.001514700
[487]  -0.001144200   0.003856600  -0.001975374   0.037099600   0.073876200  -0.003798150  -0.000380430   0.189541000  -0.000869200
[496]  -0.004296180  -0.003759500  -2.085393500   0.155878400  -0.000025100   0.000824400   0.070190500   0.002337870   0.000658080
[505]  -0.001406610   0.159357000   0.003991520  -0.000324055  -0.003083100  -0.605784700  -0.002411100  -0.003643440  -0.045039200
[514]  -0.003921600   0.001640400  -0.203502900   0.004222860  -0.002464600  -0.003929610   0.178013500   0.152439345  -0.617680300
[523]   0.175322000   0.138931930  -0.203502900   0.004877160   0.158876580  -0.003350000  -0.002328800   0.105043600  -0.002787400
[532]  -0.000017060  -0.000163590   0.152824400   0.001470940  -0.004169500  -0.000374400   0.148268000   0.001880918   0.155932200
[541]  -0.004509590  -0.000206370   0.161538610  -0.475690800   0.000960470   0.003367700  -0.002952600   0.003469600   0.000820285
[550]   0.168392910   0.168381660   0.147288500  -0.000017060  -0.001243500   0.153442100  -0.000676700  -0.001835300   0.001877200
[559]  -0.004418500   0.156607800   0.004754500   0.004326700  -0.359327600  -0.249202400  -0.003263300   0.168034000   0.003081000
[568]  -0.004928000   0.152196840   0.151799150  -0.003758600  -0.000585300   0.001514700   0.148954450  -0.009807400  -0.055718800
[577]  -0.000162700   0.158086900  -0.000101400   0.166970040   0.150311100   0.003845290  -0.020438900   0.000693000  -0.081417700
[586]   0.001324135  -0.002512200  -0.003698400   0.000087200   0.002905200  -0.001107700   0.138373840   0.004700200   0.154827120
[595]  -0.050891800   0.004156240   0.164135660  -0.003798150   0.155105730   0.130948800  -0.004522600   0.001859200   0.002101200
[604]   0.149316140   0.138528400   0.156607800  -1.487526700  -0.001497700  -0.027455500   0.001749800   0.000794940   0.166970040
[613]  -0.028139000   0.004952900  -0.716433100  -0.000367400  -0.002807900   0.142781610   0.001222830  -0.022046800  -0.001788800
[622]   0.173973250  -1.416047400   0.001044320  -0.406935800  -0.156967700  -0.122290800  -0.004517900  -0.333030900  -0.415903000
[631]   0.152196840   0.002280240  -0.000832900  -0.003435460

$groups

$based.on
[1] 634

$lower.limit
[1] -2.445097

$mean.diffs
[1] -0.1264553

$upper.limit
[1] 2.192186

$lines
lower.limit  mean.diffs upper.limit 
 -2.4450968  -0.1264553   2.1921862 

$CI.lines
lower.limit.ci.lower lower.limit.ci.upper   mean.diff.ci.lower   mean.diff.ci.upper upper.limit.ci.lower upper.limit.ci.upper 
         -2.60489536          -2.28529828          -0.21871505          -0.03419559           2.03238764           2.35198472 

$two
[1] 1.96

$critical.diff
[1] 2.318641
ba_wfa <- PSFI_df_malnutrition %>%
  filter(case_control == 1, !is.na(waz), !is.na(wfaz))

bland.altman.stats(ba_wfa$waz, ba_wfa$wfaz)
$means
  [1] -3.116473850 -2.518940100 -0.531856555  0.220168515 -0.499548810 -1.199636600 -0.370679585 -3.248427500 -0.617832925 -3.575614600
 [11] -2.137014350 -3.665235250 -0.414055920 -2.359610150 -1.880300400 -1.901312050 -5.516068000 -1.576399050 -0.180120075 -1.524588900
 [21]  0.918708135 -2.708950600  1.153719300 -2.217808250 -6.054785700 -2.655139050 -3.593705550  0.151858445  2.718499400 -1.889994650
 [31] -1.411957200  1.251132600 -7.656578350 -0.119144045 -4.091622250  0.380518125  0.241357015 -1.091128700  0.228198640  0.964102250
 [41] -1.377591650  2.358227400 -1.682769100 -5.710771350  1.451046800 -0.780313625 -0.088078515  0.100272155 -4.890344850 -4.657062150
 [51] -5.093215050 -1.108758900 -4.367212650 -3.596248900 -2.930396400 -3.044005050  1.219871700  0.461999115  0.150183420 -0.079325655
 [61]  0.918914340  0.739850220 -3.870141900 -2.210916500 -0.008379305 -1.850973100 -2.203136300 -1.487959550 -4.858611700 -0.238673785
 [71] -1.661142050 -1.300825150  0.548992480 -1.550641200  1.461874600 -2.312736300 -1.650860150 -1.380781950 -1.400412250 -1.559899400
 [81] -0.020167951 -0.009465915  2.429252450 -2.521883950 -2.770610100 -2.611169750 -0.260904780 -2.391890350 -1.028390600  0.788953325
 [91]  0.541587520 -1.492168300 -4.068876050  0.721278505 -3.560278900 -1.170166450 -0.450987675 -1.420555550 -1.202284500 -2.521430050
[101] -3.608457700 -2.110422650 -3.238140200 -2.478582750 -5.850438600 -0.850264955 -1.737381700 -2.549403550 -4.768705300  0.290742165
[111]  0.467450100 -2.457683400  0.231999505 -0.907120545  1.539493600 -1.628773100 -0.449585220 -3.812017900 -0.258950015 -3.123695450
[121] -3.975976450 -2.371564800 -0.069601894 -0.619954970 -2.632311900 -0.856610945  0.341705380 -0.178568785 -2.987438800 -0.259112735
[131] -2.210781550 -0.539055395  2.739756950 -5.331145050  2.612203650 -1.337309450 -3.501340500 -0.877905400 -3.021201250  0.018003906
[141] -0.061527448  1.043737500  0.530122145  2.008414650 -0.430444865 -0.838883175 -1.349970650 -0.634129945 -2.319073350 -2.515950100
[151] -1.108766250 -0.451210965  0.060640421 -3.668769050 -3.631757800 -0.246603780 -1.079121950 -3.144303500 -0.127024375 -0.299199680
[161]  1.668341600 -0.371249720 -2.029375200 -1.706133100  0.017043458  0.732344260  2.167700600 -1.228748800 -1.190597800 -1.977619750
[171]  3.278131500 -2.926208100 -2.837500600  0.448727255 -1.138411100  0.730475745  1.911720300  0.391747020 -3.719496450 -0.387653390
[181] -0.342618495 -1.849131450 -0.879276845 -1.677588800 -3.215758200 -2.682600100 -2.711924900 -1.499710200  1.451566450 -1.489541250
[191] -1.036792050  0.671663840 -4.054000150 -2.254390250 -2.404940800 -0.062554235 -3.621935750 -2.698748550 -1.221913750  0.412957060
[201] -0.880408530 -2.439422600  2.199590200 -1.782231300 -1.118095550 -1.260778050 -0.821956400 -0.426176930 -0.031519408 -2.879782150
[211] -1.280757200 -4.140901700 -0.839496090 -1.708052550 -3.243116750 -1.460013350 -2.738086350 -0.900499980 -3.418953950  1.130270850
[221]  0.047610804  0.729831805 -0.489728355 -0.566873615 -0.639563715  1.063155800 -1.530780550 -0.806841165 -8.812559000 -0.156707495
[231] -1.839359200 -3.595294650 -0.529336675 -2.558798800 -0.541148475 -1.030396600 -3.461170650 -1.059835500 -1.760776000 -5.609973200
[241] -0.769107380 -1.829670850 -4.154876000 -0.460009930 -7.161116500 -0.827550180  0.632633150 -1.340056200 -0.821252290 -0.307448280
[251] -0.779346240 -0.030106660  1.008727900 -0.617468505 -1.429971850 -2.901194400 -1.897622950  3.471180800  1.597462150 -5.385782750
[261] -3.777317150 -1.710466350 -1.191276300 -1.542825850 -3.724117250 -1.851062100 -1.549151750 -1.291094000 -1.606450950  1.585650300
[271]  1.522327150  0.801669950 -0.421245490 -0.487390035  3.692933100  3.127564350 -1.544430050 -2.610140250  0.158391685 -0.249900430
[281] -2.002525800 -0.450192740  1.350773100 -5.055116850  2.989662150 -0.754197750  0.458794215 -1.320394200  1.803357450 -4.337238650
[291] -0.368930310 -0.658462215  1.090802250 -3.512559900 -0.729626915  0.148266655 -1.561995100 -0.588452320 -0.187416785 -0.831656525
[301] -5.361693800  0.600626130 -2.750229950 -0.716428355 -2.862535400  0.041598764 -2.376738600 -0.083816369  0.483710295 -0.808317185
[311]  0.811367270  0.119911820 -2.928352300 -0.950135090 -1.747161200 -2.288194300 -2.578694250  0.859443210 -2.458694100  0.023099960
[321] -4.039680450  0.412933260  0.890721180 -2.220254050  0.249637485 -3.116356300 -3.549238550 -1.907977800 -1.498452550 -2.088483850
[331] -0.829471745  1.960492400  1.089070600 -3.158657250 -1.731109450 -3.256016950 -2.767368700  0.551003270 -0.691668245 -0.888421395
[341] -2.768028150 -3.376259600  0.300860550 -0.521385115 -2.618238250 -2.515407900 -0.290222155 -4.835332000 -0.219704800 -3.959506850
[351] -1.642418850 -0.820174550 -1.689715950 -1.209784150 -0.162950675  0.277824415 -0.565832290 -0.851183105  3.598751350  9.072235600
[361] -0.521494635 -2.580288200  0.049370086 -0.590049160  0.430286955  0.040797335 -1.017034950 -0.587675855  2.035786550 -1.241292100
[371] -5.096265150 -1.336614750 -4.602859100  0.580308505  1.187703600 -0.022127967 -4.428465150  2.050971650 -2.213248950  1.416628000
[381] -2.546249400  0.881341130  0.442014530 -1.772749600  0.960555655  0.339623880  0.540952195  0.412152275 -6.159179800  0.789241450
[391] -2.975373150 -1.070603800 -5.679970950 -1.517031500 -0.500882955 -1.442768050  0.186962120 -5.005421300 -2.080010950  1.541974900
[401] -2.770381950 -0.996896030 -0.221947320  3.764110250 -1.829429500  0.712743355 -3.686626250 -1.108022200 -4.671416650 -1.390113550
[411] -4.129297050 -1.409126200 -0.470586750 -1.799728650  1.201217850 -2.438406900 -2.002732650  1.297678950 -1.740388850  0.771758625
[421]  2.781292550 -0.009232445 -1.342399900 -1.039523450 -1.530213550  1.320687850 -1.330367550 -6.052032550 -2.895197100 -0.958523580
[431] -1.441842900 -1.949618600  1.620638800 -1.549517000 -0.839840425  1.080404000 -2.371121450 -0.100707580 -0.913151460 -6.477586600
[441] -1.748169800  0.736524490 -3.834731850  0.171812680 -2.508084400  0.769515525 -4.971036050 -0.303415335  0.338222530  0.007605564
[451] -2.770880600  0.569103570 -1.498121400 -5.157645100 -5.331661600 -0.378457815 -3.723643050  0.481787700 -0.409569370  0.356369695
[461] -1.142060400  0.112692965  0.250412345 -1.449186800 -4.099744800  0.678316200 -0.190166365 -1.675658850 -1.159693100 -0.022479127
[471] -1.148116650 -3.134650300 -0.445764170 -2.946214050 -0.859013135  0.419700210 -1.651613500  0.329005310 -0.777632400 -4.851798350
[481] -1.900498350  0.819786610  3.435924500  0.718939620 -1.391488850  0.980878940 -0.687725100  1.999449150 -2.247226850  0.028494449
[491] -1.681344250 -1.189059000 -0.609409740 -2.208798400 -0.961078955 -3.113369750 -0.879624905 -3.402750300 -1.301126700 -0.019816294
[501]  1.026875500  2.860641900  1.380579550 -2.200040550  2.009777200 -3.978455500 -2.599759150 -1.030135050 -3.136928000 -2.660416450
[511]  0.523474375 -0.649509620 -1.711853450 -4.207625450 -1.157692100 -1.437360950  1.695795500 -3.424169750 -1.077833000  0.024828300
[521] -0.281646845 -1.328150350 -0.659593835 -1.180522650 -1.509117250 -0.456834445 -0.789805400  1.494081900  1.370826250 -1.809963300
[531]  0.123567115 -1.696786800  0.368501645 -0.179370175 -1.098544250  0.228358515  0.919675760 -0.457454335 -2.931191750 -1.087012550
[541] -3.062612700 -2.696525900 -5.520356500  0.359550690 -0.818412010 -2.431679450  1.170457200 -3.515268700 -2.170511350 -1.049226350
[551]  0.130290945 -0.299644435  0.237098710 -1.329966500 -0.267049725 -1.703493450 -1.157323950 -0.749092460 -0.408019915 -0.799347605
[561]  0.232906885 -3.669187850 -0.058646886 -1.551697650 -6.074182200 -0.549455100  1.370259400  0.287345430 -0.238577505 -0.015384553
[571]  1.879072500 -1.403730900 -1.082711700  1.369403250 -4.696582250 -2.689090950 -0.318878685 -1.412206800 -0.163301510 -0.910073715
[581] -1.090343700 -1.747346050 -1.530527750 -0.640189955  0.360937305 -2.639288250 -1.089342450 -0.459727595 -1.709594000 -2.189123250
[591] -2.872572950 -1.238641400 -0.306212650 -2.309671050  1.344650000  1.440338600 -1.854720000  0.642469115 -0.141239220 -0.590229615
[601] -3.067723050  0.498513700 -3.028989450 -2.120337400 -3.792359700  0.620931710 -1.434687800 -0.681997745 -0.640126535 -0.866845905
[611]  0.500359000 -0.189768315 -0.600488710 -1.189853800 -2.340112000 -2.393474750 -1.550677900  0.369611380  1.320715200 -2.549793850
[621] -3.126263550 -1.837300350  1.399772700 -2.458979250 -3.133514000 -3.769080750 -0.095189686  1.152236600 -2.769023800 -2.966220150
[631] -2.338182000 -1.191461600 -0.516805240 -0.668263010 -1.561856250 -0.347942965 -1.829312300  1.242704700  2.219380950 -0.372650800
[641] -0.999552550  0.590237390 -0.649542435  0.110847190 -0.631771985 -3.365748100 -1.762826200 -2.831244850 -0.329124400 -1.647383700
[651] -1.280696800  1.860970800 -0.336776715  0.868136525 -0.607358480  0.018808737  0.521116715 -1.732145850 -0.138327315 -1.348063800
[661] -0.836565955 -0.977940105  0.468385920  2.628413000 -0.235135960 -0.660259025  2.071035900  0.677012230  1.389455100  1.019917700
[671]  2.839923650  3.210104800 -3.085439850 -3.930196100 -0.892046580  0.702990360 -0.420605800 -0.261096290 -2.897541950 -0.057454145
[681] -5.253086450 -0.055699686 -3.418928450 -0.090918811  0.909691825 -3.377824000 -1.747845400  0.348579560  0.437343180 -6.418149000
[691]  2.030777600 -2.309844150 -0.278167260 -2.266553050 -1.198931200 -0.801539685  0.278780580 -0.935947030 -0.120922215 -2.472311250
[701] -1.118067800 -0.140462025 -1.097714600 -1.929196850

$diffs
  [1] -0.012947700  0.002119800  0.016286890  0.000337030  0.000902380  0.000726800 -0.001359170 -0.016855000  0.004334150 -0.051229200
 [11]  0.005971300 -0.050470500  0.011888160  0.000779700 -0.000600800 -0.002624100 -0.492136000  0.007201900 -0.000240150  0.010822200
 [21] -0.002583730  0.002098800  0.007438600  0.004383500 -0.769571400  0.009721900 -0.067411100  0.003716890 -0.003001200  0.000010700
 [31] -0.003914400  0.002265200 -1.533156700  0.001711910 -0.163244500  0.001036250  0.002714030 -0.002257400 -0.003602720  0.008204500
 [41]  0.004816700 -0.003545200 -0.005538200 -0.761542700  0.002093600 -0.000627250  0.003842969  0.000544310 -0.360689700 -0.414124300
 [51] -0.366430100  0.002482200 -0.214425300 -0.032497800 -0.000792800 -0.008010100 -0.000256600  0.003998230  0.000366840  0.001348691
 [61] -0.002171320 -0.000299560 -0.160283800 -0.001833000  0.003241391 -0.001946200 -0.006272600  0.004080900 -0.277223400  0.002652430
 [71] -0.002284100 -0.001650300 -0.002015040 -0.001282400  0.003749200 -0.005472600 -0.001720300 -0.001563900 -0.000824500  0.000201200
 [81] -0.000335903  0.001068171 -0.001495100 -0.003767900 -0.001220200 -0.002339500 -0.001809560 -0.003780700  0.003218800 -0.002093350
 [91]  0.003175040 -0.004336600 -0.137752100  0.002557010 -0.060557800 -0.000332900 -0.001975350 -0.001111100 -0.004569000 -0.002860100
[101] -0.056915400 -0.000845300 -0.016280400  0.002834500 -0.580877200 -0.000529910  0.005236600  0.001192900 -0.277410600  0.001484330
[111] -0.005099800  0.004633200  0.003999010  0.005758910 -0.001012800  0.002453800  0.000829560 -0.104035800  0.002099970 -0.007390900
[121] -0.111952900 -0.003129600  0.000796213  0.000090060 -0.004623800  0.006778110  0.003410760  0.002862430  0.005122400  0.001774530
[131] -0.001563100  0.001889210 -0.000486100 -0.662290100  0.004407300  0.005381100 -0.042681000  0.004189200 -0.002402500 -0.003992189
[141] -0.003054897  0.007475000  0.000244290 -0.003170700 -0.000889730  0.002233650  0.000058700 -0.008259890  0.001853300  0.008099800
[151]  0.002467500 -0.002421930  0.001280843 -0.057538100 -0.063515600  0.006792440  0.001756100 -0.008607000  0.005951250  0.001600640
[161] -0.003316800 -0.002499440  0.001249600  0.007733800 -0.005913085  0.004688520 -0.004598800  0.002502400 -0.001195600  0.004760500
[171] -0.043737000  0.007583800  0.004998800 -0.002545490  0.003177800  0.000951490  0.003440600  0.003494040 -0.078992900  0.004693220
[181] -0.005236990  0.001737100  0.001446310  0.004822400 -0.011516400 -0.005200200 -0.003849800  0.000579600  0.003132900  0.000917500
[191]  0.006415900  0.003327680 -0.108000300 -0.008780500 -0.009881600 -0.005108471 -0.063871500  0.002502900 -0.003827500  0.005914120
[201] -0.000817060  0.001154800 -0.000819600 -0.004462600  0.003808900 -0.001556100 -0.003912800  0.007646140 -0.003038817  0.000435700
[211] -0.001514400 -0.181803400  0.001007820  0.003894900 -0.026233500 -0.000026700  0.003827300 -0.000999960 -0.037907900  0.000541700
[221] -0.004778392 -0.000336390  0.000543290  0.006252770  0.000872570  0.006311600 -0.001561100  0.006317670 -2.545118000  0.006585010
[231]  0.001281600 -0.050589300  0.001326650  0.002402400 -0.002296950 -0.000793200 -0.042341300  0.000329000 -0.001552000 -0.719946400
[241]  0.001785240  0.000658300 -0.189752000 -0.000019860 -1.222233000  0.004899640  0.005266300 -0.000112400 -0.002504580  0.005103440
[251]  0.001307520 -0.000213319 -0.002544200  0.005062990  0.000056300 -0.002388800  0.004754100 -0.037638400 -0.005075700 -0.571565500
[261] -0.094634300 -0.000932700 -0.002552600 -0.005651700 -0.088234500 -0.002124200  0.001696500 -0.002188000  0.007098100 -0.008699400
[271]  0.004654300  0.003339900 -0.002490980  0.005219930 -0.114133800 -0.004871300 -0.008860100 -0.000280500 -0.003216630  0.000199140
[281] -0.005051600 -0.000385480  0.001546200 -0.390233700 -0.000675700  0.011604500 -0.002411570 -0.000788400  0.006714900 -0.234477300
[291]  0.002139380  0.003075570  0.001604500 -0.045119800  0.000746170 -0.003466690 -0.003990200  0.003095360  0.005166430 -0.003313050
[301] -0.423387600  0.001252260 -0.000459900  0.007143290 -0.005070800  0.003197528  0.006522800 -0.007632738  0.007420590  0.003365630
[311]  0.002734540 -0.000176360  0.003295400 -0.000270180  0.005677600  0.003611400  0.002611500 -0.001113580  0.002611800  0.006199920
[321] -0.159360900  0.005866520  0.001442360 -0.000508100 -0.000725030 -0.012712600 -0.058477100  0.004044400  0.003094900  0.003032300
[331]  0.001056510  0.000984800 -0.001858800  0.002685500 -0.002218900 -0.012033900  0.005262600  0.002006540 -0.003336490  0.003157210
[341]  0.003943700 -0.032519200  0.001721100 -0.002770230  0.003523500 -0.010815800 -0.000444310 -0.270664000  0.000590400 -0.099013700
[351] -0.004837700 -0.000349100  0.000568100  0.000431700 -0.005901350 -0.004351170  0.008335420 -0.002366210 -0.062497300 -2.355528800
[361] -0.002989270 -0.000576400 -0.001259829 -0.000098320  0.000573910  0.001594669  0.005930100  0.004648290 -0.008426900 -0.002584200
[371] -0.452530300  0.006770500 -0.305718200  0.000617010 -0.004592800 -0.004255935 -0.236930300  0.001943300 -0.006497900 -0.006744000
[381]  0.007501200  0.002682260  0.004029060 -0.005499200  0.001111310 -0.000752240  0.001904390  0.004304550 -0.758359600 -0.001517100
[391]  0.009253700 -0.001207600 -0.519941900  0.005937000 -0.001765910 -0.005536100 -0.006075760 -0.330842600 -0.000021900  0.003949800
[401] -0.000763900  0.006207940 -0.003894640 -0.071779500  0.001141000  0.005486710 -0.053252500  0.003955600 -0.242833300 -0.000227100
[411] -0.138594100  0.001747600 -0.001173500  0.000542700  0.002435700  0.003186200 -0.005465300 -0.004642100 -0.000777700  0.003517250
[421]  0.002585100  0.001535110  0.015200200  0.000953100 -0.000427100  0.001375700 -0.000735100 -0.704065100 -0.010394200  0.002952840
[431] -0.003685800  0.000762800  0.001277600  0.000966000  0.000319150  0.000808000 -0.002242900 -0.001415160 -0.006302920 -1.015173200
[441]  0.003660400 -0.006951020 -0.109463700  0.003625360  0.003831200 -0.000968950 -0.502072100 -0.006830670 -0.003554940 -0.004788872
[451] -0.001761200 -0.001792860  0.003757200 -0.415290200 -0.563323200  0.003084370 -0.107286100  0.003575400  0.000861260 -0.007260610
[461] -0.024120800  0.005385930  0.000824690  0.001626400 -0.119489600 -0.003367600 -0.000332730  0.008682300  0.000613800 -0.004958253
[471]  0.003766700 -0.009300600 -0.011528340  0.007571900  0.001973730 -0.000599580 -0.003227000 -0.001989380  0.004735200 -0.383596700
[481] -0.000996700 -0.000426780 -0.028151000 -0.002120760  0.017022300  0.001757880  0.004549800 -0.001101700 -0.014453700 -0.003011101
[491] -0.002688500  0.001882000  0.001180520  0.002403200 -0.002157910 -0.006739500  0.000750190 -0.025500600 -0.002253400  0.000367411
[501] -0.006249000  0.001283800  0.001159100 -0.000081100 -0.000445600 -0.116911000  0.000481700 -0.000270100 -0.013856000 -0.000832900
[511]  0.006948750  0.000980760 -0.003706900 -0.255250900  0.004615800  0.005278100 -0.008409000 -0.048339500  0.004334000 -0.010343400
[521] -0.003293690  0.003699300  0.000812330 -0.001045300  0.001765500  0.006331110  0.000389200  0.008163800  0.001652500  0.000073400
[531]  0.007134230  0.006426400 -0.002996710  0.001259650  0.002911500 -0.003282970 -0.000648480  0.005091330 -0.002383500  0.005974900
[541] -0.005225400  0.006948200 -0.600713000 -0.000898620  0.003175980 -0.003358900  0.000914400 -0.030537400 -0.001022700  0.001547300
[551]  0.000581890  0.000711130 -0.005802580  0.000067000  0.005900550  0.013013100  0.005352100  0.001815080  0.003960170  0.001304790
[561]  0.005813770 -0.058375700  0.002706227 -0.003395300 -0.928364400  0.001089800  0.000518800 -0.005309140  0.002844990  0.009230894
[571] -0.001855000  0.012538200 -0.005423400 -0.001193500 -0.253164500  0.021818100  0.002242630 -0.004413600  0.013396980 -0.000147430
[581] -0.000687400  0.005307900 -0.001055500 -0.000379910  0.001874610  0.001423500 -0.018684900  0.000544810  0.000812000  0.001753500
[591] -0.005145900  0.002717200  0.007574700  0.000657900 -0.010700000  0.000677200 -0.009440000  0.004938230 -0.002478440 -0.000459230
[601]  0.004553900 -0.002972600  0.002021100 -0.000674800 -0.084719400  0.001863420 -0.009375600 -0.003995490 -0.000253070  0.006308190
[611]  0.000718000  0.000463370 -0.000977420  0.000292400 -0.000224000 -0.006949500 -0.001355800 -0.000777240  0.001430400  0.000412300
[621] -0.012527100  0.005399300 -0.000454600  0.002041500 -0.007028000 -0.058161500  0.009620628  0.004473200  0.001952400  0.007559700
[631]  0.003636000 -0.002923200  0.006389520  0.003473980 -0.003712500  0.004114070  0.001375400  0.005409400 -0.001238100 -0.005301600
[641]  0.000894900  0.000474780  0.000915130  0.001694380 -0.003543970 -0.031496200  0.014347600 -0.002489700  0.001751200  0.005232600
[651] -0.001393600  0.001941600  0.006446570 -0.003726950  0.005283040 -0.002382525  0.002233430 -0.004291700  0.003345370  0.003872400
[661]  0.006868090  0.004119790 -0.003228160 -0.003174000  0.009728080 -0.000518050  0.002071800 -0.005975540 -0.001089800 -0.000164600
[671] -0.000152700 -0.019790400 -0.010879700 -0.100392200 -0.004093160  0.005980720 -0.001211600 -0.002192580  0.004916100  0.005091709
[681] -0.566172900  0.008600627 -0.037856900 -0.001837622 -0.000616350 -0.035648000  0.004309200 -0.002840880 -0.005313640 -0.836298000
[691]  0.001555200  0.000311700  0.003665480  0.006893900  0.002137600 -0.003079370 -0.002438840  0.008105940 -0.001844430 -0.004622500
[701]  0.003864400 -0.000924050  0.004570800  0.001606300

$groups

$based.on
[1] 704

$lower.limit
[1] -0.4137443

$mean.diffs
[1] -0.04135858

$upper.limit
[1] 0.3310272

$lines
lower.limit  mean.diffs upper.limit 
-0.41374431 -0.04135858  0.33102715 

$CI.lines
lower.limit.ci.lower lower.limit.ci.upper   mean.diff.ci.lower   mean.diff.ci.upper upper.limit.ci.lower upper.limit.ci.upper 
         -0.43809480          -0.38939382          -0.05541734          -0.02729982           0.30667666           0.35537764 

$two
[1] 1.96

$critical.diff
[1] 0.3723857
ba_baz <- PSFI_df_malnutrition %>%
  filter(case_control == 1 & age_years >=2, !is.na(bmiz), !is.na(baz))

bland.altman.stats(ba_baz$bmiz, ba_baz$baz)
$means
  [1]  -0.289481450  -2.857820100   3.237762800  -1.549559100  -1.140396900  -1.378233400  -0.310858860   3.576075150  -2.878530350
 [10]  -2.377455300  -3.757117000  -2.021557200  12.190738050   3.086471700  -2.128653700  -1.471786150  -0.041549705   0.711878755
 [19]  -5.896741200  -1.861275350  -0.500053375  -4.510908900  -2.050357150  -0.039737210  -0.649289085  -0.350493480   0.558736325
 [28]  -2.390777300  -1.650806500  -5.298624300  -4.493980800  -4.005476050 -11.351515000   2.130923950  -1.730422200  -1.372297050
 [37]  -0.460091215  -3.557517900  -2.781554950  -3.871787250  -2.139678300  -2.160076200   5.178409200  -2.120038100  -1.440610600
 [46]   0.171814390  -4.207287000   2.481151550  -0.588119880  -3.009176950 -13.739497500  21.857132500  -0.328512750  11.019317000
 [55]  -2.320858400  -1.111482650   0.647557450   0.190391020   1.970207400   2.929363350  -4.626877900   2.931056600  -1.010389400
 [64]   0.990483490   2.438884950   0.518724155   1.568883650  -4.548962200  -2.108619150   2.492128950  -1.870731700   5.294967450
 [73]   0.312026650   1.559213150   0.572040025  -2.358298700  -0.749568760  -1.722402100   1.757847250   1.028420650  -0.420841550
 [82]  -2.758797750  -0.547973715  -0.041629935  -0.709395510   0.289532635  -5.509194950   3.043515700   2.472605700  -4.731819650
 [91]   0.061847886  -2.181957350  -4.361164100  -0.177833310   1.018377750   1.130056800  -0.492472080 -15.477679500  -3.644266050
[100]  -2.820847650  -0.068472654  -1.187452950  -2.011588100   1.388102250  -2.107662500  -3.583479200  -2.072532450   2.710963700
[109]  -3.573556800  -0.641043340  -0.680048045  -0.020773979  -1.928410200  -2.131998700  -2.097474750   1.691867400   4.895192150
[118]   1.018064250  -3.320991200  -3.682266050   2.891117150   0.032023146  -0.351877470  -2.938089950  -3.071259900  -1.382451500
[127]   1.449634750  -1.360207450  -2.481342550  -1.931699050  -1.502191500   1.460743350   1.028388050   3.468621850  -1.280923100
[136]   0.188867445   0.531388685  -2.038334250   1.478874150  -3.575597050  -1.312371700  -1.368837700  -1.051020550  -1.417647700
[145]  -0.289346280  -1.051265450  -0.289250585  -5.588076400   1.070799750   0.611053160  -0.529572085  -2.757784850  -1.050466250
[154]  -1.038619400  -2.728733050   0.201616235  -0.819282685  -1.192398500   0.551429745   1.471839450 -19.572919000  -0.032119260
[163]  -2.218806600  -0.509211930  -0.451058185 -16.601887500  -1.390988650  -0.419598630  -0.278126480   2.711381200  -8.153973550
[172]   0.890804300  -2.589047350   1.268954300   3.231962300   0.699938960   1.747984950  -0.980675240   1.229106950  -1.237753750
[181]  -0.238768590  -0.190218250   8.673813300   0.472368865  -3.254289400  -2.099226500   2.600417550  -3.282628550  -4.800367800
[190]  -2.161958900 -16.812655000  -1.258189900  -3.865866200   1.362366300  -0.278241185   3.154719200  -0.268786095   5.386812550
[199]  -2.610065150  10.386390450  -0.911921160   0.298396535   4.259224350   1.418027550   0.748988600  -1.301140750  -4.955695050
[208]   0.510107790  -2.628130500  -5.132770350  -4.387832650  -1.841648100  -2.888080450   0.830486155  -2.050496500  -1.679653500
[217]   1.951553700  -1.407131650   2.279658350  -0.002395475   1.059851400  -4.181888050  -0.489113670  -0.100233060  -0.560416190
[226]  -1.902259400  -4.617390050  -3.041435150  -0.912052765   0.181642605  -1.722112650   1.298295600  -5.347852350   0.549203600
[235]  -2.190874550   2.489954800  -1.002207050   1.598766650   2.868578350  -0.111448585  -2.220886350  -0.322156670   1.379711400
[244]  -1.290523750   0.072097663  -1.048448050   1.932317150  -1.602043300  -5.837745900  -4.226083250  -0.110019850  -2.082136650
[253]   0.990152415  -2.698421950  -4.260710550  -0.768966090  -6.628176750  -0.061843729  -8.121774150  -0.609234325  -1.919813700
[262]  -2.042311950   1.302511200  -3.318993850  -6.276434600   1.787565200   1.088479600  -1.058804700  -1.581467300  -0.899537515
[271]  -1.070103750   1.979451150   1.128782200   1.871999100  -3.335490750  -0.889992510   1.652269750  -3.472320400  -0.531628860
[280]  -0.021059774  -2.058914800   0.699673985   0.300258630   0.299897890   0.360833100   2.111399100   2.211851100   0.199892745
[289]   1.961603500   2.291010300   2.981617550  -3.435343100  -0.408877240  -0.990246350  -6.614984550   0.350791995  -6.551284700
[298]  -0.808432280  -6.310351600  -0.559475035  -1.148099100

$diffs
  [1]   0.001037100   0.004359800  -0.084474400   0.000881800  -0.000793800   0.003533200  -0.001717720  -0.167849700   0.002939300
 [10]   0.005089400  -0.074234000  -0.003114400  -6.058523900  -0.027056600   0.002692600  -0.003572300  -0.003099411   0.003757510
 [19]  -0.673482400  -0.002550700  -0.000106750  -0.321817800  -0.000714300   0.000525580   0.001421830  -0.000986960  -0.002527350
 [28]  -0.001554600  -0.001613000  -0.557248600  -0.387961600  -0.190952100  -4.903030000   0.001847900  -0.000844400  -0.004594100
 [37]  -0.000182430  -0.075035800  -0.003109900  -0.083574500   0.000643400  -0.000152400  -0.503181600  -0.000076200  -0.001221200
 [46]   0.003628780  -0.274574000   0.002303100   0.003760240   0.001646100  -7.738995000 -21.625735000   0.002974500 -11.781366000
 [55]  -0.001716800  -0.002965300  -0.004885100   0.000782040   0.000414800  -0.001273300  -0.273755800   0.002113200  -0.000778800
 [64]   0.000966980  -0.002230100  -0.002551690  -0.002232700  -0.197924400   0.002761700   0.004257900  -0.001463400  -1.110065100
 [73]   0.004053300  -0.001573700   0.004080050   0.003402600   0.000862480  -0.004804200  -0.004305500  -0.003158700  -0.001683100
 [82]   0.002404500   0.004052570  -0.003259870   0.001208980  -0.000934730  -0.658389900  -0.012968600   0.005211400  -0.303639300
 [91]   0.003695773  -0.003914700  -0.182328200   0.004333380  -0.003244500   0.000113600  -0.004944160  -8.675359000  -0.088532100
[100]  -0.001695300   0.003054693   0.005094100  -0.003176200  -0.003795500   0.004675000  -0.066958400  -0.005064900   0.001927400
[109]  -0.047113600  -0.002086680  -0.000096090  -0.001547958   0.003179600  -0.003997400   0.005050500   0.003734800  -0.629615700
[118]  -0.003871500  -0.041982400  -0.064532100   0.002234300   0.004046292  -0.003754940   0.003820100  -0.002519800  -0.004903000
[127]  -0.000730500  -0.000414900  -0.002685100  -0.003398100  -0.004383000   0.001486700  -0.003223900  -0.042756300  -0.001846200
[136]  -0.002265110   0.002777370   0.003331500  -0.002251700  -0.091194100  -0.004743400   0.002324600  -0.002041100   0.004704600
[145]   0.001307440  -0.002530900   0.001498830  -0.556152800   0.001599500   0.002106320   0.000855830   0.004430300  -0.000932500
[154]   0.002761200   0.002533900   0.003232470   0.001434630  -0.004797000   0.002859490   0.003678900 -14.025838000  -0.004238521
[163]   0.002386800   0.001576140  -0.002116370 -11.203775000  -0.001977300   0.000802740   0.003747040   0.002762400  -2.967947100
[172]   0.001608600   0.001905300  -0.002091400  -0.016075400  -0.000122080  -0.004030100  -0.001350480  -0.001786100   0.004492500
[181]   0.002462820  -0.000436500  -2.952373400   0.004737730  -0.028578800   0.001547000   0.000835100  -0.025257100  -0.300735600
[190]  -0.003917800 -11.245310000   0.003620200  -0.151732400   0.004732600   0.003517630  -0.010561600   0.002427810  -1.626374900
[199]  -0.000130300  -3.187219100  -0.003842320  -0.003206930  -0.241551300  -0.003944900  -0.002022800  -0.002281500  -0.351390100
[208]   0.000215580   0.003739000  -0.565540700  -0.195665300  -0.003296200   0.003839100   0.000972310  -0.000993000   0.000693000
[217]   0.003107400   0.005736700  -0.000683300  -0.004790949  -0.000297200  -0.143776100   0.001772660  -0.000466120  -0.000832380
[226]  -0.004518800  -0.214780100  -0.002870300  -0.004105530   0.003285210  -0.004225300  -0.003408800  -0.795704700  -0.001592800
[235]  -0.001749100  -0.000090400  -0.004414100  -0.002466700  -0.002843300  -0.002897170  -0.001772700  -0.004313340  -0.000577200
[244]  -0.001047500   0.004195325   0.003103900   0.004634300  -0.004086600  -0.715491800  -0.152166500  -0.000039700  -0.004273300
[253]   0.000304830   0.003156100  -0.241421100   0.002067820  -0.936353500  -0.003687459  -2.403548300   0.001531350   0.000372600
[262]  -0.004623900   0.005022400  -0.037987700  -0.752869200  -0.004869600  -0.003040800   0.002390600  -0.002934600   0.000924970
[271]  -0.000207500  -0.001097700  -0.002435600   0.003998200  -0.050981500   0.000014980   0.004539500  -0.044640800  -0.003257720
[280]  -0.002119548   0.002170400  -0.000652030   0.000517260  -0.000204220   0.001666200   0.002798200   0.003702200  -0.000214510
[289]   0.003207000   0.002020600   0.003235100  -0.070686200   0.002245520  -0.000492700  -0.989969100   0.001583990  -0.962569400
[298]   0.003135440  -1.160703200   0.001049930   0.003801800

$groups

$based.on
[1] 301

$lower.limit
[1] -4.414332

$mean.diffs
[1] -0.4230157

$upper.limit
[1] 3.568301

$lines
lower.limit  mean.diffs upper.limit 
 -4.4143320  -0.4230157   3.5683007 

$CI.lines
lower.limit.ci.lower lower.limit.ci.upper   mean.diff.ci.lower   mean.diff.ci.upper upper.limit.ci.lower upper.limit.ci.upper 
          -4.8144067           -4.0142572           -0.6539989           -0.1920324            3.1682259            3.9683754 

$two
[1] 1.96

$critical.diff
[1] 3.991316
# MAKE A TABLE OF THE CASES WHERE THE DIFFERENCE BETWEEN OUR Z-SCORES IS HIGHER THAN 0.5
high_diff_rows <- PSFI_df_malnutrition %>%
  filter(case_control == 1) %>%
  mutate(
    diff_wfh = whz - wfhz,
    diff_wfa = waz - wfaz,
    diff_baz = ifelse(
      age_years >= 2,
      bmiz - baz,
      NA
    )
  ) %>%
  filter(
    abs(diff_wfh) > 0.5 |
    abs(diff_wfa) > 0.5 |
    (age_years >= 2 & abs(diff_baz) > 0.5)
  ) %>%
  select(
    record_id, age_years, age_months, sex, ht, wt,
    whz, wfhz, diff_wfh,
    waz, wfaz, diff_wfa,
    bmiz, baz, diff_baz
  ) %>%
  arrange(
    desc(
      pmax(
        abs(diff_wfh),
        abs(diff_wfa),
        abs(diff_baz),
        na.rm = TRUE
      )
    )
  )

high_diff_rows
# ASSESS HOW MANY OF THE CASES WITH Z-SCORE DIFFERENCES OVER 0.5 HAVE A Z-SCORE OVER 3
high_diff_rows %>%
  summarise(
    n_total = n(),

    n_any_z_over_5 = sum(
      abs(whz)  > 5 |
      abs(wfhz) > 5 |
      abs(waz)  > 5 |
      abs(wfaz) > 5 |
      abs(bmiz) > 5 |
      abs(baz)  > 5,
      na.rm = TRUE
    ),

    percent_any_z_over_5 = 100 * n_any_z_over_5 / n_total
  )
write.xlsx(PSFI_df_malnutrition, file = "PSFI_final_malnutrition.xlsx")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIDEuIERlZmluaW5nIG1hbG51dHJpdGlvbg0KDQojIyAxLjEuIFByZXJlcXVpc2l0ZXMNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoenNjb3JlcikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSAobHVicmlkYXRlKQ0KbGlicmFyeSAoZ2dwbG90MikNCmxpYnJhcnkgKHJtYXJrZG93bikNCmxpYnJhcnkob3Blbnhsc3gpDQpsaWJyYXJ5KHdyaXRleGwpDQpsaWJyYXJ5KHJzdGF0aXgpDQpsaWJyYXJ5KGVlcHRvb2xzKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoQmxhbmRBbHRtYW5MZWgpDQpgYGANCg0KYGBge3J9DQpQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSByZWFkX3hsc3goIkJlbl9jdXRfNF8yNy54bHN4IikNCmBgYA0KDQpgYGB7cn0NClN5cy5zZXRlbnYoTEFOR1VBR0UgPSAiZW4iKQ0KYGBgDQoNCiMjIDEuMi4gQW50aHJvcHJvbWV0cmljIGFuYWx5c2lzDQoNCmBgYHtyfQ0KIyBDUkVBVEUgTkVXIENBVEVHT1JZIFRIQVQgQ0FMQ1VMQVRFUyBBR0UgSU4gWUVBUlMgQkFTRUQgT04gQUdFIElOIERBWVMNClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoYWdlX3llYXJzID0gYWdlX2RheXNfZXhhY3QgLyAzNjUuMjUpDQoNCnN1bW1hcnkoUFNGSV9kZl9tYWxudXRyaXRpb24kYWdlX3llYXJzKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEEgU1VNTUFSWSBPRiBDQVNFUyAoaHQ9aGVpZ2h0LCB3dD13ZWlnaHQsIGFnZV95ZWFycz0gYWdlIGluIHllYXJzLCBtdWFjKQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIHNlbGVjdChodCwgd3QsIGFnZV95ZWFycywgbXVhYykgJT4lDQogIHN1bW1hcnkoKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEEgSElTVE9HUkFNIEFORCBCT1hQTE9UIE9GIEhFSUdIVCAoQ0FTRVMpDQpsYXlvdXQobWF0ID0gbWF0cml4KGMoMSwyKSwyLDEsIGJ5cm93PVRSVUUpLCAgaGVpZ2h0ID0gYygxLDgpKQ0KcGFyKG1hcj1jKDAsIDMuMSwgMS4xLCAyLjEpKQ0KYm94cGxvdChQU0ZJX2RmX21hbG51dHJpdGlvbiRodFtQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0gLCBob3Jpem9udGFsPVRSVUUgLCB5bGltPWMoMCwyMDApLCB4YXh0PSJuIiAsIGNvbD1yZ2IoMC44LDAuOCwwLDAuNSkgLCBmcmFtZT1GKQ0KcGFyKG1hcj1jKDQsIDMuMSwgMS4xLCAyLjEpKQ0KaGlzdChQU0ZJX2RmX21hbG51dHJpdGlvbiRodFtQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0NCiAgICAgLCBicmVha3M9NDAgLCBjb2w9cmdiKDEsMC44LDAuOCwxKSAsIGJvcmRlcj1GICwgbWFpbj0iIiAsIHhsYWI9IkhlaWdodCAoY20pIiwgeGxpbT1jKDAsMjAwKSkNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFUyBBIEhJU1RPR1JBTSBBTkQgQk9YUExPVCBPRiBXRUlHSFQgKENBU0VTKQ0KbGF5b3V0KG1hdCA9IG1hdHJpeChjKDEsMiksMiwxLCBieXJvdz1UUlVFKSwgIGhlaWdodCA9IGMoMSw4KSkNCiBwYXIobWFyPWMoMCwgMy4xLCAxLjEsIDIuMSkpDQpib3hwbG90KFBTRklfZGZfbWFsbnV0cml0aW9uJHd0W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXSAsIGhvcml6b250YWw9VFJVRSAsIHlsaW09YygwLDc1KSwgeGF4dD0ibiIgLCBjb2w9cmdiKDAuOCwwLjgsMCwwLjUpICwgZnJhbWU9RikNCnBhcihtYXI9Yyg0LCAzLjEsIDEuMSwgMi4xKSkNCmhpc3QoUFNGSV9kZl9tYWxudXRyaXRpb24kd3RbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdDQogICAgICwgYnJlYWtzPTQwICwgY29sPXJnYigxLDAuOCwwLjgsMSkgLCBib3JkZXI9RiAsIG1haW49IiIgLCB4bGFiPSJXZWlnaHQgKGtnKSIsIHhsaW09YygwLDc1KSkNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFUyBBIEhJU1RPR1JBTSBBTkQgQk9YUExPVCBPRiBNVUFDIChDQVNFUykNCiMjIEJMVUUgTElORSBPVVRMSU5FUyBNT0RFUkFURSBNQUxOVVRSSVRJT04gKDEyLjVjbSkNCiMjIFJFRCBMSU5FIE9VVExJTkVTIFNFVkVSRSBNQUxOVVRSSVRJT04gKDExLjVjbSkNCmxheW91dChtYXQgPSBtYXRyaXgoYygxLDIpLDIsMSwgYnlyb3c9VFJVRSksICBoZWlnaHQgPSBjKDEsOCkpDQpwYXIobWFyPWMoMCwgMy4xLCAxLjEsIDIuMSkpDQpib3hwbG90KFBTRklfZGZfbWFsbnV0cml0aW9uJG11YWNbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdICwgaG9yaXpvbnRhbD1UUlVFICwgeWxpbT1jKDUsMzApLCB4YXh0PSJuIiAsIGNvbD1yZ2IoMC44LDAuOCwwLDAuNSkgLCBmcmFtZT1GKQ0KcGFyKG1hcj1jKDQsIDMuMSwgMS4xLCAyLjEpKQ0KaGlzdChQU0ZJX2RmX21hbG51dHJpdGlvbiRtdWFjW1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXQ0KICAgICAsIGJyZWFrcz0yMCAsIGNvbD1yZ2IoMSwwLjgsMC44LDEpICwgYm9yZGVyPUYgLCBtYWluPSIiICwgeGxhYj0iTWlkLXVwcGVyIGFybSBjaXJjdW1mZXJlbmNlIChjbSkiLCB4bGltPWMoNSwzMCkpDQphYmxpbmUodiA9IDExLjUsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgICMgc2V2ZXJlDQphYmxpbmUodiA9IDEyLjUsIGNvbCA9ICJibHVlIiwgbHdkID0gMiwgbHR5ID0gMikgICMgbW9kZXJhdGUNCmBgYA0KDQpgYGB7cn0NCiMgSElTVE9HUkFNIEFORCBCT1hQTE9UIE9GIEFHRSAoQ0FTRVMpDQpsYXlvdXQobWF0ID0gbWF0cml4KGMoMSwyKSwyLDEsIGJ5cm93PVRSVUUpLCAgaGVpZ2h0ID0gYygxLDgpKQ0KIHBhcihtYXI9YygwLCAzLjEsIDEuMSwgMi4xKSkNCmJveHBsb3QoUFNGSV9kZl9tYWxudXRyaXRpb24kYWdlX3llYXJzW1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXSAsIGhvcml6b250YWw9VFJVRSAsIHlsaW09YygwLDE1KSwgeGF4dD0ibiIgLCBjb2w9cmdiKDAuOCwwLjgsMCwwLjUpICwgZnJhbWU9RikNCnBhcihtYXI9Yyg0LCAzLjEsIDEuMSwgMi4xKSkNCmhpc3QoUFNGSV9kZl9tYWxudXRyaXRpb24kYWdlX3llYXJzW1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXSwgYnJlYWtzPTQwICwgY29sPXJnYigxLDAuOCwwLjgsMSkgLCBib3JkZXI9RiAsIG1haW49IiIgLCB4bGFiPSJBZ2UgKHllYXJzKSIsIHhsaW09YygwLDE1KSkNCmBgYA0KDQojIyAxLjMuIFotc2NvcmVyDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEEgTkVXIENBVEVHT1JZIERFRklOSU5HIFNFWCBBUyAxLzIsIElOU1RFQUQgT0YgMC8xIChORUNFU1NBUlkgRk9SIFpTQ09SRVIgUEFDS0FHRSkNClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoc2V4X3dobyA9IGlmX2Vsc2Uoc2V4ID09IDEsIDEsIDIpKQ0KDQpzdW1tYXJ5KFBTRklfZGZfbWFsbnV0cml0aW9uJHNleF93aG8pDQpgYGANCg0KYGBge3J9DQojIENSRUFURVMgQSBORVcgQ0FURUdPUlkgQ0FMQ1VMQVRJTkcgQUdFIElOIE1PTlRIUyBCQVNFRCBPTiBBR0UgSU4gREFZUw0KUFNGSV9kZl9tYWxudXRyaXRpb24gPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIG11dGF0ZShhZ2VfbW9udGhzID0gYWdlX2RheXNfZXhhY3QgLyAzMC40Mzc1KQ0KDQpzdW1tYXJ5KFBTRklfZGZfbWFsbnV0cml0aW9uJGFnZV9tb250aHMpDQpgYGANCg0KYGBge3J9DQojIENSRUFURVMgQSBORVcgQ0FURUdPUlkgKEFHRTw2TSA9IDAsIEFHRSA2TSAtIDVKID0gMSwgQUdFID4gNUogPSAyKQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIG11dGF0ZSgNCiAgICBhZ2VfZ3JvdXAgPSBjYXNlX3doZW4oDQogICAgICBhZ2VfbW9udGhzIDwgNiB+IDBMLA0KICAgICAgYWdlX21vbnRocyA+PSA2ICYgYWdlX3llYXJzIDwgNSB+IDFMLA0KICAgICAgYWdlX3llYXJzID49IDUgfiAyTCwNCiAgICAgIFRSVUUgfiBOQV9pbnRlZ2VyXw0KICAgICkNCiAgKQ0KDQpgYGANCg0KYGBge3J9DQojIFpTQ09SRVIgUEFDS0FHRSBDQUxDVUxBVEVTIFpTQ09SRSBPRiBXRUlHSFQgRk9SIExFTkdUSCAod2ZseiksIFdFSUdIVCBGT1IgQUdFICh3ZmF6KSwgSEVJR0hUIEZPUiBBR0UgKGhmYXopLCBXRUlHSFQgRk9SIEhFSUdIVCAod2ZoeiksIEJNSSBGT1IgQUdFIChiYXopDQpQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgbXV0YXRlKA0KICAgIHdmbHogPSBhZGRXR1NSKA0KICAgICAgZGF0YSA9IC4sDQogICAgICBzZXggPSAic2V4X3dobyIsDQogICAgICBmaXJzdFBhcnQgPSAid3QiLA0KICAgICAgc2Vjb25kUGFydCA9ICJodCIsDQogICAgICBpbmRleCA9ICJ3ZmwiDQogICAgKSR3Zmx6LA0KICAgIA0KICAgIHdmYXogPSBhZGRXR1NSKA0KICAgICAgZGF0YSA9IC4sDQogICAgICBzZXggPSAic2V4X3dobyIsDQogICAgICBmaXJzdFBhcnQgPSAid3QiLA0KICAgICAgc2Vjb25kUGFydCA9ICJhZ2VfZGF5c19leGFjdCIsDQogICAgICBpbmRleCA9ICJ3ZmEiDQogICAgKSR3ZmF6LA0KICAgIA0KICAgIGhmYXogPSBhZGRXR1NSKA0KICAgICAgZGF0YSA9IC4sDQogICAgICBzZXggPSAic2V4X3dobyIsDQogICAgICBmaXJzdFBhcnQgPSAiaHQiLA0KICAgICAgc2Vjb25kUGFydCA9ICJhZ2VfZGF5c19leGFjdCIsDQogICAgICBpbmRleCA9ICJoZmEiDQogICAgKSRoZmF6LA0KDQogICAgd2ZoeiA9IGFkZFdHU1IoDQogICAgICBkYXRhID0gLiwNCiAgICAgIHNleCA9ICJzZXhfd2hvIiwNCiAgICAgIGZpcnN0UGFydCA9ICJ3dCIsDQogICAgICBzZWNvbmRQYXJ0ID0gImh0IiwNCiAgICAgIGluZGV4ID0gIndmaCINCiAgICApJHdmaHosDQogICAgDQogICAgYmF6ID0gYWRkV0dTUigNCiAgICAgIGRhdGEgPSAuLA0KICAgICAgc2V4ID0gInNleF93aG8iLA0KICAgICAgZmlyc3RQYXJ0ID0gInd0IiwNCiAgICAgIHNlY29uZFBhcnQgPSAiaHQiLA0KICAgICAgdGhpcmRQYXJ0ID0gImFnZV9kYXlzX2V4YWN0IiwNCiAgICAgIGluZGV4ID0gImJmYSINCiAgICApJGJmYXoNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KIyBBU1NJR05TIFotU0NPUkUgVE8gTVVBQyBCQVNFRCBPTiBUSEUgMTEuNSAmIDEyLjVDTSBMSU1JVFMsIFRISVMgSVMgQSBQUk9YWSBBUyBMQVRFUiBBIFotU0NPUkUgT0YgMCBXSUxMIEVRVUFMIE5PIE1BTE5VVFJJVElPTiwgPC0yIFdJTEwgRVFVQUwgTU9ERVJBVEUgTUFMTlVUUklUSU9OIEFORCA8LTMgV0lMTCBFUVVBTCBTRVZFUkUgTUFMTlVUUklUSU9ODQpQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgbXV0YXRlKA0KICAgIG11YWN6ID0gY2FzZV93aGVuKA0KICAgICAgbXVhYyA+PSAxMi41IH4gMCwNCiAgICAgIG11YWMgPj0gMTEuNSAmIG11YWMgPCAxMi41IH4gLTIuNSwNCiAgICAgIG11YWMgPCAxMS41IH4gLTQsDQogICAgICBUUlVFIH4gTkFfcmVhbF8NCiAgICApDQogICkNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFIE1BTE5VVFJJVElPTiBaU0NPUkUgQkFTRUQgT04gTUVSR0VEIFdGSExaLCBCQVosIE1VQUNaICh0byBiZSBkZWZpbmVkIGxhdGVyKQ0KUFNGSV9kZl9tYWxudXRyaXRpb24gPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIG11dGF0ZSgNCiAgICB6c2NvcmVfdW5pZmllZCA9IGNhc2Vfd2hlbigNCiAgICAgIGFnZV9ncm91cCA9PSAxICYgaHQgPj0gNDUgJiBodCA8IDY1IH4gd2ZseiwNCiAgICAgIGFnZV9ncm91cCA9PSAxICYgaHQgPj0gNjUgJiBodCA8IDEyMCB+IHdmaHosDQogICAgICBhZ2VfZ3JvdXAgPT0gMSAmIChodCA8IDQ1IHwgaHQgPj0gMTIwIHwgaXMubmEoaHQpKSB+IG11YWN6LA0KICAgICAgYWdlX2dyb3VwID09IDIgfiBiYXosDQogICAgICBUUlVFIH4gTkFfcmVhbF8NCiAgICApDQogICkNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFIE1BTE5VVFJJVElPTiBDQVRFR09SWSBCQVNFRCBPTiBQUkVWSU9VUyBaIFNDT1JFDQpQU0ZJX2RmX21hbG51dHJpdGlvbiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgbXV0YXRlKA0KICAgIG1hbG51dHJpdGlvbiA9IGNhc2Vfd2hlbigNCiAgaXMubmEoenNjb3JlX3VuaWZpZWQpIH4gTkFfaW50ZWdlcl8sDQogIHpzY29yZV91bmlmaWVkIDwgLTMgfiAyTCwNCiAgenNjb3JlX3VuaWZpZWQgPj0gLTMgJiB6c2NvcmVfdW5pZmllZCA8IC0yIH4gMUwsDQogIFRSVUUgfiAwTA0KICAgICkNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KIyBBREQgQSBNQUxOVVRSSVRJT04gU09VUkNFIENBVEVHT1JZIFNPIFdFIEtOT1cgV0hJQ0ggQU5USFJPUE9NRVRSSUMgTUVBU1VSRSBJUyBCRUlORyBVU0VEIFRPIERFRklORSBNQUxOVVRSSVRJT04NClBTRklfZGZfbWFsbnV0cml0aW9uIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBtdXRhdGUoDQogICAgbWFsbnV0cml0aW9uX3NvdXJjZSA9IGNhc2Vfd2hlbigNCiAgICAgIGFnZV9ncm91cCA9PSAxICYgaHQgPj0gNDUgJiBodCA8IDY1ICB+ICJXRkwiLA0KICAgICAgYWdlX2dyb3VwID09IDEgJiBodCA+PSA2NSAmIGh0IDwgMTIwIH4gIldGSCIsDQogICAgICBhZ2VfZ3JvdXAgPT0gMSAmIChodCA8IDQ1IHwgaHQgPj0gMTIwIHwgaXMubmEoaHQpKSB+ICJNVUFDIiwNCiAgICAgIGFnZV9ncm91cCA9PSAyIH4gIkJGQSIsDQogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXw0KICAgICkNCiAgKQ0KYGBgDQoNCiMjIDEuNCBaIHNjb3JlIGNoZWNrDQoNCmBgYHtyfQ0Kc3Vic2V0X3dmYXogPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIHB1bGwod2ZheikNCg0KIyBTVU1NQVJZIE9GIFdFSUdIVCBGT1IgQUdFIFotU0NPUkUgKENBU0VTKQ0Kc3VtbWFyeShzdWJzZXRfd2ZheikNCiMgTlVNQkVSIE9GIENBU0VTIElOIFdFSUdIVCBGT1IgQUdFIFogU0NPUkUNCmxlbmd0aChzdWJzZXRfd2ZheikNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF93ZmF6MSA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMod2ZheikgJT4lDQogIHB1bGwod2ZheikNCg0KIyBOVU1CRVIgT0YgT1VUTElFUlMgSU4gV0VJR0hUIEZPUiBBR0UgWiBTQ09SRQ0KbGVuZ3RoKHN1YnNldF93ZmF6MSkNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF9oZmF6IDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBmaWx0ZXIoY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBwdWxsKGhmYXopDQoNCiMgU1VNTUFSWSBPRiBIRUlHSFQgRk9SIEFHRSBaIFNDT1JFIChDQVNFUykNCnN1bW1hcnkoc3Vic2V0X2hmYXopDQojIE5VTUJFUiBPRiBDQVNFUyBJTiBIRUlHSFQgRk9SIEFHRSBaIFNDT1JFDQpsZW5ndGgoc3Vic2V0X2hmYXopDQpgYGANCg0KYGBge3J9DQpzdWJzZXRfaGZhejEgPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIGlkZW50aWZ5X291dGxpZXJzKGhmYXopICU+JQ0KICBwdWxsKGhmYXopDQoNCiMgTlVNQkVSIE9GIE9VVExJRVJTIEZPUiBIRUlHSFQgRk9SIEFHRSBaIFNDT1JFDQpsZW5ndGgoc3Vic2V0X2hmYXoxKQ0KYGBgDQoNCmBgYHtyfQ0Kc3Vic2V0X3dmaHogPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIHB1bGwod2ZoeikNCg0KIyBTVU1NQVJZIE9GIFdFSUdIVCBGT1IgSEVJR0hUIFogU0NPUkUgKENBU0VTKQ0Kc3VtbWFyeShzdWJzZXRfd2ZoeikNCiMgTlVNQkVSIE9GIENBU0VTIElOIFdFSUdIVCBGT1IgSEVJR0hUIFogU0NPUkUNCmxlbmd0aChzdWJzZXRfd2ZoeikNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF93Zmh6MSA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMod2ZoeikgJT4lDQogIHB1bGwod2ZoeikNCg0KIyBOVU1CRVIgT0YgT1VUTElFUlMgSU4gV0VJR0hUIEZPUiBIRUlHSFQgWiBTQ09SRQ0KbGVuZ3RoKHN1YnNldF93Zmh6MSkNCmBgYA0KDQpgYGB7cn0NCnN1YnNldF9iYXogPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSAmIGFnZV95ZWFycyA+PTIpICU+JQ0KICBwdWxsKGJheikNCg0KIyBTVU1NQVJZIE9GIEJNSSBGT1IgQUdFIFogU0NPUkUgKENBU0VTKQ0Kc3VtbWFyeShzdWJzZXRfYmF6KQ0KIyBOVU1CRVIgT0YgQ0FTRVMgSU4gQk1JIEZPUiBBR0UgWiBTQ09SRQ0KbGVuZ3RoKHN1YnNldF9iYXopDQpgYGANCg0KYGBge3J9DQpzdWJzZXRfYmF6MSA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxICYgYWdlX3llYXJzID49MikgJT4lDQogIGlkZW50aWZ5X291dGxpZXJzKGJheikgJT4lDQogIHB1bGwoYmF6KQ0KDQojIE5VTUJFUiBPRiBPVVRMSUVSUyBJTiBCTUkgRk9SIEFHRSBaIFNDT1JFDQpsZW5ndGgoc3Vic2V0X2JhejEpDQpgYGANCg0KYGBge3J9DQpzdWJzZXRfbXVhYyA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGFnZV9ncm91cCA9PSAxICYgY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBwdWxsKG11YWMpDQoNCiMgU1VNTUFSWSBPRiBNVUFDIChDQVNFUywgNi01OSBNT05USFMpDQpzdW1tYXJ5KHN1YnNldF9tdWFjKQ0KIyBOVU1CRVIgT0YgQ0FTRVMgSU4gTVVBQw0KbGVuZ3RoKHN1YnNldF9tdWFjKQ0KYGBgDQoNCmBgYHtyfQ0Kc3Vic2V0X211YWMxIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBmaWx0ZXIoYWdlX2dyb3VwID09IDEgJiBjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIGlkZW50aWZ5X291dGxpZXJzKG11YWMpICU+JQ0KICBwdWxsKG11YWMpDQoNCiMgTlVNQkVSIE9GIE9VVExJRVJTIElOIE1VQUMNCmxlbmd0aChzdWJzZXRfbXVhYzEpDQpgYGANCg0KYGBge3J9DQojIENSRUFURVMgQk9YUExPVCBBTkQgSElTVE9HUkFNIEZPUiBXRUlHSFQgRk9SIEhFSUdIVCBaIFNDT1JFIChDQVNFUykNCmxheW91dChtYXQgPSBtYXRyaXgoYygxLDIpLDIsMSwgYnlyb3c9VFJVRSksICBoZWlnaHQgPSBjKDEsOCkpDQogcGFyKG1hcj1jKDAsIDMuMSwgMS4xLCAyLjEpKQ0KYm94cGxvdChQU0ZJX2RmX21hbG51dHJpdGlvbiR3Zmh6W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXSAsIGhvcml6b250YWw9VFJVRSAsIHlsaW09YygtMTEsNDMpLCB4YXh0PSJuIiAsIGNvbD1yZ2IoMC44LDAuOCwwLDAuNSkgLCBmcmFtZT1GKQ0KcGFyKG1hcj1jKDQsIDMuMSwgMS4xLCAyLjEpKQ0KaGlzdChQU0ZJX2RmX21hbG51dHJpdGlvbiR3Zmh6W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXQ0KICAgICAsIGJyZWFrcz01MCAsIGNvbD1yZ2IoMSwwLjgsMC44LDEpICwgYm9yZGVyPUYgLCBtYWluPSIiICwgeGxhYj0iV2VpZ2h0LWZvci1oZWlnaHQgKHotc2NvcmUpIiwgeGxpbT1jKC0xMSw0MykpDQpgYGANCg0KYGBge3J9DQojIENSRUFURVMgQk9YUExPVCBBTkQgSElTVE9HUkFNIE9GIFdFSUdIVCBGT1IgQUdFIChDQVNFUykNCmxheW91dChtYXQgPSBtYXRyaXgoYygxLDIpLDIsMSwgYnlyb3c9VFJVRSksICBoZWlnaHQgPSBjKDEsOCkpDQogcGFyKG1hcj1jKDAsIDMuMSwgMS4xLCAyLjEpKQ0KYm94cGxvdChQU0ZJX2RmX21hbG51dHJpdGlvbiR3ZmF6W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxXSAsIGhvcml6b250YWw9VFJVRSAsIHlsaW09YygtOCwxMSksIHhheHQ9Im4iICwgY29sPXJnYigwLjgsMC44LDAsMC41KSAsIGZyYW1lPUYpDQpwYXIobWFyPWMoNCwgMy4xLCAxLjEsIDIuMSkpDQpoaXN0KFBTRklfZGZfbWFsbnV0cml0aW9uJHdmYXpbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdDQogICAgICwgYnJlYWtzPTUwICwgY29sPXJnYigxLDAuOCwwLjgsMSkgLCBib3JkZXI9RiAsIG1haW49IiIgLCB4bGFiPSJXZWlnaHQtZm9yLWFnZSAoei1zY29yZSkiLCB4bGltPWMoLTgsMTEpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEJPWFBMT1QgQU5EIEhJU1RPR1JBTSBPRiBCTUkgRk9SIEFHRSAoQ0FTRVMpDQpsYXlvdXQobWF0ID0gbWF0cml4KGMoMSwyKSwyLDEsIGJ5cm93PVRSVUUpLCAgaGVpZ2h0ID0gYygxLDgpKQ0KIHBhcihtYXI9YygwLCAzLjEsIDEuMSwgMi4xKSkNCmJveHBsb3QoUFNGSV9kZl9tYWxudXRyaXRpb24kYmF6W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxICYgUFNGSV9kZl9tYWxudXRyaXRpb24kYWdlX3llYXJzID49Ml0gLCBob3Jpem9udGFsPVRSVUUgLCB5bGltPWMoLTEzLDMzKSwgeGF4dD0ibiIgLCBjb2w9cmdiKDAuOCwwLjgsMCwwLjUpICwgZnJhbWU9RikNCnBhcihtYXI9Yyg0LCAzLjEsIDEuMSwgMi4xKSkNCmhpc3QoUFNGSV9kZl9tYWxudXRyaXRpb24kYmF6W1BTRklfZGZfbWFsbnV0cml0aW9uJGNhc2VfY29udHJvbCA9PSAxICYgUFNGSV9kZl9tYWxudXRyaXRpb24kYWdlX3llYXJzID49Ml0NCiAgICAgLCBicmVha3M9NTAgLCBjb2w9cmdiKDEsMC44LDAuOCwxKSAsIGJvcmRlcj1GICwgbWFpbj0iIiAsIHhsYWI9IkJNSS1mb3ItYWdlICh6LXNjb3JlKSIsIHhsaW09YygtMTMsMzMpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEUgQk9YUExPVCBBTkQgSElTVE9HUkFNIE9GIEhFSUdIVCBGT1IgQUdFIA0KbGF5b3V0KG1hdCA9IG1hdHJpeChjKDEsMiksMiwxLCBieXJvdz1UUlVFKSwgIGhlaWdodCA9IGMoMSw4KSkNCiBwYXIobWFyPWMoMCwgMy4xLCAxLjEsIDIuMSkpDQpib3hwbG90KFBTRklfZGZfbWFsbnV0cml0aW9uJGhmYXpbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdICwgaG9yaXpvbnRhbD1UUlVFICwgeWxpbT1jKC0xOSw0NSksIHhheHQ9Im4iICwgY29sPXJnYigwLjgsMC44LDAsMC41KSAsIGZyYW1lPUYpDQpwYXIobWFyPWMoNCwgMy4xLCAxLjEsIDIuMSkpDQpoaXN0KFBTRklfZGZfbWFsbnV0cml0aW9uJGhmYXpbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdDQogICAgICwgYnJlYWtzPTUwICwgY29sPXJnYigxLDAuOCwwLjgsMSkgLCBib3JkZXI9RiAsIG1haW49IiIgLCB4bGFiPSJIZWlnaHQtZm9yLWFnZSAoei1zY29yZSkiLCB4bGltPWMoLTE5LDQ1KSkNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFUyBISVNUT0dSQU0gQU5EIEJPWFBMT1QgT0YgTVVBQyAoQ0FTRVMsIDYtNTkgTU9OVEhTKQ0KbGF5b3V0KG1hdCA9IG1hdHJpeChjKDEsMiksMiwxLCBieXJvdz1UUlVFKSwgIGhlaWdodCA9IGMoMSw4KSkNCnBhcihtYXI9YygwLCAzLjEsIDEuMSwgMi4xKSkNCmJveHBsb3QoUFNGSV9kZl9tYWxudXRyaXRpb24kbXVhY1tQU0ZJX2RmX21hbG51dHJpdGlvbiRjYXNlX2NvbnRyb2wgPT0gMV0gLCBob3Jpem9udGFsPVRSVUUgLCB5bGltPWMoNSwzMCksIHhheHQ9Im4iICwgY29sPXJnYigwLjgsMC44LDAsMC41KSAsIGZyYW1lPUYpDQpwYXIobWFyPWMoNCwgMy4xLCAxLjEsIDIuMSkpDQpoaXN0KFBTRklfZGZfbWFsbnV0cml0aW9uJG11YWNbUFNGSV9kZl9tYWxudXRyaXRpb24kY2FzZV9jb250cm9sID09IDFdDQogICAgICwgYnJlYWtzPTIwICwgY29sPXJnYigxLDAuOCwwLjgsMSkgLCBib3JkZXI9RiAsIG1haW49IiIgLCB4bGFiPSJNaWQtdXBwZXIgYXJtIGNpcmN1bWZlcmVuY2UgKGNtKSIsIHhsaW09Yyg1LDMwKSkNCmFibGluZSh2ID0gMTEuNSwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAgIyBzZXZlcmUNCmFibGluZSh2ID0gMTIuNSwgY29sID0gImJsdWUiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBtb2RlcmF0ZQ0KYGBgDQoNCmBgYHtyfQ0KIyBNQUtFUyBBIFRBQkxFIE9GIE9VVExJRVJTIEZPUiBXRUlHSFQgRk9SIEhFSUdIVA0Kd2Zoel9vdXRsaWVycyA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMod2ZoeikgJT4lDQogIHNlbGVjdChyZWNvcmRfaWQsIGh0LCB3dCwgYWdlX21vbnRocywgYWdlX3llYXJzLCBzZXgsIHdmaHosIGlzLm91dGxpZXIsIGlzLmV4dHJlbWUpDQoNCndmaHpfb3V0bGllcnMNCmBgYA0KYGBge3J9DQojIE1BS0VTIEEgVEFCTEUgT0YgT1VUTElFUlMgRk9SIFdFSUdIVCBGT1IgQUdFDQp3ZmF6X291dGxpZXJzIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBmaWx0ZXIoY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBpZGVudGlmeV9vdXRsaWVycyh3ZmF6KSAlPiUNCiAgc2VsZWN0KHJlY29yZF9pZCxodCwgd3QsIGFnZV9tb250aHMsIGFnZV95ZWFycywgc2V4LCB3ZmF6LCBpcy5vdXRsaWVyLCBpcy5leHRyZW1lKQ0KDQp3ZmF6X291dGxpZXJzDQpgYGANCmBgYHtyfQ0KIyBNQUtFUyBBIFRBQkxFIE9GIE9VVExJRVJTIEZPUiBIRUlHSFQgRk9SIEFHRQ0KaGZhel9vdXRsaWVycyA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMoaGZheikgJT4lDQogIHNlbGVjdChyZWNvcmRfaWQsIGh0LCB3dCwgYWdlX21vbnRocywgYWdlX3llYXJzLCBzZXgsIGhmYXosIGlzLm91dGxpZXIsIGlzLmV4dHJlbWUpDQoNCmhmYXpfb3V0bGllcnMNCmBgYA0KYGBge3J9DQojIE1BS0VTIEEgVEFCTEUgT0YgT1VUTElFUlMgRk9SIEJNSSBGT1IgQUdFDQpiYXpfb3V0bGllcnMgPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSAmIGFnZV95ZWFycyA+PTIpICU+JQ0KICBpZGVudGlmeV9vdXRsaWVycyhiYXopICU+JQ0KICBzZWxlY3QocmVjb3JkX2lkLCBodCwgd3QsIGJheiwgYWdlX21vbnRocywgYWdlX3llYXJzLCBzZXgsIGlzLm91dGxpZXIsIGlzLmV4dHJlbWUpDQoNCmJhel9vdXRsaWVycw0KYGBgDQoNCmBgYHtyfQ0KIyBNQUtFUyBBIFRBQkxFIE9GIE9VVExJRVJTIEZPUiBNVUFDDQoNCm11YWNfb3V0bGllcnMgPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihhZ2VfZ3JvdXAgPT0gMSAmIGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMobXVhYykgJT4lDQogIHNlbGVjdChyZWNvcmRfaWQsIGh0LCB3dCwgYWdlX21vbnRocywgYWdlX3llYXJzLCBzZXgsIG11YWMsIGlzLm91dGxpZXIsIGlzLmV4dHJlbWUpDQoNCm11YWNfb3V0bGllcnMNCmBgYA0KDQpgYGB7cn0NCiMgQ1JFQVRFIEEgU1VNTUFSWSBUQUJMRSBPRiBPVVRMSUVSIFNUQVRVUyBGT1IgQUxMIEFOVEhST1BPTUVUUklDIElORElDQVRPUlMNCg0KYW50aHJvX291dGxpZXJfc3VtbWFyeSA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgDQogIG11dGF0ZSgNCiAgICAgICAgbXVhY19vdXRsaWVyID0gaWZfZWxzZSgNCiAgICAgIGFnZV9ncm91cCA9PSAxLA0KICAgICAgbXVhYyAlaW4lICgNCiAgICAgICAgUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogICAgICAgICAgZmlsdGVyKGFnZV9ncm91cCA9PSAxICYgY2FzZV9jb250cm9sID09IDEpICU+JQ0KICAgICAgICAgIGlkZW50aWZ5X291dGxpZXJzKG11YWMpICU+JQ0KICAgICAgICAgIGZpbHRlcihpcy5vdXRsaWVyKSAlPiUNCiAgICAgICAgICBwdWxsKG11YWMpDQogICAgICApLA0KICAgICAgRkFMU0UNCiAgICApLA0KICAgIGhmYXpfb3V0bGllciA9IGhmYXogJWluJSAoDQogICAgICBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgICAgICAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgICAgICAgaWRlbnRpZnlfb3V0bGllcnMoaGZheikgJT4lDQogICAgICAgIGZpbHRlcihpcy5vdXRsaWVyKSAlPiUNCiAgICAgICAgcHVsbChoZmF6KQ0KICAgICksDQogICAgICAgIHdmYXpfb3V0bGllciA9IHdmYXogJWluJSAoDQogICAgICBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgICAgICAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgICAgICAgaWRlbnRpZnlfb3V0bGllcnMod2ZheikgJT4lDQogICAgICAgIGZpbHRlcihpcy5vdXRsaWVyKSAlPiUNCiAgICAgICAgcHVsbCh3ZmF6KQ0KICAgICksDQogICAgICAgIHdmaHpfb3V0bGllciA9IHdmaHogJWluJSAoDQogICAgICBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgICAgICAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgICAgICAgaWRlbnRpZnlfb3V0bGllcnMod2ZoeikgJT4lDQogICAgICAgIGZpbHRlcihpcy5vdXRsaWVyKSAlPiUNCiAgICAgICAgcHVsbCh3Zmh6KQ0KICAgICksDQogICAgICAgIGJhel9vdXRsaWVyID0gaWZfZWxzZSgNCiAgICAgIGFnZV95ZWFycyA+PSAyLA0KICAgICAgYmF6ICVpbiUgKA0KICAgICAgICBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgICAgICAgICBmaWx0ZXIoY2FzZV9jb250cm9sID09IDEgJiBhZ2VfeWVhcnMgPj0gMikgJT4lDQogICAgICAgICAgaWRlbnRpZnlfb3V0bGllcnMoYmF6KSAlPiUNCiAgICAgICAgICBmaWx0ZXIoaXMub3V0bGllcikgJT4lDQogICAgICAgICAgcHVsbChiYXopDQogICAgICApLA0KICAgICAgRkFMU0UNCiAgICApDQogICkgJT4lDQoNCiAgZmlsdGVyKA0KICAgIG11YWNfb3V0bGllciB8DQogICAgaGZhel9vdXRsaWVyIHwNCiAgICB3ZmF6X291dGxpZXIgfA0KICAgIHdmaHpfb3V0bGllciB8DQogICAgYmF6X291dGxpZXINCiAgKSAlPiUNCiAgDQogICMgc2VsZWN0IHVzZWZ1bCBjb2x1bW5zDQogIHNlbGVjdCgNCiAgICByZWNvcmRfaWQsDQogICAgYWdlX21vbnRocywNCiAgICBhZ2VfeWVhcnMsDQogICAgc2V4LA0KICAgIGh0LA0KICAgIHd0LA0KICAgIA0KICAgIG11YWMsDQogICAgbXVhY19vdXRsaWVyLA0KICAgIA0KICAgIGhmYXosDQogICAgaGZhel9vdXRsaWVyLA0KICAgIA0KICAgIHdmYXosDQogICAgd2Zhel9vdXRsaWVyLA0KICAgIA0KICAgIHdmaHosDQogICAgd2Zoel9vdXRsaWVyLA0KICAgIA0KICAgIGJheiwNCiAgICBiYXpfb3V0bGllcg0KICApDQoNCmFudGhyb19vdXRsaWVyX3N1bW1hcnkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEFOIEVYQ0VMIEZJTEUgT0YgQUxMIE9VVExJRVIgVEFCTEVTDQp3cml0ZS54bHN4KA0KICBsaXN0KA0KICAgIFdGSFogPSB3Zmh6X291dGxpZXJzLA0KICAgIFdGQVogPSB3ZmF6X291dGxpZXJzLA0KICAgIEhBWiA9IGhmYXpfb3V0bGllcnMsDQogICAgTVVBQyA9IG11YWNfb3V0bGllcnMsIA0KICAgIEJBWiA9IGJhel9vdXRsaWVycywgDQogICAgU1VNTUFSWSA9IGFudGhyb19vdXRsaWVyX3N1bW1hcnkNCiAgKSwNCiAgZmlsZSA9ICJhbnRocm9wb21ldHJpY19vdXRsaWVycy54bHN4Ig0KKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEUgQSBUQUJMRSBPRiBBTEwgTkEnUw0KbmFfdGFibGUgPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSkgJT4lDQogIG11dGF0ZSgNCiAgICBoZmF6X21pc3NpbmcgPSBpcy5uYShoZmF6KSwNCiAgICB3ZmF6X21pc3NpbmcgID0gaXMubmEod2ZheiksDQogICAgd2Zoel9taXNzaW5nID0gaXMubmEod2ZoeiksIA0KICAgIG11YWNfbWlzc2luZyA9IGlzLm5hIChtdWFjKSwgDQogICAgYmF6X21pc3NpbmcgPSBpcy5uYSAoYmF6KQ0KICApICU+JQ0KICBmaWx0ZXIoaGZhel9taXNzaW5nIHwgd2Zhel9taXNzaW5nIHwgd2Zoel9taXNzaW5nIHwgYmF6X21pc3NpbmcgfCBtdWFjX21pc3NpbmcpICU+JQ0KICBzZWxlY3QoDQogICAgcmVjb3JkX2lkLA0KICAgIGh0LA0KICAgIHd0LA0KICAgIGFnZV9tb250aHMsDQogICAgaGZheiwNCiAgICB3ZmF6LA0KICAgIHdmaHosDQogICAgYmF6LA0KICAgIG11YWMsIA0KICAgIGhmYXpfbWlzc2luZywNCiAgICB3ZmF6X21pc3NpbmcsDQogICAgd2Zoel9taXNzaW5nLCANCiAgICBiYXpfbWlzc2luZywNCiAgICBtdWFjX21pc3NpbmcNCiAgKQ0KDQpuYV90YWJsZQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEEgVEFCTEUgVEhBVCBTVU1NQVJJWkVTIE1JU1NJTkdORVNTIEFORCBPVVRMSUVSUyBERVBFTkRJTkcgT04gQU5USFJPUE9NRVRSSUMgTUVBU1VSRQ0KYW50aHJvX3ZhcnMgPC0gYygiaGZheiIsICJ3ZmF6IiwgIndmaHoiLCAiYmF6IiwgIm11YWMiKQ0KDQpjYXNlc19kZiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKQ0KDQphbnRocm9fc3VtbWFyeSA8LSBsYXBwbHkoYW50aHJvX3ZhcnMsIGZ1bmN0aW9uKHZhcikgew0KDQogIGRmX3ZhciA8LSBjYXNlc19kZiAlPiUNCiAgICBmaWx0ZXIoDQogICAgICBjYXNlX3doZW4oDQogICAgICAgIHZhciA9PSAibXVhYyIgfiBhZ2VfZ3JvdXAgPT0gMSwNCiAgICAgICAgdmFyID09ICJiYXoiICB+IGFnZV95ZWFycyA+PSAyLA0KICAgICAgICBUUlVFIH4gVFJVRQ0KICAgICAgKQ0KICAgICkNCg0KICB4IDwtIGRmX3ZhcltbdmFyXV0NCiAgDQogIG91dGxpZXJfaW5mbyA8LSBkZl92YXIgJT4lDQogICAgc2VsZWN0KGFsbF9vZih2YXIpKSAlPiUNCiAgICBpZGVudGlmeV9vdXRsaWVycyghIXN5bSh2YXIpKQ0KDQogIHRpYmJsZSgNCiAgICBtZWFzdXJlID0gdmFyLA0KICAgIG5fZWxpZ2libGUgPSBucm93KGRmX3ZhciksDQogICAgbiA9IHN1bSghaXMubmEoeCkpLA0KICAgIG5fbWlzc2luZyA9IHN1bShpcy5uYSh4KSksDQogICAgcGN0X21pc3NpbmcgPSByb3VuZChtZWFuKGlzLm5hKHgpKSAqIDEwMCwgMiksDQogICAgbl9vdXRsaWVycyA9IHN1bShvdXRsaWVyX2luZm8kaXMub3V0bGllciwgbmEucm0gPSBUUlVFKSwNCiAgICBuX2V4dHJlbWVfb3V0bGllcnMgPSBzdW0ob3V0bGllcl9pbmZvJGlzLmV4dHJlbWUsIG5hLnJtID0gVFJVRSkNCiAgKQ0KfSkgJT4lDQogIGJpbmRfcm93cygpDQoNCmFudGhyb19zdW1tYXJ5DQpgYGANCg0KDQpgYGB7cn0NCiMgTUFLRVMgRVhDRUwgVEFCTEUgT0YgbmFfdGFibGUgQU5EIGFudGhyb19zdW1tYXJ5DQp3cml0ZS54bHN4KA0KICBsaXN0KA0KICAgIE1pc3NpbmcgPSBuYV90YWJsZSwNCiAgICBTdW1tYXJ5ID0gYW50aHJvX3N1bW1hcnkNCiAgKSwNCiAgZmlsZSA9ICJOQS54bHN4IikNCmBgYA0KDQoNCiMjIDEuNSBEYXRhIGNoZWNrDQoNCmBgYHtyfQ0KIyBDT01QQVJFUyBNSVNTSU5HTkVTUyBBQ1JPU1MgU0NPVFQnUyBaLVNDT1JFUyBBTkQgTUlORQ0Kc3VtbWFyeV9kZiA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKQ0KDQptaXNzaW5nX3N1bW1hcnkgPC0gdGliYmxlKA0KDQogIGNvbXBhcmlzb24gPSBjKA0KICAgICJXZWlnaHQtZm9yLWhlaWdodCB6LXNjb3JlIiwNCiAgICAiV2VpZ2h0LWZvci1hZ2Ugei1zY29yZSIsDQogICAgIkJNSS1mb3ItYWdlIHotc2NvcmUiDQogICksDQoNCiAgbl90b3RhbCA9IGMoDQogICAgbnJvdyhzdW1tYXJ5X2RmKSwNCiAgICBucm93KHN1bW1hcnlfZGYpLA0KICAgIHN1bShzdW1tYXJ5X2RmJGFnZV95ZWFycyA+PSAyLCBuYS5ybSA9IFRSVUUpDQogICksDQoNCiAgbWlzc2luZ19zY290dCA9IGMoDQogICAgc3VtKGlzLm5hKHN1bW1hcnlfZGYkd2h6KSksDQogICAgc3VtKGlzLm5hKHN1bW1hcnlfZGYkd2F6KSksDQogICAgc3VtKGlzLm5hKHN1bW1hcnlfZGYkYm1peikgJiBzdW1tYXJ5X2RmJGFnZV95ZWFycyA+PSAyLCBuYS5ybSA9IFRSVUUpDQogICksDQoNCiAgbWlzc2luZ19iZW5qYW1pbiA9IGMoDQogICAgc3VtKGlzLm5hKHN1bW1hcnlfZGYkd2ZoeikpLA0KICAgIHN1bShpcy5uYShzdW1tYXJ5X2RmJHdmYXopKSwNCiAgICBzdW0oaXMubmEoc3VtbWFyeV9kZiRiYXopICYgc3VtbWFyeV9kZiRhZ2VfeWVhcnMgPj0gMiwgbmEucm0gPSBUUlVFKQ0KICApLA0KDQogIG1pc3NpbmdfZWl0aGVyID0gYygNCiAgICBzdW0oaXMubmEoc3VtbWFyeV9kZiR3aHopIHwgaXMubmEoc3VtbWFyeV9kZiR3Zmh6KSksDQogICAgc3VtKGlzLm5hKHN1bW1hcnlfZGYkd2F6KSB8IGlzLm5hKHN1bW1hcnlfZGYkd2ZheikpLA0KICAgIHN1bSgNCiAgICAgIChpcy5uYShzdW1tYXJ5X2RmJGJtaXopIHwgaXMubmEoc3VtbWFyeV9kZiRiYXopKSAmDQogICAgICBzdW1tYXJ5X2RmJGFnZV95ZWFycyA+PSAyLA0KICAgICAgbmEucm0gPSBUUlVFDQogICAgKQ0KICApDQopDQoNCm1pc3Npbmdfc3VtbWFyeQ0KYGBgDQoNCmBgYHtyfQ0KIyBDUkVBVEVTIEJMQU5ELUFMVE1BTiBQTE9UIEZPUiBTQ09UVFMnIFotU0NPUkVTIEFORCBNWSBaLVNDT1JFUyBUTyBBU1NFU1MgRElGRkVSRU5DRSBJTiBPVVIgTUVBU1VSRU1FTlRTDQoNCmJhX3dmaCA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgZmlsdGVyKCFpcy5uYSh3aHopLCAhaXMubmEod2ZoeikpICU+JQ0KICBtdXRhdGUoDQogICAgbWVhbl96ID0gKHdoeiArIHdmaHopIC8gMiwNCiAgICBkaWZmX3ogPSB3aHogLSB3Zmh6DQogICkNCg0KbWVhbl9kaWZmIDwtIG1lYW4oYmFfd2ZoJGRpZmZfeikNCnNkX2RpZmYgPC0gc2QoYmFfd2ZoJGRpZmZfeikNCg0KdXBwZXIgPC0gbWVhbl9kaWZmICsgMS45NiAqIHNkX2RpZmYNCmxvd2VyIDwtIG1lYW5fZGlmZiAtIDEuOTYgKiBzZF9kaWZmDQoNCmdncGxvdChiYV93ZmgsIGFlcyh4ID0gbWVhbl96LCB5ID0gZGlmZl96KSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW5fZGlmZikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB1cHBlciwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBsb3dlciwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIldlaWdodC1mb3ItaGVpZ2h0OiBXSFogKFNjb3R0KSB2cyBXRkhaIChCZW5qYW1pbikiLA0KICAgIHggPSAiTWVhbiBvZiBXSFogYW5kIFdGSFoiLA0KICAgIHkgPSAiRGlmZmVyZW5jZSAoV0haIC0gV0ZIWikiDQogICkNCg0KYmFfd2ZhIDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBmaWx0ZXIoY2FzZV9jb250cm9sID09IDEpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHdheiksICFpcy5uYSh3ZmF6KSkgJT4lDQogIG11dGF0ZSgNCiAgICBtZWFuX3ogPSAod2F6ICsgd2ZheikgLyAyLA0KICAgIGRpZmZfeiA9IHdheiAtIHdmYXoNCiAgKQ0KDQptZWFuX2RpZmYgPC0gbWVhbihiYV93ZmEkZGlmZl96KQ0Kc2RfZGlmZiA8LSBzZChiYV93ZmEkZGlmZl96KQ0KDQp1cHBlciA8LSBtZWFuX2RpZmYgKyAxLjk2ICogc2RfZGlmZg0KbG93ZXIgPC0gbWVhbl9kaWZmIC0gMS45NiAqIHNkX2RpZmYNCg0KZ2dwbG90KGJhX3dmYSwgYWVzKHggPSBtZWFuX3osIHkgPSBkaWZmX3opKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbl9kaWZmKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHVwcGVyLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGxvd2VyLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiV2VpZ2h0LWZvci1hZ2U6IFdBWiAoU2NvdHQpIHZzIFdGQVogKEJlbmphbWluKSIsDQogICAgeCA9ICJNZWFuIG9mIFdBWiBhbmQgV0ZBWiIsDQogICAgeSA9ICJEaWZmZXJlbmNlIChXQVogLSBXRkFaKSINCiAgKQ0KDQpiYV9iYXogPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSAmIGFnZV95ZWFycyA+PTIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGJtaXopLCAhaXMubmEoYmF6KSkgJT4lDQogIG11dGF0ZSgNCiAgICBtZWFuX3ogPSAoYm1peiArIGJheikgLyAyLA0KICAgIGRpZmZfeiA9IGJtaXogLSBiYXoNCiAgKQ0KDQptZWFuX2RpZmYgPC0gbWVhbihiYV9iYXokZGlmZl96KQ0Kc2RfZGlmZiA8LSBzZChiYV9iYXokZGlmZl96KQ0KDQp1cHBlciA8LSBtZWFuX2RpZmYgKyAxLjk2ICogc2RfZGlmZg0KbG93ZXIgPC0gbWVhbl9kaWZmIC0gMS45NiAqIHNkX2RpZmYNCg0KZ2dwbG90KGJhX2JheiwgYWVzKHggPSBtZWFuX3osIHkgPSBkaWZmX3opKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbl9kaWZmKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHVwcGVyLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGxvd2VyLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQk1JLWZvci1hZ2U6IEJNSVogKFNjb3R0KSB2cyBCQVogKEJlbmphbWluKSIsDQogICAgeCA9ICJNZWFuIG9mIEJNSVogYW5kIEJBWiIsDQogICAgeSA9ICJEaWZmZXJlbmNlIChCTUlaIC0gQkFaKSINCiAgKQ0KYGBgDQpgYGB7cn0NCiMgQ0FDTFVMQVRFIE1FQU4gRElGRiBBTkQgQ0kgDQpiYV93ZmggPC0gUFNGSV9kZl9tYWxudXRyaXRpb24gJT4lDQogIGZpbHRlcihjYXNlX2NvbnRyb2wgPT0gMSwgIWlzLm5hKHdoeiksICFpcy5uYSh3Zmh6KSkNCg0KYmxhbmQuYWx0bWFuLnN0YXRzKGJhX3dmaCR3aHosIGJhX3dmaCR3Zmh6KQ0KDQoNCmJhX3dmYSA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxLCAhaXMubmEod2F6KSwgIWlzLm5hKHdmYXopKQ0KDQpibGFuZC5hbHRtYW4uc3RhdHMoYmFfd2ZhJHdheiwgYmFfd2ZhJHdmYXopDQoNCg0KYmFfYmF6IDwtIFBTRklfZGZfbWFsbnV0cml0aW9uICU+JQ0KICBmaWx0ZXIoY2FzZV9jb250cm9sID09IDEgJiBhZ2VfeWVhcnMgPj0yLCAhaXMubmEoYm1peiksICFpcy5uYShiYXopKQ0KDQpibGFuZC5hbHRtYW4uc3RhdHMoYmFfYmF6JGJtaXosIGJhX2JheiRiYXopDQoNCmBgYA0KYGBge3J9DQojIE1BS0UgQSBUQUJMRSBPRiBUSEUgQ0FTRVMgV0hFUkUgVEhFIERJRkZFUkVOQ0UgQkVUV0VFTiBPVVIgWi1TQ09SRVMgSVMgSElHSEVSIFRIQU4gMC41DQpoaWdoX2RpZmZfcm93cyA8LSBQU0ZJX2RmX21hbG51dHJpdGlvbiAlPiUNCiAgZmlsdGVyKGNhc2VfY29udHJvbCA9PSAxKSAlPiUNCiAgbXV0YXRlKA0KICAgIGRpZmZfd2ZoID0gd2h6IC0gd2ZoeiwNCiAgICBkaWZmX3dmYSA9IHdheiAtIHdmYXosDQogICAgZGlmZl9iYXogPSBpZmVsc2UoDQogICAgICBhZ2VfeWVhcnMgPj0gMiwNCiAgICAgIGJtaXogLSBiYXosDQogICAgICBOQQ0KICAgICkNCiAgKSAlPiUNCiAgZmlsdGVyKA0KICAgIGFicyhkaWZmX3dmaCkgPiAwLjUgfA0KICAgIGFicyhkaWZmX3dmYSkgPiAwLjUgfA0KICAgIChhZ2VfeWVhcnMgPj0gMiAmIGFicyhkaWZmX2JheikgPiAwLjUpDQogICkgJT4lDQogIHNlbGVjdCgNCiAgICByZWNvcmRfaWQsIGFnZV95ZWFycywgYWdlX21vbnRocywgc2V4LCBodCwgd3QsDQogICAgd2h6LCB3Zmh6LCBkaWZmX3dmaCwNCiAgICB3YXosIHdmYXosIGRpZmZfd2ZhLA0KICAgIGJtaXosIGJheiwgZGlmZl9iYXoNCiAgKSAlPiUNCiAgYXJyYW5nZSgNCiAgICBkZXNjKA0KICAgICAgcG1heCgNCiAgICAgICAgYWJzKGRpZmZfd2ZoKSwNCiAgICAgICAgYWJzKGRpZmZfd2ZhKSwNCiAgICAgICAgYWJzKGRpZmZfYmF6KSwNCiAgICAgICAgbmEucm0gPSBUUlVFDQogICAgICApDQogICAgKQ0KICApDQoNCmhpZ2hfZGlmZl9yb3dzDQpgYGANCmBgYHtyfSANCiMgQVNTRVNTIEhPVyBNQU5ZIE9GIFRIRSBDQVNFUyBXSVRIIFotU0NPUkUgRElGRkVSRU5DRVMgT1ZFUiAwLjUgSEFWRSBBIFotU0NPUkUgT1ZFUiAzDQpoaWdoX2RpZmZfcm93cyAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG5fdG90YWwgPSBuKCksDQoNCiAgICBuX2FueV96X292ZXJfNSA9IHN1bSgNCiAgICAgIGFicyh3aHopICA+IDUgfA0KICAgICAgYWJzKHdmaHopID4gNSB8DQogICAgICBhYnMod2F6KSAgPiA1IHwNCiAgICAgIGFicyh3ZmF6KSA+IDUgfA0KICAgICAgYWJzKGJtaXopID4gNSB8DQogICAgICBhYnMoYmF6KSAgPiA1LA0KICAgICAgbmEucm0gPSBUUlVFDQogICAgKSwNCg0KICAgIHBlcmNlbnRfYW55X3pfb3Zlcl81ID0gMTAwICogbl9hbnlfel9vdmVyXzUgLyBuX3RvdGFsDQogICkNCmBgYA0KDQoNCmBgYHtyfQ0Kd3JpdGUueGxzeChQU0ZJX2RmX21hbG51dHJpdGlvbiwgZmlsZSA9ICJQU0ZJX2ZpbmFsX21hbG51dHJpdGlvbi54bHN4IikNCmBgYA0K