library(psy)
library(psych)
library(dplyr)
# Filtrar el conjunto de datos para quitar el valor "FUERA LIMA" en la columna "Ruta Agrupada"
Analisis_Transporte_filtrado <- Analisis_Transporte %>%
filter(`Ruta Agrupada` != "Fuera de Lima")
# Redondear el campo "Flete normal" a 0 decimales
Analisis_Transporte$`Flete Normal` <- round(Analisis_Transporte$`Flete Normal`, 0)
summary(Analisis_Transporte$`Flete Normal`)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0 13 58 263 228 7247
# Convertir Dia_mes a factor con niveles ordenados
Analisis_Transporte$Dia_mes <- factor(Analisis_Transporte$Dia_mes, levels = 1:30)
# Lista de variables para calcular estadísticas
variables <- c("Tipo de Camión", "Clase de entrega", "Clase transporte", "Tipo Venta", "Dia_mes", "Dia_semana", "Tipo de Proveedor", "Familia Prod", "Ruta Agrupada")
# Calcular promedio, máximo y mínimo del costo para cada variable
stats_list <- lapply(variables, function(var) {
aggregate(Analisis_Transporte$`Flete Normal` ~ ., data = Analisis_Transporte[, c(var, "Flete Normal")], FUN = function(x) c(promedio = round(mean(x), 0), maximo = round(max(x), 0), minimo = round(min(x), 0), quartil_25 = round(quantile(x, 0.25), 0), quartil_75 = round(quantile(x, 0.75), 0)))
})
# Mostrar los resultados
names(stats_list) <- variables
print(stats_list)
$`Tipo de Camión`
Tipo de Camión Analisis_Transporte$`Flete Normal`.promedio Analisis_Transporte$`Flete Normal`.maximo
1 Camión Liviano 45 401
2 Plataforma 269 7247
Analisis_Transporte$`Flete Normal`.minimo Analisis_Transporte$`Flete Normal`.quartil_25.25%
1 0 5
2 0 14
Analisis_Transporte$`Flete Normal`.quartil_75.75%
1 55
2 236
$`Clase de entrega`
Clase de entrega Analisis_Transporte$`Flete Normal`.promedio Analisis_Transporte$`Flete Normal`.maximo
1 ZMST 79 3440
2 ZPVT 59 653
3 ZTRL 338 7247
Analisis_Transporte$`Flete Normal`.minimo Analisis_Transporte$`Flete Normal`.quartil_25.25%
1 0 9
2 0 12
3 0 18
Analisis_Transporte$`Flete Normal`.quartil_75.75%
1 88
2 74
3 399
$`Clase transporte`
Clase transporte Analisis_Transporte$`Flete Normal`.promedio Analisis_Transporte$`Flete Normal`.maximo
1 Z001 62 3440
2 Z003 401 605
3 Z004 1846 3691
4 Z007 376 7247
Analisis_Transporte$`Flete Normal`.minimo Analisis_Transporte$`Flete Normal`.quartil_25.25%
1 0 7
2 197 299
3 0 923
4 0 28
Analisis_Transporte$`Flete Normal`.quartil_75.75%
1 66
2 503
3 2768
4 500
$`Tipo Venta`
Tipo Venta Analisis_Transporte$`Flete Normal`.promedio Analisis_Transporte$`Flete Normal`.maximo
1 Traslados 338 7247
2 Venta Nacional 73 3440
Analisis_Transporte$`Flete Normal`.minimo Analisis_Transporte$`Flete Normal`.quartil_25.25%
1 0 18
2 0 10
Analisis_Transporte$`Flete Normal`.quartil_75.75%
1 399
2 83
$Dia_mes
Dia_mes Analisis_Transporte$`Flete Normal`.promedio Analisis_Transporte$`Flete Normal`.maximo
1 1 196 5997
2 2 198 2600
3 3 340 5930
4 4 335 5878
5 5 296 4773
6 6 197 3350
7 7 264 5908
8 8 274 5399
9 9 249 3454
10 10 331 5845
11 11 296 7247
12 12 247 4200
13 13 190 2075
14 14 213 4838
15 15 215 4945
16 16 303 5352
17 17 201 5261
18 18 333 6822
19 19 277 5618
20 20 321 5170
21 21 279 4752
22 22 306 5915
23 23 219 4587
24 24 377 5848
25 25 212 3020
26 26 247 2400
27 27 277 5915
28 28 318 6441
29 29 196 5606
30 30 160 3176
Analisis_Transporte$`Flete Normal`.minimo Analisis_Transporte$`Flete Normal`.quartil_25.25%
1 0 6
2 0 10
3 0 9
4 0 11
5 0 11
6 0 13
7 0 17
8 0 16
9 0 14
10 0 10
11 0 18
12 0 17
13 0 10
14 0 11
15 0 12
16 0 17
17 0 17
18 0 13
19 0 9
20 0 14
21 0 21
22 0 11
23 0 20
24 0 21
25 0 11
26 0 12
27 0 12
28 0 25
29 0 19
30 0 16
Analisis_Transporte$`Flete Normal`.quartil_75.75%
1 114
2 177
3 450
4 312
5 267
6 136
7 275
8 274
9 243
10 222
11 222
12 211
13 174
14 172
15 174
16 257
17 156
18 346
19 232
20 228
21 255
22 221
23 177
24 461
25 190
26 327
27 260
28 302
29 226
30 108
$Dia_semana
Dia_semana Analisis_Transporte$`Flete Normal`.promedio Analisis_Transporte$`Flete Normal`.maximo
1 domingo 216 5261
2 jueves 259 6441
3 lunes 363 6021
4 martes 258 5540
5 miércoles 236 6822
6 sábado 253 5878
7 viernes 283 7247
Analisis_Transporte$`Flete Normal`.minimo Analisis_Transporte$`Flete Normal`.quartil_25.25%
1 0 18
2 0 12
3 0 21
4 0 12
5 0 13
6 0 16
7 0 14
Analisis_Transporte$`Flete Normal`.quartil_75.75%
1 150
2 234
3 687
4 244
5 194
6 184
7 234
$`Tipo de Proveedor`
Tipo de Proveedor Analisis_Transporte$`Flete Normal`.promedio Analisis_Transporte$`Flete Normal`.maximo
1 CLIENTE PROVEEDOR 97 369
2 OTROS PROVEEDORES 266 7247
3 TRANSPORTES BARCINO 146 3440
Analisis_Transporte$`Flete Normal`.minimo Analisis_Transporte$`Flete Normal`.quartil_25.25%
1 0 14
2 0 13
3 0 23
Analisis_Transporte$`Flete Normal`.quartil_75.75%
1 138
2 231
3 156
$`Familia Prod`
Familia Prod Analisis_Transporte$`Flete Normal`.promedio Analisis_Transporte$`Flete Normal`.maximo
1 Abrasivos flexibles 0 3
2 Abrasivos sólidos 6 184
3 Alambrón de trefilería 427 434
4 Barras de Constr. 434 5930
5 Calaminas 708 7247
6 Clavos y Alambres 472 5915
7 Herramientas 0 1
8 Mallas 288 465
9 Otros productos 52 107
10 Perfiles hasta 4" 67 1462
11 Perfiles may. 4" 72 420
12 Perno de fortificación 191 593
13 Perno Splitbolt 49 147
14 Planos 435 6441
15 Planos estructurales 420 420
16 Soldaduras 8 93
17 Tubos 141 4945
18 Tubos Iso 36 78
19 Vigas 138 138
Analisis_Transporte$`Flete Normal`.minimo Analisis_Transporte$`Flete Normal`.quartil_25.25%
1 0 0
2 0 0
3 420 424
4 0 41
5 0 62
6 0 20
7 0 0
8 24 144
9 4 16
10 0 9
11 3 10
12 0 19
13 0 0
14 0 44
15 420 420
16 0 2
17 0 25
18 10 15
19 138 138
Analisis_Transporte$`Flete Normal`.quartil_75.75%
1 0
2 2
3 430
4 183
5 800
6 450
7 0
8 465
9 89
10 71
11 61
12 347
13 106
14 800
15 420
16 7
17 163
18 49
19 138
$`Ruta Agrupada`
Ruta Agrupada Analisis_Transporte$`Flete Normal`.promedio Analisis_Transporte$`Flete Normal`.maximo
1 Lima - Lima 82 6441
2 Lima - Lurin 798 5059
3 Lima - Pisco 178 4945
4 Lima - Piura 3501 7247
5 Lima - Trujillo 2311 3691
6 Lima – Lima Mina 111 350
Analisis_Transporte$`Flete Normal`.minimo Analisis_Transporte$`Flete Normal`.quartil_25.25%
1 0 7
2 0 766
3 0 20
4 0 1310
5 10 1410
6 0 0
Analisis_Transporte$`Flete Normal`.quartil_75.75%
1 76
2 800
3 182
4 5170
5 3192
6 346
Analisis_Transporte$`Flete Normal` <- as.numeric(Analisis_Transporte$`Flete Normal`)
hist(Analisis_Transporte$`Flete Normal`)

