Introducción

Los hashtags son objetos digitales “nativos” (Rogers 2013). Si bien hay objetos en el mundo digital que tienen un paralelo en la vida offline, como el texto y la imagen, que preexistían a la digitalización, existen otros objetos que nacen con la Web. El hashtag es un desarrollo particular del hiperenlace, un centro de convergencia temático entre los múltiples hilos de la Web, un hiperespacio donde convergen algunas de esas lineas de vida de las que nos hablaba Ingold (2015).

En nuestro país el uso de hashtags no parece tan extendido como en otras latitudes. Sin embargo, en el ultimo tiempo se ha visto el uso relativamente masivo de varios de ellos, como un agregador de sentidos, demandas y actividades, principalmente por grupos activistas; por ejemplo, #TipnisEnResistencia, #MejorInternetYa, #NiUnaMenos, y recientemente #BoliviaDijoNo, #21FDiaDeLaMentira y #Paro21F. El uso de hashtags tiene claras ventajas para los usuarios, pero también para los analistas de redes sociales que constantemente tienen que naufragar en cantidades enormes de datos y conversaciones caóticas dispersas en diversos espacios. Aquí el hashtag funciona como un agregador de opinión pública.

La pasada semana nació una tendencia en las redes que tenía como eje central la figura del presidente Evo Morales. El hashtag #RayoEvolizador nació en Twitter, como un remix de otros hashtags similares en otros países, y rápidamente se expandió a otras plataformas. El centro son los memes que son parte “del remix y la cultura participativa en la que los usuarios agregan, apropian, imitan, parodian, remezclan, editorializan y transforman el contenido original de alguna manera” (Vicery 2015: 1450) Pero además los memes de #RayoEvolizador más allá del contenido visual, portan textos, usuarios, grupos, opiniones, contraopiniones, antagonismos, pulsiones y tácticas.

Si bien parece simplemente un hashtag de “ocio”, en realidad es un hashtag políticamente relevante por las siguientes razones. Primero tiene como centro temático a la imagen del presidente del país. Segundo es una muestra acotada de una nueva forma de generar opinión pública en las redes: la de la sátira política en red, una combinación de humor y crítica. Y tercero, en este hashtag han confluido dos dinámicas distintas, la dinámica civil espontanea y la dinámica política planificada, la primera más participativa y caótica y la segunda más centralizada y planificada.

El objetivo de este artículo es el de analizar las dinámicas estructurales de opinión en torno al hashtag #RayoEvolizador en Twitter. Por dinámica estructural entendemos el conjunto de patrones de redes de comunicación, y no así las dinámicas de contenido que dejamos para otro estudio. Para ello utilizaremos principalmente técnicas del Social Network Analysis (SNA), particularmente los algoritmos de detección de comunidades1, también llamados módulos, y algunas medidas de centralidad nodal. El Análisis de Redes Sociales es “un método estructural-relacional, formal y cuantitativo que se interesa por los patrones de interacciones entre los actores” (Ojeda 2015: 17). Este método nos permitirá identificar algunos patrones relevantes en las dinámicas de agrupación y opinión que de otro modo no serían visibles mediante, por ejemplo, la etnografía o la estadística tradicional.

Recolección de datos

Hemos recolectado todos los tweets que contienen el hashtag #RayoEvolizador, desde su creación el 28 de febrero de 2018 hasta el 5 de marzo de 2018 (censo), mediante el paquete SocialMediaLab:

library(SocialMediaLab)
library(magrittr)

# Autenticación y recolección de datos
rayo <- Authenticate("twitter", apiKey = "", apiSecret="", accessToken="", accessTokenSecret="") %>% Collect(searchTerm="#rayoevolizador", numTweets=1500, verbose=TRUE, maxID = "967395488524795904") 

A partir de varias iteraciones, conseguimos un dataset de 6218 tweets:

rayo

Dado que nos concentraremos en las formas de conversación, de momento no nos interesa el contenido de la variable text, por lo que solo utilizaremos las siguientes variables: from_user, reply_to y users_mentioned. A partir de ellas crearemos una red de actores donde los nodos representan usuarios de Twitter que participaron en el hashtag y las aristas representan una mención, réplica o retweet de un usuario \(i\) hacia un usuario \(j\) dado un tweet \(k\).

library(igraph)

# Creamos la red en una estructura de datos apropiada (clase: igraph)
rayoactor <- rayo %>% Create("actor") 

Guardamos los datos en formato GraphML para luego medirlo y visualizarlo en Gephi.

write.graph(rayoactor, "rayoactor.graphml", "graphml")

Resultados

Frecuencia de los tweets y origen del hashtag

Todos los fenómenos virales tienen un origen, una difusión y un decaimiento, siguiendo la categorización de KnowYourMeme. Para el caso de #RayoEvolizador, mostramos a continuación esa dinámica de tweets en el tiempo:

library(rtweet)
library(ggplot2)
ts_plot(rayo, "hours") +
    theme_minimal() +
    scale_x_datetime(date_breaks = "1 day", date_label = "%m-%d") +
    labs(x = "Tiempo", y = "Número de tweets",
    title = "Figura 1. Frecuencia de tweets sobre #RayoEvolizador",
    subtitle = "",
    caption = "Fuente: Elaboración propia a partir de datos recolectados de la API de Twitter"
  )

El pico más alto de producción de mensajes se da el día de creación del hashtag, el 28 de febrero. Aunque hay un cierto remonte el 2 de marzo después de que @evoespueblo y la prensa le prestan atención al hashtag.

La primera comunidad en aparecer el 28 de febrero es la que surge alrededor del primer tweet del usuario @dexanfetamina, un usuario cruceño. Esta comunidad evolucionará para ser la comunidad más grande y activa posteriormente, solo opacada en numero, pero no en densidad, por la de @evoespueblo.

Figura 2. Origen del hashtag

Figura 2. Origen del hashtag

El grafo entero

Antes de ir a las comunidades, visualizaremos primero el panorama general de la red entera del hashtag. Los parámetros de la visualización que adoptamos son los siguientes:

Parámetro Valor
Tipo de grafo Dirigido y ponderado
Nodos 2353
Aristas 6224
Algoritmo de disposición Yifan Hu
Tamaño de nodos En función al calculo del grado ponderado
Color de nodos En función al calculo de modularidad2

En este caso, debido a la gran cantidad de nodos, hemos optado en principio por no visualizar todas sus etiquetas. Sólo mostramos las etiquetas para los nodos que tienen un grado mayor a 50, por lo que se pueden observar los actores más centrales en cada comunidad:

Figura 3. Grafo entero de #RayoEvolizador

Figura 3. Grafo entero de #RayoEvolizador

A primera vista se puede ver en el grafo entero dos campos. El de la derecha donde se ve una interacción más densa y caótica entre varias comunidades y el de la izquierda donde existe un circulo cerrado o burbuja de conversación alrededor del nodo central que es @evoespueblo.

La Figura 3 muestra un snapshot del total de nodos e interacciones que participaron en el hashtag, pero ahora necesitamos una análisis diacrónico. A continuación veremos las comunidades en orden de aparición, que nos permiten deducir su dinámica comunicativa.

A. Comunidad de opinión civil

La comunidad que originó el hashtag creció con el tiempo. En la forma de sus interacciones, vemos que existen algunos centros claros, pero en general es bastante participativo Llamaremos a su forma como “orgánica”“, no en el sentido del sindicato, que implica obediencia a la estructura y decisiones colectivas, sino en el sentido de las redes sociales digitales, que implica formación de algo a partir de cadenas horizontales de interacciones.

Figura 4. Grafo de la comunidad de opinión civil

Figura 4. Grafo de la comunidad de opinión civil

En esta comunidad tienen mayor presencia usuarios de Twitter que no son políticos ni activistas, sino principalmente cuentas dedicadas a difundir memes textuales, historias y algunos blogueros. Muchos de ellos incluso actúan a partir de un avatar, mostrando la fuerza de la anonimidad en Internet. Para evitar connotaciones de tinte político o activista, los llamaremos “civiles”.

library(readr)
library(dplyr)
library(magrittr)
centrales <- read_csv("centrales.csv")
filter(centrales, Comunidad == "A") %>% 
  knitr::kable()
Comunidad Usuario Grado entrante Grado saliente Grado ponderado
A Dexanfetamina 267 250 517
A ciudadano_scz 52 200 252
A alebalcazar 219 23 242
A cristhianj1992 180 3 183
A carmen_jul_ 15 115 130
A angelcaido666x 80 50 130
A leonardortn 124 0 124
A carlos_olivera 110 0 110
A UCruceno 88 2 90
A Jonatangl 74 9 83

Así, esta es una comunidad de opinión orgánica y civil. Al revisar sus tweets se puede observar que su motivación al implicarse con hashtag parece principalmente lúdica.

B. Comunidad de opinión activista oficialista

La segunda comunidad que emergió fue de activistas oficialistas y algunas cuentas del gobierno. Su forma es similar a la anterior comunidad, sin embargo como ellos no originaron el mene, es más bien una comunidad con múltiples centros, esto es, descentralizada.

