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