Teoría

La mineria de texto (TM) es el proceso de extraer información útil, patrones o conocimiento de texto no estructurados.

Consta de 3 etapas: 1. Obtener datos: El reconocimiento óptico de caracteres (OCR) es una tecnología que permite convertir imágenes de texto en texto editable. También es conocido como extracción de texto de imagenes.

  1. Explorar datos: Representación gráfica o visual de los datos para su interpretación. Los métodos más comunes son el Análisis de sentimientos, La nube de palabras y el Topic Modeling.

  2. Análisis predictivo: Son las técnicas y modelos estadísticos para predecir resultados futuros. Los modelos más usados son el Random Forest, Redes Neuronales y Regresiones.

Instalar librerias y paquetes

# install.packages("tidyverse") #Data wrangling
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# install.packages("tesseract") #OCR
library(tesseract)

# install.packages("magick") #PNG
library(magick)
## Linking to ImageMagick 6.9.12.98
## Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fontconfig, x11
# install.packages("officer") #Office Word
library(officer)

# install.packages("pdftools") #PDF 
library(pdftools)
## Using poppler version 23.08.0
# install.packages("purrr") #Para la función map para aplicar una función a cada elemento de un vector 
library(purrr)

# install.packages("tm") #Text Mining
library(tm)
## Loading required package: NLP
## 
## Attaching package: 'NLP'
## 
## The following object is masked from 'package:ggplot2':
## 
##     annotate
# install.packages("RColorBrewer") #Colores
library(RColorBrewer)

# install.packages("wordcloud") #Nube de palabras
library(wordcloud)

# install.packages("topicmodels") #Modelos de temas
library(topicmodels)

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

library(wordcloud)
library(RColorBrewer)
library(officer)
library(magrittr)
## 
## Attaching package: 'magrittr'
## 
## The following object is masked from 'package:purrr':
## 
##     set_names
## 
## The following object is masked from 'package:tidyr':
## 
##     extract
library(pdftools)

library(tesseract)
library(tm)
library(magick)

1. Obtener datos mediante OCR

imagen1 <- image_read("C:\\Users\\rodri\\Desktop\\modulo 2\\text minning\\imagen1.PNG") 
texto1 <- ocr(imagen1)
texto1
## [1] "Linear regression with one variable x is also known as univariate linear regression\nor simple linear regression. Simple linear regression is used to predict a single\noutput from a single input. This is an example of supervised learning, which means\nthat the data is labeled, i.e., the output values are known in the training data. Let us\nfit a line through the data using simple linear regression as shown in Fig. 4.1.\n"
doc1 <- read_docx() #Crea un documento en blanco
doc1 <- doc1 %>% body_add_par(texto1, style = "Normal") #Pega texto en el word 
print(doc1, target = "texto1.docx") #Guarda el word en la computadora

Imagen en español PNG a texto en WORD

[Consultar idiomas disponibles] (https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html)

imagen2 <- image_read("C:\\Users\\rodri\\Desktop\\modulo 2\\text minning\\imagen2.PNG")
tesseract_download("spa")
## [1] "C:\\Users\\rodri\\AppData\\Local\\tesseract5\\tesseract5\\tessdata/spa.traineddata"
texto2 <- ocr(imagen2, engine = tesseract("spa"))
texto2
## [1] "Un importante, y quizá controversial, asunto político es el que se refiere al efecto del salario mínimo sobre\nlas tasas de desempleo en diversos grupos de trabajadores. Aunque este problema puede ser estudiado con\ndiversos tipos de datos (corte transversal, series de tiempo o datos de panel), suelen usarse las series de\ntiempo para observar los efectos agregados. En la tabla 1.3 se presenta un ejemplo de una base de datos\nde series de tiempo sobre tasas de desempleo y salarios mínimos.\n"
doc2 <- read_docx() #Crea un documento de word en blanco
doc2 <- doc2 %>% body_add_par(texto2, style ="Normal") #Pega el texto en el word
#print(doc2, target = "texto2.docx") #Guarda el word en la computadora

De PDF a texto en Word

#pdf1 <- pdf_convert("C:\\Users\\rodri\\Desktop\\modulo 2\\text minning\\pdf1.pdf", dpi=600) %>% map(ocr)

Actividad 1. Novela “IT”

