install.packages("ggpubr") 
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.4/ggpubr_1.0.0.tgz'
Content type 'application/x-gzip' length 2339408 bytes (2.2 MB)
==================================================
downloaded 2.2 MB

The downloaded binary packages are in
    /var/folders/tt/xvxrmmbj3kx2bfx4jft8r6c00000gn/T//RtmpfeyHYK/downloaded_packages
install.packages("dplyr")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.4/dplyr_1.2.1.tgz'
Content type 'application/x-gzip' length 1647478 bytes (1.6 MB)
==================================================
downloaded 1.6 MB

The downloaded binary packages are in
    /var/folders/tt/xvxrmmbj3kx2bfx4jft8r6c00000gn/T//RtmpfeyHYK/downloaded_packages
install.packages("modeest")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.4/modeest_2.4.0.tgz'
Content type 'application/x-gzip' length 142945 bytes (139 KB)
==================================================
downloaded 139 KB

The downloaded binary packages are in
    /var/folders/tt/xvxrmmbj3kx2bfx4jft8r6c00000gn/T//RtmpfeyHYK/downloaded_packages
install.packages("pastecs")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.4/pastecs_1.4.2.tgz'
Content type 'application/x-gzip' length 486974 bytes (475 KB)
==================================================
downloaded 475 KB

The downloaded binary packages are in
    /var/folders/tt/xvxrmmbj3kx2bfx4jft8r6c00000gn/T//RtmpfeyHYK/downloaded_packages
library("ggpubr")
library("dplyr")
library("modeest")
library("pastecs")
library("xfun")
Error in value[[3L]](cond) : 
  Package ‘xfun’ version 0.46 cannot be unloaded:
 Error in unloadNamespace(package) : namespace ‘xfun’ is imported by ‘knitr’ so cannot be unloaded

Part 1

A. Continuous B. Ordinal C. Nominal D. Dichotomous

  1. A. Continous: Systolic blood pressure measured in mm Hg

  2. B. Ordinal: Self-reported health status classified as poor, fair, good, or excellent

  3. D. Dichotomous: Current smoking status classified as smoker or non-smoker

  4. C. Nominal: Blood type classified as A, B, AB, or O

  5. A. Continous: Body weight measured in kilograms

1) Data structure and initial inspection

After importing the data:

#import dataset

liverdisease_data <- read.csv("~/Desktop/binf605R/liverdisease.csv")
  1. Report the number of observations (rows) and number of variables (columns).
summary.data.frame(liverdisease_data, digits = 1)
      Age         Sex               Tot_Bil        Dir_Bil        Alkphos        Alamine       Aspartate   
 Min.   : 4   Length:583         Min.   : 0.4   Min.   : 0.1   Min.   :  63   Min.   :  10   Min.   :  10  
 1st Qu.:33   Class :character   1st Qu.: 0.8   1st Qu.: 0.2   1st Qu.: 176   1st Qu.:  23   1st Qu.:  25  
 Median :45   Mode  :character   Median : 1.0   Median : 0.3   Median : 208   Median :  35   Median :  42  
 Mean   :45                      Mean   : 3.3   Mean   : 1.5   Mean   : 291   Mean   :  81   Mean   : 110  
 3rd Qu.:58                      3rd Qu.: 2.6   3rd Qu.: 1.3   3rd Qu.: 298   3rd Qu.:  60   3rd Qu.:  87  
 Max.   :90                      Max.   :75.0   Max.   :19.7   Max.   :2110   Max.   :2000   Max.   :4929  
                                                                                                           
    Tot_Prot     Albumin      A_G_Ratio      Disease   
 Min.   : 3   Min.   :0.9   Min.   :0.3   Min.   :0.0  
 1st Qu.: 6   1st Qu.:2.6   1st Qu.:0.7   1st Qu.:0.0  
 Median : 7   Median :3.1   Median :0.9   Median :1.0  
 Mean   : 6   Mean   :3.1   Mean   :0.9   Mean   :0.7  
 3rd Qu.: 7   3rd Qu.:3.8   3rd Qu.:1.1   3rd Qu.:1.0  
 Max.   :10   Max.   :5.5   Max.   :2.8   Max.   :1.0  
                            NA's   :4                  
  1. Display the variable names and their data types/classes.
