Propósito

Aplicar las técnicas de análisis estadísticos descriptivos y estimadores, empleando los gráficos necesarios destacar la información de interés sobre un conjunto de datos y sobre las relaciones que guardan entre sí, con la ayuda de software estadístico.


library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)
library(ggplot2)
turismo <- read.csv("/Users/araquezada/Documents/Tec/7mo Semestre/Analítica para Negocios/Modulo 3/Base de Datos Turismo Responsable 2.csv")
summary(turismo)
##   StartDate           EndDate              Status   IPAddress        
##  Length:935         Length:935         Min.   :0   Length:935        
##  Class :character   Class :character   1st Qu.:0   Class :character  
##  Mode  :character   Mode  :character   Median :0   Mode  :character  
##                                        Mean   :0                     
##                                        3rd Qu.:0                     
##                                        Max.   :0                     
##                                                                      
##     Progress      Duration..in.seconds.    Finished      RecordedDate      
##  Min.   : 50.00   Min.   :    59.0      Min.   :0.0000   Length:935        
##  1st Qu.:100.00   1st Qu.:   183.0      1st Qu.:1.0000   Class :character  
##  Median :100.00   Median :   309.0      Median :1.0000   Mode  :character  
##  Mean   : 94.17   Mean   :  2920.7      Mean   :0.8834                     
##  3rd Qu.:100.00   3rd Qu.:   507.5      3rd Qu.:1.0000                     
##  Max.   :100.00   Max.   :500660.0      Max.   :1.0000                     
##                                                                            
##   ResponseId        RecipientLastName RecipientFirstName RecipientEmail
##  Length:935         Mode:logical      Mode:logical       Mode:logical  
##  Class :character   NA's:935          NA's:935           NA's:935      
##  Mode  :character                                                      
##                                                                        
##                                                                        
##                                                                        
##                                                                        
##  ExternalReference LocationLatitude LocationLongitude  DistributionChannel
##  Mode:logical      Min.   :17.99    Min.   :-122.399   Length:935         
##  NA's:935          1st Qu.:25.64    1st Qu.:-100.311   Class :character   
##                    Median :25.74    Median :-100.260   Mode  :character   
##                    Mean   :31.07    Mean   : -61.751                      
##                    3rd Qu.:41.66    3rd Qu.:  -2.253                      
##                    Max.   :47.21    Max.   :  15.560                      
##                    NA's   :109      NA's   :109                           
##  UserLanguage             Q2            Q3_1            Q3_2      
##  Length:935         Min.   :1.00   Min.   :1.000   Min.   :1.000  
##  Class :character   1st Qu.:1.00   1st Qu.:1.000   1st Qu.:1.000  
##  Mode  :character   Median :1.00   Median :1.000   Median :2.000  
##                     Mean   :1.38   Mean   :1.645   Mean   :2.046  
##                     3rd Qu.:2.00   3rd Qu.:2.000   3rd Qu.:3.000  
##                     Max.   :2.00   Max.   :3.000   Max.   :3.000  
##                                    NA's   :79      NA's   :79     
##       Q3_3           Q4_1          Q4_2          Q4_3          Q4_4    
##  Min.   :1.00   Min.   :1     Min.   :1     Min.   :1     Min.   :1    
##  1st Qu.:2.00   1st Qu.:1     1st Qu.:1     1st Qu.:1     1st Qu.:1    
##  Median :2.00   Median :1     Median :1     Median :1     Median :1    
##  Mean   :2.31   Mean   :1     Mean   :1     Mean   :1     Mean   :1    
##  3rd Qu.:3.00   3rd Qu.:1     3rd Qu.:1     3rd Qu.:1     3rd Qu.:1    
##  Max.   :3.00   Max.   :1     Max.   :1     Max.   :1     Max.   :1    
##  NA's   :79     NA's   :115   NA's   :233   NA's   :398   NA's   :561  
##       Q4_5          Q4_6          Q4_7          Q4_8          Q4_9    
##  Min.   :1     Min.   :1     Min.   :1     Min.   :1     Min.   :1    
##  1st Qu.:1     1st Qu.:1     1st Qu.:1     1st Qu.:1     1st Qu.:1    
##  Median :1     Median :1     Median :1     Median :1     Median :1    
##  Mean   :1     Mean   :1     Mean   :1     Mean   :1     Mean   :1    
##  3rd Qu.:1     3rd Qu.:1     3rd Qu.:1     3rd Qu.:1     3rd Qu.:1    
##  Max.   :1     Max.   :1     Max.   :1     Max.   :1     Max.   :1    
##  NA's   :562   NA's   :433   NA's   :328   NA's   :454   NA's   :501  
##      Q4_10         Q4_11         Q4_12          Q6_1            Q6_2      
##  Min.   :1     Min.   :1     Min.   :1     Min.   :1.000   Min.   :1.000  
##  1st Qu.:1     1st Qu.:1     1st Qu.:1     1st Qu.:4.000   1st Qu.:4.000  
##  Median :1     Median :1     Median :1     Median :5.000   Median :6.000  
##  Mean   :1     Mean   :1     Mean   :1     Mean   :5.039   Mean   :5.352  
##  3rd Qu.:1     3rd Qu.:1     3rd Qu.:1     3rd Qu.:6.000   3rd Qu.:7.000  
##  Max.   :1     Max.   :1     Max.   :1     Max.   :7.000   Max.   :7.000  
##  NA's   :445   NA's   :697   NA's   :393                                  
##       Q6_3            Q6_4            Q6_5            Q6_6      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000   1st Qu.:5.000  
##  Median :6.000   Median :5.000   Median :6.000   Median :6.000  
##  Mean   :5.361   Mean   :4.994   Mean   :5.471   Mean   :5.548  
##  3rd Qu.:7.000   3rd Qu.:6.000   3rd Qu.:7.000   3rd Qu.:7.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##       Q6_7            Q6_8           Q6_9           Q6_10           Q6_11      
##  Min.   :1.000   Min.   :1.00   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:5.00   1st Qu.:3.000   1st Qu.:4.000   1st Qu.:1.000  
##  Median :5.000   Median :7.00   Median :5.000   Median :5.000   Median :2.000  
##  Mean   :4.748   Mean   :5.96   Mean   :4.551   Mean   :4.811   Mean   :2.718  
##  3rd Qu.:6.000   3rd Qu.:7.00   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:4.000  
##  Max.   :7.000   Max.   :7.00   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                                
##      Q6_12           Q6_13           Q6_14           Q6_15      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:3.000   1st Qu.:2.000   1st Qu.:1.000  
##  Median :5.000   Median :4.000   Median :4.000   Median :2.000  
##  Mean   :4.943   Mean   :4.321   Mean   :3.953   Mean   :3.098  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:5.000   3rd Qu.:5.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##                                                                 
##      Q6_16           Q6_17           Q6_18             Q7        
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   : 0.000  
##  1st Qu.:4.000   1st Qu.:3.000   1st Qu.:3.000   1st Qu.: 2.000  
##  Median :6.000   Median :5.000   Median :4.000   Median : 3.000  
##  Mean   :5.332   Mean   :4.645   Mean   :4.102   Mean   : 3.723  
##  3rd Qu.:7.000   3rd Qu.:6.000   3rd Qu.:5.000   3rd Qu.: 4.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :70.000  
##                                                  NA's   :12      
##       Q10              Q9             Q12           Q12_1           Q11       
##  Min.   :1.000   Min.   :1.000   Min.   :16.0   Min.   :1.00   Min.   :1.000  
##  1st Qu.:1.000   1st Qu.:1.000   1st Qu.:21.0   1st Qu.:1.00   1st Qu.:1.000  
##  Median :1.000   Median :2.000   Median :35.0   Median :2.00   Median :2.000  
##  Mean   :1.535   Mean   :1.929   Mean   :39.5   Mean   :2.45   Mean   :1.569  
##  3rd Qu.:1.000   3rd Qu.:3.000   3rd Qu.:55.0   3rd Qu.:3.00   3rd Qu.:2.000  
##  Max.   :4.000   Max.   :3.000   Max.   :92.0   Max.   :5.00   Max.   :2.000  
##  NA's   :13      NA's   :11      NA's   :2                                    
##       Q13          X          
##  Min.   :1.00   Mode:logical  
##  1st Qu.:1.00   NA's:935      
##  Median :1.00                 
##  Mean   :1.43                 
##  3rd Qu.:2.00                 
##  Max.   :2.00                 
##  NA's   :2

Limpieza de Datos

Debido a la gran cantidad de variables que existen, nosotros nos enfocaremos solo en aquellas que están enfocadas a aportar información directamente relacionada con la encuesta, desechando:

“StartDate, EndDate, Status, IPAddress, Progress, Duration, (in seconds), Finished, RecordedDate, ResponseId, RecipientLastName, RecipientFirstName, RecipientEmail, ExternalReference, LocationLatitude, LocationLongitude, DistributionChannel, y UserLanguage”. Las variables usadas serán fácilmente indentificadas debido a que todas empiezan con Q.

