Entregable 2.4

Insertar y entender la base de datos

producciondata <- read.csv("/Users/ivannagarza/Desktop/TEC/7 SEMESTRE/RETO/producción de cartón Agosto.csv")
summary(producciondata)
##       No.           CLIENTE            ID.FORM            PRODUCTO        
##  Min.   :  1.00   Length:2681        Length:2681        Length:2681       
##  1st Qu.: 25.00   Class :character   Class :character   Class :character  
##  Median : 50.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 51.25                                                           
##  3rd Qu.: 76.00                                                           
##  Max.   :125.00                                                           
##  NA's   :8                                                                
##       X             PIEZAS.PROG.        TMO..MIN.           HR..FIN         
##  Length:2681        Length:2681        Length:2681        Length:2681       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  ESTACION.ARRANQUE  Laminas.procesadas INICIO.SEP.UP      FIN.INICIO.DE.SEP.UP
##  Length:2681        Length:2681        Length:2681        Length:2681         
##  Class :character   Class :character   Class :character   Class :character    
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character    
##                                                                               
##                                                                               
##                                                                               
##                                                                               
##  INICIO.de.PROCESO  FIN.de.PROCESO     TIEMPO.CALIDAD  TIEMPO.MATERIALES
##  Length:2681        Length:2681        Min.   : 0.00   Min.   : 0.000   
##  Class :character   Class :character   1st Qu.: 0.00   1st Qu.: 0.000   
##  Mode  :character   Mode  :character   Median : 0.00   Median : 1.000   
##                                        Mean   : 2.17   Mean   : 1.526   
##                                        3rd Qu.: 1.00   3rd Qu.: 1.000   
##                                        Max.   :48.00   Max.   :50.000   
##                                        NA's   :2234    NA's   :2565     
##  MERMAS.Maquinas.
##  Mode:logical    
##  NA's:2681       
##                  
##                  
##                  
##                  
## 

Número de variable y registros

