library(ggplot2)
Warning message:
In readChar(file, size, TRUE) : truncating string with embedded nuls
library(dplyr)
library(tidyr)
library(stringr)

Se normalizo teniendo en cuenta el tiempo.

Parte Uno

Tt <- PRF %>% select(-standard_deviation) %>% mutate(PC = PC$prom) %>% mutate(DRF = DRF$prom) %>% mutate(DC = DC$prom) %>% mutate(URF = URF$prom) %>% mutate(UC = UC$prom) 
colnames(Tt)[2] <- "PRF"

Tsd <- PRF %>% select(-prom) %>% mutate(PC = PC$standard_deviation) %>% mutate(DRF = DRF$standard_deviation) %>%
  mutate(DC = DC$standard_deviation) %>% mutate(URF = URF$standard_deviation) %>% mutate(UC = UC$standard_deviation)
colnames(Tsd)[2] <- "PRF"

Tsd <- Tsd %>% pivot_longer(cols = -X1)
Tt <- Tt %>% pivot_longer(cols = -X1) %>% mutate(sd = Tsd$value)

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

Tt %>% filter(X1 %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>%
  ggplot()+
  geom_col(aes(x=name,y=value), fill="skyblue")+
  geom_errorbar(aes(x=name,ymin=value-sd, ymax=value+sd), width=.2,position=position_dodge(.9))+
  facet_wrap(~X1)+
  theme_bw()

#Parte Dos

UCV = read.csv(file="UpV_Time")
DCV = read.csv(file="DownV_Time")
PCV = read.csv(file="PuroV_Time")
URFV = read.csv(file="C:/Users/DuzzLogic/Google Drive/Cosas/LABSIN/Botnets/CTU19_RandomForest/Resultados2/UpV_Time")
DRFV = read.csv(file="C:/Users/DuzzLogic/Google Drive/Cosas/LABSIN/Botnets/CTU19_RandomForest/Resultados2/DownV_Time")
PRFV = read.csv(file="C:/Users/DuzzLogic/Google Drive/Cosas/LABSIN/Botnets/CTU19_RandomForest/Resultados2/PuroV_Time")
PCv <- PCV %>% mutate(test = "PC") %>% 
  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)

DCv <- DCV %>% mutate(test = "DC") %>% 
  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)

UCv <- UCV %>% mutate(test = "UC") %>% 
  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)

PRFv <- PRFV %>% mutate(test = "PRF") %>% 
  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)

DRFv <- DRFV %>% mutate(test = "DRF") %>% 
  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)

URFv <- URFV %>% mutate(test = "URF") %>% 
  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)
PCvSD <- PCV %>% mutate(test = "PC") %>% select(-prom,-prom.1,-prom.2,-prom.3,-prom.4,-prom.5,-prom.6,-prom.7,-prom.8) %>% 
  filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>%select(-X) %>% pivot_longer(cols = -test)

DCvSD <- DCV %>% mutate(test = "DC") %>% select(-prom,-prom.1,-prom.2,-prom.3,-prom.4,-prom.5,-prom.6,-prom.7,-prom.8) %>%
  filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test)

UCvSD <- UCV %>% mutate(test = "UC") %>% select(-prom,-prom.1,-prom.2,-prom.3,-prom.4,-prom.5,-prom.6,-prom.7,-prom.8) %>%
  filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test)

PRFvSD <- PRFV %>% mutate(test = "PRF") %>% select(-prom,-prom.1,-prom.2,-prom.3,-prom.4,-prom.5,-prom.6,-prom.7,-prom.8) %>%
  filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test)

DRFvSD <- DRFV %>% mutate(test = "DRF") %>% select(-prom,-prom.1,-prom.2,-prom.3,-prom.4,-prom.5,-prom.6,-prom.7,-prom.8) %>%
  filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test)