# Convier el PDF a imágenes
#pdf_convert("C:\\Users\\rodri\\Desktop\\modulo 2\\text minning\\eso3.pdf", dpi = 300, format = "png")
# Crear un  documento de Word
doc <- read_docx()

imagenes <- list.files(pattern = "eso3_.*\\.png$", full.names = TRUE, ignore.case = TRUE)

imagenes <- sort(imagenes)

# Añadir imagenes a un mismo documento
for(imagen in imagenes) {
  doc <- doc %>%
    body_add_img(src = imagen, width = 6, height = 7) %>%  
    body_add_par("") 
}

# Generar y guardar el documento generado

#print(doc, target = "DocumentoConImagenes.docx")

Exploración de datos

Análisis de frecuencias

text <- readLines("http://www.sthda.com/sthda/RDoc/example-files/martin-luther-king-i-have-a-dream-speech.txt") #traer texto de internet

corpus <- Corpus(VectorSource(text)) #Pone renglon en cada celda de vector 
# inspect (corpus)
corpus <- tm_map(corpus, content_transformer(tolower)) #Pone todo en miniscula
## Warning in tm_map.SimpleCorpus(corpus, content_transformer(tolower)):
## transformation drops documents
corpus <- tm_map(corpus, removePunctuation) #Elimina puntuación 
## Warning in tm_map.SimpleCorpus(corpus, removePunctuation): transformation drops
## documents
corpus <- tm_map(corpus, removeNumbers) #Elimina números
## Warning in tm_map.SimpleCorpus(corpus, removeNumbers): transformation drops
## documents
corpus <- tm_map(corpus, removeWords, stopwords ("en")) #Elimina palabras que no hablan del tema
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("en")):
## transformation drops documents
# corpus <- tm_map(corpus, removeWord, c("dream", "will")) #Elimina palabras puntuales

tdm <- TermDocumentMatrix(corpus) 
m <- as.matrix(tdm) #Cuenta las veces que aparece cada palabra por renglon

frecuencia <- sort(rowSums(m), decreasing = TRUE) #Cuenta la frecuencia de cada palabra en el texto completo






frecuencia_df <- data.frame(word=names(frecuencia),
freq=frecuencia) #Convierte la frecuencia a data frame

ggplot(head(frecuencia_df,10), aes(x=reorder (word, -freq), y=freq)) +
       geom_bar(stat="identity", fill ="lightgreen") + 
       labs (title= "TOP 10 palabras más frecuentes", 
            subtitule= "Discurso 'I have a dream'de M. L. King",  x = "Palabra", y="Frecuencia") + 
  ylim(0,20)

Nube de palabras

#El procesamiento de datos andes de la nube de palabras es igual que en analisis de frecuencias, desde importar el texto hasta frecuencia_df
set.seed(123)
wordcloud(words=frecuencia_df$word,freq = frecuencia_df$freq, min.freq=1,
random.order=FALSE, colors = brewer.pal(8, "RdPu"))

Ejercicio 2. Novela IT

imagenes <- c("eso3_1.png", "eso3_2.png", "eso3_3.png") 
textos <- lapply(imagenes, function(imagen) ocr(image_read(imagen)))
texto_completo <- paste(unlist(textos), collapse = " ")


# Crear un corpus 
corpus <- Corpus(VectorSource(texto_completo))
corpus <- tm_map(corpus, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(corpus, content_transformer(tolower)):
## transformation drops documents
corpus <- tm_map(corpus, removePunctuation)
## Warning in tm_map.SimpleCorpus(corpus, removePunctuation): transformation drops
## documents
corpus <- tm_map(corpus, removeNumbers)
## Warning in tm_map.SimpleCorpus(corpus, removeNumbers): transformation drops
## documents
corpus <- tm_map(corpus, removeWords, stopwords("en"))
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("en")):
## transformation drops documents
# Contar la frecuencia
tdm <- TermDocumentMatrix(corpus)
m <- as.matrix(tdm)
frecuencia <- sort(rowSums(m), decreasing = TRUE)

frecuencia_df <- data.frame(word = names(frecuencia), freq = frecuencia)

top_10_palabras <- head(frecuencia_df, 10)

# Ranking de palabras
print(top_10_palabras)
##              word freq
## que           que   33
## george     george   26
## del           del   17
## hacia       hacia   14
## como         como   13
## payaso     payaso   13
## por           por   13
## los           los   11
## una           una   11
## tormenta tormenta   10
View(top_10_palabras)