str(turismo)
## 'data.frame':    935 obs. of  59 variables:
##  $ StartDate            : chr  "05/03/20 8:54" "05/03/20 9:03" "05/03/20 9:02" "05/03/20 8:55" ...
##  $ EndDate              : chr  "05/03/20 9:01" "05/03/20 9:05" "05/03/20 9:06" "05/03/20 9:10" ...
##  $ Status               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ IPAddress            : chr  "131.178.54.55" "131.178.200.66" "200.95.170.77" "131.178.54.69" ...
##  $ Progress             : int  100 100 100 100 100 100 100 100 100 100 ...
##  $ Duration..in.seconds.: int  477 115 257 916 255 163 500 447 4236 488 ...
##  $ Finished             : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ RecordedDate         : chr  "05/03/20 9:01" "05/03/20 9:05" "05/03/20 9:06" "05/03/20 9:10" ...
##  $ ResponseId           : chr  "R_1HNq2eWcYHIucIF" "R_3GlhbBuuVXrn7Wa" "R_27Nh8d4iF86rUuK" "R_uf5wi6KfNeBnmal" ...
##  $ RecipientLastName    : logi  NA NA NA NA NA NA ...
##  $ RecipientFirstName   : logi  NA NA NA NA NA NA ...
##  $ RecipientEmail       : logi  NA NA NA NA NA NA ...
##  $ ExternalReference    : logi  NA NA NA NA NA NA ...
##  $ LocationLatitude     : num  25.7 25.6 25.7 25.6 25.8 ...
##  $ LocationLongitude    : num  -100 -100 -100 -100 -100 ...
##  $ DistributionChannel  : chr  "anonymous" "anonymous" "anonymous" "anonymous" ...
##  $ UserLanguage         : chr  "EN" "EN" "EN" "EN" ...
##  $ Q2                   : int  1 1 1 1 1 1 2 1 1 2 ...
##  $ Q3_1                 : int  1 1 1 NA 1 1 2 2 2 1 ...
##  $ Q3_2                 : int  2 2 2 NA 3 2 1 3 3 2 ...
##  $ Q3_3                 : int  3 3 3 NA 2 3 3 1 1 3 ...
##  $ Q4_1                 : int  1 1 1 NA 1 1 1 1 NA 1 ...
##  $ Q4_2                 : int  NA 1 1 1 1 1 NA 1 1 1 ...
##  $ Q4_3                 : int  1 1 1 1 1 1 1 1 NA 1 ...
##  $ Q4_4                 : int  NA 1 NA 1 1 1 1 NA NA NA ...
##  $ Q4_5                 : int  NA 1 NA 1 NA NA 1 NA NA NA ...
##  $ Q4_6                 : int  1 1 NA NA 1 1 NA NA NA 1 ...
##  $ Q4_7                 : int  NA 1 1 NA 1 1 1 1 1 1 ...
##  $ Q4_8                 : int  1 1 1 1 NA 1 1 NA NA 1 ...
##  $ Q4_9                 : int  NA 1 NA 1 NA 1 1 NA NA 1 ...
##  $ Q4_10                : int  NA 1 1 NA 1 1 1 1 1 1 ...
##  $ Q4_11                : int  NA 1 1 1 NA NA NA NA NA NA ...
##  $ Q4_12                : int  1 1 1 NA NA 1 1 NA NA NA ...
##  $ Q6_1                 : int  4 7 7 5 7 7 5 5 5 5 ...
##  $ Q6_2                 : int  5 6 5 7 5 7 7 5 5 5 ...
##  $ Q6_3                 : int  7 6 5 6 7 7 7 5 5 6 ...
##  $ Q6_4                 : int  4 5 6 5 5 7 7 5 5 7 ...
##  $ Q6_5                 : int  6 5 7 6 6 7 7 4 4 6 ...
##  $ Q6_6                 : int  7 4 7 5 7 7 5 4 3 7 ...
##  $ Q6_7                 : int  7 6 6 7 7 4 4 2 4 5 ...
##  $ Q6_8                 : int  7 7 7 5 7 7 7 7 4 7 ...
##  $ Q6_9                 : int  5 6 7 6 6 7 3 5 4 4 ...
##  $ Q6_10                : int  6 6 7 5 7 7 3 6 4 2 ...
##  $ Q6_11                : int  4 6 1 5 3 7 1 1 4 1 ...
##  $ Q6_12                : int  4 6 3 5 7 7 7 2 4 6 ...
##  $ Q6_13                : int  5 6 7 6 5 7 3 3 4 2 ...
##  $ Q6_14                : int  4 5 4 6 5 4 1 3 4 3 ...
##  $ Q6_15                : int  5 6 5 3 3 2 1 2 4 1 ...
##  $ Q6_16                : int  7 5 7 7 7 7 4 5 4 4 ...
##  $ Q6_17                : int  3 6 7 4 5 7 4 6 4 4 ...
##  $ Q6_18                : int  4 6 4 6 4 2 1 1 4 3 ...
##  $ Q7                   : int  3 4 3 4 2 4 2 20 0 0 ...
##  $ Q10                  : int  1 4 4 4 1 3 1 3 2 1 ...
##  $ Q9                   : int  2 1 3 1 3 1 3 1 2 2 ...
##  $ Q12                  : int  19 22 21 22 21 56 36 23 21 22 ...
##  $ Q12_1                : int  1 1 1 1 1 4 2 1 1 1 ...
##  $ Q11                  : int  2 1 2 2 2 2 2 2 1 1 ...
##  $ Q13                  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ X                    : logi  NA NA NA NA NA NA ...

Estadística Descriptiva

Gráfica 1 - Cantidad de personas que han escuchado del turismo responsable

En este contexto, la variable “Q2” mide la cantidad de personas que han escuchado del turismo responsable vs. las que no.

turismo <- turismo %>%
  mutate(Q2 = ifelse(Q2 == 1, "Si", Q2))

turismo <- turismo %>%
  mutate(Q2 = ifelse(Q2 == 2, "No", Q2))

ggplot(turismo, aes(x = Q2, fill = Q2)) +
  geom_bar() +
  labs(title = "¿Ha oído hablar del turismo responsable y/o sostenible?",
       x = "Respuestas",
       y = "Frecuencia") +
  scale_fill_manual(values = c("No" = "lightsalmon2", "Si" = "indianred3"))

Como se puede observar en la gráfica, la mayor cantidad de las personas encuestadas sí ha escuchado hablar sobre el turismo responsable y/o sostenible.

Gráfica 2 - Sexo de los participantes

A continuación se muestra la variable “Q2”, la cual engloba los dos sexos de las personas que realizaron la encuesta, ilustrados en distintos colores.

turismo <- turismo %>%
  mutate(Q2 = ifelse(Q2 == 1, "Hombre", Q11))

turismo <- turismo %>%
  mutate(Q2 = ifelse(Q2 == 2, "Mujer", Q11))

ggplot(turismo, aes(x = Q2, fill = Q2)) +
  geom_bar() +
  labs(title = "Sexo de los participantes de la encuesta",
       x = "Respuestas",
       y = "Frecuencia") +
  scale_fill_manual(values = c ("Hombre" = "lightblue1", "Mujer" = "peachpuff2"))

También como se puede observar, la mayor parte de los encuestados son mujeres. También se percibe que en la base de datos algún componente impide que la asignación de “1” a “hombre” sea leída como “hombre”, pues solo se refleja como 1.

Gráfica 3 - Conocimientos de turismo responsable contrastado con sexo de las personas

Para esta gráfica se utiliza la variable “Q11”, que nuevamente hace referencia al sexo de las personas, y “Q2”, que ejemplica el conocimiento sobre el turismo responsable.

ggplot(data = turismo, aes(x = Q12, y = Q2)) +
  geom_boxplot(fill = "firebrick1", color = "black") +
  labs(title = "Comparación de sexo por consciencia de turismo sustentable",
       x = "Si saben de turismo responsable",
       y = "Sexo")
## Warning: Removed 2 rows containing non-finite values (`stat_boxplot()`).

Parece haber una mayor correlación entre mujeres y el conocimiento sobre el turismo responsable, aunque también es posible que esto se encuentre basado en el hecho de que la mayoría de encuestadas fueron mujeres.

Gráfica 4 - Cantidad de personas en el país donde se contestó la encuesta

Para esto se utiliza la variabale “Q3”, que engloba los dos países encuestados, México y España.

turismo <- turismo[!is.na(turismo$Q13), ]
turismo <- turismo %>%
  mutate(Q13 = ifelse(Q13 == 1, "México", Q13))

turismo <- turismo %>%
  mutate(Q13 = ifelse(Q13 == 2, "España", Q13))

ggplot(turismo, aes(x = Q13, fill = Q13)) +
  geom_bar() +
  labs(title = "País en el que realiza la encuesta",
       x = "Respuestas",
       y = "Frecuencia") +
  scale_fill_manual(values = c("México" = "pink", "España" = "cornsilk1"))

Podemos concluir que la mayoría de las personas encuestadas lo fueron en el país de México por una diferencia de poco más de 100 personas.

Gráfica 5 - Viajes en el último año

Para conocer esto se utiliza la variabale “Q7”, la cual contiene la cantidad de viajes al año que proporcionaron los encuestados.

ggplot(data = turismo, aes(x = Q7)) +
  geom_histogram(binwidth = 1, fill = "lightgoldenrod1", color = "black") +
  labs(title = "Distribución de la Cantidad de Viajes en el Último Año",
       x = "Cantidad de Viajes",
       y = "Frecuencia")
## Warning: Removed 12 rows containing non-finite values (`stat_bin()`).

Se puede observar que hay una concentración mucho mayor en la cantidad 3, con las otras dos opciones más prominentes siendo 2 y 4.

Gráfica 6 - Edad

En este histograma se aborda la edad de los encuestados por medio de la variable “Q12”, la cual contiene esta información.

ggplot(data = turismo, aes(x = Q12)) +
  geom_histogram(binwidth = 1, fill = "lavenderblush2", color = "black") +
  labs(title = "Distribución de Edad",
       x = "Edad",
       y = "Frecuencia")
## Warning: Removed 2 rows containing non-finite values (`stat_bin()`).

Podemos concluir que la mayoría de encuestados tiene menos de 25 años, con la mayoría siendo teniendo entre 20, 21, y 22 años.

Gráfica 7 - Edad por país

A continuación se explora la relación entre la edad y los encuestados por país, lo cual se realiza mediante la variaba “Q13”, centrada en la localidad, y “Q12”, centrada en la edad.

ggplot(data = turismo, aes(x = Q13, y = Q12)) +
  geom_boxplot(fill = "paleturquoise1", color = "black") +
  labs(title = "Comparación de Edad por País",
       x = "País",
       y = "Edad")
## Warning: Removed 2 rows containing non-finite values (`stat_boxplot()`).

Podemos concluir que en España los encuestados tienen un rango de 20-52 años de edad y quienes están en México un rango de 20-60 años, siendo probable que personas de mayor edad viajen más a México.

Gráfica 8 - Importancia de la sostenibilidad

A continuación se analiza en una escala del 1 al 7 cuánta importancia le dan a la sostenibilidad, llevado a cabo mediante la variable “Q6_1”, la cual mide esto.