URFvSD <- URFV %>% mutate(test = "URF") %>% select(-prom,-prom.1,-prom.2,-prom.3,-prom.4,-prom.5,-prom.6,-prom.7,-prom.8) %>%
  filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test)
PCv <- PCv %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name) %>% mutate(sd = PCvSD$value)
PRFv <- PRFv %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name) %>% mutate(sd = PRFvSD$value)
DCv <- DCv %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name) %>% mutate(sd = DCvSD$value)
DRFv <- DRFv %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name) %>% mutate(sd = DRFvSD$value)
UCv <- UCv %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name) %>% mutate(sd = UCvSD$value)
URFv <- URFv %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name) %>% mutate(sd = URFvSD$value)
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")
PCv <- PCv %>% cbind(name) 
PRFv <- PRFv %>% cbind(name) 
DCv <- DCv %>% cbind(name) 
DRFv <- DRFv %>% cbind(name) 
UCv <- UCv %>% cbind(name) 
URFv <- URFv %>% cbind(name) 

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

Tsec <- PCv %>% rbind(PRFv) %>% rbind(DCv) %>% rbind(DRFv) %>% rbind(UCv) %>% rbind(URFv) 
Tsec
Tsec %>%
  ggplot()+
  geom_col(aes(x=test,y=value), fill="skyblue")+
  facet_wrap(~name, ncol = 9)+
  geom_errorbar(aes(x=test,ymin=value-sd, ymax=value+sd), width=.2,position=position_dodge(.9))+
  theme_bw()

Analizamos Puro utilizando Catboost

Balanced accuracy

PCv %>% filter(grepl("BA",name)) %>%
  ggplot()+
  geom_col(aes(x=name,y=value), fill="skyblue")+
  geom_errorbar(aes(x=name,ymin=value-sd, ymax=value+sd), width=.2,position=position_dodge(.9))+
  theme_bw()

Comparamos

Balanced accuracy

PRFv %>% rbind(PCv) %>% filter(grepl("BA",name)) %>%
  ggplot()+
  geom_col(aes(x=test,y=value), fill="skyblue")+
  geom_errorbar(aes(x=test,ymin=value-sd, ymax=value+sd), width=.2,position=position_dodge(.9))+
  facet_wrap(~name)+
  theme_bw()