Ejercicio 2. Novela IT. Nube de palabras

set.seed(123)
wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, min.freq = 1,
          random.order = FALSE, colors = brewer.pal(8, "Dark2"))
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## mechones could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## metros could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## mezcla could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## mierda could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## miraba could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## miraban could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## mismo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## momentaneamente could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## mucha could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## muchisima could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## mucho could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## naranja could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## negrura could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## nueva could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## nunca could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## ofrezca could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## oscura could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## oscuras could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## oscuro could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## otonal could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## parece could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## parecio could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## parpadeod could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## patatas could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## pechera could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## pendid could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## penetrantes could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## pennywise— could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## pensado could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## pensar could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## peor could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## perder could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## perfectamente could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## persiguiendo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## perspectiva could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## pintada could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## poderosamente could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## podrida could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## pone could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## porches could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## porque could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## precipitaba could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## presentarme could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## primer could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## primero could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## produjeron could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## profundo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## putrido could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## quedo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## querer could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## rama could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## razonable could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## redondo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## regocijante could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## reluciente could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## remolino could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## resbalo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## retirarla— could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## retiro could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## retorcia could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## retrocedia could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## retrocediendo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## retrocedio could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## riendo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## rodilla could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## rodillas could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## rojos could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## ronald could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## rota could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## rugido could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## ruido could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sabados could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sacado could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sacando could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sacarlo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## salvajes could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sangre could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## seda could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## seguro could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## seis could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## semicirculo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## senor could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## shoeboat could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sientes could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## simpatica could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sino could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sintio could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sollozar could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## solto could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sombras could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sonar could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sonaran could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sonido could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sono could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sonreia could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sonrio could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## street could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sujetaba could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## sujeto could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## superficie could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## supo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## supuesto» could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## tablero could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## tampoco could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## tanto could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## tapa could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## tenido could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## tentadora could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## terrible could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## tiene could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## toda could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## tostados could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## trabajar could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## tropezones could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## trozo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## unico could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## unos could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## veces could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## ventaja could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## ventanas could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## verdes could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## verlos could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## viendo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## vinagre could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## vivido could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## volaaaando could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## voluntad— could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## volvio could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## witcham could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## zarpazo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## ¢correcto could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## ¢quieres could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## éno could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —alargo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —aqui could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —bueno could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —chillo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —correcto could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —croo could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —gruno could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —hola could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —ieh could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —penso could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —por could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —pregunto could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —replico could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —si could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —susurro could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —y could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —«por could not be fit on page. It will not be plotted.
## Warning in wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, :
## —éy could not be fit on page. It will not be plotted.

