Situación Problema 2
Te acabas de incorporar a una empresa consultora en Inteligencia de Negocios, actualmente están brindando servicios de análisis para la industria de la aviación y les interesa tener a la aerolínea American Airlines como cliente ya que es una de las aerolíneas líderes en los aeropuertos de Nueva York, motivo por el cuál te han contratado.
Te han pedido que identifiques cómo puede dicha aerolínea mejorar su posición competitiva !!
Para identificar oportunidades de mejorar la posición competitiva de la aerolínea American Airlines, necesitas realizar algunos análisis, para determinar si hay variaciones en la posición de liderazgo de dicha aerolínea

Modelo Entidad-Relación
Se te ha solicitado hacer un estudio sobre la situación actual de la aerolínea American Airlines ya que se necesita revisar sus destinos, horarios y aviones con los que cuenta para hacer propuestas de aumento o reducción de vuelos por destino y horarios, así como la cantidad de aviones.

Consulta y eplora el dataframe planes y weather para que conozcas su contenido

library(nycflights13)
#view(planes)
#view(weather)

Se necesita saber de cada vuelo, la aerolínea, el aeropuerto de origen y el aeropuerto destino

summary(planes)
##    tailnum               year          type           manufacturer      
##  Length:3322        Min.   :1956   Length:3322        Length:3322       
##  Class :character   1st Qu.:1997   Class :character   Class :character  
##  Mode  :character   Median :2001   Mode  :character   Mode  :character  
##                     Mean   :2000                                        
##                     3rd Qu.:2005                                        
##                     Max.   :2013                                        
##                     NA's   :70                                          
##     model              engines          seats           speed      
##  Length:3322        Min.   :1.000   Min.   :  2.0   Min.   : 90.0  
##  Class :character   1st Qu.:2.000   1st Qu.:140.0   1st Qu.:107.5  
##  Mode  :character   Median :2.000   Median :149.0   Median :162.0  
##                     Mean   :1.995   Mean   :154.3   Mean   :236.8  
##                     3rd Qu.:2.000   3rd Qu.:182.0   3rd Qu.:432.0  
##                     Max.   :4.000   Max.   :450.0   Max.   :432.0  
##                                                     NA's   :3299   
##     engine         
##  Length:3322       
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
vuelos <- select(flights,flight,carrier,origin,dest)
head(vuelos)
## # A tibble: 6 × 4
##   flight carrier origin dest 
##    <int> <chr>   <chr>  <chr>
## 1   1545 UA      EWR    IAH  
## 2   1714 UA      LGA    IAH  
## 3   1141 AA      JFK    MIA  
## 4    725 B6      JFK    BQN  
## 5    461 DL      LGA    ATL  
## 6   1696 UA      EWR    ORD

En la consulta anterior se necesita conocer el nombre de la aerolínea

#left_join()

Se necesita saber la cantidad de vuelos por cada destino para identificar cuales son los destinos más buscados

count(vuelos, dest, sort=TRUE)
## # A tibble: 105 × 2
##    dest      n
##    <chr> <int>
##  1 ORD   17283
##  2 ATL   17215
##  3 LAX   16174
##  4 BOS   15508
##  5 MCO   14082
##  6 CLT   14064
##  7 SFO   13331
##  8 FLL   12055
##  9 MIA   11728
## 10 DCA    9705
## # … with 95 more rows

Agregar el nombre de la aerolínea al dataframe anterior

#left_join()

Se necesita conocer las aerolíneas (clave y nombre) y destinos que vuelan por la Mañana: de 6 a 12, Tarde: de 12 a 19 , Noche: de 19 a 24 y Madrugada de 24 a 6

horarios <- select(flights,flight,carrier,hour)
head(horarios)
## # A tibble: 6 × 3
##   flight carrier  hour
##    <int> <chr>   <dbl>
## 1   1545 UA          5
## 2   1714 UA          5
## 3   1141 AA          5
## 4    725 B6          5
## 5    461 DL          6
## 6   1696 UA          5
#horarios$categoria <- if (flights$hour>=6 && flights$hour<2) {
 # "Mañana"
#}

Agrega un nuevo campo a la tabla con el nombre de clas_horario y agrega, mañana, tarde, noche y madrugada según sea el caso

#ifelse

Se necesita saber la cantidad de vuelos por aerolínea y destino que hay por la Mañana, Tarde, Noche y Madrugada.

Se necesita saber a qué destinos vuela la aerolínea American Airlines Inc.-AA durante la madrugada

