Instalar paquetes y llamar librerias

#install.packages("tidyverse") #Paquete global para manipulacion y analisis de datos
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
#install.packages("dplyr") #Para filtrar bases de datos
library(dplyr)

#install.packages("janitor") #examinar y limpiar bases de datos sucias
library(janitor)
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
#install.packages("Matrix") #Para trabajar con matrices
library(Matrix)
## 
## Attaching package: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
#install.packages("arules") #Genera reglas de asociacion
library(arules)
## 
## Attaching package: 'arules'
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
#install.packages("arulesViz") #Visualizar reglas de asociacion
library(arulesViz)

#install.packages("datasets")
library(datasets)

#install.packages("plyr")
library(plyr)
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
## 
## Attaching package: 'plyr'
## 
## The following objects are masked from 'package:dplyr':
## 
##     arrange, count, desc, failwith, id, mutate, rename, summarise,
##     summarize
## 
## The following object is masked from 'package:purrr':
## 
##     compact

‹span style=“color: red;”›Importar la base de datos

# file.choose()
df<- read.csv("/Users/eugenio/Desktop/TEC/Semestre 3/Semana Tec Bootcamp Programacion/Bases_de_Datos/abarrotes.csv")

‹span style=“color: red;”›Análisis Descriptivo

#summary (df)
#str (df)
#df %>%
 # dplyr::count(vcClaveTienda) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(DescGiro) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(Codigo.Barras) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(PLU) %>%
 # arrange(desc(n))

#df %>%
#  dplyr::count(Fecha) %>%
#  arrange(desc(n))

#df %>%
#  dplyr::count(Hora) %>%
#  arrange(desc(n))

#df %>%
 # dplyr::count(Marca) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(Fabricante) %>%
 # arrange(desc(n))

#df %>%
#  dplyr::count(Producto) %>%
#  arrange(desc(n))

#df %>%
#  dplyr::count(Precio) %>%
#  arrange(desc(n))

#df %>%
#  dplyr::count(Ult.Costo) %>%
#  arrange(desc(n))

#df %>%
 # dplyr::count(Unidades) %>%
 # arrange(desc(n))

#df %>%
#  dplyr::count(F.Ticket) %>%
 # arrange(desc(n))

#df %>%
 # dplyr::count(NombreDepartamento) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(NombreFamilia) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(NombreCategoria) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(Estado) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(Mts.2) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(`Tipo.ubicación`) %>%
  #arrange(desc(n))  # Backticks required for column names with special characters

#df %>%
 # dplyr::count(Giro) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(Hora.inicio) %>%
  #arrange(desc(n))

#df %>%
 # dplyr::count(Hora.cierre) %>%
  #arrange(desc(n))

Tablas

# Tabla de Tienda y Departamento 
#tabyl(df,vcClaveTiedna, NombreDepartamento)
# Tabla de Estado y Hora de Inicio 
tabyl(df, Estado, Hora.inicio)
##        Estado 07:00 08:00 09:00
##       Chiapas  4051     0     0
##       Jalisco     0     0  6629
##    Nuevo León     0 96469     0
##  Quintana Roo     0 10021     0
##       Sinaloa 83455     0     0

Limpieza de Datos

Técnica 1. Eliminar valores irrelevantes

# Eliminar columnas 
df <- subset(df, select = -c(PLU))

# Eliminar renglones 
df <- df[df$Precio >0, ]

Técnica 2. Eliminar valores repetidos

df <- distinct(df)

Técnica 3. Corregir errores tipográficos y similares

df$Unidades <- ceiling(df$Unidades)
summary(df$Unidades)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   1.000   1.261   1.000  96.000

Técnica 4. Convertir tipos de datos

# Convertir de Caracter a Fecha
df$Fecha <- as.Date(df$Fecha, format="%d/%m/%Y")
str(df$Fecha)
##  Date[1:200473], format: "2020-06-19" "2020-06-19" "2020-06-19" "2020-06-19" "2020-06-19" ...
summary(df$Fecha)
##         Min.      1st Qu.       Median         Mean      3rd Qu.         Max. 
## "2020-05-01" "2020-06-06" "2020-07-11" "2020-07-18" "2020-08-29" "2020-11-11"

Técnica 5. Tratar valores faltantes

# Borrar todos los NAs
# df <- na.omit(df)