Figura 5. Grafo de la comunidad de opinión oficialista

Figura 5. Grafo de la comunidad de opinión oficialista

No son necesariamente funcionarios, su comportamiento parece más bien de activistas, en este caso progobierno.

filter(centrales, Comunidad == "B") %>% 
  knitr::kable()
Comunidad Usuario Grado entrante Grado saliente Grado ponderado
B Axel1Ray1 350 161 511
B Calderory 231 51 282
B tritigrehernan 93 66 159
B llamerosolo 83 56 139
B Bol_vamosbien 86 14 100
B TOJPA 42 39 81
B axraythel 64 16 80
B FranklinTerraz2 4 75 79
B guialbar 0 74 74
B AdrianaVerito20 0 68 68

Esta es una comunidad de opinión descentralizada de activistas oficialistas. Los posts muestran su interés en defender la imagen de Evo Morales. Su motivación parece ser táctica.

C. Comunidad de opinión activista opositora

La tercera comunidad tiene una forma similar a la anterior, una forma descentralizada e interactiva.

Figura 6. Grafo de la comunidad de opinión activista opositora Los actores principales aquí son activistas y personajes críticos al gobierno, e incluso algunas cuentas con avatares. Diremos, por simpleza, que son de “oposición” no en el sentido de oposición política partidaria necesariamente, pero sí en un sentido de contraposición o crítica al oficialismo.

filter(centrales, Comunidad == "C") %>% 
  knitr::kable()
Comunidad Usuario Grado entrante Grado saliente Grado ponderado
C asaoyvino 398 30 428
C ciudadan0libre 142 2 144
C FlokiBoliviano 107 4 111
C danforever 110 0 110
C RobertCarhlos 89 0 89
C viviza3 88 0 88
C martindiazmeave 77 4 81
C LetteLop 59 18 77
C tupackatari51 62 10 72
C PabloEid 62 6 68

Esta es una comunidad descentralizada de activismo opositor. Existe aquí una mezcla entre intereses tácticos y lúdicos. En el grafo dinámico que veremos más adelante, veremos que es una de las comunidades que más conversación generó con otros grupos.

D. Comunidad de opinión gubernamental

La cuarta comunidad es la más sorpresiva en cuánto a su peculiar forma. Fue la que se desarrolló alrededor de @evoespueblo. Es una comunidad extremadamente centralizada y dispersa entre sí.

Figura 7. Grafo de la comunidad oficialista centralizada

Figura 7. Grafo de la comunidad oficialista centralizada

Entre los miembros existen algunos usuarios críticos que mencionan a @evoespueblo, pero la mayoría son usuarios de apoyo de cuentas internacionales o nacionales. Queda por confirmar si son cuentas de apoyo espontaneo, planificado, pagado o simplemente bots, pues la estructura de interacción aquí es bastante peculiar.

filter(centrales, Comunidad == "D") %>% 
  knitr::kable()
Comunidad Usuario Grado entrante Grado saliente Grado ponderado
D evoespueblo 2084 0 2084
D PorSu_Nombre 0 6 6
D 2011Martina 0 5 5
D yuriyaguana 0 5 5
D Hector04748898 0 4 4
D efrain7272 0 4 4
D NievaEchii 0 4 4
D Bachmir 0 4 4
D marianapbo82 0 4 4
D Cristin02226447 0 3 3

Esta es una comunidad centralizada alrededor de una cuenta gubernamental En el grafo dinámico se verá que esta comunidad tiene una fuerte relación con la comunidad B, aunque no comparten la misma lógica.

E. Comunidad de opinión con medios

Por ultimo, la quinta comunidad si bien también es descentralizada, poseen centros nodales más grandes de lo hasta ahora visto.

Figura 8. Grafo de la omunidad de opinión con medios

Figura 8. Grafo de la omunidad de opinión con medios

Incorpora principalmente la presencia de tweets de medios sobre las noticias del hashtag. Aunque también hay la presencia de otros civiles, avatares y rezagados.

filter(centrales, Comunidad == "E") %>% 
  knitr::kable()
Comunidad Usuario Grado entrante Grado saliente Grado ponderado
E a_luismamanito 4 86 90
E diarioeldeber 68 0 68
E noticiasfides 63 0 63
E nuklive 58 5 63
E LeonardoPrado83 24 4 28
E luisca_sl 7 20 27
E thestreetsays 24 1 25
E LaRazon_Bolivia 24 0 24
E LosTiemposBol 23 0 23
E tazisupay 14 5 19

Es una comunidad descentralizada con medios como los principales hubs de información.

Comparación

¿Qué similitudes y diferencias Tienen las comunidades de opinión que identificamos?

La comunidad civil es la segunda más grande, ocupando el 16,92% del grafo entero. También posee uno de las densidades más altas, lo cual muestra su vigor, como una comunidad verdaderamente orgánica. Las comunidades de activistas, tanto del oficialismo y la oposición tiene lógicas comunicativas similares, aunque la oficialista crea más lazos hacia adentro que hacia afuera. La comunidad con medios es la más pequeña y tardía, con hubs visibles que consumen la participación. Finalmente, el porcentaje más grande del grafo entero lo ocupa la comunidad gubernamental con el 44,51%, pero con la densidad más baja por mucho, al no existir ni siquiera mucha comunicación entre los mismos interlocutores, recordando a un lógica de comunicación al éstilo del broadcasting.

comp <- read_csv2("comp.csv")
comp %>% knitr::kable()
Id Actor Forma Nodos Aristas % del grafo Densidad
A Civil Orgánica 393 1048 16.92 0.007
B Activista oficialista Descentralizada 243 1335 10.46 0.023
C Activista opositora Descentralizada 365 742 15.71 0.006
D Gubernamental oficialista Centralizada 1034 1045 44.51 0.001
E Medios Descentralizada 162 201 6.97 0.008
F Otros NA 126 1853 5.43 NA

Generamos un grafo dinámico en el que podemos ver esas tendencias y otras:

Para una exploración más minuciosa:

hemos creado una versión interactiva del grafo que puede ser visualizada aquí.

Conclusiones

El hashtag #RayoEvolizador fue fugaz, como suelen ser los memes y los fenómenos virales en Internet. Hoy ya no parece importante y los usuarios de las redes parecen estar siguiendo y generando otras tendencias, en la lógica dinámica del prosumidor. Sin embargo, este tipo de fenómenos sociodigitales dejan huellas impresas en la Web, como pudimos visualizar aquí, las cuáles nos sirven para la comprensión de las dinámicas de opinión en redes sociales, siendo que su estudio en nuestro país aún es escaso y con métodos rústicos.

En este caso, la dinámica concreta fue la siguiente. Una comunidad civil que buscaba principalmente el humor crea el hashtag, ante lo cual aparecen dos comunidades activistas para tácticamente, desde una lucha de interacción de redes llevar el hashtag a sus horizontes. En eso interviene la cuenta del presidente @evoespueblo para sentar su presencia, teniendo un fuerte apoyo, en primer lugar, de individuos inconexos y, en segundo lugar, del activismo oficialista. Después de esos encuentros, vienen algunos rezagados, incluyendo la prensa. Es decir que lo que más dinamizó el hashtag fue aquella comunidad orgánica original, para que luego fuera abordadas por una lógica de activismo en red y otra lógica centralizada gubernamental.

Si bien este es un caso concreto, puede ilustrar otras dinámicas de generación de opinión pública en las redes, principalmente las más sutiles que sólo pueden ser apreciadas a partir una mirada panorámica. Lo cual incluye la ahora denominada “guerra digital” que el gobierno ha convocado (Los Tiempos 04/02/2018).

Bibliografía

Ingold, Tim (2015). Lineas: Una breve historia. Barcelona: Gedisa.

Los Tiempos (04/02/2018). “Evo insta a organizaciones a preparase para una ‘guerra digital’ en redes sociales”.

Ojeda, Alex (2015). “Introducción al Análisis de Redes Sociales”. Texto de la materia electiva “Análisis de Redes Sociales I” de la Carrera de Sociología, Facultad de Ciencias Sociales - UMSS.

Rogers, Richard (2013). Digital Methods. MIT Press.

Vickery, Jacqueline (2015). “Memes in digital culture”. En: Information, Communication & Society, 18:12, 1450-1451, DOI: 10.1080/1369118X.2014.979217

Herramientas digitales

  • R
  • SocialMediaLab
  • iGraph
  • Gephi
  • Sigma.js

Sobre el autor

Alex Ojeda Copa es sociólogo digital y analista de redes sociales. Otros proyectos en los que está trabajando pueden verse en su portafolio. También pueden contactarlo en Twitter, LinkedIn y Academia.edu.