head(planes)
## # A tibble: 6 × 9
##   tailnum  year type                    manuf…¹ model engines seats speed engine
##   <chr>   <int> <chr>                   <chr>   <chr>   <int> <int> <int> <chr> 
## 1 N10156   2004 Fixed wing multi engine EMBRAER EMB-…       2    55    NA Turbo…
## 2 N102UW   1998 Fixed wing multi engine AIRBUS… A320…       2   182    NA Turbo…
## 3 N103US   1999 Fixed wing multi engine AIRBUS… A320…       2   182    NA Turbo…
## 4 N104UW   1999 Fixed wing multi engine AIRBUS… A320…       2   182    NA Turbo…
## 5 N10575   2002 Fixed wing multi engine EMBRAER EMB-…       2    55    NA Turbo…
## 6 N105UW   1999 Fixed wing multi engine AIRBUS… A320…       2   182    NA Turbo…
## # … with abbreviated variable name ¹​manufacturer
aviones <- select(planes,type, engine, seats)
tail(aviones)
## # A tibble: 6 × 3
##   type                    engine    seats
##   <chr>                   <chr>     <int>
## 1 Fixed wing multi engine Turbo-fan   142
## 2 Fixed wing multi engine Turbo-fan   100
## 3 Fixed wing multi engine Turbo-fan   142
## 4 Fixed wing multi engine Turbo-fan   100
## 5 Fixed wing multi engine Turbo-jet   142
## 6 Fixed wing multi engine Turbo-jet   142

Imagina que entregarás estos hallazgos a tu superior, elabora un reporte ejecutivo utilizando los resultados obtenidos

Visualización de datos
En los avances anteriores se han realizado diferentes análisis y ahora nos solicitan hacer visualizaciones de la aerolínea American Airlines para los ejecutivos con las siguientes características.Dentro de las aerolíneas el retraso tanto en la hora de partida como en la hora de llegada a su destino van generando indicadores negativos.

Se solicita analizar para la aerolínea American Airlines si los vuelos que tienen retraso en la partida también tienen retraso en la hora de llegada