boxplot(Analisis_Transporte$`Flete Normal`)

summary(Analisis_Transporte$`Flete Normal`)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0 13 58 263 228 7247
sd(Analisis_Transporte$`Flete Normal`)
[1] 597.1038
#Se ve que tiene una distribucion exponencial, no se eliminan outliers
library(ggplot2)
Analisis_Transporte$Dia_mes <- as.factor(Analisis_Transporte$Dia_mes)
# Crear un boxplot de TM para cada día de la semana
ggplot(Analisis_Transporte, aes(x = Dia_semana, y = `Peso TN`)) +
geom_boxplot() +
labs(title = "Boxplot de TM para cada día",
x = "Día semana",
y = "TM")

# Crear un boxplot de TM para cada día del mes
ggplot(Analisis_Transporte, aes(x = Dia_mes, y = `Peso TN`)) +
geom_boxplot() +
labs(title = "Boxplot de TM para cada día",
x = "Día mes",
y = "TM")

# Crear un boxplot de $ para cada dia de la semana
ggplot(Analisis_Transporte, aes(x = Dia_semana, y = `Flete Normal`)) +
geom_boxplot() +
labs(title = "Boxplot de $ para cada día de la semana",
x = "Día semana",
y = "Puntos")

# Crear un boxplot de $ para cada dia de la semana
ggplot(Analisis_Transporte, aes(x = Dia_mes, y = `Flete Normal`)) +
geom_boxplot() +
labs(title = "Boxplot de $ para cada día del mes",
x = "Día mes",
y = "Puntos")