library (psych)
str(producciondata)
## 'data.frame':    2681 obs. of  17 variables:
##  $ No.                 : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ CLIENTE             : chr  "VARROC" "VARROC" "VARROC" "DENSO" ...
##  $ ID.FORM             : chr  "VL-017-13938" "VL-017-13936" "VL-017-14729" "" ...
##  $ PRODUCTO            : chr  "763 . KIT. CAJA." "747 KIT. CAJA HSC. ( 2 Partes)" "747 KIT. TAPA." "TOYOTA. MCV. Insterto D 2R. CORTE. 1 Golpe = 12 piezas. ( 9 Pza. / Celda)." ...
##  $ X                   : chr  "" "" "" "" ...
##  $ PIEZAS.PROG.        : chr  "199" "57" "68" "192" ...
##  $ TMO..MIN.           : chr  "15" "10" "10" "15" ...
##  $ HR..FIN             : chr  "9:15" "9:25" "9:35" "9:50" ...
##  $ ESTACION.ARRANQUE   : chr  "C1" "C1Y2" "C1Y2" "C1" ...
##  $ Laminas.procesadas  : chr  "201" "116" "69" "49" ...
##  $ INICIO.SEP.UP       : chr  "9:00" "9:26" "10:02" "10:12" ...
##  $ FIN.INICIO.DE.SEP.UP: chr  "9:12" "9:31" "10:09" "10.17" ...
##  $ INICIO.de.PROCESO   : chr  "9:13" "9:32" "10:09" "10:18" ...
##  $ FIN.de.PROCESO      : chr  "9:26" "9:53" "10.12" "10:20" ...
##  $ TIEMPO.CALIDAD      : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ TIEMPO.MATERIALES   : int  NA NA NA NA NA 3 NA NA NA NA ...
##  $ MERMAS.Maquinas.    : logi  NA NA NA NA NA NA ...
describe(producciondata)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
##                       vars    n   mean     sd median trimmed    mad min  max
## No.                      1 2673  51.25  30.50     50   50.46  37.06   1  125
## CLIENTE*                 2 2681   6.48   2.72      6    6.49   2.97   1   11
## ID.FORM*                 3 2681 115.11  73.37    120  112.96  94.89   1  257
## PRODUCTO*                4 2681 165.39  94.69    162  166.57 114.16   1  322
## X*                       5 2681  87.85  68.59     70   82.85  96.37   1  242
## PIEZAS.PROG.*            6 2681  12.26  10.62     11   11.07  14.83   1   49
## TMO..MIN.*               7 2681  52.68  54.39     36   45.17  51.89   1  169
## HR..FIN*                 8 2681  78.54  14.70     82   80.75  11.86   1   91
## ESTACION.ARRANQUE*       9 2681 100.31 115.11     49   84.58  71.16   1  349
## Laminas.procesadas*     10 2681 100.24 153.38      3   69.85   2.97   1  490
## INICIO.SEP.UP*          11 2681 100.60 157.57      2   68.18   1.48   1  508
## FIN.INICIO.DE.SEP.UP*   12 2681 183.09 207.87     92  157.10 134.92   1  617
## INICIO.de.PROCESO*      13 2681 184.17 207.67    101  156.24 148.26   1  628
## FIN.de.PROCESO*         14 2681   5.96  14.86      3    2.43   0.00   1  106
## TIEMPO.CALIDAD          15  447   2.17   5.55      0    0.76   0.00   0   48
## TIEMPO.MATERIALES       16  116   1.53   4.84      1    0.78   1.48   0   50
## MERMAS.Maquinas.        17    0    NaN     NA     NA     NaN     NA Inf -Inf
##                       range  skew kurtosis   se
## No.                     124  0.17    -1.01 0.59
## CLIENTE*                 10  0.16    -0.76 0.05
## ID.FORM*                256  0.12    -1.10 1.42
## PRODUCTO*               321 -0.03    -1.17 1.83
## X*                      241  0.44    -0.87 1.32
## PIEZAS.PROG.*            48  0.66    -0.32 0.21
## TMO..MIN.*              168  0.94    -0.36 1.05
## HR..FIN*                 90 -2.97    12.04 0.28
## ESTACION.ARRANQUE*      348  0.79    -0.80 2.22
## Laminas.procesadas*     489  1.31     0.19 2.96
## INICIO.SEP.UP*          507  1.36     0.36 3.04
## FIN.INICIO.DE.SEP.UP*   616  0.73    -0.95 4.01
## INICIO.de.PROCESO*      627  0.77    -0.82 4.01
## FIN.de.PROCESO*         105  4.33    18.90 0.29
## TIEMPO.CALIDAD           48  4.26    22.60 0.26
## TIEMPO.MATERIALES        50  8.77    84.03 0.45
## MERMAS.Maquinas.       -Inf    NA       NA   NA

La base de datos tiene 2,681 registros y 17 variables.

Técnicas de limpieza

Técnica 1. Remover valores irrelevantes

Eliminar columnas

producciondata <- subset (producciondata,select = -c(No., ID.FORM , X , ESTACION.ARRANQUE , INICIO.SEP.UP , FIN.INICIO.DE.SEP.UP , INICIO.de.PROCESO , FIN.de.PROCESO , TIEMPO.MATERIALES , MERMAS.Maquinas. , HR..FIN , PRODUCTO  ))
summary (producciondata)
##    CLIENTE          PIEZAS.PROG.        TMO..MIN.         Laminas.procesadas
##  Length:2681        Length:2681        Length:2681        Length:2681       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  TIEMPO.CALIDAD 
##  Min.   : 0.00  
##  1st Qu.: 0.00  
##  Median : 0.00  
##  Mean   : 2.17  
##  3rd Qu.: 1.00  
##  Max.   :48.00  
##  NA's   :2234

Técnica 2. Convertir de caracter a entero