head(weather)
## # A tibble: 6 × 15
##   origin  year month   day  hour  temp  dewp humid wind_dir wind_speed wind_gust
##   <chr>  <int> <int> <int> <int> <dbl> <dbl> <dbl>    <dbl>      <dbl>     <dbl>
## 1 EWR     2013     1     1     1  39.0  26.1  59.4      270      10.4         NA
## 2 EWR     2013     1     1     2  39.0  27.0  61.6      250       8.06        NA
## 3 EWR     2013     1     1     3  39.0  28.0  64.4      240      11.5         NA
## 4 EWR     2013     1     1     4  39.9  28.0  62.2      250      12.7         NA
## 5 EWR     2013     1     1     5  39.0  28.0  64.4      260      12.7         NA
## 6 EWR     2013     1     1     6  37.9  28.0  67.2      240      11.5         NA
## # … with 4 more variables: precip <dbl>, pressure <dbl>, visib <dbl>,
## #   time_hour <dttm>
g1 <- filter(weather,origin=="EWR")
head(g1)
## # A tibble: 6 × 15
##   origin  year month   day  hour  temp  dewp humid wind_dir wind_speed wind_gust
##   <chr>  <int> <int> <int> <int> <dbl> <dbl> <dbl>    <dbl>      <dbl>     <dbl>
## 1 EWR     2013     1     1     1  39.0  26.1  59.4      270      10.4         NA
## 2 EWR     2013     1     1     2  39.0  27.0  61.6      250       8.06        NA
## 3 EWR     2013     1     1     3  39.0  28.0  64.4      240      11.5         NA
## 4 EWR     2013     1     1     4  39.9  28.0  62.2      250      12.7         NA
## 5 EWR     2013     1     1     5  39.0  28.0  64.4      260      12.7         NA
## 6 EWR     2013     1     1     6  37.9  28.0  67.2      240      11.5         NA
## # … with 4 more variables: precip <dbl>, pressure <dbl>, visib <dbl>,
## #   time_hour <dttm>
g2 <- filter(g1, day >= 15)
summary(g2)
##     origin               year          month             day       
##  Length:4682        Min.   :2013   Min.   : 1.000   Min.   :15.00  
##  Class :character   1st Qu.:2013   1st Qu.: 4.000   1st Qu.:19.00  
##  Mode  :character   Median :2013   Median : 7.000   Median :23.00  
##                     Mean   :2013   Mean   : 6.509   Mean   :22.68  
##                     3rd Qu.:2013   3rd Qu.: 9.000   3rd Qu.:27.00  
##                     Max.   :2013   Max.   :12.000   Max.   :31.00  
##                                                                    
##       hour            temp             dewp           humid       
##  Min.   : 0.00   Min.   : 10.94   Min.   :-9.04   Min.   : 15.61  
##  1st Qu.: 5.00   1st Qu.: 39.92   1st Qu.:26.06   1st Qu.: 46.08  
##  Median :11.00   Median : 55.94   Median :41.00   Median : 60.49  
##  Mean   :11.48   Mean   : 55.37   Mean   :41.02   Mean   : 61.45  
##  3rd Qu.:17.00   3rd Qu.: 71.06   3rd Qu.:57.92   3rd Qu.: 77.14  
##  Max.   :23.00   Max.   :100.04   Max.   :75.92   Max.   :100.00  
##                  NA's   :1        NA's   :1       NA's   :1       
##     wind_dir       wind_speed       wind_gust         precip      
##  Min.   :  0.0   Min.   : 0.000   Min.   :16.11   Min.   :0.0000  
##  1st Qu.:130.0   1st Qu.: 5.754   1st Qu.:19.56   1st Qu.:0.0000  
##  Median :230.0   Median : 8.055   Median :23.02   Median :0.0000  
##  Mean   :198.4   Mean   : 9.277   Mean   :24.48   Mean   :0.0038  
##  3rd Qu.:280.0   3rd Qu.:12.659   3rd Qu.:27.62   3rd Qu.:0.0000  
##  Max.   :360.0   Max.   :42.579   Max.   :58.69   Max.   :1.2100  
##  NA's   :146     NA's   :1        NA's   :3730                    
##     pressure          visib          time_hour                     
##  Min.   : 983.9   Min.   : 0.120   Min.   :2013-01-15 00:00:00.00  
##  1st Qu.:1012.5   1st Qu.:10.000   1st Qu.:2013-04-15 21:15:00.00  
##  Median :1017.9   Median :10.000   Median :2013-07-15 15:30:00.00  
##  Mean   :1017.9   Mean   : 9.416   Mean   :2013-07-08 22:04:48.33  
##  3rd Qu.:1023.1   3rd Qu.:10.000   3rd Qu.:2013-09-30 14:45:00.00  
##  Max.   :1041.9   Max.   :10.000   Max.   :2013-12-30 18:00:00.00  
##  NA's   :425
g3<- filter(g2,month==1)
summary(g3)
##     origin               year          month        day          hour      
##  Length:408         Min.   :2013   Min.   :1   Min.   :15   Min.   : 0.00  
##  Class :character   1st Qu.:2013   1st Qu.:1   1st Qu.:19   1st Qu.: 5.75  
##  Mode  :character   Median :2013   Median :1   Median :23   Median :11.50  
##                     Mean   :2013   Mean   :1   Mean   :23   Mean   :11.50  
##                     3rd Qu.:2013   3rd Qu.:1   3rd Qu.:27   3rd Qu.:17.25  
##                     Max.   :2013   Max.   :1   Max.   :31   Max.   :23.00  
##                                                                            
##       temp            dewp           humid           wind_dir    
##  Min.   :10.94   Min.   :-9.04   Min.   : 20.87   Min.   :  0.0  
##  1st Qu.:23.00   1st Qu.: 6.98   1st Qu.: 41.94   1st Qu.:190.0  
##  Median :32.00   Median :15.80   Median : 55.55   Median :260.0  
##  Mean   :32.17   Mean   :18.30   Mean   : 59.64   Mean   :222.7  
##  3rd Qu.:39.02   3rd Qu.:30.38   3rd Qu.: 81.82   3rd Qu.:300.0  
##  Max.   :64.40   Max.   :59.00   Max.   :100.00   Max.   :360.0  
##                                                   NA's   :10     
##    wind_speed       wind_gust         precip            pressure     
##  Min.   : 0.000   Min.   :16.11   Min.   :0.000000   Min.   : 983.9  
##  1st Qu.: 6.905   1st Qu.:23.02   1st Qu.:0.000000   1st Qu.:1015.9  
##  Median : 9.206   Median :27.62   Median :0.000000   Median :1020.3  
##  Mean   :11.260   Mean   :29.52   Mean   :0.007132   Mean   :1019.9  
##  3rd Qu.:14.097   3rd Qu.:34.52   3rd Qu.:0.000000   3rd Qu.:1025.8  
##  Max.   :42.579   Max.   :58.69   Max.   :0.330000   Max.   :1033.7  
##                   NA's   :299                        NA's   :51      
##      visib          time_hour                  
##  Min.   : 0.120   Min.   :2013-01-15 00:00:00  
##  1st Qu.:10.000   1st Qu.:2013-01-19 05:45:00  
##  Median :10.000   Median :2013-01-23 11:30:00  
##  Mean   : 8.779   Mean   :2013-01-23 11:30:00  
##  3rd Qu.:10.000   3rd Qu.:2013-01-27 17:15:00  
##  Max.   :10.000   Max.   :2013-01-31 23:00:00  
## 
#g4<- g3 %>% summarize_if(is.numeric, ~mean(.,na.rm=TRUE))
plot(g3$day, g3$temp, type="p",main="Distribución de la temperatura acorde a la fecha", xlab="Día", ylab="Temperatura")

