El objetivo principal del curso es aprender un poco, todo lo que podamos, sobre una nueva disciplina: Ciencia de datos o Data Science. En concreto, nos centraremos en aprender a manejar y analizar datos utilizando una herramienta profesional como R. En el tema 2 hablaremos y utilizaremos intensivamente R, de momento nos sobra con señalar que R es un programa informático, más bien un entorno, con el que hacer análisis de datos (o ciencia de datos), pero R también es un lenguaje de programación. Lo veremos!!

Antes de empezar el cuerpo principal del curso voy a tratar de explicar, en este tema introductorio, qué significan términos que todos habéis oído como: Big Data, Inteligencia Artificial (IA), Machine Learning (ML), algoritmos, redes neuronales, etc… etc… Puff!!! Muchas cosas, pero … paso a paso.

1. ¿Qué es esto de la era del Big Data?

Pues no os voy a engañar, la principal razón de la presencia del término “Big Data” en el título del curso es que me parecía que como el título comienza con “Programación y manejo de datos …”, es posible que nadie se apuntase al curso, así que había que añadir al título un término de moda y un poco misterioso. ¿Estrategia de marketing? Un poco sí, pero en realidad todos los cursos de Ciencia de Datos que están apareciendo en el mundo, seguramente no habrían aparecido si no estuviésemos en la “era del Big Data”. En el curso no usaremos técnicas de Big Data pero sí hablaremos algo de ellas, principalmente en el tema 4.

Los tiempos están cambiando (The Times They Are A Changin’) decía Bob Dylan en el 64. Quizás los tiempos siempre han estado cambiando y siempre cambiarán, pero ahora mismo la mayoría de nosotros tenemos la sensación de que todo va muy deprisa. En mi opinión lo que está detrás de este cambio acelerado del mundo en muchos aspectos tiene que ver con la tecnología, fundamentalmente con los ordenadores y las redes que transmiten cantidades ingentes de datos.

Puede que nada ilustre más estos cambios que lo qué he hecho yo para continuar este razonamiento: en lugar de buscar un libro he buscado en Google “la era del Big Data”. En estos últimos años he leído bastante sobre el tema, pero para empezar a pensar me he ido a Google y he buscado el término. El tercer resultado me ha llevado a la Wikipedia (otro de los milagros disruptivos que hemos vivido en las dos últimas décadas). Igual que he hecho yo para informarme/documentarme, todos los días utilizamos software, aplicaciones para gestionar la agenda, escuchar radio, comprar, comunicarnos etc … La tecnología está presente en todos los aspectos de nuestra vida porque llevamos un ordenador, el teléfono móvil, en el bolsillo, y con él podemos comunicarnos y recibir y transmitir información a través de la redes. Esto es lo que ha cambiado el mundo y seguirá cambiándolo y afectará a todas las esferas de nuestra vida, espero que para bien (seguro!!). Pero claro, en el curso no vamos a hablar de todo esto, solo de trasfondo, sino que nos centraremos en los datos, en como tratar, manejar y obtener información de las grandes cantidades de datos que consumimos y generamos constantemente; así que, dejemos las posibles implicaciones sociales, políticas, filosóficas para otros cursos y bajemos a cosas más concretas.

¿Qué significa, qué es Big Data?

Pues es un término polisémico, tiene distintos significados. Luego seré más preciso y riguroso, pero de momento podemos pensar que Big Data significa que tenemos muuuuuuchos datos, muchos. Esta disponibilidad de datos es uno de los principales factores que explican porqué el desarrollo técnico se ha acelerado en los últimos tiempos.

Lo que ha pasado es que, el hecho de que los científicos dispongan ahora de muchos datos ha dado un fuerte impulso a un campo de la Inteligencia Artificial (concretamente el campo del Machine Learning/Deep Learning) que ha hecho que las máquinas, los ordenadores, los robots, puedan hacer cosas que antes eran inimaginables, como por ejemplo que Alexa nos entienda, que haya coches autónomos que conduzcan mejor que los humanos, que un ordenador gane al campeón mundial de ajedrez (esto paso ya hace mucho tiempo, en 1996, antes de la era del Big data 1).

En los medios, en la tele, se habla, aparece el término “la era del Big data” significando más o menos lo que os he contado, que la “abundancia de datos” está impulsando fuertemente el desarrollo tecnológico, de forma que ahora tenemos acceso a aplicaciones que hasta hace bien poco parecían ciencia ficción.

Este acelerado cambio técnico y sus aplicaciones, va a tener y está teniendo innumerables efectos en todos los ámbitos de nuestra vida y también en el de las empresas e industrias. Muchas industrias, como la del transporte van a ver como el escenario cambia y, muy posiblemente, las que no sepan entender y aprovechar los nuevos retos tecnológicos posiblemente acaben despareciendo; evidentemente esto genera, ya sea real o no, una urgencia en las empresas por intentar no quedarse fuera de este cambio acelerado y esto, en principio, genera mayor demanda de profesionales que sepan de tecnología y de datos. Bien, creo que ya tenemos un poco más claro que significa esto de “la era del Big Data”.

El término Big Data es relativamente nuevo, y en castellano se suele traducir como “Datos masivos”, aunque ahora mismo en la wikipedia pone “Macrodatos” y aquí recomiendan el uso del término Macrodatos. A mi personalmente no me acaba de gustar este término, pero quizás sea por el hecho de que tengo formación de economista, y el término macrodatos me recuerda a los datos macroeconómicos. En cualquier caso, el término usado habitualmente es el inglés: Big Data.

El término tiene matices, y variantes, pero para mi, la característica definitoria de datos Big es el hecho de que estos datos tengan tal volumen (o complejidad) que no “quepan”, que no puedan “manejarse” en un ordenador, en realidad que no puedan tratarse con las aplicaciones informáticas habituales. Tal y como figura en la Wikipedia: “es un término que hace referencia al concepto relativo a conjuntos de datos tan grandes y complejos como para que hagan falta aplicaciones informáticas no tradicionales de procesamiento de datos para tratarlos adecuadamente”

Luego hay “definiciones” más elaboradas como una famosa, de 2001 en la que se destacaban tres aspectos en el Big Data, las tres “v’s” del Big Data: volumen, velocidad y variedad: después se han añadido 2 uves más y se habla de 5 uves o 5 aspectos relacionados con el Big Data: volumen de datos, velocidad con la que se obtienen y transfieren, variedad de tipos de datos (texto, imágenes etc…), veracidad de las fuentes, y un quinto aspecto a considerar es el valor que aportan los datos. En este texto cortito lo explican bien.

Se pueden mirar más aspectos del Big data, pero lo fundamental es que son datos, que ya sea por su volumen, por su variedad, o por su velocidad no son fáciles de almacenar/tratar/manejar con las técnicas y ordenadores habituales. Este hecho da lugar a que el mercado, las empresas, necesiten personas que sean capaces de gestionar la infraestructura de hardware y software para manejar datos masivos, estas personas generalmente son ingenieros de software, o informáticos. Además de almacenar y distribuir los datos las empresas también necesitan personas que sean capaces de analizar y obtener información y valor de esos datos, el perfil de estas personas es menos uniforme, puede que sean ingenieros, matemáticos, estadísticos, economistas (why not?), biólogos, sí en Biología con el estudio del genoma y los genes es uno de los campos donde más se está haciendo Ciencia de Datos.

En cualquier caso, como es un área o campo de estudio relativamente nueva y además en constante evolución, los términos y conceptos aún están definiéndose y evolucionando; por ejemplo, ya se empieza a hablar del “smart data”. En este artículo señalan que:

“El término big data … hace referencia a conjuntos de datos que, debido a su gran volumen, necesitan sistemas especializados de almacenado y procesado para poder trabajar con ellos de manera eficiente …. La información es importante, sí, pero demasiada puede llegar a ser confusa y hasta contraproducente …. Aquí es donde el big data da un paso hacia adelante, el smart data, que se encarga de detectar señales y patrones relevantes a través de algoritmos inteligentes”.

Esto a mí me suena al objetivo fundamental de la Ciencia de Datos, extraer información a partir de los datos de forma que se genere conocimiento y/o valor.

Muchas veces si leéis un articulo relacionado con “el Big Data” aparecen palabras extrañas: Keras, TensorFlow, Apache, ApacheSpark, Mongo, MongoDB, Maria, Cassandra, …. y muchísimas más. Yo conozco algunas un poco, otras me suenan y otras me suenan a chino. ¿Qué son? Pues en general son nombres de aplicaciones informáticas, o repositorios de datos, o empresas, o paquetes, frameworks, …, que se utilizan para almacenar/tratar/manejar/estimar modelos con grandes volúmenes de datos. Por ejemplo Apache es una fundación de software libre, que se ocupa de hacer proyectos que en la práctica posibilitan hacer Big data, implementar los nuevas técnicas, con software y plataformas open source. Como la fundación Apache tiene muchos proyectos y “productos”, por eso hay ApacheSpark, Cassandra, Geronimo etc…

Esta infraestructura, tanto física (ordenadores, repositorios), como de software/programas que se utilizan en Big Data cambian muy deprisa. Constantemente están surgiendo nuevas empresas, nuevos métodos, un nuevo algoritmo, una nueva implementación de algo ya existente, etc…

Nos acaba de parecer otra palabra importante en este campo de conocimiento, los algoritmos, ya hablaremos de ellos y su importancia en “la era del Big Data”.

Quiero llamaros la atención sobre varias ideas que, como muchísimas otras no trataremos en el curso 2, algunas de ellas provienen de este artículo:

  • Los datos hoy son omnipresentes y a menudo abrumadores. Producimos, organizamos y consumimos datos de manera casi constante. Estamos rodeados de información que no para de aumentar. Una de las principales fuentes de datos son nuestras acciones en la red (clicks, likes, rating, shares, etc… ), pero también hay muchos datos provenientes de sensores en máquinas y procesos, piensa por ejemplo en la información que genera un coche de Formula 1, o un sonda espacial, o el VAR que hay en el fútbol. A modo de ejemplo, Data Never Sleeps 8.0 de Domo informó que en cada minuto de 2020 hubo, usando datos solamente de la la plataforma Zoom, un promedio de 208.333 personas conectadas en una reunión virtual y se crearon 347.222 historias en Instagram.

  • De la misma forma que Internet cambió radicalmente el mundo al añadir comunicación, los datos masivos modificaran aspectos fundamentales de nuestra vida otorgándole una dimensión cuantitativa que nunca había tenido antes, piensa por ejemplo en aplicaciones médicas o de monitorización de la actividad física. Ante tal volumen de datos, el desafío es construir conocimiento usando los datos más relevantes y diversos, no solo para nosotros, sino para nuestra sociedad en su conjunto.

  • Hasta hace algunas décadas la recopilación de la información estaba mayormente a cargo de los Estados nacionales, pero, ahora mismo, gran parte de los datos están en manos de empresas privadas (Google, Facebook, Amazon, … ). Esto tiene y puede tener fuertes implicaciones y consecuencias.

  • El poseer datos puede dar poder/beneficio/ventajas competitivas a quien los posea. Por ejemplo, según los expertos, el mejor traductor online no es Google Translator sino DeepL. Los dos servicios utilizan algoritmos de inteligencia artificial, pero parece ser que DeepL tiene mejores datos. DeepL utiliza los datos del proyecto Linguee que ha permitido construir una base de datos enorme. Lo explican aquí

  • El ejemplo anterior ilustra que lo que hay detrás de los avances no son los algoritmos o la IA/ML/DL, sino los datos: el gran volumen de datos es lo que ha hecho posible esta época de avances tecnológicos acelerados; en este sentido se suele decir que los datos son el nuevo petroleo, pero a diferencia de este, cuyas reservas podemos considerar fijas, el volumen de datos no hace sino crecer, son más fáciles de transportar y generan más valor para la sociedad cuanta más gente los usa.

  • Obviamente, la gran disponibilidad de datos tiene también aspectos más oscuros o con potenciales peligros, como por ejemplo aspectos legales en la seguridad y privacidad, o sesgos en los datos. Ya no sólo que los gobiernos corten internet o espíen a los ciudadanos, como por ejemplo el caso Snowden o el plan de crédito social chino, sino que está emergiendo un mercado de espionaje digital.

En este post hablan de cómo favorecer que las aplicaciones surgidas de la IA sean socialmente responsables o que los algoritmos no acaben reproduciendo los sesgos presentes en los datos. En esta guía para el diseño responsable de sistemas de IA del Alan Turing Institute desarrollan estás ideas.

  • Cuando se dispone de datos sensibles, por ejemplo datos médicos, aparece el dilema entre privacidad e información que puede ser beneficiosa para la sociedad. Siempre se puede tratar de anonimizar los datos, pero parece ser que a los expertos les resulta no demasiado complicado recuperar la información original; es decir, a veces es posible la reidentificación de ficheros anonimizados. Más sobre esto aquí y aquí.

  • Como en otras facetas de la vida, la información y transparencia es clave a la hora de reducir los posibles riesgos de las aplicaciones de IA. Es importante que el código fuente de las aplicaciones y algoritmos sea de acceso libre. Como ejemplo este artículo de Público o este paper.


2. IA, ML y DL

Inteligencia Artificial (IA), Machine Learning (ML) y Deep Learning (DL) 3 son tres palabras/conceptos que aparecen constantemente en la era del Big Data. Aquí tienes un post sencillo y claro sobre estos tres términos.

La primera idea a retener está resumida en la infografía que veis más abajo y que proviene de este post

IA, ML y DL

IA, ML y DL

Como se aprecia en la infografía, DL es un subconjunto del ML y ML es un campo de la IA. Vamos que tanto DL como ML son aplicaciones específicas de IA. La IA surgió en los 50 y el ML puede verse como un enfoque de la IA que empezó a coger fuerza en los 80 y que supuso un cambio de paradigma en como se afrontaba la IA.

Primero veamos qué es la IA. Para ello voy a recurrir de nuevo a la Wikipedia y a lo que ya sé sobre IA para redactar unos párrafos que os den cierta idea de qué es la IA.

La Wikipedia empieza diciendo: “IA es la inteligencia llevada a cabo por máquinas”. Esta primera frase no aclara mucho, pero es que a veces la cosas cuestan. Lo intento yo: IA es un campo de conocimiento, compartido por varias ciencias, cuyo objetivo podemos pensar qué es que la maquinas sean inteligentes. Las maquinas no son humanos, nunca van a poder ser inteligentes en un sentido amplio o humano, sólo en la ciencia-ficción, pero sí pueden tener comportamientos “inteligentes”; es decir que hagan cosas que simulen la inteligencia humana como por ejemplo resolver problemas o dicho de forma más técnica, en función de unas variables de entorno tomar una decisión (esto es lo que hace por ejemplo un ordenador que juega al ajedrez, en función de las posiciones de las piezas en el tablero toma una decisión sobre que pieza mover). Una definición concisa del campo sería: el esfuerzo por automatizar las tareas intelectuales normalmente realizadas por los seres humanos.

La idea fundamental en que se basa la Inteligencia Artificial es conseguir que una computadora resuelva un problema complejo como lo haría un humano. Es decir, según Andreas Kaplan y Michael Haenlein definen la inteligencia artificial es “la capacidad de un sistema para interpretar correctamente datos externos, para aprender de dichos datos y emplear esos conocimientos para lograr tareas y metas concretas a través de la adaptación flexible”. Por ejemplo, conducir un coche.

¿Desde cuando existe la inteligencia artificial? Pues desde hace bastante ….. no habíais nacido, ni yo tampoco.

La inteligencia artificial nació en la década de 1950, cuando un puñado de pioneros del campo de la informática comenzó a preguntarse si las computadoras podían “pensar”, una pregunta cuyas ramificaciones se están explorando todavía hoy. La idea principal que subyace al campo de la IA es conseguir que una computadora resuelva un problema o tarea compleja como lo haría un humano.

Durante las primeras etapas, mediados de los 60, se pensaba que la IA podría lograrse elaborando un conjunto suficientemente grande de reglas explícitas para manipular conocimiento o datos. En esta fase, se desarrollaron aplicaciones conocidas como sistemas expertos, en los que se creía que un potente ordenador y un conjunto de reglas de razonamiento podrían emular el razonamiento humano. Este enfoque se conoce como IA simbólica, y fue el paradigma dominante en IA hasta finales de los 80.

La IA simbólica demostró ser adecuada para resolver problemas lógicos bien definidos, como jugar al ajedrez, pero resultó difícil encontrar reglas explícitas para resolver otro tipo de problemas complejos y difusos, como la clasificación de imágenes, el reconocimiento de voz o la traducción de textos; de forma que hoy en día se utiliza otro enfoque: el Machine Learning o Aprendizaje Maquina.

Como señalan aquí, no fue hasta los años 80, casi 30 años después del los inicios de la IA, que empezó a cobrar importancia el aprendizaje automático o Machine Learning. Se trata de una forma de IA que ya no necesita un programador que codifique reglas, sino que es capaz de establecer sus propias reglas y aprender por sí misma.

La idea básica detrás del ML consiste en que, en lugar de darle al ordenador un conjunto de reglas para procesar los datos, es el propio ordenador el que aprende esas reglas mirando/analizando los datos. ¿Cómo? Ya lo veremos, pero lo que está claro es que el enfoque/paradigma ha cambiado: en lugar de programar y dar al ordenador unas reglas o programa para procesar los datos y devolvernos respuestas/acciones, el enfoque del ML provee a la maquina con los datos y las respuestas esperadas con esos datos y nos devuelve las “reglas”. Estas reglas pueden aplicarse a nuevos datos para producir las respuestas en esos nuevos datos. Un sistema que usa ML no es explícitamente programado, sino que se le provee de suficientes datos (relevantes para la tarea que se espera que haga) y encuentra las reglas (o estructura estadística) en esos datos o ejemplos y, si todo funciona bien, el sistema aprende y encuentra las reglas/patrones para poder automatizar la tarea y que sea llevada a cabo por la máquina. Un sistema/programa de ML es entrenado más que explícitamente programado.

Un ejemplo puede ayudar a entenderlo: ¿Cómo se enseña a un niño qué es un gato y qué es un perro? No se le provee de reglas, no se le dice, mira un gato tiene dos orejas puntiagudas, bigotes, cola y cuatro patas; generalmente se le enseña al niño con ejemplos, se le enseñan fotos de gatos y perros y es el propio niño quien aprende las reglas de forma que sin que nadie le diga nada, cuando ve un gato por la calle lo identifica, quizás al principio se equivoca pero conforme se le dan más ejemplos acaba aprendiendo a reconocer/etiquetar a los gatos. Conforme el niño practica, cada vez lo hace mejor; es decir, aprende. Lo que es destacable es que no es necesario enseñar ninguna regla al niño; es decir, parece que los humanos tenemos “de serie” mecanismos de clasificación, podemos inferir reglas de clasificación, reglas que usamos pero que nos es difícil describir.

Este es el enfoque que utiliza el ML, no se programan las reglas (o características) del problema o cuestión a analizar (identificar gatos), sino que se le provee de datos (fotos de gatos y de perros) correctamente etiquetadas y mediante técnicas estadísticas/algoritmos él sólo encuentra las reglas para diferenciar entre perros y gatos. Una vez el programa/ordenador ha encontrado las reglas, se le pueden pasar nuevas fotos de perros y gatos (está vez sin etiquetar) y él las etiquetará. En cierta forma el ordenador ha aprendido de los datos y sabe diferenciar gatos de perros. Esta capacidad de generalizar, de aplicar los conocimientos adquiridos a través de la formación a ejemplos y situaciones nuevos, es una característica clave tanto del aprendizaje humano como del aprendizaje automático. Por supuesto, el aprendizaje humano es mucho más sofisticado que los algoritmos más avanzados de aprendizaje automático, pero las computadoras tienen la ventaja de tener mayor capacidad para el procesado de datos.

Los científicos que trabajan el campo del ML/DL utilizan técnicas de ML para elaborar aplicaciones o programas que funcionen para resolver/hacer una tarea concreta, como por ejemplo detectar spam, sugerir una ruta de tráfico, clasificar una imagen, traducir un texto, reconocer el lenguaje hablado, etc… Aquí puedes ver a dos inteligencias artificiales aprendiendo a jugar al escondite. Después de unas cuantos millones de partidas han aprendido bastante bien, incluso a colaborar para esconderse mejor En este artículo lo explican un poco.

En el campo del ML/DL se utilizan técnicas estadísticas/algoritmos de aprendizaje. Hay muchos tipos de ellos. La elección del más adecuado, dependerá del tipo de tarea que se quiera resolver en cada caso. Por ejemplo, podemos hablar de algoritmos de clasificación como los árboles de decisión, o Naïve Bayes, algoritmos de regresión, de clustering, de análisis de componentes principales, redes neuronales, …

Con ML no nos encontraremos con ordenadores que piensan en el sentido humano, solamente estaremos utilizando el poder de computo de los ordenadores para obtener información a partir de un conjunto de datos; en realidad estamos usando ML para dar sentido a los datos4. Las técnicas de ML se pueden aplicar a muchos campos, desde la política hasta las neurociencias. Es una herramienta que se puede aplicar a muchos problemas. Cualquier campo que necesite interpretar y actuar sobre los datos puede beneficiarse de las técnicas de aprendizaje automático. De hecho, estas técnicas, principalmente las de aprendizaje profundo, se están convirtiendo en el motor que impulsa la economía moderna basada en datos y para que ese motor funcione se necesita “energía”, y la energía la proporcionan los datos. En ese sentido se dice que los datos son el nuevo petroleo. Lo importante no son tanto las técnicas, sino los datos que alimentan a los algoritmos.

Las técnicas de ML/DL esencialmente sirven para hacer predicciones, en general, no permiten obtener la causa de algo. Los datos masivos tratan del qué, no del porqué. No se obtienen relaciones de causalidad sino correlaciones o asociaciones. Bueno … a todos nos gusta conocer las causas, sobre todo a los investigadores, pero, quizás, muchas veces esto no sea absolutamente necesario y aunque esto choque con las prácticas establecidas hace siglos y con nuestra comprensión más elemental sobre como tomar decisiones y aprehender la realidad. Siendo un poco abogado del diablo, no siempre necesitamos saber la causa; además, el método científico tradicional se limitaba a contrastar un limitado número de hipótesis mientras que con las técnicas de ML/DL el enfoque consiste, en cierta forma, en dejar que los datos hablen por si mismos.

Respecto al Deep Learning, simplemente volver a decir que es un subconjunto del ML. Son técnicas más complejas en términos computacionales y por lo tanto necesitan para aprender un mayor volumen de datos, pero su filosofía es la misma: proveer de datos para que el ordenador aprenda a resolver y automatizar una tarea concreta. Utilizan algoritmos más complejos o con más elementos o capas. Prácticamente todas las aplicaciones exitosas utilizan técnicas de DL, y generalmente algoritmos basados en redes neuronales.

Os dejo algunas ideas frases sobre DL provenientes de este fantástico artículo:

  • El Deep Learning es una de las áreas de investigación más populares dentro del campo de la Inteligencia Artificial en los últimos años porque, gracias a estas técnicas, cosas como la visión artificial o el procesamiento del lenguaje natural han saltado del ámbito de la ciencia ficción a la realidad.

  • El Deep Learning es tan importante porque está permitiendo resolver de forma más fácil y eficiente un gran número de problemas. Por una parte, realiza de forma automática una de las tareas más complejas del proceso de trabajo de Machine Learning: la ingeniería de atributos5. Las redes neuronales seleccionan de forma automática qué atributos son los relevantes y cuáles se pueden desechar.

  • Otra de las grandes ventajas de trabajar con redes neuronales es que permiten trabajar con cualquier tipo de input. Cualquiera: números, imágenes, sonidos, textos, series temporales. Teniendo en cuenta que los datos no estructurados, aquellos que no encajan en la estructura tradicional filas/columnas de las bases de datos relacionales, suponen más de un 90% de todos los datos generados, es fácil comprender la importancia de poder manejarlos de forma eficiente. Estamos hablando de datos como mensajes de correo, vídeos, ficheros de audio, páginas web, mensajes en redes sociales etc.

  • Una red neuronal entrenada con datos etiquetados, también se puede aplicar a datos no estructurados, lo cual les da a los algoritmos de Deep Learning una gran ventaja respecto a otros algoritmos al poner a su disposición un volumen de datos de entrenamiento mucho mayor. Algoritmos no muy buenos entrenados con enormes conjuntos de datos pueden dar mejores resultados que buenos algoritmos entrenemos con conjuntos de datos reducidos. De hecho, mientras en el caso de los algoritmos tradicionales usados en Machine Learning llega un momento en el un mayor volumen de datos no implica un mejor rendimiento, en el caso del Deep Learning no ocurre así. El rendimiento no deja de crecer, según lo hacen el volumen de datos y el número de capas del modelo.

Como ya sabéis, aunque el curso tiene un tema sobre ML, el tercero, en el que se hará una introducción a la terminología y principales métodos del ML, en realidad el curso no está orientado al ML, ni mucho menos al DL, sino que está más orientado a ser una introducción a la ciencia de datos (DS).

¿Que qué es la Ciencia de datos? Pues voy a tratar de explicarlo en el siguiente apartado.

3. Ciencia de Datos

Como se dijo en el prefacio, DS es una nueva disciplina6 que se incorpora poco a poco, pero con mucha fuerza, a la mayoría de planes de estudio, incluida la Economía. Por ejemplo, este Máster de la LSE.

¿De qué se ocupa la ciencia de datos? Pues puede tener varias respuestas, pero en definitiva el objetivo último de la ciencia de datos es transformar los datos en información con sentido. Algunos dirán, pero sí ese es el objetivo de la Estadística. Sí, es cierto, transformar datos en información es, y ha sido siempre, el objetivo último de la estadística, PERO lo que habitualmente conocemos por Estadística se fue conformando con el paso de los años en un contexto en el que conseguir datos era difícil, así que se desarrollaron métodos y técnicas apropiadas para extraer el máximo de información con muestras de reducido tamaño. El contexto ha cambiado, vivimos rodeados de datos, de mayor volumen y variedad, lo que provoca nuevos retos a los analistas, y tenemos mayor capacidad de computo, por lo que a veces ya no hay que utilizar aproximaciones asintóticas7. La American Statistical Asociation (ASA) destaca la importancia de la Estadística en DS, pero reconoce en este statement la diferencia entre DS y estadística.

No es estrictamente cierto, pero podemos pensar que la estadística tradicional se concentra principalmente en las técnicas o métodos estadísticos, además dado el contexto de escasez de datos, en un tipo determinado de técnicas; sin embargo la óptica de la ciencia de datos es más amplia. En Ciencia de datos se usan y necesitan técnicas estadísticas, pero el enfoque es más global: se hace énfasis en que el proceso de análisis de datos comienza desde que se recopilan los datos hasta que se presentan los resultados8. El siguiente diagrama ilustra este proceso:

En la Ciencia de datos, etapas como el procesado y limpieza de datos o el análisis gráfico, que ocupaban un lugar secundario cuando no marginal en los libros tradicionales de estadística se han convertido en partes fundamentales del trabajo de un científico de datos.

No solo se considera el análisis de datos como un proceso más global compuesto de varias etapas, sino que dada la complejidad, volumen y variedad de los datos actuales se necesita un fuerte componente tecnológico generalmente apoyado en los ordenadores y la programación. No se puede, o es extremadamente complicado, hacer ciencia de datos sin saber programar. Además en la ciencia de datos se da una gran importancia al contexto en el que se hace Data Science, en cierta forma se reconoce que hace falta saber Economía para hacer ciencia de datos en el campo de la economía.

La siguiente infografía puede ilustrar esta idea, mostrando que, idealmente, para hacer DS se requieren, al menos, tres tipos de competencias o conocimientos: 1) matemáticas y estadística, 2) tecnología y programación y 3) conocimientos del campo de aplicación. En este post explican el diagrama en detalle, por ejemplo, qué es la “Danger Zone”.

En este post desarrollan estas ideas en el contexto concreto de la industria manufacturera y hacen un listado de potenciales usos de la DS en el campo de las manufacturas. En este otro post puedes encontrar una visión de la DS un poco distinta, ya que incide en la diferencias entre DS, ML e IA. Como resumen del post: “Data science produces insights, Machine learning produces predictions, Artificial intelligence produces actions”. En este otro post argumentan que los científicos de datos son más necesarios que nunca y que su labor no puede, al menos de momento, ser reemplazada por procesos automatizados usando técnicas de ML.

Dos definiciones sencillas de DS:

  • @YBuhl: This phrase by @juliesquid is worth retweeting it all over again: “Data Science is not just about #AI or machine learning. It is the discipline of turning raw data into understanding.”

  • @TiffanyTimbers: Thinking a lot about the definition of #DataScience. The best that I have read so far comes from @rafalab: “the processes used to extract value from data”. I think we should extend this and say “the reproducible & transparent processes used to extract value from data”

Por último, 3 “definiciones” de DS medio en broma:

  • Un científico de datos es un estadístico con pajarita

  • Un estadístico que trabaja en San Francisco

  • Científico de datos (n): Persona que sabe más de estadística que cualquier programador y que a la vez sabe más de programación que cualquier estadístico


¿Es fácil ser científico de datos?

Pues, como todo, depende, pero si que hay que tener en cuenta que es un campo en continúa evolución. Estos post, 1, 2 y 3, inciden en lo estresante que puede ser la vida de un científico de datos que intente estar al día de las continuos cambios y evoluciones en este campo.

Parecido a lo que sugiere este tweet:


Aunque también está bien desmitificar un poco y tomarse las cosas menos en serio:


Como sugiere este otro tweet, no se puede saber todo, ni pasar por la vida sin cometer errores:


Para finalizar, un hilo de Tweeter con muuuuuuchos errores:


4. Ciencia de datos en Economía

Evidentemente todo este cambio tecnológico acelerado al que asistimos en la era del Big Data, y que muchas veces está asociado al ML/DL, ha provocado y provocará grandes cambios tanto en la economía real como en la ciencia económica. Una panorámica de trabajos que analizan las implicaciones de estos cambios en la ciencia económica puede verse en Análisis económico de la revolución digital.

Uno de los efectos más evidentes consiste en que las innovaciones tecnológicas asociadas al ML seguramente cambiarán radicalmente, si es que no lo han hecho ya, muchos sectores económicos; por ejemplo el transporte o la banca, pero también muchos otros como los seguros, servicios audiovisuales, la venta al por menor, la sanidad, etc…

