Librerias

library(SnowballC)
library(pdftools)
library(gridExtra)
library(tidytext)
library(stringr)
library(SnowballC)
library(RColorBrewer)
library(text)
library(zoo)
library(tm)
library(textdata)
library(tidyr)
library(ggplot2)
library(dplyr)
library(syuzhet)
library(wordcloud)

Corpus

Aladin de 1992

#Leer PDF
pdf_1992 <- pdf_text("Aladin_1992.pdf")

#Convertir a corpus
corpus_Aladin_1992 <- Corpus(VectorSource(pdf_1992))

Aladin de 2019

#Leer PDF
pdf_2019 <- pdf_text("Aladin_2019.pdf")

#Convertir a corpus
corpus_Aladin_2019 <- Corpus(VectorSource(pdf_2019))

Limpieza

Limpiar el texto de caracteres no deseados

removeQuotationMarks <- content_transformer(function(x) gsub("\"", "", x))

cleanTextEnhanced <- content_transformer(function(x) {
  x <- gsub("[\"“”‘’]", "", x) 
  x <- gsub("[[:punct:]]", "", x)
  x <- gsub("\\s+", " ", x)
  x <- trimws(x)
  return(x)
})

Limpieza “Aladin de 1992”

corpusLimpio_Aladin_1992 <- tm_map(corpus_Aladin_1992, content_transformer(tolower))
corpusLimpio_Aladin_1992 <- tm_map(corpusLimpio_Aladin_1992, removePunctuation, ucp = TRUE)
corpusLimpio_Aladin_1992 <- tm_map(corpusLimpio_Aladin_1992, removeNumbers)
corpusLimpio_Aladin_1992 <- tm_map(corpusLimpio_Aladin_1992, removeWords, stopwords("english"))

Limpieza “Aladin de 2019”

corpusLimpio_Aladin_2019 <- tm_map(corpus_Aladin_2019, content_transformer(tolower))
corpusLimpio_Aladin_2019 <- tm_map(corpusLimpio_Aladin_2019, removePunctuation, ucp = TRUE)
corpusLimpio_Aladin_2019 <- tm_map(corpusLimpio_Aladin_2019, removeNumbers)
corpusLimpio_Aladin_2019 <- tm_map(corpusLimpio_Aladin_2019, removeWords, stopwords("english"))

Analisis de Texto

Term-Document Matrix

#Term-Document Matrix para Aladin de 1992
Matrix_A_1992 <- TermDocumentMatrix(corpusLimpio_Aladin_1992)
#Term-Document Matrix para Aladin de 2019
Matrix_A_2019 <- TermDocumentMatrix(corpusLimpio_Aladin_2019)
#Term-Document Matrix para las versiones convinadas
corpus_A <- c(corpusLimpio_Aladin_1992, corpusLimpio_Aladin_2019)
Matrix_A <- TermDocumentMatrix(corpus_A)
aladin_matrix <- as.matrix(Matrix_A)

Frecuencia de Palabras

freq_terms <- findFreqTerms(Matrix_A, lowfreq = 35)
freq_matrix <- aladin_matrix[freq_terms, ]
apply(freq_matrix, 1, sum)
##        \\n\\n \\n\\naladdin   \\n\\ngenie    \\naladdin           abu 
##            52            58            42            43           122 
##       aladdin           ali          back           can          cant 
##           136            53            79            61            43 
##        carpet          come          dont         genie           get 
##            84            44            90           103            72 
##          good           got          head           hes          iago 
##            37            59            40            48            37 
##         jafar       jasmine          just          know          lamp 
##            86            70            74            50            57 
##          like        little          look         looks          make 
##            92            40            50            59            47 
##           man         never           new           now           one 
##            39            60            35            63            77 
##        prince      princess         pulls         right           see 
##           101            53            36            57            67 
##        sultan          take         thats         think         turns 
##            59            39            53            51            40 
##           way          well          will          wish           yes 
##            39            50            69            65            42 
##         youre 
##            56

Análisis de Asociación

associations <- findAssocs(Matrix_A, "jasmine", 0.3)
#Extraer las asociaciones de 'jasmine' y ordenarlas en orden decreciente
asociacion_jasmine <- associations$jasmine
asociacion_jasmine_sorted <- sort(asociacion_jasmine, decreasing = TRUE)
#Top 5 asociaciones
top_5 <- head(asociacion_jasmine_sorted, 5)
print(top_5)
##     \\nabu \\naladdin   \\ngenie   \\njafar  \\nsultan 
##          1          1          1          1          1

Términos Frecuentes

Términos Frecuentes “Aladin de 1992”

#Terminos frecuentes
TF_Aladin_1992 <- findFreqTerms(Matrix_A_1992, lowfreq = 80)
#Extreaer frecuencias
matrix_F_1992 <- as.matrix(Matrix_A_1992[TF_Aladin_1992, ])
frecuencias_1992 <- rowSums(matrix_F_1992)

Términos Frecuentes “Aladin de 2019”

#Terminos frecuentes
TF_Aladin_2019 <- findFreqTerms(Matrix_A_2019, lowfreq = 20)
#Extreaer frecuencias
matrix_F_2019 <- as.matrix(Matrix_A_2019[TF_Aladin_2019, ])
frecuencias_2019 <- rowSums(matrix_F_2019)