# Reemplazar los NAs con CEROS
# df[is.na(df)] <- 0

# Reemplazar los NAs con el PROMEDIO
# df$altura[js.na(df$altura)] <- mean(df$altura, na.rm=TRUE)

Técnica 6. Herramientas Estadísticas

boxplot(df$Precio, horizontal = TRUE)

boxplot(df$Unidades, horizontal = TRUE)

Generar basket

# Ordenar de menor a mayor la columna Ticket
df <- df[order(df$F.Ticket), ]
head(df)
##   vcClaveTienda  DescGiro Codigo.Barras      Fecha     Hora
## 1         MX001 Abarrotes  7.501021e+12 2020-06-19 08:16:21
## 2         MX001 Abarrotes  7.501032e+12 2020-06-19 08:23:33
## 3         MX001 Abarrotes  7.501000e+12 2020-06-19 08:24:33
## 4         MX001 Abarrotes  7.501031e+12 2020-06-19 08:24:33
## 5         MX001 Abarrotes  7.501026e+12 2020-06-19 08:26:28
## 6         MX001 Abarrotes  7.501025e+12 2020-06-19 08:26:28
##                        Marca                 Fabricante
## 1                NUTRI LECHE                    MEXILAC
## 2                     DAN UP           DANONE DE MEXICO
## 3                      BIMBO                GRUPO BIMBO
## 4                      PEPSI        PEPSI-COLA MEXICANA
## 5 BLANCA NIEVES (DETERGENTE) FABRICA DE JABON LA CORONA
## 6                      FLASH                       ALEN
##                             Producto Precio Ult.Costo Unidades F.Ticket
## 1                Nutri Leche 1 Litro   16.0     12.31        1        1
## 2 DANUP STRAWBERRY P/BEBER 350GR NAL   14.0     14.00        1        2
## 3                Rebanadas Bimbo 2Pz    5.0      5.00        1        3
## 4                   Pepsi N.R. 400Ml    8.0      8.00        1        3
## 5      Detergente Blanca Nieves 500G   19.5     15.00        1        4
## 6      Flash Xtra Brisa Marina 500Ml    9.5      7.31        1        4
##   NombreDepartamento          NombreFamilia           NombreCategoria
## 1          Abarrotes Lacteos y Refrigerados                     Leche
## 2          Abarrotes Lacteos y Refrigerados                    Yogurt
## 3          Abarrotes         Pan y Tortilla     Pan Dulce Empaquetado
## 4          Abarrotes                Bebidas Refrescos Plástico (N.R.)
## 5          Abarrotes     Limpieza del Hogar                Lavandería
## 6          Abarrotes     Limpieza del Hogar      Limpiadores Líquidos
##       Estado Mts.2 Tipo.ubicación      Giro Hora.inicio Hora.cierre
## 1 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 2 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 3 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 4 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 5 Nuevo León    60        Esquina Abarrotes       08:00       22:00
## 6 Nuevo León    60        Esquina Abarrotes       08:00       22:00
tail(df)
##        vcClaveTienda   DescGiro Codigo.Barras      Fecha     Hora
## 107247         MX004 Carnicería  1.024877e+10 2020-10-15 11:51:40
## 167624         MX004 Carnicería  7.501080e+12 2020-10-15 11:51:40
## 149282         MX004 Carnicería  7.501055e+12 2020-10-15 11:54:37
## 168603         MX004 Carnicería  7.501214e+12 2020-10-15 11:56:52
## 161046         MX004 Carnicería  7.501031e+12 2020-10-15 12:01:54
## 112823         MX004 Carnicería  7.500470e+07 2020-10-15 12:02:36
##                 Marca           Fabricante                       Producto
## 107247         YEMINA               HERDEZ    PASTA SPAGHETTI YEMINA 200G
## 167624     DEL FUERTE ALIMENTOS DEL FUERTE PURE DE TOMATE DEL FUERTE 345G
## 149282 COCA COLA ZERO            COCA COLA           COCA COLA ZERO 600ML
## 168603       DIAMANTE           EMPACADOS              ARROZ DIAMANTE225G
## 161046          PEPSI  PEPSI-COLA MEXICANA              PEPSI N. R. 500ML
## 112823      COCA COLA            COCA COLA     COCA COLA RETORNABLE 500ML
##        Precio Ult.Costo Unidades F.Ticket NombreDepartamento
## 107247      7      5.38        2   450032          Abarrotes
## 167624     12      9.23        1   450032          Abarrotes
## 149282     15     11.54        2   450034          Abarrotes
## 168603     11      8.46        1   450037          Abarrotes
## 161046     10      7.69        1   450039          Abarrotes
## 112823     10      7.69        8   450040          Abarrotes
##               NombreFamilia               NombreCategoria  Estado Mts.2
## 107247       Sopas y Pastas Fideos, Spaguetti, Tallarines Sinaloa    53
## 167624 Salsas y Sazonadores          Salsa para Spaguetti Sinaloa    53
## 149282              Bebidas         Refrescos Retornables Sinaloa    53
## 168603    Granos y Semillas                         Arroz Sinaloa    53
## 161046              Bebidas     Refrescos Plástico (N.R.) Sinaloa    53
## 112823              Bebidas         Refrescos Retornables Sinaloa    53
##        Tipo.ubicación      Giro Hora.inicio Hora.cierre
## 107247        Esquina Abarrotes       07:00       23:00
## 167624        Esquina Abarrotes       07:00       23:00
## 149282        Esquina Abarrotes       07:00       23:00
## 168603        Esquina Abarrotes       07:00       23:00
## 161046        Esquina Abarrotes       07:00       23:00
## 112823        Esquina Abarrotes       07:00       23:00
# Generar el basket
basket <- ddply(df,c("F.Ticket"), function(df)paste(df$Marca, collapse = ","))

