1. Introducción al aprendizaje automático

Acorde a Gironés Roig y otros (2017):

“La inteligencia artificial, sustentada de lleno en las matemáticas y la computación, plantea a analistas, programadores e ingenieros el reto del aprendizaje continuo e incansable que persigue un conocimiento inalcanzable y palpable a la vez. Si las ciencias exactas son el mejor idioma de que disponemos para hablar con el universo, también son la mejor herramienta que tenemos para tratar de imitar la inteligencia humana.”

Según Géron (2019):

‘Cuando las personas escuchan ’aprendizaje de máquina’ se imaginan un robot: un mayordomo confiable o un mortífero Terminator, dependiendo a quién se le pregunte. Sin embargo, este no es solo una fantasía futurista, ya está aquí.’

El aprendizaje automático (o de máquina), como parte de la inteligencia artificial, es la ciencia (o arte) de programar las computadoras para que éstas puedan aprender de los datos. Es decir, le damos la habilidad a la computadora de aprender sin ser explícitamente programada.

De una manera más objetiva, Abu-Mostafa, profesor del curso de CALTECH: Learning from Data, menciona que la esencia del aprendizaje automático yace sobre 3 puntos:

  • Existe un patrón en algún fenómeno.

  • No podemos especificar dicho patrón de manera exacta a través de una formalización matemática.

  • Tenemos datos.

Así, estas tareas de aprendizaje incluyen varias situaciones, incluyendo (pero no limitándose):

  • Predecir: nivel de ventas en base a gasto en publicidad.

  • Clasificar: clientes buenos y malos según su comportamiento al pagar un crédito.

  • Descubrir patrones: tipos de clientes según sus características sociodemográficas y de consumo.

  • Realizar inferencia: sobre variables que en teoría tienen efecto sobre un fenómeno.

A partir de estos ejemplos, las tareas más usuales del aprendizaje automático se pueden clasificar en tres grandes categorías (aunque existen otras clasificaciones):

  • Aprendizaje supervisado
  • Aprendizaje no supervisado
  • Aprendizaje por refuerzo

Cada uno de estos grandes grupos de modelos involucra el uso de varias técnicas y algoritmos que pueden ser aplicados con distintos tipos de datos:

  • Estructurados: tablas de información generalmente pobladas con variables numéricas y categóricas.

  • No estructurados: datos de texto, audio, imágenes, video, etc.

  • Semiestructurados.

2. Orientaciones en la aplicación del aprendizaje automático

Blog: “Towards Data Science”

Entrada: “When Bayes, Ockham, and Shannon come together to define machine learning”

URL: TDS: Definition of Machine Learning

2.1. El Teorema de Bayes

El reverendo Thomas Bayes (1702-1761), alrededor del año 1750 definió la probabilidad condicional como:

\[ P(A|B)=\frac{P(B|A)P(A)}{P(B)} \]

Donde la probabilidad de que suceda un evento \(A\) condicionado a que otro evento \(B\) ya haya sucedido, dependerá de la probabilidad condicional de \(B\) dado \(A\), de la probabilidad del evento \(A\) y de la probabilidad del evento \(B\).

Debido a que dentro del aprendizaje automático intentamos encontrar la hipótesis (a posteriori) más probable para nuestros datos, podemos sustituir al evento \(A\) por \(h\) (que ahora en adelante denotará a la hipótesis planteada) y al evento \(B\) por \(D\) (los datos de análisis):

\[ P(h|D)=\frac{P(D|h)P(h)}{P(D)} \]

Con la nueva ecuación formada, buscamos una hipótesis \(h_f\) que maximice la \(P(h|D)\), es decir:

\[ {h}_{f}=argmax\left[P(h|D)\right]=argmax\frac{P(D|h)P(h)}{P(D)} \]

Si a este problema le aplicamos el logaritmo (específicamente base 2) obtenemos:

\[ {h}_{f}=argmin\left[-log_2(P(D|h))-log_2(P(D))\right] \]