Otro de los cambios más evidentes consiste en que actualmente las principales corporaciones transnacionales, que antes pertenecían principalmente a los sectores energético y financiero, ahora tienen un fuerte componente tecnológico, las GAFA, un acrónimo para hacer referencia a las cuatro grandes compañías tecnológicas: Google, Amazon, Facebook y Apple.

Otra de los cambios significativos que han sido propiciados por las nuevas tecnologías es la llamada economía colaborativa al que están asociadas empresas como BlaBlaCar, Airbnb, …

Otro cambio evidente consiste en que ahora mismo hay una economía de los datos. Los datos se han convertido en materia prima, capaz de crear valor, fuente de innovación y servicios nuevos. Para una panorámica de está economía de los datos puede verse la publicación Economía de los Datos. Riqueza 4.0.

Se habla incluso de que estamos inmersos en una cuarta revolución industrial. El concepto de cuarta revolución industrial fue acuñado por Klaus Schwab fundador del Foro Económico Mundial en el contexto de la edición del Foro Económico Mundial 2016 y una de sus características es la utilización de la IA/ML/DL para la automatización de tareas que antes sólo estaban al alcance de los humanos. Una de las consecuencias más directas de la automatización será el desplazamiento de empleos, no sólo manuales, por las maquinas/algoritmos.

Desde el punto de vista de la ciencia, la actual abundancia de datos, va a tener implicaciones directas:

  • “De la misma forma que el telescopio y el microscopio permitieron ver el espacio y las células, las nuevas técnicas de recopilación y análisis de datos ayudarán a ver el sentido de nuestro mundo de una forma que apenas intuimos”.

  • “el cambio cuantitativo no es lo único importante, es el cualitativo: una película es diferente de una pintura, también cuando trabajas con muchos datos se pueden hacer otras cosas; es decir, al cambiar la cantidad cambiamos la esencia”.

Ha surgido, incluso, una nuevo término: el dataísmo. Para un “dataista”, en un mundo con cada vez mayor complejidad, confiar en los datos puede reducir los sesgos cognitivos y descubrir patrones de comportamiento. Según el filósofo y ensayista surcoreano Byung-Chul Han, “el big data” debe liberar el conocimiento de la subjetividad. El término dataismo fue popularizado en el libro Homo Deus de Harari. El “dataismo” está en cierto modo relacionado con la idea, quizá un poco exagerada, de que está surgiendo un cuarto paradigma científico basado en el uso intensivo de datos. Está idea se atribuye a Jim Gray, ganador del premio Turing. Gray afirma que “todo lo relacionado con la ciencia está cambiando debido al impacto de la tecnología de la información y el diluvio de datos” y que se está conformando un cuarto paradigma científico tras los tres primeros (empírico, teórico, computacional). Esta ideas se desarrollan en The Fourth Paradigm: Data-intensive Scientific Discovery. Una traducción al castellano puede encontrarse aquí.

Sin embargo, hay que recordar, como se hace en este post de Jeff leek, que un resultado exitoso de un análisis de datos puede ser que los datos no permiten resolver la pregunta. Esta misma idea subyace en este tweet:


¿Afectará todo esto a la Economía/Econometría?

Todos vosotros sabéis que la Economía es una de las ciencias sociales en la que más se utiliza la Estadística; de hecho la Econometría es precisamente eso, una rama de la Economía que utiliza métodos estadísticos en el estudio de los fenómenos económicos.

La respuesta a la pregunta anterior es que sí, no sé cuando ni como, pero es evidente que la disponibilidad de nuevos datos, y el auge de los métodos estadísticos asociados al ML/DL, tendrán que ir incorporándose poco a poco a nuestra ciencia. Abajo algunas referencias sobre ello:



5. Investigación reproducible y software libre

Cada vez más se oye hablar de la Investigación Reproducible (IR) o Reproducible Research (RR) en inglés. Creo y espero que en poco tiempo se convierta en el estándar.

Según la Wikipedia española,

La reproducibilidad es la capacidad de una prueba o experimento de ser reproducido o replicado por otros, en particular, por la comunidad científica. La reproducibilidad es uno de los pilares del método científico, siendo la falsabilidad el otro. …

… en muchas disciplinas, sobre todo en aquellas que implican el uso de estadística y procesos computacionales, se entiende que un estudio es reproducible si es posible recrear exactamente todos los resultados a partir de los datos originales y el código informático empleado para los análisis.

En este libro señalan que la reproducibildad está ligada íntimamente al método científico como ilustra el hecho de que el lema de la Royal Society una de las sociedades científicas más antiguas del mundo es “Nullius in verba” que quiere decir más o menos “no creas en la palabra de nadie”. En el contexto científico quiere decir que las afirmaciones o descubrimientos científicos deben ser probados mediante el método científico.

A menudo se habla de la existencia de una crisis de reproducibilidad refiriéndose con ello a la idea de que los resultados de muchos de los experimentos científicos son difíciles o imposibles a replicar en investigaciones posteriores. Uno de los casos más sonados, asociados a esta idea, es el de Reinhart y Rogoff.

La idea de que puede existir una crisis de reproducibilidad, junto al hecho de que las nuevas tecnologías hacen cada vez más sencillo que los artículos e investigaciones científicas sean reproducibles, ha provocado cambios importantes en la política de asociaciones y revistas científicas, como la de la American Economic Association según la cual, sólo se publicarán artículos en los que:

“the data and code used in the analysis are clearly and precisely documented, and access to the data and code is clearly and precisely documented and is non-exclusive to the authors”.

Aquí puedes encontrar un listado de resultados de papers científicos en Psicología que han tenido que ser revisitados tras estudios posteriores.


Para que un análisis con datos sea reproducible, no sólo es necesario que los datos utilizados han de ser accesibles, sino que cómo mínimo debería:

  • proporcionar los datos originales (obviamente documentar las fuentes)

  • efectuar todo el proceso a través de código (scripts)

  • documentar el proceso de trabajo (por ejemplo el orden en que se ejecutaron los scripts)


Como veis, uno de los requisitos para hacer investigación reproducible es efectuar todo el proceso mediante scripts; es decir, hay que saber programar. Mira lo que dice Frank Harrell:

Can one be a good data analyst without being a half-good programmer? The short answer to that is, ‘No.’ The long answer to that is, ‘No.’ —Frank Harrell https://homerhanumat.github.io/r-notes/frames.html


Hacer una investigación completamente reproducible es COSTOSO; de hecho, hay cursos completos sobre el tema, por ejemplo este, y muchos proyectos que tratan de promoverla; por ejemplo este que pretende favorecer el uso de datos abiertos a través de R. Afortunadamente, cada vez hay más herramientas que facilitan hacer IR: Make, Git, Docker, Pandoc, Knitr, markdown …

Hacer una investigación (completamente) reproducible no siempre es posible; OK, PERO al menos acercarse … un poco. Nosotros, en el curso, haremos análisis con datos e intentaremos que estos sean reproducibles. En el entorno R cada vez es más fácil acercarse al ideal de la IR. Para ello en el curso haremos siempre nuestros análisis con scripts de R. Concretamente utilizaremos RStudio para hacer análisis de datos, gestionando nuestros análisis a través de Rprojects y generaremos los informes y resultados del análisis con documentos Rmarkdown9. Estos documentos Rmarkdown o .Rmd son reproducibles. En breve veremos que significa esto y sus utilidades tanto para la investigación como para la docencia. En estas transparencias nos cuentan como R y su ecosistema facilitan el hacer investigación o análisis reproducibles.

La razón para hacer los análisis reproducibles no sólo es cumplir con los estándares científicos, que también, sino también hay un interés personal para el analista. Para entenderlo puedes ver el siguiente video de 1’44’’ que muestra una de las principales ventajas de la IR, y sino ya lo experimentareis cuando hagamos hecho el primer análisis y os diga que me he equivocado con los datos, que os había dado la versión antigua de los datos. Os vais a reír si no habéis hecho vuestro análisis reproducible.

En palabras de @TiffanyTimbers:

Nothing like doing something manually 60+ times and making mistakes to reinforce the idea “automate all the things”.


Software libre

El software libre es de vital importancia en el desarrollo de la investigación reproducible. Piensa que por mucho que un investigador haga accesibles sus datos y su código, si utiliza un software privativo, en realidad su análisis no es reproducible, sólo lo será para aquellos que puedan pagar la licencia10.

De hecho, actualmente, al menos en el campo de la ciencia de datos, el software libre, o es ya mayoritario, o va camino de serlo. Es verdad que muchas empresas aún basan sus análisis de datos en programas como Excel, SPSS, Stata o SAS, pero la tendencia está cambiando y es de esperar que se acelere en un futuro próximo. Como ejemplo de esta idea puedes ver está publicación: Big Data y open source.

En este post se plantea que el “open source” puede ser clave para la competitividad en la UE. Para aquellos que creen que el software comercial da más garantías, pueden leerse este post.

Seguramente entre las empresas pequeñas y medianas Excel continúa siendo el software de referencia para sus análisis cuantitativos. Sí, Excel es un fantástico software, lo sé, pero no sirve para todo. Un ejemplo de esto aquí, o aquí. Este post explica porque Excel está obsoleto. En los comentarios al post le atizan un poco. Un hilo de Twitter con errores graves provocados por el mal uso11. En un tono más positivo, este post explica porque abandonar Excel y migrar a R.

En palabras de Hadley en esta entrevista

I think the tradeoff between Stata and R is: do you want a point-and-click interface, or do you want a programming interface? Point-and-click interfaces are great, because they lay out all of your options in front of you, and you don’t have to remember anything. You can navigate through the set of pre-supplied options. And that’s also it’s greatest weakness, because first of all, you are constrained into what the developer thought you should be able to do. And secondly, because your primary interaction is with a mouse, it’s very difficult to record what you did. And I think that’s a problem for science, because ideally you want to say how you actually got these results. And then simply do that reliably and have other people critique you on that. But it’s also really hard when you are learning, because when you have a problem, how do you communicate that problem to someone else? You basically have to say, “I clicked here, then I clicked here, then I clicked here, and I did this.” Or you make a screen cast, and it’s just clunky)

Este tweet incide también en alguno de los problemas de Excel. Tienes que ver la respuesta un poquito irónica de Dale Maschette, muy buena!! Para ello pincha en el tweet:


Aquí tenemos un problema concreto que ha generado Excel al ser usado en al análisis de datos: han tenido que renombrar los genes para evitar que Excel interprete sus nombres como fechas.


En este post, Bruno Rodrigues argumenta porqué no se puede usar Excel para hacer Ciencia de Datos. Por supuesto que actualmente hay muchas alternativas para hacer análisis de datos o visualizaciones sin usar un lenguaje de programación, por ejemplo aquí o aquí. Yo no digo nada, pero …


Please, don’t look this other one 😄 !!!



6. ¿Por qué R?

En el curso usaremos R y RStudio. En la actualidad, en el campo de la ciencia de datos, hay sólo 2 alternativas, Phyton o R. De hecho hay un intenso debate sobre cual es más adecuado. Hay muchas opiniones al respecto, pero yo he seleccionado esta y esta, aunque la verdad, tampoco es necesario elegir un sólo lenguaje, R y Phyton pueden colaborar.

Evidentemente mi opinión es que para iniciarse ciencia de datos R está varios pasos por delante de Phyton; si bien es verdad, que para hacer ML, y principalmente DL, Phyton puede ser más adecuado. En palabras de Hadley en esta entrevista

For R and Python, Python is first and foremost a programming language. And that has a lot of good features, but it tends to mean, that if you are going to do data science in Python, you have to first learn how to program in Python. Whereas I think you are going to get up and running faster with R, than with Python because there’s just a bunch more stuff built in and you don’t have to learn as many programming concepts. You can focus on being a great political scientist or whatever you do and learning enough R that you don’t have to become an expert programmer as well to get stuff done.

Este tweet12 ejemplifica un poco la rivalidad (con buen rollo) entre R y Phyton:

Aunque después de lo que dijo Elmo, yo creo que el debate está zanjado:

R se está convirtiendo en el software estadístico de referencia en la mayoría de los centros de investigación y universidades, y su uso se está extendiendo también dentro de la empresa privada. R es software libre, gratuito y está incorporando más rápidamente que otros programas las técnicas avanzadas de análisis de datos que se están desarrollando en los últimos años. Otro aspecto importante que convierte a R en una herramienta muy potente es que incorpora un lenguaje de programación sencillo y muy flexible, que permite tener un control total sobre el análisis que se está desarrollando

Creo que en la actualidad R es el mejor programa para iniciarse y hacer análisis de datos. Si no me acabas de creer, o quieres leer algo sobre la importancia y capacidades de R puedes hacerlo aquí o aquí, o aquí o más recientemente aquí.


R es cada vez más usado, no sólo en la universidad y la docencia, sino también en el mundo de la empresa, puedes verlo aquí o aquí. Una de las conferencias más importantes sobre el uso comercial de R es The Enterprise Applications of the R Language Conference (EARL).

Entre las empresas que usan R están: Google, Facebook, Twitter, Microsoft, IBM, Uber, Ford, Airbnb, American Express, Barclays Bank, Bank of America y muchas otras. Aquí o aquí puedes encontrar un listado más completo.

Una de las mayores ventajas de usar R es que puedes usar Rmarkdown y Shiny. Lo veremos, pero aquí tienes un post que explica sus ventajas. Un ejemplo de utilización es está aplicación de seguiminento del covid que ha implementado el departamento of Public Health de California.

Si te gustan los rankings de lenguajes de programación, aquí tienes uno, de enero de 2020, en el Phyton está en segundo lugar mientras que R está en el puesto 13. Esto es lo que que se dice de R:

In our first run of these rankings, R placed 17th. All these years later it jumps two spots from the last quarter’s edition up to #13. In the interim, it has ranked as high as 12th but mostly commonly is found in the 13-15 range. Given the language’s specialized focus, this is likely its effective ceiling, but it’s also an illustration of the remarkable popularity of a language whose usage is restricted for all intents and purposes to a single domain – those who work with and operate on data. R’s success is an example of the power of an academia-supported community to elevate a language beyond its expected threshold, and it is notable that the aforementioned growth of Python and its expansion into data analytics has not observably come at the expense of traction in R.

Mientras reescribo estas notas, julio de 2020, R ha subido al puesto 8, mientras que Phyton está en el tercero. El ranking más actual puedes verlo aquí.

¿Es complicado aprender R?

¿Aprender R es complicado? No, bueno … ya responderé a esto en clase. No mires el siguiente tweet:


Aunque la verdad, esta dificultad/rareza de R es cosa de otros tiempos. Con el tidyverse todo es más fácil y brillante. Como muestra el tweet de Chris Albon, un miembro destacado de la comunidad Phyton. Merece la pena echarle un ojo a algunas de las respuestas al tweet.


Algunos sitios a visitar

  • Rweekly. Cada semana envían un archivo con los mejores análisis hechos con R esa semana. Tienes que apuntarte aquí

  • Rbloggers. Un agregador de blogs relacionados con R.

  • R Views. Es un blog asociado a RStudio. Cada mes saca un post donde eligen los mejores 40 paquetes de ese mes; por ejemplo, aquí tienes el de julio de 2019.

  • swirl. swirl teaches you R programming and data science interactively, at your own pace, and right in the R console!




  1. Realmente Deep Blue, el ordenador que gano a Kasparov, no hacia uso de datos sino que usaba el calculo de probabilidades↩︎

  2. En realidad con aprender a programar un poco, todo lo que podamos, con R para poder ser más eficientes trabajando con datos ya tenemos bastante tarea en el curso↩︎

  3. Los dos últimos términos en castellano serían: Aprendizaje Máquina y Aprendizaje Profundo↩︎

  4. La palabra learning o aprendizaje induce a error porque no significa que se enseñe a los ordenadores a pensar como un ser humano, sino que básicamente consiste en aplicar algoritmos a datos masivos para inferir probabilidades.↩︎

  5. en ML/DL cuando hablan de atributos se refieren, más o menos, al termino regresores en Econometría↩︎

  6. Aunque el término Ciencia de datos se remonta, según la Wikipedia al menos a principios de los 70↩︎

  7. Una versión más amplia y fundamentada de estas ideas puede encontrarse aquí↩︎

  8. Tal como argumenta este post, la aparente dicotomía entre estadística y ciencia de datos se reducirá con el tiempo.↩︎

  9. En seguida explicaremos que son todas estas palabras que empiezan por r: R, RStudio, Rproject y Rmarkdown↩︎

  10. El software libre o código abierto también es una garantia de transparencia, libertades y derechos, como puede verse en el siguiente hilo de Twitter↩︎

  11. Aunque seguramente, estos errores por mal uso de Excel se vieron favorecidos, cuando no provocados, por el mal diseño de Excel como herramienta para manejar datos↩︎

  12. Algunas de las respuestas al tweet son muy buenas↩︎