names(liverdisease_data)
 [1] "Age"       "Sex"       "Tot_Bil"   "Dir_Bil"   "Alkphos"   "Alamine"   "Aspartate" "Tot_Prot"  "Albumin"  
[10] "A_G_Ratio" "Disease"  
  1. Display the first 10 observations.
#first 10 of data table
head(liverdisease_data, 10)
  1. Based on the data dictionary, identify which variables should be treated as continuous and which should be treated as categorical.

Age = Categorical

Sex = Categorical

Tot_Bil = Continuous

Dir_Bil = Continous

Alk_Phos = Continous

Alamine = Continous

Aspartate = Continous

Tot_Prot = Continous

Albumin = Continous

A_G_Ration = Continous

Disease = Categorical

2) Distribution of Age

For the variable Age:

  1. Construct a stem-and-leaf plot.
stem(liverdisease_data$Age)

  The decimal point is 1 digit(s) to the right of the |

  0 | 44
  0 | 6778
  1 | 0122333344
  1 | 5666777778888888888899
  2 | 000111111122222222233344444
  2 | 5555566666666666666777777888888889999999
  3 | 0000000000111111112222222222222222222233333333333333344444444
  3 | 55555555555566666666666777777777888888888888888888888999999
  4 | 00000000000000000111112222222222222222222223333444
  4 | 55555555555555555555555556666666666666666777777888888888888888888889
  5 | 000000000000000000000001111111111222222233333344444444
  5 | 5555555555555555556666777777788888888888888
  6 | 00000000000000000000000000000000001111122222222233444444
  6 | 555555555555555556666666666667888899
  7 | 00000000022222222334444
  7 | 555555555555558
  8 | 4
  8 | 5
  9 | 0
  1. Construct a histogram with appropriate axis labels and a title.
gghistogram(liverdisease_data, x = "Age", bins = 9, add = "mean", title = "Distribution of Age")

  1. Construct a box plot.
ggboxplot(liverdisease_data, y = "Age", width = 0.5, xlab = "Distribution")

  1. Based on these graphical displays, briefly describe the distribution of Age in terms of its center, spread, shape, and possible outliers.

The distribution of age centers around the middle aged group, around 40-50 years of age. There seems to be a uniform distribution and spread around that point, with decreasing individuals in each descending or ascending age group. There are few individual that may be possible outliers at very young ages, below 10, and higher ages above 80.

3) Descriptive statistics

For the continuous variables, calculate: Mean Median Mode Variance Standard deviation Standard error Coefficient of variation Minimum First quartile (Q1) Third quartile (Q3) Maximum Interquartile range (IQR)

continous_liver_disease_data_table <- liverdisease_data %>%
  select(Tot_Bil, Dir_Bil, Alkphos, Alamine, Aspartate, Tot_Prot, Albumin, A_G_Ratio)
  
continous_data_summary <- (stat.desc(continous_liver_disease_data_table)[, -5])
IQR <- sapply(continous_liver_disease_data_table[, -5], IQR, na.rm = TRUE)
Q1 <- sapply(continous_liver_disease_data_table[, -5], quantile, seq(0.25), na.rm = TRUE)
Q3 <- sapply(continous_liver_disease_data_table[, -5], quantile, seq(0.75), na.rm = TRUE)

quartiles <-rbind(IQR, Q1, Q3)
rownames(quartiles) <- c("IQR", "Q1", "Q3")
continous_data_stats_summary <- rbind(continous_data_summary, quartiles)
round(continous_data_stats_summary, 2)