# Crear un boxplot de $ para cada clase de transporte
ggplot(Analisis_Transporte, aes(x = `Clase transporte`, y = `Flete Normal`)) +
geom_boxplot() +
labs(title = "Boxplot de $ para cada clase de transporte",
x = "Día semana",
y = "Puntos")

# Crear un boxplot de $ para cada Ruta agrupada
ggplot(Analisis_Transporte, aes(x = `Ruta Agrupada`, y = `Flete Normal`)) +
geom_boxplot() +
labs(title = "Boxplot de $ para cada ruta agrupada",
x = "Día mes",
y = "Puntos")

# Crear un boxplot de TM para cada clase de transporte
ggplot(Analisis_Transporte, aes(x = `Clase transporte`, y = `Peso TN`)) +
geom_boxplot() +
labs(title = "Boxplot de $ para cada clase de transporte",
x = "Día semana",
y = "Puntos")

# Crear un boxplot de TM para cada ruta agrupada
ggplot(Analisis_Transporte, aes(x = `Ruta Agrupada`, y = `Peso TN`)) +
geom_boxplot() +
labs(title = "Boxplot de $ para cada ruta agrupada",
x = "Día mes",
y = "Puntos")

# Crear un boxplot para cada dia de la smeanan ($)
ggplot(Analisis_Transporte, aes(x = Analisis_Transporte$`Familia Prod`, y = Analisis_Transporte$`Flete Normal`)) +
geom_boxplot() +
labs(title = "Boxplot de $ para cada día de la semana",
x = "Familia",
y = "$")+
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Crear un boxplot para cada dia de la smeanan (TM)
ggplot(Analisis_Transporte, aes(x = `Familia Prod`, y = `Peso TN`)) +
geom_boxplot() +
labs(title = "Boxplot de TM para cada día de la semana",
x = "Familia",
y = "TM") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Crear un boxplot para cada tipo de proveedor ($)
ggplot(Analisis_Transporte, aes(x = Analisis_Transporte$`Tipo de Proveedor`, y = Analisis_Transporte$`Flete Normal`)) +
geom_boxplot() +
labs(title = "Boxplot de $ para cada tipo de proveedor",
x = "Tipo de proveedor",
y = "$")+
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Crear un boxplot para cada tipo de proveedor (TM)
ggplot(Analisis_Transporte, aes(x = Analisis_Transporte$`Tipo de Proveedor`, y = Analisis_Transporte$`Peso TN`)) +
geom_boxplot() +
labs(title = "Boxplot de TM para cada tipo de proveedor",
x = "Tipo proveedor",
y = "TM")+
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Convertir la columna "Fecha" a tipo fecha
Analisis_Transporte$`Fecha Despacho` <- as.Date(Analisis_Transporte$`Fecha Despacho`, format = "%Y-%m-%d")
library(ggplot2)
library(gridExtra)
# Crear el gráfico
plot <- ggplot(Analisis_Transporte, aes(x = `Fecha Despacho`)) +
geom_line(aes(y = Analisis_Transporte$`Peso TN`), color = "blue", linetype = "solid", size = 0.7) +
geom_line(aes(y = Analisis_Transporte$`Flete Normal`), color = "red", linetype = "dashed", size = 0.7) +
labs(title = "Gráfico de líneas de A y B a lo largo del tiempo",
x = "Fecha",
y = "Valores") +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5), # Centrar el título
plot.margin = margin(20, 50, 20, 50), # Ajustar márgenes
plot.background = element_rect(fill = "white"), # Color de fondo del gráfico
panel.background = element_rect(fill = "white") # Color de fondo del panel
) +
scale_x_date(date_breaks = "1 month", date_labels = "%b %Y") +
scale_y_continuous(limits = c(0, max(c(max(Analisis_Transporte$`Peso TN`), max(Analisis_Transporte$`Flete Normal`))) * 1.1, na.rm = TRUE))
# Ajustar la altura y el ancho antes de guardar
ggsave("ruta/donde/guardar/plot.png", plot, width = 25, height = 10)
plot

library(ggplot2)
library(gridExtra)
# Obtener los límites del eje y basados en los datos presentes
y_limits <- c(0, max(Analisis_Transporte$`Peso TN`, na.rm = TRUE) * 1.1)
# Crear el gráfico
plot <- ggplot(Analisis_Transporte, aes(x = `Fecha Despacho`)) +
geom_line(aes(y = `Peso TN`), color = "blue", linetype = "solid", size = 0.7) +
labs(title = "Gráfico de líneas de A y B a lo largo del tiempo",
x = "Fecha",
y = "Valores") +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5), # Centrar el título
plot.background = element_rect(fill = "white"), # Color de fondo del gráfico
panel.background = element_rect(fill = "white") # Color de fondo del panel
) +
scale_x_date(date_breaks = "3 months", date_labels = "%b %Y") + # Intervalo de 3 meses para las etiquetas de fecha
scale_y_continuous(limits = y_limits)
# Ajustar la altura y el ancho antes de guardar
ggsave("ruta/donde/guardar/plot.png", plot, width = 30, height = 20)
plot