Habiendo entrado así al terreno de la Teoría de la información.

2.2. La teoría de la información

Claude Shannon (1916-2001), matemático, ingeniero eléctrico y criptógrafo del MIT que trabajó en Bell Labs, mencionaba que la cantidad de información producida por cualquier fuente puede ser definida por una fórmula similar a la de la ecuación que define la entropía termodinámica. Para un evento con probabilidad \(P\), la forma más eficiente de almacenarlo requiere \(-log_2(P)\) bits.

Si recurrimos a nuestra última fórmula y utilizamos el enunciado de Shannon, llegaremos a una ecuación conocida como la del largo mínimo:

\[ {h}_{f}=argmin\left[largo(P(D|h))-largo(P(D))\right] \]

Pero ¿para qué sirve haber llegado hasta acá? La filosofía nos dirá.

2.3. La navaja de Ockham

A William de Ockham (1287-1347), teólogo franciscano inglés y filósofo medieval se le atribuían las palabras:

\[ \text{Entia non sunt multiplicanda praeter necessitatem.} \]

Es decir, ‘’las entidades no deben ser multiplicadas más allá de lo necesario’’. De esta frase nace el principio de la lógica conocido como la navaja de Ockham. Básicamente, aplicada a nuestro campo, esta nos dice que se puede distinguir entre dos hipótesis candidatas ya sea eliminando supuestos innecesarios o recortando dos conclusiones similares. Es decir, debemos intentar trabajar con la hipótesis más simple, aquella que pueda explicar nuestros datos de una manera satisfactoria.

3. El aprendizaje automático dentro del PLN

Para refrescar las conexiones entre el procesamiento del lenguaje natural, la inteligencia artificial y el aprendizaje automático, revisaremos el capítulo 1 de este curso: Capítulo 1: Introducción al procesamiento del lenguaje natural.

Así, el PLN puede ser combinado con el aprendizaje automático en varias tareas, sean estas específicas al campo o no. Estas incluyen (pero no se limitan):

  • Etiquetado morfosintáctico

  • Análisis sintáctico

  • Análisis de sentimientos

  • Desambiguación de palabras

  • Clasificación de textos

  • Predicción del precio de las acciones

  • Agrupamiento de temáticas

  • Predicción de texto

  • Detección de noticias falsas, etc.

4. Bibliografía

