Start Date: 3 May 2025
Report Date: 31 May 2025
Source: Psi Chi R
In May 2024, Psi Chi R conducted a workshop at APS to help everyone
learn R! That workshop was a success, and while we will not be at APS
this year, we wanted to re-share that workshop as a resource for you!
This month’s contest is a revamped version of what we covered in the
workshop. I hope you enjoy! Enjoy the remainder of your semesters –
summer is on the horizon!
knitr::opts_chunk$set(echo = T,message = F,warning = F)
#setwd("C:/Users/alanh/Documents/R/Psi_Chi_R")
rm(list=ls())
setwd("~/R/Psi_Chi_R")
library(tidyverse)
#total for bottom row
sum_rows = function(x) {
x = as.data.frame(x)
sums = sapply(x,function(col) if (is.numeric(col)) sum(col, na.rm = T) else NA)
sums = as.data.frame(t(sums))
names(sums) = names(x)
rbind(x, sums)
}
## right column for total
sum_cols = function(x) {
x$Total = rowSums(x[sapply(x, is.numeric)], na.rm = T)
x
}
#dollar format function
dollars = function(x) {
paste0("$",format(x,big.mark= ",",scientific=F))
}
desc_stats = function(x){
c(min = min(x,na.rm=T),
median = median(x,na.rm=T),
max = max(x,na.rm=T),
mean = mean(x,na.rm=T),
sd = sd(x,na.rm=T))
}
#numeric notations
options(scipen=9999)
Clean and EDA
data=read_csv('data.csv')
names(data) = make.names(colnames(data))
SmartEDA::ExpData(data,type=2) %>%
arrange(desc(Per_of_Missing))
Level 1: Preparing the data
# Remove participants who are missing ‘Age’
# Remove participants who are missing ‘Gender’
data1= data %>%
filter(!is.na(Age) & !is.na(Gender))
Test your skills: Remove participants missing
‘Age’ and ‘Gender’ in one step, instead of two.
# Create the following variable ‘FACEenmesh’ which measures the extent to which a family is enmeshed, by summing the following items: FACES4, FACES10, FACES16, FACES22, FACES28, FACES34, FACES40
data2 = data1 %>%
mutate(FACEenmesh = FACES4+ FACES10+ FACES16+ FACES22+FACES28+ FACES34+FACES40) %>%
select(FACEenmesh,everything())
Level 2: Data inspection + Descriptives
Identify participants with values considered
outliers for ‘FACEenmesh’.
data2.1 = data2%>%
filter(FACEenmesh > 25)
print(data2.1)
## # A tibble: 12 × 300
## FACEenmesh ParticipantID Age Gender Countryborn Stateborn Countrycurrent
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 35 5 19 1 187 25 187
## 2 35 22 18 1 187 25 187
## 3 26 23 18 1 187 25 187
## 4 35 43 19 2 187 44 187
## 5 26 60 18 2 187 25 187
## 6 26 202 18 1 187 51 187
## 7 26 288 18 1 187 25 187
## 8 28 343 19 1 187 44 187
## 9 35 349 18 1 187 11 187
## 10 28 408 18 1 187 25 187
## 11 29 445 19 1 187 25 187
## 12 29 463 19 1 187 25 187
## # ℹ 293 more variables: Statecurrent <dbl>, Yearscurrent <chr>,
## # Ethnicity <chr>, Race <dbl>, OtherText <chr>, Primarychild <dbl>,
## # Primarynow <dbl>, Samesex <dbl>, Parentdecease <dbl>,
## # Parentdeceasetext <chr>, Siblings <dbl>, Primmomnow <chr>,
## # Primdadnow <chr>, Hoursmom <dbl>, Hoursdad <dbl>, SubSES <dbl>,
## # FatherEd <dbl>, FatherEdText <chr>, MotherEd <dbl>, MotherEdText <chr>,
## # Religionnow <dbl>, ReligChristother <chr>, ReligOther <chr>, …
Test your skills: Visualize outlier values for
‘FACEenmesh’.
boxplot(data2$FACEenmesh)
title(main="Looking for FACEenmesh outliers")