LS0tDQp0aXRsZTogIlRleHQgTWluaW5nIg0KYXV0aG9yOiAiR2VyYXJkbyBDZWRpbGxvIENvcm9uYSBBMDE3MDQyMzIsIERhbmllbCBOYWplcmEgQTAxNzA5NTc4LCBBbGVqYW5kcmEgU3VhcmV6IEEwMDgzNTI0NywgRWR1YXJkbyBDYW1hY2hvIEEwMTAyNjQzNyINCmRhdGU6ICIyMDI0LTAyLTI2Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiBjb3Ntbw0KLS0tDQohW10oQzpcXFVzZXJzXFxyb2RyaVxcRGVza3RvcFxcbW9kdWxvIDJcXDNSaEV0ZnMzdFNYQVp2Z3BGRWtZOTQ1VVJ4ZS5qcGcpDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPlRlb3LDrWE8L3NwYW4+DQpMYSAqKm1pbmVyaWEgZGUgdGV4dG8qKiAoVE0pIGVzIGVsIHByb2Nlc28gZGUgZXh0cmFlciBpbmZvcm1hY2nDs24gw7p0aWwsIHBhdHJvbmVzDQpvIGNvbm9jaW1pZW50byBkZSB0ZXh0byBubyBlc3RydWN0dXJhZG9zLg0KDQpDb25zdGEgZGUgMyBldGFwYXM6IA0KMS4gT2J0ZW5lciBkYXRvczogRWwgcmVjb25vY2ltaWVudG8gw7NwdGljbyBkZSBjYXJhY3RlcmVzIChPQ1IpIGVzIHVuYSB0ZWNub2xvZ8OtYQ0KcXVlIHBlcm1pdGUgY29udmVydGlyIGltw6FnZW5lcyBkZSB0ZXh0byBlbiB0ZXh0byBlZGl0YWJsZS4gVGFtYmnDqW4gZXMgY29ub2NpZG8gDQpjb21vICoqZXh0cmFjY2nDs24gZGUgdGV4dG8gZGUgaW1hZ2VuZXMqKi4NCg0KMi4gRXhwbG9yYXIgZGF0b3M6IFJlcHJlc2VudGFjacOzbiBncsOhZmljYSBvIHZpc3VhbCBkZSBsb3MgZGF0b3MgcGFyYSBzdSANCmludGVycHJldGFjacOzbi4gTG9zIG3DqXRvZG9zIG3DoXMgY29tdW5lcyBzb24gZWwgQW7DoWxpc2lzIGRlIHNlbnRpbWllbnRvcywgDQpMYSBudWJlIGRlIHBhbGFicmFzIHkgZWwgVG9waWMgTW9kZWxpbmcuDQoNCjMuIEFuw6FsaXNpcyBwcmVkaWN0aXZvOiBTb24gbGFzIHTDqWNuaWNhcyB5IG1vZGVsb3MgZXN0YWTDrXN0aWNvcyBwYXJhIHByZWRlY2lyIA0KcmVzdWx0YWRvcyBmdXR1cm9zLiBMb3MgbW9kZWxvcyBtw6FzIHVzYWRvcyBzb24gZWwgUmFuZG9tIEZvcmVzdCwgUmVkZXMgTmV1cm9uYWxlcw0KeSBSZWdyZXNpb25lcy4gDQoNCiMgSW5zdGFsYXIgbGlicmVyaWFzIHkgcGFxdWV0ZXMgDQoNCmBgYHtyfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKSAjRGF0YSB3cmFuZ2xpbmcNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQojIGluc3RhbGwucGFja2FnZXMoInRlc3NlcmFjdCIpICNPQ1INCmxpYnJhcnkodGVzc2VyYWN0KQ0KDQojIGluc3RhbGwucGFja2FnZXMoIm1hZ2ljayIpICNQTkcNCmxpYnJhcnkobWFnaWNrKQ0KDQojIGluc3RhbGwucGFja2FnZXMoIm9mZmljZXIiKSAjT2ZmaWNlIFdvcmQNCmxpYnJhcnkob2ZmaWNlcikNCg0KIyBpbnN0YWxsLnBhY2thZ2VzKCJwZGZ0b29scyIpICNQREYgDQpsaWJyYXJ5KHBkZnRvb2xzKQ0KDQojIGluc3RhbGwucGFja2FnZXMoInB1cnJyIikgI1BhcmEgbGEgZnVuY2nDs24gbWFwIHBhcmEgYXBsaWNhciB1bmEgZnVuY2nDs24gYSBjYWRhIGVsZW1lbnRvIGRlIHVuIHZlY3RvciANCmxpYnJhcnkocHVycnIpDQoNCiMgaW5zdGFsbC5wYWNrYWdlcygidG0iKSAjVGV4dCBNaW5pbmcNCmxpYnJhcnkodG0pDQoNCiMgaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikgI0NvbG9yZXMNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KDQojIGluc3RhbGwucGFja2FnZXMoIndvcmRjbG91ZCIpICNOdWJlIGRlIHBhbGFicmFzDQpsaWJyYXJ5KHdvcmRjbG91ZCkNCg0KIyBpbnN0YWxsLnBhY2thZ2VzKCJ0b3BpY21vZGVscyIpICNNb2RlbG9zIGRlIHRlbWFzDQpsaWJyYXJ5KHRvcGljbW9kZWxzKQ0KDQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmxpYnJhcnkod29yZGNsb3VkKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KG9mZmljZXIpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShwZGZ0b29scykNCg0KbGlicmFyeSh0ZXNzZXJhY3QpDQpsaWJyYXJ5KHRtKQ0KbGlicmFyeShtYWdpY2spDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+MS4gT2J0ZW5lciBkYXRvcyBtZWRpYW50ZSBPQ1I8L3NwYW4+DQpgYGB7cn0NCmltYWdlbjEgPC0gaW1hZ2VfcmVhZCgiQzpcXFVzZXJzXFxyb2RyaVxcRGVza3RvcFxcbW9kdWxvIDJcXHRleHQgbWlubmluZ1xcaW1hZ2VuMS5QTkciKSANCnRleHRvMSA8LSBvY3IoaW1hZ2VuMSkNCnRleHRvMQ0KZG9jMSA8LSByZWFkX2RvY3goKSAjQ3JlYSB1biBkb2N1bWVudG8gZW4gYmxhbmNvDQpkb2MxIDwtIGRvYzEgJT4lIGJvZHlfYWRkX3Bhcih0ZXh0bzEsIHN0eWxlID0gIk5vcm1hbCIpICNQZWdhIHRleHRvIGVuIGVsIHdvcmQgDQpwcmludChkb2MxLCB0YXJnZXQgPSAidGV4dG8xLmRvY3giKSAjR3VhcmRhIGVsIHdvcmQgZW4gbGEgY29tcHV0YWRvcmENCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+SW1hZ2VuIGVuIGVzcGHDsW9sIFBORyBhIHRleHRvIGVuIFdPUkQ8L3NwYW4+DQpbQ29uc3VsdGFyIGlkaW9tYXMgZGlzcG9uaWJsZXNdIChodHRwczovL3Rlc3NlcmFjdC1vY3IuZ2l0aHViLmlvL3Rlc3Nkb2MvRGF0YS1GaWxlcy1pbi1kaWZmZXJlbnQtdmVyc2lvbnMuaHRtbCkNCmBgYHtyfQ0KaW1hZ2VuMiA8LSBpbWFnZV9yZWFkKCJDOlxcVXNlcnNcXHJvZHJpXFxEZXNrdG9wXFxtb2R1bG8gMlxcdGV4dCBtaW5uaW5nXFxpbWFnZW4yLlBORyIpDQp0ZXNzZXJhY3RfZG93bmxvYWQoInNwYSIpDQp0ZXh0bzIgPC0gb2NyKGltYWdlbjIsIGVuZ2luZSA9IHRlc3NlcmFjdCgic3BhIikpDQp0ZXh0bzINCmRvYzIgPC0gcmVhZF9kb2N4KCkgI0NyZWEgdW4gZG9jdW1lbnRvIGRlIHdvcmQgZW4gYmxhbmNvDQpkb2MyIDwtIGRvYzIgJT4lIGJvZHlfYWRkX3Bhcih0ZXh0bzIsIHN0eWxlID0iTm9ybWFsIikgI1BlZ2EgZWwgdGV4dG8gZW4gZWwgd29yZA0KI3ByaW50KGRvYzIsIHRhcmdldCA9ICJ0ZXh0bzIuZG9jeCIpICNHdWFyZGEgZWwgd29yZCBlbiBsYSBjb21wdXRhZG9yYQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij5EZSBQREYgYSB0ZXh0byBlbiBXb3JkPC9zcGFuPg0KYGBge3J9DQojcGRmMSA8LSBwZGZfY29udmVydCgiQzpcXFVzZXJzXFxyb2RyaVxcRGVza3RvcFxcbW9kdWxvIDJcXHRleHQgbWlubmluZ1xccGRmMS5wZGYiLCBkcGk9NjAwKSAlPiUgbWFwKG9jcikNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+QWN0aXZpZGFkIDEuIE5vdmVsYSAiSVQiPC9zcGFuPg0KYGBge3J9DQoNCiMgQ29udmllciBlbCBQREYgYSBpbcOhZ2VuZXMNCiNwZGZfY29udmVydCgiQzpcXFVzZXJzXFxyb2RyaVxcRGVza3RvcFxcbW9kdWxvIDJcXHRleHQgbWlubmluZ1xcZXNvMy5wZGYiLCBkcGkgPSAzMDAsIGZvcm1hdCA9ICJwbmciKQ0KDQpgYGANCg0KYGBge3J9DQoNCiMgQ3JlYXIgdW4gIGRvY3VtZW50byBkZSBXb3JkDQpkb2MgPC0gcmVhZF9kb2N4KCkNCg0KaW1hZ2VuZXMgPC0gbGlzdC5maWxlcyhwYXR0ZXJuID0gImVzbzNfLipcXC5wbmckIiwgZnVsbC5uYW1lcyA9IFRSVUUsIGlnbm9yZS5jYXNlID0gVFJVRSkNCg0KaW1hZ2VuZXMgPC0gc29ydChpbWFnZW5lcykNCg0KIyBBw7FhZGlyIGltYWdlbmVzIGEgdW4gbWlzbW8gZG9jdW1lbnRvDQpmb3IoaW1hZ2VuIGluIGltYWdlbmVzKSB7DQogIGRvYyA8LSBkb2MgJT4lDQogICAgYm9keV9hZGRfaW1nKHNyYyA9IGltYWdlbiwgd2lkdGggPSA2LCBoZWlnaHQgPSA3KSAlPiUgIA0KICAgIGJvZHlfYWRkX3BhcigiIikgDQp9DQoNCiMgR2VuZXJhciB5IGd1YXJkYXIgZWwgZG9jdW1lbnRvIGdlbmVyYWRvDQoNCiNwcmludChkb2MsIHRhcmdldCA9ICJEb2N1bWVudG9Db25JbWFnZW5lcy5kb2N4IikNCg0KDQpgYGANCg0KDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPkV4cGxvcmFjacOzbiBkZSBkYXRvczwvc3Bhbj4NCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPkFuw6FsaXNpcyBkZSBmcmVjdWVuY2lhczwvc3Bhbj4NCmBgYHtyfQ0KdGV4dCA8LSByZWFkTGluZXMoImh0dHA6Ly93d3cuc3RoZGEuY29tL3N0aGRhL1JEb2MvZXhhbXBsZS1maWxlcy9tYXJ0aW4tbHV0aGVyLWtpbmctaS1oYXZlLWEtZHJlYW0tc3BlZWNoLnR4dCIpICN0cmFlciB0ZXh0byBkZSBpbnRlcm5ldA0KDQpjb3JwdXMgPC0gQ29ycHVzKFZlY3RvclNvdXJjZSh0ZXh0KSkgI1BvbmUgcmVuZ2xvbiBlbiBjYWRhIGNlbGRhIGRlIHZlY3RvciANCiMgaW5zcGVjdCAoY29ycHVzKQ0KY29ycHVzIDwtIHRtX21hcChjb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpICNQb25lIHRvZG8gZW4gbWluaXNjdWxhDQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgcmVtb3ZlUHVuY3R1YXRpb24pICNFbGltaW5hIHB1bnR1YWNpw7NuIA0KY29ycHVzIDwtIHRtX21hcChjb3JwdXMsIHJlbW92ZU51bWJlcnMpICNFbGltaW5hIG7Dum1lcm9zDQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcyAoImVuIikpICNFbGltaW5hIHBhbGFicmFzIHF1ZSBubyBoYWJsYW4gZGVsIHRlbWENCiMgY29ycHVzIDwtIHRtX21hcChjb3JwdXMsIHJlbW92ZVdvcmQsIGMoImRyZWFtIiwgIndpbGwiKSkgI0VsaW1pbmEgcGFsYWJyYXMgcHVudHVhbGVzDQoNCnRkbSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoY29ycHVzKSANCm0gPC0gYXMubWF0cml4KHRkbSkgI0N1ZW50YSBsYXMgdmVjZXMgcXVlIGFwYXJlY2UgY2FkYSBwYWxhYnJhIHBvciByZW5nbG9uDQoNCmZyZWN1ZW5jaWEgPC0gc29ydChyb3dTdW1zKG0pLCBkZWNyZWFzaW5nID0gVFJVRSkgI0N1ZW50YSBsYSBmcmVjdWVuY2lhIGRlIGNhZGEgcGFsYWJyYSBlbiBlbCB0ZXh0byBjb21wbGV0bw0KDQoNCg0KDQoNCg0KZnJlY3VlbmNpYV9kZiA8LSBkYXRhLmZyYW1lKHdvcmQ9bmFtZXMoZnJlY3VlbmNpYSksDQpmcmVxPWZyZWN1ZW5jaWEpICNDb252aWVydGUgbGEgZnJlY3VlbmNpYSBhIGRhdGEgZnJhbWUNCg0KZ2dwbG90KGhlYWQoZnJlY3VlbmNpYV9kZiwxMCksIGFlcyh4PXJlb3JkZXIgKHdvcmQsIC1mcmVxKSwgeT1mcmVxKSkgKw0KICAgICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbCA9ImxpZ2h0Z3JlZW4iKSArIA0KICAgICAgIGxhYnMgKHRpdGxlPSAiVE9QIDEwIHBhbGFicmFzIG3DoXMgZnJlY3VlbnRlcyIsIA0KICAgICAgICAgICAgc3VidGl0dWxlPSAiRGlzY3Vyc28gJ0kgaGF2ZSBhIGRyZWFtJ2RlIE0uIEwuIEtpbmciLCAgeCA9ICJQYWxhYnJhIiwgeT0iRnJlY3VlbmNpYSIpICsgDQogIHlsaW0oMCwyMCkNCiAgDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPk51YmUgZGUgcGFsYWJyYXM8L3NwYW4+DQpgYGB7cn0NCiNFbCBwcm9jZXNhbWllbnRvIGRlIGRhdG9zIGFuZGVzIGRlIGxhIG51YmUgZGUgcGFsYWJyYXMgZXMgaWd1YWwgcXVlIGVuIGFuYWxpc2lzIGRlIGZyZWN1ZW5jaWFzLCBkZXNkZSBpbXBvcnRhciBlbCB0ZXh0byBoYXN0YSBmcmVjdWVuY2lhX2RmDQpzZXQuc2VlZCgxMjMpDQp3b3JkY2xvdWQod29yZHM9ZnJlY3VlbmNpYV9kZiR3b3JkLGZyZXEgPSBmcmVjdWVuY2lhX2RmJGZyZXEsIG1pbi5mcmVxPTEsDQpyYW5kb20ub3JkZXI9RkFMU0UsIGNvbG9ycyA9IGJyZXdlci5wYWwoOCwgIlJkUHUiKSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+RWplcmNpY2lvIDIuIE5vdmVsYSBJVDwvc3Bhbj4NCmBgYHtyfQ0KDQoNCmltYWdlbmVzIDwtIGMoImVzbzNfMS5wbmciLCAiZXNvM18yLnBuZyIsICJlc28zXzMucG5nIikgDQp0ZXh0b3MgPC0gbGFwcGx5KGltYWdlbmVzLCBmdW5jdGlvbihpbWFnZW4pIG9jcihpbWFnZV9yZWFkKGltYWdlbikpKQ0KdGV4dG9fY29tcGxldG8gPC0gcGFzdGUodW5saXN0KHRleHRvcyksIGNvbGxhcHNlID0gIiAiKQ0KDQoNCiMgQ3JlYXIgdW4gY29ycHVzIA0KY29ycHVzIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UodGV4dG9fY29tcGxldG8pKQ0KY29ycHVzIDwtIHRtX21hcChjb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpDQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgcmVtb3ZlUHVuY3R1YXRpb24pDQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgcmVtb3ZlTnVtYmVycykNCmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbiIpKQ0KDQojIENvbnRhciBsYSBmcmVjdWVuY2lhDQp0ZG0gPC0gVGVybURvY3VtZW50TWF0cml4KGNvcnB1cykNCm0gPC0gYXMubWF0cml4KHRkbSkNCmZyZWN1ZW5jaWEgPC0gc29ydChyb3dTdW1zKG0pLCBkZWNyZWFzaW5nID0gVFJVRSkNCg0KZnJlY3VlbmNpYV9kZiA8LSBkYXRhLmZyYW1lKHdvcmQgPSBuYW1lcyhmcmVjdWVuY2lhKSwgZnJlcSA9IGZyZWN1ZW5jaWEpDQoNCnRvcF8xMF9wYWxhYnJhcyA8LSBoZWFkKGZyZWN1ZW5jaWFfZGYsIDEwKQ0KDQojIFJhbmtpbmcgZGUgcGFsYWJyYXMNCnByaW50KHRvcF8xMF9wYWxhYnJhcykNCg0KVmlldyh0b3BfMTBfcGFsYWJyYXMpDQoNCg0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij5FamVyY2ljaW8gMi4gTm92ZWxhIElULiBOdWJlIGRlIHBhbGFicmFzPC9zcGFuPg0KYGBge3J9DQoNCnNldC5zZWVkKDEyMykNCndvcmRjbG91ZCh3b3JkcyA9IGZyZWN1ZW5jaWFfZGYkd29yZCwgZnJlcSA9IGZyZWN1ZW5jaWFfZGYkZnJlcSwgbWluLmZyZXEgPSAxLA0KICAgICAgICAgIHJhbmRvbS5vcmRlciA9IEZBTFNFLCBjb2xvcnMgPSBicmV3ZXIucGFsKDgsICJEYXJrMiIpKQ0KDQpgYGANCg0KDQoNCg0KDQoNCg==