Visualiza la tendencia de la temperatura durante los primeros 15 días del mes de Enero en los vuelos que parten del aeropuerto “Newark, EWR”, utilizar una gráfica de línea.  Visualiza la temperatura más frecuente en los primeros 15 días del mes de Enero, utilizar un histrograma.  Utiliza Facets para observar cómo varía la temperatura en cada mes en él histograma del punto anterior.  Número de vuelos que salieron de Nueva York en 2013 por aerolínea (mostrar solamente las 10 aerolíneas con más vuelos), utilizar gráfica de barras.  Visualiza el punto anterior en una gráfica de pie.  Relaciona el data frame fligths con el data frame airports a través del campo destino ¿cómo lograr estas relación?  Crea un nuevo data frame con el punto anterior únicamente con los 5 carriers con más vuelos por destino.

Compromiso ético y ciudadano
•Describe el valor de la integridad: La integridad es la práctica de ser una persona honesta, respetuosa, adherirse a nuestros valores y tomar sistemáticamente decisiones positivas, incluso cuando nadie esté mirando (Naciones Unidas. s. f.). Por lo tanto, actuar con integridad implica entender, aceptar, y escoger vivir conforme con principios éticos y morales, incluyendo la honestidad, la rectitud, y la decencia (Ethics Unwrapped. 2017, 17 febrero). También, ser íntegro implica que cada persona tenga el compromiso personal de serlo, de hacer las cosas correctamente y con cuidado cuando nadie nos está observando e inclusive procurar el bien ajeno aún a costa del propio (The College Board. 2020, 4 noviembre).
•Reflexión: Considero que puedo actuar con respeto y honestidad en los negocios mediante la definición de mis valores principales y la práctica de estos en acciones de mi día a día. También, puedo actuar con sinceridad en el uso de datos cuando realice análisis de datos y esté en contacto con los datos de una empresa, por medio, de la no alteración ni manipulación inmoral de los datos ya sea para reflejar un escenario conveniente para alguna ente.

Bibliografía de referencia
Wickham, H. and Grolemund, G. (2017) R for Data Science: Import, Tidy, Transform, Visualize, and Model Data O’Reilly Media: Sebastopol, California Nycflights13 v1.0.0 https://www.rdocumentation.org/packages/nycflights13/versions/1.0.0 Naciones Unidas. (s. f.). La Ciencia de la Integridad. Oficina de las Naciones Unidas contra la Droga y el Delito. https://www.unodc.org/unodc/es/listen-first/super-skills/integrity.html Ethics Unwrapped. (2017, 17 febrero). Integridad. https://ethicsunwrapped.utexas.edu/glossary/integridad?lang=es The College Board. (2020, 4 noviembre). La integridad como valor. College Board. https://latam.collegeboard.org/2020/07/01/la-integridad-como-valor/