Level 3: Inferential + Other Statistics
Is there a statistically significant correlation
between the number of siblings someone has and their enmeshment score?
No, there isn’t.
#No, there isn't a significant correlation.
data4 = data3 %>%
filter(!is.na(FACEenmesh) & !is.na(Siblings)) %>%
select(Siblings,everything())
cor.test(data4$FACEenmesh,data4$Siblings)
##
## Pearson's product-moment correlation
##
## data: data4$FACEenmesh and data4$Siblings
## t = -0.35127, df = 457, p-value = 0.7256
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.10779408 0.07521062
## sample estimates:
## cor
## -0.01642932
data4 %>%
ggplot(aes(y=FACEenmesh,x=Siblings))+
geom_point()+
geom_smooth()

Test your skills: Is there a statistically
significant difference in enmeshment between people who have siblings
and those who do not? *Note, you may need to create a new variable to
test this
data5 = data4 %>%
mutate(have_siblings = case_when(Siblings > 0 ~ "YES",
TRUE ~ 'NO')) %>%
select(have_siblings,everything())
shapiro.test(data5$FACEenmesh[data5$have_siblings=='YES'])
##
## Shapiro-Wilk normality test
##
## data: data5$FACEenmesh[data5$have_siblings == "YES"]
## W = 0.97319, p-value = 0.0000004684
shapiro.test(data5$FACEenmesh[data5$have_siblings=='NO'])
##
## Shapiro-Wilk normality test
##
## data: data5$FACEenmesh[data5$have_siblings == "NO"]
## W = 0.96121, p-value = 0.2795
hist(data5$FACEenmesh[data5$have_siblings=='YES'])

hist(data5$FACEenmesh[data5$have_siblings=='NO'])

wilcox.test(data5$FACEenmesh~data5$have_siblings)
##
## Wilcoxon rank sum test with continuity correction
##
## data: data5$FACEenmesh by data5$have_siblings
## W = 6810, p-value = 0.7654
## alternative hypothesis: true location shift is not equal to 0
#assumptions for Welch t-test
# data5$dev=with(data5, abs(FACEenmesh - ave(FACEenmesh, have_siblings, FUN = median)))
#
# summary(aov(data5$dev ~data5$have_siblings))
#
# t.test(data5$FACEenmesh~data5$have_siblings,var.equal = F)
Level 4: Visualization
Graph the relationship between the number of
siblings someone has and their enmeshment score
data5 %>%
ggplot(aes(y=FACEenmesh,x=Siblings))+
theme_bw()+
geom_point()+
labs(title='Sibling Rivalry? More Like Sibling Enmeshment',subtitle='A Totally Scientific Look')+
theme(plot.title = element_text(hjust = .5),
plot.subtitle = element_text(hjust = .5))+
geom_smooth()

Test your skills: Visualize the difference in
enmeshment between people who have siblings and those who do not
data5 %>%
ggplot(aes(x=have_siblings,y=FACEenmesh,fill=have_siblings))+
geom_col()+
theme_bw()+
labs(title='"Only Child Sanctuary" vs. "Sibling Scrum"',subtitle= "The Enmeshment Edition",x='Have Siblings')+
theme(plot.title = element_text(hjust = .5) , plot.subtitle = element_text(hjust = .5))+
guides(fill ='none')