ggplot(data = turismo, aes(x = Q6_1)) +
  geom_histogram(binwidth = 1, fill = "#FFC1C1", color = "violetred4") +
  labs(title = "Importancia de la sostenibilidad",
       x = " 
         En la escala de 1 al 7 soy una persona preocupada por la sostenibilidad económica, sociocultural y medioambiental.",
       y = "Frecuencia")

Podemos observar que la mayor parte de las personas le da importancia a un nivel medio, inclinado hacia el cuartil superior.

Gráfica 9 - Edad vs. esfuerzo en no causar impacto negativo

Esta gráfica de dispersión se centra en la relación entre la edad de las personas (Variable Q12) y la importancia que le dan a no causar un impacto negativo ambiental o social con su presencia (Q6_6).

ggplot(turismo, aes(x = Q12, y = Q6_6)) +
  geom_point(color = "#EED5D2", size = 3, alpha = 0.7) +
  labs(x = "Edad", y = "Mi impacto") +
  ggtitle("Comparación de Edad vs. Mi impacto") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12))
## Warning: Removed 2 rows containing missing values (`geom_point()`).

Podemos observar que la mayoría de las personas, de edad indistinta, se encuentran en los tres niveles superiores de preocupación por evitar el daño. Otro dato interesante podría ser cómo los niveles inferiores de preocupación parecen estar centrados en personas menores de 25 años o entre 50 y 75 años.

Gráfica 10 - Planificación de los viajes

En esta gráfica se muestra por país (Q13), quiénes planifican los viajes que realizan los encuestados (Q9).

ggplot(turismo, aes(x = factor(Q13), fill = factor(Q9))) +
  geom_bar() +
  labs(x = "País", y = "Recuento", fill = "Quién organiza y planifica los viajes") +
  ggtitle("Comparación de País con Organización de Viajes") +
  scale_x_discrete(labels = c("1" = "México", "2" = "España")) +
  scale_fill_manual(values = c("1" = "violet", "2" = "pink", "3" = "beige"),
                    labels = c("1" = "Principalmente yo", "2" = "Principalmente otras personas", "3" = "Tanto yo como otras personas")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12))

Como se puede observar, en los dos países es más presente que las mismas personas lo organicen, en México siendo casi igual la proporción de “tanto yo como otras personas”.

Gráfica 11 - Promedio de viajes

En esta gráfica se observa el promedio de viajes anuales (variable Q7) en relación con los dos países disponibles (Q13).

ggplot(turismo, aes(x = factor(Q13), y = Q7)) +
  geom_bar(stat = "summary", fun = "mean", position = "dodge", fill = c("#EED5D2", "#FFA07A")) +
  labs(x = "País", y = "Promedio de Viaje") +
  ggtitle("Promedio de Viaje Comparado entre Españoles y Mexicanos") +
  scale_x_discrete(labels = c("1" = "México", "2" = "España")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12))
## Warning: Removed 12 rows containing non-finite values (`stat_summary()`).

Se puede observar que el promedio es bastante similar, con México siendo ligeramente superior.

Conclusión del Análisis Descriptivo

Como conclusión general, se puede llegar a lo siguiente: Existen factores que inevitable causarán cierto sesgo en los resultados, como la diferencia entre nacionalidades y sexos encuestados. Sin embargo, hay varios puntos rescatables. La preocupación por el medioambiente parece ser moderada, lo cual tiene sentido en relación a la cantidad de personas que conocen sobre el turismo responsable, que también parece ser moderado en relación con las personas que no, y parece estar inclinado hacia la población femenina. Las personas, sin distinción de edad, parecen preocupadas por su impacto socioambiental. También existe una marcada concentración de encuestados pertenecientes a una población joven y mexicana, los cuales realizan entre 2 y 3 viajes al año. Tomando en cuenta la comparación entre los diversos resultados y el hecho de que la preocupación por la sostenibilidad se encuentra en un término moderado-alto (debido a que la escala era de 7 y la respuesta mayor es 5), se podría especular sobre la posibilidad de que este número aumentase de manera importante si igualmente se incrementara la conciencia sobre el turismo consciente -quizá orientado a la población masculina-, ya que los resultados sobre el interés fueron favorables a pesar de la gran cantidad de personas que no conocían de este término en específico. Otro tema de relevancia es que la edad joven y madura parece ser donde se encuentra la concentración de personas que se preocupan menos por su impacto. Así mismo, en promedio en los dos países se viaja lo mismo, con México ligeramente a la delantera, y en ambos casos lo más común es que la persona planifique su viaje.

Hipótesis

Base_de_Datos_SP <- read.csv("/Users/araquezada/Documents/Tec/7mo Semestre/Analítica para Negocios/Modulo 3/Base de Datos Turismo Responsable 2.csv")
bd <- Base_de_Datos_SP %>% select(starts_with("Q"))
na_values <- colSums(is.na(bd))
print(na_values)
##    Q2  Q3_1  Q3_2  Q3_3  Q4_1  Q4_2  Q4_3  Q4_4  Q4_5  Q4_6  Q4_7  Q4_8  Q4_9 
##     0    79    79    79   115   233   398   561   562   433   328   454   501 
## Q4_10 Q4_11 Q4_12  Q6_1  Q6_2  Q6_3  Q6_4  Q6_5  Q6_6  Q6_7  Q6_8  Q6_9 Q6_10 
##   445   697   393     0     0     0     0     0     0     0     0     0     0 
## Q6_11 Q6_12 Q6_13 Q6_14 Q6_15 Q6_16 Q6_17 Q6_18    Q7   Q10    Q9   Q12 Q12_1 
##     0     0     0     0     0     0     0     0    12    13    11     2     0 
##   Q11   Q13 
##     0     2
bd_mex <- bd[bd$Q13 == 1 ,]
bd_esp <- bd[bd$Q13 == 2 ,]

Hipótesis 1

Q9

Hipótesis nula: La proporción de turistas Españoles que reservan su viaje ellos mismos es igual a 86.6%

Hipótesis alternativa: La proporción de tursitas Españoles que reservan su viaje ellos mismos es diferente a 86.6%

Prueba de Proporciones

Regla nPi >=5, n(1-PI)>=5 3910.866, 3910.134 Cumple la regla
bd_espfilt <- bd_esp %>%
  filter (Q9 !="")
prop_obs <- sum(bd_espfilt$Q9 == "1") /length(bd_espfilt$Q9)
prop_esp <- 0.866
resultado_prueba <- prop.test(x=sum(bd_espfilt$Q9 == "1"), n = length(bd_espfilt$Q9), p =prop_esp, alternative = "two.sided")
print(resultado_prueba)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(bd_espfilt$Q9 == "1") out of length(bd_espfilt$Q9), null probability prop_esp
## X-squared = 579.16, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.866
## 95 percent confidence interval:
##  0.4002848 0.5009664
## sample estimates:
##         p 
## 0.4501279

Como la probabilidad de equivocarse al rechazar Ho es pequeña (2.2e-16), Rechazo Ho. Con una confianza del 95%, los Españoles que reservan por ellos mismos es estadisticamente diferente al 86.6%

Hipótesis 2

Q6_4

Hipótesis nula: la proporción de turistas mexicanos que fomento el desarrollo local del destino consumiendo productos y servicios locales es mayor o igual al 50%.

Hipótesis alterna: la proporción de turistas mexicanos que fomento el desarrollo local del destino consumiendo productos y servicios locales es menor al 50%.

Prueba de Proporciones

Regla nPi >=5, n(1-PI)>=5 5340.5, 5340.5 Cumple la regla
#Definir las categorías para la agrupación
resp_rel<- c (6,7)

#Calcular la proporción observada de turistas Méxicanos con respuestas relevantes
props_obs_rel <- sum(bd_mex$Q6_4 %in% resp_rel) / length (bd_mex$Q6_4)
prop_mex <- 0.5
resultado_prueba2 <- prop.test(x= sum(bd_mex$Q6_4 %in% resp_rel), n = length(bd_mex$Q6_4), p= prop_mex, alternative = "less")
print(resultado_prueba2)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(bd_mex$Q6_4 %in% resp_rel) out of length(bd_mex$Q6_4), null probability prop_mex
## X-squared = 29.26, df = 1, p-value = 3.164e-08
## alternative hypothesis: true p is less than 0.5
## 95 percent confidence interval:
##  0.0000000 0.4180676
## sample estimates:
##         p 
## 0.3820225

Como la probabilidad de equivocarse al rechazar Ho es pequeña (3.164e-08), Rechazo Ho. Con una confianza del 95%, los mexicanos que fomentan el desarrollo local del destino consumiendo productos y servicios locales es menor al 50%

Hipótesis 3

Q6_11

Hipótesis nula: la proporción de turistas españoles que afirman que compensarían la huella de carbono en su alojamiento vacacional es igual al 55%.

Hipótesis alterna: la proporción de turistas españoles que afirman que compensarían la huella de carbono en su alojamiento vacacional es diferente al 55%

Prueba de Proporciones

Regla nPi >=5, n(1-PI)>=5 5340.55, 5340.45 Cumple la regla
#Definir las categorías para la agrupación
resp_rel2<- c (6,7)

props_obs_rel <- sum(bd_esp$Q6_11 %in% resp_rel) / length (bd_esp$Q6_4)
prop_mex <- 0.55
resultado_prueba3 <- prop.test(x= sum(bd_esp$Q6_11 %in% resp_rel2), n = length(bd_esp$Q6_11), p= prop_mex, alternative = "two.sided")
print(resultado_prueba3)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(bd_esp$Q6_11 %in% resp_rel2) out of length(bd_esp$Q6_11), null probability prop_mex
## X-squared = 321.78, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.55
## 95 percent confidence interval:
##  0.07695637 0.13926138
## sample estimates:
##         p 
## 0.1042184

Como la probabilidad de equivocarme al rechazar Ho es pequeña (2.2e-16), Rechazo Ho. Con una confianza del 95%, los turistas españoles que afirman que compensarían la huella de carbono en su alojamiento vacacional es diferente al 55%

Hipótesis 4

Q7

Hipótesis nula: la cantidad promedio de viajes que realizan los mexicanos es igual a la cantidad de viajes que realizan los españoles.

Hipótesis alterna: la cantidad promedio de viajes que realizan los mexicanos es diferente a la cantidad de viajes que realizan los españoles. t.test(x, y, alternative = c(“two.sided”, “less”, “greater”))

viajes_mexicanos <- bd_mex$Q7
viajes_espanoles <- bd_esp$Q7

test_result_4 <- t.test(viajes_mexicanos, viajes_espanoles)
test_result_4
## 
##  Welch Two Sample t-test
## 
## data:  viajes_mexicanos and viajes_espanoles
## t = 0.623, df = 690.26, p-value = 0.5335
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.3874304  0.7475747
## sample estimates:
## mean of x mean of y 
##  3.803810  3.623737

Ya que p-value es mayor a 0.05, no se rechaza la Hipótesis, y concluye que la cantidad promedio de viajes que realizan los Mexicanos, es igual a la cantidad de viajes que realizan los Españoles.

Hipótesis 5

Q12

Hipótesis nula: El rango de edad en el que se encuentran los turistas mexicanos está entre 25 y 34 años.

Hipótesis alterna: El rango de edad en el que se encuentran los turistas mexicanos no está entre 25 y 34 años.

edad <- as.numeric(bd_mex$Q12)
edad <- edad[!is.na(edad)]
rangoedad <- c(25,34)
resultado_prueba5 <- t.test(edad, mu=mean(rangoedad), conf.level = 0.95)
print(resultado_prueba5)
## 
##  One Sample t-test
## 
## data:  edad
## t = 13.963, df = 530, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 29.5
## 95 percent confidence interval:
##  39.65389 42.97888
## sample estimates:
## mean of x 
##  41.31638

Como la probabilidad de equivocarme al rechazar Ho es pequeña (2.2e-16), Rechazo Ho. Con una confianza del 95%, el rango de edad en el que se encuentran los turistas mexicanos no está entre 25 y 34 años.

Hipótesis 6

Q12

Hipótesis nula: El rango de edad en el que se encuentran los turistas vascos está entre 15 y 29 años.

Hipótesis alterna: El rango de edad en el que se encuentran los turistas vascos no está entre 15 y 29 años.

edad.esp <- as.numeric(bd_esp$Q12)
edad.esp <- edad.esp[!is.na(edad.esp)]
rangoedad.esp <- c(15,19)
resultado_prueba6 <- t.test(edad.esp, mu=mean(rangoedad.esp), conf.level = 0.95)
print(resultado_prueba6)
## 
##  One Sample t-test
## 
## data:  edad.esp
## t = 23.395, df = 399, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 17
## 95 percent confidence interval:
##  35.36519 38.73481
## sample estimates:
## mean of x 
##     37.05

Como la probabilidad de equivocarme al rechazar Ho es pequeña (2.2e-16), Rechazo Ho. Con una confianza del 95%, el rango de edad en el que se encuentran los turistas vascos no está entre 15 y 29 años.

LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDMuMyBDYXNvIFR1cmlzbW8gUmVzcG9uc2FibGUiCmF1dGhvcjogIkVxdWlwbyA0IgpkYXRlOiAiMjAyMy0wOC0zMSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKLS0tCgojIyBQcm9ww7NzaXRvCkFwbGljYXIgbGFzIHTDqWNuaWNhcyBkZSBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MgeSBlc3RpbWFkb3JlcywgZW1wbGVhbmRvIGxvcyBncsOhZmljb3MgbmVjZXNhcmlvcyBkZXN0YWNhciBsYSBpbmZvcm1hY2nDs24gZGUgaW50ZXLDqXMgc29icmUgdW4gY29uanVudG8gZGUgZGF0b3MgeSBzb2JyZSBsYXMgcmVsYWNpb25lcyBxdWUgZ3VhcmRhbiBlbnRyZSBzw60sIGNvbiBsYSBheXVkYSBkZSBzb2Z0d2FyZSBlc3RhZMOtc3RpY28uCgotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQp0dXJpc21vIDwtIHJlYWQuY3N2KCIvVXNlcnMvYXJhcXVlemFkYS9Eb2N1bWVudHMvVGVjLzdtbyBTZW1lc3RyZS9BbmFsacyBdGljYSBwYXJhIE5lZ29jaW9zL01vZHVsbyAzL0Jhc2UgZGUgRGF0b3MgVHVyaXNtbyBSZXNwb25zYWJsZSAyLmNzdiIpCnN1bW1hcnkodHVyaXNtbykKYGBgCgojIyBMaW1waWV6YSBkZSBEYXRvcwpEZWJpZG8gYSBsYSBncmFuIGNhbnRpZGFkIGRlIHZhcmlhYmxlcyBxdWUgZXhpc3Rlbiwgbm9zb3Ryb3Mgbm9zIGVuZm9jYXJlbW9zIHNvbG8gZW4gYXF1ZWxsYXMgcXVlIGVzdMOhbiBlbmZvY2FkYXMgYSBhcG9ydGFyIGluZm9ybWFjacOzbiBkaXJlY3RhbWVudGUgcmVsYWNpb25hZGEgY29uIGxhIGVuY3Vlc3RhLCBkZXNlY2hhbmRvOgoK4oCcU3RhcnREYXRlLCBFbmREYXRlLCBTdGF0dXMsIElQQWRkcmVzcywgUHJvZ3Jlc3MsIER1cmF0aW9uLCAoaW4gc2Vjb25kcyksIEZpbmlzaGVkLCBSZWNvcmRlZERhdGUsIFJlc3BvbnNlSWQsIFJlY2lwaWVudExhc3ROYW1lLCBSZWNpcGllbnRGaXJzdE5hbWUsIFJlY2lwaWVudEVtYWlsLCBFeHRlcm5hbFJlZmVyZW5jZSwgTG9jYXRpb25MYXRpdHVkZSwgTG9jYXRpb25Mb25naXR1ZGUsIERpc3RyaWJ1dGlvbkNoYW5uZWwsIHkgVXNlckxhbmd1YWdl4oCdLiBMYXMgdmFyaWFibGVzIHVzYWRhcyBzZXLDoW4gZsOhY2lsbWVudGUgaW5kZW50aWZpY2FkYXMgZGViaWRvIGEgcXVlIHRvZGFzIGVtcGllemFuIGNvbiBRLgpgYGB7cn0Kc3RyKHR1cmlzbW8pCmBgYAoKIyMgRXN0YWTDrXN0aWNhIERlc2NyaXB0aXZhCiMjIyBHcsOhZmljYSAxIC0gQ2FudGlkYWQgZGUgcGVyc29uYXMgcXVlIGhhbiBlc2N1Y2hhZG8gZGVsIHR1cmlzbW8gcmVzcG9uc2FibGUKRW4gZXN0ZSBjb250ZXh0bywgbGEgdmFyaWFibGUg4oCcUTLigJ0gbWlkZSBsYSBjYW50aWRhZCBkZSBwZXJzb25hcyBxdWUgaGFuIGVzY3VjaGFkbyBkZWwgdHVyaXNtbyByZXNwb25zYWJsZSB2cy4gbGFzIHF1ZSBuby4KCmBgYHtyfQp0dXJpc21vIDwtIHR1cmlzbW8gJT4lCiAgbXV0YXRlKFEyID0gaWZlbHNlKFEyID09IDEsICJTaSIsIFEyKSkKCnR1cmlzbW8gPC0gdHVyaXNtbyAlPiUKICBtdXRhdGUoUTIgPSBpZmVsc2UoUTIgPT0gMiwgIk5vIiwgUTIpKQoKZ2dwbG90KHR1cmlzbW8sIGFlcyh4ID0gUTIsIGZpbGwgPSBRMikpICsKICBnZW9tX2JhcigpICsKICBsYWJzKHRpdGxlID0gIsK/SGEgb8OtZG8gaGFibGFyIGRlbCB0dXJpc21vIHJlc3BvbnNhYmxlIHkvbyBzb3N0ZW5pYmxlPyIsCiAgICAgICB4ID0gIlJlc3B1ZXN0YXMiLAogICAgICAgeSA9ICJGcmVjdWVuY2lhIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk5vIiA9ICJsaWdodHNhbG1vbjIiLCAiU2kiID0gImluZGlhbnJlZDMiKSkKYGBgCgpDb21vIHNlIHB1ZWRlIG9ic2VydmFyIGVuIGxhIGdyw6FmaWNhLCBsYSBtYXlvciBjYW50aWRhZCBkZSBsYXMgcGVyc29uYXMgZW5jdWVzdGFkYXMgc8OtIGhhIGVzY3VjaGFkbyBoYWJsYXIgc29icmUgZWwgdHVyaXNtbyByZXNwb25zYWJsZSB5L28gc29zdGVuaWJsZS4KCiMjIyBHcsOhZmljYSAyIC0gU2V4byBkZSBsb3MgcGFydGljaXBhbnRlcwpBIGNvbnRpbnVhY2nDs24gc2UgbXVlc3RyYSBsYSB2YXJpYWJsZSDigJxRMuKAnSwgbGEgY3VhbCBlbmdsb2JhIGxvcyBkb3Mgc2V4b3MgZGUgbGFzIHBlcnNvbmFzIHF1ZSByZWFsaXphcm9uIGxhIGVuY3Vlc3RhLCBpbHVzdHJhZG9zIGVuIGRpc3RpbnRvcyBjb2xvcmVzLgoKYGBge3J9CnR1cmlzbW8gPC0gdHVyaXNtbyAlPiUKICBtdXRhdGUoUTIgPSBpZmVsc2UoUTIgPT0gMSwgIkhvbWJyZSIsIFExMSkpCgp0dXJpc21vIDwtIHR1cmlzbW8gJT4lCiAgbXV0YXRlKFEyID0gaWZlbHNlKFEyID09IDIsICJNdWplciIsIFExMSkpCgpnZ3Bsb3QodHVyaXNtbywgYWVzKHggPSBRMiwgZmlsbCA9IFEyKSkgKwogIGdlb21fYmFyKCkgKwogIGxhYnModGl0bGUgPSAiU2V4byBkZSBsb3MgcGFydGljaXBhbnRlcyBkZSBsYSBlbmN1ZXN0YSIsCiAgICAgICB4ID0gIlJlc3B1ZXN0YXMiLAogICAgICAgeSA9ICJGcmVjdWVuY2lhIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMgKCJIb21icmUiID0gImxpZ2h0Ymx1ZTEiLCAiTXVqZXIiID0gInBlYWNocHVmZjIiKSkKYGBgCgpUYW1iacOpbiBjb21vIHNlIHB1ZWRlIG9ic2VydmFyLCBsYSBtYXlvciBwYXJ0ZSBkZSBsb3MgZW5jdWVzdGFkb3Mgc29uIG11amVyZXMuIFRhbWJpw6luIHNlIHBlcmNpYmUgcXVlIGVuIGxhIGJhc2UgZGUgZGF0b3MgYWxnw7puIGNvbXBvbmVudGUgaW1waWRlIHF1ZSBsYSBhc2lnbmFjacOzbiBkZSDigJwx4oCdIGEg4oCcaG9tYnJl4oCdIHNlYSBsZcOtZGEgY29tbyDigJxob21icmXigJ0sIHB1ZXMgc29sbyBzZSByZWZsZWphIGNvbW8gMS4KCiMjIyBHcsOhZmljYSAzIC0gQ29ub2NpbWllbnRvcyBkZSB0dXJpc21vIHJlc3BvbnNhYmxlIGNvbnRyYXN0YWRvIGNvbiBzZXhvIGRlIGxhcyBwZXJzb25hcwpQYXJhIGVzdGEgZ3LDoWZpY2Egc2UgdXRpbGl6YSBsYSB2YXJpYWJsZSDigJxRMTHigJ0sIHF1ZSBudWV2YW1lbnRlIGhhY2UgcmVmZXJlbmNpYSBhbCBzZXhvIGRlIGxhcyBwZXJzb25hcywgeSDigJxRMuKAnSwgcXVlIGVqZW1wbGljYSBlbCBjb25vY2ltaWVudG8gc29icmUgZWwgdHVyaXNtbyByZXNwb25zYWJsZS4KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHR1cmlzbW8sIGFlcyh4ID0gUTEyLCB5ID0gUTIpKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiZmlyZWJyaWNrMSIsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnModGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIHNleG8gcG9yIGNvbnNjaWVuY2lhIGRlIHR1cmlzbW8gc3VzdGVudGFibGUiLAogICAgICAgeCA9ICJTaSBzYWJlbiBkZSB0dXJpc21vIHJlc3BvbnNhYmxlIiwKICAgICAgIHkgPSAiU2V4byIpCmBgYAoKUGFyZWNlIGhhYmVyIHVuYSBtYXlvciBjb3JyZWxhY2nDs24gZW50cmUgbXVqZXJlcyB5IGVsIGNvbm9jaW1pZW50byBzb2JyZSBlbCB0dXJpc21vIHJlc3BvbnNhYmxlLCBhdW5xdWUgdGFtYmnDqW4gZXMgcG9zaWJsZSBxdWUgZXN0byBzZSBlbmN1ZW50cmUgYmFzYWRvIGVuIGVsIGhlY2hvIGRlIHF1ZSBsYSBtYXlvcsOtYSBkZSBlbmN1ZXN0YWRhcyBmdWVyb24gbXVqZXJlcy4KCiMjIyBHcsOhZmljYSA0IC0gQ2FudGlkYWQgZGUgcGVyc29uYXMgZW4gZWwgcGHDrXMgZG9uZGUgc2UgY29udGVzdMOzIGxhIGVuY3Vlc3RhClBhcmEgZXN0byBzZSB1dGlsaXphIGxhIHZhcmlhYmFsZSDigJxRM+KAnSwgcXVlIGVuZ2xvYmEgbG9zIGRvcyBwYcOtc2VzIGVuY3Vlc3RhZG9zLCBNw6l4aWNvIHkgRXNwYcOxYS4KCmBgYHtyfQp0dXJpc21vIDwtIHR1cmlzbW9bIWlzLm5hKHR1cmlzbW8kUTEzKSwgXQp0dXJpc21vIDwtIHR1cmlzbW8gJT4lCiAgbXV0YXRlKFExMyA9IGlmZWxzZShRMTMgPT0gMSwgIk3DqXhpY28iLCBRMTMpKQoKdHVyaXNtbyA8LSB0dXJpc21vICU+JQogIG11dGF0ZShRMTMgPSBpZmVsc2UoUTEzID09IDIsICJFc3Bhw7FhIiwgUTEzKSkKCmdncGxvdCh0dXJpc21vLCBhZXMoeCA9IFExMywgZmlsbCA9IFExMykpICsKICBnZW9tX2JhcigpICsKICBsYWJzKHRpdGxlID0gIlBhw61zIGVuIGVsIHF1ZSByZWFsaXphIGxhIGVuY3Vlc3RhIiwKICAgICAgIHggPSAiUmVzcHVlc3RhcyIsCiAgICAgICB5ID0gIkZyZWN1ZW5jaWEiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTcOpeGljbyIgPSAicGluayIsICJFc3Bhw7FhIiA9ICJjb3Juc2lsazEiKSkKYGBgCgpQb2RlbW9zIGNvbmNsdWlyIHF1ZSBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgZW5jdWVzdGFkYXMgbG8gZnVlcm9uIGVuIGVsIHBhw61zIGRlIE3DqXhpY28gcG9yIHVuYSBkaWZlcmVuY2lhIGRlIHBvY28gbcOhcyBkZSAxMDAgcGVyc29uYXMuCgojIyMgR3LDoWZpY2EgNSAtIFZpYWplcyBlbiBlbCDDumx0aW1vIGHDsW8KUGFyYSBjb25vY2VyIGVzdG8gc2UgdXRpbGl6YSBsYSB2YXJpYWJhbGUg4oCcUTfigJ0sIGxhIGN1YWwgY29udGllbmUgbGEgY2FudGlkYWQgZGUgdmlhamVzIGFsIGHDsW8gcXVlIHByb3BvcmNpb25hcm9uIGxvcyBlbmN1ZXN0YWRvcy4KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHR1cmlzbW8sIGFlcyh4ID0gUTcpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxLCBmaWxsID0gImxpZ2h0Z29sZGVucm9kMSIsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBsYSBDYW50aWRhZCBkZSBWaWFqZXMgZW4gZWwgw5psdGltbyBBw7FvIiwKICAgICAgIHggPSAiQ2FudGlkYWQgZGUgVmlhamVzIiwKICAgICAgIHkgPSAiRnJlY3VlbmNpYSIpCmBgYAoKU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGhheSB1bmEgY29uY2VudHJhY2nDs24gbXVjaG8gbWF5b3IgZW4gbGEgY2FudGlkYWQgMywgY29uIGxhcyBvdHJhcyBkb3Mgb3BjaW9uZXMgbcOhcyBwcm9taW5lbnRlcyBzaWVuZG8gMiB5IDQuCgojIyMgR3LDoWZpY2EgNiAtIEVkYWQKRW4gZXN0ZSBoaXN0b2dyYW1hIHNlIGFib3JkYSBsYSBlZGFkIGRlIGxvcyBlbmN1ZXN0YWRvcyBwb3IgbWVkaW8gZGUgbGEgdmFyaWFibGUg4oCcUTEy4oCdLCBsYSBjdWFsIGNvbnRpZW5lIGVzdGEgaW5mb3JtYWNpw7NuLgoKYGBge3J9CmdncGxvdChkYXRhID0gdHVyaXNtbywgYWVzKHggPSBRMTIpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxLCBmaWxsID0gImxhdmVuZGVyYmx1c2gyIiwgY29sb3IgPSAiYmxhY2siKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGRlIEVkYWQiLAogICAgICAgeCA9ICJFZGFkIiwKICAgICAgIHkgPSAiRnJlY3VlbmNpYSIpCmBgYAoKUG9kZW1vcyBjb25jbHVpciBxdWUgbGEgbWF5b3LDrWEgZGUgZW5jdWVzdGFkb3MgdGllbmUgbWVub3MgZGUgMjUgYcOxb3MsIGNvbiBsYSBtYXlvcsOtYSBzaWVuZG8gdGVuaWVuZG8gZW50cmUgMjAsIDIxLCB5IDIyIGHDsW9zLgoKIyMjIEdyw6FmaWNhIDcgLSBFZGFkIHBvciBwYcOtcwpBIGNvbnRpbnVhY2nDs24gc2UgZXhwbG9yYSBsYSByZWxhY2nDs24gZW50cmUgbGEgZWRhZCB5IGxvcyBlbmN1ZXN0YWRvcyBwb3IgcGHDrXMsIGxvIGN1YWwgc2UgcmVhbGl6YSBtZWRpYW50ZSBsYSB2YXJpYWJhIOKAnFExM+KAnSwgY2VudHJhZGEgZW4gbGEgbG9jYWxpZGFkLCB5IOKAnFExMuKAnSwgY2VudHJhZGEgZW4gbGEgZWRhZC4KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHR1cmlzbW8sIGFlcyh4ID0gUTEzLCB5ID0gUTEyKSkgKwogIGdlb21fYm94cGxvdChmaWxsID0gInBhbGV0dXJxdW9pc2UxIiwgY29sb3IgPSAiYmxhY2siKSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgRWRhZCBwb3IgUGHDrXMiLAogICAgICAgeCA9ICJQYcOtcyIsCiAgICAgICB5ID0gIkVkYWQiKQpgYGAKClBvZGVtb3MgY29uY2x1aXIgcXVlIGVuIEVzcGHDsWEgbG9zIGVuY3Vlc3RhZG9zIHRpZW5lbiB1biByYW5nbyBkZSAyMC01MiBhw7FvcyBkZSBlZGFkIHkgcXVpZW5lcyBlc3TDoW4gZW4gTcOpeGljbyB1biByYW5nbyBkZSAyMC02MCBhw7Fvcywgc2llbmRvIHByb2JhYmxlIHF1ZSBwZXJzb25hcyBkZSBtYXlvciBlZGFkIHZpYWplbiBtw6FzIGEgTcOpeGljby4KCiMjIyBHcsOhZmljYSA4IC0gSW1wb3J0YW5jaWEgZGUgbGEgc29zdGVuaWJpbGlkYWQKQSBjb250aW51YWNpw7NuIHNlIGFuYWxpemEgZW4gdW5hIGVzY2FsYSBkZWwgMSBhbCA3IGN1w6FudGEgaW1wb3J0YW5jaWEgbGUgZGFuIGEgbGEgc29zdGVuaWJpbGlkYWQsIGxsZXZhZG8gYSBjYWJvIG1lZGlhbnRlIGxhIHZhcmlhYmxlIOKAnFE2XzHigJ0sIGxhIGN1YWwgbWlkZSBlc3RvLgoKYGBge3J9CmdncGxvdChkYXRhID0gdHVyaXNtbywgYWVzKHggPSBRNl8xKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICIjRkZDMUMxIiwgY29sb3IgPSAidmlvbGV0cmVkNCIpICsKICBsYWJzKHRpdGxlID0gIkltcG9ydGFuY2lhIGRlIGxhIHNvc3RlbmliaWxpZGFkIiwKICAgICAgIHggPSAiIAogICAgICAgICBFbiBsYSBlc2NhbGEgZGUgMSBhbCA3IHNveSB1bmEgcGVyc29uYSBwcmVvY3VwYWRhIHBvciBsYSBzb3N0ZW5pYmlsaWRhZCBlY29uw7NtaWNhLCBzb2Npb2N1bHR1cmFsIHkgbWVkaW9hbWJpZW50YWwuIiwKICAgICAgIHkgPSAiRnJlY3VlbmNpYSIpCmBgYAoKUG9kZW1vcyBvYnNlcnZhciBxdWUgbGEgbWF5b3IgcGFydGUgZGUgbGFzIHBlcnNvbmFzIGxlIGRhIGltcG9ydGFuY2lhIGEgdW4gbml2ZWwgbWVkaW8sIGluY2xpbmFkbyBoYWNpYSBlbCBjdWFydGlsIHN1cGVyaW9yLgoKIyMjIEdyw6FmaWNhIDkgLSBFZGFkIHZzLiBlc2Z1ZXJ6byBlbiBubyBjYXVzYXIgaW1wYWN0byBuZWdhdGl2bwpFc3RhIGdyw6FmaWNhIGRlIGRpc3BlcnNpw7NuIHNlIGNlbnRyYSBlbiBsYSByZWxhY2nDs24gZW50cmUgbGEgZWRhZCBkZSBsYXMgcGVyc29uYXMgKFZhcmlhYmxlIFExMikgeSBsYSBpbXBvcnRhbmNpYSBxdWUgbGUgZGFuIGEgbm8gY2F1c2FyIHVuIGltcGFjdG8gbmVnYXRpdm8gYW1iaWVudGFsIG8gc29jaWFsIGNvbiBzdSBwcmVzZW5jaWEgKFE2XzYpLgoKYGBge3J9CmdncGxvdCh0dXJpc21vLCBhZXMoeCA9IFExMiwgeSA9IFE2XzYpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjRUVENUQyIiwgc2l6ZSA9IDMsIGFscGhhID0gMC43KSArCiAgbGFicyh4ID0gIkVkYWQiLCB5ID0gIk1pIGltcGFjdG8iKSArCiAgZ2d0aXRsZSgiQ29tcGFyYWNpw7NuIGRlIEVkYWQgdnMuIE1pIGltcGFjdG8iKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkKYGBgCgpQb2RlbW9zIG9ic2VydmFyIHF1ZSBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMsIGRlIGVkYWQgaW5kaXN0aW50YSwgc2UgZW5jdWVudHJhbiBlbiBsb3MgdHJlcyBuaXZlbGVzIHN1cGVyaW9yZXMgZGUgcHJlb2N1cGFjacOzbiBwb3IgZXZpdGFyIGVsIGRhw7FvLiBPdHJvIGRhdG8gaW50ZXJlc2FudGUgcG9kcsOtYSBzZXIgY8OzbW8gbG9zIG5pdmVsZXMgaW5mZXJpb3JlcyBkZSBwcmVvY3VwYWNpw7NuIHBhcmVjZW4gZXN0YXIgY2VudHJhZG9zIGVuIHBlcnNvbmFzIG1lbm9yZXMgZGUgMjUgYcOxb3MgbyBlbnRyZSA1MCB5IDc1IGHDsW9zLgoKIyMjIEdyw6FmaWNhIDEwIC0gUGxhbmlmaWNhY2nDs24gZGUgbG9zIHZpYWplcwpFbiBlc3RhIGdyw6FmaWNhIHNlIG11ZXN0cmEgcG9yIHBhw61zIChRMTMpLCBxdWnDqW5lcyBwbGFuaWZpY2FuIGxvcyB2aWFqZXMgcXVlIHJlYWxpemFuIGxvcyBlbmN1ZXN0YWRvcyAoUTkpLgpgYGB7cn0KZ2dwbG90KHR1cmlzbW8sIGFlcyh4ID0gZmFjdG9yKFExMyksIGZpbGwgPSBmYWN0b3IoUTkpKSkgKwogIGdlb21fYmFyKCkgKwogIGxhYnMoeCA9ICJQYcOtcyIsIHkgPSAiUmVjdWVudG8iLCBmaWxsID0gIlF1acOpbiBvcmdhbml6YSB5IHBsYW5pZmljYSBsb3MgdmlhamVzIikgKwogIGdndGl0bGUoIkNvbXBhcmFjacOzbiBkZSBQYcOtcyBjb24gT3JnYW5pemFjacOzbiBkZSBWaWFqZXMiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCIxIiA9ICJNw6l4aWNvIiwgIjIiID0gIkVzcGHDsWEiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIjEiID0gInZpb2xldCIsICIyIiA9ICJwaW5rIiwgIjMiID0gImJlaWdlIiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMSIgPSAiUHJpbmNpcGFsbWVudGUgeW8iLCAiMiIgPSAiUHJpbmNpcGFsbWVudGUgb3RyYXMgcGVyc29uYXMiLCAiMyIgPSAiVGFudG8geW8gY29tbyBvdHJhcyBwZXJzb25hcyIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkKYGBgCgpDb21vIHNlIHB1ZWRlIG9ic2VydmFyLCBlbiBsb3MgZG9zIHBhw61zZXMgZXMgbcOhcyBwcmVzZW50ZSBxdWUgbGFzIG1pc21hcyBwZXJzb25hcyBsbyBvcmdhbmljZW4sIGVuIE3DqXhpY28gc2llbmRvIGNhc2kgaWd1YWwgbGEgcHJvcG9yY2nDs24gZGUg4oCcdGFudG8geW8gY29tbyBvdHJhcyBwZXJzb25hc+KAnS4KCiMjIyBHcsOhZmljYSAxMSAtIFByb21lZGlvIGRlIHZpYWplcwpFbiBlc3RhIGdyw6FmaWNhIHNlIG9ic2VydmEgZWwgcHJvbWVkaW8gZGUgdmlhamVzIGFudWFsZXMgKHZhcmlhYmxlIFE3KSBlbiByZWxhY2nDs24gY29uIGxvcyBkb3MgcGHDrXNlcyBkaXNwb25pYmxlcyAoUTEzKS4KCmBgYHtyfQpnZ3Bsb3QodHVyaXNtbywgYWVzKHggPSBmYWN0b3IoUTEzKSwgeSA9IFE3KSkgKwogIGdlb21fYmFyKHN0YXQgPSAic3VtbWFyeSIsIGZ1biA9ICJtZWFuIiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBmaWxsID0gYygiI0VFRDVEMiIsICIjRkZBMDdBIikpICsKICBsYWJzKHggPSAiUGHDrXMiLCB5ID0gIlByb21lZGlvIGRlIFZpYWplIikgKwogIGdndGl0bGUoIlByb21lZGlvIGRlIFZpYWplIENvbXBhcmFkbyBlbnRyZSBFc3Bhw7FvbGVzIHkgTWV4aWNhbm9zIikgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiMSIgPSAiTcOpeGljbyIsICIyIiA9ICJFc3Bhw7FhIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQpgYGAKClNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBlbCBwcm9tZWRpbyBlcyBiYXN0YW50ZSBzaW1pbGFyLCBjb24gTcOpeGljbyBzaWVuZG8gbGlnZXJhbWVudGUgc3VwZXJpb3IuCgojIyBDb25jbHVzacOzbiBkZWwgQW7DoWxpc2lzIERlc2NyaXB0aXZvCkNvbW8gY29uY2x1c2nDs24gZ2VuZXJhbCwgc2UgcHVlZGUgbGxlZ2FyIGEgbG8gc2lndWllbnRlOiBFeGlzdGVuIGZhY3RvcmVzIHF1ZSBpbmV2aXRhYmxlIGNhdXNhcsOhbiBjaWVydG8gc2VzZ28gZW4gbG9zIHJlc3VsdGFkb3MsIGNvbW8gbGEgZGlmZXJlbmNpYSBlbnRyZSBuYWNpb25hbGlkYWRlcyB5IHNleG9zIGVuY3Vlc3RhZG9zLiBTaW4gZW1iYXJnbywgaGF5IHZhcmlvcyBwdW50b3MgcmVzY2F0YWJsZXMuIExhIHByZW9jdXBhY2nDs24gcG9yIGVsIG1lZGlvYW1iaWVudGUgcGFyZWNlIHNlciBtb2RlcmFkYSwgbG8gY3VhbCB0aWVuZSBzZW50aWRvIGVuIHJlbGFjacOzbiBhIGxhIGNhbnRpZGFkIGRlIHBlcnNvbmFzIHF1ZSBjb25vY2VuIHNvYnJlIGVsIHR1cmlzbW8gcmVzcG9uc2FibGUsIHF1ZSB0YW1iacOpbiBwYXJlY2Ugc2VyIG1vZGVyYWRvIGVuIHJlbGFjacOzbiBjb24gbGFzIHBlcnNvbmFzIHF1ZSBubywgeSBwYXJlY2UgZXN0YXIgaW5jbGluYWRvIGhhY2lhIGxhIHBvYmxhY2nDs24gZmVtZW5pbmEuIExhcyBwZXJzb25hcywgc2luIGRpc3RpbmNpw7NuIGRlIGVkYWQsIHBhcmVjZW4gcHJlb2N1cGFkYXMgcG9yIHN1IGltcGFjdG8gc29jaW9hbWJpZW50YWwuIFRhbWJpw6luIGV4aXN0ZSB1bmEgbWFyY2FkYSBjb25jZW50cmFjacOzbiBkZSBlbmN1ZXN0YWRvcyBwZXJ0ZW5lY2llbnRlcyBhIHVuYSBwb2JsYWNpw7NuIGpvdmVuIHkgbWV4aWNhbmEsIGxvcyBjdWFsZXMgcmVhbGl6YW4gZW50cmUgMiB5IDMgdmlhamVzIGFsIGHDsW8uIFRvbWFuZG8gZW4gY3VlbnRhIGxhIGNvbXBhcmFjacOzbiBlbnRyZSBsb3MgZGl2ZXJzb3MgcmVzdWx0YWRvcyB5IGVsIGhlY2hvIGRlIHF1ZSBsYSBwcmVvY3VwYWNpw7NuIHBvciBsYSBzb3N0ZW5pYmlsaWRhZCBzZSBlbmN1ZW50cmEgZW4gdW4gdMOpcm1pbm8gbW9kZXJhZG8tYWx0byAoZGViaWRvIGEgcXVlIGxhIGVzY2FsYSBlcmEgZGUgNyB5IGxhIHJlc3B1ZXN0YSBtYXlvciBlcyA1KSwgc2UgcG9kcsOtYSBlc3BlY3VsYXIgc29icmUgbGEgcG9zaWJpbGlkYWQgZGUgcXVlIGVzdGUgbsO6bWVybyBhdW1lbnRhc2UgZGUgbWFuZXJhIGltcG9ydGFudGUgc2kgaWd1YWxtZW50ZSBzZSBpbmNyZW1lbnRhcmEgbGEgY29uY2llbmNpYSBzb2JyZSBlbCB0dXJpc21vIGNvbnNjaWVudGUgLXF1aXrDoSBvcmllbnRhZG8gYSBsYSBwb2JsYWNpw7NuIG1hc2N1bGluYS0sIHlhIHF1ZSBsb3MgcmVzdWx0YWRvcyBzb2JyZSBlbCBpbnRlcsOpcyBmdWVyb24gZmF2b3JhYmxlcyBhIHBlc2FyIGRlIGxhIGdyYW4gY2FudGlkYWQgZGUgcGVyc29uYXMgcXVlIG5vIGNvbm9jw61hbiBkZSBlc3RlIHTDqXJtaW5vIGVuIGVzcGVjw61maWNvLiBPdHJvIHRlbWEgZGUgcmVsZXZhbmNpYSBlcyBxdWUgbGEgZWRhZCBqb3ZlbiB5IG1hZHVyYSBwYXJlY2Ugc2VyIGRvbmRlIHNlIGVuY3VlbnRyYSBsYSBjb25jZW50cmFjacOzbiBkZSBwZXJzb25hcyBxdWUgc2UgcHJlb2N1cGFuIG1lbm9zIHBvciBzdSBpbXBhY3RvLiBBc8OtIG1pc21vLCBlbiBwcm9tZWRpbyBlbiBsb3MgZG9zIHBhw61zZXMgc2UgdmlhamEgbG8gbWlzbW8sIGNvbiBNw6l4aWNvIGxpZ2VyYW1lbnRlIGEgbGEgZGVsYW50ZXJhLCB5IGVuIGFtYm9zIGNhc29zIGxvIG3DoXMgY29tw7puIGVzIHF1ZSBsYSBwZXJzb25hIHBsYW5pZmlxdWUgc3UgdmlhamUuCgojIyBIaXDDs3Rlc2lzIApgYGB7cn0KQmFzZV9kZV9EYXRvc19TUCA8LSByZWFkLmNzdigiL1VzZXJzL2FyYXF1ZXphZGEvRG9jdW1lbnRzL1RlYy83bW8gU2VtZXN0cmUvQW5hbGnMgXRpY2EgcGFyYSBOZWdvY2lvcy9Nb2R1bG8gMy9CYXNlIGRlIERhdG9zIFR1cmlzbW8gUmVzcG9uc2FibGUgMi5jc3YiKQpgYGAKCmBgYHtyfQpiZCA8LSBCYXNlX2RlX0RhdG9zX1NQICU+JSBzZWxlY3Qoc3RhcnRzX3dpdGgoIlEiKSkKYGBgCgpgYGB7cn0KbmFfdmFsdWVzIDwtIGNvbFN1bXMoaXMubmEoYmQpKQpwcmludChuYV92YWx1ZXMpCmBgYApgYGB7cn0KYmRfbWV4IDwtIGJkW2JkJFExMyA9PSAxICxdCmJkX2VzcCA8LSBiZFtiZCRRMTMgPT0gMiAsXQpgYGAKCiMjIyBIaXDDs3Rlc2lzIDEgClE5IAoKSGlww7N0ZXNpcyBudWxhOiBMYSBwcm9wb3JjacOzbiBkZSB0dXJpc3RhcyBFc3Bhw7FvbGVzIHF1ZSByZXNlcnZhbiBzdSB2aWFqZSBlbGxvcyBtaXNtb3MgZXMKaWd1YWwgYSA4Ni42JQoKSGlww7N0ZXNpcyBhbHRlcm5hdGl2YTogTGEgcHJvcG9yY2nDs24gZGUgdHVyc2l0YXMgRXNwYcOxb2xlcyBxdWUgcmVzZXJ2YW4gc3UgdmlhamUgZWxsb3MgbWlzbW9zCmVzIGRpZmVyZW50ZSBhIDg2LjYlCgojIyMjIFBydWViYSBkZSBQcm9wb3JjaW9uZXMKIyMjIyMgUmVnbGEgblBpID49NSwgbigxLVBJKT49NSAgICAzOTEqMC44NjYsIDM5MSowLjEzNCBDdW1wbGUgbGEgcmVnbGEKCmBgYHtyfQpiZF9lc3BmaWx0IDwtIGJkX2VzcCAlPiUKICBmaWx0ZXIgKFE5ICE9IiIpCmBgYApgYGB7cn0KcHJvcF9vYnMgPC0gc3VtKGJkX2VzcGZpbHQkUTkgPT0gIjEiKSAvbGVuZ3RoKGJkX2VzcGZpbHQkUTkpCnByb3BfZXNwIDwtIDAuODY2CnJlc3VsdGFkb19wcnVlYmEgPC0gcHJvcC50ZXN0KHg9c3VtKGJkX2VzcGZpbHQkUTkgPT0gIjEiKSwgbiA9IGxlbmd0aChiZF9lc3BmaWx0JFE5KSwgcCA9cHJvcF9lc3AsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpCnByaW50KHJlc3VsdGFkb19wcnVlYmEpCmBgYApDb21vIGxhIHByb2JhYmlsaWRhZCBkZSBlcXVpdm9jYXJzZSBhbCByZWNoYXphciBIbyBlcyBwZXF1ZcOxYSAoMi4yZS0xNiksIFJlY2hhem8gSG8uIENvbiB1bmEgY29uZmlhbnphIGRlbCA5NSUsIGxvcyBFc3Bhw7FvbGVzIHF1ZSByZXNlcnZhbiBwb3IgZWxsb3MgbWlzbW9zIGVzIGVzdGFkaXN0aWNhbWVudGUgZGlmZXJlbnRlIGFsIDg2LjYlCgojIyMgSGlww7N0ZXNpcyAyClE2XzQKCkhpcMOzdGVzaXMgbnVsYTogbGEgcHJvcG9yY2nDs24gZGUgdHVyaXN0YXMgbWV4aWNhbm9zIHF1ZSBmb21lbnRvIGVsIGRlc2Fycm9sbG8gbG9jYWwgZGVsCmRlc3Rpbm8gY29uc3VtaWVuZG8gcHJvZHVjdG9zIHkgc2VydmljaW9zIGxvY2FsZXMgZXMgbWF5b3IgbyBpZ3VhbCBhbCA1MCUuCgpIaXDDs3Rlc2lzIGFsdGVybmE6IGxhIHByb3BvcmNpw7NuIGRlIHR1cmlzdGFzIG1leGljYW5vcyBxdWUgZm9tZW50byBlbCBkZXNhcnJvbGxvIGxvY2FsIGRlbApkZXN0aW5vIGNvbnN1bWllbmRvIHByb2R1Y3RvcyB5IHNlcnZpY2lvcyBsb2NhbGVzIGVzIG1lbm9yIGFsIDUwJS4KCiMjIyMgUHJ1ZWJhIGRlIFByb3BvcmNpb25lcwojIyMjIyBSZWdsYSBuUGkgPj01LCBuKDEtUEkpPj01ICAgIDUzNCowLjUsIDUzNCowLjUgQ3VtcGxlIGxhIHJlZ2xhCgpgYGB7cn0KI0RlZmluaXIgbGFzIGNhdGVnb3LDrWFzIHBhcmEgbGEgYWdydXBhY2nDs24KcmVzcF9yZWw8LSBjICg2LDcpCgojQ2FsY3VsYXIgbGEgcHJvcG9yY2nDs24gb2JzZXJ2YWRhIGRlIHR1cmlzdGFzIE3DqXhpY2Fub3MgY29uIHJlc3B1ZXN0YXMgcmVsZXZhbnRlcwpwcm9wc19vYnNfcmVsIDwtIHN1bShiZF9tZXgkUTZfNCAlaW4lIHJlc3BfcmVsKSAvIGxlbmd0aCAoYmRfbWV4JFE2XzQpCnByb3BfbWV4IDwtIDAuNQpyZXN1bHRhZG9fcHJ1ZWJhMiA8LSBwcm9wLnRlc3QoeD0gc3VtKGJkX21leCRRNl80ICVpbiUgcmVzcF9yZWwpLCBuID0gbGVuZ3RoKGJkX21leCRRNl80KSwgcD0gcHJvcF9tZXgsIGFsdGVybmF0aXZlID0gImxlc3MiKQpwcmludChyZXN1bHRhZG9fcHJ1ZWJhMikKYGBgCkNvbW8gbGEgcHJvYmFiaWxpZGFkIGRlIGVxdWl2b2NhcnNlIGFsIHJlY2hhemFyIEhvIGVzIHBlcXVlw7FhICgzLjE2NGUtMDgpLCBSZWNoYXpvIEhvLiBDb24gdW5hIGNvbmZpYW56YSBkZWwgOTUlLCBsb3MgbWV4aWNhbm9zIHF1ZSBmb21lbnRhbiBlbCBkZXNhcnJvbGxvIGxvY2FsIGRlbCBkZXN0aW5vIGNvbnN1bWllbmRvIHByb2R1Y3RvcyB5IHNlcnZpY2lvcyBsb2NhbGVzIGVzIG1lbm9yIGFsIDUwJQoKCiMjIyBIaXDDs3Rlc2lzIDMKUTZfMTEKCkhpcMOzdGVzaXMgbnVsYTogbGEgcHJvcG9yY2nDs24gZGUgdHVyaXN0YXMgZXNwYcOxb2xlcyBxdWUgYWZpcm1hbiBxdWUgY29tcGVuc2Fyw61hbiBsYQpodWVsbGEgZGUgY2FyYm9ubyBlbiBzdSBhbG9qYW1pZW50byB2YWNhY2lvbmFsIGVzIGlndWFsIGFsIDU1JS4KCkhpcMOzdGVzaXMgYWx0ZXJuYTogbGEgcHJvcG9yY2nDs24gZGUgdHVyaXN0YXMgZXNwYcOxb2xlcyBxdWUgYWZpcm1hbiBxdWUgY29tcGVuc2Fyw61hbiBsYQpodWVsbGEgZGUgY2FyYm9ubyBlbiBzdSBhbG9qYW1pZW50byB2YWNhY2lvbmFsIGVzIGRpZmVyZW50ZSBhbCA1NSUKCiMjIyMgUHJ1ZWJhIGRlIFByb3BvcmNpb25lcwojIyMjIyBSZWdsYSBuUGkgPj01LCBuKDEtUEkpPj01ICAgIDUzNCowLjU1LCA1MzQqMC40NSBDdW1wbGUgbGEgcmVnbGEKYGBge3J9CiNEZWZpbmlyIGxhcyBjYXRlZ29yw61hcyBwYXJhIGxhIGFncnVwYWNpw7NuCnJlc3BfcmVsMjwtIGMgKDYsNykKCnByb3BzX29ic19yZWwgPC0gc3VtKGJkX2VzcCRRNl8xMSAlaW4lIHJlc3BfcmVsKSAvIGxlbmd0aCAoYmRfZXNwJFE2XzQpCnByb3BfbWV4IDwtIDAuNTUKcmVzdWx0YWRvX3BydWViYTMgPC0gcHJvcC50ZXN0KHg9IHN1bShiZF9lc3AkUTZfMTEgJWluJSByZXNwX3JlbDIpLCBuID0gbGVuZ3RoKGJkX2VzcCRRNl8xMSksIHA9IHByb3BfbWV4LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQpwcmludChyZXN1bHRhZG9fcHJ1ZWJhMykKYGBgCkNvbW8gbGEgcHJvYmFiaWxpZGFkIGRlIGVxdWl2b2Nhcm1lIGFsIHJlY2hhemFyIEhvIGVzIHBlcXVlw7FhICgyLjJlLTE2KSwgUmVjaGF6byBIby4gQ29uIHVuYSBjb25maWFuemEgZGVsIDk1JSwgbG9zIHR1cmlzdGFzIGVzcGHDsW9sZXMgcXVlIGFmaXJtYW4gcXVlIGNvbXBlbnNhcsOtYW4gbGEgaHVlbGxhIGRlIGNhcmJvbm8gZW4gc3UgYWxvamFtaWVudG8gdmFjYWNpb25hbCBlcyBkaWZlcmVudGUgYWwgNTUlCgoKIyMjIEhpcMOzdGVzaXMgNApRNwoKSGlww7N0ZXNpcyBudWxhOiBsYSBjYW50aWRhZCBwcm9tZWRpbyBkZSB2aWFqZXMgcXVlIHJlYWxpemFuIGxvcyBtZXhpY2Fub3MgZXMgaWd1YWwgYSBsYSBjYW50aWRhZCBkZSB2aWFqZXMgcXVlIHJlYWxpemFuIGxvcyBlc3Bhw7FvbGVzLgoKSGlww7N0ZXNpcyBhbHRlcm5hOiBsYSBjYW50aWRhZCBwcm9tZWRpbyBkZSB2aWFqZXMgcXVlIHJlYWxpemFuIGxvcyBtZXhpY2Fub3MgZXMgZGlmZXJlbnRlIGEgbGEgY2FudGlkYWQgZGUgdmlhamVzIHF1ZSByZWFsaXphbiBsb3MgZXNwYcOxb2xlcy4KdC50ZXN0KHgsIHksIGFsdGVybmF0aXZlID0gYyjigJx0d28uc2lkZWTigJ0sIOKAnGxlc3PigJ0sIOKAnGdyZWF0ZXLigJ0pKQoKCgpgYGB7cn0KdmlhamVzX21leGljYW5vcyA8LSBiZF9tZXgkUTcKdmlhamVzX2VzcGFub2xlcyA8LSBiZF9lc3AkUTcKCnRlc3RfcmVzdWx0XzQgPC0gdC50ZXN0KHZpYWplc19tZXhpY2Fub3MsIHZpYWplc19lc3Bhbm9sZXMpCnRlc3RfcmVzdWx0XzQKYGBgCllhIHF1ZSBwLXZhbHVlIGVzIG1heW9yIGEgMC4wNSwgbm8gc2UgcmVjaGF6YSBsYSBIaXDDs3Rlc2lzLCB5IGNvbmNsdXllIHF1ZSBsYSBjYW50aWRhZCBwcm9tZWRpbyBkZSB2aWFqZXMgcXVlIHJlYWxpemFuIGxvcyBNZXhpY2Fub3MsIGVzIGlndWFsIGEgbGEgY2FudGlkYWQgZGUgdmlhamVzIHF1ZSByZWFsaXphbiBsb3MgRXNwYcOxb2xlcy4gIAoKCiMjIyBIaXDDs3Rlc2lzIDUKUTEyCgpIaXDDs3Rlc2lzIG51bGE6IEVsIHJhbmdvIGRlIGVkYWQgZW4gZWwgcXVlIHNlIGVuY3VlbnRyYW4gbG9zIHR1cmlzdGFzIG1leGljYW5vcyBlc3TDoSBlbnRyZSAyNSB5IDM0IGHDsW9zLgoKSGlww7N0ZXNpcyBhbHRlcm5hOiBFbCByYW5nbyBkZSBlZGFkIGVuIGVsIHF1ZSBzZSBlbmN1ZW50cmFuIGxvcyB0dXJpc3RhcyBtZXhpY2Fub3Mgbm8gZXN0w6EgZW50cmUgMjUgeSAzNCBhw7Fvcy4KCmBgYHtyfQplZGFkIDwtIGFzLm51bWVyaWMoYmRfbWV4JFExMikKZWRhZCA8LSBlZGFkWyFpcy5uYShlZGFkKV0KcmFuZ29lZGFkIDwtIGMoMjUsMzQpCnJlc3VsdGFkb19wcnVlYmE1IDwtIHQudGVzdChlZGFkLCBtdT1tZWFuKHJhbmdvZWRhZCksIGNvbmYubGV2ZWwgPSAwLjk1KQpwcmludChyZXN1bHRhZG9fcHJ1ZWJhNSkKYGBgCkNvbW8gbGEgcHJvYmFiaWxpZGFkIGRlIGVxdWl2b2Nhcm1lIGFsIHJlY2hhemFyIEhvIGVzIHBlcXVlw7FhICgyLjJlLTE2KSwgUmVjaGF6byBIby4gQ29uIHVuYSBjb25maWFuemEgZGVsIDk1JSwgZWwgcmFuZ28gZGUgZWRhZCBlbiBlbCBxdWUgc2UgZW5jdWVudHJhbiBsb3MgdHVyaXN0YXMgbWV4aWNhbm9zIG5vIGVzdMOhIGVudHJlIDI1IHkgMzQgYcOxb3MuCgojIyMgSGlww7N0ZXNpcyA2ClExMgoKSGlww7N0ZXNpcyBudWxhOiBFbCByYW5nbyBkZSBlZGFkIGVuIGVsIHF1ZSBzZSBlbmN1ZW50cmFuIGxvcyB0dXJpc3RhcyB2YXNjb3MgZXN0w6EgZW50cmUgMTUgeSAyOSBhw7Fvcy4KCkhpcMOzdGVzaXMgYWx0ZXJuYTogRWwgcmFuZ28gZGUgZWRhZCBlbiBlbCBxdWUgc2UgZW5jdWVudHJhbiBsb3MgdHVyaXN0YXMgdmFzY29zIG5vIGVzdMOhIGVudHJlIDE1IHkgMjkgYcOxb3MuCgpgYGB7cn0KZWRhZC5lc3AgPC0gYXMubnVtZXJpYyhiZF9lc3AkUTEyKQplZGFkLmVzcCA8LSBlZGFkLmVzcFshaXMubmEoZWRhZC5lc3ApXQpyYW5nb2VkYWQuZXNwIDwtIGMoMTUsMTkpCnJlc3VsdGFkb19wcnVlYmE2IDwtIHQudGVzdChlZGFkLmVzcCwgbXU9bWVhbihyYW5nb2VkYWQuZXNwKSwgY29uZi5sZXZlbCA9IDAuOTUpCnByaW50KHJlc3VsdGFkb19wcnVlYmE2KQpgYGAKQ29tbyBsYSBwcm9iYWJpbGlkYWQgZGUgZXF1aXZvY2FybWUgYWwgcmVjaGF6YXIgSG8gZXMgcGVxdWXDsWEgKDIuMmUtMTYpLCBSZWNoYXpvIEhvLiBDb24gdW5hIGNvbmZpYW56YSBkZWwgOTUlLCBlbCByYW5nbyBkZSBlZGFkIGVuIGVsIHF1ZSBzZSBlbmN1ZW50cmFuIGxvcyB0dXJpc3RhcyB2YXNjb3Mgbm8gZXN0w6EgZW50cmUgMTUgeSAyOSBhw7Fvcy4KCg==