library (tibble)
producciondata$PIEZAS.PROG. <- substr(producciondata$PIEZAS.PROG., start = 1, stop = 2)
tibble (producciondata)
## # A tibble: 2,681 × 5
##    CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas TIEMPO.CALIDAD
##    <chr>   <chr>        <chr>     <chr>                       <int>
##  1 VARROC  19           15        201                             1
##  2 VARROC  57           10        116                             1
##  3 VARROC  68           10        69                              1
##  4 DENSO   19           15        49                              1
##  5 DENSO   19           15        49                              1
##  6 YANFENG 40           30        801                             1
##  7 YANFENG 80           15        41                              1
##  8 YANFENG 10           15        53                              1
##  9 YANFENG 10           15        53                              1
## 10 YANFENG 16           20        55                              1
## # … with 2,671 more rows
producciondata$PIEZAS.PROG. <- as.integer(producciondata$PIEZAS.PROG.)
## Warning: NAs introduced by coercion
str(producciondata)    
## 'data.frame':    2681 obs. of  5 variables:
##  $ CLIENTE           : chr  "VARROC" "VARROC" "VARROC" "DENSO" ...
##  $ PIEZAS.PROG.      : int  19 57 68 19 19 40 80 10 10 16 ...
##  $ TMO..MIN.         : chr  "15" "10" "10" "15" ...
##  $ Laminas.procesadas: chr  "201" "116" "69" "49" ...
##  $ TIEMPO.CALIDAD    : int  1 1 1 1 1 1 1 1 1 1 ...
producciondata$TMO..MIN. <- substr(producciondata$TMO..MIN., start = 1, stop = 2)
tibble (producciondata)
## # A tibble: 2,681 × 5
##    CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas TIEMPO.CALIDAD
##    <chr>          <int> <chr>     <chr>                       <int>
##  1 VARROC            19 15        201                             1
##  2 VARROC            57 10        116                             1
##  3 VARROC            68 10        69                              1
##  4 DENSO             19 15        49                              1
##  5 DENSO             19 15        49                              1
##  6 YANFENG           40 30        801                             1
##  7 YANFENG           80 15        41                              1
##  8 YANFENG           10 15        53                              1
##  9 YANFENG           10 15        53                              1
## 10 YANFENG           16 20        55                              1
## # … with 2,671 more rows
producciondata$TMO..MIN. <- as.integer(producciondata$TMO..MIN.)
## Warning: NAs introduced by coercion
str(producciondata)  
## 'data.frame':    2681 obs. of  5 variables:
##  $ CLIENTE           : chr  "VARROC" "VARROC" "VARROC" "DENSO" ...
##  $ PIEZAS.PROG.      : int  19 57 68 19 19 40 80 10 10 16 ...
##  $ TMO..MIN.         : int  15 10 10 15 15 30 15 15 15 20 ...
##  $ Laminas.procesadas: chr  "201" "116" "69" "49" ...
##  $ TIEMPO.CALIDAD    : int  1 1 1 1 1 1 1 1 1 1 ...
producciondata$Laminas.procesadas <- substr(producciondata$Laminas.procesadas, start = 1, stop = 2)
tibble (producciondata)
## # A tibble: 2,681 × 5
##    CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas TIEMPO.CALIDAD
##    <chr>          <int>     <int> <chr>                       <int>
##  1 VARROC            19        15 20                              1
##  2 VARROC            57        10 11                              1
##  3 VARROC            68        10 69                              1
##  4 DENSO             19        15 49                              1
##  5 DENSO             19        15 49                              1
##  6 YANFENG           40        30 80                              1
##  7 YANFENG           80        15 41                              1
##  8 YANFENG           10        15 53                              1
##  9 YANFENG           10        15 53                              1
## 10 YANFENG           16        20 55                              1
## # … with 2,671 more rows
producciondata$Laminas.procesadas <- as.integer(producciondata$Laminas.procesadas)
## Warning: NAs introduced by coercion
str(producciondata) 
## 'data.frame':    2681 obs. of  5 variables:
##  $ CLIENTE           : chr  "VARROC" "VARROC" "VARROC" "DENSO" ...
##  $ PIEZAS.PROG.      : int  19 57 68 19 19 40 80 10 10 16 ...
##  $ TMO..MIN.         : int  15 10 10 15 15 30 15 15 15 20 ...
##  $ Laminas.procesadas: int  20 11 69 49 49 80 41 53 53 55 ...
##  $ TIEMPO.CALIDAD    : int  1 1 1 1 1 1 1 1 1 1 ...
producciondata$TIEMPO.CALIDAD <- substr(producciondata$TIEMPO.CALIDAD, start = 1, stop = 2)
tibble (producciondata)
## # A tibble: 2,681 × 5
##    CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas TIEMPO.CALIDAD
##    <chr>          <int>     <int>              <int> <chr>         
##  1 VARROC            19        15                 20 1             
##  2 VARROC            57        10                 11 1             
##  3 VARROC            68        10                 69 1             
##  4 DENSO             19        15                 49 1             
##  5 DENSO             19        15                 49 1             
##  6 YANFENG           40        30                 80 1             
##  7 YANFENG           80        15                 41 1             
##  8 YANFENG           10        15                 53 1             
##  9 YANFENG           10        15                 53 1             
## 10 YANFENG           16        20                 55 1             
## # … with 2,671 more rows
producciondata$TIEMPO.CALIDAD <- as.integer(producciondata$TIEMPO.CALIDAD)
str(producciondata) 
## 'data.frame':    2681 obs. of  5 variables:
##  $ CLIENTE           : chr  "VARROC" "VARROC" "VARROC" "DENSO" ...
##  $ PIEZAS.PROG.      : int  19 57 68 19 19 40 80 10 10 16 ...
##  $ TMO..MIN.         : int  15 10 10 15 15 30 15 15 15 20 ...
##  $ Laminas.procesadas: int  20 11 69 49 49 80 41 53 53 55 ...
##  $ TIEMPO.CALIDAD    : int  1 1 1 1 1 1 1 1 1 1 ...

