library(ggplot2)
library(dplyr)
library(tidyr)
library(stringr)

Parte Uno

Tt <- Puro_N %>% select(-standard_deviation) %>% mutate(PuroSN = Puro_SN$prom) %>% mutate(DownN = Down_N$prom) %>% mutate(DownSN = Down_SN$prom) %>% 
  mutate(UpN = Up_N$prom) %>% mutate(UpSN = Up_SN$prom) 
colnames(Tt)[2] <- "PuroN"

Tsd <- Puro_N %>% select(-prom) %>% mutate(PuroSN = Puro_SN$standard_deviation) %>% mutate(DownN = Down_N$standard_deviation) %>%
  mutate(DownSN = Down_SN$standard_deviation) %>% mutate(UpN = Up_N$standard_deviation) %>% mutate(UpSN = Up_SN$standard_deviation) 

Tengo mejores resultados luego de aplicar DownSampling. Tambien tengo mejores resultados con los feature vectors sin normalizar, aunque esta mejora es extremadamente minima.

Tt %>% pivot_longer(cols = -X1) %>% filter(X1 %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>%
  ggplot()+
  geom_col(aes(x=name,y=value), fill="skyblue")+
  facet_wrap(~X1)+
  theme_bw()

Como vemos la desviacion nunca es mayor a 0.04.

Tsd %>% pivot_longer(cols = -X1) %>% filter(X1 %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>%
  ggplot()+
  geom_point(aes(x=name,y=value), fill="skyblue")+
  facet_wrap(~X1)+
  theme_bw()

Parte Dos

PuroN <- PuroV_N %>% mutate(test = "PuroN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

PuroSN <- PuroV_SN %>% mutate(test = "PuroSN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

DownN <- DownV_N %>% mutate(test = "DownN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

DownSN <- DownV_SN %>% mutate(test = "DownSN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

UpN <- UpV_N %>% mutate(test = "UpN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

UpSN <- UpV_SN %>% mutate(test = "UpSN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)
PuroN <- PuroN %>% filter(X1 %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X1) %>% pivot_longer(cols = -test) %>% select(-name)
PuroSN <- PuroSN %>% filter(X1 %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X1) %>% pivot_longer(cols = -test) %>% select(-name)
DownN <- DownN %>% filter(X1 %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X1) %>% pivot_longer(cols = -test) %>% select(-name)
DownSN <- DownSN %>% filter(X1 %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X1) %>% pivot_longer(cols = -test) %>% select(-name)
UpN <- UpN %>% filter(X1 %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X1) %>% pivot_longer(cols = -test) %>% select(-name)
UpSN <- UpSN %>% filter(X1 %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X1) %>% pivot_longer(cols = -test) %>% select(-name)
name <- c("Sensitivity.0","Sensitivity.1","Sensitivity.2","Sensitivity.3","Sensitivity.4","Sensitivity.5","Sensitivity.6","Sensitivity.7","Sensitivity.8","Specificity.0","Specificity.1","Specificity.2","Specificity.3","Specificity.4","Specificity.5","Specificity.6","Specificity.7","Specificity.8","F1.0","F1.1","F1.2","F1.3","F1.4","F1.5","F1.6","F1.7","F1.8","BAccuracy.0","BAccuracy.1","BAccuracy.2","BAccuracy.3","BAccuracy.4","BAccuracy.5","BAccuracy.6","BAccuracy.7","BAccuracy.8")
PuroN <- PuroN %>% cbind(name)
PuroSN <- PuroSN %>% cbind(name)
DownN <- DownN %>% cbind(name)
DownSN <- DownSN %>% cbind(name)
UpN <- UpN %>% cbind(name)
UpSN <- UpSN %>% cbind(name)

Ahora falta meter todo en un mismo dataset para poder graficar.

Tsec <- PuroN %>% rbind(PuroSN) %>% rbind(DownN) %>% rbind(DownSN) %>% rbind(UpN) %>% rbind(UpSN)
Tsec
Tsec %>%
  ggplot()+
  geom_col(aes(x=test,y=value), fill="skyblue")+
  facet_wrap(~name, ncol = 9)+
  theme_bw()

Analizando Solo Normalizado

Tsecc <- PuroN %>% rbind(DownN) %>% rbind(UpN)
Tsecc
Tsecc %>%
  ggplot()+
  geom_col(aes(x=test,y=value), fill="skyblue")+
  facet_wrap(~name, ncol = 9)+
  theme_bw()

Analizando solo Puro Normalizado

Balanced accuracy

PuroN %>% filter(grepl("BA",name)) %>%
  ggplot()+
  geom_col(aes(x=name,y=value), fill="skyblue")+
  theme_bw()

Specificty

PuroN %>% filter(grepl("Sp",name)) %>%
  ggplot()+
  geom_col(aes(x=name,y=value), fill="skyblue")+
  theme_bw()

LS0tDQp0aXRsZTogIlJlc3VsdGFkb3MgQ1RVMTlfUmFuZG9tRm9yZXN0Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3RyaW5ncikNCmBgYA0KDQoNCiMgUGFydGUgVW5vDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpQdXJvX1NOID0gcmVhZHI6OnJlYWRfZGVsaW0oZmlsZT0iQzovVXNlcnMvRHV6ekxvZ2ljL0dvb2dsZSBEcml2ZS9Db3Nhcy9MQUJTSU4vQm90bmV0cy9DVFUxOV9SYW5kb21Gb3Jlc3QvUmVzdWx0YWRvcy9wcm9tZWRpb19QdXJvX1NOIixkZWxpbSA9ICcsJykNClB1cm9fTiA9IHJlYWRyOjpyZWFkX2RlbGltKGZpbGU9IkM6L1VzZXJzL0R1enpMb2dpYy9Hb29nbGUgRHJpdmUvQ29zYXMvTEFCU0lOL0JvdG5ldHMvQ1RVMTlfUmFuZG9tRm9yZXN0L1Jlc3VsdGFkb3MvcHJvbWVkaW9fUHVyb19OIixkZWxpbSA9ICcsJykNCkRvd25fU04gPSByZWFkcjo6cmVhZF9kZWxpbShmaWxlPSJDOi9Vc2Vycy9EdXp6TG9naWMvR29vZ2xlIERyaXZlL0Nvc2FzL0xBQlNJTi9Cb3RuZXRzL0NUVTE5X1JhbmRvbUZvcmVzdC9SZXN1bHRhZG9zL3Byb21lZGlvX0Rvd25fU04iLGRlbGltID0gJywnKQ0KRG93bl9OID0gcmVhZHI6OnJlYWRfZGVsaW0oZmlsZT0iQzovVXNlcnMvRHV6ekxvZ2ljL0dvb2dsZSBEcml2ZS9Db3Nhcy9MQUJTSU4vQm90bmV0cy9DVFUxOV9SYW5kb21Gb3Jlc3QvUmVzdWx0YWRvcy9wcm9tZWRpb19Eb3duX04iLGRlbGltID0gJywnKQ0KVXBfU04gPSByZWFkcjo6cmVhZF9kZWxpbShmaWxlPSJDOi9Vc2Vycy9EdXp6TG9naWMvR29vZ2xlIERyaXZlL0Nvc2FzL0xBQlNJTi9Cb3RuZXRzL0NUVTE5X1JhbmRvbUZvcmVzdC9SZXN1bHRhZG9zL3Byb21lZGlvX1VwX1NOIixkZWxpbSA9ICcsJykNClVwX04gPSByZWFkcjo6cmVhZF9kZWxpbShmaWxlPSJDOi9Vc2Vycy9EdXp6TG9naWMvR29vZ2xlIERyaXZlL0Nvc2FzL0xBQlNJTi9Cb3RuZXRzL0NUVTE5X1JhbmRvbUZvcmVzdC9SZXN1bHRhZG9zL3Byb21lZGlvX1VwX04iLGRlbGltID0gJywnKQ0KYGBgDQoNCg0KYGBge3J9DQpUdCA8LSBQdXJvX04gJT4lIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uKSAlPiUgbXV0YXRlKFB1cm9TTiA9IFB1cm9fU04kcHJvbSkgJT4lIG11dGF0ZShEb3duTiA9IERvd25fTiRwcm9tKSAlPiUgbXV0YXRlKERvd25TTiA9IERvd25fU04kcHJvbSkgJT4lIA0KICBtdXRhdGUoVXBOID0gVXBfTiRwcm9tKSAlPiUgbXV0YXRlKFVwU04gPSBVcF9TTiRwcm9tKSANCmNvbG5hbWVzKFR0KVsyXSA8LSAiUHVyb04iDQoNClRzZCA8LSBQdXJvX04gJT4lIHNlbGVjdCgtcHJvbSkgJT4lIG11dGF0ZShQdXJvU04gPSBQdXJvX1NOJHN0YW5kYXJkX2RldmlhdGlvbikgJT4lIG11dGF0ZShEb3duTiA9IERvd25fTiRzdGFuZGFyZF9kZXZpYXRpb24pICU+JQ0KICBtdXRhdGUoRG93blNOID0gRG93bl9TTiRzdGFuZGFyZF9kZXZpYXRpb24pICU+JSBtdXRhdGUoVXBOID0gVXBfTiRzdGFuZGFyZF9kZXZpYXRpb24pICU+JSBtdXRhdGUoVXBTTiA9IFVwX1NOJHN0YW5kYXJkX2RldmlhdGlvbikgDQpgYGANCg0KDQpUZW5nbyBtZWpvcmVzIHJlc3VsdGFkb3MgbHVlZ28gZGUgYXBsaWNhciBEb3duU2FtcGxpbmcuIFRhbWJpZW4gdGVuZ28gbWVqb3JlcyByZXN1bHRhZG9zIGNvbiBsb3MgZmVhdHVyZSB2ZWN0b3JzIHNpbiBub3JtYWxpemFyLCBhdW5xdWUgZXN0YSBtZWpvcmEgZXMgZXh0cmVtYWRhbWVudGUgbWluaW1hLg0KDQpgYGB7cn0NClR0ICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC1YMSkgJT4lIGZpbHRlcihYMSAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9bmFtZSx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICBmYWNldF93cmFwKH5YMSkrDQogIHRoZW1lX2J3KCkNCmBgYA0KDQoNCkNvbW8gdmVtb3MgbGEgZGVzdmlhY2lvbiBudW5jYSBlcyBtYXlvciBhIDAuMDQuDQoNCmBgYHtyfQ0KVHNkICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC1YMSkgJT4lIGZpbHRlcihYMSAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1uYW1lLHk9dmFsdWUpLCBmaWxsPSJza3libHVlIikrDQogIGZhY2V0X3dyYXAoflgxKSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCg0KDQojIFBhcnRlIERvcw0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KUHVyb1ZfU04gPSByZWFkcjo6cmVhZF9kZWxpbShmaWxlPSJDOi9Vc2Vycy9EdXp6TG9naWMvR29vZ2xlIERyaXZlL0Nvc2FzL0xBQlNJTi9Cb3RuZXRzL0NUVTE5X1JhbmRvbUZvcmVzdC9SZXN1bHRhZG9zL3Byb21lZGlvX1B1cm9WX1NOIixkZWxpbSA9ICcsJykNCkRvd25WX1NOID0gcmVhZHI6OnJlYWRfZGVsaW0oZmlsZT0iQzovVXNlcnMvRHV6ekxvZ2ljL0dvb2dsZSBEcml2ZS9Db3Nhcy9MQUJTSU4vQm90bmV0cy9DVFUxOV9SYW5kb21Gb3Jlc3QvUmVzdWx0YWRvcy9wcm9tZWRpb19Eb3duVl9TTiIsZGVsaW0gPSAnLCcpDQpVcFZfU04gPSByZWFkcjo6cmVhZF9kZWxpbShmaWxlPSJDOi9Vc2Vycy9EdXp6TG9naWMvR29vZ2xlIERyaXZlL0Nvc2FzL0xBQlNJTi9Cb3RuZXRzL0NUVTE5X1JhbmRvbUZvcmVzdC9SZXN1bHRhZG9zL3Byb21lZGlvX1VwVl9TTiIsZGVsaW0gPSAnLCcpDQpQdXJvVl9OID0gcmVhZHI6OnJlYWRfZGVsaW0oZmlsZT0iQzovVXNlcnMvRHV6ekxvZ2ljL0dvb2dsZSBEcml2ZS9Db3Nhcy9MQUJTSU4vQm90bmV0cy9DVFUxOV9SYW5kb21Gb3Jlc3QvUmVzdWx0YWRvcy9wcm9tZWRpb19QdXJvVl9OIixkZWxpbSA9ICcsJykNCkRvd25WX04gPSByZWFkcjo6cmVhZF9kZWxpbShmaWxlPSJDOi9Vc2Vycy9EdXp6TG9naWMvR29vZ2xlIERyaXZlL0Nvc2FzL0xBQlNJTi9Cb3RuZXRzL0NUVTE5X1JhbmRvbUZvcmVzdC9SZXN1bHRhZG9zL3Byb21lZGlvX0Rvd25WX04iLGRlbGltID0gJywnKQ0KVXBWX04gPSByZWFkcjo6cmVhZF9kZWxpbShmaWxlPSJDOi9Vc2Vycy9EdXp6TG9naWMvR29vZ2xlIERyaXZlL0Nvc2FzL0xBQlNJTi9Cb3RuZXRzL0NUVTE5X1JhbmRvbUZvcmVzdC9SZXN1bHRhZG9zL3Byb21lZGlvX1VwVl9OIixkZWxpbSA9ICcsJykNCmBgYA0KDQpgYGB7cn0gDQpQdXJvTiA8LSBQdXJvVl9OICU+JSBtdXRhdGUodGVzdCA9ICJQdXJvTiIpICU+JSANCiAgc2VsZWN0KC1zdGFuZGFyZF9kZXZpYXRpb24sLXN0YW5kYXJkX2RldmlhdGlvbi4xLC1zdGFuZGFyZF9kZXZpYXRpb24uMiwtc3RhbmRhcmRfZGV2aWF0aW9uLjMsDQogICAgICAgICAtc3RhbmRhcmRfZGV2aWF0aW9uLjQsLXN0YW5kYXJkX2RldmlhdGlvbi41LC1zdGFuZGFyZF9kZXZpYXRpb24uNiwtc3RhbmRhcmRfZGV2aWF0aW9uLjcsLXN0YW5kYXJkX2RldmlhdGlvbi44KQ0KDQpQdXJvU04gPC0gUHVyb1ZfU04gJT4lIG11dGF0ZSh0ZXN0ID0gIlB1cm9TTiIpICU+JSANCiAgc2VsZWN0KC1zdGFuZGFyZF9kZXZpYXRpb24sLXN0YW5kYXJkX2RldmlhdGlvbi4xLC1zdGFuZGFyZF9kZXZpYXRpb24uMiwtc3RhbmRhcmRfZGV2aWF0aW9uLjMsDQogICAgICAgICAtc3RhbmRhcmRfZGV2aWF0aW9uLjQsLXN0YW5kYXJkX2RldmlhdGlvbi41LC1zdGFuZGFyZF9kZXZpYXRpb24uNiwtc3RhbmRhcmRfZGV2aWF0aW9uLjcsLXN0YW5kYXJkX2RldmlhdGlvbi44KQ0KDQpEb3duTiA8LSBEb3duVl9OICU+JSBtdXRhdGUodGVzdCA9ICJEb3duTiIpICU+JSANCiAgc2VsZWN0KC1zdGFuZGFyZF9kZXZpYXRpb24sLXN0YW5kYXJkX2RldmlhdGlvbi4xLC1zdGFuZGFyZF9kZXZpYXRpb24uMiwtc3RhbmRhcmRfZGV2aWF0aW9uLjMsDQogICAgICAgICAtc3RhbmRhcmRfZGV2aWF0aW9uLjQsLXN0YW5kYXJkX2RldmlhdGlvbi41LC1zdGFuZGFyZF9kZXZpYXRpb24uNiwtc3RhbmRhcmRfZGV2aWF0aW9uLjcsLXN0YW5kYXJkX2RldmlhdGlvbi44KQ0KDQpEb3duU04gPC0gRG93blZfU04gJT4lIG11dGF0ZSh0ZXN0ID0gIkRvd25TTiIpICU+JSANCiAgc2VsZWN0KC1zdGFuZGFyZF9kZXZpYXRpb24sLXN0YW5kYXJkX2RldmlhdGlvbi4xLC1zdGFuZGFyZF9kZXZpYXRpb24uMiwtc3RhbmRhcmRfZGV2aWF0aW9uLjMsDQogICAgICAgICAtc3RhbmRhcmRfZGV2aWF0aW9uLjQsLXN0YW5kYXJkX2RldmlhdGlvbi41LC1zdGFuZGFyZF9kZXZpYXRpb24uNiwtc3RhbmRhcmRfZGV2aWF0aW9uLjcsLXN0YW5kYXJkX2RldmlhdGlvbi44KQ0KDQpVcE4gPC0gVXBWX04gJT4lIG11dGF0ZSh0ZXN0ID0gIlVwTiIpICU+JSANCiAgc2VsZWN0KC1zdGFuZGFyZF9kZXZpYXRpb24sLXN0YW5kYXJkX2RldmlhdGlvbi4xLC1zdGFuZGFyZF9kZXZpYXRpb24uMiwtc3RhbmRhcmRfZGV2aWF0aW9uLjMsDQogICAgICAgICAtc3RhbmRhcmRfZGV2aWF0aW9uLjQsLXN0YW5kYXJkX2RldmlhdGlvbi41LC1zdGFuZGFyZF9kZXZpYXRpb24uNiwtc3RhbmRhcmRfZGV2aWF0aW9uLjcsLXN0YW5kYXJkX2RldmlhdGlvbi44KQ0KDQpVcFNOIDwtIFVwVl9TTiAlPiUgbXV0YXRlKHRlc3QgPSAiVXBTTiIpICU+JSANCiAgc2VsZWN0KC1zdGFuZGFyZF9kZXZpYXRpb24sLXN0YW5kYXJkX2RldmlhdGlvbi4xLC1zdGFuZGFyZF9kZXZpYXRpb24uMiwtc3RhbmRhcmRfZGV2aWF0aW9uLjMsDQogICAgICAgICAtc3RhbmRhcmRfZGV2aWF0aW9uLjQsLXN0YW5kYXJkX2RldmlhdGlvbi41LC1zdGFuZGFyZF9kZXZpYXRpb24uNiwtc3RhbmRhcmRfZGV2aWF0aW9uLjcsLXN0YW5kYXJkX2RldmlhdGlvbi44KQ0KYGBgDQoNCmBgYHtyfQ0KUHVyb04gPC0gUHVyb04gJT4lIGZpbHRlcihYMSAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgxKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtdGVzdCkgJT4lIHNlbGVjdCgtbmFtZSkNClB1cm9TTiA8LSBQdXJvU04gJT4lIGZpbHRlcihYMSAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgxKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtdGVzdCkgJT4lIHNlbGVjdCgtbmFtZSkNCkRvd25OIDwtIERvd25OICU+JSBmaWx0ZXIoWDEgJWluJSBjKCJTZW5zaXRpdml0eSIsIlNwZWNpZmljaXR5IiwiRjEiLCJCYWxhbmNlZCBBY2N1cmFjeSIpKSAlPiUgc2VsZWN0KC1YMSkgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gLXRlc3QpICU+JSBzZWxlY3QoLW5hbWUpDQpEb3duU04gPC0gRG93blNOICU+JSBmaWx0ZXIoWDEgJWluJSBjKCJTZW5zaXRpdml0eSIsIlNwZWNpZmljaXR5IiwiRjEiLCJCYWxhbmNlZCBBY2N1cmFjeSIpKSAlPiUgc2VsZWN0KC1YMSkgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gLXRlc3QpICU+JSBzZWxlY3QoLW5hbWUpDQpVcE4gPC0gVXBOICU+JSBmaWx0ZXIoWDEgJWluJSBjKCJTZW5zaXRpdml0eSIsIlNwZWNpZmljaXR5IiwiRjEiLCJCYWxhbmNlZCBBY2N1cmFjeSIpKSAlPiUgc2VsZWN0KC1YMSkgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gLXRlc3QpICU+JSBzZWxlY3QoLW5hbWUpDQpVcFNOIDwtIFVwU04gJT4lIGZpbHRlcihYMSAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgxKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtdGVzdCkgJT4lIHNlbGVjdCgtbmFtZSkNCmBgYA0KDQoNCmBgYHtyfQ0KbmFtZSA8LSBjKCJTZW5zaXRpdml0eS4wIiwiU2Vuc2l0aXZpdHkuMSIsIlNlbnNpdGl2aXR5LjIiLCJTZW5zaXRpdml0eS4zIiwiU2Vuc2l0aXZpdHkuNCIsIlNlbnNpdGl2aXR5LjUiLCJTZW5zaXRpdml0eS42IiwiU2Vuc2l0aXZpdHkuNyIsIlNlbnNpdGl2aXR5LjgiLCJTcGVjaWZpY2l0eS4wIiwiU3BlY2lmaWNpdHkuMSIsIlNwZWNpZmljaXR5LjIiLCJTcGVjaWZpY2l0eS4zIiwiU3BlY2lmaWNpdHkuNCIsIlNwZWNpZmljaXR5LjUiLCJTcGVjaWZpY2l0eS42IiwiU3BlY2lmaWNpdHkuNyIsIlNwZWNpZmljaXR5LjgiLCJGMS4wIiwiRjEuMSIsIkYxLjIiLCJGMS4zIiwiRjEuNCIsIkYxLjUiLCJGMS42IiwiRjEuNyIsIkYxLjgiLCJCQWNjdXJhY3kuMCIsIkJBY2N1cmFjeS4xIiwiQkFjY3VyYWN5LjIiLCJCQWNjdXJhY3kuMyIsIkJBY2N1cmFjeS40IiwiQkFjY3VyYWN5LjUiLCJCQWNjdXJhY3kuNiIsIkJBY2N1cmFjeS43IiwiQkFjY3VyYWN5LjgiKQ0KUHVyb04gPC0gUHVyb04gJT4lIGNiaW5kKG5hbWUpDQpQdXJvU04gPC0gUHVyb1NOICU+JSBjYmluZChuYW1lKQ0KRG93bk4gPC0gRG93bk4gJT4lIGNiaW5kKG5hbWUpDQpEb3duU04gPC0gRG93blNOICU+JSBjYmluZChuYW1lKQ0KVXBOIDwtIFVwTiAlPiUgY2JpbmQobmFtZSkNClVwU04gPC0gVXBTTiAlPiUgY2JpbmQobmFtZSkNCmBgYA0KDQpBaG9yYSBmYWx0YSBtZXRlciB0b2RvIGVuIHVuIG1pc21vIGRhdGFzZXQgcGFyYSBwb2RlciBncmFmaWNhci4gDQoNCmBgYHtyfQ0KVHNlYyA8LSBQdXJvTiAlPiUgcmJpbmQoUHVyb1NOKSAlPiUgcmJpbmQoRG93bk4pICU+JSByYmluZChEb3duU04pICU+JSByYmluZChVcE4pICU+JSByYmluZChVcFNOKQ0KVHNlYw0KYGBgDQoNCg0KYGBge3IgZmlnLndpZHRoPTIwfQ0KVHNlYyAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fY29sKGFlcyh4PXRlc3QseT12YWx1ZSksIGZpbGw9InNreWJsdWUiKSsNCiAgZmFjZXRfd3JhcCh+bmFtZSwgbmNvbCA9IDkpKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQojIEFuYWxpemFuZG8gU29sbyBOb3JtYWxpemFkbw0KDQpgYGB7cn0NClRzZWNjIDwtIFB1cm9OICU+JSByYmluZChEb3duTikgJT4lIHJiaW5kKFVwTikNClRzZWNjDQpgYGANCg0KYGBge3IgZmlnLndpZHRoPTIwfQ0KVHNlY2MgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2NvbChhZXMoeD10ZXN0LHk9dmFsdWUpLCBmaWxsPSJza3libHVlIikrDQogIGZhY2V0X3dyYXAofm5hbWUsIG5jb2wgPSA5KSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCiMjIEFuYWxpemFuZG8gc29sbyBQdXJvIE5vcm1hbGl6YWRvDQoNCiMjIyBCYWxhbmNlZCBhY2N1cmFjeQ0KDQpgYGB7ciBmaWcud2lkdGg9MjB9DQpQdXJvTiAlPiUgZmlsdGVyKGdyZXBsKCJCQSIsbmFtZSkpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9bmFtZSx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQojIyMgU3BlY2lmaWN0eQ0KDQpgYGB7ciBmaWcud2lkdGg9MjB9DQpQdXJvTiAlPiUgZmlsdGVyKGdyZXBsKCJTcCIsbmFtZSkpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9bmFtZSx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQo=