Some data wrangling
load(file="./data/liss_jca_jochem_V2.rds")
liss_long %>%
mutate(#size
#cdn_size = 5 - rowSums(is.na(cbind(alter_id_1, alter_id_2, alter_id_3, alter_id_4, alter_id_5))),
cdn_size = 5 - rowSums(is.na(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5))),
#education
opl_y = recode(as.numeric(oplmet), '1' = 6, '2'=10, '3'= 11.5, '4' = 10.5, '5' = 15, '6'=16, '8'=4, .default=-1 ),
opl_y = na_if(opl_y, -1),
opl4 = recode(as.numeric(oplmet), '1' = 1, '2'=1, '3'= 2, '4' = 2, '5' = 3, '6'=4, .default=-1 ),
opl4 = na_if(opl4, -1),
opl4 = structure(opl4, labels=c("low", "medium", "high1", "high2")),
across(c(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5), ~as.numeric(.x), .names = "{.col}_opl4"),
across(c(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4), ~recode(.x, '4'=1, '6'=1, '10'=2, '10.5'=2, '11.5'=2 , '15'=3, '16' = 4, .default=-1)),
across(c(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4), ~na_if(.x, -1)),
educ_I = rowSums(cbind(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4)==opl4,na.rm=T),
educ_E = rowSums(cbind(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4)!=opl4,na.rm=T),
educ_EI = - ((educ_E - educ_I) / (educ_E + educ_I)),
cdn_neduc_h = rowSums(cbind(educ_recode_alter1, educ_recode_alter2, educ_recode_alter3, educ_recode_alter4, educ_recode_alter5)==16, na.rm=T),
cdn_size_educ = 5 - rowSums(is.na(cbind(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5))),
educ_sim = 2*(1- rowSums(abs((cbind(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5) - opl_y)/12), na.rm=T)/cdn_size_educ)-1,
#gender
gender_alter1 = replace_na(gender_alter1, -1),
gender_alter2 = replace_na(gender_alter2, -1),
gender_alter3 = replace_na(gender_alter3, -1),
gender_alter4 = replace_na(gender_alter4, -1),
gender_alter5 = replace_na(gender_alter5, -1),
cdn_ngender_2 = rowSums(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5)==2, na.rm=T),
cdn_ngender_1 = rowSums(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5)==1, na.rm=T),
gender_I = ifelse(geslacht==2, cdn_ngender_2, cdn_ngender_1),
gender_E = ifelse(geslacht==1, cdn_ngender_2, cdn_ngender_1),
gender_EI = - ((gender_E - gender_I) / (gender_E + gender_I)),
#age
across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~na_if(.x, 14)),
across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~as.integer(.x)),
leeftijd_cat13 = as.integer(cut(as.numeric(liss_long$leeftijd),breaks = c(-Inf, 15, 20, 25, 30, 35, 40,45,50,55,60,65,70, Inf))),
leeftijd_I = rowSums(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5)==leeftijd_cat13, na.rm=T),
leeftijd_E = rowSums(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5)!=leeftijd_cat13, na.rm=T),
leeftijd_EI = - ((leeftijd_E - leeftijd_I) / (leeftijd_E + leeftijd_I)),
cdn_size_age = 5 - rowSums(is.na(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5))),
across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~recode(.x, '1'=15, '2'=18, '3'=23, '4'=28, '5'=33 , '6'=38, '7' = 43,'8'= 48, '9'=53, '10'=58, '11'=63, '12'=68, '13'=75, .default=-1)),
across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~na_if(.x, -1)),
leeftijd_sim = 2*(1 - rowSums(abs((cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5) - as.numeric(liss_long$leeftijd))/75), na.rm=T)/cdn_size_age)-1,
#etni
etni3 = recode(as.numeric(origin), '0' = 1, '101'=2, '102'= 3, '201' = 2, '202' = 3, '999'=-1, .default=-1 ),
etni3 = na_if(etni3, -1),
etni3 = structure(etni3, labels=c("D", "W", "NW")),
across(c(origin_alter1,origin_alter2,origin_alter3,origin_alter4,origin_alter5), ~as.numeric(.x), .names = "{.col}_etni3"),
across(c(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3), ~recode(.x, '1'=1, '2'=3, '3'=3, '4'=3, '5'=3 , '6'=2, '7' = 3, '8' = 2, '9' = -1, .default=-1)),
across(c(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3), ~na_if(.x, -1)),
etni_I = rowSums(cbind(origin_alter1_etni3, origin_alter2_etni3, origin_alter3_etni3, origin_alter4_etni3 ,origin_alter5_etni3)==etni3, na.rm=T),
etni_E = rowSums(cbind(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3)!=etni3, na.rm=T),
etni_EI = - ((etni_E - etni_I) / (etni_E + etni_I)),
ego_id = nomem_encr) %>%
#filter(!is.na(pol_int)) %>%
select(ego_id, survey_wave, leeftijd, leeftijd_cat13, opl4, geslacht, etni3, cdn_size, cdn_size_educ, cdn_size_age, educ_EI,educ_sim,gender_EI, leeftijd_EI, leeftijd_sim, etni_EI ) -> datajt
#make similar dataset for non-kin. dus gooi alle alters weg met rel_alter - 1 2,3,4,5
# quickest would probably be to go from wide to long, select and go back to wide. but...
attributes(liss_wide$rel_alter1.1)
liss_long %>%
mutate(across(c(rel_alter1,rel_alter2,rel_alter3,rel_alter4,rel_alter5), ~replace_na(.x, -1)),
#alter_id_1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, alter_id_1),
#alter_id_2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, alter_id_2),
#alter_id_3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, alter_id_3),
#alter_id_4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, alter_id_4),
#alter_id_5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, alter_id_5),
educ_recode_alter1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, educ_recode_alter1),
educ_recode_alter2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, educ_recode_alter2),
educ_recode_alter3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, educ_recode_alter3),
educ_recode_alter4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, educ_recode_alter4),
educ_recode_alter5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, educ_recode_alter5),
gender_alter1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, gender_alter1),
gender_alter2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, gender_alter2),
gender_alter3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, gender_alter3),
gender_alter4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, gender_alter4),
gender_alter5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, gender_alter5),
origin_alter1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, origin_alter1),
origin_alter2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, origin_alter2),
origin_alter3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, origin_alter3),
origin_alter4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, origin_alter4),
origin_alter5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, origin_alter5),
age_alter1 = ifelse(rel_alter1>0 & rel_alter1<6, NA, age_alter1),
age_alter2 = ifelse(rel_alter2>0 & rel_alter2<6, NA, age_alter2),
age_alter3 = ifelse(rel_alter3>0 & rel_alter3<6, NA, age_alter3),
age_alter4 = ifelse(rel_alter4>0 & rel_alter4<6, NA, age_alter4),
age_alter5 = ifelse(rel_alter5>0 & rel_alter5<6, NA, age_alter5),
) %>%
mutate(#size
#cdn_size = 5 - rowSums(is.na(cbind(alter_id_1, alter_id_2, alter_id_3, alter_id_4, alter_id_5))),
cdn_size = 5 - rowSums(is.na(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5))),
#education
opl_y = recode(as.numeric(oplmet), '1' = 6, '2'=10, '3'= 11.5, '4' = 10.5, '5' = 15, '6'=16, '8'=4, .default=-1 ),
opl_y = na_if(opl_y, -1),
opl4 = recode(as.numeric(oplmet), '1' = 1, '2'=1, '3'= 2, '4' = 2, '5' = 3, '6'=4, .default=-1 ),
opl4 = na_if(opl4, -1),
opl4 = structure(opl4, labels=c("low", "medium", "high1", "high2")),
across(c(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5), ~as.numeric(.x), .names = "{.col}_opl4"),
across(c(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4), ~recode(.x, '4'=1, '6'=1, '10'=2, '10.5'=2, '11.5'=2 , '15'=3, '16' = 4, .default=-1)),
across(c(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4), ~na_if(.x, -1)),
educ_I = rowSums(cbind(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4)==opl4,na.rm=T),
educ_E = rowSums(cbind(educ_recode_alter1_opl4,educ_recode_alter2_opl4,educ_recode_alter3_opl4,educ_recode_alter4_opl4,educ_recode_alter5_opl4)!=opl4,na.rm=T),
educ_EI = - ((educ_E - educ_I) / (educ_E + educ_I)),
cdn_neduc_h = rowSums(cbind(educ_recode_alter1, educ_recode_alter2, educ_recode_alter3, educ_recode_alter4, educ_recode_alter5)==16, na.rm=T),
cdn_size_educ = 5 - rowSums(is.na(cbind(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5))),
educ_sim = 2*(1- rowSums(abs((cbind(educ_recode_alter1,educ_recode_alter2,educ_recode_alter3,educ_recode_alter4,educ_recode_alter5) - opl_y)/12), na.rm=T)/cdn_size_educ)-1,
#gender
gender_alter1 = replace_na(gender_alter1, -1),
gender_alter2 = replace_na(gender_alter2, -1),
gender_alter3 = replace_na(gender_alter3, -1),
gender_alter4 = replace_na(gender_alter4, -1),
gender_alter5 = replace_na(gender_alter5, -1),
cdn_ngender_2 = rowSums(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5)==2, na.rm=T),
cdn_ngender_1 = rowSums(cbind(gender_alter1, gender_alter2, gender_alter3, gender_alter4, gender_alter5)==1, na.rm=T),
gender_I = ifelse(geslacht==2, cdn_ngender_2, cdn_ngender_1),
gender_E = ifelse(geslacht==1, cdn_ngender_2, cdn_ngender_1),
gender_EI = - ((gender_E - gender_I) / (gender_E + gender_I)),
#age
across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~na_if(.x, 14)),
across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~as.integer(.x)),
leeftijd_cat13 = as.integer(cut(as.numeric(liss_long$leeftijd),breaks = c(-Inf, 15, 20, 25, 30, 35, 40,45,50,55,60,65,70, Inf))),
leeftijd_I = rowSums(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5)==leeftijd_cat13, na.rm=T),
leeftijd_E = rowSums(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5)!=leeftijd_cat13, na.rm=T),
leeftijd_EI = - ((leeftijd_E - leeftijd_I) / (leeftijd_E + leeftijd_I)),
cdn_size_age = 5 - rowSums(is.na(cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5))),
across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~recode(.x, '1'=15, '2'=18, '3'=23, '4'=28, '5'=33 , '6'=38, '7' = 43,'8'= 48, '9'=53, '10'=58, '11'=63, '12'=68, '13'=75, .default=-1)),
across(c(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5), ~na_if(.x, -1)),
leeftijd_sim = 2*( 1 - rowSums(abs((cbind(age_alter1, age_alter2, age_alter3, age_alter4, age_alter5) - as.numeric(liss_long$leeftijd))/75), na.rm=T)/cdn_size_age)-1,
#etni
etni3 = recode(as.numeric(origin), '0' = 1, '101'=2, '102'= 3, '201' = 2, '202' = 3, '999'=-1, .default=-1 ),
etni3 = na_if(etni3, -1),
etni3 = structure(etni3, labels=c("D", "W", "NW")),
across(c(origin_alter1,origin_alter2,origin_alter3,origin_alter4,origin_alter5), ~as.numeric(.x), .names = "{.col}_etni3"),
across(c(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3), ~recode(.x, '1'=1, '2'=3, '3'=3, '4'=3, '5'=3 , '6'=2, '7' = 3, '8' = 2, '9' = -1, .default=-1)),
across(c(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3), ~na_if(.x, -1)),
etni_I = rowSums(cbind(origin_alter1_etni3, origin_alter2_etni3, origin_alter3_etni3, origin_alter4_etni3 ,origin_alter5_etni3)==etni3, na.rm=T),
etni_E = rowSums(cbind(origin_alter1_etni3,origin_alter2_etni3,origin_alter3_etni3,origin_alter4_etni3,origin_alter5_etni3)!=etni3, na.rm=T),
etni_EI = - ((etni_E - etni_I) / (etni_E + etni_I)),
ego_id = nomem_encr) %>%
#filter(!is.na(pol_int)) %>%
select(ego_id, survey_wave, leeftijd, leeftijd_cat13, opl4, geslacht, etni3, cdn_size, cdn_size_educ, cdn_size_age, educ_EI,educ_sim,gender_EI, leeftijd_EI, leeftijd_sim, etni_EI ) -> datajt_nk
test <- cut(as.numeric(liss_long$leeftijd),breaks = c(-Inf, 15, 20, 25, 30, 35, 40,45,50,55,60,65,70, Inf))
#levels(test)
save(datajt, file="./data/datajt.rda")
save(datajt_nk, file="./data/datajt_nk.rda")
#cor.test(datajt$educ_EI, datajt$educ_sim)
#cor.test(datajt$leeftijd_EI, datajt$leeftijd_sim)
#hist(datajt$leeftijd_sim)
#rm(list=ls())
LS0tDQp0aXRsZTogIlNvY2lhbCBzZWdyZWdhdGlvbiBpbiBDb3JlIERpc2N1c3Npb24gTmV0d29ya3MiDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQotLS0NCg0KYGBge3IgZ2xvYmFsc2V0dGluZ3MsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KbGlicmFyeShrbml0cikNCm9wdHNfY2h1bmskc2V0KHRpZHkub3B0cz1saXN0KHdpZHRoLmN1dG9mZj0xMDApLHRpZHk9VFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsY29tbWVudCA9ICIjPiIsIGNhY2hlPVRSVUUsIGVjaG89RkFMU0UsIGNsYXNzLnNvdXJjZT1jKCJ0ZXN0IiksIGNsYXNzLm91dHB1dD1jKCJ0ZXN0MiIpKQ0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkNCnJnbDo6c2V0dXBLbml0cigpDQpgYGANCg0KYGBge3IgY29sb3JpemUsIGVjaG89RkFMU0V9DQpjb2xvcml6ZSA8LSBmdW5jdGlvbih4LCBjb2xvcikgew0KICBpZiAoa25pdHI6OmlzX2xhdGV4X291dHB1dCgpKSB7DQogICAgc3ByaW50ZigiXFx0ZXh0Y29sb3J7JXN9eyVzfSIsIGNvbG9yLCB4KQ0KICB9IGVsc2UgaWYgKGtuaXRyOjppc19odG1sX291dHB1dCgpKSB7DQogICAgc3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCANCiAgICAgICAgICAgIHgpDQogIH0gZWxzZSB4DQp9DQoNCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpDQoja2xpcHB5OjprbGlwcHkoY29sb3IgPSAnZGFya3JlZCcpDQoja2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScpDQpgYGANCg0KYGBge2NzcyBzdHlsZSBzZXR0aW5ncywgZWNobyA9IEZBTFNFfQ0KYmxvY2txdW90ZSB7DQogICAgcGFkZGluZzogMTBweCAyMHB4Ow0KICAgIG1hcmdpbjogMCAwIDIwcHg7DQogICAgZm9udC1zaXplOiAxNHB4Ow0KICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2VlZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LDI1NSwyMjQsMSk7DQp9DQoNCi50ZXN0IHsNCiAgbWF4LWhlaWdodDogMzAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQogIG92ZXJmbG93LXg6IGF1dG87DQogIG1hcmdpbjogMHB4Ow0KfQ0KDQoudGVzdDIgew0KICBtYXgtaGVpZ2h0OiAzMDBweDsNCiAgb3ZlcmZsb3cteTogYXV0bzsNCiAgb3ZlcmZsb3cteDogYXV0bzsNCiAgbWFyZ2luOiAwcHg7DQogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOw0KICBjb2xvcjogcmdiKDIwMSwgNzYsIDc2KTsNCn0NCg0KDQpoMSwgLmgxLCBoMiwgLmgyLCBoMywgLmgzIHsNCiAgbWFyZ2luLXRvcDogMjRweDsNCn0NCg0KDQpgYGANCg0KYGBge3IsIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KZnBhY2thZ2UuY2hlY2sgPC0gZnVuY3Rpb24ocGFja2FnZXMpIHsNCiAgbGFwcGx5KHBhY2thZ2VzLCBGVU4gPSBmdW5jdGlvbih4KSB7DQogICAgaWYgKCFyZXF1aXJlKHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIHsNCiAgICAgIGluc3RhbGwucGFja2FnZXMoeCwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgICAgIGxpYnJhcnkoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KICAgIH0NCiAgfSkNCn0NCg0KDQpgYGANCg0KDQpgYGB7ciwgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQpwYWNrYWdlcyA9IGMoInRpZHl2ZXJzZSIsICJoYXZlbiIsICJIbWlzYyIsICJwbG90bHkiKQ0KDQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykNCg0KYGBgDQoNCi0tLSANCg0KIyBMSVNTICANCg0KDQo8YSBocmVmPSJodHRwczovL3d3dy5saXNzZGF0YS5ubC8iPg0KICA8aW1nIHNyYz0ibGlzc2xvZ29fMC5wbmciPg0KICA8L2E+DQoNCi0gV2UgdXNlICoqMTQgd2F2ZXMqKiA6IFsyMDA4LDIwMjFdICANCi0gV2UgdXNlICoqMTQuNTgwKiogdW5pcXVlIHJlc3BvbmRlbnRzICANCi0gV2UgdXNlICoqOTkuNDk1KiogcmVzcG9uZGVudC13YXZlIGNvbWJpbmF0aW9ucyAgDQotIFdlIHVzZSAqKjIzMS4wMjAqKiBjb25maWRhbnQtcmVzcG9uZGVudC13YXZlIGNvbWJpbmF0aW9ucyAgDQoNCi0tLSAgDQoNCiMjIERlcGVuZGVudCB2YXJpYWJsZXMNCg0KIyMjICoqQ29yZSBEaXNjdXNzaW9uIE5ldHdvcmsqKg0KIA0KPiBXZSB3b3VsZCBsaWtlIHRvIGNvbmNlbnRyYXRlIG9uIHlvdXIgY2xvc2VzdCBjb250YWN0cyBub3csIHRvIGZvcm0gYSBwaWN0dXJlIG9mIHRoZSBzb2NpYWwgcmVsYXRpb25zaGlwcyB0aGF0IHBlb3BsZSBoYXZlLiAgDQo+IEl0IGlzIGVhc2llciB0byBhbnN3ZXIgdGhlc2UgdHlwZXMgb2YgcXVlc3Rpb25zIGJ5IGNvbnNpZGVyaW5nIGNvbmNyZXRlIHBlcnNvbnMuICANCj4gRm9yIHRoYXQgcmVhc29uLCB3ZSBhc2sgdGhhdCB5b3UgbGlzdCBhIG51bWJlciBvZiBwZXJzb25zIGNsb3NlIHRvIHlvdS4gSWYgeW91IHdpc2gsIHlvdSBjYW4gZW50ZXIgbmlja25hbWVzIG9yIGluaXRpYWxzLCBhcyBsb25nIGFzIHlvdSBjYW4gcmVtZW1iZXIgd2hvIHRoZXkgcmVmZXIgdG8uICANCj4gTW9zdCBwZW9wbGUgZGlzY3VzcyBpbXBvcnRhbnQgdGhpbmdzIHdpdGggb3RoZXIgcGVvcGxlLiAgDQo+IElmIHlvdSBsb29rIGJhY2sgb24gdGhlIGxhc3Qgc2l4IG1vbnRocywgd2l0aCB3aG9tIGRpZCB5b3UgZGlzY3VzcyBpbXBvcnRhbnQgdGhpbmdzPyAgDQo+IFBsZWFzZSBlbnRlciB0aGVpciBmaXJzdCBuYW1lcyBiZWxvdyAodG8gYSBtYXhpbXVtIG9mIDUpLiAgDQoNCg0KYGBge3IgY2RuLCBlY2hvPUZBTFNFLCBmaWcuY2FwPSJGaWd1cmUgNC4gQ0ROIiwgb3V0LndpZHRoID0gJzUwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiLi9lZ29uZXQucG5nIikNCmBgYA0KPGJyPiANCg0KIyMjICoqQ0ROIGhvbW9nZW5laXR5KiogDQoNCipPcGVyYXRpb25hbGl6YXRpb24gMS4qIA0KDQpUbyBtZWFzdXJlIHRoZSBkZWdyZWUgb2YgaG9tb2dlbmVpdHkgd2l0aGluIHRoZSBDRE4gd2UgdXNlIHRoZSAocmV2ZXJzZWQpIEtyYWNraGFyZCBhbmQgU3Rlcm4ncyBFLUkgaW5kZXggW0BrcmFja2hhcmR0MTk4OF0uIFRoaXMgbWVhc3VyZSBjYXB0dXJlcyB0aGUgcmVsYXRpdmUgcHJldmFsZW5jZSBvZiBiZXR3ZWVuLWdyb3VwIHRpZXMgKCRFJCkgYW5kIHdpdGhpbi1ncm91cCB0aWVzICgkSSQpLiBJdCBjYW4gdGh1cyBiZSBpbnRlcnByZXRlZCBhcyBhIG1lYXN1cmUgb2YgbmV0d29yayBzZWdyZWdhdGlvbi4gIA0KDQpFLUkgSW5kZXg6ICRFSSA9IC0gXGZyYWN7RS1JfXtFK0l9JCAgDQoNCldlIHVzZSBhIHJldmVyc2VkIHZlcnNpb24sIHNvIGhpZ2hlciBzY29yZXMgaW5kaWNhdGUgbW9yZSBob21vZ2VuZWl0eTogDQoNCi0gMSBpcyBtYXhpbXVtIGhvbW9nZW5laXR5ICANCi0gLTEgaXMgbWF4aW11bSBoZXRlcm9nZW5laXR5ICANCg0KDQpGb3IgRmlndXJlIDQ6ICANCg0KKiBDb2xvciBob21vZ2VuZWl0eSA9ICQtIFxmcmFjezItM317MiszfSQgPSArMC4yLiAgDQoqIFNoYXBlIGhvbW9nZW5laXR5ID0gJC0gXGZyYWN7My0yfXsyKzN9JCA9IC0wLjIuICANCg0KKk9wZXJhdGlvbmFsaXphdGlvbiAyLioNCg0KU2ltaWxhcml0eSBJbmRleA0KDQpTIEluZGV4ID0gJFMgPSAyKihcZnJhY3tcU2lnbWFfaiBzaW1eel97aWp9fXtcU2lnbWFfan0pIC0gMSQsICANCndoZXJlICRzaW1eel97aWp9ID0gMSAtIFxmcmFje3x6X2kgLSB6X2p8fXtyX3p9JC4gIA0KDQpIaWdlciBzY29yZXMgaW5kaWNhdGUgbW9yZSBob21vZ2VuZWl0eS9zaW1pbGFyaXR5OiAgDQoNCi0gMSBpcyBtYXhpbXVtIHNpbWlsYXJpdHkgIA0KLSAtMSBpcyBtYXhpbXVtIGRpc3NpbWlsYXJpdHkgIA0KDQoNCi0tLSAgDQoNCiMjIEluZGVwZW5kZW50IHZhcmlhYmxlcw0KDQotIEVkdWNhdGlvbjogDQogICAgKiBsb3cgKHByaW1hcnksIHZtYm8pICANCiAgICAqIG1lZGl1bSAoTUJPLCBIQVZPLCBWV08pICANCiAgICAqIFByb2Zlc3Npb25hbCBjb2xsZWdlIChIQk8pICANCiAgICAqIFVuaXZlcnNpdHkgICANCi0gR2VuZGVyOg0KICAgICogbWFsZSAgDQogICAgKiBmZW1hbGUgIA0KLSBBZ2U6IA0KICAgICogYmlydGggeWVhciAgDQogICAgKiBmaXZlIHllYXIgY2F0ZWdvcmllcyAgDQotIEV0aG5pY2l0eTogIA0KICAgICogbmF0aXZlIER1dGNoICANCiAgICAqIG5vbi13ZXN0ZXJuICANCiAgICAqIHdlc3Rlcm4gIA0KDQoNCi0tLSAgDQoNCiMjIFJlcHJlc2VudGl2aXR5DQoNCjwhLS0tDQpUaGlqbWVuLCBob3cgZG8gSSBrbm93IGVnbyBwYXJ0aWNpcGF0ZWQ/OiBqdXN0IHNlbGVjdCBvbiBtaXNzaW5ncw0KaG93IGRvIEkga25vdyB0aGF0IGFuIGFsdGVyIGlzIG1lbnRpb25lZD86IGNoZWNrIGFsdGVyX2lkIE5BDQotLS0+DQoNCkxJU1MgcmVwcmVzZW50YXRpdmUgd2l0aCByZXNwZWN0IHRvIGVkdWN0aW9uYWwgbGV2ZWwgbWVhc3VyZWQgaW4gZml2ZSBjYXRlZ29yaWVzPyANCg0KYGBge3IsIGVjaG89VFJVRSwgcmVzdWx0cz0naG9sZCd9DQoNCmxvYWQoZmlsZT0iLi9kYXRhL2xpc3NfbWVyZ2VkX2NvcmVfZmlsZV92M18wOTIxLlJkYXRhIikNCg0Kc2FtcGxlX3ZhbCA8LSBOQQ0Kc2FtcGxlX3ZhbFsxXSA8LSAodGFibGUobGlzc193aWRlJG9wbGNhdC4xMSkpWzFdDQpzYW1wbGVfdmFsWzJdIDwtICh0YWJsZShsaXNzX3dpZGUkb3BsY2F0LjExKSlbMl0NCnNhbXBsZV92YWxbM10gPC0gKHRhYmxlKGxpc3Nfd2lkZSRvcGxjYXQuMTEpKVszXSArICh0YWJsZShsaXNzX3dpZGUkb3BsY2F0LjExKSlbNF0NCnNhbXBsZV92YWxbNF0gPC0gKHRhYmxlKGxpc3Nfd2lkZSRvcGxjYXQuMTEpKVs1XQ0Kc2FtcGxlX3ZhbFs1XSA8LSAodGFibGUobGlzc193aWRlJG9wbGNhdC4xMSkpWzZdDQoNCg0KI2NicyBodHRwczovL29wZW5kYXRhLmNicy5ubC8jL0NCUy9ubC9kYXRhc2V0LzgyODE2TkVEL3RhYmxlP3RzPTE2NDYxMzMxMDg1MTcNCmRhdGFjYnMgPC0gYygxMjY1LAkyODQ3LAk1MjExLAkzMTIyLAkxODUwKQ0KbGV2ZWxzKGRhdGFjYnMpIDwtIGMoInByaW1haXIiLCAidm1ibyIsICJoYXZvL3Z3by9tYm8iLCAiaGJvIiwgIndvIikNCiNyb3VuZChkYXRhY2JzIC8gc3VtKGRhdGFjYnMpLDIpDQpwb3BfdmFsIDwtIGRhdGFjYnMgLyBzdW0oZGF0YWNicykNCg0KdGVzdCA8LSBjaGlzcS50ZXN0KHg9c2FtcGxlX3ZhbCwgcD1wb3BfdmFsLCByZXNjYWxlLnAgPSBUUlVFKQ0KdGVzdF9kYXRhIDwtIGRhdGEuZnJhbWUocm91bmQodGVzdCRvYnNlcnZlZCkscm91bmQodGVzdCRleHBlY3RlZCksIGMoInByaW1haXIiLCAidm1ibyIsICJoYXZvL3Z3by9tYm8iLCAiaGJvIiwgIndvIikpDQpuYW1lcyh0ZXN0X2RhdGEpIDwtIGMoIm9ic2VydmVkIChMSVNTKSIsICJleHBlY3RlZCAoQ0JTKSIsICJsZXZlbHMiKQ0KdGVzdF9kYXRhDQp0ZXN0DQoNCnJtKGxpc3Q9bHMoKSkNCmBgYA0KDQpOb3BlLCBidXQgbm90aGluZyByZWFsbHkgcHJvYmxlbWF0aWMuIA0KDQotLS0gIA0KDQo8IS0tLQ0KIyMgRGF0YSBwcmVwLiANCg0KV2UgcHJlcGFyZWQgdHdvIGRhdGFzZXRzLCBvbmUgaW4gd2hpY2ggd2UgaW5jbHVkZWQgYWxsIGFsdGVycyBhbmQgb25lIGluIHdoaWNoIHdlIGV4Y2x1ZGVkIGtpbi1hbHRlcnMuIA0KVGhpcyBwcmVzZW50YXRpb24gd2Ugd2lsbCB1c2UgaW5mb21yYXRpb24gb24gYWxsIGFsdGVycy4gDQotLS0+IA0KDQojIFNvbWUgZGF0YSB3cmFuZ2xpbmcgIA0KDQpgYGB7ciwgZWNobz1UUlVFLCBldmFsPUZBTFNFfQ0KDQpsb2FkKGZpbGU9Ii4vZGF0YS9saXNzX2pjYV9qb2NoZW1fVjIucmRzIikNCg0KDQpsaXNzX2xvbmcgJT4lDQogIG11dGF0ZSgjc2l6ZQ0KICAgICAgICAjY2RuX3NpemUgPSA1IC0gcm93U3Vtcyhpcy5uYShjYmluZChhbHRlcl9pZF8xLCBhbHRlcl9pZF8yLCBhbHRlcl9pZF8zLCBhbHRlcl9pZF80LCBhbHRlcl9pZF81KSkpLA0KICAgICAgICBjZG5fc2l6ZSA9IDUgLSByb3dTdW1zKGlzLm5hKGNiaW5kKGdlbmRlcl9hbHRlcjEsIGdlbmRlcl9hbHRlcjIsIGdlbmRlcl9hbHRlcjMsIGdlbmRlcl9hbHRlcjQsIGdlbmRlcl9hbHRlcjUpKSksDQogICAgICAgICNlZHVjYXRpb24NCiAgICAgICAgb3BsX3kgPSByZWNvZGUoYXMubnVtZXJpYyhvcGxtZXQpLCAnMScgPSA2LCAnMic9MTAsICczJz0gMTEuNSwgJzQnID0gMTAuNSwgJzUnID0gMTUsICc2Jz0xNiwgJzgnPTQsIC5kZWZhdWx0PS0xICksDQogICAgICAgIG9wbF95ID0gbmFfaWYob3BsX3ksIC0xKSwgDQogICAgICAgIG9wbDQgPSByZWNvZGUoYXMubnVtZXJpYyhvcGxtZXQpLCAnMScgPSAxLCAnMic9MSwgJzMnPSAyLCAnNCcgPSAyLCAnNScgPSAzLCAnNic9NCwgLmRlZmF1bHQ9LTEgKSwNCiAgICAgICAgb3BsNCA9IG5hX2lmKG9wbDQsIC0xKSwgDQogICAgICAgIG9wbDQgPSBzdHJ1Y3R1cmUob3BsNCwgbGFiZWxzPWMoImxvdyIsICJtZWRpdW0iLCAiaGlnaDEiLCAiaGlnaDIiKSksDQogICAgICAgICBhY3Jvc3MoYyhlZHVjX3JlY29kZV9hbHRlcjEsZWR1Y19yZWNvZGVfYWx0ZXIyLGVkdWNfcmVjb2RlX2FsdGVyMyxlZHVjX3JlY29kZV9hbHRlcjQsZWR1Y19yZWNvZGVfYWx0ZXI1KSwgfmFzLm51bWVyaWMoLngpLCAubmFtZXMgPSAiey5jb2x9X29wbDQiKSwNCiAgICAgICAgIGFjcm9zcyhjKGVkdWNfcmVjb2RlX2FsdGVyMV9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyMl9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyM19vcGw0LGVkdWNfcmVjb2RlX2FsdGVyNF9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyNV9vcGw0KSwgfnJlY29kZSgueCwgJzQnPTEsICc2Jz0xLCAnMTAnPTIsICcxMC41Jz0yLCAnMTEuNSc9MiAsICcxNSc9MywgJzE2JyA9IDQsIC5kZWZhdWx0PS0xKSksDQogICAgICAgICBhY3Jvc3MoYyhlZHVjX3JlY29kZV9hbHRlcjFfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjJfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjNfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjRfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjVfb3BsNCksIH5uYV9pZigueCwgLTEpKSwNCiAgICAgICAgZWR1Y19JID0gcm93U3VtcyhjYmluZChlZHVjX3JlY29kZV9hbHRlcjFfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjJfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjNfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjRfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjVfb3BsNCk9PW9wbDQsbmEucm09VCksDQogICAgICAgICBlZHVjX0UgPSByb3dTdW1zKGNiaW5kKGVkdWNfcmVjb2RlX2FsdGVyMV9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyMl9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyM19vcGw0LGVkdWNfcmVjb2RlX2FsdGVyNF9vcGw0LGVkdWNfcmVjb2RlX2FsdGVyNV9vcGw0KSE9b3BsNCxuYS5ybT1UKSwNCiAgICAgICAgIGVkdWNfRUkgPSAgLSAoKGVkdWNfRSAtIGVkdWNfSSkgLyAoZWR1Y19FICsgZWR1Y19JKSksDQogICAgICAgICBjZG5fbmVkdWNfaCA9IHJvd1N1bXMoY2JpbmQoZWR1Y19yZWNvZGVfYWx0ZXIxLCBlZHVjX3JlY29kZV9hbHRlcjIsIGVkdWNfcmVjb2RlX2FsdGVyMywgZWR1Y19yZWNvZGVfYWx0ZXI0LCBlZHVjX3JlY29kZV9hbHRlcjUpPT0xNiwgbmEucm09VCksDQogICAgICAgIGNkbl9zaXplX2VkdWMgPSA1IC0gcm93U3Vtcyhpcy5uYShjYmluZChlZHVjX3JlY29kZV9hbHRlcjEsZWR1Y19yZWNvZGVfYWx0ZXIyLGVkdWNfcmVjb2RlX2FsdGVyMyxlZHVjX3JlY29kZV9hbHRlcjQsZWR1Y19yZWNvZGVfYWx0ZXI1KSkpLCANCiAgICAgICAgZWR1Y19zaW0gPSAyKigxLSByb3dTdW1zKGFicygoY2JpbmQoZWR1Y19yZWNvZGVfYWx0ZXIxLGVkdWNfcmVjb2RlX2FsdGVyMixlZHVjX3JlY29kZV9hbHRlcjMsZWR1Y19yZWNvZGVfYWx0ZXI0LGVkdWNfcmVjb2RlX2FsdGVyNSkgLSBvcGxfeSkvMTIpLCBuYS5ybT1UKS9jZG5fc2l6ZV9lZHVjKS0xLA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgICNnZW5kZXIgICANCiAgICAgICAgIGdlbmRlcl9hbHRlcjEgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjEsIC0xKSwNCiAgICAgICAgIGdlbmRlcl9hbHRlcjIgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjIsIC0xKSwNCiAgICAgICAgIGdlbmRlcl9hbHRlcjMgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjMsIC0xKSwNCiAgICAgICAgIGdlbmRlcl9hbHRlcjQgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjQsIC0xKSwNCiAgICAgICAgIGdlbmRlcl9hbHRlcjUgPSByZXBsYWNlX25hKGdlbmRlcl9hbHRlcjUsIC0xKSwNCiAgICAgICAgIGNkbl9uZ2VuZGVyXzIgPSByb3dTdW1zKGNiaW5kKGdlbmRlcl9hbHRlcjEsIGdlbmRlcl9hbHRlcjIsIGdlbmRlcl9hbHRlcjMsIGdlbmRlcl9hbHRlcjQsIGdlbmRlcl9hbHRlcjUpPT0yLCBuYS5ybT1UKSwNCiAgICAgICAgIGNkbl9uZ2VuZGVyXzEgPSByb3dTdW1zKGNiaW5kKGdlbmRlcl9hbHRlcjEsIGdlbmRlcl9hbHRlcjIsIGdlbmRlcl9hbHRlcjMsIGdlbmRlcl9hbHRlcjQsIGdlbmRlcl9hbHRlcjUpPT0xLCBuYS5ybT1UKSwNCiAgICAgICAgIGdlbmRlcl9JID0gaWZlbHNlKGdlc2xhY2h0PT0yLCBjZG5fbmdlbmRlcl8yLCBjZG5fbmdlbmRlcl8xKSwNCiAgICAgICAgIGdlbmRlcl9FID0gaWZlbHNlKGdlc2xhY2h0PT0xLCBjZG5fbmdlbmRlcl8yLCBjZG5fbmdlbmRlcl8xKSwNCiAgICAgICAgIGdlbmRlcl9FSSA9ICAtICgoZ2VuZGVyX0UgLSBnZW5kZXJfSSkgLyAoZ2VuZGVyX0UgKyBnZW5kZXJfSSkpLA0KICAgICAgICANCiAgICAgICAgI2FnZQ0KICAgICAgICBhY3Jvc3MoYyhhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSwgfm5hX2lmKC54LCAxNCkpLA0KICAgICAgICBhY3Jvc3MoYyhhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSwgfmFzLmludGVnZXIoLngpKSwNCiAgICAgICAgbGVlZnRpamRfY2F0MTMgPSBhcy5pbnRlZ2VyKGN1dChhcy5udW1lcmljKGxpc3NfbG9uZyRsZWVmdGlqZCksYnJlYWtzID0gYygtSW5mLCAxNSwgMjAsIDI1LCAzMCwgMzUsIDQwLDQ1LDUwLDU1LDYwLDY1LDcwLCBJbmYpKSksDQogICAgICAgIGxlZWZ0aWpkX0kgPSByb3dTdW1zKGNiaW5kKGFnZV9hbHRlcjEsIGFnZV9hbHRlcjIsIGFnZV9hbHRlcjMsIGFnZV9hbHRlcjQsIGFnZV9hbHRlcjUpPT1sZWVmdGlqZF9jYXQxMywgbmEucm09VCksDQogICAgICAgIGxlZWZ0aWpkX0UgPSByb3dTdW1zKGNiaW5kKGFnZV9hbHRlcjEsIGFnZV9hbHRlcjIsIGFnZV9hbHRlcjMsIGFnZV9hbHRlcjQsIGFnZV9hbHRlcjUpIT1sZWVmdGlqZF9jYXQxMywgbmEucm09VCksDQogICAgICAgIGxlZWZ0aWpkX0VJID0gIC0gKChsZWVmdGlqZF9FIC0gbGVlZnRpamRfSSkgLyAobGVlZnRpamRfRSArIGxlZWZ0aWpkX0kpKSwNCiAgICAgICAgDQogICAgICAgIGNkbl9zaXplX2FnZSA9IDUgLSByb3dTdW1zKGlzLm5hKGNiaW5kKGFnZV9hbHRlcjEsIGFnZV9hbHRlcjIsIGFnZV9hbHRlcjMsIGFnZV9hbHRlcjQsIGFnZV9hbHRlcjUpKSksIA0KICAgICAgICBhY3Jvc3MoYyhhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSwgfnJlY29kZSgueCwgJzEnPTE1LCAnMic9MTgsICczJz0yMywgJzQnPTI4LCAnNSc9MzMgLCAnNic9MzgsICc3JyA9IDQzLCc4Jz0gNDgsICc5Jz01MywgJzEwJz01OCwgJzExJz02MywgJzEyJz02OCwgJzEzJz03NSwgLmRlZmF1bHQ9LTEpKSwNCiAgICAgICAgIGFjcm9zcyhjKGFnZV9hbHRlcjEsIGFnZV9hbHRlcjIsIGFnZV9hbHRlcjMsIGFnZV9hbHRlcjQsIGFnZV9hbHRlcjUpLCB+bmFfaWYoLngsIC0xKSksDQogICAgICAgIGxlZWZ0aWpkX3NpbSA9IDIqKDEgLSByb3dTdW1zKGFicygoY2JpbmQoYWdlX2FsdGVyMSwgYWdlX2FsdGVyMiwgYWdlX2FsdGVyMywgYWdlX2FsdGVyNCwgYWdlX2FsdGVyNSkgLSBhcy5udW1lcmljKGxpc3NfbG9uZyRsZWVmdGlqZCkpLzc1KSwgbmEucm09VCkvY2RuX3NpemVfYWdlKS0xLA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICAjZXRuaQ0KICAgICAgICBldG5pMyA9IHJlY29kZShhcy5udW1lcmljKG9yaWdpbiksICcwJyA9IDEsICcxMDEnPTIsICcxMDInPSAzLCAnMjAxJyA9IDIsICcyMDInID0gMywgJzk5OSc9LTEsIC5kZWZhdWx0PS0xICksDQogICAgICAgIGV0bmkzID0gbmFfaWYoZXRuaTMsIC0xKSwgDQogICAgICAgIGV0bmkzID0gc3RydWN0dXJlKGV0bmkzLCBsYWJlbHM9YygiRCIsICJXIiwgIk5XIikpLA0KICAgICAgICAgYWNyb3NzKGMob3JpZ2luX2FsdGVyMSxvcmlnaW5fYWx0ZXIyLG9yaWdpbl9hbHRlcjMsb3JpZ2luX2FsdGVyNCxvcmlnaW5fYWx0ZXI1KSwgfmFzLm51bWVyaWMoLngpLCAubmFtZXMgPSAiey5jb2x9X2V0bmkzIiksDQogICAgICAgICBhY3Jvc3MoYyhvcmlnaW5fYWx0ZXIxX2V0bmkzLG9yaWdpbl9hbHRlcjJfZXRuaTMsb3JpZ2luX2FsdGVyM19ldG5pMyxvcmlnaW5fYWx0ZXI0X2V0bmkzLG9yaWdpbl9hbHRlcjVfZXRuaTMpLCB+cmVjb2RlKC54LCAnMSc9MSwgJzInPTMsICczJz0zLCAnNCc9MywgJzUnPTMgLCAnNic9MiwgJzcnID0gMywgJzgnID0gMiwgJzknID0gLTEsIC5kZWZhdWx0PS0xKSksDQogICAgICAgICBhY3Jvc3MoYyhvcmlnaW5fYWx0ZXIxX2V0bmkzLG9yaWdpbl9hbHRlcjJfZXRuaTMsb3JpZ2luX2FsdGVyM19ldG5pMyxvcmlnaW5fYWx0ZXI0X2V0bmkzLG9yaWdpbl9hbHRlcjVfZXRuaTMpLCB+bmFfaWYoLngsIC0xKSksDQogICAgICAgICBldG5pX0kgPSByb3dTdW1zKGNiaW5kKG9yaWdpbl9hbHRlcjFfZXRuaTMsIG9yaWdpbl9hbHRlcjJfZXRuaTMsIG9yaWdpbl9hbHRlcjNfZXRuaTMsIG9yaWdpbl9hbHRlcjRfZXRuaTMgLG9yaWdpbl9hbHRlcjVfZXRuaTMpPT1ldG5pMywgbmEucm09VCksDQogICAgICAgICBldG5pX0UgPSByb3dTdW1zKGNiaW5kKG9yaWdpbl9hbHRlcjFfZXRuaTMsb3JpZ2luX2FsdGVyMl9ldG5pMyxvcmlnaW5fYWx0ZXIzX2V0bmkzLG9yaWdpbl9hbHRlcjRfZXRuaTMsb3JpZ2luX2FsdGVyNV9ldG5pMykhPWV0bmkzLCBuYS5ybT1UKSwNCiAgICAgICAgIGV0bmlfRUkgPSAgLSAoKGV0bmlfRSAtIGV0bmlfSSkgLyAoZXRuaV9FICsgZXRuaV9JKSksDQogICAgICAgIA0KICAgICAgICAgIGVnb19pZCA9IG5vbWVtX2VuY3IpICU+JQ0KICAjZmlsdGVyKCFpcy5uYShwb2xfaW50KSkgICAlPiUNCiAgc2VsZWN0KGVnb19pZCwgIHN1cnZleV93YXZlLCBsZWVmdGlqZCwgbGVlZnRpamRfY2F0MTMsICBvcGw0LCBnZXNsYWNodCwgZXRuaTMsIGNkbl9zaXplLCBjZG5fc2l6ZV9lZHVjLCBjZG5fc2l6ZV9hZ2UsIGVkdWNfRUksZWR1Y19zaW0sZ2VuZGVyX0VJLCBsZWVmdGlqZF9FSSwgbGVlZnRpamRfc2ltLCBldG5pX0VJICkgLT4gZGF0YWp0DQoNCiNtYWtlIHNpbWlsYXIgZGF0YXNldCBmb3Igbm9uLWtpbi4gZHVzIGdvb2kgYWxsZSBhbHRlcnMgd2VnIG1ldCByZWxfYWx0ZXIgLSAxIDIsMyw0LDUNCiMgcXVpY2tlc3Qgd291bGQgcHJvYmFibHkgYmUgdG8gZ28gZnJvbSB3aWRlIHRvIGxvbmcsIHNlbGVjdCBhbmQgZ28gYmFjayB0byB3aWRlLiBidXQuLi4NCg0KYXR0cmlidXRlcyhsaXNzX3dpZGUkcmVsX2FsdGVyMS4xKQ0KDQpsaXNzX2xvbmcgJT4lDQogIG11dGF0ZShhY3Jvc3MoYyhyZWxfYWx0ZXIxLHJlbF9hbHRlcjIscmVsX2FsdGVyMyxyZWxfYWx0ZXI0LHJlbF9hbHRlcjUpLCB+cmVwbGFjZV9uYSgueCwgLTEpKSwNCiAgICAgICAgICNhbHRlcl9pZF8xID0gaWZlbHNlKHJlbF9hbHRlcjE+MCAmIHJlbF9hbHRlcjE8NiwgTkEsIGFsdGVyX2lkXzEpLCANCiAgICAgICAgICNhbHRlcl9pZF8yID0gaWZlbHNlKHJlbF9hbHRlcjI+MCAmIHJlbF9hbHRlcjI8NiwgTkEsIGFsdGVyX2lkXzIpLCANCiAgICAgICAgICNhbHRlcl9pZF8zID0gaWZlbHNlKHJlbF9hbHRlcjM+MCAmIHJlbF9hbHRlcjM8NiwgTkEsIGFsdGVyX2lkXzMpLCANCiAgICAgICAgICNhbHRlcl9pZF80ID0gaWZlbHNlKHJlbF9hbHRlcjQ+MCAmIHJlbF9hbHRlcjQ8NiwgTkEsIGFsdGVyX2lkXzQpLCANCiAgICAgICAgICNhbHRlcl9pZF81ID0gaWZlbHNlKHJlbF9hbHRlcjU+MCAmIHJlbF9hbHRlcjU8NiwgTkEsIGFsdGVyX2lkXzUpLCANCiAgICAgICAgIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXIxID0gaWZlbHNlKHJlbF9hbHRlcjE+MCAmIHJlbF9hbHRlcjE8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyMSksIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXIyID0gaWZlbHNlKHJlbF9hbHRlcjI+MCAmIHJlbF9hbHRlcjI8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyMiksIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXIzID0gaWZlbHNlKHJlbF9hbHRlcjM+MCAmIHJlbF9hbHRlcjM8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyMyksIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXI0ID0gaWZlbHNlKHJlbF9hbHRlcjQ+MCAmIHJlbF9hbHRlcjQ8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyNCksIA0KICAgICAgICAgZWR1Y19yZWNvZGVfYWx0ZXI1ID0gaWZlbHNlKHJlbF9hbHRlcjU+MCAmIHJlbF9hbHRlcjU8NiwgTkEsIGVkdWNfcmVjb2RlX2FsdGVyNSksIA0KICAgICAgICAgDQogICAgICAgICBnZW5kZXJfYWx0ZXIxID0gaWZlbHNlKHJlbF9hbHRlcjE+MCAmIHJlbF9hbHRlcjE8NiwgTkEsIGdlbmRlcl9hbHRlcjEpLCANCiAgICAgICAgIGdlbmRlcl9hbHRlcjIgPSBpZmVsc2UocmVsX2FsdGVyMj4wICYgcmVsX2FsdGVyMjw2LCBOQSwgZ2VuZGVyX2FsdGVyMiksIA0KICAgICAgICAgZ2VuZGVyX2FsdGVyMyA9IGlmZWxzZShyZWxfYWx0ZXIzPjAgJiByZWxfYWx0ZXIzPDYsIE5BLCBnZW5kZXJfYWx0ZXIzKSwgDQogICAgICAgICBnZW5kZXJfYWx0ZXI0ID0gaWZlbHNlKHJlbF9hbHRlcjQ+MCAmIHJlbF9hbHRlcjQ8NiwgTkEsIGdlbmRlcl9hbHRlcjQpLCANCiAgICAgICAgIGdlbmRlcl9hbHRlcjUgPSBpZmVsc2UocmVsX2FsdGVyNT4wICYgcmVsX2FsdGVyNTw2LCBOQSwgZ2VuZGVyX2FsdGVyNSksDQogICAgICAgICANCiAgICAgICAgIG9yaWdpbl9hbHRlcjEgPSBpZmVsc2UocmVsX2FsdGVyMT4wICYgcmVsX2FsdGVyMTw2LCBOQSwgb3JpZ2luX2FsdGVyMSksIA0KICAgICAgICAgb3JpZ2luX2FsdGVyMiA9IGlmZWxzZShyZWxfYWx0ZXIyPjAgJiByZWxfYWx0ZXIyPDYsIE5BLCBvcmlnaW5fYWx0ZXIyKSwgDQogICAgICAgICBvcmlnaW5fYWx0ZXIzID0gaWZlbHNlKHJlbF9hbHRlcjM+MCAmIHJlbF9hbHRlcjM8NiwgTkEsIG9yaWdpbl9hbHRlcjMpLCANCiAgICAgICAgIG9yaWdpbl9hbHRlcjQgPSBpZmVsc2UocmVsX2FsdGVyND4wICYgcmVsX2FsdGVyNDw2LCBOQSwgb3JpZ2luX2FsdGVyNCksIA0KICAgICAgICAgb3JpZ2luX2FsdGVyNSA9IGlmZWxzZShyZWxfYWx0ZXI1PjAgJiByZWxfYWx0ZXI1PDYsIE5BLCBvcmlnaW5fYWx0ZXI1KSwNCiAgICAgICAgIA0KICAgICAgICAgYWdlX2FsdGVyMSA9IGlmZWxzZShyZWxfYWx0ZXIxPjAgJiByZWxfYWx0ZXIxPDYsIE5BLCBhZ2VfYWx0ZXIxKSwgDQogICAgICAgICBhZ2VfYWx0ZXIyID0gaWZlbHNlKHJlbF9hbHRlcjI+MCAmIHJlbF9hbHRlcjI8NiwgTkEsIGFnZV9hbHRlcjIpLCANCiAgICAgICAgIGFnZV9hbHRlcjMgPSBpZmVsc2UocmVsX2FsdGVyMz4wICYgcmVsX2FsdGVyMzw2LCBOQSwgYWdlX2FsdGVyMyksIA0KICAgICAgICAgYWdlX2FsdGVyNCA9IGlmZWxzZShyZWxfYWx0ZXI0PjAgJiByZWxfYWx0ZXI0PDYsIE5BLCBhZ2VfYWx0ZXI0KSwgDQogICAgICAgICBhZ2VfYWx0ZXI1ID0gaWZlbHNlKHJlbF9hbHRlcjU+MCAmIHJlbF9hbHRlcjU8NiwgTkEsIGFnZV9hbHRlcjUpLA0KICAgICAgICAgDQogICAgICAgICANCiAgICAgICAgICkgJT4lDQoNCg0KICBtdXRhdGUoI3NpemUNCiAgICAgICAgI2Nkbl9zaXplID0gNSAtIHJvd1N1bXMoaXMubmEoY2JpbmQoYWx0ZXJfaWRfMSwgYWx0ZXJfaWRfMiwgYWx0ZXJfaWRfMywgYWx0ZXJfaWRfNCwgYWx0ZXJfaWRfNSkpKSwNCiAgICAgICAgY2RuX3NpemUgPSA1IC0gcm93U3Vtcyhpcy5uYShjYmluZChnZW5kZXJfYWx0ZXIxLCBnZW5kZXJfYWx0ZXIyLCBnZW5kZXJfYWx0ZXIzLCBnZW5kZXJfYWx0ZXI0LCBnZW5kZXJfYWx0ZXI1KSkpLA0KICAgICAgICAjZWR1Y2F0aW9uDQogICAgICAgIG9wbF95ID0gcmVjb2RlKGFzLm51bWVyaWMob3BsbWV0KSwgJzEnID0gNiwgJzInPTEwLCAnMyc9IDExLjUsICc0JyA9IDEwLjUsICc1JyA9IDE1LCAnNic9MTYsICc4Jz00LCAuZGVmYXVsdD0tMSApLA0KICAgICAgICBvcGxfeSA9IG5hX2lmKG9wbF95LCAtMSksIA0KICAgICAgICBvcGw0ID0gcmVjb2RlKGFzLm51bWVyaWMob3BsbWV0KSwgJzEnID0gMSwgJzInPTEsICczJz0gMiwgJzQnID0gMiwgJzUnID0gMywgJzYnPTQsIC5kZWZhdWx0PS0xICksDQogICAgICAgIG9wbDQgPSBuYV9pZihvcGw0LCAtMSksIA0KICAgICAgICBvcGw0ID0gc3RydWN0dXJlKG9wbDQsIGxhYmVscz1jKCJsb3ciLCAibWVkaXVtIiwgImhpZ2gxIiwgImhpZ2gyIikpLA0KICAgICAgICAgYWNyb3NzKGMoZWR1Y19yZWNvZGVfYWx0ZXIxLGVkdWNfcmVjb2RlX2FsdGVyMixlZHVjX3JlY29kZV9hbHRlcjMsZWR1Y19yZWNvZGVfYWx0ZXI0LGVkdWNfcmVjb2RlX2FsdGVyNSksIH5hcy5udW1lcmljKC54KSwgLm5hbWVzID0gInsuY29sfV9vcGw0IiksDQogICAgICAgICBhY3Jvc3MoYyhlZHVjX3JlY29kZV9hbHRlcjFfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjJfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjNfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjRfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjVfb3BsNCksIH5yZWNvZGUoLngsICc0Jz0xLCAnNic9MSwgJzEwJz0yLCAnMTAuNSc9MiwgJzExLjUnPTIgLCAnMTUnPTMsICcxNicgPSA0LCAuZGVmYXVsdD0tMSkpLA0KICAgICAgICAgYWNyb3NzKGMoZWR1Y19yZWNvZGVfYWx0ZXIxX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXIyX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXIzX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXI0X29wbDQsZWR1Y19yZWNvZGVfYWx0ZXI1X29wbDQpLCB+bmFfaWYoLngsIC0xKSksDQogICAgICAgIGVkdWNfSSA9IHJvd1N1bXMoY2JpbmQoZWR1Y19yZWNvZGVfYWx0ZXIxX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXIyX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXIzX29wbDQsZWR1Y19yZWNvZGVfYWx0ZXI0X29wbDQsZWR1Y19yZWNvZGVfYWx0ZXI1X29wbDQpPT1vcGw0LG5hLnJtPVQpLA0KICAgICAgICAgZWR1Y19FID0gcm93U3VtcyhjYmluZChlZHVjX3JlY29kZV9hbHRlcjFfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjJfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjNfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjRfb3BsNCxlZHVjX3JlY29kZV9hbHRlcjVfb3BsNCkhPW9wbDQsbmEucm09VCksDQogICAgICAgICBlZHVjX0VJID0gIC0gKChlZHVjX0UgLSBlZHVjX0kpIC8gKGVkdWNfRSArIGVkdWNfSSkpLA0KICAgICAgICAgY2RuX25lZHVjX2ggPSByb3dTdW1zKGNiaW5kKGVkdWNfcmVjb2RlX2FsdGVyMSwgZWR1Y19yZWNvZGVfYWx0ZXIyLCBlZHVjX3JlY29kZV9hbHRlcjMsIGVkdWNfcmVjb2RlX2FsdGVyNCwgZWR1Y19yZWNvZGVfYWx0ZXI1KT09MTYsIG5hLnJtPVQpLA0KICAgICAgICBjZG5fc2l6ZV9lZHVjID0gNSAtIHJvd1N1bXMoaXMubmEoY2JpbmQoZWR1Y19yZWNvZGVfYWx0ZXIxLGVkdWNfcmVjb2RlX2FsdGVyMixlZHVjX3JlY29kZV9hbHRlcjMsZWR1Y19yZWNvZGVfYWx0ZXI0LGVkdWNfcmVjb2RlX2FsdGVyNSkpKSwgDQogICAgICAgIGVkdWNfc2ltID0gMiooMS0gcm93U3VtcyhhYnMoKGNiaW5kKGVkdWNfcmVjb2RlX2FsdGVyMSxlZHVjX3JlY29kZV9hbHRlcjIsZWR1Y19yZWNvZGVfYWx0ZXIzLGVkdWNfcmVjb2RlX2FsdGVyNCxlZHVjX3JlY29kZV9hbHRlcjUpIC0gb3BsX3kpLzEyKSwgbmEucm09VCkvY2RuX3NpemVfZWR1YyktMSwNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICAjZ2VuZGVyICAgDQogICAgICAgICBnZW5kZXJfYWx0ZXIxID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXIxLCAtMSksDQogICAgICAgICBnZW5kZXJfYWx0ZXIyID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXIyLCAtMSksDQogICAgICAgICBnZW5kZXJfYWx0ZXIzID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXIzLCAtMSksDQogICAgICAgICBnZW5kZXJfYWx0ZXI0ID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXI0LCAtMSksDQogICAgICAgICBnZW5kZXJfYWx0ZXI1ID0gcmVwbGFjZV9uYShnZW5kZXJfYWx0ZXI1LCAtMSksDQogICAgICAgICBjZG5fbmdlbmRlcl8yID0gcm93U3VtcyhjYmluZChnZW5kZXJfYWx0ZXIxLCBnZW5kZXJfYWx0ZXIyLCBnZW5kZXJfYWx0ZXIzLCBnZW5kZXJfYWx0ZXI0LCBnZW5kZXJfYWx0ZXI1KT09MiwgbmEucm09VCksDQogICAgICAgICBjZG5fbmdlbmRlcl8xID0gcm93U3VtcyhjYmluZChnZW5kZXJfYWx0ZXIxLCBnZW5kZXJfYWx0ZXIyLCBnZW5kZXJfYWx0ZXIzLCBnZW5kZXJfYWx0ZXI0LCBnZW5kZXJfYWx0ZXI1KT09MSwgbmEucm09VCksDQogICAgICAgICBnZW5kZXJfSSA9IGlmZWxzZShnZXNsYWNodD09MiwgY2RuX25nZW5kZXJfMiwgY2RuX25nZW5kZXJfMSksDQogICAgICAgICBnZW5kZXJfRSA9IGlmZWxzZShnZXNsYWNodD09MSwgY2RuX25nZW5kZXJfMiwgY2RuX25nZW5kZXJfMSksDQogICAgICAgICBnZW5kZXJfRUkgPSAgLSAoKGdlbmRlcl9FIC0gZ2VuZGVyX0kpIC8gKGdlbmRlcl9FICsgZ2VuZGVyX0kpKSwNCiAgICAgICAgDQogICAgICAgICNhZ2UNCiAgICAgICAgYWNyb3NzKGMoYWdlX2FsdGVyMSwgYWdlX2FsdGVyMiwgYWdlX2FsdGVyMywgYWdlX2FsdGVyNCwgYWdlX2FsdGVyNSksIH5uYV9pZigueCwgMTQpKSwNCiAgICAgICAgYWNyb3NzKGMoYWdlX2FsdGVyMSwgYWdlX2FsdGVyMiwgYWdlX2FsdGVyMywgYWdlX2FsdGVyNCwgYWdlX2FsdGVyNSksIH5hcy5pbnRlZ2VyKC54KSksDQogICAgICAgIGxlZWZ0aWpkX2NhdDEzID0gYXMuaW50ZWdlcihjdXQoYXMubnVtZXJpYyhsaXNzX2xvbmckbGVlZnRpamQpLGJyZWFrcyA9IGMoLUluZiwgMTUsIDIwLCAyNSwgMzAsIDM1LCA0MCw0NSw1MCw1NSw2MCw2NSw3MCwgSW5mKSkpLA0KICAgICAgICBsZWVmdGlqZF9JID0gcm93U3VtcyhjYmluZChhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KT09bGVlZnRpamRfY2F0MTMsIG5hLnJtPVQpLA0KICAgICAgICBsZWVmdGlqZF9FID0gcm93U3VtcyhjYmluZChhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSE9bGVlZnRpamRfY2F0MTMsIG5hLnJtPVQpLA0KICAgICAgICBsZWVmdGlqZF9FSSA9ICAtICgobGVlZnRpamRfRSAtIGxlZWZ0aWpkX0kpIC8gKGxlZWZ0aWpkX0UgKyBsZWVmdGlqZF9JKSksDQogICAgICAgIA0KICAgICAgICBjZG5fc2l6ZV9hZ2UgPSA1IC0gcm93U3Vtcyhpcy5uYShjYmluZChhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSkpLCANCiAgICAgICAgYWNyb3NzKGMoYWdlX2FsdGVyMSwgYWdlX2FsdGVyMiwgYWdlX2FsdGVyMywgYWdlX2FsdGVyNCwgYWdlX2FsdGVyNSksIH5yZWNvZGUoLngsICcxJz0xNSwgJzInPTE4LCAnMyc9MjMsICc0Jz0yOCwgJzUnPTMzICwgJzYnPTM4LCAnNycgPSA0MywnOCc9IDQ4LCAnOSc9NTMsICcxMCc9NTgsICcxMSc9NjMsICcxMic9NjgsICcxMyc9NzUsIC5kZWZhdWx0PS0xKSksDQogICAgICAgICBhY3Jvc3MoYyhhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSwgfm5hX2lmKC54LCAtMSkpLA0KICAgICAgICBsZWVmdGlqZF9zaW0gPSAyKiggMSAtIHJvd1N1bXMoYWJzKChjYmluZChhZ2VfYWx0ZXIxLCBhZ2VfYWx0ZXIyLCBhZ2VfYWx0ZXIzLCBhZ2VfYWx0ZXI0LCBhZ2VfYWx0ZXI1KSAtIGFzLm51bWVyaWMobGlzc19sb25nJGxlZWZ0aWpkKSkvNzUpLCBuYS5ybT1UKS9jZG5fc2l6ZV9hZ2UpLTEsDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgICNldG5pDQogICAgICAgIGV0bmkzID0gcmVjb2RlKGFzLm51bWVyaWMob3JpZ2luKSwgJzAnID0gMSwgJzEwMSc9MiwgJzEwMic9IDMsICcyMDEnID0gMiwgJzIwMicgPSAzLCAnOTk5Jz0tMSwgLmRlZmF1bHQ9LTEgKSwNCiAgICAgICAgZXRuaTMgPSBuYV9pZihldG5pMywgLTEpLCANCiAgICAgICAgZXRuaTMgPSBzdHJ1Y3R1cmUoZXRuaTMsIGxhYmVscz1jKCJEIiwgIlciLCAiTlciKSksDQogICAgICAgICBhY3Jvc3MoYyhvcmlnaW5fYWx0ZXIxLG9yaWdpbl9hbHRlcjIsb3JpZ2luX2FsdGVyMyxvcmlnaW5fYWx0ZXI0LG9yaWdpbl9hbHRlcjUpLCB+YXMubnVtZXJpYygueCksIC5uYW1lcyA9ICJ7LmNvbH1fZXRuaTMiKSwNCiAgICAgICAgIGFjcm9zcyhjKG9yaWdpbl9hbHRlcjFfZXRuaTMsb3JpZ2luX2FsdGVyMl9ldG5pMyxvcmlnaW5fYWx0ZXIzX2V0bmkzLG9yaWdpbl9hbHRlcjRfZXRuaTMsb3JpZ2luX2FsdGVyNV9ldG5pMyksIH5yZWNvZGUoLngsICcxJz0xLCAnMic9MywgJzMnPTMsICc0Jz0zLCAnNSc9MyAsICc2Jz0yLCAnNycgPSAzLCAnOCcgPSAyLCAnOScgPSAtMSwgLmRlZmF1bHQ9LTEpKSwNCiAgICAgICAgIGFjcm9zcyhjKG9yaWdpbl9hbHRlcjFfZXRuaTMsb3JpZ2luX2FsdGVyMl9ldG5pMyxvcmlnaW5fYWx0ZXIzX2V0bmkzLG9yaWdpbl9hbHRlcjRfZXRuaTMsb3JpZ2luX2FsdGVyNV9ldG5pMyksIH5uYV9pZigueCwgLTEpKSwNCiAgICAgICAgIGV0bmlfSSA9IHJvd1N1bXMoY2JpbmQob3JpZ2luX2FsdGVyMV9ldG5pMywgb3JpZ2luX2FsdGVyMl9ldG5pMywgb3JpZ2luX2FsdGVyM19ldG5pMywgb3JpZ2luX2FsdGVyNF9ldG5pMyAsb3JpZ2luX2FsdGVyNV9ldG5pMyk9PWV0bmkzLCBuYS5ybT1UKSwNCiAgICAgICAgIGV0bmlfRSA9IHJvd1N1bXMoY2JpbmQob3JpZ2luX2FsdGVyMV9ldG5pMyxvcmlnaW5fYWx0ZXIyX2V0bmkzLG9yaWdpbl9hbHRlcjNfZXRuaTMsb3JpZ2luX2FsdGVyNF9ldG5pMyxvcmlnaW5fYWx0ZXI1X2V0bmkzKSE9ZXRuaTMsIG5hLnJtPVQpLA0KICAgICAgICAgZXRuaV9FSSA9ICAtICgoZXRuaV9FIC0gZXRuaV9JKSAvIChldG5pX0UgKyBldG5pX0kpKSwNCiAgICAgICAgDQogICAgICAgICAgZWdvX2lkID0gbm9tZW1fZW5jcikgJT4lDQogICNmaWx0ZXIoIWlzLm5hKHBvbF9pbnQpKSAgICU+JQ0KICBzZWxlY3QoZWdvX2lkLCAgc3VydmV5X3dhdmUsIGxlZWZ0aWpkLCBsZWVmdGlqZF9jYXQxMywgIG9wbDQsIGdlc2xhY2h0LCBldG5pMywgY2RuX3NpemUsIGNkbl9zaXplX2VkdWMsIGNkbl9zaXplX2FnZSwgZWR1Y19FSSxlZHVjX3NpbSxnZW5kZXJfRUksIGxlZWZ0aWpkX0VJLCBsZWVmdGlqZF9zaW0sIGV0bmlfRUkgKSAgLT4gZGF0YWp0X25rDQoNCg0KDQoNCnRlc3QgPC0gY3V0KGFzLm51bWVyaWMobGlzc19sb25nJGxlZWZ0aWpkKSxicmVha3MgPSBjKC1JbmYsIDE1LCAyMCwgMjUsIDMwLCAzNSwgNDAsNDUsNTAsNTUsNjAsNjUsNzAsIEluZikpDQojbGV2ZWxzKHRlc3QpDQoNCnNhdmUoZGF0YWp0LCBmaWxlPSIuL2RhdGEvZGF0YWp0LnJkYSIpDQpzYXZlKGRhdGFqdF9uaywgZmlsZT0iLi9kYXRhL2RhdGFqdF9uay5yZGEiKQ0KDQojY29yLnRlc3QoZGF0YWp0JGVkdWNfRUksIGRhdGFqdCRlZHVjX3NpbSkNCiNjb3IudGVzdChkYXRhanQkbGVlZnRpamRfRUksIGRhdGFqdCRsZWVmdGlqZF9zaW0pDQoNCiNoaXN0KGRhdGFqdCRsZWVmdGlqZF9zaW0pDQoNCiNybShsaXN0PWxzKCkpICANCmBgYA0KDQotLS0gDQoNCiMgUmVmZXJlbmNlcw0K