Técnica 3. Valores faltantes

¿Cuántos NA tengo en la base de datos?

sum(is.na(producciondata))
## [1] 5983

¿Cuántos NA tengo por variable?

sapply(producciondata, function(x) sum (is.na(x)))
##            CLIENTE       PIEZAS.PROG.          TMO..MIN. Laminas.procesadas 
##                  0                715               1744               1290 
##     TIEMPO.CALIDAD 
##               2234

Borrar todos los registros NA de una tabla

producciondata <- na.omit(producciondata)
summary(producciondata)   
##    CLIENTE           PIEZAS.PROG.     TMO..MIN.     Laminas.procesadas
##  Length:137         Min.   :10.00   Min.   :10.00   Min.   : 0.0      
##  Class :character   1st Qu.:10.00   1st Qu.:10.00   1st Qu.:10.0      
##  Mode  :character   Median :20.00   Median :12.00   Median :16.0      
##                     Mean   :22.74   Mean   :18.82   Mean   :20.9      
##                     3rd Qu.:25.00   3rd Qu.:25.00   3rd Qu.:27.0      
##                     Max.   :80.00   Max.   :70.00   Max.   :97.0      
##  TIEMPO.CALIDAD  
##  Min.   : 0.000  
##  1st Qu.: 1.000  
##  Median : 1.000  
##  Mean   : 3.117  
##  3rd Qu.: 3.000  
##  Max.   :48.000
sum(is.na(producciondata))
## [1] 0

Número de registros y variables

str(producciondata)
## 'data.frame':    137 obs. of  5 variables:
##  $ CLIENTE           : chr  "VARROC" "VARROC" "VARROC" "DENSO" ...
##  $ PIEZAS.PROG.      : int  19 57 68 19 19 40 80 10 10 16 ...
##  $ TMO..MIN.         : int  15 10 10 15 15 30 15 15 15 20 ...
##  $ Laminas.procesadas: int  20 11 69 49 49 80 41 53 53 55 ...
##  $ TIEMPO.CALIDAD    : int  1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "na.action")= 'omit' Named int [1:2544] 29 30 31 32 33 34 35 36 37 38 ...
##   ..- attr(*, "names")= chr [1:2544] "29" "30" "31" "32" ...

