Importar base de datos y cargar librerías

library(ggplot2)
library(foreign)
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
library(ggplot2)
library(psych)
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(corrplot)
## corrplot 0.92 loaded
library(jtools)
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:psych':
## 
##     logit
## The following object is masked from 'package:dplyr':
## 
##     recode
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(ggfortify)
library(Hmisc)
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## 
## Attaching package: 'Hmisc'
## The following object is masked from 'package:jtools':
## 
##     %nin%
## The following object is masked from 'package:psych':
## 
##     describe
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(olsrr)
## 
## Attaching package: 'olsrr'
## The following object is masked from 'package:datasets':
## 
##     rivers
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
#library(mirage)
#library(sd)
library(modeest)
## Registered S3 methods overwritten by 'rmutil':
##   method         from 
##   plot.residuals psych
##   print.response httr
#library(barplot)
#library(merge)
library(modeest)
library(forcats)
library(readr)
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(naniar)
library(dlookr)
## 
## Attaching package: 'dlookr'
## The following object is masked from 'package:modeest':
## 
##     skewness
## The following object is masked from 'package:Hmisc':
## 
##     describe
## The following object is masked from 'package:psych':
## 
##     describe
## The following object is masked from 'package:base':
## 
##     transform
library(tidyverse)
## Registered S3 methods overwritten by 'broom':
##   method            from  
##   tidy.glht         jtools
##   tidy.summary.glht jtools
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ tibble  3.1.8     ✔ purrr   0.3.4
## ✔ tidyr   1.2.1     ✔ stringr 1.4.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%()             masks ggplot2::%+%()
## ✖ psych::alpha()           masks ggplot2::alpha()
## ✖ lubridate::as.difftime() masks base::as.difftime()
## ✖ lubridate::date()        masks base::date()
## ✖ tidyr::extract()         masks dlookr::extract()
## ✖ dplyr::filter()          masks stats::filter()
## ✖ kableExtra::group_rows() masks dplyr::group_rows()
## ✖ lubridate::intersect()   masks base::intersect()
## ✖ dplyr::lag()             masks stats::lag()
## ✖ car::recode()            masks dplyr::recode()
## ✖ lubridate::setdiff()     masks base::setdiff()
## ✖ purrr::some()            masks car::some()
## ✖ Hmisc::src()             masks dplyr::src()
## ✖ Hmisc::summarize()       masks dplyr::summarize()
## ✖ lubridate::union()       masks base::union()
library(gmodels)
library(crosstable)
## 
## Attaching package: 'crosstable'
## 
## The following object is masked from 'package:purrr':
## 
##     compact
library(openxlsx)
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
#library(auto.arima)
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo 
## Registered S3 methods overwritten by 'forecast':
##   method                 from     
##   autoplot.Arima         ggfortify
##   autoplot.acf           ggfortify
##   autoplot.ar            ggfortify
##   autoplot.bats          ggfortify
##   autoplot.decomposed.ts ggfortify
##   autoplot.ets           ggfortify
##   autoplot.forecast      ggfortify
##   autoplot.stl           ggfortify
##   autoplot.ts            ggfortify
##   fitted.ar              ggfortify
##   fortify.ts             ggfortify
##   predict.default        statip   
##   residuals.ar           ggfortify
## 
## Attaching package: 'forecast'
## 
## The following object is masked from 'package:modeest':
## 
##     naive

¿Quién es Form?

FORM es una empresa mexicana dedicada a generar soluciones integrales de empaque para la industria automotriz. Fue fundada en el 2011 por Felipe Flores García y hoy en día cuenta con más de 130 empleados. FORM toma gran importancia a ser parte de un entorno sostenible, por lo que diseña empaques ecológicos generando un impacto positivo al medio ambiente, es por ello que su principal material es el cartón, con el cual obtienen el 50% de sus ganancias y representa el 90% de sus gastos y costos. Por ello la importancia de una buena logística y cadena de suministros en FORM, para optimizar y eficientizar y de ese modo tener rentabilidad.

1. Scrap

## Llamar base de datos.

SCRAP<- read.csv('FORM - Scrap Limpia .csv')
summary(SCRAP)
##   Referencia           Fecha               Hora             Producto        
##  Length:250         Length:250         Length:250         Length:250        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     Cantidad      Unidad.de.medida   Ubicación.de.origen Ubicación.de.desecho
##  Min.   : 0.000   Length:250         Length:250          Length:250          
##  1st Qu.: 1.000   Class :character   Class :character    Class :character    
##  Median : 2.000   Mode  :character   Mode  :character    Mode  :character    
##  Mean   : 6.696                                                              
##  3rd Qu.: 7.000                                                              
##  Max.   :96.000                                                              
##     Estado         
##  Length:250        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
## Estructura de la base de datos
str(SCRAP)
## 'data.frame':    250 obs. of  9 variables:
##  $ Referencia          : chr  "SP/08731" "SP/08730" "SP/08729" "SP/08728" ...
##  $ Fecha               : chr  "31/08/2022" "31/08/2022" "31/08/2022" "31/08/2022" ...
##  $ Hora                : chr  "14:55:40" "14:49:25" "13:49:29" "09:30:07" ...
##  $ Producto            : chr  "[BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado." "[N61506747 CAJA] N61506747. Kit. Caja." "[N61506729 SEPARADOR] N61506729. Kit. Separador." "[341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado." ...
##  $ Cantidad            : num  2 1 1 31 1 1 1 9 2 1 ...
##  $ Unidad.de.medida    : chr  "Unidad(es)" "Unidad(es)" "Unidad(es)" "Unidad(es)" ...
##  $ Ubicación.de.origen : chr  "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Pre-Production" ...
##  $ Ubicación.de.desecho: chr  "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" ...
##  $ Estado              : chr  "Hecho" "Hecho" "Hecho" "Hecho" ...
### ¿Cuántos NA's tengo en la base de datos?
#Debido a que en la base de datos no se encuentran Missing Values, en esta base de datos no se pueden remplazar valores por media, mediana y moda ya que no aplica. 

sum(is.na(SCRAP))
## [1] 0
#describe(SCRAP)

#**Nota:**En esta base de datos se eliminaron la columana que no era relevante para el analisis. Se eliminan Referencia, Producto, Unidad.de.medida, Ubicación.de.desecho, Estado, debido a que son irrelevantes, pues es el mismo dato para todos los registros.

bd1<- SCRAP
bd1<-subset(SCRAP,select=-c(Referencia, Unidad.de.medida , Ubicación.de.desecho, Estado))
str(bd1)
## 'data.frame':    250 obs. of  5 variables:
##  $ Fecha              : chr  "31/08/2022" "31/08/2022" "31/08/2022" "31/08/2022" ...
##  $ Hora               : chr  "14:55:40" "14:49:25" "13:49:29" "09:30:07" ...
##  $ Producto           : chr  "[BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado." "[N61506747 CAJA] N61506747. Kit. Caja." "[N61506729 SEPARADOR] N61506729. Kit. Separador." "[341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado." ...
##  $ Cantidad           : num  2 1 1 31 1 1 1 9 2 1 ...
##  $ Ubicación.de.origen: chr  "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Pre-Production" ...
summary(bd1)
##     Fecha               Hora             Producto            Cantidad     
##  Length:250         Length:250         Length:250         Min.   : 0.000  
##  Class :character   Class :character   Class :character   1st Qu.: 1.000  
##  Mode  :character   Mode  :character   Mode  :character   Median : 2.000  
##                                                           Mean   : 6.696  
##                                                           3rd Qu.: 7.000  
##                                                           Max.   :96.000  
##  Ubicación.de.origen
##  Length:250         
##  Class :character   
##  Mode  :character   
##                     
##                     
## 
## *2. *Para el caso de variables cuantitativas considerar la posibilidad de reemplazar la presencia de “missing values” con estadísticos descriptivos (por ejemplo, media, mediana, moda).*

bd1<-SCRAP
bd1
##     Referencia      Fecha     Hora
## 1     SP/08731 31/08/2022 14:55:40
## 2     SP/08730 31/08/2022 14:49:25
## 3     SP/08729 31/08/2022 13:49:29
## 4     SP/08728 31/08/2022 09:30:07
## 5     SP/08727 31/08/2022 09:28:44
## 6     SP/08726 31/08/2022 09:28:23
## 7     SP/08725 31/08/2022 09:27:12
## 8     SP/08724 31/08/2022 09:26:45
## 9     SP/08723 31/08/2022 09:26:24
## 10    SP/08722 31/08/2022 09:25:55
## 11    SP/08721 30/08/2022 16:28:42
## 12    SP/08720 30/08/2022 16:05:21
## 13    SP/08719 30/08/2022 16:00:24
## 14    SP/08718 30/08/2022 15:07:59
## 15    SP/08717 30/08/2022 10:17:38
## 16    SP/08716 30/08/2022 10:16:59
## 17    SP/08715 30/08/2022 10:16:10
## 18    SP/08714 30/08/2022 10:15:05
## 19    SP/08713 30/08/2022 10:13:56
## 20    SP/08712 30/08/2022 10:13:19
## 21    SP/08711 30/08/2022 10:12:49
## 22    SP/08710 30/08/2022 10:11:48
## 23    SP/08709 30/08/2022 10:10:59
## 24    SP/08708 30/08/2022 10:09:20
## 25    SP/08707 30/08/2022 10:07:33
## 26    SP/08706 30/08/2022 10:06:19
## 27    SP/08705 30/08/2022 10:04:46
## 28    SP/08704 29/08/2022 17:34:57
## 29    SP/08703 29/08/2022 17:15:27
## 30    SP/08702 29/08/2022 10:18:27
## 31    SP/08701 29/08/2022 10:16:55
## 32    SP/08700 29/08/2022 10:07:24
## 33    SP/08699 29/08/2022 10:05:44
## 34    SP/08698 29/08/2022 09:55:39
## 35    SP/08697 29/08/2022 09:54:47
## 36    SP/08696 27/08/2022 12:15:09
## 37    SP/08695 27/08/2022 09:18:25
## 38    SP/08694 27/08/2022 09:17:45
## 39    SP/08693 27/08/2022 09:16:54
## 40    SP/08692 27/08/2022 09:12:15
## 41    SP/08691 27/08/2022 09:11:49
## 42    SP/08690 27/08/2022 09:11:12
## 43    SP/08689 27/08/2022 09:10:29
## 44    SP/08688 27/08/2022 09:09:19
## 45    SP/08687 27/08/2022 09:08:39
## 46    SP/08686 27/08/2022 09:07:45
## 47    SP/08685 27/08/2022 09:02:50
## 48    SP/08684 26/08/2022 16:20:37
## 49    SP/08683 26/08/2022 16:08:40
## 50    SP/08682 26/08/2022 15:25:01
## 51    SP/08681 26/08/2022 15:22:42
## 52    SP/08680 26/08/2022 15:22:15
## 53    SP/08679 26/08/2022 15:21:27
## 54    SP/08678 26/08/2022 15:20:40
## 55    SP/08677 26/08/2022 15:20:01
## 56    SP/08676 26/08/2022 14:56:03
## 57    SP/08675 26/08/2022 13:30:24
## 58    SP/08674 26/08/2022 13:23:54
## 59    SP/08673 26/08/2022 11:52:10
## 60    SP/08672 25/08/2022 15:35:34
## 61    SP/08671 25/08/2022 15:17:16
## 62    SP/08670 25/08/2022 11:43:49
## 63    SP/08669 25/08/2022 11:28:42
## 64    SP/08668 25/08/2022 09:36:45
## 65    SP/08667 25/08/2022 09:36:05
## 66    SP/08666 25/08/2022 09:35:36
## 67    SP/08665 25/08/2022 09:34:42
## 68    SP/08664 25/08/2022 09:34:05
## 69    SP/08663 25/08/2022 09:32:55
## 70    SP/08662 25/08/2022 09:32:22
## 71    SP/08661 24/08/2022 18:03:05
## 72    SP/08660 24/08/2022 18:00:08
## 73    SP/08659 24/08/2022 17:58:41
## 74    SP/08658 24/08/2022 17:48:50
## 75    SP/08657 24/08/2022 15:58:57
## 76    SP/08656 24/08/2022 11:02:19
## 77    SP/08655 24/08/2022 11:01:19
## 78    SP/08654 24/08/2022 11:00:29
## 79    SP/08653 24/08/2022 10:59:36
## 80    SP/08652 24/08/2022 10:58:37
## 81    SP/08651 24/08/2022 10:58:03
## 82    SP/08650 24/08/2022 10:56:45
## 83    SP/08649 24/08/2022 10:55:49
## 84    SP/08648 24/08/2022 10:54:55
## 85    SP/08647 24/08/2022 10:26:18
## 86    SP/08646 24/08/2022 10:25:35
## 87    SP/08645 24/08/2022 10:24:22
## 88    SP/08644 24/08/2022 10:22:26
## 89    SP/08643 24/08/2022 10:20:59
## 90    SP/08642 24/08/2022 10:20:08
## 91    SP/08641 24/08/2022 10:19:19
## 92    SP/08640 23/08/2022 10:05:59
## 93    SP/08639 22/08/2022 17:40:44
## 94    SP/08638 22/08/2022 16:30:00
## 95    SP/08637 22/08/2022 16:29:32
## 96    SP/08636 22/08/2022 16:29:07
## 97    SP/08635 22/08/2022 16:27:49
## 98    SP/08634 22/08/2022 16:26:27
## 99    SP/08633 22/08/2022 16:25:02
## 100   SP/08632 22/08/2022 15:45:33
## 101   SP/08631 22/08/2022 15:20:59
## 102   SP/08629 22/08/2022 13:44:27
## 103   SP/08628 22/08/2022 13:34:05
## 104   SP/08627 20/08/2022 08:46:04
## 105   SP/08626 20/08/2022 08:45:38
## 106   SP/08625 20/08/2022 08:45:16
## 107   SP/08624 20/08/2022 08:44:52
## 108   SP/08623 20/08/2022 08:44:27
## 109   SP/08622 20/08/2022 08:44:04
## 110   SP/08621 20/08/2022 08:43:32
## 111   SP/08620 20/08/2022 08:43:05
## 112   SP/08619 20/08/2022 08:42:31
## 113   SP/08618 19/08/2022 14:53:52
## 114   SP/08617 19/08/2022 14:52:41
## 115   SP/08616 19/08/2022 14:51:37
## 116   SP/08615 19/08/2022 14:49:59
## 117   SP/08614 19/08/2022 14:49:09
## 118   SP/08613 19/08/2022 14:48:40
## 119   SP/08612 19/08/2022 14:47:56
## 120   SP/08611 19/08/2022 14:47:28
## 121   SP/08610 19/08/2022 14:46:53
## 122   SP/08609 19/08/2022 14:46:13
## 123   SP/08608 19/08/2022 14:45:32
## 124   SP/08607 19/08/2022 14:44:03
## 125   SP/08606 19/08/2022 14:43:30
## 126   SP/08605 19/08/2022 14:43:06
## 127   SP/08604 19/08/2022 14:42:24
## 128   SP/08603 19/08/2022 14:41:45
## 129   SP/08602 19/08/2022 14:40:24
## 130   SP/08601 17/08/2022 09:31:49
## 131   SP/08600 17/08/2022 09:31:23
## 132   SP/08599 17/08/2022 09:30:43
## 133   SP/08598 17/08/2022 09:29:26
## 134   SP/08597 17/08/2022 09:28:38
## 135   SP/08596 17/08/2022 09:27:55
## 136   SP/08595 17/08/2022 09:27:13
## 137   SP/08594 17/08/2022 09:26:03
## 138   SP/08593 17/08/2022 09:24:48
## 139   SP/08592 16/08/2022 12:12:11
## 140   SP/08591 16/08/2022 12:08:55
## 141   SP/08590 16/08/2022 12:02:36
## 142   SP/08589 16/08/2022 11:19:53
## 143   SP/08588 16/08/2022 11:19:05
## 144   SP/08587 16/08/2022 11:17:48
## 145   SP/08586 16/08/2022 11:17:20
## 146   SP/08585 16/08/2022 11:16:07
## 147   SP/08584 16/08/2022 11:15:39
## 148   SP/08583 16/08/2022 11:15:14
## 149   SP/08582 16/08/2022 11:14:22
## 150   SP/08581 16/08/2022 11:13:54
## 151   SP/08580 16/08/2022 11:12:45
## 152   SP/08579 16/08/2022 10:00:49
## 153   SP/08578 16/08/2022 10:00:09
## 154   SP/08577 16/08/2022 09:59:37
## 155   SP/08576 16/08/2022 09:58:07
## 156   SP/08575 16/08/2022 09:57:29
## 157   SP/08574 16/08/2022 09:56:17
## 158   SP/08573 16/08/2022 09:55:23
## 159   SP/08572 16/08/2022 09:54:29
## 160   SP/08570 16/08/2022 09:52:53
## 161   SP/08569 16/08/2022 09:18:31
## 162   SP/08568 16/08/2022 09:10:11
## 163   SP/08567 15/08/2022 15:21:45
## 164   SP/08566 15/08/2022 13:11:29
## 165   SP/08565 15/08/2022 13:06:40
## 166   SP/08564 15/08/2022 13:00:12
## 167   SP/08563 15/08/2022 12:58:17
## 168   SP/08561 15/08/2022 12:09:06
## 169   SP/08560 13/08/2022 13:43:01
## 170   SP/08559 13/08/2022 13:41:18
## 171   SP/08558 13/08/2022 13:31:32
## 172   SP/08557 13/08/2022 13:28:16
## 173   SP/08556 13/08/2022 11:34:45
## 174   SP/08555 12/08/2022 19:41:36
## 175   SP/08554 12/08/2022 19:40:41
## 176   SP/08553 12/08/2022 19:39:13
## 177   SP/08552 12/08/2022 19:38:15
## 178   SP/08551 12/08/2022 19:37:50
## 179   SP/08550 12/08/2022 19:36:34
## 180   SP/08549 12/08/2022 19:35:51
## 181   SP/08548 12/08/2022 19:35:29
## 182   SP/08547 12/08/2022 19:34:59
## 183   SP/08546 12/08/2022 19:01:07
## 184   SP/08545 12/08/2022 14:43:42
## 185   SP/08544 12/08/2022 13:27:35
## 186   SP/08543 11/08/2022 16:52:07
## 187   SP/08542 11/08/2022 16:50:54
## 188   SP/08541 11/08/2022 16:49:58
## 189   SP/08540 10/08/2022 19:19:54
## 190   SP/08539 10/08/2022 18:39:26
## 191   SP/08538 10/08/2022 18:32:47
## 192   SP/08537 10/08/2022 10:16:12
## 193   SP/08536 10/08/2022 10:14:28
## 194   SP/08535 10/08/2022 10:12:57
## 195   SP/08534 10/08/2022 10:12:24
## 196   SP/08533 10/08/2022 10:11:35
## 197   SP/08532 10/08/2022 10:11:04
## 198   SP/08531 10/08/2022 10:10:41
## 199   SP/08530 10/08/2022 10:10:15
## 200   SP/08529 10/08/2022 10:09:51
## 201   SP/08528 10/08/2022 10:09:13
## 202   SP/08527 09/08/2022 09:39:09
## 203   SP/08526 09/08/2022 09:38:47
## 204   SP/08525 09/08/2022 09:38:22
## 205   SP/08524 09/08/2022 09:38:01
## 206   SP/08523 09/08/2022 09:37:32
## 207   SP/08522 08/08/2022 14:21:26
## 208   SP/08521 08/08/2022 10:13:07
## 209   SP/08520 08/08/2022 10:12:26
## 210   SP/08519 08/08/2022 10:04:58
## 211   SP/08518 06/08/2022 13:30:19
## 212   SP/08517 06/08/2022 09:41:38
## 213   SP/08516 06/08/2022 09:41:19
## 214   SP/08515 06/08/2022 09:41:01
## 215   SP/08514 06/08/2022 09:40:42
## 216   SP/08513 06/08/2022 09:40:20
## 217   SP/08512 06/08/2022 09:35:25
## 218   SP/08511 05/08/2022 19:01:34
## 219   SP/08510 05/08/2022 18:58:23
## 220   SP/08509 05/08/2022 16:38:00
## 221   SP/08508 05/08/2022 10:31:45
## 222   SP/08507 05/08/2022 10:31:11
## 223   SP/08506 05/08/2022 10:30:25
## 224   SP/08505 05/08/2022 10:30:02
## 225   SP/08504 04/08/2022 16:50:43
## 226   SP/08503 04/08/2022 16:41:24
## 227   SP/08502 04/08/2022 09:37:35
## 228   SP/08501 04/08/2022 09:37:01
## 229   SP/08500 04/08/2022 09:36:03
## 230   SP/08499 04/08/2022 09:35:09
## 231   SP/08498 03/08/2022 16:21:28
## 232   SP/08497 03/08/2022 15:29:42
## 233   SP/08496 03/08/2022 14:08:15
## 234   SP/08495 03/08/2022 14:06:11
## 235   SP/08494 03/08/2022 12:17:50
## 236   SP/08493 03/08/2022 12:17:14
## 237   SP/08492 03/08/2022 12:16:51
## 238   SP/08491 03/08/2022 12:16:29
## 239   SP/08490 03/08/2022 12:15:37
## 240   SP/08489 03/08/2022 12:14:42
## 241   SP/08488 03/08/2022 12:14:22
## 242   SP/08487 03/08/2022 12:13:59
## 243   SP/08486 03/08/2022 12:13:29
## 244   SP/08485 02/08/2022 16:10:02
## 245   SP/08484 02/08/2022 16:05:42
## 246   SP/08483 02/08/2022 15:25:28
## 247   SP/08482 02/08/2022 13:28:40
## 248   SP/08481 02/08/2022 13:26:44
## 249   SP/08480 01/08/2022 16:36:24
## 250   SP/08479 01/08/2022 13:59:47
##                                                                                                  Producto
## 1                                      [BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado.
## 2                                                                  [N61506747 CAJA] N61506747. Kit. Caja.
## 3                                                        [N61506729 SEPARADOR] N61506729. Kit. Separador.
## 4                                  [341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado.
## 5                             [DIVISOR ZIGZAG VW CHATTANOOGA] Chattanooga. St1 y St3. Zig Zag Troquelado.
## 6                         [DIVISOR CON DOBLEZ VW CHATTANOOGA] Chattanooga. St1 y St3. Divisor Troquelado.
## 7                                    [CHAROLA VW CHATTANOOGA] Chattanooga. St1 y St3. Charola Troquelada.
## 8                                                                [CELDA 955061] 955061. Celda Troquelada.
## 9                                                                   [TAPA AVANAZAR] Avanzar. Tapa. Pieza.
## 10    [CAJA ( ARMREST / HR REAR) TMC 110 MODEL Y] 19148. Modelo Y. TMC0110. Armrest & Rear & Center. Caja
## 11                                 [642762 PACKING, SHEET, 565.2X742.9 - INSERT 642762] 642762. Pad. S.M.
## 12              [428818 AS 30 99 0000 00 000 INSERTO - CHRYSLER INSERT DJ] CHRYSLER INSERT DJ PART 694087
## 13                                             [Inserto Nextracker 3.0] Nextracker. 2.0. Damper. Inserto.
## 14                                                          [CELL C] 60% Backframe. Separador con Doblez.
## 15                                                 [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 16                                                [BOX 143907 - CELDA] 143907. Solares. Celda Troquelada.
## 17                                                 [INSERTO SOLARES] 143907. Solares. Inserto Troquelada.
## 18                                                  [BOX 143907 - TAPA] 143907. Solares. Tapa Troquelada.
## 19                        [DIVISOR CON DOBLEZ VW CHATTANOOGA] Chattanooga. St1 y St3. Divisor Troquelado.
## 20                            [DIVISOR ZIGZAG VW CHATTANOOGA] Chattanooga. St1 y St3. Zig Zag Troquelado.
## 21                                   [CHAROLA VW CHATTANOOGA] Chattanooga. St1 y St3. Charola Troquelada.
## 22              [428818 AS 30 99 0000 00 000 INSERTO - CHRYSLER INSERT DJ] CHRYSLER INSERT DJ PART 694087
## 23                                                 [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 24                                        [CAJA INDUSTRIAL 24" ROTATIVA COMPLETA] 24". Lamina Troquelada.
## 25                                                 [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 26                                                               [CAJA MCV] Toyota. MCV. Caja Troquelada.
## 27                                                                  [CAJA 95161] 19079. 95161. Kit. Caja.
## 28                              [939069 FS 30 99 0000 00 000 CARTÓN -BOX 939069 34"] 34". Caja Terminada.
## 29                                                                            [357790-TAPA] 357790. Tapa.
## 30                                                [BOX 143907 - CELDA] 143907. Solares. Celda Troquelada.
## 31                                 [341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado.
## 32                                     [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 33                                        [CAJA INDUSTRIAL 24" ROTATIVA COMPLETA] 24". Lamina Troquelada.
## 34                                                 [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 35        [643920 CART, SOM, 746.8X569.0X292.1, RSC - BOX 643920 STABOMAT] 13891. 643920. Stabomat. Caja.
## 36                                                           [SEAT BACK CELDADO] Seat Back. Celda Armada.
## 37                                                 [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 38                                                                 [TESLA XDA90 CELDA B] XDA90. B. Pieza.
## 39                                                                 [TESLA XDA90 CELDA A] XDA90. A. Pieza.
## 40                                     [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 41                                 [341332 CHAROLA - U611 & U625] 341332. U611. U625. Charola Troquelada.
## 42                        [DIVISOR CON DOBLEZ VW CHATTANOOGA] Chattanooga. St1 y St3. Divisor Troquelado.
## 43                            [DIVISOR ZIGZAG VW CHATTANOOGA] Chattanooga. St1 y St3. Zig Zag Troquelado.
## 44                                             [CELDA VW CHATTANOOGA] Chattanooga. St3. Celda Troquelada.
## 45                                   [CHAROLA VW CHATTANOOGA] Chattanooga. St1 y St3. Charola Troquelada.
## 46                                                                 [DIVISOR GM177] 14238. GM177. Divisor.
## 47                                                          [CELDA GM177] 14100. GM177. Celda Troquelada.
## 48                                                              [CAJA RSC SHOCK TOWER] Shock Tower. Caja.
## 49                                             [Inserto Nextracker 3.0] Nextracker. 2.0. Damper. Inserto.
## 50                                             [BACKFRAME 60% TAPA BASE] 18271. 60% Backframe. Tapa Base.
## 51                                           [CAJA INDUSTRIAL 48" CON SELLO (PP)] 48". Lamina Troquelada.
## 52                                                 [B - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. B. Pieza.
## 53                                                 [A - CELDA SUDAFRICA BMW G01 LCI] Sudafrica. A. Pieza.
## 54                                                                [TMC 050 - RSC] Console lower - TMC 050
## 55                                               [MITAD DE CUELLO SHOCK TOWER] Shock Tower. Mitad Cuello.
## 56                                                                 [241B EXPORT CAJA] 241B. Export. Caja.
## 57                                                                              [358268-TAPA] 358268-TAPA
## 58        [643920 CART, SOM, 746.8X569.0X292.1, RSC - BOX 643920 STABOMAT] 13891. 643920. Stabomat. Caja.
## 59                                                                              [358268-CAJA] 358268-CAJA
## 60                                             [Inserto Nextracker 3.0] Nextracker. 2.0. Damper. Inserto.
## 61                                                              [CAJA RSC SHOCK TOWER] Shock Tower. Caja.
## 62                                                                 [N61506747 CAJA] N61506747. Kit. Caja.
## 63                                                                 [TR12440 TAPA P558] 18842. P558. Tapa.
## 64                                                 [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 65                                                   [TESLA XDA90 CHAROLA SUAJADA] XDA90. Charola. Pieza.
## 66                                 [341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado.
## 67                                     [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 68                                                               [CELDA 955061] 955061. Celda Troquelada.
## 69                                                                 [DIVISOR GM177] 14238. GM177. Divisor.
## 70                                                 [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 71                                                                              [358268-TAPA] 358268-TAPA
## 72                                                                              [358268-CAJA] 358268-CAJA
## 73                                 [NEXTRACKER 2.0 DAMPER CUELLO] 18976. Nextracker. 2.0. Damper. Cuello,
## 74                  [NEXTRACKER 2.0 DAMPER TAPA DE COROPLAST] Nextracker. 2.0. Damper. Tapa de Coroplast.
## 75                                                [SEPARADOR MOTORGEAR] Motorgear. Separador para Celdas.
## 76                                                 [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 77                                                              [MQ4A-Dunnage-part2] Kia. Inserto. Pieza.
## 78                                                               [MQ4A-Dunnage-tray] Kia. Charola. Pieza.
## 79                                                [BOX 143907 - CELDA] 143907. Solares. Celda Troquelada.
## 80                                                  [CHAROLA AUDI Q5] 14128. Audi Q5. Charola Troquelada.
## 81                                                               [CELDA 955061] 955061. Celda Troquelada.
## 82                                                           [CHAROLA 955061] 955061. Charola Troquelada.
## 83                                                                              [CAJA 734949] CAJA 734949
## 84                                                 [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 85                                           [CAJA INDUSTRIAL 48" CON SELLO (PP)] 48". Lamina Troquelada.
## 86                                                              [MQ4A-Dunnage-part2] Kia. Inserto. Pieza.
## 87                                                               [MQ4A-Dunnage-tray] Kia. Charola. Pieza.
## 88                                                      [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 89                                                           [CHAROLA 955061] 955061. Charola Troquelada.
## 90                                                      [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 91                                                          [CELDA GM177] 14100. GM177. Celda Troquelada.
## 92                                                                            [CAJA 695] N61506695. Caja.
## 93                                                 [PTN.WS IP 60 CELL IBT] Y0199489 PTN.WS IP 60 CELL IBT
## 94                                 [341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado.
## 95                                     [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 96                                 [341332 CHAROLA - U611 & U625] 341332. U611. U625. Charola Troquelada.
## 97                                                           [CHAROLA 955061] 955061. Charola Troquelada.
## 98                                                      [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 99                                                  [CHAROLA AUDI Q5] 14128. Audi Q5. Charola Troquelada.
## 100                                                                           [357790-TAPA] 357790. Tapa.
## 101         [TR11910 CHAROLA C/2 DIV #20 SMOOTH C/32 CAVIDADES] TR11910. U725. DMS. ITB. Charola con ITB.
## 102     [SEPARADOR 41" X 44" PARA PIVOTE Y SEAT BACK DE MTM A PPG] SEPARADOR PIVOTE CONTENEDOR RETORNABLE
## 103                                        [496455 FS 30 99 0000 00 000 CARTÓN - BOX 0371813] BOX 0371813
## 104                                                [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 105                                [341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado.
## 106                                    [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 107                                [341332 CHAROLA - U611 & U625] 341332. U611. U625. Charola Troquelada.
## 108                                                 [DIVISOR AUDI Q5] 14234. Audi Q5. Divisor Troquelado.
## 109                                                     [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 110                                    [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 111                                                         [CELDA GM177] 14100. GM177. Celda Troquelada.
## 112                                                     [CHAROLA GM177] 14131. GM177. Charola Troquelada.
## 113                                                [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 114                                                [F - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. F. Pieza.
## 115                                                [D - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. D. Pieza.
## 116                                                [C - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. C. Pieza.
## 117                                                [B - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. B. Pieza.
## 118                                                [A - CELDA SUDAFRICA BMW G01 LCI] Sudafrica. A. Pieza.
## 119                                    [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 120                                                     [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 121                                                         [CELDA GM177] 14100. GM177. Celda Troquelada.
## 122                                                                 [TAPA AVANAZAR] Avanzar. Tapa. Pieza.
## 123                                                              [CELDA 955061] 955061. Celda Troquelada.
## 124                                          [CAJA INDUSTRIAL 48" CON SELLO (PP)] 48". Lamina Troquelada.
## 125                                    [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 126                                [341332 CHAROLA - U611 & U625] 341332. U611. U625. Charola Troquelada.
## 127                                                                [DIVISOR GM177] 14238. GM177. Divisor.
## 128                                                         [CELDA GM177] 14100. GM177. Celda Troquelada.
## 129                                                     [CHAROLA GM177] 14131. GM177. Charola Troquelada.
## 130                                          [CAJA INDUSTRIAL 48" CON SELLO (PP)] 48". Lamina Troquelada.
## 131                                                             [MQ4A-Dunnage-part2] Kia. Inserto. Pieza.
## 132                                                              [MQ4A-Dunnage-tray] Kia. Charola. Pieza.
## 133                                                    [Celda Audi coupe] 18892. Coupe. Celda Troquelada.
## 134                                                [Charola audi coupe] 18890. Coupe. Charola Troquelada.
## 135                                                [E - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. E. Pieza.
## 136                                                [C - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. C. Pieza.
## 137                                                [B - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. B. Pieza.
## 138                                                [A - CELDA SUDAFRICA BMW G01 LCI] Sudafrica. A. Pieza.
## 139                                                   [INSERTO 241B EXPORT] 14308. 241B. Export. Inserto.
## 140                                                                                [647713] 647713. Caja.
## 141                                                                           [357790-TAPA] 357790. Tapa.
## 142                                                                [TESLA XDA90 CELDA A] XDA90. A. Pieza.
## 143                                                  [TESLA XDA90 CHAROLA SUAJADA] XDA90. Charola. Pieza.
## 144                                    [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 145                                [341332 CHAROLA - U611 & U625] 341332. U611. U625. Charola Troquelada.
## 146                                                                [DIVISOR GM177] 14238. GM177. Divisor.
## 147                                        [HSC P702 ICP] 17215. P558. P702. CD539. ICP. Caja HSC. Pieza.
## 148                                                [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 149                                                         [CELDA GM177] 14100. GM177. Celda Troquelada.
## 150                                                     [CHAROLA GM177] 14131. GM177. Charola Troquelada.
## 151                                                [F - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. F. Pieza.
## 152                                                [D - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. D. Pieza.
## 153                                                                       [CAJA RSC TGTX] TGTX. Caja RSC.
## 154                                                                                [647713] 647713. Caja.
## 155                                                [F - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. F. Pieza.
## 156                                                [D - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. D. Pieza.
## 157                                                [E - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. E. Pieza.
## 158                                                [C - CELDA SUDAFRICA BMW G01 LCI] Sudáfrica. C. Pieza.
## 159                                    [341332 CELDA - U611 & U625] 341332. U611. U625. Celda Troquelada.
## 160                                                [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 161                                [642762 PACKING, SHEET, 565.2X742.9 - INSERT 642762] 642762. Pad. S.M.
## 162         [TR11910 CHAROLA C/2 DIV #20 SMOOTH C/32 CAVIDADES] TR11910. U725. DMS. ITB. Charola con ITB.
## 163                                                              [SEAT BACK CAJA] Seat Back. Caja HSC 1/2
## 164                                                                [DIVISOR REFLEX] 857. Reflex. Divisor.
## 165                                                           [CAJA RSC DE KIT REFLEX] 857. Reflex. Caja.
## 166                                                                     [N61506396 CAJA] N61506396. Caja.
## 167                                                           [N61506396 SEPARADOR] N61506396. Separador.
## 168                                                                            [CAJA 784] 784. Kit. Caja.
## 169 [500033 AS 30 99 0000 00 000 INSERTO - Inserto FORD China 500033] 17397. 500033. FORD China. Inserto.
## 170                  [429296 AS 30 99 0000 00 000 INSERTO - INSERT TMC 150 TESLA] 14783. TMC150. Inserto.
## 171                                [642762 PACKING, SHEET, 565.2X742.9 - INSERT 642762] 642762. Pad. S.M.
## 172                                [NEXTRACKER 2.0 DAMPER CUELLO] 18976. Nextracker. 2.0. Damper. Cuello,
## 173                       [467.416-24 COMPARTIMENT INSERT 535X335X221MM CC ESD] Refacciones. P1. Celdado.
## 174                                                 [DIVISOR AUDI Q5] 14234. Audi Q5. Divisor Troquelado.
## 175                                                     [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 176                                                [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 177                                                 [CHAROLA AUDI Q5] 14128. Audi Q5. Charola Troquelada.
## 178                                                                                [647713] 647713. Caja.
## 179                                                [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 180                                                     [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 181                                                 [CHAROLA AUDI Q5] 14128. Audi Q5. Charola Troquelada.
## 182                                                [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 183                 [NEXTRACKER 2.0 DAMPER TAPA DE COROPLAST] Nextracker. 2.0. Damper. Tapa de Coroplast.
## 184                                                                [N61506747 TAPA] N61506747. Kit. Tapa.
## 185                                                                            [CAJA 784] 784. Kit. Caja.
## 186                                                              [CELDA 955061] 955061. Celda Troquelada.
## 187                                                          [CHAROLA 955061] 955061. Charola Troquelada.
## 188                                                          [CHAROLA 955061] 955061. Charola Troquelada.
## 189     [REJILLA DE 16X PARA PIVOT DE TESLA PARA PROCESO DE MTM A PPG] CELDA PIVOTE CONTENEDOR RETORNABLE
## 190         [TR11910 CHAROLA C/2 DIV #20 SMOOTH C/32 CAVIDADES] TR11910. U725. DMS. ITB. Charola con ITB.
## 191                  [TR12438 TAPA ICP 539 TAPA 2415-2 EN CPARTÓN SENCILLO CORRUGADO] 18840. CD539. Tapa.
## 192                                          [CAJA INDUSTRIAL 48" CON SELLO (PP)] 48". Lamina Troquelada.
## 193                                                    [Celda Audi coupe] 18892. Coupe. Celda Troquelada.
## 194                                                 [DIVISOR AUDI Q5] 14234. Audi Q5. Divisor Troquelado.
## 195                                                     [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 196                                                              [CELDA 955061] 955061. Celda Troquelada.
## 197                                                [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 198                                        [HSC P702 ICP] 17215. P558. P702. CD539. ICP. Caja HSC. Pieza.
## 199                                                              [CAJA MCV] Toyota. MCV. Caja Troquelada.
## 200                                  [CHAROLA VW CHATTANOOGA] Chattanooga. St1 y St3. Charola Troquelada.
## 201                                                       [TMC 095] 19162. Modelo Y. TMC095. Front. Caja.
## 202                                                [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 203                                                [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 204                                        [HSC P702 ICP] 17215. P558. P702. CD539. ICP. Caja HSC. Pieza.
## 205                                                         [CELDA GM177] 14100. GM177. Celda Troquelada.
## 206                                                     [CHAROLA GM177] 14131. GM177. Charola Troquelada.
## 207                              [Caja backup canastilla gris] CAJA DE CARTÓN BACK UP CANASTILLA GRIS- P3
## 208                                          [CAJA INDUSTRIAL 48" CON SELLO (PP)] 48". Lamina Troquelada.
## 209                                                    [Celda Audi coupe] 18892. Coupe. Celda Troquelada.
## 210                                                [Charola audi coupe] 18890. Coupe. Charola Troquelada.
## 211          [446265 AS  30 99 0000 00 000 CAPA INTERMEDIA- PAD 43X36 DAIMLER] 14454. Daimler Pad 43 X 36
## 212                                                [CAJA INDUSTRIAL 16" ROTATIVA] 16". Lamina Troquelada.
## 213                                                                [TESLA XDA90 CELDA A] XDA90. A. Pieza.
## 214                                                                [DIVISOR GM177] 14238. GM177. Divisor.
## 215                                                         [CELDA GM177] 14100. GM177. Celda Troquelada.
## 216                                                     [CHAROLA GM177] 14131. GM177. Charola Troquelada.
## 217                                           [2065WY AS 30 99 0000 00 000 TAPA - BOX 2064WY] BOX  2064WY
## 218                                           [2065WY AS 30 99 0000 00 000 TAPA - BOX 2064WY] BOX  2064WY
## 219                                                   [INSERTO 241B EXPORT] 14308. 241B. Export. Inserto.
## 220                      [TR13776 CAJA RSC CK 44 ECT C/ PORTA ETIQUETA] TR13776. Caja con Porta Etiqueta.
## 221                                                     [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 222                                            [Inserto Nextracker 3.0] Nextracker. 2.0. Damper. Inserto.
## 223                                                         [CELDA GM177] 14100. GM177. Celda Troquelada.
## 224                                        [HSC P702 ICP] 17215. P558. P702. CD539. ICP. Caja HSC. Pieza.
## 225                                                       [TMC 095] 19162. Modelo Y. TMC095. Front. Caja.
## 226                                                              [SEAT BACK CAJA] Seat Back. Caja HSC 1/2
## 227                                          [CAJA INDUSTRIAL 48" CON SELLO (PP)] 48". Lamina Troquelada.
## 228             [428818 AS 30 99 0000 00 000 INSERTO - CHRYSLER INSERT DJ] CHRYSLER INSERT DJ PART 694087
## 229                                                                          [TMC XXX] Armrest. Caja RSC.
## 230                                                [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 231                   [428579 AS 30 99 0000 00 000 INSERTO- FORD DAMPER] 14306. Damper Ford DTP. Inserto.
## 232                                  [938830 FS 30 99 0000 00 000 CARTÓN - SIZE 24"] 24". Caja Terminada.
## 233                                                                     [N61506396 CAJA] N61506396. Caja.
## 234                                                                [N61506747 CAJA] N61506747. Kit. Caja.
## 235                                                [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 236                                                 [DIVISOR AUDI Q5] 14234. Audi Q5. Divisor Troquelado.
## 237                                                     [CELDA AUDI Q5] 14096. Audi Q5. Celda Troquelada.
## 238                                                 [CHAROLA AUDI Q5] 14128. Audi Q5. Charola Troquelada.
## 239                                                [CAJA INDUSTRIAL 34" ROTATIVA] 34". Lamina Troquelada.
## 240                                       [CAJA INDUSTRIAL 24" ROTATIVA COMPLETA] 24". Lamina Troquelada.
## 241                           [DIVISOR ZIGZAG VW CHATTANOOGA] Chattanooga. St1 y St3. Zig Zag Troquelado.
## 242                       [DIVISOR CON DOBLEZ VW CHATTANOOGA] Chattanooga. St1 y St3. Divisor Troquelado.
## 243                                  [CHAROLA VW CHATTANOOGA] Chattanooga. St1 y St3. Charola Troquelada.
## 244                                                           [Console cell] Console Lower. Celda Armada.
## 245                                                           [Console cell] Console Lower. Celda Armada.
## 246                      [CELDA CON MICRO CORUUGAD O EN 32 PORTA ETIQUETA] TR13777 KIT TGTX. Caja + Celda
## 247                                                                             [CAJA 726] N61506726 CAJA
## 248                                                                           [TAPA 695] N61506695. Tapa.
## 249          [446265 AS  30 99 0000 00 000 CAPA INTERMEDIA- PAD 43X36 DAIMLER] 14454. Daimler Pad 43 X 36
## 250                                                                [N61506747 TAPA] N61506747. Kit. Tapa.
##     Cantidad Unidad.de.medida       Ubicación.de.origen
## 1        2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 2        1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 3        1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 4       31.0       Unidad(es)        SAB/Pre-Production
## 5        1.0       Unidad(es)        SAB/Pre-Production
## 6        1.0       Unidad(es)        SAB/Pre-Production
## 7        1.0       Unidad(es)        SAB/Pre-Production
## 8        9.0       Unidad(es)        SAB/Pre-Production
## 9        2.0       Unidad(es)        SAB/Pre-Production
## 10       1.0       Unidad(es)        SAB/Pre-Production
## 11       4.0       Unidad(es) SAB/Calidad/Entrega de PT
## 12       2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 13      19.0       Unidad(es) SAB/Calidad/Entrega de PT
## 14       2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 15       1.0       Unidad(es)        SAB/Pre-Production
## 16      10.0       Unidad(es)        SAB/Pre-Production
## 17       4.0       Unidad(es)        SAB/Pre-Production
## 18       1.0       Unidad(es)        SAB/Pre-Production
## 19       3.0       Unidad(es)        SAB/Pre-Production
## 20       3.0       Unidad(es)        SAB/Pre-Production
## 21       4.0       Unidad(es)        SAB/Pre-Production
## 22       1.0       Unidad(es)        SAB/Pre-Production
## 23       6.0       Unidad(es)        SAB/Pre-Production
## 24       2.0       Unidad(es)        SAB/Pre-Production
## 25       2.0       Unidad(es)        SAB/Pre-Production
## 26       1.0       Unidad(es)        SAB/Pre-Production
## 27       1.0       Unidad(es)        SAB/Pre-Production
## 28       9.0       Unidad(es) SAB/Calidad/Entrega de PT
## 29       6.0       Unidad(es) SAB/Calidad/Entrega de PT
## 30      20.0       Unidad(es)        SAB/Pre-Production
## 31      10.0       Unidad(es)        SAB/Pre-Production
## 32      51.0       Unidad(es)        SAB/Pre-Production
## 33       2.0       Unidad(es)        SAB/Pre-Production
## 34       2.0       Unidad(es)        SAB/Pre-Production
## 35       2.5       Unidad(es)        SAB/Pre-Production
## 36       2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 37       5.0       Unidad(es)        SAB/Pre-Production
## 38       3.0       Unidad(es)        SAB/Pre-Production
## 39       2.0       Unidad(es)        SAB/Pre-Production
## 40      12.0       Unidad(es)        SAB/Pre-Production
## 41       2.0       Unidad(es)        SAB/Pre-Production
## 42       1.0       Unidad(es)        SAB/Pre-Production
## 43       1.0       Unidad(es)        SAB/Pre-Production
## 44       3.0       Unidad(es)        SAB/Pre-Production
## 45       2.0       Unidad(es)        SAB/Pre-Production
## 46       4.0       Unidad(es)        SAB/Pre-Production
## 47       4.0       Unidad(es)        SAB/Pre-Production
## 48       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 49       8.0       Unidad(es) SAB/Calidad/Entrega de PT
## 50       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 51       1.0       Unidad(es)        SAB/Pre-Production
## 52       3.0       Unidad(es)        SAB/Pre-Production
## 53       2.0       Unidad(es)        SAB/Pre-Production
## 54       1.0       Unidad(es)        SAB/Pre-Production
## 55       2.5       Unidad(es)        SAB/Pre-Production
## 56       2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 57       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 58       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 59       2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 60       2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 61       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 62       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 63       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 64       1.0       Unidad(es)        SAB/Pre-Production
## 65       2.0       Unidad(es)        SAB/Pre-Production
## 66       9.0       Unidad(es)        SAB/Pre-Production
## 67      19.0       Unidad(es)        SAB/Pre-Production
## 68       6.0       Unidad(es)        SAB/Pre-Production
## 69      36.0       Unidad(es)        SAB/Pre-Production
## 70      10.0       Unidad(es)        SAB/Pre-Production
## 71       2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 72       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 73       2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 74       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 75       1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 76       4.0       Unidad(es)        SAB/Pre-Production
## 77       6.0       Unidad(es)        SAB/Pre-Production
## 78       3.0       Unidad(es)        SAB/Pre-Production
## 79      10.0       Unidad(es)        SAB/Pre-Production
## 80       5.0       Unidad(es)        SAB/Pre-Production
## 81       9.0       Unidad(es)        SAB/Pre-Production
## 82       2.0       Unidad(es)        SAB/Pre-Production
## 83       2.0       Unidad(es)        SAB/Pre-Production
## 84       2.0       Unidad(es)        SAB/Pre-Production
## 85       3.0       Unidad(es)        SAB/Pre-Production
## 86       6.0       Unidad(es)        SAB/Pre-Production
## 87       3.0       Unidad(es)        SAB/Pre-Production
## 88      96.0       Unidad(es)        SAB/Pre-Production
## 89       1.0       Unidad(es)        SAB/Pre-Production
## 90      24.0       Unidad(es)        SAB/Pre-Production
## 91       8.0       Unidad(es)        SAB/Pre-Production
## 92       1.0       Unidad(es)       SAB/Post-Production
## 93       2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 94       1.0       Unidad(es)        SAB/Pre-Production
## 95       6.0       Unidad(es)        SAB/Pre-Production
## 96       7.0       Unidad(es)        SAB/Pre-Production
## 97       5.0       Unidad(es)        SAB/Pre-Production
## 98      40.0       Unidad(es)        SAB/Pre-Production
## 99       4.0       Unidad(es)        SAB/Pre-Production
## 100      4.0       Unidad(es)        SAB/Pre-Production
## 101      2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 102      6.0       Unidad(es) SAB/Calidad/Entrega de PT
## 103      1.0       Unidad(es)       SAB/Post-Production
## 104      1.0       Unidad(es)        SAB/Pre-Production
## 105      2.0       Unidad(es)        SAB/Pre-Production
## 106     12.0       Unidad(es)        SAB/Pre-Production
## 107      3.0       Unidad(es)        SAB/Pre-Production
## 108      1.0       Unidad(es)        SAB/Pre-Production
## 109     60.0       Unidad(es)        SAB/Pre-Production
## 110     20.0       Unidad(es)        SAB/Pre-Production
## 111     56.0       Unidad(es)        SAB/Pre-Production
## 112      1.0       Unidad(es)        SAB/Pre-Production
## 113      7.0       Unidad(es)        SAB/Pre-Production
## 114      4.0       Unidad(es)        SAB/Pre-Production
## 115      2.0       Unidad(es)        SAB/Pre-Production
## 116      2.0       Unidad(es)        SAB/Pre-Production
## 117      2.0       Unidad(es)        SAB/Pre-Production
## 118      2.0       Unidad(es)        SAB/Pre-Production
## 119     11.0       Unidad(es)        SAB/Pre-Production
## 120     24.0       Unidad(es)        SAB/Pre-Production
## 121     16.0       Unidad(es)        SAB/Pre-Production
## 122      2.0       Unidad(es)        SAB/Pre-Production
## 123     10.0       Unidad(es)        SAB/Pre-Production
## 124      6.0       Unidad(es)        SAB/Pre-Production
## 125     15.0       Unidad(es)        SAB/Pre-Production
## 126      2.0       Unidad(es)        SAB/Pre-Production
## 127      7.0       Unidad(es)        SAB/Pre-Production
## 128     15.0       Unidad(es)        SAB/Pre-Production
## 129      2.0       Unidad(es)        SAB/Pre-Production
## 130      1.0       Unidad(es)        SAB/Pre-Production
## 131      8.0       Unidad(es)        SAB/Pre-Production
## 132      4.0       Unidad(es)        SAB/Pre-Production
## 133     24.0       Unidad(es)        SAB/Pre-Production
## 134      1.0       Unidad(es)        SAB/Pre-Production
## 135      2.0       Unidad(es)        SAB/Pre-Production
## 136      2.0       Unidad(es)        SAB/Pre-Production
## 137      2.0       Unidad(es)        SAB/Pre-Production
## 138      2.0       Unidad(es)        SAB/Pre-Production
## 139      8.0       Unidad(es) SAB/Calidad/Entrega de PT
## 140      3.0       Unidad(es) SAB/Calidad/Entrega de PT
## 141      2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 142     18.0       Unidad(es)        SAB/Pre-Production
## 143      2.0       Unidad(es)        SAB/Pre-Production
## 144      9.0       Unidad(es)        SAB/Pre-Production
## 145      4.0       Unidad(es)        SAB/Pre-Production
## 146      6.0       Unidad(es)        SAB/Pre-Production
## 147      1.0       Unidad(es)        SAB/Pre-Production
## 148      3.0       Unidad(es)        SAB/Pre-Production
## 149      8.0       Unidad(es)        SAB/Pre-Production
## 150      2.0       Unidad(es)        SAB/Pre-Production
## 151      2.0       Unidad(es)        SAB/Pre-Production
## 152      2.0       Unidad(es)        SAB/Pre-Production
## 153      1.0       Unidad(es)        SAB/Pre-Production
## 154      2.0       Unidad(es)        SAB/Pre-Production
## 155     10.0       Unidad(es)        SAB/Pre-Production
## 156     20.0       Unidad(es)        SAB/Pre-Production
## 157     14.0       Unidad(es)        SAB/Pre-Production
## 158     24.0       Unidad(es)        SAB/Pre-Production
## 159     20.0       Unidad(es)        SAB/Pre-Production
## 160      2.0       Unidad(es)        SAB/Pre-Production
## 161      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 162      4.0       Unidad(es) SAB/Calidad/Entrega de PT
## 163      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 164      2.0       Unidad(es)       SAB/Post-Production
## 165      2.0       Unidad(es)       SAB/Post-Production
## 166      1.0       Unidad(es)       SAB/Post-Production
## 167      2.0       Unidad(es)       SAB/Post-Production
## 168      1.0       Unidad(es)       SAB/Post-Production
## 169      4.0       Unidad(es) SAB/Calidad/Entrega de PT
## 170      4.0       Unidad(es) SAB/Calidad/Entrega de PT
## 171      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 172      2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 173     13.0       Unidad(es) SAB/Calidad/Entrega de PT
## 174      5.0       Unidad(es)        SAB/Pre-Production
## 175     80.0       Unidad(es)        SAB/Pre-Production
## 176      1.0       Unidad(es)        SAB/Pre-Production
## 177      1.0       Unidad(es)        SAB/Pre-Production
## 178     12.0       Unidad(es)        SAB/Pre-Production
## 179      2.0       Unidad(es)        SAB/Pre-Production
## 180     48.0       Unidad(es)        SAB/Pre-Production
## 181      2.0       Unidad(es)        SAB/Pre-Production
## 182      1.0       Unidad(es)        SAB/Pre-Production
## 183      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 184      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 185      1.0       Unidad(es)       SAB/Post-Production
## 186     12.0       Unidad(es)        SAB/Pre-Production
## 187      3.0       Unidad(es)        SAB/Pre-Production
## 188      2.0       Unidad(es)        SAB/Pre-Production
## 189      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 190      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 191      2.0       Unidad(es)       SAB/Post-Production
## 192      2.0       Unidad(es)        SAB/Pre-Production
## 193      8.0       Unidad(es)        SAB/Pre-Production
## 194      1.0       Unidad(es)        SAB/Pre-Production
## 195     36.0       Unidad(es)        SAB/Pre-Production
## 196      9.0       Unidad(es)        SAB/Pre-Production
## 197      1.0       Unidad(es)        SAB/Pre-Production
## 198      1.0       Unidad(es)        SAB/Pre-Production
## 199      1.0       Unidad(es)        SAB/Pre-Production
## 200      1.0       Unidad(es)        SAB/Pre-Production
## 201      1.0       Unidad(es)        SAB/Pre-Production
## 202      2.0       Unidad(es)        SAB/Pre-Production
## 203      2.0       Unidad(es)        SAB/Pre-Production
## 204      1.0       Unidad(es)        SAB/Pre-Production
## 205      8.0       Unidad(es)        SAB/Pre-Production
## 206      2.0       Unidad(es)        SAB/Pre-Production
## 207      1.0       Unidad(es)       SAB/Post-Production
## 208      4.0       Unidad(es)        SAB/Pre-Production
## 209      8.0       Unidad(es)        SAB/Pre-Production
## 210      1.0       Unidad(es)        SAB/Pre-Production
## 211      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 212      1.0       Unidad(es)        SAB/Pre-Production
## 213     10.0       Unidad(es)        SAB/Pre-Production
## 214      4.0       Unidad(es)        SAB/Pre-Production
## 215     13.0       Unidad(es)        SAB/Pre-Production
## 216     10.0       Unidad(es)        SAB/Pre-Production
## 217     43.0       Unidad(es)        SAB/Pre-Production
## 218      6.0       Unidad(es) SAB/Calidad/Entrega de PT
## 219      2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 220      7.0       Unidad(es)       SAB/Post-Production
## 221     28.0       Unidad(es)        SAB/Pre-Production
## 222      6.0       Unidad(es)        SAB/Pre-Production
## 223     16.0       Unidad(es)        SAB/Pre-Production
## 224      2.0       Unidad(es)        SAB/Pre-Production
## 225      2.0       Unidad(es) SAB/Calidad/Entrega de PT
## 226      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 227      1.0       Unidad(es)        SAB/Pre-Production
## 228      1.0       Unidad(es)        SAB/Pre-Production
## 229      1.0       Unidad(es)        SAB/Pre-Production
## 230      2.0       Unidad(es)        SAB/Pre-Production
## 231      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 232      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 233      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 234      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 235      8.0       Unidad(es)        SAB/Pre-Production
## 236      3.0       Unidad(es)        SAB/Pre-Production
## 237     20.0       Unidad(es)        SAB/Pre-Production
## 238      1.0       Unidad(es)        SAB/Pre-Production
## 239      3.0       Unidad(es)        SAB/Pre-Production
## 240      8.0       Unidad(es)        SAB/Pre-Production
## 241      4.0       Unidad(es)        SAB/Pre-Production
## 242      4.0       Unidad(es)        SAB/Pre-Production
## 243      1.0       Unidad(es)        SAB/Pre-Production
## 244      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 245      0.0       Unidad(es) SAB/Calidad/Entrega de PT
## 246     15.0       Unidad(es) SAB/Calidad/Entrega de PT
## 247      1.0       Unidad(es)       SAB/Post-Production
## 248      1.0       Unidad(es)       SAB/Post-Production
## 249      1.0       Unidad(es) SAB/Calidad/Entrega de PT
## 250      1.0       Unidad(es) SAB/Calidad/Entrega de PT
##           Ubicación.de.desecho Estado
## 1   Virtual Locations/Scrapped  Hecho
## 2   Virtual Locations/Scrapped  Hecho
## 3   Virtual Locations/Scrapped  Hecho
## 4   Virtual Locations/Scrapped  Hecho
## 5   Virtual Locations/Scrapped  Hecho
## 6   Virtual Locations/Scrapped  Hecho
## 7   Virtual Locations/Scrapped  Hecho
## 8   Virtual Locations/Scrapped  Hecho
## 9   Virtual Locations/Scrapped  Hecho
## 10  Virtual Locations/Scrapped  Hecho
## 11  Virtual Locations/Scrapped  Hecho
## 12  Virtual Locations/Scrapped  Hecho
## 13  Virtual Locations/Scrapped  Hecho
## 14  Virtual Locations/Scrapped  Hecho
## 15  Virtual Locations/Scrapped  Hecho
## 16  Virtual Locations/Scrapped  Hecho
## 17  Virtual Locations/Scrapped  Hecho
## 18  Virtual Locations/Scrapped  Hecho
## 19  Virtual Locations/Scrapped  Hecho
## 20  Virtual Locations/Scrapped  Hecho
## 21  Virtual Locations/Scrapped  Hecho
## 22  Virtual Locations/Scrapped  Hecho
## 23  Virtual Locations/Scrapped  Hecho
## 24  Virtual Locations/Scrapped  Hecho
## 25  Virtual Locations/Scrapped  Hecho
## 26  Virtual Locations/Scrapped  Hecho
## 27  Virtual Locations/Scrapped  Hecho
## 28  Virtual Locations/Scrapped  Hecho
## 29  Virtual Locations/Scrapped  Hecho
## 30  Virtual Locations/Scrapped  Hecho
## 31  Virtual Locations/Scrapped  Hecho
## 32  Virtual Locations/Scrapped  Hecho
## 33  Virtual Locations/Scrapped  Hecho
## 34  Virtual Locations/Scrapped  Hecho
## 35  Virtual Locations/Scrapped  Hecho
## 36  Virtual Locations/Scrapped  Hecho
## 37  Virtual Locations/Scrapped  Hecho
## 38  Virtual Locations/Scrapped  Hecho
## 39  Virtual Locations/Scrapped  Hecho
## 40  Virtual Locations/Scrapped  Hecho
## 41  Virtual Locations/Scrapped  Hecho
## 42  Virtual Locations/Scrapped  Hecho
## 43  Virtual Locations/Scrapped  Hecho
## 44  Virtual Locations/Scrapped  Hecho
## 45  Virtual Locations/Scrapped  Hecho
## 46  Virtual Locations/Scrapped  Hecho
## 47  Virtual Locations/Scrapped  Hecho
## 48  Virtual Locations/Scrapped  Hecho
## 49  Virtual Locations/Scrapped  Hecho
## 50  Virtual Locations/Scrapped  Hecho
## 51  Virtual Locations/Scrapped  Hecho
## 52  Virtual Locations/Scrapped  Hecho
## 53  Virtual Locations/Scrapped  Hecho
## 54  Virtual Locations/Scrapped  Hecho
## 55  Virtual Locations/Scrapped  Hecho
## 56  Virtual Locations/Scrapped  Hecho
## 57  Virtual Locations/Scrapped  Hecho
## 58  Virtual Locations/Scrapped  Hecho
## 59  Virtual Locations/Scrapped  Hecho
## 60  Virtual Locations/Scrapped  Hecho
## 61  Virtual Locations/Scrapped  Hecho
## 62  Virtual Locations/Scrapped  Hecho
## 63  Virtual Locations/Scrapped  Hecho
## 64  Virtual Locations/Scrapped  Hecho
## 65  Virtual Locations/Scrapped  Hecho
## 66  Virtual Locations/Scrapped  Hecho
## 67  Virtual Locations/Scrapped  Hecho
## 68  Virtual Locations/Scrapped  Hecho
## 69  Virtual Locations/Scrapped  Hecho
## 70  Virtual Locations/Scrapped  Hecho
## 71  Virtual Locations/Scrapped  Hecho
## 72  Virtual Locations/Scrapped  Hecho
## 73  Virtual Locations/Scrapped  Hecho
## 74  Virtual Locations/Scrapped  Hecho
## 75  Virtual Locations/Scrapped  Hecho
## 76  Virtual Locations/Scrapped  Hecho
## 77  Virtual Locations/Scrapped  Hecho
## 78  Virtual Locations/Scrapped  Hecho
## 79  Virtual Locations/Scrapped  Hecho
## 80  Virtual Locations/Scrapped  Hecho
## 81  Virtual Locations/Scrapped  Hecho
## 82  Virtual Locations/Scrapped  Hecho
## 83  Virtual Locations/Scrapped  Hecho
## 84  Virtual Locations/Scrapped  Hecho
## 85  Virtual Locations/Scrapped  Hecho
## 86  Virtual Locations/Scrapped  Hecho
## 87  Virtual Locations/Scrapped  Hecho
## 88  Virtual Locations/Scrapped  Hecho
## 89  Virtual Locations/Scrapped  Hecho
## 90  Virtual Locations/Scrapped  Hecho
## 91  Virtual Locations/Scrapped  Hecho
## 92  Virtual Locations/Scrapped  Hecho
## 93  Virtual Locations/Scrapped  Hecho
## 94  Virtual Locations/Scrapped  Hecho
## 95  Virtual Locations/Scrapped  Hecho
## 96  Virtual Locations/Scrapped  Hecho
## 97  Virtual Locations/Scrapped  Hecho
## 98  Virtual Locations/Scrapped  Hecho
## 99  Virtual Locations/Scrapped  Hecho
## 100 Virtual Locations/Scrapped  Hecho
## 101 Virtual Locations/Scrapped  Hecho
## 102 Virtual Locations/Scrapped  Hecho
## 103 Virtual Locations/Scrapped  Hecho
## 104 Virtual Locations/Scrapped  Hecho
## 105 Virtual Locations/Scrapped  Hecho
## 106 Virtual Locations/Scrapped  Hecho
## 107 Virtual Locations/Scrapped  Hecho
## 108 Virtual Locations/Scrapped  Hecho
## 109 Virtual Locations/Scrapped  Hecho
## 110 Virtual Locations/Scrapped  Hecho
## 111 Virtual Locations/Scrapped  Hecho
## 112 Virtual Locations/Scrapped  Hecho
## 113 Virtual Locations/Scrapped  Hecho
## 114 Virtual Locations/Scrapped  Hecho
## 115 Virtual Locations/Scrapped  Hecho
## 116 Virtual Locations/Scrapped  Hecho
## 117 Virtual Locations/Scrapped  Hecho
## 118 Virtual Locations/Scrapped  Hecho
## 119 Virtual Locations/Scrapped  Hecho
## 120 Virtual Locations/Scrapped  Hecho
## 121 Virtual Locations/Scrapped  Hecho
## 122 Virtual Locations/Scrapped  Hecho
## 123 Virtual Locations/Scrapped  Hecho
## 124 Virtual Locations/Scrapped  Hecho
## 125 Virtual Locations/Scrapped  Hecho
## 126 Virtual Locations/Scrapped  Hecho
## 127 Virtual Locations/Scrapped  Hecho
## 128 Virtual Locations/Scrapped  Hecho
## 129 Virtual Locations/Scrapped  Hecho
## 130 Virtual Locations/Scrapped  Hecho
## 131 Virtual Locations/Scrapped  Hecho
## 132 Virtual Locations/Scrapped  Hecho
## 133 Virtual Locations/Scrapped  Hecho
## 134 Virtual Locations/Scrapped  Hecho
## 135 Virtual Locations/Scrapped  Hecho
## 136 Virtual Locations/Scrapped  Hecho
## 137 Virtual Locations/Scrapped  Hecho
## 138 Virtual Locations/Scrapped  Hecho
## 139 Virtual Locations/Scrapped  Hecho
## 140 Virtual Locations/Scrapped  Hecho
## 141 Virtual Locations/Scrapped  Hecho
## 142 Virtual Locations/Scrapped  Hecho
## 143 Virtual Locations/Scrapped  Hecho
## 144 Virtual Locations/Scrapped  Hecho
## 145 Virtual Locations/Scrapped  Hecho
## 146 Virtual Locations/Scrapped  Hecho
## 147 Virtual Locations/Scrapped  Hecho
## 148 Virtual Locations/Scrapped  Hecho
## 149 Virtual Locations/Scrapped  Hecho
## 150 Virtual Locations/Scrapped  Hecho
## 151 Virtual Locations/Scrapped  Hecho
## 152 Virtual Locations/Scrapped  Hecho
## 153 Virtual Locations/Scrapped  Hecho
## 154 Virtual Locations/Scrapped  Hecho
## 155 Virtual Locations/Scrapped  Hecho
## 156 Virtual Locations/Scrapped  Hecho
## 157 Virtual Locations/Scrapped  Hecho
## 158 Virtual Locations/Scrapped  Hecho
## 159 Virtual Locations/Scrapped  Hecho
## 160 Virtual Locations/Scrapped  Hecho
## 161 Virtual Locations/Scrapped  Hecho
## 162 Virtual Locations/Scrapped  Hecho
## 163 Virtual Locations/Scrapped  Hecho
## 164 Virtual Locations/Scrapped  Hecho
## 165 Virtual Locations/Scrapped  Hecho
## 166 Virtual Locations/Scrapped  Hecho
## 167 Virtual Locations/Scrapped  Hecho
## 168 Virtual Locations/Scrapped  Hecho
## 169 Virtual Locations/Scrapped  Hecho
## 170 Virtual Locations/Scrapped  Hecho
## 171 Virtual Locations/Scrapped  Hecho
## 172 Virtual Locations/Scrapped  Hecho
## 173 Virtual Locations/Scrapped  Hecho
## 174 Virtual Locations/Scrapped  Hecho
## 175 Virtual Locations/Scrapped  Hecho
## 176 Virtual Locations/Scrapped  Hecho
## 177 Virtual Locations/Scrapped  Hecho
## 178 Virtual Locations/Scrapped  Hecho
## 179 Virtual Locations/Scrapped  Hecho
## 180 Virtual Locations/Scrapped  Hecho
## 181 Virtual Locations/Scrapped  Hecho
## 182 Virtual Locations/Scrapped  Hecho
## 183 Virtual Locations/Scrapped  Hecho
## 184 Virtual Locations/Scrapped  Hecho
## 185 Virtual Locations/Scrapped  Hecho
## 186 Virtual Locations/Scrapped  Hecho
## 187 Virtual Locations/Scrapped  Hecho
## 188 Virtual Locations/Scrapped  Hecho
## 189 Virtual Locations/Scrapped  Hecho
## 190 Virtual Locations/Scrapped  Hecho
## 191 Virtual Locations/Scrapped  Hecho
## 192 Virtual Locations/Scrapped  Hecho
## 193 Virtual Locations/Scrapped  Hecho
## 194 Virtual Locations/Scrapped  Hecho
## 195 Virtual Locations/Scrapped  Hecho
## 196 Virtual Locations/Scrapped  Hecho
## 197 Virtual Locations/Scrapped  Hecho
## 198 Virtual Locations/Scrapped  Hecho
## 199 Virtual Locations/Scrapped  Hecho
## 200 Virtual Locations/Scrapped  Hecho
## 201 Virtual Locations/Scrapped  Hecho
## 202 Virtual Locations/Scrapped  Hecho
## 203 Virtual Locations/Scrapped  Hecho
## 204 Virtual Locations/Scrapped  Hecho
## 205 Virtual Locations/Scrapped  Hecho
## 206 Virtual Locations/Scrapped  Hecho
## 207 Virtual Locations/Scrapped  Hecho
## 208 Virtual Locations/Scrapped  Hecho
## 209 Virtual Locations/Scrapped  Hecho
## 210 Virtual Locations/Scrapped  Hecho
## 211 Virtual Locations/Scrapped  Hecho
## 212 Virtual Locations/Scrapped  Hecho
## 213 Virtual Locations/Scrapped  Hecho
## 214 Virtual Locations/Scrapped  Hecho
## 215 Virtual Locations/Scrapped  Hecho
## 216 Virtual Locations/Scrapped  Hecho
## 217 Virtual Locations/Scrapped  Hecho
## 218 Virtual Locations/Scrapped  Hecho
## 219 Virtual Locations/Scrapped  Hecho
## 220 Virtual Locations/Scrapped  Hecho
## 221 Virtual Locations/Scrapped  Hecho
## 222 Virtual Locations/Scrapped  Hecho
## 223 Virtual Locations/Scrapped  Hecho
## 224 Virtual Locations/Scrapped  Hecho
## 225 Virtual Locations/Scrapped  Hecho
## 226 Virtual Locations/Scrapped  Hecho
## 227 Virtual Locations/Scrapped  Hecho
## 228 Virtual Locations/Scrapped  Hecho
## 229 Virtual Locations/Scrapped  Hecho
## 230 Virtual Locations/Scrapped  Hecho
## 231 Virtual Locations/Scrapped  Hecho
## 232 Virtual Locations/Scrapped  Hecho
## 233 Virtual Locations/Scrapped  Hecho
## 234 Virtual Locations/Scrapped  Hecho
## 235 Virtual Locations/Scrapped  Hecho
## 236 Virtual Locations/Scrapped  Hecho
## 237 Virtual Locations/Scrapped  Hecho
## 238 Virtual Locations/Scrapped  Hecho
## 239 Virtual Locations/Scrapped  Hecho
## 240 Virtual Locations/Scrapped  Hecho
## 241 Virtual Locations/Scrapped  Hecho
## 242 Virtual Locations/Scrapped  Hecho
## 243 Virtual Locations/Scrapped  Hecho
## 244 Virtual Locations/Scrapped  Hecho
## 245 Virtual Locations/Scrapped  Hecho
## 246 Virtual Locations/Scrapped  Hecho
## 247 Virtual Locations/Scrapped  Hecho
## 248 Virtual Locations/Scrapped  Hecho
## 249 Virtual Locations/Scrapped  Hecho
## 250 Virtual Locations/Scrapped  Hecho
sum(is.na(bd1))
## [1] 0
sum(is.na(SCRAP))
## [1] 0
sapply(bd1, function(x) sum(is.na(x)))
##           Referencia                Fecha                 Hora 
##                    0                    0                    0 
##             Producto             Cantidad     Unidad.de.medida 
##                    0                    0                    0 
##  Ubicación.de.origen Ubicación.de.desecho               Estado 
##                    0                    0                    0
sapply(SCRAP, function(x) sum(is.na(x)))
##           Referencia                Fecha                 Hora 
##                    0                    0                    0 
##             Producto             Cantidad     Unidad.de.medida 
##                    0                    0                    0 
##  Ubicación.de.origen Ubicación.de.desecho               Estado 
##                    0                    0                    0
### Cambiar columnas y variables 

#seleccionar columnas / variables.
#bd1<-SCRAP %>% select(one_of("Fecha","Hora","Producto","Cantidad","Ubicación.de.origen"))

#Renombrar las columnas /variables seleccionadas. 
colnames(bd1) <-c ('Fecha','Hora','Prod.','Cant.','Origen')


# **Nota:** Se cambiaron los nombres de las variables a nombres más cortos para no contar con nombres largos.

## Tabla de estadísticos descriptivos

#summary(bd1)
#describe(bd1)


sd(bd1$Cantidad, na.rm= TRUE)  
## [1] NA
Variable<-c("Cant.")
Mediana<-c("2.00")
Media <- c("6.696")
Moda <- c("1") #EXCEL 
Desviación_estandar<-c("11.84885")
table1 <- data.frame (Variable, Mediana, Media, Moda, Desviación_estandar)
knitr::kable(table1)
Variable Mediana Media Moda Desviación_estandar
Cant. 2.00 6.696 1 11.84885
## Crear 1-2 “time series plots” (line plot) que muestran la dispersión de variables selecionadas.

summary(bd1)
##     Fecha               Hora              Prod.              Cant.          
##  Length:250         Length:250         Length:250         Length:250        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##      Origen            NA                 NA                 NA           
##  Min.   : 0.000   Length:250         Length:250         Length:250        
##  1st Qu.: 1.000   Class :character   Class :character   Class :character  
##  Median : 2.000   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 6.696                                                           
##  3rd Qu.: 7.000                                                           
##  Max.   :96.000                                                           
##       NA           
##  Length:250        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
ggplot(bd1,aes(x=Cant.))+
  geom_line(aes(y=Origen),color="Red")+
  labs(x="Cant",y="Origen", color="Legend")+
  ggtitle("Mayores cantidades de Scrap por origen")

# La gráfica anterior nos muestra que hay una mayor cantidad de 'scrap' generado en Pre-Producción, siguiéndole Entrega de Producto Terminado y finalmente Post-Producción. Esto nos indica que hay una ineficiencia mayor en el área pre-productiva.

2. Merma

## Llamar base de datos.

FORM<- read.csv('FORM - Merma limpia.csv')

## Entender Base de Datos
resumen <- summary(FORM)
resumen
##     Fecha               Kilos      
##  Length:42          Min.   : 1040  
##  Class :character   1st Qu.: 3682  
##  Mode  :character   Median : 4025  
##                     Mean   : 4415  
##                     3rd Qu.: 4325  
##                     Max.   :18900
## *1.¿Cuántas variables y cuántos registros tiene la base de datos?*
# <center> <span style="color:Blue"> R= 52 registros y 2 variables </center>
str(FORM)
## 'data.frame':    42 obs. of  2 variables:
##  $ Fecha: chr  "11/01/22" "22/01/22" "18/02/22" "24/02/22" ...
##  $ Kilos: num  8890 5670 18900 3930 4000 4190 2980 3290 4200 3810 ...
describe(FORM)
## # A tibble: 1 × 26
##   described_…¹     n    na  mean    sd se_mean   IQR skewn…² kurto…³   p00   p01
##   <chr>        <int> <int> <dbl> <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl> <dbl>
## 1 Kilos           42     0 4415. 2572.    397.  642.    4.61    25.6  1040 1487.
## # … with 15 more variables: p05 <dbl>, p10 <dbl>, p20 <dbl>, p25 <dbl>,
## #   p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>, p75 <dbl>,
## #   p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and abbreviated
## #   variable names ¹​described_variables, ²​skewness, ³​kurtosis
# **Nota:**En esta base de datos se eliminaron la columana que no era relevante para el analisis, Se eliminaron los registros de total de merma y la columna de mes ya que no eran irrelevantes. Por lo tanto nos quedamos con 52 registros y 2 variables.  

## *2.*Para el caso de variables cuantitativas considerar la posibilidad de reemplazar la presencia de “missing values” con estadísticos descriptivos (por ejemplo, media, mediana, moda).*
  

# Remplazar valores faltantes por la mediana: No se pueden cambair debido a que los NA´S de la base de datos no tienen información. Por lo tanto se van a Eliminar. 

FORM_1<-FORM
FORM_1<- na.omit(FORM_1)
summary(FORM_1)
##     Fecha               Kilos      
##  Length:42          Min.   : 1040  
##  Class :character   1st Qu.: 3682  
##  Mode  :character   Median : 4025  
##                     Mean   : 4415  
##                     3rd Qu.: 4325  
##                     Max.   :18900
summary(FORM) 
##     Fecha               Kilos      
##  Length:42          Min.   : 1040  
##  Class :character   1st Qu.: 3682  
##  Mode  :character   Median : 4025  
##                     Mean   : 4415  
##                     3rd Qu.: 4325  
##                     Max.   :18900
str(FORM)
## 'data.frame':    42 obs. of  2 variables:
##  $ Fecha: chr  "11/01/22" "22/01/22" "18/02/22" "24/02/22" ...
##  $ Kilos: num  8890 5670 18900 3930 4000 4190 2980 3290 4200 3810 ...
FORM$Kilos<-as.numeric(FORM$Kilos)
FORM<-FORM %>% mutate(Kilos=if_else(is.na(Kilos),median(Kilos,na.rm = T),Kilos))

# **Nota:**En esta base de datos la única variable que se puede reemplazar por la mediana es la columna de 'kilos'. Ya se remplazaron los valores faltantes por la mediana. 


## Cambiar nombres de columnas y variables

### Seleccionar columnas / variables.
FORM<-FORM %>% select(-one_of('Fecha','Kilos'))

### Renombrar las columnas /variables seleccionadas. 
colnames(FORM_1) <-c ('Fcha','Kilo')

# *Respecto a variables cualitativas (por ejemplo, género, cliente,municipio, estado) homogenizar el nombre de las diferentes categorías. *
  
  
# *Respecto a La base de datos analizada, no aplica el paso de homogenizar las variables, ya que en este caso sólo se cuenta con dos variables en la base de datos.* 
  
## Tabla de estadísticos descriptivos

summary(FORM_1)
##      Fcha                Kilo      
##  Length:42          Min.   : 1040  
##  Class :character   1st Qu.: 3682  
##  Mode  :character   Median : 4025  
##                     Mean   : 4415  
##                     3rd Qu.: 4325  
##                     Max.   :18900
sd(FORM_1$Kilo, na.rm = FALSE)
## [1] 2571.793
median(FORM_1$Kilo, na.rm = TRUE)
## [1] 4025
mean(FORM_1$Kilo, na.rm = TRUE)
## [1] 4414.905
sd(FORM_1$Kilo, na.rm = FALSE)
## [1] 2571.793
mfv(FORM_1$Kilo)
## [1] 3140 4190 4200
variable<-c("'Kilo")
Mediana<-c("4025")
Media <- c("4415")
Moda <- c("4190")
Desviación_estandar<-c("2571.793")
table1 <- data.frame (variable, Mediana, Media, Moda, Desviación_estandar)
knitr::kable(table1)
variable Mediana Media Moda Desviación_estandar
’Kilo 4025 4415 4190 2571.793
## Time Serie Plots

FORM_1$Fcha<-as.Date(FORM_1$Fcha,format="%d/%m/%y") 

summary(FORM_1)
##       Fcha                 Kilo      
##  Min.   :2022-01-11   Min.   : 1040  
##  1st Qu.:2022-04-05   1st Qu.: 3682  
##  Median :2022-06-11   Median : 4025  
##  Mean   :2022-06-04   Mean   : 4415  
##  3rd Qu.:2022-08-10   3rd Qu.: 4325  
##  Max.   :2022-09-21   Max.   :18900
ggplot(FORM_1,aes(x=Fcha))+
  geom_line(aes(y=Kilo),color="blue")+
  labs(x="Fecha",y="Kilo", color="Legend")+
  ggtitle("Kilos de merma por mes")

# La gráfica anterior muestra los kilos de merma generados por mes. De acuerdo a los datos, entre Febrero y Marzo se tuvo el pico más alto en merma y conforme fue avanzando el año, vemos que la merma ha disminuido considerablemente. En Abril, Agosto y Septiembre son las fechas en las que menos merma se generó.

3. Delivery Plan

## Importar la base de datos

delivery<- read.csv('1_DELIVERY.csv')
summary(delivery)
##     ID_Fecha        Fecha             CLIENTE             Pedidos       
##  Min.   : 1.00   Length:228         Length:228         Min.   :    0.0  
##  1st Qu.: 3.75   Class :character   Class :character   1st Qu.:    0.0  
##  Median : 6.50   Mode  :character   Mode  :character   Median :    0.0  
##  Mean   : 6.50                                         Mean   : 1703.1  
##  3rd Qu.: 9.25                                         3rd Qu.:  233.8  
##  Max.   :12.00                                         Max.   :52779.0
## ¿*Cuántas variables y registros hay?*
str(delivery)
## 'data.frame':    228 obs. of  4 variables:
##  $ ID_Fecha: int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Fecha   : chr  "31/01/22" "31/01/22" "31/01/22" "31/01/22" ...
##  $ CLIENTE : chr  "STB3" "STB 1" "YF RAMOS" "INOAC POLYTEC" ...
##  $ Pedidos : int  481 0 227 0 400 328 393 0 8975 449 ...
# *Contamos con 3 variables y 380 observaciones.* 
  
### *Contar total de pedidos por cliente*
deliverySUM = colSums(delivery[4])

as.data.frame(deliverySUM)
##         deliverySUM
## Pedidos      388317
# *Contamos con 52,0281 pedidos*

## Llamar base de datos.
deliveryCLIENTS<- read.csv('2 DeliveryCLIENTS.CSV')
summary(deliveryCLIENTS)
##     Fecha                STB3            STB.1           YF.RAMOS   
##  Length:19          Min.   :   0.0   Min.   : 0.000   Min.   :   0  
##  Class :character   1st Qu.:  13.5   1st Qu.: 0.000   1st Qu.:  54  
##  Mode  :character   Median : 200.0   Median : 0.000   Median : 100  
##                     Mean   : 297.1   Mean   : 2.632   Mean   : 211  
##                     3rd Qu.: 460.5   3rd Qu.: 0.000   3rd Qu.: 230  
##                     Max.   :1015.0   Max.   :50.000   Max.   :1243  
##  INOAC.POLYTEC       MERIDIAN     YANFENG.sm          YFTO       
##  Min.   : 0.000   Min.   :  0   Min.   :  0.00   Min.   : 138.0  
##  1st Qu.: 0.000   1st Qu.:  0   1st Qu.:  0.00   1st Qu.: 358.5  
##  Median : 0.000   Median :  0   Median : 41.00   Median : 628.0  
##  Mean   : 2.684   Mean   : 33   Mean   : 95.05   Mean   : 869.6  
##  3rd Qu.: 0.000   3rd Qu.:  0   3rd Qu.:142.50   3rd Qu.: 871.5  
##  Max.   :40.000   Max.   :400   Max.   :328.00   Max.   :2556.0  
##      YF.QRO            TRMX           DENSO           SEGROVE      
##  Min.   : 0.000   Min.   :    0   Min.   :   0.0   Min.   :  0.00  
##  1st Qu.: 0.000   1st Qu.: 2822   1st Qu.: 150.5   1st Qu.:  0.00  
##  Median : 0.000   Median : 6240   Median : 372.0   Median :  0.00  
##  Mean   : 2.737   Mean   : 5796   Mean   :1241.3   Mean   : 38.74  
##  3rd Qu.: 0.000   3rd Qu.: 8374   3rd Qu.:1083.0   3rd Qu.:  0.00  
##  Max.   :36.000   Max.   :11833   Max.   :8834.0   Max.   :736.00  
##      HANON        ANTOLIN.TOLUCA ANTOLIN.ARTEAGA     HELLA      
##  Min.   :  0.00   Min.   :0      Mode:logical    Min.   :    0  
##  1st Qu.:  0.00   1st Qu.:0      NA's:19         1st Qu.: 4160  
##  Median :  0.00   Median :0                      Median : 8580  
##  Mean   : 21.58   Mean   :0                      Mean   :15013  
##  3rd Qu.:  0.00   3rd Qu.:0                      3rd Qu.:21191  
##  Max.   :360.00   Max.   :0                      Max.   :52779  
##       UFI              ISRI            TRMX.1  ABC.QUERETARO        VARROC    
##  Min.   :  0.00   Min.   :   0.0   Min.   :0   Min.   :0.0000   Min.   :   0  
##  1st Qu.:  0.00   1st Qu.:   0.0   1st Qu.:0   1st Qu.:0.0000   1st Qu.:2078  
##  Median :  0.00   Median :   0.0   Median :0   Median :0.0000   Median :3509  
##  Mean   : 45.74   Mean   : 157.9   Mean   :0   Mean   :0.4211   Mean   :3555  
##  3rd Qu.:  3.50   3rd Qu.:   0.0   3rd Qu.:0   3rd Qu.:0.0000   3rd Qu.:4974  
##  Max.   :492.00   Max.   :3000.0   Max.   :0   Max.   :8.0000   Max.   :8810  
##  Total.pedidos.mes 
##  Length:19         
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
deliveryCLIENTS = colSums(deliveryCLIENTS[2:21])
as.data.frame(deliveryCLIENTS)
##                 deliveryCLIENTS
## STB3                       5644
## STB.1                        50
## YF.RAMOS                   4009
## INOAC.POLYTEC                51
## MERIDIAN                    627
## YANFENG.sm                 1806
## YFTO                      16522
## YF.QRO                       52
## TRMX                     110127
## DENSO                     23584
## SEGROVE                     736
## HANON                       410
## ANTOLIN.TOLUCA                0
## ANTOLIN.ARTEAGA              NA
## HELLA                    285238
## UFI                         869
## ISRI                       3000
## TRMX.1                        0
## ABC.QUERETARO                 8
## VARROC                    67548
barplot(deliveryCLIENTS)

# Con este plot podemos ver que hay muchos clientes con muy pocos pedidos.
  
  
## Técnicas de Limpieza** 
  
### Técnica 1: eliminar NA's
#  *Se decidió realizar está técnica para asegurarnos de que no se tenga falta de datos y en caso de tenerlos evitar que estas eviten tener un analisis asertivo al no agregar valor a la base de datos.*
  
### ¿Cuántos NA's tengo en la base de datos?
sum(is.na(delivery))
## [1] 0
### Cuantos NA tengo por variable?
#**Sapply:** Para contar los NA's.

sapply(delivery, function(x) sum(is.na(x)))
## ID_Fecha    Fecha  CLIENTE  Pedidos 
##        0        0        0        0
### Remover columnas

delivery1<-delivery

delivery1<-delivery1[delivery1$CLIENTE!="ANTOLIN ARTEAGA", ]
delivery1<-delivery1[delivery1$CLIENTE!="ANTOLIN TOLUCA", ]
delivery1<-delivery1[delivery1$CLIENTE!="STB.1", ]
delivery1<-delivery1[delivery1$CLIENTE!="TRMX.1", ]
delivery1<-delivery1[delivery1$CLIENTE!="ABC.QUERETARO", ]

## *Tabla de Media, Moda y Mediana
table3<-describe(delivery)
knitr::kable(table3)
described_variables n na mean sd se_mean IQR skewness kurtosis p00 p01 p05 p10 p20 p25 p30 p40 p50 p60 p70 p75 p80 p90 p95 p99 p100
ID_Fecha 228 0 6.500 3.459648 0.2291208 5.50 0.00000 -1.21711 1 1 1 2 3 3.75 4 5 6.5 8 9 9.25 10.0 11.0 12.0 12.00 12
Pedidos 228 0 1703.145 6164.036394 408.2232827 233.75 5.76176 38.35265 0 0 0 0 0 0.00 0 0 0.0 0 100 233.75 400.6 3876.4 8844.4 30339.47 52779
describe(delivery)
## # A tibble: 2 × 26
##   describe…¹     n    na   mean     sd se_mean   IQR skewn…² kurto…³   p00   p01
##   <chr>      <int> <int>  <dbl>  <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl> <dbl>
## 1 ID_Fecha     228     0    6.5 3.46e0   0.229   5.5    0      -1.22     1     1
## 2 Pedidos      228     0 1703.  6.16e3 408.    234.     5.76   38.4      0     0
## # … with 15 more variables: p05 <dbl>, p10 <dbl>, p20 <dbl>, p25 <dbl>,
## #   p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>, p75 <dbl>,
## #   p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and abbreviated
## #   variable names ¹​described_variables, ²​skewness, ³​kurtosis
## *Identificar variables* 

# **Cuantitativa:** Discreta, Continua
# **Escala de medición:**Intervalo, Razón 
# **Cualitativa**
# **Escala de medición:** Nominales, Ordinales

Variable<-c("Fecha","STB3","YFTO", "TRMX", "DENSO","HELLA","VARROC","Total.pedidos.mes")
Type<-c("Cuantitativa (discreta)", "Cualitativa", "Cualitativa", "Cualitativa","Cualitativa","Cualitativa","Cualitativa","Cuantitativa (discreta)")
Measurement<-c("Razón","Nominal","Nominal","Nominal","Nominal","Nominal","Nominal","Razón")
table2<-data_frame(Variable,Type,Measurement)
## Warning: `data_frame()` was deprecated in tibble 1.1.0.
## Please use `tibble()` instead.
knitr::kable(table2)
Variable Type Measurement
Fecha Cuantitativa (discreta) Razón
STB3 Cualitativa Nominal
YFTO Cualitativa Nominal
TRMX Cualitativa Nominal
DENSO Cualitativa Nominal
HELLA Cualitativa Nominal
VARROC Cualitativa Nominal
Total.pedidos.mes Cuantitativa (discreta) Razón
## <span style = "color:darkorange">**Gráfica Cualitativa** 

delivery2<-delivery1

delivery2<- aggregate(delivery2$Pedidos, by=list(category=delivery2$CLIENTE), FUN=sum)
pie(delivery2$x, labels = delivery2$category)

# Con esta gráfica podemos darnos cuenta de los clientes que tienen mayores pedidos y en este caso es HELLA en primer lugar y TRMX en segundo lugar.
  
## <span style = "color:darkorange">**Gráfica Cuantitativa** 

delivery2<-delivery2 %>% dplyr::rename(pedidos="x")
delivery2<-delivery2 %>% dplyr::rename(Clientes="category")

delivery2$Clientes<-as.factor(delivery2$Clientes)
ggplot(delivery2, aes(x=Clientes, y=pedidos, fill=pedidos))+
  geom_bar(stat="identity")+
  theme_minimal()+
  labs(title="Pedidos por cliente")

# Esta gráfica sirve para tener de manera más visual el impacto que tiene cada uno de los clientes en la empresa FORM. Podemos ver que HELLA es el cliente más significativo con casi el triple de pedidos que el siguiente cliente con mayores pedidos, TRMX. De lado derecho se tiene una leyenda que muestra la tonalidad de los 'plots' para ver qué tantos pedidos tiene. Por ello, HELLAS tiene un color azul claro, representando más de 250,000 pedidos.
  
## <span style = "color:darkorange">**Comportamiento de clientes por fecha** 

summary(delivery1)
##     ID_Fecha        Fecha             CLIENTE             Pedidos       
##  Min.   : 1.00   Length:204         Length:204         Min.   :    0.0  
##  1st Qu.: 3.75   Class :character   Class :character   1st Qu.:    0.0  
##  Median : 6.50   Mode  :character   Mode  :character   Median :    0.0  
##  Mean   : 6.50                                         Mean   : 1903.5  
##  3rd Qu.: 9.25                                         3rd Qu.:  311.2  
##  Max.   :12.00                                         Max.   :52779.0
ggplot(delivery1,aes(x=ID_Fecha, y=Pedidos, group=CLIENTE,colour=CLIENTE))+
  geom_line()+
  ggtitle("Pedidos por cliente")

# Con esta gráfica utilizamos el ID Fecha para conocer los pedidos que se tiene por cliente cada mes y vemos un significativo incremento de pedidos en los meses de Septiembre y Octubre. Contamos con una leyenda que indica cada línea con un color para nombrar la información de cada uno de los clientes. 
  
## <span style = "color:darkorange">**Gráfica Boxplot** 

boxplot(delivery1$Pedidos, main= "Pedidos")

delivery3<-delivery1
delivery3$CLIENTE <-as.factor(delivery3$CLIENTE)
ggplot(delivery3, aes(x=CLIENTE, y=Pedidos))+
  geom_boxplot(color="blue", fill="purple")

# En esta gráfica podemos visualizar cuántos pedidos tiene programados cada cliente y los clientes que sobre salen son HELLA y TRMX. Adicional, se muestra la moda de cada uno, así como la mínima de pedidos y la máxima.

4. Recursos Humanos

## Limpieza, Transformación y Organización de Bases de Datos

# *Nota: Como parte de la limpieza de datos de ambos documentos, se realizaron los promedios de los valores faltantes de forma manual en Excel.


# __A partir de esta parte del documento, el análisis estará dividido en dos partes. En la primera se analizará la base de datos con la información de los colaboradores actuales de la empresa, mientras que en la segunda se analizarán los datos de aquellos empleados que ya fueron bajas por motivos de despido, renuncia voluntaria, entre otros.__

### BASE DE DATOS: COLABORADORES DE RECURSOS HUMANOS

## 1. Número de registros y variables

### Importar base de datos

df1 <-read.csv('hr csv 1.csv')
summary(df1)
##  No..De.Empleado   APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  1.00   Length:113         Length:113         Length:113         
##  1st Qu.: 31.00   Class :character   Class :character   Class :character   
##  Median : 63.00   Mode  :character   Mode  :character   Mode  :character   
##  Mean   : 75.86                                                            
##  3rd Qu.:127.00                                                            
##  Max.   :169.00                                                            
##       EDAD          GENERO              RFC            FECHA.DE.ALTA     
##  Min.   : 0.00   Length:113         Length:113         Length:113        
##  1st Qu.:25.00   Class :character   Class :character   Class :character  
##  Median :33.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :35.74                                                           
##  3rd Qu.:45.00                                                           
##  Max.   :73.00                                                           
##   PRIMER.MES         CUARTO.MES             BAJA           PUESTO         
##  Length:113         Length:113         Min.   :0.0000   Length:113        
##  Class :character   Class :character   1st Qu.:0.0000   Class :character  
##  Mode  :character   Mode  :character   Median :0.0000   Mode  :character  
##                                        Mean   :0.3451                     
##                                        3rd Qu.:0.0000                     
##                                        Max.   :3.0000                     
##  DEPARTAMENTO       SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:113         Min.   :144.4       Min.   :     0       
##  Class :character   1st Qu.:176.7       1st Qu.:     0       
##  Mode  :character   Median :180.7       Median :     0       
##                     Mean   :181.2       Mean   :  2244       
##                     3rd Qu.:180.7       3rd Qu.:     0       
##                     Max.   :441.4       Max.   :182096       
##  N..CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP              CALLE          
##  Min.   :0.000e+00    Length:113          Length:113         Length:113        
##  1st Qu.:0.000e+00    Class :character    Class :character   Class :character  
##  Median :0.000e+00    Mode  :character    Mode  :character   Mode  :character  
##  Mean   :6.770e+07                                                             
##  3rd Qu.:0.000e+00                                                             
##  Max.   :1.922e+09                                                             
##  NUMERO.INTERNO       COLONIA           MUNICIPIO            ESTADO         
##  Length:113         Length:113         Length:113         Length:113        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  CODIGO.POSTAL   ESTADO.CIVIL       TARJETA.CUENTA        X          
##  Min.   :25016   Length:113         Length:113         Mode:logical  
##  1st Qu.:66640   Class :character   Class :character   NA's:113      
##  Median :66646   Mode  :character   Mode  :character                 
##  Mean   :63365                                                       
##  3rd Qu.:66649                                                       
##  Max.   :67493                                                       
##    X.1         
##  Mode:logical  
##  NA's:113      
##                
##                
##                
## 
### Tabla de Estadísticas
table_hr<-describe(df1)
knitr::kable(table_hr)
described_variables n na mean sd se_mean IQR skewness kurtosis p00 p01 p05 p10 p20 p25 p30 p40 p50 p60 p70 p75 p80 p90 p95 p99 p100
No..De.Empleado 113 0 7.585841e+01 5.387649e+01 5.068274e+00 96.00 0.3996039 -1.243295 1.00 2.12 6.60 12.20 24.40 31.00 36.60 47.80 63.00 79.40 110.20 127.00 143.20 157.80 163.400 1.678800e+02 1.69000e+02
EDAD 113 0 3.574336e+01 1.328585e+01 1.249828e+00 20.00 0.3976708 -0.310438 0.00 18.12 19.00 20.00 23.00 25.00 27.00 29.80 33.00 38.00 42.40 45.00 49.00 55.00 57.400 6.616000e+01 7.30000e+01
BAJA 113 0 3.451327e-01 9.614898e-01 9.044940e-02 0.00 2.4455291 4.052025 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3.00 3.000 3.000000e+00 3.00000e+00
SALARIO.DIARIO.IMSS 113 0 1.811764e+02 3.473107e+01 3.267225e+00 3.96 4.9257214 31.555773 144.45 144.45 151.61 151.61 176.72 176.72 176.72 180.68 180.68 180.68 180.68 180.68 180.68 180.68 221.474 3.301572e+02 4.41370e+02
FACTOR.CRED.INFONAVIT 113 0 2.243885e+03 1.791041e+04 1.684870e+03 0.00 9.4515613 93.474111 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.000 5.101812e+04 1.82096e+05
N..CREDITO.INFONAVIT 113 0 6.769777e+07 3.549686e+08 3.339264e+07 0.00 5.0965722 24.407079 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.000 1.912205e+09 1.92159e+09
CODIGO.POSTAL 113 0 6.336474e+04 1.120189e+04 1.053785e+03 9.00 -3.1379797 8.012458 25016.00 25091.24 25901.20 64845.60 66633.40 66640.00 66643.00 66646.00 66646.00 66646.00 66648.00 66649.00 66671.80 67117.00 67256.200 6.726700e+04 6.74930e+04
describe(df1)
## # A tibble: 7 × 26
##   described_v…¹     n    na    mean      sd se_mean   IQR skewn…² kurto…³    p00
##   <chr>         <int> <int>   <dbl>   <dbl>   <dbl> <dbl>   <dbl>   <dbl>  <dbl>
## 1 No..De.Emple…   113     0 7.59e+1 5.39e+1 5.07e+0 96      0.400  -1.24      1 
## 2 EDAD            113     0 3.57e+1 1.33e+1 1.25e+0 20      0.398  -0.310     0 
## 3 BAJA            113     0 3.45e-1 9.61e-1 9.04e-2  0      2.45    4.05      0 
## 4 SALARIO.DIAR…   113     0 1.81e+2 3.47e+1 3.27e+0  3.96   4.93   31.6     144.
## 5 FACTOR.CRED.…   113     0 2.24e+3 1.79e+4 1.68e+3  0      9.45   93.5       0 
## 6 N..CREDITO.I…   113     0 6.77e+7 3.55e+8 3.34e+7  0      5.10   24.4       0 
## 7 CODIGO.POSTAL   113     0 6.34e+4 1.12e+4 1.05e+3  9     -3.14    8.01  25016 
## # … with 16 more variables: p01 <dbl>, p05 <dbl>, p10 <dbl>, p20 <dbl>,
## #   p25 <dbl>, p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>,
## #   p75 <dbl>, p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and
## #   abbreviated variable names ¹​described_variables, ²​skewness, ³​kurtosis
## 2. Clasificación de variables

variable<-c("No..De.Empleado","APELLIDOS","NOMBRE","FECHA.DE.NACIMIENTO","EDAD","GENERO","RFC","FECHA.DE.ALTA","PRIMER.MES","CUARTO.MES","BAJA","PUESTO","DEPARTAMENTO","SALARIO.DIARIO.IMSS","FACTOR.CRED.INFONAVIT","N..CREDITO.INFONAVIT","LUGAR.DE.NACIMIENTO","CURP","CALLE","NUMERO.INTERNO","COLONIA","MUNICIPIO","ESTADO","CODIGO.POSTAL","ESTADO.CIVIL","TARJETA.CUENTA")
Type<-c(
  "quantitative (continous)",
  "qualitative (discrete)",
  "qualitative (discrete)",
  "qualitative (discrete)",
  "quantitative (continous)",
  "qualitative (discrete)",
  "qualitative (discrete)",
  "quantitative (continous)",
  "quantitative (continous)",
  "quantitative (continous)",
  "quantitative (continous)",
  "qualitative (discrete)",
  "qualitative (discrete)",
  "quantitative (continous)",
  "quantitative (continous)",
  "qualitative (discrete)",
  "qualitative (discrete)",
  "qualitative (discrete)",
  "qualitative (discrete)",
  "quantitative (continous)",
  "qualitative (discrete)",
  "qualitative (discrete)",
  "qualitative (discrete)",
  "quanitative (continous)",
  "qualitative (discrete)",
  "qualitative (discrete)"
)

table<-data.frame(variable,Type)
knitr::kable(table)
variable Type
No..De.Empleado quantitative (continous)
APELLIDOS qualitative (discrete)
NOMBRE qualitative (discrete)
FECHA.DE.NACIMIENTO qualitative (discrete)
EDAD quantitative (continous)
GENERO qualitative (discrete)
RFC qualitative (discrete)
FECHA.DE.ALTA quantitative (continous)
PRIMER.MES quantitative (continous)
CUARTO.MES quantitative (continous)
BAJA quantitative (continous)
PUESTO qualitative (discrete)
DEPARTAMENTO qualitative (discrete)
SALARIO.DIARIO.IMSS quantitative (continous)
FACTOR.CRED.INFONAVIT quantitative (continous)
N..CREDITO.INFONAVIT qualitative (discrete)
LUGAR.DE.NACIMIENTO qualitative (discrete)
CURP qualitative (discrete)
CALLE qualitative (discrete)
NUMERO.INTERNO quantitative (continous)
COLONIA qualitative (discrete)
MUNICIPIO qualitative (discrete)
ESTADO qualitative (discrete)
CODIGO.POSTAL quanitative (continous)
ESTADO.CIVIL qualitative (discrete)
TARJETA.CUENTA qualitative (discrete)
## 3. Escalas de medición

variables <- c(
  "No..De.Empleado",
  "APELLIDOS",
  "NOMBRE",
  "FECHA.DE.NACIMIENTO",
  "EDAD",
  "GENERO",
  "RFC",
  "FECHA.DE.ALTA",
  "PRIMER.MES",
  "CUARTO.MES",
  "BAJA",
  "PUESTO",
  "DEPARTAMENTO",
  "SALARIO.DIARIO.IMSS",
  "FACTOR.CRED.INFONAVIT",
  "N..CREDITO.INFONAVIT",
  "LUGAR.DE.NACIMIENTO",
  "CURP",
  "CALLE",
  "NUMERO.INTERNO",
  "COLONIA",
  "MUNICIPIO",
  "ESTADO",
  "CODIGO.POSTAL",
  "ESTADO.CIVIL",
  "TARJETA.CUENTA"
)

tipos <- c(
  "Cuantitativo",
  "Cualitativo",
  "Cualitativo",
  "Cualitativo",
  "Cuantitativo",
  "Cualitativo",
  "Cualitativo",
  "Cuantitativo",
  "Cuantitativo",
  "Cuantitativo",
  "Cuantitativo",
  "Cualitativo",
  "Cualitativo",
  "Cuantitativo",
  "Cuantitativo",
  "Cualitativo",
  "Cualitativo",
  "Cualitativo",
  "Cualitativo",
  "Cuantitativo",
  "Cualitativo",
  "Cualitativo",
  "Cualitativo",
  "Cuantitativo",
  "Cualitativo",
  "Cualitativo"
)

escalas <- c(
  "Intervalo",
  "Nominal",
  "Nominal",
  "Intervalo",
  "Intervalo",
  "Nominal",
  "Nominal",
  "Razón",
  "Razón",
  "Razón",
  "Razón",
  "Ordinal",
  "Nominal",
  "Razón",
  "Razón",
  "Nominal",
  "Nominal",
  "Nominal",
  "Nominal",
  "Razón",
  "Nominal",
  "Nominal",
  "Nominal",
  "Ordinal",
  "Nominal",
  "Nominal"
)

table1 <- data.frame (variables, tipos, escalas)
knitr::kable(table1)
variables tipos escalas
No..De.Empleado Cuantitativo Intervalo
APELLIDOS Cualitativo Nominal
NOMBRE Cualitativo Nominal
FECHA.DE.NACIMIENTO Cualitativo Intervalo
EDAD Cuantitativo Intervalo
GENERO Cualitativo Nominal
RFC Cualitativo Nominal
FECHA.DE.ALTA Cuantitativo Razón
PRIMER.MES Cuantitativo Razón
CUARTO.MES Cuantitativo Razón
BAJA Cuantitativo Razón
PUESTO Cualitativo Ordinal
DEPARTAMENTO Cualitativo Nominal
SALARIO.DIARIO.IMSS Cuantitativo Razón
FACTOR.CRED.INFONAVIT Cuantitativo Razón
N..CREDITO.INFONAVIT Cualitativo Nominal
LUGAR.DE.NACIMIENTO Cualitativo Nominal
CURP Cualitativo Nominal
CALLE Cualitativo Nominal
NUMERO.INTERNO Cuantitativo Razón
COLONIA Cualitativo Nominal
MUNICIPIO Cualitativo Nominal
ESTADO Cualitativo Nominal
CODIGO.POSTAL Cuantitativo Ordinal
ESTADO.CIVIL Cualitativo Nominal
TARJETA.CUENTA Cualitativo Nominal
#Las escalas de medición permiten organizar datos en orden jerárquico. Éstas pueden ser clasificadas de acuerdo a una degradación de las características de distintas variables. Entre las variables usadas están nominal (aquellas que son mutuamente excluyentes y no asignan un orden o jerarquía), ordinal (establecen un orden, puede ser creciente o decreciente), intervalo (establecen un orden determinado por un intervalo numérico) y razón (existe un intervalo numérico; el cero representa la ausencia de valor; es un cero absoluto).

## 4. Limpieza de datos

# Remover valores irrelevantes (eliminar renglones duplicados) y conversión de datos son técnicas elegidas para realizar la limpieza de datos debido a las necesidades de la base de datos y el beneficio que generó para el análisis descriptivo, obteniendo información más clara y concisa.


### Eliminar renglones duplicados
df2<-df1
df2<-distinct(df2)

### ¿Cuántos NA's tengo en la base de datos? Primera limpieza
sum(is.na(df2))
## [1] 226
### Eliminar columnas
df3<-df2
df3 <- subset(df3, select =-c (X))
df3 <- subset(df3, select =-c (X.1))
df3 <- subset(df3, select =-c (NOMBRE))
df3 <- subset(df3, select =-c (APELLIDOS))
df3 <- subset(df3, select =-c (RFC))
df3 <- subset(df3, select =-c (CUARTO.MES))
df3 <- subset(df3, select =-c (FACTOR.CRED.INFONAVIT))
df3 <- subset(df3, select =-c (CURP))
df3 <- subset(df3, select =-c (CALLE))
df3 <- subset(df3, select =-c (NUMERO.INTERNO))
df3 <- subset(df3, select =-c (TARJETA.CUENTA))

### ¿Cuántos NA's tengo en la base de datos? Segunda limpieza
sum(is.na(df3))
## [1] 0
## 5. Análisis Exploratorio de las Bases de Datos

describe(df3)
## # A tibble: 6 × 26
##   described_v…¹     n    na    mean      sd se_mean   IQR skewn…² kurto…³    p00
##   <chr>         <int> <int>   <dbl>   <dbl>   <dbl> <dbl>   <dbl>   <dbl>  <dbl>
## 1 No..De.Emple…   113     0 7.59e+1 5.39e+1 5.07e+0 96      0.400  -1.24      1 
## 2 EDAD            113     0 3.57e+1 1.33e+1 1.25e+0 20      0.398  -0.310     0 
## 3 BAJA            113     0 3.45e-1 9.61e-1 9.04e-2  0      2.45    4.05      0 
## 4 SALARIO.DIAR…   113     0 1.81e+2 3.47e+1 3.27e+0  3.96   4.93   31.6     144.
## 5 N..CREDITO.I…   113     0 6.77e+7 3.55e+8 3.34e+7  0      5.10   24.4       0 
## 6 CODIGO.POSTAL   113     0 6.34e+4 1.12e+4 1.05e+3  9     -3.14    8.01  25016 
## # … with 16 more variables: p01 <dbl>, p05 <dbl>, p10 <dbl>, p20 <dbl>,
## #   p25 <dbl>, p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>,
## #   p75 <dbl>, p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and
## #   abbreviated variable names ¹​described_variables, ²​skewness, ³​kurtosis
count(df3, GENERO, sort = TRUE)
##      GENERO  n
## 1  FEMENINO 61
## 2 MASCULINO 52
count(df3, PUESTO, sort = TRUE)
##                       PUESTO  n
## 1           AYUDANTE GENERAL 67
## 2                COSTURERO/A 10
## 3                     CHOFER  5
## 4                   SOLDADOR  5
## 5                  RESIDENTE  4
## 6               SUPERVISOR/A  4
## 7                    EXTERNO  2
## 8     INSPECTOR/A DE CALIDAD  2
## 9                   OPERADOR  2
## 10 AYUDANTE DE MANTENIMIENTO  1
## 11               ENFERMERO/A  1
## 12                    GESTOR  1
## 13      GUARDIA DE SEGURIDAD  1
## 14                     LIDER  1
## 15                  LIMPIEZA  1
## 16             MANTENIMIENTO  1
## 17            MONTACARGUISTA  1
## 18                      MOZO  1
## 19                    PINTOR  1
## 20                    RECIBO  1
## 21       SERVICIO AL CLIENTE  1
count(df3, DEPARTAMENTO, sort = TRUE)
##             DEPARTAMENTO  n
## 1                 VARIOS 40
## 2      PRODUCCION RETORN 10
## 3                COSTURA  9
## 4                  CEDIS  8
## 5  PRODUCCION CARTON MDL  7
## 6               STABILUS  7
## 7   PRODUCCION CARTON MC  5
## 8              EMBARQUES  4
## 9               PAILERIA  4
## 10               TROQUEL  4
## 11                CELDAS  3
## 12                   EHS  3
## 13               CALIDAD  2
## 14               EXTERNO  2
## 15              AY FLEXO  1
## 16            CORTADORAS  1
## 17              LIMPIEZA  1
## 18            MATERIALES  1
## 19              ROTATIVA  1
count(df3, SALARIO.DIARIO.IMSS, sort = TRUE)
##    SALARIO.DIARIO.IMSS  n
## 1               180.68 59
## 2               176.72 23
## 3               151.61 11
## 4               151.67  5
## 5               144.45  3
## 6               152.86  1
## 7               175.79  1
## 8               181.68  1
## 9               184.68  1
## 10              185.68  1
## 11              208.65  1
## 12              240.71  1
## 13              240.75  1
## 14              260.01  1
## 15              279.61  1
## 16              337.05  1
## 17              441.37  1
count(df3, LUGAR.DE.NACIMIENTO, sort = TRUE)
##    LUGAR.DE.NACIMIENTO  n
## 1           NUEVO LEON 79
## 2             VERACRUZ 12
## 3             COAHUILA  5
## 4      SAN LUIS POTOSI  3
## 5           TAMAULIPAS  3
## 6              CHIAPAS  2
## 7     CIUDAD DE MEXICO  2
## 8              DURANGO  2
## 9           GUANAJUATO  1
## 10            HONDURAS  1
## 11        QUINTANA ROO  1
## 12             TABASCO  1
## 13           ZACATECAS  1
tibble(df3)
## # A tibble: 113 × 17
##    No..De.Em…¹ FECHA…²  EDAD GENERO FECHA…³ PRIME…⁴  BAJA PUESTO DEPAR…⁵ SALAR…⁶
##          <int> <chr>   <int> <chr>  <chr>   <chr>   <int> <chr>  <chr>     <dbl>
##  1           1 10/09/…    67 MASCU… 01/07/… 31/07/…     0 SUPER… PRODUC…    177.
##  2           2 14/05/…    43 FEMEN… 01/07/… 31/07/…     0 SUPER… PRODUC…    177.
##  3           3 21/11/…    73 MASCU… 22/11/… 22/12/…     0 EXTER… EXTERNO    177.
##  4           4 01/05/…    32 FEMEN… 30/01/… 01/03/…     0 SUPER… PRODUC…    337.
##  5           5 06/09/…    57 FEMEN… 05/05/… 04/06/…     0 SUPER… COSTURA    441.
##  6           6 22/06/…    38 MASCU… 03/07/… 02/08/…     0 SERVI… CEDIS      177.
##  7           7 01/07/…    55 FEMEN… 06/08/… 05/09/…     0 COSTU… COSTURA    260.
##  8           8 10/12/…    26 MASCU… 23/08/… 22/09/…     0 AYUDA… PRODUC…    241.
##  9           9 03/11/…    27 MASCU… 11/01/… 10/02/…     0 AYUDA… CEDIS      177.
## 10          10 18/08/…    37 FEMEN… 20/02/… 22/03/…     0 COSTU… COSTURA    153.
## # … with 103 more rows, 7 more variables: N..CREDITO.INFONAVIT <int>,
## #   LUGAR.DE.NACIMIENTO <chr>, COLONIA <chr>, MUNICIPIO <chr>, ESTADO <chr>,
## #   CODIGO.POSTAL <int>, ESTADO.CIVIL <chr>, and abbreviated variable names
## #   ¹​No..De.Empleado, ²​FECHA.DE.NACIMIENTO, ³​FECHA.DE.ALTA, ⁴​PRIMER.MES,
## #   ⁵​DEPARTAMENTO, ⁶​SALARIO.DIARIO.IMSS
# En esta primera parte del análisis estadístico descriptivo, vemos que el conteo total de empleados actuales es de 113 y hay un mayor número de mujeres (54%) contra empleados que son hombres (46%).

# En cuanto a los puestos, vemos que existe una gran cantidad de ayudantes generales, pues es el puesto que ocupa mayor capital humano, contra aquellos que ocupan menos que van desde servicio al cliente hasta operadores.

# Entre los departamentos con mayor cantidad de empleados, vemos que está varios y producción retorn. El departamento de "Varios" fue creado para catalogar a aquellos empleados que en la base de datos no tenían definida un área en concreto.

# Vemos que la mayoría de los empleados ganan $180.68 pesos de salario diario por el IMSS y de todos los empleados, se calcula que tienen un promedio de salario diario de $236.62 pesos.

# En cuanto al lugar de origen, vemos que la mayoría de los empleados provienen del Estado de Nuevo León (70%) y Veracruz (11%), viendo que el 19% restante de los empleados son provenientes de Zona Centro o estados colidantes de Nuevo León.


## 5.1 Tabla de frecuencia (1)

# Las tablas de frecuencia son una ordenación en forma de tabla de los datos estadísticos, asignando a cada dato su frecuencia correspondiente, es decir, el número de veces que aparece un determinado valor en un estudio estadístico.


### Tabla de frecuencia: Salario diario de acuerdo al género
proportion <- prop.table(table(df3$GENERO,df3$SALARIO.DIARIO.IMSS))
proportion %>%
  kbl() %>%
  kable_styling()
144.45 151.61 151.67 152.86 175.79 176.72 180.68 181.68 184.68 185.68 208.65 240.71 240.75 260.01 279.61 337.05 441.37
FEMENINO 0.0265487 0.0619469 0.0088496 0.0088496 0.0000000 0.0619469 0.3008850 0.0088496 0.0088496 0.0088496 0.0088496 0.0088496 0.0000000 0.0088496 0.0000000 0.0088496 0.0088496
MASCULINO 0.0000000 0.0353982 0.0353982 0.0000000 0.0088496 0.1415929 0.2212389 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0088496 0.0000000 0.0088496 0.0000000 0.0000000
# Esta tabla de frecuencia representa el valor decimal del salario diario de acuerdo al género, es decir, la cantidad de empleados en valor decimal que reciben cierto salario diario de acuerdo a su género.

BASE DE DATOS: BAJAS DE RECURSOS HUMANOS

# __A partir de la siguiente base de datos, se analizará específicamente la información de aquellas personas que se dieron de baja en años anteriores con el objetivo de entender las principales razones de la alta rotación en la empresa.__


### Importar base de datos
df4 <-read.csv('hr_baja csv 2.csv')
summary(df4)
##   NO.DE.BAJAS      APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  1.00   Length:238         Length:238         Length:238         
##  1st Qu.: 60.25   Class :character   Class :character   Class :character   
##  Median :119.50   Mode  :character   Mode  :character   Mode  :character   
##  Mean   :119.50                                                            
##  3rd Qu.:178.75                                                            
##  Max.   :238.00                                                            
##                                                                            
##       EDAD          GENERO          FECHA.DE.ALTA      MOTIVO.DE.BAJA    
##  Min.   : 0.00   Length:238         Length:238         Length:238        
##  1st Qu.:22.25   Class :character   Class :character   Class :character  
##  Median :30.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :30.50                                                           
##  3rd Qu.:36.00                                                           
##  Max.   :52.00                                                           
##  NA's   :160                                                             
##  DIAS.TRABAJADOS       BAJA              PUESTO          DEPARTAMENTO      
##  Min.   :   0.00   Length:238         Length:238         Length:238        
##  1st Qu.:   9.00   Class :character   Class :character   Class :character  
##  Median :  22.50   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :  87.30                                                           
##  3rd Qu.:  60.75                                                           
##  Max.   :1966.00                                                           
##                                                                            
##  NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:238         Min.   :144.4       Min.   :     0       
##  Class :character   1st Qu.:180.7       1st Qu.:     0       
##  Mode  :character   Median :180.7       Median :     0       
##                     Mean   :178.0       Mean   :  3112       
##                     3rd Qu.:180.7       3rd Qu.:     0       
##                     Max.   :500.0       Max.   :305820       
##                                                              
##  NO.CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP              CALLE          
##  Min.   :0.000e+00    Length:238          Length:238         Length:238        
##  1st Qu.:0.000e+00    Class :character    Class :character   Class :character  
##  Median :0.000e+00    Mode  :character    Mode  :character   Mode  :character  
##  Mean   :1.582e+08                                                             
##  3rd Qu.:0.000e+00                                                             
##  Max.   :6.919e+09                                                             
##                                                                                
##  NUMERO.INTERNO       COLONIA          CODIGO.POSTAL    MUNICIPIO        
##  Length:238         Length:238         Min.   :25019   Length:238        
##  Class :character   Class :character   1st Qu.:33604   Class :character  
##  Mode  :character   Mode  :character   Median :33604   Mode  :character  
##                                        Mean   :44462                     
##                                        3rd Qu.:66056                     
##                                        Max.   :67450                     
##                                                                          
##     ESTADO          ESTADO.CIVIL       TARJETA.CUENTA    
##  Length:238         Length:238         Length:238        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
### ¿Cuántos NA's tengo en la base de datos?
sum(is.na(df4))
## [1] 160
### Borrar todos los registros NA's de una tabla
df5<-df4
df5<-na.omit(df5)
summary(df5)
##   NO.DE.BAJAS      APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  5.00   Length:78          Length:78          Length:78          
##  1st Qu.: 49.75   Class :character   Class :character   Class :character   
##  Median :167.50   Mode  :character   Mode  :character   Mode  :character   
##  Mean   :139.60                                                            
##  3rd Qu.:212.75                                                            
##  Max.   :238.00                                                            
##       EDAD          GENERO          FECHA.DE.ALTA      MOTIVO.DE.BAJA    
##  Min.   : 0.00   Length:78          Length:78          Length:78         
##  1st Qu.:22.25   Class :character   Class :character   Class :character  
##  Median :30.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :30.50                                                           
##  3rd Qu.:36.00                                                           
##  Max.   :52.00                                                           
##  DIAS.TRABAJADOS      BAJA              PUESTO          DEPARTAMENTO      
##  Min.   :  0.00   Length:78          Length:78          Length:78         
##  1st Qu.:  9.00   Class :character   Class :character   Class :character  
##  Median : 19.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 45.10                                                           
##  3rd Qu.: 39.75                                                           
##  Max.   :730.00                                                           
##  NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:78          Min.   :151.6       Min.   :   0.0       
##  Class :character   1st Qu.:180.7       1st Qu.:   0.0       
##  Mode  :character   Median :180.7       Median :   0.0       
##                     Mean   :174.3       Mean   : 130.4       
##                     3rd Qu.:180.7       3rd Qu.:   0.0       
##                     Max.   :183.7       Max.   :2795.0       
##  NO.CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP              CALLE          
##  Min.   :0.000e+00    Length:78           Length:78          Length:78         
##  1st Qu.:0.000e+00    Class :character    Class :character   Class :character  
##  Median :0.000e+00    Mode  :character    Mode  :character   Mode  :character  
##  Mean   :1.871e+08                                                             
##  3rd Qu.:0.000e+00                                                             
##  Max.   :6.919e+09                                                             
##  NUMERO.INTERNO       COLONIA          CODIGO.POSTAL    MUNICIPIO        
##  Length:78          Length:78          Min.   :25019   Length:78         
##  Class :character   Class :character   1st Qu.:33604   Class :character  
##  Mode  :character   Mode  :character   Median :33604   Mode  :character  
##                                        Mean   :46508                     
##                                        3rd Qu.:66645                     
##                                        Max.   :67450                     
##     ESTADO          ESTADO.CIVIL       TARJETA.CUENTA    
##  Length:78          Length:78          Length:78         
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
## 
### Eliminar columnas
df3<-df2
df3 <- subset(df3, select =-c (APELLIDOS))
df3 <- subset(df3, select =-c (NOMBRE))
df3 <- subset(df3, select =-c (FACTOR.CRED.INFONAVIT))
df3 <- subset(df3, select =-c (CURP))
df3 <- subset(df3, select =-c (CALLE))
df3 <- subset(df3, select =-c (NUMERO.INTERNO))
df3 <- subset(df3, select =-c (TARJETA.CUENTA))


### ¿Cuántos NA's tengo en la base de datos?
sum(is.na(df5))
## [1] 0
# Con los datos presentados anteriormente, vemos que la edad promedio de los colaboradores es de 35 años, además de que ganan un promedio de $180 pesos.

## 5.2.1 Tabla cruzada (1)

table(df5$PUESTO, df5$MOTIVO.DE.BAJA)
##                              
##                               BAJA POR FALTAS RENUNCIA VOLUNTARIA
##   AYUDANTE DE EMBARQUES                     0                   0
##   AYUDANTE GENERAL                         50                  18
##   COSTURERO/A                               1                   0
##   GUARDIA DE SEGURIDAD                      0                   1
##   INSPECTOR DE CALIDAD                      1                   0
##   JEFE DE SEGURIDAD E HIGIENE               0                   1
##   MONTACARGUISTA                            1                   1
##   RESIDENTE                                 1                   0
##   SOLDADOR                                  1                   0
##                              
##                               TERMINO DE CONTRATO
##   AYUDANTE DE EMBARQUES                         1
##   AYUDANTE GENERAL                              1
##   COSTURERO/A                                   0
##   GUARDIA DE SEGURIDAD                          0
##   INSPECTOR DE CALIDAD                          0
##   JEFE DE SEGURIDAD E HIGIENE                   0
##   MONTACARGUISTA                                0
##   RESIDENTE                                     0
##   SOLDADOR                                      0
# En la tabla vemos que se destacan tres razones principales de bajas de empleados, las cuales son: bajas por faltas, renuncia voluntaria o término de contrato. En su mayoría, hubo una baja por faltas del puesto de ayudante general y renuncia voluntaria para el mismo puesto. Al igual que en la base de datos anterior, vemos que el puesto con mayor rotación a nivel histórico es de ayudante general. Esto sugiere que existe un alto número de contrataciones para el puesto debido a una mala gestión administrativa o bajo rendimiento de los empleados.

## 5.2.2 Tabla cruzada (2)

table(df5$GENERO, df5$MOTIVO.DE.BAJA)
##            
##             BAJA POR FALTAS RENUNCIA VOLUNTARIA TERMINO DE CONTRATO
##   FEMENINO               40                  12                   1
##   MASCULINO              15                   9                   1
# La tabla cruzada anterior nos muestra la relación entre los motivos de baja contra el género, es decir, las principales razones de baja de acuerdo al género de cada empleado. Vemos que hubo un total de 53 bajas del género femenino, destacando las bajas por faltas (representa un 75% de las bajas femeninas). Para el género masculino, hubo un total de 25 faltas, destacando principalmente las bajas por faltas (representa un 60% de las bajas masculinas).

## 5.3 Gráficos de datos cuantitativos y cualitativos (2)

## 5.3.1 Pie chart

### Pie chart: Representación de bajas acorde al estado de residencia
pie(table(df5$ESTADO), col=c("orange","coral1"),
    main="Representación de bajas acorde al estado de residencia")

# La gráfica anterior nos muestra que hay un mayor número de ex-empleados que viven en el Estado de Nuevo León. Sin embargo, hay un porcentaje que reside en Coahuila. Esto se puede interpretar con que hay un alto nivel de rotación existente debido a la lejanía de residencia de los empleados.


### Pie chart: Representación de bajas acorde al género

pie(table(df5$GENERO), col=c("orange","coral1"),
    main="Representación de bajas acorde al género")

# La anterior gráfica de pastel reafirma lo que mencionamos anteriormente. De acuerdo a las bajas realizadas, la mayoría de los ex-empleados son del género femenino.


## 5.4 Gráficos de dispersión (2)

### Gráfica de dispersión: Número de bajas VS. Días trabajados
plot(x= df5$NO.DE.BAJAS,
     y=df5$DIAS.TRABAJADOS)

# La gráfica de dispersión nos muestra la intensidad de relación entre la variable de días trabajados y número de bajas. Esto nos dice que hubo un alto número de bajas de empleados que trabajaron menos de 200 días, es decir, la mayoría de los ex-empleados estuvieron en FORM menos de 1 año.

### Boxplot: Correlación en bajas acorde a variables de género y edad
ggplot(df5, aes(GENERO,SALARIO.DIARIO.IMSS,fill=GENERO)) +
  geom_bar(stat = "identity") +
  scale_fill_brewer(palette = "Set2") + ggtitle("Salario diario por género")

# La gráfica anterior nos muestra la correlación entre el género y el salario diario de los empleados. En este, entendemos que el género femenino tiene un salario diario total más alto que los de género masculino.

5. Production

## Importar base de datos

produccion<- read.csv('p1 Base produccion form - Base produccion form - Base produccion form - Base produccion form.csv')
summary(produccion)
##     Fecha             CLIENTE            ID.FORM            PRODUCTO        
##  Length:3985        Length:3985        Length:3985        Length:3985       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  PIEZAS.PROG.        TMO..MIN.           HR..FIN          ESTACION.ARRANQUE 
##  Length:3985        Length:3985        Length:3985        Length:3985       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  Laminas.procesadas INICIO.SEP.UP      FIN.INICIO.DE.SEP.UP INICIO.de.PROCESO 
##  Min.   :   0.0     Length:3985        Length:3985          Length:3985       
##  1st Qu.:   0.0     Class :character   Class :character     Class :character  
##  Median :  51.0     Mode  :character   Mode  :character     Mode  :character  
##  Mean   : 102.1                                                               
##  3rd Qu.: 184.0                                                               
##  Max.   :1263.0                                                               
##                                                                               
##  FIN.de.PROCESO     TIEMPO.CALIDAD     TIEMPO.MATERIALES
##  Length:3985        Length:3985        Min.   : 0.000   
##  Class :character   Class :character   1st Qu.: 0.000   
##  Mode  :character   Mode  :character   Median : 0.000   
##                                        Mean   : 3.169   
##                                        3rd Qu.: 1.000   
##                                        Max.   :60.000   
##                                        NA's   :3489
# **Producción**
# *3988 registros y 15 variables* 
  
  ## 1. Entender y limpiar la base de datos 
describe(produccion)
## # A tibble: 2 × 26
##   describe…¹     n    na   mean     sd se_mean   IQR skewn…² kurto…³   p00   p01
##   <chr>      <int> <int>  <dbl>  <dbl>   <dbl> <dbl>   <dbl>   <dbl> <dbl> <dbl>
## 1 Laminas.p…  3985     0 102.   134.     2.13    184    2.70    13.1     0     0
## 2 TIEMPO.MA…   496  3489   3.17   7.57   0.340     1    3.72    17.5     0     0
## # … with 15 more variables: p05 <dbl>, p10 <dbl>, p20 <dbl>, p25 <dbl>,
## #   p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>, p75 <dbl>,
## #   p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and abbreviated
## #   variable names ¹​described_variables, ²​skewness, ³​kurtosis
### Paso 1. De caracter a fecha (Tecnica 4. Convertir tipos de datos)
bdp<-produccion
bdp$Fecha<- as.Date(bdp$Fecha, format= "%d/%m/%Y")
summary(bdp)
##      Fecha              CLIENTE            ID.FORM            PRODUCTO        
##  Min.   :2022-07-15   Length:3985        Length:3985        Length:3985       
##  1st Qu.:2022-08-03   Class :character   Class :character   Class :character  
##  Median :2022-08-20   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2022-08-19                                                           
##  3rd Qu.:2022-09-06                                                           
##  Max.   :2022-09-21                                                           
##                                                                               
##  PIEZAS.PROG.        TMO..MIN.           HR..FIN          ESTACION.ARRANQUE 
##  Length:3985        Length:3985        Length:3985        Length:3985       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  Laminas.procesadas INICIO.SEP.UP      FIN.INICIO.DE.SEP.UP INICIO.de.PROCESO 
##  Min.   :   0.0     Length:3985        Length:3985          Length:3985       
##  1st Qu.:   0.0     Class :character   Class :character     Class :character  
##  Median :  51.0     Mode  :character   Mode  :character     Mode  :character  
##  Mean   : 102.1                                                               
##  3rd Qu.: 184.0                                                               
##  Max.   :1263.0                                                               
##                                                                               
##  FIN.de.PROCESO     TIEMPO.CALIDAD     TIEMPO.MATERIALES
##  Length:3985        Length:3985        Min.   : 0.000   
##  Class :character   Class :character   1st Qu.: 0.000   
##  Mode  :character   Mode  :character   Median : 0.000   
##                                        Mean   : 3.169   
##                                        3rd Qu.: 1.000   
##                                        Max.   :60.000   
##                                        NA's   :3489
tibble(bdp)
## # A tibble: 3,985 × 15
##    Fecha      CLIENTE    ID.FORM PRODU…¹ PIEZA…² TMO..…³ HR..FIN ESTAC…⁴ Lamin…⁵
##    <date>     <chr>      <chr>   <chr>   <chr>   <chr>   <chr>   <chr>     <int>
##  1 2022-07-16 TRMX       00-059… "TGTX.… 1       "10"    "09:05" C1Y2          3
##  2 2022-07-22 STABILUS 3 00-00-… "MOTOR… 1       "10"    "10:40" C1Y2          2
##  3 2022-07-28 STABILUS 3 00-00-… "MOTOR… 1       "10"    "11:20" C1Y2          2
##  4 2022-08-12 TRMX       TR-059… "TR137… 1       "10"    "09:35" C1            1
##  5 2022-08-12 TRMX       TR-059… "TR137… 1       "10"    "09:45" C1            1
##  6 2022-09-10 DENSO      DN-034… "MCV. … 1       "10"    "08:45" c1y2          1
##  7 2022-07-23 DENSO      DN-034… "TOYOT… 2       ""      ""      CELDAS        0
##  8 2022-08-05 HELLA      HE-073… "SUDAF… 2       "10"    "11:20" C1Y2          3
##  9 2022-08-05 HELLA      HE-073… "SUDAF… 2       "10"    "11:30" C1Y2          0
## 10 2022-08-05 HELLA      HE-073… "SUDAF… 2       "10"    "11:40" C1Y2          0
## # … with 3,975 more rows, 6 more variables: INICIO.SEP.UP <chr>,
## #   FIN.INICIO.DE.SEP.UP <chr>, INICIO.de.PROCESO <chr>, FIN.de.PROCESO <chr>,
## #   TIEMPO.CALIDAD <chr>, TIEMPO.MATERIALES <int>, and abbreviated variable
## #   names ¹​PRODUCTO, ²​PIEZAS.PROG., ³​TMO..MIN., ⁴​ESTACION.ARRANQUE,
## #   ⁵​Laminas.procesadas
### Paso 2. Eliminar columnas inservibles(Técnica 1. Remover valores irrelevantes)
bdp1<-bdp
bdp1 <- subset(bdp1, select =-c (ID.FORM))
bdp1 <- subset(bdp1, select =-c (INICIO.SEP.UP,FIN.INICIO.DE.SEP.UP, TIEMPO.MATERIALES))
bdp1 <- subset(bdp1, select =-c (HR..FIN, INICIO.de.PROCESO, FIN.de.PROCESO))

### Cambiar nombres
colnames(bdp1)<-c('fecha','cliente','producto','piezas_prog','tiempo_min','esta_arranque','laminas_procesadas','tiempo_calidad')

### Borrar todos los registros NA's de una tabla
bdp2<-bdp1
bdp2<-na.omit(bdp2)
summary(bdp2)
##      fecha              cliente            producto         piezas_prog       
##  Min.   :2022-07-15   Length:3984        Length:3984        Length:3984       
##  1st Qu.:2022-08-03   Class :character   Class :character   Class :character  
##  Median :2022-08-20   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2022-08-19                                                           
##  3rd Qu.:2022-09-06                                                           
##  Max.   :2022-09-21                                                           
##   tiempo_min        esta_arranque      laminas_procesadas tiempo_calidad    
##  Length:3984        Length:3984        Min.   :   0.0     Length:3984       
##  Class :character   Class :character   1st Qu.:   0.0     Class :character  
##  Mode  :character   Mode  :character   Median :  51.0     Mode  :character  
##                                        Mean   : 102.1                       
##                                        3rd Qu.: 184.0                       
##                                        Max.   :1263.0
sum(is.na(bdp2))
## [1] 0
### Paso 3. Cambiar de caracter a numérico

bdp2$piezas_prog<-as.numeric(bdp2$piezas_prog)               
## Warning: NAs introducidos por coerción
bdp2$tiempo_min<-as.numeric(bdp2$tiempo_min)                 
## Warning: NAs introducidos por coerción
bdp2$laminas_procesadas<-as.numeric(bdp2$laminas_procesadas)
bdp2$tiempo_calidad<-as.numeric(bdp2$tiempo_calidad)         
## Warning: NAs introducidos por coerción
bdp3<-bdp2
bdp3$tiempo_min <- substr(bdp3$tiempo_min, start = 1, stop = 2)
tibble(bdp3)  
## # A tibble: 3,984 × 8
##    fecha      cliente    producto        pieza…¹ tiemp…² esta_…³ lamin…⁴ tiemp…⁵
##    <date>     <chr>      <chr>             <dbl> <chr>   <chr>     <dbl>   <dbl>
##  1 2022-07-16 TRMX       "TGTX. CAJA RS…       1 10      C1Y2          3       1
##  2 2022-07-22 STABILUS 3 "MOTORGEAR. KI…       1 10      C1Y2          2       1
##  3 2022-07-28 STABILUS 3 "MOTORGEAR. KI…       1 10      C1Y2          2       2
##  4 2022-08-12 TRMX       "TR13773. CAJA…       1 10      C1            1       1
##  5 2022-08-12 TRMX       "TR13776. CAJA…       1 10      C1            1       1
##  6 2022-09-10 DENSO      "MCV. VALVE. P…       1 10      c1y2          1      NA
##  7 2022-07-23 DENSO      "TOYOTA. MCV. …       2 <NA>    CELDAS        0       0
##  8 2022-08-05 HELLA      "SUDAFRICA. TA…       2 10      C1Y2          3       1
##  9 2022-08-05 HELLA      "SUDAFRICA. \"…       2 10      C1Y2          0       0
## 10 2022-08-05 HELLA      "SUDAFRICA. PA…       2 10      C1Y2          0       0
## # … with 3,974 more rows, and abbreviated variable names ¹​piezas_prog,
## #   ²​tiempo_min, ³​esta_arranque, ⁴​laminas_procesadas, ⁵​tiempo_calidad
bdp3$tiempo_min <- as.integer(bdp3$tiempo_min)
str(bdp3)  
## 'data.frame':    3984 obs. of  8 variables:
##  $ fecha             : Date, format: "2022-07-16" "2022-07-22" ...
##  $ cliente           : chr  "TRMX" "STABILUS 3" "STABILUS 3" "TRMX" ...
##  $ producto          : chr  "TGTX. CAJA RSC. ( 1 Pieza) con SOBRE. Kit: TR-059-19014" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "TR13773. CAJA RSC Imp. Negra con SOBRE ( 2 Partes). PC0048." ...
##  $ piezas_prog       : num  1 1 1 1 1 1 2 2 2 2 ...
##  $ tiempo_min        : int  10 10 10 10 10 10 NA 10 10 10 ...
##  $ esta_arranque     : chr  "C1Y2" "C1Y2" "C1Y2" "C1" ...
##  $ laminas_procesadas: num  3 2 2 1 1 1 0 3 0 0 ...
##  $ tiempo_calidad    : num  1 1 2 1 1 NA 0 1 0 0 ...
##  - attr(*, "na.action")= 'omit' Named int 626
##   ..- attr(*, "names")= chr "626"
bdp3$piezas_prog <- substr(bdp3$piezas_prog, start = 1, stop = 2)
tibble(bdp3)  
## # A tibble: 3,984 × 8
##    fecha      cliente    producto        pieza…¹ tiemp…² esta_…³ lamin…⁴ tiemp…⁵
##    <date>     <chr>      <chr>           <chr>     <int> <chr>     <dbl>   <dbl>
##  1 2022-07-16 TRMX       "TGTX. CAJA RS… 1            10 C1Y2          3       1
##  2 2022-07-22 STABILUS 3 "MOTORGEAR. KI… 1            10 C1Y2          2       1
##  3 2022-07-28 STABILUS 3 "MOTORGEAR. KI… 1            10 C1Y2          2       2
##  4 2022-08-12 TRMX       "TR13773. CAJA… 1            10 C1            1       1
##  5 2022-08-12 TRMX       "TR13776. CAJA… 1            10 C1            1       1
##  6 2022-09-10 DENSO      "MCV. VALVE. P… 1            10 c1y2          1      NA
##  7 2022-07-23 DENSO      "TOYOTA. MCV. … 2            NA CELDAS        0       0
##  8 2022-08-05 HELLA      "SUDAFRICA. TA… 2            10 C1Y2          3       1
##  9 2022-08-05 HELLA      "SUDAFRICA. \"… 2            10 C1Y2          0       0
## 10 2022-08-05 HELLA      "SUDAFRICA. PA… 2            10 C1Y2          0       0
## # … with 3,974 more rows, and abbreviated variable names ¹​piezas_prog,
## #   ²​tiempo_min, ³​esta_arranque, ⁴​laminas_procesadas, ⁵​tiempo_calidad
bdp3$piezas_prog <- as.integer(bdp3$piezas_prog)
str(bdp3)
## 'data.frame':    3984 obs. of  8 variables:
##  $ fecha             : Date, format: "2022-07-16" "2022-07-22" ...
##  $ cliente           : chr  "TRMX" "STABILUS 3" "STABILUS 3" "TRMX" ...
##  $ producto          : chr  "TGTX. CAJA RSC. ( 1 Pieza) con SOBRE. Kit: TR-059-19014" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "TR13773. CAJA RSC Imp. Negra con SOBRE ( 2 Partes). PC0048." ...
##  $ piezas_prog       : int  1 1 1 1 1 1 2 2 2 2 ...
##  $ tiempo_min        : int  10 10 10 10 10 10 NA 10 10 10 ...
##  $ esta_arranque     : chr  "C1Y2" "C1Y2" "C1Y2" "C1" ...
##  $ laminas_procesadas: num  3 2 2 1 1 1 0 3 0 0 ...
##  $ tiempo_calidad    : num  1 1 2 1 1 NA 0 1 0 0 ...
##  - attr(*, "na.action")= 'omit' Named int 626
##   ..- attr(*, "names")= chr "626"
bdp3$laminas_procesadas <- substr(bdp3$laminas_procesadas, start = 1, stop = 2)
tibble(bdp3)  
## # A tibble: 3,984 × 8
##    fecha      cliente    producto        pieza…¹ tiemp…² esta_…³ lamin…⁴ tiemp…⁵
##    <date>     <chr>      <chr>             <int>   <int> <chr>   <chr>     <dbl>
##  1 2022-07-16 TRMX       "TGTX. CAJA RS…       1      10 C1Y2    3             1
##  2 2022-07-22 STABILUS 3 "MOTORGEAR. KI…       1      10 C1Y2    2             1
##  3 2022-07-28 STABILUS 3 "MOTORGEAR. KI…       1      10 C1Y2    2             2
##  4 2022-08-12 TRMX       "TR13773. CAJA…       1      10 C1      1             1
##  5 2022-08-12 TRMX       "TR13776. CAJA…       1      10 C1      1             1
##  6 2022-09-10 DENSO      "MCV. VALVE. P…       1      10 c1y2    1            NA
##  7 2022-07-23 DENSO      "TOYOTA. MCV. …       2      NA CELDAS  0             0
##  8 2022-08-05 HELLA      "SUDAFRICA. TA…       2      10 C1Y2    3             1
##  9 2022-08-05 HELLA      "SUDAFRICA. \"…       2      10 C1Y2    0             0
## 10 2022-08-05 HELLA      "SUDAFRICA. PA…       2      10 C1Y2    0             0
## # … with 3,974 more rows, and abbreviated variable names ¹​piezas_prog,
## #   ²​tiempo_min, ³​esta_arranque, ⁴​laminas_procesadas, ⁵​tiempo_calidad
bdp3$laminas_procesadas <- as.integer(bdp3$laminas_procesadas)
str(bdp3) 
## 'data.frame':    3984 obs. of  8 variables:
##  $ fecha             : Date, format: "2022-07-16" "2022-07-22" ...
##  $ cliente           : chr  "TRMX" "STABILUS 3" "STABILUS 3" "TRMX" ...
##  $ producto          : chr  "TGTX. CAJA RSC. ( 1 Pieza) con SOBRE. Kit: TR-059-19014" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "TR13773. CAJA RSC Imp. Negra con SOBRE ( 2 Partes). PC0048." ...
##  $ piezas_prog       : int  1 1 1 1 1 1 2 2 2 2 ...
##  $ tiempo_min        : int  10 10 10 10 10 10 NA 10 10 10 ...
##  $ esta_arranque     : chr  "C1Y2" "C1Y2" "C1Y2" "C1" ...
##  $ laminas_procesadas: int  3 2 2 1 1 1 0 3 0 0 ...
##  $ tiempo_calidad    : num  1 1 2 1 1 NA 0 1 0 0 ...
##  - attr(*, "na.action")= 'omit' Named int 626
##   ..- attr(*, "names")= chr "626"
### Paso 4. Cambiar de NA's a promedios 
bdp4 <- bdp3
bdp4$tiempo_min[is.na(bdp4$tiempo_min)]<-mean(bdp4$tiempo_min, na.rm = TRUE)
summary(bdp4) 
##      fecha              cliente            producto          piezas_prog   
##  Min.   :2022-07-15   Length:3984        Length:3984        Min.   : 1.00  
##  1st Qu.:2022-08-03   Class :character   Class :character   1st Qu.:12.00  
##  Median :2022-08-20   Mode  :character   Mode  :character   Median :20.00  
##  Mean   :2022-08-19                                         Mean   :27.19  
##  3rd Qu.:2022-09-06                                         3rd Qu.:40.00  
##  Max.   :2022-09-21                                         Max.   :99.00  
##                                                             NA's   :179    
##    tiempo_min    esta_arranque      laminas_procesadas tiempo_calidad   
##  Min.   : 0.00   Length:3984        Min.   : 0.00      Min.   : 0.0000  
##  1st Qu.:15.00   Class :character   1st Qu.: 0.00      1st Qu.: 0.0000  
##  Median :22.13   Mode  :character   Median :19.00      Median : 1.0000  
##  Mean   :22.13                      Mean   :21.42      Mean   : 0.8628  
##  3rd Qu.:25.00                      3rd Qu.:32.00      3rd Qu.: 1.0000  
##  Max.   :90.00                      Max.   :98.00      Max.   :22.0000  
##                                                        NA's   :343
### Paso 5. Cambiar de NA's a 0
bdp5 <- bdp4
bdp5$laminas_procesadas[bdp5$laminas_procesadas < 1]<- NA
summary(bdp5)
##      fecha              cliente            producto          piezas_prog   
##  Min.   :2022-07-15   Length:3984        Length:3984        Min.   : 1.00  
##  1st Qu.:2022-08-03   Class :character   Class :character   1st Qu.:12.00  
##  Median :2022-08-20   Mode  :character   Mode  :character   Median :20.00  
##  Mean   :2022-08-19                                         Mean   :27.19  
##  3rd Qu.:2022-09-06                                         3rd Qu.:40.00  
##  Max.   :2022-09-21                                         Max.   :99.00  
##                                                             NA's   :179    
##    tiempo_min    esta_arranque      laminas_procesadas tiempo_calidad   
##  Min.   : 0.00   Length:3984        Min.   : 1.00      Min.   : 0.0000  
##  1st Qu.:15.00   Class :character   1st Qu.:15.00      1st Qu.: 0.0000  
##  Median :22.13   Mode  :character   Median :21.00      Median : 1.0000  
##  Mean   :22.13                      Mean   :30.09      Mean   : 0.8628  
##  3rd Qu.:25.00                      3rd Qu.:41.00      3rd Qu.: 1.0000  
##  Max.   :90.00                      Max.   :98.00      Max.   :22.0000  
##                                     NA's   :1148       NA's   :343
### Paso 6. Borra NA's
bdp6 <- bdp5
bdp6 <- na.omit(bdp6)    
str(bdp6)
## 'data.frame':    2679 obs. of  8 variables:
##  $ fecha             : Date, format: "2022-07-16" "2022-07-22" ...
##  $ cliente           : chr  "TRMX" "STABILUS 3" "STABILUS 3" "TRMX" ...
##  $ producto          : chr  "TGTX. CAJA RSC. ( 1 Pieza) con SOBRE. Kit: TR-059-19014" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "TR13773. CAJA RSC Imp. Negra con SOBRE ( 2 Partes). PC0048." ...
##  $ piezas_prog       : int  1 1 1 1 1 2 3 3 4 4 ...
##  $ tiempo_min        : num  10 10 10 10 10 10 10 10 10 10 ...
##  $ esta_arranque     : chr  "C1Y2" "C1Y2" "C1Y2" "C1" ...
##  $ laminas_procesadas: int  3 2 2 1 1 3 2 5 5 10 ...
##  $ tiempo_calidad    : num  1 1 2 1 1 1 0 1 1 1 ...
##  - attr(*, "na.action")= 'omit' Named int [1:1305] 6 7 9 10 18 22 25 27 28 30 ...
##   ..- attr(*, "names")= chr [1:1305] "6" "7" "9" "10" ...
### Verificar eliminación de NA´s
colSums(is.na(bdp6))
##              fecha            cliente           producto        piezas_prog 
##                  0                  0                  0                  0 
##         tiempo_min      esta_arranque laminas_procesadas     tiempo_calidad 
##                  0                  0                  0                  0
summary(bdp6)
##      fecha              cliente            producto          piezas_prog   
##  Min.   :2022-07-15   Length:2679        Length:2679        Min.   : 1.00  
##  1st Qu.:2022-08-02   Class :character   Class :character   1st Qu.:13.00  
##  Median :2022-08-18   Mode  :character   Mode  :character   Median :20.00  
##  Mean   :2022-08-18                                         Mean   :26.53  
##  3rd Qu.:2022-09-02                                         3rd Qu.:32.50  
##  Max.   :2022-09-21                                         Max.   :99.00  
##    tiempo_min    esta_arranque      laminas_procesadas tiempo_calidad 
##  Min.   : 0.00   Length:2679        Min.   : 1.00      Min.   : 0.00  
##  1st Qu.:15.00   Class :character   1st Qu.:16.00      1st Qu.: 1.00  
##  Median :20.00   Mode  :character   Median :21.00      Median : 1.00  
##  Mean   :22.16                      Mean   :30.18      Mean   : 1.16  
##  3rd Qu.:25.00                      3rd Qu.:41.00      3rd Qu.: 1.00  
##  Max.   :90.00                      Max.   :98.00      Max.   :22.00
str(bdp6)
## 'data.frame':    2679 obs. of  8 variables:
##  $ fecha             : Date, format: "2022-07-16" "2022-07-22" ...
##  $ cliente           : chr  "TRMX" "STABILUS 3" "STABILUS 3" "TRMX" ...
##  $ producto          : chr  "TGTX. CAJA RSC. ( 1 Pieza) con SOBRE. Kit: TR-059-19014" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "MOTORGEAR. KIT. TAPA GRAL. Grapada. 1 Pza/ Kit. ( Kit 19211)" "TR13773. CAJA RSC Imp. Negra con SOBRE ( 2 Partes). PC0048." ...
##  $ piezas_prog       : int  1 1 1 1 1 2 3 3 4 4 ...
##  $ tiempo_min        : num  10 10 10 10 10 10 10 10 10 10 ...
##  $ esta_arranque     : chr  "C1Y2" "C1Y2" "C1Y2" "C1" ...
##  $ laminas_procesadas: int  3 2 2 1 1 3 2 5 5 10 ...
##  $ tiempo_calidad    : num  1 1 2 1 1 1 0 1 1 1 ...
##  - attr(*, "na.action")= 'omit' Named int [1:1305] 6 7 9 10 18 22 25 27 28 30 ...
##   ..- attr(*, "names")= chr [1:1305] "6" "7" "9" "10" ...
summary(bdp6)
##      fecha              cliente            producto          piezas_prog   
##  Min.   :2022-07-15   Length:2679        Length:2679        Min.   : 1.00  
##  1st Qu.:2022-08-02   Class :character   Class :character   1st Qu.:13.00  
##  Median :2022-08-18   Mode  :character   Mode  :character   Median :20.00  
##  Mean   :2022-08-18                                         Mean   :26.53  
##  3rd Qu.:2022-09-02                                         3rd Qu.:32.50  
##  Max.   :2022-09-21                                         Max.   :99.00  
##    tiempo_min    esta_arranque      laminas_procesadas tiempo_calidad 
##  Min.   : 0.00   Length:2679        Min.   : 1.00      Min.   : 0.00  
##  1st Qu.:15.00   Class :character   1st Qu.:16.00      1st Qu.: 1.00  
##  Median :20.00   Mode  :character   Median :21.00      Median : 1.00  
##  Mean   :22.16                      Mean   :30.18      Mean   : 1.16  
##  3rd Qu.:25.00                      3rd Qu.:41.00      3rd Qu.: 1.00  
##  Max.   :90.00                      Max.   :98.00      Max.   :22.00
sum(is.na(bdp6))
## [1] 0
## 2.Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua y Escalas de Medicion.

Variable<-c("Fecha ","cliente","producto", "Piezas programadas","tiempo min","Estacion de arranque","Laminas procesadas", "Tiempo de calidad")
Type<-c("Cualitativa","Cualitativa","Cualitativa", "Cuantitativa(Discreta)", "Cuantitativa(Discreta)","Cualitativa", "Cuantitativa(Discreta)", "Cuantitativa discreta")
Medicion <-c("Nominal", "Nominal","Nominal", "Intervalo", "Intervalo","Nominal", "Intervalo", "Intervalo") 
table<-data.frame(Variable,Type, Medicion)
knitr::kable(table)
Variable Type Medicion
Fecha Cualitativa Nominal
cliente Cualitativa Nominal
producto Cualitativa Nominal
Piezas programadas Cuantitativa(Discreta) Intervalo
tiempo min Cuantitativa(Discreta) Intervalo
Estacion de arranque Cualitativa Nominal
Laminas procesadas Cuantitativa(Discreta) Intervalo
Tiempo de calidad Cuantitativa discreta Intervalo
### Exportar csv
bdl<-data.frame(x = rnorm(10), y = rnorm(10))
write.csv(bdp5, "exportada_produccion_csv")

bdl<-read.csv("exportada_produccion_csv")

## Datos descriptivos 
## *Tabla de Media, Moda y Mediana
# Los datos muestran una desviación estándar y datos muy alejados entre los puntos variables, lo cual nos indica una alteración en la uniformidad de los datos. Esto representa alguna falla en los datos o bien, un punto a considerar en el área productiva.

bd6<-bdl
tabla<-describe(bd6)

### Gráficas

#### Barplots-3

# Recopilando la informacion me tope con estos datos lo cual nos informa acerca de los clientes mas destacados para form y el tiempo minimo de tardanza en el ensamblaje de los productos, en este caso el primer lugar con mas eficiencia por cliente fue stabilus en la primera vuelta.
# Nota: LA visualizacion no se completa en este rmd, para mejor visualizacion ver archivo individual.

bd6<-bd6 %>% select(piezas_prog,tiempo_min,cliente ) %>% group_by(cliente) %>% 
summarise(piezas_prog=sum(piezas_prog),tiempo_min=sum(tiempo_min)) %>% arrange(desc(piezas_prog))

bd6<-bd6[-c(7,8,9),]

ggplot(bd6,aes(x=reorder(tiempo_min,piezas_prog), y=piezas_prog,fill=cliente)) +
  geom_bar(stat="identity")
## Warning: Removed 3 rows containing missing values (position_stack).

# Dentro de esta segunda tabla de barras se muestra la cantidad de piezas programadas que se tuvo por mes en los periodos de los meses Julio, Agosto y Septiembre. Esto nos dice acerca de la mayor productividad de Agosto viendo que hay una inversión en tiempo mayor para DENSO y VARROC. Es necesario evaluar qué tan productivo o ineficiente es esto en cuanto a calidad productiva.

  datoscopia<-bdl
datoscopia$ano<-strftime(datoscopia$fecha, "%Y")
datoscopia$mes<-strftime(datoscopia$fecha, "%m")

data_agg<- aggregate(piezas_prog~mes + ano, datoscopia, FUN = sum)
data_agglamina<- aggregate(laminas_procesadas~mes + ano, datoscopia, FUN = sum)
ggplot(data_agg,aes(x=mes,y=piezas_prog)) +
  geom_bar(stat="identity")

# En esta gráfica se puede visualizar la dependencia del tiempo mínimo de producción con las piezas programadas dependiendo de la estación de arranque. La mayor productividad general tiene una relación con la estación C1 y la C1y2 ya que se ve que es la que menos tiempo hace con más procesamiento de láminas.

ggplot(datoscopia,aes(x=tiempo_min, y=piezas_prog,fill=esta_arranque)) +
  geom_bar(stat="identity")
## Warning: Removed 179 rows containing missing values (position_stack).

#### Dispersion-2
# En esta tabla se muestra un claro ejemplo de comparación que entre más tiempo de calidad se le dé al cliente, se logrará hacer un tiempo menor, agilizando los procesos y terminándolos más rápido como fue con los clientes en azul.

ggplot(datoscopia, aes(x=tiempo_calidad, y=tiempo_min, color=cliente)) +
  geom_point() + geom_rug()
## Warning: Removed 343 rows containing missing values (geom_point).

# En esta grafica se tiene la intención de ver a los compradores predominantes dentro de FORM durante los tres meses predictivos, esto para poder lograr una atención especializada y ver más o menos el tiempo que toman sus productos y generar un tipo de procesos más fluido.

ggplot(datoscopia, aes(x=cliente, y=laminas_procesadas, color=mes)) +
  geom_point() + geom_rug()
## Warning: Removed 1148 rows containing missing values (geom_point).

### Series de tiempo-1
# Aquí se puede ver una serie de tiempo no lineal, lo cual nos dice que no se tienen procesos claros y estables para la producción, lo cual lo convierte en un proceso variable y con fallas en los tiempos de entregas como resultado.

ggplot(datoscopia,aes(x=fecha))+
  geom_line(aes(y=piezas_prog),color="orange")+
  labs(x="Fecha",y="piezas programadas", color="orange")+
  ggtitle("Grafica de tasa de rendimiento")
## Warning: Removed 179 row(s) containing missing values (geom_path).

# <span style = "color:darkorange"> **6. Base de Datos Externa** 

### Pronosticar el desempeño de la industria automotriz (EUA y MEX) para los 3 periodos de tiempo.

externo<- read.csv('externa_bd3 csv3.csv')
summary(externo)
##       Año            USA             MEX        
##  Min.   :2016   Min.   :48847   Min.   :103443  
##  1st Qu.:2017   1st Qu.:52256   1st Qu.:114333  
##  Median :2018   Median :54328   Median :124555  
##  Mean   :2018   Mean   :53932   Mean   :123036  
##  3rd Qu.:2020   3rd Qu.:55203   3rd Qu.:129521  
##  Max.   :2021   Max.   :59031   Max.   :143561
### Crear serie de tiempo

produccion_mexico<- c(externo$MEX)
produccion_usa<- c(externo$USA)


produccionm<-ts(data=produccion_mexico, start=c(2016,1), frequency=1)
produccionu<-ts(data=produccion_usa, start=c(2016,1), frequency=1)
produccionm
## Time Series:
## Start = 2016 
## End = 2021 
## Frequency = 1 
## [1] 103442.8 112230.6 120638.5 128470.9 129871.3 143560.9
produccionu
## Time Series:
## Start = 2016 
## End = 2021 
## Frequency = 1 
## [1] 48847.2 51672.2 54005.8 55387.1 54651.0 59030.7
modelom<- auto.arima(produccionm, D=1)
modelou<- auto.arima(produccionu, D=1)
modelom
## Series: produccionm 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##          drift
##       8023.620
## s.e.  1752.032
## 
## sigma^2 = 19186921:  log likelihood = -48.46
## AIC=100.92   AICc=106.92   BIC=100.14
modelou
## Series: produccionu 
## ARIMA(0,1,0) 
## 
## sigma^2 = 7012061:  log likelihood = -46.5
## AIC=95   AICc=96.34   BIC=94.61
pronosticom <- forecast(modelom, level=c(95), h=4)
pronosticom
##      Point Forecast    Lo 95    Hi 95
## 2022       151584.5 142999.3 160169.7
## 2023       159608.1 147466.8 171749.5
## 2024       167631.8 152761.7 182501.8
## 2025       175655.4 158485.0 192825.8
plot(pronosticom)

# Esta gráfica nos muestra el pronóstico estimado de acuerdo a los años de producción analizados. La base de datos nos muestra que el pronóstico de desempeño de la industria automotriz para EUA y México. De acuerdo a los resultados, ha habido un crecimiento ascendente en lal demanda desde 2016. Para años próximos, se pronostica que el desempeño de la indutria seguirá incrementando. Viendo los puntos azules, esto muestra un desempeño constante y significativo. En cuanto al apartado sombreado, este nos muestra el posible crecimiento ascendente o descendente que podría tener la demanda en años futuros, aunque como vemos, el pronóstico estima que será positivo.

pronosticou <- forecast(modelou, level=c(95), h=4)
pronosticou
##      Point Forecast    Lo 95    Hi 95
## 2022        59030.7 53840.66 64220.74
## 2023        59030.7 51690.87 66370.53
## 2024        59030.7 50041.28 68020.12
## 2025        59030.7 48650.61 69410.79
plot(pronosticou)

# La gráfica nos muestra un segundo punto de ascendencia. Al igual que el anterior, en el "eje x" vemos los valores de año y en el "eje y" la producción. A pesar de que esta gráfica refleja un pronóstico ascendente positivo, vemos que es mucho más constante y lineal que el anterior. Esto nos dice que hay una significancia elevada aunque menos ascendente que la primera gráfica.

### Pronosticar el desempeño de produccion de Form para los proximos 3 periodos de tiempo.

produccionform<- read.csv('p2 Form_produccionbaselimpia.csv')
summary(produccionform)
##     fecha             cliente            producto          piezas_prog   
##  Length:2679        Length:2679        Length:2679        Min.   : 1.00  
##  Class :character   Class :character   Class :character   1st Qu.:13.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :20.00  
##                                                           Mean   :26.53  
##                                                           3rd Qu.:32.50  
##                                                           Max.   :99.00  
##   tiempo_min        esta_arranque      laminas_procesadas tiempo_calidad 
##  Length:2679        Length:2679        Min.   : 1.00      Min.   : 0.00  
##  Class :character   Class :character   1st Qu.:16.00      1st Qu.: 1.00  
##  Mode  :character   Mode  :character   Median :21.00      Median : 1.00  
##                                        Mean   :30.18      Mean   : 1.16  
##                                        3rd Qu.:41.00      3rd Qu.: 1.00  
##                                        Max.   :98.00      Max.   :22.00
### Crear serie de tiempo

produccionform<- c(produccionform$laminas_procesadas)


produccionf<-ts(data=produccionform, start=c(2022,7), end=c(2025, 12), frequency=12)

produccionf
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2022                           3   2   2   1   1   3
## 2023   2   5   5  10   5   1   5   7  12   4   7   1
## 2024  15   9   9   9  10  18  22  22   9  45  22  11
## 2025  22  11  11  21  11  11  11   6  11  11  11  11
modelof<- auto.arima(produccionf, D=1)

modelof
## Series: produccionf 
## ARIMA(2,1,0)(1,1,0)[12] 
## 
## Coefficients:
##           ar1      ar2     sar1
##       -0.7093  -0.3922  -0.6559
## s.e.   0.1707   0.1731   0.1338
## 
## sigma^2 = 79.45:  log likelihood = -106.7
## AIC=221.39   AICc=223.06   BIC=226.86
pronosticof <- forecast(modelof, level=c(95), h=3)
pronosticof
##          Point Forecast     Lo 95    Hi 95
## Jan 2026       16.15994 -1.310577 33.63046
## Feb 2026       10.94930 -7.244584 29.14318
## Mar 2026       12.23185 -7.267684 31.73139
plot(pronosticof)

### Describe los resultados 
# Realizamos una serie de tiempo tanto para la base de la industria automotriz como para la base de producción de FORM, este es enfocado a las laminas procesadas cada mes y en la industria es por año. Para poder realizar este Analisis de Resultado realizamos una grafica y un modelo de Predicción por medio de la función auto.arima. Gracias a esta función, le especificamos desde que Fecha empezará a obtener datos de la base de Datos y también colocamos la frecuencia, que se refiere a cómo se comporta, en cuestión a si se va a calcular por mes o por año. Así mismo, obtuvimos para la industria tanto en México como en EU, que son los países en los que se enfoca más FORM y obtengan mejor oportunidad de crecimiento. Al realizar este modelo calculamos para los próximos 3 periodos, en este caso para el 2025 y obtuvimos los siguientes resultados:

#  - *Industria Automotriz en México*: 
  
# 1. Partiendo de un margen del 95%, queriendo decir, que este modelo es más preciso por lo que al ver la grafica obtenemos      que tendrá un incremento constante en los próximos 3 años, partiendo del 2022. 
# 2. Este crecimiento de la industria automotriz en México se estima un crecimiento del 16% para 2025, lo que beneficia a      FORM para continuar produciendo en el mercado Mexicano. 

# - *Industria Automotriz en Estados Unidos*: 
  
# 1. Para 2022 el pronostico es de 59 mil, que este se puede mantener constante en los próximos 3 años hasta 2025
# 2. Se obtiene un escenario optimista con la precisión del 95%, lo que quiere decir que para finales del 2025, puede estar igual en 59 mil o aumentar hasta los 69 mil. Esto indicaría que va en aumento año con año y terminaría el 2025 con un aumento del casi 20%. Lo que indicaría algo bueno para FORM, dandole oportunidad a aumentar su cartera de clientes dentro del mercado Estadounidense y teniendo un buen impacto de la industria para los próximos periodos. 

# - *Empresa FORM*:
  
# 1. Se hizo el pronostico por mes y dando un periodo hasta el 2026, partiendo del 2022 con 3 en cuanto a producción de laminas procesadas, se estima que este tenga un aumento constante, ademas de que entre el 2024 y 2025 tenga un punto de pique más alto, que posteriormente volverá a estabilizarse pero que se mantendrá constante entre los 10 a 20 en producción.

# 2. Se pronostica que para el 2026 se tenga un 33 en producción del área de laminas procesadas, teniendo una precisión del 95% en un escenario optimista. Así mismo este se puede mantener constante en 10 o aumentar como se comentó anteriormente y este crecimiento a términos del 2026 tomando el escenario optimista, sería de poco mas del 90% lo que sería un gran aumento para FORM. También si fuera sin el 95% para inicios del 2026 serían 16 en producción con el 60% de aumento, lo que seguiría siendo algo importante para FORM.

6.Base de Datos Externa

# En esta base de datos externa se analizó una serie de tiempo enfocada principalmente en EUA y México ya que son las principales áreas de interés para la empresa de FORM. 

# Un hallazgo es que la industria automotriz en México se mantendrá en constante crecimiento en un lapso de 3 años en un futuro. Con un pronóstico de un 95% lo cual es muy óptimo a que suceda. 

# Si se analiza hasta el año 2025, existe un 16% de crecimiento en la industria, por lo que a FORM, le conviene hoy en día continuar con la mano de obra en México y seguir vendiendo a compañías extranjeras. 

# Por la parte de EUA, se espera un crecimiento para el 2025 de un 20% , por lo que nos determinó que la industria automotriz estado unidos se mantiene en constante crecimiento año tras año. 

# Para la empresa de FORM, se espera que exista un crecimiento en los próximos años en lo que es la producción de láminas procesadas, se espera que este tenga un aumento constante, por lo que sería una ventaja competitiva preparar los procesos de láminas desde este año para que en los próximos años que este proceso de laminado aumente no existan tantos errores buscando perfeccionar el proceso.

7. K-Means Clustering

## Cluster 3
## Importar base de datos

cluster3<-read.csv("HR_Bajas 2.csv") 
summary(cluster3)
##   NO.DE.BAJAS      APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  5.00   Length:78          Length:78          Min.   :25585      
##  1st Qu.: 49.75   Class :character   Class :character   1st Qu.:31751      
##  Median :167.50   Mode  :character   Mode  :character   Median :33797      
##  Mean   :139.60                                         Mean   :33611      
##  3rd Qu.:212.75                                         3rd Qu.:36519      
##  Max.   :238.00                                         Max.   :44632      
##       EDAD          GENERO          FECHA.DE.ALTA   MOTIVO.DE.BAJA    
##  Min.   : 0.00   Length:78          Min.   :43961   Length:78         
##  1st Qu.:22.25   Class :character   1st Qu.:44567   Class :character  
##  Median :30.00   Mode  :character   Median :44726   Mode  :character  
##  Mean   :30.50                      Mean   :44664                     
##  3rd Qu.:36.00                      3rd Qu.:44759                     
##  Max.   :52.00                      Max.   :44790                     
##  DIAS.TRABAJADOS       BAJA          PUESTO          DEPARTAMENTO      
##  Min.   :  0.00   Min.   :44569   Length:78          Length:78         
##  1st Qu.:  9.00   1st Qu.:44613   Class :character   Class :character  
##  Median : 19.00   Median :44741   Mode  :character   Mode  :character  
##  Mean   : 45.10   Mean   :44709                                        
##  3rd Qu.: 39.75   3rd Qu.:44784                                        
##  Max.   :730.00   Max.   :44814                                        
##  NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:78          Min.   :151.6       Min.   :   0.0       
##  Class :character   1st Qu.:180.7       1st Qu.:   0.0       
##  Mode  :character   Median :180.7       Median :   0.0       
##                     Mean   :174.3       Mean   : 130.4       
##                     3rd Qu.:180.7       3rd Qu.:   0.0       
##                     Max.   :183.7       Max.   :2795.3       
##  NO.CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP              CALLE          
##  Min.   :0.000e+00    Length:78           Length:78          Length:78         
##  1st Qu.:0.000e+00    Class :character    Class :character   Class :character  
##  Median :0.000e+00    Mode  :character    Mode  :character   Mode  :character  
##  Mean   :1.871e+08                                                             
##  3rd Qu.:0.000e+00                                                             
##  Max.   :6.919e+09                                                             
##  NUMERO.INTERNO       COLONIA          CODIGO.POSTAL    MUNICIPIO        
##  Length:78          Length:78          Min.   :25019   Length:78         
##  Class :character   Class :character   1st Qu.:33604   Class :character  
##  Mode  :character   Mode  :character   Median :33604   Mode  :character  
##                                        Mean   :46508                     
##                                        3rd Qu.:66645                     
##                                        Max.   :67450                     
##     ESTADO          ESTADO.CIVIL       TARJETA.CUENTA    
##  Length:78          Length:78          Length:78         
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
## 
str(cluster3)
## 'data.frame':    78 obs. of  26 variables:
##  $ NO.DE.BAJAS          : int  5 6 7 8 9 11 12 16 19 20 ...
##  $ APELLIDOS            : chr  "BERNAL FLORES" "SAUCEDO GUZMAN" "MEZA LLANAS" "TORRES LARA" ...
##  $ NOMBRE               : chr  "ERIKA ROSALINDA" "GUADALUPE" "YOANA CRISTINA" "CESAR ANTONIO" ...
##  $ FECHA.DE.NACIMIENTO  : int  33997 28106 34174 33491 26422 36970 32443 37872 37512 36915 ...
##  $ EDAD                 : int  29 46 29 31 50 21 34 19 20 21 ...
##  $ GENERO               : chr  "FEMENINO" "FEMENINO" "FEMENINO" "MASCULINO" ...
##  $ FECHA.DE.ALTA        : int  44518 44532 44532 44538 44551 44531 44532 44488 44541 44546 ...
##  $ MOTIVO.DE.BAJA       : chr  "RENUNCIA VOLUNTARIA" "BAJA POR FALTAS" "BAJA POR FALTAS" "BAJA POR FALTAS" ...
##  $ DIAS.TRABAJADOS      : int  51 37 37 31 18 40 39 86 33 28 ...
##  $ BAJA                 : int  44569 44569 44569 44569 44569 44571 44571 44574 44574 44574 ...
##  $ PUESTO               : chr  "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
##  $ DEPARTAMENTO         : chr  "VARIOS" "VARIOS" "VARIOS" "VARIOS" ...
##  $ NO.SEGURO.SOCIAL     : chr  "43109363747" "43937683647" "43099330201" "43099151714" ...
##  $ SALARIO.DIARIO.IMSS  : num  152 152 152 152 152 ...
##  $ FACTOR.CRED.INFONAVIT: num  0 1320 0 0 0 ...
##  $ NO.CREDITO.INFONAVIT : num  0.00 1.92e+09 0.00 0.00 0.00 ...
##  $ LUGAR.DE.NACIMIENTO  : chr  "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" ...
##  $ CURP                 : chr  "BEFE930128MNLRLR05" "SAGG761212MNLCZD08" "MELY930724MNLZLN01" "TOLC910910HNLRRS09" ...
##  $ CALLE                : chr  "JULIAN VILLAGRAN" "PAPAGAYOS" "RIO AMANONAS" "PALMERA" ...
##  $ NUMERO.INTERNO       : chr  "452" "220" "300" "104" ...
##  $ COLONIA              : chr  "REFORMA" "GOLONDRINAS" "PUEBLO NUEVO" "MIRADOR DEL PARQUE" ...
##  $ CODIGO.POSTAL        : int  66640 66649 66646 67254 67114 66645 66646 66646 66645 66646 ...
##  $ MUNICIPIO            : chr  "APODACA" "APODACA" "APODACA" "JUAREZ" ...
##  $ ESTADO               : chr  "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" ...
##  $ ESTADO.CIVIL         : chr  "SOLTERO/A" "SOLTERO/A" "UNION LIBRE" "UNION LIBRE" ...
##  $ TARJETA.CUENTA       : chr  "BANORTE" "BANORTE" "BANORTE" "BANORTE" ...
## Número de clusters
## Juntar los datos relacionados a edad en años
newbd<-cluster3 %>% select(EDAD,SALARIO.DIARIO.IMSS,PUESTO)
summary(newbd)
##       EDAD       SALARIO.DIARIO.IMSS    PUESTO         
##  Min.   : 0.00   Min.   :151.6       Length:78         
##  1st Qu.:22.25   1st Qu.:180.7       Class :character  
##  Median :30.00   Median :180.7       Mode  :character  
##  Mean   :30.50   Mean   :174.3                         
##  3rd Qu.:36.00   3rd Qu.:180.7                         
##  Max.   :52.00   Max.   :183.7
## Normalizar los datos
newbdnorm<-scale(newbd[2:1])

## Gráfica para ver número óptimo de clusters
fviz_nbclust(newbdnorm, kmeans, method="wss")+ # wss method considers total within sum of square
  geom_vline(xintercept=4, linetype=2)+           # optimal number of clusters is computed with the default method = "euclidean"
  labs(subtitle = "Elbow method")

# Esta gráfica justifica que lo ideal es realizar 4 clusters para tener un entendimiento ideal de los datos.

## Visualizar información
newbd2clus<-kmeans(newbdnorm,4)
newbd2clus
## K-means clustering with 4 clusters of sizes 12, 17, 26, 23
## 
## Cluster means:
##   SALARIO.DIARIO.IMSS       EDAD
## 1           0.5317981  1.5586093
## 2          -1.8780410 -0.1112219
## 3           0.5184044 -0.8844567
## 4           0.5246350  0.2688407
## 
## Clustering vector:
##  [1] 2 2 2 2 2 2 2 2 2 2 2 2 1 3 3 4 3 3 3 3 2 1 2 2 2 2 4 4 1 1 1 3 3 4 4 3 3 4
## [39] 1 3 3 4 1 3 1 4 4 3 4 4 4 4 4 4 4 3 3 1 3 3 3 4 4 3 4 4 4 1 3 4 1 4 1 3 3 3
## [77] 3 3
## 
## Within cluster sum of squares by cluster:
## [1]  1.534968 15.627899  7.104697  1.698551
##  (between_SS / total_SS =  83.1 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
## Ver resultados de clusters
fviz_cluster(newbd2clus,data=newbdnorm)

## Agregar los resultados al dataset original para interpretación
newbd3<-newbd 
newbd3$Clusters<-newbd2clus$cluster
summary(newbd3)
##       EDAD       SALARIO.DIARIO.IMSS    PUESTO             Clusters    
##  Min.   : 0.00   Min.   :151.6       Length:78          Min.   :1.000  
##  1st Qu.:22.25   1st Qu.:180.7       Class :character   1st Qu.:2.000  
##  Median :30.00   Median :180.7       Mode  :character   Median :3.000  
##  Mean   :30.50   Mean   :174.3                          Mean   :2.769  
##  3rd Qu.:36.00   3rd Qu.:180.7                          3rd Qu.:4.000  
##  Max.   :52.00   Max.   :183.7                          Max.   :4.000
## Crear datasets para ver la información de características por edad por clusters
newbd4<-newbd3 %>% group_by(Clusters,PUESTO) %>% summarise(EDAD=max(EDAD),SALARIO.DIARIO.IMSS=mean(SALARIO.DIARIO.IMSS)) %>% arrange(desc(EDAD))
## `summarise()` has grouped output by 'Clusters'. You can override using the
## `.groups` argument.
summary(newbd4)
##     Clusters        PUESTO               EDAD       SALARIO.DIARIO.IMSS
##  Min.   :1.000   Length:13          Min.   :21.00   Min.   :151.6      
##  1st Qu.:1.000   Class :character   1st Qu.:27.00   1st Qu.:180.7      
##  Median :3.000   Mode  :character   Median :37.00   Median :180.7      
##  Mean   :2.615                      Mean   :36.31   Mean   :177.9      
##  3rd Qu.:4.000                      3rd Qu.:44.00   3rd Qu.:180.7      
##  Max.   :4.000                      Max.   :52.00   Max.   :181.2
## Agregar clusters por nombre
newbd3$Cluster_Names<-factor(newbd3$Clusters,levels = c(1,2,3,4), 
                          labels=c("Joven", "Avanzado ", " Adulto", "Jubilado"))
summary(newbd3)
##       EDAD       SALARIO.DIARIO.IMSS    PUESTO             Clusters    
##  Min.   : 0.00   Min.   :151.6       Length:78          Min.   :1.000  
##  1st Qu.:22.25   1st Qu.:180.7       Class :character   1st Qu.:2.000  
##  Median :30.00   Median :180.7       Mode  :character   Median :3.000  
##  Mean   :30.50   Mean   :174.3                          Mean   :2.769  
##  3rd Qu.:36.00   3rd Qu.:180.7                          3rd Qu.:4.000  
##  Max.   :52.00   Max.   :183.7                          Max.   :4.000  
##    Cluster_Names
##  Joven    :12   
##  Avanzado :17   
##   Adulto  :26   
##  Jubilado :23   
##                 
## 
## Agrupar por nombre y por columna
newbd5 <- newbd3%>% group_by(Cluster_Names,PUESTO) %>% dplyr:: summarize(EDAD=max(EDAD), 
                                                       SALARIO.DIARIO.IMSS =mean(SALARIO.DIARIO.IMSS),
                                                         Count=n())
## `summarise()` has grouped output by 'Cluster_Names'. You can override using the
## `.groups` argument.
## Visualizar gráficas
## Poner como tabla los datos
clusterssalario<-as.data.frame(newbd5)
clusterssalario
##    Cluster_Names                      PUESTO EDAD SALARIO.DIARIO.IMSS Count
## 1          Joven            AYUDANTE GENERAL   52            181.2356     9
## 2          Joven                 COSTURERO/A   44            180.6800     1
## 3          Joven        GUARDIA DE SEGURIDAD   45            176.7200     1
## 4          Joven              MONTACARGUISTA   42            180.6800     1
## 5      Avanzado             AYUDANTE GENERAL   50            151.6100    17
## 6         Adulto       AYUDANTE DE EMBARQUES   21            176.7200     1
## 7         Adulto            AYUDANTE GENERAL   27            180.7670    23
## 8         Adulto        INSPECTOR DE CALIDAD   26            180.6800     1
## 9         Adulto                    SOLDADOR   25            180.6800     1
## 10      Jubilado            AYUDANTE GENERAL   38            180.6800    20
## 11      Jubilado JEFE DE SEGURIDAD E HIGIENE   34            180.6800     1
## 12      Jubilado              MONTACARGUISTA   37            180.6800     1
## 13      Jubilado                   RESIDENTE   31            180.6800     1
## Graficar por nombre
ggplot(newbd5,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
  geom_bar(stat="identity")

## Salario diario por número de clusters
ggplot(newbd5, aes(x=Cluster_Names,y=SALARIO.DIARIO.IMSS,fill= Cluster_Names,label=round(SALARIO.DIARIO.IMSS,digits=2))) + 
  geom_col() + 
  geom_text()

# Aquí nos podemos dar cuenta que los sueldos no varían mucho entre edades, pero es importante decir que se denota por centavos una mayoría en el sueldo de los jóvenes, específicamente más que en otros rangos de edades.

## Hallazgos relevantes de los clusters
# 1. El salario diario promedio de FORM es de $180 pesos mexicanos, es decir, $5,400 pesos mensuales. De acuerdo a datos compartidos por la INEGI, se prevé que para 2022 el salario mínimo en México sea de $5,255 pesos mensuales. Esto refleja que el salario mensual de FORM es 2% mayor al salario mínimo del país.
# 2. Se destacan tres razones principales de bajas de empleados: bajas por faltas, renuncia voluntaria o término de contrato. En su mayoría, hubo una baja por faltas del puesto de ayudante general y renuncia voluntaria para el mismo puesto.
# 3. Hubo un alto número de bajas de empleados que trabajaron más de 200 días, es decir, la mayoría de los ex-empleados estuvieron en FORM más de 1 año y tenían un salario promedio de $180 pesos.
# 4. Los sueldos de los empleados no varían mucho dependiendo de la edad. Sin embargo, vemos que hay mayor rotación para el grupo ‘adulto’
## Cluster 1
library(foreign)
library(dplyr)        # data manipulation 
library(ggplot2)      # data visualization 
library(psych)        # functions for multivariate analysis 
library(corrplot)     # correlation plots
library(jtools)       # presentation of regression analysis 
library(lmtest)       # diagnostic checks - linear regression analysis 
library(car)          # diagnostic checks - linear regression analysis
library(factoextra)   # provides functions to extract and visualize the output of exploratory multivariate data analyses
library(ggfortify)    # data visualization tools for statistical analysis results
## Llamar base de datos.
rh <- read.csv('HR_Bajas 2.csv')

rh1<-rh %>% dplyr:: select(EDAD,DIAS.TRABAJADOS,SALARIO.DIARIO.IMSS,GENERO)
summary(rh1)
##       EDAD       DIAS.TRABAJADOS  SALARIO.DIARIO.IMSS    GENERO         
##  Min.   : 0.00   Min.   :  0.00   Min.   :151.6       Length:78         
##  1st Qu.:22.25   1st Qu.:  9.00   1st Qu.:180.7       Class :character  
##  Median :30.00   Median : 19.00   Median :180.7       Mode  :character  
##  Mean   :30.50   Mean   : 45.10   Mean   :174.3                         
##  3rd Qu.:36.00   3rd Qu.: 39.75   3rd Qu.:180.7                         
##  Max.   :52.00   Max.   :730.00   Max.   :183.7
## Normalizar los datos
rh1_norm<-scale(rh1[2:3]) 

## Número óptimo de clusters
fviz_nbclust(rh1_norm, kmeans, method="wss")+ # wss method considers total within sum of square
  geom_vline(xintercept=4, linetype=2)+           # optimal number of clusters is computed with the default method = "euclidean"
  labs(subtitle = "Elbow method") 

## Visualizar la información de clusters
rh1_cluster<-kmeans(rh1_norm,4)
rh1_cluster
## K-means clustering with 4 clusters of sizes 1, 17, 8, 52
## 
## Cluster means:
##   DIAS.TRABAJADOS SALARIO.DIARIO.IMSS
## 1       7.5323951           0.5246350
## 2       0.2712304          -1.8780410
## 3       0.6353722           0.4428101
## 4      -0.3312748           0.5357612
## 
## Clustering vector:
##  [1] 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 3 2 4 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4
## [39] 4 4 4 4 4 4 4 3 4 4 3 3 3 1 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4
## [77] 4 4
## 
## Within cluster sum of squares by cluster:
## [1] 0.000000 6.019937 3.270968 1.055662
##  (between_SS / total_SS =  93.3 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
## Visualizar resultados
fviz_cluster(rh1_cluster,data=rh1_norm)

# El primer cluster analiza la relación entre el salario diario IMSS y los días trabajados de los empleados que ya fueron dados de baja. En este caso, vemos que hay un impacto alto entre aquellos empleados que trabajaron de 2 a 8 días, pero tuvieron un salario diario bajo, mucho menor a 0 en la gráfica. Los otros dos resultados, se muestra que trabajaron menos días, pero al igual que el primer cluster explicado, tuvieron un salario muy bajo. Con estos tres, hay una correlación alta, significativa y negativa. Para el grupo de arriba, vemos que estos trabajaron un promedio de 2-3 días y tuvieron un salario diario muy alto. Podemos inferir que este grupo pertenece al área administrativa, que como vimos en análisis anteriores, son el grupo con un salario mucho más alto al resto.

rh2<-rh1
rh2$Clusters<-rh1_cluster$cluster
summary(rh2)
##       EDAD       DIAS.TRABAJADOS  SALARIO.DIARIO.IMSS    GENERO         
##  Min.   : 0.00   Min.   :  0.00   Min.   :151.6       Length:78         
##  1st Qu.:22.25   1st Qu.:  9.00   1st Qu.:180.7       Class :character  
##  Median :30.00   Median : 19.00   Median :180.7       Mode  :character  
##  Mean   :30.50   Mean   : 45.10   Mean   :174.3                         
##  3rd Qu.:36.00   3rd Qu.: 39.75   3rd Qu.:180.7                         
##  Max.   :52.00   Max.   :730.00   Max.   :183.7                         
##     Clusters    
##  Min.   :1.000  
##  1st Qu.:3.000  
##  Median :4.000  
##  Mean   :3.423  
##  3rd Qu.:4.000  
##  Max.   :4.000
## Crear un dataset
rh3<-rh2 %>% group_by(Clusters) %>% summarise(SALARIO.DIARIO.IMSS=max(SALARIO.DIARIO.IMSS), DIAS.TRABAJADOS=mean(DIAS.TRABAJADOS)) %>% arrange(desc(SALARIO.DIARIO.IMSS))
summary(rh3)
##     Clusters    SALARIO.DIARIO.IMSS DIAS.TRABAJADOS 
##  Min.   :1.00   Min.   :151.6       Min.   : 14.98  
##  1st Qu.:1.75   1st Qu.:173.4       1st Qu.: 56.07  
##  Median :2.50   Median :180.7       Median : 86.32  
##  Mean   :2.50   Mean   :174.2       Mean   :229.41  
##  3rd Qu.:3.25   3rd Qu.:181.4       3rd Qu.:259.66  
##  Max.   :4.00   Max.   :183.7       Max.   :730.00
## Agrupar clusters por nombre
rh2$Cluster_Names<-factor(rh2$Clusters,levels = c(1,2,3,4), 
                          labels=c("Bajo", "Promedio ", "Arriba del prom", "Alto"))
summary(rh2)
##       EDAD       DIAS.TRABAJADOS  SALARIO.DIARIO.IMSS    GENERO         
##  Min.   : 0.00   Min.   :  0.00   Min.   :151.6       Length:78         
##  1st Qu.:22.25   1st Qu.:  9.00   1st Qu.:180.7       Class :character  
##  Median :30.00   Median : 19.00   Median :180.7       Mode  :character  
##  Mean   :30.50   Mean   : 45.10   Mean   :174.3                         
##  3rd Qu.:36.00   3rd Qu.: 39.75   3rd Qu.:180.7                         
##  Max.   :52.00   Max.   :730.00   Max.   :183.7                         
##     Clusters             Cluster_Names
##  Min.   :1.000   Bajo           : 1   
##  1st Qu.:3.000   Promedio       :17   
##  Median :4.000   Arriba del prom: 8   
##  Mean   :3.423   Alto           :52   
##  3rd Qu.:4.000                        
##  Max.   :4.000
## Agrupar y dar resumen por nombres
rh4 <- rh2%>% group_by (Cluster_Names, GENERO) %>% dplyr:: summarize(DIAS.TRABAJADOS=max(DIAS.TRABAJADOS), 
                                                     SALARIO.DIARIO.IMSS =mean(SALARIO.DIARIO.IMSS),
                                                             Count=n())
## `summarise()` has grouped output by 'Cluster_Names'. You can override using the
## `.groups` argument.
## Dar formato de tabla para enseñar la información de los clusters
clusters<-as.data.frame(rh4)
clusters
##     Cluster_Names    GENERO DIAS.TRABAJADOS SALARIO.DIARIO.IMSS Count
## 1            Bajo MASCULINO             730            180.6800     1
## 2       Promedio   FEMENINO             161            151.6100    10
## 3       Promedio  MASCULINO             169            151.6100     7
## 4 Arriba del prom  FEMENINO             251            180.0200     6
## 5 Arriba del prom MASCULINO              88            178.7000     2
## 6            Alto  FEMENINO              53            180.8151    37
## 7            Alto MASCULINO              33            180.8133    15
## Graficar el número de datos observados por nombre de clusterslets
ggplot(rh4,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
  geom_bar(stat="identity")

# De acuerdo a la clasificación de clusters, la gráfica anterior nos muestra el impacto y conteo de cada cluster dependiendo del grupo de baja analizado, es decir, vemos la relación entre días trabajados y salario diario, clasificando el conteo acorde a la cantidad de bajas obtenidas. En este caso, en la gráfica se muestra que aquellos que trabajaron más de 600 días y menos de 1900 días, obtuvieron un salario promedio de $500 pesos diario. Entra en la categoría de ‘bajo’, ya que sólo una persona obtuvo esta descripción. El promedio de las personas dadas de baja trabajaron más de 1900 días y obtuvieron un salario diario de $170 pesos. En la barra de ‘alto’ vemos a aquellos ex-empleados que trabajaron 421 días y tuvieron un salario diario de $150 pesos. Por último, vemos a aquellos ‘arriba del promedio’ y son aquellos que tabajaron un promedio de 455 días y tuvieron un salario diario de $180 pesos. Este último grupo es el que tuvo mayor conteo de personas, es decir, la mayoría de las bajas estuvieron laborando más de un año en FORM y tenían un salario diario de $180 pesos.

## Ver rangos
## Rangos de "días trabajados" por nombre
ggplot(rh4, aes(x=Cluster_Names,y=DIAS.TRABAJADOS,fill= Cluster_Names,label=round(DIAS.TRABAJADOS,digits=2))) + 
  geom_col() + 
  geom_text()

# La gráfica anterior nos presenta la cantidad de días trabajados de acuerdo a la clasificación explicada anteriormente de ‘bajo’, ‘promedio’, ‘arriba del promedio’ y ‘alto’. Con esto en mente, vemos que el promedio de los empleados juntaron un total de 1966 días trabajados, siguiéndole el grupo de ‘bajo’, los que laboraron un promedio de 628 días, luego ‘arriba del promedio’ que laboró 455 días y finalmente ‘alto’, que únicamente laboró 421 días. En todos los grupos, vemos que los empleados trabajaron por más de 1 año en FORM y ganaban un salario diario mayor a $150 pesos.

## Rango de "salario diario"
ggplot(rh4,aes(x=Cluster_Names,y=SALARIO.DIARIO.IMSS,fill= Cluster_Names,label=round(SALARIO.DIARIO.IMSS,digits=2))) + 
  geom_col() + 
  geom_text()

# La gráfica anterior nos presenta la relación entre el salario diario IMSS y la clasificación explicada anteriormente de ‘bajo’, ‘promedio’, ‘arriba del promedio’ y ‘alto’. Con esto en mente, vemos que el segmento ‘bajo’ es el que tenía un salario más alto que la mayoría. El promedio ganaba un salario diario de $170,79 pesos, ‘arriba del promedio’ ganaba $180,54 pesos y el segmento ‘alto’ gabana un promedio de $151,61 pesos de salario diario. Esto denota una variabilidad alta y podemos suponer que esto se debía de acuerdo a las responsabilidades y puestos analizados.

## Dispersión de "días trabajados"
ggplot(rh2, aes(x=Cluster_Names, y=DIAS.TRABAJADOS, fill=Cluster_Names)) +
  geom_boxplot()+
  ggtitle("Dispersión of 'Días trabajados' by Clusters Names")

# La gráfica anterior explica la dispersión de días trabajados de acuerdo a la clasificación explicada anteriormente de ‘bajo’, ‘promedio’, ‘arriba del promedio’ y ‘alto’. Con esto en mente, vemos que el grupo con mayor dispersión es ‘promedio’, pues hay una variabilidad más significativa en los datos de la cantidad de días trabajados, destacando la media de días trabajados, es decir, 1000 días. En el caso de ‘bajo’, hay una dispersión baja y poco variable. Para ‘arriba del promedio’, vemos que los puntos atípicos se salen del boxplot específico, lo cual quitarlos nos puede dar mayor claridad y visibilidad de la información. Para ‘alto’ se muestra una dispersión menor a ‘promedio’ y al igual que ‘arriba del promedio’, tiene aparición de puntos atípicos.

## Dispersión de "salario diario"
ggplot(rh2, aes(x=Cluster_Names, y=SALARIO.DIARIO.IMSS, fill=Cluster_Names)) +
  geom_boxplot()+
  ggtitle("Dispersion of 'Salario_Diario' by Clusters Names")

# La gráfica anterior explica la dispersión de salario diario de acuerdo a la clasificación explicada anteriormente de ‘bajo’, ‘promedio’, ‘arriba del promedio’ y ‘alto’. ‘Bajo’ muestra un salario diario de $500 pesos, ‘promedio’ muestra un salario de $180 pesos aprox y puntos atípicos que podrían insinuar un salario menor, ‘arriba del promedio’ también muestra puntos atípicos. Sin embargo, todos se mantienen al igual que el dato anterior entre $170 y $180 pesos de salario diario, Finalmente, ‘alto’ muestra un salario diario abajo del promedio de aprox. $140 pesos.


## Cluster 2

## Importar base de datos.
rhCluster2<-read.csv("HR_Bajas 2.csv") 
summary(rhCluster2)
##   NO.DE.BAJAS      APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  5.00   Length:78          Length:78          Min.   :25585      
##  1st Qu.: 49.75   Class :character   Class :character   1st Qu.:31751      
##  Median :167.50   Mode  :character   Mode  :character   Median :33797      
##  Mean   :139.60                                         Mean   :33611      
##  3rd Qu.:212.75                                         3rd Qu.:36519      
##  Max.   :238.00                                         Max.   :44632      
##       EDAD          GENERO          FECHA.DE.ALTA   MOTIVO.DE.BAJA    
##  Min.   : 0.00   Length:78          Min.   :43961   Length:78         
##  1st Qu.:22.25   Class :character   1st Qu.:44567   Class :character  
##  Median :30.00   Mode  :character   Median :44726   Mode  :character  
##  Mean   :30.50                      Mean   :44664                     
##  3rd Qu.:36.00                      3rd Qu.:44759                     
##  Max.   :52.00                      Max.   :44790                     
##  DIAS.TRABAJADOS       BAJA          PUESTO          DEPARTAMENTO      
##  Min.   :  0.00   Min.   :44569   Length:78          Length:78         
##  1st Qu.:  9.00   1st Qu.:44613   Class :character   Class :character  
##  Median : 19.00   Median :44741   Mode  :character   Mode  :character  
##  Mean   : 45.10   Mean   :44709                                        
##  3rd Qu.: 39.75   3rd Qu.:44784                                        
##  Max.   :730.00   Max.   :44814                                        
##  NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:78          Min.   :151.6       Min.   :   0.0       
##  Class :character   1st Qu.:180.7       1st Qu.:   0.0       
##  Mode  :character   Median :180.7       Median :   0.0       
##                     Mean   :174.3       Mean   : 130.4       
##                     3rd Qu.:180.7       3rd Qu.:   0.0       
##                     Max.   :183.7       Max.   :2795.3       
##  NO.CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP              CALLE          
##  Min.   :0.000e+00    Length:78           Length:78          Length:78         
##  1st Qu.:0.000e+00    Class :character    Class :character   Class :character  
##  Median :0.000e+00    Mode  :character    Mode  :character   Mode  :character  
##  Mean   :1.871e+08                                                             
##  3rd Qu.:0.000e+00                                                             
##  Max.   :6.919e+09                                                             
##  NUMERO.INTERNO       COLONIA          CODIGO.POSTAL    MUNICIPIO        
##  Length:78          Length:78          Min.   :25019   Length:78         
##  Class :character   Class :character   1st Qu.:33604   Class :character  
##  Mode  :character   Mode  :character   Median :33604   Mode  :character  
##                                        Mean   :46508                     
##                                        3rd Qu.:66645                     
##                                        Max.   :67450                     
##     ESTADO          ESTADO.CIVIL       TARJETA.CUENTA    
##  Length:78          Length:78          Length:78         
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
## 
str(rhCluster2)
## 'data.frame':    78 obs. of  26 variables:
##  $ NO.DE.BAJAS          : int  5 6 7 8 9 11 12 16 19 20 ...
##  $ APELLIDOS            : chr  "BERNAL FLORES" "SAUCEDO GUZMAN" "MEZA LLANAS" "TORRES LARA" ...
##  $ NOMBRE               : chr  "ERIKA ROSALINDA" "GUADALUPE" "YOANA CRISTINA" "CESAR ANTONIO" ...
##  $ FECHA.DE.NACIMIENTO  : int  33997 28106 34174 33491 26422 36970 32443 37872 37512 36915 ...
##  $ EDAD                 : int  29 46 29 31 50 21 34 19 20 21 ...
##  $ GENERO               : chr  "FEMENINO" "FEMENINO" "FEMENINO" "MASCULINO" ...
##  $ FECHA.DE.ALTA        : int  44518 44532 44532 44538 44551 44531 44532 44488 44541 44546 ...
##  $ MOTIVO.DE.BAJA       : chr  "RENUNCIA VOLUNTARIA" "BAJA POR FALTAS" "BAJA POR FALTAS" "BAJA POR FALTAS" ...
##  $ DIAS.TRABAJADOS      : int  51 37 37 31 18 40 39 86 33 28 ...
##  $ BAJA                 : int  44569 44569 44569 44569 44569 44571 44571 44574 44574 44574 ...
##  $ PUESTO               : chr  "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
##  $ DEPARTAMENTO         : chr  "VARIOS" "VARIOS" "VARIOS" "VARIOS" ...
##  $ NO.SEGURO.SOCIAL     : chr  "43109363747" "43937683647" "43099330201" "43099151714" ...
##  $ SALARIO.DIARIO.IMSS  : num  152 152 152 152 152 ...
##  $ FACTOR.CRED.INFONAVIT: num  0 1320 0 0 0 ...
##  $ NO.CREDITO.INFONAVIT : num  0.00 1.92e+09 0.00 0.00 0.00 ...
##  $ LUGAR.DE.NACIMIENTO  : chr  "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" ...
##  $ CURP                 : chr  "BEFE930128MNLRLR05" "SAGG761212MNLCZD08" "MELY930724MNLZLN01" "TOLC910910HNLRRS09" ...
##  $ CALLE                : chr  "JULIAN VILLAGRAN" "PAPAGAYOS" "RIO AMANONAS" "PALMERA" ...
##  $ NUMERO.INTERNO       : chr  "452" "220" "300" "104" ...
##  $ COLONIA              : chr  "REFORMA" "GOLONDRINAS" "PUEBLO NUEVO" "MIRADOR DEL PARQUE" ...
##  $ CODIGO.POSTAL        : int  66640 66649 66646 67254 67114 66645 66646 66646 66645 66646 ...
##  $ MUNICIPIO            : chr  "APODACA" "APODACA" "APODACA" "JUAREZ" ...
##  $ ESTADO               : chr  "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" ...
##  $ ESTADO.CIVIL         : chr  "SOLTERO/A" "SOLTERO/A" "UNION LIBRE" "UNION LIBRE" ...
##  $ TARJETA.CUENTA       : chr  "BANORTE" "BANORTE" "BANORTE" "BANORTE" ...
## Exportar 'k-means' en edad por años
humanos5<-rhCluster2 %>% select(EDAD,DIAS.TRABAJADOS,SALARIO.DIARIO.IMSS,ESTADO.CIVIL)
summary(humanos5)
##       EDAD       DIAS.TRABAJADOS  SALARIO.DIARIO.IMSS ESTADO.CIVIL      
##  Min.   : 0.00   Min.   :  0.00   Min.   :151.6       Length:78         
##  1st Qu.:22.25   1st Qu.:  9.00   1st Qu.:180.7       Class :character  
##  Median :30.00   Median : 19.00   Median :180.7       Mode  :character  
##  Mean   :30.50   Mean   : 45.10   Mean   :174.3                         
##  3rd Qu.:36.00   3rd Qu.: 39.75   3rd Qu.:180.7                         
##  Max.   :52.00   Max.   :730.00   Max.   :183.7
## Normalizar los datos
rhCluster_norm<-scale(humanos5[1:2]) 

## Calcular número de clusters
fviz_nbclust(rhCluster_norm, kmeans, method="wss")+ # wss method considers total within sum of square
  geom_vline(xintercept=4, linetype=2)+           # optimal number of clusters is computed with the default method = "euclidean"
  labs(subtitle = "Elbow method")

## Ver datos de los clusters
rh_cluster2<-kmeans(rh1_norm,4)
rh_cluster2
## K-means clustering with 4 clusters of sizes 1, 17, 8, 52
## 
## Cluster means:
##   DIAS.TRABAJADOS SALARIO.DIARIO.IMSS
## 1       7.5323951           0.5246350
## 2       0.2712304          -1.8780410
## 3       0.6353722           0.4428101
## 4      -0.3312748           0.5357612
## 
## Clustering vector:
##  [1] 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 3 2 4 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4
## [39] 4 4 4 4 4 4 4 3 4 4 3 3 3 1 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4
## [77] 4 4
## 
## Within cluster sum of squares by cluster:
## [1] 0.000000 6.019937 3.270968 1.055662
##  (between_SS / total_SS =  93.3 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
## Visualizar clustering
fviz_cluster(rh_cluster2,data=rhCluster_norm)

# La gráfica anterior muestra 4 clusters que analizan la relación entre edad y días trabajados. El cluster verde muestra que un alto número de personas tabajaba más días que el promedio y tenía una edad similar al promedio. El punto naranja muestra que pocos usuarios trabajaban más días que el promedio y al igual que el punto anterior, tenían una edad promedio. En el caso del punto azul y el morado, ambos muestran que un mayor grupo de personas laboraba ‘2 días’, pero tenía mayor variabilidad en la edad.

## Agregar la información al dataset original
humanos6<-humanos5
humanos6$Clusters<-rh_cluster2$cluster
summary(humanos6)
##       EDAD       DIAS.TRABAJADOS  SALARIO.DIARIO.IMSS ESTADO.CIVIL      
##  Min.   : 0.00   Min.   :  0.00   Min.   :151.6       Length:78         
##  1st Qu.:22.25   1st Qu.:  9.00   1st Qu.:180.7       Class :character  
##  Median :30.00   Median : 19.00   Median :180.7       Mode  :character  
##  Mean   :30.50   Mean   : 45.10   Mean   :174.3                         
##  3rd Qu.:36.00   3rd Qu.: 39.75   3rd Qu.:180.7                         
##  Max.   :52.00   Max.   :730.00   Max.   :183.7                         
##     Clusters    
##  Min.   :1.000  
##  1st Qu.:3.000  
##  Median :4.000  
##  Mean   :3.423  
##  3rd Qu.:4.000  
##  Max.   :4.000
## Crear dataset
humanos7<-humanos6 %>% group_by(Clusters, ESTADO.CIVIL) %>% summarise(EDAD=max(EDAD),DIAS.TRABAJADOS=mean(DIAS.TRABAJADOS)) %>% arrange(desc(EDAD))
## `summarise()` has grouped output by 'Clusters'. You can override using the
## `.groups` argument.
summary(humanos7)
##     Clusters     ESTADO.CIVIL            EDAD       DIAS.TRABAJADOS 
##  Min.   :1.000   Length:11          Min.   :27.00   Min.   : 12.71  
##  1st Qu.:2.000   Class :character   1st Qu.:32.00   1st Qu.: 23.83  
##  Median :3.000   Mode  :character   Median :35.00   Median : 76.44  
##  Mean   :2.818                      Mean   :39.27   Mean   :129.20  
##  3rd Qu.:3.500                      3rd Qu.:48.50   3rd Qu.:115.00  
##  Max.   :4.000                      Max.   :52.00   Max.   :730.00
## Agrupar clusters por nombre
humanos6$Cluster_Names<-factor(humanos6$Clusters,levels = c(1,2,3,4), 
                               labels=c("Joven", "Avanzado ", " Adulto", "Jubilado"))
summary(humanos6)
##       EDAD       DIAS.TRABAJADOS  SALARIO.DIARIO.IMSS ESTADO.CIVIL      
##  Min.   : 0.00   Min.   :  0.00   Min.   :151.6       Length:78         
##  1st Qu.:22.25   1st Qu.:  9.00   1st Qu.:180.7       Class :character  
##  Median :30.00   Median : 19.00   Median :180.7       Mode  :character  
##  Mean   :30.50   Mean   : 45.10   Mean   :174.3                         
##  3rd Qu.:36.00   3rd Qu.: 39.75   3rd Qu.:180.7                         
##  Max.   :52.00   Max.   :730.00   Max.   :183.7                         
##     Clusters       Cluster_Names
##  Min.   :1.000   Joven    : 1   
##  1st Qu.:3.000   Avanzado :17   
##  Median :4.000    Adulto  : 8   
##  Mean   :3.423   Jubilado :52   
##  3rd Qu.:4.000                  
##  Max.   :4.000
# Entre más joven, más días trabajados.

## Agrupar por clusters y resumir columnas
humanos8 <- humanos6 %>% group_by(Cluster_Names, ESTADO.CIVIL) %>% dplyr:: summarize(EDAD=max(EDAD), 
                                                       DIAS.TRABAJADOS =mean(DIAS.TRABAJADOS),
                                                         Count=n())
## `summarise()` has grouped output by 'Cluster_Names'. You can override using the
## `.groups` argument.
## Convertir a tabla
clusters2<-as.data.frame(humanos8)
clusters2
##    Cluster_Names ESTADO.CIVIL EDAD DIAS.TRABAJADOS Count
## 1          Joven DIVORCIADO/A   32       730.00000     1
## 2      Avanzado      CASADO/A   28       155.00000     2
## 3      Avanzado     SOLTERO/A   50        76.44444     9
## 4      Avanzado   UNION LIBRE   35        31.33333     6
## 5         Adulto     CASADO/A   45       142.00000     3
## 6         Adulto DIVORCIADO/A   33        87.00000     1
## 7         Adulto    SOLTERO/A   27        67.00000     2
## 8         Adulto  UNION LIBRE   32        88.00000     2
## 9       Jubilado     CASADO/A   51        16.33333    18
## 10      Jubilado    SOLTERO/A   52        15.35000    20
## 11      Jubilado  UNION LIBRE   47        12.71429    14
## Visualizar gráficos
## Ver los días trabajados en general junto con la edad
ggplot(humanos8,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
  geom_bar(stat="identity")

# La gráfica anterior nos muestra la cantidad de días trabajados de acuerdo a la edad de los empleados. En este caso, vemos que el grupo de edad ‘joven’ tenían aprox. 31 años y representa un bajo porcentaje de los empleados. Para ‘avanzado’ son los empleados que tienen arriba de 32 años y laboraron la mayor cantidad de días (1067). Para ‘jubilado’, son las personas con un aprox. de 50 años y que laboraron durante 102 días. Finalmente, para el grupo de ‘adulto’ (el más elevado), son aquellos que laboraron un promedio de 44 días y tienen la edad de 52 años.

## Días trabajados por nombre de clusters
ggplot(humanos8, aes(x=Cluster_Names,y=DIAS.TRABAJADOS,fill= Cluster_Names,label=round(DIAS.TRABAJADOS,digits=2))) + 
  geom_col() + 
  geom_text()

# La gráfica anterior nos muestra la cantidad de días trabajados de acuerdo a los días trabajados. En este caso, esto nos muestra que el grupo con mayor bajas fueron del segmento ‘adulto’ y es el que laboró en promedio un menor número de días contra ‘avanzado’ que es el segundo grupo más bajo y laboró el mayor número de días en promedio.

## Edad por nombre de clusters
ggplot(humanos8,aes(x=Cluster_Names,y=EDAD,fill= Cluster_Names,label=round(EDAD,digits=2))) + 
  geom_col() + 
  geom_text()

# La gráfica anterior nos muestra la edad promedio de cada uno de los grupos. Como explicamos anteriormente, se muestra que ‘adulto’ es el de empleados con mayor edad y ‘joven’ es el de personas de menor edad.

### Dias trabajados por nombre de clusters


ggplot(humanos8, aes(x=Cluster_Names,y=DIAS.TRABAJADOS,fill= Cluster_Names,label=round(DIAS.TRABAJADOS,digits=2))) + 
  geom_col() + 
  geom_text()

#La gráfica anterior nos muestra la cantidad de días trabajados de acuerdo a los días trabajados. En este caso, esto nos muestra que el grupo con mayor bajas fueron del segmento 'adulto' y es el que laboró en promedio un menor número de días contra 'avanzado' que es el segundo grupo más bajo y laboró el mayor número de días en promedio.

### Edad por nombre de clusters 


ggplot(humanos8,aes(x=Cluster_Names,y=EDAD,fill= Cluster_Names,label=round(EDAD,digits=2))) + 
  geom_col() + 
  geom_text()

# La gráfica anterior nos muestra la edad promedio de cada uno de los grupos. Como explicamos anteriormente, se muestra que 'adulto' es el de empleados con mayor edad y 'joven' es el de personas de menor edad.

## Días trabajados por nombre de clusters
ggplot(humanos6, aes(x=Cluster_Names, y=EDAD, fill=Cluster_Names)) +
  geom_boxplot()+
  ggtitle("Dispersion of 'Edad' by Clusters Names")

# La gráfica anterior nos muestra la dispersión de acuerdo a la edad de los empleados. En el caso de ‘adulto’, tiene una gran cantidad de puntos atípicos lo cual indica que hay datos fuera de serie. En el caso de ‘jubilado’, vemos que es el grupo con mayor dispersión, mostrando datos de edad entre 25 y 32 años.

## Salario diario por nombre de clusters
ggplot(humanos6, aes(x=Cluster_Names, y=DIAS.TRABAJADOS, fill=Cluster_Names)) +
  geom_boxplot()+
  ggtitle("Dispersion of 'Dias_Trabajados' by Clusters Names")

# La gráfica anterior muestra la dispersión de acuerdo a días trabajados y los grupos anterior explicados. Vemos que ‘avanzado’ es el gurpo con mayor dispersión, mostrando que el promedio de los empleados laboraron entre 550 y 1300 días. Es el grupo con mayor número de empleados que trabajaron en este periodo de tiempo. En el caso de ‘adulto’ y ‘jubilado’, son aquellos grupos que muestran una dispersión baja y una variedad de puntos atípicos, mientras que ‘joven’ destaca una baja dispersión y una media de más de 500 días trabajados.

7.1 Predicción

library(TSstudio)

### Llamar base de datos

Companies <-read.csv("externa_bd1 csv1.csv")
summary(Companies)
##   Geography           Category          Data.Type             Unit          
##  Length:89          Length:89          Length:89          Length:89         
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Current.Constant       X2016              X2017              X2018         
##  Length:89          Min.   :       0   Min.   :       0   Min.   :       0  
##  Class :character   1st Qu.:     421   1st Qu.:     432   1st Qu.:     527  
##  Mode  :character   Median :    4383   Median :    4804   Median :    5063  
##                     Mean   :  939400   Mean   :  993634   Mean   : 1193476  
##                     3rd Qu.:   37794   3rd Qu.:   38307   3rd Qu.:   40769  
##                     Max.   :25902010   Max.   :27472550   Max.   :35218716  
##      X2019              X2020              X2021         
##  Min.   :       0   Min.   :       0   Min.   :       0  
##  1st Qu.:     529   1st Qu.:     548   1st Qu.:     607  
##  Median :    4849   Median :    5020   Median :    5477  
##  Mean   : 1376491   Mean   : 1554963   Mean   : 1904399  
##  3rd Qu.:   43779   3rd Qu.:   44564   3rd Qu.:   51280  
##  Max.   :39310235   Max.   :41193660   Max.   :63857942
### 1. Limpieza, Transformación y Organización de Bases de Datos

str(Companies)
## 'data.frame':    89 obs. of  11 variables:
##  $ Geography       : chr  "Azerbaijan" "Bangladesh" "Cambodia" "China" ...
##  $ Category        : chr  "Corrugated Paper, Paperboard and Containers" "Corrugated Paper, Paperboard and Containers" "Corrugated Paper, Paperboard and Containers" "Corrugated Paper, Paperboard and Containers" ...
##  $ Data.Type       : chr  "Production (turnover) MSP" "Production (turnover) MSP" "Production (turnover) MSP" "Production (turnover) MSP" ...
##  $ Unit            : chr  "AZN million" "BDT million" "KHR million" "CNY million" ...
##  $ Current.Constant: chr  "Current Prices" "Current Prices" "Current Prices" "Current Prices" ...
##  $ X2016           : num  40.6 115106.8 247100 309386.9 212.1 ...
##  $ X2017           : num  44.6 135423.7 257700 301286.2 212.7 ...
##  $ X2018           : num  47.3 156788.3 299500 317612.9 217.5 ...
##  $ X2019           : num  52.2 180445.4 314000 310925.3 216.8 ...
##  $ X2020           : num  51.5 198883.5 281100 312534.7 196.7 ...
##  $ X2021           : num  66.1 222755.3 285994.4 344612.2 191.4 ...
describe(Companies)
## # A tibble: 6 × 26
##   describ…¹     n    na   mean     sd se_mean    IQR skewn…² kurto…³   p00   p01
##   <chr>     <int> <int>  <dbl>  <dbl>   <dbl>  <dbl>   <dbl>   <dbl> <dbl> <dbl>
## 1 X2016        89     0 9.39e5 4.18e6 443039. 37374.    5.19    27.1     0  20.7
## 2 X2017        89     0 9.94e5 4.40e6 466639. 37875.    5.12    26.3     0  20.7
## 3 X2018        89     0 1.19e6 5.40e6 572440. 40242.    5.28    28.3     0  23.1
## 4 X2019        89     0 1.38e6 6.29e6 667194. 43250.    5.19    26.7     0  24.0
## 5 X2020        89     0 1.55e6 7.16e6 759409. 44016.    5.08    24.9     0  20.1
## 6 X2021        89     0 1.90e6 9.14e6 968737. 50673.    5.53    31.3     0  23.8
## # … with 15 more variables: p05 <dbl>, p10 <dbl>, p20 <dbl>, p25 <dbl>,
## #   p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>, p75 <dbl>,
## #   p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and abbreviated
## #   variable names ¹​described_variables, ²​skewness, ³​kurtosis
#### Nota: Debido a la versión de R, nos deja descargar el paquete "psych". Sin embargo, no nos deja llamar a la librería "psych", por lo tanto utilizamos str, para obtener el numero de las variables de la base de datos.

### 2. Clasificación de variables
#### Realizamos una tabla para poder clasificar cada una de las variables de la base de Datos bd1

Variable<-c("Geography","Category","Data.Type", "Unit","Current Constant","Years")
Type<-c("Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cuantitativa (Continua)")
table<-data.frame(Variable,Type)
knitr::kable(table)
Variable Type
Geography Cualitativa
Category Cualitativa
Data.Type Cualitativa
Unit Cualitativa
Current Constant Cualitativa
Years Cuantitativa (Continua)
### 3. Escala de Medición
#Realizamos una tabla donde viene clasificado cada variable y agregamos una columna con la escala de medición para cada variable. 

Variable<-c("Geography","Category","Data.Type", "Unit","Current Constant","Years")
Type<-c("Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cuantitativa (Continua)")
Escala_de_Medición <- c("Países", "Producto", "Departamento","Tipo de Moneda", "Precio actual", "Ganancia (Razon)")
table<-data.frame(Variable,Type,Escala_de_Medición)
knitr::kable(table)
Variable Type Escala_de_Medición
Geography Cualitativa Países
Category Cualitativa Producto
Data.Type Cualitativa Departamento
Unit Cualitativa Tipo de Moneda
Current Constant Cualitativa Precio actual
Years Cuantitativa (Continua) Ganancia (Razon)
### 4. Limpieza de datos
#### La primer tecnica de limpieza que utilizamos fue, eliminar columnas debido a que contabamos con datos los cuales no eran relevantes para el análisis. 
#### La segunda herramienta de limpieza que utilizamos para la visulización de los datos fue implementar una nueva columna como el total de la Producción de las variables que se producen por país.

### Remover Valores Irrelevantes

#### Eliminar columnas
bd1 <- Companies
bd1<-subset(bd1,select=-c(Category,Data.Type,Current.Constant))
str(bd1)
## 'data.frame':    89 obs. of  8 variables:
##  $ Geography: chr  "Azerbaijan" "Bangladesh" "Cambodia" "China" ...
##  $ Unit     : chr  "AZN million" "BDT million" "KHR million" "CNY million" ...
##  $ X2016    : num  40.6 115106.8 247100 309386.9 212.1 ...
##  $ X2017    : num  44.6 135423.7 257700 301286.2 212.7 ...
##  $ X2018    : num  47.3 156788.3 299500 317612.9 217.5 ...
##  $ X2019    : num  52.2 180445.4 314000 310925.3 216.8 ...
##  $ X2020    : num  51.5 198883.5 281100 312534.7 196.7 ...
##  $ X2021    : num  66.1 222755.3 285994.4 344612.2 191.4 ...
#### Agregar Columnas
bd1$Total_Produccion<- bd1$X2016+bd1$X2017+bd1$X2018+bd1$X2019+bd1$X2020+bd1$X2021
bd1$Promedio_X2021<- mean(bd1$X2021)

summary(bd1)
##   Geography             Unit               X2016              X2017         
##  Length:89          Length:89          Min.   :       0   Min.   :       0  
##  Class :character   Class :character   1st Qu.:     421   1st Qu.:     432  
##  Mode  :character   Mode  :character   Median :    4383   Median :    4804  
##                                        Mean   :  939400   Mean   :  993634  
##                                        3rd Qu.:   37794   3rd Qu.:   38307  
##                                        Max.   :25902010   Max.   :27472550  
##      X2018              X2019              X2020              X2021         
##  Min.   :       0   Min.   :       0   Min.   :       0   Min.   :       0  
##  1st Qu.:     527   1st Qu.:     529   1st Qu.:     548   1st Qu.:     607  
##  Median :    5063   Median :    4849   Median :    5020   Median :    5477  
##  Mean   : 1193476   Mean   : 1376491   Mean   : 1554963   Mean   : 1904399  
##  3rd Qu.:   40769   3rd Qu.:   43779   3rd Qu.:   44564   3rd Qu.:   51280  
##  Max.   :35218716   Max.   :39310235   Max.   :41193660   Max.   :63857942  
##  Total_Produccion    Promedio_X2021   
##  Min.   :        0   Min.   :1904399  
##  1st Qu.:     3166   1st Qu.:1904399  
##  Median :    30333   Median :1904399  
##  Mean   :  7962363   Mean   :1904399  
##  3rd Qu.:   254492   3rd Qu.:1904399  
##  Max.   :204523302   Max.   :1904399
str(bd1)
## 'data.frame':    89 obs. of  10 variables:
##  $ Geography       : chr  "Azerbaijan" "Bangladesh" "Cambodia" "China" ...
##  $ Unit            : chr  "AZN million" "BDT million" "KHR million" "CNY million" ...
##  $ X2016           : num  40.6 115106.8 247100 309386.9 212.1 ...
##  $ X2017           : num  44.6 135423.7 257700 301286.2 212.7 ...
##  $ X2018           : num  47.3 156788.3 299500 317612.9 217.5 ...
##  $ X2019           : num  52.2 180445.4 314000 310925.3 216.8 ...
##  $ X2020           : num  51.5 198883.5 281100 312534.7 196.7 ...
##  $ X2021           : num  66.1 222755.3 285994.4 344612.2 191.4 ...
##  $ Total_Produccion: num  302 1009403 1685394 1896358 1247 ...
##  $ Promedio_X2021  : num  1904399 1904399 1904399 1904399 1904399 ...
#### ¿Cuántos NA's tengo en la base de datos?
sum(is.na(bd1))
## [1] 0
#### Nota: Se eliminan Category, Data.Type y Current.Constant, ya que no nos sirven, debido a que es el mismo dato para todos los registros y es algo que no nos aporta alguna información.

### 5. Análisis Exploratorio de las Bases de Datos

describe(bd1)
## # A tibble: 8 × 26
##   descr…¹     n    na   mean     sd se_mean    IQR skewn…² kurto…³    p00    p01
##   <chr>   <int> <int>  <dbl>  <dbl>   <dbl>  <dbl>   <dbl>   <dbl>  <dbl>  <dbl>
## 1 X2016      89     0 9.39e5 4.18e6  4.43e5 3.74e4    5.19    27.1 0      2.07e1
## 2 X2017      89     0 9.94e5 4.40e6  4.67e5 3.79e4    5.12    26.3 0      2.07e1
## 3 X2018      89     0 1.19e6 5.40e6  5.72e5 4.02e4    5.28    28.3 0      2.31e1
## 4 X2019      89     0 1.38e6 6.29e6  6.67e5 4.33e4    5.19    26.7 0      2.40e1
## 5 X2020      89     0 1.55e6 7.16e6  7.59e5 4.40e4    5.08    24.9 0      2.01e1
## 6 X2021      89     0 1.90e6 9.14e6  9.69e5 5.07e4    5.53    31.3 0      2.38e1
## 7 Total_…    89     0 7.96e6 3.60e7  3.82e6 2.51e5    5.03    24.4 0      1.51e2
## 8 Promed…    89     0 1.90e6 0       0      0       NaN      NaN   1.90e6 1.90e6
## # … with 15 more variables: p05 <dbl>, p10 <dbl>, p20 <dbl>, p25 <dbl>,
## #   p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>, p75 <dbl>,
## #   p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>, and abbreviated
## #   variable names ¹​described_variables, ²​skewness, ³​kurtosis
# En el análisis descriptivo se muestran los valores promedio del total de producciones de 2016 a 2021.

### Tabla de Frecuencia
bd2 <- table(bd1$Unit)
bd2 <- prop.table(bd2)
bd2
## 
## AED million AOA million ARS million AUD million AZN million BDT million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## BGN million BRL million BYR million CAD million CHF million CLP million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## CNY million COP million CRC million CUC million CZK million DKK million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## DOP million DZD million EGP million ETB million EUR million GBP million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.20224719  0.01123596 
## GEL million GHS million HKD million HRK million HuF million IDR million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## ILS million INR million IQD million IRR million ISK million JPY million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## KES million KHR million KRW million KWD million KZT million LKR million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## MAD million MXN million MYR million NGN million NOK million NZD million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## PAB million PEN million PHP million PKR million PLN million QAR million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## RON million RUB million SAR million SEK million SGD million THB million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596  0.01123596 
## TND million TRY million TWD million UAH million USD million UYU million 
##  0.01123596  0.01123596  0.01123596  0.01123596  0.03370787  0.01123596 
## UZS million VND million XAF million ZAR million 
##  0.01123596  0.01123596  0.01123596  0.01123596
### Tabla cruzada
table(bd1$Unit, bd1$Promedio_X2021)
##              
##               1904399.38539326
##   AED million                1
##   AOA million                1
##   ARS million                1
##   AUD million                1
##   AZN million                1
##   BDT million                1
##   BGN million                1
##   BRL million                1
##   BYR million                1
##   CAD million                1
##   CHF million                1
##   CLP million                1
##   CNY million                1
##   COP million                1
##   CRC million                1
##   CUC million                1
##   CZK million                1
##   DKK million                1
##   DOP million                1
##   DZD million                1
##   EGP million                1
##   ETB million                1
##   EUR million               18
##   GBP million                1
##   GEL million                1
##   GHS million                1
##   HKD million                1
##   HRK million                1
##   HuF million                1
##   IDR million                1
##   ILS million                1
##   INR million                1
##   IQD million                1
##   IRR million                1
##   ISK million                1
##   JPY million                1
##   KES million                1
##   KHR million                1
##   KRW million                1
##   KWD million                1
##   KZT million                1
##   LKR million                1
##   MAD million                1
##   MXN million                1
##   MYR million                1
##   NGN million                1
##   NOK million                1
##   NZD million                1
##   PAB million                1
##   PEN million                1
##   PHP million                1
##   PKR million                1
##   PLN million                1
##   QAR million                1
##   RON million                1
##   RUB million                1
##   SAR million                1
##   SEK million                1
##   SGD million                1
##   THB million                1
##   TND million                1
##   TRY million                1
##   TWD million                1
##   UAH million                1
##   USD million                3
##   UYU million                1
##   UZS million                1
##   VND million                1
##   XAF million                1
##   ZAR million                1
# La tabla nos muestra la cantidad promedio en millones producida en 2021 por cada unidad monetaria. En este caso, vemos que en 2021 se produjo en promedio más de 1MM de "currencies" (no se puede definir una unidad monetaria específica debido a que estamos ponderando distintas monedas internacionales). Conforme se analiza la tabla, vemos que el euro generó 18 veces el promedio de producción de cartón estimado para 2021, es decir, es la moneda internacional que más produjo cartón a nivel internacional en 2021. La siguiente moneda con mayor capacidad de producción fue USD millions.

### Gráficas de datos Cualitativas y Cuantitativas

#### Cualitativa con Unit
barplot(bd2, xlab='Tipo de Moneda',
        ylab='Frecuencia Relativa', las=1)

# La gráfica nos muestra que de acuerdo a la frecuencia relativa de producción, Indonesia es la unidad monetaria que más cartón ha entregado.

#### Cuantitativa con Total_Produccion
bd3 <- bd1
aggregate(x=bd3$Total_Produccion, by=list(bd3$Geography),FUN=sum)
##                 Group.1           x
## 1               Algeria     26366.2
## 2                Angola      4172.7
## 3             Argentina    757754.2
## 4             Australia     21642.9
## 5               Austria     10233.5
## 6            Azerbaijan       302.3
## 7            Bangladesh   1009403.0
## 8               Belarus      2931.2
## 9               Belgium      6339.5
## 10               Brazil    129369.8
## 11             Bulgaria      3166.2
## 12             Cambodia   1685394.4
## 13             Cameroon    197101.1
## 14               Canada     78979.4
## 15                Chile   6391369.9
## 16                China   1896358.2
## 17             Colombia  15542263.1
## 18           Costa Rica    967034.3
## 19              Croatia      8719.9
## 20                 Cuba       619.6
## 21               Cyprus       171.5
## 22       Czech Republic    178808.7
## 23              Denmark     32238.2
## 24   Dominican Republic     37293.6
## 25              Ecuador       949.5
## 26                Egypt     96033.6
## 27              Estonia       387.5
## 28             Ethiopia      5442.2
## 29              Finland      2612.9
## 30               France     33450.4
## 31              Georgia       194.3
## 32              Germany     77218.5
## 33                Ghana       673.7
## 34               Greece      2573.7
## 35     Hong Kong, China      1247.2
## 36              Hungary   1504747.7
## 37              Iceland      5561.8
## 38                India   2264525.5
## 39            Indonesia 204523301.8
## 40                 Iran 186021771.8
## 41                 Iraq     11680.2
## 42              Ireland      1873.4
## 43               Israel     22710.5
## 44                Italy     50972.2
## 45                Japan  15807772.3
## 46           Kazakhstan    203941.1
## 47                Kenya    112343.7
## 48               Kuwait       251.3
## 49               Latvia       463.0
## 50            Lithuania      1775.1
## 51           Luxembourg         0.0
## 52             Malaysia     23655.6
## 53               Mexico    738215.0
## 54              Morocco     16625.1
## 55          Netherlands     13921.1
## 56          New Zealand      7644.6
## 57              Nigeria    206027.0
## 58               Norway     11525.8
## 59             Pakistan    628812.7
## 60               Panama       221.3
## 61                 Peru      5083.5
## 62          Philippines    302208.8
## 63               Poland    118115.9
## 64             Portugal      5366.3
## 65          Puerto Rico       537.2
## 66                Qatar       189.5
## 67              Romania     16388.7
## 68               Russia   1590911.6
## 69         Saudi Arabia     36787.1
## 70            Singapore      3636.7
## 71             Slovakia      1317.9
## 72             Slovenia      1137.3
## 73         South Africa    277898.6
## 74          South Korea  59825405.8
## 75                Spain     31015.4
## 76            Sri Lanka    254492.0
## 77               Sweden     60578.6
## 78          Switzerland      5331.3
## 79               Taiwan    615169.6
## 80             Thailand    201398.4
## 81              Tunisia      2715.6
## 82               Turkey    195406.5
## 83              Ukraine    128095.2
## 84 United Arab Emirates     12957.3
## 85       United Kingdom     30332.9
## 86              Uruguay     83173.7
## 87                  USA    323594.0
## 88           Uzbekistan   5103054.3
## 89              Vietnam 198028864.1
# En la tabla anterior se muestra el total de producción generado por cada país. Haciendo una ponderación de los 5 países que mayor producción de cartón tienen (haciendo un conteo histórico de 2016 a 2021), vemos que se destacan Irán, Vietnam, Corea del Sur, Japón e Indonesia.

hist(log(bd1$Total_Produccion), main = "Histograma de Producción Total", xlab="Producción Total", 
     ylab="Frecuencia", col="blue1")

# En la gráfica anterior se simboliza la distribución de la muestra respecto a la producción total y la frecuencia de ésta. De acuerdo a la frecuencia total, vemos que se tiene una mayor producción por frecuencia entre 10 y 15, es decir, la producción total es más alta y tiene una frecuencia mayor a 15 que se muestra como el más elevado en el histograma.

### Gráficas de Dispersión

#### Relación Geography con Producción Total
ggplot(bd1, aes(x=Total_Produccion, y=Geography)) + 
  geom_point(shape=19, size=3) + labs(title = "Relación entre los Países y la Producción Total",caption ="Passport_ProducciónCarton",x="Producción_Total", y="Geography") + theme_classic()

# En la gráfica anterior se muestra la relación entre los países y la producción total. Se ve que hay una dispersión mayor para los países en el centro de la gráfica. Esto significa que hay más irregularidad en la producción total que han generado.

boxplot=subset(bd1,select = -c(Total_Produccion,Geography))
boxplot(bd1$Total_Produccion, main= "Total de producción")

# En la gráfica anterior vemos el total de producción de acuerdo a la geografía. Al igual que la gráfica anterior, hay una correlación mayor acorde al total de producción.

Vol<-ts(boxplot,start=c(2016,1),frequency=12)
ts_plot(Vol,
        title = "Desempeño de la Industria Automotriz: Producción de cartón global de 2016 a 2021",
        Ytitle = "Unidades en miles",
        Xtitle = "Años", 
        slider = TRUE)
# En esta gráfica se ve el desempeño de la industria automotriz de 2016 a 2021. En general, se muestra que el total de producción de cartón a nivel global fue mayor en 2021 contra otros años.


### Predicción del Desempeño de la Industria Automotriz

### Importar base de datos
bd5 <-read.csv("externa_bd2 csv2.csv")
summary(bd5)
##   Geography             Unit                Año         Produccion      
##  Length:534         Length:534         Min.   :2016   Min.   :       0  
##  Class :character   Class :character   1st Qu.:2017   1st Qu.:     501  
##  Mode  :character   Mode  :character   Median :2018   Median :    4826  
##                                        Mean   :2018   Mean   : 1327061  
##                                        3rd Qu.:2020   3rd Qu.:   43907  
##                                        Max.   :2021   Max.   :63857942
sum(is.na(bd5))
## [1] 0
bd5$Total_Produccion<- bd1$X2016+bd1$X2017+bd1$X2018+bd1$X2019+bd1$X2020+bd1$X2021

summary(bd5)
##   Geography             Unit                Año         Produccion      
##  Length:534         Length:534         Min.   :2016   Min.   :       0  
##  Class :character   Class :character   1st Qu.:2017   1st Qu.:     501  
##  Mode  :character   Mode  :character   Median :2018   Median :    4826  
##                                        Mean   :2018   Mean   : 1327061  
##                                        3rd Qu.:2020   3rd Qu.:   43907  
##                                        Max.   :2021   Max.   :63857942  
##  Total_Produccion   
##  Min.   :        0  
##  1st Qu.:     3166  
##  Median :    30333  
##  Mean   :  7962363  
##  3rd Qu.:   254492  
##  Max.   :204523302
str(bd5)
## 'data.frame':    534 obs. of  5 variables:
##  $ Geography       : chr  "Azerbaijan" "Bangladesh" "Cambodia" "China" ...
##  $ Unit            : chr  "AZN million" "BDT million" "KHR million" "CNY million" ...
##  $ Año             : int  2016 2016 2016 2016 2016 2016 2016 2016 2016 2016 ...
##  $ Produccion      : num  40.6 115106.8 247100 309386.9 212.1 ...
##  $ Total_Produccion: num  302 1009403 1685394 1896358 1247 ...
sum(is.na(bd5))
## [1] 0
#### Modelos de regresión lineal múltiple

#### Modelos de regresión lineal múltiple: Producción de cartón en 2022 a nivel global
regresion <- lm(Total_Produccion ~ Geography + Unit + Año + Produccion, data=bd5)
summary(regresion)
## 
## Call:
## lm(formula = Total_Produccion ~ Geography + Unit + Año + Produccion, 
##     data = bd5)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -2.765e-06 -9.300e-09  6.000e-10  8.700e-09  3.720e-06 
## 
## Coefficients: (69 not defined because of singularities)
##                                 Estimate Std. Error    t value Pr(>|t|)    
## (Intercept)                    2.637e+04  1.543e-05  1.709e+09  < 2e-16 ***
## GeographyAngola               -2.219e+04  1.719e-07 -1.291e+11  < 2e-16 ***
## GeographyArgentina             7.314e+05  1.719e-07  4.254e+12  < 2e-16 ***
## GeographyAustralia            -4.723e+03  1.719e-07 -2.748e+10  < 2e-16 ***
## GeographyAustria              -1.613e+04  1.719e-07 -9.384e+10  < 2e-16 ***
## GeographyAzerbaijan           -2.606e+04  1.719e-07 -1.516e+11  < 2e-16 ***
## GeographyBangladesh            9.830e+05  1.719e-07  5.718e+12  < 2e-16 ***
## GeographyBelarus              -2.343e+04  1.719e-07 -1.363e+11  < 2e-16 ***
## GeographyBelgium              -2.003e+04  1.719e-07 -1.165e+11  < 2e-16 ***
## GeographyBrazil                1.030e+05  1.719e-07  5.992e+11  < 2e-16 ***
## GeographyBulgaria             -2.320e+04  1.719e-07 -1.350e+11  < 2e-16 ***
## GeographyCambodia              1.659e+06  1.719e-07  9.650e+12  < 2e-16 ***
## GeographyCameroon              1.707e+05  1.719e-07  9.932e+11  < 2e-16 ***
## GeographyCanada                5.261e+04  1.719e-07  3.061e+11  < 2e-16 ***
## GeographyChile                 6.365e+06  1.720e-07  3.700e+13  < 2e-16 ***
## GeographyChina                 1.870e+06  1.719e-07  1.088e+13  < 2e-16 ***
## GeographyColombia              1.552e+07  1.727e-07  8.984e+13  < 2e-16 ***
## GeographyCosta Rica            9.407e+05  1.719e-07  5.472e+12  < 2e-16 ***
## GeographyCroatia              -1.765e+04  1.719e-07 -1.026e+11  < 2e-16 ***
## GeographyCuba                 -2.575e+04  1.719e-07 -1.498e+11  < 2e-16 ***
## GeographyCyprus               -2.619e+04  1.719e-07 -1.524e+11  < 2e-16 ***
## GeographyCzech Republic        1.524e+05  1.719e-07  8.868e+11  < 2e-16 ***
## GeographyDenmark               5.872e+03  1.719e-07  3.416e+10  < 2e-16 ***
## GeographyDominican Republic    1.093e+04  1.719e-07  6.356e+10  < 2e-16 ***
## GeographyEcuador              -2.542e+04  1.719e-07 -1.478e+11  < 2e-16 ***
## GeographyEgypt                 6.967e+04  1.719e-07  4.053e+11  < 2e-16 ***
## GeographyEstonia              -2.598e+04  1.719e-07 -1.511e+11  < 2e-16 ***
## GeographyEthiopia             -2.092e+04  1.719e-07 -1.217e+11  < 2e-16 ***
## GeographyFinland              -2.375e+04  1.719e-07 -1.382e+11  < 2e-16 ***
## GeographyFrance                7.084e+03  1.719e-07  4.121e+10  < 2e-16 ***
## GeographyGeorgia              -2.617e+04  1.719e-07 -1.522e+11  < 2e-16 ***
## GeographyGermany               5.085e+04  1.719e-07  2.958e+11  < 2e-16 ***
## GeographyGhana                -2.569e+04  1.719e-07 -1.495e+11  < 2e-16 ***
## GeographyGreece               -2.379e+04  1.719e-07 -1.384e+11  < 2e-16 ***
## GeographyHong Kong, China     -2.512e+04  1.719e-07 -1.461e+11  < 2e-16 ***
## GeographyHungary               1.478e+06  1.719e-07  8.599e+12  < 2e-16 ***
## GeographyIceland              -2.080e+04  1.719e-07 -1.210e+11  < 2e-16 ***
## GeographyIndia                 2.238e+06  1.719e-07  1.302e+13  < 2e-16 ***
## GeographyIndonesia             2.045e+08  2.788e-07  7.334e+14  < 2e-16 ***
## GeographyIran                  1.860e+08  2.635e-07  7.059e+14  < 2e-16 ***
## GeographyIraq                 -1.469e+04  1.719e-07 -8.543e+10  < 2e-16 ***
## GeographyIreland              -2.449e+04  1.719e-07 -1.425e+11  < 2e-16 ***
## GeographyIsrael               -3.656e+03  1.719e-07 -2.127e+10  < 2e-16 ***
## GeographyItaly                 2.461e+04  1.719e-07  1.431e+11  < 2e-16 ***
## GeographyJapan                 1.578e+07  1.727e-07  9.136e+13  < 2e-16 ***
## GeographyKazakhstan            1.776e+05  1.719e-07  1.033e+12  < 2e-16 ***
## GeographyKenya                 8.598e+04  1.719e-07  5.001e+11  < 2e-16 ***
## GeographyKuwait               -2.611e+04  1.719e-07 -1.519e+11  < 2e-16 ***
## GeographyLatvia               -2.590e+04  1.719e-07 -1.507e+11  < 2e-16 ***
## GeographyLithuania            -2.459e+04  1.719e-07 -1.430e+11  < 2e-16 ***
## GeographyLuxembourg           -2.637e+04  1.719e-07 -1.534e+11  < 2e-16 ***
## GeographyMalaysia             -2.711e+03  1.719e-07 -1.577e+10  < 2e-16 ***
## GeographyMexico                7.118e+05  1.719e-07  4.141e+12  < 2e-16 ***
## GeographyMorocco              -9.741e+03  1.719e-07 -5.666e+10  < 2e-16 ***
## GeographyNetherlands          -1.245e+04  1.719e-07 -7.239e+10  < 2e-16 ***
## GeographyNew Zealand          -1.872e+04  1.719e-07 -1.089e+11  < 2e-16 ***
## GeographyNigeria               1.797e+05  1.719e-07  1.045e+12  < 2e-16 ***
## GeographyNorway               -1.484e+04  1.719e-07 -8.633e+10  < 2e-16 ***
## GeographyPakistan              6.024e+05  1.719e-07  3.504e+12  < 2e-16 ***
## GeographyPanama               -2.614e+04  1.719e-07 -1.521e+11  < 2e-16 ***
## GeographyPeru                 -2.128e+04  1.719e-07 -1.238e+11  < 2e-16 ***
## GeographyPhilippines           2.758e+05  1.719e-07  1.605e+12  < 2e-16 ***
## GeographyPoland                9.175e+04  1.719e-07  5.337e+11  < 2e-16 ***
## GeographyPortugal             -2.100e+04  1.719e-07 -1.222e+11  < 2e-16 ***
## GeographyPuerto Rico          -2.583e+04  1.719e-07 -1.502e+11  < 2e-16 ***
## GeographyQatar                -2.618e+04  1.719e-07 -1.523e+11  < 2e-16 ***
## GeographyRomania              -9.978e+03  1.719e-07 -5.804e+10  < 2e-16 ***
## GeographyRussia                1.565e+06  1.719e-07  9.101e+12  < 2e-16 ***
## GeographySaudi Arabia          1.042e+04  1.719e-07  6.062e+10  < 2e-16 ***
## GeographySingapore            -2.273e+04  1.719e-07 -1.322e+11  < 2e-16 ***
## GeographySlovakia             -2.505e+04  1.719e-07 -1.457e+11  < 2e-16 ***
## GeographySlovenia             -2.523e+04  1.719e-07 -1.468e+11  < 2e-16 ***
## GeographySouth Africa          2.515e+05  1.719e-07  1.463e+12  < 2e-16 ***
## GeographySouth Korea           5.980e+07  1.835e-07  3.259e+14  < 2e-16 ***
## GeographySpain                 4.649e+03  1.719e-07  2.704e+10  < 2e-16 ***
## GeographySri Lanka             2.281e+05  1.719e-07  1.327e+12  < 2e-16 ***
## GeographySweden                3.421e+04  1.719e-07  1.990e+11  < 2e-16 ***
## GeographySwitzerland          -2.103e+04  1.719e-07 -1.224e+11  < 2e-16 ***
## GeographyTaiwan                5.888e+05  1.719e-07  3.425e+12  < 2e-16 ***
## GeographyThailand              1.750e+05  1.719e-07  1.018e+12  < 2e-16 ***
## GeographyTunisia              -2.365e+04  1.719e-07 -1.376e+11  < 2e-16 ***
## GeographyTurkey                1.690e+05  1.719e-07  9.833e+11  < 2e-16 ***
## GeographyUkraine               1.017e+05  1.719e-07  5.918e+11  < 2e-16 ***
## GeographyUnited Arab Emirates -1.341e+04  1.719e-07 -7.800e+10  < 2e-16 ***
## GeographyUnited Kingdom        3.967e+03  1.719e-07  2.307e+10  < 2e-16 ***
## GeographyUruguay               5.681e+04  1.719e-07  3.304e+11  < 2e-16 ***
## GeographyUSA                   2.972e+05  1.719e-07  1.729e+12  < 2e-16 ***
## GeographyUzbekistan            5.077e+06  1.720e-07  2.952e+13  < 2e-16 ***
## GeographyVietnam               1.980e+08  2.734e-07  7.243e+14  < 2e-16 ***
## UnitAOA million                       NA         NA         NA       NA    
## UnitARS million                       NA         NA         NA       NA    
## UnitAUD million                       NA         NA         NA       NA    
## UnitAZN million                       NA         NA         NA       NA    
## UnitBDT million                       NA         NA         NA       NA    
## UnitBGN million                       NA         NA         NA       NA    
## UnitBRL million                       NA         NA         NA       NA    
## UnitBYR million                       NA         NA         NA       NA    
## UnitCAD million                       NA         NA         NA       NA    
## UnitCHF million                       NA         NA         NA       NA    
## UnitCLP million                       NA         NA         NA       NA    
## UnitCNY million                       NA         NA         NA       NA    
## UnitCOP million                       NA         NA         NA       NA    
## UnitCRC million                       NA         NA         NA       NA    
## UnitCUC million                       NA         NA         NA       NA    
## UnitCZK million                       NA         NA         NA       NA    
## UnitDKK million                       NA         NA         NA       NA    
## UnitDOP million                       NA         NA         NA       NA    
## UnitDZD million                       NA         NA         NA       NA    
## UnitEGP million                       NA         NA         NA       NA    
## UnitETB million                       NA         NA         NA       NA    
## UnitEUR million                       NA         NA         NA       NA    
## UnitGBP million                       NA         NA         NA       NA    
## UnitGEL million                       NA         NA         NA       NA    
## UnitGHS million                       NA         NA         NA       NA    
## UnitHKD million                       NA         NA         NA       NA    
## UnitHRK million                       NA         NA         NA       NA    
## UnitHuF million                       NA         NA         NA       NA    
## UnitIDR million                       NA         NA         NA       NA    
## UnitILS million                       NA         NA         NA       NA    
## UnitINR million                       NA         NA         NA       NA    
## UnitIQD million                       NA         NA         NA       NA    
## UnitIRR million                       NA         NA         NA       NA    
## UnitISK million                       NA         NA         NA       NA    
## UnitJPY million                       NA         NA         NA       NA    
## UnitKES million                       NA         NA         NA       NA    
## UnitKHR million                       NA         NA         NA       NA    
## UnitKRW million                       NA         NA         NA       NA    
## UnitKWD million                       NA         NA         NA       NA    
## UnitKZT million                       NA         NA         NA       NA    
## UnitLKR million                       NA         NA         NA       NA    
## UnitMAD million                       NA         NA         NA       NA    
## UnitMXN million                       NA         NA         NA       NA    
## UnitMYR million                       NA         NA         NA       NA    
## UnitNGN million                       NA         NA         NA       NA    
## UnitNOK million                       NA         NA         NA       NA    
## UnitNZD million                       NA         NA         NA       NA    
## UnitPAB million                       NA         NA         NA       NA    
## UnitPEN million                       NA         NA         NA       NA    
## UnitPHP million                       NA         NA         NA       NA    
## UnitPKR million                       NA         NA         NA       NA    
## UnitPLN million                       NA         NA         NA       NA    
## UnitQAR million                       NA         NA         NA       NA    
## UnitRON million                       NA         NA         NA       NA    
## UnitRUB million                       NA         NA         NA       NA    
## UnitSAR million                       NA         NA         NA       NA    
## UnitSEK million                       NA         NA         NA       NA    
## UnitSGD million                       NA         NA         NA       NA    
## UnitTHB million                       NA         NA         NA       NA    
## UnitTND million                       NA         NA         NA       NA    
## UnitTRY million                       NA         NA         NA       NA    
## UnitTWD million                       NA         NA         NA       NA    
## UnitUAH million                       NA         NA         NA       NA    
## UnitUSD million                       NA         NA         NA       NA    
## UnitUYU million                       NA         NA         NA       NA    
## UnitUZS million                       NA         NA         NA       NA    
## UnitVND million                       NA         NA         NA       NA    
## UnitXAF million                       NA         NA         NA       NA    
## UnitZAR million                       NA         NA         NA       NA    
## Año                           -2.623e-10  7.645e-09 -3.400e-02    0.973    
## Produccion                    -2.771e-14  6.441e-15 -4.302e+00 2.08e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.978e-07 on 443 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 8.585e+28 on 90 and 443 DF,  p-value: < 2.2e-16
regresion <- lm(Total_Produccion ~ Año + Produccion, data=bd5)
summary(regresion)
## 
## Call:
## lm(formula = Total_Produccion ~ Año + Produccion, data = bd5)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -156662104   -2346480    -288323     745268   98830383 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  2.083e+09  5.845e+08   3.563 0.000400 ***
## Año         -1.031e+06  2.896e+05  -3.561 0.000402 ***
## Produccion   5.394e+00  7.845e-02  68.757  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11410000 on 531 degrees of freedom
## Multiple R-squared:  0.899,  Adjusted R-squared:  0.8986 
## F-statistic:  2364 on 2 and 531 DF,  p-value: < 2.2e-16
bd5 <- data.frame(Año=2022, Produccion= 170000000)
predict(regresion,bd5)
##         1 
## 914196926
# De acuerdo a los datos estimados, se ve que las variables de año y producción son igualmente significativas para la variable dependiente. En el caso de año, este tiene un impacto negativo sobre la otra y la producción tiene una estimación positiva.
# El modelo anterior nos muestra cuánto se estima que se producirá a nivel global en la industria del cartón para 2022. De acuerdo a una producción total aproximada de 170 millones de cartón en 2021, se espera que en 2022 se produzcan 914,196,926. En este caso, el prónostico fue realizado al crear un nuevo 'data frame' y al implementar la función de 'lm', usada para crear análisis regresivos y predictivos.


#### Modelos de regresión lineal múltiple: Producción de cartón en 2022 para Estados Unidos y México

### Importar base de datos (3)
bd6 <-read.csv("externa_bd3 csv3.csv")
summary(bd6)
##       Año            USA             MEX        
##  Min.   :2016   Min.   :48847   Min.   :103443  
##  1st Qu.:2017   1st Qu.:52256   1st Qu.:114333  
##  Median :2018   Median :54328   Median :124555  
##  Mean   :2018   Mean   :53932   Mean   :123036  
##  3rd Qu.:2020   3rd Qu.:55203   3rd Qu.:129521  
##  Max.   :2021   Max.   :59031   Max.   :143561
sum(is.na(bd6))
## [1] 0
summary(bd6)
##       Año            USA             MEX        
##  Min.   :2016   Min.   :48847   Min.   :103443  
##  1st Qu.:2017   1st Qu.:52256   1st Qu.:114333  
##  Median :2018   Median :54328   Median :124555  
##  Mean   :2018   Mean   :53932   Mean   :123036  
##  3rd Qu.:2020   3rd Qu.:55203   3rd Qu.:129521  
##  Max.   :2021   Max.   :59031   Max.   :143561
str(bd6)
## 'data.frame':    6 obs. of  3 variables:
##  $ Año: int  2016 2017 2018 2019 2020 2021
##  $ USA: num  48847 51672 54006 55387 54651 ...
##  $ MEX: num  103443 112231 120639 128471 129871 ...
### Modelo de regresión múltiple: Producción de cartón en 2022: México
regresion3 <- lm(MEX ~ USA + Año, data=bd6)
summary(regresion3)
## 
## Call:
## lm(formula = MEX ~ USA + Año, data = bd6)
## 
## Residuals:
##      1      2      3      4      5      6 
##  574.6 -373.0 -664.0  478.2 -345.3  329.5 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)   
## (Intercept) -7.614e+06  1.010e+06  -7.540  0.00484 **
## USA          2.109e+00  2.749e-01   7.674  0.00460 **
## Año          3.777e+03  5.072e+02   7.446  0.00501 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 675 on 3 degrees of freedom
## Multiple R-squared:  0.9986, Adjusted R-squared:  0.9977 
## F-statistic:  1100 on 2 and 3 DF,  p-value: 5.023e-05
regresion3 <- lm(MEX ~ Año, data=bd6)
summary(regresion3)
## 
## Call:
## lm(formula = MEX ~ Año, data = bd6)
## 
## Residuals:
##       1       2       3       4       5       6 
##  -925.5   395.3  1336.2  1701.6 -4365.0  1857.6 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -1.495e+07  1.281e+06  -11.67 0.000308 ***
## Año          7.467e+03  6.347e+02   11.77 0.000299 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2655 on 4 degrees of freedom
## Multiple R-squared:  0.9719, Adjusted R-squared:  0.9649 
## F-statistic: 138.4 on 1 and 4 DF,  p-value: 0.0002986
bd6 <- data.frame(Año=2022, Produccion= 740000)
predict(regresion3,bd6)
##        1 
## 149170.3
ggplot(bd6, aes(x=Año, y=Produccion))+
  geom_point() +
  geom_line(aes(y=Produccion), color="red", linetype="dashed") +
  geom_line(aes(y=Produccion), color="red", linetype="dashed") +
  geom_smooth(method=lm, formula=y~x, se=TRUE, level=0.95, col='blue', fill='pink2') +
  theme_light()
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?

# La predicción anterior nos arroja que hay un impacto positivo y significativo entre la variable Año y la variable dependiente. Esto significa que hay una predicción positiva de crecimiento acorde al año.
# De acuerdo a la producción total generada por México de 2016 a 2021 (740 M), el modelo pronóstico estima que en 2022 producirá 149,170.3. En la gráfica previa se muestra el punto de predicción. Si analizamos la producción de 2021 contra el pronóstico de 2022, se estima que la producción mexicana disminuirá. Podemos suponer que esto se debe a la deficiencia en la cadena de suministro global, así como factores económicos globales.


#### Modelos de regresión lineal múltiple: Producción de cartón en 2022 para Estados Unidos y México

### Importar base de datos (3)
bd6 <-read.csv("externa_bd3 csv3.csv")
summary(bd6)
##       Año            USA             MEX        
##  Min.   :2016   Min.   :48847   Min.   :103443  
##  1st Qu.:2017   1st Qu.:52256   1st Qu.:114333  
##  Median :2018   Median :54328   Median :124555  
##  Mean   :2018   Mean   :53932   Mean   :123036  
##  3rd Qu.:2020   3rd Qu.:55203   3rd Qu.:129521  
##  Max.   :2021   Max.   :59031   Max.   :143561
sum(is.na(bd6))
## [1] 0
summary(bd6)
##       Año            USA             MEX        
##  Min.   :2016   Min.   :48847   Min.   :103443  
##  1st Qu.:2017   1st Qu.:52256   1st Qu.:114333  
##  Median :2018   Median :54328   Median :124555  
##  Mean   :2018   Mean   :53932   Mean   :123036  
##  3rd Qu.:2020   3rd Qu.:55203   3rd Qu.:129521  
##  Max.   :2021   Max.   :59031   Max.   :143561
str(bd6)
## 'data.frame':    6 obs. of  3 variables:
##  $ Año: int  2016 2017 2018 2019 2020 2021
##  $ USA: num  48847 51672 54006 55387 54651 ...
##  $ MEX: num  103443 112231 120639 128471 129871 ...
#### Modelos de regresión lineal múltiple: Producción de cartón en 2022: Estados Unidos
regresion2 <- lm(USA ~ MEX + Año, data=bd6)
summary(regresion2)
## 
## Call:
## lm(formula = USA ~ MEX + Año, data = bd6)
## 
## Residuals:
##       1       2       3       4       5       6 
## -293.67  185.92  345.50 -187.61   63.41 -113.54 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  3.266e+06  8.915e+05   3.663   0.0352 * 
## MEX          4.511e-01  5.878e-02   7.674   0.0046 **
## Año         -1.619e+03  4.452e+02  -3.636   0.0358 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 312.1 on 3 degrees of freedom
## Multiple R-squared:  0.9951, Adjusted R-squared:  0.9918 
## F-statistic: 304.3 on 2 and 3 DF,  p-value: 0.0003435
regresion2 <- lm(USA ~ Año, data=bd6)
summary(regresion2)
## 
## Call:
## lm(formula = USA ~ Año, data = bd6)
## 
## Residuals:
##       1       2       3       4       5       6 
##  -711.2   364.2   948.3   580.0 -1905.7   724.4 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)   
## (Intercept) -3477589.1   592456.5  -5.870  0.00421 **
## Año             1749.6      293.5   5.961  0.00398 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1228 on 4 degrees of freedom
## Multiple R-squared:  0.8988, Adjusted R-squared:  0.8735 
## F-statistic: 35.53 on 1 and 4 DF,  p-value: 0.003977
bd6 <- data.frame(Año=2022, Produccion= 320000)
predict(regresion2,bd6)
##        1 
## 60055.85
# Para la predicción de Estados Unidos, vemos que habrá un incremento en la producción de cartón contra 2021. Sin embargo, al analizar la producción total de México contra la producción total de Estados Unidos, vemos que la mexicana es mucho mayor. Podemos suponer que esto se debe debido a la mano de obra económica del mercado mexicano.

# De acuerdo a la predicción anterior, se ve un incremento positivo para la variable México con la variable dependiente, a diferencia del año que muestra un impacto menor y negativo, pero igualmente significativo.

# Predicción adicional
industriaA <-read.csv("Industria Auto.csv")

bd6 <-read.csv("Industria Auto.csv")

bd6 <- bd6[-c(1),]

summary(bd6)
##       year        trimestre       id_estado        estado         
##  Min.   :2014   Min.   :1.000   Min.   : 1.00   Length:689        
##  1st Qu.:2016   1st Qu.:1.000   1st Qu.:10.00   Class :character  
##  Median :2018   Median :2.000   Median :17.00   Mode  :character  
##  Mean   :2018   Mean   :2.401   Mean   :17.39                     
##  3rd Qu.:2020   3rd Qu.:3.000   3rd Qu.:26.00                     
##  Max.   :2022   Max.   :4.000   Max.   :32.00                     
##    idnueva          ventas_autopartes_anual      eci         
##  Length:689         Min.   :4.382e+03       Min.   :-0.9374  
##  Class :character   1st Qu.:2.240e+07       1st Qu.:-0.4630  
##  Mode  :character   Median :2.314e+08       Median : 0.7088  
##                     Mean   :3.308e+08       Mean   : 0.4385  
##                     3rd Qu.:5.764e+08       3rd Qu.: 0.9138  
##                     Max.   :1.467e+09       Max.   : 1.7810  
##  poblacion_ocupada_ensambladora_year exportaciones_anual iedanual_porestado
##  Length:689                          Length:689          Length:689        
##  Class :character                    Class :character    Class :character  
##  Mode  :character                    Mode  :character    Mode  :character  
##                                                                            
##                                                                            
## 
summary(industriaA)
##       year        trimestre       id_estado        estado         
##  Min.   :2014   Min.   :1.000   Min.   : 1.00   Length:690        
##  1st Qu.:2016   1st Qu.:1.000   1st Qu.:10.00   Class :character  
##  Median :2018   Median :2.000   Median :17.00   Mode  :character  
##  Mean   :2018   Mean   :2.399   Mean   :17.37                     
##  3rd Qu.:2020   3rd Qu.:3.000   3rd Qu.:26.00                     
##  Max.   :2022   Max.   :4.000   Max.   :32.00                     
##    idnueva          ventas_autopartes_anual      eci         
##  Length:690         Min.   :4.382e+03       Min.   :-0.9374  
##  Class :character   1st Qu.:2.256e+07       1st Qu.:-0.4630  
##  Mode  :character   Median :2.316e+08       Median : 0.7088  
##                     Mean   :3.307e+08       Mean   : 0.4391  
##                     3rd Qu.:5.759e+08       3rd Qu.: 0.9138  
##                     Max.   :1.467e+09       Max.   : 1.7810  
##  poblacion_ocupada_ensambladora_year exportaciones_anual iedanual_porestado
##  Length:690                          Length:690          Length:690        
##  Class :character                    Class :character    Class :character  
##  Mode  :character                    Mode  :character    Mode  :character  
##                                                                            
##                                                                            
## 
str(industriaA)
## 'data.frame':    690 obs. of  10 variables:
##  $ year                               : int  2014 2014 2014 2014 2014 2014 2014 2014 2014 2014 ...
##  $ trimestre                          : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ id_estado                          : int  1 2 5 8 9 10 11 13 14 15 ...
##  $ estado                             : chr  "Aguascalientes" "Baja California" "Coahuila de Zaragoza" "Chihuahua" ...
##  $ idnueva                            : chr  "Agu20141" "Baj20141" "Coa20141" "Chi20141" ...
##  $ ventas_autopartes_anual            : int  297808938 180968923 638892837 415306918 424386804 2395458 599464057 490518 73197944 161883028 ...
##  $ eci                                : num  0.856 1.268 0.914 1.148 0.914 ...
##  $ poblacion_ocupada_ensambladora_year: chr  "5523" "41376" "19522" "93703" ...
##  $ exportaciones_anual                : chr  "8466008000" "35002851000" "34838926000" "1460627000" ...
##  $ iedanual_porestado                 : chr  "1008408044" "1102570984" "1567453720" "1462699524" ...
regresion1 <- lm(ventas_autopartes_anual ~  estado +exportaciones_anual + poblacion_ocupada_ensambladora_year ,data = industriaA)
summary(regresion1)
## 
## Call:
## lm(formula = ventas_autopartes_anual ~ estado + exportaciones_anual + 
##     poblacion_ocupada_ensambladora_year, data = industriaA)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -506069374   -1448463          0    2162402  296273810 
## 
## Coefficients: (3 not defined because of singularities)
##                                             Estimate Std. Error t value
## (Intercept)                                316032420   79025905   3.999
## estadoBaja California                       82523284  111759507   0.738
## estadoCampeche                            -316015278  111759507  -2.828
## estadoChihuahua                            398034214  111759507   3.562
## estadoCiudad de Mexico                     571759097  111759507   5.116
## estadoCoahuila de Zaragoza                1151233158  111759507  10.301
## estadoColima                              -315905304  111759507  -2.827
## estadoDurango                             -251105163  111759507  -2.247
## estadoEstado de Mexico                     -38335193  111759507  -0.343
## estadoGuanajuato                           623474494  111759507   5.579
## estadoHidalgo                             -309386913  111759507  -2.768
## estadoJalisco                              -99121659  111759507  -0.887
## estadoMorelos                             -282142730  111759507  -2.525
## estadoNuevo Leon                           491777471  111759507   4.400
## estadoPuebla                               585598166  111759507   5.240
## estadoQueretaro                            741305945  111759507   6.633
## estadoQuintana Roo                        -315991405   96786572  -3.265
## estadoSan Luis Potosi                      124368409  111759507   1.113
## estadoSonora                              -227591089  111759507  -2.036
## estadoTamaulipas                           303676078  111759507   2.717
## estadoTlaxcala                            -279845202  111759507  -2.504
## estadoVeracruz de Ignacio de la Llave     -298360634  111759507  -2.670
## estadoYucatan                             -315911612  111759507  -2.827
## estadoZacatecas                           -293692225  111759507  -2.628
## exportaciones_anual10141642000            -633342919   91251256  -6.941
## exportaciones_anual10314836000            -243122117   91251256  -2.664
## exportaciones_anual10398672000             -83306231   96786572  -0.861
## exportaciones_anual10400467000            -214097642   91251256  -2.346
## exportaciones_anual10478612000            -227071679   91251256  -2.488
## exportaciones_anual10594592000            -660445310   91251256  -7.238
## exportaciones_anual10701591000            -184046450   96786572  -1.902
## exportaciones_anual11146761000            -328066976   96786572  -3.390
## exportaciones_anual1116042000                 -50913   91251256  -0.001
## exportaciones_anual1119625000                  16310   91251256   0.000
## exportaciones_anual11227331000            -195000075   91251256  -2.137
## exportaciones_anual11449692000             -52031743   91251256  -0.570
## exportaciones_anual1165750000             -155619675   91251256  -1.705
## exportaciones_anual11738889000            -320498675   91251256  -3.512
## exportaciones_anual11794073000              80649592   91251256   0.884
## exportaciones_anual12035000                   -28653   96786572   0.000
## exportaciones_anual12044484000             -42701116   96786572  -0.441
## exportaciones_anual1238308000               -2755770   96786572  -0.028
## exportaciones_anual1262654000                  37474   91251256   0.000
## exportaciones_anual1278536000              -29700606   91251256  -0.325
## exportaciones_anual12868798000            -152191028   91251256  -1.668
## exportaciones_anual1301171000               -5888596   91251256  -0.065
## exportaciones_anual1307252000              -28159308   91251256  -0.309
## exportaciones_anual1310801000              -24999653   91251256  -0.274
## exportaciones_anual1318941000               -4141097   91251256  -0.045
## exportaciones_anual1323153000               -5226323   91251256  -0.057
## exportaciones_anual13360587000            -213744406   91251256  -2.342
## exportaciones_anual13514349000            -461981584   91251256  -5.063
## exportaciones_anual13664629000            -141254716   91251256  -1.548
## exportaciones_anual1379964000              -23869307   91251256  -0.262
## exportaciones_anual14009625000             -74475970   91251256  -0.816
## exportaciones_anual1428633000               -3663704   96786572  -0.038
## exportaciones_anual1440918000              -16649460   91251256  -0.182
## exportaciones_anual1448674000               -9154406   91251256  -0.100
## exportaciones_anual14512000                   -14416   96786572   0.000
## exportaciones_anual1460627000             -202662429   91251256  -2.221
## exportaciones_anual1460865000               -8043655   91251256  -0.088
## exportaciones_anual1470940000                 -47686   91251256  -0.001
## exportaciones_anual15019152000            -613314608   91251256  -6.721
## exportaciones_anual15120233000              34228936   96786572   0.354
## exportaciones_anual15294350000            -165928588   91251256  -1.818
## exportaciones_anual15531676000            -107724661   91251256  -1.181
## exportaciones_anual15611884000              75774919   91251256   0.830
## exportaciones_anual16121000                   -30177   96786572   0.000
## exportaciones_anual1654784000              -63167299   91251256  -0.692
## exportaciones_anual16642906000             -34997843   96786572  -0.362
## exportaciones_anual1672357000              -62208412   91251256  -0.682
## exportaciones_anual16837910000            -507759556   91251256  -5.564
## exportaciones_anual16895883000             115296593   91251256   1.264
## exportaciones_anual17204369000            -247634512   91251256  -2.714
## exportaciones_anual1721651000               -5466936   91251256  -0.060
## exportaciones_anual1726504000               -5852596   91251256  -0.064
## exportaciones_anual17332223000             -94707222   91251256  -1.038
## exportaciones_anual17443597000             102705938   91251256   1.126
## exportaciones_anual1752495000              -62743887   91251256  -0.688
## exportaciones_anual17544423000             135514903   91251256   1.485
## exportaciones_anual17547974000            -447164471   91251256  -4.900
## exportaciones_anual17735407000             104259566   91251256   1.143
## exportaciones_anual17877862000              10618852   91251256   0.116
## exportaciones_anual1813156000             -214253693   96786572  -2.214
## exportaciones_anual18601992000             -87747401   91251256  -0.962
## exportaciones_anual1861966000              -62600427   91251256  -0.686
## exportaciones_anual18687648000             -24706585   91251256  -0.271
## exportaciones_anual18737712000            -123808645   91251256  -1.357
## exportaciones_anual18985000                    -5479   72140452   0.000
## exportaciones_anual191993000                      NA         NA      NA
## exportaciones_anual19737684000             -78238788   91251256  -0.857
## exportaciones_anual19840531000             197594823   91251256   2.165
## exportaciones_anual19863200000             229643101   91251256   2.517
## exportaciones_anual20010001000             -29475421   91251256  -0.323
## exportaciones_anual20026441000            -147417980   96786572  -1.523
## exportaciones_anual20093245000             -52714510   91251256  -0.578
## exportaciones_anual20335098000             -59363602   91251256  -0.651
## exportaciones_anual20787831000            -176885438   91251256  -1.938
## exportaciones_anual21133618000             -11919096   91251256  -0.131
## exportaciones_anual2127000000              -53259174   91251256  -0.584
## exportaciones_anual2128076000             -135947447   88353648  -1.539
## exportaciones_anual21392726000             -85136044   91251256  -0.933
## exportaciones_anual21659640000             -27746581   91251256  -0.304
## exportaciones_anual22099835000            -140806200   91251256  -1.543
## exportaciones_anual2242354000               -4851805   91251256  -0.053
## exportaciones_anual22472408000             -97592972   91251256  -1.069
## exportaciones_anual22985164000             -19566138   96786572  -0.202
## exportaciones_anual2299343000               -5280661   91251256  -0.058
## exportaciones_anual2301925000                     NA         NA      NA
## exportaciones_anual2302851000             -344468140   91251256  -3.775
## exportaciones_anual23360290000             -87808473   91251256  -0.962
## exportaciones_anual2376795000               -5540326   96786572  -0.057
## exportaciones_anual24048744000            -301202855   91251256  -3.301
## exportaciones_anual2452302000             -460231437   91251256  -5.044
## exportaciones_anual24926226000             -19992365   91251256  -0.219
## exportaciones_anual25065798000            -146940238   91251256  -1.610
## exportaciones_anual25504680000            -101969366   91251256  -1.117
## exportaciones_anual25507316000              -2426972   91251256  -0.027
## exportaciones_anual26300102000             -42846992   91251256  -0.470
## exportaciones_anual2630544000             -289995068   91251256  -3.178
## exportaciones_anual2632148000              -14585583   91251256  -0.160
## exportaciones_anual2667126000              -25511848   91251256  -0.280
## exportaciones_anual26736210000             -68439434   91251256  -0.750
## exportaciones_anual2684823000              -17118638   91251256  -0.188
## exportaciones_anual2705297000             -475872294   91251256  -5.215
## exportaciones_anual27314741000             108407180   91251256   1.188
## exportaciones_anual2737230000              -31938434   91251256  -0.350
## exportaciones_anual27397995000             -40140750   91251256  -0.440
## exportaciones_anual2760694000              -13930385   96786572  -0.144
## exportaciones_anual2793509000                7728884   91251256   0.085
## exportaciones_anual2873522000                1653824   91251256   0.018
## exportaciones_anual2880494000              -28125619   96786572  -0.291
## exportaciones_anual29130161000              79348605   91251256   0.870
## exportaciones_anual2946392000                2850874   91251256   0.031
## exportaciones_anual3026698000                1579766   91251256   0.017
## exportaciones_anual30529987000            -153881209   96786572  -1.590
## exportaciones_anual3086705000              -14291744   91251256  -0.157
## exportaciones_anual3086747000               -3612817   91251256  -0.040
## exportaciones_anual3141633000                2244200   91251256   0.025
## exportaciones_anual31513013000            -213302878   91251256  -2.338
## exportaciones_anual3157991000                8403585   96786572   0.087
## exportaciones_anual32177305000            -199208826   91251256  -2.183
## exportaciones_anual3325166000                4332750   91251256   0.047
## exportaciones_anual3402758000              -31045251   91251256  -0.340
## exportaciones_anual34511011000            -281714187   91251256  -3.087
## exportaciones_anual34522156000            -122777424   91251256  -1.345
## exportaciones_anual34590332000             -51405465   96786572  -0.531
## exportaciones_anual34838926000            -652547881   91251256  -7.151
## exportaciones_anual3490783000              -27486235   91251256  -0.301
## exportaciones_anual35002851000            -189871772   91251256  -2.081
## exportaciones_anual35997280000            -171707454   91251256  -1.882
## exportaciones_anual36004725000            -180452978   91251256  -1.978
## exportaciones_anual36251770000            -564945445   91251256  -6.191
## exportaciones_anual36315716000            -184526706   91251256  -2.022
## exportaciones_anual3657768000                2656603   91251256   0.029
## exportaciones_anual37699563000            -521630672   91251256  -5.716
## exportaciones_anual3791586000              -27851391   91251256  -0.305
## exportaciones_anual38441996000            -166179330   91251256  -1.821
## exportaciones_anual38572482000            -358805171   96786572  -3.707
## exportaciones_anual38950677000            -472455089   91251256  -5.178
## exportaciones_anual39615279000            -273384682   91251256  -2.996
## exportaciones_anual39857053000            -188893113   91251256  -2.070
## exportaciones_anual39896454000            -179369916   91251256  -1.966
## exportaciones_anual40659059000            -134947537   91251256  -1.479
## exportaciones_anual41034808000            -428473899   91251256  -4.696
## exportaciones_anual42396951000             -96879896   91251256  -1.062
## exportaciones_anual4339856000              -13715539   91251256  -0.150
## exportaciones_anual44961569000            -644854760   91251256  -7.067
## exportaciones_anual47659461000            -389638362   91251256  -4.270
## exportaciones_anual4862567000               -6250697   96786572  -0.065
## exportaciones_anual52231000                   -10472   79025905   0.000
## exportaciones_anual522839000                  738252  111759507   0.007
## exportaciones_anual5352788000               -9101610   88353648  -0.103
## exportaciones_anual5362863000              -12135351   88353648  -0.137
## exportaciones_anual582973000                  -81666   96786572  -0.001
## exportaciones_anual587504000              -173779186   91251256  -1.904
## exportaciones_anual606131000              -166997519   91251256  -1.830
## exportaciones_anual6367193000              -10360227   88353648  -0.117
## exportaciones_anual6697248000               -8465610   88353648  -0.096
## exportaciones_anual716061000                  -18237   96786572   0.000
## exportaciones_anual722027000                -7889813  111759507  -0.071
## exportaciones_anual726530000              -175201219   96786572  -1.810
## exportaciones_anual729883000              -274984075   91251256  -3.013
## exportaciones_anual735262000                  246347   96786572   0.003
## exportaciones_anual7830019000               53331418   91251256   0.584
## exportaciones_anual7870962000               60706600   91251256   0.665
## exportaciones_anual790859000               -15435643  111759507  -0.138
## exportaciones_anual80907000                   -21941   68438442   0.000
## exportaciones_anual820169000              -135474164   91251256  -1.485
## exportaciones_anual8466008000              -12575744   91251256  -0.138
## exportaciones_anual8476833000             -224960819   91251256  -2.465
## exportaciones_anual8495444000               55657928   91251256   0.610
## exportaciones_anual8534000                     -6324   72140452   0.000
## exportaciones_anual871638000              -105063931   91251256  -1.151
## exportaciones_anual8829410000              -40562505   96786572  -0.419
## exportaciones_anual9147776000             -258898283   91251256  -2.837
## exportaciones_anual9372970000             -640224591   91251256  -7.016
## exportaciones_anual9505026000             -229554589   91251256  -2.516
## exportaciones_anual9650719000               65416021   91251256   0.717
## exportaciones_anual9806397000             -212125633   91251256  -2.325
## poblacion_ocupada_ensambladora_year1004      -460559   91251256  -0.005
## poblacion_ocupada_ensambladora_year1017    -88043944   91251256  -0.965
## poblacion_ocupada_ensambladora_year10714    35863369   91251256   0.393
## poblacion_ocupada_ensambladora_year1075       -35206   91251256   0.000
## poblacion_ocupada_ensambladora_year10767     3518043   91251256   0.039
## poblacion_ocupada_ensambladora_year11050  -118555603  111759507  -1.061
## poblacion_ocupada_ensambladora_year11361   -54924139   91251256  -0.602
## poblacion_ocupada_ensambladora_year11806     4344197   91251256   0.048
## poblacion_ocupada_ensambladora_year12073    -3121269   96786572  -0.032
## poblacion_ocupada_ensambladora_year12094   -64875837   91251256  -0.711
## poblacion_ocupada_ensambladora_year12217     6288286   91251256   0.069
## poblacion_ocupada_ensambladora_year124585  -36854211   91251256  -0.404
## poblacion_ocupada_ensambladora_year1247       347242  111759507   0.003
## poblacion_ocupada_ensambladora_year12650    -1079792   91251256  -0.012
## poblacion_ocupada_ensambladora_year12836    -8672226   91251256  -0.095
## poblacion_ocupada_ensambladora_year13072   -16160578   96786572  -0.167
## poblacion_ocupada_ensambladora_year13538   -26780130  111759507  -0.240
## poblacion_ocupada_ensambladora_year13866   -40099449   91251256  -0.439
## poblacion_ocupada_ensambladora_year13927    -1153337   91251256  -0.013
## poblacion_ocupada_ensambladora_year13995     -302686   91251256  -0.003
## poblacion_ocupada_ensambladora_year14221   -85427604   91251256  -0.936
## poblacion_ocupada_ensambladora_year144         18849   91251256   0.000
## poblacion_ocupada_ensambladora_year15136       68628   91251256   0.001
## poblacion_ocupada_ensambladora_year15762   -41948849   91251256  -0.460
## poblacion_ocupada_ensambladora_year15901   -56960344   91251256  -0.624
## poblacion_ocupada_ensambladora_year1601    -71923505   91251256  -0.788
## poblacion_ocupada_ensambladora_year1629    -83095837  111759507  -0.744
## poblacion_ocupada_ensambladora_year16844     3457658   96786572   0.036
## poblacion_ocupada_ensambladora_year1751     50233479   91251256   0.550
## poblacion_ocupada_ensambladora_year17726   -19904172   91251256  -0.218
## poblacion_ocupada_ensambladora_year1776    -95219290   91251256  -1.043
## poblacion_ocupada_ensambladora_year17790     1084572  111759507   0.010
## poblacion_ocupada_ensambladora_year17806  -125382498   91251256  -1.374
## poblacion_ocupada_ensambladora_year17876   -42916198   91251256  -0.470
## poblacion_ocupada_ensambladora_year18197    -6777176   91251256  -0.074
## poblacion_ocupada_ensambladora_year1827     -2927497   91251256  -0.032
## poblacion_ocupada_ensambladora_year18338     -809771   91251256  -0.009
## poblacion_ocupada_ensambladora_year186       9165298   91251256   0.100
## poblacion_ocupada_ensambladora_year1890       -56677   96786572  -0.001
## poblacion_ocupada_ensambladora_year19056     -676860   91251256  -0.007
## poblacion_ocupada_ensambladora_year19219      311407   91251256   0.003
## poblacion_ocupada_ensambladora_year19286   -16058828   91251256  -0.176
## poblacion_ocupada_ensambladora_year1945     12467581   91251256   0.137
## poblacion_ocupada_ensambladora_year19522  -175824860   91251256  -1.927
## poblacion_ocupada_ensambladora_year20047     2203070   91251256   0.024
## poblacion_ocupada_ensambladora_year217       -142230   91251256  -0.002
## poblacion_ocupada_ensambladora_year22383     5551012   96786572   0.057
## poblacion_ocupada_ensambladora_year2252      -243013  111759507  -0.002
## poblacion_ocupada_ensambladora_year2275      -718489   91251256  -0.008
## poblacion_ocupada_ensambladora_year22783   -17304874   91251256  -0.190
## poblacion_ocupada_ensambladora_year23106   -52789396   91251256  -0.579
## poblacion_ocupada_ensambladora_year23160  -124029766   91251256  -1.359
## poblacion_ocupada_ensambladora_year23209   -13521731   91251256  -0.148
## poblacion_ocupada_ensambladora_year23991     -586001  111759507  -0.005
## poblacion_ocupada_ensambladora_year25113   -55792481  111759507  -0.499
## poblacion_ocupada_ensambladora_year25660   -20874860   91251256  -0.229
## poblacion_ocupada_ensambladora_year25840    -3586940   96786572  -0.037
## poblacion_ocupada_ensambladora_year26248     9162092   91251256   0.100
## poblacion_ocupada_ensambladora_year2695    -13312374   91251256  -0.146
## poblacion_ocupada_ensambladora_year26950   -82012426   91251256  -0.899
## poblacion_ocupada_ensambladora_year27190   -31434153   91251256  -0.344
## poblacion_ocupada_ensambladora_year2720      -897442   91251256  -0.010
## poblacion_ocupada_ensambladora_year27286    19980870   91251256   0.219
## poblacion_ocupada_ensambladora_year27319    -8580815   91251256  -0.094
## poblacion_ocupada_ensambladora_year281       -179512   96786572  -0.002
## poblacion_ocupada_ensambladora_year28299   -57488134   91251256  -0.630
## poblacion_ocupada_ensambladora_year28505    20100158   91251256   0.220
## poblacion_ocupada_ensambladora_year28631    13816454   91251256   0.151
## poblacion_ocupada_ensambladora_year29188  -167555153  111759507  -1.499
## poblacion_ocupada_ensambladora_year29560    45453217   91251256   0.498
## poblacion_ocupada_ensambladora_year29817   -25979462  111759507  -0.232
## poblacion_ocupada_ensambladora_year29949  -114226180   96786572  -1.180
## poblacion_ocupada_ensambladora_year3006       225081   91251256   0.002
## poblacion_ocupada_ensambladora_year30939   -25825311   91251256  -0.283
## poblacion_ocupada_ensambladora_year31       -3217378  111759507  -0.029
## poblacion_ocupada_ensambladora_year31326  -106568309   91251256  -1.168
## poblacion_ocupada_ensambladora_year31593  -104642318   91251256  -1.147
## poblacion_ocupada_ensambladora_year3167     -1798870   91251256  -0.020
## poblacion_ocupada_ensambladora_year31902  -121670560   91251256  -1.333
## poblacion_ocupada_ensambladora_year32058   -33656603   96786572  -0.348
## poblacion_ocupada_ensambladora_year32214    15554329   91251256   0.170
## poblacion_ocupada_ensambladora_year32397    37768179   91251256   0.414
## poblacion_ocupada_ensambladora_year32737   -53610402   91251256  -0.588
## poblacion_ocupada_ensambladora_year33776   215286084   91251256   2.359
## poblacion_ocupada_ensambladora_year34166   -94222870  111759507  -0.843
## poblacion_ocupada_ensambladora_year34184   -20954762   96786572  -0.217
## poblacion_ocupada_ensambladora_year3467      -904444   91251256  -0.010
## poblacion_ocupada_ensambladora_year35667   -69484094   91251256  -0.761
## poblacion_ocupada_ensambladora_year35925     5486149   96786572   0.057
## poblacion_ocupada_ensambladora_year36108   151827074   91251256   1.664
## poblacion_ocupada_ensambladora_year3639           NA         NA      NA
## poblacion_ocupada_ensambladora_year36416   -61548729  111759507  -0.551
## poblacion_ocupada_ensambladora_year3658    -43946892   91251256  -0.482
## poblacion_ocupada_ensambladora_year367       9654679   91251256   0.106
## poblacion_ocupada_ensambladora_year37632    38184829   91251256   0.418
## poblacion_ocupada_ensambladora_year37833    75736097   91251256   0.830
## poblacion_ocupada_ensambladora_year3798     -6966401   91251256  -0.076
## poblacion_ocupada_ensambladora_year38       -4404019   96786572  -0.046
## poblacion_ocupada_ensambladora_year38917  -117612533   91251256  -1.289
## poblacion_ocupada_ensambladora_year3903     -2301816   91251256  -0.025
## poblacion_ocupada_ensambladora_year4011    -17089163   91251256  -0.187
## poblacion_ocupada_ensambladora_year4036    -18221227   91251256  -0.200
## poblacion_ocupada_ensambladora_year40376    77445857   96786572   0.800
## poblacion_ocupada_ensambladora_year40801   -29163382   91251256  -0.320
## poblacion_ocupada_ensambladora_year41376   -27715009   91251256  -0.304
## poblacion_ocupada_ensambladora_year4155     -8749699   91251256  -0.096
## poblacion_ocupada_ensambladora_year4164   -108398680   91251256  -1.188
## poblacion_ocupada_ensambladora_year42428    -7362946   91251256  -0.081
## poblacion_ocupada_ensambladora_year447         75389   96786572   0.001
## poblacion_ocupada_ensambladora_year45674   -68623977   91251256  -0.752
## poblacion_ocupada_ensambladora_year45735    -6458650   91251256  -0.071
## poblacion_ocupada_ensambladora_year4615    293862359  111759507   2.629
## poblacion_ocupada_ensambladora_year46197   -46607356   91251256  -0.511
## poblacion_ocupada_ensambladora_year4650    -10890470   91251256  -0.119
## poblacion_ocupada_ensambladora_year47540   -16067982   91251256  -0.176
## poblacion_ocupada_ensambladora_year48229    31896093   91251256   0.350
## poblacion_ocupada_ensambladora_year48921   -91225168   91251256  -1.000
## poblacion_ocupada_ensambladora_year49658   -34749319  111759507  -0.311
## poblacion_ocupada_ensambladora_year5022     -3932948  111759507  -0.035
## poblacion_ocupada_ensambladora_year50292    -9813744   91251256  -0.108
## poblacion_ocupada_ensambladora_year5078     -3216880   91251256  -0.035
## poblacion_ocupada_ensambladora_year5096   -101087692   91251256  -1.108
## poblacion_ocupada_ensambladora_year50998   -20268445  111759507  -0.181
## poblacion_ocupada_ensambladora_year513       -274024   91251256  -0.003
## poblacion_ocupada_ensambladora_year52        -643859  111759507  -0.006
## poblacion_ocupada_ensambladora_year528      -2590548   91251256  -0.028
## poblacion_ocupada_ensambladora_year52931   -25848730   91251256  -0.283
## poblacion_ocupada_ensambladora_year542       -347818   91251256  -0.004
## poblacion_ocupada_ensambladora_year5455    -45699225   91251256  -0.501
## poblacion_ocupada_ensambladora_year5523     -5647738   91251256  -0.062
## poblacion_ocupada_ensambladora_year5628     52901970   91251256   0.580
## poblacion_ocupada_ensambladora_year589       1159688   91251256   0.013
## poblacion_ocupada_ensambladora_year59620   -48338233   96786572  -0.499
## poblacion_ocupada_ensambladora_year6014      2633896   91251256   0.029
## poblacion_ocupada_ensambladora_year604     -19689796   91251256  -0.216
## poblacion_ocupada_ensambladora_year6077    -21888684   91251256  -0.240
## poblacion_ocupada_ensambladora_year6144    -79169552   91251256  -0.868
## poblacion_ocupada_ensambladora_year6165     -1511709   96786572  -0.016
## poblacion_ocupada_ensambladora_year645     121634327   96786572   1.257
## poblacion_ocupada_ensambladora_year65410   -23297724   91251256  -0.255
## poblacion_ocupada_ensambladora_year658      -1402906   96786572  -0.014
## poblacion_ocupada_ensambladora_year6783    -22234167   91251256  -0.244
## poblacion_ocupada_ensambladora_year7005     67293287   91251256   0.737
## poblacion_ocupada_ensambladora_year7010      1938695   91251256   0.021
## poblacion_ocupada_ensambladora_year7161      8678999   91251256   0.095
## poblacion_ocupada_ensambladora_year7357      1422081   91251256   0.016
## poblacion_ocupada_ensambladora_year74914   -59645793   91251256  -0.654
## poblacion_ocupada_ensambladora_year7497     -4275771   91251256  -0.047
## poblacion_ocupada_ensambladora_year7538    -18424627  111759507  -0.165
## poblacion_ocupada_ensambladora_year76042  -114231092  111759507  -1.022
## poblacion_ocupada_ensambladora_year7608     29441648   96786572   0.304
## poblacion_ocupada_ensambladora_year76195    82961075   91251256   0.909
## poblacion_ocupada_ensambladora_year7631    -12884346  111759507  -0.115
## poblacion_ocupada_ensambladora_year7694    -48819924   91251256  -0.535
## poblacion_ocupada_ensambladora_year7695    -69773414   91251256  -0.765
## poblacion_ocupada_ensambladora_year7697      8339266   91251256   0.091
## poblacion_ocupada_ensambladora_year7710    -43854614   91251256  -0.481
## poblacion_ocupada_ensambladora_year781     -12619850   91251256  -0.138
## poblacion_ocupada_ensambladora_year786     -23329874   91251256  -0.256
## poblacion_ocupada_ensambladora_year7889      7014715   91251256   0.077
## poblacion_ocupada_ensambladora_year8134    -65589088   91251256  -0.719
## poblacion_ocupada_ensambladora_year82050   -23110587   96786572  -0.239
## poblacion_ocupada_ensambladora_year83186   -19096394   91251256  -0.209
## poblacion_ocupada_ensambladora_year8415    -27008420   91251256  -0.296
## poblacion_ocupada_ensambladora_year84649   -55353682   91251256  -0.607
## poblacion_ocupada_ensambladora_year8538     -8057359   91251256  -0.088
## poblacion_ocupada_ensambladora_year8589     39108540   96786572   0.404
## poblacion_ocupada_ensambladora_year8763    135729108   91251256   1.487
## poblacion_ocupada_ensambladora_year915       -688053   91251256  -0.008
## poblacion_ocupada_ensambladora_year9218     -5708698   96786572  -0.059
## poblacion_ocupada_ensambladora_year9264    -32598664   91251256  -0.357
## poblacion_ocupada_ensambladora_year93703   -96097287   91251256  -1.053
## poblacion_ocupada_ensambladora_year9692    -24590049   91251256  -0.269
## poblacion_ocupada_ensambladora_year9849    -92408345   91251256  -1.013
## poblacion_ocupada_ensambladora_year990       -189413   91251256  -0.002
##                                           Pr(>|t|)    
## (Intercept)                               7.91e-05 ***
## estadoBaja California                     0.460816    
## estadoCampeche                            0.004987 ** 
## estadoChihuahua                           0.000425 ***
## estadoCiudad de Mexico                    5.41e-07 ***
## estadoCoahuila de Zaragoza                 < 2e-16 ***
## estadoColima                              0.005002 ** 
## estadoDurango                             0.025336 *  
## estadoEstado de Mexico                    0.731814    
## estadoGuanajuato                          5.19e-08 ***
## estadoHidalgo                             0.005965 ** 
## estadoJalisco                             0.375793    
## estadoMorelos                             0.012071 *  
## estadoNuevo Leon                          1.48e-05 ***
## estadoPuebla                              2.93e-07 ***
## estadoQueretaro                           1.41e-10 ***
## estadoQuintana Roo                        0.001215 ** 
## estadoSan Luis Potosi                     0.266626    
## estadoSonora                              0.042535 *  
## estadoTamaulipas                          0.006944 ** 
## estadoTlaxcala                            0.012781 *  
## estadoVeracruz de Ignacio de la Llave     0.007983 ** 
## estadoYucatan                             0.005001 ** 
## estadoZacatecas                           0.009008 ** 
## exportaciones_anual10141642000            2.20e-11 ***
## exportaciones_anual10314836000            0.008108 ** 
## exportaciones_anual10398672000            0.390040    
## exportaciones_anual10400467000            0.019577 *  
## exportaciones_anual10478612000            0.013343 *  
## exportaciones_anual10594592000            3.45e-12 ***
## exportaciones_anual10701591000            0.058131 .  
## exportaciones_anual11146761000            0.000788 ***
## exportaciones_anual1116042000             0.999555    
## exportaciones_anual1119625000             0.999858    
## exportaciones_anual11227331000            0.033364 *  
## exportaciones_anual11449692000            0.568943    
## exportaciones_anual1165750000             0.089097 .  
## exportaciones_anual11738889000            0.000509 ***
## exportaciones_anual11794073000            0.377462    
## exportaciones_anual12035000               0.999764    
## exportaciones_anual12044484000            0.659376    
## exportaciones_anual1238308000             0.977303    
## exportaciones_anual1262654000             0.999673    
## exportaciones_anual1278536000             0.745031    
## exportaciones_anual12868798000            0.096335 .  
## exportaciones_anual1301171000             0.948587    
## exportaciones_anual1307252000             0.757835    
## exportaciones_anual1310801000             0.784289    
## exportaciones_anual1318941000             0.963832    
## exportaciones_anual1323153000             0.954363    
## exportaciones_anual13360587000            0.019778 *  
## exportaciones_anual13514349000            7.01e-07 ***
## exportaciones_anual13664629000            0.122623    
## exportaciones_anual1379964000             0.793816    
## exportaciones_anual14009625000            0.415017    
## exportaciones_anual1428633000             0.969828    
## exportaciones_anual1440918000             0.855340    
## exportaciones_anual1448674000             0.920153    
## exportaciones_anual14512000               0.999881    
## exportaciones_anual1460627000             0.027060 *  
## exportaciones_anual1460865000             0.929814    
## exportaciones_anual1470940000             0.999583    
## exportaciones_anual15019152000            8.35e-11 ***
## exportaciones_anual15120233000            0.723833    
## exportaciones_anual15294350000            0.069948 .  
## exportaciones_anual15531676000            0.238673    
## exportaciones_anual15611884000            0.406936    
## exportaciones_anual16121000               0.999751    
## exportaciones_anual1654784000             0.489295    
## exportaciones_anual16642906000            0.717893    
## exportaciones_anual1672357000             0.495908    
## exportaciones_anual16837910000            5.59e-08 ***
## exportaciones_anual16895883000            0.207333    
## exportaciones_anual17204369000            0.007015 ** 
## exportaciones_anual1721651000             0.952264    
## exportaciones_anual1726504000             0.948901    
## exportaciones_anual17332223000            0.300118    
## exportaciones_anual17443597000            0.261214    
## exportaciones_anual1752495000             0.492209    
## exportaciones_anual17544423000            0.138515    
## exportaciones_anual17547974000            1.53e-06 ***
## exportaciones_anual17735407000            0.254083    
## exportaciones_anual17877862000            0.907433    
## exportaciones_anual1813156000             0.027561 *  
## exportaciones_anual18601992000            0.336980    
## exportaciones_anual1861966000             0.493199    
## exportaciones_anual18687648000            0.786756    
## exportaciones_anual18737712000            0.175811    
## exportaciones_anual18985000               0.999939    
## exportaciones_anual191993000                    NA    
## exportaciones_anual19737684000            0.391870    
## exportaciones_anual19840531000            0.031101 *  
## exportaciones_anual19863200000            0.012341 *  
## exportaciones_anual20010001000            0.746897    
## exportaciones_anual20026441000            0.128721    
## exportaciones_anual20093245000            0.563885    
## exportaciones_anual20335098000            0.515806    
## exportaciones_anual20787831000            0.053454 .  
## exportaciones_anual21133618000            0.896160    
## exportaciones_anual2127000000             0.559867    
## exportaciones_anual2128076000             0.124878    
## exportaciones_anual21392726000            0.351536    
## exportaciones_anual21659640000            0.761275    
## exportaciones_anual22099835000            0.123811    
## exportaciones_anual2242354000             0.957630    
## exportaciones_anual22472408000            0.285657    
## exportaciones_anual22985164000            0.839923    
## exportaciones_anual2299343000             0.953889    
## exportaciones_anual2301925000                   NA    
## exportaciones_anual2302851000             0.000191 ***
## exportaciones_anual23360290000            0.336644    
## exportaciones_anual2376795000             0.954388    
## exportaciones_anual24048744000            0.001074 ** 
## exportaciones_anual2452302000             7.69e-07 ***
## exportaciones_anual24926226000            0.826719    
## exportaciones_anual25065798000            0.108328    
## exportaciones_anual25504680000            0.264642    
## exportaciones_anual25507316000            0.978798    
## exportaciones_anual26300102000            0.638999    
## exportaciones_anual2630544000             0.001629 ** 
## exportaciones_anual2632148000             0.873109    
## exportaciones_anual2667126000             0.779983    
## exportaciones_anual26736210000            0.453803    
## exportaciones_anual2684823000             0.851311    
## exportaciones_anual2705297000             3.32e-07 ***
## exportaciones_anual27314741000            0.235717    
## exportaciones_anual2737230000             0.726566    
## exportaciones_anual27397995000            0.660314    
## exportaciones_anual2760694000             0.885648    
## exportaciones_anual2793509000             0.932554    
## exportaciones_anual2873522000             0.985551    
## exportaciones_anual2880494000             0.771551    
## exportaciones_anual29130161000            0.385196    
## exportaciones_anual2946392000             0.975096    
## exportaciones_anual3026698000             0.986198    
## exportaciones_anual30529987000            0.112850    
## exportaciones_anual3086705000             0.875644    
## exportaciones_anual3086747000             0.968443    
## exportaciones_anual3141633000             0.980395    
## exportaciones_anual31513013000            0.020031 *  
## exportaciones_anual3157991000             0.930865    
## exportaciones_anual32177305000            0.029761 *  
## exportaciones_anual3325166000             0.962159    
## exportaciones_anual3402758000             0.733918    
## exportaciones_anual34511011000            0.002198 ** 
## exportaciones_anual34522156000            0.179426    
## exportaciones_anual34590332000            0.595705    
## exportaciones_anual34838926000            5.95e-12 ***
## exportaciones_anual3490783000             0.763448    
## exportaciones_anual35002851000            0.038256 *  
## exportaciones_anual35997280000            0.060790 .  
## exportaciones_anual36004725000            0.048844 *  
## exportaciones_anual36251770000            1.84e-09 ***
## exportaciones_anual36315716000            0.043994 *  
## exportaciones_anual3657768000             0.976793    
## exportaciones_anual37699563000            2.51e-08 ***
## exportaciones_anual3791586000             0.760401    
## exportaciones_anual38441996000            0.069528 .  
## exportaciones_anual38572482000            0.000247 ***
## exportaciones_anual38950677000            4.00e-07 ***
## exportaciones_anual39615279000            0.002951 ** 
## exportaciones_anual39857053000            0.039256 *  
## exportaciones_anual39896454000            0.050207 .  
## exportaciones_anual40659059000            0.140168    
## exportaciones_anual41034808000            3.96e-06 ***
## exportaciones_anual42396951000            0.289185    
## exportaciones_anual4339856000             0.880619    
## exportaciones_anual44961569000            1.01e-11 ***
## exportaciones_anual47659461000            2.58e-05 ***
## exportaciones_anual4862567000             0.948547    
## exportaciones_anual52231000               0.999894    
## exportaciones_anual522839000              0.994734    
## exportaciones_anual5352788000             0.918017    
## exportaciones_anual5362863000             0.890841    
## exportaciones_anual582973000              0.999327    
## exportaciones_anual587504000              0.057760 .  
## exportaciones_anual606131000              0.068173 .  
## exportaciones_anual6367193000             0.906729    
## exportaciones_anual6697248000             0.923728    
## exportaciones_anual716061000              0.999850    
## exportaciones_anual722027000              0.943763    
## exportaciones_anual726530000              0.071212 .  
## exportaciones_anual729883000              0.002790 ** 
## exportaciones_anual735262000              0.997971    
## exportaciones_anual7830019000             0.559335    
## exportaciones_anual7870962000             0.506361    
## exportaciones_anual790859000              0.890237    
## exportaciones_anual80907000               0.999744    
## exportaciones_anual820169000              0.138633    
## exportaciones_anual8466008000             0.890474    
## exportaciones_anual8476833000             0.014218 *  
## exportaciones_anual8495444000             0.542336    
## exportaciones_anual8534000                0.999930    
## exportaciones_anual871638000              0.250445    
## exportaciones_anual8829410000             0.675432    
## exportaciones_anual9147776000             0.004843 ** 
## exportaciones_anual9372970000             1.38e-11 ***
## exportaciones_anual9505026000             0.012374 *  
## exportaciones_anual9650719000             0.473976    
## exportaciones_anual9806397000             0.020721 *  
## poblacion_ocupada_ensambladora_year1004   0.995976    
## poblacion_ocupada_ensambladora_year1017   0.335352    
## poblacion_ocupada_ensambladora_year10714  0.694570    
## poblacion_ocupada_ensambladora_year1075   0.999692    
## poblacion_ocupada_ensambladora_year10767  0.969271    
## poblacion_ocupada_ensambladora_year11050  0.289581    
## poblacion_ocupada_ensambladora_year11361  0.547670    
## poblacion_ocupada_ensambladora_year11806  0.962059    
## poblacion_ocupada_ensambladora_year12073  0.974294    
## poblacion_ocupada_ensambladora_year12094  0.477631    
## poblacion_ocupada_ensambladora_year12217  0.945103    
## poblacion_ocupada_ensambladora_year124585 0.686575    
## poblacion_ocupada_ensambladora_year1247   0.997523    
## poblacion_ocupada_ensambladora_year12650  0.990566    
## poblacion_ocupada_ensambladora_year12836  0.924345    
## poblacion_ocupada_ensambladora_year13072  0.867499    
## poblacion_ocupada_ensambladora_year13538  0.810777    
## poblacion_ocupada_ensambladora_year13866  0.660641    
## poblacion_ocupada_ensambladora_year13927  0.989924    
## poblacion_ocupada_ensambladora_year13995  0.997355    
## poblacion_ocupada_ensambladora_year14221  0.349891    
## poblacion_ocupada_ensambladora_year144    0.999835    
## poblacion_ocupada_ensambladora_year15136  0.999400    
## poblacion_ocupada_ensambladora_year15762  0.646041    
## poblacion_ocupada_ensambladora_year15901  0.532934    
## poblacion_ocupada_ensambladora_year1601   0.431172    
## poblacion_ocupada_ensambladora_year1629   0.457714    
## poblacion_ocupada_ensambladora_year16844  0.971524    
## poblacion_ocupada_ensambladora_year1751   0.582365    
## poblacion_ocupada_ensambladora_year17726  0.827472    
## poblacion_ocupada_ensambladora_year1776   0.297516    
## poblacion_ocupada_ensambladora_year17790  0.992263    
## poblacion_ocupada_ensambladora_year17806  0.170398    
## poblacion_ocupada_ensambladora_year17876  0.638457    
## poblacion_ocupada_ensambladora_year18197  0.940843    
## poblacion_ocupada_ensambladora_year1827   0.974427    
## poblacion_ocupada_ensambladora_year18338  0.992925    
## poblacion_ocupada_ensambladora_year186    0.920058    
## poblacion_ocupada_ensambladora_year1890   0.999533    
## poblacion_ocupada_ensambladora_year19056  0.994086    
## poblacion_ocupada_ensambladora_year19219  0.997279    
## poblacion_ocupada_ensambladora_year19286  0.860418    
## poblacion_ocupada_ensambladora_year1945   0.891410    
## poblacion_ocupada_ensambladora_year19522  0.054893 .  
## poblacion_ocupada_ensambladora_year20047  0.980754    
## poblacion_ocupada_ensambladora_year217    0.998757    
## poblacion_ocupada_ensambladora_year22383  0.954300    
## poblacion_ocupada_ensambladora_year2252   0.998266    
## poblacion_ocupada_ensambladora_year2275   0.993723    
## poblacion_ocupada_ensambladora_year22783  0.849712    
## poblacion_ocupada_ensambladora_year23106  0.563332    
## poblacion_ocupada_ensambladora_year23160  0.175043    
## poblacion_ocupada_ensambladora_year23209  0.882294    
## poblacion_ocupada_ensambladora_year23991  0.995820    
## poblacion_ocupada_ensambladora_year25113  0.617970    
## poblacion_ocupada_ensambladora_year25660  0.819201    
## poblacion_ocupada_ensambladora_year25840  0.970460    
## poblacion_ocupada_ensambladora_year26248  0.920086    
## poblacion_ocupada_ensambladora_year2695   0.884103    
## poblacion_ocupada_ensambladora_year26950  0.369464    
## poblacion_ocupada_ensambladora_year27190  0.730714    
## poblacion_ocupada_ensambladora_year2720   0.992159    
## poblacion_ocupada_ensambladora_year27286  0.826817    
## poblacion_ocupada_ensambladora_year27319  0.925141    
## poblacion_ocupada_ensambladora_year281    0.998521    
## poblacion_ocupada_ensambladora_year28299  0.529148    
## poblacion_ocupada_ensambladora_year28505  0.825800    
## poblacion_ocupada_ensambladora_year28631  0.879747    
## poblacion_ocupada_ensambladora_year29188  0.134802    
## poblacion_ocupada_ensambladora_year29560  0.618750    
## poblacion_ocupada_ensambladora_year29817  0.816331    
## poblacion_ocupada_ensambladora_year29949  0.238808    
## poblacion_ocupada_ensambladora_year3006   0.998033    
## poblacion_ocupada_ensambladora_year30939  0.777351    
## poblacion_ocupada_ensambladora_year31     0.977051    
## poblacion_ocupada_ensambladora_year31326  0.243740    
## poblacion_ocupada_ensambladora_year31593  0.252347    
## poblacion_ocupada_ensambladora_year3167   0.984284    
## poblacion_ocupada_ensambladora_year31902  0.183369    
## poblacion_ocupada_ensambladora_year32058  0.728265    
## poblacion_ocupada_ensambladora_year32214  0.864760    
## poblacion_ocupada_ensambladora_year32397  0.679232    
## poblacion_ocupada_ensambladora_year32737  0.557283    
## poblacion_ocupada_ensambladora_year33776  0.018915 *  
## poblacion_ocupada_ensambladora_year34166  0.399814    
## poblacion_ocupada_ensambladora_year34184  0.828733    
## poblacion_ocupada_ensambladora_year3467   0.992098    
## poblacion_ocupada_ensambladora_year35667  0.446947    
## poblacion_ocupada_ensambladora_year35925  0.954833    
## poblacion_ocupada_ensambladora_year36108  0.097130 .  
## poblacion_ocupada_ensambladora_year3639         NA    
## poblacion_ocupada_ensambladora_year36416  0.582209    
## poblacion_ocupada_ensambladora_year3658   0.630419    
## poblacion_ocupada_ensambladora_year367    0.915805    
## poblacion_ocupada_ensambladora_year37632  0.675895    
## poblacion_ocupada_ensambladora_year37833  0.407177    
## poblacion_ocupada_ensambladora_year3798   0.939194    
## poblacion_ocupada_ensambladora_year38     0.963735    
## poblacion_ocupada_ensambladora_year38917  0.198374    
## poblacion_ocupada_ensambladora_year3903   0.979891    
## poblacion_ocupada_ensambladora_year4011   0.851564    
## poblacion_ocupada_ensambladora_year4036   0.841857    
## poblacion_ocupada_ensambladora_year40376  0.424209    
## poblacion_ocupada_ensambladora_year40801  0.749486    
## poblacion_ocupada_ensambladora_year41376  0.761538    
## poblacion_ocupada_ensambladora_year4155   0.923672    
## poblacion_ocupada_ensambladora_year4164   0.235754    
## poblacion_ocupada_ensambladora_year42428  0.935740    
## poblacion_ocupada_ensambladora_year447    0.999379    
## poblacion_ocupada_ensambladora_year45674  0.452587    
## poblacion_ocupada_ensambladora_year45735  0.943618    
## poblacion_ocupada_ensambladora_year4615   0.008969 ** 
## poblacion_ocupada_ensambladora_year46197  0.609875    
## poblacion_ocupada_ensambladora_year4650   0.905077    
## poblacion_ocupada_ensambladora_year47540  0.860339    
## poblacion_ocupada_ensambladora_year48229  0.726914    
## poblacion_ocupada_ensambladora_year48921  0.318209    
## poblacion_ocupada_ensambladora_year49658  0.756058    
## poblacion_ocupada_ensambladora_year5022   0.971949    
## poblacion_ocupada_ensambladora_year50292  0.914423    
## poblacion_ocupada_ensambladora_year5078   0.971900    
## poblacion_ocupada_ensambladora_year5096   0.268788    
## poblacion_ocupada_ensambladora_year50998  0.856202    
## poblacion_ocupada_ensambladora_year513    0.997606    
## poblacion_ocupada_ensambladora_year52     0.995407    
## poblacion_ocupada_ensambladora_year528    0.977370    
## poblacion_ocupada_ensambladora_year52931  0.777154    
## poblacion_ocupada_ensambladora_year542    0.996961    
## poblacion_ocupada_ensambladora_year5455   0.616854    
## poblacion_ocupada_ensambladora_year5523   0.950688    
## poblacion_ocupada_ensambladora_year5628   0.562501    
## poblacion_ocupada_ensambladora_year589    0.989868    
## poblacion_ocupada_ensambladora_year59620  0.617821    
## poblacion_ocupada_ensambladora_year6014   0.976991    
## poblacion_ocupada_ensambladora_year604    0.829301    
## poblacion_ocupada_ensambladora_year6077   0.810583    
## poblacion_ocupada_ensambladora_year6144   0.386268    
## poblacion_ocupada_ensambladora_year6165   0.987548    
## poblacion_ocupada_ensambladora_year645    0.209775    
## poblacion_ocupada_ensambladora_year65410  0.798646    
## poblacion_ocupada_ensambladora_year658    0.988444    
## poblacion_ocupada_ensambladora_year6783   0.807652    
## poblacion_ocupada_ensambladora_year7005   0.461392    
## poblacion_ocupada_ensambladora_year7010   0.983063    
## poblacion_ocupada_ensambladora_year7161   0.924287    
## poblacion_ocupada_ensambladora_year7357   0.987576    
## poblacion_ocupada_ensambladora_year74914  0.513814    
## poblacion_ocupada_ensambladora_year7497   0.962657    
## poblacion_ocupada_ensambladora_year7538   0.869159    
## poblacion_ocupada_ensambladora_year76042  0.307503    
## poblacion_ocupada_ensambladora_year7608   0.761181    
## poblacion_ocupada_ensambladora_year76195  0.363960    
## poblacion_ocupada_ensambladora_year7631   0.908291    
## poblacion_ocupada_ensambladora_year7694   0.593020    
## poblacion_ocupada_ensambladora_year7695   0.445059    
## poblacion_ocupada_ensambladora_year7697   0.927242    
## poblacion_ocupada_ensambladora_year7710   0.631137    
## poblacion_ocupada_ensambladora_year781    0.890093    
## poblacion_ocupada_ensambladora_year786    0.798374    
## poblacion_ocupada_ensambladora_year7889   0.938773    
## poblacion_ocupada_ensambladora_year8134   0.472808    
## poblacion_ocupada_ensambladora_year82050  0.811431    
## poblacion_ocupada_ensambladora_year83186  0.834369    
## poblacion_ocupada_ensambladora_year8415   0.767440    
## poblacion_ocupada_ensambladora_year84649  0.544544    
## poblacion_ocupada_ensambladora_year8538   0.929695    
## poblacion_ocupada_ensambladora_year8589   0.686433    
## poblacion_ocupada_ensambladora_year8763   0.137894    
## poblacion_ocupada_ensambladora_year915    0.993989    
## poblacion_ocupada_ensambladora_year9218   0.953003    
## poblacion_ocupada_ensambladora_year9264   0.721149    
## poblacion_ocupada_ensambladora_year93703  0.293092    
## poblacion_ocupada_ensambladora_year9692   0.787738    
## poblacion_ocupada_ensambladora_year9849   0.311983    
## poblacion_ocupada_ensambladora_year990    0.998345    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 79030000 on 318 degrees of freedom
## Multiple R-squared:  0.9716, Adjusted R-squared:  0.9384 
## F-statistic: 29.28 on 371 and 318 DF,  p-value: < 2.2e-16
# Este análisis adicional nos muestra datos predictivos en cuanto al desempeño de la industria automotriz. Los datos anallizan del 2014 al 2022 y evalúa el desempeño de la industria considerando exportaciones, población ocupada, producción anual por estado, entre otros puntos. En resumen, la base de datos nos dice que hay información significativa en distintos Estados de la República. Entre los más significativos se encuentran Baja California y San Luis Potosí. Podemos deducir que esto se debe a la alta infuencia en industria que estos estados manejan a nivel nacional.

8.Business Analytics y Business Intelligence

# *¿Qué es Business Analytics?*
#  Es una combinación de habilidades, tecnologías y prácticas para la exploración e investigación del funcionamiento y los procesos empresariales que se han tenido anteriormente por un empresa, para de ese modo obtener información, poder analizar dicha información que se extrae y así impulsar la planificación estratégica empresarial. Business Analytics puede descubrir patrones y predecir tendencias considerando diferentes factores. 

# Existen diferentes rubros del "Business Analytics":

#  1. Análisis Descriptivo

# 2. Análisis de Diagnóstico

# 3. Análisis Predictivo

# 4. Análisis Prescriptivo

# *¿Qué es Business Analytics?*
#  1. Determina qué conjuntos de datos son significantes y útiles para poder analizar y conocer el desempeño de la empresa y cuáles pueden aumentar los ingresos y disminuir los costos. 

# - *Ejemplo:* productividad y eficencia.

# 2. Analizar y transformar los datos en información útil, identificar y anticipar tendencias y resultados. Simplificar información para hacerla más sencilla de entender y visual.  

# 3. Tomar decisiones empresariales más inteligentes basadas en datos.

# - *Ejemplo:* Análisis del comportamiento de los clientes, disminución de costo, evitar mermas, aprovechamiento de tiempos y materiales, eficiencia y eficacia. 

# __Fuente: (Galiana, P., 2022)__

# *¿Qué es Business Intelligence?*
# 1. La capacidad de analizar de forma combinada información interna y externa procedente de distintas fuentes y sistemas.

# 2. Una mayor profundidad de análisis y una capacidad ampliada de reporteo.

# 3. La capacidad de realizar proyecciones y pronósticos de futuro en base a toda esa información.

# __Fuente: (¿Qué es Business Intelligence y cómo funciona? | IBM., 2022)__

# *¿Cuál es la relación entre Business Analytics y Business Intelligence?*
#  BI sirve para evaluar, optimizar y coordinar las operaciones internas de una empresa. Trata de aprovechar todo el potencial de los datos que genera una empresa en todas sus actividades diarias y analizar estos datos para obtener información de valor sobre la toma de decisiones.Ayuda para entender el histórico y el como evolucionan los datos. Y como mencionamos anteriormente Business Analytics con el analisis de la información de una empresa logra puede llegar a desubrir patrones, explicaciones del porque de los mismos y predecir tendencias o hechos que pueden llegar a pasar en el negocio. 

# Estos dos términos tienen una alta relación entre ellas, ya que en pocas palabras la Inteligencia de Negocios es el hacer análisis de los datos obtenidos y Analítica de Negocios es predicción a partir de los datos que se obtuvieron con el análisis. Una con lleva a la otra y trabajan juntas para obtener el resultado buscado de un análisis de datos que contenga la información relevante y significativa que nos pueda mostrar predicciones del comportamiento, ya sea de la empresa, de la economía, de los ingresos, de los clientes y más. Ambas son necesarias para extraer un buen análisis de la información de una empresa, ya que uno analiza dos, los organiza y extrae aquellos relevantes y la otra puede lograr las pedicciones y análisis.

9. Key Performance Indicators (KPI’s)

# *¿Qué son los Indicadores Clave de Rendimiento (KPI's)?*

# Un KPI (Key Performance Indicator) es una métrica cuantitativa que muestra cómo tu equipo progresa hacia tus objetivos empresariales más importantes. Esto puede ir desde la evaluación de un proyecto específico hasta el rendimiento general de una compañía, logrando así tus objetivos estratégicos.

# __Fuente: (Bello, E., 2021)__

# *Propuestas de mejora para FORM*

# *Recursos Humanos*
# Propuesta 1. Vemos que se tiene un mayor porcentaje de empleadas femeninas, representando un 70% de los empleados totales. Adicional, muchos de los empleados viven en dos estados: Nuevo León y Coahuila, del cual destaca principalmente Nuevo León. Se recomienda implementar un indicador que mida la retención de talento que se está teniendo en la empresa para conocer la estabilidad laboral. Como muestra la base de datos de bajas, hay una alta rotación por motivos diversos aunque no existe un indicador fijo para medir esta rotación. Es de alto valor aplicarlo para poder entender las causas y cómo mejorar el proceso.
# Propuesta 2. Respecto a los puestos laborales, existen 60 personas desempeñándose como “ayudantes generales”. Es importante analizar la importancia que tiene dicho puesto y cuáles son las posibilidades de crecimiento dentro de este. Se debe considerar la forma de implementar una evaluación de habilidades para los empleados que les permita crecer de manera orgánica dentro de la empresa y de esta forma, aumentar el porcentaje de retención de personal.


# *Delivery Performance*
# Propuesta 1. Crear un plan de entregas con menos de dos vueltas, ya que se mostró menos efectiva la tercera, marcando más tardanzas a lo largo del análisis.
# Propuesta 2. Crear un plan mensual con KPI's de rapidez de entregas para ver el flujo por mes de lo que están tardando y ver las acciones específicas para mitigar ese retraso.


# *Merma*
# Propuesta 1. De acuerdo al cálculo de merma total, se generaron 185,426 kilos de Enero a Septiembre del 2022. En el análisis se muestra un incremento de producción de merma del 60.34%. Podemos suponer que este incremento se debe al aumento de la industria automotriz en producción, exportaciones y ventas internas (El Economista, 2022). Esto para FORM significaría que tuvieron un aumento en pedidos y por ende, hubo un descuido en los procesos de calidad y producción. Como propuesta de mejora, se sugeriría llevar un control puntual del manejo de mercancía a través de tecnologías digitales. Esto a través de un control puntual de cuánto se está desperdiciando para cada producto o cliente y definir un valor máximo de merma a poder generar.
# Propuesta 2. Como segundo plan de acción, se recomienda identificar la causa de la merma, es decir, saber qué recursos se merman. Esto con el objetivo de identificar qué es lo que genera esta pérdida y trabajar sobre ella para evitar que se repita.


# *Producción*
# Propuesta 1. Se recomienda realizar un estudio ergonómico sobre las estaciones de trabajo del área de producción con el fin de mejorar paulativamente el rendimiento de los colaboradores en sus actividades correspondientes.
# Propuesta 2. Se recomienda ejecutar encuestas periódicas a los clientes con la finalidad de obtener información de satisfacción con respecto al producto entregado. De esta manera, la empresa podrá tomar las acciones correspondientes como respuesta de una política de mejora continua.

# *Scrap*
# Propuesta 1. Con la intención de reducir los errores de mano de obra al mínimo, se recomienda implementar un manual de capacitación para los empleados del área de producción y calidad con el objetivo de evitar descuidos, negligencias, usos incorrectos o irresponsabilidades, para reducir eficazmente el desperdicio de materia prima. Esto le dará a FORM una mejor estrategia de costos, así como relación con el capital humano, pues tendrán mejores herramientas para tratar errores productivos e incrementar su productividad a través de capacitación más especializada.
# Propuesta 2. Para evitar el desperdicio, se recomienda replantear el almacenamiento de stock, esto con la intención de mejorar el espacio en piso para el orden de los materiales y optimizar el proceso de producción completo.

10. Insights

# *Recursos Humanos*
# 1. Vemos que se tiene un mayor porcentaje de empleadas femeninas, representando un 70% de los empleados totales. Adicional, muchos de los empleados viven en dos estados: Nuevo León y Coahuila, del cual destaca principalmente Nuevo León.
# 2. El salario diario promedio de FORM es de $180 pesos mexicanos, es decir, $5,400 pesos mensuales. De acuerdo a datos compartidos por la INEGI, se prevé que para 2022 el salario mínimo en México sea de $5,255 pesos mensuales. Esto refleja que el salario mensual de FORM es 2% mayor al salario mínimo del país.

# *Delivery Performance*
# 1. Nos muestra que el cliente potencial es Hella, ya que cuenta con mayores pedidos y el segundo lugar para FORM es TRMX.
# 2. Se analizó que Septiembre es uno de los meses fuertes para la empresa en esta área, ya que se incrementaron los pedidos establecidos. 


# *Merma*
# 1. Sería importante considerar que para tener un cambio significativo, es necesario darle importancia al correcto almacenamiento de datos y procesamiento de los mismos, pues éstas son las bases de una ágil interpretación de datos, generando así una mejor toma de decisiones y por ende, un correcto manejo de la información.
# 2. se está generando una merma irregular. Los datos muestran que de Enero a Abril hubo una merma de 3 toneladas promedio. De Abril a Julio se generó alrededor de 5 toneladas y llegó a generar hasta 6 toneladas y de Julio a Octubre generó 3 toneladas promedio. Aunque en un mes se logró tener menos de 1 tonelada de merma.

# *Producción*
# 1. Vemos que el cliente “VL-017-14086” es el que menos producto compra. Se recomienda analizar qué tanto beneficio nos está generando contar con un cliente que únicamente pide una pieza.
# 2. Se analizó que en las estaciones C1 y C2 tienen la mayor productividad debido a que son las que menos tiempo hacen con más procesamiento de láminas. Por lo tanto, esto es una ventaja que se podría analizar en esta fase de producción para aplicarla a las demás áreas.

# *Scrap*
# 1. El área que mayor cantidad de ‘scrap’ total genera es “SAB/Calidad/Entrega de PT” aunque de manera individual.
# 2. Los datos muestran que hay un alto nivel de chatarra generada por parte del área de Calidad/Entrega de Producto Terminado. Sería necesario identificar las razones de este desperdicio y la manera de reducir este desecho al mínimo.

11. Referencias

9 Estilos y formatos de tabla | Tablas y graficos con R y R Studio. (2022). Retrieved 24 September 2022, from https://tables.investigaonline.com/tse-formateo.html

Ana Karen García. (2022, September 8). Industria automotriz anota un buen agosto: crecen producción, exportaciones y ventas internas. El Economista; El Economista. https://www.eleconomista.com.mx/empresas/Industria-automotriz-anota-un-buen-agosto-crecen-produccion-exportaciones-y-ventas-internas-20220907-0031.html

Bello, E. (2021). Qué son los KPIs y cómo funcionan. Thinking For Innovation. Retrieved from https://www.iebschool.com/blog/que-son-los-kpis-y-como-aplicarlos-a-tu-empresa-digital-business/

Hernández, F., & Usuga, O. (2022). 9 Tablas de frecuencia | Manual de R. Retrieved 24 September 2022, from https://fhernanb.github.io/Manual-de-R/tablas.html#ejemplo-tabla-de-frecuencia-relativa-de-una-v%C3%ADa

Galiana, P. (2022). Qué es Business Analytics: definición,tipos y diferencias. Thinking For Innovation. Retrieved from https://www.iebschool.com/blog/que-es-business-analytics-definiciontipos-y-diferencias-big-data/

Gulzar, M. (2022, 6 enero). K-Means Clustering: Concepts and Implementation in R for Data Science. Medium. Recuperado 10 de octubre de 2022, de https://towardsdatascience.com/k-means-clustering-concepts-and-implementation-in-r-for-data-science-32cae6a3ceba

Gulzar, M. (2022b, enero 6). K-Means Clustering: Concepts and Implementation in R for Data Science. Medium. Recuperado 10 de octubre de 2022, de https://towardsdatascience.com/k-means-clustering-concepts-and-implementation-in-r-for-data-science-32cae6a3ceba

¿Qué es Business Intelligence y cómo funciona? | IBM. (2022). Retrieved 13 October 2022, from https://www.ibm.com/mx-es/topics/business-intelligence

Zhu, A. (2022, 12 agosto). K-Means Clustering Explained Simply - Towards Data Science. Medium. Recuperado 10 de octubre de 2022, de https://towardsdatascience.com/explain-ml-in-a-simple-way-k-means-clustering-e925d019743b

LS0tDQp0aXRsZTogIkV2aWRlbmNpYSAyIg0KYXV0aG9yOiAiSmltZW5hIE1pZ3VlbCINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogICAgICBodG1sX2RvY3VtZW50Og0KICAgICAgICB0b2M6IHRydWUNCiAgICAgICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQogICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQoNCiMjIEltcG9ydGFyIGJhc2UgZGUgZGF0b3MgeSBjYXJnYXIgbGlicmVyw61hcw0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGZvcmVpZ24pDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KGp0b29scykNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShmYWN0b2V4dHJhKQ0KbGlicmFyeShnZ2ZvcnRpZnkpDQpsaWJyYXJ5KEhtaXNjKQ0KbGlicmFyeShvbHNycikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KI2xpYnJhcnkobWlyYWdlKQ0KI2xpYnJhcnkoc2QpDQpsaWJyYXJ5KG1vZGVlc3QpDQojbGlicmFyeShiYXJwbG90KQ0KI2xpYnJhcnkobWVyZ2UpDQpsaWJyYXJ5KG1vZGVlc3QpDQpsaWJyYXJ5KGZvcmNhdHMpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShuYW5pYXIpDQpsaWJyYXJ5KGRsb29rcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnbW9kZWxzKQ0KbGlicmFyeShjcm9zc3RhYmxlKQ0KbGlicmFyeShvcGVueGxzeCkNCmxpYnJhcnkobG10ZXN0KQ0KI2xpYnJhcnkoYXV0by5hcmltYSkNCmxpYnJhcnkoZm9yZWNhc3QpDQpgYGANCg0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkYXJrb3JhbmdlIj4qKsK/UXVpw6luIGVzIEZvcm0/KioNCkZPUk0gZXMgdW5hIGVtcHJlc2EgbWV4aWNhbmEgZGVkaWNhZGEgYSBnZW5lcmFyIHNvbHVjaW9uZXMgaW50ZWdyYWxlcyBkZSBlbXBhcXVlIHBhcmEgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXouIEZ1ZSBmdW5kYWRhIGVuIGVsIDIwMTEgcG9yIEZlbGlwZSBGbG9yZXMgR2FyY8OtYSB5IGhveSBlbiBkw61hIGN1ZW50YSBjb24gbcOhcyBkZSAxMzAgZW1wbGVhZG9zLiBGT1JNIHRvbWEgZ3JhbiBpbXBvcnRhbmNpYSBhIHNlciBwYXJ0ZSBkZSB1biBlbnRvcm5vIHNvc3RlbmlibGUsIHBvciBsbyBxdWUgZGlzZcOxYSBlbXBhcXVlcyBlY29sw7NnaWNvcyBnZW5lcmFuZG8gdW4gaW1wYWN0byBwb3NpdGl2byBhbCBtZWRpbyBhbWJpZW50ZSwgZXMgcG9yIGVsbG8gcXVlIHN1IHByaW5jaXBhbCBtYXRlcmlhbCBlcyBlbCBjYXJ0w7NuLCAgY29uIGVsIGN1YWwgb2J0aWVuZW4gZWwgNTAlIGRlIHN1cyBnYW5hbmNpYXMgeSByZXByZXNlbnRhIGVsIDkwJSBkZSBzdXMgZ2FzdG9zIHkgY29zdG9zLiBQb3IgZWxsbyBsYSBpbXBvcnRhbmNpYSBkZSB1bmEgYnVlbmEgbG9nw61zdGljYSB5IGNhZGVuYSBkZSBzdW1pbmlzdHJvcyBlbiBGT1JNLCBwYXJhIG9wdGltaXphciAgeSBlZmljaWVudGl6YXIgeSBkZSBlc2UgbW9kbyB0ZW5lciByZW50YWJpbGlkYWQuIA0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOmRhcmtvcmFuZ2UiPioqMS4gU2NyYXAqKiANCmBgYHtyfQ0KDQojIyBMbGFtYXIgYmFzZSBkZSBkYXRvcy4NCg0KU0NSQVA8LSByZWFkLmNzdignRk9STSAtIFNjcmFwIExpbXBpYSAuY3N2JykNCnN1bW1hcnkoU0NSQVApDQoNCiMjIEVzdHJ1Y3R1cmEgZGUgbGEgYmFzZSBkZSBkYXRvcw0Kc3RyKFNDUkFQKQ0KDQojIyMgwr9DdcOhbnRvcyBOQSdzIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/DQojRGViaWRvIGEgcXVlIGVuIGxhIGJhc2UgZGUgZGF0b3Mgbm8gc2UgZW5jdWVudHJhbiBNaXNzaW5nIFZhbHVlcywgZW4gZXN0YSBiYXNlIGRlIGRhdG9zIG5vIHNlIHB1ZWRlbiByZW1wbGF6YXIgdmFsb3JlcyBwb3IgbWVkaWEsIG1lZGlhbmEgeSBtb2RhIHlhIHF1ZSBubyBhcGxpY2EuIA0KDQpzdW0oaXMubmEoU0NSQVApKQ0KDQojZGVzY3JpYmUoU0NSQVApDQoNCiMqKk5vdGE6KipFbiBlc3RhIGJhc2UgZGUgZGF0b3Mgc2UgZWxpbWluYXJvbiBsYSBjb2x1bWFuYSBxdWUgbm8gZXJhIHJlbGV2YW50ZSBwYXJhIGVsIGFuYWxpc2lzLiBTZSBlbGltaW5hbiBSZWZlcmVuY2lhLCBQcm9kdWN0bywgVW5pZGFkLmRlLm1lZGlkYSwgVWJpY2FjacOzbi5kZS5kZXNlY2hvLCBFc3RhZG8sIGRlYmlkbyBhIHF1ZSBzb24gaXJyZWxldmFudGVzLCBwdWVzIGVzIGVsIG1pc21vIGRhdG8gcGFyYSB0b2RvcyBsb3MgcmVnaXN0cm9zLg0KDQpiZDE8LSBTQ1JBUA0KYmQxPC1zdWJzZXQoU0NSQVAsc2VsZWN0PS1jKFJlZmVyZW5jaWEsIFVuaWRhZC5kZS5tZWRpZGEgLCBVYmljYWNpw7NuLmRlLmRlc2VjaG8sIEVzdGFkbykpDQpzdHIoYmQxKQ0Kc3VtbWFyeShiZDEpDQoNCiMjICoyLiAqUGFyYSBlbCBjYXNvIGRlIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIGNvbnNpZGVyYXIgbGEgcG9zaWJpbGlkYWQgZGUgcmVlbXBsYXphciBsYSBwcmVzZW5jaWEgZGUg4oCcbWlzc2luZyB2YWx1ZXPigJ0gY29uIGVzdGFkw61zdGljb3MgZGVzY3JpcHRpdm9zIChwb3IgZWplbXBsbywgbWVkaWEsIG1lZGlhbmEsIG1vZGEpLioNCg0KYmQxPC1TQ1JBUA0KYmQxDQoNCnN1bShpcy5uYShiZDEpKQ0Kc3VtKGlzLm5hKFNDUkFQKSkNCnNhcHBseShiZDEsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpDQpzYXBwbHkoU0NSQVAsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpDQoNCiMjIyBDYW1iaWFyIGNvbHVtbmFzIHkgdmFyaWFibGVzIA0KDQojc2VsZWNjaW9uYXIgY29sdW1uYXMgLyB2YXJpYWJsZXMuDQojYmQxPC1TQ1JBUCAlPiUgc2VsZWN0KG9uZV9vZigiRmVjaGEiLCJIb3JhIiwiUHJvZHVjdG8iLCJDYW50aWRhZCIsIlViaWNhY2nDs24uZGUub3JpZ2VuIikpDQoNCiNSZW5vbWJyYXIgbGFzIGNvbHVtbmFzIC92YXJpYWJsZXMgc2VsZWNjaW9uYWRhcy4gDQpjb2xuYW1lcyhiZDEpIDwtYyAoJ0ZlY2hhJywnSG9yYScsJ1Byb2QuJywnQ2FudC4nLCdPcmlnZW4nKQ0KDQoNCiMgKipOb3RhOioqIFNlIGNhbWJpYXJvbiBsb3Mgbm9tYnJlcyBkZSBsYXMgdmFyaWFibGVzIGEgbm9tYnJlcyBtw6FzIGNvcnRvcyBwYXJhIG5vIGNvbnRhciBjb24gbm9tYnJlcyBsYXJnb3MuDQoNCiMjIFRhYmxhIGRlIGVzdGFkw61zdGljb3MgZGVzY3JpcHRpdm9zDQoNCiNzdW1tYXJ5KGJkMSkNCiNkZXNjcmliZShiZDEpDQoNCg0Kc2QoYmQxJENhbnRpZGFkLCBuYS5ybT0gVFJVRSkgIA0KDQpWYXJpYWJsZTwtYygiQ2FudC4iKQ0KTWVkaWFuYTwtYygiMi4wMCIpDQpNZWRpYSA8LSBjKCI2LjY5NiIpDQpNb2RhIDwtIGMoIjEiKSAjRVhDRUwgDQpEZXN2aWFjacOzbl9lc3RhbmRhcjwtYygiMTEuODQ4ODUiKQ0KdGFibGUxIDwtIGRhdGEuZnJhbWUgKFZhcmlhYmxlLCBNZWRpYW5hLCBNZWRpYSwgTW9kYSwgRGVzdmlhY2nDs25fZXN0YW5kYXIpDQprbml0cjo6a2FibGUodGFibGUxKQ0KDQoNCiMjIENyZWFyIDEtMiDigJx0aW1lIHNlcmllcyBwbG90c+KAnSAobGluZSBwbG90KSBxdWUgbXVlc3RyYW4gbGEgZGlzcGVyc2nDs24gZGUgdmFyaWFibGVzIHNlbGVjaW9uYWRhcy4NCg0Kc3VtbWFyeShiZDEpDQpnZ3Bsb3QoYmQxLGFlcyh4PUNhbnQuKSkrDQogIGdlb21fbGluZShhZXMoeT1PcmlnZW4pLGNvbG9yPSJSZWQiKSsNCiAgbGFicyh4PSJDYW50Iix5PSJPcmlnZW4iLCBjb2xvcj0iTGVnZW5kIikrDQogIGdndGl0bGUoIk1heW9yZXMgY2FudGlkYWRlcyBkZSBTY3JhcCBwb3Igb3JpZ2VuIikNCg0KIyBMYSBncsOhZmljYSBhbnRlcmlvciBub3MgbXVlc3RyYSBxdWUgaGF5IHVuYSBtYXlvciBjYW50aWRhZCBkZSAnc2NyYXAnIGdlbmVyYWRvIGVuIFByZS1Qcm9kdWNjacOzbiwgc2lndWnDqW5kb2xlIEVudHJlZ2EgZGUgUHJvZHVjdG8gVGVybWluYWRvIHkgZmluYWxtZW50ZSBQb3N0LVByb2R1Y2Npw7NuLiBFc3RvIG5vcyBpbmRpY2EgcXVlIGhheSB1bmEgaW5lZmljaWVuY2lhIG1heW9yIGVuIGVsIMOhcmVhIHByZS1wcm9kdWN0aXZhLg0KYGBgDQoNCg0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkYXJrb3JhbmdlIj4qKjIuIE1lcm1hKiogDQpgYGB7cn0NCiMjIExsYW1hciBiYXNlIGRlIGRhdG9zLg0KDQpGT1JNPC0gcmVhZC5jc3YoJ0ZPUk0gLSBNZXJtYSBsaW1waWEuY3N2JykNCg0KIyMgRW50ZW5kZXIgQmFzZSBkZSBEYXRvcw0KcmVzdW1lbiA8LSBzdW1tYXJ5KEZPUk0pDQpyZXN1bWVuDQoNCiMjICoxLsK/Q3XDoW50YXMgdmFyaWFibGVzIHkgY3XDoW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/Kg0KIyA8Y2VudGVyPiA8c3BhbiBzdHlsZT0iY29sb3I6Qmx1ZSI+IFI9IDUyIHJlZ2lzdHJvcyB5IDIgdmFyaWFibGVzIDwvY2VudGVyPg0Kc3RyKEZPUk0pDQpkZXNjcmliZShGT1JNKQ0KDQojICoqTm90YToqKkVuIGVzdGEgYmFzZSBkZSBkYXRvcyBzZSBlbGltaW5hcm9uIGxhIGNvbHVtYW5hIHF1ZSBubyBlcmEgcmVsZXZhbnRlIHBhcmEgZWwgYW5hbGlzaXMsIFNlIGVsaW1pbmFyb24gbG9zIHJlZ2lzdHJvcyBkZSB0b3RhbCBkZSBtZXJtYSB5IGxhIGNvbHVtbmEgZGUgbWVzIHlhIHF1ZSBubyBlcmFuIGlycmVsZXZhbnRlcy4gUG9yIGxvIHRhbnRvIG5vcyBxdWVkYW1vcyBjb24gNTIgcmVnaXN0cm9zIHkgMiB2YXJpYWJsZXMuICANCg0KIyMgKjIuKlBhcmEgZWwgY2FzbyBkZSB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBjb25zaWRlcmFyIGxhIHBvc2liaWxpZGFkIGRlIHJlZW1wbGF6YXIgbGEgcHJlc2VuY2lhIGRlIOKAnG1pc3NpbmcgdmFsdWVz4oCdIGNvbiBlc3RhZMOtc3RpY29zIGRlc2NyaXB0aXZvcyAocG9yIGVqZW1wbG8sIG1lZGlhLCBtZWRpYW5hLCBtb2RhKS4qDQogIA0KDQojIFJlbXBsYXphciB2YWxvcmVzIGZhbHRhbnRlcyBwb3IgbGEgbWVkaWFuYTogTm8gc2UgcHVlZGVuIGNhbWJhaXIgZGViaWRvIGEgcXVlIGxvcyBOQcK0UyBkZSBsYSBiYXNlIGRlIGRhdG9zIG5vIHRpZW5lbiBpbmZvcm1hY2nDs24uIFBvciBsbyB0YW50byBzZSB2YW4gYSBFbGltaW5hci4gDQoNCkZPUk1fMTwtRk9STQ0KRk9STV8xPC0gbmEub21pdChGT1JNXzEpDQpzdW1tYXJ5KEZPUk1fMSkNCg0Kc3VtbWFyeShGT1JNKSANCnN0cihGT1JNKQ0KRk9STSRLaWxvczwtYXMubnVtZXJpYyhGT1JNJEtpbG9zKQ0KRk9STTwtRk9STSAlPiUgbXV0YXRlKEtpbG9zPWlmX2Vsc2UoaXMubmEoS2lsb3MpLG1lZGlhbihLaWxvcyxuYS5ybSA9IFQpLEtpbG9zKSkNCg0KIyAqKk5vdGE6KipFbiBlc3RhIGJhc2UgZGUgZGF0b3MgbGEgw7puaWNhIHZhcmlhYmxlIHF1ZSBzZSBwdWVkZSByZWVtcGxhemFyIHBvciBsYSBtZWRpYW5hIGVzIGxhIGNvbHVtbmEgZGUgJ2tpbG9zJy4gWWEgc2UgcmVtcGxhemFyb24gbG9zIHZhbG9yZXMgZmFsdGFudGVzIHBvciBsYSBtZWRpYW5hLiANCg0KDQojIyBDYW1iaWFyIG5vbWJyZXMgZGUgY29sdW1uYXMgeSB2YXJpYWJsZXMNCg0KIyMjIFNlbGVjY2lvbmFyIGNvbHVtbmFzIC8gdmFyaWFibGVzLg0KRk9STTwtRk9STSAlPiUgc2VsZWN0KC1vbmVfb2YoJ0ZlY2hhJywnS2lsb3MnKSkNCg0KIyMjIFJlbm9tYnJhciBsYXMgY29sdW1uYXMgL3ZhcmlhYmxlcyBzZWxlY2Npb25hZGFzLiANCmNvbG5hbWVzKEZPUk1fMSkgPC1jICgnRmNoYScsJ0tpbG8nKQ0KDQojICpSZXNwZWN0byBhIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMgKHBvciBlamVtcGxvLCBnw6luZXJvLCBjbGllbnRlLG11bmljaXBpbywgZXN0YWRvKSBob21vZ2VuaXphciBlbCBub21icmUgZGUgbGFzIGRpZmVyZW50ZXMgY2F0ZWdvcsOtYXMuICoNCiAgDQogIA0KIyAqUmVzcGVjdG8gYSBMYSBiYXNlIGRlIGRhdG9zIGFuYWxpemFkYSwgbm8gYXBsaWNhIGVsIHBhc28gZGUgaG9tb2dlbml6YXIgbGFzIHZhcmlhYmxlcywgeWEgcXVlIGVuIGVzdGUgY2FzbyBzw7NsbyBzZSBjdWVudGEgY29uIGRvcyB2YXJpYWJsZXMgZW4gbGEgYmFzZSBkZSBkYXRvcy4qIA0KICANCiMjIFRhYmxhIGRlIGVzdGFkw61zdGljb3MgZGVzY3JpcHRpdm9zDQoNCnN1bW1hcnkoRk9STV8xKQ0KDQpzZChGT1JNXzEkS2lsbywgbmEucm0gPSBGQUxTRSkNCg0KbWVkaWFuKEZPUk1fMSRLaWxvLCBuYS5ybSA9IFRSVUUpDQptZWFuKEZPUk1fMSRLaWxvLCBuYS5ybSA9IFRSVUUpDQpzZChGT1JNXzEkS2lsbywgbmEucm0gPSBGQUxTRSkNCm1mdihGT1JNXzEkS2lsbykNCg0KdmFyaWFibGU8LWMoIidLaWxvIikNCk1lZGlhbmE8LWMoIjQwMjUiKQ0KTWVkaWEgPC0gYygiNDQxNSIpDQpNb2RhIDwtIGMoIjQxOTAiKQ0KRGVzdmlhY2nDs25fZXN0YW5kYXI8LWMoIjI1NzEuNzkzIikNCnRhYmxlMSA8LSBkYXRhLmZyYW1lICh2YXJpYWJsZSwgTWVkaWFuYSwgTWVkaWEsIE1vZGEsIERlc3ZpYWNpw7NuX2VzdGFuZGFyKQ0Ka25pdHI6OmthYmxlKHRhYmxlMSkNCg0KIyMgVGltZSBTZXJpZSBQbG90cw0KDQpGT1JNXzEkRmNoYTwtYXMuRGF0ZShGT1JNXzEkRmNoYSxmb3JtYXQ9IiVkLyVtLyV5IikgDQoNCnN1bW1hcnkoRk9STV8xKQ0KZ2dwbG90KEZPUk1fMSxhZXMoeD1GY2hhKSkrDQogIGdlb21fbGluZShhZXMoeT1LaWxvKSxjb2xvcj0iYmx1ZSIpKw0KICBsYWJzKHg9IkZlY2hhIix5PSJLaWxvIiwgY29sb3I9IkxlZ2VuZCIpKw0KICBnZ3RpdGxlKCJLaWxvcyBkZSBtZXJtYSBwb3IgbWVzIikNCg0KIyBMYSBncsOhZmljYSBhbnRlcmlvciBtdWVzdHJhIGxvcyBraWxvcyBkZSBtZXJtYSBnZW5lcmFkb3MgcG9yIG1lcy4gRGUgYWN1ZXJkbyBhIGxvcyBkYXRvcywgZW50cmUgRmVicmVybyB5IE1hcnpvIHNlIHR1dm8gZWwgcGljbyBtw6FzIGFsdG8gZW4gbWVybWEgeSBjb25mb3JtZSBmdWUgYXZhbnphbmRvIGVsIGHDsW8sIHZlbW9zIHF1ZSBsYSBtZXJtYSBoYSBkaXNtaW51aWRvIGNvbnNpZGVyYWJsZW1lbnRlLiBFbiBBYnJpbCwgQWdvc3RvIHkgU2VwdGllbWJyZSBzb24gbGFzIGZlY2hhcyBlbiBsYXMgcXVlIG1lbm9zIG1lcm1hIHNlIGdlbmVyw7MuDQoNCmBgYA0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOmRhcmtvcmFuZ2UiPioqMy4gRGVsaXZlcnkgUGxhbioqIA0KYGBge3J9DQojIyBJbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zDQoNCmRlbGl2ZXJ5PC0gcmVhZC5jc3YoJzFfREVMSVZFUlkuY3N2JykNCnN1bW1hcnkoZGVsaXZlcnkpDQoNCiMjIMK/KkN1w6FudGFzIHZhcmlhYmxlcyB5IHJlZ2lzdHJvcyBoYXk/Kg0Kc3RyKGRlbGl2ZXJ5KQ0KDQojICpDb250YW1vcyBjb24gMyB2YXJpYWJsZXMgeSAzODAgb2JzZXJ2YWNpb25lcy4qIA0KICANCiMjIyAqQ29udGFyIHRvdGFsIGRlIHBlZGlkb3MgcG9yIGNsaWVudGUqDQpkZWxpdmVyeVNVTSA9IGNvbFN1bXMoZGVsaXZlcnlbNF0pDQoNCmFzLmRhdGEuZnJhbWUoZGVsaXZlcnlTVU0pDQojICpDb250YW1vcyBjb24gNTIsMDI4MSBwZWRpZG9zKg0KDQojIyBMbGFtYXIgYmFzZSBkZSBkYXRvcy4NCmRlbGl2ZXJ5Q0xJRU5UUzwtIHJlYWQuY3N2KCcyIERlbGl2ZXJ5Q0xJRU5UUy5DU1YnKQ0Kc3VtbWFyeShkZWxpdmVyeUNMSUVOVFMpDQoNCmRlbGl2ZXJ5Q0xJRU5UUyA9IGNvbFN1bXMoZGVsaXZlcnlDTElFTlRTWzI6MjFdKQ0KYXMuZGF0YS5mcmFtZShkZWxpdmVyeUNMSUVOVFMpDQpiYXJwbG90KGRlbGl2ZXJ5Q0xJRU5UUykNCg0KIyBDb24gZXN0ZSBwbG90IHBvZGVtb3MgdmVyIHF1ZSBoYXkgbXVjaG9zIGNsaWVudGVzIGNvbiBtdXkgcG9jb3MgcGVkaWRvcy4NCiAgDQogIA0KIyMgVMOpY25pY2FzIGRlIExpbXBpZXphKiogDQogIA0KIyMjIFTDqWNuaWNhIDE6IGVsaW1pbmFyIE5BJ3MNCiMgICpTZSBkZWNpZGnDsyByZWFsaXphciBlc3TDoSB0w6ljbmljYSBwYXJhIGFzZWd1cmFybm9zIGRlIHF1ZSBubyBzZSB0ZW5nYSBmYWx0YSBkZSBkYXRvcyB5IGVuIGNhc28gZGUgdGVuZXJsb3MgZXZpdGFyIHF1ZSBlc3RhcyBldml0ZW4gdGVuZXIgdW4gYW5hbGlzaXMgYXNlcnRpdm8gYWwgbm8gYWdyZWdhciB2YWxvciBhIGxhIGJhc2UgZGUgZGF0b3MuKg0KICANCiMjIyDCv0N1w6FudG9zIE5BJ3MgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8NCnN1bShpcy5uYShkZWxpdmVyeSkpDQoNCiMjIyBDdWFudG9zIE5BIHRlbmdvIHBvciB2YXJpYWJsZT8NCiMqKlNhcHBseToqKiBQYXJhIGNvbnRhciBsb3MgTkEncy4NCg0Kc2FwcGx5KGRlbGl2ZXJ5LCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQ0KDQojIyMgUmVtb3ZlciBjb2x1bW5hcw0KDQpkZWxpdmVyeTE8LWRlbGl2ZXJ5DQoNCmRlbGl2ZXJ5MTwtZGVsaXZlcnkxW2RlbGl2ZXJ5MSRDTElFTlRFIT0iQU5UT0xJTiBBUlRFQUdBIiwgXQ0KZGVsaXZlcnkxPC1kZWxpdmVyeTFbZGVsaXZlcnkxJENMSUVOVEUhPSJBTlRPTElOIFRPTFVDQSIsIF0NCmRlbGl2ZXJ5MTwtZGVsaXZlcnkxW2RlbGl2ZXJ5MSRDTElFTlRFIT0iU1RCLjEiLCBdDQpkZWxpdmVyeTE8LWRlbGl2ZXJ5MVtkZWxpdmVyeTEkQ0xJRU5URSE9IlRSTVguMSIsIF0NCmRlbGl2ZXJ5MTwtZGVsaXZlcnkxW2RlbGl2ZXJ5MSRDTElFTlRFIT0iQUJDLlFVRVJFVEFSTyIsIF0NCg0KIyMgKlRhYmxhIGRlIE1lZGlhLCBNb2RhIHkgTWVkaWFuYQ0KdGFibGUzPC1kZXNjcmliZShkZWxpdmVyeSkNCmtuaXRyOjprYWJsZSh0YWJsZTMpDQoNCmRlc2NyaWJlKGRlbGl2ZXJ5KQ0KDQojIyAqSWRlbnRpZmljYXIgdmFyaWFibGVzKiANCg0KIyAqKkN1YW50aXRhdGl2YToqKiBEaXNjcmV0YSwgQ29udGludWENCiMgKipFc2NhbGEgZGUgbWVkaWNpw7NuOioqSW50ZXJ2YWxvLCBSYXrDs24gDQojICoqQ3VhbGl0YXRpdmEqKg0KIyAqKkVzY2FsYSBkZSBtZWRpY2nDs246KiogTm9taW5hbGVzLCBPcmRpbmFsZXMNCg0KVmFyaWFibGU8LWMoIkZlY2hhIiwiU1RCMyIsIllGVE8iLCAiVFJNWCIsICJERU5TTyIsIkhFTExBIiwiVkFSUk9DIiwiVG90YWwucGVkaWRvcy5tZXMiKQ0KVHlwZTwtYygiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCJDdWFsaXRhdGl2YSIsIkN1YWxpdGF0aXZhIiwiQ3VhbGl0YXRpdmEiLCJDdWFudGl0YXRpdmEgKGRpc2NyZXRhKSIpDQpNZWFzdXJlbWVudDwtYygiUmF6w7NuIiwiTm9taW5hbCIsIk5vbWluYWwiLCJOb21pbmFsIiwiTm9taW5hbCIsIk5vbWluYWwiLCJOb21pbmFsIiwiUmF6w7NuIikNCnRhYmxlMjwtZGF0YV9mcmFtZShWYXJpYWJsZSxUeXBlLE1lYXN1cmVtZW50KQ0KDQprbml0cjo6a2FibGUodGFibGUyKQ0KDQojIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkYXJrb3JhbmdlIj4qKkdyw6FmaWNhIEN1YWxpdGF0aXZhKiogDQoNCmRlbGl2ZXJ5MjwtZGVsaXZlcnkxDQoNCmRlbGl2ZXJ5MjwtIGFnZ3JlZ2F0ZShkZWxpdmVyeTIkUGVkaWRvcywgYnk9bGlzdChjYXRlZ29yeT1kZWxpdmVyeTIkQ0xJRU5URSksIEZVTj1zdW0pDQpwaWUoZGVsaXZlcnkyJHgsIGxhYmVscyA9IGRlbGl2ZXJ5MiRjYXRlZ29yeSkNCg0KIyBDb24gZXN0YSBncsOhZmljYSBwb2RlbW9zIGRhcm5vcyBjdWVudGEgZGUgbG9zIGNsaWVudGVzIHF1ZSB0aWVuZW4gbWF5b3JlcyBwZWRpZG9zIHkgZW4gZXN0ZSBjYXNvIGVzIEhFTExBIGVuIHByaW1lciBsdWdhciB5IFRSTVggZW4gc2VndW5kbyBsdWdhci4NCiAgDQojIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkYXJrb3JhbmdlIj4qKkdyw6FmaWNhIEN1YW50aXRhdGl2YSoqIA0KDQpkZWxpdmVyeTI8LWRlbGl2ZXJ5MiAlPiUgZHBseXI6OnJlbmFtZShwZWRpZG9zPSJ4IikNCmRlbGl2ZXJ5MjwtZGVsaXZlcnkyICU+JSBkcGx5cjo6cmVuYW1lKENsaWVudGVzPSJjYXRlZ29yeSIpDQoNCmRlbGl2ZXJ5MiRDbGllbnRlczwtYXMuZmFjdG9yKGRlbGl2ZXJ5MiRDbGllbnRlcykNCmdncGxvdChkZWxpdmVyeTIsIGFlcyh4PUNsaWVudGVzLCB5PXBlZGlkb3MsIGZpbGw9cGVkaWRvcykpKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9IlBlZGlkb3MgcG9yIGNsaWVudGUiKQ0KDQojIEVzdGEgZ3LDoWZpY2Egc2lydmUgcGFyYSB0ZW5lciBkZSBtYW5lcmEgbcOhcyB2aXN1YWwgZWwgaW1wYWN0byBxdWUgdGllbmUgY2FkYSB1bm8gZGUgbG9zIGNsaWVudGVzIGVuIGxhIGVtcHJlc2EgRk9STS4gUG9kZW1vcyB2ZXIgcXVlIEhFTExBIGVzIGVsIGNsaWVudGUgbcOhcyBzaWduaWZpY2F0aXZvIGNvbiBjYXNpIGVsIHRyaXBsZSBkZSBwZWRpZG9zIHF1ZSBlbCBzaWd1aWVudGUgY2xpZW50ZSBjb24gbWF5b3JlcyBwZWRpZG9zLCBUUk1YLiBEZSBsYWRvIGRlcmVjaG8gc2UgdGllbmUgdW5hIGxleWVuZGEgcXVlIG11ZXN0cmEgbGEgdG9uYWxpZGFkIGRlIGxvcyAncGxvdHMnIHBhcmEgdmVyIHF1w6kgdGFudG9zIHBlZGlkb3MgdGllbmUuIFBvciBlbGxvLCBIRUxMQVMgdGllbmUgdW4gY29sb3IgYXp1bCBjbGFybywgcmVwcmVzZW50YW5kbyBtw6FzIGRlIDI1MCwwMDAgcGVkaWRvcy4NCiAgDQojIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkYXJrb3JhbmdlIj4qKkNvbXBvcnRhbWllbnRvIGRlIGNsaWVudGVzIHBvciBmZWNoYSoqIA0KDQpzdW1tYXJ5KGRlbGl2ZXJ5MSkNCg0KZ2dwbG90KGRlbGl2ZXJ5MSxhZXMoeD1JRF9GZWNoYSwgeT1QZWRpZG9zLCBncm91cD1DTElFTlRFLGNvbG91cj1DTElFTlRFKSkrDQogIGdlb21fbGluZSgpKw0KICBnZ3RpdGxlKCJQZWRpZG9zIHBvciBjbGllbnRlIikNCg0KIyBDb24gZXN0YSBncsOhZmljYSB1dGlsaXphbW9zIGVsIElEIEZlY2hhIHBhcmEgY29ub2NlciBsb3MgcGVkaWRvcyBxdWUgc2UgdGllbmUgcG9yIGNsaWVudGUgY2FkYSBtZXMgeSB2ZW1vcyB1biBzaWduaWZpY2F0aXZvIGluY3JlbWVudG8gZGUgcGVkaWRvcyBlbiBsb3MgbWVzZXMgZGUgU2VwdGllbWJyZSB5IE9jdHVicmUuIENvbnRhbW9zIGNvbiB1bmEgbGV5ZW5kYSBxdWUgaW5kaWNhIGNhZGEgbMOtbmVhIGNvbiB1biBjb2xvciBwYXJhIG5vbWJyYXIgbGEgaW5mb3JtYWNpw7NuIGRlIGNhZGEgdW5vIGRlIGxvcyBjbGllbnRlcy4gDQogIA0KIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ZGFya29yYW5nZSI+KipHcsOhZmljYSBCb3hwbG90KiogDQoNCmJveHBsb3QoZGVsaXZlcnkxJFBlZGlkb3MsIG1haW49ICJQZWRpZG9zIikNCg0KZGVsaXZlcnkzPC1kZWxpdmVyeTENCmRlbGl2ZXJ5MyRDTElFTlRFIDwtYXMuZmFjdG9yKGRlbGl2ZXJ5MyRDTElFTlRFKQ0KZ2dwbG90KGRlbGl2ZXJ5MywgYWVzKHg9Q0xJRU5URSwgeT1QZWRpZG9zKSkrDQogIGdlb21fYm94cGxvdChjb2xvcj0iYmx1ZSIsIGZpbGw9InB1cnBsZSIpDQoNCiMgRW4gZXN0YSBncsOhZmljYSBwb2RlbW9zIHZpc3VhbGl6YXIgY3XDoW50b3MgcGVkaWRvcyB0aWVuZSBwcm9ncmFtYWRvcyBjYWRhIGNsaWVudGUgeSBsb3MgY2xpZW50ZXMgcXVlIHNvYnJlIHNhbGVuIHNvbiBIRUxMQSB5IFRSTVguIEFkaWNpb25hbCwgc2UgbXVlc3RyYSBsYSBtb2RhIGRlIGNhZGEgdW5vLCBhc8OtIGNvbW8gbGEgbcOtbmltYSBkZSBwZWRpZG9zIHkgbGEgbcOheGltYS4NCmBgYA0KDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ZGFya29yYW5nZSI+Kio0LiBSZWN1cnNvcyBIdW1hbm9zKiogDQpgYGB7cn0NCiMjIExpbXBpZXphLCBUcmFuc2Zvcm1hY2nDs24geSBPcmdhbml6YWNpw7NuIGRlIEJhc2VzIGRlIERhdG9zDQoNCiMgKk5vdGE6IENvbW8gcGFydGUgZGUgbGEgbGltcGllemEgZGUgZGF0b3MgZGUgYW1ib3MgZG9jdW1lbnRvcywgc2UgcmVhbGl6YXJvbiBsb3MgcHJvbWVkaW9zIGRlIGxvcyB2YWxvcmVzIGZhbHRhbnRlcyBkZSBmb3JtYSBtYW51YWwgZW4gRXhjZWwuDQoNCg0KIyBfX0EgcGFydGlyIGRlIGVzdGEgcGFydGUgZGVsIGRvY3VtZW50bywgZWwgYW7DoWxpc2lzIGVzdGFyw6EgZGl2aWRpZG8gZW4gZG9zIHBhcnRlcy4gRW4gbGEgcHJpbWVyYSBzZSBhbmFsaXphcsOhIGxhIGJhc2UgZGUgZGF0b3MgY29uIGxhIGluZm9ybWFjacOzbiBkZSBsb3MgY29sYWJvcmFkb3JlcyBhY3R1YWxlcyBkZSBsYSBlbXByZXNhLCBtaWVudHJhcyBxdWUgZW4gbGEgc2VndW5kYSBzZSBhbmFsaXphcsOhbiBsb3MgZGF0b3MgZGUgYXF1ZWxsb3MgZW1wbGVhZG9zIHF1ZSB5YSBmdWVyb24gYmFqYXMgcG9yIG1vdGl2b3MgZGUgZGVzcGlkbywgcmVudW5jaWEgdm9sdW50YXJpYSwgZW50cmUgb3Ryb3MuX18NCg0KIyMjIEJBU0UgREUgREFUT1M6IENPTEFCT1JBRE9SRVMgREUgUkVDVVJTT1MgSFVNQU5PUw0KDQojIyAxLiBOw7ptZXJvIGRlIHJlZ2lzdHJvcyB5IHZhcmlhYmxlcw0KDQojIyMgSW1wb3J0YXIgYmFzZSBkZSBkYXRvcw0KDQpkZjEgPC1yZWFkLmNzdignaHIgY3N2IDEuY3N2JykNCnN1bW1hcnkoZGYxKQ0KDQoNCiMjIyBUYWJsYSBkZSBFc3RhZMOtc3RpY2FzDQp0YWJsZV9ocjwtZGVzY3JpYmUoZGYxKQ0Ka25pdHI6OmthYmxlKHRhYmxlX2hyKQ0KDQpkZXNjcmliZShkZjEpDQoNCiMjIDIuIENsYXNpZmljYWNpw7NuIGRlIHZhcmlhYmxlcw0KDQp2YXJpYWJsZTwtYygiTm8uLkRlLkVtcGxlYWRvIiwiQVBFTExJRE9TIiwiTk9NQlJFIiwiRkVDSEEuREUuTkFDSU1JRU5UTyIsIkVEQUQiLCJHRU5FUk8iLCJSRkMiLCJGRUNIQS5ERS5BTFRBIiwiUFJJTUVSLk1FUyIsIkNVQVJUTy5NRVMiLCJCQUpBIiwiUFVFU1RPIiwiREVQQVJUQU1FTlRPIiwiU0FMQVJJTy5ESUFSSU8uSU1TUyIsIkZBQ1RPUi5DUkVELklORk9OQVZJVCIsIk4uLkNSRURJVE8uSU5GT05BVklUIiwiTFVHQVIuREUuTkFDSU1JRU5UTyIsIkNVUlAiLCJDQUxMRSIsIk5VTUVSTy5JTlRFUk5PIiwiQ09MT05JQSIsIk1VTklDSVBJTyIsIkVTVEFETyIsIkNPRElHTy5QT1NUQUwiLCJFU1RBRE8uQ0lWSUwiLCJUQVJKRVRBLkNVRU5UQSIpDQpUeXBlPC1jKA0KICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSIsDQogICJxdWFsaXRhdGl2ZSAoZGlzY3JldGUpIiwNCiAgInF1YW50aXRhdGl2ZSAoY29udGlub3VzKSIsDQogICJxdWFsaXRhdGl2ZSAoZGlzY3JldGUpIiwNCiAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgInF1YW50aXRhdGl2ZSAoY29udGlub3VzKSIsDQogICJxdWFudGl0YXRpdmUgKGNvbnRpbm91cykiLA0KICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSIsDQogICJxdWFudGl0YXRpdmUgKGNvbnRpbm91cykiLA0KICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSIsDQogICJxdWFsaXRhdGl2ZSAoZGlzY3JldGUpIiwNCiAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAicXVhbnRpdGF0aXZlIChjb250aW5vdXMpIiwNCiAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSIsDQogICJxdWFsaXRhdGl2ZSAoZGlzY3JldGUpIiwNCiAgInF1YW5pdGF0aXZlIChjb250aW5vdXMpIiwNCiAgInF1YWxpdGF0aXZlIChkaXNjcmV0ZSkiLA0KICAicXVhbGl0YXRpdmUgKGRpc2NyZXRlKSINCikNCg0KdGFibGU8LWRhdGEuZnJhbWUodmFyaWFibGUsVHlwZSkNCmtuaXRyOjprYWJsZSh0YWJsZSkNCg0KDQojIyAzLiBFc2NhbGFzIGRlIG1lZGljacOzbg0KDQp2YXJpYWJsZXMgPC0gYygNCiAgIk5vLi5EZS5FbXBsZWFkbyIsDQogICJBUEVMTElET1MiLA0KICAiTk9NQlJFIiwNCiAgIkZFQ0hBLkRFLk5BQ0lNSUVOVE8iLA0KICAiRURBRCIsDQogICJHRU5FUk8iLA0KICAiUkZDIiwNCiAgIkZFQ0hBLkRFLkFMVEEiLA0KICAiUFJJTUVSLk1FUyIsDQogICJDVUFSVE8uTUVTIiwNCiAgIkJBSkEiLA0KICAiUFVFU1RPIiwNCiAgIkRFUEFSVEFNRU5UTyIsDQogICJTQUxBUklPLkRJQVJJTy5JTVNTIiwNCiAgIkZBQ1RPUi5DUkVELklORk9OQVZJVCIsDQogICJOLi5DUkVESVRPLklORk9OQVZJVCIsDQogICJMVUdBUi5ERS5OQUNJTUlFTlRPIiwNCiAgIkNVUlAiLA0KICAiQ0FMTEUiLA0KICAiTlVNRVJPLklOVEVSTk8iLA0KICAiQ09MT05JQSIsDQogICJNVU5JQ0lQSU8iLA0KICAiRVNUQURPIiwNCiAgIkNPRElHTy5QT1NUQUwiLA0KICAiRVNUQURPLkNJVklMIiwNCiAgIlRBUkpFVEEuQ1VFTlRBIg0KKQ0KDQp0aXBvcyA8LSBjKA0KICAiQ3VhbnRpdGF0aXZvIiwNCiAgIkN1YWxpdGF0aXZvIiwNCiAgIkN1YWxpdGF0aXZvIiwNCiAgIkN1YWxpdGF0aXZvIiwNCiAgIkN1YW50aXRhdGl2byIsDQogICJDdWFsaXRhdGl2byIsDQogICJDdWFsaXRhdGl2byIsDQogICJDdWFudGl0YXRpdm8iLA0KICAiQ3VhbnRpdGF0aXZvIiwNCiAgIkN1YW50aXRhdGl2byIsDQogICJDdWFudGl0YXRpdm8iLA0KICAiQ3VhbGl0YXRpdm8iLA0KICAiQ3VhbGl0YXRpdm8iLA0KICAiQ3VhbnRpdGF0aXZvIiwNCiAgIkN1YW50aXRhdGl2byIsDQogICJDdWFsaXRhdGl2byIsDQogICJDdWFsaXRhdGl2byIsDQogICJDdWFsaXRhdGl2byIsDQogICJDdWFsaXRhdGl2byIsDQogICJDdWFudGl0YXRpdm8iLA0KICAiQ3VhbGl0YXRpdm8iLA0KICAiQ3VhbGl0YXRpdm8iLA0KICAiQ3VhbGl0YXRpdm8iLA0KICAiQ3VhbnRpdGF0aXZvIiwNCiAgIkN1YWxpdGF0aXZvIiwNCiAgIkN1YWxpdGF0aXZvIg0KKQ0KDQplc2NhbGFzIDwtIGMoDQogICJJbnRlcnZhbG8iLA0KICAiTm9taW5hbCIsDQogICJOb21pbmFsIiwNCiAgIkludGVydmFsbyIsDQogICJJbnRlcnZhbG8iLA0KICAiTm9taW5hbCIsDQogICJOb21pbmFsIiwNCiAgIlJhesOzbiIsDQogICJSYXrDs24iLA0KICAiUmF6w7NuIiwNCiAgIlJhesOzbiIsDQogICJPcmRpbmFsIiwNCiAgIk5vbWluYWwiLA0KICAiUmF6w7NuIiwNCiAgIlJhesOzbiIsDQogICJOb21pbmFsIiwNCiAgIk5vbWluYWwiLA0KICAiTm9taW5hbCIsDQogICJOb21pbmFsIiwNCiAgIlJhesOzbiIsDQogICJOb21pbmFsIiwNCiAgIk5vbWluYWwiLA0KICAiTm9taW5hbCIsDQogICJPcmRpbmFsIiwNCiAgIk5vbWluYWwiLA0KICAiTm9taW5hbCINCikNCg0KdGFibGUxIDwtIGRhdGEuZnJhbWUgKHZhcmlhYmxlcywgdGlwb3MsIGVzY2FsYXMpDQprbml0cjo6a2FibGUodGFibGUxKQ0KDQoNCiNMYXMgZXNjYWxhcyBkZSBtZWRpY2nDs24gcGVybWl0ZW4gb3JnYW5pemFyIGRhdG9zIGVuIG9yZGVuIGplcsOhcnF1aWNvLiDDiXN0YXMgcHVlZGVuIHNlciBjbGFzaWZpY2FkYXMgZGUgYWN1ZXJkbyBhIHVuYSBkZWdyYWRhY2nDs24gZGUgbGFzIGNhcmFjdGVyw61zdGljYXMgZGUgZGlzdGludGFzIHZhcmlhYmxlcy4gRW50cmUgbGFzIHZhcmlhYmxlcyB1c2FkYXMgZXN0w6FuIG5vbWluYWwgKGFxdWVsbGFzIHF1ZSBzb24gbXV0dWFtZW50ZSBleGNsdXllbnRlcyB5IG5vIGFzaWduYW4gdW4gb3JkZW4gbyBqZXJhcnF1w61hKSwgb3JkaW5hbCAoZXN0YWJsZWNlbiB1biBvcmRlbiwgcHVlZGUgc2VyIGNyZWNpZW50ZSBvIGRlY3JlY2llbnRlKSwgaW50ZXJ2YWxvIChlc3RhYmxlY2VuIHVuIG9yZGVuIGRldGVybWluYWRvIHBvciB1biBpbnRlcnZhbG8gbnVtw6lyaWNvKSB5IHJhesOzbiAoZXhpc3RlIHVuIGludGVydmFsbyBudW3DqXJpY287IGVsIGNlcm8gcmVwcmVzZW50YSBsYSBhdXNlbmNpYSBkZSB2YWxvcjsgZXMgdW4gY2VybyBhYnNvbHV0bykuDQoNCiMjIDQuIExpbXBpZXphIGRlIGRhdG9zDQoNCiMgUmVtb3ZlciB2YWxvcmVzIGlycmVsZXZhbnRlcyAoZWxpbWluYXIgcmVuZ2xvbmVzIGR1cGxpY2Fkb3MpIHkgY29udmVyc2nDs24gZGUgZGF0b3Mgc29uIHTDqWNuaWNhcyBlbGVnaWRhcyBwYXJhIHJlYWxpemFyIGxhIGxpbXBpZXphIGRlIGRhdG9zIGRlYmlkbyBhIGxhcyBuZWNlc2lkYWRlcyBkZSBsYSBiYXNlIGRlIGRhdG9zIHkgZWwgYmVuZWZpY2lvIHF1ZSBnZW5lcsOzIHBhcmEgZWwgYW7DoWxpc2lzIGRlc2NyaXB0aXZvLCBvYnRlbmllbmRvIGluZm9ybWFjacOzbiBtw6FzIGNsYXJhIHkgY29uY2lzYS4NCg0KDQojIyMgRWxpbWluYXIgcmVuZ2xvbmVzIGR1cGxpY2Fkb3MNCmRmMjwtZGYxDQpkZjI8LWRpc3RpbmN0KGRmMikNCg0KIyMjIMK/Q3XDoW50b3MgTkEncyB0ZW5nbyBlbiBsYSBiYXNlIGRlIGRhdG9zPyBQcmltZXJhIGxpbXBpZXphDQpzdW0oaXMubmEoZGYyKSkNCg0KIyMjIEVsaW1pbmFyIGNvbHVtbmFzDQpkZjM8LWRmMg0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKFgpKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKFguMSkpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoTk9NQlJFKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChBUEVMTElET1MpKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKFJGQykpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoQ1VBUlRPLk1FUykpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoRkFDVE9SLkNSRUQuSU5GT05BVklUKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChDVVJQKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChDQUxMRSkpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoTlVNRVJPLklOVEVSTk8pKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKFRBUkpFVEEuQ1VFTlRBKSkNCg0KIyMjIMK/Q3XDoW50b3MgTkEncyB0ZW5nbyBlbiBsYSBiYXNlIGRlIGRhdG9zPyBTZWd1bmRhIGxpbXBpZXphDQpzdW0oaXMubmEoZGYzKSkNCg0KIyMgNS4gQW7DoWxpc2lzIEV4cGxvcmF0b3JpbyBkZSBsYXMgQmFzZXMgZGUgRGF0b3MNCg0KZGVzY3JpYmUoZGYzKQ0KDQpjb3VudChkZjMsIEdFTkVSTywgc29ydCA9IFRSVUUpDQpjb3VudChkZjMsIFBVRVNUTywgc29ydCA9IFRSVUUpDQpjb3VudChkZjMsIERFUEFSVEFNRU5UTywgc29ydCA9IFRSVUUpDQpjb3VudChkZjMsIFNBTEFSSU8uRElBUklPLklNU1MsIHNvcnQgPSBUUlVFKQ0KY291bnQoZGYzLCBMVUdBUi5ERS5OQUNJTUlFTlRPLCBzb3J0ID0gVFJVRSkNCg0KdGliYmxlKGRmMykNCg0KIyBFbiBlc3RhIHByaW1lcmEgcGFydGUgZGVsIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gZGVzY3JpcHRpdm8sIHZlbW9zIHF1ZSBlbCBjb250ZW8gdG90YWwgZGUgZW1wbGVhZG9zIGFjdHVhbGVzIGVzIGRlIDExMyB5IGhheSB1biBtYXlvciBuw7ptZXJvIGRlIG11amVyZXMgKDU0JSkgY29udHJhIGVtcGxlYWRvcyBxdWUgc29uIGhvbWJyZXMgKDQ2JSkuDQoNCiMgRW4gY3VhbnRvIGEgbG9zIHB1ZXN0b3MsIHZlbW9zIHF1ZSBleGlzdGUgdW5hIGdyYW4gY2FudGlkYWQgZGUgYXl1ZGFudGVzIGdlbmVyYWxlcywgcHVlcyBlcyBlbCBwdWVzdG8gcXVlIG9jdXBhIG1heW9yIGNhcGl0YWwgaHVtYW5vLCBjb250cmEgYXF1ZWxsb3MgcXVlIG9jdXBhbiBtZW5vcyBxdWUgdmFuIGRlc2RlIHNlcnZpY2lvIGFsIGNsaWVudGUgaGFzdGEgb3BlcmFkb3Jlcy4NCg0KIyBFbnRyZSBsb3MgZGVwYXJ0YW1lbnRvcyBjb24gbWF5b3IgY2FudGlkYWQgZGUgZW1wbGVhZG9zLCB2ZW1vcyBxdWUgZXN0w6EgdmFyaW9zIHkgcHJvZHVjY2nDs24gcmV0b3JuLiBFbCBkZXBhcnRhbWVudG8gZGUgIlZhcmlvcyIgZnVlIGNyZWFkbyBwYXJhIGNhdGFsb2dhciBhIGFxdWVsbG9zIGVtcGxlYWRvcyBxdWUgZW4gbGEgYmFzZSBkZSBkYXRvcyBubyB0ZW7DrWFuIGRlZmluaWRhIHVuIMOhcmVhIGVuIGNvbmNyZXRvLg0KDQojIFZlbW9zIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgZW1wbGVhZG9zIGdhbmFuICQxODAuNjggcGVzb3MgZGUgc2FsYXJpbyBkaWFyaW8gcG9yIGVsIElNU1MgeSBkZSB0b2RvcyBsb3MgZW1wbGVhZG9zLCBzZSBjYWxjdWxhIHF1ZSB0aWVuZW4gdW4gcHJvbWVkaW8gZGUgc2FsYXJpbyBkaWFyaW8gZGUgJDIzNi42MiBwZXNvcy4NCg0KIyBFbiBjdWFudG8gYWwgbHVnYXIgZGUgb3JpZ2VuLCB2ZW1vcyBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIGVtcGxlYWRvcyBwcm92aWVuZW4gZGVsIEVzdGFkbyBkZSBOdWV2byBMZcOzbiAoNzAlKSB5IFZlcmFjcnV6ICgxMSUpLCB2aWVuZG8gcXVlIGVsIDE5JSByZXN0YW50ZSBkZSBsb3MgZW1wbGVhZG9zIHNvbiBwcm92ZW5pZW50ZXMgZGUgWm9uYSBDZW50cm8gbyBlc3RhZG9zIGNvbGlkYW50ZXMgZGUgTnVldm8gTGXDs24uDQoNCg0KIyMgNS4xIFRhYmxhIGRlIGZyZWN1ZW5jaWEgKDEpDQoNCiMgTGFzIHRhYmxhcyBkZSBmcmVjdWVuY2lhIHNvbiB1bmEgb3JkZW5hY2nDs24gZW4gZm9ybWEgZGUgdGFibGEgZGUgbG9zIGRhdG9zIGVzdGFkw61zdGljb3MsIGFzaWduYW5kbyBhIGNhZGEgZGF0byBzdSBmcmVjdWVuY2lhIGNvcnJlc3BvbmRpZW50ZSwgZXMgZGVjaXIsIGVsIG7Dum1lcm8gZGUgdmVjZXMgcXVlIGFwYXJlY2UgdW4gZGV0ZXJtaW5hZG8gdmFsb3IgZW4gdW4gZXN0dWRpbyBlc3RhZMOtc3RpY28uDQoNCg0KIyMjIFRhYmxhIGRlIGZyZWN1ZW5jaWE6IFNhbGFyaW8gZGlhcmlvIGRlIGFjdWVyZG8gYWwgZ8OpbmVybw0KcHJvcG9ydGlvbiA8LSBwcm9wLnRhYmxlKHRhYmxlKGRmMyRHRU5FUk8sZGYzJFNBTEFSSU8uRElBUklPLklNU1MpKQ0KcHJvcG9ydGlvbiAlPiUNCiAga2JsKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoKQ0KDQojIEVzdGEgdGFibGEgZGUgZnJlY3VlbmNpYSByZXByZXNlbnRhIGVsIHZhbG9yIGRlY2ltYWwgZGVsIHNhbGFyaW8gZGlhcmlvIGRlIGFjdWVyZG8gYWwgZ8OpbmVybywgZXMgZGVjaXIsIGxhIGNhbnRpZGFkIGRlIGVtcGxlYWRvcyBlbiB2YWxvciBkZWNpbWFsIHF1ZSByZWNpYmVuIGNpZXJ0byBzYWxhcmlvIGRpYXJpbyBkZSBhY3VlcmRvIGEgc3UgZ8OpbmVyby4NCmBgYA0KDQojIyBCQVNFIERFIERBVE9TOiBCQUpBUyBERSBSRUNVUlNPUyBIVU1BTk9TDQpgYGB7cn0NCiMgX19BIHBhcnRpciBkZSBsYSBzaWd1aWVudGUgYmFzZSBkZSBkYXRvcywgc2UgYW5hbGl6YXLDoSBlc3BlY8OtZmljYW1lbnRlIGxhIGluZm9ybWFjacOzbiBkZSBhcXVlbGxhcyBwZXJzb25hcyBxdWUgc2UgZGllcm9uIGRlIGJhamEgZW4gYcOxb3MgYW50ZXJpb3JlcyBjb24gZWwgb2JqZXRpdm8gZGUgZW50ZW5kZXIgbGFzIHByaW5jaXBhbGVzIHJhem9uZXMgZGUgbGEgYWx0YSByb3RhY2nDs24gZW4gbGEgZW1wcmVzYS5fXw0KDQoNCiMjIyBJbXBvcnRhciBiYXNlIGRlIGRhdG9zDQpkZjQgPC1yZWFkLmNzdignaHJfYmFqYSBjc3YgMi5jc3YnKQ0Kc3VtbWFyeShkZjQpDQoNCiMjIyDCv0N1w6FudG9zIE5BJ3MgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8NCnN1bShpcy5uYShkZjQpKQ0KDQojIyMgQm9ycmFyIHRvZG9zIGxvcyByZWdpc3Ryb3MgTkEncyBkZSB1bmEgdGFibGENCmRmNTwtZGY0DQpkZjU8LW5hLm9taXQoZGY1KQ0Kc3VtbWFyeShkZjUpDQoNCiMjIyBFbGltaW5hciBjb2x1bW5hcw0KZGYzPC1kZjINCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChBUEVMTElET1MpKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKE5PTUJSRSkpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoRkFDVE9SLkNSRUQuSU5GT05BVklUKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChDVVJQKSkNCmRmMyA8LSBzdWJzZXQoZGYzLCBzZWxlY3QgPS1jIChDQUxMRSkpDQpkZjMgPC0gc3Vic2V0KGRmMywgc2VsZWN0ID0tYyAoTlVNRVJPLklOVEVSTk8pKQ0KZGYzIDwtIHN1YnNldChkZjMsIHNlbGVjdCA9LWMgKFRBUkpFVEEuQ1VFTlRBKSkNCg0KDQojIyMgwr9DdcOhbnRvcyBOQSdzIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/DQpzdW0oaXMubmEoZGY1KSkNCg0KIyBDb24gbG9zIGRhdG9zIHByZXNlbnRhZG9zIGFudGVyaW9ybWVudGUsIHZlbW9zIHF1ZSBsYSBlZGFkIHByb21lZGlvIGRlIGxvcyBjb2xhYm9yYWRvcmVzIGVzIGRlIDM1IGHDsW9zLCBhZGVtw6FzIGRlIHF1ZSBnYW5hbiB1biBwcm9tZWRpbyBkZSAkMTgwIHBlc29zLg0KDQojIyA1LjIuMSBUYWJsYSBjcnV6YWRhICgxKQ0KDQp0YWJsZShkZjUkUFVFU1RPLCBkZjUkTU9USVZPLkRFLkJBSkEpDQoNCiMgRW4gbGEgdGFibGEgdmVtb3MgcXVlIHNlIGRlc3RhY2FuIHRyZXMgcmF6b25lcyBwcmluY2lwYWxlcyBkZSBiYWphcyBkZSBlbXBsZWFkb3MsIGxhcyBjdWFsZXMgc29uOiBiYWphcyBwb3IgZmFsdGFzLCByZW51bmNpYSB2b2x1bnRhcmlhIG8gdMOpcm1pbm8gZGUgY29udHJhdG8uIEVuIHN1IG1heW9yw61hLCBodWJvIHVuYSBiYWphIHBvciBmYWx0YXMgZGVsIHB1ZXN0byBkZSBheXVkYW50ZSBnZW5lcmFsIHkgcmVudW5jaWEgdm9sdW50YXJpYSBwYXJhIGVsIG1pc21vIHB1ZXN0by4gQWwgaWd1YWwgcXVlIGVuIGxhIGJhc2UgZGUgZGF0b3MgYW50ZXJpb3IsIHZlbW9zIHF1ZSBlbCBwdWVzdG8gY29uIG1heW9yIHJvdGFjacOzbiBhIG5pdmVsIGhpc3TDs3JpY28gZXMgZGUgYXl1ZGFudGUgZ2VuZXJhbC4gRXN0byBzdWdpZXJlIHF1ZSBleGlzdGUgdW4gYWx0byBuw7ptZXJvIGRlIGNvbnRyYXRhY2lvbmVzIHBhcmEgZWwgcHVlc3RvIGRlYmlkbyBhIHVuYSBtYWxhIGdlc3Rpw7NuIGFkbWluaXN0cmF0aXZhIG8gYmFqbyByZW5kaW1pZW50byBkZSBsb3MgZW1wbGVhZG9zLg0KDQojIyA1LjIuMiBUYWJsYSBjcnV6YWRhICgyKQ0KDQp0YWJsZShkZjUkR0VORVJPLCBkZjUkTU9USVZPLkRFLkJBSkEpDQoNCiMgTGEgdGFibGEgY3J1emFkYSBhbnRlcmlvciBub3MgbXVlc3RyYSBsYSByZWxhY2nDs24gZW50cmUgbG9zIG1vdGl2b3MgZGUgYmFqYSBjb250cmEgZWwgZ8OpbmVybywgZXMgZGVjaXIsIGxhcyBwcmluY2lwYWxlcyByYXpvbmVzIGRlIGJhamEgZGUgYWN1ZXJkbyBhbCBnw6luZXJvIGRlIGNhZGEgZW1wbGVhZG8uIFZlbW9zIHF1ZSBodWJvIHVuIHRvdGFsIGRlIDUzIGJhamFzIGRlbCBnw6luZXJvIGZlbWVuaW5vLCBkZXN0YWNhbmRvIGxhcyBiYWphcyBwb3IgZmFsdGFzIChyZXByZXNlbnRhIHVuIDc1JSBkZSBsYXMgYmFqYXMgZmVtZW5pbmFzKS4gUGFyYSBlbCBnw6luZXJvIG1hc2N1bGlubywgaHVibyB1biB0b3RhbCBkZSAyNSBmYWx0YXMsIGRlc3RhY2FuZG8gcHJpbmNpcGFsbWVudGUgbGFzIGJhamFzIHBvciBmYWx0YXMgKHJlcHJlc2VudGEgdW4gNjAlIGRlIGxhcyBiYWphcyBtYXNjdWxpbmFzKS4NCg0KIyMgNS4zIEdyw6FmaWNvcyBkZSBkYXRvcyBjdWFudGl0YXRpdm9zIHkgY3VhbGl0YXRpdm9zICgyKQ0KDQojIyA1LjMuMSBQaWUgY2hhcnQNCg0KIyMjIFBpZSBjaGFydDogUmVwcmVzZW50YWNpw7NuIGRlIGJhamFzIGFjb3JkZSBhbCBlc3RhZG8gZGUgcmVzaWRlbmNpYQ0KcGllKHRhYmxlKGRmNSRFU1RBRE8pLCBjb2w9Yygib3JhbmdlIiwiY29yYWwxIiksDQogICAgbWFpbj0iUmVwcmVzZW50YWNpw7NuIGRlIGJhamFzIGFjb3JkZSBhbCBlc3RhZG8gZGUgcmVzaWRlbmNpYSIpDQoNCiMgTGEgZ3LDoWZpY2EgYW50ZXJpb3Igbm9zIG11ZXN0cmEgcXVlIGhheSB1biBtYXlvciBuw7ptZXJvIGRlIGV4LWVtcGxlYWRvcyBxdWUgdml2ZW4gZW4gZWwgRXN0YWRvIGRlIE51ZXZvIExlw7NuLiBTaW4gZW1iYXJnbywgaGF5IHVuIHBvcmNlbnRhamUgcXVlIHJlc2lkZSBlbiBDb2FodWlsYS4gRXN0byBzZSBwdWVkZSBpbnRlcnByZXRhciBjb24gcXVlIGhheSB1biBhbHRvIG5pdmVsIGRlIHJvdGFjacOzbiBleGlzdGVudGUgZGViaWRvIGEgbGEgbGVqYW7DrWEgZGUgcmVzaWRlbmNpYSBkZSBsb3MgZW1wbGVhZG9zLg0KDQoNCiMjIyBQaWUgY2hhcnQ6IFJlcHJlc2VudGFjacOzbiBkZSBiYWphcyBhY29yZGUgYWwgZ8OpbmVybw0KDQpwaWUodGFibGUoZGY1JEdFTkVSTyksIGNvbD1jKCJvcmFuZ2UiLCJjb3JhbDEiKSwNCiAgICBtYWluPSJSZXByZXNlbnRhY2nDs24gZGUgYmFqYXMgYWNvcmRlIGFsIGfDqW5lcm8iKQ0KDQoNCiMgTGEgYW50ZXJpb3IgZ3LDoWZpY2EgZGUgcGFzdGVsIHJlYWZpcm1hIGxvIHF1ZSBtZW5jaW9uYW1vcyBhbnRlcmlvcm1lbnRlLiBEZSBhY3VlcmRvIGEgbGFzIGJhamFzIHJlYWxpemFkYXMsIGxhIG1heW9yw61hIGRlIGxvcyBleC1lbXBsZWFkb3Mgc29uIGRlbCBnw6luZXJvIGZlbWVuaW5vLg0KDQoNCiMjIDUuNCBHcsOhZmljb3MgZGUgZGlzcGVyc2nDs24gKDIpDQoNCiMjIyBHcsOhZmljYSBkZSBkaXNwZXJzacOzbjogTsO6bWVybyBkZSBiYWphcyBWUy4gRMOtYXMgdHJhYmFqYWRvcw0KcGxvdCh4PSBkZjUkTk8uREUuQkFKQVMsDQogICAgIHk9ZGY1JERJQVMuVFJBQkFKQURPUykNCg0KIyBMYSBncsOhZmljYSBkZSBkaXNwZXJzacOzbiBub3MgbXVlc3RyYSBsYSBpbnRlbnNpZGFkIGRlIHJlbGFjacOzbiBlbnRyZSBsYSB2YXJpYWJsZSBkZSBkw61hcyB0cmFiYWphZG9zIHkgbsO6bWVybyBkZSBiYWphcy4gRXN0byBub3MgZGljZSBxdWUgaHVibyB1biBhbHRvIG7Dum1lcm8gZGUgYmFqYXMgZGUgZW1wbGVhZG9zIHF1ZSB0cmFiYWphcm9uIG1lbm9zIGRlIDIwMCBkw61hcywgZXMgZGVjaXIsIGxhIG1heW9yw61hIGRlIGxvcyBleC1lbXBsZWFkb3MgZXN0dXZpZXJvbiBlbiBGT1JNIG1lbm9zIGRlIDEgYcOxby4NCg0KIyMjIEJveHBsb3Q6IENvcnJlbGFjacOzbiBlbiBiYWphcyBhY29yZGUgYSB2YXJpYWJsZXMgZGUgZ8OpbmVybyB5IGVkYWQNCmdncGxvdChkZjUsIGFlcyhHRU5FUk8sU0FMQVJJTy5ESUFSSU8uSU1TUyxmaWxsPUdFTkVSTykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKyBnZ3RpdGxlKCJTYWxhcmlvIGRpYXJpbyBwb3IgZ8OpbmVybyIpDQoNCiMgTGEgZ3LDoWZpY2EgYW50ZXJpb3Igbm9zIG11ZXN0cmEgbGEgY29ycmVsYWNpw7NuIGVudHJlIGVsIGfDqW5lcm8geSBlbCBzYWxhcmlvIGRpYXJpbyBkZSBsb3MgZW1wbGVhZG9zLiBFbiBlc3RlLCBlbnRlbmRlbW9zIHF1ZSBlbCBnw6luZXJvIGZlbWVuaW5vIHRpZW5lIHVuIHNhbGFyaW8gZGlhcmlvIHRvdGFsIG3DoXMgYWx0byBxdWUgbG9zIGRlIGfDqW5lcm8gbWFzY3VsaW5vLg0KDQpgYGANCg0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkYXJrb3JhbmdlIj4qKjUuIFByb2R1Y3Rpb24qKiANCmBgYHtyfQ0KIyMgSW1wb3J0YXIgYmFzZSBkZSBkYXRvcw0KDQpwcm9kdWNjaW9uPC0gcmVhZC5jc3YoJ3AxIEJhc2UgcHJvZHVjY2lvbiBmb3JtIC0gQmFzZSBwcm9kdWNjaW9uIGZvcm0gLSBCYXNlIHByb2R1Y2Npb24gZm9ybSAtIEJhc2UgcHJvZHVjY2lvbiBmb3JtLmNzdicpDQpzdW1tYXJ5KHByb2R1Y2Npb24pDQoNCiMgKipQcm9kdWNjacOzbioqDQojICozOTg4IHJlZ2lzdHJvcyB5IDE1IHZhcmlhYmxlcyogDQogIA0KICAjIyAxLiBFbnRlbmRlciB5IGxpbXBpYXIgbGEgYmFzZSBkZSBkYXRvcyANCmRlc2NyaWJlKHByb2R1Y2Npb24pDQoNCiMjIyBQYXNvIDEuIERlIGNhcmFjdGVyIGEgZmVjaGEgKFRlY25pY2EgNC4gQ29udmVydGlyIHRpcG9zIGRlIGRhdG9zKQ0KYmRwPC1wcm9kdWNjaW9uDQpiZHAkRmVjaGE8LSBhcy5EYXRlKGJkcCRGZWNoYSwgZm9ybWF0PSAiJWQvJW0vJVkiKQ0Kc3VtbWFyeShiZHApDQp0aWJibGUoYmRwKQ0KDQojIyMgUGFzbyAyLiBFbGltaW5hciBjb2x1bW5hcyBpbnNlcnZpYmxlcyhUw6ljbmljYSAxLiBSZW1vdmVyIHZhbG9yZXMgaXJyZWxldmFudGVzKQ0KYmRwMTwtYmRwDQpiZHAxIDwtIHN1YnNldChiZHAxLCBzZWxlY3QgPS1jIChJRC5GT1JNKSkNCmJkcDEgPC0gc3Vic2V0KGJkcDEsIHNlbGVjdCA9LWMgKElOSUNJTy5TRVAuVVAsRklOLklOSUNJTy5ERS5TRVAuVVAsIFRJRU1QTy5NQVRFUklBTEVTKSkNCmJkcDEgPC0gc3Vic2V0KGJkcDEsIHNlbGVjdCA9LWMgKEhSLi5GSU4sIElOSUNJTy5kZS5QUk9DRVNPLCBGSU4uZGUuUFJPQ0VTTykpDQoNCiMjIyBDYW1iaWFyIG5vbWJyZXMNCmNvbG5hbWVzKGJkcDEpPC1jKCdmZWNoYScsJ2NsaWVudGUnLCdwcm9kdWN0bycsJ3BpZXphc19wcm9nJywndGllbXBvX21pbicsJ2VzdGFfYXJyYW5xdWUnLCdsYW1pbmFzX3Byb2Nlc2FkYXMnLCd0aWVtcG9fY2FsaWRhZCcpDQoNCiMjIyBCb3JyYXIgdG9kb3MgbG9zIHJlZ2lzdHJvcyBOQSdzIGRlIHVuYSB0YWJsYQ0KYmRwMjwtYmRwMQ0KYmRwMjwtbmEub21pdChiZHAyKQ0Kc3VtbWFyeShiZHAyKQ0KDQpzdW0oaXMubmEoYmRwMikpDQoNCiMjIyBQYXNvIDMuIENhbWJpYXIgZGUgY2FyYWN0ZXIgYSBudW3DqXJpY28NCg0KYmRwMiRwaWV6YXNfcHJvZzwtYXMubnVtZXJpYyhiZHAyJHBpZXphc19wcm9nKSAgICAgICAgICAgICAgIA0KYmRwMiR0aWVtcG9fbWluPC1hcy5udW1lcmljKGJkcDIkdGllbXBvX21pbikgICAgICAgICAgICAgICAgIA0KYmRwMiRsYW1pbmFzX3Byb2Nlc2FkYXM8LWFzLm51bWVyaWMoYmRwMiRsYW1pbmFzX3Byb2Nlc2FkYXMpDQpiZHAyJHRpZW1wb19jYWxpZGFkPC1hcy5udW1lcmljKGJkcDIkdGllbXBvX2NhbGlkYWQpICAgICAgICAgDQoNCmJkcDM8LWJkcDINCmJkcDMkdGllbXBvX21pbiA8LSBzdWJzdHIoYmRwMyR0aWVtcG9fbWluLCBzdGFydCA9IDEsIHN0b3AgPSAyKQ0KdGliYmxlKGJkcDMpICANCmJkcDMkdGllbXBvX21pbiA8LSBhcy5pbnRlZ2VyKGJkcDMkdGllbXBvX21pbikNCnN0cihiZHAzKSAgDQoNCmJkcDMkcGllemFzX3Byb2cgPC0gc3Vic3RyKGJkcDMkcGllemFzX3Byb2csIHN0YXJ0ID0gMSwgc3RvcCA9IDIpDQp0aWJibGUoYmRwMykgIA0KYmRwMyRwaWV6YXNfcHJvZyA8LSBhcy5pbnRlZ2VyKGJkcDMkcGllemFzX3Byb2cpDQpzdHIoYmRwMykNCg0KYmRwMyRsYW1pbmFzX3Byb2Nlc2FkYXMgPC0gc3Vic3RyKGJkcDMkbGFtaW5hc19wcm9jZXNhZGFzLCBzdGFydCA9IDEsIHN0b3AgPSAyKQ0KdGliYmxlKGJkcDMpICANCmJkcDMkbGFtaW5hc19wcm9jZXNhZGFzIDwtIGFzLmludGVnZXIoYmRwMyRsYW1pbmFzX3Byb2Nlc2FkYXMpDQpzdHIoYmRwMykgDQoNCiMjIyBQYXNvIDQuIENhbWJpYXIgZGUgTkEncyBhIHByb21lZGlvcyANCmJkcDQgPC0gYmRwMw0KYmRwNCR0aWVtcG9fbWluW2lzLm5hKGJkcDQkdGllbXBvX21pbildPC1tZWFuKGJkcDQkdGllbXBvX21pbiwgbmEucm0gPSBUUlVFKQ0Kc3VtbWFyeShiZHA0KSANCg0KIyMjIFBhc28gNS4gQ2FtYmlhciBkZSBOQSdzIGEgMA0KYmRwNSA8LSBiZHA0DQpiZHA1JGxhbWluYXNfcHJvY2VzYWRhc1tiZHA1JGxhbWluYXNfcHJvY2VzYWRhcyA8IDFdPC0gTkENCnN1bW1hcnkoYmRwNSkNCg0KIyMjIFBhc28gNi4gQm9ycmEgTkEncw0KYmRwNiA8LSBiZHA1DQpiZHA2IDwtIG5hLm9taXQoYmRwNikgICAgDQpzdHIoYmRwNikNCg0KIyMjIFZlcmlmaWNhciBlbGltaW5hY2nDs24gZGUgTkHCtHMNCmNvbFN1bXMoaXMubmEoYmRwNikpDQpzdW1tYXJ5KGJkcDYpDQoNCnN0cihiZHA2KQ0Kc3VtbWFyeShiZHA2KQ0KDQpzdW0oaXMubmEoYmRwNikpDQoNCiMjIDIuQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSB5IEVzY2FsYXMgZGUgTWVkaWNpb24uDQoNClZhcmlhYmxlPC1jKCJGZWNoYSAiLCJjbGllbnRlIiwicHJvZHVjdG8iLCAiUGllemFzIHByb2dyYW1hZGFzIiwidGllbXBvIG1pbiIsIkVzdGFjaW9uIGRlIGFycmFucXVlIiwiTGFtaW5hcyBwcm9jZXNhZGFzIiwgIlRpZW1wbyBkZSBjYWxpZGFkIikNClR5cGU8LWMoIkN1YWxpdGF0aXZhIiwiQ3VhbGl0YXRpdmEiLCJDdWFsaXRhdGl2YSIsICJDdWFudGl0YXRpdmEoRGlzY3JldGEpIiwgIkN1YW50aXRhdGl2YShEaXNjcmV0YSkiLCJDdWFsaXRhdGl2YSIsICJDdWFudGl0YXRpdmEoRGlzY3JldGEpIiwgIkN1YW50aXRhdGl2YSBkaXNjcmV0YSIpDQpNZWRpY2lvbiA8LWMoIk5vbWluYWwiLCAiTm9taW5hbCIsIk5vbWluYWwiLCAiSW50ZXJ2YWxvIiwgIkludGVydmFsbyIsIk5vbWluYWwiLCAiSW50ZXJ2YWxvIiwgIkludGVydmFsbyIpIA0KdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSwgTWVkaWNpb24pDQprbml0cjo6a2FibGUodGFibGUpDQoNCiMjIyBFeHBvcnRhciBjc3YNCmJkbDwtZGF0YS5mcmFtZSh4ID0gcm5vcm0oMTApLCB5ID0gcm5vcm0oMTApKQ0Kd3JpdGUuY3N2KGJkcDUsICJleHBvcnRhZGFfcHJvZHVjY2lvbl9jc3YiKQ0KDQpiZGw8LXJlYWQuY3N2KCJleHBvcnRhZGFfcHJvZHVjY2lvbl9jc3YiKQ0KDQojIyBEYXRvcyBkZXNjcmlwdGl2b3MgDQojIyAqVGFibGEgZGUgTWVkaWEsIE1vZGEgeSBNZWRpYW5hDQojIExvcyBkYXRvcyBtdWVzdHJhbiB1bmEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIHkgZGF0b3MgbXV5IGFsZWphZG9zIGVudHJlIGxvcyBwdW50b3MgdmFyaWFibGVzLCBsbyBjdWFsIG5vcyBpbmRpY2EgdW5hIGFsdGVyYWNpw7NuIGVuIGxhIHVuaWZvcm1pZGFkIGRlIGxvcyBkYXRvcy4gRXN0byByZXByZXNlbnRhIGFsZ3VuYSBmYWxsYSBlbiBsb3MgZGF0b3MgbyBiaWVuLCB1biBwdW50byBhIGNvbnNpZGVyYXIgZW4gZWwgw6FyZWEgcHJvZHVjdGl2YS4NCg0KYmQ2PC1iZGwNCnRhYmxhPC1kZXNjcmliZShiZDYpDQoNCiMjIyBHcsOhZmljYXMNCg0KIyMjIyBCYXJwbG90cy0zDQoNCiMgUmVjb3BpbGFuZG8gbGEgaW5mb3JtYWNpb24gbWUgdG9wZSBjb24gZXN0b3MgZGF0b3MgbG8gY3VhbCBub3MgaW5mb3JtYSBhY2VyY2EgZGUgbG9zIGNsaWVudGVzIG1hcyBkZXN0YWNhZG9zIHBhcmEgZm9ybSB5IGVsIHRpZW1wbyBtaW5pbW8gZGUgdGFyZGFuemEgZW4gZWwgZW5zYW1ibGFqZSBkZSBsb3MgcHJvZHVjdG9zLCBlbiBlc3RlIGNhc28gZWwgcHJpbWVyIGx1Z2FyIGNvbiBtYXMgZWZpY2llbmNpYSBwb3IgY2xpZW50ZSBmdWUgc3RhYmlsdXMgZW4gbGEgcHJpbWVyYSB2dWVsdGEuDQojIE5vdGE6IExBIHZpc3VhbGl6YWNpb24gbm8gc2UgY29tcGxldGEgZW4gZXN0ZSBybWQsIHBhcmEgbWVqb3IgdmlzdWFsaXphY2lvbiB2ZXIgYXJjaGl2byBpbmRpdmlkdWFsLg0KDQpiZDY8LWJkNiAlPiUgc2VsZWN0KHBpZXphc19wcm9nLHRpZW1wb19taW4sY2xpZW50ZSApICU+JSBncm91cF9ieShjbGllbnRlKSAlPiUgDQpzdW1tYXJpc2UocGllemFzX3Byb2c9c3VtKHBpZXphc19wcm9nKSx0aWVtcG9fbWluPXN1bSh0aWVtcG9fbWluKSkgJT4lIGFycmFuZ2UoZGVzYyhwaWV6YXNfcHJvZykpDQoNCmJkNjwtYmQ2Wy1jKDcsOCw5KSxdDQoNCmdncGxvdChiZDYsYWVzKHg9cmVvcmRlcih0aWVtcG9fbWluLHBpZXphc19wcm9nKSwgeT1waWV6YXNfcHJvZyxmaWxsPWNsaWVudGUpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikNCg0KIyBEZW50cm8gZGUgZXN0YSBzZWd1bmRhIHRhYmxhIGRlIGJhcnJhcyBzZSBtdWVzdHJhIGxhIGNhbnRpZGFkIGRlIHBpZXphcyBwcm9ncmFtYWRhcyBxdWUgc2UgdHV2byBwb3IgbWVzIGVuIGxvcyBwZXJpb2RvcyBkZSBsb3MgbWVzZXMgSnVsaW8sIEFnb3N0byB5IFNlcHRpZW1icmUuIEVzdG8gbm9zIGRpY2UgYWNlcmNhIGRlIGxhIG1heW9yIHByb2R1Y3RpdmlkYWQgZGUgQWdvc3RvIHZpZW5kbyBxdWUgaGF5IHVuYSBpbnZlcnNpw7NuIGVuIHRpZW1wbyBtYXlvciBwYXJhIERFTlNPIHkgVkFSUk9DLiBFcyBuZWNlc2FyaW8gZXZhbHVhciBxdcOpIHRhbiBwcm9kdWN0aXZvIG8gaW5lZmljaWVudGUgZXMgZXN0byBlbiBjdWFudG8gYSBjYWxpZGFkIHByb2R1Y3RpdmEuDQoNCiAgZGF0b3Njb3BpYTwtYmRsDQpkYXRvc2NvcGlhJGFubzwtc3RyZnRpbWUoZGF0b3Njb3BpYSRmZWNoYSwgIiVZIikNCmRhdG9zY29waWEkbWVzPC1zdHJmdGltZShkYXRvc2NvcGlhJGZlY2hhLCAiJW0iKQ0KDQpkYXRhX2FnZzwtIGFnZ3JlZ2F0ZShwaWV6YXNfcHJvZ35tZXMgKyBhbm8sIGRhdG9zY29waWEsIEZVTiA9IHN1bSkNCmRhdGFfYWdnbGFtaW5hPC0gYWdncmVnYXRlKGxhbWluYXNfcHJvY2VzYWRhc35tZXMgKyBhbm8sIGRhdG9zY29waWEsIEZVTiA9IHN1bSkNCmdncGxvdChkYXRhX2FnZyxhZXMoeD1tZXMseT1waWV6YXNfcHJvZykpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQ0KDQojIEVuIGVzdGEgZ3LDoWZpY2Egc2UgcHVlZGUgdmlzdWFsaXphciBsYSBkZXBlbmRlbmNpYSBkZWwgdGllbXBvIG3DrW5pbW8gZGUgcHJvZHVjY2nDs24gY29uIGxhcyBwaWV6YXMgcHJvZ3JhbWFkYXMgZGVwZW5kaWVuZG8gZGUgbGEgZXN0YWNpw7NuIGRlIGFycmFucXVlLiBMYSBtYXlvciBwcm9kdWN0aXZpZGFkIGdlbmVyYWwgdGllbmUgdW5hIHJlbGFjacOzbiBjb24gbGEgZXN0YWNpw7NuIEMxIHkgbGEgQzF5MiB5YSBxdWUgc2UgdmUgcXVlIGVzIGxhIHF1ZSBtZW5vcyB0aWVtcG8gaGFjZSBjb24gbcOhcyBwcm9jZXNhbWllbnRvIGRlIGzDoW1pbmFzLg0KDQpnZ3Bsb3QoZGF0b3Njb3BpYSxhZXMoeD10aWVtcG9fbWluLCB5PXBpZXphc19wcm9nLGZpbGw9ZXN0YV9hcnJhbnF1ZSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQ0KDQoNCiMjIyMgRGlzcGVyc2lvbi0yDQojIEVuIGVzdGEgdGFibGEgc2UgbXVlc3RyYSB1biBjbGFybyBlamVtcGxvIGRlIGNvbXBhcmFjacOzbiBxdWUgZW50cmUgbcOhcyB0aWVtcG8gZGUgY2FsaWRhZCBzZSBsZSBkw6kgYWwgY2xpZW50ZSwgc2UgbG9ncmFyw6EgaGFjZXIgdW4gdGllbXBvIG1lbm9yLCBhZ2lsaXphbmRvIGxvcyBwcm9jZXNvcyB5IHRlcm1pbsOhbmRvbG9zIG3DoXMgcsOhcGlkbyBjb21vIGZ1ZSBjb24gbG9zIGNsaWVudGVzIGVuIGF6dWwuDQoNCmdncGxvdChkYXRvc2NvcGlhLCBhZXMoeD10aWVtcG9fY2FsaWRhZCwgeT10aWVtcG9fbWluLCBjb2xvcj1jbGllbnRlKSkgKw0KICBnZW9tX3BvaW50KCkgKyBnZW9tX3J1ZygpDQoNCiMgRW4gZXN0YSBncmFmaWNhIHNlIHRpZW5lIGxhIGludGVuY2nDs24gZGUgdmVyIGEgbG9zIGNvbXByYWRvcmVzIHByZWRvbWluYW50ZXMgZGVudHJvIGRlIEZPUk0gZHVyYW50ZSBsb3MgdHJlcyBtZXNlcyBwcmVkaWN0aXZvcywgZXN0byBwYXJhIHBvZGVyIGxvZ3JhciB1bmEgYXRlbmNpw7NuIGVzcGVjaWFsaXphZGEgeSB2ZXIgbcOhcyBvIG1lbm9zIGVsIHRpZW1wbyBxdWUgdG9tYW4gc3VzIHByb2R1Y3RvcyB5IGdlbmVyYXIgdW4gdGlwbyBkZSBwcm9jZXNvcyBtw6FzIGZsdWlkby4NCg0KZ2dwbG90KGRhdG9zY29waWEsIGFlcyh4PWNsaWVudGUsIHk9bGFtaW5hc19wcm9jZXNhZGFzLCBjb2xvcj1tZXMpKSArDQogIGdlb21fcG9pbnQoKSArIGdlb21fcnVnKCkNCg0KDQojIyMgU2VyaWVzIGRlIHRpZW1wby0xDQojIEFxdcOtIHNlIHB1ZWRlIHZlciB1bmEgc2VyaWUgZGUgdGllbXBvIG5vIGxpbmVhbCwgbG8gY3VhbCBub3MgZGljZSBxdWUgbm8gc2UgdGllbmVuIHByb2Nlc29zIGNsYXJvcyB5IGVzdGFibGVzIHBhcmEgbGEgcHJvZHVjY2nDs24sIGxvIGN1YWwgbG8gY29udmllcnRlIGVuIHVuIHByb2Nlc28gdmFyaWFibGUgeSBjb24gZmFsbGFzIGVuIGxvcyB0aWVtcG9zIGRlIGVudHJlZ2FzIGNvbW8gcmVzdWx0YWRvLg0KDQpnZ3Bsb3QoZGF0b3Njb3BpYSxhZXMoeD1mZWNoYSkpKw0KICBnZW9tX2xpbmUoYWVzKHk9cGllemFzX3Byb2cpLGNvbG9yPSJvcmFuZ2UiKSsNCiAgbGFicyh4PSJGZWNoYSIseT0icGllemFzIHByb2dyYW1hZGFzIiwgY29sb3I9Im9yYW5nZSIpKw0KICBnZ3RpdGxlKCJHcmFmaWNhIGRlIHRhc2EgZGUgcmVuZGltaWVudG8iKQ0KDQpgYGANCmBgYHtyfQ0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkYXJrb3JhbmdlIj4gKio2LiBCYXNlIGRlIERhdG9zIEV4dGVybmEqKiANCg0KIyMjIFByb25vc3RpY2FyIGVsIGRlc2VtcGXDsW8gZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXogKEVVQSB5IE1FWCkgcGFyYSBsb3MgMyBwZXJpb2RvcyBkZSB0aWVtcG8uDQoNCmV4dGVybm88LSByZWFkLmNzdignZXh0ZXJuYV9iZDMgY3N2My5jc3YnKQ0Kc3VtbWFyeShleHRlcm5vKQ0KDQojIyMgQ3JlYXIgc2VyaWUgZGUgdGllbXBvDQoNCnByb2R1Y2Npb25fbWV4aWNvPC0gYyhleHRlcm5vJE1FWCkNCnByb2R1Y2Npb25fdXNhPC0gYyhleHRlcm5vJFVTQSkNCg0KDQpwcm9kdWNjaW9ubTwtdHMoZGF0YT1wcm9kdWNjaW9uX21leGljbywgc3RhcnQ9YygyMDE2LDEpLCBmcmVxdWVuY3k9MSkNCnByb2R1Y2Npb251PC10cyhkYXRhPXByb2R1Y2Npb25fdXNhLCBzdGFydD1jKDIwMTYsMSksIGZyZXF1ZW5jeT0xKQ0KcHJvZHVjY2lvbm0NCnByb2R1Y2Npb251DQoNCg0KbW9kZWxvbTwtIGF1dG8uYXJpbWEocHJvZHVjY2lvbm0sIEQ9MSkNCm1vZGVsb3U8LSBhdXRvLmFyaW1hKHByb2R1Y2Npb251LCBEPTEpDQptb2RlbG9tDQptb2RlbG91DQoNCg0KcHJvbm9zdGljb20gPC0gZm9yZWNhc3QobW9kZWxvbSwgbGV2ZWw9Yyg5NSksIGg9NCkNCnByb25vc3RpY29tDQpwbG90KHByb25vc3RpY29tKQ0KDQojIEVzdGEgZ3LDoWZpY2Egbm9zIG11ZXN0cmEgZWwgcHJvbsOzc3RpY28gZXN0aW1hZG8gZGUgYWN1ZXJkbyBhIGxvcyBhw7FvcyBkZSBwcm9kdWNjacOzbiBhbmFsaXphZG9zLiBMYSBiYXNlIGRlIGRhdG9zIG5vcyBtdWVzdHJhIHF1ZSBlbCBwcm9uw7NzdGljbyBkZSBkZXNlbXBlw7FvIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IHBhcmEgRVVBIHkgTcOpeGljby4gRGUgYWN1ZXJkbyBhIGxvcyByZXN1bHRhZG9zLCBoYSBoYWJpZG8gdW4gY3JlY2ltaWVudG8gYXNjZW5kZW50ZSBlbiBsYWwgZGVtYW5kYSBkZXNkZSAyMDE2LiBQYXJhIGHDsW9zIHByw7N4aW1vcywgc2UgcHJvbm9zdGljYSBxdWUgZWwgZGVzZW1wZcOxbyBkZSBsYSBpbmR1dHJpYSBzZWd1aXLDoSBpbmNyZW1lbnRhbmRvLiBWaWVuZG8gbG9zIHB1bnRvcyBhenVsZXMsIGVzdG8gbXVlc3RyYSB1biBkZXNlbXBlw7FvIGNvbnN0YW50ZSB5IHNpZ25pZmljYXRpdm8uIEVuIGN1YW50byBhbCBhcGFydGFkbyBzb21icmVhZG8sIGVzdGUgbm9zIG11ZXN0cmEgZWwgcG9zaWJsZSBjcmVjaW1pZW50byBhc2NlbmRlbnRlIG8gZGVzY2VuZGVudGUgcXVlIHBvZHLDrWEgdGVuZXIgbGEgZGVtYW5kYSBlbiBhw7FvcyBmdXR1cm9zLCBhdW5xdWUgY29tbyB2ZW1vcywgZWwgcHJvbsOzc3RpY28gZXN0aW1hIHF1ZSBzZXLDoSBwb3NpdGl2by4NCg0KcHJvbm9zdGljb3UgPC0gZm9yZWNhc3QobW9kZWxvdSwgbGV2ZWw9Yyg5NSksIGg9NCkNCnByb25vc3RpY291DQpwbG90KHByb25vc3RpY291KQ0KDQojIExhIGdyw6FmaWNhIG5vcyBtdWVzdHJhIHVuIHNlZ3VuZG8gcHVudG8gZGUgYXNjZW5kZW5jaWEuIEFsIGlndWFsIHF1ZSBlbCBhbnRlcmlvciwgZW4gZWwgImVqZSB4IiB2ZW1vcyBsb3MgdmFsb3JlcyBkZSBhw7FvIHkgZW4gZWwgImVqZSB5IiBsYSBwcm9kdWNjacOzbi4gQSBwZXNhciBkZSBxdWUgZXN0YSBncsOhZmljYSByZWZsZWphIHVuIHByb27Ds3N0aWNvIGFzY2VuZGVudGUgcG9zaXRpdm8sIHZlbW9zIHF1ZSBlcyBtdWNobyBtw6FzIGNvbnN0YW50ZSB5IGxpbmVhbCBxdWUgZWwgYW50ZXJpb3IuIEVzdG8gbm9zIGRpY2UgcXVlIGhheSB1bmEgc2lnbmlmaWNhbmNpYSBlbGV2YWRhIGF1bnF1ZSBtZW5vcyBhc2NlbmRlbnRlIHF1ZSBsYSBwcmltZXJhIGdyw6FmaWNhLg0KDQojIyMgUHJvbm9zdGljYXIgZWwgZGVzZW1wZcOxbyBkZSBwcm9kdWNjaW9uIGRlIEZvcm0gcGFyYSBsb3MgcHJveGltb3MgMyBwZXJpb2RvcyBkZSB0aWVtcG8uDQoNCnByb2R1Y2Npb25mb3JtPC0gcmVhZC5jc3YoJ3AyIEZvcm1fcHJvZHVjY2lvbmJhc2VsaW1waWEuY3N2JykNCnN1bW1hcnkocHJvZHVjY2lvbmZvcm0pDQoNCiMjIyBDcmVhciBzZXJpZSBkZSB0aWVtcG8NCg0KcHJvZHVjY2lvbmZvcm08LSBjKHByb2R1Y2Npb25mb3JtJGxhbWluYXNfcHJvY2VzYWRhcykNCg0KDQpwcm9kdWNjaW9uZjwtdHMoZGF0YT1wcm9kdWNjaW9uZm9ybSwgc3RhcnQ9YygyMDIyLDcpLCBlbmQ9YygyMDI1LCAxMiksIGZyZXF1ZW5jeT0xMikNCg0KcHJvZHVjY2lvbmYNCg0KDQptb2RlbG9mPC0gYXV0by5hcmltYShwcm9kdWNjaW9uZiwgRD0xKQ0KDQptb2RlbG9mDQoNCg0KcHJvbm9zdGljb2YgPC0gZm9yZWNhc3QobW9kZWxvZiwgbGV2ZWw9Yyg5NSksIGg9MykNCnByb25vc3RpY29mDQpwbG90KHByb25vc3RpY29mKQ0KDQoNCiMjIyBEZXNjcmliZSBsb3MgcmVzdWx0YWRvcyANCiMgUmVhbGl6YW1vcyB1bmEgc2VyaWUgZGUgdGllbXBvIHRhbnRvIHBhcmEgbGEgYmFzZSBkZSBsYSBpbmR1c3RyaWEgYXV0b21vdHJpeiBjb21vIHBhcmEgbGEgYmFzZSBkZSBwcm9kdWNjacOzbiBkZSBGT1JNLCBlc3RlIGVzIGVuZm9jYWRvIGEgbGFzIGxhbWluYXMgcHJvY2VzYWRhcyBjYWRhIG1lcyB5IGVuIGxhIGluZHVzdHJpYSBlcyBwb3IgYcOxby4gUGFyYSBwb2RlciByZWFsaXphciBlc3RlIEFuYWxpc2lzIGRlIFJlc3VsdGFkbyByZWFsaXphbW9zIHVuYSBncmFmaWNhIHkgdW4gbW9kZWxvIGRlIFByZWRpY2Npw7NuIHBvciBtZWRpbyBkZSBsYSBmdW5jacOzbiBhdXRvLmFyaW1hLiBHcmFjaWFzIGEgZXN0YSBmdW5jacOzbiwgbGUgZXNwZWNpZmljYW1vcyBkZXNkZSBxdWUgRmVjaGEgZW1wZXphcsOhIGEgb2J0ZW5lciBkYXRvcyBkZSBsYSBiYXNlIGRlIERhdG9zIHkgdGFtYmnDqW4gY29sb2NhbW9zIGxhIGZyZWN1ZW5jaWEsIHF1ZSBzZSByZWZpZXJlIGEgY8OzbW8gc2UgY29tcG9ydGEsIGVuIGN1ZXN0acOzbiBhIHNpIHNlIHZhIGEgY2FsY3VsYXIgcG9yIG1lcyBvIHBvciBhw7FvLiBBc8OtIG1pc21vLCBvYnR1dmltb3MgcGFyYSBsYSBpbmR1c3RyaWEgdGFudG8gZW4gTcOpeGljbyBjb21vIGVuIEVVLCBxdWUgc29uIGxvcyBwYcOtc2VzIGVuIGxvcyBxdWUgc2UgZW5mb2NhIG3DoXMgRk9STSB5IG9idGVuZ2FuIG1lam9yIG9wb3J0dW5pZGFkIGRlIGNyZWNpbWllbnRvLiBBbCByZWFsaXphciBlc3RlIG1vZGVsbyBjYWxjdWxhbW9zIHBhcmEgbG9zIHByw7N4aW1vcyAzIHBlcmlvZG9zLCBlbiBlc3RlIGNhc28gcGFyYSBlbCAyMDI1IHkgb2J0dXZpbW9zIGxvcyBzaWd1aWVudGVzIHJlc3VsdGFkb3M6DQoNCiMgIC0gKkluZHVzdHJpYSBBdXRvbW90cml6IGVuIE3DqXhpY28qOiANCiAgDQojIDEuIFBhcnRpZW5kbyBkZSB1biBtYXJnZW4gZGVsIDk1JSwgcXVlcmllbmRvIGRlY2lyLCBxdWUgZXN0ZSBtb2RlbG8gZXMgbcOhcyBwcmVjaXNvIHBvciBsbyBxdWUgYWwgdmVyIGxhIGdyYWZpY2Egb2J0ZW5lbW9zICAgICAgcXVlIHRlbmRyw6EgdW4gaW5jcmVtZW50byBjb25zdGFudGUgZW4gbG9zIHByw7N4aW1vcyAzIGHDsW9zLCBwYXJ0aWVuZG8gZGVsIDIwMjIuIA0KIyAyLiBFc3RlIGNyZWNpbWllbnRvIGRlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IGVuIE3DqXhpY28gc2UgZXN0aW1hIHVuIGNyZWNpbWllbnRvIGRlbCAxNiUgcGFyYSAyMDI1LCBsbyBxdWUgYmVuZWZpY2lhIGEgICAgICBGT1JNIHBhcmEgY29udGludWFyIHByb2R1Y2llbmRvIGVuIGVsIG1lcmNhZG8gTWV4aWNhbm8uIA0KDQojIC0gKkluZHVzdHJpYSBBdXRvbW90cml6IGVuIEVzdGFkb3MgVW5pZG9zKjogDQogIA0KIyAxLiBQYXJhIDIwMjIgZWwgcHJvbm9zdGljbyBlcyBkZSA1OSBtaWwsIHF1ZSBlc3RlIHNlIHB1ZWRlIG1hbnRlbmVyIGNvbnN0YW50ZSBlbiBsb3MgcHLDs3hpbW9zIDMgYcOxb3MgaGFzdGEgMjAyNQ0KIyAyLiBTZSBvYnRpZW5lIHVuIGVzY2VuYXJpbyBvcHRpbWlzdGEgY29uIGxhIHByZWNpc2nDs24gZGVsIDk1JSwgbG8gcXVlIHF1aWVyZSBkZWNpciBxdWUgcGFyYSBmaW5hbGVzIGRlbCAyMDI1LCBwdWVkZSBlc3RhciBpZ3VhbCBlbiA1OSBtaWwgbyBhdW1lbnRhciBoYXN0YSBsb3MgNjkgbWlsLiBFc3RvIGluZGljYXLDrWEgcXVlIHZhIGVuIGF1bWVudG8gYcOxbyBjb24gYcOxbyB5IHRlcm1pbmFyw61hIGVsIDIwMjUgY29uIHVuIGF1bWVudG8gZGVsIGNhc2kgMjAlLiBMbyBxdWUgaW5kaWNhcsOtYSBhbGdvIGJ1ZW5vIHBhcmEgRk9STSwgZGFuZG9sZSBvcG9ydHVuaWRhZCBhIGF1bWVudGFyIHN1IGNhcnRlcmEgZGUgY2xpZW50ZXMgZGVudHJvIGRlbCBtZXJjYWRvIEVzdGFkb3VuaWRlbnNlIHkgdGVuaWVuZG8gdW4gYnVlbiBpbXBhY3RvIGRlIGxhIGluZHVzdHJpYSBwYXJhIGxvcyBwcsOzeGltb3MgcGVyaW9kb3MuIA0KDQojIC0gKkVtcHJlc2EgRk9STSo6DQogIA0KIyAxLiBTZSBoaXpvIGVsIHByb25vc3RpY28gcG9yIG1lcyB5IGRhbmRvIHVuIHBlcmlvZG8gaGFzdGEgZWwgMjAyNiwgcGFydGllbmRvIGRlbCAyMDIyIGNvbiAzIGVuIGN1YW50byBhIHByb2R1Y2Npw7NuIGRlIGxhbWluYXMgcHJvY2VzYWRhcywgc2UgZXN0aW1hIHF1ZSBlc3RlIHRlbmdhIHVuIGF1bWVudG8gY29uc3RhbnRlLCBhZGVtYXMgZGUgcXVlIGVudHJlIGVsIDIwMjQgeSAyMDI1IHRlbmdhIHVuIHB1bnRvIGRlIHBpcXVlIG3DoXMgYWx0bywgcXVlIHBvc3Rlcmlvcm1lbnRlIHZvbHZlcsOhIGEgZXN0YWJpbGl6YXJzZSBwZXJvIHF1ZSBzZSBtYW50ZW5kcsOhIGNvbnN0YW50ZSBlbnRyZSBsb3MgMTAgYSAyMCBlbiBwcm9kdWNjacOzbi4NCg0KIyAyLiBTZSBwcm9ub3N0aWNhIHF1ZSBwYXJhIGVsIDIwMjYgc2UgdGVuZ2EgdW4gMzMgZW4gcHJvZHVjY2nDs24gZGVsIMOhcmVhIGRlIGxhbWluYXMgcHJvY2VzYWRhcywgdGVuaWVuZG8gdW5hIHByZWNpc2nDs24gZGVsIDk1JSBlbiB1biBlc2NlbmFyaW8gb3B0aW1pc3RhLiBBc8OtIG1pc21vIGVzdGUgc2UgcHVlZGUgbWFudGVuZXIgY29uc3RhbnRlIGVuIDEwIG8gYXVtZW50YXIgY29tbyBzZSBjb21lbnTDsyBhbnRlcmlvcm1lbnRlIHkgZXN0ZSBjcmVjaW1pZW50byBhIHTDqXJtaW5vcyBkZWwgMjAyNiB0b21hbmRvIGVsIGVzY2VuYXJpbyBvcHRpbWlzdGEsIHNlcsOtYSBkZSBwb2NvIG1hcyBkZWwgOTAlIGxvIHF1ZSBzZXLDrWEgdW4gZ3JhbiBhdW1lbnRvIHBhcmEgRk9STS4gVGFtYmnDqW4gc2kgZnVlcmEgc2luIGVsIDk1JSBwYXJhIGluaWNpb3MgZGVsIDIwMjYgc2Vyw61hbiAxNiBlbiBwcm9kdWNjacOzbiBjb24gZWwgNjAlIGRlIGF1bWVudG8sIGxvIHF1ZSBzZWd1aXLDrWEgc2llbmRvIGFsZ28gaW1wb3J0YW50ZSBwYXJhIEZPUk0uDQpgYGANCg0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOmRhcmtvcmFuZ2UiPioqNi5CYXNlIGRlIERhdG9zIEV4dGVybmEqKg0KYGBge3J9DQojIEVuIGVzdGEgYmFzZSBkZSBkYXRvcyBleHRlcm5hIHNlIGFuYWxpesOzIHVuYSBzZXJpZSBkZSB0aWVtcG8gZW5mb2NhZGEgcHJpbmNpcGFsbWVudGUgZW4gRVVBIHkgTcOpeGljbyB5YSBxdWUgc29uIGxhcyBwcmluY2lwYWxlcyDDoXJlYXMgZGUgaW50ZXLDqXMgcGFyYSBsYSBlbXByZXNhIGRlIEZPUk0uIA0KDQojIFVuIGhhbGxhemdvIGVzIHF1ZSBsYSBpbmR1c3RyaWEgYXV0b21vdHJpeiBlbiBNw6l4aWNvIHNlIG1hbnRlbmRyw6EgZW4gY29uc3RhbnRlIGNyZWNpbWllbnRvIGVuIHVuIGxhcHNvIGRlIDMgYcOxb3MgZW4gdW4gZnV0dXJvLiBDb24gdW4gcHJvbsOzc3RpY28gZGUgdW4gOTUlIGxvIGN1YWwgZXMgbXV5IMOzcHRpbW8gYSBxdWUgc3VjZWRhLiANCg0KIyBTaSBzZSBhbmFsaXphIGhhc3RhIGVsIGHDsW8gMjAyNSwgZXhpc3RlIHVuIDE2JSBkZSBjcmVjaW1pZW50byBlbiBsYSBpbmR1c3RyaWEsIHBvciBsbyBxdWUgYSBGT1JNLCBsZSBjb252aWVuZSBob3kgZW4gZMOtYSBjb250aW51YXIgY29uIGxhIG1hbm8gZGUgb2JyYSBlbiBNw6l4aWNvIHkgc2VndWlyIHZlbmRpZW5kbyBhIGNvbXBhw7HDrWFzIGV4dHJhbmplcmFzLiANCg0KIyBQb3IgbGEgcGFydGUgZGUgRVVBLCBzZSBlc3BlcmEgdW4gY3JlY2ltaWVudG8gcGFyYSBlbCAyMDI1IGRlIHVuIDIwJSAsIHBvciBsbyBxdWUgbm9zIGRldGVybWluw7MgcXVlIGxhIGluZHVzdHJpYSBhdXRvbW90cml6IGVzdGFkbyB1bmlkb3Mgc2UgbWFudGllbmUgZW4gY29uc3RhbnRlIGNyZWNpbWllbnRvIGHDsW8gdHJhcyBhw7FvLiANCg0KIyBQYXJhIGxhIGVtcHJlc2EgZGUgRk9STSwgc2UgZXNwZXJhIHF1ZSBleGlzdGEgdW4gY3JlY2ltaWVudG8gZW4gbG9zIHByw7N4aW1vcyBhw7FvcyBlbiBsbyBxdWUgZXMgbGEgcHJvZHVjY2nDs24gZGUgbMOhbWluYXMgcHJvY2VzYWRhcywgc2UgZXNwZXJhIHF1ZSBlc3RlIHRlbmdhIHVuIGF1bWVudG8gY29uc3RhbnRlLCBwb3IgbG8gcXVlIHNlcsOtYSB1bmEgdmVudGFqYSBjb21wZXRpdGl2YSBwcmVwYXJhciBsb3MgcHJvY2Vzb3MgZGUgbMOhbWluYXMgZGVzZGUgZXN0ZSBhw7FvIHBhcmEgcXVlIGVuIGxvcyBwcsOzeGltb3MgYcOxb3MgcXVlIGVzdGUgcHJvY2VzbyBkZSBsYW1pbmFkbyBhdW1lbnRlIG5vIGV4aXN0YW4gdGFudG9zIGVycm9yZXMgYnVzY2FuZG8gcGVyZmVjY2lvbmFyIGVsIHByb2Nlc28uDQpgYGANCg0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkYXJrb3JhbmdlIj4qKjcuIEstTWVhbnMgQ2x1c3RlcmluZyoqDQoNCmBgYHtyfQ0KIyMgQ2x1c3RlciAzDQojIyBJbXBvcnRhciBiYXNlIGRlIGRhdG9zDQoNCmNsdXN0ZXIzPC1yZWFkLmNzdigiSFJfQmFqYXMgMi5jc3YiKSANCnN1bW1hcnkoY2x1c3RlcjMpDQoNCnN0cihjbHVzdGVyMykNCg0KIyMgTsO6bWVybyBkZSBjbHVzdGVycw0KIyMgSnVudGFyIGxvcyBkYXRvcyByZWxhY2lvbmFkb3MgYSBlZGFkIGVuIGHDsW9zDQpuZXdiZDwtY2x1c3RlcjMgJT4lIHNlbGVjdChFREFELFNBTEFSSU8uRElBUklPLklNU1MsUFVFU1RPKQ0Kc3VtbWFyeShuZXdiZCkNCg0KIyMgTm9ybWFsaXphciBsb3MgZGF0b3MNCm5ld2Jkbm9ybTwtc2NhbGUobmV3YmRbMjoxXSkNCg0KIyMgR3LDoWZpY2EgcGFyYSB2ZXIgbsO6bWVybyDDs3B0aW1vIGRlIGNsdXN0ZXJzDQpmdml6X25iY2x1c3QobmV3YmRub3JtLCBrbWVhbnMsIG1ldGhvZD0id3NzIikrICMgd3NzIG1ldGhvZCBjb25zaWRlcnMgdG90YWwgd2l0aGluIHN1bSBvZiBzcXVhcmUNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTQsIGxpbmV0eXBlPTIpKyAgICAgICAgICAgIyBvcHRpbWFsIG51bWJlciBvZiBjbHVzdGVycyBpcyBjb21wdXRlZCB3aXRoIHRoZSBkZWZhdWx0IG1ldGhvZCA9ICJldWNsaWRlYW4iDQogIGxhYnMoc3VidGl0bGUgPSAiRWxib3cgbWV0aG9kIikNCg0KIyBFc3RhIGdyw6FmaWNhIGp1c3RpZmljYSBxdWUgbG8gaWRlYWwgZXMgcmVhbGl6YXIgNCBjbHVzdGVycyBwYXJhIHRlbmVyIHVuIGVudGVuZGltaWVudG8gaWRlYWwgZGUgbG9zIGRhdG9zLg0KDQojIyBWaXN1YWxpemFyIGluZm9ybWFjacOzbg0KbmV3YmQyY2x1czwta21lYW5zKG5ld2Jkbm9ybSw0KQ0KbmV3YmQyY2x1cw0KDQojIyBWZXIgcmVzdWx0YWRvcyBkZSBjbHVzdGVycw0KZnZpel9jbHVzdGVyKG5ld2JkMmNsdXMsZGF0YT1uZXdiZG5vcm0pDQoNCiMjIEFncmVnYXIgbG9zIHJlc3VsdGFkb3MgYWwgZGF0YXNldCBvcmlnaW5hbCBwYXJhIGludGVycHJldGFjacOzbg0KbmV3YmQzPC1uZXdiZCANCm5ld2JkMyRDbHVzdGVyczwtbmV3YmQyY2x1cyRjbHVzdGVyDQpzdW1tYXJ5KG5ld2JkMykNCg0KIyMgQ3JlYXIgZGF0YXNldHMgcGFyYSB2ZXIgbGEgaW5mb3JtYWNpw7NuIGRlIGNhcmFjdGVyw61zdGljYXMgcG9yIGVkYWQgcG9yIGNsdXN0ZXJzDQpuZXdiZDQ8LW5ld2JkMyAlPiUgZ3JvdXBfYnkoQ2x1c3RlcnMsUFVFU1RPKSAlPiUgc3VtbWFyaXNlKEVEQUQ9bWF4KEVEQUQpLFNBTEFSSU8uRElBUklPLklNU1M9bWVhbihTQUxBUklPLkRJQVJJTy5JTVNTKSkgJT4lIGFycmFuZ2UoZGVzYyhFREFEKSkNCnN1bW1hcnkobmV3YmQ0KQ0KDQojIyBBZ3JlZ2FyIGNsdXN0ZXJzIHBvciBub21icmUNCm5ld2JkMyRDbHVzdGVyX05hbWVzPC1mYWN0b3IobmV3YmQzJENsdXN0ZXJzLGxldmVscyA9IGMoMSwyLDMsNCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiSm92ZW4iLCAiQXZhbnphZG8gIiwgIiBBZHVsdG8iLCAiSnViaWxhZG8iKSkNCnN1bW1hcnkobmV3YmQzKQ0KDQojIyBBZ3J1cGFyIHBvciBub21icmUgeSBwb3IgY29sdW1uYQ0KbmV3YmQ1IDwtIG5ld2JkMyU+JSBncm91cF9ieShDbHVzdGVyX05hbWVzLFBVRVNUTykgJT4lIGRwbHlyOjogc3VtbWFyaXplKEVEQUQ9bWF4KEVEQUQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUxBUklPLkRJQVJJTy5JTVNTID1tZWFuKFNBTEFSSU8uRElBUklPLklNU1MpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQ9bigpKQ0KIyMgVmlzdWFsaXphciBncsOhZmljYXMNCiMjIFBvbmVyIGNvbW8gdGFibGEgbG9zIGRhdG9zDQpjbHVzdGVyc3NhbGFyaW88LWFzLmRhdGEuZnJhbWUobmV3YmQ1KQ0KY2x1c3RlcnNzYWxhcmlvDQoNCiMjIEdyYWZpY2FyIHBvciBub21icmUNCmdncGxvdChuZXdiZDUsYWVzKHg9cmVvcmRlcihDbHVzdGVyX05hbWVzLENvdW50KSx5PUNvdW50LGZpbGw9Q2x1c3Rlcl9OYW1lcykpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQ0KDQojIyBTYWxhcmlvIGRpYXJpbyBwb3IgbsO6bWVybyBkZSBjbHVzdGVycw0KZ2dwbG90KG5ld2JkNSwgYWVzKHg9Q2x1c3Rlcl9OYW1lcyx5PVNBTEFSSU8uRElBUklPLklNU1MsZmlsbD0gQ2x1c3Rlcl9OYW1lcyxsYWJlbD1yb3VuZChTQUxBUklPLkRJQVJJTy5JTVNTLGRpZ2l0cz0yKSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KCkNCg0KIyBBcXXDrSBub3MgcG9kZW1vcyBkYXIgY3VlbnRhIHF1ZSBsb3Mgc3VlbGRvcyBubyB2YXLDrWFuIG11Y2hvIGVudHJlIGVkYWRlcywgcGVybyBlcyBpbXBvcnRhbnRlIGRlY2lyIHF1ZSBzZSBkZW5vdGEgcG9yIGNlbnRhdm9zIHVuYSBtYXlvcsOtYSBlbiBlbCBzdWVsZG8gZGUgbG9zIGrDs3ZlbmVzLCBlc3BlY8OtZmljYW1lbnRlIG3DoXMgcXVlIGVuIG90cm9zIHJhbmdvcyBkZSBlZGFkZXMuDQoNCiMjIEhhbGxhemdvcyByZWxldmFudGVzIGRlIGxvcyBjbHVzdGVycw0KIyAxLiBFbCBzYWxhcmlvIGRpYXJpbyBwcm9tZWRpbyBkZSBGT1JNIGVzIGRlICQxODAgcGVzb3MgbWV4aWNhbm9zLCBlcyBkZWNpciwgJDUsNDAwIHBlc29zIG1lbnN1YWxlcy4gRGUgYWN1ZXJkbyBhIGRhdG9zIGNvbXBhcnRpZG9zIHBvciBsYSBJTkVHSSwgc2UgcHJldsOpIHF1ZSBwYXJhIDIwMjIgZWwgc2FsYXJpbyBtw61uaW1vIGVuIE3DqXhpY28gc2VhIGRlICQ1LDI1NSBwZXNvcyBtZW5zdWFsZXMuIEVzdG8gcmVmbGVqYSBxdWUgZWwgc2FsYXJpbyBtZW5zdWFsIGRlIEZPUk0gZXMgMiUgbWF5b3IgYWwgc2FsYXJpbyBtw61uaW1vIGRlbCBwYcOtcy4NCiMgMi4gU2UgZGVzdGFjYW4gdHJlcyByYXpvbmVzIHByaW5jaXBhbGVzIGRlIGJhamFzIGRlIGVtcGxlYWRvczogYmFqYXMgcG9yIGZhbHRhcywgcmVudW5jaWEgdm9sdW50YXJpYSBvIHTDqXJtaW5vIGRlIGNvbnRyYXRvLiBFbiBzdSBtYXlvcsOtYSwgaHVibyB1bmEgYmFqYSBwb3IgZmFsdGFzIGRlbCBwdWVzdG8gZGUgYXl1ZGFudGUgZ2VuZXJhbCB5IHJlbnVuY2lhIHZvbHVudGFyaWEgcGFyYSBlbCBtaXNtbyBwdWVzdG8uDQojIDMuIEh1Ym8gdW4gYWx0byBuw7ptZXJvIGRlIGJhamFzIGRlIGVtcGxlYWRvcyBxdWUgdHJhYmFqYXJvbiBtw6FzIGRlIDIwMCBkw61hcywgZXMgZGVjaXIsIGxhIG1heW9yw61hIGRlIGxvcyBleC1lbXBsZWFkb3MgZXN0dXZpZXJvbiBlbiBGT1JNIG3DoXMgZGUgMSBhw7FvIHkgdGVuw61hbiB1biBzYWxhcmlvIHByb21lZGlvIGRlICQxODAgcGVzb3MuDQojIDQuIExvcyBzdWVsZG9zIGRlIGxvcyBlbXBsZWFkb3Mgbm8gdmFyw61hbiBtdWNobyBkZXBlbmRpZW5kbyBkZSBsYSBlZGFkLiBTaW4gZW1iYXJnbywgdmVtb3MgcXVlIGhheSBtYXlvciByb3RhY2nDs24gcGFyYSBlbCBncnVwbyDigJhhZHVsdG/igJkNCmBgYA0KDQpgYGB7cn0NCiMjIENsdXN0ZXIgMQ0KbGlicmFyeShmb3JlaWduKQ0KbGlicmFyeShkcGx5cikgICAgICAgICMgZGF0YSBtYW5pcHVsYXRpb24gDQpsaWJyYXJ5KGdncGxvdDIpICAgICAgIyBkYXRhIHZpc3VhbGl6YXRpb24gDQpsaWJyYXJ5KHBzeWNoKSAgICAgICAgIyBmdW5jdGlvbnMgZm9yIG11bHRpdmFyaWF0ZSBhbmFseXNpcyANCmxpYnJhcnkoY29ycnBsb3QpICAgICAjIGNvcnJlbGF0aW9uIHBsb3RzDQpsaWJyYXJ5KGp0b29scykgICAgICAgIyBwcmVzZW50YXRpb24gb2YgcmVncmVzc2lvbiBhbmFseXNpcyANCmxpYnJhcnkobG10ZXN0KSAgICAgICAjIGRpYWdub3N0aWMgY2hlY2tzIC0gbGluZWFyIHJlZ3Jlc3Npb24gYW5hbHlzaXMgDQpsaWJyYXJ5KGNhcikgICAgICAgICAgIyBkaWFnbm9zdGljIGNoZWNrcyAtIGxpbmVhciByZWdyZXNzaW9uIGFuYWx5c2lzDQpsaWJyYXJ5KGZhY3RvZXh0cmEpICAgIyBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZXh0cmFjdCBhbmQgdmlzdWFsaXplIHRoZSBvdXRwdXQgb2YgZXhwbG9yYXRvcnkgbXVsdGl2YXJpYXRlIGRhdGEgYW5hbHlzZXMNCmxpYnJhcnkoZ2dmb3J0aWZ5KSAgICAjIGRhdGEgdmlzdWFsaXphdGlvbiB0b29scyBmb3Igc3RhdGlzdGljYWwgYW5hbHlzaXMgcmVzdWx0cw0KYGBgDQoNCg0KYGBge3J9DQojIyBMbGFtYXIgYmFzZSBkZSBkYXRvcy4NCnJoIDwtIHJlYWQuY3N2KCdIUl9CYWphcyAyLmNzdicpDQoNCnJoMTwtcmggJT4lIGRwbHlyOjogc2VsZWN0KEVEQUQsRElBUy5UUkFCQUpBRE9TLFNBTEFSSU8uRElBUklPLklNU1MsR0VORVJPKQ0Kc3VtbWFyeShyaDEpDQoNCiMjIE5vcm1hbGl6YXIgbG9zIGRhdG9zDQpyaDFfbm9ybTwtc2NhbGUocmgxWzI6M10pIA0KDQojIyBOw7ptZXJvIMOzcHRpbW8gZGUgY2x1c3RlcnMNCmZ2aXpfbmJjbHVzdChyaDFfbm9ybSwga21lYW5zLCBtZXRob2Q9IndzcyIpKyAjIHdzcyBtZXRob2QgY29uc2lkZXJzIHRvdGFsIHdpdGhpbiBzdW0gb2Ygc3F1YXJlDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD00LCBsaW5ldHlwZT0yKSsgICAgICAgICAgICMgb3B0aW1hbCBudW1iZXIgb2YgY2x1c3RlcnMgaXMgY29tcHV0ZWQgd2l0aCB0aGUgZGVmYXVsdCBtZXRob2QgPSAiZXVjbGlkZWFuIg0KICBsYWJzKHN1YnRpdGxlID0gIkVsYm93IG1ldGhvZCIpIA0KICANCiMjIFZpc3VhbGl6YXIgbGEgaW5mb3JtYWNpw7NuIGRlIGNsdXN0ZXJzDQpyaDFfY2x1c3Rlcjwta21lYW5zKHJoMV9ub3JtLDQpDQpyaDFfY2x1c3Rlcg0KICANCiMjIFZpc3VhbGl6YXIgcmVzdWx0YWRvcw0KZnZpel9jbHVzdGVyKHJoMV9jbHVzdGVyLGRhdGE9cmgxX25vcm0pDQoNCiMgRWwgcHJpbWVyIGNsdXN0ZXIgYW5hbGl6YSBsYSByZWxhY2nDs24gZW50cmUgZWwgc2FsYXJpbyBkaWFyaW8gSU1TUyB5IGxvcyBkw61hcyB0cmFiYWphZG9zIGRlIGxvcyBlbXBsZWFkb3MgcXVlIHlhIGZ1ZXJvbiBkYWRvcyBkZSBiYWphLiBFbiBlc3RlIGNhc28sIHZlbW9zIHF1ZSBoYXkgdW4gaW1wYWN0byBhbHRvIGVudHJlIGFxdWVsbG9zIGVtcGxlYWRvcyBxdWUgdHJhYmFqYXJvbiBkZSAyIGEgOCBkw61hcywgcGVybyB0dXZpZXJvbiB1biBzYWxhcmlvIGRpYXJpbyBiYWpvLCBtdWNobyBtZW5vciBhIDAgZW4gbGEgZ3LDoWZpY2EuIExvcyBvdHJvcyBkb3MgcmVzdWx0YWRvcywgc2UgbXVlc3RyYSBxdWUgdHJhYmFqYXJvbiBtZW5vcyBkw61hcywgcGVybyBhbCBpZ3VhbCBxdWUgZWwgcHJpbWVyIGNsdXN0ZXIgZXhwbGljYWRvLCB0dXZpZXJvbiB1biBzYWxhcmlvIG11eSBiYWpvLiBDb24gZXN0b3MgdHJlcywgaGF5IHVuYSBjb3JyZWxhY2nDs24gYWx0YSwgc2lnbmlmaWNhdGl2YSB5IG5lZ2F0aXZhLiBQYXJhIGVsIGdydXBvIGRlIGFycmliYSwgdmVtb3MgcXVlIGVzdG9zIHRyYWJhamFyb24gdW4gcHJvbWVkaW8gZGUgMi0zIGTDrWFzIHkgdHV2aWVyb24gdW4gc2FsYXJpbyBkaWFyaW8gbXV5IGFsdG8uIFBvZGVtb3MgaW5mZXJpciBxdWUgZXN0ZSBncnVwbyBwZXJ0ZW5lY2UgYWwgw6FyZWEgYWRtaW5pc3RyYXRpdmEsIHF1ZSBjb21vIHZpbW9zIGVuIGFuw6FsaXNpcyBhbnRlcmlvcmVzLCBzb24gZWwgZ3J1cG8gY29uIHVuIHNhbGFyaW8gbXVjaG8gbcOhcyBhbHRvIGFsIHJlc3RvLg0KDQpyaDI8LXJoMQ0KcmgyJENsdXN0ZXJzPC1yaDFfY2x1c3RlciRjbHVzdGVyDQpzdW1tYXJ5KHJoMikNCg0KIyMgQ3JlYXIgdW4gZGF0YXNldA0KcmgzPC1yaDIgJT4lIGdyb3VwX2J5KENsdXN0ZXJzKSAlPiUgc3VtbWFyaXNlKFNBTEFSSU8uRElBUklPLklNU1M9bWF4KFNBTEFSSU8uRElBUklPLklNU1MpLCBESUFTLlRSQUJBSkFET1M9bWVhbihESUFTLlRSQUJBSkFET1MpKSAlPiUgYXJyYW5nZShkZXNjKFNBTEFSSU8uRElBUklPLklNU1MpKQ0Kc3VtbWFyeShyaDMpDQoNCiMjIEFncnVwYXIgY2x1c3RlcnMgcG9yIG5vbWJyZQ0KcmgyJENsdXN0ZXJfTmFtZXM8LWZhY3RvcihyaDIkQ2x1c3RlcnMsbGV2ZWxzID0gYygxLDIsMyw0KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJCYWpvIiwgIlByb21lZGlvICIsICJBcnJpYmEgZGVsIHByb20iLCAiQWx0byIpKQ0Kc3VtbWFyeShyaDIpDQoNCiMjIEFncnVwYXIgeSBkYXIgcmVzdW1lbiBwb3Igbm9tYnJlcw0Kcmg0IDwtIHJoMiU+JSBncm91cF9ieSAoQ2x1c3Rlcl9OYW1lcywgR0VORVJPKSAlPiUgZHBseXI6OiBzdW1tYXJpemUoRElBUy5UUkFCQUpBRE9TPW1heChESUFTLlRSQUJBSkFET1MpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FMQVJJTy5ESUFSSU8uSU1TUyA9bWVhbihTQUxBUklPLkRJQVJJTy5JTVNTKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudD1uKCkpDQoNCiMjIERhciBmb3JtYXRvIGRlIHRhYmxhIHBhcmEgZW5zZcOxYXIgbGEgaW5mb3JtYWNpw7NuIGRlIGxvcyBjbHVzdGVycw0KY2x1c3RlcnM8LWFzLmRhdGEuZnJhbWUocmg0KQ0KY2x1c3RlcnMNCg0KIyMgR3JhZmljYXIgZWwgbsO6bWVybyBkZSBkYXRvcyBvYnNlcnZhZG9zIHBvciBub21icmUgZGUgY2x1c3RlcnNsZXRzDQpnZ3Bsb3Qocmg0LGFlcyh4PXJlb3JkZXIoQ2x1c3Rlcl9OYW1lcyxDb3VudCkseT1Db3VudCxmaWxsPUNsdXN0ZXJfTmFtZXMpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikNCg0KIyBEZSBhY3VlcmRvIGEgbGEgY2xhc2lmaWNhY2nDs24gZGUgY2x1c3RlcnMsIGxhIGdyw6FmaWNhIGFudGVyaW9yIG5vcyBtdWVzdHJhIGVsIGltcGFjdG8geSBjb250ZW8gZGUgY2FkYSBjbHVzdGVyIGRlcGVuZGllbmRvIGRlbCBncnVwbyBkZSBiYWphIGFuYWxpemFkbywgZXMgZGVjaXIsIHZlbW9zIGxhIHJlbGFjacOzbiBlbnRyZSBkw61hcyB0cmFiYWphZG9zIHkgc2FsYXJpbyBkaWFyaW8sIGNsYXNpZmljYW5kbyBlbCBjb250ZW8gYWNvcmRlIGEgbGEgY2FudGlkYWQgZGUgYmFqYXMgb2J0ZW5pZGFzLiBFbiBlc3RlIGNhc28sIGVuIGxhIGdyw6FmaWNhIHNlIG11ZXN0cmEgcXVlIGFxdWVsbG9zIHF1ZSB0cmFiYWphcm9uIG3DoXMgZGUgNjAwIGTDrWFzIHkgbWVub3MgZGUgMTkwMCBkw61hcywgb2J0dXZpZXJvbiB1biBzYWxhcmlvIHByb21lZGlvIGRlICQ1MDAgcGVzb3MgZGlhcmlvLiBFbnRyYSBlbiBsYSBjYXRlZ29yw61hIGRlIOKAmGJham/igJksIHlhIHF1ZSBzw7NsbyB1bmEgcGVyc29uYSBvYnR1dm8gZXN0YSBkZXNjcmlwY2nDs24uIEVsIHByb21lZGlvIGRlIGxhcyBwZXJzb25hcyBkYWRhcyBkZSBiYWphIHRyYWJhamFyb24gbcOhcyBkZSAxOTAwIGTDrWFzIHkgb2J0dXZpZXJvbiB1biBzYWxhcmlvIGRpYXJpbyBkZSAkMTcwIHBlc29zLiBFbiBsYSBiYXJyYSBkZSDigJhhbHRv4oCZIHZlbW9zIGEgYXF1ZWxsb3MgZXgtZW1wbGVhZG9zIHF1ZSB0cmFiYWphcm9uIDQyMSBkw61hcyB5IHR1dmllcm9uIHVuIHNhbGFyaW8gZGlhcmlvIGRlICQxNTAgcGVzb3MuIFBvciDDumx0aW1vLCB2ZW1vcyBhIGFxdWVsbG9zIOKAmGFycmliYSBkZWwgcHJvbWVkaW/igJkgeSBzb24gYXF1ZWxsb3MgcXVlIHRhYmFqYXJvbiB1biBwcm9tZWRpbyBkZSA0NTUgZMOtYXMgeSB0dXZpZXJvbiB1biBzYWxhcmlvIGRpYXJpbyBkZSAkMTgwIHBlc29zLiBFc3RlIMO6bHRpbW8gZ3J1cG8gZXMgZWwgcXVlIHR1dm8gbWF5b3IgY29udGVvIGRlIHBlcnNvbmFzLCBlcyBkZWNpciwgbGEgbWF5b3LDrWEgZGUgbGFzIGJhamFzIGVzdHV2aWVyb24gbGFib3JhbmRvIG3DoXMgZGUgdW4gYcOxbyBlbiBGT1JNIHkgdGVuw61hbiB1biBzYWxhcmlvIGRpYXJpbyBkZSAkMTgwIHBlc29zLg0KDQojIyBWZXIgcmFuZ29zDQojIyBSYW5nb3MgZGUgImTDrWFzIHRyYWJhamFkb3MiIHBvciBub21icmUNCmdncGxvdChyaDQsIGFlcyh4PUNsdXN0ZXJfTmFtZXMseT1ESUFTLlRSQUJBSkFET1MsZmlsbD0gQ2x1c3Rlcl9OYW1lcyxsYWJlbD1yb3VuZChESUFTLlRSQUJBSkFET1MsZGlnaXRzPTIpKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoKQ0KICANCiMgTGEgZ3LDoWZpY2EgYW50ZXJpb3Igbm9zIHByZXNlbnRhIGxhIGNhbnRpZGFkIGRlIGTDrWFzIHRyYWJhamFkb3MgZGUgYWN1ZXJkbyBhIGxhIGNsYXNpZmljYWNpw7NuIGV4cGxpY2FkYSBhbnRlcmlvcm1lbnRlIGRlIOKAmGJham/igJksIOKAmHByb21lZGlv4oCZLCDigJhhcnJpYmEgZGVsIHByb21lZGlv4oCZIHkg4oCYYWx0b+KAmS4gQ29uIGVzdG8gZW4gbWVudGUsIHZlbW9zIHF1ZSBlbCBwcm9tZWRpbyBkZSBsb3MgZW1wbGVhZG9zIGp1bnRhcm9uIHVuIHRvdGFsIGRlIDE5NjYgZMOtYXMgdHJhYmFqYWRvcywgc2lndWnDqW5kb2xlIGVsIGdydXBvIGRlIOKAmGJham/igJksIGxvcyBxdWUgbGFib3Jhcm9uIHVuIHByb21lZGlvIGRlIDYyOCBkw61hcywgbHVlZ28g4oCYYXJyaWJhIGRlbCBwcm9tZWRpb+KAmSBxdWUgbGFib3LDsyA0NTUgZMOtYXMgeSBmaW5hbG1lbnRlIOKAmGFsdG/igJksIHF1ZSDDum5pY2FtZW50ZSBsYWJvcsOzIDQyMSBkw61hcy4gRW4gdG9kb3MgbG9zIGdydXBvcywgdmVtb3MgcXVlIGxvcyBlbXBsZWFkb3MgdHJhYmFqYXJvbiBwb3IgbcOhcyBkZSAxIGHDsW8gZW4gRk9STSB5IGdhbmFiYW4gdW4gc2FsYXJpbyBkaWFyaW8gbWF5b3IgYSAkMTUwIHBlc29zLg0KDQojIyBSYW5nbyBkZSAic2FsYXJpbyBkaWFyaW8iDQpnZ3Bsb3Qocmg0LGFlcyh4PUNsdXN0ZXJfTmFtZXMseT1TQUxBUklPLkRJQVJJTy5JTVNTLGZpbGw9IENsdXN0ZXJfTmFtZXMsbGFiZWw9cm91bmQoU0FMQVJJTy5ESUFSSU8uSU1TUyxkaWdpdHM9MikpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dCgpDQoNCiMgTGEgZ3LDoWZpY2EgYW50ZXJpb3Igbm9zIHByZXNlbnRhIGxhIHJlbGFjacOzbiBlbnRyZSBlbCBzYWxhcmlvIGRpYXJpbyBJTVNTIHkgbGEgY2xhc2lmaWNhY2nDs24gZXhwbGljYWRhIGFudGVyaW9ybWVudGUgZGUg4oCYYmFqb+KAmSwg4oCYcHJvbWVkaW/igJksIOKAmGFycmliYSBkZWwgcHJvbWVkaW/igJkgeSDigJhhbHRv4oCZLiBDb24gZXN0byBlbiBtZW50ZSwgdmVtb3MgcXVlIGVsIHNlZ21lbnRvIOKAmGJham/igJkgZXMgZWwgcXVlIHRlbsOtYSB1biBzYWxhcmlvIG3DoXMgYWx0byBxdWUgbGEgbWF5b3LDrWEuIEVsIHByb21lZGlvIGdhbmFiYSB1biBzYWxhcmlvIGRpYXJpbyBkZSAkMTcwLDc5IHBlc29zLCDigJhhcnJpYmEgZGVsIHByb21lZGlv4oCZIGdhbmFiYSAkMTgwLDU0IHBlc29zIHkgZWwgc2VnbWVudG8g4oCYYWx0b+KAmSBnYWJhbmEgdW4gcHJvbWVkaW8gZGUgJDE1MSw2MSBwZXNvcyBkZSBzYWxhcmlvIGRpYXJpby4gRXN0byBkZW5vdGEgdW5hIHZhcmlhYmlsaWRhZCBhbHRhIHkgcG9kZW1vcyBzdXBvbmVyIHF1ZSBlc3RvIHNlIGRlYsOtYSBkZSBhY3VlcmRvIGEgbGFzIHJlc3BvbnNhYmlsaWRhZGVzIHkgcHVlc3RvcyBhbmFsaXphZG9zLg0KDQojIyBEaXNwZXJzacOzbiBkZSAiZMOtYXMgdHJhYmFqYWRvcyINCmdncGxvdChyaDIsIGFlcyh4PUNsdXN0ZXJfTmFtZXMsIHk9RElBUy5UUkFCQUpBRE9TLCBmaWxsPUNsdXN0ZXJfTmFtZXMpKSArDQogIGdlb21fYm94cGxvdCgpKw0KICBnZ3RpdGxlKCJEaXNwZXJzacOzbiBvZiAnRMOtYXMgdHJhYmFqYWRvcycgYnkgQ2x1c3RlcnMgTmFtZXMiKQ0KDQojIExhIGdyw6FmaWNhIGFudGVyaW9yIGV4cGxpY2EgbGEgZGlzcGVyc2nDs24gZGUgZMOtYXMgdHJhYmFqYWRvcyBkZSBhY3VlcmRvIGEgbGEgY2xhc2lmaWNhY2nDs24gZXhwbGljYWRhIGFudGVyaW9ybWVudGUgZGUg4oCYYmFqb+KAmSwg4oCYcHJvbWVkaW/igJksIOKAmGFycmliYSBkZWwgcHJvbWVkaW/igJkgeSDigJhhbHRv4oCZLiBDb24gZXN0byBlbiBtZW50ZSwgdmVtb3MgcXVlIGVsIGdydXBvIGNvbiBtYXlvciBkaXNwZXJzacOzbiBlcyDigJhwcm9tZWRpb+KAmSwgcHVlcyBoYXkgdW5hIHZhcmlhYmlsaWRhZCBtw6FzIHNpZ25pZmljYXRpdmEgZW4gbG9zIGRhdG9zIGRlIGxhIGNhbnRpZGFkIGRlIGTDrWFzIHRyYWJhamFkb3MsIGRlc3RhY2FuZG8gbGEgbWVkaWEgZGUgZMOtYXMgdHJhYmFqYWRvcywgZXMgZGVjaXIsIDEwMDAgZMOtYXMuIEVuIGVsIGNhc28gZGUg4oCYYmFqb+KAmSwgaGF5IHVuYSBkaXNwZXJzacOzbiBiYWphIHkgcG9jbyB2YXJpYWJsZS4gUGFyYSDigJhhcnJpYmEgZGVsIHByb21lZGlv4oCZLCB2ZW1vcyBxdWUgbG9zIHB1bnRvcyBhdMOtcGljb3Mgc2Ugc2FsZW4gZGVsIGJveHBsb3QgZXNwZWPDrWZpY28sIGxvIGN1YWwgcXVpdGFybG9zIG5vcyBwdWVkZSBkYXIgbWF5b3IgY2xhcmlkYWQgeSB2aXNpYmlsaWRhZCBkZSBsYSBpbmZvcm1hY2nDs24uIFBhcmEg4oCYYWx0b+KAmSBzZSBtdWVzdHJhIHVuYSBkaXNwZXJzacOzbiBtZW5vciBhIOKAmHByb21lZGlv4oCZIHkgYWwgaWd1YWwgcXVlIOKAmGFycmliYSBkZWwgcHJvbWVkaW/igJksIHRpZW5lIGFwYXJpY2nDs24gZGUgcHVudG9zIGF0w61waWNvcy4NCg0KIyMgRGlzcGVyc2nDs24gZGUgInNhbGFyaW8gZGlhcmlvIg0KZ2dwbG90KHJoMiwgYWVzKHg9Q2x1c3Rlcl9OYW1lcywgeT1TQUxBUklPLkRJQVJJTy5JTVNTLCBmaWxsPUNsdXN0ZXJfTmFtZXMpKSArDQogIGdlb21fYm94cGxvdCgpKw0KICBnZ3RpdGxlKCJEaXNwZXJzaW9uIG9mICdTYWxhcmlvX0RpYXJpbycgYnkgQ2x1c3RlcnMgTmFtZXMiKQ0KDQojIExhIGdyw6FmaWNhIGFudGVyaW9yIGV4cGxpY2EgbGEgZGlzcGVyc2nDs24gZGUgc2FsYXJpbyBkaWFyaW8gZGUgYWN1ZXJkbyBhIGxhIGNsYXNpZmljYWNpw7NuIGV4cGxpY2FkYSBhbnRlcmlvcm1lbnRlIGRlIOKAmGJham/igJksIOKAmHByb21lZGlv4oCZLCDigJhhcnJpYmEgZGVsIHByb21lZGlv4oCZIHkg4oCYYWx0b+KAmS4g4oCYQmFqb+KAmSBtdWVzdHJhIHVuIHNhbGFyaW8gZGlhcmlvIGRlICQ1MDAgcGVzb3MsIOKAmHByb21lZGlv4oCZIG11ZXN0cmEgdW4gc2FsYXJpbyBkZSAkMTgwIHBlc29zIGFwcm94IHkgcHVudG9zIGF0w61waWNvcyBxdWUgcG9kcsOtYW4gaW5zaW51YXIgdW4gc2FsYXJpbyBtZW5vciwg4oCYYXJyaWJhIGRlbCBwcm9tZWRpb+KAmSB0YW1iacOpbiBtdWVzdHJhIHB1bnRvcyBhdMOtcGljb3MuIFNpbiBlbWJhcmdvLCB0b2RvcyBzZSBtYW50aWVuZW4gYWwgaWd1YWwgcXVlIGVsIGRhdG8gYW50ZXJpb3IgZW50cmUgJDE3MCB5ICQxODAgcGVzb3MgZGUgc2FsYXJpbyBkaWFyaW8sIEZpbmFsbWVudGUsIOKAmGFsdG/igJkgbXVlc3RyYSB1biBzYWxhcmlvIGRpYXJpbyBhYmFqbyBkZWwgcHJvbWVkaW8gZGUgYXByb3guICQxNDAgcGVzb3MuDQoNCg0KIyMgQ2x1c3RlciAyDQoNCiMjIEltcG9ydGFyIGJhc2UgZGUgZGF0b3MuDQpyaENsdXN0ZXIyPC1yZWFkLmNzdigiSFJfQmFqYXMgMi5jc3YiKSANCnN1bW1hcnkocmhDbHVzdGVyMikNCg0Kc3RyKHJoQ2x1c3RlcjIpDQoNCiMjIEV4cG9ydGFyICdrLW1lYW5zJyBlbiBlZGFkIHBvciBhw7Fvcw0KaHVtYW5vczU8LXJoQ2x1c3RlcjIgJT4lIHNlbGVjdChFREFELERJQVMuVFJBQkFKQURPUyxTQUxBUklPLkRJQVJJTy5JTVNTLEVTVEFETy5DSVZJTCkNCnN1bW1hcnkoaHVtYW5vczUpDQoNCiMjIE5vcm1hbGl6YXIgbG9zIGRhdG9zDQpyaENsdXN0ZXJfbm9ybTwtc2NhbGUoaHVtYW5vczVbMToyXSkgDQoNCiMjIENhbGN1bGFyIG7Dum1lcm8gZGUgY2x1c3RlcnMNCmZ2aXpfbmJjbHVzdChyaENsdXN0ZXJfbm9ybSwga21lYW5zLCBtZXRob2Q9IndzcyIpKyAjIHdzcyBtZXRob2QgY29uc2lkZXJzIHRvdGFsIHdpdGhpbiBzdW0gb2Ygc3F1YXJlDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD00LCBsaW5ldHlwZT0yKSsgICAgICAgICAgICMgb3B0aW1hbCBudW1iZXIgb2YgY2x1c3RlcnMgaXMgY29tcHV0ZWQgd2l0aCB0aGUgZGVmYXVsdCBtZXRob2QgPSAiZXVjbGlkZWFuIg0KICBsYWJzKHN1YnRpdGxlID0gIkVsYm93IG1ldGhvZCIpDQoNCiMjIFZlciBkYXRvcyBkZSBsb3MgY2x1c3RlcnMNCnJoX2NsdXN0ZXIyPC1rbWVhbnMocmgxX25vcm0sNCkNCnJoX2NsdXN0ZXIyDQoNCiMjIFZpc3VhbGl6YXIgY2x1c3RlcmluZw0KZnZpel9jbHVzdGVyKHJoX2NsdXN0ZXIyLGRhdGE9cmhDbHVzdGVyX25vcm0pDQoNCiMgTGEgZ3LDoWZpY2EgYW50ZXJpb3IgbXVlc3RyYSA0IGNsdXN0ZXJzIHF1ZSBhbmFsaXphbiBsYSByZWxhY2nDs24gZW50cmUgZWRhZCB5IGTDrWFzIHRyYWJhamFkb3MuIEVsIGNsdXN0ZXIgdmVyZGUgbXVlc3RyYSBxdWUgdW4gYWx0byBuw7ptZXJvIGRlIHBlcnNvbmFzIHRhYmFqYWJhIG3DoXMgZMOtYXMgcXVlIGVsIHByb21lZGlvIHkgdGVuw61hIHVuYSBlZGFkIHNpbWlsYXIgYWwgcHJvbWVkaW8uIEVsIHB1bnRvIG5hcmFuamEgbXVlc3RyYSBxdWUgcG9jb3MgdXN1YXJpb3MgdHJhYmFqYWJhbiBtw6FzIGTDrWFzIHF1ZSBlbCBwcm9tZWRpbyB5IGFsIGlndWFsIHF1ZSBlbCBwdW50byBhbnRlcmlvciwgdGVuw61hbiB1bmEgZWRhZCBwcm9tZWRpby4gRW4gZWwgY2FzbyBkZWwgcHVudG8gYXp1bCB5IGVsIG1vcmFkbywgYW1ib3MgbXVlc3RyYW4gcXVlIHVuIG1heW9yIGdydXBvIGRlIHBlcnNvbmFzIGxhYm9yYWJhIOKAmDIgZMOtYXPigJksIHBlcm8gdGVuw61hIG1heW9yIHZhcmlhYmlsaWRhZCBlbiBsYSBlZGFkLg0KDQojIyBBZ3JlZ2FyIGxhIGluZm9ybWFjacOzbiBhbCBkYXRhc2V0IG9yaWdpbmFsDQpodW1hbm9zNjwtaHVtYW5vczUNCmh1bWFub3M2JENsdXN0ZXJzPC1yaF9jbHVzdGVyMiRjbHVzdGVyDQpzdW1tYXJ5KGh1bWFub3M2KQ0KDQojIyBDcmVhciBkYXRhc2V0DQpodW1hbm9zNzwtaHVtYW5vczYgJT4lIGdyb3VwX2J5KENsdXN0ZXJzLCBFU1RBRE8uQ0lWSUwpICU+JSBzdW1tYXJpc2UoRURBRD1tYXgoRURBRCksRElBUy5UUkFCQUpBRE9TPW1lYW4oRElBUy5UUkFCQUpBRE9TKSkgJT4lIGFycmFuZ2UoZGVzYyhFREFEKSkNCnN1bW1hcnkoaHVtYW5vczcpDQoNCiMjIEFncnVwYXIgY2x1c3RlcnMgcG9yIG5vbWJyZQ0KaHVtYW5vczYkQ2x1c3Rlcl9OYW1lczwtZmFjdG9yKGh1bWFub3M2JENsdXN0ZXJzLGxldmVscyA9IGMoMSwyLDMsNCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJKb3ZlbiIsICJBdmFuemFkbyAiLCAiIEFkdWx0byIsICJKdWJpbGFkbyIpKQ0Kc3VtbWFyeShodW1hbm9zNikNCg0KIyBFbnRyZSBtw6FzIGpvdmVuLCBtw6FzIGTDrWFzIHRyYWJhamFkb3MuDQoNCiMjIEFncnVwYXIgcG9yIGNsdXN0ZXJzIHkgcmVzdW1pciBjb2x1bW5hcw0KaHVtYW5vczggPC0gaHVtYW5vczYgJT4lIGdyb3VwX2J5KENsdXN0ZXJfTmFtZXMsIEVTVEFETy5DSVZJTCkgJT4lIGRwbHlyOjogc3VtbWFyaXplKEVEQUQ9bWF4KEVEQUQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUFTLlRSQUJBSkFET1MgPW1lYW4oRElBUy5UUkFCQUpBRE9TKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50PW4oKSkNCg0KDQojIyBDb252ZXJ0aXIgYSB0YWJsYQ0KY2x1c3RlcnMyPC1hcy5kYXRhLmZyYW1lKGh1bWFub3M4KQ0KY2x1c3RlcnMyDQoNCiMjIFZpc3VhbGl6YXIgZ3LDoWZpY29zDQojIyBWZXIgbG9zIGTDrWFzIHRyYWJhamFkb3MgZW4gZ2VuZXJhbCBqdW50byBjb24gbGEgZWRhZA0KZ2dwbG90KGh1bWFub3M4LGFlcyh4PXJlb3JkZXIoQ2x1c3Rlcl9OYW1lcyxDb3VudCkseT1Db3VudCxmaWxsPUNsdXN0ZXJfTmFtZXMpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikNCg0KIyBMYSBncsOhZmljYSBhbnRlcmlvciBub3MgbXVlc3RyYSBsYSBjYW50aWRhZCBkZSBkw61hcyB0cmFiYWphZG9zIGRlIGFjdWVyZG8gYSBsYSBlZGFkIGRlIGxvcyBlbXBsZWFkb3MuIEVuIGVzdGUgY2FzbywgdmVtb3MgcXVlIGVsIGdydXBvIGRlIGVkYWQg4oCYam92ZW7igJkgdGVuw61hbiBhcHJveC4gMzEgYcOxb3MgeSByZXByZXNlbnRhIHVuIGJham8gcG9yY2VudGFqZSBkZSBsb3MgZW1wbGVhZG9zLiBQYXJhIOKAmGF2YW56YWRv4oCZIHNvbiBsb3MgZW1wbGVhZG9zIHF1ZSB0aWVuZW4gYXJyaWJhIGRlIDMyIGHDsW9zIHkgbGFib3Jhcm9uIGxhIG1heW9yIGNhbnRpZGFkIGRlIGTDrWFzICgxMDY3KS4gUGFyYSDigJhqdWJpbGFkb+KAmSwgc29uIGxhcyBwZXJzb25hcyBjb24gdW4gYXByb3guIGRlIDUwIGHDsW9zIHkgcXVlIGxhYm9yYXJvbiBkdXJhbnRlIDEwMiBkw61hcy4gRmluYWxtZW50ZSwgcGFyYSBlbCBncnVwbyBkZSDigJhhZHVsdG/igJkgKGVsIG3DoXMgZWxldmFkbyksIHNvbiBhcXVlbGxvcyBxdWUgbGFib3Jhcm9uIHVuIHByb21lZGlvIGRlIDQ0IGTDrWFzIHkgdGllbmVuIGxhIGVkYWQgZGUgNTIgYcOxb3MuDQoNCiMjIETDrWFzIHRyYWJhamFkb3MgcG9yIG5vbWJyZSBkZSBjbHVzdGVycw0KZ2dwbG90KGh1bWFub3M4LCBhZXMoeD1DbHVzdGVyX05hbWVzLHk9RElBUy5UUkFCQUpBRE9TLGZpbGw9IENsdXN0ZXJfTmFtZXMsbGFiZWw9cm91bmQoRElBUy5UUkFCQUpBRE9TLGRpZ2l0cz0yKSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KCkNCg0KIyBMYSBncsOhZmljYSBhbnRlcmlvciBub3MgbXVlc3RyYSBsYSBjYW50aWRhZCBkZSBkw61hcyB0cmFiYWphZG9zIGRlIGFjdWVyZG8gYSBsb3MgZMOtYXMgdHJhYmFqYWRvcy4gRW4gZXN0ZSBjYXNvLCBlc3RvIG5vcyBtdWVzdHJhIHF1ZSBlbCBncnVwbyBjb24gbWF5b3IgYmFqYXMgZnVlcm9uIGRlbCBzZWdtZW50byDigJhhZHVsdG/igJkgeSBlcyBlbCBxdWUgbGFib3LDsyBlbiBwcm9tZWRpbyB1biBtZW5vciBuw7ptZXJvIGRlIGTDrWFzIGNvbnRyYSDigJhhdmFuemFkb+KAmSBxdWUgZXMgZWwgc2VndW5kbyBncnVwbyBtw6FzIGJham8geSBsYWJvcsOzIGVsIG1heW9yIG7Dum1lcm8gZGUgZMOtYXMgZW4gcHJvbWVkaW8uDQoNCiMjIEVkYWQgcG9yIG5vbWJyZSBkZSBjbHVzdGVycw0KZ2dwbG90KGh1bWFub3M4LGFlcyh4PUNsdXN0ZXJfTmFtZXMseT1FREFELGZpbGw9IENsdXN0ZXJfTmFtZXMsbGFiZWw9cm91bmQoRURBRCxkaWdpdHM9MikpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dCgpDQoNCiMgTGEgZ3LDoWZpY2EgYW50ZXJpb3Igbm9zIG11ZXN0cmEgbGEgZWRhZCBwcm9tZWRpbyBkZSBjYWRhIHVubyBkZSBsb3MgZ3J1cG9zLiBDb21vIGV4cGxpY2Ftb3MgYW50ZXJpb3JtZW50ZSwgc2UgbXVlc3RyYSBxdWUg4oCYYWR1bHRv4oCZIGVzIGVsIGRlIGVtcGxlYWRvcyBjb24gbWF5b3IgZWRhZCB5IOKAmGpvdmVu4oCZIGVzIGVsIGRlIHBlcnNvbmFzIGRlIG1lbm9yIGVkYWQuDQoNCiMjIyBEaWFzIHRyYWJhamFkb3MgcG9yIG5vbWJyZSBkZSBjbHVzdGVycw0KDQoNCmdncGxvdChodW1hbm9zOCwgYWVzKHg9Q2x1c3Rlcl9OYW1lcyx5PURJQVMuVFJBQkFKQURPUyxmaWxsPSBDbHVzdGVyX05hbWVzLGxhYmVsPXJvdW5kKERJQVMuVFJBQkFKQURPUyxkaWdpdHM9MikpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dCgpDQoNCg0KI0xhIGdyw6FmaWNhIGFudGVyaW9yIG5vcyBtdWVzdHJhIGxhIGNhbnRpZGFkIGRlIGTDrWFzIHRyYWJhamFkb3MgZGUgYWN1ZXJkbyBhIGxvcyBkw61hcyB0cmFiYWphZG9zLiBFbiBlc3RlIGNhc28sIGVzdG8gbm9zIG11ZXN0cmEgcXVlIGVsIGdydXBvIGNvbiBtYXlvciBiYWphcyBmdWVyb24gZGVsIHNlZ21lbnRvICdhZHVsdG8nIHkgZXMgZWwgcXVlIGxhYm9yw7MgZW4gcHJvbWVkaW8gdW4gbWVub3IgbsO6bWVybyBkZSBkw61hcyBjb250cmEgJ2F2YW56YWRvJyBxdWUgZXMgZWwgc2VndW5kbyBncnVwbyBtw6FzIGJham8geSBsYWJvcsOzIGVsIG1heW9yIG7Dum1lcm8gZGUgZMOtYXMgZW4gcHJvbWVkaW8uDQoNCiMjIyBFZGFkIHBvciBub21icmUgZGUgY2x1c3RlcnMgDQoNCg0KZ2dwbG90KGh1bWFub3M4LGFlcyh4PUNsdXN0ZXJfTmFtZXMseT1FREFELGZpbGw9IENsdXN0ZXJfTmFtZXMsbGFiZWw9cm91bmQoRURBRCxkaWdpdHM9MikpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dCgpDQoNCg0KDQojIExhIGdyw6FmaWNhIGFudGVyaW9yIG5vcyBtdWVzdHJhIGxhIGVkYWQgcHJvbWVkaW8gZGUgY2FkYSB1bm8gZGUgbG9zIGdydXBvcy4gQ29tbyBleHBsaWNhbW9zIGFudGVyaW9ybWVudGUsIHNlIG11ZXN0cmEgcXVlICdhZHVsdG8nIGVzIGVsIGRlIGVtcGxlYWRvcyBjb24gbWF5b3IgZWRhZCB5ICdqb3ZlbicgZXMgZWwgZGUgcGVyc29uYXMgZGUgbWVub3IgZWRhZC4NCg0KIyMgRMOtYXMgdHJhYmFqYWRvcyBwb3Igbm9tYnJlIGRlIGNsdXN0ZXJzDQpnZ3Bsb3QoaHVtYW5vczYsIGFlcyh4PUNsdXN0ZXJfTmFtZXMsIHk9RURBRCwgZmlsbD1DbHVzdGVyX05hbWVzKSkgKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgZ2d0aXRsZSgiRGlzcGVyc2lvbiBvZiAnRWRhZCcgYnkgQ2x1c3RlcnMgTmFtZXMiKQ0KDQojIExhIGdyw6FmaWNhIGFudGVyaW9yIG5vcyBtdWVzdHJhIGxhIGRpc3BlcnNpw7NuIGRlIGFjdWVyZG8gYSBsYSBlZGFkIGRlIGxvcyBlbXBsZWFkb3MuIEVuIGVsIGNhc28gZGUg4oCYYWR1bHRv4oCZLCB0aWVuZSB1bmEgZ3JhbiBjYW50aWRhZCBkZSBwdW50b3MgYXTDrXBpY29zIGxvIGN1YWwgaW5kaWNhIHF1ZSBoYXkgZGF0b3MgZnVlcmEgZGUgc2VyaWUuIEVuIGVsIGNhc28gZGUg4oCYanViaWxhZG/igJksIHZlbW9zIHF1ZSBlcyBlbCBncnVwbyBjb24gbWF5b3IgZGlzcGVyc2nDs24sIG1vc3RyYW5kbyBkYXRvcyBkZSBlZGFkIGVudHJlIDI1IHkgMzIgYcOxb3MuDQoNCiMjIFNhbGFyaW8gZGlhcmlvIHBvciBub21icmUgZGUgY2x1c3RlcnMNCmdncGxvdChodW1hbm9zNiwgYWVzKHg9Q2x1c3Rlcl9OYW1lcywgeT1ESUFTLlRSQUJBSkFET1MsIGZpbGw9Q2x1c3Rlcl9OYW1lcykpICsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIGdndGl0bGUoIkRpc3BlcnNpb24gb2YgJ0RpYXNfVHJhYmFqYWRvcycgYnkgQ2x1c3RlcnMgTmFtZXMiKQ0KDQojIExhIGdyw6FmaWNhIGFudGVyaW9yIG11ZXN0cmEgbGEgZGlzcGVyc2nDs24gZGUgYWN1ZXJkbyBhIGTDrWFzIHRyYWJhamFkb3MgeSBsb3MgZ3J1cG9zIGFudGVyaW9yIGV4cGxpY2Fkb3MuIFZlbW9zIHF1ZSDigJhhdmFuemFkb+KAmSBlcyBlbCBndXJwbyBjb24gbWF5b3IgZGlzcGVyc2nDs24sIG1vc3RyYW5kbyBxdWUgZWwgcHJvbWVkaW8gZGUgbG9zIGVtcGxlYWRvcyBsYWJvcmFyb24gZW50cmUgNTUwIHkgMTMwMCBkw61hcy4gRXMgZWwgZ3J1cG8gY29uIG1heW9yIG7Dum1lcm8gZGUgZW1wbGVhZG9zIHF1ZSB0cmFiYWphcm9uIGVuIGVzdGUgcGVyaW9kbyBkZSB0aWVtcG8uIEVuIGVsIGNhc28gZGUg4oCYYWR1bHRv4oCZIHkg4oCYanViaWxhZG/igJksIHNvbiBhcXVlbGxvcyBncnVwb3MgcXVlIG11ZXN0cmFuIHVuYSBkaXNwZXJzacOzbiBiYWphIHkgdW5hIHZhcmllZGFkIGRlIHB1bnRvcyBhdMOtcGljb3MsIG1pZW50cmFzIHF1ZSDigJhqb3ZlbuKAmSBkZXN0YWNhIHVuYSBiYWphIGRpc3BlcnNpw7NuIHkgdW5hIG1lZGlhIGRlIG3DoXMgZGUgNTAwIGTDrWFzIHRyYWJhamFkb3MuDQoNCg0KYGBgDQoNCg0KIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkYXJrb3JhbmdlIj4qKjcuMSBQcmVkaWNjacOzbioqIA0KYGBge3J9DQpsaWJyYXJ5KFRTc3R1ZGlvKQ0KDQojIyMgTGxhbWFyIGJhc2UgZGUgZGF0b3MNCg0KQ29tcGFuaWVzIDwtcmVhZC5jc3YoImV4dGVybmFfYmQxIGNzdjEuY3N2IikNCnN1bW1hcnkoQ29tcGFuaWVzKQ0KDQojIyMgMS4gTGltcGllemEsIFRyYW5zZm9ybWFjacOzbiB5IE9yZ2FuaXphY2nDs24gZGUgQmFzZXMgZGUgRGF0b3MNCg0Kc3RyKENvbXBhbmllcykNCmRlc2NyaWJlKENvbXBhbmllcykNCg0KIyMjIyBOb3RhOiBEZWJpZG8gYSBsYSB2ZXJzacOzbiBkZSBSLCBub3MgZGVqYSBkZXNjYXJnYXIgZWwgcGFxdWV0ZSAicHN5Y2giLiBTaW4gZW1iYXJnbywgbm8gbm9zIGRlamEgbGxhbWFyIGEgbGEgbGlicmVyw61hICJwc3ljaCIsIHBvciBsbyB0YW50byB1dGlsaXphbW9zIHN0ciwgcGFyYSBvYnRlbmVyIGVsIG51bWVybyBkZSBsYXMgdmFyaWFibGVzIGRlIGxhIGJhc2UgZGUgZGF0b3MuDQoNCiMjIyAyLiBDbGFzaWZpY2FjacOzbiBkZSB2YXJpYWJsZXMNCiMjIyMgUmVhbGl6YW1vcyB1bmEgdGFibGEgcGFyYSBwb2RlciBjbGFzaWZpY2FyIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMgZGUgbGEgYmFzZSBkZSBEYXRvcyBiZDENCg0KVmFyaWFibGU8LWMoIkdlb2dyYXBoeSIsIkNhdGVnb3J5IiwiRGF0YS5UeXBlIiwgIlVuaXQiLCJDdXJyZW50IENvbnN0YW50IiwiWWVhcnMiKQ0KVHlwZTwtYygiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbnRpdGF0aXZhIChDb250aW51YSkiKQ0KdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkNCmtuaXRyOjprYWJsZSh0YWJsZSkNCg0KIyMjIDMuIEVzY2FsYSBkZSBNZWRpY2nDs24NCiNSZWFsaXphbW9zIHVuYSB0YWJsYSBkb25kZSB2aWVuZSBjbGFzaWZpY2FkbyBjYWRhIHZhcmlhYmxlIHkgYWdyZWdhbW9zIHVuYSBjb2x1bW5hIGNvbiBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIHBhcmEgY2FkYSB2YXJpYWJsZS4gDQoNClZhcmlhYmxlPC1jKCJHZW9ncmFwaHkiLCJDYXRlZ29yeSIsIkRhdGEuVHlwZSIsICJVbml0IiwiQ3VycmVudCBDb25zdGFudCIsIlllYXJzIikNClR5cGU8LWMoIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YW50aXRhdGl2YSAoQ29udGludWEpIikNCkVzY2FsYV9kZV9NZWRpY2nDs24gPC0gYygiUGHDrXNlcyIsICJQcm9kdWN0byIsICJEZXBhcnRhbWVudG8iLCJUaXBvIGRlIE1vbmVkYSIsICJQcmVjaW8gYWN0dWFsIiwgIkdhbmFuY2lhIChSYXpvbikiKQ0KdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSxFc2NhbGFfZGVfTWVkaWNpw7NuKQ0Ka25pdHI6OmthYmxlKHRhYmxlKQ0KDQoNCiMjIyA0LiBMaW1waWV6YSBkZSBkYXRvcw0KIyMjIyBMYSBwcmltZXIgdGVjbmljYSBkZSBsaW1waWV6YSBxdWUgdXRpbGl6YW1vcyBmdWUsIGVsaW1pbmFyIGNvbHVtbmFzIGRlYmlkbyBhIHF1ZSBjb250YWJhbW9zIGNvbiBkYXRvcyBsb3MgY3VhbGVzIG5vIGVyYW4gcmVsZXZhbnRlcyBwYXJhIGVsIGFuw6FsaXNpcy4gDQojIyMjIExhIHNlZ3VuZGEgaGVycmFtaWVudGEgZGUgbGltcGllemEgcXVlIHV0aWxpemFtb3MgcGFyYSBsYSB2aXN1bGl6YWNpw7NuIGRlIGxvcyBkYXRvcyBmdWUgaW1wbGVtZW50YXIgdW5hIG51ZXZhIGNvbHVtbmEgY29tbyBlbCB0b3RhbCBkZSBsYSBQcm9kdWNjacOzbiBkZSBsYXMgdmFyaWFibGVzIHF1ZSBzZSBwcm9kdWNlbiBwb3IgcGHDrXMuDQoNCiMjIyBSZW1vdmVyIFZhbG9yZXMgSXJyZWxldmFudGVzDQoNCiMjIyMgRWxpbWluYXIgY29sdW1uYXMNCmJkMSA8LSBDb21wYW5pZXMNCmJkMTwtc3Vic2V0KGJkMSxzZWxlY3Q9LWMoQ2F0ZWdvcnksRGF0YS5UeXBlLEN1cnJlbnQuQ29uc3RhbnQpKQ0Kc3RyKGJkMSkNCg0KIyMjIyBBZ3JlZ2FyIENvbHVtbmFzDQpiZDEkVG90YWxfUHJvZHVjY2lvbjwtIGJkMSRYMjAxNitiZDEkWDIwMTcrYmQxJFgyMDE4K2JkMSRYMjAxOStiZDEkWDIwMjArYmQxJFgyMDIxDQpiZDEkUHJvbWVkaW9fWDIwMjE8LSBtZWFuKGJkMSRYMjAyMSkNCg0Kc3VtbWFyeShiZDEpDQpzdHIoYmQxKQ0KDQojIyMjIMK/Q3XDoW50b3MgTkEncyB0ZW5nbyBlbiBsYSBiYXNlIGRlIGRhdG9zPw0Kc3VtKGlzLm5hKGJkMSkpDQoNCiMjIyMgTm90YTogU2UgZWxpbWluYW4gQ2F0ZWdvcnksIERhdGEuVHlwZSB5IEN1cnJlbnQuQ29uc3RhbnQsIHlhIHF1ZSBubyBub3Mgc2lydmVuLCBkZWJpZG8gYSBxdWUgZXMgZWwgbWlzbW8gZGF0byBwYXJhIHRvZG9zIGxvcyByZWdpc3Ryb3MgeSBlcyBhbGdvIHF1ZSBubyBub3MgYXBvcnRhIGFsZ3VuYSBpbmZvcm1hY2nDs24uDQoNCiMjIyA1LiBBbsOhbGlzaXMgRXhwbG9yYXRvcmlvIGRlIGxhcyBCYXNlcyBkZSBEYXRvcw0KDQpkZXNjcmliZShiZDEpDQoNCiMgRW4gZWwgYW7DoWxpc2lzIGRlc2NyaXB0aXZvIHNlIG11ZXN0cmFuIGxvcyB2YWxvcmVzIHByb21lZGlvIGRlbCB0b3RhbCBkZSBwcm9kdWNjaW9uZXMgZGUgMjAxNiBhIDIwMjEuDQoNCiMjIyBUYWJsYSBkZSBGcmVjdWVuY2lhDQpiZDIgPC0gdGFibGUoYmQxJFVuaXQpDQpiZDIgPC0gcHJvcC50YWJsZShiZDIpDQpiZDINCg0KIyMjIFRhYmxhIGNydXphZGENCnRhYmxlKGJkMSRVbml0LCBiZDEkUHJvbWVkaW9fWDIwMjEpDQoNCiMgTGEgdGFibGEgbm9zIG11ZXN0cmEgbGEgY2FudGlkYWQgcHJvbWVkaW8gZW4gbWlsbG9uZXMgcHJvZHVjaWRhIGVuIDIwMjEgcG9yIGNhZGEgdW5pZGFkIG1vbmV0YXJpYS4gRW4gZXN0ZSBjYXNvLCB2ZW1vcyBxdWUgZW4gMjAyMSBzZSBwcm9kdWpvIGVuIHByb21lZGlvIG3DoXMgZGUgMU1NIGRlICJjdXJyZW5jaWVzIiAobm8gc2UgcHVlZGUgZGVmaW5pciB1bmEgdW5pZGFkIG1vbmV0YXJpYSBlc3BlY8OtZmljYSBkZWJpZG8gYSBxdWUgZXN0YW1vcyBwb25kZXJhbmRvIGRpc3RpbnRhcyBtb25lZGFzIGludGVybmFjaW9uYWxlcykuIENvbmZvcm1lIHNlIGFuYWxpemEgbGEgdGFibGEsIHZlbW9zIHF1ZSBlbCBldXJvIGdlbmVyw7MgMTggdmVjZXMgZWwgcHJvbWVkaW8gZGUgcHJvZHVjY2nDs24gZGUgY2FydMOzbiBlc3RpbWFkbyBwYXJhIDIwMjEsIGVzIGRlY2lyLCBlcyBsYSBtb25lZGEgaW50ZXJuYWNpb25hbCBxdWUgbcOhcyBwcm9kdWpvIGNhcnTDs24gYSBuaXZlbCBpbnRlcm5hY2lvbmFsIGVuIDIwMjEuIExhIHNpZ3VpZW50ZSBtb25lZGEgY29uIG1heW9yIGNhcGFjaWRhZCBkZSBwcm9kdWNjacOzbiBmdWUgVVNEIG1pbGxpb25zLg0KDQojIyMgR3LDoWZpY2FzIGRlIGRhdG9zIEN1YWxpdGF0aXZhcyB5IEN1YW50aXRhdGl2YXMNCg0KIyMjIyBDdWFsaXRhdGl2YSBjb24gVW5pdA0KYmFycGxvdChiZDIsIHhsYWI9J1RpcG8gZGUgTW9uZWRhJywNCiAgICAgICAgeWxhYj0nRnJlY3VlbmNpYSBSZWxhdGl2YScsIGxhcz0xKQ0KDQojIExhIGdyw6FmaWNhIG5vcyBtdWVzdHJhIHF1ZSBkZSBhY3VlcmRvIGEgbGEgZnJlY3VlbmNpYSByZWxhdGl2YSBkZSBwcm9kdWNjacOzbiwgSW5kb25lc2lhIGVzIGxhIHVuaWRhZCBtb25ldGFyaWEgcXVlIG3DoXMgY2FydMOzbiBoYSBlbnRyZWdhZG8uDQoNCiMjIyMgQ3VhbnRpdGF0aXZhIGNvbiBUb3RhbF9Qcm9kdWNjaW9uDQpiZDMgPC0gYmQxDQphZ2dyZWdhdGUoeD1iZDMkVG90YWxfUHJvZHVjY2lvbiwgYnk9bGlzdChiZDMkR2VvZ3JhcGh5KSxGVU49c3VtKQ0KDQojIEVuIGxhIHRhYmxhIGFudGVyaW9yIHNlIG11ZXN0cmEgZWwgdG90YWwgZGUgcHJvZHVjY2nDs24gZ2VuZXJhZG8gcG9yIGNhZGEgcGHDrXMuIEhhY2llbmRvIHVuYSBwb25kZXJhY2nDs24gZGUgbG9zIDUgcGHDrXNlcyBxdWUgbWF5b3IgcHJvZHVjY2nDs24gZGUgY2FydMOzbiB0aWVuZW4gKGhhY2llbmRvIHVuIGNvbnRlbyBoaXN0w7NyaWNvIGRlIDIwMTYgYSAyMDIxKSwgdmVtb3MgcXVlIHNlIGRlc3RhY2FuIElyw6FuLCBWaWV0bmFtLCBDb3JlYSBkZWwgU3VyLCBKYXDDs24gZSBJbmRvbmVzaWEuDQoNCmhpc3QobG9nKGJkMSRUb3RhbF9Qcm9kdWNjaW9uKSwgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIFByb2R1Y2Npw7NuIFRvdGFsIiwgeGxhYj0iUHJvZHVjY2nDs24gVG90YWwiLCANCiAgICAgeWxhYj0iRnJlY3VlbmNpYSIsIGNvbD0iYmx1ZTEiKQ0KDQojIEVuIGxhIGdyw6FmaWNhIGFudGVyaW9yIHNlIHNpbWJvbGl6YSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIG11ZXN0cmEgcmVzcGVjdG8gYSBsYSBwcm9kdWNjacOzbiB0b3RhbCB5IGxhIGZyZWN1ZW5jaWEgZGUgw6lzdGEuIERlIGFjdWVyZG8gYSBsYSBmcmVjdWVuY2lhIHRvdGFsLCB2ZW1vcyBxdWUgc2UgdGllbmUgdW5hIG1heW9yIHByb2R1Y2Npw7NuIHBvciBmcmVjdWVuY2lhIGVudHJlIDEwIHkgMTUsIGVzIGRlY2lyLCBsYSBwcm9kdWNjacOzbiB0b3RhbCBlcyBtw6FzIGFsdGEgeSB0aWVuZSB1bmEgZnJlY3VlbmNpYSBtYXlvciBhIDE1IHF1ZSBzZSBtdWVzdHJhIGNvbW8gZWwgbcOhcyBlbGV2YWRvIGVuIGVsIGhpc3RvZ3JhbWEuDQoNCiMjIyBHcsOhZmljYXMgZGUgRGlzcGVyc2nDs24NCg0KIyMjIyBSZWxhY2nDs24gR2VvZ3JhcGh5IGNvbiBQcm9kdWNjacOzbiBUb3RhbA0KZ2dwbG90KGJkMSwgYWVzKHg9VG90YWxfUHJvZHVjY2lvbiwgeT1HZW9ncmFwaHkpKSArIA0KICBnZW9tX3BvaW50KHNoYXBlPTE5LCBzaXplPTMpICsgbGFicyh0aXRsZSA9ICJSZWxhY2nDs24gZW50cmUgbG9zIFBhw61zZXMgeSBsYSBQcm9kdWNjacOzbiBUb3RhbCIsY2FwdGlvbiA9IlBhc3Nwb3J0X1Byb2R1Y2Npw7NuQ2FydG9uIix4PSJQcm9kdWNjacOzbl9Ub3RhbCIsIHk9Ikdlb2dyYXBoeSIpICsgdGhlbWVfY2xhc3NpYygpDQoNCiMgRW4gbGEgZ3LDoWZpY2EgYW50ZXJpb3Igc2UgbXVlc3RyYSBsYSByZWxhY2nDs24gZW50cmUgbG9zIHBhw61zZXMgeSBsYSBwcm9kdWNjacOzbiB0b3RhbC4gU2UgdmUgcXVlIGhheSB1bmEgZGlzcGVyc2nDs24gbWF5b3IgcGFyYSBsb3MgcGHDrXNlcyBlbiBlbCBjZW50cm8gZGUgbGEgZ3LDoWZpY2EuIEVzdG8gc2lnbmlmaWNhIHF1ZSBoYXkgbcOhcyBpcnJlZ3VsYXJpZGFkIGVuIGxhIHByb2R1Y2Npw7NuIHRvdGFsIHF1ZSBoYW4gZ2VuZXJhZG8uDQoNCmJveHBsb3Q9c3Vic2V0KGJkMSxzZWxlY3QgPSAtYyhUb3RhbF9Qcm9kdWNjaW9uLEdlb2dyYXBoeSkpDQpib3hwbG90KGJkMSRUb3RhbF9Qcm9kdWNjaW9uLCBtYWluPSAiVG90YWwgZGUgcHJvZHVjY2nDs24iKQ0KDQojIEVuIGxhIGdyw6FmaWNhIGFudGVyaW9yIHZlbW9zIGVsIHRvdGFsIGRlIHByb2R1Y2Npw7NuIGRlIGFjdWVyZG8gYSBsYSBnZW9ncmFmw61hLiBBbCBpZ3VhbCBxdWUgbGEgZ3LDoWZpY2EgYW50ZXJpb3IsIGhheSB1bmEgY29ycmVsYWNpw7NuIG1heW9yIGFjb3JkZSBhbCB0b3RhbCBkZSBwcm9kdWNjacOzbi4NCg0KVm9sPC10cyhib3hwbG90LHN0YXJ0PWMoMjAxNiwxKSxmcmVxdWVuY3k9MTIpDQp0c19wbG90KFZvbCwNCiAgICAgICAgdGl0bGUgPSAiRGVzZW1wZcOxbyBkZSBsYSBJbmR1c3RyaWEgQXV0b21vdHJpejogUHJvZHVjY2nDs24gZGUgY2FydMOzbiBnbG9iYWwgZGUgMjAxNiBhIDIwMjEiLA0KICAgICAgICBZdGl0bGUgPSAiVW5pZGFkZXMgZW4gbWlsZXMiLA0KICAgICAgICBYdGl0bGUgPSAiQcOxb3MiLCANCiAgICAgICAgc2xpZGVyID0gVFJVRSkNCg0KIyBFbiBlc3RhIGdyw6FmaWNhIHNlIHZlIGVsIGRlc2VtcGXDsW8gZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXogZGUgMjAxNiBhIDIwMjEuIEVuIGdlbmVyYWwsIHNlIG11ZXN0cmEgcXVlIGVsIHRvdGFsIGRlIHByb2R1Y2Npw7NuIGRlIGNhcnTDs24gYSBuaXZlbCBnbG9iYWwgZnVlIG1heW9yIGVuIDIwMjEgY29udHJhIG90cm9zIGHDsW9zLg0KDQoNCiMjIyBQcmVkaWNjacOzbiBkZWwgRGVzZW1wZcOxbyBkZSBsYSBJbmR1c3RyaWEgQXV0b21vdHJpeg0KDQojIyMgSW1wb3J0YXIgYmFzZSBkZSBkYXRvcw0KYmQ1IDwtcmVhZC5jc3YoImV4dGVybmFfYmQyIGNzdjIuY3N2IikNCnN1bW1hcnkoYmQ1KQ0KDQpzdW0oaXMubmEoYmQ1KSkNCg0KYmQ1JFRvdGFsX1Byb2R1Y2Npb248LSBiZDEkWDIwMTYrYmQxJFgyMDE3K2JkMSRYMjAxOCtiZDEkWDIwMTkrYmQxJFgyMDIwK2JkMSRYMjAyMQ0KDQpzdW1tYXJ5KGJkNSkNCnN0cihiZDUpDQoNCnN1bShpcy5uYShiZDUpKQ0KDQojIyMjIE1vZGVsb3MgZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlDQoNCiMjIyMgTW9kZWxvcyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGU6IFByb2R1Y2Npw7NuIGRlIGNhcnTDs24gZW4gMjAyMiBhIG5pdmVsIGdsb2JhbA0KcmVncmVzaW9uIDwtIGxtKFRvdGFsX1Byb2R1Y2Npb24gfiBHZW9ncmFwaHkgKyBVbml0ICsgQcOxbyArIFByb2R1Y2Npb24sIGRhdGE9YmQ1KQ0Kc3VtbWFyeShyZWdyZXNpb24pDQoNCnJlZ3Jlc2lvbiA8LSBsbShUb3RhbF9Qcm9kdWNjaW9uIH4gQcOxbyArIFByb2R1Y2Npb24sIGRhdGE9YmQ1KQ0Kc3VtbWFyeShyZWdyZXNpb24pDQoNCmJkNSA8LSBkYXRhLmZyYW1lKEHDsW89MjAyMiwgUHJvZHVjY2lvbj0gMTcwMDAwMDAwKQ0KcHJlZGljdChyZWdyZXNpb24sYmQ1KQ0KDQojIERlIGFjdWVyZG8gYSBsb3MgZGF0b3MgZXN0aW1hZG9zLCBzZSB2ZSBxdWUgbGFzIHZhcmlhYmxlcyBkZSBhw7FvIHkgcHJvZHVjY2nDs24gc29uIGlndWFsbWVudGUgc2lnbmlmaWNhdGl2YXMgcGFyYSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZS4gRW4gZWwgY2FzbyBkZSBhw7FvLCBlc3RlIHRpZW5lIHVuIGltcGFjdG8gbmVnYXRpdm8gc29icmUgbGEgb3RyYSB5IGxhIHByb2R1Y2Npw7NuIHRpZW5lIHVuYSBlc3RpbWFjacOzbiBwb3NpdGl2YS4NCiMgRWwgbW9kZWxvIGFudGVyaW9yIG5vcyBtdWVzdHJhIGN1w6FudG8gc2UgZXN0aW1hIHF1ZSBzZSBwcm9kdWNpcsOhIGEgbml2ZWwgZ2xvYmFsIGVuIGxhIGluZHVzdHJpYSBkZWwgY2FydMOzbiBwYXJhIDIwMjIuIERlIGFjdWVyZG8gYSB1bmEgcHJvZHVjY2nDs24gdG90YWwgYXByb3hpbWFkYSBkZSAxNzAgbWlsbG9uZXMgZGUgY2FydMOzbiBlbiAyMDIxLCBzZSBlc3BlcmEgcXVlIGVuIDIwMjIgc2UgcHJvZHV6Y2FuIDkxNCwxOTYsOTI2LiBFbiBlc3RlIGNhc28sIGVsIHByw7Nub3N0aWNvIGZ1ZSByZWFsaXphZG8gYWwgY3JlYXIgdW4gbnVldm8gJ2RhdGEgZnJhbWUnIHkgYWwgaW1wbGVtZW50YXIgbGEgZnVuY2nDs24gZGUgJ2xtJywgdXNhZGEgcGFyYSBjcmVhciBhbsOhbGlzaXMgcmVncmVzaXZvcyB5IHByZWRpY3Rpdm9zLg0KDQoNCiMjIyMgTW9kZWxvcyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGU6IFByb2R1Y2Npw7NuIGRlIGNhcnTDs24gZW4gMjAyMiBwYXJhIEVzdGFkb3MgVW5pZG9zIHkgTcOpeGljbw0KDQojIyMgSW1wb3J0YXIgYmFzZSBkZSBkYXRvcyAoMykNCmJkNiA8LXJlYWQuY3N2KCJleHRlcm5hX2JkMyBjc3YzLmNzdiIpDQpzdW1tYXJ5KGJkNikNCg0Kc3VtKGlzLm5hKGJkNikpDQoNCnN1bW1hcnkoYmQ2KQ0Kc3RyKGJkNikNCg0KIyMjIE1vZGVsbyBkZSByZWdyZXNpw7NuIG3Dumx0aXBsZTogUHJvZHVjY2nDs24gZGUgY2FydMOzbiBlbiAyMDIyOiBNw6l4aWNvDQpyZWdyZXNpb24zIDwtIGxtKE1FWCB+IFVTQSArIEHDsW8sIGRhdGE9YmQ2KQ0Kc3VtbWFyeShyZWdyZXNpb24zKQ0KDQpyZWdyZXNpb24zIDwtIGxtKE1FWCB+IEHDsW8sIGRhdGE9YmQ2KQ0Kc3VtbWFyeShyZWdyZXNpb24zKQ0KDQpiZDYgPC0gZGF0YS5mcmFtZShBw7FvPTIwMjIsIFByb2R1Y2Npb249IDc0MDAwMCkNCnByZWRpY3QocmVncmVzaW9uMyxiZDYpDQoNCmdncGxvdChiZDYsIGFlcyh4PUHDsW8sIHk9UHJvZHVjY2lvbikpKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2xpbmUoYWVzKHk9UHJvZHVjY2lvbiksIGNvbG9yPSJyZWQiLCBsaW5ldHlwZT0iZGFzaGVkIikgKw0KICBnZW9tX2xpbmUoYWVzKHk9UHJvZHVjY2lvbiksIGNvbG9yPSJyZWQiLCBsaW5ldHlwZT0iZGFzaGVkIikgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIGZvcm11bGE9eX54LCBzZT1UUlVFLCBsZXZlbD0wLjk1LCBjb2w9J2JsdWUnLCBmaWxsPSdwaW5rMicpICsNCiAgdGhlbWVfbGlnaHQoKQ0KDQojIExhIHByZWRpY2Npw7NuIGFudGVyaW9yIG5vcyBhcnJvamEgcXVlIGhheSB1biBpbXBhY3RvIHBvc2l0aXZvIHkgc2lnbmlmaWNhdGl2byBlbnRyZSBsYSB2YXJpYWJsZSBBw7FvIHkgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUuIEVzdG8gc2lnbmlmaWNhIHF1ZSBoYXkgdW5hIHByZWRpY2Npw7NuIHBvc2l0aXZhIGRlIGNyZWNpbWllbnRvIGFjb3JkZSBhbCBhw7FvLg0KIyBEZSBhY3VlcmRvIGEgbGEgcHJvZHVjY2nDs24gdG90YWwgZ2VuZXJhZGEgcG9yIE3DqXhpY28gZGUgMjAxNiBhIDIwMjEgKDc0MCBNKSwgZWwgbW9kZWxvIHByb27Ds3N0aWNvIGVzdGltYSBxdWUgZW4gMjAyMiBwcm9kdWNpcsOhIDE0OSwxNzAuMy4gRW4gbGEgZ3LDoWZpY2EgcHJldmlhIHNlIG11ZXN0cmEgZWwgcHVudG8gZGUgcHJlZGljY2nDs24uIFNpIGFuYWxpemFtb3MgbGEgcHJvZHVjY2nDs24gZGUgMjAyMSBjb250cmEgZWwgcHJvbsOzc3RpY28gZGUgMjAyMiwgc2UgZXN0aW1hIHF1ZSBsYSBwcm9kdWNjacOzbiBtZXhpY2FuYSBkaXNtaW51aXLDoS4gUG9kZW1vcyBzdXBvbmVyIHF1ZSBlc3RvIHNlIGRlYmUgYSBsYSBkZWZpY2llbmNpYSBlbiBsYSBjYWRlbmEgZGUgc3VtaW5pc3RybyBnbG9iYWwsIGFzw60gY29tbyBmYWN0b3JlcyBlY29uw7NtaWNvcyBnbG9iYWxlcy4NCg0KDQojIyMjIE1vZGVsb3MgZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlOiBQcm9kdWNjacOzbiBkZSBjYXJ0w7NuIGVuIDIwMjIgcGFyYSBFc3RhZG9zIFVuaWRvcyB5IE3DqXhpY28NCg0KIyMjIEltcG9ydGFyIGJhc2UgZGUgZGF0b3MgKDMpDQpiZDYgPC1yZWFkLmNzdigiZXh0ZXJuYV9iZDMgY3N2My5jc3YiKQ0Kc3VtbWFyeShiZDYpDQoNCnN1bShpcy5uYShiZDYpKQ0KDQpzdW1tYXJ5KGJkNikNCnN0cihiZDYpDQoNCiMjIyMgTW9kZWxvcyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGU6IFByb2R1Y2Npw7NuIGRlIGNhcnTDs24gZW4gMjAyMjogRXN0YWRvcyBVbmlkb3MNCnJlZ3Jlc2lvbjIgPC0gbG0oVVNBIH4gTUVYICsgQcOxbywgZGF0YT1iZDYpDQpzdW1tYXJ5KHJlZ3Jlc2lvbjIpDQoNCnJlZ3Jlc2lvbjIgPC0gbG0oVVNBIH4gQcOxbywgZGF0YT1iZDYpDQpzdW1tYXJ5KHJlZ3Jlc2lvbjIpDQoNCmJkNiA8LSBkYXRhLmZyYW1lKEHDsW89MjAyMiwgUHJvZHVjY2lvbj0gMzIwMDAwKQ0KcHJlZGljdChyZWdyZXNpb24yLGJkNikNCg0KIyBQYXJhIGxhIHByZWRpY2Npw7NuIGRlIEVzdGFkb3MgVW5pZG9zLCB2ZW1vcyBxdWUgaGFicsOhIHVuIGluY3JlbWVudG8gZW4gbGEgcHJvZHVjY2nDs24gZGUgY2FydMOzbiBjb250cmEgMjAyMS4gU2luIGVtYmFyZ28sIGFsIGFuYWxpemFyIGxhIHByb2R1Y2Npw7NuIHRvdGFsIGRlIE3DqXhpY28gY29udHJhIGxhIHByb2R1Y2Npw7NuIHRvdGFsIGRlIEVzdGFkb3MgVW5pZG9zLCB2ZW1vcyBxdWUgbGEgbWV4aWNhbmEgZXMgbXVjaG8gbWF5b3IuIFBvZGVtb3Mgc3Vwb25lciBxdWUgZXN0byBzZSBkZWJlIGRlYmlkbyBhIGxhIG1hbm8gZGUgb2JyYSBlY29uw7NtaWNhIGRlbCBtZXJjYWRvIG1leGljYW5vLg0KDQojIERlIGFjdWVyZG8gYSBsYSBwcmVkaWNjacOzbiBhbnRlcmlvciwgc2UgdmUgdW4gaW5jcmVtZW50byBwb3NpdGl2byBwYXJhIGxhIHZhcmlhYmxlIE3DqXhpY28gY29uIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLCBhIGRpZmVyZW5jaWEgZGVsIGHDsW8gcXVlIG11ZXN0cmEgdW4gaW1wYWN0byBtZW5vciB5IG5lZ2F0aXZvLCBwZXJvIGlndWFsbWVudGUgc2lnbmlmaWNhdGl2by4NCg0KIyBQcmVkaWNjacOzbiBhZGljaW9uYWwNCmluZHVzdHJpYUEgPC1yZWFkLmNzdigiSW5kdXN0cmlhIEF1dG8uY3N2IikNCg0KYmQ2IDwtcmVhZC5jc3YoIkluZHVzdHJpYSBBdXRvLmNzdiIpDQoNCmJkNiA8LSBiZDZbLWMoMSksXQ0KDQpzdW1tYXJ5KGJkNikNCnN1bW1hcnkoaW5kdXN0cmlhQSkNCnN0cihpbmR1c3RyaWFBKQ0KDQpyZWdyZXNpb24xIDwtIGxtKHZlbnRhc19hdXRvcGFydGVzX2FudWFsIH4gIGVzdGFkbyArZXhwb3J0YWNpb25lc19hbnVhbCArIHBvYmxhY2lvbl9vY3VwYWRhX2Vuc2FtYmxhZG9yYV95ZWFyICxkYXRhID0gaW5kdXN0cmlhQSkNCnN1bW1hcnkocmVncmVzaW9uMSkNCg0KIyBFc3RlIGFuw6FsaXNpcyBhZGljaW9uYWwgbm9zIG11ZXN0cmEgZGF0b3MgcHJlZGljdGl2b3MgZW4gY3VhbnRvIGFsIGRlc2VtcGXDsW8gZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXouIExvcyBkYXRvcyBhbmFsbGl6YW4gZGVsIDIwMTQgYWwgMjAyMiB5IGV2YWzDumEgZWwgZGVzZW1wZcOxbyBkZSBsYSBpbmR1c3RyaWEgY29uc2lkZXJhbmRvIGV4cG9ydGFjaW9uZXMsIHBvYmxhY2nDs24gb2N1cGFkYSwgcHJvZHVjY2nDs24gYW51YWwgcG9yIGVzdGFkbywgZW50cmUgb3Ryb3MgcHVudG9zLiBFbiByZXN1bWVuLCBsYSBiYXNlIGRlIGRhdG9zIG5vcyBkaWNlIHF1ZSBoYXkgaW5mb3JtYWNpw7NuIHNpZ25pZmljYXRpdmEgZW4gZGlzdGludG9zIEVzdGFkb3MgZGUgbGEgUmVww7pibGljYS4gRW50cmUgbG9zIG3DoXMgc2lnbmlmaWNhdGl2b3Mgc2UgZW5jdWVudHJhbiBCYWphIENhbGlmb3JuaWEgeSBTYW4gTHVpcyBQb3Rvc8OtLiBQb2RlbW9zIGRlZHVjaXIgcXVlIGVzdG8gc2UgZGViZSBhIGxhIGFsdGEgaW5mdWVuY2lhIGVuIGluZHVzdHJpYSBxdWUgZXN0b3MgZXN0YWRvcyBtYW5lamFuIGEgbml2ZWwgbmFjaW9uYWwuDQpgYGANCg0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOmRhcmtvcmFuZ2UiPioqOC5CdXNpbmVzcyBBbmFseXRpY3MgeSBCdXNpbmVzcyBJbnRlbGxpZ2VuY2UqKiANCg0KYGBge3J9DQoNCiMgKsK/UXXDqSBlcyBCdXNpbmVzcyBBbmFseXRpY3M/Kg0KIyAgRXMgdW5hIGNvbWJpbmFjacOzbiBkZSBoYWJpbGlkYWRlcywgdGVjbm9sb2fDrWFzIHkgcHLDoWN0aWNhcyBwYXJhIGxhIGV4cGxvcmFjacOzbiBlIGludmVzdGlnYWNpw7NuIGRlbCBmdW5jaW9uYW1pZW50byB5IGxvcyBwcm9jZXNvcyBlbXByZXNhcmlhbGVzIHF1ZSBzZSBoYW4gdGVuaWRvIGFudGVyaW9ybWVudGUgcG9yIHVuIGVtcHJlc2EsIHBhcmEgZGUgZXNlIG1vZG8gb2J0ZW5lciBpbmZvcm1hY2nDs24sIHBvZGVyIGFuYWxpemFyIGRpY2hhIGluZm9ybWFjacOzbiBxdWUgc2UgZXh0cmFlIHkgYXPDrSBpbXB1bHNhciBsYSBwbGFuaWZpY2FjacOzbiBlc3RyYXTDqWdpY2EgZW1wcmVzYXJpYWwuIEJ1c2luZXNzIEFuYWx5dGljcyBwdWVkZSBkZXNjdWJyaXIgcGF0cm9uZXMgeSBwcmVkZWNpciB0ZW5kZW5jaWFzIGNvbnNpZGVyYW5kbyBkaWZlcmVudGVzIGZhY3RvcmVzLiANCg0KIyBFeGlzdGVuIGRpZmVyZW50ZXMgcnVicm9zIGRlbCAiQnVzaW5lc3MgQW5hbHl0aWNzIjoNCg0KIyAgMS4gQW7DoWxpc2lzIERlc2NyaXB0aXZvDQoNCiMgMi4gQW7DoWxpc2lzIGRlIERpYWduw7NzdGljbw0KDQojIDMuIEFuw6FsaXNpcyBQcmVkaWN0aXZvDQoNCiMgNC4gQW7DoWxpc2lzIFByZXNjcmlwdGl2bw0KDQojICrCv1F1w6kgZXMgQnVzaW5lc3MgQW5hbHl0aWNzPyoNCiMgIDEuIERldGVybWluYSBxdcOpIGNvbmp1bnRvcyBkZSBkYXRvcyBzb24gc2lnbmlmaWNhbnRlcyB5IMO6dGlsZXMgcGFyYSBwb2RlciBhbmFsaXphciB5IGNvbm9jZXIgZWwgZGVzZW1wZcOxbyBkZSBsYSBlbXByZXNhIHkgY3XDoWxlcyBwdWVkZW4gYXVtZW50YXIgbG9zIGluZ3Jlc29zIHkgZGlzbWludWlyIGxvcyBjb3N0b3MuIA0KDQojIC0gKkVqZW1wbG86KiBwcm9kdWN0aXZpZGFkIHkgZWZpY2VuY2lhLg0KDQojIDIuIEFuYWxpemFyIHkgdHJhbnNmb3JtYXIgbG9zIGRhdG9zIGVuIGluZm9ybWFjacOzbiDDunRpbCwgaWRlbnRpZmljYXIgeSBhbnRpY2lwYXIgdGVuZGVuY2lhcyB5IHJlc3VsdGFkb3MuIFNpbXBsaWZpY2FyIGluZm9ybWFjacOzbiBwYXJhIGhhY2VybGEgbcOhcyBzZW5jaWxsYSBkZSBlbnRlbmRlciB5IHZpc3VhbC4gIA0KDQojIDMuIFRvbWFyIGRlY2lzaW9uZXMgZW1wcmVzYXJpYWxlcyBtw6FzIGludGVsaWdlbnRlcyBiYXNhZGFzIGVuIGRhdG9zLg0KDQojIC0gKkVqZW1wbG86KiBBbsOhbGlzaXMgZGVsIGNvbXBvcnRhbWllbnRvIGRlIGxvcyBjbGllbnRlcywgZGlzbWludWNpw7NuIGRlIGNvc3RvLCBldml0YXIgbWVybWFzLCBhcHJvdmVjaGFtaWVudG8gZGUgdGllbXBvcyB5IG1hdGVyaWFsZXMsIGVmaWNpZW5jaWEgeSBlZmljYWNpYS4gDQoNCiMgX19GdWVudGU6IChHYWxpYW5hLCBQLiwgMjAyMilfXw0KDQojICrCv1F1w6kgZXMgQnVzaW5lc3MgSW50ZWxsaWdlbmNlPyoNCiMgMS4gTGEgY2FwYWNpZGFkIGRlIGFuYWxpemFyIGRlIGZvcm1hIGNvbWJpbmFkYSBpbmZvcm1hY2nDs24gaW50ZXJuYSB5IGV4dGVybmEgcHJvY2VkZW50ZSBkZSBkaXN0aW50YXMgZnVlbnRlcyB5IHNpc3RlbWFzLg0KDQojIDIuIFVuYSBtYXlvciBwcm9mdW5kaWRhZCBkZSBhbsOhbGlzaXMgeSB1bmEgY2FwYWNpZGFkIGFtcGxpYWRhIGRlIHJlcG9ydGVvLg0KDQojIDMuIExhIGNhcGFjaWRhZCBkZSByZWFsaXphciBwcm95ZWNjaW9uZXMgeSBwcm9uw7NzdGljb3MgZGUgZnV0dXJvIGVuIGJhc2UgYSB0b2RhIGVzYSBpbmZvcm1hY2nDs24uDQoNCiMgX19GdWVudGU6ICjCv1F1w6kgZXMgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIHkgY8OzbW8gZnVuY2lvbmE/IHwgSUJNLiwgMjAyMilfXw0KDQojICrCv0N1w6FsIGVzIGxhIHJlbGFjacOzbiBlbnRyZSBCdXNpbmVzcyBBbmFseXRpY3MgeSBCdXNpbmVzcyBJbnRlbGxpZ2VuY2U/Kg0KIyAgQkkgc2lydmUgcGFyYSBldmFsdWFyLCBvcHRpbWl6YXIgeSBjb29yZGluYXIgbGFzIG9wZXJhY2lvbmVzIGludGVybmFzIGRlIHVuYSBlbXByZXNhLiBUcmF0YSBkZSBhcHJvdmVjaGFyIHRvZG8gZWwgcG90ZW5jaWFsIGRlIGxvcyBkYXRvcyBxdWUgZ2VuZXJhIHVuYSBlbXByZXNhIGVuIHRvZGFzIHN1cyBhY3RpdmlkYWRlcyBkaWFyaWFzIHkgYW5hbGl6YXIgZXN0b3MgZGF0b3MgcGFyYSBvYnRlbmVyIGluZm9ybWFjacOzbiBkZSB2YWxvciBzb2JyZSBsYSB0b21hIGRlIGRlY2lzaW9uZXMuQXl1ZGEgcGFyYSBlbnRlbmRlciBlbCBoaXN0w7NyaWNvIHkgZWwgY29tbyBldm9sdWNpb25hbiBsb3MgZGF0b3MuIFkgY29tbyBtZW5jaW9uYW1vcyBhbnRlcmlvcm1lbnRlIEJ1c2luZXNzIEFuYWx5dGljcyBjb24gZWwgYW5hbGlzaXMgZGUgbGEgaW5mb3JtYWNpw7NuIGRlIHVuYSBlbXByZXNhIGxvZ3JhIHB1ZWRlIGxsZWdhciBhIGRlc3VicmlyIHBhdHJvbmVzLCBleHBsaWNhY2lvbmVzIGRlbCBwb3JxdWUgZGUgbG9zIG1pc21vcyB5IHByZWRlY2lyIHRlbmRlbmNpYXMgbyBoZWNob3MgcXVlIHB1ZWRlbiBsbGVnYXIgYSBwYXNhciBlbiBlbCBuZWdvY2lvLiANCg0KIyBFc3RvcyBkb3MgdMOpcm1pbm9zIHRpZW5lbiB1bmEgYWx0YSByZWxhY2nDs24gZW50cmUgZWxsYXMsIHlhIHF1ZSBlbiBwb2NhcyBwYWxhYnJhcyBsYSBJbnRlbGlnZW5jaWEgZGUgTmVnb2Npb3MgZXMgZWwgaGFjZXIgYW7DoWxpc2lzIGRlIGxvcyBkYXRvcyBvYnRlbmlkb3MgeSBBbmFsw610aWNhIGRlIE5lZ29jaW9zIGVzIHByZWRpY2Npw7NuIGEgcGFydGlyIGRlIGxvcyBkYXRvcyBxdWUgc2Ugb2J0dXZpZXJvbiBjb24gZWwgYW7DoWxpc2lzLiBVbmEgY29uIGxsZXZhIGEgbGEgb3RyYSB5IHRyYWJhamFuIGp1bnRhcyBwYXJhIG9idGVuZXIgZWwgcmVzdWx0YWRvIGJ1c2NhZG8gZGUgdW4gYW7DoWxpc2lzIGRlIGRhdG9zIHF1ZSBjb250ZW5nYSBsYSBpbmZvcm1hY2nDs24gcmVsZXZhbnRlIHkgc2lnbmlmaWNhdGl2YSBxdWUgbm9zIHB1ZWRhIG1vc3RyYXIgcHJlZGljY2lvbmVzIGRlbCBjb21wb3J0YW1pZW50bywgeWEgc2VhIGRlIGxhIGVtcHJlc2EsIGRlIGxhIGVjb25vbcOtYSwgZGUgbG9zIGluZ3Jlc29zLCBkZSBsb3MgY2xpZW50ZXMgeSBtw6FzLiBBbWJhcyBzb24gbmVjZXNhcmlhcyBwYXJhIGV4dHJhZXIgdW4gYnVlbiBhbsOhbGlzaXMgZGUgbGEgaW5mb3JtYWNpw7NuIGRlIHVuYSBlbXByZXNhLCB5YSBxdWUgdW5vIGFuYWxpemEgZG9zLCBsb3Mgb3JnYW5pemEgeSBleHRyYWUgYXF1ZWxsb3MgcmVsZXZhbnRlcyB5IGxhIG90cmEgcHVlZGUgbG9ncmFyIGxhcyBwZWRpY2Npb25lcyB5IGFuw6FsaXNpcy4NCmBgYA0KDQojIDxzcGFuIHN0eWxlID0gImNvbG9yOmRhcmtvcmFuZ2UiPioqOS4gS2V5IFBlcmZvcm1hbmNlIEluZGljYXRvcnMgKEtQSSdzKSoqIA0KDQpgYGB7cn0NCiMgKsK/UXXDqSBzb24gbG9zIEluZGljYWRvcmVzIENsYXZlIGRlIFJlbmRpbWllbnRvIChLUEkncyk/Kg0KDQojIFVuIEtQSSAoS2V5IFBlcmZvcm1hbmNlIEluZGljYXRvcikgZXMgdW5hIG3DqXRyaWNhIGN1YW50aXRhdGl2YSBxdWUgbXVlc3RyYSBjw7NtbyB0dSBlcXVpcG8gcHJvZ3Jlc2EgaGFjaWEgdHVzIG9iamV0aXZvcyBlbXByZXNhcmlhbGVzIG3DoXMgaW1wb3J0YW50ZXMuIEVzdG8gcHVlZGUgaXIgZGVzZGUgbGEgZXZhbHVhY2nDs24gZGUgdW4gcHJveWVjdG8gZXNwZWPDrWZpY28gaGFzdGEgZWwgcmVuZGltaWVudG8gZ2VuZXJhbCBkZSB1bmEgY29tcGHDscOtYSwgbG9ncmFuZG8gYXPDrSB0dXMgb2JqZXRpdm9zIGVzdHJhdMOpZ2ljb3MuDQoNCiMgX19GdWVudGU6IChCZWxsbywgRS4sIDIwMjEpX18NCg0KIyAqUHJvcHVlc3RhcyBkZSBtZWpvcmEgcGFyYSBGT1JNKg0KDQojICpSZWN1cnNvcyBIdW1hbm9zKg0KIyBQcm9wdWVzdGEgMS4gVmVtb3MgcXVlIHNlIHRpZW5lIHVuIG1heW9yIHBvcmNlbnRhamUgZGUgZW1wbGVhZGFzIGZlbWVuaW5hcywgcmVwcmVzZW50YW5kbyB1biA3MCUgZGUgbG9zIGVtcGxlYWRvcyB0b3RhbGVzLiBBZGljaW9uYWwsIG11Y2hvcyBkZSBsb3MgZW1wbGVhZG9zIHZpdmVuIGVuIGRvcyBlc3RhZG9zOiBOdWV2byBMZcOzbiB5IENvYWh1aWxhLCBkZWwgY3VhbCBkZXN0YWNhIHByaW5jaXBhbG1lbnRlIE51ZXZvIExlw7NuLiBTZSByZWNvbWllbmRhIGltcGxlbWVudGFyIHVuIGluZGljYWRvciBxdWUgbWlkYSBsYSByZXRlbmNpw7NuIGRlIHRhbGVudG8gcXVlIHNlIGVzdMOhIHRlbmllbmRvIGVuIGxhIGVtcHJlc2EgcGFyYSBjb25vY2VyIGxhIGVzdGFiaWxpZGFkIGxhYm9yYWwuIENvbW8gbXVlc3RyYSBsYSBiYXNlIGRlIGRhdG9zIGRlIGJhamFzLCBoYXkgdW5hIGFsdGEgcm90YWNpw7NuIHBvciBtb3Rpdm9zIGRpdmVyc29zIGF1bnF1ZSBubyBleGlzdGUgdW4gaW5kaWNhZG9yIGZpam8gcGFyYSBtZWRpciBlc3RhIHJvdGFjacOzbi4gRXMgZGUgYWx0byB2YWxvciBhcGxpY2FybG8gcGFyYSBwb2RlciBlbnRlbmRlciBsYXMgY2F1c2FzIHkgY8OzbW8gbWVqb3JhciBlbCBwcm9jZXNvLg0KIyBQcm9wdWVzdGEgMi4gUmVzcGVjdG8gYSBsb3MgcHVlc3RvcyBsYWJvcmFsZXMsIGV4aXN0ZW4gNjAgcGVyc29uYXMgZGVzZW1wZcOxw6FuZG9zZSBjb21vIOKAnGF5dWRhbnRlcyBnZW5lcmFsZXPigJ0uIEVzIGltcG9ydGFudGUgYW5hbGl6YXIgbGEgaW1wb3J0YW5jaWEgcXVlIHRpZW5lIGRpY2hvIHB1ZXN0byB5IGN1w6FsZXMgc29uIGxhcyBwb3NpYmlsaWRhZGVzIGRlIGNyZWNpbWllbnRvIGRlbnRybyBkZSBlc3RlLiBTZSBkZWJlIGNvbnNpZGVyYXIgbGEgZm9ybWEgZGUgaW1wbGVtZW50YXIgdW5hIGV2YWx1YWNpw7NuIGRlIGhhYmlsaWRhZGVzIHBhcmEgbG9zIGVtcGxlYWRvcyBxdWUgbGVzIHBlcm1pdGEgY3JlY2VyIGRlIG1hbmVyYSBvcmfDoW5pY2EgZGVudHJvIGRlIGxhIGVtcHJlc2EgeSBkZSBlc3RhIGZvcm1hLCBhdW1lbnRhciBlbCBwb3JjZW50YWplIGRlIHJldGVuY2nDs24gZGUgcGVyc29uYWwuDQoNCg0KIyAqRGVsaXZlcnkgUGVyZm9ybWFuY2UqDQojIFByb3B1ZXN0YSAxLiBDcmVhciB1biBwbGFuIGRlIGVudHJlZ2FzIGNvbiBtZW5vcyBkZSBkb3MgdnVlbHRhcywgeWEgcXVlIHNlIG1vc3Ryw7MgbWVub3MgZWZlY3RpdmEgbGEgdGVyY2VyYSwgbWFyY2FuZG8gbcOhcyB0YXJkYW56YXMgYSBsbyBsYXJnbyBkZWwgYW7DoWxpc2lzLg0KIyBQcm9wdWVzdGEgMi4gQ3JlYXIgdW4gcGxhbiBtZW5zdWFsIGNvbiBLUEkncyBkZSByYXBpZGV6IGRlIGVudHJlZ2FzIHBhcmEgdmVyIGVsIGZsdWpvIHBvciBtZXMgZGUgbG8gcXVlIGVzdMOhbiB0YXJkYW5kbyB5IHZlciBsYXMgYWNjaW9uZXMgZXNwZWPDrWZpY2FzIHBhcmEgbWl0aWdhciBlc2UgcmV0cmFzby4NCg0KDQojICpNZXJtYSoNCiMgUHJvcHVlc3RhIDEuIERlIGFjdWVyZG8gYWwgY8OhbGN1bG8gZGUgbWVybWEgdG90YWwsIHNlIGdlbmVyYXJvbiAxODUsNDI2IGtpbG9zIGRlIEVuZXJvIGEgU2VwdGllbWJyZSBkZWwgMjAyMi4gRW4gZWwgYW7DoWxpc2lzIHNlIG11ZXN0cmEgdW4gaW5jcmVtZW50byBkZSBwcm9kdWNjacOzbiBkZSBtZXJtYSBkZWwgNjAuMzQlLiBQb2RlbW9zIHN1cG9uZXIgcXVlIGVzdGUgaW5jcmVtZW50byBzZSBkZWJlIGFsIGF1bWVudG8gZGUgbGEgaW5kdXN0cmlhIGF1dG9tb3RyaXogZW4gcHJvZHVjY2nDs24sIGV4cG9ydGFjaW9uZXMgeSB2ZW50YXMgaW50ZXJuYXMgKEVsIEVjb25vbWlzdGEsIDIwMjIpLiBFc3RvIHBhcmEgRk9STSBzaWduaWZpY2Fyw61hIHF1ZSB0dXZpZXJvbiB1biBhdW1lbnRvIGVuIHBlZGlkb3MgeSBwb3IgZW5kZSwgaHVibyB1biBkZXNjdWlkbyBlbiBsb3MgcHJvY2Vzb3MgZGUgY2FsaWRhZCB5IHByb2R1Y2Npw7NuLiBDb21vIHByb3B1ZXN0YSBkZSBtZWpvcmEsIHNlIHN1Z2VyaXLDrWEgbGxldmFyIHVuIGNvbnRyb2wgcHVudHVhbCBkZWwgbWFuZWpvIGRlIG1lcmNhbmPDrWEgYSB0cmF2w6lzIGRlIHRlY25vbG9nw61hcyBkaWdpdGFsZXMuIEVzdG8gYSB0cmF2w6lzIGRlIHVuIGNvbnRyb2wgcHVudHVhbCBkZSBjdcOhbnRvIHNlIGVzdMOhIGRlc3BlcmRpY2lhbmRvIHBhcmEgY2FkYSBwcm9kdWN0byBvIGNsaWVudGUgeSBkZWZpbmlyIHVuIHZhbG9yIG3DoXhpbW8gZGUgbWVybWEgYSBwb2RlciBnZW5lcmFyLg0KIyBQcm9wdWVzdGEgMi4gQ29tbyBzZWd1bmRvIHBsYW4gZGUgYWNjacOzbiwgc2UgcmVjb21pZW5kYSBpZGVudGlmaWNhciBsYSBjYXVzYSBkZSBsYSBtZXJtYSwgZXMgZGVjaXIsIHNhYmVyIHF1w6kgcmVjdXJzb3Mgc2UgbWVybWFuLiBFc3RvIGNvbiBlbCBvYmpldGl2byBkZSBpZGVudGlmaWNhciBxdcOpIGVzIGxvIHF1ZSBnZW5lcmEgZXN0YSBww6lyZGlkYSB5IHRyYWJhamFyIHNvYnJlIGVsbGEgcGFyYSBldml0YXIgcXVlIHNlIHJlcGl0YS4NCg0KDQojICpQcm9kdWNjacOzbioNCiMgUHJvcHVlc3RhIDEuIFNlIHJlY29taWVuZGEgcmVhbGl6YXIgdW4gZXN0dWRpbyBlcmdvbsOzbWljbyBzb2JyZSBsYXMgZXN0YWNpb25lcyBkZSB0cmFiYWpvIGRlbCDDoXJlYSBkZSBwcm9kdWNjacOzbiBjb24gZWwgZmluIGRlIG1lam9yYXIgcGF1bGF0aXZhbWVudGUgZWwgcmVuZGltaWVudG8gZGUgbG9zIGNvbGFib3JhZG9yZXMgZW4gc3VzIGFjdGl2aWRhZGVzIGNvcnJlc3BvbmRpZW50ZXMuDQojIFByb3B1ZXN0YSAyLiBTZSByZWNvbWllbmRhIGVqZWN1dGFyIGVuY3Vlc3RhcyBwZXJpw7NkaWNhcyBhIGxvcyBjbGllbnRlcyBjb24gbGEgZmluYWxpZGFkIGRlIG9idGVuZXIgaW5mb3JtYWNpw7NuIGRlIHNhdGlzZmFjY2nDs24gY29uIHJlc3BlY3RvIGFsIHByb2R1Y3RvIGVudHJlZ2Fkby4gRGUgZXN0YSBtYW5lcmEsIGxhIGVtcHJlc2EgcG9kcsOhIHRvbWFyIGxhcyBhY2Npb25lcyBjb3JyZXNwb25kaWVudGVzIGNvbW8gcmVzcHVlc3RhIGRlIHVuYSBwb2zDrXRpY2EgZGUgbWVqb3JhIGNvbnRpbnVhLg0KDQojICpTY3JhcCoNCiMgUHJvcHVlc3RhIDEuIENvbiBsYSBpbnRlbmNpw7NuIGRlIHJlZHVjaXIgbG9zIGVycm9yZXMgZGUgbWFubyBkZSBvYnJhIGFsIG3DrW5pbW8sIHNlIHJlY29taWVuZGEgaW1wbGVtZW50YXIgdW4gbWFudWFsIGRlIGNhcGFjaXRhY2nDs24gcGFyYSBsb3MgZW1wbGVhZG9zIGRlbCDDoXJlYSBkZSBwcm9kdWNjacOzbiB5IGNhbGlkYWQgY29uIGVsIG9iamV0aXZvIGRlIGV2aXRhciBkZXNjdWlkb3MsIG5lZ2xpZ2VuY2lhcywgdXNvcyBpbmNvcnJlY3RvcyBvIGlycmVzcG9uc2FiaWxpZGFkZXMsIHBhcmEgcmVkdWNpciBlZmljYXptZW50ZSBlbCBkZXNwZXJkaWNpbyBkZSBtYXRlcmlhIHByaW1hLiBFc3RvIGxlIGRhcsOhIGEgRk9STSB1bmEgbWVqb3IgZXN0cmF0ZWdpYSBkZSBjb3N0b3MsIGFzw60gY29tbyByZWxhY2nDs24gY29uIGVsIGNhcGl0YWwgaHVtYW5vLCBwdWVzIHRlbmRyw6FuIG1lam9yZXMgaGVycmFtaWVudGFzIHBhcmEgdHJhdGFyIGVycm9yZXMgcHJvZHVjdGl2b3MgZSBpbmNyZW1lbnRhciBzdSBwcm9kdWN0aXZpZGFkIGEgdHJhdsOpcyBkZSBjYXBhY2l0YWNpw7NuIG3DoXMgZXNwZWNpYWxpemFkYS4NCiMgUHJvcHVlc3RhIDIuIFBhcmEgZXZpdGFyIGVsIGRlc3BlcmRpY2lvLCBzZSByZWNvbWllbmRhIHJlcGxhbnRlYXIgZWwgYWxtYWNlbmFtaWVudG8gZGUgc3RvY2ssIGVzdG8gY29uIGxhIGludGVuY2nDs24gZGUgbWVqb3JhciBlbCBlc3BhY2lvIGVuIHBpc28gcGFyYSBlbCBvcmRlbiBkZSBsb3MgbWF0ZXJpYWxlcyB5IG9wdGltaXphciBlbCBwcm9jZXNvIGRlIHByb2R1Y2Npw7NuIGNvbXBsZXRvLg0KYGBgDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ZGFya29yYW5nZSI+KioxMC4gSW5zaWdodHMqKiANCmBgYHtyfQ0KIyAqUmVjdXJzb3MgSHVtYW5vcyoNCiMgMS4gVmVtb3MgcXVlIHNlIHRpZW5lIHVuIG1heW9yIHBvcmNlbnRhamUgZGUgZW1wbGVhZGFzIGZlbWVuaW5hcywgcmVwcmVzZW50YW5kbyB1biA3MCUgZGUgbG9zIGVtcGxlYWRvcyB0b3RhbGVzLiBBZGljaW9uYWwsIG11Y2hvcyBkZSBsb3MgZW1wbGVhZG9zIHZpdmVuIGVuIGRvcyBlc3RhZG9zOiBOdWV2byBMZcOzbiB5IENvYWh1aWxhLCBkZWwgY3VhbCBkZXN0YWNhIHByaW5jaXBhbG1lbnRlIE51ZXZvIExlw7NuLg0KIyAyLiBFbCBzYWxhcmlvIGRpYXJpbyBwcm9tZWRpbyBkZSBGT1JNIGVzIGRlICQxODAgcGVzb3MgbWV4aWNhbm9zLCBlcyBkZWNpciwgJDUsNDAwIHBlc29zIG1lbnN1YWxlcy4gRGUgYWN1ZXJkbyBhIGRhdG9zIGNvbXBhcnRpZG9zIHBvciBsYSBJTkVHSSwgc2UgcHJldsOpIHF1ZSBwYXJhIDIwMjIgZWwgc2FsYXJpbyBtw61uaW1vIGVuIE3DqXhpY28gc2VhIGRlICQ1LDI1NSBwZXNvcyBtZW5zdWFsZXMuIEVzdG8gcmVmbGVqYSBxdWUgZWwgc2FsYXJpbyBtZW5zdWFsIGRlIEZPUk0gZXMgMiUgbWF5b3IgYWwgc2FsYXJpbyBtw61uaW1vIGRlbCBwYcOtcy4NCg0KIyAqRGVsaXZlcnkgUGVyZm9ybWFuY2UqDQojIDEuIE5vcyBtdWVzdHJhIHF1ZSBlbCBjbGllbnRlIHBvdGVuY2lhbCBlcyBIZWxsYSwgeWEgcXVlIGN1ZW50YSBjb24gbWF5b3JlcyBwZWRpZG9zIHkgZWwgc2VndW5kbyBsdWdhciBwYXJhIEZPUk0gZXMgVFJNWC4NCiMgMi4gU2UgYW5hbGl6w7MgcXVlIFNlcHRpZW1icmUgZXMgdW5vIGRlIGxvcyBtZXNlcyBmdWVydGVzIHBhcmEgbGEgZW1wcmVzYSBlbiBlc3RhIMOhcmVhLCB5YSBxdWUgc2UgaW5jcmVtZW50YXJvbiBsb3MgcGVkaWRvcyBlc3RhYmxlY2lkb3MuIA0KDQoNCiMgKk1lcm1hKg0KIyAxLiBTZXLDrWEgaW1wb3J0YW50ZSBjb25zaWRlcmFyIHF1ZSBwYXJhIHRlbmVyIHVuIGNhbWJpbyBzaWduaWZpY2F0aXZvLCBlcyBuZWNlc2FyaW8gZGFybGUgaW1wb3J0YW5jaWEgYWwgY29ycmVjdG8gYWxtYWNlbmFtaWVudG8gZGUgZGF0b3MgeSBwcm9jZXNhbWllbnRvIGRlIGxvcyBtaXNtb3MsIHB1ZXMgw6lzdGFzIHNvbiBsYXMgYmFzZXMgZGUgdW5hIMOhZ2lsIGludGVycHJldGFjacOzbiBkZSBkYXRvcywgZ2VuZXJhbmRvIGFzw60gdW5hIG1lam9yIHRvbWEgZGUgZGVjaXNpb25lcyB5IHBvciBlbmRlLCB1biBjb3JyZWN0byBtYW5lam8gZGUgbGEgaW5mb3JtYWNpw7NuLg0KIyAyLiBzZSBlc3TDoSBnZW5lcmFuZG8gdW5hIG1lcm1hIGlycmVndWxhci4gTG9zIGRhdG9zIG11ZXN0cmFuIHF1ZSBkZSBFbmVybyBhIEFicmlsIGh1Ym8gdW5hIG1lcm1hIGRlIDMgdG9uZWxhZGFzIHByb21lZGlvLiBEZSBBYnJpbCBhIEp1bGlvIHNlIGdlbmVyw7MgYWxyZWRlZG9yIGRlIDUgdG9uZWxhZGFzIHkgbGxlZ8OzIGEgZ2VuZXJhciBoYXN0YSA2IHRvbmVsYWRhcyB5IGRlIEp1bGlvIGEgT2N0dWJyZSBnZW5lcsOzIDMgdG9uZWxhZGFzIHByb21lZGlvLiBBdW5xdWUgZW4gdW4gbWVzIHNlIGxvZ3LDsyB0ZW5lciBtZW5vcyBkZSAxIHRvbmVsYWRhIGRlIG1lcm1hLg0KDQojICpQcm9kdWNjacOzbioNCiMgMS4gVmVtb3MgcXVlIGVsIGNsaWVudGUg4oCcVkwtMDE3LTE0MDg24oCdIGVzIGVsIHF1ZSBtZW5vcyBwcm9kdWN0byBjb21wcmEuIFNlIHJlY29taWVuZGEgYW5hbGl6YXIgcXXDqSB0YW50byBiZW5lZmljaW8gbm9zIGVzdMOhIGdlbmVyYW5kbyBjb250YXIgY29uIHVuIGNsaWVudGUgcXVlIMO6bmljYW1lbnRlIHBpZGUgdW5hIHBpZXphLg0KIyAyLiBTZSBhbmFsaXrDsyBxdWUgZW4gbGFzIGVzdGFjaW9uZXMgQzEgeSBDMiB0aWVuZW4gbGEgbWF5b3IgcHJvZHVjdGl2aWRhZCBkZWJpZG8gYSBxdWUgc29uIGxhcyBxdWUgbWVub3MgdGllbXBvIGhhY2VuIGNvbiBtw6FzIHByb2Nlc2FtaWVudG8gZGUgbMOhbWluYXMuIFBvciBsbyB0YW50bywgZXN0byBlcyB1bmEgdmVudGFqYSBxdWUgc2UgcG9kcsOtYSBhbmFsaXphciBlbiBlc3RhIGZhc2UgZGUgcHJvZHVjY2nDs24gcGFyYSBhcGxpY2FybGEgYSBsYXMgZGVtw6FzIMOhcmVhcy4NCg0KIyAqU2NyYXAqDQojIDEuIEVsIMOhcmVhIHF1ZSBtYXlvciBjYW50aWRhZCBkZSDigJhzY3JhcOKAmSB0b3RhbCBnZW5lcmEgZXMg4oCcU0FCL0NhbGlkYWQvRW50cmVnYSBkZSBQVOKAnSBhdW5xdWUgZGUgbWFuZXJhIGluZGl2aWR1YWwuDQojIDIuIExvcyBkYXRvcyBtdWVzdHJhbiBxdWUgaGF5IHVuIGFsdG8gbml2ZWwgZGUgY2hhdGFycmEgZ2VuZXJhZGEgcG9yIHBhcnRlIGRlbCDDoXJlYSBkZSBDYWxpZGFkL0VudHJlZ2EgZGUgUHJvZHVjdG8gVGVybWluYWRvLiBTZXLDrWEgbmVjZXNhcmlvIGlkZW50aWZpY2FyIGxhcyByYXpvbmVzIGRlIGVzdGUgZGVzcGVyZGljaW8geSBsYSBtYW5lcmEgZGUgcmVkdWNpciBlc3RlIGRlc2VjaG8gYWwgbcOtbmltby4NCg0KYGBgDQoNCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ZGFya29yYW5nZSI+KioxMS4gUmVmZXJlbmNpYXMqKiANCjkgRXN0aWxvcyB5IGZvcm1hdG9zIGRlIHRhYmxhIHwgVGFibGFzIHkgZ3JhZmljb3MgY29uIFIgeSBSIFN0dWRpby4gKDIwMjIpLiBSZXRyaWV2ZWQgMjQgU2VwdGVtYmVyIDIwMjIsIGZyb20gaHR0cHM6Ly90YWJsZXMuaW52ZXN0aWdhb25saW5lLmNvbS90c2UtZm9ybWF0ZW8uaHRtbA0KDQpBbmEgS2FyZW4gR2FyY8OtYS4gKDIwMjIsIFNlcHRlbWJlciA4KS4gSW5kdXN0cmlhIGF1dG9tb3RyaXogYW5vdGEgdW4gYnVlbiBhZ29zdG86IGNyZWNlbiBwcm9kdWNjacOzbiwgZXhwb3J0YWNpb25lcyB5IHZlbnRhcyBpbnRlcm5hcy4gRWwgRWNvbm9taXN0YTsgRWwgRWNvbm9taXN0YS4gaHR0cHM6Ly93d3cuZWxlY29ub21pc3RhLmNvbS5teC9lbXByZXNhcy9JbmR1c3RyaWEtYXV0b21vdHJpei1hbm90YS11bi1idWVuLWFnb3N0by1jcmVjZW4tcHJvZHVjY2lvbi1leHBvcnRhY2lvbmVzLXktdmVudGFzLWludGVybmFzLTIwMjIwOTA3LTAwMzEuaHRtbA0KDQpCZWxsbywgRS4gKDIwMjEpLiBRdcOpIHNvbiBsb3MgS1BJcyB5IGPDs21vIGZ1bmNpb25hbi4gVGhpbmtpbmcgRm9yIElubm92YXRpb24uIFJldHJpZXZlZCBmcm9tIGh0dHBzOi8vd3d3LmllYnNjaG9vbC5jb20vYmxvZy9xdWUtc29uLWxvcy1rcGlzLXktY29tby1hcGxpY2FybG9zLWEtdHUtZW1wcmVzYS1kaWdpdGFsLWJ1c2luZXNzLw0KDQpIZXJuw6FuZGV6LCBGLiwgJiBVc3VnYSwgTy4gKDIwMjIpLiA5IFRhYmxhcyBkZSBmcmVjdWVuY2lhIHwgTWFudWFsIGRlIFIuIFJldHJpZXZlZCAyNCBTZXB0ZW1iZXIgMjAyMiwgZnJvbSBodHRwczovL2ZoZXJuYW5iLmdpdGh1Yi5pby9NYW51YWwtZGUtUi90YWJsYXMuaHRtbCNlamVtcGxvLXRhYmxhLWRlLWZyZWN1ZW5jaWEtcmVsYXRpdmEtZGUtdW5hLXYlQzMlQURhDQoNCkdhbGlhbmEsIFAuICgyMDIyKS4gUXXDqSBlcyBCdXNpbmVzcyBBbmFseXRpY3M6IGRlZmluaWNpw7NuLHRpcG9zIHkgZGlmZXJlbmNpYXMuIFRoaW5raW5nIEZvciBJbm5vdmF0aW9uLiBSZXRyaWV2ZWQgZnJvbSBodHRwczovL3d3dy5pZWJzY2hvb2wuY29tL2Jsb2cvcXVlLWVzLWJ1c2luZXNzLWFuYWx5dGljcy1kZWZpbmljaW9udGlwb3MteS1kaWZlcmVuY2lhcy1iaWctZGF0YS8NCg0KR3VsemFyLCBNLiAoMjAyMiwgNiBlbmVybykuIEstTWVhbnMgQ2x1c3RlcmluZzogQ29uY2VwdHMgYW5kIEltcGxlbWVudGF0aW9uIGluIFIgZm9yIERhdGEgU2NpZW5jZS4gTWVkaXVtLiBSZWN1cGVyYWRvIDEwIGRlIG9jdHVicmUgZGUgMjAyMiwgZGUgaHR0cHM6Ly90b3dhcmRzZGF0YXNjaWVuY2UuY29tL2stbWVhbnMtY2x1c3RlcmluZy1jb25jZXB0cy1hbmQtaW1wbGVtZW50YXRpb24taW4tci1mb3ItZGF0YS1zY2llbmNlLTMyY2FlNmEzY2ViYQ0KDQpHdWx6YXIsIE0uICgyMDIyYiwgZW5lcm8gNikuIEstTWVhbnMgQ2x1c3RlcmluZzogQ29uY2VwdHMgYW5kIEltcGxlbWVudGF0aW9uIGluIFIgZm9yIERhdGEgU2NpZW5jZS4gTWVkaXVtLiBSZWN1cGVyYWRvIDEwIGRlIG9jdHVicmUgZGUgMjAyMiwgZGUgaHR0cHM6Ly90b3dhcmRzZGF0YXNjaWVuY2UuY29tL2stbWVhbnMtY2x1c3RlcmluZy1jb25jZXB0cy1hbmQtaW1wbGVtZW50YXRpb24taW4tci1mb3ItZGF0YS1zY2llbmNlLTMyY2FlNmEzY2ViYQ0KDQrCv1F1w6kgZXMgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIHkgY8OzbW8gZnVuY2lvbmE/IHwgSUJNLiAoMjAyMikuIFJldHJpZXZlZCAxMyBPY3RvYmVyIDIwMjIsIGZyb20gaHR0cHM6Ly93d3cuaWJtLmNvbS9teC1lcy90b3BpY3MvYnVzaW5lc3MtaW50ZWxsaWdlbmNlDQoNClpodSwgQS4gKDIwMjIsIDEyIGFnb3N0bykuIEstTWVhbnMgQ2x1c3RlcmluZyBFeHBsYWluZWQgU2ltcGx5IC0gVG93YXJkcyBEYXRhIFNjaWVuY2UuIE1lZGl1bS4gUmVjdXBlcmFkbyAxMCBkZSBvY3R1YnJlIGRlIDIwMjIsIGRlIGh0dHBzOi8vdG93YXJkc2RhdGFzY2llbmNlLmNvbS9leHBsYWluLW1sLWluLWEtc2ltcGxlLXdheS1rLW1lYW5zLWNsdXN0ZXJpbmctZTkyNWQwMTk3NDNiDQo=