LS0tCnRpdGxlOiAiVGVtYSAxOiBDaWVuY2lhIGRlIGRhdG9zIHkgbGEgZXJhIGRlbCBCaWcgRGF0YSIKYXV0aG9yOiAiUGVkcm8gSi4gUMOpcmV6IChwZWRyby5qLnBlcmV6QHV2LmVzKS4gVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIDxicj4gPGJyPiBXZWIgZGVsIGN1cnNvOiA8aHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjItMjMtd2ViLz4iCmRhdGU6ICJBZ29zdG8gZGUgMjAxOSAoYWN0dWFsaXphZG8gZWwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY3NzOiAhZXhwciBoZXJlOjpoZXJlKCJhc3NldHMiLCAic3R5bGVzX3BqcC5jc3MiKSAjLWh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU2NjgxODc5L2hvdy10by11c2UtaGVyZS1mb3ItcGF0aHMtdG8tY3NzLWJlZm9yZS1ib2R5LWFuZC1hZnRlci1ib2QKICAgIHRoZW1lOiBwYXBlcgogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzIAogICAgdG9jX2Zsb2F0OiAKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICBpbmNsdWRlczoKICAgICAgYWZ0ZXJfYm9keTogIWV4cHIgaGVyZTo6aGVyZSgiYXNzZXRzIiwgImZvb3Rlci5odG1sIikgCiAgICAgIGluX2hlYWRlcjogCiAgICAgICAgLSAhZXhwciBoZXJlOjpoZXJlKCJhc3NldHMiLCAiZ29vZ2xlLWFuYWx5dGljcy5odG1sIikgCiAgICAgICAgLSAhZXhwciBoZXJlOjpoZXJlKCJhc3NldHMiLCAiZmF2aWNvbi1zb2wuaHRtbCIpCiAgICAjY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDoga2FibGUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCiNiaWJsaW9ncmFwaHk6ICJgciBoZXJlOjpoZXJlKCdhc3NldHMnLCAnYmlibGlvLmJpYicpYCIgICMtIGpvb29kZXIuIHNpbmdsZSBxdW90ZXMgaHR0cHM6Ly9jb21tdW5pdHkucnN0dWRpby5jb20vdC91c2UtaGVyZS1oZXJlLWZ1bmN0aW9uLWluLXlhbWwtb3B0aW9uLzE4NjY3LzkKLS0tCgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwKICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwKICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICAKICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywKICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQoKIy0gcGFyYSBtZWpvcmFyIGxvcyBncsOhZmljb3MsIGJ1ZW5vIGVuIHJlYWxpZGFkIHBhcmEgcXVlIHNlIHZlYW4gaWd1YWwgZW4gZGlzdGludG9zIFNPCiMtIGh0dHBzOi8vd3d3Lmp1bXBpbmdyaXZlcnMuY29tL2Jsb2cvci1rbml0ci1tYXJrZG93bi1wbmctcGRmLWdyYXBoaWNzLwprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gInBuZyIsIGRldi5hcmdzID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKQpgYGAKCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSAjLSBodHRwczovL2dpdGh1Yi5jb20vdmlraW5nL3IteWFtbC9pc3N1ZXMvNDcgIChsbyBwdXNlIHggZWwgcGIgY29uIGVsIHdhcm5pbmcpIEVuIHJlYWxpZGFkIGNyZW8gcXVlIG1lam9yIHNlcsOtYSBwb25lcmxvIGVuIFJQcm9maWxlCmBgYAoKYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9CmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikKYGBgCgoKCi0tLS0tLS0tLS0tLS0tLS0tCgo8YnI+CgpFbCBvYmpldGl2byBwcmluY2lwYWwgZGVsIGN1cnNvIGVzIGFwcmVuZGVyIHVuIHBvY28sIHRvZG8gbG8gcXVlIHBvZGFtb3MsIHNvYnJlIHVuYSBudWV2YSBkaXNjaXBsaW5hOiBDaWVuY2lhIGRlIGRhdG9zIG8gRGF0YSBTY2llbmNlLiBFbiBjb25jcmV0bywgbm9zIGNlbnRyYXJlbW9zIGVuIGFwcmVuZGVyIGEgbWFuZWphciB5IGFuYWxpemFyIGRhdG9zIHV0aWxpemFuZG8gdW5hIGhlcnJhbWllbnRhIHByb2Zlc2lvbmFsIGNvbW8gUi4gIEVuIGVsIHRlbWEgMiBoYWJsYXJlbW9zIHkgdXRpbGl6YXJlbW9zIGludGVuc2l2YW1lbnRlIFIsIGRlIG1vbWVudG8gbm9zIHNvYnJhIGNvbiBzZcOxYWxhciBxdWUgUiBlcyB1biBwcm9ncmFtYSBpbmZvcm3DoXRpY28sIG3DoXMgYmllbiB1biBlbnRvcm5vLCBjb24gZWwgcXVlIGhhY2VyIGFuw6FsaXNpcyBkZSBkYXRvcyAobyBjaWVuY2lhIGRlIGRhdG9zKSwgcGVybyBSIHRhbWJpw6luIGVzIHVuIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24uIExvIHZlcmVtb3MhISAKCkFudGVzIGRlIGVtcGV6YXIgZWwgY3VlcnBvIHByaW5jaXBhbCBkZWwgY3Vyc28gdm95IGEgdHJhdGFyIGRlIGV4cGxpY2FyLCBlbiBlc3RlIHRlbWEgaW50cm9kdWN0b3JpbywgcXXDqSBzaWduaWZpY2FuIHTDqXJtaW5vcyBxdWUgdG9kb3MgaGFiw6lpcyBvw61kbyBjb21vOiBCaWcgRGF0YSwgSW50ZWxpZ2VuY2lhIEFydGlmaWNpYWwgKElBKSwgTWFjaGluZSBMZWFybmluZyAoTUwpLCBhbGdvcml0bW9zLCByZWRlcyBuZXVyb25hbGVzLCBldGMuLi4gZXRjLi4uIFB1ZmYhISEgTXVjaGFzIGNvc2FzLCBwZXJvIC4uLiBwYXNvIGEgcGFzby4KCgojIyAxLiDCv1F1w6kgZXMgZXN0byBkZSBsYSBlcmEgZGVsIEJpZyBEYXRhPwoKUHVlcyBubyBvcyB2b3kgYSBlbmdhw7FhciwgbGEgcHJpbmNpcGFsIHJhesOzbiBkZSBsYSBwcmVzZW5jaWEgZGVsIHTDqXJtaW5vICJCaWcgRGF0YSIgZW4gZWwgdMOtdHVsbyBkZWwgY3Vyc28gZXMgcXVlIG1lIHBhcmVjw61hIHF1ZSBjb21vIGVsIHTDrXR1bG8gY29taWVuemEgY29uICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIC4uLiIsIGVzIHBvc2libGUgcXVlIG5hZGllIHNlIGFwdW50YXNlIGFsIGN1cnNvLCBhc8OtIHF1ZSBoYWLDrWEgcXVlIGHDsWFkaXIgYWwgdMOtdHVsbyB1biB0w6lybWlubyBkZSBtb2RhIHkgdW4gcG9jbyBtaXN0ZXJpb3NvLiDCv0VzdHJhdGVnaWEgZGUgbWFya2V0aW5nPyBVbiBwb2NvIHPDrSwgcGVybyBlbiByZWFsaWRhZCB0b2RvcyBsb3MgY3Vyc29zIGRlIENpZW5jaWEgZGUgRGF0b3MgcXVlIGVzdMOhbiBhcGFyZWNpZW5kbyBlbiBlbCBtdW5kbywgc2VndXJhbWVudGUgbm8gaGFicsOtYW4gYXBhcmVjaWRvIHNpIG5vIGVzdHV2acOpc2Vtb3MgZW4gbGEgImVyYSBkZWwgQmlnIERhdGEiLiBFbiBlbCBjdXJzbyBubyB1c2FyZW1vcyB0w6ljbmljYXMgZGUgQmlnIERhdGEgcGVybyBzw60gaGFibGFyZW1vcyBhbGdvIGRlIGVsbGFzLCBwcmluY2lwYWxtZW50ZSBlbiBlbCB0ZW1hIDQuCgpMb3MgdGllbXBvcyBlc3TDoW4gY2FtYmlhbmRvIChbVGhlIFRpbWVzIFRoZXkgQXJlIEEgQ2hhbmdpbiddKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9LWU3YjA5TDRqWTgpKSBkZWPDrWEgQm9iIER5bGFuIGVuIGVsIDY0LiBRdWl6w6FzIGxvcyB0aWVtcG9zIHNpZW1wcmUgaGFuIGVzdGFkbyBjYW1iaWFuZG8geSBzaWVtcHJlIGNhbWJpYXLDoW4sIHBlcm8gYWhvcmEgbWlzbW8gbGEgbWF5b3LDrWEgZGUgbm9zb3Ryb3MgdGVuZW1vcyBsYSBzZW5zYWNpw7NuIGRlIHF1ZSB0b2RvIHZhIG11eSBkZXByaXNhLiBFbiBtaSBvcGluacOzbiBsbyBxdWUgZXN0w6EgZGV0csOhcyBkZSBlc3RlIGNhbWJpbyBhY2VsZXJhZG8gZGVsIG11bmRvIGVuIG11Y2hvcyBhc3BlY3RvcyB0aWVuZSBxdWUgdmVyIGNvbiBsYSB0ZWNub2xvZ8OtYSwgZnVuZGFtZW50YWxtZW50ZSBjb24gbG9zIG9yZGVuYWRvcmVzIHkgbGFzIHJlZGVzIHF1ZSB0cmFuc21pdGVuIGNhbnRpZGFkZXMgaW5nZW50ZXMgZGUgZGF0b3MuCgoKUHVlZGUgcXVlIG5hZGEgaWx1c3RyZSBtw6FzIGVzdG9zIGNhbWJpb3MgcXVlIGxvIHF1w6kgaGUgaGVjaG8geW8gcGFyYSBjb250aW51YXIgZXN0ZSByYXpvbmFtaWVudG86IGVuIGx1Z2FyIGRlIGJ1c2NhciB1biBsaWJybyBoZSBidXNjYWRvIGVuIEdvb2dsZSAibGEgZXJhIGRlbCBCaWcgRGF0YSIuIEVuIGVzdG9zIMO6bHRpbW9zIGHDsW9zIGhlIGxlw61kbyBiYXN0YW50ZSBzb2JyZSBlbCB0ZW1hLCBwZXJvIHBhcmEgZW1wZXphciBhIHBlbnNhciBtZSBoZSBpZG8gYSBHb29nbGUgeSBoZSBidXNjYWRvIGVsIHTDqXJtaW5vLiBFbCB0ZXJjZXIgcmVzdWx0YWRvIG1lIGhhIGxsZXZhZG8gYSBsYSBXaWtpcGVkaWEgKG90cm8gZGUgbG9zIG1pbGFncm9zIGRpc3J1cHRpdm9zIHF1ZSBoZW1vcyB2aXZpZG8gZW4gbGFzIGRvcyDDumx0aW1hcyBkw6ljYWRhcykuIElndWFsIHF1ZSBoZSBoZWNobyB5byBwYXJhIGluZm9ybWFybWUvZG9jdW1lbnRhcm1lLCB0b2RvcyBsb3MgZMOtYXMgdXRpbGl6YW1vcyBzb2Z0d2FyZSwgYXBsaWNhY2lvbmVzIHBhcmEgZ2VzdGlvbmFyIGxhIGFnZW5kYSwgZXNjdWNoYXIgcmFkaW8sIGNvbXByYXIsIGNvbXVuaWNhcm5vcyBldGMgLi4uIExhIHRlY25vbG9nw61hIGVzdMOhIHByZXNlbnRlIGVuIHRvZG9zIGxvcyBhc3BlY3RvcyBkZSBudWVzdHJhIHZpZGEgcG9ycXVlIGxsZXZhbW9zIHVuIG9yZGVuYWRvciwgZWwgdGVsw6lmb25vIG3Ds3ZpbCwgZW4gZWwgYm9sc2lsbG8sIHkgY29uIMOpbCBwb2RlbW9zIGNvbXVuaWNhcm5vcyB5IHJlY2liaXIgeSB0cmFuc21pdGlyIGluZm9ybWFjacOzbiBhIHRyYXbDqXMgZGUgbGEgcmVkZXMuIEVzdG8gZXMgbG8gcXVlIGhhIGNhbWJpYWRvIGVsIG11bmRvIHkgc2VndWlyw6EgY2FtYmnDoW5kb2xvIHkgYWZlY3RhcsOhIGEgdG9kYXMgbGFzIGVzZmVyYXMgZGUgbnVlc3RyYSB2aWRhLCBlc3Blcm8gcXVlIHBhcmEgYmllbiAoc2VndXJvISEpLiBQZXJvIGNsYXJvLCBlbiBlbCBjdXJzbyBubyB2YW1vcyBhIGhhYmxhciBkZSB0b2RvIGVzdG8sIHNvbG8gZGUgdHJhc2ZvbmRvLCBzaW5vIHF1ZSBub3MgY2VudHJhcmVtb3MgZW4gbG9zIGRhdG9zLCBlbiBjb21vIHRyYXRhciwgbWFuZWphciB5IG9idGVuZXIgaW5mb3JtYWNpw7NuIGRlIGxhcyBncmFuZGVzIGNhbnRpZGFkZXMgZGUgZGF0b3MgcXVlIGNvbnN1bWltb3MgeSBnZW5lcmFtb3MgY29uc3RhbnRlbWVudGU7IGFzw60gcXVlLCBkZWplbW9zIGxhcyBwb3NpYmxlcyBpbXBsaWNhY2lvbmVzIHNvY2lhbGVzLCBwb2zDrXRpY2FzLCBmaWxvc8OzZmljYXMgcGFyYSBvdHJvcyBjdXJzb3MgeSBiYWplbW9zIGEgY29zYXMgbcOhcyBjb25jcmV0YXMuCgoKIyMjIMK/UXXDqSBzaWduaWZpY2EsIHF1w6kgZXMgQmlnIERhdGE/CgpQdWVzIGVzIHVuIHTDqXJtaW5vIHBvbGlzw6ltaWNvLCB0aWVuZSBkaXN0aW50b3Mgc2lnbmlmaWNhZG9zLiBMdWVnbyBzZXLDqSBtw6FzIHByZWNpc28geSByaWd1cm9zbywgcGVybyBkZSBtb21lbnRvIHBvZGVtb3MgcGVuc2FyIHF1ZSBCaWcgRGF0YSBzaWduaWZpY2EgcXVlIHRlbmVtb3MgbXV1dXV1dWNob3MgZGF0b3MsIG11Y2hvcy4gRXN0YSBkaXNwb25pYmlsaWRhZCBkZSBkYXRvcyBlcyB1bm8gZGUgbG9zIHByaW5jaXBhbGVzIGZhY3RvcmVzIHF1ZSBleHBsaWNhbiBwb3JxdcOpIGVsIGRlc2Fycm9sbG8gdMOpY25pY28gc2UgaGEgYWNlbGVyYWRvIGVuIGxvcyDDumx0aW1vcyB0aWVtcG9zLiAKCkxvIHF1ZSBoYSBwYXNhZG8gZXMgcXVlLCBlbCBoZWNobyBkZSBxdWUgbG9zIGNpZW50w61maWNvcyBkaXNwb25nYW4gYWhvcmEgZGUgbXVjaG9zIGRhdG9zIGhhIGRhZG8gdW4gZnVlcnRlIGltcHVsc28gYSB1biBjYW1wbyBkZSBsYSBJbnRlbGlnZW5jaWEgQXJ0aWZpY2lhbCAoY29uY3JldGFtZW50ZSBlbCBjYW1wbyBkZWwgTWFjaGluZSBMZWFybmluZy9EZWVwIExlYXJuaW5nKSBxdWUgaGEgaGVjaG8gcXVlIGxhcyBtw6FxdWluYXMsIGxvcyBvcmRlbmFkb3JlcywgbG9zIHJvYm90cywgcHVlZGFuIGhhY2VyIGNvc2FzIHF1ZSBhbnRlcyBlcmFuIGluaW1hZ2luYWJsZXMsIGNvbW8gcG9yIGVqZW1wbG8gcXVlIEFsZXhhIG5vcyBlbnRpZW5kYSwgcXVlIGhheWEgY29jaGVzIGF1dMOzbm9tb3MgcXVlIGNvbmR1emNhbiBtZWpvciBxdWUgbG9zIGh1bWFub3MsIHF1ZSB1biBvcmRlbmFkb3IgZ2FuZSBhbCBjYW1wZcOzbiBtdW5kaWFsIGRlIGFqZWRyZXogKGVzdG8gcGFzbyB5YSBoYWNlIG11Y2hvIHRpZW1wbywgZW4gMTk5NiwgYW50ZXMgZGUgbGEgZXJhIGRlbCBCaWcgZGF0YSBeW1JlYWxtZW50ZSBbRGVlcCBCbHVlXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9EZWVwX0JsdWVfKGNvbXB1dGFkb3JhKSksIGVsIG9yZGVuYWRvciBxdWUgZ2FubyBhIEthc3Bhcm92LCBubyBoYWNpYSB1c28gZGUgZGF0b3Mgc2lubyBxdWUgdXNhYmEgZWwgY2FsY3VsbyBkZSBwcm9iYWJpbGlkYWRlc10pLiAKCkVuIGxvcyBtZWRpb3MsIGVuIGxhIHRlbGUsIHNlIGhhYmxhLCBhcGFyZWNlIGVsIHTDqXJtaW5vICJsYSBlcmEgZGVsIEJpZyBkYXRhIiBzaWduaWZpY2FuZG8gbcOhcyBvIG1lbm9zIGxvIHF1ZSBvcyBoZSBjb250YWRvLCBxdWUgbGEgImFidW5kYW5jaWEgZGUgZGF0b3MiIGVzdMOhIGltcHVsc2FuZG8gZnVlcnRlbWVudGUgZWwgZGVzYXJyb2xsbyB0ZWNub2zDs2dpY28sIGRlIGZvcm1hIHF1ZSBhaG9yYSB0ZW5lbW9zIGFjY2VzbyBhIGFwbGljYWNpb25lcyBxdWUgaGFzdGEgaGFjZSBiaWVuIHBvY28gcGFyZWPDrWFuIGNpZW5jaWEgZmljY2nDs24uIAoKRXN0ZSBhY2VsZXJhZG8gY2FtYmlvIHTDqWNuaWNvIHkgc3VzIGFwbGljYWNpb25lcywgdmEgYSB0ZW5lciB5IGVzdMOhIHRlbmllbmRvIGlubnVtZXJhYmxlcyBlZmVjdG9zIGVuIHRvZG9zIGxvcyDDoW1iaXRvcyBkZSBudWVzdHJhIHZpZGEgeSB0YW1iacOpbiBlbiBlbCBkZSBsYXMgZW1wcmVzYXMgZSBpbmR1c3RyaWFzLiBNdWNoYXMgaW5kdXN0cmlhcywgY29tbyBsYSBkZWwgdHJhbnNwb3J0ZSB2YW4gYSB2ZXIgY29tbyBlbCBlc2NlbmFyaW8gY2FtYmlhIHksIG11eSBwb3NpYmxlbWVudGUsIGxhcyBxdWUgbm8gc2VwYW4gZW50ZW5kZXIgeSBhcHJvdmVjaGFyIGxvcyBudWV2b3MgcmV0b3MgdGVjbm9sw7NnaWNvcyBwb3NpYmxlbWVudGUgYWNhYmVuIGRlc3BhcmVjaWVuZG87IGV2aWRlbnRlbWVudGUgZXN0byBnZW5lcmEsIHlhIHNlYSByZWFsIG8gbm8sIHVuYSB1cmdlbmNpYSBlbiBsYXMgZW1wcmVzYXMgcG9yIGludGVudGFyIG5vIHF1ZWRhcnNlIGZ1ZXJhIGRlIGVzdGUgY2FtYmlvIGFjZWxlcmFkbyB5IGVzdG8sIGVuIHByaW5jaXBpbywgZ2VuZXJhIG1heW9yIGRlbWFuZGEgZGUgcHJvZmVzaW9uYWxlcyBxdWUgc2VwYW4gZGUgdGVjbm9sb2fDrWEgeSBkZSBkYXRvcy4gQmllbiwgY3JlbyBxdWUgeWEgdGVuZW1vcyB1biBwb2NvIG3DoXMgY2xhcm8gcXVlIHNpZ25pZmljYSBlc3RvIGRlICJsYSBlcmEgZGVsIEJpZyBEYXRhIi4KCkVsIHTDqXJtaW5vIEJpZyBEYXRhIGVzIHJlbGF0aXZhbWVudGUgbnVldm8sIHkgZW4gY2FzdGVsbGFubyBzZSBzdWVsZSB0cmFkdWNpciBjb21vICJEYXRvcyBtYXNpdm9zIiwgYXVucXVlIGFob3JhIG1pc21vIGVuIGxhIHdpa2lwZWRpYSBwb25lICJNYWNyb2RhdG9zIiB5IFthcXXDrV0oaHR0cHM6Ly93d3cuZnVuZGV1LmVzL3JlY29tZW5kYWNpb24vbWFjcm9kYXRvc2FsdGVybmF0aXZhLWFiaWctZGF0YS0xNTgyLykgcmVjb21pZW5kYW4gZWwgdXNvIGRlbCB0w6lybWlubyAgTWFjcm9kYXRvcy4gQSBtaSBwZXJzb25hbG1lbnRlIG5vIG1lIGFjYWJhIGRlIGd1c3RhciBlc3RlIHTDqXJtaW5vLCBwZXJvIHF1aXrDoXMgc2VhIHBvciBlbCBoZWNobyBkZSBxdWUgdGVuZ28gZm9ybWFjacOzbiBkZSBlY29ub21pc3RhLCB5IGVsIHTDqXJtaW5vIG1hY3JvZGF0b3MgbWUgcmVjdWVyZGEgYSBsb3MgZGF0b3MgbWFjcm9lY29uw7NtaWNvcy4gRW4gY3VhbHF1aWVyIGNhc28sIGVsIHTDqXJtaW5vIHVzYWRvIGhhYml0dWFsbWVudGUgZXMgZWwgaW5nbMOpczogQmlnIERhdGEuCgpFbCB0w6lybWlubyB0aWVuZSBtYXRpY2VzLCB5IHZhcmlhbnRlcywgcGVybyBwYXJhIG1pLCBsYSBjYXJhY3RlcsOtc3RpY2EgZGVmaW5pdG9yaWEgZGUgZGF0b3MgQmlnIGVzIGVsIGhlY2hvIGRlIHF1ZSBlc3RvcyBkYXRvcyB0ZW5nYW4gdGFsIHZvbHVtZW4gKG8gY29tcGxlamlkYWQpIHF1ZSBubyAicXVlcGFuIiwgcXVlIG5vIHB1ZWRhbiAibWFuZWphcnNlIiBlbiB1biBvcmRlbmFkb3IsIGVuIHJlYWxpZGFkIHF1ZSBubyBwdWVkYW4gdHJhdGFyc2UgY29uIGxhcyBhcGxpY2FjaW9uZXMgaW5mb3Jtw6F0aWNhcyBoYWJpdHVhbGVzLiBUYWwgeSBjb21vIGZpZ3VyYSBlbiBsYSBXaWtpcGVkaWE6ICJlcyB1biB0w6lybWlubyBxdWUgaGFjZSByZWZlcmVuY2lhIGFsIGNvbmNlcHRvIHJlbGF0aXZvIGEgY29uanVudG9zIGRlIGRhdG9zIHRhbiBncmFuZGVzIHkgY29tcGxlam9zIGNvbW8gcGFyYSBxdWUgaGFnYW4gZmFsdGEgYXBsaWNhY2lvbmVzIGluZm9ybcOhdGljYXMgbm8gdHJhZGljaW9uYWxlcyBkZSBwcm9jZXNhbWllbnRvIGRlIGRhdG9zIHBhcmEgdHJhdGFybG9zIGFkZWN1YWRhbWVudGUiCgpMdWVnbyBoYXkgImRlZmluaWNpb25lcyIgbcOhcyBlbGFib3JhZGFzIGNvbW8gdW5hIGZhbW9zYSwgZGUgMjAwMSBlbiBsYSBxdWUgc2UgZGVzdGFjYWJhbiB0cmVzIGFzcGVjdG9zIGVuIGVsIEJpZyBEYXRhLCAqKmxhcyB0cmVzICJ2J3MiKiogZGVsIEJpZyBEYXRhOiAqKnZvbHVtZW4sIHZlbG9jaWRhZCB5IHZhcmllZGFkKio6IGRlc3B1w6lzIHNlIGhhbiBhw7FhZGlkbyAyIHV2ZXMgbcOhcyB5IHNlIGhhYmxhIGRlIDUgdXZlcyBvICA1IGFzcGVjdG9zIHJlbGFjaW9uYWRvcyBjb24gZWwgQmlnIERhdGE6ICoqdioqb2x1bWVuIGRlIGRhdG9zLCAqKnYqKmVsb2NpZGFkIGNvbiBsYSBxdWUgc2Ugb2J0aWVuZW4geSB0cmFuc2ZpZXJlbiwgKip2KiphcmllZGFkIGRlIHRpcG9zIGRlIGRhdG9zICh0ZXh0bywgaW3DoWdlbmVzIGV0Yy4uLiksICoqdioqZXJhY2lkYWQgZGUgbGFzIGZ1ZW50ZXMsIHkgdW4gcXVpbnRvIGFzcGVjdG8gIGEgY29uc2lkZXJhciBlcyBlbCAqKnYqKmFsb3IgcXVlIGFwb3J0YW4gbG9zIGRhdG9zLiBFbiBbZXN0ZSB0ZXh0b10oaHR0cHM6Ly93d3cuYmJ2YS5jb20vZXMvbGFzLWNpbmNvLXV2ZXMtZGVsLWJpZy1kYXRhLykgY29ydGl0byBsbyBleHBsaWNhbiBiaWVuLgoKU2UgcHVlZGVuIG1pcmFyIG3DoXMgYXNwZWN0b3MgZGVsIEJpZyBkYXRhLCBwZXJvIGxvIGZ1bmRhbWVudGFsIGVzIHF1ZSBzb24gZGF0b3MsIHF1ZSB5YSBzZWEgcG9yIHN1IHZvbHVtZW4sIHBvciBzdSB2YXJpZWRhZCwgbyBwb3Igc3UgdmVsb2NpZGFkIG5vIHNvbiBmw6FjaWxlcyBkZSBhbG1hY2VuYXIvdHJhdGFyL21hbmVqYXIgY29uIGxhcyB0w6ljbmljYXMgeSBvcmRlbmFkb3JlcyBoYWJpdHVhbGVzLiBFc3RlIGhlY2hvIGRhIGx1Z2FyIGEgcXVlIGVsIG1lcmNhZG8sIGxhcyBlbXByZXNhcywgbmVjZXNpdGVuIHBlcnNvbmFzIHF1ZSBzZWFuIGNhcGFjZXMgZGUgZ2VzdGlvbmFyIGxhIGluZnJhZXN0cnVjdHVyYSBkZSBoYXJkd2FyZSB5IHNvZnR3YXJlIHBhcmEgbWFuZWphciBkYXRvcyBtYXNpdm9zLCBlc3RhcyBwZXJzb25hcyBnZW5lcmFsbWVudGUgc29uIGluZ2VuaWVyb3MgZGUgc29mdHdhcmUsIG8gaW5mb3Jtw6F0aWNvcy4gQWRlbcOhcyBkZSBhbG1hY2VuYXIgeSBkaXN0cmlidWlyIGxvcyBkYXRvcyBsYXMgZW1wcmVzYXMgdGFtYmnDqW4gbmVjZXNpdGFuIHBlcnNvbmFzIHF1ZSBzZWFuIGNhcGFjZXMgZGUgYW5hbGl6YXIgeSBvYnRlbmVyIGluZm9ybWFjacOzbiB5IHZhbG9yIGRlIGVzb3MgZGF0b3MsIGVsIHBlcmZpbCBkZSBlc3RhcyBwZXJzb25hcyBlcyBtZW5vcyB1bmlmb3JtZSwgcHVlZGUgcXVlIHNlYW4gaW5nZW5pZXJvcywgbWF0ZW3DoXRpY29zLCBlc3RhZMOtc3RpY29zLCBlY29ub21pc3RhcyAod2h5IG5vdD8pLCBiacOzbG9nb3MsIHPDrSBlbiBCaW9sb2fDrWEgY29uIGVsIGVzdHVkaW8gZGVsIGdlbm9tYSB5IGxvcyBnZW5lcyBlcyB1bm8gZGUgbG9zIGNhbXBvcyBkb25kZSBtw6FzIHNlIGVzdMOhIGhhY2llbmRvIENpZW5jaWEgZGUgRGF0b3MuCgpFbiBjdWFscXVpZXIgY2FzbywgY29tbyBlcyB1biDDoXJlYSBvIGNhbXBvIGRlIGVzdHVkaW8gcmVsYXRpdmFtZW50ZSBudWV2YSB5IGFkZW3DoXMgZW4gY29uc3RhbnRlIGV2b2x1Y2nDs24sIGxvcyB0w6lybWlub3MgeSBjb25jZXB0b3MgYcO6biBlc3TDoW4gZGVmaW5pw6luZG9zZSB5IGV2b2x1Y2lvbmFuZG87IHBvciBlamVtcGxvLCB5YSBzZSBlbXBpZXphIGEgaGFibGFyIGRlbCBbInNtYXJ0IGRhdGEiXShodHRwczovL3JldGluYS5lbHBhaXMuY29tL3JldGluYS8yMDE4LzAxLzEyL3RlbmRlbmNpYXMvMTUxNTc2MzQyMV83ODA1NzkuaHRtbCkuIEVuIGVzdGUgYXJ0w61jdWxvIHNlw7FhbGFuIHF1ZTogCgo+IkVsIHTDqXJtaW5vIGJpZyBkYXRhIC4uLiBoYWNlIHJlZmVyZW5jaWEgYSBjb25qdW50b3MgZGUgZGF0b3MgcXVlLCBkZWJpZG8gYSBzdSBncmFuIHZvbHVtZW4sIG5lY2VzaXRhbiBzaXN0ZW1hcyBlc3BlY2lhbGl6YWRvcyBkZSBhbG1hY2VuYWRvIHkgcHJvY2VzYWRvIHBhcmEgcG9kZXIgdHJhYmFqYXIgY29uIGVsbG9zIGRlIG1hbmVyYSBlZmljaWVudGUgLi4uLiBMYSBpbmZvcm1hY2nDs24gZXMgaW1wb3J0YW50ZSwgc8OtLCBwZXJvIGRlbWFzaWFkYSBwdWVkZSBsbGVnYXIgYSBzZXIgY29uZnVzYSB5IGhhc3RhIGNvbnRyYXByb2R1Y2VudGUgLi4uLiBBcXXDrSBlcyBkb25kZSBlbCBiaWcgZGF0YSBkYSB1biBwYXNvIGhhY2lhIGFkZWxhbnRlLCBlbCBzbWFydCBkYXRhLCBxdWUgc2UgZW5jYXJnYSBkZSBkZXRlY3RhciBzZcOxYWxlcyB5IHBhdHJvbmVzIHJlbGV2YW50ZXMgYSB0cmF2w6lzIGRlIGFsZ29yaXRtb3MgaW50ZWxpZ2VudGVzIi4gCgpFc3RvIGEgbcOtIG1lIHN1ZW5hIGFsIG9iamV0aXZvIGZ1bmRhbWVudGFsIGRlIGxhIENpZW5jaWEgZGUgRGF0b3MsIGV4dHJhZXIgaW5mb3JtYWNpw7NuIGEgcGFydGlyIGRlIGxvcyBkYXRvcyBkZSBmb3JtYSBxdWUgc2UgZ2VuZXJlIGNvbm9jaW1pZW50byB5L28gdmFsb3IuCgoKTXVjaGFzIHZlY2VzIHNpIGxlw6lpcyB1biBhcnRpY3VsbyByZWxhY2lvbmFkbyBjb24gImVsIEJpZyBEYXRhIiBhcGFyZWNlbiBwYWxhYnJhcyBleHRyYcOxYXM6IEtlcmFzLCBUZW5zb3JGbG93LCBBcGFjaGUsIEFwYWNoZVNwYXJrLCBNb25nbywgTW9uZ29EQiwgTWFyaWEsIENhc3NhbmRyYSwgIC4uLi4geSBtdWNow61zaW1hcyBtw6FzLiBZbyBjb25vemNvIGFsZ3VuYXMgdW4gcG9jbywgb3RyYXMgbWUgc3VlbmFuIHkgb3RyYXMgbWUgc3VlbmFuIGEgY2hpbm8uIMK/UXXDqSBzb24/IFB1ZXMgZW4gZ2VuZXJhbCBzb24gbm9tYnJlcyBkZSBhcGxpY2FjaW9uZXMgaW5mb3Jtw6F0aWNhcywgbyByZXBvc2l0b3Jpb3MgZGUgZGF0b3MsIG8gZW1wcmVzYXMsIG8gcGFxdWV0ZXMsIGZyYW1ld29ya3MsICAuLi4sIHF1ZSBzZSB1dGlsaXphbiBwYXJhIGFsbWFjZW5hci90cmF0YXIvbWFuZWphci9lc3RpbWFyIG1vZGVsb3MgY29uIGdyYW5kZXMgdm9sw7ptZW5lcyBkZSBkYXRvcy4gUG9yIGVqZW1wbG8gW0FwYWNoZV0oaHR0cHM6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvQXBhY2hlX1NvZnR3YXJlX0ZvdW5kYXRpb24pIGVzIHVuYSBmdW5kYWNpw7NuIGRlIHNvZnR3YXJlIGxpYnJlLCBxdWUgc2Ugb2N1cGEgZGUgaGFjZXIgcHJveWVjdG9zIHF1ZSBlbiBsYSBwcsOhY3RpY2EgcG9zaWJpbGl0YW4gaGFjZXIgQmlnIGRhdGEsIGltcGxlbWVudGFyIGxvcyBudWV2YXMgdMOpY25pY2FzLCBjb24gc29mdHdhcmUgeSBwbGF0YWZvcm1hcyBvcGVuIHNvdXJjZS4gQ29tbyBsYSBmdW5kYWNpw7NuIEFwYWNoZSB0aWVuZSBtdWNob3MgcHJveWVjdG9zIHkgInByb2R1Y3RvcyIsIHBvciBlc28gaGF5IEFwYWNoZVNwYXJrLCBDYXNzYW5kcmEsIEdlcm9uaW1vIGV0Yy4uLiAKCgpFc3RhIGluZnJhZXN0cnVjdHVyYSwgdGFudG8gZsOtc2ljYSAob3JkZW5hZG9yZXMsIHJlcG9zaXRvcmlvcyksIGNvbW8gZGUgc29mdHdhcmUvcHJvZ3JhbWFzIHF1ZSBzZSB1dGlsaXphbiBlbiBCaWcgRGF0YSBjYW1iaWFuIG11eSBkZXByaXNhLiBDb25zdGFudGVtZW50ZSBlc3TDoW4gc3VyZ2llbmRvIG51ZXZhcyBlbXByZXNhcywgbnVldm9zIG3DqXRvZG9zLCB1biBudWV2byBhbGdvcml0bW8sIHVuYSBudWV2YSBpbXBsZW1lbnRhY2nDs24gZGUgYWxnbyB5YSBleGlzdGVudGUsIGV0Yy4uLiAKCgpOb3MgYWNhYmEgZGUgcGFyZWNlciBvdHJhIHBhbGFicmEgaW1wb3J0YW50ZSBlbiBlc3RlIGNhbXBvIGRlIGNvbm9jaW1pZW50bywgbG9zICoqYWxnb3JpdG1vcyoqLCB5YSBoYWJsYXJlbW9zIGRlIGVsbG9zIHkgc3UgaW1wb3J0YW5jaWEgZW4gImxhIGVyYSBkZWwgQmlnIERhdGEiLgoKClF1aWVybyBsbGFtYXJvcyBsYSBhdGVuY2nDs24gc29icmUgdmFyaWFzIGlkZWFzIHF1ZSwgY29tbyBtdWNow61zaW1hcyBvdHJhcyBubyB0cmF0YXJlbW9zIGVuIGVsIGN1cnNvIF5bRW4gcmVhbGlkYWQgY29uIGFwcmVuZGVyIGEgcHJvZ3JhbWFyIHVuIHBvY28sIHRvZG8gbG8gcXVlIHBvZGFtb3MsIGNvbiBSIHBhcmEgcG9kZXIgc2VyIG3DoXMgZWZpY2llbnRlcyB0cmFiYWphbmRvIGNvbiBkYXRvcyB5YSB0ZW5lbW9zIGJhc3RhbnRlIHRhcmVhIGVuIGVsIGN1cnNvXSwgYWxndW5hcyAgZGUgZWxsYXMgcHJvdmllbmVuIGRlIFtlc3RlIGFydMOtY3Vsb10oaHR0cHM6Ly93d3cuaW5mb2JhZS5jb20vb3Bpbmlvbi8yMDE4LzA4LzIyL2xhLWNpZW5jaWEtZGUtbG9zLWRhdG9zLXktc3UtaW1wYWN0by1lbi1sYS1lY29ub21pYS1sYS1wb2xpdGljYS15LWxhLXNvY2llZGFkLyk6CgotIExvcyBkYXRvcyBob3kgc29uIG9tbmlwcmVzZW50ZXMgeSBhIG1lbnVkbyBhYnJ1bWFkb3Jlcy4gUHJvZHVjaW1vcywgb3JnYW5pemFtb3MgeSBjb25zdW1pbW9zIGRhdG9zIGRlIG1hbmVyYSBjYXNpIGNvbnN0YW50ZS4gRXN0YW1vcyByb2RlYWRvcyBkZSBpbmZvcm1hY2nDs24gcXVlIG5vIHBhcmEgZGUgYXVtZW50YXIuIFVuYSBkZSBsYXMgcHJpbmNpcGFsZXMgZnVlbnRlcyBkZSBkYXRvcyBzb24gbnVlc3RyYXMgYWNjaW9uZXMgZW4gbGEgcmVkIChjbGlja3MsIGxpa2VzLCByYXRpbmcsIHNoYXJlcywgZXRjLi4uICksIHBlcm8gdGFtYmnDqW4gaGF5IG11Y2hvcyBkYXRvcyBwcm92ZW5pZW50ZXMgZGUgc2Vuc29yZXMgZW4gbcOhcXVpbmFzIHkgcHJvY2Vzb3MsIHBpZW5zYSBwb3IgZWplbXBsbyBlbiBsYSBpbmZvcm1hY2nDs24gcXVlIGdlbmVyYSB1biBjb2NoZSBkZSBGb3JtdWxhIDEsIG8gdW4gc29uZGEgZXNwYWNpYWwsIG8gZWwgVkFSIHF1ZSBoYXkgZW4gZWwgZsO6dGJvbC4gQSBtb2RvIGRlIGVqZW1wbG8sIFtEYXRhIE5ldmVyIFNsZWVwcyA4LjAgZGUgRG9tb10oaHR0cHM6Ly93d3cuZG9tby5jb20vbGVhcm4vaW5mb2dyYXBoaWMvZGF0YS1uZXZlci1zbGVlcHMtOCkgaW5mb3Jtw7MgcXVlIGVuIGNhZGEgbWludXRvIGRlIDIwMjAgaHVibywgdXNhbmRvIGRhdG9zIHNvbGFtZW50ZSBkZSBsYSBsYSBwbGF0YWZvcm1hIFpvb20sIHVuIHByb21lZGlvIGRlIDIwOC4zMzMgcGVyc29uYXMgY29uZWN0YWRhcyBlbiB1bmEgcmV1bmnDs24gdmlydHVhbCB5IHNlIGNyZWFyb24gMzQ3LjIyMiBoaXN0b3JpYXMgZW4gSW5zdGFncmFtLgoKLSBEZSBsYSBtaXNtYSBmb3JtYSBxdWUgIEludGVybmV0IGNhbWJpw7MgcmFkaWNhbG1lbnRlIGVsIG11bmRvIGFsIGHDsWFkaXIgY29tdW5pY2FjacOzbiwgbG9zIGRhdG9zIG1hc2l2b3MgbW9kaWZpY2FyYW4gYXNwZWN0b3MgZnVuZGFtZW50YWxlcyBkZSBudWVzdHJhIHZpZGEgb3RvcmfDoW5kb2xlIHVuYSBkaW1lbnNpw7NuIGN1YW50aXRhdGl2YSBxdWUgbnVuY2EgaGFiw61hIHRlbmlkbyBhbnRlcywgcGllbnNhIHBvciBlamVtcGxvIGVuIGFwbGljYWNpb25lcyBtw6lkaWNhcyBvIGRlIG1vbml0b3JpemFjacOzbiBkZSBsYSBhY3RpdmlkYWQgZsOtc2ljYS4gQW50ZSB0YWwgdm9sdW1lbiBkZSBkYXRvcywgZWwgZGVzYWbDrW8gZXMgY29uc3RydWlyIGNvbm9jaW1pZW50byB1c2FuZG8gbG9zIGRhdG9zIG3DoXMgcmVsZXZhbnRlcyB5IGRpdmVyc29zLCBubyBzb2xvIHBhcmEgbm9zb3Ryb3MsIHNpbm8gcGFyYSBudWVzdHJhIHNvY2llZGFkIGVuIHN1IGNvbmp1bnRvLgoKCi0gSGFzdGEgaGFjZSBhbGd1bmFzIGTDqWNhZGFzIGxhIHJlY29waWxhY2nDs24gZGUgbGEgaW5mb3JtYWNpw7NuIGVzdGFiYSBtYXlvcm1lbnRlIGEgY2FyZ28gZGUgbG9zIEVzdGFkb3MgbmFjaW9uYWxlcywgcGVybywgYWhvcmEgbWlzbW8sIGdyYW4gcGFydGUgZGUgbG9zIGRhdG9zIGVzdMOhbiBlbiBtYW5vcyBkZSBlbXByZXNhcyBwcml2YWRhcyAoR29vZ2xlLCBGYWNlYm9vaywgQW1hem9uLCAuLi4gKS4gRXN0byB0aWVuZSB5IHB1ZWRlIHRlbmVyIGZ1ZXJ0ZXMgaW1wbGljYWNpb25lcyB5IGNvbnNlY3VlbmNpYXMuCgoKLSAgRWwgcG9zZWVyIGRhdG9zIHB1ZWRlIGRhciBwb2Rlci9iZW5lZmljaW8vdmVudGFqYXMgY29tcGV0aXRpdmFzIGEgcXVpZW4gbG9zIHBvc2VhLiBQb3IgZWplbXBsbywgc2Vnw7puIGxvcyBleHBlcnRvcywgZWwgbWVqb3IgdHJhZHVjdG9yIG9ubGluZSBubyBlcyBHb29nbGUgVHJhbnNsYXRvciBzaW5vIFtEZWVwTF0oaHR0cHM6Ly93d3cuZGVlcGwuY29tL2VzL3RyYW5zbGF0b3IpLiBMb3MgZG9zIHNlcnZpY2lvcyB1dGlsaXphbiBhbGdvcml0bW9zIGRlIGludGVsaWdlbmNpYSBhcnRpZmljaWFsLCBwZXJvIHBhcmVjZSBzZXIgcXVlIERlZXBMIHRpZW5lIG1lam9yZXMgZGF0b3MuIERlZXBMIHV0aWxpemEgbG9zIGRhdG9zIGRlbCBwcm95ZWN0byBMaW5ndWVlIHF1ZSBoYSBwZXJtaXRpZG8gY29uc3RydWlyIHVuYSBiYXNlIGRlIGRhdG9zIGVub3JtZS4gTG8gZXhwbGljYW4gW2FxdcOtXShodHRwczovL3d3dy54YXRha2EuY29tL3NlcnZpY2lvcy9kZWVwbC12cy1nb29nbGUtdHJhbnNsYXRlLXF1aWVuLWdhbmEtYmF0YWxsYS10cmFkdWN0b3Jlcy1vbmxpbmUpCgotIEVsIGVqZW1wbG8gYW50ZXJpb3IgaWx1c3RyYSBxdWUgbG8gcXVlIGhheSBkZXRyw6FzIGRlIGxvcyBhdmFuY2VzIG5vIHNvbiBsb3MgYWxnb3JpdG1vcyBvIGxhIElBL01ML0RMLCBzaW5vIGxvcyBkYXRvczogZWwgZ3JhbiB2b2x1bWVuIGRlIGRhdG9zIGVzIGxvIHF1ZSBoYSBoZWNobyBwb3NpYmxlIGVzdGEgw6lwb2NhIGRlIGF2YW5jZXMgdGVjbm9sw7NnaWNvcyBhY2VsZXJhZG9zOyBlbiBlc3RlIHNlbnRpZG8gc2Ugc3VlbGUgZGVjaXIgcXVlIFtsb3MgZGF0b3Mgc29uIGVsIG51ZXZvIHBldHJvbGVvXShodHRwczovL3d3dy5ldXJvcGVhbmRhdGFwb3J0YWwuZXUvZW4vaGlnaGxpZ2h0cy9vZGUtb3Blbi1kYXRhLWJlbmVmaXRzLW9wZW4tZGF0YS1jb21wYXJlZC1vaWwpLCBwZXJvIGEgZGlmZXJlbmNpYSBkZSBlc3RlLCBjdXlhcyByZXNlcnZhcyBwb2RlbW9zIGNvbnNpZGVyYXIgZmlqYXMsIGVsIHZvbHVtZW4gZGUgZGF0b3Mgbm8gaGFjZSBzaW5vIGNyZWNlciwgc29uIG3DoXMgZsOhY2lsZXMgZGUgdHJhbnNwb3J0YXIgeSBnZW5lcmFuIG3DoXMgdmFsb3IgcGFyYSBsYSBzb2NpZWRhZCBjdWFudGEgbcOhcyBnZW50ZSBsb3MgdXNhLgoKLSBPYnZpYW1lbnRlLCBsYSBncmFuIGRpc3BvbmliaWxpZGFkIGRlIGRhdG9zIHRpZW5lIHRhbWJpw6luIGFzcGVjdG9zIG3DoXMgb3NjdXJvcyBvIGNvbiBwb3RlbmNpYWxlcyBwZWxpZ3JvcywgY29tbyBwb3IgZWplbXBsbyBhc3BlY3RvcyBsZWdhbGVzIGVuIGxhIHNlZ3VyaWRhZCB5IFtwcml2YWNpZGFkXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXBUMTlWd0JBcUtBJmZlYXR1cmU9eW91dHUuYmUpLCBvIHNlc2dvcyBlbiBsb3MgZGF0b3MuIFlhIG5vIHPDs2xvIHF1ZSBsb3MgZ29iaWVybm9zIGNvcnRlbiBpbnRlcm5ldCBvIGVzcMOtZW4gYSBsb3MgY2l1ZGFkYW5vcywgY29tbyBwb3IgZWplbXBsbyBlbCBjYXNvIFNub3dkZW4gbyBlbCBwbGFuIGRlIGNyw6lkaXRvIHNvY2lhbCBjaGlubywgc2lubyBxdWUgZXN0w6EgZW1lcmdpZW5kbyB1biBbbWVyY2FkbyBkZSBlc3Bpb25hamUgZGlnaXRhbF0oaHR0cHM6Ly93d3cudmljZS5jb20vZW5fdXMvYXJ0aWNsZS9uZTg3OXovaS10cmFja2VkLXNvbWVvbmUtd2l0aC1saWNlbnNlLXBsYXRlLXJlYWRlcnMtZHJuKS4KCgpFbiBbZXN0ZSBwb3N0XShodHRwczovL3d3dy5mb3JiZXMuY29tL3NpdGVzL25laWxtYWxob3RyYS8yMDE5LzA3LzAxL21ha2luZy1zdXJlLWFpLWlzLXNvY2lhbGx5LXJlc3BvbnNpYmxlLyM2YTk2ZjE2YzY2MGMpIGhhYmxhbiBkZSBjw7NtbyBmYXZvcmVjZXIgcXVlIGxhcyBhcGxpY2FjaW9uZXMgc3VyZ2lkYXMgZGUgbGEgSUEgc2VhbiBzb2NpYWxtZW50ZSByZXNwb25zYWJsZXMgbyBxdWUgbG9zIGFsZ29yaXRtb3Mgbm8gYWNhYmVuIHJlcHJvZHVjaWVuZG8gbG9zIHNlc2dvcyBwcmVzZW50ZXMgZW4gbG9zIGRhdG9zLiBFbiBbZXN0YSBndcOtYSBwYXJhIGVsIGRpc2XDsW8gcmVzcG9uc2FibGUgZGUgc2lzdGVtYXMgZGUgSUFdKGh0dHBzOi8vd3d3LnR1cmluZy5hYy51ay9zaXRlcy9kZWZhdWx0L2ZpbGVzLzIwMTktMDYvdW5kZXJzdGFuZGluZ19hcnRpZmljaWFsX2ludGVsbGlnZW5jZV9ldGhpY3NfYW5kX3NhZmV0eS5wZGYpIGRlbCBBbGFuIFR1cmluZyBJbnN0aXR1dGUgZGVzYXJyb2xsYW4gZXN0w6FzIGlkZWFzLiAKCgotIEN1YW5kbyBzZSBkaXNwb25lIGRlIGRhdG9zIHNlbnNpYmxlcywgcG9yIGVqZW1wbG8gZGF0b3MgbcOpZGljb3MsIGFwYXJlY2UgZWwgZGlsZW1hIGVudHJlIHByaXZhY2lkYWQgZSBpbmZvcm1hY2nDs24gcXVlIHB1ZWRlIHNlciBiZW5lZmljaW9zYSBwYXJhIGxhIHNvY2llZGFkLiBTaWVtcHJlIHNlIHB1ZWRlIHRyYXRhciBkZSBhbm9uaW1pemFyIGxvcyBkYXRvcywgcGVybyBwYXJlY2Ugc2VyIHF1ZSBhIGxvcyBleHBlcnRvcyBsZXMgcmVzdWx0YSBubyBkZW1hc2lhZG8gY29tcGxpY2FkbyByZWN1cGVyYXIgbGEgaW5mb3JtYWNpw7NuIG9yaWdpbmFsOyBlcyAgZGVjaXIsIGEgdmVjZXMgZXMgcG9zaWJsZSBsYSBbcmVpZGVudGlmaWNhY2nDs25dKGh0dHBzOi8vd3d3LmRhdGFuYWx5dGljcy5jb20vMjAxOS8wOC8yNy9tYXMtc29icmUtbGEtYW5vbmltaWRhZC15LXJlaWRlbnRpZmljYWNpb24tZW4tZmljaGVyb3MtZGUtbWljcm9kYXRvcy8pIGRlIGZpY2hlcm9zIGFub25pbWl6YWRvcy4gTcOhcyBzb2JyZSBlc3RvIFthcXXDrV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1wVDE5VndCQXFLQSkgeSBbYXF1w61dKGh0dHBzOi8vaGlwZXJ0ZXh0dWFsLmNvbS8yMDE5LzA5L3ByaXZhY2lkYWQtZGlmZXJlbmNpYWwtZGF0b3M/dXRtX21lZGl1bT1mZWVkJnV0bV9zb3VyY2U9ZmVlZHByZXNzLm1lJnV0bV9jYW1wYWlnbj1GZWVkJTNBK2hpcGVydGV4dHVhbCkuCgotIENvbW8gZW4gb3RyYXMgZmFjZXRhcyBkZSBsYSB2aWRhLCBsYSBpbmZvcm1hY2nDs24geSB0cmFuc3BhcmVuY2lhIGVzIGNsYXZlIGEgbGEgaG9yYSBkZSByZWR1Y2lyIGxvcyBwb3NpYmxlcyByaWVzZ29zIGRlIGxhcyBhcGxpY2FjaW9uZXMgZGUgSUEuIEVzIGltcG9ydGFudGUgcXVlIGVsIGPDs2RpZ28gZnVlbnRlIGRlIGxhcyBhcGxpY2FjaW9uZXMgeSBhbGdvcml0bW9zIHNlYSBkZSBhY2Nlc28gbGlicmUuIENvbW8gZWplbXBsbyBbZXN0ZSBhcnTDrWN1bG9dKGh0dHBzOi8vd3d3LnB1YmxpY28uZXMvc29jaWVkYWQvdHJhbnNwYXJlbmNpYS1nb2JpZXJuby1uby1xdWllcmUtcHVibGljYXItZnVuY2lvbmFuLWFwbGljYWNpb25lcy1hbGdvcml0bW9zLWRlYmVyYS1leHBsaWNhci5odG1sKSBkZSBQw7pibGljbyBvIGVzdGUgW3BhcGVyXShodHRwczovL3d3dy50YW5kZm9ubGluZS5jb20vZG9pL2Z1bGwvMTAuMTA4MC8xMzY5MTE4WC4yMDE4LjE0Nzc5NjcpLgoKPGJyPgoKIyMgMi4gSUEsIE1MIHkgREwKCkludGVsaWdlbmNpYSBBcnRpZmljaWFsIChJQSksIE1hY2hpbmUgTGVhcm5pbmcgKE1MKSB5IERlZXAgTGVhcm5pbmcgKERMKSBeW0xvcyBkb3Mgw7psdGltb3MgdMOpcm1pbm9zIGVuIGNhc3RlbGxhbm8gc2Vyw61hbjogQXByZW5kaXphamUgTcOhcXVpbmEgeSBBcHJlbmRpemFqZSBQcm9mdW5kb10gc29uIHRyZXMgcGFsYWJyYXMvY29uY2VwdG9zIHF1ZSBhcGFyZWNlbiBjb25zdGFudGVtZW50ZSBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhLiBbQXF1w61dKGh0dHBzOi8vYmxvZ3RoaW5rYmlnLmNvbS9hcnRpZmljaWFsLWludGVsbGlnZW5jZS1tYWNoaW5lLWxlYXJuaW5nLXktZGVlcC1sZWFybmluZy1jb25vY2VzLWxhcy1kaWZlcmVuY2lhcykgdGllbmVzIHVuIHBvc3Qgc2VuY2lsbG8geSBjbGFybyBzb2JyZSBlc3RvcyB0cmVzIHTDqXJtaW5vcy4KCkxhIHByaW1lcmEgaWRlYSBhIHJldGVuZXIgZXN0w6EgcmVzdW1pZGEgZW4gbGEgaW5mb2dyYWbDrWEgcXVlIHZlaXMgbcOhcyBhYmFqbyB5IHF1ZSBwcm92aWVuZSBkZSBlc3RlIFtwb3N0XShodHRwczovL2hhY2tlcm5vb24uY29tL2FyZS15b3UtdXNpbmctdGhlLXRlcm0tYWktaW5jb3JyZWN0bHktOTExYWMyM2FiNGY1KQoKCgoKYGBge3IgLCBlY2hvPUZBTFNFLCBldmFsID0gVFJVRSwgZmlnLmFzcCA9IDQvMiwgb3V0LndpZHRoID0gIjc1JSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBmaWcuY2FwID0gJ0lBLCBNTCB5IERMJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAidHRfMDFfaW1nXzAxX0FJLU1MLURMLnBuZyIpKQpgYGAKCgoKQ29tbyBzZSBhcHJlY2lhIGVuIGxhIGluZm9ncmFmw61hLCBETCBlcyB1biBzdWJjb25qdW50byBkZWwgTUwgeSBNTCBlcyB1biBjYW1wbyBkZSBsYSBJQS4gVmFtb3MgcXVlIHRhbnRvIERMIGNvbW8gTUwgc29uIGFwbGljYWNpb25lcyBlc3BlY8OtZmljYXMgZGUgSUEuIExhIElBIHN1cmdpw7MgZW4gbG9zIDUwIHkgZWwgTUwgcHVlZGUgdmVyc2UgY29tbyB1biBlbmZvcXVlIGRlIGxhIElBIHF1ZSBlbXBlesOzIGEgY29nZXIgZnVlcnphIGVuIGxvcyA4MCB5IHF1ZSBzdXB1c28gdW4gY2FtYmlvIGRlIHBhcmFkaWdtYSBlbiBjb21vIHNlIGFmcm9udGFiYSBsYSBJQS4KClByaW1lcm8gdmVhbW9zIHF1w6kgZXMgbGEgSUEuIFBhcmEgZWxsbyB2b3kgYSByZWN1cnJpciBkZSBudWV2byBhIGxhIFtXaWtpcGVkaWFdKGh0dHBzOi8vZXMud2lraXBlZGlhLm9yZy93aWtpL0ludGVsaWdlbmNpYV9hcnRpZmljaWFsKSB5IGEgbG8gcXVlIHlhIHPDqSBzb2JyZSBJQSBwYXJhIHJlZGFjdGFyIHVub3MgcMOhcnJhZm9zIHF1ZSBvcyBkZW4gY2llcnRhIGlkZWEgZGUgcXXDqSBlcyBsYSBJQS4gIAoKTGEgV2lraXBlZGlhIGVtcGllemEgZGljaWVuZG86ICJJQSBlcyBsYSBpbnRlbGlnZW5jaWEgbGxldmFkYSBhIGNhYm8gcG9yIG3DoXF1aW5hcyIuIEVzdGEgcHJpbWVyYSBmcmFzZSBubyBhY2xhcmEgbXVjaG8sIHBlcm8gZXMgcXVlICBhIHZlY2VzIGxhIGNvc2FzIGN1ZXN0YW4uIExvIGludGVudG8geW86IElBIGVzIHVuIGNhbXBvIGRlIGNvbm9jaW1pZW50bywgY29tcGFydGlkbyBwb3IgdmFyaWFzIGNpZW5jaWFzLCBjdXlvIG9iamV0aXZvIHBvZGVtb3MgcGVuc2FyIHF1w6kgZXMgcXVlIGxhIG1hcXVpbmFzIHNlYW4gaW50ZWxpZ2VudGVzLiBMYXMgbWFxdWluYXMgbm8gc29uIGh1bWFub3MsIG51bmNhIHZhbiBhIHBvZGVyIHNlciBpbnRlbGlnZW50ZXMgZW4gdW4gc2VudGlkbyBhbXBsaW8gbyBodW1hbm8sIHPDs2xvIGVuIGxhIGNpZW5jaWEtZmljY2nDs24sIHBlcm8gc8OtIHB1ZWRlbiB0ZW5lciBjb21wb3J0YW1pZW50b3MgImludGVsaWdlbnRlcyI7IGVzIGRlY2lyIHF1ZSBoYWdhbiBjb3NhcyBxdWUgc2ltdWxlbiBsYSBpbnRlbGlnZW5jaWEgaHVtYW5hIGNvbW8gcG9yIGVqZW1wbG8gcmVzb2x2ZXIgcHJvYmxlbWFzIG8gZGljaG8gZGUgZm9ybWEgbcOhcyB0w6ljbmljYSwgZW4gZnVuY2nDs24gZGUgdW5hcyB2YXJpYWJsZXMgZGUgZW50b3JubyB0b21hciB1bmEgZGVjaXNpw7NuIChlc3RvIGVzIGxvIHF1ZSBoYWNlIHBvciBlamVtcGxvIHVuIG9yZGVuYWRvciBxdWUganVlZ2EgYWwgYWplZHJleiwgZW4gZnVuY2nDs24gZGUgbGFzIHBvc2ljaW9uZXMgZGUgbGFzIHBpZXphcyBlbiBlbCB0YWJsZXJvIHRvbWEgdW5hIGRlY2lzacOzbiBzb2JyZSBxdWUgcGllemEgbW92ZXIpLiBVbmEgZGVmaW5pY2nDs24gY29uY2lzYSBkZWwgY2FtcG8gc2Vyw61hOiBlbCBlc2Z1ZXJ6byBwb3IgYXV0b21hdGl6YXIgbGFzIHRhcmVhcyBpbnRlbGVjdHVhbGVzIG5vcm1hbG1lbnRlIHJlYWxpemFkYXMgcG9yIGxvcyBzZXJlcyBodW1hbm9zLgoKTGEgaWRlYSBmdW5kYW1lbnRhbCBlbiBxdWUgc2UgYmFzYSBsYSBJbnRlbGlnZW5jaWEgQXJ0aWZpY2lhbCBlcyBjb25zZWd1aXIgcXVlIHVuYSBjb21wdXRhZG9yYSByZXN1ZWx2YSB1biBwcm9ibGVtYSBjb21wbGVqbyBjb21vIGxvIGhhcsOtYSB1biBodW1hbm8uIEVzIGRlY2lyLCBzZWfDum4gQW5kcmVhcyBLYXBsYW4geSBNaWNoYWVsIEhhZW5sZWluIGRlZmluZW4gbGEgaW50ZWxpZ2VuY2lhIGFydGlmaWNpYWwgZXMgImxhIGNhcGFjaWRhZCBkZSB1biBzaXN0ZW1hIHBhcmEgaW50ZXJwcmV0YXIgY29ycmVjdGFtZW50ZSBkYXRvcyBleHRlcm5vcywgcGFyYSBhcHJlbmRlciBkZSBkaWNob3MgZGF0b3MgeSBlbXBsZWFyIGVzb3MgY29ub2NpbWllbnRvcyBwYXJhIGxvZ3JhciB0YXJlYXMgeSBtZXRhcyBjb25jcmV0YXMgYSB0cmF2w6lzIGRlIGxhIGFkYXB0YWNpw7NuIGZsZXhpYmxlIi4gUG9yIGVqZW1wbG8sIGNvbmR1Y2lyIHVuIGNvY2hlLgoKCsK/RGVzZGUgY3VhbmRvIGV4aXN0ZSBsYSBpbnRlbGlnZW5jaWEgYXJ0aWZpY2lhbD8gUHVlcyBkZXNkZSBoYWNlIGJhc3RhbnRlIC4uLi4uIG5vIGhhYsOtYWlzIG5hY2lkbywgbmkgeW8gdGFtcG9jby4gCgpMYSBpbnRlbGlnZW5jaWEgYXJ0aWZpY2lhbCBuYWNpw7MgZW4gbGEgZMOpY2FkYSBkZSAxOTUwLCBjdWFuZG8gdW4gcHXDsWFkbyBkZSBwaW9uZXJvcyBkZWwgY2FtcG8gZGUgbGEgaW5mb3Jtw6F0aWNhIGNvbWVuesOzIGEgcHJlZ3VudGFyc2Ugc2kgbGFzIGNvbXB1dGFkb3JhcyBwb2TDrWFuICJwZW5zYXIiLCB1bmEgcHJlZ3VudGEgY3V5YXMgcmFtaWZpY2FjaW9uZXMgc2UgZXN0w6FuIGV4cGxvcmFuZG8gdG9kYXbDrWEgaG95LiBMYSBpZGVhIHByaW5jaXBhbCBxdWUgc3VieWFjZSBhbCBjYW1wbyBkZSBsYSBJQSBlcyBjb25zZWd1aXIgcXVlIHVuYSBjb21wdXRhZG9yYSByZXN1ZWx2YSB1biBwcm9ibGVtYSBvIHRhcmVhIGNvbXBsZWphIGNvbW8gbG8gaGFyw61hIHVuIGh1bWFuby4gCgoKRHVyYW50ZSBsYXMgcHJpbWVyYXMgZXRhcGFzLCBtZWRpYWRvcyBkZSBsb3MgNjAsIHNlIHBlbnNhYmEgcXVlIGxhIElBIHBvZHLDrWEgbG9ncmFyc2UgZWxhYm9yYW5kbyB1biBjb25qdW50byBzdWZpY2llbnRlbWVudGUgZ3JhbmRlIGRlIHJlZ2xhcyBleHBsw61jaXRhcyBwYXJhIG1hbmlwdWxhciBjb25vY2ltaWVudG8gbyBkYXRvcy4gRW4gZXN0YSBmYXNlLCBzZSBkZXNhcnJvbGxhcm9uIGFwbGljYWNpb25lcyBjb25vY2lkYXMgY29tbyAqKnNpc3RlbWFzIGV4cGVydG9zKiosIGVuIGxvcyBxdWUgc2UgY3Jlw61hIHF1ZSB1biBwb3RlbnRlIG9yZGVuYWRvciB5IHVuIGNvbmp1bnRvIGRlIHJlZ2xhcyBkZSByYXpvbmFtaWVudG8gcG9kcsOtYW4gZW11bGFyIGVsIHJhem9uYW1pZW50byBodW1hbm8uIEVzdGUgZW5mb3F1ZSBzZSBjb25vY2UgY29tbyBJQSBzaW1iw7NsaWNhLCB5IGZ1ZSBlbCBwYXJhZGlnbWEgZG9taW5hbnRlIGVuIElBIGhhc3RhIGZpbmFsZXMgZGUgbG9zIDgwLiAKCgpMYSBJQSBzaW1iw7NsaWNhIGRlbW9zdHLDsyBzZXIgYWRlY3VhZGEgcGFyYSByZXNvbHZlciBwcm9ibGVtYXMgbMOzZ2ljb3MgYmllbiBkZWZpbmlkb3MsIGNvbW8ganVnYXIgYWwgYWplZHJleiwgcGVybyByZXN1bHTDsyBkaWbDrWNpbCBlbmNvbnRyYXIgcmVnbGFzIGV4cGzDrWNpdGFzIHBhcmEgcmVzb2x2ZXIgb3RybyB0aXBvIGRlICBwcm9ibGVtYXMgY29tcGxlam9zIHkgZGlmdXNvcywgY29tbyBsYSBjbGFzaWZpY2FjacOzbiBkZSBpbcOhZ2VuZXMsIGVsIHJlY29ub2NpbWllbnRvIGRlIHZveiBvIGxhIHRyYWR1Y2Npw7NuIGRlIHRleHRvczsgZGUgZm9ybWEgcXVlIGhveSBlbiBkw61hIHNlIHV0aWxpemEgb3RybyBlbmZvcXVlOiBlbCBNYWNoaW5lIExlYXJuaW5nIG8gQXByZW5kaXphamUgTWFxdWluYS4gCgoKQ29tbyBzZcOxYWxhbiBbYXF1w61dKGh0dHBzOi8vZW1wcmVzYXMuYmxvZ3RoaW5rYmlnLmNvbS9hdHJldmV0ZS1jb24tZWwtZGVlcC1sZWFybmluZy8pLCBubyBmdWUgaGFzdGEgbG9zIGHDsW9zIDgwLCBjYXNpIDMwIGHDsW9zIGRlc3B1w6lzIGRlbCBsb3MgaW5pY2lvcyBkZSBsYSBJQSwgcXVlIGVtcGV6w7MgYSBjb2JyYXIgaW1wb3J0YW5jaWEgZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28gbyBNYWNoaW5lIExlYXJuaW5nLiBTZSB0cmF0YSBkZSB1bmEgZm9ybWEgZGUgSUEgcXVlIHlhIG5vIG5lY2VzaXRhIHVuIHByb2dyYW1hZG9yIHF1ZSBjb2RpZmlxdWUgcmVnbGFzLCBzaW5vIHF1ZSBlcyBjYXBheiBkZSBlc3RhYmxlY2VyIHN1cyBwcm9waWFzIHJlZ2xhcyB5IGFwcmVuZGVyIHBvciBzw60gbWlzbWEuIAoKTGEgaWRlYSBiw6FzaWNhIGRldHLDoXMgZGVsIE1MIGNvbnNpc3RlIGVuIHF1ZSwgZW4gbHVnYXIgZGUgZGFybGUgYWwgb3JkZW5hZG9yIHVuIGNvbmp1bnRvIGRlIHJlZ2xhcyBwYXJhIHByb2Nlc2FyIGxvcyBkYXRvcywgZXMgZWwgcHJvcGlvIG9yZGVuYWRvciBlbCBxdWUgYXByZW5kZSBlc2FzIHJlZ2xhcyBtaXJhbmRvL2FuYWxpemFuZG8gbG9zIGRhdG9zLiDCv0PDs21vPyBZYSBsbyB2ZXJlbW9zLCBwZXJvIGxvIHF1ZSBlc3TDoSBjbGFybyBlcyBxdWUgZWwgZW5mb3F1ZS9wYXJhZGlnbWEgaGEgY2FtYmlhZG86IGVuIGx1Z2FyIGRlIHByb2dyYW1hciB5IGRhciBhbCBvcmRlbmFkb3IgdW5hcyByZWdsYXMgbyBwcm9ncmFtYSBwYXJhIHByb2Nlc2FyIGxvcyBkYXRvcyB5IGRldm9sdmVybm9zIHJlc3B1ZXN0YXMvYWNjaW9uZXMsIGVsIGVuZm9xdWUgZGVsIE1MIHByb3ZlZSBhIGxhIG1hcXVpbmEgY29uIGxvcyBkYXRvcyB5IGxhcyByZXNwdWVzdGFzIGVzcGVyYWRhcyBjb24gZXNvcyBkYXRvcyB5IG5vcyBkZXZ1ZWx2ZSBsYXMgInJlZ2xhcyIuIEVzdGFzIHJlZ2xhcyBwdWVkZW4gYXBsaWNhcnNlIGEgbnVldm9zIGRhdG9zIHBhcmEgcHJvZHVjaXIgbGFzIHJlc3B1ZXN0YXMgZW4gZXNvcyBudWV2b3MgZGF0b3MuIFVuIHNpc3RlbWEgcXVlIHVzYSBNTCBubyBlcyBleHBsw61jaXRhbWVudGUgcHJvZ3JhbWFkbywgc2lubyBxdWUgc2UgbGUgcHJvdmVlIGRlIHN1ZmljaWVudGVzIGRhdG9zIChyZWxldmFudGVzIHBhcmEgbGEgdGFyZWEgcXVlIHNlIGVzcGVyYSBxdWUgaGFnYSkgeSBlbmN1ZW50cmEgbGFzIHJlZ2xhcyAobyBlc3RydWN0dXJhIGVzdGFkw61zdGljYSkgZW4gZXNvcyBkYXRvcyBvIGVqZW1wbG9zIHksIHNpIHRvZG8gZnVuY2lvbmEgYmllbiwgZWwgc2lzdGVtYSBhcHJlbmRlIHkgZW5jdWVudHJhIGxhcyByZWdsYXMvcGF0cm9uZXMgcGFyYSBwb2RlciBhdXRvbWF0aXphciBsYSB0YXJlYSB5IHF1ZSBzZWEgbGxldmFkYSBhIGNhYm8gcG9yIGxhIG3DoXF1aW5hLiBVbiBzaXN0ZW1hL3Byb2dyYW1hIGRlIE1MIGVzIGVudHJlbmFkbyBtw6FzIHF1ZSBleHBsw61jaXRhbWVudGUgcHJvZ3JhbWFkby4KCgpVbiBlamVtcGxvIHB1ZWRlIGF5dWRhciBhIGVudGVuZGVybG86IMK/Q8OzbW8gc2UgZW5zZcOxYSBhIHVuIG5pw7FvIHF1w6kgZXMgdW4gZ2F0byB5IHF1w6kgZXMgdW4gcGVycm8/IE5vIHNlIGxlIHByb3ZlZSBkZSByZWdsYXMsIG5vIHNlIGxlIGRpY2UsIG1pcmEgdW4gZ2F0byB0aWVuZSBkb3Mgb3JlamFzIHB1bnRpYWd1ZGFzLCBiaWdvdGVzLCBjb2xhIHkgY3VhdHJvIHBhdGFzOyBnZW5lcmFsbWVudGUgc2UgbGUgZW5zZcOxYSBhbCBuacOxbyBjb24gZWplbXBsb3MsIHNlIGxlIGVuc2XDsWFuIGZvdG9zIGRlIGdhdG9zIHkgcGVycm9zIHkgZXMgZWwgcHJvcGlvIG5pw7FvIHF1aWVuIGFwcmVuZGUgbGFzIHJlZ2xhcyBkZSBmb3JtYSBxdWUgc2luIHF1ZSBuYWRpZSBsZSBkaWdhIG5hZGEsIGN1YW5kbyB2ZSB1biBnYXRvIHBvciBsYSBjYWxsZSBsbyBpZGVudGlmaWNhLCBxdWl6w6FzIGFsIHByaW5jaXBpbyBzZSBlcXVpdm9jYSBwZXJvIGNvbmZvcm1lIHNlIGxlIGRhbiBtw6FzIGVqZW1wbG9zIGFjYWJhIGFwcmVuZGllbmRvIGEgcmVjb25vY2VyL2V0aXF1ZXRhciBhIGxvcyBnYXRvcy4gQ29uZm9ybWUgZWwgbmnDsW8gcHJhY3RpY2EsIGNhZGEgdmV6IGxvIGhhY2UgbWVqb3I7IGVzIGRlY2lyLCBhcHJlbmRlLiBMbyBxdWUgZXMgZGVzdGFjYWJsZSBlcyBxdWUgbm8gZXMgbmVjZXNhcmlvIGVuc2XDsWFyIG5pbmd1bmEgcmVnbGEgYWwgbmnDsW87IGVzIGRlY2lyLCBwYXJlY2UgcXVlIGxvcyBodW1hbm9zIHRlbmVtb3MgImRlIHNlcmllIiBtZWNhbmlzbW9zIGRlIGNsYXNpZmljYWNpw7NuLCBwb2RlbW9zIGluZmVyaXIgcmVnbGFzIGRlIGNsYXNpZmljYWNpw7NuLCByZWdsYXMgcXVlIHVzYW1vcyBwZXJvIHF1ZSBub3MgZXMgZGlmw61jaWwgZGVzY3JpYmlyLiAKCgpFc3RlIGVzIGVsIGVuZm9xdWUgcXVlIHV0aWxpemEgZWwgTUwsIG5vIHNlIHByb2dyYW1hbiBsYXMgcmVnbGFzIChvIGNhcmFjdGVyw61zdGljYXMpIGRlbCBwcm9ibGVtYSBvIGN1ZXN0acOzbiBhIGFuYWxpemFyIChpZGVudGlmaWNhciBnYXRvcyksIHNpbm8gcXVlIHNlIGxlIHByb3ZlZSBkZSBkYXRvcyAoZm90b3MgZGUgZ2F0b3MgeSBkZSBwZXJyb3MpIGNvcnJlY3RhbWVudGUgZXRpcXVldGFkYXMgeSBtZWRpYW50ZSB0w6ljbmljYXMgZXN0YWTDrXN0aWNhcy9hbGdvcml0bW9zIMOpbCBzw7NsbyBlbmN1ZW50cmEgbGFzIHJlZ2xhcyBwYXJhIGRpZmVyZW5jaWFyIGVudHJlIHBlcnJvcyB5IGdhdG9zLiBVbmEgdmV6IGVsIHByb2dyYW1hL29yZGVuYWRvciBoYSBlbmNvbnRyYWRvIGxhcyByZWdsYXMsIHNlIGxlICBwdWVkZW4gcGFzYXIgbnVldmFzIGZvdG9zIGRlIHBlcnJvcyB5IGdhdG9zIChlc3TDoSB2ZXogc2luIGV0aXF1ZXRhcikgeSDDqWwgbGFzIGV0aXF1ZXRhcsOhLiBFbiBjaWVydGEgZm9ybWEgZWwgb3JkZW5hZG9yIGhhIGFwcmVuZGlkbyBkZSBsb3MgZGF0b3MgeSBzYWJlIGRpZmVyZW5jaWFyIGdhdG9zIGRlIHBlcnJvcy4gRXN0YSBjYXBhY2lkYWQgZGUgZ2VuZXJhbGl6YXIsIGRlIGFwbGljYXIgbG9zIGNvbm9jaW1pZW50b3MgYWRxdWlyaWRvcyBhIHRyYXbDqXMgZGUgbGEgZm9ybWFjacOzbiBhIGVqZW1wbG9zIHkgc2l0dWFjaW9uZXMgbnVldm9zLCBlcyB1bmEgY2FyYWN0ZXLDrXN0aWNhIGNsYXZlIHRhbnRvIGRlbCBhcHJlbmRpemFqZSBodW1hbm8gY29tbyBkZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uIFBvciBzdXB1ZXN0bywgZWwgYXByZW5kaXphamUgaHVtYW5vIGVzIG11Y2hvIG3DoXMgc29maXN0aWNhZG8gcXVlIGxvcyBhbGdvcml0bW9zIG3DoXMgYXZhbnphZG9zIGRlIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvLCBwZXJvIGxhcyBjb21wdXRhZG9yYXMgdGllbmVuIGxhIHZlbnRhamEgZGUgdGVuZXIgbWF5b3IgY2FwYWNpZGFkIHBhcmEgZWwgcHJvY2VzYWRvIGRlIGRhdG9zLiAKCkxvcyBjaWVudMOtZmljb3MgcXVlIHRyYWJhamFuIGVsIGNhbXBvIGRlbCBNTC9ETCB1dGlsaXphbiB0w6ljbmljYXMgZGUgTUwgcGFyYSBlbGFib3JhciBhcGxpY2FjaW9uZXMgbyBwcm9ncmFtYXMgcXVlIGZ1bmNpb25lbiBwYXJhIHJlc29sdmVyL2hhY2VyIHVuYSB0YXJlYSBjb25jcmV0YSwgY29tbyBwb3IgZWplbXBsbyBkZXRlY3RhciBzcGFtLCBzdWdlcmlyIHVuYSBydXRhIGRlIHRyw6FmaWNvLCBjbGFzaWZpY2FyIHVuYSBpbWFnZW4sIHRyYWR1Y2lyIHVuIHRleHRvLCByZWNvbm9jZXIgZWwgbGVuZ3VhamUgaGFibGFkbywgZXRjLi4uIFtBcXXDrV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1rb3BvTHp2aDVqWSkgcHVlZGVzIHZlciBhIGRvcyBpbnRlbGlnZW5jaWFzIGFydGlmaWNpYWxlcyBhcHJlbmRpZW5kbyBhIGp1Z2FyIGFsIGVzY29uZGl0ZS4gRGVzcHXDqXMgZGUgdW5hcyBjdWFudG9zIG1pbGxvbmVzIGRlIHBhcnRpZGFzIGhhbiBhcHJlbmRpZG8gYmFzdGFudGUgYmllbiwgaW5jbHVzbyBhIGNvbGFib3JhciBwYXJhIGVzY29uZGVyc2UgbWVqb3IgRW4gW2VzdGUgYXJ0w61jdWxvXShodHRwczovL3d3dy50ZWNobm9sb2d5cmV2aWV3LmNvbS9zLzYxNDMyNS9vcGVuLWFpLWFsZ29yaXRobXMtbGVhcm5lZC10b29sLXVzZS1hbmQtY29vcGVyYXRpb24tYWZ0ZXItaGlkZS1hbmQtc2Vlay1nYW1lcy8pIGxvIGV4cGxpY2FuIHVuIHBvY28uCgpFbiBlbCBjYW1wbyBkZWwgTUwvREwgc2UgdXRpbGl6YW4gdMOpY25pY2FzIGVzdGFkw61zdGljYXMvYWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZS4gSGF5IG11Y2hvcyB0aXBvcyBkZSBlbGxvcy4gTGEgZWxlY2Npw7NuIGRlbCBtw6FzIGFkZWN1YWRvLCBkZXBlbmRlcsOhIGRlbCB0aXBvIGRlIHRhcmVhIHF1ZSBzZSBxdWllcmEgcmVzb2x2ZXIgZW4gY2FkYSBjYXNvLiBQb3IgZWplbXBsbywgcG9kZW1vcyBoYWJsYXIgZGUgYWxnb3JpdG1vcyBkZSBjbGFzaWZpY2FjacOzbiBjb21vIGxvcyDDoXJib2xlcyBkZSBkZWNpc2nDs24sIG8gTmHDr3ZlIEJheWVzLCBhbGdvcml0bW9zIGRlIHJlZ3Jlc2nDs24sIGRlIGNsdXN0ZXJpbmcsIGRlIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcywgcmVkZXMgbmV1cm9uYWxlcywgLi4uCgpDb24gTUwgbm8gbm9zIGVuY29udHJhcmVtb3MgY29uIG9yZGVuYWRvcmVzIHF1ZSBwaWVuc2FuIGVuIGVsIHNlbnRpZG8gaHVtYW5vLCBzb2xhbWVudGUgZXN0YXJlbW9zIHV0aWxpemFuZG8gZWwgcG9kZXIgZGUgY29tcHV0byBkZSBsb3Mgb3JkZW5hZG9yZXMgcGFyYSBvYnRlbmVyIGluZm9ybWFjacOzbiBhIHBhcnRpciBkZSB1biBjb25qdW50byBkZSBkYXRvczsgZW4gcmVhbGlkYWQgZXN0YW1vcyB1c2FuZG8gTUwgcGFyYSBkYXIgc2VudGlkbyBhIGxvcyBkYXRvc15bTGEgcGFsYWJyYSBsZWFybmluZyBvIGFwcmVuZGl6YWplIGluZHVjZSBhIGVycm9yIHBvcnF1ZSBubyBzaWduaWZpY2EgcXVlIHNlIGVuc2XDsWUgYSBsb3Mgb3JkZW5hZG9yZXMgYSBwZW5zYXIgY29tbyB1biBzZXIgaHVtYW5vLCBzaW5vIHF1ZSBiw6FzaWNhbWVudGUgY29uc2lzdGUgZW4gYXBsaWNhciBhbGdvcml0bW9zIGEgZGF0b3MgbWFzaXZvcyBwYXJhIGluZmVyaXIgcHJvYmFiaWxpZGFkZXMuXS4gTGFzIHTDqWNuaWNhcyBkZSBNTCBzZSBwdWVkZW4gYXBsaWNhciBhIG11Y2hvcyBjYW1wb3MsIGRlc2RlIGxhIHBvbMOtdGljYSBoYXN0YSBsYXMgbmV1cm9jaWVuY2lhcy4gRXMgdW5hIGhlcnJhbWllbnRhIHF1ZSBzZSBwdWVkZSBhcGxpY2FyIGEgbXVjaG9zIHByb2JsZW1hcy4gQ3VhbHF1aWVyIGNhbXBvIHF1ZSBuZWNlc2l0ZSBpbnRlcnByZXRhciB5IGFjdHVhciBzb2JyZSBsb3MgZGF0b3MgcHVlZGUgYmVuZWZpY2lhcnNlIGRlIGxhcyB0w6ljbmljYXMgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28uIERlIGhlY2hvLCBlc3RhcyB0w6ljbmljYXMsIHByaW5jaXBhbG1lbnRlIGxhcyBkZSBhcHJlbmRpemFqZSBwcm9mdW5kbywgc2UgZXN0w6FuIGNvbnZpcnRpZW5kbyBlbiBlbCBtb3RvciBxdWUgaW1wdWxzYSBsYSBlY29ub23DrWEgbW9kZXJuYSBiYXNhZGEgZW4gZGF0b3MgeSBwYXJhIHF1ZSBlc2UgbW90b3IgZnVuY2lvbmUgc2UgbmVjZXNpdGEgImVuZXJnw61hIiwgeSBsYSBlbmVyZ8OtYSBsYSBwcm9wb3JjaW9uYW4gbG9zIGRhdG9zLiBFbiBlc2Ugc2VudGlkbyBzZSBkaWNlIHF1ZSBsb3MgZGF0b3Mgc29uIGVsIG51ZXZvIHBldHJvbGVvLiBMbyBpbXBvcnRhbnRlIG5vIHNvbiB0YW50byBsYXMgdMOpY25pY2FzLCBzaW5vIGxvcyBkYXRvcyBxdWUgYWxpbWVudGFuIGEgbG9zIGFsZ29yaXRtb3MuCgpMYXMgdMOpY25pY2FzIGRlIE1ML0RMIGVzZW5jaWFsbWVudGUgc2lydmVuIHBhcmEgaGFjZXIgKipwcmVkaWNjaW9uZXMqKiwgZW4gZ2VuZXJhbCwgbm8gcGVybWl0ZW4gb2J0ZW5lciBsYSBjYXVzYSBkZSBhbGdvLiBMb3MgZGF0b3MgbWFzaXZvcyB0cmF0YW4gZGVsIHF1w6ksIG5vIGRlbCBwb3JxdcOpLiBObyBzZSBvYnRpZW5lbiByZWxhY2lvbmVzIGRlICoqY2F1c2FsaWRhZCoqIHNpbm8gY29ycmVsYWNpb25lcyBvIGFzb2NpYWNpb25lcy4gQnVlbm8gLi4uIGEgdG9kb3Mgbm9zIGd1c3RhIGNvbm9jZXIgbGFzIGNhdXNhcywgc29icmUgdG9kbyBhIGxvcyBpbnZlc3RpZ2Fkb3JlcywgcGVybywgcXVpesOhcywgbXVjaGFzIHZlY2VzIGVzdG8gbm8gc2VhIGFic29sdXRhbWVudGUgbmVjZXNhcmlvIHkgYXVucXVlIGVzdG8gY2hvcXVlIGNvbiBsYXMgcHLDoWN0aWNhcyBlc3RhYmxlY2lkYXMgaGFjZSBzaWdsb3MgeSBjb24gbnVlc3RyYSBjb21wcmVuc2nDs24gbcOhcyBlbGVtZW50YWwgc29icmUgY29tbyB0b21hciBkZWNpc2lvbmVzIHkgYXByZWhlbmRlciBsYSByZWFsaWRhZC4gU2llbmRvIHVuIHBvY28gYWJvZ2FkbyBkZWwgZGlhYmxvLCBubyBzaWVtcHJlIG5lY2VzaXRhbW9zIHNhYmVyIGxhIGNhdXNhOyBhZGVtw6FzLCBlbCBtw6l0b2RvIGNpZW50w61maWNvIHRyYWRpY2lvbmFsIHNlIGxpbWl0YWJhIGEgY29udHJhc3RhciB1biBsaW1pdGFkbyBuw7ptZXJvIGRlIGhpcMOzdGVzaXMgbWllbnRyYXMgcXVlIGNvbiBsYXMgdMOpY25pY2FzIGRlIE1ML0RMIGVsIGVuZm9xdWUgY29uc2lzdGUsIGVuIGNpZXJ0YSBmb3JtYSwgZW4gZGVqYXIgcXVlIGxvcyBkYXRvcyBoYWJsZW4gcG9yIHNpIG1pc21vcy4KCgoKUmVzcGVjdG8gYWwgKipEZWVwIExlYXJuaW5nKiosIHNpbXBsZW1lbnRlIHZvbHZlciBhIGRlY2lyIHF1ZSBlcyB1biBzdWJjb25qdW50byBkZWwgTUwuIFNvbiB0w6ljbmljYXMgbcOhcyBjb21wbGVqYXMgZW4gdMOpcm1pbm9zIGNvbXB1dGFjaW9uYWxlcyB5IHBvciBsbyB0YW50byBuZWNlc2l0YW4gcGFyYSBhcHJlbmRlciB1biBtYXlvciB2b2x1bWVuIGRlIGRhdG9zLCBwZXJvIHN1IGZpbG9zb2bDrWEgZXMgbGEgbWlzbWE6IHByb3ZlZXIgZGUgZGF0b3MgcGFyYSBxdWUgZWwgb3JkZW5hZG9yIGFwcmVuZGEgYSByZXNvbHZlciB5IGF1dG9tYXRpemFyIHVuYSB0YXJlYSBjb25jcmV0YS4gVXRpbGl6YW4gYWxnb3JpdG1vcyBtw6FzIGNvbXBsZWpvcyBvIGNvbiBtw6FzIGVsZW1lbnRvcyBvIGNhcGFzLiBQcsOhY3RpY2FtZW50ZSB0b2RhcyBsYXMgYXBsaWNhY2lvbmVzIGV4aXRvc2FzIHV0aWxpemFuIHTDqWNuaWNhcyBkZSBETCwgeSBnZW5lcmFsbWVudGUgYWxnb3JpdG1vcyBiYXNhZG9zIGVuIHJlZGVzIG5ldXJvbmFsZXMuCgpPcyBkZWpvIGFsZ3VuYXMgaWRlYXMgZnJhc2VzIHNvYnJlIERMIHByb3ZlbmllbnRlcyBkZSBbZXN0ZSBmYW50w6FzdGljbyBhcnTDrWN1bG9dKGh0dHBzOi8vZW1wcmVzYXMuYmxvZ3RoaW5rYmlnLmNvbS9hdHJldmV0ZS1jb24tZWwtZGVlcC1sZWFybmluZy8pOgoKLSBFbCBEZWVwIExlYXJuaW5nIGVzIHVuYSBkZSBsYXMgw6FyZWFzIGRlIGludmVzdGlnYWNpw7NuIG3DoXMgcG9wdWxhcmVzIGRlbnRybyBkZWwgY2FtcG8gZGUgbGEgSW50ZWxpZ2VuY2lhIEFydGlmaWNpYWwgZW4gbG9zIMO6bHRpbW9zIGHDsW9zIHBvcnF1ZSwgZ3JhY2lhcyBhIGVzdGFzIHTDqWNuaWNhcywgY29zYXMgY29tbyBsYSB2aXNpw7NuIGFydGlmaWNpYWwgbyBlbCBwcm9jZXNhbWllbnRvIGRlbCBsZW5ndWFqZSBuYXR1cmFsIGhhbiBzYWx0YWRvIGRlbCDDoW1iaXRvIGRlIGxhIGNpZW5jaWEgZmljY2nDs24gYSBsYSByZWFsaWRhZC4KCi0gRWwgRGVlcCBMZWFybmluZyBlcyB0YW4gaW1wb3J0YW50ZSBwb3JxdWUgZXN0w6EgcGVybWl0aWVuZG8gcmVzb2x2ZXIgZGUgZm9ybWEgbcOhcyBmw6FjaWwgeSBlZmljaWVudGUgdW4gZ3JhbiBuw7ptZXJvIGRlIHByb2JsZW1hcy4gUG9yIHVuYSBwYXJ0ZSwgcmVhbGl6YSBkZSBmb3JtYSBhdXRvbcOhdGljYSB1bmEgZGUgbGFzIHRhcmVhcyBtw6FzIGNvbXBsZWphcyBkZWwgcHJvY2VzbyBkZSB0cmFiYWpvIGRlIE1hY2hpbmUgTGVhcm5pbmc6IGxhIGluZ2VuaWVyw61hIGRlIGF0cmlidXRvc15bZW4gTUwvREwgY3VhbmRvIGhhYmxhbiBkZSBhdHJpYnV0b3Mgc2UgcmVmaWVyZW4sIG3DoXMgbyBtZW5vcywgYWwgdGVybWlubyByZWdyZXNvcmVzIGVuIEVjb25vbWV0csOtYV0uIExhcyByZWRlcyBuZXVyb25hbGVzIHNlbGVjY2lvbmFuIGRlIGZvcm1hIGF1dG9tw6F0aWNhIHF1w6kgYXRyaWJ1dG9zIHNvbiBsb3MgcmVsZXZhbnRlcyB5IGN1w6FsZXMgc2UgcHVlZGVuIGRlc2VjaGFyLiAKCi0gT3RyYSBkZSBsYXMgZ3JhbmRlcyB2ZW50YWphcyBkZSB0cmFiYWphciBjb24gcmVkZXMgbmV1cm9uYWxlcyBlcyBxdWUgcGVybWl0ZW4gdHJhYmFqYXIgY29uIGN1YWxxdWllciB0aXBvIGRlIGlucHV0LiBDdWFscXVpZXJhOiBuw7ptZXJvcywgaW3DoWdlbmVzLCBzb25pZG9zLCB0ZXh0b3MsIHNlcmllcyB0ZW1wb3JhbGVzLiBUZW5pZW5kbyBlbiBjdWVudGEgcXVlIGxvcyBkYXRvcyBubyBlc3RydWN0dXJhZG9zLCBhcXVlbGxvcyBxdWUgbm8gZW5jYWphbiBlbiBsYSBlc3RydWN0dXJhIHRyYWRpY2lvbmFsIGZpbGFzL2NvbHVtbmFzIGRlIGxhcyBiYXNlcyBkZSBkYXRvcyByZWxhY2lvbmFsZXMsIHN1cG9uZW4gbcOhcyBkZSB1biA5MCUgZGUgdG9kb3MgbG9zIGRhdG9zIGdlbmVyYWRvcywgZXMgZsOhY2lsIGNvbXByZW5kZXIgbGEgaW1wb3J0YW5jaWEgZGUgcG9kZXIgbWFuZWphcmxvcyBkZSBmb3JtYSBlZmljaWVudGUuIEVzdGFtb3MgaGFibGFuZG8gZGUgZGF0b3MgY29tbyBtZW5zYWplcyBkZSBjb3JyZW8sIHbDrWRlb3MsIGZpY2hlcm9zIGRlIGF1ZGlvLCBww6FnaW5hcyB3ZWIsIG1lbnNhamVzIGVuIHJlZGVzIHNvY2lhbGVzIGV0Yy4KCi0gVW5hIHJlZCBuZXVyb25hbCBlbnRyZW5hZGEgY29uIGRhdG9zIGV0aXF1ZXRhZG9zLCB0YW1iacOpbiBzZSBwdWVkZSBhcGxpY2FyIGEgZGF0b3Mgbm8gZXN0cnVjdHVyYWRvcywgbG8gY3VhbCBsZXMgZGEgYSBsb3MgYWxnb3JpdG1vcyBkZSBEZWVwIExlYXJuaW5nIHVuYSBncmFuIHZlbnRhamEgcmVzcGVjdG8gYSBvdHJvcyBhbGdvcml0bW9zIGFsIHBvbmVyIGEgc3UgZGlzcG9zaWNpw7NuIHVuIHZvbHVtZW4gZGUgZGF0b3MgZGUgZW50cmVuYW1pZW50byBtdWNobyBtYXlvci4gQWxnb3JpdG1vcyBubyBtdXkgYnVlbm9zIGVudHJlbmFkb3MgY29uIGVub3JtZXMgY29uanVudG9zIGRlIGRhdG9zIHB1ZWRlbiBkYXIgbWVqb3JlcyByZXN1bHRhZG9zIHF1ZSBidWVub3MgYWxnb3JpdG1vcyBlbnRyZW5lbW9zIGNvbiBjb25qdW50b3MgZGUgZGF0b3MgcmVkdWNpZG9zLiBEZSBoZWNobywgbWllbnRyYXMgZW4gZWwgY2FzbyBkZSBsb3MgYWxnb3JpdG1vcyB0cmFkaWNpb25hbGVzIHVzYWRvcyBlbiBNYWNoaW5lIExlYXJuaW5nIGxsZWdhIHVuIG1vbWVudG8gZW4gZWwgdW4gbWF5b3Igdm9sdW1lbiBkZSBkYXRvcyBubyBpbXBsaWNhIHVuIG1lam9yIHJlbmRpbWllbnRvLCBlbiBlbCBjYXNvIGRlbCBEZWVwIExlYXJuaW5nIG5vIG9jdXJyZSBhc8OtLiBFbCByZW5kaW1pZW50byBubyBkZWphIGRlIGNyZWNlciwgc2Vnw7puIGxvIGhhY2VuIGVsIHZvbHVtZW4gZGUgZGF0b3MgeSBlbCBuw7ptZXJvIGRlIGNhcGFzIGRlbCBtb2RlbG8uCgoKQ29tbyB5YSBzYWLDqWlzLCBhdW5xdWUgZWwgY3Vyc28gdGllbmUgdW4gdGVtYSBzb2JyZSBNTCwgZWwgdGVyY2VybywgZW4gZWwgcXVlIHNlIGhhcsOhIHVuYSBpbnRyb2R1Y2Npw7NuIGEgbGEgdGVybWlub2xvZ8OtYSB5IHByaW5jaXBhbGVzIG3DqXRvZG9zIGRlbCBNTCwgZW4gcmVhbGlkYWQgZWwgY3Vyc28gbm8gZXN0w6Egb3JpZW50YWRvIGFsIE1MLCBuaSBtdWNobyBtZW5vcyBhbCBETCwgc2lubyBxdWUgZXN0w6EgbcOhcyBvcmllbnRhZG8gYSBzZXIgdW5hIGludHJvZHVjY2nDs24gYSBsYSBjaWVuY2lhIGRlIGRhdG9zIChEUykuCgrCv1F1ZSBxdcOpIGVzIGxhIENpZW5jaWEgZGUgZGF0b3M/IFB1ZXMgdm95IGEgdHJhdGFyIGRlIGV4cGxpY2FybG8gZW4gZWwgc2lndWllbnRlIGFwYXJ0YWRvLgoKCgojIyAzLiBDaWVuY2lhIGRlIERhdG9zCgpDb21vIHNlIGRpam8gZW4gZWwgcHJlZmFjaW8sIERTIGVzIHVuYSBudWV2YSBkaXNjaXBsaW5hXltBdW5xdWUgZWwgdMOpcm1pbm8gQ2llbmNpYSBkZSBkYXRvcyBzZSByZW1vbnRhLCBzZWfDum4gbGEgV2lraXBlZGlhIGFsIG1lbm9zIGEgcHJpbmNpcGlvcyBkZSBsb3MgNzBdIHF1ZSBzZSBpbmNvcnBvcmEgcG9jbyBhIHBvY28sIHBlcm8gY29uIG11Y2hhIGZ1ZXJ6YSwgYSBsYSBtYXlvcsOtYSBkZSBwbGFuZXMgZGUgZXN0dWRpbywgaW5jbHVpZGEgbGEgRWNvbm9tw61hLiBQb3IgZWplbXBsbywgW2VzdGUgTcOhc3RlciBkZSBsYSBMU0VdKGh0dHA6Ly93d3cubHNlLmFjLnVrL3N0dWR5LWF0LWxzZS9HcmFkdWF0ZS9EZWdyZWUtcHJvZ3JhbW1lcy0yMDE5L01TYy1EYXRhLVNjaWVuY2UpLiAKCgoKwr9EZSBxdcOpIHNlIG9jdXBhIGxhIGNpZW5jaWEgZGUgZGF0b3M/IFB1ZXMgcHVlZGUgdGVuZXIgdmFyaWFzIHJlc3B1ZXN0YXMsIHBlcm8gZW4gZGVmaW5pdGl2YSBlbCBvYmpldGl2byDDumx0aW1vIGRlIGxhIGNpZW5jaWEgZGUgZGF0b3MgZXMgdHJhbnNmb3JtYXIgbG9zIGRhdG9zIGVuIGluZm9ybWFjacOzbiBjb24gc2VudGlkby4gQWxndW5vcyBkaXLDoW4sIHBlcm8gc8OtIGVzZSBlcyBlbCBvYmpldGl2byBkZSBsYSBFc3RhZMOtc3RpY2EuIFPDrSwgZXMgY2llcnRvLCB0cmFuc2Zvcm1hciBkYXRvcyBlbiBpbmZvcm1hY2nDs24gZXMsIHkgaGEgc2lkbyBzaWVtcHJlLCBlbCBvYmpldGl2byDDumx0aW1vIGRlIGxhIGVzdGFkw61zdGljYSwgUEVSTyBsbyBxdWUgaGFiaXR1YWxtZW50ZSBjb25vY2Vtb3MgcG9yIEVzdGFkw61zdGljYSBzZSBmdWUgY29uZm9ybWFuZG8gY29uIGVsIHBhc28gZGUgbG9zIGHDsW9zIGVuIHVuIGNvbnRleHRvIGVuIGVsIHF1ZSBjb25zZWd1aXIgZGF0b3MgZXJhIGRpZsOtY2lsLCBhc8OtIHF1ZSBzZSBkZXNhcnJvbGxhcm9uIG3DqXRvZG9zIHkgdMOpY25pY2FzIGFwcm9waWFkYXMgcGFyYSBleHRyYWVyIGVsIG3DoXhpbW8gZGUgaW5mb3JtYWNpw7NuIGNvbiBtdWVzdHJhcyBkZSByZWR1Y2lkbyB0YW1hw7FvLiBFbCBjb250ZXh0byBoYSBjYW1iaWFkbywgdml2aW1vcyByb2RlYWRvcyBkZSBkYXRvcywgZGUgbWF5b3Igdm9sdW1lbiB5IHZhcmllZGFkLCBsbyBxdWUgcHJvdm9jYSBudWV2b3MgcmV0b3MgYSBsb3MgYW5hbGlzdGFzLCB5IHRlbmVtb3MgbWF5b3IgY2FwYWNpZGFkIGRlIGNvbXB1dG8sIHBvciBsbyBxdWUgYSB2ZWNlcyB5YSBubyBoYXkgcXVlIHV0aWxpemFyIGFwcm94aW1hY2lvbmVzIGFzaW50w7N0aWNhc15bVW5hIHZlcnNpw7NuIG3DoXMgYW1wbGlhIHkgZnVuZGFtZW50YWRhIGRlIGVzdGFzIGlkZWFzIHB1ZWRlIGVuY29udHJhcnNlIFthcXXDrV0oaHR0cHM6Ly9tZHNyLWJvb2suZ2l0aHViLmlvL21kc3IyZS9jaC1wcm9sb2d1ZS5odG1sKV0uIExhIEFtZXJpY2FuIFN0YXRpc3RpY2FsIEFzb2NpYXRpb24gKEFTQSkgZGVzdGFjYSBsYSBpbXBvcnRhbmNpYSBkZSBsYSBFc3RhZMOtc3RpY2EgZW4gRFMsIHBlcm8gcmVjb25vY2UgZW4gW2VzdGUgc3RhdGVtZW50XShodHRwczovL21hZ2F6aW5lLmFtc3RhdC5vcmcvYmxvZy8yMDE1LzEwLzAxL2FzYS1zdGF0ZW1lbnQtb24tdGhlLXJvbGUtb2Ytc3RhdGlzdGljcy1pbi1kYXRhLXNjaWVuY2UvKSBsYSBkaWZlcmVuY2lhIGVudHJlIERTIHkgZXN0YWTDrXN0aWNhLgoKCgpObyBlcyBlc3RyaWN0YW1lbnRlIGNpZXJ0bywgcGVybyBwb2RlbW9zIHBlbnNhciBxdWUgbGEgZXN0YWTDrXN0aWNhIHRyYWRpY2lvbmFsIHNlIGNvbmNlbnRyYSBwcmluY2lwYWxtZW50ZSBlbiBsYXMgdMOpY25pY2FzIG8gbcOpdG9kb3MgZXN0YWTDrXN0aWNvcywgYWRlbcOhcyBkYWRvIGVsIGNvbnRleHRvIGRlIGVzY2FzZXogZGUgZGF0b3MsIGVuIHVuIHRpcG8gZGV0ZXJtaW5hZG8gZGUgdMOpY25pY2FzOyBzaW4gZW1iYXJnbyBsYSDDs3B0aWNhIGRlIGxhIGNpZW5jaWEgZGUgZGF0b3MgZXMgbcOhcyBhbXBsaWEuIEVuIENpZW5jaWEgZGUgZGF0b3Mgc2UgdXNhbiB5IG5lY2VzaXRhbiB0w6ljbmljYXMgZXN0YWTDrXN0aWNhcywgcGVybyBlbCBlbmZvcXVlIGVzIG3DoXMgZ2xvYmFsOiBzZSBoYWNlIMOpbmZhc2lzIGVuIHF1ZSBlbCBwcm9jZXNvIGRlIGFuw6FsaXNpcyBkZSBkYXRvcyBjb21pZW56YSBkZXNkZSBxdWUgc2UgcmVjb3BpbGFuIGxvcyBkYXRvcyBoYXN0YSBxdWUgc2UgcHJlc2VudGFuIGxvcyByZXN1bHRhZG9zXltUYWwgY29tbyBhcmd1bWVudGEgW2VzdGUgcG9zdF0oaHR0cHM6Ly93d3cuYnJvZHJpZ3Vlcy5jby9ibG9nLzIwMjAtMTEtMDUtcmV0aXJlX2RhdGFfc2NpZW5jZS8pLCBsYSBhcGFyZW50ZSBkaWNvdG9tw61hIGVudHJlIGVzdGFkw61zdGljYSB5IGNpZW5jaWEgZGUgZGF0b3Mgc2UgcmVkdWNpcsOhIGNvbiBlbCB0aWVtcG8uXS4gRWwgc2lndWllbnRlIGRpYWdyYW1hIGlsdXN0cmEgZXN0ZSBwcm9jZXNvOgoKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiOTAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAidHRfMDFfaW1nXzAyX0RTLXdvcmtmbG93LnBuZyIpLCBkcGkgPSAxNTApIApgYGAKCgoKRW4gbGEgQ2llbmNpYSBkZSBkYXRvcywgZXRhcGFzIGNvbW8gZWwgcHJvY2VzYWRvIHkgbGltcGllemEgZGUgZGF0b3MgbyBlbCBhbsOhbGlzaXMgZ3LDoWZpY28sIHF1ZSBvY3VwYWJhbiB1biBsdWdhciBzZWN1bmRhcmlvIGN1YW5kbyBubyBtYXJnaW5hbCBlbiBsb3MgbGlicm9zIHRyYWRpY2lvbmFsZXMgZGUgZXN0YWTDrXN0aWNhIHNlIGhhbiBjb252ZXJ0aWRvIGVuIHBhcnRlcyBmdW5kYW1lbnRhbGVzIGRlbCB0cmFiYWpvIGRlIHVuIGNpZW50w61maWNvIGRlIGRhdG9zLiAKCgpObyBzb2xvIHNlIGNvbnNpZGVyYSBlbCBhbsOhbGlzaXMgZGUgZGF0b3MgY29tbyB1biBwcm9jZXNvIG3DoXMgZ2xvYmFsIGNvbXB1ZXN0byBkZSB2YXJpYXMgZXRhcGFzLCBzaW5vIHF1ZSBkYWRhIGxhIGNvbXBsZWppZGFkLCB2b2x1bWVuIHkgdmFyaWVkYWQgZGUgbG9zIGRhdG9zIGFjdHVhbGVzIHNlIG5lY2VzaXRhIHVuIGZ1ZXJ0ZSBjb21wb25lbnRlIHRlY25vbMOzZ2ljbyBnZW5lcmFsbWVudGUgYXBveWFkbyBlbiBsb3Mgb3JkZW5hZG9yZXMgeSBsYSBwcm9ncmFtYWNpw7NuLiBObyBzZSBwdWVkZSwgbyBlcyBleHRyZW1hZGFtZW50ZSBjb21wbGljYWRvLCBoYWNlciBjaWVuY2lhIGRlIGRhdG9zIHNpbiBzYWJlciBwcm9ncmFtYXIuIEFkZW3DoXMgZW4gbGEgY2llbmNpYSBkZSBkYXRvcyBzZSBkYSB1bmEgZ3JhbiBpbXBvcnRhbmNpYSBhbCBjb250ZXh0byBlbiBlbCBxdWUgc2UgaGFjZSBEYXRhIFNjaWVuY2UsIGVuIGNpZXJ0YSBmb3JtYSBzZSByZWNvbm9jZSBxdWUgaGFjZSBmYWx0YSBzYWJlciBFY29ub23DrWEgcGFyYSBoYWNlciBjaWVuY2lhIGRlIGRhdG9zIGVuIGVsIGNhbXBvIGRlIGxhIGVjb25vbcOtYS4KCkxhIHNpZ3VpZW50ZSBpbmZvZ3JhZsOtYSBwdWVkZSBpbHVzdHJhciBlc3RhIGlkZWEsIG1vc3RyYW5kbyBxdWUsIGlkZWFsbWVudGUsIHBhcmEgaGFjZXIgRFMgc2UgcmVxdWllcmVuLCBhbCBtZW5vcywgdHJlcyB0aXBvcyBkZSBjb21wZXRlbmNpYXMgbyBjb25vY2ltaWVudG9zOiAxKSBtYXRlbcOhdGljYXMgeSBlc3RhZMOtc3RpY2EsIDIpIHRlY25vbG9nw61hIHkgcHJvZ3JhbWFjacOzbiB5IDMpIGNvbm9jaW1pZW50b3MgZGVsIGNhbXBvIGRlIGFwbGljYWNpw7NuLiBFbiBbZXN0ZSBwb3N0XShodHRwOi8vZHJld2NvbndheS5jb20vemlhLzIwMTMvMy8yNi90aGUtZGF0YS1zY2llbmNlLXZlbm4tZGlhZ3JhbSkgZXhwbGljYW4gZWwgZGlhZ3JhbWEgZW4gZGV0YWxsZSwgcG9yIGVqZW1wbG8sIHF1w6kgZXMgbGEgIkRhbmdlciBab25lIi4KCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiNDAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAidHRfMDFfaW1nXzAzX0RTLnBuZyIpKSAKYGBgCgpFbiBbZXN0ZSBwb3N0XShodHRwczovL21lZGl1bS5jb20vQE9EU0MvZGF0YS1zY2llbmNlLWluLW1hbnVmYWN0dXJpbmctYW4tb3ZlcnZpZXctZTZkNjQ4YmY5YzA4KSBkZXNhcnJvbGxhbiBlc3RhcyBpZGVhcyBlbiBlbCBjb250ZXh0byBjb25jcmV0byBkZSBsYSBpbmR1c3RyaWEgbWFudWZhY3R1cmVyYSB5IGhhY2VuIHVuIGxpc3RhZG8gZGUgcG90ZW5jaWFsZXMgdXNvcyBkZSBsYSBEUyBlbiBlbCBjYW1wbyBkZSBsYXMgbWFudWZhY3R1cmFzLiBFbiBbZXN0ZSBvdHJvIHBvc3RdKGh0dHA6Ly92YXJpYW5jZWV4cGxhaW5lZC5vcmcvci9kcy1tbC1haS8pIHB1ZWRlcyBlbmNvbnRyYXIgdW5hIHZpc2nDs24gZGUgbGEgRFMgdW4gcG9jbyBkaXN0aW50YSwgeWEgcXVlIGluY2lkZSBlbiBsYSBkaWZlcmVuY2lhcyBlbnRyZSBEUywgTUwgZSBJQS4gQ29tbyByZXN1bWVuIGRlbCBwb3N0OiAiRGF0YSBzY2llbmNlIHByb2R1Y2VzIGluc2lnaHRzLCBNYWNoaW5lIGxlYXJuaW5nIHByb2R1Y2VzIHByZWRpY3Rpb25zLCBBcnRpZmljaWFsIGludGVsbGlnZW5jZSBwcm9kdWNlcyBhY3Rpb25zIi4gRW4gZXN0ZSBbb3RybyBwb3N0XShodHRwczovL2Jsb2cucnN0dWRpby5jb20vMjAyMC8wNS8yNy9yb2xlLW9mLXRoZS1kYXRhLXNjaWVudGlzdC8pIGFyZ3VtZW50YW4gcXVlIGxvcyBjaWVudMOtZmljb3MgZGUgZGF0b3Mgc29uIG3DoXMgbmVjZXNhcmlvcyBxdWUgbnVuY2EgeSBxdWUgc3UgbGFib3Igbm8gcHVlZGUsIGFsIG1lbm9zIGRlIG1vbWVudG8sIHNlciByZWVtcGxhemFkYSBwb3IgcHJvY2Vzb3MgYXV0b21hdGl6YWRvcyB1c2FuZG8gdMOpY25pY2FzIGRlIE1MLgoKCkRvcyBkZWZpbmljaW9uZXMgc2VuY2lsbGFzIGRlIERTOgoKCi0gYEBZQnVobGA6IFRoaXMgcGhyYXNlIGJ5IGBAanVsaWVzcXVpZGAgaXMgd29ydGggcmV0d2VldGluZyBpdCBhbGwgb3ZlciBhZ2FpbjogCiJEYXRhIFNjaWVuY2UgaXMgbm90IGp1c3QgYWJvdXQgI0FJIG9yIG1hY2hpbmUgbGVhcm5pbmcuIEl0IGlzIHRoZSBkaXNjaXBsaW5lIG9mIHR1cm5pbmcgcmF3IGRhdGEgaW50byB1bmRlcnN0YW5kaW5nLiIgCgotIGBAVGlmZmFueVRpbWJlcnNgOiBUaGlua2luZyBhIGxvdCBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiAjRGF0YVNjaWVuY2UuIFRoZSBiZXN0IHRoYXQgSSBoYXZlIHJlYWQgc28gZmFyIGNvbWVzIGZyb20gYEByYWZhbGFiYDogInRoZSBwcm9jZXNzZXMgdXNlZCB0byBleHRyYWN0IHZhbHVlIGZyb20gZGF0YSIuIEkgdGhpbmsgd2Ugc2hvdWxkIGV4dGVuZCB0aGlzIGFuZCBzYXkgInRoZSByZXByb2R1Y2libGUgJiB0cmFuc3BhcmVudCBwcm9jZXNzZXMgdXNlZCB0byBleHRyYWN0IHZhbHVlIGZyb20gZGF0YSIKCgoKUG9yIMO6bHRpbW8sIDMgImRlZmluaWNpb25lcyIgZGUgRFMgbWVkaW8gZW4gYnJvbWE6CgotIFVuIGNpZW50w61maWNvIGRlIGRhdG9zIGVzIHVuIGVzdGFkw61zdGljbyBjb24gcGFqYXJpdGEKCi0gVW4gZXN0YWTDrXN0aWNvIHF1ZSB0cmFiYWphIGVuIFNhbiBGcmFuY2lzY28KCi0gQ2llbnTDrWZpY28gZGUgZGF0b3MgKG4pOiBQZXJzb25hIHF1ZSBzYWJlIG3DoXMgZGUgZXN0YWTDrXN0aWNhIHF1ZSBjdWFscXVpZXIgcHJvZ3JhbWFkb3IgeSBxdWUgYSBsYSB2ZXogc2FiZSBtw6FzIGRlIHByb2dyYW1hY2nDs24gcXVlIGN1YWxxdWllciBlc3RhZMOtc3RpY28KCgo8YnI+CgojIyMjIMK/RXMgZsOhY2lsIHNlciBjaWVudMOtZmljbyBkZSBkYXRvcz8gCgpQdWVzLCBjb21vIHRvZG8sIGRlcGVuZGUsIHBlcm8gc2kgcXVlIGhheSBxdWUgdGVuZXIgZW4gY3VlbnRhIHF1ZSBlcyB1biBjYW1wbyBlbiBjb250aW7DumEgZXZvbHVjacOzbi4gRXN0b3MgcG9zdCwgWzFdKGh0dHBzOi8vdG93YXJkc2RhdGFzY2llbmNlLmNvbS9ob3ctaXQtZmVlbHMtdG8tbGVhcm4tZGF0YS1zY2llbmNlLWluLTIwMTktNmVlNjg4NDk4MDI5KSwgWzJdKGh0dHBzOi8vbXVlc3RyZWFyLW5vLWVzLXBlY2Fkby5uZXRsaWZ5LmNvbS8yMDE5LzAyLzE4L2xhLW1vZGVybmlkYWQvKSB5IFszXShodHRwczovL2dpdGh1Yi5jb20vb2xpdmllcmdpbWVuZXovVGhpbmdzLWEtc2NpZW50aXN0LWlzLXN1cHBwb3NlZC10by1rbm93KSwgaW5jaWRlbiBlbiBsbyBlc3RyZXNhbnRlIHF1ZSBwdWVkZSBzZXIgbGEgdmlkYSBkZSB1biBjaWVudMOtZmljbyBkZSBkYXRvcyBxdWUgaW50ZW50ZSBlc3RhciBhbCBkw61hIGRlIGxhcyBjb250aW51b3MgY2FtYmlvcyB5IGV2b2x1Y2lvbmVzIGVuIGVzdGUgY2FtcG8uCgoKCgpQYXJlY2lkbyBhIGxvIHF1ZSBzdWdpZXJlIGVzdGUgdHdlZXQ6Cgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5XaHkgRGF0YSBTY2llbmNlIGlzIEhhcmTihKI8YnI+PGJyPihzbGlkZSB2aWEgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9icmFkdXJhbmk/cmVmX3NyYz10d3NyYyU1RXRmdyI+QGJyYWR1cmFuaTwvYT4gYXQgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL0xlYWREZXZBdXN0aW4/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNMZWFkRGV2QXVzdGluPC9hPikgPGEgaHJlZj0iaHR0cHM6Ly90LmNvLzhRY1BsUk1henciPnBpYy50d2l0dGVyLmNvbS84UWNQbFJNYXp3PC9hPjwvcD4mbWRhc2g7IENhaXRsaW4gSHVkb27wn5Gp8J+PvArwn5K7IChAYmVlb25hcG9zeSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9iZWVvbmFwb3N5L3N0YXR1cy8xMDcwNzg3Mzk0Mjg5NDQ2OTEyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkRlY2VtYmVyIDYsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+IAoKCjxicj4KCkF1bnF1ZSB0YW1iacOpbiBlc3TDoSBiaWVuIGRlc21pdGlmaWNhciB1biBwb2NvIHkgdG9tYXJzZSBsYXMgY29zYXMgbWVub3MgZW4gc2VyaW86CgoKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0Ij48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkxvdmUgZGF0YSBzY2llbmNlIDxhIGhyZWY9Imh0dHBzOi8vdC5jby9SWjE4amFPSlJRIj5waWMudHdpdHRlci5jb20vUloxOGphT0pSUTwvYT48L3A+Jm1kYXNoOyBUaW0gSG9wcGVyIChAdGRob3BwZXIpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vdGRob3BwZXIvc3RhdHVzLzczMDQyNTYzMjg2MjA0NDE2MT9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5NYXkgMTEsIDIwMTY8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+IAoKCjxicj4KCkNvbW8gc3VnaWVyZSBlc3RlIG90cm8gdHdlZXQsIG5vIHNlIHB1ZWRlIHNhYmVyIHRvZG8sIG5pIHBhc2FyIHBvciBsYSB2aWRhIHNpbiBjb21ldGVyIGVycm9yZXM6CgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+VnVsbmVyYWJsZSBidXQgaW1wb3J0YW50IHR3ZWV0cyBmb3IgZGF0YSBzY2llbnRpc3RzICZhbXA7IHByb2dyYW1tZXJzOjxicj48YnI+8J+kt0lESzogSSBkb24mIzM5O3Qga25vdzxicj7wn6egVElMOiB0b2RheSBJIGxlYXJuZWQ8YnI+8J+YrCBNaXN0YWtlcyBJJiMzOTt2ZSBtYWRlPGJyPjxicj5Ob3JtYWxpemluZyB0aGUgZmFjdCB0aGF0IG5vIG9uZSBrbm93cyBpdCBhbGwgKG5vdCBldmVuIHlvdSEpLCBldmVyeW9uZSBtYWtlcyBtaXN0YWtlcywgYW5kIGxlYXJuaW5nIGlzIGEgbGlmZWxvbmcgcHJvY2VzcyBoYXMgcHJvZm91bmQgaW1wYWN0cy48L3A+Jm1kYXNoOyBKZXNzZSBNb3N0aXBhayAoQGtpZXJpc2kpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20va2llcmlzaS9zdGF0dXMvMTA2ODQ5NjIyOTQzOTU5ODU5Mj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5Ob3ZlbWJlciAzMCwgMjAxODwvYT48L2Jsb2NrcXVvdGU+IDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4gCgoKPGJyPgoKUGFyYSBmaW5hbGl6YXIsIHVuIGhpbG8gZGUgVHdlZXRlciBjb24gbXV1dXV1dWNob3MgZXJyb3JlczoKCgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5BIHNtYWxsIHNhbXBsZSBvZiBkYXRhIHNjaWVuY2UgbWlzdGFrZXMgSSYjMzk7dmUgbWFkZSBzbyBmYXIg8J+RhyA8YSBocmVmPSJodHRwczovL3QuY28vRWVpVm1tQW51SiI+cGljLnR3aXR0ZXIuY29tL0VlaVZtbUFudUo8L2E+PC9wPiZtZGFzaDsgQ2FpdGxpbiBIdWRvbvCfkanwn4+8CvCfkrsgKEBiZWVvbmFwb3N5KSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2JlZW9uYXBvc3kvc3RhdHVzLzExMjI5NjQ1MDQ5MTA5MzgxMjE/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXByaWwgMjksIDIwMTk8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+IAoKPGJyPgoKCiMjIDQuIENpZW5jaWEgZGUgZGF0b3MgZW4gRWNvbm9tw61hCgpFdmlkZW50ZW1lbnRlIHRvZG8gZXN0ZSBjYW1iaW8gdGVjbm9sw7NnaWNvIGFjZWxlcmFkbyBhbCBxdWUgYXNpc3RpbW9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEsIHkgcXVlIG11Y2hhcyB2ZWNlcyBlc3TDoSBhc29jaWFkbyBhbCBNTC9ETCwgaGEgcHJvdm9jYWRvIHkgcHJvdm9jYXLDoSBncmFuZGVzIGNhbWJpb3MgdGFudG8gZW4gbGEgZWNvbm9tw61hIHJlYWwgY29tbyBlbiBsYSBjaWVuY2lhIGVjb27Ds21pY2EuIFVuYSBwYW5vcsOhbWljYSBkZSB0cmFiYWpvcyBxdWUgYW5hbGl6YW4gbGFzIGltcGxpY2FjaW9uZXMgZGUgZXN0b3MgY2FtYmlvcyBlbiBsYSBjaWVuY2lhIGVjb27Ds21pY2EgcHVlZGUgdmVyc2UgZW4gW0Fuw6FsaXNpcyBlY29uw7NtaWNvIGRlIGxhIHJldm9sdWNpw7NuIGRpZ2l0YWxdKGh0dHBzOi8vYmxvZy5mdW5jYXMuZXMvd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTEvRWNvbm9taWMtQW5hbHlzaXMtb2YtdGhlLURpZ2l0YWwtUmV2b2x1dGlvbi5wZGYpLgoKClVubyBkZSBsb3MgZWZlY3RvcyBtw6FzIGV2aWRlbnRlcyBjb25zaXN0ZSBlbiBxdWUgbGFzIGlubm92YWNpb25lcyB0ZWNub2zDs2dpY2FzIGFzb2NpYWRhcyBhbCBNTCBzZWd1cmFtZW50ZSBjYW1iaWFyw6FuIHJhZGljYWxtZW50ZSwgc2kgZXMgcXVlIG5vIGxvIGhhbiBoZWNobyB5YSwgbXVjaG9zIHNlY3RvcmVzIGVjb27Ds21pY29zOyBwb3IgZWplbXBsbyBlbCB0cmFuc3BvcnRlIG8gbGEgYmFuY2EsIHBlcm8gdGFtYmnDqW4gbXVjaG9zIG90cm9zIGNvbW8gbG9zIHNlZ3Vyb3MsIHNlcnZpY2lvcyBhdWRpb3Zpc3VhbGVzLCBsYSB2ZW50YSBhbCBwb3IgbWVub3IsIGxhIHNhbmlkYWQsIGV0Yy4uLgoKT3RybyBkZSBsb3MgY2FtYmlvcyBtw6FzIGV2aWRlbnRlcyBjb25zaXN0ZSBlbiBxdWUgYWN0dWFsbWVudGUgbGFzIHByaW5jaXBhbGVzIGNvcnBvcmFjaW9uZXMgdHJhbnNuYWNpb25hbGVzLCBxdWUgYW50ZXMgcGVydGVuZWPDrWFuIHByaW5jaXBhbG1lbnRlIGEgbG9zIHNlY3RvcmVzIGVuZXJnw6l0aWNvIHkgZmluYW5jaWVybywgYWhvcmEgdGllbmVuIHVuIGZ1ZXJ0ZSBjb21wb25lbnRlIHRlY25vbMOzZ2ljbywgbGFzICoqR0FGQSoqLCB1biBhY3LDs25pbW8gcGFyYSBoYWNlciByZWZlcmVuY2lhIGEgbGFzIGN1YXRybyBncmFuZGVzIGNvbXBhw7HDrWFzIHRlY25vbMOzZ2ljYXM6IEdvb2dsZSwgQW1hem9uLCBGYWNlYm9vayB5IEFwcGxlLgoKT3RyYSBkZSBsb3MgY2FtYmlvcyBzaWduaWZpY2F0aXZvcyBxdWUgaGFuIHNpZG8gcHJvcGljaWFkb3MgcG9yIGxhcyBudWV2YXMgdGVjbm9sb2fDrWFzIGVzIGxhIGxsYW1hZGEgKiplY29ub23DrWEgY29sYWJvcmF0aXZhKiogYWwgcXVlIGVzdMOhbiBhc29jaWFkYXMgZW1wcmVzYXMgY29tbyBCbGFCbGFDYXIsIEFpcmJuYiwgLi4uCgpPdHJvIGNhbWJpbyBldmlkZW50ZSBjb25zaXN0ZSBlbiBxdWUgYWhvcmEgbWlzbW8gaGF5IHVuYSBlY29ub23DrWEgZGUgbG9zIGRhdG9zLiBMb3MgZGF0b3Mgc2UgaGFuIGNvbnZlcnRpZG8gZW4gbWF0ZXJpYSBwcmltYSwgY2FwYXogZGUgY3JlYXIgdmFsb3IsIGZ1ZW50ZSBkZSBpbm5vdmFjacOzbiB5IHNlcnZpY2lvcyBudWV2b3MuIFBhcmEgdW5hIHBhbm9yw6FtaWNhIGRlIGVzdMOhIGVjb25vbcOtYSBkZSBsb3MgZGF0b3MgcHVlZGUgdmVyc2UgbGEgcHVibGljYWNpw7NuIFtFY29ub23DrWEgZGUgbG9zIERhdG9zLiBSaXF1ZXphIDQuMF0oaHR0cHM6Ly93d3cuZnVuZGFjaW9uY2Fyb2xpbmEuZXMvd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTEvTGlicm8tRWNvbm9taWEtZGUtbG9zLURhdG9zLU9udGl2ZXJvcy5wZGYpLgoKClNlIGhhYmxhIGluY2x1c28gZGUgcXVlIGVzdGFtb3MgaW5tZXJzb3MgZW4gdW5hICoqY3VhcnRhIHJldm9sdWNpw7NuIGluZHVzdHJpYWwqKi4gRWwgY29uY2VwdG8gZGUgY3VhcnRhIHJldm9sdWNpw7NuIGluZHVzdHJpYWwgZnVlIGFjdcOxYWRvIHBvciBLbGF1cyBTY2h3YWIgZnVuZGFkb3IgZGVsIEZvcm8gRWNvbsOzbWljbyBNdW5kaWFsIGVuIGVsIGNvbnRleHRvIGRlIGxhIGVkaWNpw7NuIGRlbCBGb3JvIEVjb27Ds21pY28gTXVuZGlhbCAyMDE2IHkgdW5hIGRlIHN1cyBjYXJhY3RlcsOtc3RpY2FzIGVzIGxhIHV0aWxpemFjacOzbiBkZSBsYSBJQS9NTC9ETCBwYXJhIGxhIGF1dG9tYXRpemFjacOzbiBkZSB0YXJlYXMgcXVlIGFudGVzIHPDs2xvIGVzdGFiYW4gYWwgYWxjYW5jZSBkZSBsb3MgaHVtYW5vcy4gVW5hIGRlIGxhcyBjb25zZWN1ZW5jaWFzIG3DoXMgZGlyZWN0YXMgZGUgbGEgYXV0b21hdGl6YWNpw7NuIHNlcsOhIGVsICoqZGVzcGxhemFtaWVudG8gZGUgZW1wbGVvcyoqLCBubyBzw7NsbyBtYW51YWxlcywgcG9yIGxhcyBtYXF1aW5hcy9hbGdvcml0bW9zLgoKCkRlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIGRlIGxhIGNpZW5jaWEsIGxhIGFjdHVhbCBhYnVuZGFuY2lhIGRlIGRhdG9zLCB2YSBhIHRlbmVyIGltcGxpY2FjaW9uZXMgZGlyZWN0YXM6CgotICJEZSBsYSBtaXNtYSBmb3JtYSBxdWUgZWwgdGVsZXNjb3BpbyB5IGVsIG1pY3Jvc2NvcGlvIHBlcm1pdGllcm9uIHZlciBlbCBlc3BhY2lvIHkgbGFzIGPDqWx1bGFzLCBsYXMgbnVldmFzIHTDqWNuaWNhcyBkZSByZWNvcGlsYWNpw7NuIHkgYW7DoWxpc2lzIGRlIGRhdG9zIGF5dWRhcsOhbiBhIHZlciBlbCBzZW50aWRvIGRlIG51ZXN0cm8gbXVuZG8gZGUgdW5hIGZvcm1hIHF1ZSBhcGVuYXMgaW50dWltb3MiLiAKCi0gImVsIGNhbWJpbyBjdWFudGl0YXRpdm8gbm8gZXMgbG8gw7puaWNvIGltcG9ydGFudGUsIGVzIGVsIGN1YWxpdGF0aXZvOiB1bmEgcGVsw61jdWxhIGVzIGRpZmVyZW50ZSBkZSB1bmEgcGludHVyYSwgdGFtYmnDqW4gY3VhbmRvIHRyYWJhamFzIGNvbiBtdWNob3MgZGF0b3Mgc2UgcHVlZGVuIGhhY2VyIG90cmFzIGNvc2FzOyBlcyBkZWNpciwgYWwgY2FtYmlhciBsYSBjYW50aWRhZCBjYW1iaWFtb3MgbGEgZXNlbmNpYSIuCgpIYSBzdXJnaWRvLCBpbmNsdXNvLCB1bmEgbnVldm8gdMOpcm1pbm86IGVsIFtkYXRhw61zbW9dKGh0dHBzOi8vZXMud2lraXBlZGlhLm9yZy93aWtpL0RhdGElQzMlQURzbW8pLiBQYXJhIHVuIOKAnGRhdGFpc3Rh4oCdLCBlbiB1biBtdW5kbyBjb24gY2FkYSB2ZXogbWF5b3IgY29tcGxlamlkYWQsIGNvbmZpYXIgZW4gbG9zIGRhdG9zIHB1ZWRlIHJlZHVjaXIgbG9zIHNlc2dvcyBjb2duaXRpdm9zIHkgZGVzY3VicmlyIHBhdHJvbmVzIGRlIGNvbXBvcnRhbWllbnRvLiBTZWfDum4gZWwgZmlsw7Nzb2ZvIHkgZW5zYXlpc3RhIHN1cmNvcmVhbm8gQnl1bmctQ2h1bCBIYW4sIOKAnGVsIGJpZyBkYXRh4oCdIGRlYmUgbGliZXJhciBlbCBjb25vY2ltaWVudG8gZGUgbGEgc3ViamV0aXZpZGFkLiBFbCB0w6lybWlubyBkYXRhaXNtbyBmdWUgcG9wdWxhcml6YWRvIGVuIGVsIGxpYnJvIEhvbW8gRGV1cyBkZSBIYXJhcmkuIEVsICJkYXRhaXNtbyIgZXN0w6EgZW4gY2llcnRvIG1vZG8gcmVsYWNpb25hZG8gY29uIGxhIGlkZWEsIHF1aXrDoSB1biBwb2NvIGV4YWdlcmFkYSwgZGUgcXVlIGVzdMOhIHN1cmdpZW5kbyB1biBjdWFydG8gcGFyYWRpZ21hIGNpZW50w61maWNvIGJhc2FkbyBlbiBlbCB1c28gaW50ZW5zaXZvIGRlIGRhdG9zLiBFc3TDoSBpZGVhIHNlIGF0cmlidXllIGEgSmltIEdyYXksIGdhbmFkb3IgZGVsIHByZW1pbyBUdXJpbmcuIEdyYXkgYWZpcm1hIHF1ZSAidG9kbyBsbyByZWxhY2lvbmFkbyBjb24gbGEgY2llbmNpYSBlc3TDoSBjYW1iaWFuZG8gZGViaWRvIGFsIGltcGFjdG8gZGUgbGEgdGVjbm9sb2fDrWEgZGUgbGEgaW5mb3JtYWNpw7NuIHkgZWwgZGlsdXZpbyBkZSBkYXRvcyIgeSBxdWUgc2UgZXN0w6EgY29uZm9ybWFuZG8gdW4gY3VhcnRvIHBhcmFkaWdtYSBjaWVudMOtZmljbyB0cmFzIGxvcyB0cmVzIHByaW1lcm9zIChlbXDDrXJpY28sIHRlw7NyaWNvLCBjb21wdXRhY2lvbmFsKS4gRXN0YSBpZGVhcyBzZSBkZXNhcnJvbGxhbiBlbiBbVGhlIEZvdXJ0aCBQYXJhZGlnbTogRGF0YS1pbnRlbnNpdmUgU2NpZW50aWZpYyBEaXNjb3ZlcnldKGh0dHBzOi8vYm9va3MuZ29vZ2xlLmVzL2Jvb2tzP2lkPW9Hc19BUUFBSUFBSiZyZWRpcl9lc2M9eSkuIFVuYSB0cmFkdWNjacOzbiBhbCBjYXN0ZWxsYW5vIHB1ZWRlIGVuY29udHJhcnNlIFthcXXDrV0oaHR0cDovL3d3dy51YW0ubXgvY2FzYWRlbGlicm9zYWJpZXJ0b3MvbGlicm9zZWxlY3Ryb25pY29zLzR0b3BhcmFkaWdtYS80dG9wYXJhZGlnbWEucGRmKS4KClNpbiBlbWJhcmdvLCBoYXkgcXVlIHJlY29yZGFyLCBjb21vIHNlIGhhY2UgZW4gW2VzdGUgcG9zdF0oaHR0cHM6Ly9zaW1wbHlzdGF0aXN0aWNzLm9yZy8yMDE2LzA2LzAzL2RlZmluaW5nLXN1Y2Nlc3MvKSBkZSBKZWZmIGxlZWssIHF1ZSB1biByZXN1bHRhZG8gZXhpdG9zbyBkZSB1biBhbsOhbGlzaXMgZGUgZGF0b3MgcHVlZGUgc2VyIHF1ZSBsb3MgZGF0b3Mgbm8gcGVybWl0ZW4gcmVzb2x2ZXIgbGEgcHJlZ3VudGEuIEVzdGEgbWlzbWEgaWRlYSBzdWJ5YWNlIGVuIGVzdGUgdHdlZXQ6CgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLmFzcCA9IDcvOX0KdHdlZXRybWQ6OnR3ZWV0X2VtYmVkKCJodHRwczovL3R3aXR0ZXIuY29tL3NUZWFtVHJhZW4vc3RhdHVzLzEzNjEwNjc0MDg2NjA3ODMxMTUiLCB0aGVtZSA9ICJsaWdodCIsIGFsaWduID0gImNlbnRlciIsIGRudCA9IFRSVUUsIHBsYWluID0gVFJVRSwgbWF4d2lkdGggPSA0MDApCmBgYAoKCgo8YnI+CgoKIyMjIyDCv0FmZWN0YXLDoSB0b2RvIGVzdG8gYSBsYSBFY29ub23DrWEvRWNvbm9tZXRyw61hPwoKVG9kb3Mgdm9zb3Ryb3Mgc2Fiw6lpcyBxdWUgbGEgRWNvbm9tw61hIGVzIHVuYSBkZSBsYXMgY2llbmNpYXMgc29jaWFsZXMgZW4gbGEgcXVlIG3DoXMgc2UgdXRpbGl6YSBsYSBFc3RhZMOtc3RpY2E7IGRlIGhlY2hvIGxhIEVjb25vbWV0csOtYSBlcyBwcmVjaXNhbWVudGUgZXNvLCB1bmEgcmFtYSBkZSBsYSBFY29ub23DrWEgcXVlIHV0aWxpemEgbcOpdG9kb3MgZXN0YWTDrXN0aWNvcyBlbiBlbCBlc3R1ZGlvIGRlIGxvcyBmZW7Ds21lbm9zIGVjb27Ds21pY29zLgoKTGEgcmVzcHVlc3RhIGEgbGEgcHJlZ3VudGEgYW50ZXJpb3IgZXMgcXVlIHPDrSwgbm8gc8OpIGN1YW5kbyBuaSBjb21vLCBwZXJvIGVzIGV2aWRlbnRlIHF1ZSBsYSBkaXNwb25pYmlsaWRhZCBkZSBudWV2b3MgZGF0b3MsIHkgZWwgYXVnZSBkZSBsb3MgbcOpdG9kb3MgZXN0YWTDrXN0aWNvcyBhc29jaWFkb3MgYWwgTUwvREwsIHRlbmRyw6FuIHF1ZSBpciBpbmNvcnBvcsOhbmRvc2UgcG9jbyBhIHBvY28gYSBudWVzdHJhIGNpZW5jaWEuIEFiYWpvIGFsZ3VuYXMgcmVmZXJlbmNpYXMgc29icmUgZWxsbzoKCi0gW1RoZSBFY29ub21pY3Mgb2YgQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2U6IEFuIEFnZW5kYV0oaHR0cHM6Ly93d3cubmJlci5vcmcvYm9va3MvYWdyYS0xKQoKLSBbSUEgeSBFY29ub23DrWFdKGh0dHBzOi8vd3d3LmZ1bmNhcy5lcy9hcnRpY3Vsb3MvYXBsaWNhY2lvbi1kZWwtYXByZW5kaXphamUtYXV0b21hdGljby1hbC1hbmFsaXNpcy1lY29ub21pY28teS1sYS1mb3JtdWxhY2lvbi1kZS1wb2xpdGljYXMvKQoKLSBbSUEgeSBtZXJjYWRvcyBmaW5hbmNpZXJvc10oaHR0cHM6Ly93d3cuZnVuY2FzLmVzL2FydGljdWxvcy9hcGxpY2FjaW9uZXMtZGUtbGEtaW50ZWxpZ2VuY2lhLWFydGlmaWNpYWwtYS1sb3MtbWVyY2Fkb3MtZmluYW5jaWVyb3MtbGEtZ2VzdGlvbi1kZS1sYS1pbmZvcm1hY2lvbi1lbi1iYW5jYS1kZS1sYXMtZmluYW56YXMtZGVsLWNvbXBvcnRhbWllbnRvLWEtbGEtaW50ZWxpZ2VuY2lhLWFydGlmaWNpYWwtMjAxOS1uLTE2Mi8pCgotIFtCaWcgRGF0YSBpbiBlY29ub21pY3NdKGh0dHBzOi8vd29sLml6YS5vcmcvYXJ0aWNsZXMvYmlnLWRhdGEtaW4tZWNvbm9taWNzL2xvbmcpCgotIFtNYWNoaW5lIExlYXJuaW5nOiBBbiBBcHBsaWVkIEVjb25vbWV0cmljIEFwcHJvYWNoXShodHRwczovL3d3dy5hZWF3ZWIub3JnL2FydGljbGVzP2lkPTEwLjEyNTcvamVwLjMxLjIuODcpCgotIFtUaGUgSW1wYWN0IG9mIE1hY2hpbmUgTGVhcm5pbmcgb24gRWNvbm9taWNzXShodHRwczovL3d3dy5uYmVyLm9yZy9jaGFwdGVycy9jMTQwMDkucGRmKQoKLSBbQmlnIERhdGE6IE5ldyBUcmlja3MgZm9yIEVjb25vbWV0cmljc10oaHR0cHM6Ly93d3cuYWVhd2ViLm9yZy9hcnRpY2xlcz9pZD0xMC4xMjU3L2plcC4yOC4yLjMpCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjxicj4KCgojIyA1LiBJbnZlc3RpZ2FjacOzbiByZXByb2R1Y2libGUgeSBzb2Z0d2FyZSBsaWJyZQoKQ2FkYSB2ZXogbcOhcyAgc2Ugb3llIGhhYmxhciBkZSBsYSBJbnZlc3RpZ2FjacOzbiBSZXByb2R1Y2libGUgKElSKSBvICBSZXByb2R1Y2libGUgUmVzZWFyY2ggKFJSKSBlbiBpbmdsw6lzLiBDcmVvIHkgZXNwZXJvIHF1ZSBlbiBwb2NvIHRpZW1wbyBzZSBjb252aWVydGEgZW4gZWwgZXN0w6FuZGFyLiAKClNlZ8O6biBsYSBXaWtpcGVkaWEgZXNwYcOxb2xhLCAgCgo+IExhIHJlcHJvZHVjaWJpbGlkYWQgZXMgbGEgY2FwYWNpZGFkIGRlIHVuYSBwcnVlYmEgbyBleHBlcmltZW50byBkZSBzZXIgcmVwcm9kdWNpZG8gbyByZXBsaWNhZG8gcG9yIG90cm9zLCBlbiBwYXJ0aWN1bGFyLCBwb3IgbGEgY29tdW5pZGFkIGNpZW50w61maWNhLiBMYSByZXByb2R1Y2liaWxpZGFkIGVzIHVubyBkZSBsb3MgcGlsYXJlcyBkZWwgbcOpdG9kbyBjaWVudMOtZmljbywgc2llbmRvIGxhIGZhbHNhYmlsaWRhZCBlbCBvdHJvLiAuLi4gCgo+IC4uLiBlbiBtdWNoYXMgZGlzY2lwbGluYXMsIHNvYnJlIHRvZG8gZW4gYXF1ZWxsYXMgcXVlIGltcGxpY2FuIGVsIHVzbyBkZSBlc3RhZMOtc3RpY2EgeSBwcm9jZXNvcyBjb21wdXRhY2lvbmFsZXMsIHNlIGVudGllbmRlIHF1ZSB1biBlc3R1ZGlvIGVzIHJlcHJvZHVjaWJsZSBzaSBlcyBwb3NpYmxlIHJlY3JlYXIgZXhhY3RhbWVudGUgdG9kb3MgbG9zIHJlc3VsdGFkb3MgYSBwYXJ0aXIgZGUgbG9zIGRhdG9zIG9yaWdpbmFsZXMgeSBlbCAqKmPDs2RpZ28gaW5mb3Jtw6F0aWNvKiogZW1wbGVhZG8gcGFyYSBsb3MgYW7DoWxpc2lzLgoKCkVuIGVzdGUgW2xpYnJvXShodHRwczovL3d3dy5wcmFjdGljZXJlcHJvZHVjaWJsZXJlc2VhcmNoLm9yZy8pIHNlw7FhbGFuIHF1ZSBsYSByZXByb2R1Y2liaWxkYWQgZXN0w6EgbGlnYWRhIMOtbnRpbWFtZW50ZSBhbCBtw6l0b2RvIGNpZW50w61maWNvIGNvbW8gaWx1c3RyYSBlbCBoZWNobyBkZSBxdWUgZWwgbGVtYSBkZSBsYSBbUm95YWwgU29jaWV0eV0oaHR0cHM6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvUm95YWxfU29jaWV0eSkgdW5hIGRlIGxhcyBzb2NpZWRhZGVzIGNpZW50w61maWNhcyBtw6FzIGFudGlndWFzIGRlbCBtdW5kbyBlcyAqIk51bGxpdXMgaW4gdmVyYmEiKiBxdWUgcXVpZXJlIGRlY2lyIG3DoXMgbyBtZW5vcyAibm8gY3JlYXMgZW4gbGEgcGFsYWJyYSBkZSBuYWRpZSIuIEVuIGVsIGNvbnRleHRvIGNpZW50w61maWNvIHF1aWVyZSBkZWNpciBxdWUgbGFzIGFmaXJtYWNpb25lcyBvIGRlc2N1YnJpbWllbnRvcyBjaWVudMOtZmljb3MgZGViZW4gc2VyIHByb2JhZG9zIG1lZGlhbnRlIGVsIG3DqXRvZG8gY2llbnTDrWZpY28uCgoKQSBtZW51ZG8gc2UgaGFibGEgZGUgbGEgZXhpc3RlbmNpYSBkZSB1bmEgW2NyaXNpcyBkZSByZXByb2R1Y2liaWxpZGFkXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9DcmlzaXNfZGVfcmVwbGljYWNpJUMzJUIzbikgcmVmaXJpw6luZG9zZSBjb24gZWxsbyBhIGxhIGlkZWEgZGUgcXVlIGxvcyByZXN1bHRhZG9zIGRlIG11Y2hvcyBkZSBsb3MgZXhwZXJpbWVudG9zIGNpZW50w61maWNvcyBzb24gZGlmw61jaWxlcyBvIGltcG9zaWJsZXMgYSByZXBsaWNhciBlbiBpbnZlc3RpZ2FjaW9uZXMgcG9zdGVyaW9yZXMuIFVubyBkZSBsb3MgY2Fzb3MgbcOhcyBzb25hZG9zLCBhc29jaWFkb3MgYSBlc3RhIGlkZWEsIGVzIGVsIGRlIFtSZWluaGFydCB5IFJvZ29mZl0oaHR0cHM6Ly93d3cud2Vmb3J1bS5vcmcvYWdlbmRhLzIwMTMvMDQvdGhlLXJlaW5oYXJ0LWFuZC1yb2dvZmYtZGViYWNsZS8pLiAKCgpMYSBpZGVhIGRlIHF1ZSBwdWVkZSBleGlzdGlyIHVuYSBjcmlzaXMgZGUgcmVwcm9kdWNpYmlsaWRhZCwganVudG8gYWwgaGVjaG8gZGUgcXVlIGxhcyBudWV2YXMgdGVjbm9sb2fDrWFzIGhhY2VuIGNhZGEgdmV6IG3DoXMgc2VuY2lsbG8gcXVlIGxvcyBhcnTDrWN1bG9zIGUgaW52ZXN0aWdhY2lvbmVzIGNpZW50w61maWNhcyBzZWFuIHJlcHJvZHVjaWJsZXMsIGhhIHByb3ZvY2FkbyBjYW1iaW9zIGltcG9ydGFudGVzIGVuIGxhIHBvbMOtdGljYSBkZSBhc29jaWFjaW9uZXMgeSByZXZpc3RhcyBjaWVudMOtZmljYXMsIGNvbW8gbGEgZGUgbGEgW0FtZXJpY2FuIEVjb25vbWljIEFzc29jaWF0aW9uXShodHRwczovL3d3dy5hZWF3ZWIub3JnL2pvdXJuYWxzL3BvbGljaWVzL2RhdGEtY29kZS8pIHNlZ8O6biBsYSBjdWFsLCBzw7NsbyBzZSBwdWJsaWNhcsOhbiBhcnTDrWN1bG9zIGVuIGxvcyBxdWU6IAoKPiAidGhlIGRhdGEgYW5kIGNvZGUgdXNlZCBpbiB0aGUgYW5hbHlzaXMgYXJlIGNsZWFybHkgYW5kIHByZWNpc2VseSBkb2N1bWVudGVkLCBhbmQgYWNjZXNzIHRvIHRoZSBkYXRhIGFuZCBjb2RlIGlzIGNsZWFybHkgYW5kIHByZWNpc2VseSBkb2N1bWVudGVkIGFuZCBpcyBub24tZXhjbHVzaXZlIHRvIHRoZSBhdXRob3JzIi4KCgpbQXF1w61dKGh0dHBzOi8vd3d3LmdsZWVjaC5vcmcvcHN5Y2gpIHB1ZWRlcyBlbmNvbnRyYXIgdW4gbGlzdGFkbyBkZSByZXN1bHRhZG9zIGRlIHBhcGVycyBjaWVudMOtZmljb3MgZW4gUHNpY29sb2fDrWEgcXVlIGhhbiB0ZW5pZG8gcXVlIHNlciByZXZpc2l0YWRvcyB0cmFzIGVzdHVkaW9zIHBvc3RlcmlvcmVzLgoKCjxicj4KClBhcmEgcXVlIHVuIGFuw6FsaXNpcyBjb24gZGF0b3Mgc2VhIHJlcHJvZHVjaWJsZSwgbm8gc8OzbG8gZXMgbmVjZXNhcmlvIHF1ZSBsb3MgZGF0b3MgdXRpbGl6YWRvcyBoYW4gZGUgc2VyIGFjY2VzaWJsZXMsIHNpbm8gcXVlIGPDs21vIG3DrW5pbW8gZGViZXLDrWE6ICAgCgotIHByb3BvcmNpb25hciBsb3MgZGF0b3Mgb3JpZ2luYWxlcyAob2J2aWFtZW50ZSBkb2N1bWVudGFyIGxhcyBmdWVudGVzKSAKICAgIAotIGVmZWN0dWFyIHRvZG8gZWwgcHJvY2VzbyBhIHRyYXbDqXMgZGUgY8OzZGlnbyAoc2NyaXB0cykgIAogICAgCi0gZG9jdW1lbnRhciBlbCBwcm9jZXNvIGRlIHRyYWJham8gKHBvciBlamVtcGxvIGVsIG9yZGVuIGVuIHF1ZSBzZSBlamVjdXRhcm9uIGxvcyBzY3JpcHRzKSAgIAoKCjxicj4KCkNvbW8gdmVpcywgdW5vIGRlIGxvcyByZXF1aXNpdG9zIHBhcmEgaGFjZXIgaW52ZXN0aWdhY2nDs24gcmVwcm9kdWNpYmxlIGVzIGVmZWN0dWFyIHRvZG8gZWwgcHJvY2VzbyBtZWRpYW50ZSBzY3JpcHRzOyBlcyBkZWNpciwgaGF5IHF1ZSBzYWJlciBwcm9ncmFtYXIuIE1pcmEgbG8gcXVlIGRpY2UgRnJhbmsgSGFycmVsbDoKCgo+IENhbiBvbmUgYmUgYSBnb29kIGRhdGEgYW5hbHlzdCB3aXRob3V0IGJlaW5nIGEgaGFsZi1nb29kIHByb2dyYW1tZXI/IFRoZSBzaG9ydCBhbnN3ZXIgdG8gdGhhdCBpcywg4oCYTm8u4oCZIFRoZSBsb25nIGFuc3dlciB0byB0aGF0IGlzLCDigJhOby7igJkgICAg4oCURnJhbmsgSGFycmVsbCAgIGh0dHBzOi8vaG9tZXJoYW51bWF0LmdpdGh1Yi5pby9yLW5vdGVzL2ZyYW1lcy5odG1sCgoKCjxicj4KCgpIYWNlciB1bmEgaW52ZXN0aWdhY2nDs24gY29tcGxldGFtZW50ZSByZXByb2R1Y2libGUgZXMgQ09TVE9TTzsgZGUgaGVjaG8sIGhheSBjdXJzb3MgY29tcGxldG9zIHNvYnJlIGVsIHRlbWEsIHBvciBlamVtcGxvIFtlc3RlXShodHRwOi8va2Jyb21hbi5vcmcvVG9vbHM0UlIvKSwgeSBtdWNob3MgcHJveWVjdG9zIHF1ZSB0cmF0YW4gZGUgcHJvbW92ZXJsYTsgcG9yIGVqZW1wbG8gW2VzdGVdKGh0dHBzOi8vcm9wZW5zY2kub3JnLykgcXVlIHByZXRlbmRlIGZhdm9yZWNlciBlbCB1c28gZGUgZGF0b3MgYWJpZXJ0b3MgYSB0cmF2w6lzIGRlIFIuIEFmb3J0dW5hZGFtZW50ZSwgY2FkYSB2ZXogaGF5IG3DoXMgaGVycmFtaWVudGFzIHF1ZSBmYWNpbGl0YW4gaGFjZXIgSVI6IE1ha2UsIEdpdCwgRG9ja2VyLCBQYW5kb2MsIEtuaXRyLCBtYXJrZG93biAuLi4KCgoKSGFjZXIgdW5hIGludmVzdGlnYWNpw7NuIChjb21wbGV0YW1lbnRlKSByZXByb2R1Y2libGUgbm8gc2llbXByZSBlcyBwb3NpYmxlOyBPSywgUEVSTyBhbCBtZW5vcyBhY2VyY2Fyc2UgLi4uIHVuIHBvY28uIE5vc290cm9zLCBlbiBlbCBjdXJzbywgaGFyZW1vcyBhbsOhbGlzaXMgY29uIGRhdG9zIGUgaW50ZW50YXJlbW9zIHF1ZSBlc3RvcyBzZWFuIHJlcHJvZHVjaWJsZXMuIEVuIGVsIGVudG9ybm8gKipSKiogY2FkYSB2ZXogZXMgbcOhcyBmw6FjaWwgYWNlcmNhcnNlIGFsIGlkZWFsIGRlIGxhIElSLiBQYXJhIGVsbG8gZW4gZWwgY3Vyc28gaGFyZW1vcyBzaWVtcHJlIG51ZXN0cm9zIGFuw6FsaXNpcyBjb24gc2NyaXB0cyBkZSBSLiBDb25jcmV0YW1lbnRlIHV0aWxpemFyZW1vcyAqKlJTdHVkaW8qKiBwYXJhIGhhY2VyIGFuw6FsaXNpcyBkZSBkYXRvcywgZ2VzdGlvbmFuZG8gbnVlc3Ryb3MgYW7DoWxpc2lzIGEgdHJhdsOpcyBkZSAqKlJwcm9qZWN0cyoqIHkgZ2VuZXJhcmVtb3MgbG9zIGluZm9ybWVzIHkgcmVzdWx0YWRvcyBkZWwgYW7DoWxpc2lzIGNvbiBkb2N1bWVudG9zICoqUm1hcmtkb3duKipeW0VuIHNlZ3VpZGEgZXhwbGljYXJlbW9zIHF1ZSBzb24gdG9kYXMgZXN0YXMgcGFsYWJyYXMgcXVlIGVtcGllemFuIHBvciByOiBSLCBSU3R1ZGlvLCBScHJvamVjdCB5IFJtYXJrZG93bl0uIEVzdG9zIGRvY3VtZW50b3MgUm1hcmtkb3duIG8gKipgLlJtZGAqKiBzb24gcmVwcm9kdWNpYmxlcy4gRW4gYnJldmUgdmVyZW1vcyBxdWUgc2lnbmlmaWNhIGVzdG8geSBzdXMgdXRpbGlkYWRlcyB0YW50byBwYXJhIGxhIGludmVzdGlnYWNpw7NuIGNvbW8gcGFyYSBsYSBkb2NlbmNpYS4gRW4gW2VzdGFzIHRyYW5zcGFyZW5jaWFzXShodHRwczovL21yc2xhdmluaWFnLmdpdGh1Yi5pby94YXJpbmdhbl9wcmVzZW50YXRpb25zL3JsYWRpZXNfcHJlc2VudGF0aW9uXzIyX01heV8yMDE5Lmh0bWwpIG5vcyBjdWVudGFuIGNvbW8gUiB5IHN1IGVjb3Npc3RlbWEgZmFjaWxpdGFuIGVsIGhhY2VyIGludmVzdGlnYWNpw7NuIG8gYW7DoWxpc2lzIHJlcHJvZHVjaWJsZXMuIAoKCkxhIHJhesOzbiBwYXJhIGhhY2VyIGxvcyBhbsOhbGlzaXMgcmVwcm9kdWNpYmxlcyBubyBzw7NsbyBlcyBjdW1wbGlyIGNvbiBsb3MgZXN0w6FuZGFyZXMgY2llbnTDrWZpY29zLCBxdWUgdGFtYmnDqW4sIHNpbm8gdGFtYmnDqW4gaGF5IHVuIGludGVyw6lzIHBlcnNvbmFsIHBhcmEgZWwgYW5hbGlzdGEuIFBhcmEgZW50ZW5kZXJsbyBwdWVkZXMgdmVyIGVsIHNpZ3VpZW50ZSBbdmlkZW8gZGUgMSc0NCcnXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXMzSmxkS29BMHp3JmZlYXR1cmU9eW91dHUuYmUpIHF1ZSBtdWVzdHJhIHVuYSBkZSBsYXMgcHJpbmNpcGFsZXMgdmVudGFqYXMgZGUgbGEgSVIsIHkgc2lubyB5YSBsbyBleHBlcmltZW50YXJlaXMgY3VhbmRvIGhhZ2Ftb3MgaGVjaG8gZWwgcHJpbWVyIGFuw6FsaXNpcyB5IG9zIGRpZ2EgcXVlIG1lIGhlIGVxdWl2b2NhZG8gY29uIGxvcyBkYXRvcywgcXVlIG9zIGhhYsOtYSBkYWRvIGxhIHZlcnNpw7NuIGFudGlndWEgZGUgbG9zIGRhdG9zLiBPcyB2YWlzIGEgcmXDrXIgc2kgbm8gaGFiw6lpcyBoZWNobyB2dWVzdHJvIGFuw6FsaXNpcyByZXByb2R1Y2libGUuCgoKRW4gcGFsYWJyYXMgZGUgYEBUaWZmYW55VGltYmVyc2A6IAoKPiBOb3RoaW5nIGxpa2UgZG9pbmcgc29tZXRoaW5nIG1hbnVhbGx5IDYwKyB0aW1lcyBhbmQgbWFraW5nIG1pc3Rha2VzIHRvIHJlaW5mb3JjZSB0aGUgaWRlYSAiYXV0b21hdGUgYWxsIHRoZSB0aGluZ3MiLiAKCgo8YnI+CgojIyMgU29mdHdhcmUgbGlicmUKCgpFbCBzb2Z0d2FyZSBsaWJyZSBlcyBkZSB2aXRhbCBpbXBvcnRhbmNpYSBlbiBlbCBkZXNhcnJvbGxvIGRlIGxhIGludmVzdGlnYWNpw7NuIHJlcHJvZHVjaWJsZS4gUGllbnNhIHF1ZSBwb3IgbXVjaG8gcXVlIHVuIGludmVzdGlnYWRvciBoYWdhIGFjY2VzaWJsZXMgc3VzIGRhdG9zIHkgc3UgY8OzZGlnbywgc2kgdXRpbGl6YSB1biBzb2Z0d2FyZSBwcml2YXRpdm8sIGVuIHJlYWxpZGFkIHN1IGFuw6FsaXNpcyBubyBlcyByZXByb2R1Y2libGUsIHPDs2xvIGxvIHNlcsOhIHBhcmEgYXF1ZWxsb3MgcXVlIHB1ZWRhbiBwYWdhciBsYSBsaWNlbmNpYV5bRWwgc29mdHdhcmUgbGlicmUgbyBjw7NkaWdvIGFiaWVydG8gdGFtYmnDqW4gZXMgdW5hIGdhcmFudGlhIGRlIHRyYW5zcGFyZW5jaWEsIGxpYmVydGFkZXMgeSBkZXJlY2hvcywgY29tbyBwdWVkZSB2ZXJzZSBlbiBlbCBzaWd1aWVudGUgW2hpbG8gZGUgVHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9kY2Fiby9zdGF0dXMvMTMwNDQxODgyNzI3OTc3MzY5NyldLgoKRGUgaGVjaG8sIGFjdHVhbG1lbnRlLCBhbCBtZW5vcyBlbiBlbCBjYW1wbyBkZSBsYSBjaWVuY2lhIGRlIGRhdG9zLCBlbCBzb2Z0d2FyZSBsaWJyZSwgbyBlcyB5YSBtYXlvcml0YXJpbywgbyB2YSBjYW1pbm8gZGUgc2VybG8uIEVzIHZlcmRhZCBxdWUgbXVjaGFzIGVtcHJlc2FzIGHDum4gYmFzYW4gc3VzIGFuw6FsaXNpcyBkZSBkYXRvcyBlbiBwcm9ncmFtYXMgY29tbyBFeGNlbCwgU1BTUywgU3RhdGEgbyBTQVMsIHBlcm8gbGEgdGVuZGVuY2lhIGVzdMOhIGNhbWJpYW5kbyB5IGVzIGRlIGVzcGVyYXIgcXVlIHNlIGFjZWxlcmUgZW4gdW4gZnV0dXJvIHByw7N4aW1vLiBDb21vIGVqZW1wbG8gZGUgZXN0YSBpZGVhIHB1ZWRlcyB2ZXIgZXN0w6EgcHVibGljYWNpw7NuOiBbQmlnIERhdGEgeSBvcGVuIHNvdXJjZV0oaHR0cHM6Ly9oaXBlcnRleHR1YWwuY29tL3ByZXNlbnRhZG8tcG9yL2JidmEvYmlnLWRhdGEteS1vcGVuLXNvdXJjZSkuCgoKRW4gW2VzdGUgcG9zdF0oaHR0cHM6Ly93d3cuZW5yaXF1ZWRhbnMuY29tLzIwMjEvMDkvZWwtb3Blbi1zb3VyY2UtY29tby1iYXNlLWRlLWxhLWNvbXBldGl0aXZpZGFkLWV1cm9wZWEuaHRtbCkgc2UgcGxhbnRlYSBxdWUgZWwgIm9wZW4gc291cmNlIiBwdWVkZSBzZXIgY2xhdmUgcGFyYSBsYSBjb21wZXRpdGl2aWRhZCBlbiBsYSBVRS4gUGFyYSBhcXVlbGxvcyBxdWUgY3JlZW4gcXVlIGVsIHNvZnR3YXJlIGNvbWVyY2lhbCBkYSBtw6FzIGdhcmFudMOtYXMsIHB1ZWRlbiBsZWVyc2UgW2VzdGUgcG9zdF0oaHR0cHM6Ly9ub3RzdGF0c2NoYXQucmJpbmQuaW8vMjAxOS8wMi8xOC9hYnNvbHV0ZWx5LW5vLXdhcnJhbnR5LykuCgoKU2VndXJhbWVudGUgZW50cmUgbGFzIGVtcHJlc2FzIHBlcXVlw7FhcyB5IG1lZGlhbmFzIEV4Y2VsIGNvbnRpbsO6YSBzaWVuZG8gZWwgc29mdHdhcmUgZGUgcmVmZXJlbmNpYSBwYXJhIHN1cyBhbsOhbGlzaXMgY3VhbnRpdGF0aXZvcy4gU8OtLCBFeGNlbCBlcyB1biBmYW50w6FzdGljbyBzb2Z0d2FyZSwgbG8gc8OpLCBwZXJvIG5vIHNpcnZlIHBhcmEgdG9kby4gVW4gZWplbXBsbyBkZSBlc3RvIFthcXXDrV0oaHR0cHM6Ly93d3cuc2NpZW5jZW1hZy5vcmcvbmV3cy8yMDE2LzA4L29uZS1maXZlLWdlbmV0aWNzLXBhcGVycy1jb250YWlucy1lcnJvcnMtdGhhbmtzLW1pY3Jvc29mdC1leGNlbCksIG8gW2FxdcOtXShodHRwczovL3d3dy5qb2huZGNvb2suY29tL2Jsb2cvMjAxOS8wOS8wNy9leGNlbC1yLWJvbS8pLiBbRXN0ZSBwb3N0XShodHRwczovL2FwcHNpbG9uLmNvbS9leGNlbC1pcy1vYnNvbGV0ZS1oZXJlLWFyZS10aGUtdG9wLTItYWx0ZXJuYXRpdmVzLWZyb20tci1hbmQtcHl0aG9uLz91dG1fY2FtcGFpZ249TmV3cyZ1dG1fbWVkaXVtPUNvbW11bml0eSZ1dG1fc291cmNlPURhdGFDYW1wLmNvbSkgZXhwbGljYSBwb3JxdWUgKipFeGNlbCBlc3TDoSBvYnNvbGV0byoqLiBFbiBsb3MgY29tZW50YXJpb3MgYWwgcG9zdCBsZSBhdGl6YW4gdW4gcG9jby4gVW4gW2hpbG8gZGUgVHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9hbGV4YW5kcmVhZm9uc28vc3RhdHVzLzEzMTMxODc1MzE3ODIwODI1NjIpIGNvbiBlcnJvcmVzIGdyYXZlcyBwcm92b2NhZG9zIHBvciBlbCBtYWwgdXNvXltBdW5xdWUgc2VndXJhbWVudGUsIGVzdG9zIGVycm9yZXMgcG9yIG1hbCB1c28gZGUgRXhjZWwgc2Ugdmllcm9uIGZhdm9yZWNpZG9zLCBjdWFuZG8gbm8gcHJvdm9jYWRvcywgcG9yIGVsIG1hbCBkaXNlw7FvIGRlIEV4Y2VsIGNvbW8gaGVycmFtaWVudGEgcGFyYSBtYW5lamFyIGRhdG9zXS4gRW4gdW4gdG9ubyBtw6FzIHBvc2l0aXZvLCBbZXN0ZSBwb3N0XShodHRwczovL291dHNpZGVyZGF0YS5uZXRsaWZ5LmNvbS9wb3N0L3doeS1pLW1pZ3JhdGVkLWZyb20tZXhjZWwtdG8tci8pIGV4cGxpY2EgcG9ycXVlIGFiYW5kb25hciBFeGNlbCB5IG1pZ3JhciBhIFIuIAoKCkVuIHBhbGFicmFzIGRlIEhhZGxleSBlbiBbZXN0YSBlbnRyZXZpc3RhXShodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS9hZHZpY2UtdG8teW91bmctYW5kLW9sZC1wcm9ncmFtbWVycy1hLWNvbnZlcnNhdGlvbi13aXRoLWhhZGxleS13aWNraGFtL2FtcC8pCgo+IEkgdGhpbmsgdGhlIHRyYWRlb2ZmIGJldHdlZW4gU3RhdGEgYW5kIFIgaXM6IGRvIHlvdSB3YW50IGEgcG9pbnQtYW5kLWNsaWNrIGludGVyZmFjZSwgb3IgZG8geW91IHdhbnQgYSBwcm9ncmFtbWluZyBpbnRlcmZhY2U/IFBvaW50LWFuZC1jbGljayBpbnRlcmZhY2VzIGFyZSBncmVhdCwgYmVjYXVzZSB0aGV5IGxheSBvdXQgYWxsIG9mIHlvdXIgb3B0aW9ucyBpbiBmcm9udCBvZiB5b3UsIGFuZCB5b3UgZG9u4oCZdCBoYXZlIHRvIHJlbWVtYmVyIGFueXRoaW5nLiBZb3UgY2FuIG5hdmlnYXRlIHRocm91Z2ggdGhlIHNldCBvZiBwcmUtc3VwcGxpZWQgb3B0aW9ucy4gQW5kIHRoYXTigJlzIGFsc28gaXTigJlzIGdyZWF0ZXN0IHdlYWtuZXNzLCBiZWNhdXNlIGZpcnN0IG9mIGFsbCwgeW91IGFyZSBjb25zdHJhaW5lZCBpbnRvIHdoYXQgdGhlIGRldmVsb3BlciB0aG91Z2h0IHlvdSBzaG91bGQgYmUgYWJsZSB0byBkby4gQW5kIHNlY29uZGx5LCBiZWNhdXNlIHlvdXIgcHJpbWFyeSBpbnRlcmFjdGlvbiBpcyB3aXRoIGEgbW91c2UsIGl04oCZcyB2ZXJ5IGRpZmZpY3VsdCB0byByZWNvcmQgd2hhdCB5b3UgZGlkLiBBbmQgSSB0aGluayB0aGF04oCZcyBhIHByb2JsZW0gZm9yIHNjaWVuY2UsIGJlY2F1c2UgaWRlYWxseSB5b3Ugd2FudCB0byBzYXkgaG93IHlvdSBhY3R1YWxseSBnb3QgdGhlc2UgcmVzdWx0cy4gQW5kIHRoZW4gc2ltcGx5IGRvIHRoYXQgcmVsaWFibHkgYW5kIGhhdmUgb3RoZXIgcGVvcGxlIGNyaXRpcXVlIHlvdSBvbiB0aGF0LiBCdXQgaXTigJlzIGFsc28gcmVhbGx5IGhhcmQgd2hlbiB5b3UgYXJlIGxlYXJuaW5nLCBiZWNhdXNlIHdoZW4geW91IGhhdmUgYSBwcm9ibGVtLCBob3cgZG8geW91IGNvbW11bmljYXRlIHRoYXQgcHJvYmxlbSB0byBzb21lb25lIGVsc2U/IFlvdSBiYXNpY2FsbHkgaGF2ZSB0byBzYXksIOKAnEkgY2xpY2tlZCBoZXJlLCB0aGVuIEkgY2xpY2tlZCBoZXJlLCB0aGVuIEkgY2xpY2tlZCBoZXJlLCBhbmQgSSBkaWQgdGhpcy7igJ0gT3IgeW91IG1ha2UgYSBzY3JlZW4gY2FzdCwgYW5kIGl04oCZcyBqdXN0IGNsdW5reSkKCgpFc3RlIHR3ZWV0IGluY2lkZSB0YW1iacOpbiBlbiBhbGd1bm8gZGUgbG9zIHByb2JsZW1hcyBkZSBFeGNlbC4gVGllbmVzIHF1ZSB2ZXIgbGEgcmVzcHVlc3RhIHVuIHBvcXVpdG8gaXLDs25pY2EgZGUgRGFsZSBNYXNjaGV0dGUsIG11eSBidWVuYSEhIFBhcmEgZWxsbyBwaW5jaGEgZW4gZWwgdHdlZXQ6CgoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy5hc3AgPSA3Lzl9CnR3ZWV0cm1kOjp0d2VldF9lbWJlZCgiaHR0cHM6Ly90d2l0dGVyLmNvbS9EYWxlX01hc2NoL3N0YXR1cy8xMTM4NTY0MzE2NTk0OTcwNjI0IiwgdGhlbWUgPSAibGlnaHQiLCBhbGlnbiA9ICJjZW50ZXIiLCBkbnQgPSBUUlVFLCBwbGFpbiA9IFRSVUUsIG1heHdpZHRoID0gNDAwKQpgYGAKCjxicj4KCkFxdcOtIHRlbmVtb3MgdW4gcHJvYmxlbWEgY29uY3JldG8gcXVlIGhhIGdlbmVyYWRvIEV4Y2VsIGFsIHNlciB1c2FkbyBlbiBhbCBhbsOhbGlzaXMgZGUgZGF0b3M6IGhhbiB0ZW5pZG8gcXVlIHJlbm9tYnJhciBsb3MgZ2VuZXMgcGFyYSBldml0YXIgcXVlIEV4Y2VsIGludGVycHJldGUgc3VzIG5vbWJyZXMgY29tbyBmZWNoYXMuCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLmFzcCA9IDcvOX0KdHdlZXRybWQ6OnR3ZWV0X2VtYmVkKCJodHRwczovL3R3aXR0ZXIuY29tL19Db2xpbkZheS9zdGF0dXMvMTI5NDIwODYyMjA4MDIwNDgwMCIsIHRoZW1lID0gImxpZ2h0IiwgYWxpZ24gPSAiY2VudGVyIiwgZG50ID0gVFJVRSwgcGxhaW4gPSBUUlVFLCBtYXh3aWR0aCA9IDQwMCkKYGBgCgoKCjxicj4KCgpFbiBlc3RlIFtwb3N0XShodHRwczovL3d3dy5icm9kcmlndWVzLmNvL2Jsb2cvMjAyMC0xMS0yMS1ndWlzX21pc3Rha2UvKSwgQnJ1bm8gUm9kcmlndWVzIGFyZ3VtZW50YSBwb3JxdcOpIG5vIHNlIHB1ZWRlIHVzYXIgRXhjZWwgcGFyYSBoYWNlciBDaWVuY2lhIGRlIERhdG9zLiBQb3Igc3VwdWVzdG8gcXVlIGFjdHVhbG1lbnRlIGhheSBtdWNoYXMgKiphbHRlcm5hdGl2YXMgcGFyYSBoYWNlciBhbsOhbGlzaXMgZGUgZGF0b3MgbyB2aXN1YWxpemFjaW9uZXMqKiBzaW4gdXNhciB1biBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuLCBwb3IgZWplbXBsbyBbYXF1w61dKGh0dHBzOi8vYXBwc2lsb24uY29tL3RvcC0zLWJpLXRvb2xzLykgbyBbYXF1w61dKGh0dHBzOi8vd3d3LnN0b3J5dGVsbGluZ3dpdGhkYXRhLmNvbS9ibG9nLzIwMTkvMS8yNC9uZXcteWVhci1uZXctdG9vbHMpLiBZbyBubyBkaWdvIG5hZGEsIHBlcm8gLi4uCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUUsIGZpZy5hc3AgPSA0LzIsIG91dC53aWR0aCA9ICI3NSUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiLi9pbWFnZW5lcy9SX2NvbW9fY2Fycy5qcGVnIikpCmBgYAoKPGJyPgoKUGxlYXNlLCAqKmRvbid0IGxvb2sqKiBbdGhpcyBvdGhlciBvbmVdKGh0dHA6Ly9jcmFzaHdvcmtzLm9yZy9pZl9wcm9ncmFtbWluZ19sYW5ndWFnZXNfd2VyZV92ZWhpY2xlcy8pICBgciBlbW86OmppKCJzbWlsZSIpYCAhISEKCgoKPGJyPgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiMjIDYuIMK/UG9yIHF1w6kgUj8KCkVuIGVsIGN1cnNvIHVzYXJlbW9zIFIgeSBSU3R1ZGlvLiBFbiBsYSBhY3R1YWxpZGFkLCBlbiBlbCBjYW1wbyBkZSBsYSBjaWVuY2lhIGRlIGRhdG9zLCBoYXkgc8OzbG8gMiBhbHRlcm5hdGl2YXMsIFBoeXRvbiBvIFIuIERlIGhlY2hvIGhheSB1biBpbnRlbnNvIGRlYmF0ZSBzb2JyZSBjdWFsIGVzIG3DoXMgYWRlY3VhZG8uIEhheSBtdWNoYXMgb3BpbmlvbmVzIGFsIHJlc3BlY3RvLCBwZXJvIHlvIGhlIHNlbGVjY2lvbmFkbyBbZXN0YV0oaHR0cHM6Ly9tY2hvdy5jb20vcG9zdHMvZGF0YS1zY2llbmNlLWNiay8pIHkgW2VzdGFdKGh0dHBzOi8vYmxvZy5zaG90d2VsbC5jYS9wb3N0cy93aHlfaV91c2Vfci8pLCBhdW5xdWUgbGEgdmVyZGFkLCB0YW1wb2NvIGVzIG5lY2VzYXJpbyBlbGVnaXIgdW4gc8OzbG8gbGVuZ3VhamUsIFtSIHkgUGh5dG9uIHB1ZWRlbiBjb2xhYm9yYXJdKGh0dHBzOi8vYmxvZy5yc3R1ZGlvLmNvbS8yMDE5LzEyLzE3L3ItdnMtcHl0aG9uLXdoYXQtcy10aGUtYmVzdC1mb3ItbGFuZ3VhZ2UtZm9yLWRhdGEtc2NpZW5jZS8pLgoKRXZpZGVudGVtZW50ZSBtaSBvcGluacOzbiBlcyBxdWUgcGFyYSBpbmljaWFyc2UgY2llbmNpYSBkZSBkYXRvcyBSIGVzdMOhIHZhcmlvcyBwYXNvcyBwb3IgZGVsYW50ZSBkZSBQaHl0b247IHNpIGJpZW4gZXMgdmVyZGFkLCBxdWUgcGFyYSBoYWNlciBNTCwgeSBwcmluY2lwYWxtZW50ZSBETCwgUGh5dG9uIHB1ZWRlIHNlciBtw6FzIGFkZWN1YWRvLiBFbiBwYWxhYnJhcyBkZSBIYWRsZXkgZW4gW2VzdGEgZW50cmV2aXN0YV0oaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vYWR2aWNlLXRvLXlvdW5nLWFuZC1vbGQtcHJvZ3JhbW1lcnMtYS1jb252ZXJzYXRpb24td2l0aC1oYWRsZXktd2lja2hhbS9hbXAvKQoKCj4gRm9yIFIgYW5kIFB5dGhvbiwgUHl0aG9uIGlzIGZpcnN0IGFuZCBmb3JlbW9zdCBhIHByb2dyYW1taW5nIGxhbmd1YWdlLiBBbmQgdGhhdCBoYXMgYSBsb3Qgb2YgZ29vZCBmZWF0dXJlcywgYnV0IGl0IHRlbmRzIHRvIG1lYW4sIHRoYXQgaWYgeW91IGFyZSBnb2luZyB0byBkbyBkYXRhIHNjaWVuY2UgaW4gUHl0aG9uLCB5b3UgaGF2ZSB0byBmaXJzdCBsZWFybiBob3cgdG8gcHJvZ3JhbSBpbiBQeXRob24uIFdoZXJlYXMgSSB0aGluayB5b3UgYXJlIGdvaW5nIHRvIGdldCB1cCBhbmQgcnVubmluZyBmYXN0ZXIgd2l0aCBSLCB0aGFuIHdpdGggUHl0aG9uIGJlY2F1c2UgdGhlcmXigJlzIGp1c3QgYSBidW5jaCBtb3JlIHN0dWZmIGJ1aWx0IGluIGFuZCB5b3UgZG9u4oCZdCBoYXZlIHRvIGxlYXJuIGFzIG1hbnkgcHJvZ3JhbW1pbmcgY29uY2VwdHMuIFlvdSBjYW4gZm9jdXMgb24gYmVpbmcgYSBncmVhdCBwb2xpdGljYWwgc2NpZW50aXN0IG9yIHdoYXRldmVyIHlvdSBkbyBhbmQgbGVhcm5pbmcgZW5vdWdoIFIgdGhhdCB5b3UgZG9u4oCZdCBoYXZlIHRvIGJlY29tZSBhbiBleHBlcnQgcHJvZ3JhbW1lciBhcyB3ZWxsIHRvIGdldCBzdHVmZiBkb25lLgoKCkVzdGUgdHdlZXReW0FsZ3VuYXMgZGUgbGFzIHJlc3B1ZXN0YXMgYWwgdHdlZXQgc29uIG11eSBidWVuYXNdIGVqZW1wbGlmaWNhIHVuIHBvY28gbGEgcml2YWxpZGFkIChjb24gYnVlbiByb2xsbykgZW50cmUgUiB5IFBoeXRvbjoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy5hc3AgPSA3Lzl9CnR3ZWV0cm1kOjp0d2VldF9lbWJlZCgiaHR0cHM6Ly90d2l0dGVyLmNvbS9kaW5nYTkyL3N0YXR1cy8xMjczNjg1NDgwOTU4MjQyODIzIiwgdGhlbWUgPSAibGlnaHQiLCBhbGlnbiA9ICJjZW50ZXIiLCBkbnQgPSBUUlVFLCBwbGFpbiA9IFRSVUUsIG1heHdpZHRoID0gNDAwKQpgYGAKCgpBdW5xdWUgZGVzcHXDqXMgZGUgbG8gcXVlIGRpam8gRWxtbywgeW8gY3JlbyBxdWUgZWwgZGViYXRlIGVzdMOhIHphbmphZG86CgpgYGB7ciwgZWNobyA9IEZBTFNFLCBmaWcuYXNwID0gNy85fQpsaWJyYXJ5KHR3ZWV0cm1kKSAgICMtIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiZ2FkZW5idWllL3R3ZWV0cm1kIikKdHdlZXRybWQ6OnR3ZWV0X2VtYmVkKCJodHRwczovL3R3aXR0ZXIuY29tL21pbmVib2Nlay9zdGF0dXMvMTE3NDM4MjYyMzQ5OTY2MTMxMiIsIHRoZW1lID0gImRhcmsiLCBhbGlnbiA9ICJjZW50ZXIiLCBkbnQgPSBUUlVFLCBwbGFpbiA9IFRSVUUsIG1heHdpZHRoID0gMzAwKQpgYGAKCgoKUiBzZSBlc3TDoSBjb252aXJ0aWVuZG8gZW4gZWwgc29mdHdhcmUgZXN0YWTDrXN0aWNvIGRlIHJlZmVyZW5jaWEgZW4gbGEgbWF5b3LDrWEgZGUgbG9zIGNlbnRyb3MgZGUgaW52ZXN0aWdhY2nDs24geSB1bml2ZXJzaWRhZGVzLCB5IHN1IHVzbyBzZSBlc3TDoSBleHRlbmRpZW5kbyB0YW1iacOpbiBkZW50cm8gZGUgbGEgZW1wcmVzYSBwcml2YWRhLiBSIGVzIHNvZnR3YXJlIGxpYnJlLCBncmF0dWl0byB5IGVzdMOhIGluY29ycG9yYW5kbyBtw6FzIHLDoXBpZGFtZW50ZSBxdWUgb3Ryb3MgcHJvZ3JhbWFzIGxhcyB0w6ljbmljYXMgYXZhbnphZGFzIGRlIGFuw6FsaXNpcyBkZSBkYXRvcyBxdWUgc2UgZXN0w6FuIGRlc2Fycm9sbGFuZG8gZW4gbG9zIMO6bHRpbW9zIGHDsW9zLiBPdHJvIGFzcGVjdG8gaW1wb3J0YW50ZSBxdWUgY29udmllcnRlIGEgUiBlbiB1bmEgaGVycmFtaWVudGEgbXV5IHBvdGVudGUgZXMgcXVlIGluY29ycG9yYSB1biBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuIHNlbmNpbGxvIHkgbXV5IGZsZXhpYmxlLCBxdWUgcGVybWl0ZSB0ZW5lciB1biBjb250cm9sIHRvdGFsIHNvYnJlIGVsIGFuw6FsaXNpcyBxdWUgc2UgZXN0w6EgZGVzYXJyb2xsYW5kbwoKCkNyZW8gcXVlIGVuIGxhIGFjdHVhbGlkYWQgUiBlcyBlbCBtZWpvciBwcm9ncmFtYSBwYXJhIGluaWNpYXJzZSB5IGhhY2VyIGFuw6FsaXNpcyBkZSBkYXRvcy4gU2kgbm8gbWUgYWNhYmFzIGRlIGNyZWVyLCBvIHF1aWVyZXMgbGVlciBhbGdvIHNvYnJlIGxhIGltcG9ydGFuY2lhIHkgY2FwYWNpZGFkZXMgZGUgUiBwdWVkZXMgaGFjZXJsbyBbYXF1w61dKGh0dHA6Ly9uYWRhZXNncmF0aXMuZXMvZmVybmFuZGV6LXZpbGxhdmVyZGUvcikgbyBbYXF1w61dKGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tL3doeS1yLWlzLXRoZS1iZXN0LWRhdGEtc2NpZW5jZS1sYW5ndWFnZS10by1sZWFybi10b2RheS8pLCBvIFthcXXDrV0oaHR0cHM6Ly9zaGlyaW5zcGxheWdyb3VuZC5uZXRsaWZ5LmNvbS8yMDE3LzA5L29kZV90b19yLykgbyBtw6FzIHJlY2llbnRlbWVudGUgW2FxdcOtXShodHRwczovL3d3dy5lb2RhLmRlL2VuL3dpc3Nlbi9ibG9nL3ItcHl0aG9uLWp1bGlhLWRhdGEtc2NpZW5jZS0yMDE5KS4KCjxicj4KClIgZXMgY2FkYSB2ZXogbcOhcyB1c2Fkbywgbm8gc8OzbG8gZW4gbGEgdW5pdmVyc2lkYWQgeSBsYSBkb2NlbmNpYSwgc2lubyB0YW1iacOpbiBlbiBlbCBtdW5kbyBkZSBsYSBlbXByZXNhLCBwdWVkZXMgdmVybG8gW2FxdcOtXShodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS9zaXgtcmVhc29ucy10by1sZWFybi1yLWZvci1idXNpbmVzcy8pIG8gW2FxdcOtXShodHRwOi8vYmxvZy5zZWxsb3JtLmNvbS8yMDE2LzExLzI2L3RhbGstci1pcy1wcm9kdWN0aW9uLXNhZmUvKS4gVW5hIGRlIGxhcyBjb25mZXJlbmNpYXMgbcOhcyBpbXBvcnRhbnRlcyBzb2JyZSBlbCB1c28gY29tZXJjaWFsIGRlIFIgZXMgW1RoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucyBvZiB0aGUgUiBMYW5ndWFnZSBDb25mZXJlbmNlIChFQVJMKV0oaHR0cHM6Ly9lYXJsY29uZi5jb20vI2luZm8pLgoKRW50cmUgbGFzIGVtcHJlc2FzIHF1ZSB1c2FuIFIgZXN0w6FuOiBHb29nbGUsIEZhY2Vib29rLCBUd2l0dGVyLCBNaWNyb3NvZnQsIElCTSwgVWJlciwgRm9yZCwgQWlyYm5iLCBBbWVyaWNhbiBFeHByZXNzLCAgQmFyY2xheXMgQmFuaywgW0Jhbmsgb2YgQW1lcmljYV0oaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vYmFuay1vZi1hbWVyaWNhLXVzZXMtci1mb3ItcmVwb3J0aW5nLykgeSBtdWNoYXMgb3RyYXMuIFtBcXXDrV0oaHR0cHM6Ly9naXRodWIuY29tL1RoaW5rUi1vcGVuL2NvbXBhbmllcy11c2luZy1yKSBvIFthcXXDrV0oaHR0cHM6Ly93d3cubGlzdGVuZGF0YS5jb20vMjAxNi8xMi9jb21wYW5pZXMtdXNpbmctci5odG1sKSBwdWVkZXMgZW5jb250cmFyIHVuIGxpc3RhZG8gbcOhcyBjb21wbGV0by4gCgoKVW5hIGRlIGxhcyBtYXlvcmVzIHZlbnRhamFzIGRlIHVzYXIgUiBlcyBxdWUgcHVlZGVzIHVzYXIgUm1hcmtkb3duIHkgU2hpbnkuIExvIHZlcmVtb3MsIHBlcm8gW2FxdcOtXShodHRwczovL3Jmb3J0aGVyZXN0b2Z1cy5jb20vMjAxOS8wMy9yLWtpbGxlci1mZWF0dXJlLXJtYXJrZG93bi8pIHRpZW5lcyB1biBwb3N0IHF1ZSBleHBsaWNhIHN1cyB2ZW50YWphcy4gVW4gZWplbXBsbyBkZSB1dGlsaXphY2nDs24gZXMgW2VzdMOhIGFwbGljYWNpw7NuIGRlIHNlZ3VpbWluZW50byBkZWwgY292aWRdKGh0dHBzOi8vY2FsY2F0LmNvdmlkMTkuY2EuZ292L2NhY292aWRtb2RlbHMvKSBxdWUgaGEgaW1wbGVtZW50YWRvIGVsIGRlcGFydGFtZW50byBvZiBQdWJsaWMgSGVhbHRoIGRlIENhbGlmb3JuaWEuCgpTaSB0ZSBndXN0YW4gbG9zIHJhbmtpbmdzIGRlIGxlbmd1YWplcyBkZSBwcm9ncmFtYWNpw7NuLCBbYXF1w61dKGh0dHBzOi8vcmVkbW9uay5jb20vc29ncmFkeS8yMDIwLzAyLzI4L2xhbmd1YWdlLXJhbmtpbmdzLTEtMjAvKSB0aWVuZXMgdW5vLCBkZSBlbmVybyBkZSAyMDIwLCBlbiBlbCBQaHl0b24gZXN0w6EgZW4gc2VndW5kbyBsdWdhciBtaWVudHJhcyBxdWUgUiBlc3TDoSBlbiBlbCBwdWVzdG8gMTMuIEVzdG8gZXMgbG8gcXVlIHF1ZSBzZSBkaWNlIGRlIFI6Cgo+ICBJbiBvdXIgZmlyc3QgcnVuIG9mIHRoZXNlIHJhbmtpbmdzLCBSIHBsYWNlZCAxN3RoLiBBbGwgdGhlc2UgeWVhcnMgbGF0ZXIgaXQganVtcHMgdHdvIHNwb3RzIGZyb20gdGhlIGxhc3QgcXVhcnRlcuKAmXMgZWRpdGlvbiB1cCB0byAjMTMuIEluIHRoZSBpbnRlcmltLCBpdCBoYXMgcmFua2VkIGFzIGhpZ2ggYXMgMTJ0aCBidXQgbW9zdGx5IGNvbW1vbmx5IGlzIGZvdW5kIGluIHRoZSAxMy0xNSByYW5nZS4gR2l2ZW4gdGhlIGxhbmd1YWdl4oCZcyBzcGVjaWFsaXplZCBmb2N1cywgdGhpcyBpcyBsaWtlbHkgaXRzIGVmZmVjdGl2ZSBjZWlsaW5nLCBidXQgaXTigJlzIGFsc28gYW4gaWxsdXN0cmF0aW9uIG9mIHRoZSByZW1hcmthYmxlIHBvcHVsYXJpdHkgb2YgYSBsYW5ndWFnZSB3aG9zZSB1c2FnZSBpcyByZXN0cmljdGVkIGZvciBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMgdG8gYSBzaW5nbGUgZG9tYWluIOKAkyB0aG9zZSB3aG8gd29yayB3aXRoIGFuZCBvcGVyYXRlIG9uIGRhdGEuIFLigJlzIHN1Y2Nlc3MgaXMgYW4gZXhhbXBsZSBvZiB0aGUgcG93ZXIgb2YgYW4gYWNhZGVtaWEtc3VwcG9ydGVkIGNvbW11bml0eSB0byBlbGV2YXRlIGEgbGFuZ3VhZ2UgYmV5b25kIGl0cyBleHBlY3RlZCB0aHJlc2hvbGQsIGFuZCBpdCBpcyBub3RhYmxlIHRoYXQgdGhlIGFmb3JlbWVudGlvbmVkIGdyb3d0aCBvZiBQeXRob24gYW5kIGl0cyBleHBhbnNpb24gaW50byBkYXRhIGFuYWx5dGljcyBoYXMgbm90IG9ic2VydmFibHkgY29tZSBhdCB0aGUgZXhwZW5zZSBvZiB0cmFjdGlvbiBpbiBSLgoKCk1pZW50cmFzIHJlZXNjcmlibyBlc3RhcyBub3RhcywganVsaW8gZGUgMjAyMCwgUiBoYSBzdWJpZG8gYWwgcHVlc3RvIDgsIG1pZW50cmFzIHF1ZSBQaHl0b24gZXN0w6EgZW4gZWwgdGVyY2Vyby4gRWwgcmFua2luZyBtw6FzIGFjdHVhbCBwdWVkZXMgdmVybG8gW2FxdcOtXShodHRwczovL3d3dy50aW9iZS5jb20vdGlvYmUtaW5kZXgvKS4KCgojIyMgwr9FcyBjb21wbGljYWRvIGFwcmVuZGVyIFI/CgoKwr9BcHJlbmRlciBSIGVzIGNvbXBsaWNhZG8/IE5vLCBidWVubyAuLi4geWEgcmVzcG9uZGVyw6kgYSBlc3RvIGVuIGNsYXNlLiBObyBtaXJlcyBlbCBzaWd1aWVudGUgdHdlZXQ6CgoKCmBgYHtyLCBlY2hvID0gRkFMU0V9CnR3ZWV0cm1kOjp0d2VldF9lbWJlZCgiaHR0cHM6Ly90d2l0dGVyLmNvbS9yb2dpZXJLL3N0YXR1cy83MzA4NjM3Mjk0MjA3MDE2OTciLCB0aGVtZSA9ICJsaWdodCIsIGFsaWduID0gImNlbnRlciIsIGRudCA9IFRSVUUsIHBsYWluID0gVFJVRSwgbWF4d2lkdGggPSA0MDApCmBgYAoKCjxicj4KCkF1bnF1ZSBsYSB2ZXJkYWQsIGVzdGEgZGlmaWN1bHRhZC9yYXJlemEgZGUgUiBlcyBjb3NhIGRlIG90cm9zIHRpZW1wb3MuIENvbiBlbCB0aWR5dmVyc2UgdG9kbyBlcyBtw6FzIGbDoWNpbCB5IGJyaWxsYW50ZS4gQ29tbyBtdWVzdHJhIGVsIHR3ZWV0IGRlIENocmlzIEFsYm9uLCB1biBtaWVtYnJvIGRlc3RhY2FkbyBkZSBsYSBjb211bmlkYWQgUGh5dG9uLiBNZXJlY2UgbGEgcGVuYSBlY2hhcmxlIHVuIG9qbyBhIGFsZ3VuYXMgZGUgbGFzIHJlc3B1ZXN0YXMgYWwgdHdlZXQuCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SSB1c2VkIFIgZm9yIG1hbnkgeWVhcnMgYnV0IHdoZW5ldmVyIEkgaGVhciBhYm91dCBpdCBub3cgaXQgZmVlbHMgbGlrZSBJIHdhdGNoZWQgUiBzZWFzb24gb25lIGFuZCBub3cgaXQgaXMgb24gYSBzcGluLW9mZiBiYXNlZCBvbiB0aGUgY2hhcmFjdGVycyBvZiBzZWFzb24gMTMuPC9wPiZtZGFzaDsgQ2hyaXMgQWxib24gKFxAY2hyaXNhbGJvbikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9jaHJpc2FsYm9uL3N0YXR1cy8xMjI1NTkyNDQwMjMwNDgxOTIwP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkZlYnJ1YXJ5IDcsIDIwMjA8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+IAoKPGJyPgoKCgojIyMgQWxndW5vcyBzaXRpb3MgYSB2aXNpdGFyCgoKLSBbUndlZWtseV0oaHR0cHM6Ly9yd2Vla2x5Lm9yZy8pLiBDYWRhIHNlbWFuYSBlbnbDrWFuIHVuIGFyY2hpdm8gY29uIGxvcyBtZWpvcmVzIGFuw6FsaXNpcyBoZWNob3MgY29uIFIgZXNhIHNlbWFuYS4gVGllbmVzIHF1ZSBhcHVudGFydGUgW2FxdcOtXShodHRwczovL2ZlZWRidXJuZXIuZ29vZ2xlLmNvbS9mYi9hL21haWx2ZXJpZnk/dXJpPXJ3ZWVrbHkmbG9jPWVuX1VTKQoKLSBbUmJsb2dnZXJzXShodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS8pLiBVbiBhZ3JlZ2Fkb3IgZGUgYmxvZ3MgcmVsYWNpb25hZG9zIGNvbiBSLgoKLSBbUiBWaWV3c10oaHR0cHM6Ly9ydmlld3MucnN0dWRpby5jb20vKS4gRXMgdW4gYmxvZyBhc29jaWFkbyBhIFJTdHVkaW8uIENhZGEgbWVzIHNhY2EgdW4gcG9zdCBkb25kZSBlbGlnZW4gbG9zIG1lam9yZXMgNDAgcGFxdWV0ZXMgZGUgZXNlIG1lczsgcG9yIGVqZW1wbG8sIFthcXXDrV0oaHR0cHM6Ly9ydmlld3MucnN0dWRpby5jb20vMjAxOS8wOC8yOS9qdWx5LTIwMTktdG9wLTQwLXItcGFja2FnZXMvKSB0aWVuZXMgZWwgZGUganVsaW8gZGUgMjAxOS4KCi0gW3N3aXJsXShodHRwczovL3N3aXJsc3RhdHMuY29tLykuIHN3aXJsIHRlYWNoZXMgeW91IFIgcHJvZ3JhbW1pbmcgYW5kIGRhdGEgc2NpZW5jZSBpbnRlcmFjdGl2ZWx5LCBhdCB5b3VyIG93biBwYWNlLCBhbmQgcmlnaHQgaW4gdGhlIFIgY29uc29sZSEKCgo8YnI+Cgo8YnI+Cg==