Notas


  1. Aquí utilizamos el termino “comunidad” no en su sentido antropológico de sentidos compartidos, sino en el sentido del Análisis de Redes, como un conjunto de actores que interactuan frecuentemente hacia adentro pero no mucho hacia afuera, siendo esa su frontera con otras comunidades.

  2. Usamos el algoritmo de modularidad que tiene Gephi incorporado, conocido también como “Louvain Modularity”. Básicamente lo que hace este algoritmo es hacer un calculo del peso de las aristas en el vecindario de cada nodo, para detectar nodos donde las aristas son más densas entre sí y al mismo tiempo menos densas frente a otros. Así es posible detectar comunidades basadas en la interacción. Más detalles en: https://arxiv.org/abs/0803.0476.

LS0tCnRpdGxlOiAiQ29tdW5pZGFkZXMgZGUgb3BpbmnDs24gYWxyZWRlZG9yIGRlbCBoYXNodGFnICNSYXlvRXZvbGl6YWRvciBlbiBUd2l0dGVyIgphdXRob3I6ICJBbGV4IE9qZWRhIENvcGEiCmRhdGU6ICIwNy8wMy8yMDE4IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICAgIHRoZW1lOiBjb3NtbwogICAgICB0b2M6IHRydWUKICAgICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgSW50cm9kdWNjacOzbgoKTG9zIGhhc2h0YWdzIHNvbiBvYmpldG9zIGRpZ2l0YWxlcyAibmF0aXZvcyIgKFJvZ2VycyAyMDEzKS4gU2kgYmllbiBoYXkgb2JqZXRvcyBlbiBlbCBtdW5kbyBkaWdpdGFsIHF1ZSB0aWVuZW4gdW4gcGFyYWxlbG8gZW4gbGEgdmlkYSBvZmZsaW5lLCBjb21vIGVsIHRleHRvIHkgbGEgaW1hZ2VuLCBxdWUgcHJlZXhpc3TDrWFuIGEgbGEgZGlnaXRhbGl6YWNpw7NuLCBleGlzdGVuIG90cm9zIG9iamV0b3MgcXVlIG5hY2VuIGNvbiBsYSBXZWIuIEVsIGhhc2h0YWcgZXMgdW4gZGVzYXJyb2xsbyBwYXJ0aWN1bGFyIGRlbCBoaXBlcmVubGFjZSwgdW4gY2VudHJvIGRlIGNvbnZlcmdlbmNpYSB0ZW3DoXRpY28gZW50cmUgbG9zIG3Dumx0aXBsZXMgaGlsb3MgZGUgbGEgV2ViLCB1biBoaXBlcmVzcGFjaW8gZG9uZGUgY29udmVyZ2VuIGFsZ3VuYXMgZGUgZXNhcyAqbGluZWFzKiBkZSB2aWRhIGRlIGxhcyBxdWUgbm9zIGhhYmxhYmEgSW5nb2xkICgyMDE1KS4KCkVuIG51ZXN0cm8gcGHDrXMgZWwgdXNvIGRlIGhhc2h0YWdzIG5vIHBhcmVjZSB0YW4gZXh0ZW5kaWRvIGNvbW8gZW4gb3RyYXMgbGF0aXR1ZGVzLiBTaW4gZW1iYXJnbywgZW4gZWwgdWx0aW1vIHRpZW1wbyBzZSBoYSB2aXN0byBlbCB1c28gcmVsYXRpdmFtZW50ZSBtYXNpdm8gZGUgdmFyaW9zIGRlIGVsbG9zLCBjb21vIHVuIGFncmVnYWRvciBkZSBzZW50aWRvcywgZGVtYW5kYXMgeSBhY3RpdmlkYWRlcywgcHJpbmNpcGFsbWVudGUgcG9yIGdydXBvcyBhY3RpdmlzdGFzOyBwb3IgZWplbXBsbywgI1RpcG5pc0VuUmVzaXN0ZW5jaWEsICNNZWpvckludGVybmV0WWEsICNOaVVuYU1lbm9zLCB5IHJlY2llbnRlbWVudGUgI0JvbGl2aWFEaWpvTm8sICMyMUZEaWFEZUxhTWVudGlyYSB5ICNQYXJvMjFGLiBFbCB1c28gZGUgaGFzaHRhZ3MgdGllbmUgY2xhcmFzIHZlbnRhamFzIHBhcmEgbG9zIHVzdWFyaW9zLCBwZXJvIHRhbWJpw6luIHBhcmEgbG9zIGFuYWxpc3RhcyBkZSByZWRlcyBzb2NpYWxlcyBxdWUgY29uc3RhbnRlbWVudGUgdGllbmVuIHF1ZSBuYXVmcmFnYXIgZW4gY2FudGlkYWRlcyBlbm9ybWVzIGRlIGRhdG9zIHkgY29udmVyc2FjaW9uZXMgY2HDs3RpY2FzIGRpc3BlcnNhcyBlbiBkaXZlcnNvcyBlc3BhY2lvcy4gQXF1w60gZWwgaGFzaHRhZyBmdW5jaW9uYSBjb21vIHVuIGFncmVnYWRvciBkZSBvcGluacOzbiBww7pibGljYS4gCgpMYSBwYXNhZGEgc2VtYW5hIG5hY2nDsyB1bmEgdGVuZGVuY2lhIGVuIGxhcyByZWRlcyBxdWUgdGVuw61hIGNvbW8gZWplIGNlbnRyYWwgbGEgZmlndXJhIGRlbCBwcmVzaWRlbnRlIEV2byBNb3JhbGVzLiBFbCBoYXNodGFnICNSYXlvRXZvbGl6YWRvciBuYWNpw7MgZW4gVHdpdHRlciwgY29tbyB1biByZW1peCBkZSBvdHJvcyBoYXNodGFncyBzaW1pbGFyZXMgZW4gb3Ryb3MgcGHDrXNlcywgeSByw6FwaWRhbWVudGUgc2UgZXhwYW5kacOzIGEgb3RyYXMgcGxhdGFmb3JtYXMuIEVsIGNlbnRybyBzb24gbG9zIG1lbWVzIHF1ZSBzb24gcGFydGUgImRlbCByZW1peCB5IGxhIGN1bHR1cmEgcGFydGljaXBhdGl2YSBlbiBsYSBxdWUgbG9zIHVzdWFyaW9zIGFncmVnYW4sIGFwcm9waWFuLCBpbWl0YW4sIHBhcm9kaWFuLCByZW1lemNsYW4sIGVkaXRvcmlhbGl6YW4geSB0cmFuc2Zvcm1hbiBlbCBjb250ZW5pZG8gb3JpZ2luYWwgZGUgYWxndW5hIG1hbmVyYSIgKFZpY2VyeSAyMDE1OiAxNDUwKSBQZXJvIGFkZW3DoXMgbG9zIG1lbWVzIGRlICNSYXlvRXZvbGl6YWRvciBtw6FzIGFsbMOhIGRlbCBjb250ZW5pZG8gdmlzdWFsLCBwb3J0YW4gdGV4dG9zLCB1c3VhcmlvcywgZ3J1cG9zLCBvcGluaW9uZXMsIGNvbnRyYW9waW5pb25lcywgYW50YWdvbmlzbW9zLCBwdWxzaW9uZXMgeSB0w6FjdGljYXMuCgpTaSBiaWVuIHBhcmVjZSBzaW1wbGVtZW50ZSB1biBoYXNodGFnIGRlICJvY2lvIiwgZW4gcmVhbGlkYWQgZXMgdW4gaGFzaHRhZyBwb2zDrXRpY2FtZW50ZSByZWxldmFudGUgcG9yIGxhcyBzaWd1aWVudGVzIHJhem9uZXMuIFByaW1lcm8gdGllbmUgY29tbyBjZW50cm8gdGVtw6F0aWNvIGEgbGEgaW1hZ2VuIGRlbCBwcmVzaWRlbnRlIGRlbCBwYcOtcy4gU2VndW5kbyBlcyB1bmEgbXVlc3RyYSBhY290YWRhIGRlIHVuYSBudWV2YSBmb3JtYSBkZSBnZW5lcmFyIG9waW5pw7NuIHDDumJsaWNhIGVuIGxhcyByZWRlczogbGEgZGUgbGEgc8OhdGlyYSBwb2zDrXRpY2EgZW4gcmVkLCB1bmEgY29tYmluYWNpw7NuIGRlIGh1bW9yIHkgY3LDrXRpY2EuIFkgdGVyY2VybywgZW4gZXN0ZSBoYXNodGFnIGhhbiBjb25mbHVpZG8gZG9zIGRpbsOhbWljYXMgZGlzdGludGFzLCBsYSBkaW7DoW1pY2EgY2l2aWwgZXNwb250YW5lYSB5IGxhIGRpbsOhbWljYSBwb2zDrXRpY2EgcGxhbmlmaWNhZGEsIGxhIHByaW1lcmEgbcOhcyBwYXJ0aWNpcGF0aXZhIHkgY2HDs3RpY2EgeSBsYSBzZWd1bmRhIG3DoXMgY2VudHJhbGl6YWRhIHkgcGxhbmlmaWNhZGEuCgpFbCBvYmpldGl2byBkZSBlc3RlIGFydMOtY3VsbyBlcyBlbCBkZSBhbmFsaXphciBsYXMgZGluw6FtaWNhcyBlc3RydWN0dXJhbGVzIGRlIG9waW5pw7NuIGVuIHRvcm5vIGFsIGhhc2h0YWcgI1JheW9Fdm9saXphZG9yIGVuIFR3aXR0ZXIuIFBvciBkaW7DoW1pY2EgZXN0cnVjdHVyYWwgZW50ZW5kZW1vcyBlbCBjb25qdW50byBkZSBwYXRyb25lcyBkZSByZWRlcyBkZSBjb211bmljYWNpw7NuLCB5IG5vIGFzw60gbGFzIGRpbsOhbWljYXMgZGUgY29udGVuaWRvIHF1ZSBkZWphbW9zIHBhcmEgb3RybyBlc3R1ZGlvLiBQYXJhIGVsbG8gdXRpbGl6YXJlbW9zIHByaW5jaXBhbG1lbnRlIHTDqWNuaWNhcyBkZWwgKlNvY2lhbCBOZXR3b3JrIEFuYWx5c2lzKiAoU05BKSwgcGFydGljdWxhcm1lbnRlIGxvcyBhbGdvcml0bW9zIGRlIGRldGVjY2nDs24gZGUgY29tdW5pZGFkZXNbXjFdLCB0YW1iacOpbiBsbGFtYWRvcyBtw7NkdWxvcywgeSBhbGd1bmFzIG1lZGlkYXMgZGUgY2VudHJhbGlkYWQgbm9kYWwuIEVsICpBbsOhbGlzaXMgZGUgUmVkZXMgU29jaWFsZXMqIGVzICJ1biBtw6l0b2RvIGVzdHJ1Y3R1cmFsLXJlbGFjaW9uYWwsIGZvcm1hbCB5IGN1YW50aXRhdGl2byBxdWUgc2UgaW50ZXJlc2EgcG9yIGxvcyBwYXRyb25lcyBkZSBpbnRlcmFjY2lvbmVzIGVudHJlIGxvcyBhY3RvcmVzIiAoT2plZGEgMjAxNTogMTcpLiBFc3RlIG3DqXRvZG8gbm9zIHBlcm1pdGlyw6EgaWRlbnRpZmljYXIgYWxndW5vcyBwYXRyb25lcyByZWxldmFudGVzIGVuIGxhcyBkaW7DoW1pY2FzIGRlIGFncnVwYWNpw7NuIHkgb3BpbmnDs24gcXVlIGRlIG90cm8gbW9kbyBubyBzZXLDrWFuIHZpc2libGVzIG1lZGlhbnRlLCBwb3IgZWplbXBsbywgbGEgZXRub2dyYWbDrWEgbyBsYSBlc3RhZMOtc3RpY2EgdHJhZGljaW9uYWwuIAoKIyMgUmVjb2xlY2Npw7NuIGRlIGRhdG9zCgpIZW1vcyByZWNvbGVjdGFkbyB0b2RvcyBsb3MgdHdlZXRzIHF1ZSBjb250aWVuZW4gZWwgaGFzaHRhZyAjUmF5b0V2b2xpemFkb3IsIGRlc2RlIHN1IGNyZWFjacOzbiBlbCAyOCBkZSBmZWJyZXJvIGRlIDIwMTggaGFzdGEgZWwgNSBkZSBtYXJ6byBkZSAyMDE4IChjZW5zbyksIG1lZGlhbnRlIGVsIHBhcXVldGUgYFNvY2lhbE1lZGlhTGFiYDoKCmBgYHtyIGV2YWw9RkFMU0V9CmxpYnJhcnkoU29jaWFsTWVkaWFMYWIpCmxpYnJhcnkobWFncml0dHIpCgojIEF1dGVudGljYWNpw7NuIHkgcmVjb2xlY2Npw7NuIGRlIGRhdG9zCnJheW8gPC0gQXV0aGVudGljYXRlKCJ0d2l0dGVyIiwgYXBpS2V5ID0gIiIsIGFwaVNlY3JldD0iIiwgYWNjZXNzVG9rZW49IiIsIGFjY2Vzc1Rva2VuU2VjcmV0PSIiKSAlPiUgQ29sbGVjdChzZWFyY2hUZXJtPSIjcmF5b2V2b2xpemFkb3IiLCBudW1Ud2VldHM9MTUwMCwgdmVyYm9zZT1UUlVFLCBtYXhJRCA9ICI5NjczOTU0ODg1MjQ3OTU5MDQiKSAKYGBgCgpBIHBhcnRpciBkZSB2YXJpYXMgaXRlcmFjaW9uZXMsIGNvbnNlZ3VpbW9zIHVuIGRhdGFzZXQgZGUgNjIxOCB0d2VldHM6CgpgYGB7cn0KcmF5bwpgYGAKCkRhZG8gcXVlIG5vcyBjb25jZW50cmFyZW1vcyBlbiBsYXMgZm9ybWFzIGRlIGNvbnZlcnNhY2nDs24sIGRlIG1vbWVudG8gbm8gbm9zIGludGVyZXNhIGVsIGNvbnRlbmlkbyBkZSBsYSB2YXJpYWJsZSAqdGV4dCosIHBvciBsbyBxdWUgc29sbyB1dGlsaXphcmVtb3MgbGFzIHNpZ3VpZW50ZXMgdmFyaWFibGVzOiAqZnJvbV91c2VyKiwgKnJlcGx5X3RvKiB5ICp1c2Vyc19tZW50aW9uZWQqLiBBIHBhcnRpciBkZSBlbGxhcyBjcmVhcmVtb3MgdW5hICpyZWQgZGUgYWN0b3JlcyogZG9uZGUgbG9zICpub2RvcyogcmVwcmVzZW50YW4gdXN1YXJpb3MgZGUgVHdpdHRlciBxdWUgcGFydGljaXBhcm9uIGVuIGVsIGhhc2h0YWcgeSBsYXMgKmFyaXN0YXMqIHJlcHJlc2VudGFuIHVuYSBtZW5jacOzbiwgcsOpcGxpY2EgbyByZXR3ZWV0IGRlIHVuIHVzdWFyaW8gJGkkIGhhY2lhIHVuIHVzdWFyaW8gJGokIGRhZG8gdW4gdHdlZXQgJGskLgoKYGBge3IgZXZhbD1GQUxTRX0KbGlicmFyeShpZ3JhcGgpCgojIENyZWFtb3MgbGEgcmVkIGVuIHVuYSBlc3RydWN0dXJhIGRlIGRhdG9zIGFwcm9waWFkYSAoY2xhc2U6IGlncmFwaCkKcmF5b2FjdG9yIDwtIHJheW8gJT4lIENyZWF0ZSgiYWN0b3IiKSAKYGBgCgpHdWFyZGFtb3MgbG9zIGRhdG9zIGVuIGZvcm1hdG8gR3JhcGhNTCBwYXJhIGx1ZWdvIG1lZGlybG8geSB2aXN1YWxpemFybG8gZW4gR2VwaGkuCgpgYGB7ciBldmFsPUZBTFNFfQp3cml0ZS5ncmFwaChyYXlvYWN0b3IsICJyYXlvYWN0b3IuZ3JhcGhtbCIsICJncmFwaG1sIikKYGBgCgojIyBSZXN1bHRhZG9zCgojIyMgRnJlY3VlbmNpYSBkZSBsb3MgdHdlZXRzIHkgb3JpZ2VuIGRlbCBoYXNodGFnCgpUb2RvcyBsb3MgZmVuw7NtZW5vcyB2aXJhbGVzIHRpZW5lbiB1biBvcmlnZW4sIHVuYSBkaWZ1c2nDs24geSB1biBkZWNhaW1pZW50bywgc2lndWllbmRvIGxhIGNhdGVnb3JpemFjacOzbiBkZSBbS25vd1lvdXJNZW1lXShodHRwOi8va25vd3lvdXJtZW1lLmNvbS8pLiBQYXJhIGVsIGNhc28gZGUgI1JheW9Fdm9saXphZG9yLCBtb3N0cmFtb3MgYSBjb250aW51YWNpw7NuIGVzYSBkaW7DoW1pY2EgZGUgdHdlZXRzIGVuIGVsIHRpZW1wbzoKCmBgYHtyIGZpZy53aWR0aCA9IDE1fQpsaWJyYXJ5KHJ0d2VldCkKbGlicmFyeShnZ3Bsb3QyKQp0c19wbG90KHJheW8sICJob3VycyIpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICBzY2FsZV94X2RhdGV0aW1lKGRhdGVfYnJlYWtzID0gIjEgZGF5IiwgZGF0ZV9sYWJlbCA9ICIlbS0lZCIpICsKICAgIGxhYnMoeCA9ICJUaWVtcG8iLCB5ID0gIk7Dum1lcm8gZGUgdHdlZXRzIiwKICAgIHRpdGxlID0gIkZpZ3VyYSAxLiBGcmVjdWVuY2lhIGRlIHR3ZWV0cyBzb2JyZSAjUmF5b0V2b2xpemFkb3IiLAogICAgc3VidGl0bGUgPSAiIiwKICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGEgcGFydGlyIGRlIGRhdG9zIHJlY29sZWN0YWRvcyBkZSBsYSBBUEkgZGUgVHdpdHRlciIKICApCmBgYAoKRWwgcGljbyBtw6FzIGFsdG8gZGUgcHJvZHVjY2nDs24gZGUgbWVuc2FqZXMgc2UgZGEgZWwgZMOtYSBkZSBjcmVhY2nDs24gZGVsIGhhc2h0YWcsIGVsIDI4IGRlIGZlYnJlcm8uIEF1bnF1ZSBoYXkgdW4gY2llcnRvIHJlbW9udGUgZWwgMiBkZSBtYXJ6byBkZXNwdcOpcyBkZSBxdWUgQGV2b2VzcHVlYmxvIHkgbGEgcHJlbnNhIGxlIHByZXN0YW4gYXRlbmNpw7NuIGFsIGhhc2h0YWcuIAoKTGEgcHJpbWVyYSBjb211bmlkYWQgZW4gYXBhcmVjZXIgZWwgMjggZGUgZmVicmVybyBlcyBsYSBxdWUgc3VyZ2UgYWxyZWRlZG9yIGRlbCBwcmltZXIgdHdlZXQgZGVsIHVzdWFyaW8gQGRleGFuZmV0YW1pbmEsIHVuIHVzdWFyaW8gY3J1Y2XDsW8uIEVzdGEgY29tdW5pZGFkIGV2b2x1Y2lvbmFyw6EgcGFyYSBzZXIgbGEgY29tdW5pZGFkIG3DoXMgZ3JhbmRlIHkgYWN0aXZhIHBvc3Rlcmlvcm1lbnRlLCBzb2xvIG9wYWNhZGEgZW4gbnVtZXJvLCBwZXJvIG5vIGVuIGRlbnNpZGFkLCBwb3IgbGEgZGUgQGV2b2VzcHVlYmxvLiAKCiFbRmlndXJhIDIuIE9yaWdlbiBkZWwgaGFzaHRhZ1xsYWJlbF0oaW1nL2NvbTEuanBnKXsgd2lkdGg9NzAlIH0KCiMjIyBFbCBncmFmbyBlbnRlcm8KCkFudGVzIGRlIGlyIGEgbGFzIGNvbXVuaWRhZGVzLCB2aXN1YWxpemFyZW1vcyBwcmltZXJvIGVsIHBhbm9yYW1hIGdlbmVyYWwgZGUgbGEgcmVkIGVudGVyYSBkZWwgaGFzaHRhZy4gTG9zIHBhcsOhbWV0cm9zIGRlIGxhIHZpc3VhbGl6YWNpw7NuIHF1ZSBhZG9wdGFtb3Mgc29uIGxvcyBzaWd1aWVudGVzOgoKIFBhcsOhbWV0cm8gICAgICB8IFZhbG9yICAgICAgICAgICAgICAgIHwgCnwgLS0tLS0tLS0tLS0tLSB8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tOnwgCnwgVGlwbyBkZSBncmFmbyB8IERpcmlnaWRvIHkgcG9uZGVyYWRvIHwgCnwgTm9kb3MgICAgICAgICB8IDIzNTMgICAgICAgICAgICAgICAgIHwgICAKfCBBcmlzdGFzICAgICAgIHwgNjIyNCAgICAgICAgICAgICAgICAgfCAgCnwgQWxnb3JpdG1vIGRlIGRpc3Bvc2ljacOzbiB8IFlpZmFuIEh1ICB8CnwgVGFtYcOxbyBkZSBub2RvcyB8IEVuIGZ1bmNpw7NuIGFsIGNhbGN1bG8gZGVsIGdyYWRvIHBvbmRlcmFkbyB8CnwgQ29sb3IgZGUgbm9kb3MgfCBFbiBmdW5jacOzbiBhbCBjYWxjdWxvIGRlIG1vZHVsYXJpZGFkW14yXSB8CgpFbiBlc3RlIGNhc28sIGRlYmlkbyBhIGxhIGdyYW4gY2FudGlkYWQgZGUgbm9kb3MsIGhlbW9zIG9wdGFkbyBlbiBwcmluY2lwaW8gcG9yIG5vIHZpc3VhbGl6YXIgdG9kYXMgc3VzIGV0aXF1ZXRhcy4gU8OzbG8gbW9zdHJhbW9zIGxhcyBldGlxdWV0YXMgcGFyYSBsb3Mgbm9kb3MgcXVlIHRpZW5lbiB1biBncmFkbyBtYXlvciBhIDUwLCBwb3IgbG8gcXVlIHNlIHB1ZWRlbiBvYnNlcnZhciBsb3MgYWN0b3JlcyBtw6FzIGNlbnRyYWxlcyBlbiBjYWRhIGNvbXVuaWRhZDoKCiFbRmlndXJhIDMuIEdyYWZvIGVudGVybyBkZSAjUmF5b0V2b2xpemFkb3JcbGFiZWxdKGltZy9yZWRlbnRlcmEuanBnKQoKQSBwcmltZXJhIHZpc3RhIHNlIHB1ZWRlIHZlciBlbiBlbCBncmFmbyBlbnRlcm8gZG9zIGNhbXBvcy4gRWwgZGUgbGEgZGVyZWNoYSBkb25kZSBzZSB2ZSB1bmEgaW50ZXJhY2Npw7NuIG3DoXMgZGVuc2EgeSBjYcOzdGljYSBlbnRyZSB2YXJpYXMgY29tdW5pZGFkZXMgeSBlbCBkZSBsYSBpenF1aWVyZGEgZG9uZGUgZXhpc3RlIHVuIGNpcmN1bG8gY2VycmFkbyBvIGJ1cmJ1amEgZGUgY29udmVyc2FjacOzbiBhbHJlZGVkb3IgZGVsIG5vZG8gY2VudHJhbCBxdWUgZXMgQGV2b2VzcHVlYmxvLiAKCkxhIEZpZ3VyYSAzIG11ZXN0cmEgdW4gKnNuYXBzaG90KiBkZWwgdG90YWwgZGUgbm9kb3MgZSBpbnRlcmFjY2lvbmVzIHF1ZSBwYXJ0aWNpcGFyb24gZW4gZWwgaGFzaHRhZywgcGVybyBhaG9yYSBuZWNlc2l0YW1vcyB1bmEgYW7DoWxpc2lzIGRpYWNyw7NuaWNvLiBBIGNvbnRpbnVhY2nDs24gdmVyZW1vcyBsYXMgY29tdW5pZGFkZXMgZW4gb3JkZW4gZGUgYXBhcmljacOzbiwgcXVlIG5vcyBwZXJtaXRlbiBkZWR1Y2lyIHN1IGRpbsOhbWljYSBjb211bmljYXRpdmEuIAoKIyMjIEEuIENvbXVuaWRhZCBkZSBvcGluacOzbiBjaXZpbCAKCkxhIGNvbXVuaWRhZCBxdWUgb3JpZ2luw7MgZWwgaGFzaHRhZyBjcmVjacOzIGNvbiBlbCB0aWVtcG8uIEVuIGxhIGZvcm1hIGRlIHN1cyBpbnRlcmFjY2lvbmVzLCB2ZW1vcyBxdWUgZXhpc3RlbiBhbGd1bm9zIGNlbnRyb3MgY2xhcm9zLCBwZXJvIGVuIGdlbmVyYWwgZXMgYmFzdGFudGUgcGFydGljaXBhdGl2byBMbGFtYXJlbW9zIGEgc3UgZm9ybWEgY29tbyAib3Jnw6FuaWNhIiIsIG5vIGVuIGVsIHNlbnRpZG8gZGVsIHNpbmRpY2F0bywgcXVlIGltcGxpY2Egb2JlZGllbmNpYSBhIGxhIGVzdHJ1Y3R1cmEgeSBkZWNpc2lvbmVzIGNvbGVjdGl2YXMsIHNpbm8gZW4gZWwgc2VudGlkbyBkZSBsYXMgcmVkZXMgc29jaWFsZXMgZGlnaXRhbGVzLCBxdWUgaW1wbGljYSBmb3JtYWNpw7NuIGRlIGFsZ28gYSBwYXJ0aXIgZGUgY2FkZW5hcyBob3Jpem9udGFsZXMgZGUgaW50ZXJhY2Npb25lcy4KCiFbRmlndXJhIDQuIEdyYWZvIGRlIGxhIGNvbXVuaWRhZCBkZSBvcGluacOzbiBjaXZpbF0oaW1nL2NvbTFmdWxsLmpwZykKCkVuIGVzdGEgY29tdW5pZGFkIHRpZW5lbiBtYXlvciBwcmVzZW5jaWEgdXN1YXJpb3MgZGUgVHdpdHRlciBxdWUgbm8gc29uIHBvbMOtdGljb3MgbmkgYWN0aXZpc3Rhcywgc2lubyBwcmluY2lwYWxtZW50ZSBjdWVudGFzIGRlZGljYWRhcyBhIGRpZnVuZGlyIG1lbWVzIHRleHR1YWxlcywgaGlzdG9yaWFzIHkgYWxndW5vcyBibG9ndWVyb3MuIE11Y2hvcyBkZSBlbGxvcyBpbmNsdXNvIGFjdMO6YW4gYSBwYXJ0aXIgZGUgdW4gYXZhdGFyLCBtb3N0cmFuZG8gbGEgZnVlcnphIGRlIGxhIGFub25pbWlkYWQgZW4gSW50ZXJuZXQuIFBhcmEgZXZpdGFyIGNvbm5vdGFjaW9uZXMgZGUgdGludGUgcG9sw610aWNvIG8gYWN0aXZpc3RhLCBsb3MgbGxhbWFyZW1vcyAiY2l2aWxlcyIuCgpgYGB7ciBtZXNzYWdlID0gRkFMU0V9CmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkobWFncml0dHIpCmNlbnRyYWxlcyA8LSByZWFkX2NzdigiY2VudHJhbGVzLmNzdiIpCmZpbHRlcihjZW50cmFsZXMsIENvbXVuaWRhZCA9PSAiQSIpICU+JSAKICBrbml0cjo6a2FibGUoKQpgYGAKCkFzw60sIGVzdGEgZXMgdW5hIGNvbXVuaWRhZCBkZSBvcGluacOzbiBvcmfDoW5pY2EgeSBjaXZpbC4gQWwgcmV2aXNhciBzdXMgdHdlZXRzIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBzdSBtb3RpdmFjacOzbiBhbCBpbXBsaWNhcnNlIGNvbiBoYXNodGFnIHBhcmVjZSBwcmluY2lwYWxtZW50ZSBsw7pkaWNhLiAKCiMjIyBCLiBDb211bmlkYWQgZGUgb3BpbmnDs24gYWN0aXZpc3RhIG9maWNpYWxpc3RhIAoKTGEgc2VndW5kYSBjb211bmlkYWQgcXVlIGVtZXJnacOzIGZ1ZSBkZSBhY3RpdmlzdGFzIG9maWNpYWxpc3RhcyB5IGFsZ3VuYXMgY3VlbnRhcyBkZWwgZ29iaWVybm8uIFN1IGZvcm1hIGVzIHNpbWlsYXIgYSBsYSBhbnRlcmlvciBjb211bmlkYWQsIHNpbiBlbWJhcmdvIGNvbW8gZWxsb3Mgbm8gb3JpZ2luYXJvbiBlbCBtZW5lLCBlcyBtw6FzIGJpZW4gdW5hIGNvbXVuaWRhZCBjb24gbcO6bHRpcGxlcyBjZW50cm9zLCBlc3RvIGVzLCBkZXNjZW50cmFsaXphZGEuICAKCiFbRmlndXJhIDUuIEdyYWZvIGRlIGxhIGNvbXVuaWRhZCBkZSBvcGluacOzbiBvZmljaWFsaXN0YVxsYWJlbF0oaW1nL2NvbTJmdWxsLmpwZykKCk5vIHNvbiBuZWNlc2FyaWFtZW50ZSBmdW5jaW9uYXJpb3MsIHN1IGNvbXBvcnRhbWllbnRvIHBhcmVjZSBtw6FzIGJpZW4gZGUgYWN0aXZpc3RhcywgZW4gZXN0ZSBjYXNvIHByb2dvYmllcm5vLiAKCmBgYHtyfQpmaWx0ZXIoY2VudHJhbGVzLCBDb211bmlkYWQgPT0gIkIiKSAlPiUgCiAga25pdHI6OmthYmxlKCkKYGBgCgpFc3RhIGVzIHVuYSBjb211bmlkYWQgZGUgb3BpbmnDs24gZGVzY2VudHJhbGl6YWRhIGRlIGFjdGl2aXN0YXMgb2ZpY2lhbGlzdGFzLiBMb3MgcG9zdHMgbXVlc3RyYW4gc3UgaW50ZXLDqXMgZW4gZGVmZW5kZXIgbGEgaW1hZ2VuIGRlIEV2byBNb3JhbGVzLiBTdSBtb3RpdmFjacOzbiBwYXJlY2Ugc2VyIHTDoWN0aWNhLiAKCiMjIyBDLiBDb211bmlkYWQgZGUgb3BpbmnDs24gYWN0aXZpc3RhIG9wb3NpdG9yYSAKCkxhIHRlcmNlcmEgY29tdW5pZGFkIHRpZW5lIHVuYSBmb3JtYSBzaW1pbGFyIGEgbGEgYW50ZXJpb3IsIHVuYSBmb3JtYSBkZXNjZW50cmFsaXphZGEgZSBpbnRlcmFjdGl2YS4KCiFbRmlndXJhIDYuIEdyYWZvIGRlIGxhIGNvbXVuaWRhZCBkZSBvcGluacOzbiBhY3RpdmlzdGEgb3Bvc2l0b3JhXShpbWcvY29tM2Z1bGwuanBnKQpMb3MgYWN0b3JlcyBwcmluY2lwYWxlcyBhcXXDrSBzb24gYWN0aXZpc3RhcyB5IHBlcnNvbmFqZXMgY3LDrXRpY29zIGFsIGdvYmllcm5vLCBlIGluY2x1c28gYWxndW5hcyBjdWVudGFzIGNvbiBhdmF0YXJlcy4gRGlyZW1vcywgcG9yIHNpbXBsZXphLCBxdWUgc29uIGRlICJvcG9zaWNpw7NuIiBubyBlbiBlbCBzZW50aWRvIGRlIG9wb3NpY2nDs24gcG9sw610aWNhIHBhcnRpZGFyaWEgbmVjZXNhcmlhbWVudGUsIHBlcm8gc8OtIGVuIHVuIHNlbnRpZG8gZGUgY29udHJhcG9zaWNpw7NuIG8gY3LDrXRpY2EgYWwgb2ZpY2lhbGlzbW8uIAoKYGBge3J9CmZpbHRlcihjZW50cmFsZXMsIENvbXVuaWRhZCA9PSAiQyIpICU+JSAKICBrbml0cjo6a2FibGUoKQpgYGAKCkVzdGEgZXMgdW5hIGNvbXVuaWRhZCBkZXNjZW50cmFsaXphZGEgZGUgYWN0aXZpc21vIG9wb3NpdG9yLiBFeGlzdGUgYXF1w60gdW5hIG1lemNsYSBlbnRyZSBpbnRlcmVzZXMgdMOhY3RpY29zIHkgbMO6ZGljb3MuIEVuIGVsIGdyYWZvIGRpbsOhbWljbyBxdWUgdmVyZW1vcyBtw6FzIGFkZWxhbnRlLCB2ZXJlbW9zIHF1ZSBlcyB1bmEgZGUgbGFzIGNvbXVuaWRhZGVzIHF1ZSBtw6FzIGNvbnZlcnNhY2nDs24gZ2VuZXLDsyBjb24gb3Ryb3MgZ3J1cG9zLiAKCiMjIyBELiBDb211bmlkYWQgZGUgb3BpbmnDs24gZ3ViZXJuYW1lbnRhbCAKCkxhIGN1YXJ0YSBjb211bmlkYWQgZXMgbGEgbcOhcyBzb3JwcmVzaXZhIGVuIGN1w6FudG8gYSBzdSBwZWN1bGlhciBmb3JtYS4gRnVlIGxhIHF1ZSBzZSBkZXNhcnJvbGzDsyBhbHJlZGVkb3IgZGUgQGV2b2VzcHVlYmxvLiBFcyB1bmEgY29tdW5pZGFkIGV4dHJlbWFkYW1lbnRlIGNlbnRyYWxpemFkYSB5IGRpc3BlcnNhIGVudHJlIHPDrS4KCiFbRmlndXJhIDcuIEdyYWZvIGRlIGxhIGNvbXVuaWRhZCBvZmljaWFsaXN0YSBjZW50cmFsaXphZGEgXShpbWcvY29tNGZ1bGwuanBnKQoKRW50cmUgbG9zIG1pZW1icm9zIGV4aXN0ZW4gYWxndW5vcyB1c3VhcmlvcyBjcsOtdGljb3MgcXVlIG1lbmNpb25hbiBhIEBldm9lc3B1ZWJsbywgcGVybyBsYSBtYXlvcsOtYSBzb24gdXN1YXJpb3MgZGUgYXBveW8gZGUgY3VlbnRhcyBpbnRlcm5hY2lvbmFsZXMgbyBuYWNpb25hbGVzLiBRdWVkYSBwb3IgY29uZmlybWFyIHNpIHNvbiBjdWVudGFzIGRlIGFwb3lvIGVzcG9udGFuZW8sIHBsYW5pZmljYWRvLCBwYWdhZG8gbyBzaW1wbGVtZW50ZSBib3RzLCBwdWVzIGxhIGVzdHJ1Y3R1cmEgZGUgaW50ZXJhY2Npw7NuIGFxdcOtIGVzIGJhc3RhbnRlIHBlY3VsaWFyLiAKCmBgYHtyfQpmaWx0ZXIoY2VudHJhbGVzLCBDb211bmlkYWQgPT0gIkQiKSAlPiUgCiAga25pdHI6OmthYmxlKCkKYGBgCgpFc3RhIGVzIHVuYSBjb211bmlkYWQgY2VudHJhbGl6YWRhIGFscmVkZWRvciBkZSB1bmEgY3VlbnRhIGd1YmVybmFtZW50YWwgRW4gZWwgZ3JhZm8gZGluw6FtaWNvIHNlIHZlcsOhIHF1ZSBlc3RhIGNvbXVuaWRhZCB0aWVuZSB1bmEgZnVlcnRlIHJlbGFjacOzbiBjb24gbGEgY29tdW5pZGFkIEIsIGF1bnF1ZSBubyBjb21wYXJ0ZW4gbGEgbWlzbWEgbMOzZ2ljYS4gCgojIyMgRS4gQ29tdW5pZGFkIGRlIG9waW5pw7NuIGNvbiBtZWRpb3MKClBvciB1bHRpbW8sIGxhIHF1aW50YSBjb211bmlkYWQgc2kgYmllbiB0YW1iacOpbiBlcyBkZXNjZW50cmFsaXphZGEsIHBvc2VlbiBjZW50cm9zIG5vZGFsZXMgbcOhcyBncmFuZGVzIGRlIGxvIGhhc3RhIGFob3JhIHZpc3RvLgoKIVtGaWd1cmEgOC4gR3JhZm8gZGUgbGEgb211bmlkYWQgZGUgb3BpbmnDs24gY29uIG1lZGlvc10oaW1nL2NvbTVmdWxsLmpwZyl7IHdpZHRoPTgwJSB9CgpJbmNvcnBvcmEgcHJpbmNpcGFsbWVudGUgbGEgcHJlc2VuY2lhIGRlIHR3ZWV0cyBkZSBtZWRpb3Mgc29icmUgbGFzIG5vdGljaWFzIGRlbCBoYXNodGFnLiBBdW5xdWUgdGFtYmnDqW4gaGF5IGxhIHByZXNlbmNpYSBkZSBvdHJvcyBjaXZpbGVzLCBhdmF0YXJlcyB5IHJlemFnYWRvcy4KCmBgYHtyfQpmaWx0ZXIoY2VudHJhbGVzLCBDb211bmlkYWQgPT0gIkUiKSAlPiUgCiAga25pdHI6OmthYmxlKCkKYGBgCgpFcyB1bmEgY29tdW5pZGFkIGRlc2NlbnRyYWxpemFkYSBjb24gbWVkaW9zIGNvbW8gbG9zIHByaW5jaXBhbGVzICpodWJzKiBkZSBpbmZvcm1hY2nDs24uIAoKIyMjIENvbXBhcmFjacOzbgoKwr9RdcOpIHNpbWlsaXR1ZGVzIHkgZGlmZXJlbmNpYXMgVGllbmVuIGxhcyBjb211bmlkYWRlcyBkZSBvcGluacOzbiBxdWUgaWRlbnRpZmljYW1vcz8gCgohW10oaW1nL2NvbXAuanBnKQoKTGEgY29tdW5pZGFkIGNpdmlsIGVzIGxhIHNlZ3VuZGEgbcOhcyBncmFuZGUsIG9jdXBhbmRvIGVsIDE2LDkyJSBkZWwgZ3JhZm8gZW50ZXJvLiBUYW1iacOpbiBwb3NlZSB1bm8gZGUgbGFzIGRlbnNpZGFkZXMgbcOhcyBhbHRhcywgbG8gY3VhbCBtdWVzdHJhIHN1IHZpZ29yLCBjb21vIHVuYSBjb211bmlkYWQgdmVyZGFkZXJhbWVudGUgb3Jnw6FuaWNhLiBMYXMgY29tdW5pZGFkZXMgZGUgYWN0aXZpc3RhcywgdGFudG8gZGVsIG9maWNpYWxpc21vIHkgbGEgb3Bvc2ljacOzbiB0aWVuZSBsw7NnaWNhcyBjb211bmljYXRpdmFzIHNpbWlsYXJlcywgYXVucXVlIGxhIG9maWNpYWxpc3RhIGNyZWEgbcOhcyBsYXpvcyBoYWNpYSBhZGVudHJvIHF1ZSBoYWNpYSBhZnVlcmEuIExhIGNvbXVuaWRhZCBjb24gbWVkaW9zIGVzIGxhIG3DoXMgcGVxdWXDsWEgeSB0YXJkw61hLCBjb24gKmh1YnMqIHZpc2libGVzIHF1ZSBjb25zdW1lbiBsYSBwYXJ0aWNpcGFjacOzbi4gRmluYWxtZW50ZSwgZWwgcG9yY2VudGFqZSBtw6FzIGdyYW5kZSBkZWwgZ3JhZm8gZW50ZXJvIGxvIG9jdXBhIGxhIGNvbXVuaWRhZCBndWJlcm5hbWVudGFsIGNvbiBlbCA0NCw1MSUsIHBlcm8gY29uIGxhIGRlbnNpZGFkIG3DoXMgYmFqYSBwb3IgbXVjaG8sIGFsIG5vIGV4aXN0aXIgbmkgc2lxdWllcmEgbXVjaGEgY29tdW5pY2FjacOzbiBlbnRyZSBsb3MgbWlzbW9zIGludGVybG9jdXRvcmVzLCByZWNvcmRhbmRvIGEgdW4gbMOzZ2ljYSBkZSBjb211bmljYWNpw7NuIGFsIMOpc3RpbG8gZGVsICpicm9hZGNhc3RpbmcqLiAKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmNvbXAgPC0gcmVhZF9jc3YyKCJjb21wLmNzdiIpCmNvbXAgJT4lIGtuaXRyOjprYWJsZSgpCmBgYAoKR2VuZXJhbW9zIHVuIGdyYWZvIGRpbsOhbWljbyBlbiBlbCBxdWUgcG9kZW1vcyB2ZXIgZXNhcyB0ZW5kZW5jaWFzIHkgb3RyYXM6CgohW10oaHR0cHM6Ly9tZWRpYS5naXBoeS5jb20vbWVkaWEvMzFZa2FyMFRibmNmM0hhaFlZL2dpcGh5LmdpZikKClBhcmEgdW5hIGV4cGxvcmFjacOzbiBtw6FzIG1pbnVjaW9zYTogCgo+aGVtb3MgY3JlYWRvIHVuYSAqdmVyc2nDs24gaW50ZXJhY3RpdmEqIGRlbCBncmFmbyBxdWUgcHVlZGUgc2VyIHZpc3VhbGl6YWRhIFthcXXDrV0oc2lnbWEvaW5kZXguaHRtbCkuCgojIyBDb25jbHVzaW9uZXMKCkVsIGhhc2h0YWcgI1JheW9Fdm9saXphZG9yIGZ1ZSBmdWdheiwgY29tbyBzdWVsZW4gc2VyIGxvcyBtZW1lcyB5IGxvcyBmZW7Ds21lbm9zIHZpcmFsZXMgZW4gSW50ZXJuZXQuIEhveSB5YSBubyBwYXJlY2UgaW1wb3J0YW50ZSB5IGxvcyB1c3VhcmlvcyBkZSBsYXMgcmVkZXMgcGFyZWNlbiBlc3RhciBzaWd1aWVuZG8geSBnZW5lcmFuZG8gb3RyYXMgdGVuZGVuY2lhcywgZW4gbGEgbMOzZ2ljYSBkaW7DoW1pY2EgZGVsIHByb3N1bWlkb3IuIFNpbiBlbWJhcmdvLCBlc3RlIHRpcG8gZGUgZmVuw7NtZW5vcyBzb2Npb2RpZ2l0YWxlcyBkZWphbiBodWVsbGFzIGltcHJlc2FzIGVuIGxhIFdlYiwgY29tbyBwdWRpbW9zIHZpc3VhbGl6YXIgYXF1w60sIGxhcyBjdcOhbGVzIG5vcyBzaXJ2ZW4gcGFyYSBsYSBjb21wcmVuc2nDs24gZGUgbGFzIGRpbsOhbWljYXMgZGUgb3BpbmnDs24gZW4gcmVkZXMgc29jaWFsZXMsIHNpZW5kbyBxdWUgc3UgZXN0dWRpbyBlbiBudWVzdHJvIHBhw61zIGHDum4gZXMgZXNjYXNvIHkgY29uIG3DqXRvZG9zIHLDunN0aWNvcy4gICAKCkVuIGVzdGUgY2FzbywgbGEgZGluw6FtaWNhIGNvbmNyZXRhIGZ1ZSBsYSBzaWd1aWVudGUuIFVuYSBjb211bmlkYWQgY2l2aWwgcXVlIGJ1c2NhYmEgcHJpbmNpcGFsbWVudGUgZWwgaHVtb3IgY3JlYSBlbCBoYXNodGFnLCBhbnRlIGxvIGN1YWwgYXBhcmVjZW4gZG9zIGNvbXVuaWRhZGVzIGFjdGl2aXN0YXMgcGFyYSB0w6FjdGljYW1lbnRlLCBkZXNkZSB1bmEgbHVjaGEgZGUgaW50ZXJhY2Npw7NuIGRlIHJlZGVzIGxsZXZhciBlbCBoYXNodGFnIGEgc3VzIGhvcml6b250ZXMuIEVuIGVzbyBpbnRlcnZpZW5lIGxhIGN1ZW50YSBkZWwgcHJlc2lkZW50ZSBAZXZvZXNwdWVibG8gcGFyYSBzZW50YXIgc3UgcHJlc2VuY2lhLCB0ZW5pZW5kbyB1biBmdWVydGUgYXBveW8sIGVuIHByaW1lciBsdWdhciwgZGUgaW5kaXZpZHVvcyBpbmNvbmV4b3MgeSwgZW4gc2VndW5kbyBsdWdhciwgZGVsIGFjdGl2aXNtbyBvZmljaWFsaXN0YS4gRGVzcHXDqXMgZGUgZXNvcyBlbmN1ZW50cm9zLCB2aWVuZW4gYWxndW5vcyByZXphZ2Fkb3MsIGluY2x1eWVuZG8gbGEgcHJlbnNhLiBFcyBkZWNpciBxdWUgbG8gcXVlIG3DoXMgZGluYW1pesOzIGVsIGhhc2h0YWcgZnVlIGFxdWVsbGEgY29tdW5pZGFkIG9yZ8OhbmljYSBvcmlnaW5hbCwgcGFyYSBxdWUgbHVlZ28gZnVlcmEgYWJvcmRhZGFzIHBvciB1bmEgbMOzZ2ljYSBkZSBhY3RpdmlzbW8gZW4gcmVkIHkgb3RyYSBsw7NnaWNhIGNlbnRyYWxpemFkYSBndWJlcm5hbWVudGFsLiAKClNpIGJpZW4gZXN0ZSBlcyB1biBjYXNvIGNvbmNyZXRvLCBwdWVkZSBpbHVzdHJhciBvdHJhcyBkaW7DoW1pY2FzIGRlIGdlbmVyYWNpw7NuIGRlIG9waW5pw7NuIHDDumJsaWNhIGVuIGxhcyByZWRlcywgcHJpbmNpcGFsbWVudGUgbGFzIG3DoXMgc3V0aWxlcyBxdWUgc8OzbG8gcHVlZGVuIHNlciBhcHJlY2lhZGFzIGEgcGFydGlyIHVuYSBtaXJhZGEgcGFub3LDoW1pY2EuIExvIGN1YWwgaW5jbHV5ZSBsYSBhaG9yYSBkZW5vbWluYWRhICJndWVycmEgZGlnaXRhbCIgIHF1ZSBlbCBnb2JpZXJubyBoYSBjb252b2NhZG8gKExvcyBUaWVtcG9zIDA0LzAyLzIwMTgpLgoKIyMgQmlibGlvZ3JhZsOtYQoKSW5nb2xkLCBUaW0gKDIwMTUpLiAqTGluZWFzOiBVbmEgYnJldmUgaGlzdG9yaWEqLiBCYXJjZWxvbmE6IEdlZGlzYS4gCgpMb3MgVGllbXBvcyAoMDQvMDIvMjAxOCkuICJFdm8gaW5zdGEgYSBvcmdhbml6YWNpb25lcyBhIHByZXBhcmFzZSBwYXJhIHVuYSAnZ3VlcnJhIGRpZ2l0YWwnIGVuIHJlZGVzIHNvY2lhbGVzIi4gCgpPamVkYSwgQWxleCAoMjAxNSkuICJJbnRyb2R1Y2Npw7NuIGFsIEFuw6FsaXNpcyBkZSBSZWRlcyBTb2NpYWxlcyIuIFRleHRvIGRlIGxhIG1hdGVyaWEgZWxlY3RpdmEgIkFuw6FsaXNpcyBkZSBSZWRlcyBTb2NpYWxlcyBJIiBkZSBsYSBDYXJyZXJhIGRlIFNvY2lvbG9nw61hLCBGYWN1bHRhZCBkZSBDaWVuY2lhcyBTb2NpYWxlcyAtIFVNU1MuIAoKUm9nZXJzLCBSaWNoYXJkICgyMDEzKS4gKkRpZ2l0YWwgTWV0aG9kcyouIE1JVCBQcmVzcy4KClZpY2tlcnksIEphY3F1ZWxpbmUgKDIwMTUpLiAiTWVtZXMgaW4gZGlnaXRhbCBjdWx0dXJlIi4gRW46ICpJbmZvcm1hdGlvbiwgQ29tbXVuaWNhdGlvbiAmIFNvY2lldHkqLCAxODoxMiwgMTQ1MC0xNDUxLCBET0k6IDEwLjEwODAvMTM2OTExOFguMjAxNC45NzkyMTcKCgojIyBIZXJyYW1pZW50YXMgZGlnaXRhbGVzIAoKKiBSCiogU29jaWFsTWVkaWFMYWIKKiBpR3JhcGgKKiBHZXBoaQoqIFNpZ21hLmpzCgojIyBTb2JyZSBlbCBhdXRvcgoKQWxleCBPamVkYSBDb3BhIGVzIHNvY2nDs2xvZ28gZGlnaXRhbCB5IGFuYWxpc3RhIGRlIHJlZGVzIHNvY2lhbGVzLiBPdHJvcyBwcm95ZWN0b3MgZW4gbG9zIHF1ZSBlc3TDoSB0cmFiYWphbmRvIHB1ZWRlbiB2ZXJzZSBlbiBzdSBbcG9ydGFmb2xpb10oaHR0cHM6Ly9hbGV4LXJvYy5naXRodWIuaW8vKS4gVGFtYmnDqW4gcHVlZGVuIGNvbnRhY3RhcmxvIGVuIFtUd2l0dGVyXShodHRwczovL3R3aXR0ZXIuY29tL2FsZXhyb2N6KSwgW0xpbmtlZEluXShodHRwczovL3d3dy5saW5rZWRpbi5jb20vaW4vYWxleHJvYy8pIHkgW0FjYWRlbWlhLmVkdV0oaHR0cHM6Ly91bXNzLmFjYWRlbWlhLmVkdS9hbGV4cm9jKS4gCgojIyBOb3RhcwpbXjFdOiBBcXXDrSB1dGlsaXphbW9zIGVsIHRlcm1pbm8gImNvbXVuaWRhZCIgbm8gZW4gc3Ugc2VudGlkbyBhbnRyb3BvbMOzZ2ljbyBkZSBzZW50aWRvcyBjb21wYXJ0aWRvcywgc2lubyBlbiBlbCBzZW50aWRvIGRlbCBBbsOhbGlzaXMgZGUgUmVkZXMsIGNvbW8gdW4gY29uanVudG8gZGUgYWN0b3JlcyBxdWUgaW50ZXJhY3R1YW4gZnJlY3VlbnRlbWVudGUgaGFjaWEgYWRlbnRybyBwZXJvIG5vIG11Y2hvIGhhY2lhIGFmdWVyYSwgc2llbmRvIGVzYSBzdSBmcm9udGVyYSBjb24gb3RyYXMgY29tdW5pZGFkZXMuIApbXjJdOiBVc2Ftb3MgZWwgYWxnb3JpdG1vIGRlIG1vZHVsYXJpZGFkIHF1ZSB0aWVuZSBHZXBoaSBpbmNvcnBvcmFkbywgY29ub2NpZG8gdGFtYmnDqW4gY29tbyAiTG91dmFpbiBNb2R1bGFyaXR5Ii4gQsOhc2ljYW1lbnRlIGxvIHF1ZSBoYWNlIGVzdGUgYWxnb3JpdG1vIGVzIGhhY2VyIHVuIGNhbGN1bG8gZGVsIHBlc28gZGUgbGFzIGFyaXN0YXMgZW4gZWwgdmVjaW5kYXJpbyBkZSBjYWRhIG5vZG8sIHBhcmEgZGV0ZWN0YXIgbm9kb3MgZG9uZGUgbGFzIGFyaXN0YXMgc29uIG3DoXMgZGVuc2FzIGVudHJlIHPDrSB5IGFsIG1pc21vIHRpZW1wbyBtZW5vcyBkZW5zYXMgZnJlbnRlIGEgb3Ryb3MuIEFzw60gZXMgcG9zaWJsZSBkZXRlY3RhciBjb211bmlkYWRlcyBiYXNhZGFzIGVuIGxhIGludGVyYWNjacOzbi4gTcOhcyBkZXRhbGxlcyBlbjogaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzA4MDMuMDQ3Ni4gCgoKCgo=