Comparacion entre Aladin de 1992 y 2019

#Crear un data frame para convinar los datos y asi lograr realizar la comparacion
comparacion_frecuencias <- merge(data.frame(Term = names(frecuencias_1992), Aladdin_1992 = frecuencias_1992),
                                 data.frame(Term = names(frecuencias_2019), Aladdin_2019 = frecuencias_2019),
                                 by = "Term", all = TRUE)
#Reemplazar NA´s por 0
comparacion_frecuencias[is.na(comparacion_frecuencias)] <- 0
#Orden para una mejor visualizacion
comparacion_frecuencias <- comparacion_frecuencias[order(-comparacion_frecuencias$Aladdin_1992),]
print(comparacion_frecuencias)
##        Term Aladdin_1992 Aladdin_2019
## 2   aladdin          381          193
## 14    jafar          197           66
## 15  jasmine          194           74
## 1       abu          166           29
## 9     genie          164          133
## 32   sultan          110           43
## 13     iago           93           20
## 6    carpet           89            0
## 3       ali            0           45
## 4       can            0           43
## 5      cant            0           24
## 7      come            0           22
## 8      dont            0           60
## 10      get            0           39
## 11      got            0           30
## 12      hes            0           32
## 16     just            0           42
## 17     know            0           41
## 18     lamp            0           38
## 19     like            0           52
## 20   little            0           20
## 21     make            0           25
## 22    never            0           37
## 23      now            0           40
## 24     okay            0           32
## 25      one            0           47
## 26   people            0           24
## 27   prince            0           77
## 28 princess            0           29
## 29    right            0           43
## 30      say            0           25
## 31      see            0           31
## 33     take            0           25
## 34    thats            0           34
## 35    think            0           40
## 36      way            0           21
## 37     well            0           26
## 38     will            0           47
## 39     wish            0           45
## 40      yes            0           26
## 41    youre            0           34

Nube de Palabras

paleta_de_colores <- colorRampPalette(c("#FFC0CB", "#800080"))

aladin_matrix <- as.matrix(TermDocumentMatrix(corpus_A))
#Calcular la frecuencia de las palabras
frecuencia_palabras <- sort(rowSums(aladin_matrix), decreasing = TRUE)
#Eliminar palabras que comienzan o terminan con comillas de la lista de frecuencia
frecuencia_palabras <- frecuencia_palabras[!grepl('^"|"$', names(frecuencia_palabras))]
#Nube de Palabras
wordcloud(names(frecuencia_palabras), frecuencia_palabras, max.words = 10, colors = paleta_de_colores(10))

Analisis de Sentimientos

Analisis de Sentimientos “Aladin 1992”

#Convertir el corpus a texto plano
aladin_1992_texto<- sapply(corpusLimpio_Aladin_1992, as.character)
#Analisis de Sentimientos
dataframe_emociones_1992 <- get_nrc_sentiment(aladin_1992_texto)
# Cargar los datos de las emociones
S_emociones <- colSums(prop.table(dataframe_emociones_1992[, 1:10]))

# Definir los colores para cada emoción
colores_emociones <- c("anger" = "red", 
                       "anticipation" = "orange", 
                       "disgust" = "gray", 
                       "fear" = "purple", 
                       "joy" = "yellow", 
                       "sadness" = "blue", 
                       "surprise" = "cyan", 
                       "trust" = "green", 
                       "negative" = "darkred", 
                       "positive" = "pink")

# Crear el gráfico de barras
barplot(S_emociones, 
        main = "Análisis de Sentimientos", 
        las = 2,
        col = colores_emociones,  # Asignar colores a cada emoción
        legend.text = FALSE)  

Analisis de Sentimientos “Aladin 2019”

#Convertir el corpus a texto plano
aladin_2019_texto<- sapply(corpusLimpio_Aladin_2019, as.character)
#Analisis de Sentimientos
dataframe_emociones_2019 <- get_nrc_sentiment(aladin_2019_texto)
# Cargar los datos de las emociones
S_emociones2 <- colSums(prop.table(dataframe_emociones_2019[, 1:10]))

# Definir los colores para cada emoción
colores_emociones <- c("anger" = "red", 
                       "anticipation" = "orange", 
                       "disgust" = "gray", 
                       "fear" = "purple", 
                       "joy" = "yellow", 
                       "sadness" = "blue", 
                       "surprise" = "cyan", 
                       "trust" = "green", 
                       "negative" = "darkred", 
                       "positive" = "pink")

# Crear el gráfico de barras
barplot(S_emociones2, 
        main = "Análisis de Sentimientos", 
        las = 2,
        col = colores_emociones,  # Asignar colores a cada emoción
        legend.text = FALSE)  

Comparacion de Analisis de Sentimientos “Aladin 1992 y 2019”

dataframe_emociones_C <- rbind(data.frame(Emociones = names(S_emociones), Proporcion = S_emociones, Version = "1992"),
                              data.frame(Emociones = names(S_emociones2), Proporcion = S_emociones2, Version = "2019"))
ggplot(dataframe_emociones_C, aes(x = Emociones, y = Proporcion, fill = Version)) + 
  geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
  scale_fill_manual(values = c("1992" = "pink", "2019" = "purple")) +
  labs(title = "Análisis Comparativo de Emociones Aladin 1992 vs 2019 ") +
  theme_minimal()