LS0tDQp0aXRsZTogIlJlc3VsdGFkb3MgQ1RVMTlfUmFuZG9tRm9yZXN0X1ZTX0NhdGJvb3N0Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3RyaW5ncikNCmBgYA0KDQpTZSBub3JtYWxpem8gdGVuaWVuZG8gZW4gY3VlbnRhIGVsIHRpZW1wby4NCg0KIyBQYXJ0ZSBVbm8NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NClBDID0gcmVhZHI6OnJlYWRfZGVsaW0oZmlsZT0iUHVyb19UaW1lIixkZWxpbSA9ICcsJykNClBSRiA9IHJlYWRyOjpyZWFkX2RlbGltKGZpbGU9IkM6L1VzZXJzL0R1enpMb2dpYy9Hb29nbGUgRHJpdmUvQ29zYXMvTEFCU0lOL0JvdG5ldHMvQ1RVMTlfUmFuZG9tRm9yZXN0L1Jlc3VsdGFkb3MyL1B1cm9fVGltZSIsZGVsaW0gPSAnLCcpDQpEQyA9IHJlYWRyOjpyZWFkX2RlbGltKGZpbGU9IkRvd25fVGltZSIsZGVsaW0gPSAnLCcpDQpEUkYgPSByZWFkcjo6cmVhZF9kZWxpbShmaWxlPSJDOi9Vc2Vycy9EdXp6TG9naWMvR29vZ2xlIERyaXZlL0Nvc2FzL0xBQlNJTi9Cb3RuZXRzL0NUVTE5X1JhbmRvbUZvcmVzdC9SZXN1bHRhZG9zMi9Eb3duX1RpbWUiLGRlbGltID0gJywnKQ0KVUMgPSByZWFkcjo6cmVhZF9kZWxpbShmaWxlPSJVcF9UaW1lIixkZWxpbSA9ICcsJykNClVSRiA9IHJlYWRyOjpyZWFkX2RlbGltKGZpbGU9IkM6L1VzZXJzL0R1enpMb2dpYy9Hb29nbGUgRHJpdmUvQ29zYXMvTEFCU0lOL0JvdG5ldHMvQ1RVMTlfUmFuZG9tRm9yZXN0L1Jlc3VsdGFkb3MyL1VwX1RpbWUiLGRlbGltID0gJywnKQ0KYGBgDQoNCg0KYGBge3J9DQpUdCA8LSBQUkYgJT4lIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uKSAlPiUgbXV0YXRlKFBDID0gUEMkcHJvbSkgJT4lIG11dGF0ZShEUkYgPSBEUkYkcHJvbSkgJT4lIG11dGF0ZShEQyA9IERDJHByb20pICU+JSBtdXRhdGUoVVJGID0gVVJGJHByb20pICU+JSBtdXRhdGUoVUMgPSBVQyRwcm9tKSANCmNvbG5hbWVzKFR0KVsyXSA8LSAiUFJGIg0KDQpUc2QgPC0gUFJGICU+JSBzZWxlY3QoLXByb20pICU+JSBtdXRhdGUoUEMgPSBQQyRzdGFuZGFyZF9kZXZpYXRpb24pICU+JSBtdXRhdGUoRFJGID0gRFJGJHN0YW5kYXJkX2RldmlhdGlvbikgJT4lDQogIG11dGF0ZShEQyA9IERDJHN0YW5kYXJkX2RldmlhdGlvbikgJT4lIG11dGF0ZShVUkYgPSBVUkYkc3RhbmRhcmRfZGV2aWF0aW9uKSAlPiUgbXV0YXRlKFVDID0gVUMkc3RhbmRhcmRfZGV2aWF0aW9uKQ0KY29sbmFtZXMoVHNkKVsyXSA8LSAiUFJGIg0KDQpUc2QgPC0gVHNkICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC1YMSkNCmBgYA0KDQpgYGB7cn0NClR0IDwtIFR0ICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC1YMSkgJT4lIG11dGF0ZShzZCA9IFRzZCR2YWx1ZSkNCmBgYA0KDQoNClRlbmdvIG1lam9yZXMgcmVzdWx0YWRvcyBsdWVnbyBkZSBhcGxpY2FyIERvd25TYW1wbGluZy4gVGFtYmllbiB0ZW5nbyBtZWpvcmVzIHJlc3VsdGFkb3MgY29uIGxvcyBmZWF0dXJlIHZlY3RvcnMgc2luIG5vcm1hbGl6YXIsIGF1bnF1ZSBlc3RhIG1lam9yYSBlcyBleHRyZW1hZGFtZW50ZSBtaW5pbWEuDQoNCmBgYHtyfQ0KVHQgJT4lIGZpbHRlcihYMSAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9bmFtZSx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh4PW5hbWUseW1pbj12YWx1ZS1zZCwgeW1heD12YWx1ZStzZCksIHdpZHRoPS4yLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkrDQogIGZhY2V0X3dyYXAoflgxKSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCg0KI1BhcnRlIERvcw0KDQpgYGB7cn0NClVDViA9IHJlYWQuY3N2KGZpbGU9IlVwVl9UaW1lIikNCkRDViA9IHJlYWQuY3N2KGZpbGU9IkRvd25WX1RpbWUiKQ0KUENWID0gcmVhZC5jc3YoZmlsZT0iUHVyb1ZfVGltZSIpDQpVUkZWID0gcmVhZC5jc3YoZmlsZT0iQzovVXNlcnMvRHV6ekxvZ2ljL0dvb2dsZSBEcml2ZS9Db3Nhcy9MQUJTSU4vQm90bmV0cy9DVFUxOV9SYW5kb21Gb3Jlc3QvUmVzdWx0YWRvczIvVXBWX1RpbWUiKQ0KRFJGViA9IHJlYWQuY3N2KGZpbGU9IkM6L1VzZXJzL0R1enpMb2dpYy9Hb29nbGUgRHJpdmUvQ29zYXMvTEFCU0lOL0JvdG5ldHMvQ1RVMTlfUmFuZG9tRm9yZXN0L1Jlc3VsdGFkb3MyL0Rvd25WX1RpbWUiKQ0KUFJGViA9IHJlYWQuY3N2KGZpbGU9IkM6L1VzZXJzL0R1enpMb2dpYy9Hb29nbGUgRHJpdmUvQ29zYXMvTEFCU0lOL0JvdG5ldHMvQ1RVMTlfUmFuZG9tRm9yZXN0L1Jlc3VsdGFkb3MyL1B1cm9WX1RpbWUiKQ0KYGBgDQoNCg0KYGBge3J9IA0KUEN2IDwtIFBDViAlPiUgbXV0YXRlKHRlc3QgPSAiUEMiKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KREN2IDwtIERDViAlPiUgbXV0YXRlKHRlc3QgPSAiREMiKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KVUN2IDwtIFVDViAlPiUgbXV0YXRlKHRlc3QgPSAiVUMiKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KUFJGdiA8LSBQUkZWICU+JSBtdXRhdGUodGVzdCA9ICJQUkYiKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KRFJGdiA8LSBEUkZWICU+JSBtdXRhdGUodGVzdCA9ICJEUkYiKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KVVJGdiA8LSBVUkZWICU+JSBtdXRhdGUodGVzdCA9ICJVUkYiKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCmBgYA0KDQpgYGB7cn0gDQpQQ3ZTRCA8LSBQQ1YgJT4lIG11dGF0ZSh0ZXN0ID0gIlBDIikgJT4lIHNlbGVjdCgtcHJvbSwtcHJvbS4xLC1wcm9tLjIsLXByb20uMywtcHJvbS40LC1wcm9tLjUsLXByb20uNiwtcHJvbS43LC1wcm9tLjgpICU+JSANCiAgZmlsdGVyKFggJWluJSBjKCJTZW5zaXRpdml0eSIsIlNwZWNpZmljaXR5IiwiRjEiLCJCYWxhbmNlZCBBY2N1cmFjeSIpKSAlPiVzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KQ0KDQpEQ3ZTRCA8LSBEQ1YgJT4lIG11dGF0ZSh0ZXN0ID0gIkRDIikgJT4lIHNlbGVjdCgtcHJvbSwtcHJvbS4xLC1wcm9tLjIsLXByb20uMywtcHJvbS40LC1wcm9tLjUsLXByb20uNiwtcHJvbS43LC1wcm9tLjgpICU+JQ0KICBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KQ0KDQpVQ3ZTRCA8LSBVQ1YgJT4lIG11dGF0ZSh0ZXN0ID0gIlVDIikgJT4lIHNlbGVjdCgtcHJvbSwtcHJvbS4xLC1wcm9tLjIsLXByb20uMywtcHJvbS40LC1wcm9tLjUsLXByb20uNiwtcHJvbS43LC1wcm9tLjgpICU+JQ0KICBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KQ0KDQpQUkZ2U0QgPC0gUFJGViAlPiUgbXV0YXRlKHRlc3QgPSAiUFJGIikgJT4lIHNlbGVjdCgtcHJvbSwtcHJvbS4xLC1wcm9tLjIsLXByb20uMywtcHJvbS40LC1wcm9tLjUsLXByb20uNiwtcHJvbS43LC1wcm9tLjgpICU+JQ0KICBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KQ0KDQpEUkZ2U0QgPC0gRFJGViAlPiUgbXV0YXRlKHRlc3QgPSAiRFJGIikgJT4lIHNlbGVjdCgtcHJvbSwtcHJvbS4xLC1wcm9tLjIsLXByb20uMywtcHJvbS40LC1wcm9tLjUsLXByb20uNiwtcHJvbS43LC1wcm9tLjgpICU+JQ0KICBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KQ0KDQpVUkZ2U0QgPC0gVVJGViAlPiUgbXV0YXRlKHRlc3QgPSAiVVJGIikgJT4lIHNlbGVjdCgtcHJvbSwtcHJvbS4xLC1wcm9tLjIsLXByb20uMywtcHJvbS40LC1wcm9tLjUsLXByb20uNiwtcHJvbS43LC1wcm9tLjgpICU+JQ0KICBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KQ0KYGBgDQoNCmBgYHtyfQ0KUEN2IDwtIFBDdiAlPiUgZmlsdGVyKFggJWluJSBjKCJTZW5zaXRpdml0eSIsIlNwZWNpZmljaXR5IiwiRjEiLCJCYWxhbmNlZCBBY2N1cmFjeSIpKSAlPiUgc2VsZWN0KC1YKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtdGVzdCkgJT4lIHNlbGVjdCgtbmFtZSkgJT4lIG11dGF0ZShzZCA9IFBDdlNEJHZhbHVlKQ0KUFJGdiA8LSBQUkZ2ICU+JSBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KSAlPiUgc2VsZWN0KC1uYW1lKSAlPiUgbXV0YXRlKHNkID0gUFJGdlNEJHZhbHVlKQ0KREN2IDwtIERDdiAlPiUgZmlsdGVyKFggJWluJSBjKCJTZW5zaXRpdml0eSIsIlNwZWNpZmljaXR5IiwiRjEiLCJCYWxhbmNlZCBBY2N1cmFjeSIpKSAlPiUgc2VsZWN0KC1YKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtdGVzdCkgJT4lIHNlbGVjdCgtbmFtZSkgJT4lIG11dGF0ZShzZCA9IERDdlNEJHZhbHVlKQ0KRFJGdiA8LSBEUkZ2ICU+JSBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KSAlPiUgc2VsZWN0KC1uYW1lKSAlPiUgbXV0YXRlKHNkID0gRFJGdlNEJHZhbHVlKQ0KVUN2IDwtIFVDdiAlPiUgZmlsdGVyKFggJWluJSBjKCJTZW5zaXRpdml0eSIsIlNwZWNpZmljaXR5IiwiRjEiLCJCYWxhbmNlZCBBY2N1cmFjeSIpKSAlPiUgc2VsZWN0KC1YKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtdGVzdCkgJT4lIHNlbGVjdCgtbmFtZSkgJT4lIG11dGF0ZShzZCA9IFVDdlNEJHZhbHVlKQ0KVVJGdiA8LSBVUkZ2ICU+JSBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KSAlPiUgc2VsZWN0KC1uYW1lKSAlPiUgbXV0YXRlKHNkID0gVVJGdlNEJHZhbHVlKQ0KYGBgDQoNCmBgYHtyfQ0KbmFtZSA8LSBjKCJTZW5zaXRpdml0eS4wIiwiU2Vuc2l0aXZpdHkuMSIsIlNlbnNpdGl2aXR5LjIiLCJTZW5zaXRpdml0eS4zIiwiU2Vuc2l0aXZpdHkuNCIsIlNlbnNpdGl2aXR5LjUiLCJTZW5zaXRpdml0eS42IiwiU2Vuc2l0aXZpdHkuNyIsIlNlbnNpdGl2aXR5LjgiLCJTcGVjaWZpY2l0eS4wIiwiU3BlY2lmaWNpdHkuMSIsIlNwZWNpZmljaXR5LjIiLCJTcGVjaWZpY2l0eS4zIiwiU3BlY2lmaWNpdHkuNCIsIlNwZWNpZmljaXR5LjUiLCJTcGVjaWZpY2l0eS42IiwiU3BlY2lmaWNpdHkuNyIsIlNwZWNpZmljaXR5LjgiLCJGMS4wIiwiRjEuMSIsIkYxLjIiLCJGMS4zIiwiRjEuNCIsIkYxLjUiLCJGMS42IiwiRjEuNyIsIkYxLjgiLCJCQWNjdXJhY3kuMCIsIkJBY2N1cmFjeS4xIiwiQkFjY3VyYWN5LjIiLCJCQWNjdXJhY3kuMyIsIkJBY2N1cmFjeS40IiwiQkFjY3VyYWN5LjUiLCJCQWNjdXJhY3kuNiIsIkJBY2N1cmFjeS43IiwiQkFjY3VyYWN5LjgiKQ0KUEN2IDwtIFBDdiAlPiUgY2JpbmQobmFtZSkgDQpQUkZ2IDwtIFBSRnYgJT4lIGNiaW5kKG5hbWUpIA0KREN2IDwtIERDdiAlPiUgY2JpbmQobmFtZSkgDQpEUkZ2IDwtIERSRnYgJT4lIGNiaW5kKG5hbWUpIA0KVUN2IDwtIFVDdiAlPiUgY2JpbmQobmFtZSkgDQpVUkZ2IDwtIFVSRnYgJT4lIGNiaW5kKG5hbWUpIA0KYGBgDQoNCkFob3JhIGZhbHRhIG1ldGVyIHRvZG8gZW4gdW4gbWlzbW8gZGF0YXNldCBwYXJhIHBvZGVyIGdyYWZpY2FyLiANCiANCg0KYGBge3J9DQpUc2VjIDwtIFBDdiAlPiUgcmJpbmQoUFJGdikgJT4lIHJiaW5kKERDdikgJT4lIHJiaW5kKERSRnYpICU+JSByYmluZChVQ3YpICU+JSByYmluZChVUkZ2KSANClRzZWMNCmBgYA0KDQpgYGB7ciBmaWcud2lkdGg9MjB9DQpUc2VjICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9dGVzdCx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICBmYWNldF93cmFwKH5uYW1lLCBuY29sID0gOSkrDQogIGdlb21fZXJyb3JiYXIoYWVzKHg9dGVzdCx5bWluPXZhbHVlLXNkLCB5bWF4PXZhbHVlK3NkKSwgd2lkdGg9LjIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCg0KIyMgQW5hbGl6YW1vcyBQdXJvIHV0aWxpemFuZG8gQ2F0Ym9vc3QNCg0KIyMjIEJhbGFuY2VkIGFjY3VyYWN5DQoNCmBgYHtyIGZpZy53aWR0aD0xMH0NClBDdiAlPiUgZmlsdGVyKGdyZXBsKCJCQSIsbmFtZSkpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9bmFtZSx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh4PW5hbWUseW1pbj12YWx1ZS1zZCwgeW1heD12YWx1ZStzZCksIHdpZHRoPS4yLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkrDQogIHRoZW1lX2J3KCkNCmBgYA0KDQoNCiMjIENvbXBhcmFtb3MNCg0KDQojIyMgQmFsYW5jZWQgYWNjdXJhY3kNCg0KYGBge3IgZmlnLndpZHRoPTE1fQ0KUFJGdiAlPiUgcmJpbmQoUEN2KSAlPiUgZmlsdGVyKGdyZXBsKCJCQSIsbmFtZSkpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9dGVzdCx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh4PXRlc3QseW1pbj12YWx1ZS1zZCwgeW1heD12YWx1ZStzZCksIHdpZHRoPS4yLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkrDQogIGZhY2V0X3dyYXAofm5hbWUpKw0KICB0aGVtZV9idygpDQpgYGANCg0K