LS0tDQp0aXRsZTogIlBzaSBDaGkgUiAtIE1heSAyMDI1Ig0KI2RhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGFsd2F5c19hbGxvd19odG1sOiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGFuY2hvcl9zZWN0aW9uczogVFJVRQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpTdGFydCBEYXRlOiAzIE1heSAyMDI1DQoNClJlcG9ydCBEYXRlOiBgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgDQoNCltTb3VyY2U6IFBzaSBDaGkgUl0oaHR0cHM6Ly9vc2YuaW8vMnloajMvd2lraS9ob21lLykNCg0KSW4gTWF5IDIwMjQsIFBzaSBDaGkgUiBjb25kdWN0ZWQgYSB3b3Jrc2hvcCBhdCBBUFMgdG8gaGVscCBldmVyeW9uZSBsZWFybiBSISBUaGF0IHdvcmtzaG9wIHdhcyBhIHN1Y2Nlc3MsIGFuZCB3aGlsZSB3ZSB3aWxsIG5vdCBiZSBhdCBBUFMgdGhpcyB5ZWFyLCB3ZSB3YW50ZWQgdG8gcmUtc2hhcmUgdGhhdCB3b3Jrc2hvcCBhcyBhIHJlc291cmNlIGZvciB5b3UhIFRoaXMgbW9udGjigJlzIGNvbnRlc3QgaXMgYSByZXZhbXBlZCB2ZXJzaW9uIG9mIHdoYXQgd2UgY292ZXJlZCBpbiB0aGUgd29ya3Nob3AuIEkgaG9wZSB5b3UgZW5qb3khIEVuam95IHRoZSByZW1haW5kZXIgb2YgeW91ciBzZW1lc3RlcnMg4oCTIHN1bW1lciBpcyBvbiB0aGUgaG9yaXpvbiENCg0KYGBge3Igd2FybmluZz1GLG1lc3NhZ2U9Rn0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVCxtZXNzYWdlID0gRix3YXJuaW5nID0gRikNCg0KI3NldHdkKCJDOi9Vc2Vycy9hbGFuaC9Eb2N1bWVudHMvUi9Qc2lfQ2hpX1IiKQ0KDQpybShsaXN0PWxzKCkpDQoNCnNldHdkKCJ+L1IvUHNpX0NoaV9SIikNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCiN0b3RhbCBmb3IgYm90dG9tIHJvdw0Kc3VtX3Jvd3MgPSBmdW5jdGlvbih4KSB7DQogIHggPSBhcy5kYXRhLmZyYW1lKHgpDQogIHN1bXMgPSBzYXBwbHkoeCxmdW5jdGlvbihjb2wpIGlmIChpcy5udW1lcmljKGNvbCkpIHN1bShjb2wsIG5hLnJtID0gVCkgZWxzZSBOQSkNCiAgc3VtcyA9IGFzLmRhdGEuZnJhbWUodChzdW1zKSkNCiAgbmFtZXMoc3VtcykgPSBuYW1lcyh4KQ0KICByYmluZCh4LCBzdW1zKQ0KfQ0KDQojIyByaWdodCBjb2x1bW4gZm9yIHRvdGFsDQpzdW1fY29scyA9IGZ1bmN0aW9uKHgpIHsNCiAgeCRUb3RhbCA9IHJvd1N1bXMoeFtzYXBwbHkoeCwgaXMubnVtZXJpYyldLCBuYS5ybSA9IFQpDQogIHgNCn0NCg0KI2RvbGxhciBmb3JtYXQgZnVuY3Rpb24NCmRvbGxhcnMgPSBmdW5jdGlvbih4KSB7DQogIHBhc3RlMCgiJCIsZm9ybWF0KHgsYmlnLm1hcms9ICIsIixzY2llbnRpZmljPUYpKQ0KfQ0KDQpkZXNjX3N0YXRzID0gZnVuY3Rpb24oeCl7DQogIGMobWluID0gbWluKHgsbmEucm09VCksDQogICAgbWVkaWFuID0gbWVkaWFuKHgsbmEucm09VCksDQogICAgbWF4ID0gbWF4KHgsbmEucm09VCksDQogICAgbWVhbiA9IG1lYW4oeCxuYS5ybT1UKSwNCiAgICBzZCA9IHNkKHgsbmEucm09VCkpDQp9DQoNCiNudW1lcmljIG5vdGF0aW9ucw0Kb3B0aW9ucyhzY2lwZW49OTk5OSkNCmBgYA0KDQojIyBDbGVhbiBhbmQgRURBDQoNCmBgYHtyfQ0KZGF0YT1yZWFkX2NzdignZGF0YS5jc3YnKQ0KDQpuYW1lcyhkYXRhKSA9IG1ha2UubmFtZXMoY29sbmFtZXMoZGF0YSkpDQoNClNtYXJ0RURBOjpFeHBEYXRhKGRhdGEsdHlwZT0yKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhQZXJfb2ZfTWlzc2luZykpDQpgYGANCg0KIyMgTGV2ZWwgMTogUHJlcGFyaW5nIHRoZSBkYXRhDQoNCmBgYHtyfQ0KIyAJUmVtb3ZlIHBhcnRpY2lwYW50cyB3aG8gYXJlIG1pc3Npbmcg4oCYQWdl4oCZDQojIAlSZW1vdmUgcGFydGljaXBhbnRzIHdobyBhcmUgbWlzc2luZyDigJhHZW5kZXLigJkNCmRhdGExPSBkYXRhICU+JSANCiAgZmlsdGVyKCFpcy5uYShBZ2UpICYgIWlzLm5hKEdlbmRlcikpDQpgYGANCg0KIyMjIFRlc3QgeW91ciBza2lsbHM6IFJlbW92ZSBwYXJ0aWNpcGFudHMgbWlzc2luZyDigJhBZ2XigJkgYW5kIOKAmEdlbmRlcuKAmSBpbiBvbmUgc3RlcCwgaW5zdGVhZCBvZiB0d28uDQoNCmBgYHtyfQ0KIyAJQ3JlYXRlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUg4oCYRkFDRWVubWVzaOKAmSB3aGljaCBtZWFzdXJlcyB0aGUgZXh0ZW50IHRvIHdoaWNoIGEgZmFtaWx5IGlzIGVubWVzaGVkLCBieSBzdW1taW5nIHRoZSBmb2xsb3dpbmcgaXRlbXM6IEZBQ0VTNCwgRkFDRVMxMCwgRkFDRVMxNiwgIEZBQ0VTMjIsIEZBQ0VTMjgsIEZBQ0VTMzQsIEZBQ0VTNDANCg0KZGF0YTIgPSBkYXRhMSAlPiUgDQogIG11dGF0ZShGQUNFZW5tZXNoID0gRkFDRVM0KyBGQUNFUzEwKyBGQUNFUzE2KyAgRkFDRVMyMitGQUNFUzI4KyBGQUNFUzM0K0ZBQ0VTNDApICU+JSANCiAgc2VsZWN0KEZBQ0Vlbm1lc2gsZXZlcnl0aGluZygpKQ0KYGBgDQoNCg0KIyMgTGV2ZWwgMjogRGF0YSBpbnNwZWN0aW9uICsgRGVzY3JpcHRpdmVzDQoNCiMjIyBJZGVudGlmeSBwYXJ0aWNpcGFudHMgd2l0aCB2YWx1ZXMgY29uc2lkZXJlZCBvdXRsaWVycyBmb3Ig4oCYRkFDRWVubWVzaOKAmS4gDQoNCmBgYHtyfQ0KZGF0YTIuMSA9IGRhdGEyJT4lIA0KICBmaWx0ZXIoRkFDRWVubWVzaCA+IDI1KQ0KDQpwcmludChkYXRhMi4xKQ0KYGBgDQoNCiMjIyBUZXN0IHlvdXIgc2tpbGxzOiBWaXN1YWxpemUgb3V0bGllciB2YWx1ZXMgZm9yIOKAmEZBQ0Vlbm1lc2jigJkuDQoNCmBgYHtyfQ0KYm94cGxvdChkYXRhMiRGQUNFZW5tZXNoKQ0KdGl0bGUobWFpbj0iTG9va2luZyBmb3IgRkFDRWVubWVzaCBvdXRsaWVycyIpDQpgYGANCg0KIyMjIFJlbW92ZSBwYXJ0aWNpcGFudHMgd2l0aCB2YWx1ZXMgY29uc2lkZXJlZCBvdXRsaWVycyBvbiDigJhGQUNFZW5tZXNo4oCZOyBGaW5kIHRoZSBtZWFuIG9mIOKAmEZBQ0Vlbm1lc2jigJk7IEZpbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiDigJhGQUNFZW5tZXNo4oCZOyBGaW5kIHRoZSBtZWRpYW4gb2Yg4oCYRkFDRWVubWVzaOKAmTsgRmluZCB0aGUgcmFuZ2Ugb2Yg4oCYRkFDRWVubWVzaOKAmQ0KDQojIyMjIFRlc3QgeW91ciBza2lsbHM6IEZpbmQgdGhlIG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiwgbWVkaWFuLCBhbmQgcmFuZ2Ugb2YgRkFDRWVubWVzaCBpbiBvbmUgc3RlcC4NCg0KYGBge3J9DQpkYXRhMyA9IGRhdGEyICU+JSANCiAgZmlsdGVyKEZBQ0Vlbm1lc2ggPD0gMjUpDQoNCiNyYW5nZSBpcyBmcm9tIDcgdG8gMjUNCmRlc2Nfc3RhdHMoZGF0YTMkRkFDRWVubWVzaCkgJT4lIA0KICBwcmludCgpDQpgYGANCg0KIyMgTGV2ZWwgMzogSW5mZXJlbnRpYWwgKyBPdGhlciBTdGF0aXN0aWNzDQoNCiMjIyBJcyB0aGVyZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHNpYmxpbmdzIHNvbWVvbmUgaGFzIGFuZCB0aGVpciBlbm1lc2htZW50IHNjb3JlPw0KDQpObywgdGhlcmUgaXNuJ3QuDQoNCmBgYHtyfQ0KI05vLCB0aGVyZSBpc24ndCBhIHNpZ25pZmljYW50IGNvcnJlbGF0aW9uLg0KZGF0YTQgPSBkYXRhMyAlPiUgDQogIGZpbHRlcighaXMubmEoRkFDRWVubWVzaCkgJiAhaXMubmEoU2libGluZ3MpKSAlPiUgDQogIHNlbGVjdChTaWJsaW5ncyxldmVyeXRoaW5nKCkpDQoNCmNvci50ZXN0KGRhdGE0JEZBQ0Vlbm1lc2gsZGF0YTQkU2libGluZ3MpDQoNCmRhdGE0ICU+JSANCiAgZ2dwbG90KGFlcyh5PUZBQ0Vlbm1lc2gseD1TaWJsaW5ncykpKw0KICBnZW9tX3BvaW50KCkrDQogIGdlb21fc21vb3RoKCkNCmBgYA0KDQoNCiMjIyBUZXN0IHlvdXIgc2tpbGxzOiBJcyB0aGVyZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBlbm1lc2htZW50IGJldHdlZW4gcGVvcGxlIHdobyBoYXZlIHNpYmxpbmdzIGFuZCB0aG9zZSB3aG8gZG8gbm90PyAqTm90ZSwgeW91IG1heSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSB0byB0ZXN0IHRoaXMNCg0KYGBge3J9DQpkYXRhNSA9IGRhdGE0ICU+JSANCiAgbXV0YXRlKGhhdmVfc2libGluZ3MgPSBjYXNlX3doZW4oU2libGluZ3MgPiAwIH4gIllFUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gJ05PJykpICU+JSANCiAgc2VsZWN0KGhhdmVfc2libGluZ3MsZXZlcnl0aGluZygpKQ0KDQpzaGFwaXJvLnRlc3QoZGF0YTUkRkFDRWVubWVzaFtkYXRhNSRoYXZlX3NpYmxpbmdzPT0nWUVTJ10pDQoNCnNoYXBpcm8udGVzdChkYXRhNSRGQUNFZW5tZXNoW2RhdGE1JGhhdmVfc2libGluZ3M9PSdOTyddKQ0KDQpoaXN0KGRhdGE1JEZBQ0Vlbm1lc2hbZGF0YTUkaGF2ZV9zaWJsaW5ncz09J1lFUyddKQ0KDQpoaXN0KGRhdGE1JEZBQ0Vlbm1lc2hbZGF0YTUkaGF2ZV9zaWJsaW5ncz09J05PJ10pDQoNCndpbGNveC50ZXN0KGRhdGE1JEZBQ0Vlbm1lc2h+ZGF0YTUkaGF2ZV9zaWJsaW5ncykNCmBgYA0KDQpgYGB7cn0NCiNhc3N1bXB0aW9ucyBmb3IgV2VsY2ggdC10ZXN0DQoNCiMgZGF0YTUkZGV2PXdpdGgoZGF0YTUsIGFicyhGQUNFZW5tZXNoIC0gYXZlKEZBQ0Vlbm1lc2gsIGhhdmVfc2libGluZ3MsIEZVTiA9IG1lZGlhbikpKQ0KIyANCiMgc3VtbWFyeShhb3YoZGF0YTUkZGV2IH5kYXRhNSRoYXZlX3NpYmxpbmdzKSkNCiMgDQojIHQudGVzdChkYXRhNSRGQUNFZW5tZXNofmRhdGE1JGhhdmVfc2libGluZ3MsdmFyLmVxdWFsID0gRikNCg0KYGBgDQoNCiMjIExldmVsIDQ6IFZpc3VhbGl6YXRpb24NCg0KIyMjIEdyYXBoIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHNpYmxpbmdzIHNvbWVvbmUgaGFzIGFuZCB0aGVpciBlbm1lc2htZW50IHNjb3JlDQoNCmBgYHtyfQ0KZGF0YTUgJT4lIA0KICBnZ3Bsb3QoYWVzKHk9RkFDRWVubWVzaCx4PVNpYmxpbmdzKSkrDQogIHRoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZT0nU2libGluZyBSaXZhbHJ5PyBNb3JlIExpa2UgU2libGluZyBFbm1lc2htZW50JyxzdWJ0aXRsZT0nQSBUb3RhbGx5IFNjaWVudGlmaWMgTG9vaycpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSsNCiAgZ2VvbV9zbW9vdGgoKQ0KYGBgDQoNCg0KIyMjIFRlc3QgeW91ciBza2lsbHM6IFZpc3VhbGl6ZSB0aGUgZGlmZmVyZW5jZSBpbiBlbm1lc2htZW50IGJldHdlZW4gcGVvcGxlIHdobyBoYXZlIHNpYmxpbmdzIGFuZCB0aG9zZSB3aG8gZG8gbm90DQoNCmBgYHtyfQ0KZGF0YTUgJT4lIA0KICBnZ3Bsb3QoYWVzKHg9aGF2ZV9zaWJsaW5ncyx5PUZBQ0Vlbm1lc2gsZmlsbD1oYXZlX3NpYmxpbmdzKSkrDQogIGdlb21fY29sKCkrDQogIHRoZW1lX2J3KCkrDQogIGxhYnModGl0bGU9JyJPbmx5IENoaWxkIFNhbmN0dWFyeSIgdnMuICJTaWJsaW5nIFNjcnVtIicsc3VidGl0bGU9ICJUaGUgRW5tZXNobWVudCBFZGl0aW9uIix4PSdIYXZlIFNpYmxpbmdzJykrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkgLCBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSsNCiAgZ3VpZGVzKGZpbGwgPSdub25lJykNCmBgYA0KDQoNCmBgYHtyIGluY2x1ZGU9Rn0NCiNiZWVwIHdoZW4gZG9uZQ0KaWYgKHJlcXVpcmUoImJlZXByIikpDQogIGJlZXByOjpiZWVwKDIpDQpgYGA=