Géron, A. (2019), Hands-on Machine Learning with Scikit-Learn.
Gironés Roig, J. y otros (2017), Minería de datos: modelos y algoritmos.
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBjb21wb3J0YW1pZW50byBlbiByZWRlcyBzb2NpYWxlcyB1c2FuZG8gUHJvY2VzYW1pZW50byBkZWwgTGVuZ3VhamUgTmF0dXJhbCINCnN1YnRpdGxlOiAnQ2Fww610dWxvIDU6IEludHJvZHVjY2nDs24gYWwgYXByZW5kaXphamUgYXV0b23DoXRpY28gY29uIFBMTicNCmF1dGhvcjogSHVnbyBQb3JyYXMNCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgY3NzOiBFc3RpbG9zLmNzcw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UNCmJpYmxpb2dyYXBoeTogQmlibGlvZ3JhZmlhLmJpYg0KY3NsOiBjZXBhbC54bWwNCi0tLQ0KDQojICoqMS4gSW50cm9kdWNjacOzbiBhbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyoqDQoNCkFjb3JkZSBhIEBHaXJvbmVzUm9pZzIwMTc6DQoNCioiTGEgaW50ZWxpZ2VuY2lhIGFydGlmaWNpYWwsIHN1c3RlbnRhZGEgZGUgbGxlbm8gZW4gbGFzIG1hdGVtw6F0aWNhcyB5IGxhIGNvbXB1dGFjacOzbiwgcGxhbnRlYSBhIGFuYWxpc3RhcywgcHJvZ3JhbWFkb3JlcyBlIGluZ2VuaWVyb3MgZWwgcmV0byBkZWwgYXByZW5kaXphamUgY29udGludW8gZSBpbmNhbnNhYmxlIHF1ZSBwZXJzaWd1ZSB1biBjb25vY2ltaWVudG8gaW5hbGNhbnphYmxlIHkgcGFscGFibGUgYSBsYSB2ZXouIFNpIGxhcyBjaWVuY2lhcyBleGFjdGFzIHNvbiBlbCBtZWpvciBpZGlvbWEgZGUgcXVlIGRpc3BvbmVtb3MgcGFyYSBoYWJsYXIgY29uIGVsIHVuaXZlcnNvLCB0YW1iacOpbiBzb24gbGEgbWVqb3IgaGVycmFtaWVudGEgcXVlIHRlbmVtb3MgcGFyYSB0cmF0YXIgZGUgaW1pdGFyIGxhIGludGVsaWdlbmNpYSBodW1hbmEuIioNCg0KIVtdKGZpZ3MvMDVfTUxNZW1lLmpwZWcpe3dpZHRoPSIxMDAlIn0NCg0KU2Vnw7puIEBHZXJvbjIwMTk6DQoNCionQ3VhbmRvIGxhcyBwZXJzb25hcyBlc2N1Y2hhbiAnYXByZW5kaXphamUgZGUgbcOhcXVpbmEnIHNlIGltYWdpbmFuIHVuIHJvYm90OiB1biBtYXlvcmRvbW8gY29uZmlhYmxlIG8gdW4gbW9ydMOtZmVybyBUZXJtaW5hdG9yLCBkZXBlbmRpZW5kbyBhIHF1acOpbiBzZSBsZSBwcmVndW50ZS4gU2luIGVtYmFyZ28sIGVzdGUgbm8gZXMgc29sbyB1bmEgZmFudGFzw61hIGZ1dHVyaXN0YSwgeWEgZXN0w6EgYXF1w60uJyoNCg0KRWwgYXByZW5kaXphamUgYXV0b23DoXRpY28gKG8gZGUgbcOhcXVpbmEpLCBjb21vIHBhcnRlIGRlIGxhIGludGVsaWdlbmNpYSBhcnRpZmljaWFsLCBlcyBsYSBjaWVuY2lhIChvIGFydGUpIGRlIHByb2dyYW1hciBsYXMgY29tcHV0YWRvcmFzIHBhcmEgcXVlIMOpc3RhcyBwdWVkYW4gYXByZW5kZXIgZGUgbG9zIGRhdG9zLiBFcyBkZWNpciwgbGUgZGFtb3MgbGEgaGFiaWxpZGFkIGEgbGEgY29tcHV0YWRvcmEgZGUgYXByZW5kZXIgc2luIHNlciBleHBsw61jaXRhbWVudGUgcHJvZ3JhbWFkYS4NCg0KRGUgdW5hIG1hbmVyYSBtw6FzIG9iamV0aXZhLCBBYnUtTW9zdGFmYSwgcHJvZmVzb3IgZGVsIGN1cnNvIGRlIFtDQUxURUNIOiBMZWFybmluZyBmcm9tIERhdGFdKDxodHRwOi8vd29yay5jYWx0ZWNoLmVkdS90ZWxlY291cnNlLmh0bWw+KSwgbWVuY2lvbmEgcXVlIGxhIGVzZW5jaWEgZGVsIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvIHlhY2Ugc29icmUgMyBwdW50b3M6DQoNCi0gICBFeGlzdGUgdW4gcGF0csOzbiBlbiBhbGfDum4gZmVuw7NtZW5vLg0KDQotICAgTm8gcG9kZW1vcyBlc3BlY2lmaWNhciBkaWNobyBwYXRyw7NuIGRlIG1hbmVyYSBleGFjdGEgYSB0cmF2w6lzIGRlIHVuYSBmb3JtYWxpemFjacOzbiBtYXRlbcOhdGljYS4NCg0KLSAgIFRlbmVtb3MgZGF0b3MuDQoNCkFzw60sIGVzdGFzIHRhcmVhcyBkZSBhcHJlbmRpemFqZSBpbmNsdXllbiB2YXJpYXMgc2l0dWFjaW9uZXMsIGluY2x1eWVuZG8gKHBlcm8gbm8gbGltaXTDoW5kb3NlKToNCg0KLSAgICoqUHJlZGVjaXI6Kiogbml2ZWwgZGUgdmVudGFzIGVuIGJhc2UgYSBnYXN0byBlbiBwdWJsaWNpZGFkLg0KDQotICAgKipDbGFzaWZpY2FyOioqIGNsaWVudGVzIGJ1ZW5vcyB5IG1hbG9zIHNlZ8O6biBzdSBjb21wb3J0YW1pZW50byBhbCBwYWdhciB1biBjcsOpZGl0by4NCg0KLSAgICoqRGVzY3VicmlyIHBhdHJvbmVzOioqIHRpcG9zIGRlIGNsaWVudGVzIHNlZ8O6biBzdXMgY2FyYWN0ZXLDrXN0aWNhcyBzb2Npb2RlbW9ncsOhZmljYXMgeSBkZSBjb25zdW1vLg0KDQotICAgKipSZWFsaXphciBpbmZlcmVuY2lhOioqIHNvYnJlIHZhcmlhYmxlcyBxdWUgZW4gdGVvcsOtYSB0aWVuZW4gZWZlY3RvIHNvYnJlIHVuIGZlbsOzbWVuby4NCg0KQSBwYXJ0aXIgZGUgZXN0b3MgZWplbXBsb3MsIGxhcyB0YXJlYXMgbcOhcyB1c3VhbGVzIGRlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyBzZSBwdWVkZW4gY2xhc2lmaWNhciBlbiB0cmVzIGdyYW5kZXMgY2F0ZWdvcsOtYXMgKGF1bnF1ZSBleGlzdGVuIG90cmFzIGNsYXNpZmljYWNpb25lcyk6DQoNCi0gICBBcHJlbmRpemFqZSBzdXBlcnZpc2Fkbw0KLSAgIEFwcmVuZGl6YWplIG5vIHN1cGVydmlzYWRvDQotICAgQXByZW5kaXphamUgcG9yIHJlZnVlcnpvDQoNCiFbXShmaWdzLzA1X01MQ2xhc3NpZmljYXRpb24ucG5nKQ0KDQpDYWRhIHVubyBkZSBlc3RvcyBncmFuZGVzIGdydXBvcyBkZSBtb2RlbG9zIGludm9sdWNyYSBlbCB1c28gZGUgdmFyaWFzIHTDqWNuaWNhcyB5IGFsZ29yaXRtb3MgcXVlIHB1ZWRlbiBzZXIgYXBsaWNhZG9zIGNvbiBkaXN0aW50b3MgdGlwb3MgZGUgZGF0b3M6DQoNCi0gICAqKkVzdHJ1Y3R1cmFkb3M6KiogdGFibGFzIGRlIGluZm9ybWFjacOzbiBnZW5lcmFsbWVudGUgcG9ibGFkYXMgY29uIHZhcmlhYmxlcyBudW3DqXJpY2FzIHkgY2F0ZWfDs3JpY2FzLg0KDQotICAgKipObyBlc3RydWN0dXJhZG9zOioqIGRhdG9zIGRlIHRleHRvLCBhdWRpbywgaW3DoWdlbmVzLCB2aWRlbywgZXRjLg0KDQotICAgKipTZW1pZXN0cnVjdHVyYWRvcy4qKg0KDQojICoqMi4gT3JpZW50YWNpb25lcyBlbiBsYSBhcGxpY2FjacOzbiBkZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28qKg0KDQoqKkJsb2c6KiogIlRvd2FyZHMgRGF0YSBTY2llbmNlIg0KDQoqKkVudHJhZGE6KiogIldoZW4gQmF5ZXMsIE9ja2hhbSwgYW5kIFNoYW5ub24gY29tZSB0b2dldGhlciB0byBkZWZpbmUgbWFjaGluZSBsZWFybmluZyINCg0KKipVUkw6KiogW1REUzogRGVmaW5pdGlvbiBvZiBNYWNoaW5lIExlYXJuaW5nXShodHRwczovL3Rvd2FyZHNkYXRhc2NpZW5jZS5jb20vd2hlbi1iYXllcy1vY2toYW0tYW5kLXNoYW5ub24tY29tZS10b2dldGhlci10by1kZWZpbmUtbWFjaGluZS1sZWFybmluZy05NjQyMjcyOWExYWQpDQoNCiFbXShmaWdzLzA1X2JheWVzX2NoYW5ub25fb2NraGFtLnBuZykNCg0KIyMgKioyLjEuIEVsIFRlb3JlbWEgZGUgQmF5ZXMqKg0KDQpFbCByZXZlcmVuZG8gVGhvbWFzIEJheWVzICgxNzAyLTE3NjEpLCBhbHJlZGVkb3IgZGVsIGHDsW8gMTc1MCBkZWZpbmnDsyBsYSBwcm9iYWJpbGlkYWQgY29uZGljaW9uYWwgY29tbzoNCg0KJCQNClAoQXxCKT1cZnJhY3tQKEJ8QSlQKEEpfXtQKEIpfQ0KJCQNCg0KRG9uZGUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBzdWNlZGEgdW4gZXZlbnRvICRBJCBjb25kaWNpb25hZG8gYSBxdWUgb3RybyBldmVudG8gJEIkIHlhIGhheWEgc3VjZWRpZG8sIGRlcGVuZGVyw6EgZGUgbGEgcHJvYmFiaWxpZGFkIGNvbmRpY2lvbmFsIGRlICRCJCBkYWRvICRBJCwgZGUgbGEgcHJvYmFiaWxpZGFkIGRlbCBldmVudG8gJEEkIHkgZGUgbGEgcHJvYmFiaWxpZGFkIGRlbCBldmVudG8gJEIkLg0KDQpEZWJpZG8gYSBxdWUgZGVudHJvIGRlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyBpbnRlbnRhbW9zIGVuY29udHJhciBsYSBoaXDDs3Rlc2lzICgqYSBwb3N0ZXJpb3JpKikgbcOhcyBwcm9iYWJsZSBwYXJhIG51ZXN0cm9zIGRhdG9zLCBwb2RlbW9zIHN1c3RpdHVpciBhbCBldmVudG8gJEEkIHBvciAkaCQgKHF1ZSBhaG9yYSBlbiBhZGVsYW50ZSBkZW5vdGFyw6EgYSBsYSBoaXDDs3Rlc2lzIHBsYW50ZWFkYSkgeSBhbCBldmVudG8gJEIkIHBvciAkRCQgKGxvcyBkYXRvcyBkZSBhbsOhbGlzaXMpOg0KDQokJA0KUChofEQpPVxmcmFje1AoRHxoKVAoaCl9e1AoRCl9DQokJA0KDQpDb24gbGEgbnVldmEgZWN1YWNpw7NuIGZvcm1hZGEsIGJ1c2NhbW9zIHVuYSBoaXDDs3Rlc2lzICRoX2YkIHF1ZSBtYXhpbWljZSBsYSAkUChofEQpJCwgZXMgZGVjaXI6DQoNCiQkDQp7aH1fe2Z9PWFyZ21heFxsZWZ0W1AoaHxEKVxyaWdodF09YXJnbWF4XGZyYWN7UChEfGgpUChoKX17UChEKX0NCiQkDQoNClNpIGEgZXN0ZSBwcm9ibGVtYSBsZSBhcGxpY2Ftb3MgZWwgbG9nYXJpdG1vIChlc3BlY8OtZmljYW1lbnRlIGJhc2UgMikgb2J0ZW5lbW9zOg0KDQokJA0Ke2h9X3tmfT1hcmdtaW5cbGVmdFstbG9nXzIoUChEfGgpKS1sb2dfMihQKEQpKVxyaWdodF0NCiQkDQoNCkhhYmllbmRvIGVudHJhZG8gYXPDrSBhbCB0ZXJyZW5vIGRlIGxhICoqVGVvcsOtYSBkZSBsYSBpbmZvcm1hY2nDs24qKi4NCg0KIyMgKioyLjIuIExhIHRlb3LDrWEgZGUgbGEgaW5mb3JtYWNpw7NuKioNCg0KQ2xhdWRlIFNoYW5ub24gKDE5MTYtMjAwMSksIG1hdGVtw6F0aWNvLCBpbmdlbmllcm8gZWzDqWN0cmljbyB5IGNyaXB0w7NncmFmbyBkZWwgTUlUIHF1ZSB0cmFiYWrDsyBlbiAqKkJlbGwgTGFicyoqLCBtZW5jaW9uYWJhIHF1ZSBsYSBjYW50aWRhZCBkZSBpbmZvcm1hY2nDs24gcHJvZHVjaWRhIHBvciBjdWFscXVpZXIgZnVlbnRlIHB1ZWRlIHNlciBkZWZpbmlkYSBwb3IgdW5hIGbDs3JtdWxhIHNpbWlsYXIgYSBsYSBkZSBsYSBlY3VhY2nDs24gcXVlIGRlZmluZSBsYSBlbnRyb3DDrWEgdGVybW9kaW7DoW1pY2EuIFBhcmEgdW4gZXZlbnRvIGNvbiBwcm9iYWJpbGlkYWQgJFAkLCBsYSBmb3JtYSBtw6FzIGVmaWNpZW50ZSBkZSBhbG1hY2VuYXJsbyByZXF1aWVyZSAkLWxvZ18yKFApJCBiaXRzLg0KDQpTaSByZWN1cnJpbW9zIGEgbnVlc3RyYSDDumx0aW1hIGbDs3JtdWxhIHkgdXRpbGl6YW1vcyBlbCBlbnVuY2lhZG8gZGUgU2hhbm5vbiwgbGxlZ2FyZW1vcyBhIHVuYSBlY3VhY2nDs24gY29ub2NpZGEgY29tbyBsYSBkZWwgbGFyZ28gbcOtbmltbzoNCg0KJCQNCntofV97Zn09YXJnbWluXGxlZnRbbGFyZ28oUChEfGgpKS1sYXJnbyhQKEQpKVxyaWdodF0NCiQkDQoNClBlcm8gwr9wYXJhIHF1w6kgc2lydmUgaGFiZXIgbGxlZ2FkbyBoYXN0YSBhY8OhPyBMYSBmaWxvc29mw61hIG5vcyBkaXLDoS4NCg0KIyMgKioyLjMuIExhIG5hdmFqYSBkZSBPY2toYW0qKg0KDQpBIFdpbGxpYW0gZGUgT2NraGFtICgxMjg3LTEzNDcpLCB0ZcOzbG9nbyBmcmFuY2lzY2FubyBpbmdsw6lzIHkgZmlsw7Nzb2ZvIG1lZGlldmFsIHNlIGxlIGF0cmlidcOtYW4gbGFzIHBhbGFicmFzOg0KDQokJA0KXHRleHR7RW50aWEgbm9uIHN1bnQgbXVsdGlwbGljYW5kYSBwcmFldGVyIG5lY2Vzc2l0YXRlbS59DQokJA0KDQpFcyBkZWNpciwgJydsYXMgZW50aWRhZGVzIG5vIGRlYmVuIHNlciBtdWx0aXBsaWNhZGFzIG3DoXMgYWxsw6EgZGUgbG8gbmVjZXNhcmlvJycuIERlIGVzdGEgZnJhc2UgbmFjZSBlbCBwcmluY2lwaW8gZGUgbGEgbMOzZ2ljYSBjb25vY2lkbyBjb21vIGxhIG5hdmFqYSBkZSBPY2toYW0uIELDoXNpY2FtZW50ZSwgYXBsaWNhZGEgYSBudWVzdHJvIGNhbXBvLCBlc3RhIG5vcyBkaWNlIHF1ZSBzZSBwdWVkZSBkaXN0aW5ndWlyIGVudHJlIGRvcyBoaXDDs3Rlc2lzIGNhbmRpZGF0YXMgeWEgc2VhICoqZWxpbWluYW5kbyoqIHN1cHVlc3RvcyBpbm5lY2VzYXJpb3MgbyAqKnJlY29ydGFuZG8qKiBkb3MgY29uY2x1c2lvbmVzIHNpbWlsYXJlcy4gRXMgZGVjaXIsIGRlYmVtb3MgaW50ZW50YXIgdHJhYmFqYXIgY29uIGxhIGhpcMOzdGVzaXMgbcOhcyBzaW1wbGUsIGFxdWVsbGEgcXVlIHB1ZWRhIGV4cGxpY2FyIG51ZXN0cm9zIGRhdG9zIGRlIHVuYSBtYW5lcmEgc2F0aXNmYWN0b3JpYS4NCg0KIVtdKGZpZ3MvMDVfTW9kZWxfVHJhZGVvb2ZmLnBuZyl7d2lkdGg9IjEwMCUifQ0KDQojICoqMy4gRWwgYXByZW5kaXphamUgYXV0b23DoXRpY28gZGVudHJvIGRlbCBQTE4qKg0KDQpQYXJhIHJlZnJlc2NhciBsYXMgY29uZXhpb25lcyBlbnRyZSBlbCBwcm9jZXNhbWllbnRvIGRlbCBsZW5ndWFqZSBuYXR1cmFsLCBsYSBpbnRlbGlnZW5jaWEgYXJ0aWZpY2lhbCB5IGVsIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvLCByZXZpc2FyZW1vcyBlbCBjYXDDrXR1bG8gMSBkZSBlc3RlIGN1cnNvOiBbQ2Fww610dWxvIDE6IEludHJvZHVjY2nDs24gYWwgcHJvY2VzYW1pZW50byBkZWwgbGVuZ3VhamUgbmF0dXJhbF0oaHR0cHM6Ly9ycHVicy5jb20vaHVnb3BvcnJhcy9ubHBfY2FwaXR1bG8xKS4NCg0KQXPDrSwgZWwgUExOIHB1ZWRlIHNlciBjb21iaW5hZG8gY29uIGVsIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvIGVuIHZhcmlhcyB0YXJlYXMsIHNlYW4gZXN0YXMgZXNwZWPDrWZpY2FzIGFsIGNhbXBvIG8gbm8uIEVzdGFzIGluY2x1eWVuIChwZXJvIG5vIHNlIGxpbWl0YW4pOg0KDQotICAgRXRpcXVldGFkbyBtb3Jmb3NpbnTDoWN0aWNvDQoNCi0gICBBbsOhbGlzaXMgc2ludMOhY3RpY28NCg0KLSAgIEFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3MNCg0KLSAgIERlc2FtYmlndWFjacOzbiBkZSBwYWxhYnJhcw0KDQotICAgQ2xhc2lmaWNhY2nDs24gZGUgdGV4dG9zDQoNCi0gICBQcmVkaWNjacOzbiBkZWwgcHJlY2lvIGRlIGxhcyBhY2Npb25lcw0KDQotICAgQWdydXBhbWllbnRvIGRlIHRlbcOhdGljYXMNCg0KLSAgIFByZWRpY2Npw7NuIGRlIHRleHRvDQoNCi0gICBEZXRlY2Npw7NuIGRlIG5vdGljaWFzIGZhbHNhcywgZXRjLg0KDQohW10oZmlncy8wNV9NTC5wbmcpe3dpZHRoPSI1MCUifQ0KDQojICoqNC4gQmlibGlvZ3JhZsOtYSoqDQo=