Preguntas

a)

¿Se tomará y analizará todo lo que aparece en la página?

Se esta realizando unanalisis del contenido de los guiones de Aladin en su version de 1992 y 2019, en el cual se incluyen los diálogos de los personajes, notas del guinista, las letras de las canciones, y cualquier otro texto que esté presente.

¿Que si y que no?

Se están aplicando procesos de transformación y limpieza de datos sobre los textos. Lo cual implica la eliminación de palabras vacías, la puntuación y la conversión de todas las palabras a minúsculas. Estos pasos ayudan a preparar el texto para un análisis más eficaz y preciso.”

¿Por qué?

La aplicación de procesos de transformación y limpieza de datos en el texto es crucial por varias razones:

  • Eliminación de palabras vacías: Las palabras vacías, como “y”, “o”, “en”, etc., no aportan un significado relevante al análisis y pueden introducir ruido innecesario. Al eliminar estas palabras, el análisis se centra en las palabras que realmente transmiten información importante.

  • Eliminación de puntuación: La eliminación de la puntuación garantiza que el análisis se base únicamente en las palabras significativas del texto.

  • Conversión a minúsculas: La conversión de todas las palabras a minúsculas ayuda a evitar la duplicación de palabras debido a diferencias de capitalización.

En resumen, estos pasos de limpieza y transformación preparan el texto para un análisis más efectivo y preciso al eliminar el ruido innecesario y garantizar la consistencia en el tratamiento de las palabras. Esto permite obtener resultados más confiables y significativos en el análisis de los datos textuales.

b)

Análisis de Asociasión

Personajes Principales: Con base al previo analisis realizado se llego a la conclusion de que estos son Aladdin y Jasmine, debido a que son mencionados con mayor frecuencia, lo que indica su papel principal en la historia. Cabe mencionar que su presencia destacada en ambas versiones.

Asociaciones de Personajes: La palabra “jasmine” esta asociada al genio, aladin, abu, jafar y el sultan.

Analisis de Sentimientos:

LS0tDQp0aXRsZTogIk00QTEgLSBNw7NkdWxvIDQgLSBUYXJlYSAxIC0gUHJvY2VzYW1pZW50byBkZSBUZXh0byINCmF1dGhvcjogIkxFU0xZIERBUklBTiBST01FUk8gVkFaUVVFWiINCmRhdGU6ICIyMDI0LTAzLTMxIg0Kb3V0cHV0OiANCiBodG1sX2RvY3VtZW50Og0KICAgdG9jOiB0cnVlDQogICB0b2NfZmxvYXQ6IHRydWUNCiAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgIHRoZW1lOiAieWV0aSINCi0tLQ0KDQohW10oQzpcXFVzZXJzXFxsZXNkYV9iNXdmcXFhXFxPbmVEcml2ZSAtIEluc3RpdHV0byBUZWNub2xvZ2ljbyB5IGRlIEVzdHVkaW9zIFN1cGVyaW9yZXMgZGUgTW9udGVycmV5XFxDT05DRU5UUkFDScOTTiBJQSBNT0QgNFxcVEFSRUEgMVxcYWxhZGluLmdpZikNCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPioqTGlicmVyaWFzKio8L3NwYW4+IA0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoU25vd2JhbGxDKQ0KbGlicmFyeShwZGZ0b29scykNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeSh0aWR5dGV4dCkNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoU25vd2JhbGxDKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHRleHQpDQpsaWJyYXJ5KHpvbykNCmxpYnJhcnkodG0pDQpsaWJyYXJ5KHRleHRkYXRhKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHN5dXpoZXQpDQpsaWJyYXJ5KHdvcmRjbG91ZCkNCmBgYA0KDQoNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij4qKkNvcnB1cyoqPC9zcGFuPiANCg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+QWxhZGluIGRlIDE5OTI8L3NwYW4+IA0KYGBge3J9DQojTGVlciBQREYNCnBkZl8xOTkyIDwtIHBkZl90ZXh0KCJBbGFkaW5fMTk5Mi5wZGYiKQ0KDQojQ29udmVydGlyIGEgY29ycHVzDQpjb3JwdXNfQWxhZGluXzE5OTIgPC0gQ29ycHVzKFZlY3RvclNvdXJjZShwZGZfMTk5MikpDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkFsYWRpbiBkZSAyMDE5PC9zcGFuPiANCmBgYHtyfQ0KI0xlZXIgUERGDQpwZGZfMjAxOSA8LSBwZGZfdGV4dCgiQWxhZGluXzIwMTkucGRmIikNCg0KI0NvbnZlcnRpciBhIGNvcnB1cw0KY29ycHVzX0FsYWRpbl8yMDE5IDwtIENvcnB1cyhWZWN0b3JTb3VyY2UocGRmXzIwMTkpKQ0KYGBgDQoNCg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPioqTGltcGllemEqKjwvc3Bhbj4gDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkxpbXBpYXIgZWwgdGV4dG8gZGUgY2FyYWN0ZXJlcyBubyBkZXNlYWRvczwvc3Bhbj4gDQpgYGB7cn0NCnJlbW92ZVF1b3RhdGlvbk1hcmtzIDwtIGNvbnRlbnRfdHJhbnNmb3JtZXIoZnVuY3Rpb24oeCkgZ3N1YigiXCIiLCAiIiwgeCkpDQoNCmNsZWFuVGV4dEVuaGFuY2VkIDwtIGNvbnRlbnRfdHJhbnNmb3JtZXIoZnVuY3Rpb24oeCkgew0KICB4IDwtIGdzdWIoIltcIuKAnOKAneKAmOKAmV0iLCAiIiwgeCkgDQogIHggPC0gZ3N1YigiW1s6cHVuY3Q6XV0iLCAiIiwgeCkNCiAgeCA8LSBnc3ViKCJcXHMrIiwgIiAiLCB4KQ0KICB4IDwtIHRyaW13cyh4KQ0KICByZXR1cm4oeCkNCn0pDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5MaW1waWV6YSAiQWxhZGluIGRlIDE5OTIiPC9zcGFuPiANCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb3JwdXNMaW1waW9fQWxhZGluXzE5OTIgPC0gdG1fbWFwKGNvcnB1c19BbGFkaW5fMTk5MiwgY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSkNCmNvcnB1c0xpbXBpb19BbGFkaW5fMTk5MiA8LSB0bV9tYXAoY29ycHVzTGltcGlvX0FsYWRpbl8xOTkyLCByZW1vdmVQdW5jdHVhdGlvbiwgdWNwID0gVFJVRSkNCmNvcnB1c0xpbXBpb19BbGFkaW5fMTk5MiA8LSB0bV9tYXAoY29ycHVzTGltcGlvX0FsYWRpbl8xOTkyLCByZW1vdmVOdW1iZXJzKQ0KY29ycHVzTGltcGlvX0FsYWRpbl8xOTkyIDwtIHRtX21hcChjb3JwdXNMaW1waW9fQWxhZGluXzE5OTIsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkxpbXBpZXphICJBbGFkaW4gZGUgMjAxOSI8L3NwYW4+IA0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNvcnB1c0xpbXBpb19BbGFkaW5fMjAxOSA8LSB0bV9tYXAoY29ycHVzX0FsYWRpbl8yMDE5LCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQ0KY29ycHVzTGltcGlvX0FsYWRpbl8yMDE5IDwtIHRtX21hcChjb3JwdXNMaW1waW9fQWxhZGluXzIwMTksIHJlbW92ZVB1bmN0dWF0aW9uLCB1Y3AgPSBUUlVFKQ0KY29ycHVzTGltcGlvX0FsYWRpbl8yMDE5IDwtIHRtX21hcChjb3JwdXNMaW1waW9fQWxhZGluXzIwMTksIHJlbW92ZU51bWJlcnMpDQpjb3JwdXNMaW1waW9fQWxhZGluXzIwMTkgPC0gdG1fbWFwKGNvcnB1c0xpbXBpb19BbGFkaW5fMjAxOSwgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiZW5nbGlzaCIpKQ0KYGBgDQoNCg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPioqQW5hbGlzaXMgZGUgVGV4dG8qKjwvc3Bhbj4gDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPlRlcm0tRG9jdW1lbnQgTWF0cml4PC9zcGFuPiANCmBgYHtyfQ0KI1Rlcm0tRG9jdW1lbnQgTWF0cml4IHBhcmEgQWxhZGluIGRlIDE5OTINCk1hdHJpeF9BXzE5OTIgPC0gVGVybURvY3VtZW50TWF0cml4KGNvcnB1c0xpbXBpb19BbGFkaW5fMTk5MikNCmBgYA0KDQpgYGB7cn0NCiNUZXJtLURvY3VtZW50IE1hdHJpeCBwYXJhIEFsYWRpbiBkZSAyMDE5DQpNYXRyaXhfQV8yMDE5IDwtIFRlcm1Eb2N1bWVudE1hdHJpeChjb3JwdXNMaW1waW9fQWxhZGluXzIwMTkpDQpgYGANCg0KYGBge3J9DQojVGVybS1Eb2N1bWVudCBNYXRyaXggcGFyYSBsYXMgdmVyc2lvbmVzIGNvbnZpbmFkYXMNCmNvcnB1c19BIDwtIGMoY29ycHVzTGltcGlvX0FsYWRpbl8xOTkyLCBjb3JwdXNMaW1waW9fQWxhZGluXzIwMTkpDQpNYXRyaXhfQSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoY29ycHVzX0EpDQphbGFkaW5fbWF0cml4IDwtIGFzLm1hdHJpeChNYXRyaXhfQSkNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPkZyZWN1ZW5jaWEgZGUgUGFsYWJyYXM8L3NwYW4+IA0KYGBge3J9DQpmcmVxX3Rlcm1zIDwtIGZpbmRGcmVxVGVybXMoTWF0cml4X0EsIGxvd2ZyZXEgPSAzNSkNCmZyZXFfbWF0cml4IDwtIGFsYWRpbl9tYXRyaXhbZnJlcV90ZXJtcywgXQ0KYXBwbHkoZnJlcV9tYXRyaXgsIDEsIHN1bSkNCmBgYA0KDQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5BbsOhbGlzaXMgZGUgQXNvY2lhY2nDs248L3NwYW4+IA0KYGBge3J9DQphc3NvY2lhdGlvbnMgPC0gZmluZEFzc29jcyhNYXRyaXhfQSwgImphc21pbmUiLCAwLjMpDQpgYGANCg0KYGBge3J9DQojRXh0cmFlciBsYXMgYXNvY2lhY2lvbmVzIGRlICdqYXNtaW5lJyB5IG9yZGVuYXJsYXMgZW4gb3JkZW4gZGVjcmVjaWVudGUNCmFzb2NpYWNpb25famFzbWluZSA8LSBhc3NvY2lhdGlvbnMkamFzbWluZQ0KYXNvY2lhY2lvbl9qYXNtaW5lX3NvcnRlZCA8LSBzb3J0KGFzb2NpYWNpb25famFzbWluZSwgZGVjcmVhc2luZyA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQojVG9wIDUgYXNvY2lhY2lvbmVzDQp0b3BfNSA8LSBoZWFkKGFzb2NpYWNpb25famFzbWluZV9zb3J0ZWQsIDUpDQpwcmludCh0b3BfNSkNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPlTDqXJtaW5vcyBGcmVjdWVudGVzPC9zcGFuPiANCg0KIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPlTDqXJtaW5vcyBGcmVjdWVudGVzICJBbGFkaW4gZGUgMTk5MiI8L3NwYW4+IA0KYGBge3J9DQojVGVybWlub3MgZnJlY3VlbnRlcw0KVEZfQWxhZGluXzE5OTIgPC0gZmluZEZyZXFUZXJtcyhNYXRyaXhfQV8xOTkyLCBsb3dmcmVxID0gODApDQpgYGANCg0KYGBge3J9DQojRXh0cmVhZXIgZnJlY3VlbmNpYXMNCm1hdHJpeF9GXzE5OTIgPC0gYXMubWF0cml4KE1hdHJpeF9BXzE5OTJbVEZfQWxhZGluXzE5OTIsIF0pDQpmcmVjdWVuY2lhc18xOTkyIDwtIHJvd1N1bXMobWF0cml4X0ZfMTk5MikNCg0KYGBgDQoNCg0KIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPlTDqXJtaW5vcyBGcmVjdWVudGVzICJBbGFkaW4gZGUgMjAxOSI8L3NwYW4+IA0KYGBge3J9DQojVGVybWlub3MgZnJlY3VlbnRlcw0KVEZfQWxhZGluXzIwMTkgPC0gZmluZEZyZXFUZXJtcyhNYXRyaXhfQV8yMDE5LCBsb3dmcmVxID0gMjApDQpgYGANCg0KYGBge3J9DQojRXh0cmVhZXIgZnJlY3VlbmNpYXMNCm1hdHJpeF9GXzIwMTkgPC0gYXMubWF0cml4KE1hdHJpeF9BXzIwMTlbVEZfQWxhZGluXzIwMTksIF0pDQpmcmVjdWVuY2lhc18yMDE5IDwtIHJvd1N1bXMobWF0cml4X0ZfMjAxOSkNCg0KYGBgDQoNCg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+Q29tcGFyYWNpb24gZW50cmUgQWxhZGluIGRlIDE5OTIgeSAyMDE5PC9zcGFuPiANCmBgYHtyfQ0KI0NyZWFyIHVuIGRhdGEgZnJhbWUgcGFyYSBjb252aW5hciBsb3MgZGF0b3MgeSBhc2kgbG9ncmFyIHJlYWxpemFyIGxhIGNvbXBhcmFjaW9uDQpjb21wYXJhY2lvbl9mcmVjdWVuY2lhcyA8LSBtZXJnZShkYXRhLmZyYW1lKFRlcm0gPSBuYW1lcyhmcmVjdWVuY2lhc18xOTkyKSwgQWxhZGRpbl8xOTkyID0gZnJlY3VlbmNpYXNfMTk5MiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKFRlcm0gPSBuYW1lcyhmcmVjdWVuY2lhc18yMDE5KSwgQWxhZGRpbl8yMDE5ID0gZnJlY3VlbmNpYXNfMjAxOSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJUZXJtIiwgYWxsID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCiNSZWVtcGxhemFyIE5BwrRzIHBvciAwDQpjb21wYXJhY2lvbl9mcmVjdWVuY2lhc1tpcy5uYShjb21wYXJhY2lvbl9mcmVjdWVuY2lhcyldIDwtIDANCmBgYA0KDQpgYGB7cn0NCiNPcmRlbiBwYXJhIHVuYSBtZWpvciB2aXN1YWxpemFjaW9uDQpjb21wYXJhY2lvbl9mcmVjdWVuY2lhcyA8LSBjb21wYXJhY2lvbl9mcmVjdWVuY2lhc1tvcmRlcigtY29tcGFyYWNpb25fZnJlY3VlbmNpYXMkQWxhZGRpbl8xOTkyKSxdDQpgYGANCg0KYGBge3J9DQpwcmludChjb21wYXJhY2lvbl9mcmVjdWVuY2lhcykNCmBgYA0KDQoNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij4qKk51YmUgZGUgUGFsYWJyYXMqKjwvc3Bhbj4gDQpgYGB7cn0NCnBhbGV0YV9kZV9jb2xvcmVzIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygiI0ZGQzBDQiIsICIjODAwMDgwIikpDQoNCmFsYWRpbl9tYXRyaXggPC0gYXMubWF0cml4KFRlcm1Eb2N1bWVudE1hdHJpeChjb3JwdXNfQSkpDQoNCmBgYA0KDQpgYGB7cn0NCiNDYWxjdWxhciBsYSBmcmVjdWVuY2lhIGRlIGxhcyBwYWxhYnJhcw0KZnJlY3VlbmNpYV9wYWxhYnJhcyA8LSBzb3J0KHJvd1N1bXMoYWxhZGluX21hdHJpeCksIGRlY3JlYXNpbmcgPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KI0VsaW1pbmFyIHBhbGFicmFzIHF1ZSBjb21pZW56YW4gbyB0ZXJtaW5hbiBjb24gY29taWxsYXMgZGUgbGEgbGlzdGEgZGUgZnJlY3VlbmNpYQ0KZnJlY3VlbmNpYV9wYWxhYnJhcyA8LSBmcmVjdWVuY2lhX3BhbGFicmFzWyFncmVwbCgnXiJ8IiQnLCBuYW1lcyhmcmVjdWVuY2lhX3BhbGFicmFzKSldDQpgYGANCg0KYGBge3J9DQojTnViZSBkZSBQYWxhYnJhcw0Kd29yZGNsb3VkKG5hbWVzKGZyZWN1ZW5jaWFfcGFsYWJyYXMpLCBmcmVjdWVuY2lhX3BhbGFicmFzLCBtYXgud29yZHMgPSAxMCwgY29sb3JzID0gcGFsZXRhX2RlX2NvbG9yZXMoMTApKQ0KYGBgDQoNCg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPioqQW5hbGlzaXMgZGUgU2VudGltaWVudG9zKio8L3NwYW4+IA0KDQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5BbmFsaXNpcyBkZSBTZW50aW1pZW50b3MgIkFsYWRpbiAxOTkyIjwvc3Bhbj4gDQpgYGB7cn0NCiNDb252ZXJ0aXIgZWwgY29ycHVzIGEgdGV4dG8gcGxhbm8NCmFsYWRpbl8xOTkyX3RleHRvPC0gc2FwcGx5KGNvcnB1c0xpbXBpb19BbGFkaW5fMTk5MiwgYXMuY2hhcmFjdGVyKQ0KYGBgDQoNCmBgYHtyfQ0KI0FuYWxpc2lzIGRlIFNlbnRpbWllbnRvcw0KZGF0YWZyYW1lX2Vtb2Npb25lc18xOTkyIDwtIGdldF9ucmNfc2VudGltZW50KGFsYWRpbl8xOTkyX3RleHRvKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDYXJnYXIgbG9zIGRhdG9zIGRlIGxhcyBlbW9jaW9uZXMNClNfZW1vY2lvbmVzIDwtIGNvbFN1bXMocHJvcC50YWJsZShkYXRhZnJhbWVfZW1vY2lvbmVzXzE5OTJbLCAxOjEwXSkpDQoNCiMgRGVmaW5pciBsb3MgY29sb3JlcyBwYXJhIGNhZGEgZW1vY2nDs24NCmNvbG9yZXNfZW1vY2lvbmVzIDwtIGMoImFuZ2VyIiA9ICJyZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgImFudGljaXBhdGlvbiIgPSAib3JhbmdlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJkaXNndXN0IiA9ICJncmF5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICJmZWFyIiA9ICJwdXJwbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgImpveSIgPSAieWVsbG93IiwgDQogICAgICAgICAgICAgICAgICAgICAgICJzYWRuZXNzIiA9ICJibHVlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJzdXJwcmlzZSIgPSAiY3lhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAidHJ1c3QiID0gImdyZWVuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSIgPSAiZGFya3JlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUiID0gInBpbmsiKQ0KDQojIENyZWFyIGVsIGdyw6FmaWNvIGRlIGJhcnJhcw0KYmFycGxvdChTX2Vtb2Npb25lcywgDQogICAgICAgIG1haW4gPSAiQW7DoWxpc2lzIGRlIFNlbnRpbWllbnRvcyIsIA0KICAgICAgICBsYXMgPSAyLA0KICAgICAgICBjb2wgPSBjb2xvcmVzX2Vtb2Npb25lcywgICMgQXNpZ25hciBjb2xvcmVzIGEgY2FkYSBlbW9jacOzbg0KICAgICAgICBsZWdlbmQudGV4dCA9IEZBTFNFKSAgDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+QW5hbGlzaXMgZGUgU2VudGltaWVudG9zICJBbGFkaW4gMjAxOSI8L3NwYW4+IA0KYGBge3J9DQojQ29udmVydGlyIGVsIGNvcnB1cyBhIHRleHRvIHBsYW5vDQphbGFkaW5fMjAxOV90ZXh0bzwtIHNhcHBseShjb3JwdXNMaW1waW9fQWxhZGluXzIwMTksIGFzLmNoYXJhY3RlcikNCmBgYA0KDQpgYGB7cn0NCiNBbmFsaXNpcyBkZSBTZW50aW1pZW50b3MNCmRhdGFmcmFtZV9lbW9jaW9uZXNfMjAxOSA8LSBnZXRfbnJjX3NlbnRpbWVudChhbGFkaW5fMjAxOV90ZXh0bykNCmBgYA0KDQpgYGB7cn0NCiMgQ2FyZ2FyIGxvcyBkYXRvcyBkZSBsYXMgZW1vY2lvbmVzDQpTX2Vtb2Npb25lczIgPC0gY29sU3Vtcyhwcm9wLnRhYmxlKGRhdGFmcmFtZV9lbW9jaW9uZXNfMjAxOVssIDE6MTBdKSkNCg0KIyBEZWZpbmlyIGxvcyBjb2xvcmVzIHBhcmEgY2FkYSBlbW9jacOzbg0KY29sb3Jlc19lbW9jaW9uZXMgPC0gYygiYW5nZXIiID0gInJlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiYW50aWNpcGF0aW9uIiA9ICJvcmFuZ2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgImRpc2d1c3QiID0gImdyYXkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgImZlYXIiID0gInB1cnBsZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiam95IiA9ICJ5ZWxsb3ciLCANCiAgICAgICAgICAgICAgICAgICAgICAgInNhZG5lc3MiID0gImJsdWUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgInN1cnByaXNlIiA9ICJjeWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJ0cnVzdCIgPSAiZ3JlZW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlIiA9ICJkYXJrcmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGl2ZSIgPSAicGluayIpDQoNCiMgQ3JlYXIgZWwgZ3LDoWZpY28gZGUgYmFycmFzDQpiYXJwbG90KFNfZW1vY2lvbmVzMiwgDQogICAgICAgIG1haW4gPSAiQW7DoWxpc2lzIGRlIFNlbnRpbWllbnRvcyIsIA0KICAgICAgICBsYXMgPSAyLA0KICAgICAgICBjb2wgPSBjb2xvcmVzX2Vtb2Npb25lcywgICMgQXNpZ25hciBjb2xvcmVzIGEgY2FkYSBlbW9jacOzbg0KICAgICAgICBsZWdlbmQudGV4dCA9IEZBTFNFKSAgDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IENvbXBhcmFjaW9uIGRlIEFuYWxpc2lzIGRlIFNlbnRpbWllbnRvcyAiQWxhZGluIDE5OTIgeSAyMDE5Ijwvc3Bhbj4gDQoNCmBgYHtyfQ0KZGF0YWZyYW1lX2Vtb2Npb25lc19DIDwtIHJiaW5kKGRhdGEuZnJhbWUoRW1vY2lvbmVzID0gbmFtZXMoU19lbW9jaW9uZXMpLCBQcm9wb3JjaW9uID0gU19lbW9jaW9uZXMsIFZlcnNpb24gPSAiMTk5MiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShFbW9jaW9uZXMgPSBuYW1lcyhTX2Vtb2Npb25lczIpLCBQcm9wb3JjaW9uID0gU19lbW9jaW9uZXMyLCBWZXJzaW9uID0gIjIwMTkiKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYXRhZnJhbWVfZW1vY2lvbmVzX0MsIGFlcyh4ID0gRW1vY2lvbmVzLCB5ID0gUHJvcG9yY2lvbiwgZmlsbCA9IFZlcnNpb24pKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiMTk5MiIgPSAicGluayIsICIyMDE5IiA9ICJwdXJwbGUiKSkgKw0KICBsYWJzKHRpdGxlID0gIkFuw6FsaXNpcyBDb21wYXJhdGl2byBkZSBFbW9jaW9uZXMgQWxhZGluIDE5OTIgdnMgMjAxOSAiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPioqUHJlZ3VudGFzKio8L3NwYW4+IA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPmEpPC9zcGFuPiANCg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+wr9TZSB0b21hcsOhIHkgYW5hbGl6YXLDoSB0b2RvIGxvIHF1ZSBhcGFyZWNlIGVuIGxhIHDDoWdpbmE/PC9zcGFuPiANCg0KU2UgZXN0YSByZWFsaXphbmRvIHVuYW5hbGlzaXMgZGVsIGNvbnRlbmlkbyBkZSBsb3MgZ3Vpb25lcyBkZSBBbGFkaW4gZW4gc3UgdmVyc2lvbiBkZSAxOTkyIHkgMjAxOSwgZW4gZWwgY3VhbCBzZSBpbmNsdXllbiBsb3MgZGnDoWxvZ29zIGRlIGxvcyBwZXJzb25hamVzLCBub3RhcyBkZWwgZ3VpbmlzdGEsIGxhcyBsZXRyYXMgZGUgbGFzIGNhbmNpb25lcywgeSBjdWFscXVpZXIgb3RybyB0ZXh0byBxdWUgZXN0w6kgcHJlc2VudGUuDQoNCg0KIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPsK/UXVlIHNpIHkgcXVlIG5vPzwvc3Bhbj4gDQoNClNlIGVzdMOhbiBhcGxpY2FuZG8gcHJvY2Vzb3MgZGUgdHJhbnNmb3JtYWNpw7NuIHkgbGltcGllemEgZGUgZGF0b3Mgc29icmUgbG9zIHRleHRvcy4gTG8gY3VhbCBpbXBsaWNhIGxhIGVsaW1pbmFjacOzbiBkZSBwYWxhYnJhcyB2YWPDrWFzLCBsYSBwdW50dWFjacOzbiB5IGxhIGNvbnZlcnNpw7NuIGRlIHRvZGFzIGxhcyBwYWxhYnJhcyBhIG1pbsO6c2N1bGFzLiBFc3RvcyBwYXNvcyBheXVkYW4gYSBwcmVwYXJhciBlbCB0ZXh0byBwYXJhIHVuIGFuw6FsaXNpcyBtw6FzIGVmaWNheiB5IHByZWNpc28uIg0KDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij7Cv1BvciBxdcOpPzwvc3Bhbj4gDQoNCkxhIGFwbGljYWNpw7NuIGRlIHByb2Nlc29zIGRlIHRyYW5zZm9ybWFjacOzbiB5IGxpbXBpZXphIGRlIGRhdG9zIGVuIGVsIHRleHRvIGVzIGNydWNpYWwgcG9yIHZhcmlhcyByYXpvbmVzOg0KDQotICpFbGltaW5hY2nDs24gZGUgcGFsYWJyYXMgdmFjw61hcyo6IA0KICBMYXMgcGFsYWJyYXMgdmFjw61hcywgY29tbyAieSIsICJvIiwgImVuIiwgZXRjLiwgbm8gYXBvcnRhbiB1biBzaWduaWZpY2FkbyByZWxldmFudGUgYWwgYW7DoWxpc2lzIHkgcHVlZGVuIGludHJvZHVjaXIgcnVpZG8gaW5uZWNlc2FyaW8uIEFsIGVsaW1pbmFyIGVzdGFzIHBhbGFicmFzLCBlbCBhbsOhbGlzaXMgc2UgY2VudHJhIGVuIGxhcyBwYWxhYnJhcyBxdWUgcmVhbG1lbnRlIHRyYW5zbWl0ZW4gaW5mb3JtYWNpw7NuIGltcG9ydGFudGUuDQoNCi0gKkVsaW1pbmFjacOzbiBkZSBwdW50dWFjacOzbjoqIA0KICBMYSBlbGltaW5hY2nDs24gZGUgbGEgcHVudHVhY2nDs24gZ2FyYW50aXphIHF1ZSBlbCBhbsOhbGlzaXMgc2UgYmFzZSDDum5pY2FtZW50ZSBlbiBsYXMgcGFsYWJyYXMgc2lnbmlmaWNhdGl2YXMgZGVsIHRleHRvLg0KDQotICpDb252ZXJzacOzbiBhIG1pbsO6c2N1bGFzOiogDQogIExhIGNvbnZlcnNpw7NuIGRlIHRvZGFzIGxhcyBwYWxhYnJhcyBhIG1pbsO6c2N1bGFzIGF5dWRhIGEgZXZpdGFyIGxhIGR1cGxpY2FjacOzbiBkZSBwYWxhYnJhcyBkZWJpZG8gYSBkaWZlcmVuY2lhcyBkZSBjYXBpdGFsaXphY2nDs24uIA0KDQpFbiByZXN1bWVuLCBlc3RvcyBwYXNvcyBkZSBsaW1waWV6YSB5IHRyYW5zZm9ybWFjacOzbiBwcmVwYXJhbiBlbCB0ZXh0byBwYXJhIHVuIGFuw6FsaXNpcyBtw6FzIGVmZWN0aXZvIHkgcHJlY2lzbyBhbCBlbGltaW5hciBlbCBydWlkbyBpbm5lY2VzYXJpbyB5IGdhcmFudGl6YXIgbGEgY29uc2lzdGVuY2lhIGVuIGVsIHRyYXRhbWllbnRvIGRlIGxhcyBwYWxhYnJhcy4gRXN0byBwZXJtaXRlIG9idGVuZXIgcmVzdWx0YWRvcyBtw6FzIGNvbmZpYWJsZXMgeSBzaWduaWZpY2F0aXZvcyBlbiBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIHRleHR1YWxlcy4NCg0KDQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5iKTwvc3Bhbj4gDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5BbsOhbGlzaXMgZGUgQXNvY2lhc2nDs24gIDwvc3Bhbj4gDQoNCipQZXJzb25hamVzIFByaW5jaXBhbGVzOiogDQogIENvbiBiYXNlIGFsIHByZXZpbyBhbmFsaXNpcyByZWFsaXphZG8gc2UgbGxlZ28gYSBsYSBjb25jbHVzaW9uIGRlIHF1ZSBlc3RvcyBzb24gQWxhZGRpbiB5IEphc21pbmUsIGRlYmlkbyBhIHF1ZSBzb24gbWVuY2lvbmFkb3MgY29uIG1heW9yIGZyZWN1ZW5jaWEsIGxvIHF1ZSBpbmRpY2Egc3UgcGFwZWwgcHJpbmNpcGFsIGVuIGxhIGhpc3RvcmlhLiBDYWJlIG1lbmNpb25hciBxdWUgc3UgcHJlc2VuY2lhIGRlc3RhY2FkYSBlbiBhbWJhcyB2ZXJzaW9uZXMuDQoNCipBc29jaWFjaW9uZXMgZGUgUGVyc29uYWplczoqDQogIExhIHBhbGFicmEgImphc21pbmUiIGVzdGEgYXNvY2lhZGEgYWwgZ2VuaW8sIGFsYWRpbiwgYWJ1LCBqYWZhciB5IGVsIHN1bHRhbi4NCg0KKkFuYWxpc2lzIGRlIFNlbnRpbWllbnRvczoqDQoNCg0K