LS0tDQp0aXRsZTogIlNpdHVhY2lvbiBQcm9ibGVtYSAyIg0KYXV0aG9yOiAiQXZyaWwgTG9iYXRvIC0gQTAwODMzMTEzIg0KZGF0ZTogIjIwMjMtMDMtMTciDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQo8aW1nIHNyYz0iQzpcXFVzZXJzXFxBVlJJTFxcUGljdHVyZXNcXDE2NzQwODIyNTNfOTkyMTAzXzE2NzQwODI2MDBfbm90aWNpYV9ub3JtYWwuanBnIj4NCg0KKipTaXR1YWNpw7NuIFByb2JsZW1hIDIqKiAgDQpUZSBhY2FiYXMgZGUgaW5jb3Jwb3JhciBhIHVuYSBlbXByZXNhIGNvbnN1bHRvcmEgZW4gSW50ZWxpZ2VuY2lhIGRlIE5lZ29jaW9zLCBhY3R1YWxtZW50ZSBlc3TDoW4gYnJpbmRhbmRvIHNlcnZpY2lvcyBkZSBhbsOhbGlzaXMgcGFyYSBsYSBpbmR1c3RyaWEgZGUgbGEgYXZpYWNpw7NuIHkgbGVzIGludGVyZXNhIHRlbmVyIGEgbGEgYWVyb2zDrW5lYSBBbWVyaWNhbiBBaXJsaW5lcyBjb21vIGNsaWVudGUgeWEgcXVlIGVzIHVuYSBkZSBsYXMgYWVyb2zDrW5lYXMgbMOtZGVyZXMgZW4gbG9zIGFlcm9wdWVydG9zIGRlIE51ZXZhIFlvcmssIG1vdGl2byBwb3IgZWwgY3XDoWwgdGUgaGFuIGNvbnRyYXRhZG8uICANClRlIGhhbiBwZWRpZG8gcXVlIGlkZW50aWZpcXVlcyBjw7NtbyBwdWVkZSBkaWNoYSBhZXJvbMOtbmVhIG1lam9yYXIgc3UgcG9zaWNpw7NuIGNvbXBldGl0aXZhICEhICANClBhcmEgaWRlbnRpZmljYXIgb3BvcnR1bmlkYWRlcyBkZSBtZWpvcmFyIGxhIHBvc2ljacOzbiBjb21wZXRpdGl2YSBkZSBsYSBhZXJvbMOtbmVhIEFtZXJpY2FuIEFpcmxpbmVzLCBuZWNlc2l0YXMgcmVhbGl6YXIgYWxndW5vcyBhbsOhbGlzaXMsIHBhcmEgZGV0ZXJtaW5hciBzaSBoYXkgdmFyaWFjaW9uZXMgZW4gbGEgcG9zaWNpw7NuIGRlIGxpZGVyYXpnbyBkZSBkaWNoYSBhZXJvbMOtbmVhDQoNCl9Nb2RlbG8gRW50aWRhZC1SZWxhY2nDs25fICANClNlIHRlIGhhIHNvbGljaXRhZG8gaGFjZXIgdW4gZXN0dWRpbyBzb2JyZSBsYSBzaXR1YWNpw7NuIGFjdHVhbCBkZSBsYSBhZXJvbMOtbmVhIEFtZXJpY2FuIEFpcmxpbmVzIHlhIHF1ZSBzZSBuZWNlc2l0YSByZXZpc2FyIHN1cyBkZXN0aW5vcywgaG9yYXJpb3MgeSBhdmlvbmVzIGNvbiBsb3MgcXVlIGN1ZW50YSBwYXJhIGhhY2VyIHByb3B1ZXN0YXMgZGUgYXVtZW50byBvIHJlZHVjY2nDs24gZGUgdnVlbG9zIHBvciBkZXN0aW5vIHkgaG9yYXJpb3MsIGFzw60gY29tbyBsYSBjYW50aWRhZCBkZSBhdmlvbmVzLiAgDQoNCl9Db25zdWx0YSB5IGVwbG9yYSBlbCBkYXRhZnJhbWUgcGxhbmVzIHkgd2VhdGhlciBwYXJhIHF1ZSBjb25vemNhcyBzdSBjb250ZW5pZG9fDQpgYGB7cn0NCmxpYnJhcnkobnljZmxpZ2h0czEzKQ0KI3ZpZXcocGxhbmVzKQ0KI3ZpZXcod2VhdGhlcikNCmBgYA0KDQpfU2UgbmVjZXNpdGEgc2FiZXIgZGUgY2FkYSB2dWVsbywgbGEgYWVyb2zDrW5lYSwgZWwgYWVyb3B1ZXJ0byBkZSBvcmlnZW4geSBlbCBhZXJvcHVlcnRvIGRlc3Rpbm9fICANCmBgYHtyfQ0Kc3VtbWFyeShwbGFuZXMpDQpsaWJyYXJ5KGRwbHlyKQ0KdnVlbG9zIDwtIHNlbGVjdChmbGlnaHRzLGZsaWdodCxjYXJyaWVyLG9yaWdpbixkZXN0KQ0KaGVhZCh2dWVsb3MpDQpgYGANCg0KX0VuIGxhIGNvbnN1bHRhIGFudGVyaW9yIHNlIG5lY2VzaXRhIGNvbm9jZXIgZWwgbm9tYnJlIGRlIGxhIGFlcm9sw61uZWFfDQpgYGB7cn0NCiNsZWZ0X2pvaW4oKQ0KYGBgDQoNCl9TZSBuZWNlc2l0YSBzYWJlciBsYSBjYW50aWRhZCBkZSB2dWVsb3MgcG9yIGNhZGEgZGVzdGlubyBwYXJhIGlkZW50aWZpY2FyIGN1YWxlcyBzb24gbG9zIGRlc3Rpbm9zIG3DoXMgYnVzY2Fkb3NfDQpgYGB7cn0NCmNvdW50KHZ1ZWxvcywgZGVzdCwgc29ydD1UUlVFKQ0KYGBgDQoNCl9BZ3JlZ2FyIGVsIG5vbWJyZSBkZSBsYSBhZXJvbMOtbmVhIGFsIGRhdGFmcmFtZSBhbnRlcmlvcl8NCmBgYHtyfQ0KI2xlZnRfam9pbigpDQpgYGANCg0KX1NlIG5lY2VzaXRhIGNvbm9jZXIgbGFzIGFlcm9sw61uZWFzIChjbGF2ZSB5IG5vbWJyZSkgeSBkZXN0aW5vcyBxdWUgdnVlbGFuIHBvciBsYSBNYcOxYW5hOiBkZSA2IGEgMTIsIFRhcmRlOiBkZSAxMiBhIDE5ICwgTm9jaGU6IGRlIDE5IGEgMjQgeSBNYWRydWdhZGEgZGUgMjQgYSA2Xw0KYGBge3J9DQpob3JhcmlvcyA8LSBzZWxlY3QoZmxpZ2h0cyxmbGlnaHQsY2Fycmllcixob3VyKQ0KaGVhZChob3JhcmlvcykNCiNob3JhcmlvcyRjYXRlZ29yaWEgPC0gaWYgKGZsaWdodHMkaG91cj49NiAmJiBmbGlnaHRzJGhvdXI8Mikgew0KICMgIk1hw7FhbmEiDQojfQ0KYGBgDQoNCl9BZ3JlZ2EgdW4gbnVldm8gY2FtcG8gYSBsYSB0YWJsYSBjb24gZWwgbm9tYnJlIGRlIGNsYXNfaG9yYXJpbyB5IGFncmVnYSwgbWHDsWFuYSwgdGFyZGUsIG5vY2hlIHkgbWFkcnVnYWRhIHNlZ8O6biBzZWEgZWwgY2Fzb18NCmBgYHtyfQ0KI2lmZWxzZQ0KYGBgDQoNCl9TZSBuZWNlc2l0YSBzYWJlciBsYSBjYW50aWRhZCBkZSB2dWVsb3MgcG9yIGFlcm9sw61uZWEgeSBkZXN0aW5vIHF1ZSBoYXkgcG9yIGxhIE1hw7FhbmEsIFRhcmRlLCBOb2NoZSB5IE1hZHJ1Z2FkYS5fDQpgYGB7cn0NCg0KYGBgDQoNCl9TZSBuZWNlc2l0YSBzYWJlciBhIHF1w6kgZGVzdGlub3MgdnVlbGEgbGEgYWVyb2zDrW5lYSBBbWVyaWNhbiBBaXJsaW5lcyBJbmMuLUFBIGR1cmFudGUgbGEgbWFkcnVnYWRhXw0KYGBge3J9DQpoZWFkKHBsYW5lcykNCmF2aW9uZXMgPC0gc2VsZWN0KHBsYW5lcyx0eXBlLCBlbmdpbmUsIHNlYXRzKQ0KdGFpbChhdmlvbmVzKQ0KDQpgYGANCl9JbWFnaW5hIHF1ZSBlbnRyZWdhcsOhcyBlc3RvcyBoYWxsYXpnb3MgYSB0dSBzdXBlcmlvciwgZWxhYm9yYSB1biByZXBvcnRlIGVqZWN1dGl2byB1dGlsaXphbmRvIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvc18gIA0KDQoqKlZpc3VhbGl6YWNpw7NuIGRlIGRhdG9zKiogIA0KRW4gbG9zIGF2YW5jZXMgYW50ZXJpb3JlcyBzZSBoYW4gcmVhbGl6YWRvIGRpZmVyZW50ZXMgYW7DoWxpc2lzIHkgYWhvcmEgbm9zIHNvbGljaXRhbiBoYWNlciB2aXN1YWxpemFjaW9uZXMgZGUgbGEgYWVyb2zDrW5lYSBBbWVyaWNhbiBBaXJsaW5lcyBwYXJhIGxvcyBlamVjdXRpdm9zIGNvbiBsYXMgc2lndWllbnRlcyBjYXJhY3RlcsOtc3RpY2FzLkRlbnRybyBkZSBsYXMgYWVyb2zDrW5lYXMgZWwgcmV0cmFzbyB0YW50byBlbiBsYSBob3JhIGRlIHBhcnRpZGEgY29tbyBlbiBsYSBob3JhIGRlIGxsZWdhZGEgYSBzdSBkZXN0aW5vIHZhbiBnZW5lcmFuZG8gaW5kaWNhZG9yZXMgbmVnYXRpdm9zLiAgDQoNCl9TZSBzb2xpY2l0YSBhbmFsaXphciBwYXJhIGxhIGFlcm9sw61uZWEgQW1lcmljYW4gQWlybGluZXMgc2kgbG9zIHZ1ZWxvcyBxdWUgdGllbmVuIHJldHJhc28gZW4gbGEgcGFydGlkYSB0YW1iacOpbiB0aWVuZW4gcmV0cmFzbyBlbiBsYSBob3JhIGRlIGxsZWdhZGFfICANCmBgYHtyfQ0KaGVhZCh3ZWF0aGVyKQ0KZzEgPC0gZmlsdGVyKHdlYXRoZXIsb3JpZ2luPT0iRVdSIikNCmhlYWQoZzEpDQpnMiA8LSBmaWx0ZXIoZzEsIGRheSA+PSAxNSkNCnN1bW1hcnkoZzIpDQpnMzwtIGZpbHRlcihnMixtb250aD09MSkNCnN1bW1hcnkoZzMpDQojZzQ8LSBnMyAlPiUgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIH5tZWFuKC4sbmEucm09VFJVRSkpDQpwbG90KGczJGRheSwgZzMkdGVtcCwgdHlwZT0icCIsbWFpbj0iRGlzdHJpYnVjacOzbiBkZSBsYSB0ZW1wZXJhdHVyYSBhY29yZGUgYSBsYSBmZWNoYSIsIHhsYWI9IkTDrWEiLCB5bGFiPSJUZW1wZXJhdHVyYSIpDQpgYGANCg0KVmlzdWFsaXphIGxhIHRlbmRlbmNpYSBkZSBsYSB0ZW1wZXJhdHVyYSBkdXJhbnRlIGxvcyBwcmltZXJvcyAxNSBkw61hcyBkZWwgbWVzIGRlIEVuZXJvIGVuIGxvcyB2dWVsb3MgcXVlIHBhcnRlbiBkZWwgYWVyb3B1ZXJ0byDigJxOZXdhcmssIEVXUuKAnSwgdXRpbGl6YXIgdW5hIGdyw6FmaWNhIGRlIGzDrW5lYS4NCu+CtyBWaXN1YWxpemEgbGEgdGVtcGVyYXR1cmEgbcOhcyBmcmVjdWVudGUgZW4gbG9zIHByaW1lcm9zIDE1IGTDrWFzIGRlbCBtZXMgZGUgRW5lcm8sIHV0aWxpemFyIHVuIGhpc3Ryb2dyYW1hLg0K74K3IFV0aWxpemEgRmFjZXRzIHBhcmEgb2JzZXJ2YXIgY8OzbW8gdmFyw61hIGxhIHRlbXBlcmF0dXJhIGVuIGNhZGEgbWVzIGVuIMOpbCBoaXN0b2dyYW1hIGRlbCBwdW50byBhbnRlcmlvci4NCu+CtyBOw7ptZXJvIGRlIHZ1ZWxvcyBxdWUgc2FsaWVyb24gZGUgTnVldmEgWW9yayBlbiAyMDEzIHBvciBhZXJvbMOtbmVhIChtb3N0cmFyIHNvbGFtZW50ZSBsYXMgMTAgYWVyb2zDrW5lYXMgY29uIG3DoXMgdnVlbG9zKSwgdXRpbGl6YXIgZ3LDoWZpY2EgZGUgYmFycmFzLg0K74K3IFZpc3VhbGl6YSBlbCBwdW50byBhbnRlcmlvciBlbiB1bmEgZ3LDoWZpY2EgZGUgcGllLg0K74K3IFJlbGFjaW9uYSBlbCBkYXRhIGZyYW1lIGZsaWd0aHMgY29uIGVsIGRhdGEgZnJhbWUgYWlycG9ydHMgYSB0cmF2w6lzIGRlbCBjYW1wbyBkZXN0aW5vIMK/Y8OzbW8gbG9ncmFyIGVzdGFzIHJlbGFjacOzbj8NCu+CtyBDcmVhIHVuIG51ZXZvIGRhdGEgZnJhbWUgY29uIGVsIHB1bnRvIGFudGVyaW9yIMO6bmljYW1lbnRlIGNvbiBsb3MgNSBjYXJyaWVycyBjb24gbcOhcyB2dWVsb3MgcG9yIGRlc3Rpbm8uDQoNCioqQ29tcHJvbWlzbyDDqXRpY28geSBjaXVkYWRhbm8qKiAgDQrigKJEZXNjcmliZSBlbCB2YWxvciBkZSBsYSBpbnRlZ3JpZGFkOiBMYSBpbnRlZ3JpZGFkIGVzIGxhIHByw6FjdGljYSBkZSBzZXIgdW5hIHBlcnNvbmEgaG9uZXN0YSwgcmVzcGV0dW9zYSwgYWRoZXJpcnNlIGEgbnVlc3Ryb3MgdmFsb3JlcyB5IHRvbWFyIHNpc3RlbcOhdGljYW1lbnRlIGRlY2lzaW9uZXMgcG9zaXRpdmFzLCBpbmNsdXNvIGN1YW5kbyBuYWRpZSBlc3TDqSBtaXJhbmRvIChOYWNpb25lcyBVbmlkYXMuIHMuIGYuKS4gUG9yIGxvIHRhbnRvLCBhY3R1YXIgY29uIGludGVncmlkYWQgaW1wbGljYSBlbnRlbmRlciwgYWNlcHRhciwgeSBlc2NvZ2VyIHZpdmlyIGNvbmZvcm1lIGNvbiBwcmluY2lwaW9zIMOpdGljb3MgeSBtb3JhbGVzLCBpbmNsdXllbmRvIGxhIGhvbmVzdGlkYWQsIGxhIHJlY3RpdHVkLCB5IGxhIGRlY2VuY2lhIChFdGhpY3MgVW53cmFwcGVkLiAyMDE3LCAxNyBmZWJyZXJvKS4gVGFtYmnDqW4sIHNlciDDrW50ZWdybyBpbXBsaWNhIHF1ZSBjYWRhIHBlcnNvbmEgdGVuZ2EgZWwgY29tcHJvbWlzbyBwZXJzb25hbCBkZSBzZXJsbywgZGUgaGFjZXIgbGFzIGNvc2FzIGNvcnJlY3RhbWVudGUgeSBjb24gY3VpZGFkbyBjdWFuZG8gbmFkaWUgbm9zIGVzdMOhIG9ic2VydmFuZG8gZSBpbmNsdXNpdmUgcHJvY3VyYXIgZWwgYmllbiBhamVubyBhw7puIGEgY29zdGEgZGVsIHByb3BpbyAoVGhlIENvbGxlZ2UgQm9hcmQuIDIwMjAsIDQgbm92aWVtYnJlKS4gIA0K4oCiUmVmbGV4acOzbjogQ29uc2lkZXJvIHF1ZSBwdWVkbyBhY3R1YXIgY29uIHJlc3BldG8geSBob25lc3RpZGFkIGVuIGxvcyBuZWdvY2lvcyBtZWRpYW50ZSBsYSBkZWZpbmljacOzbiBkZSBtaXMgdmFsb3JlcyBwcmluY2lwYWxlcyB5IGxhIHByw6FjdGljYSBkZSBlc3RvcyBlbiBhY2Npb25lcyBkZSBtaSBkw61hIGEgZMOtYS4gVGFtYmnDqW4sIHB1ZWRvIGFjdHVhciBjb24gc2luY2VyaWRhZCBlbiBlbCB1c28gZGUgZGF0b3MgY3VhbmRvIHJlYWxpY2UgYW7DoWxpc2lzIGRlIGRhdG9zIHkgZXN0w6kgZW4gY29udGFjdG8gY29uIGxvcyBkYXRvcyBkZSB1bmEgZW1wcmVzYSwgcG9yIG1lZGlvLCBkZSBsYSBubyBhbHRlcmFjacOzbiBuaSBtYW5pcHVsYWNpw7NuIGlubW9yYWwgZGUgbG9zIGRhdG9zIHlhIHNlYSBwYXJhIHJlZmxlamFyIHVuIGVzY2VuYXJpbyBjb252ZW5pZW50ZSBwYXJhIGFsZ3VuYSBlbnRlLiAgDQoNCioqQmlibGlvZ3JhZsOtYSBkZSByZWZlcmVuY2lhKiogIA0KV2lja2hhbSwgSC4gYW5kIEdyb2xlbXVuZCwgRy4gKDIwMTcpIFIgZm9yIERhdGEgU2NpZW5jZTogSW1wb3J0LCBUaWR5LCBUcmFuc2Zvcm0sIFZpc3VhbGl6ZSwgYW5kIE1vZGVsIERhdGEgT+KAmVJlaWxseSBNZWRpYTogU2ViYXN0b3BvbCwgQ2FsaWZvcm5pYQ0KTnljZmxpZ2h0czEzIHYxLjAuMCBodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvbnljZmxpZ2h0czEzL3ZlcnNpb25zLzEuMC4wIA0KTmFjaW9uZXMgVW5pZGFzLiAocy4gZi4pLiBMYSBDaWVuY2lhIGRlIGxhIEludGVncmlkYWQuIE9maWNpbmEgZGUgbGFzIE5hY2lvbmVzIFVuaWRhcyBjb250cmEgbGEgRHJvZ2EgeSBlbCBEZWxpdG8uIGh0dHBzOi8vd3d3LnVub2RjLm9yZy91bm9kYy9lcy9saXN0ZW4tZmlyc3Qvc3VwZXItc2tpbGxzL2ludGVncml0eS5odG1sDQpFdGhpY3MgVW53cmFwcGVkLiAoMjAxNywgMTcgZmVicmVybykuIEludGVncmlkYWQuIGh0dHBzOi8vZXRoaWNzdW53cmFwcGVkLnV0ZXhhcy5lZHUvZ2xvc3NhcnkvaW50ZWdyaWRhZD9sYW5nPWVzDQpUaGUgQ29sbGVnZSBCb2FyZC4gKDIwMjAsIDQgbm92aWVtYnJlKS4gTGEgaW50ZWdyaWRhZCBjb21vIHZhbG9yLiBDb2xsZWdlIEJvYXJkLiBodHRwczovL2xhdGFtLmNvbGxlZ2Vib2FyZC5vcmcvMjAyMC8wNy8wMS9sYS1pbnRlZ3JpZGFkLWNvbW8tdmFsb3Iv