La base de datos contiene 137 registros y 5 variables

Tipos de variables existentes

Variable<-c("`Cliente`","`Piezas programadas`","`Tiempo Mínimo`","`Láminas procesadas`","`Tiempo Calidad`")
Type<-c("cualitativa (nominal)", "cuantitativa (discreta)", "cuantitativa (continua)", "cuantitativa (discreta)", "cuantitativa (continua)" ) 
table<-data.frame(Variable,Type)
knitr::kable(table)
Variable Type
Cliente cualitativa (nominal)
Piezas programadas cuantitativa (discreta)
Tiempo Mínimo cuantitativa (continua)
Láminas procesadas cuantitativa (discreta)
Tiempo Calidad cuantitativa (continua)

Visualización

table (producciondata$CLIENTE)
## 
##                DENSO                HELLA MERIDIAN LIGHTWEIGHT 
##                   11                    4                    3 
##           STABILUS 1           STABILUS 3          STABILUS 3. 
##                   35                   17                    1 
##                 TRMX               VARROC              YANFENG 
##                    8                   14                   44
library (ggplot2)
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
ggplot(producciondata, aes(x=CLIENTE, y=TIEMPO.CALIDAD)) +
  geom_bar(stat="identity", fill="orange") + scale_fill_grey() + # Add bars to the plot
  labs(title = "Relación de Cliente y Tiempo de calidad", # Add a title
       subtitle = "RH empresa FORM", # Add a subtitle
       caption = "Relación", # Add a caption
       x = "Cliente")

boxplot(producciondata$Laminas.procesadas, producciondata$TMO..MIN. , vertical = TRUE)