Present the results in a clearly organized table.

Then answer:

For Tot_Bil, compare the mean and median. What does the relationship between these two measures suggest about the shape of its distribution? - The mean is higher than the median, which could indicate that it is a positivly skewed distribution.

This small addition is useful because students need to interpret the statistics rather than merely generate a large table.

####4) Categorical variables#### For Sex and Disease:

  1. Construct a frequency table showing both the number (frequency) and percentage of observations in each category.
liver_disease_categorical_data <-liverdisease_data %>%
  select(Sex, Disease)
df <- as.data.frame(liver_disease_categorical_data)
head(df)
Sex <-df$Sex
Disease <-df$Disease
sex.tbl <- table(Sex)
disease.tbl <- table(Disease)

(sex.tbl)
Sex
  F   M 
142 441 
(disease.tbl)
Disease
  0   1 
167 416 
sex.diseasetbl <-table(Sex, Disease)

round(prop.table(sex.diseasetbl, 1), 2) * 100
   Disease
Sex  0  1
  F 35 65
  M 27 73
  1. Using the Disease variable, report the percentage of patients classified as diseased.
sum(disease.tbl)
[1] 583
disease.tbl[1]
  0 
167 
percent_diseased <- round(disease.tbl[1]/sum(disease.tbl), 2)
(percent_diseased)
   0 
0.29 

####5) Graphical comparison by disease status#### Select one continuous laboratory measurement from the following:

Tot_Bil, Dir_Bil, Alk_Phos, Alamine, Aspartate, Tot_Prot, Albumin, or A_G_Ration.

  1. Construct side-by-side box plots of your selected variable according to Disease status (0 vs. 1).
#Tot_Bil
ggboxplot(liverdisease_data, x = "Disease", y = "Tot_Bil",
          color = "Disease",
          palette = c("#00AFBB", "#E7B800"))