# Estandarización TM
TM_std <- c()
for (i in 1:nrow(Analisis_Transporte)){
TM_std[i] <- (Analisis_Transporte$`Peso TN`[i] - mean(Analisis_Transporte$`Peso TN`)) / sd(Analisis_Transporte$`Peso TN`)
}
linear_model <- lm(Analisis_Transporte$`Flete Normal` ~ Analisis_Transporte$`Clase transporte`+Analisis_Transporte$`Familia Prod`+Analisis_Transporte$`Ruta Agrupada` +TM_std + Analisis_Transporte$`Clase transporte`*TM_std + TM_std*Analisis_Transporte$`Ruta Agrupada`)
summary(linear_model)
Call:
lm(formula = Analisis_Transporte$`Flete Normal` ~ Analisis_Transporte$`Clase transporte` +
Analisis_Transporte$`Familia Prod` + Analisis_Transporte$`Ruta Agrupada` +
TM_std + Analisis_Transporte$`Clase transporte` * TM_std +
TM_std * Analisis_Transporte$`Ruta Agrupada`)
Residuals:
Min 1Q Median 3Q Max
-3798.5 -31.7 -13.2 4.7 5653.4
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.274e+02 1.461e+01 8.719 < 2e-16 ***
Analisis_Transporte$`Clase transporte`Z003 1.060e+02 1.488e+02 0.712 0.476330
Analisis_Transporte$`Clase transporte`Z004 1.570e+04 7.050e+02 22.268 < 2e-16 ***
Analisis_Transporte$`Clase transporte`Z007 1.468e+02 2.827e+01 5.194 2.11e-07 ***
Analisis_Transporte$`Familia Prod`Abrasivos sólidos -5.493e-01 1.929e+01 -0.028 0.977286
Analisis_Transporte$`Familia Prod`Alambrón de trefilería -9.220e+01 1.256e+02 -0.734 0.462793
Analisis_Transporte$`Familia Prod`Barras de Constr. 3.190e+01 1.614e+01 1.977 0.048131 *
Analisis_Transporte$`Familia Prod`Calaminas 6.532e-02 1.662e+01 0.004 0.996864
Analisis_Transporte$`Familia Prod`Clavos y Alambres 1.834e+01 1.440e+01 1.273 0.202902
Analisis_Transporte$`Familia Prod`Herramientas -9.225e-01 1.680e+01 -0.055 0.956206
Analisis_Transporte$`Familia Prod`Mallas 2.271e+02 6.341e+01 3.582 0.000343 ***
Analisis_Transporte$`Familia Prod`Otros productos -1.836e+02 7.784e+01 -2.359 0.018365 *
Analisis_Transporte$`Familia Prod`Perfiles hasta 4" 2.926e+01 1.425e+01 2.054 0.040012 *
Analisis_Transporte$`Familia Prod`Perfiles may. 4" -1.082e+00 2.582e+01 -0.042 0.966573
Analisis_Transporte$`Familia Prod`Perno de fortificación 1.118e+00 2.261e+01 0.049 0.960561
Analisis_Transporte$`Familia Prod`Perno Splitbolt -2.864e+01 7.975e+01 -0.359 0.719500
Analisis_Transporte$`Familia Prod`Planos 3.467e+01 1.463e+01 2.370 0.017797 *
Analisis_Transporte$`Familia Prod`Planos estructurales 8.005e+01 1.770e+02 0.452 0.651114
Analisis_Transporte$`Familia Prod`Soldaduras 4.297e+00 3.043e+01 0.141 0.887702
Analisis_Transporte$`Familia Prod`Tubos 4.241e+01 1.384e+01 3.063 0.002196 **
Analisis_Transporte$`Familia Prod`Tubos Iso -6.757e+01 1.024e+02 -0.660 0.509396
Analisis_Transporte$`Familia Prod`Vigas 3.978e+01 1.755e+02 0.227 0.820646
Analisis_Transporte$`Ruta Agrupada`Lima - Lurin 9.018e+01 3.857e+01 2.338 0.019401 *
Analisis_Transporte$`Ruta Agrupada`Lima - Pisco -6.026e+00 2.792e+01 -0.216 0.829112
Analisis_Transporte$`Ruta Agrupada`Lima - Piura 6.002e+02 4.239e+01 14.158 < 2e-16 ***
Analisis_Transporte$`Ruta Agrupada`Lima - Trujillo 2.648e+02 4.536e+01 5.837 5.53e-09 ***
Analisis_Transporte$`Ruta Agrupada`Lima – Lima Mina -1.787e+02 7.121e+01 -2.510 0.012094 *
TM_std 2.469e+02 9.383e+00 26.317 < 2e-16 ***
Analisis_Transporte$`Clase transporte`Z003:TM_std 5.190e+01 1.814e+02 0.286 0.774805
Analisis_Transporte$`Clase transporte`Z004:TM_std -8.476e+03 3.441e+02 -24.629 < 2e-16 ***
Analisis_Transporte$`Clase transporte`Z007:TM_std -7.924e+01 1.657e+01 -4.783 1.76e-06 ***
Analisis_Transporte$`Ruta Agrupada`Lima - Lurin:TM_std 1.211e+01 1.783e+01 0.679 0.497268
Analisis_Transporte$`Ruta Agrupada`Lima - Pisco:TM_std 2.901e+02 1.442e+01 20.111 < 2e-16 ***
Analisis_Transporte$`Ruta Agrupada`Lima - Piura:TM_std 1.329e+03 1.995e+01 66.636 < 2e-16 ***
Analisis_Transporte$`Ruta Agrupada`Lima - Trujillo:TM_std 7.205e+02 2.087e+01 34.520 < 2e-16 ***
Analisis_Transporte$`Ruta Agrupada`Lima – Lima Mina:TM_std -1.480e+02 3.598e+01 -4.114 3.94e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 174.9 on 7893 degrees of freedom
Multiple R-squared: 0.9146, Adjusted R-squared: 0.9142
F-statistic: 2415 on 35 and 7893 DF, p-value: < 2.2e-16
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KHBzeSkNCmxpYnJhcnkocHN5Y2gpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KDQojIEZpbHRyYXIgZWwgY29uanVudG8gZGUgZGF0b3MgcGFyYSBxdWl0YXIgZWwgdmFsb3IgIkZVRVJBIExJTUEiIGVuIGxhIGNvbHVtbmEgIlJ1dGEgQWdydXBhZGEiDQpBbmFsaXNpc19UcmFuc3BvcnRlX2ZpbHRyYWRvIDwtIEFuYWxpc2lzX1RyYW5zcG9ydGUgJT4lDQogIGZpbHRlcihgUnV0YSBBZ3J1cGFkYWAgIT0gIkZ1ZXJhIGRlIExpbWEiKQ0KYGBgDQoNCg0KYGBge3J9DQojIFJlZG9uZGVhciBlbCBjYW1wbyAiRmxldGUgbm9ybWFsIiBhIDAgZGVjaW1hbGVzDQpBbmFsaXNpc19UcmFuc3BvcnRlJGBGbGV0ZSBOb3JtYWxgIDwtIHJvdW5kKEFuYWxpc2lzX1RyYW5zcG9ydGUkYEZsZXRlIE5vcm1hbGAsIDApDQpgYGANCg0KDQpgYGB7cn0NCnN1bW1hcnkoQW5hbGlzaXNfVHJhbnNwb3J0ZSRgRmxldGUgTm9ybWFsYCkNCmBgYA0KDQpgYGB7cn0NCiMgQ29udmVydGlyIERpYV9tZXMgYSBmYWN0b3IgY29uIG5pdmVsZXMgb3JkZW5hZG9zDQpBbmFsaXNpc19UcmFuc3BvcnRlJERpYV9tZXMgPC0gZmFjdG9yKEFuYWxpc2lzX1RyYW5zcG9ydGUkRGlhX21lcywgbGV2ZWxzID0gMTozMCkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBMaXN0YSBkZSB2YXJpYWJsZXMgcGFyYSBjYWxjdWxhciBlc3RhZMOtc3RpY2FzDQp2YXJpYWJsZXMgPC0gYygiVGlwbyBkZSBDYW1pw7NuIiwgIkNsYXNlIGRlIGVudHJlZ2EiLCAiQ2xhc2UgdHJhbnNwb3J0ZSIsICJUaXBvIFZlbnRhIiwgIkRpYV9tZXMiLCAiRGlhX3NlbWFuYSIsICJUaXBvIGRlIFByb3ZlZWRvciIsICJGYW1pbGlhIFByb2QiLCAiUnV0YSBBZ3J1cGFkYSIpICANCg0KIyBDYWxjdWxhciBwcm9tZWRpbywgbcOheGltbyB5IG3DrW5pbW8gZGVsIGNvc3RvIHBhcmEgY2FkYSB2YXJpYWJsZQ0Kc3RhdHNfbGlzdCA8LSBsYXBwbHkodmFyaWFibGVzLCBmdW5jdGlvbih2YXIpIHsNCiAgYWdncmVnYXRlKEFuYWxpc2lzX1RyYW5zcG9ydGUkYEZsZXRlIE5vcm1hbGAgfiAuLCBkYXRhID0gQW5hbGlzaXNfVHJhbnNwb3J0ZVssIGModmFyLCAiRmxldGUgTm9ybWFsIildLCBGVU4gPSBmdW5jdGlvbih4KSBjKHByb21lZGlvID0gcm91bmQobWVhbih4KSwgMCksIG1heGltbyA9IHJvdW5kKG1heCh4KSwgMCksIG1pbmltbyA9IHJvdW5kKG1pbih4KSwgMCksIHF1YXJ0aWxfMjUgPSByb3VuZChxdWFudGlsZSh4LCAwLjI1KSwgMCksIHF1YXJ0aWxfNzUgPSByb3VuZChxdWFudGlsZSh4LCAwLjc1KSwgMCkpKQ0KfSkNCg0KIyBNb3N0cmFyIGxvcyByZXN1bHRhZG9zDQpuYW1lcyhzdGF0c19saXN0KSA8LSB2YXJpYWJsZXMNCnByaW50KHN0YXRzX2xpc3QpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KQW5hbGlzaXNfVHJhbnNwb3J0ZSRgRmxldGUgTm9ybWFsYCA8LSBhcy5udW1lcmljKEFuYWxpc2lzX1RyYW5zcG9ydGUkYEZsZXRlIE5vcm1hbGApDQpoaXN0KEFuYWxpc2lzX1RyYW5zcG9ydGUkYEZsZXRlIE5vcm1hbGApDQpib3hwbG90KEFuYWxpc2lzX1RyYW5zcG9ydGUkYEZsZXRlIE5vcm1hbGApDQpzdW1tYXJ5KEFuYWxpc2lzX1RyYW5zcG9ydGUkYEZsZXRlIE5vcm1hbGApDQpzZChBbmFsaXNpc19UcmFuc3BvcnRlJGBGbGV0ZSBOb3JtYWxgKQ0KDQojU2UgdmUgcXVlIHRpZW5lIHVuYSBkaXN0cmlidWNpb24gZXhwb25lbmNpYWwsIG5vIHNlIGVsaW1pbmFuIG91dGxpZXJzDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCkFuYWxpc2lzX1RyYW5zcG9ydGUkRGlhX21lcyA8LSBhcy5mYWN0b3IoQW5hbGlzaXNfVHJhbnNwb3J0ZSREaWFfbWVzKQ0KDQojIENyZWFyIHVuIGJveHBsb3QgZGUgVE0gcGFyYSBjYWRhIGTDrWEgZGUgbGEgc2VtYW5hDQpnZ3Bsb3QoQW5hbGlzaXNfVHJhbnNwb3J0ZSwgYWVzKHggPSBEaWFfc2VtYW5hLCB5ID0gYFBlc28gVE5gKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSBUTSBwYXJhIGNhZGEgZMOtYSIsDQogICAgICAgeCA9ICJEw61hIHNlbWFuYSIsDQogICAgICAgeSA9ICJUTSIpDQoNCiMgQ3JlYXIgdW4gYm94cGxvdCBkZSBUTSBwYXJhIGNhZGEgZMOtYSBkZWwgbWVzDQpnZ3Bsb3QoQW5hbGlzaXNfVHJhbnNwb3J0ZSwgYWVzKHggPSBEaWFfbWVzLCB5ID0gYFBlc28gVE5gKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSBUTSBwYXJhIGNhZGEgZMOtYSIsDQogICAgICAgeCA9ICJEw61hIG1lcyIsDQogICAgICAgeSA9ICJUTSIpDQoNCg0KIyBDcmVhciB1biBib3hwbG90IGRlICQgcGFyYSBjYWRhIGRpYSBkZSBsYSBzZW1hbmEgDQpnZ3Bsb3QoQW5hbGlzaXNfVHJhbnNwb3J0ZSwgYWVzKHggPSBEaWFfc2VtYW5hLCB5ID0gYEZsZXRlIE5vcm1hbGApKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlICQgcGFyYSBjYWRhIGTDrWEgZGUgbGEgc2VtYW5hIiwNCiAgICAgICB4ID0gIkTDrWEgc2VtYW5hIiwNCiAgICAgICB5ID0gIlB1bnRvcyIpDQoNCiMgQ3JlYXIgdW4gYm94cGxvdCBkZSAkIHBhcmEgY2FkYSBkaWEgZGUgbGEgc2VtYW5hDQpnZ3Bsb3QoQW5hbGlzaXNfVHJhbnNwb3J0ZSwgYWVzKHggPSBEaWFfbWVzLCB5ID0gYEZsZXRlIE5vcm1hbGApKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlICQgcGFyYSBjYWRhIGTDrWEgZGVsIG1lcyIsDQogICAgICAgeCA9ICJEw61hIG1lcyIsDQogICAgICAgeSA9ICJQdW50b3MiKQ0KDQojIENyZWFyIHVuIGJveHBsb3QgZGUgJCBwYXJhIGNhZGEgY2xhc2UgZGUgdHJhbnNwb3J0ZSANCmdncGxvdChBbmFsaXNpc19UcmFuc3BvcnRlLCBhZXMoeCA9IGBDbGFzZSB0cmFuc3BvcnRlYCwgeSA9IGBGbGV0ZSBOb3JtYWxgKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSAkIHBhcmEgY2FkYSBjbGFzZSBkZSB0cmFuc3BvcnRlIiwNCiAgICAgICB4ID0gIkTDrWEgc2VtYW5hIiwNCiAgICAgICB5ID0gIlB1bnRvcyIpDQoNCiMgQ3JlYXIgdW4gYm94cGxvdCBkZSAkIHBhcmEgY2FkYSBSdXRhIGFncnVwYWRhDQpnZ3Bsb3QoQW5hbGlzaXNfVHJhbnNwb3J0ZSwgYWVzKHggPSBgUnV0YSBBZ3J1cGFkYWAsIHkgPSBgRmxldGUgTm9ybWFsYCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3QgZGUgJCBwYXJhIGNhZGEgcnV0YSBhZ3J1cGFkYSIsDQogICAgICAgeCA9ICJEw61hIG1lcyIsDQogICAgICAgeSA9ICJQdW50b3MiKQ0KDQojIENyZWFyIHVuIGJveHBsb3QgZGUgVE0gcGFyYSBjYWRhIGNsYXNlIGRlIHRyYW5zcG9ydGUgDQpnZ3Bsb3QoQW5hbGlzaXNfVHJhbnNwb3J0ZSwgYWVzKHggPSBgQ2xhc2UgdHJhbnNwb3J0ZWAsIHkgPSBgUGVzbyBUTmApKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlICQgcGFyYSBjYWRhIGNsYXNlIGRlIHRyYW5zcG9ydGUiLA0KICAgICAgIHggPSAiRMOtYSBzZW1hbmEiLA0KICAgICAgIHkgPSAiUHVudG9zIikNCg0KIyBDcmVhciB1biBib3hwbG90IGRlIFRNIHBhcmEgY2FkYSBydXRhIGFncnVwYWRhDQpnZ3Bsb3QoQW5hbGlzaXNfVHJhbnNwb3J0ZSwgYWVzKHggPSBgUnV0YSBBZ3J1cGFkYWAsIHkgPSBgUGVzbyBUTmApKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlICQgcGFyYSBjYWRhIHJ1dGEgYWdydXBhZGEiLA0KICAgICAgIHggPSAiRMOtYSBtZXMiLA0KICAgICAgIHkgPSAiUHVudG9zIikNCmBgYA0KDQpgYGB7cn0NCiMgQ3JlYXIgdW4gYm94cGxvdCBwYXJhIGNhZGEgZGlhIGRlIGxhIHNtZWFuYW4gKCQpDQpnZ3Bsb3QoQW5hbGlzaXNfVHJhbnNwb3J0ZSwgYWVzKHggPSBBbmFsaXNpc19UcmFuc3BvcnRlJGBGYW1pbGlhIFByb2RgLCB5ID0gQW5hbGlzaXNfVHJhbnNwb3J0ZSRgRmxldGUgTm9ybWFsYCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3QgZGUgJCBwYXJhIGNhZGEgZMOtYSBkZSBsYSBzZW1hbmEiLA0KICAgICAgIHggPSAiRmFtaWxpYSIsDQogICAgICAgeSA9ICIkIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQoNCiMgQ3JlYXIgdW4gYm94cGxvdCBwYXJhIGNhZGEgZGlhIGRlIGxhIHNtZWFuYW4gKFRNKQ0KZ2dwbG90KEFuYWxpc2lzX1RyYW5zcG9ydGUsIGFlcyh4ID0gYEZhbWlsaWEgUHJvZGAsIHkgPSBgUGVzbyBUTmApKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlIFRNIHBhcmEgY2FkYSBkw61hIGRlIGxhIHNlbWFuYSIsDQogICAgICAgeCA9ICJGYW1pbGlhIiwNCiAgICAgICB5ID0gIlRNIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCg0KYGBge3J9DQojIENyZWFyIHVuIGJveHBsb3QgcGFyYSBjYWRhIHRpcG8gZGUgcHJvdmVlZG9yICgkKQ0KZ2dwbG90KEFuYWxpc2lzX1RyYW5zcG9ydGUsIGFlcyh4ID0gQW5hbGlzaXNfVHJhbnNwb3J0ZSRgVGlwbyBkZSBQcm92ZWVkb3JgLCB5ID0gQW5hbGlzaXNfVHJhbnNwb3J0ZSRgRmxldGUgTm9ybWFsYCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3QgZGUgJCBwYXJhIGNhZGEgdGlwbyBkZSBwcm92ZWVkb3IiLA0KICAgICAgIHggPSAiVGlwbyBkZSBwcm92ZWVkb3IiLA0KICAgICAgIHkgPSAiJCIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQojIENyZWFyIHVuIGJveHBsb3QgcGFyYSBjYWRhIHRpcG8gZGUgcHJvdmVlZG9yIChUTSkNCmdncGxvdChBbmFsaXNpc19UcmFuc3BvcnRlLCBhZXMoeCA9IEFuYWxpc2lzX1RyYW5zcG9ydGUkYFRpcG8gZGUgUHJvdmVlZG9yYCwgeSA9IEFuYWxpc2lzX1RyYW5zcG9ydGUkYFBlc28gVE5gKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSBUTSBwYXJhIGNhZGEgdGlwbyBkZSBwcm92ZWVkb3IiLA0KICAgICAgIHggPSAiVGlwbyBwcm92ZWVkb3IiLA0KICAgICAgIHkgPSAiVE0iKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQoNCg0KDQoNCmBgYHtyfQ0KIyBDb252ZXJ0aXIgbGEgY29sdW1uYSAiRmVjaGEiIGEgdGlwbyBmZWNoYQ0KQW5hbGlzaXNfVHJhbnNwb3J0ZSRgRmVjaGEgRGVzcGFjaG9gIDwtIGFzLkRhdGUoQW5hbGlzaXNfVHJhbnNwb3J0ZSRgRmVjaGEgRGVzcGFjaG9gLCBmb3JtYXQgPSAiJVktJW0tJWQiKQ0KDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCg0KIyBDcmVhciBlbCBncsOhZmljbw0KcGxvdCA8LSBnZ3Bsb3QoQW5hbGlzaXNfVHJhbnNwb3J0ZSwgYWVzKHggPSBgRmVjaGEgRGVzcGFjaG9gKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBBbmFsaXNpc19UcmFuc3BvcnRlJGBQZXNvIFROYCksIGNvbG9yID0gImJsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIsIHNpemUgPSAwLjcpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQW5hbGlzaXNfVHJhbnNwb3J0ZSRgRmxldGUgTm9ybWFsYCksIGNvbG9yID0gInJlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAwLjcpICsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyBkZSBsw61uZWFzIGRlIEEgeSBCIGEgbG8gbGFyZ28gZGVsIHRpZW1wbyIsDQogICAgICAgeCA9ICJGZWNoYSIsDQogICAgICAgeSA9ICJWYWxvcmVzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCAgIyBDZW50cmFyIGVsIHTDrXR1bG8NCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigyMCwgNTAsIDIwLCA1MCksICAjIEFqdXN0YXIgbcOhcmdlbmVzDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwgICMgQ29sb3IgZGUgZm9uZG8gZGVsIGdyw6FmaWNvDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIikgICMgQ29sb3IgZGUgZm9uZG8gZGVsIHBhbmVsDQogICkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViICVZIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCBtYXgoYyhtYXgoQW5hbGlzaXNfVHJhbnNwb3J0ZSRgUGVzbyBUTmApLCBtYXgoQW5hbGlzaXNfVHJhbnNwb3J0ZSRgRmxldGUgTm9ybWFsYCkpKSAqIDEuMSwgbmEucm0gPSBUUlVFKSkNCg0KIyBBanVzdGFyIGxhIGFsdHVyYSB5IGVsIGFuY2hvIGFudGVzIGRlIGd1YXJkYXINCmdnc2F2ZSgicnV0YS9kb25kZS9ndWFyZGFyL3Bsb3QucG5nIiwgcGxvdCwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTApDQoNCnBsb3QNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KDQojIE9idGVuZXIgbG9zIGzDrW1pdGVzIGRlbCBlamUgeSBiYXNhZG9zIGVuIGxvcyBkYXRvcyBwcmVzZW50ZXMNCnlfbGltaXRzIDwtIGMoMCwgbWF4KEFuYWxpc2lzX1RyYW5zcG9ydGUkYFBlc28gVE5gLCBuYS5ybSA9IFRSVUUpICogMS4xKQ0KDQojIENyZWFyIGVsIGdyw6FmaWNvDQpwbG90IDwtIGdncGxvdChBbmFsaXNpc19UcmFuc3BvcnRlLCBhZXMoeCA9IGBGZWNoYSBEZXNwYWNob2ApKSArDQogIGdlb21fbGluZShhZXMoeSA9IGBQZXNvIFROYCksIGNvbG9yID0gImJsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIsIHNpemUgPSAwLjcpICsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyBkZSBsw61uZWFzIGRlIEEgeSBCIGEgbG8gbGFyZ28gZGVsIHRpZW1wbyIsDQogICAgICAgeCA9ICJGZWNoYSIsDQogICAgICAgeSA9ICJWYWxvcmVzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCAgIyBDZW50cmFyIGVsIHTDrXR1bG8NCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLCAgIyBDb2xvciBkZSBmb25kbyBkZWwgZ3LDoWZpY28NCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSAgIyBDb2xvciBkZSBmb25kbyBkZWwgcGFuZWwNCiAgKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIzIG1vbnRocyIsIGRhdGVfbGFiZWxzID0gIiViICVZIikgKyAgIyBJbnRlcnZhbG8gZGUgMyBtZXNlcyBwYXJhIGxhcyBldGlxdWV0YXMgZGUgZmVjaGENCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IHlfbGltaXRzKQ0KDQojIEFqdXN0YXIgbGEgYWx0dXJhIHkgZWwgYW5jaG8gYW50ZXMgZGUgZ3VhcmRhcg0KZ2dzYXZlKCJydXRhL2RvbmRlL2d1YXJkYXIvcGxvdC5wbmciLCBwbG90LCB3aWR0aCA9IDMwLCBoZWlnaHQgPSAyMCkNCg0KDQpwbG90DQpgYGANCg0KYGBge3J9DQojIEVzdGFuZGFyaXphY2nDs24gVE0NClRNX3N0ZCA8LSBjKCkNCmZvciAoaSBpbiAxOm5yb3coQW5hbGlzaXNfVHJhbnNwb3J0ZSkpew0KICBUTV9zdGRbaV0gPC0gKEFuYWxpc2lzX1RyYW5zcG9ydGUkYFBlc28gVE5gW2ldIC0gbWVhbihBbmFsaXNpc19UcmFuc3BvcnRlJGBQZXNvIFROYCkpIC8gc2QoQW5hbGlzaXNfVHJhbnNwb3J0ZSRgUGVzbyBUTmApDQp9DQpgYGANCg0KDQpgYGB7cn0NCmxpbmVhcl9tb2RlbCA8LSBsbShBbmFsaXNpc19UcmFuc3BvcnRlJGBGbGV0ZSBOb3JtYWxgIH4gQW5hbGlzaXNfVHJhbnNwb3J0ZSRgQ2xhc2UgdHJhbnNwb3J0ZWArQW5hbGlzaXNfVHJhbnNwb3J0ZSRgRmFtaWxpYSBQcm9kYCtBbmFsaXNpc19UcmFuc3BvcnRlJGBSdXRhIEFncnVwYWRhYCArVE1fc3RkICsgQW5hbGlzaXNfVHJhbnNwb3J0ZSRgQ2xhc2UgdHJhbnNwb3J0ZWAqVE1fc3RkICsgVE1fc3RkKkFuYWxpc2lzX1RyYW5zcG9ydGUkYFJ1dGEgQWdydXBhZGFgKQ0Kc3VtbWFyeShsaW5lYXJfbW9kZWwpDQpgYGANCg0K