# Eliminar el Numero de Ticket 
LS0tCnRpdGxlOiAiTUJBIgphdXRob3I6ICJBZHJpw6FuIEVsaXpvbmRvIEEwMDgzNTE2MCIKZGF0ZTogIjIwMjQtMDktMTAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRSAKICAgIHRvY19mbG9hdDogVFJVRSAKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUgCiAgICB0aGVtZTogY29zbW8gCi0tLQoKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXJpYXM8L3NwYW4+CmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikgI1BhcXVldGUgZ2xvYmFsIHBhcmEgbWFuaXB1bGFjaW9uIHkgYW5hbGlzaXMgZGUgZGF0b3MKbGlicmFyeSh0aWR5dmVyc2UpCgojaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKSAjUGFyYSBmaWx0cmFyIGJhc2VzIGRlIGRhdG9zCmxpYnJhcnkoZHBseXIpCgojaW5zdGFsbC5wYWNrYWdlcygiamFuaXRvciIpICNleGFtaW5hciB5IGxpbXBpYXIgYmFzZXMgZGUgZGF0b3Mgc3VjaWFzCmxpYnJhcnkoamFuaXRvcikKCiNpbnN0YWxsLnBhY2thZ2VzKCJNYXRyaXgiKSAjUGFyYSB0cmFiYWphciBjb24gbWF0cmljZXMKbGlicmFyeShNYXRyaXgpCgojaW5zdGFsbC5wYWNrYWdlcygiYXJ1bGVzIikgI0dlbmVyYSByZWdsYXMgZGUgYXNvY2lhY2lvbgpsaWJyYXJ5KGFydWxlcykKCgojaW5zdGFsbC5wYWNrYWdlcygiYXJ1bGVzVml6IikgI1Zpc3VhbGl6YXIgcmVnbGFzIGRlIGFzb2NpYWNpb24KbGlicmFyeShhcnVsZXNWaXopCgojaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKQpsaWJyYXJ5KGRhdGFzZXRzKQoKI2luc3RhbGwucGFja2FnZXMoInBseXIiKQpsaWJyYXJ5KHBseXIpCmBgYAoKIyDigLlzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyLigLpJbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zPC9zcGFuPgpgYGB7cn0KIyBmaWxlLmNob29zZSgpCmRmPC0gcmVhZC5jc3YoIi9Vc2Vycy9ldWdlbmlvL0Rlc2t0b3AvVEVDL1NlbWVzdHJlIDMvU2VtYW5hIFRlYyBCb290Y2FtcCBQcm9ncmFtYWNpb24vQmFzZXNfZGVfRGF0b3MvYWJhcnJvdGVzLmNzdiIpCgpgYGAKCiMg4oC5c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsi4oC6QW7DoWxpc2lzIERlc2NyaXB0aXZvPC9zcGFuPgpgYGB7cn0KI3N1bW1hcnkgKGRmKQojc3RyIChkZikKI2RmICU+JQogIyBkcGx5cjo6Y291bnQodmNDbGF2ZVRpZW5kYSkgJT4lCiAgI2FycmFuZ2UoZGVzYyhuKSkKCiNkZiAlPiUKICMgZHBseXI6OmNvdW50KERlc2NHaXJvKSAlPiUKICAjYXJyYW5nZShkZXNjKG4pKQoKI2RmICU+JQogIyBkcGx5cjo6Y291bnQoQ29kaWdvLkJhcnJhcykgJT4lCiAgI2FycmFuZ2UoZGVzYyhuKSkKCiNkZiAlPiUKICMgZHBseXI6OmNvdW50KFBMVSkgJT4lCiAjIGFycmFuZ2UoZGVzYyhuKSkKCiNkZiAlPiUKIyAgZHBseXI6OmNvdW50KEZlY2hhKSAlPiUKIyAgYXJyYW5nZShkZXNjKG4pKQoKI2RmICU+JQojICBkcGx5cjo6Y291bnQoSG9yYSkgJT4lCiMgIGFycmFuZ2UoZGVzYyhuKSkKCiNkZiAlPiUKICMgZHBseXI6OmNvdW50KE1hcmNhKSAlPiUKICAjYXJyYW5nZShkZXNjKG4pKQoKI2RmICU+JQogIyBkcGx5cjo6Y291bnQoRmFicmljYW50ZSkgJT4lCiAjIGFycmFuZ2UoZGVzYyhuKSkKCiNkZiAlPiUKIyAgZHBseXI6OmNvdW50KFByb2R1Y3RvKSAlPiUKIyAgYXJyYW5nZShkZXNjKG4pKQoKI2RmICU+JQojICBkcGx5cjo6Y291bnQoUHJlY2lvKSAlPiUKIyAgYXJyYW5nZShkZXNjKG4pKQoKI2RmICU+JQojICBkcGx5cjo6Y291bnQoVWx0LkNvc3RvKSAlPiUKIyAgYXJyYW5nZShkZXNjKG4pKQoKI2RmICU+JQogIyBkcGx5cjo6Y291bnQoVW5pZGFkZXMpICU+JQogIyBhcnJhbmdlKGRlc2MobikpCgojZGYgJT4lCiMgIGRwbHlyOjpjb3VudChGLlRpY2tldCkgJT4lCiAjIGFycmFuZ2UoZGVzYyhuKSkKCiNkZiAlPiUKICMgZHBseXI6OmNvdW50KE5vbWJyZURlcGFydGFtZW50bykgJT4lCiAgI2FycmFuZ2UoZGVzYyhuKSkKCiNkZiAlPiUKICMgZHBseXI6OmNvdW50KE5vbWJyZUZhbWlsaWEpICU+JQogICNhcnJhbmdlKGRlc2MobikpCgojZGYgJT4lCiAjIGRwbHlyOjpjb3VudChOb21icmVDYXRlZ29yaWEpICU+JQogICNhcnJhbmdlKGRlc2MobikpCgojZGYgJT4lCiAjIGRwbHlyOjpjb3VudChFc3RhZG8pICU+JQogICNhcnJhbmdlKGRlc2MobikpCgojZGYgJT4lCiAjIGRwbHlyOjpjb3VudChNdHMuMikgJT4lCiAgI2FycmFuZ2UoZGVzYyhuKSkKCiNkZiAlPiUKICMgZHBseXI6OmNvdW50KGBUaXBvLnViaWNhY2nDs25gKSAlPiUKICAjYXJyYW5nZShkZXNjKG4pKSAgIyBCYWNrdGlja3MgcmVxdWlyZWQgZm9yIGNvbHVtbiBuYW1lcyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycwoKI2RmICU+JQogIyBkcGx5cjo6Y291bnQoR2lybykgJT4lCiAgI2FycmFuZ2UoZGVzYyhuKSkKCiNkZiAlPiUKICMgZHBseXI6OmNvdW50KEhvcmEuaW5pY2lvKSAlPiUKICAjYXJyYW5nZShkZXNjKG4pKQoKI2RmICU+JQogIyBkcGx5cjo6Y291bnQoSG9yYS5jaWVycmUpICU+JQogICNhcnJhbmdlKGRlc2MobikpCgoKYGBgCgoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5UYWJsYXM8L3NwYW4+CmBgYHtyfQojIFRhYmxhIGRlIFRpZW5kYSB5IERlcGFydGFtZW50byAKI3RhYnlsKGRmLHZjQ2xhdmVUaWVkbmEsIE5vbWJyZURlcGFydGFtZW50bykKIyBUYWJsYSBkZSBFc3RhZG8geSBIb3JhIGRlIEluaWNpbyAKdGFieWwoZGYsIEVzdGFkbywgSG9yYS5pbmljaW8pCgpgYGAKCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+TGltcGllemEgZGUgRGF0b3M8L3NwYW4+CgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlTDqWNuaWNhIDEuIEVsaW1pbmFyIHZhbG9yZXMgaXJyZWxldmFudGVzPC9zcGFuPgpgYGB7cn0KIyBFbGltaW5hciBjb2x1bW5hcyAKZGYgPC0gc3Vic2V0KGRmLCBzZWxlY3QgPSAtYyhQTFUpKQoKIyBFbGltaW5hciByZW5nbG9uZXMgCmRmIDwtIGRmW2RmJFByZWNpbyA+MCwgXQoKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlTDqWNuaWNhIDIuIEVsaW1pbmFyIHZhbG9yZXMgcmVwZXRpZG9zPC9zcGFuPgpgYGB7cn0KZGYgPC0gZGlzdGluY3QoZGYpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSAzLiBDb3JyZWdpciBlcnJvcmVzIHRpcG9ncsOhZmljb3MgeSBzaW1pbGFyZXM8L3NwYW4+CmBgYHtyfQpkZiRVbmlkYWRlcyA8LSBjZWlsaW5nKGRmJFVuaWRhZGVzKQpzdW1tYXJ5KGRmJFVuaWRhZGVzKQpgYGAKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSA0LiBDb252ZXJ0aXIgdGlwb3MgZGUgZGF0b3M8L3NwYW4+CmBgYHtyfQojIENvbnZlcnRpciBkZSBDYXJhY3RlciBhIEZlY2hhCmRmJEZlY2hhIDwtIGFzLkRhdGUoZGYkRmVjaGEsIGZvcm1hdD0iJWQvJW0vJVkiKQpzdHIoZGYkRmVjaGEpCnN1bW1hcnkoZGYkRmVjaGEpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Uw6ljbmljYSA1LiBUcmF0YXIgdmFsb3JlcyBmYWx0YW50ZXM8L3NwYW4+CmBgYHtyfQojIEJvcnJhciB0b2RvcyBsb3MgTkFzCiMgZGYgPC0gbmEub21pdChkZikKCiMgUmVlbXBsYXphciBsb3MgTkFzIGNvbiBDRVJPUwojIGRmW2lzLm5hKGRmKV0gPC0gMAoKIyBSZWVtcGxhemFyIGxvcyBOQXMgY29uIGVsIFBST01FRElPCiMgZGYkYWx0dXJhW2pzLm5hKGRmJGFsdHVyYSldIDwtIG1lYW4oZGYkYWx0dXJhLCBuYS5ybT1UUlVFKQoKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlTDqWNuaWNhIDYuIEhlcnJhbWllbnRhcyBFc3RhZMOtc3RpY2FzPC9zcGFuPgpgYGB7cn0KYm94cGxvdChkZiRQcmVjaW8sIGhvcml6b250YWwgPSBUUlVFKQpib3hwbG90KGRmJFVuaWRhZGVzLCBob3Jpem9udGFsID0gVFJVRSkKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+R2VuZXJhciBiYXNrZXQ8L3NwYW4+CmBgYHtyfQojIE9yZGVuYXIgZGUgbWVub3IgYSBtYXlvciBsYSBjb2x1bW5hIFRpY2tldApkZiA8LSBkZltvcmRlcihkZiRGLlRpY2tldCksIF0KaGVhZChkZikKdGFpbChkZikKCiMgR2VuZXJhciBlbCBiYXNrZXQKYmFza2V0IDwtIGRkcGx5KGRmLGMoIkYuVGlja2V0IiksIGZ1bmN0aW9uKGRmKXBhc3RlKGRmJE1hcmNhLCBjb2xsYXBzZSA9ICIsIikpCgojIEVsaW1pbmFyIGVsIE51bWVybyBkZSBUaWNrZXQgCgpgYGAKCgoK