NA
NA
  1. Briefly describe any differences you observe between the two groups in terms of center, spread, and possible outliers.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCAxIE5vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBTaGVsYnkgU2VycmFubwotLS0KYGBge3J9Cmluc3RhbGwucGFja2FnZXMoImdncHViciIpIAppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmluc3RhbGwucGFja2FnZXMoIm1vZGVlc3QiKQppbnN0YWxsLnBhY2thZ2VzKCJwYXN0ZWNzIikKbGlicmFyeSgiZ2dwdWJyIikKbGlicmFyeSgiZHBseXIiKQpsaWJyYXJ5KCJtb2RlZXN0IikKbGlicmFyeSgicGFzdGVjcyIpCgpgYGAKCgpQYXJ0IDEKCkEuIENvbnRpbnVvdXMKQi4gT3JkaW5hbApDLiBOb21pbmFsCkQuIERpY2hvdG9tb3VzCgphLiBBLiBDb250aW5vdXM6IFN5c3RvbGljIGJsb29kIHByZXNzdXJlIG1lYXN1cmVkIGluIG1tIEhnCgpiLiBCLiBPcmRpbmFsOiBTZWxmLXJlcG9ydGVkIGhlYWx0aCBzdGF0dXMgY2xhc3NpZmllZCBhcyBwb29yLCBmYWlyLCBnb29kLCBvciBleGNlbGxlbnQKCmMuIEQuIERpY2hvdG9tb3VzOiBDdXJyZW50IHNtb2tpbmcgc3RhdHVzIGNsYXNzaWZpZWQgYXMgc21va2VyIG9yIG5vbi1zbW9rZXIKCmQuIEMuIE5vbWluYWw6IEJsb29kIHR5cGUgY2xhc3NpZmllZCBhcyBBLCBCLCBBQiwgb3IgTwoKZS4gQS4gQ29udGlub3VzOiBCb2R5IHdlaWdodCBtZWFzdXJlZCBpbiBraWxvZ3JhbXMKCgoKIyMjIyAxKSBEYXRhIHN0cnVjdHVyZSBhbmQgaW5pdGlhbCBpbnNwZWN0aW9uICMjIyMKCkFmdGVyIGltcG9ydGluZyB0aGUgZGF0YToKCmBgYHtyfQojaW1wb3J0IGRhdGFzZXQKCmxpdmVyZGlzZWFzZV9kYXRhIDwtIHJlYWQuY3N2KCJ+L0Rlc2t0b3AvYmluZjYwNVIvbGl2ZXJkaXNlYXNlLmNzdiIpCgpgYGAKCiAgYS4gUmVwb3J0IHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIChyb3dzKSBhbmQgbnVtYmVyIG9mIHZhcmlhYmxlcyAoY29sdW1ucykuCmBgYHtyfQpzdW1tYXJ5LmRhdGEuZnJhbWUobGl2ZXJkaXNlYXNlX2RhdGEsIGRpZ2l0cyA9IDEpCmBgYAoKYi4gRGlzcGxheSB0aGUgdmFyaWFibGUgbmFtZXMgYW5kIHRoZWlyIGRhdGEgdHlwZXMvY2xhc3Nlcy4KCmBgYHtyfQpuYW1lcyhsaXZlcmRpc2Vhc2VfZGF0YSkKYGBgCgoKYy4gRGlzcGxheSB0aGUgZmlyc3QgMTAgb2JzZXJ2YXRpb25zLgoKYGBge3J9CiNmaXJzdCAxMCBvZiBkYXRhIHRhYmxlCmhlYWQobGl2ZXJkaXNlYXNlX2RhdGEsIDEwKQpgYGAKCmQuIEJhc2VkIG9uIHRoZSBkYXRhIGRpY3Rpb25hcnksIGlkZW50aWZ5IHdoaWNoIHZhcmlhYmxlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBjb250aW51b3VzIGFuZCB3aGljaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBjYXRlZ29yaWNhbC4KCkFnZSA9IENhdGVnb3JpY2FsCgpTZXggPSBDYXRlZ29yaWNhbAoKVG90X0JpbCA9IENvbnRpbnVvdXMKCkRpcl9CaWwgPSBDb250aW5vdXMKCkFsa19QaG9zID0gQ29udGlub3VzCgpBbGFtaW5lID0gQ29udGlub3VzCgpBc3BhcnRhdGUgPSBDb250aW5vdXMKClRvdF9Qcm90ID0gQ29udGlub3VzCgpBbGJ1bWluID0gQ29udGlub3VzCgpBX0dfUmF0aW9uID0gQ29udGlub3VzCgpEaXNlYXNlID0gQ2F0ZWdvcmljYWwKCiMjIyMgMikgRGlzdHJpYnV0aW9uIG9mIEFnZSAjIyMjIwpGb3IgdGhlIHZhcmlhYmxlIEFnZToKCiAgYS4gQ29uc3RydWN0IGEgc3RlbS1hbmQtbGVhZiBwbG90LgpgYGB7cn0Kc3RlbShsaXZlcmRpc2Vhc2VfZGF0YSRBZ2UpCmBgYAogIAoKYi4gQ29uc3RydWN0IGEgaGlzdG9ncmFtIHdpdGggYXBwcm9wcmlhdGUgYXhpcyBsYWJlbHMgYW5kIGEgdGl0bGUuCgoKYGBge3J9CmdnaGlzdG9ncmFtKGxpdmVyZGlzZWFzZV9kYXRhLCB4ID0gIkFnZSIsIGJpbnMgPSA5LCBhZGQgPSAibWVhbiIsIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBBZ2UiKQpgYGAKCgpjLiBDb25zdHJ1Y3QgYSBib3ggcGxvdC4KYGBge3J9CmdnYm94cGxvdChsaXZlcmRpc2Vhc2VfZGF0YSwgeSA9ICJBZ2UiLCB3aWR0aCA9IDAuNSwgeGxhYiA9ICJEaXN0cmlidXRpb24iKQpgYGAKCmQuIEJhc2VkIG9uIHRoZXNlIGdyYXBoaWNhbCBkaXNwbGF5cywgYnJpZWZseSBkZXNjcmliZSB0aGUgZGlzdHJpYnV0aW9uIG9mIEFnZSBpbiB0ZXJtcyBvZiBpdHMgY2VudGVyLCBzcHJlYWQsIHNoYXBlLCBhbmQgcG9zc2libGUgb3V0bGllcnMuCiAgCiAgVGhlIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgY2VudGVycyBhcm91bmQgdGhlIG1pZGRsZSBhZ2VkIGdyb3VwLCBhcm91bmQgNDAtNTAgeWVhcnMgb2YgYWdlLiBUaGVyZSBzZWVtcyB0byBiZSBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGFuZCBzcHJlYWQgYXJvdW5kIHRoYXQgcG9pbnQsIHdpdGggZGVjcmVhc2luZyBpbmRpdmlkdWFscyBpbiBlYWNoIGRlc2NlbmRpbmcgb3IgYXNjZW5kaW5nIGFnZSBncm91cC4gIFRoZXJlIGFyZSBmZXcgaW5kaXZpZHVhbCB0aGF0IG1heSBiZSBwb3NzaWJsZSBvdXRsaWVycyBhdCB2ZXJ5IHlvdW5nIGFnZXMsIGJlbG93IDEwLCBhbmQgaGlnaGVyIGFnZXMgYWJvdmUgODAuIAogIAojIyMjIDMpIERlc2NyaXB0aXZlIHN0YXRpc3RpY3MgIyMjIwpGb3IgdGhlIGNvbnRpbnVvdXMgdmFyaWFibGVzLCBjYWxjdWxhdGU6Ck1lYW4KTWVkaWFuCk1vZGUKVmFyaWFuY2UKU3RhbmRhcmQgZGV2aWF0aW9uClN0YW5kYXJkIGVycm9yCkNvZWZmaWNpZW50IG9mIHZhcmlhdGlvbgpNaW5pbXVtCkZpcnN0IHF1YXJ0aWxlIChRMSkKVGhpcmQgcXVhcnRpbGUgKFEzKQpNYXhpbXVtCkludGVycXVhcnRpbGUgcmFuZ2UgKElRUikKCmBgYHtyfQpjb250aW5vdXNfbGl2ZXJfZGlzZWFzZV9kYXRhX3RhYmxlIDwtIGxpdmVyZGlzZWFzZV9kYXRhICU+JQogIHNlbGVjdChUb3RfQmlsLCBEaXJfQmlsLCBBbGtwaG9zLCBBbGFtaW5lLCBBc3BhcnRhdGUsIFRvdF9Qcm90LCBBbGJ1bWluLCBBX0dfUmF0aW8pCiAgCmBgYAoKYGBge3J9CmNvbnRpbm91c19kYXRhX3N1bW1hcnkgPC0gKHN0YXQuZGVzYyhjb250aW5vdXNfbGl2ZXJfZGlzZWFzZV9kYXRhX3RhYmxlKVssIC01XSkKSVFSIDwtIHNhcHBseShjb250aW5vdXNfbGl2ZXJfZGlzZWFzZV9kYXRhX3RhYmxlWywgLTVdLCBJUVIsIG5hLnJtID0gVFJVRSkKUTEgPC0gc2FwcGx5KGNvbnRpbm91c19saXZlcl9kaXNlYXNlX2RhdGFfdGFibGVbLCAtNV0sIHF1YW50aWxlLCBzZXEoMC4yNSksIG5hLnJtID0gVFJVRSkKUTMgPC0gc2FwcGx5KGNvbnRpbm91c19saXZlcl9kaXNlYXNlX2RhdGFfdGFibGVbLCAtNV0sIHF1YW50aWxlLCBzZXEoMC43NSksIG5hLnJtID0gVFJVRSkKcXVhcnRpbGVzIDwtcmJpbmQoSVFSLCBRMSwgUTMpCnJvd25hbWVzKHF1YXJ0aWxlcykgPC0gYygiSVFSIiwgIlExIiwgIlEzIikKY29udGlub3VzX2RhdGFfc3RhdHNfc3VtbWFyeSA8LSByYmluZChjb250aW5vdXNfZGF0YV9zdW1tYXJ5LCBxdWFydGlsZXMpCnJvdW5kKGNvbnRpbm91c19kYXRhX3N0YXRzX3N1bW1hcnksIDIpCmBgYAoKClByZXNlbnQgdGhlIHJlc3VsdHMgaW4gYSBjbGVhcmx5IG9yZ2FuaXplZCB0YWJsZS4KClRoZW4gYW5zd2VyOgoKRm9yIFRvdF9CaWwsIGNvbXBhcmUgdGhlIG1lYW4gYW5kIG1lZGlhbi4gV2hhdCBkb2VzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSB0d28gbWVhc3VyZXMgc3VnZ2VzdCBhYm91dCB0aGUgc2hhcGUgb2YgaXRzIGRpc3RyaWJ1dGlvbj8KLSBUaGUgbWVhbiBpcyBoaWdoZXIgdGhhbiB0aGUgbWVkaWFuLCB3aGljaCBjb3VsZCBpbmRpY2F0ZSB0aGF0IGl0IGlzIGEgcG9zaXRpdmx5IHNrZXdlZCBkaXN0cmlidXRpb24uIAoKVGhpcyBzbWFsbCBhZGRpdGlvbiBpcyB1c2VmdWwgYmVjYXVzZSBzdHVkZW50cyBuZWVkIHRvIGludGVycHJldCB0aGUgc3RhdGlzdGljcyByYXRoZXIgdGhhbiBtZXJlbHkgZ2VuZXJhdGUgYSBsYXJnZSB0YWJsZS4KCiMjIyM0KSBDYXRlZ29yaWNhbCB2YXJpYWJsZXMjIyMjCkZvciBTZXggYW5kIERpc2Vhc2U6CgphLiBDb25zdHJ1Y3QgYSBmcmVxdWVuY3kgdGFibGUgc2hvd2luZyBib3RoIHRoZSBudW1iZXIgKGZyZXF1ZW5jeSkgYW5kIHBlcmNlbnRhZ2Ugb2Ygb2JzZXJ2YXRpb25zIGluIGVhY2ggY2F0ZWdvcnkuCgpgYGB7cn0KbGl2ZXJfZGlzZWFzZV9jYXRlZ29yaWNhbF9kYXRhIDwtbGl2ZXJkaXNlYXNlX2RhdGEgJT4lCiAgc2VsZWN0KFNleCwgRGlzZWFzZSkKZGYgPC0gYXMuZGF0YS5mcmFtZShsaXZlcl9kaXNlYXNlX2NhdGVnb3JpY2FsX2RhdGEpCmhlYWQoZGYpCmBgYAoKYGBge3J9ClNleCA8LWRmJFNleApEaXNlYXNlIDwtZGYkRGlzZWFzZQpzZXgudGJsIDwtIHRhYmxlKFNleCkKZGlzZWFzZS50YmwgPC0gdGFibGUoRGlzZWFzZSkKCihzZXgudGJsKQooZGlzZWFzZS50YmwpCmBgYAoKCmBgYHtyfQpzZXguZGlzZWFzZXRibCA8LXRhYmxlKFNleCwgRGlzZWFzZSkKCnJvdW5kKHByb3AudGFibGUoc2V4LmRpc2Vhc2V0YmwsIDEpLCAyKSAqIDEwMApgYGAKCgpiLiBVc2luZyB0aGUgRGlzZWFzZSB2YXJpYWJsZSwgcmVwb3J0IHRoZSBwZXJjZW50YWdlIG9mIHBhdGllbnRzIGNsYXNzaWZpZWQgYXMgZGlzZWFzZWQuCmBgYHtyfQpzdW0oZGlzZWFzZS50YmwpCmRpc2Vhc2UudGJsWzFdCgpwZXJjZW50X2Rpc2Vhc2VkIDwtIHJvdW5kKGRpc2Vhc2UudGJsWzFdL3N1bShkaXNlYXNlLnRibCksIDIpCihwZXJjZW50X2Rpc2Vhc2VkKQoKYGBgCgoKIyMjIzUpIEdyYXBoaWNhbCBjb21wYXJpc29uIGJ5IGRpc2Vhc2Ugc3RhdHVzIyMjIwpTZWxlY3Qgb25lIGNvbnRpbnVvdXMgbGFib3JhdG9yeSBtZWFzdXJlbWVudCBmcm9tIHRoZSBmb2xsb3dpbmc6CgpUb3RfQmlsLCBEaXJfQmlsLCBBbGtfUGhvcywgQWxhbWluZSwgQXNwYXJ0YXRlLCBUb3RfUHJvdCwgQWxidW1pbiwgb3IgQV9HX1JhdGlvbi4KCmEuIENvbnN0cnVjdCBzaWRlLWJ5LXNpZGUgYm94IHBsb3RzIG9mIHlvdXIgc2VsZWN0ZWQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIERpc2Vhc2Ugc3RhdHVzICgwIHZzLiAxKS4KCmBgYHtyfQojVG90X0JpbApnZ2JveHBsb3QobGl2ZXJkaXNlYXNlX2RhdGEsIHggPSAiRGlzZWFzZSIsIHkgPSAiVG90X0JpbCIsCiAgICAgICAgICBjb2xvciA9ICJEaXNlYXNlIiwKICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiKSkKCgpgYGAKCmIuIEJyaWVmbHkgZGVzY3JpYmUgYW55IGRpZmZlcmVuY2VzIHlvdSBvYnNlcnZlIGJldHdlZW4gdGhlIHR3byBncm91cHMgaW4gdGVybXMgb2YgY2VudGVyLCBzcHJlYWQsIGFuZCBwb3NzaWJsZSBvdXRsaWVycy4KCi0gVGhvc2Ugbm90IGRpYWdub3NlZCB3aXRoIGEgZGlzZWFzZSBhcmUgY2VudGVyZWQgYXJvdW5kIGEgbG93ZXIgVG90YWwgQmlsaXJ1YmluLCB1bmRlciAyMC4gVGhlcmUgaXMgZXZlbiBzcHJlYWQgd2l0aCBmZXcgb3V0bGllcnMuIFRob3NlIGRpYWdub3NlZCB3aXRoIGxpdmVyIGRpc2Vhc2UgYXJlIG11Y2ggbW9yZSBkaXZlcnNpZSBpbiBkaXN0cmlidXRpb24sIHdpdGggbW9yZSBvdXRsaWVycyBhbmQgYSBmYXJ0aGVyIHNwcmVhZCBvZiBkYXRhIHBvaW50cyBpbiBoaWdoZXIgdG90YWwgYmlsaXJ1YmluIG51bWJlcnMuIFRoaXMgbWFrZXMgbG9naWNhbCBzZW5zZSBzaW5jZSB0aG9zZSBleHBlcmllbmNlIGRpZmZlcmVudCBsZXZlbHMgb2YgbGl2ZXIgZGlzZWFzZSB3b3VsZCBiZSBhYmxlIHRvIHByb2Nlc3MgdmFzdGx5IGRpZmZlcmVudCBhbW91bnRzIG9mIHRoaXMgd2FzdGUgcHJvZHVjdC4gCgoKCgo=