LS0tCnRpdGxlOiAiUHJvZHVjY2nDs25fQ2FydG9uX0ZPUk0iCmF1dGhvcjogIkl2YW5uYSBHYXJ6YSIKZGF0ZTogIjIwMjItMDktMjUiCm91dHB1dDogCiBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAKLS0tCiMgRW50cmVnYWJsZSAyLjQKCiMjICBJbnNlcnRhciB5IGVudGVuZGVyIGxhIGJhc2UgZGUgZGF0b3MgCmBgYHtyfQpwcm9kdWNjaW9uZGF0YSA8LSByZWFkLmNzdigiL1VzZXJzL2l2YW5uYWdhcnphL0Rlc2t0b3AvVEVDLzcgU0VNRVNUUkUvUkVUTy9wcm9kdWNjaW/MgW4gZGUgY2FydG/MgW4gQWdvc3RvLmNzdiIpCnN1bW1hcnkocHJvZHVjY2lvbmRhdGEpCmBgYAoKIyMgTsO6bWVybyBkZSB2YXJpYWJsZSB5IHJlZ2lzdHJvcyAKYGBge3J9CmxpYnJhcnkgKHBzeWNoKQpzdHIocHJvZHVjY2lvbmRhdGEpCmRlc2NyaWJlKHByb2R1Y2Npb25kYXRhKQpgYGAKKipMYSBiYXNlIGRlIGRhdG9zIHRpZW5lIDIsNjgxIHJlZ2lzdHJvcyB5IDE3IHZhcmlhYmxlcy4qKgoKIyMgVMOpY25pY2FzIGRlIGxpbXBpZXphIAoKIyMjIFTDqWNuaWNhIDEuIFJlbW92ZXIgdmFsb3JlcyBpcnJlbGV2YW50ZXMgCgoqKkVsaW1pbmFyIGNvbHVtbmFzKioKYGBge3J9CnByb2R1Y2Npb25kYXRhIDwtIHN1YnNldCAocHJvZHVjY2lvbmRhdGEsc2VsZWN0ID0gLWMoTm8uLCBJRC5GT1JNICwgWCAsIEVTVEFDSU9OLkFSUkFOUVVFICwgSU5JQ0lPLlNFUC5VUCAsIEZJTi5JTklDSU8uREUuU0VQLlVQICwgSU5JQ0lPLmRlLlBST0NFU08gLCBGSU4uZGUuUFJPQ0VTTyAsIFRJRU1QTy5NQVRFUklBTEVTICwgTUVSTUFTLk1hcXVpbmFzLiAsIEhSLi5GSU4gLCBQUk9EVUNUTyAgKSkKc3VtbWFyeSAocHJvZHVjY2lvbmRhdGEpCmBgYAoKCiMjIyBUw6ljbmljYSAyLiBDb252ZXJ0aXIgZGUgY2FyYWN0ZXIgYSBlbnRlcm8KYGBge3J9CmxpYnJhcnkgKHRpYmJsZSkKcHJvZHVjY2lvbmRhdGEkUElFWkFTLlBST0cuIDwtIHN1YnN0cihwcm9kdWNjaW9uZGF0YSRQSUVaQVMuUFJPRy4sIHN0YXJ0ID0gMSwgc3RvcCA9IDIpCnRpYmJsZSAocHJvZHVjY2lvbmRhdGEpCnByb2R1Y2Npb25kYXRhJFBJRVpBUy5QUk9HLiA8LSBhcy5pbnRlZ2VyKHByb2R1Y2Npb25kYXRhJFBJRVpBUy5QUk9HLikKc3RyKHByb2R1Y2Npb25kYXRhKSAgICAKYGBgCgpgYGB7cn0KcHJvZHVjY2lvbmRhdGEkVE1PLi5NSU4uIDwtIHN1YnN0cihwcm9kdWNjaW9uZGF0YSRUTU8uLk1JTi4sIHN0YXJ0ID0gMSwgc3RvcCA9IDIpCnRpYmJsZSAocHJvZHVjY2lvbmRhdGEpCnByb2R1Y2Npb25kYXRhJFRNTy4uTUlOLiA8LSBhcy5pbnRlZ2VyKHByb2R1Y2Npb25kYXRhJFRNTy4uTUlOLikKc3RyKHByb2R1Y2Npb25kYXRhKSAgCmBgYAoKYGBge3J9CnByb2R1Y2Npb25kYXRhJExhbWluYXMucHJvY2VzYWRhcyA8LSBzdWJzdHIocHJvZHVjY2lvbmRhdGEkTGFtaW5hcy5wcm9jZXNhZGFzLCBzdGFydCA9IDEsIHN0b3AgPSAyKQp0aWJibGUgKHByb2R1Y2Npb25kYXRhKQpwcm9kdWNjaW9uZGF0YSRMYW1pbmFzLnByb2Nlc2FkYXMgPC0gYXMuaW50ZWdlcihwcm9kdWNjaW9uZGF0YSRMYW1pbmFzLnByb2Nlc2FkYXMpCnN0cihwcm9kdWNjaW9uZGF0YSkgCmBgYAoKYGBge3J9CnByb2R1Y2Npb25kYXRhJFRJRU1QTy5DQUxJREFEIDwtIHN1YnN0cihwcm9kdWNjaW9uZGF0YSRUSUVNUE8uQ0FMSURBRCwgc3RhcnQgPSAxLCBzdG9wID0gMikKdGliYmxlIChwcm9kdWNjaW9uZGF0YSkKcHJvZHVjY2lvbmRhdGEkVElFTVBPLkNBTElEQUQgPC0gYXMuaW50ZWdlcihwcm9kdWNjaW9uZGF0YSRUSUVNUE8uQ0FMSURBRCkKc3RyKHByb2R1Y2Npb25kYXRhKSAKYGBgCgojIyMgVMOpY25pY2EgMy4gVmFsb3JlcyBmYWx0YW50ZXMgCioqwr9DdcOhbnRvcyBOQSB0ZW5nbyBlbiBsYSBiYXNlIGRlIGRhdG9zPyoqCmBgYHtyfQpzdW0oaXMubmEocHJvZHVjY2lvbmRhdGEpKQpgYGAKCgoqKsK/Q3XDoW50b3MgTkEgdGVuZ28gcG9yIHZhcmlhYmxlPyoqCmBgYHtyfQpzYXBwbHkocHJvZHVjY2lvbmRhdGEsIGZ1bmN0aW9uKHgpIHN1bSAoaXMubmEoeCkpKQpgYGAKCgoqKkJvcnJhciB0b2RvcyBsb3MgcmVnaXN0cm9zIE5BIGRlIHVuYSB0YWJsYSoqCmBgYHtyfQpwcm9kdWNjaW9uZGF0YSA8LSBuYS5vbWl0KHByb2R1Y2Npb25kYXRhKQpzdW1tYXJ5KHByb2R1Y2Npb25kYXRhKSAgIApzdW0oaXMubmEocHJvZHVjY2lvbmRhdGEpKQpgYGAKCiMjIE7Dum1lcm8gZGUgcmVnaXN0cm9zIHkgdmFyaWFibGVzIApgYGB7cn0Kc3RyKHByb2R1Y2Npb25kYXRhKQpgYGAKKipMYSBiYXNlIGRlIGRhdG9zIGNvbnRpZW5lIDEzNyByZWdpc3Ryb3MgeSA1IHZhcmlhYmxlcyoqCgojIyBUaXBvcyBkZSB2YXJpYWJsZXMgZXhpc3RlbnRlcyAKYGBge3J9ClZhcmlhYmxlPC1jKCJgQ2xpZW50ZWAiLCJgUGllemFzIHByb2dyYW1hZGFzYCIsImBUaWVtcG8gTcOtbmltb2AiLCJgTMOhbWluYXMgcHJvY2VzYWRhc2AiLCJgVGllbXBvIENhbGlkYWRgIikKVHlwZTwtYygiY3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgImN1YW50aXRhdGl2YSAoZGlzY3JldGEpIiwgImN1YW50aXRhdGl2YSAoY29udGludWEpIiwgImN1YW50aXRhdGl2YSAoZGlzY3JldGEpIiwgImN1YW50aXRhdGl2YSAoY29udGludWEpIiApIAp0YWJsZTwtZGF0YS5mcmFtZShWYXJpYWJsZSxUeXBlKQprbml0cjo6a2FibGUodGFibGUpCmBgYAoKIyBWaXN1YWxpemFjacOzbiAKYGBge3J9CnRhYmxlIChwcm9kdWNjaW9uZGF0YSRDTElFTlRFKQpgYGAKCmBgYHtyfQpsaWJyYXJ5IChnZ3Bsb3QyKQpnZ3Bsb3QocHJvZHVjY2lvbmRhdGEsIGFlcyh4PUNMSUVOVEUsIHk9VElFTVBPLkNBTElEQUQpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJvcmFuZ2UiKSArIHNjYWxlX2ZpbGxfZ3JleSgpICsgIyBBZGQgYmFycyB0byB0aGUgcGxvdAogIGxhYnModGl0bGUgPSAiUmVsYWNpw7NuIGRlIENsaWVudGUgeSBUaWVtcG8gZGUgY2FsaWRhZCIsICMgQWRkIGEgdGl0bGUKICAgICAgIHN1YnRpdGxlID0gIlJIIGVtcHJlc2EgRk9STSIsICMgQWRkIGEgc3VidGl0bGUKICAgICAgIGNhcHRpb24gPSAiUmVsYWNpw7NuIiwgIyBBZGQgYSBjYXB0aW9uCiAgICAgICB4ID0gIkNsaWVudGUiKQpgYGAKCmBgYHtyfQpib3hwbG90KHByb2R1Y2Npb25kYXRhJExhbWluYXMucHJvY2VzYWRhcywgcHJvZHVjY2lvbmRhdGEkVE1PLi5NSU4uICwgdmVydGljYWwgPSBUUlVFKQpgYGAKCgoKCgo=