Identificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidos

El presente documento provee una alternativa de observabilidad y monitoreo sobre sistemas distribuidos utilizando herramientas de software libre, presentando una plataforma de visualización de observabilidad. Además de identificar las mejores prácticas a la hora de monitorear aplicaciones reactivas...

Full description

Autores:
Benedetti Velasquez, Adolfo Enrique
Tipo de recurso:
Trabajo de grado de pregrado
Fecha de publicación:
2021
Institución:
Universidad Distrital Francisco José de Caldas
Repositorio:
RIUD: repositorio U. Distrital
Idioma:
spa
OAI Identifier:
oai:repository.udistrital.edu.co:11349/29109
Acceso en línea:
http://hdl.handle.net/11349/29109
Palabra clave:
Quarkus
Java
Jaeger
Búsqueda elástica
Observabilidad
Rastreo
Ingeniería de Sistemas - Tesis y disertaciones académicas
Java (Programa para computador)
Sistemas de archivos distribuidos
Sistemas multimedia distribuidos
Software libre
Quarkus
Java
Jaeger
Elastic search
Observability
Tracking
Rights
License
Atribución 4.0 Internacional
id UDISTRITA2_ad50cbc2d032ae14a4505e91b259589e
oai_identifier_str oai:repository.udistrital.edu.co:11349/29109
network_acronym_str UDISTRITA2
network_name_str RIUD: repositorio U. Distrital
repository_id_str
dc.title.spa.fl_str_mv Identificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidos
dc.title.alternative.spa.fl_str_mv Identification of the impact of observability and monitoring on reactive systems in distributed environments
dc.title.titleenglish.spa.fl_str_mv Identification of the impact of observation and monitoring on reactive systems in distributed environments
title Identificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidos
spellingShingle Identificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidos
Quarkus
Java
Jaeger
Búsqueda elástica
Observabilidad
Rastreo
Ingeniería de Sistemas - Tesis y disertaciones académicas
Java (Programa para computador)
Sistemas de archivos distribuidos
Sistemas multimedia distribuidos
Software libre
Quarkus
Java
Jaeger
Elastic search
Observability
Tracking
title_short Identificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidos
title_full Identificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidos
title_fullStr Identificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidos
title_full_unstemmed Identificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidos
title_sort Identificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidos
dc.creator.fl_str_mv Benedetti Velasquez, Adolfo Enrique
dc.contributor.advisor.none.fl_str_mv Parra Peña, John Freddy
Daza Corredor, Alejandro Paolo
dc.contributor.author.none.fl_str_mv Benedetti Velasquez, Adolfo Enrique
dc.subject.spa.fl_str_mv Quarkus
Java
Jaeger
Búsqueda elástica
Observabilidad
Rastreo
topic Quarkus
Java
Jaeger
Búsqueda elástica
Observabilidad
Rastreo
Ingeniería de Sistemas - Tesis y disertaciones académicas
Java (Programa para computador)
Sistemas de archivos distribuidos
Sistemas multimedia distribuidos
Software libre
Quarkus
Java
Jaeger
Elastic search
Observability
Tracking
dc.subject.lemb.spa.fl_str_mv Ingeniería de Sistemas - Tesis y disertaciones académicas
Java (Programa para computador)
Sistemas de archivos distribuidos
Sistemas multimedia distribuidos
Software libre
dc.subject.keyword.spa.fl_str_mv Quarkus
Java
Jaeger
Elastic search
Observability
Tracking
description El presente documento provee una alternativa de observabilidad y monitoreo sobre sistemas distribuidos utilizando herramientas de software libre, presentando una plataforma de visualización de observabilidad. Además de identificar las mejores prácticas a la hora de monitorear aplicaciones reactivas en sistemas distribuidos escalables. Explorar los diferentes frameworks reactivos disponibles dentro del software libre que hagan uso de la máquina virtual de Java. Presentar como algunos frameworks libres que usan programación asincrónica en la máquina virtual de Java, son herramientas accesibles y eficientes para escribir de forma asíncrona aplicaciones escalables enfocadas a la nube. Y para finalizar construye un prototipo observable reactivo con su respectivo cliente de carga usando alguno de estos frameworks. El rápido escalamiento de compañías de internet, y posteriores subproductos de la nube como Amazon AWS o Google Cloud, combinado con herramientas enfocadas a infraestructura como Containers y Kubernetes, han abierto una nueva era de sistemas distribuidos operando en cientos de nodos alrededor de múltiples centros de datos. Arquitecturas enfocadas a microservicios actualmente han incrementando la complejidad de estos sistemas exponencialmente, a pesar de que permiten a los sistemas responder en un tiempo aceptable, escalar vertical y horizontalmente, permitir flujos de datos de forma asíncrona, hace aún más difícil monitorear el estatus actual de dichos sistemas. La programación asincrónica es clave para maximizar el uso de estos nuevos recursos de hardware, ya que permite lidiar con más conexiones concurrentes que con los paradigmas tradicionales de bloqueo de E / S (Entrada/ Salida). Los servicios deben atender las cargas de trabajo que pueden cambiar drásticamente de una hora a otra, por lo tanto, debemos diseñar un código que admita naturalmente la escalabilidad horizontal. Pero esto solo incrementa la complejidad de las aplicaciones, algo para lo cual el monitoreo de microservicios reactivos no estaba diseñado inicialmente. El monitoreo de microservicios reactivos se puede realizar haciendo uso combinado del clásico registro de eventos (Logging), rastreo distribuido y combinado esto con métricas, en los ambientes donde estos sistemas sean desplegados.
publishDate 2021
dc.date.created.none.fl_str_mv 2021-06
dc.date.issued.none.fl_str_mv 2021-06-28
dc.date.accessioned.none.fl_str_mv 2022-05-25T17:17:40Z
dc.date.available.none.fl_str_mv 2022-05-25T17:17:40Z
dc.type.spa.fl_str_mv Thesis
dc.type.degree.spa.fl_str_mv Creación o Interpretación
dc.type.driver.spa.fl_str_mv info:eu-repo/semantics/bachelorThesis
dc.type.coar.spa.fl_str_mv http://purl.org/coar/resource_type/c_7a1f
format http://purl.org/coar/resource_type/c_7a1f
dc.identifier.citation.spa.fl_str_mv 20-2021-040
dc.identifier.uri.none.fl_str_mv http://hdl.handle.net/11349/29109
identifier_str_mv 20-2021-040
url http://hdl.handle.net/11349/29109
dc.language.iso.spa.fl_str_mv spa
language spa
dc.relation.ispartofseries.none.fl_str_mv 20-2021-040;
dc.rights.*.fl_str_mv Atribución 4.0 Internacional
dc.rights.coar.fl_str_mv http://purl.org/coar/access_right/c_abf2
dc.rights.uri.*.fl_str_mv http://creativecommons.org/licenses/by/4.0/
dc.rights.acceso.spa.fl_str_mv Abierto (Texto Completo)
rights_invalid_str_mv Atribución 4.0 Internacional
http://creativecommons.org/licenses/by/4.0/
Abierto (Texto Completo)
http://purl.org/coar/access_right/c_abf2
dc.format.mimetype.spa.fl_str_mv pdf
dc.publisher.spa.fl_str_mv Proyecto curricular de Ingeniería de Sistemas
institution Universidad Distrital Francisco José de Caldas
bitstream.url.fl_str_mv http://repository.udistrital.edu.co/bitstream/11349/29109/10/BenedettiVelasquezAdolfoEnrique2021.pdf
http://repository.udistrital.edu.co/bitstream/11349/29109/9/Licencia%20y%20autorizacio%cc%81n%20de%20los%20autores%20para%20publicar.pdf
http://repository.udistrital.edu.co/bitstream/11349/29109/12/license_rdf
http://repository.udistrital.edu.co/bitstream/11349/29109/13/license.txt
http://repository.udistrital.edu.co/bitstream/11349/29109/14/BenedettiVelasquezAdolfoEnrique2021.pdf.jpg
http://repository.udistrital.edu.co/bitstream/11349/29109/15/Licencia%20y%20autorizacio%cc%81n%20de%20los%20autores%20para%20publicar.pdf.jpg
bitstream.checksum.fl_str_mv 094ee462ebc2a3ba11e9880b22e38ebe
4928cdd4220ae4693e429ac74cdcdaf0
1608e658af296c3febc577e957e919bf
997daf6c648c962d566d7b082dac908d
42c64fec61eedca6a6472bcc2ebbdad3
a6bc0139dddc493af9461cfcb84c7f54
bitstream.checksumAlgorithm.fl_str_mv MD5
MD5
MD5
MD5
MD5
MD5
repository.name.fl_str_mv Repositorio Institucional Universidad Distrital - RIUD
repository.mail.fl_str_mv repositorio@udistrital.edu.co
_version_ 1803712672973193216
spelling Parra Peña, John FreddyDaza Corredor, Alejandro PaoloBenedetti Velasquez, Adolfo EnriqueBenedetti Velásquez, Adolfo Enrique2022-05-25T17:17:40Z2022-05-25T17:17:40Z2021-062021-06-2820-2021-040http://hdl.handle.net/11349/29109El presente documento provee una alternativa de observabilidad y monitoreo sobre sistemas distribuidos utilizando herramientas de software libre, presentando una plataforma de visualización de observabilidad. Además de identificar las mejores prácticas a la hora de monitorear aplicaciones reactivas en sistemas distribuidos escalables. Explorar los diferentes frameworks reactivos disponibles dentro del software libre que hagan uso de la máquina virtual de Java. Presentar como algunos frameworks libres que usan programación asincrónica en la máquina virtual de Java, son herramientas accesibles y eficientes para escribir de forma asíncrona aplicaciones escalables enfocadas a la nube. Y para finalizar construye un prototipo observable reactivo con su respectivo cliente de carga usando alguno de estos frameworks. El rápido escalamiento de compañías de internet, y posteriores subproductos de la nube como Amazon AWS o Google Cloud, combinado con herramientas enfocadas a infraestructura como Containers y Kubernetes, han abierto una nueva era de sistemas distribuidos operando en cientos de nodos alrededor de múltiples centros de datos. Arquitecturas enfocadas a microservicios actualmente han incrementando la complejidad de estos sistemas exponencialmente, a pesar de que permiten a los sistemas responder en un tiempo aceptable, escalar vertical y horizontalmente, permitir flujos de datos de forma asíncrona, hace aún más difícil monitorear el estatus actual de dichos sistemas. La programación asincrónica es clave para maximizar el uso de estos nuevos recursos de hardware, ya que permite lidiar con más conexiones concurrentes que con los paradigmas tradicionales de bloqueo de E / S (Entrada/ Salida). Los servicios deben atender las cargas de trabajo que pueden cambiar drásticamente de una hora a otra, por lo tanto, debemos diseñar un código que admita naturalmente la escalabilidad horizontal. Pero esto solo incrementa la complejidad de las aplicaciones, algo para lo cual el monitoreo de microservicios reactivos no estaba diseñado inicialmente. El monitoreo de microservicios reactivos se puede realizar haciendo uso combinado del clásico registro de eventos (Logging), rastreo distribuido y combinado esto con métricas, en los ambientes donde estos sistemas sean desplegados.This document provides an alternative for observability and monitoring on distributed systems using free software tools, presenting an observability visualisation platform. In addition to identifying best practices when monitoring reactive applications in scalable distributed systems. Also, exploring the different reactive frameworks available within free software that make use of the Java virtual machine. Showing how some free frameworks that use asynchronous programming in the Java virtual machine are accessible and efficient tools to write scalable cloud-focused applications asynchronously. And finally, build a reactive observable prototype with its respective load client. T he fast grow of internet companies, and subsequent cloud by-products such as Amazon AWS or Google Cloud, combined with infrastructure-focused tools such as Containers and Kubernetes, have opened a new era of distributed systems operating in hundreds of nodes around multiple hubs. Architectures focused on microservices currently have increasing the complexity of these systems exponentially, although they allow systems to respond in an acceptable time, scale vertically and horizontally allowing data flows asynchronously is making more difficult to monitor the current status of such systems. Asynchronous programming is key to maximising the use of these new hardware resources, allowing to deal with more concurrent connections than with traditional I/O blocking paradigms. Services must cater for workloads that can change dramatically from hour to hour, therefore we must design code that naturally supports horizontal scalability. But this only increases the complexity of the applications, something for which reactive microservices monitoring was not designed initially. The monitoring of reactive microservices can be carried out by making combined use of the classic event logging and distributed tracing in the environments where these systems are deployed.pdfspaProyecto curricular de Ingeniería de Sistemas20-2021-040;Atribución 4.0 Internacionalhttp://creativecommons.org/licenses/by/4.0/Abierto (Texto Completo)http://purl.org/coar/access_right/c_abf2QuarkusJavaJaegerBúsqueda elásticaObservabilidadRastreoIngeniería de Sistemas - Tesis y disertaciones académicasJava (Programa para computador)Sistemas de archivos distribuidosSistemas multimedia distribuidosSoftware libreQuarkusJavaJaegerElastic searchObservabilityTrackingIdentificación del impacto de la observación y el monitoreo sobre sistemas reactivos en ambientes distribuidosIdentification of the impact of observability and monitoring on reactive systems in distributed environmentsIdentification of the impact of observation and monitoring on reactive systems in distributed environmentsThesisCreación o Interpretacióninfo:eu-repo/semantics/bachelorThesishttp://purl.org/coar/resource_type/c_7a1fORIGINALBenedettiVelasquezAdolfoEnrique2021.pdfBenedettiVelasquezAdolfoEnrique2021.pdfapplication/pdf6741629http://repository.udistrital.edu.co/bitstream/11349/29109/10/BenedettiVelasquezAdolfoEnrique2021.pdf094ee462ebc2a3ba11e9880b22e38ebeMD510open accessLicencia y autorización de los autores para publicar.pdfLicencia y autorización de los autores para publicar.pdfLicenciaapplication/pdf6730831http://repository.udistrital.edu.co/bitstream/11349/29109/9/Licencia%20y%20autorizacio%cc%81n%20de%20los%20autores%20para%20publicar.pdf4928cdd4220ae4693e429ac74cdcdaf0MD59metadata only accessCC-LICENSElicense_rdflicense_rdfapplication/rdf+xml; charset=utf-8914http://repository.udistrital.edu.co/bitstream/11349/29109/12/license_rdf1608e658af296c3febc577e957e919bfMD512open accessLICENSElicense.txtlicense.txttext/plain; charset=utf-87167http://repository.udistrital.edu.co/bitstream/11349/29109/13/license.txt997daf6c648c962d566d7b082dac908dMD513open accessTHUMBNAILBenedettiVelasquezAdolfoEnrique2021.pdf.jpgBenedettiVelasquezAdolfoEnrique2021.pdf.jpgIM Thumbnailimage/jpeg6849http://repository.udistrital.edu.co/bitstream/11349/29109/14/BenedettiVelasquezAdolfoEnrique2021.pdf.jpg42c64fec61eedca6a6472bcc2ebbdad3MD514open accessLicencia y autorización de los autores para publicar.pdf.jpgLicencia y autorización de los autores para publicar.pdf.jpgIM Thumbnailimage/jpeg13813http://repository.udistrital.edu.co/bitstream/11349/29109/15/Licencia%20y%20autorizacio%cc%81n%20de%20los%20autores%20para%20publicar.pdf.jpga6bc0139dddc493af9461cfcb84c7f54MD515open access11349/29109oai:repository.udistrital.edu.co:11349/291092023-06-09 16:07:27.145open accessRepositorio Institucional Universidad Distrital - RIUDrepositorio@udistrital.edu.coTElDRU5DSUEgWSBBVVRPUklaQUNJw5NOIEVTUEVDSUFMIFBBUkEgUFVCTElDQVIgWSBQRVJNSVRJUiBMQSBDT05TVUxUQSBZIFVTTyBERSBDT05URU5JRE9TIEVOIEVMIFJFUE9TSVRPUklPIElOU1RJVFVDSU9OQUwgREUgTEEgVU5JVkVSU0lEQUQgRElTVFJJVEFMCgpUw6lybWlub3MgeSBjb25kaWNpb25lcyBkZSB1c28gcGFyYSBwdWJsaWNhY2nDs24gZGUgb2JyYXMgZW4gZWwgUmVwb3NpdG9yaW8gSW5zdGl0dWNpb25hbCBkZSBsYSBVbml2ZXJzaWRhZCBEaXN0cml0YWwgRnJhbmNpc2NvIEpvc8OpIGRlIENhbGRhcyAoUklVRCkKCkNvbW8gdGl0dWxhcihlcykgZGVsKG9zKSBkZXJlY2hvKHMpIGRlIGF1dG9yLCBjb25maWVybyAoZXJpbW9zKSBhIGxhIFVuaXZlcnNpZGFkIERpc3RyaXRhbCBGcmFuY2lzY28gSm9zw6kgZGUgQ2FsZGFzIChlbiBhZGVsYW50ZSwgTEEgVU5JVkVSU0lEQUQpIHVuYSBsaWNlbmNpYSBwYXJhIHVzbyBubyBleGNsdXNpdmEsIGxpbWl0YWRhIHkgZ3JhdHVpdGEgc29icmUgbGEgb2JyYSBxdWUgaW50ZWdyYXLDoSBlbCBSZXBvc2l0b3JpbyBJbnN0aXR1Y2lvbmFsIChlbiBhZGVsYW50ZSwgUklVRCksIGRlIGFjdWVyZG8gYSBsYXMgc2lndWllbnRlcyByZWdsYXMsIGxhcyBjdWFsZXMgZGVjbGFybyAoYW1vcykgY29ub2NlciB5IGFjZXB0YXI6CgphKQlFc3RhcsOhIHZpZ2VudGUgYSBwYXJ0aXIgZGUgbGEgZmVjaGEgZW4gcXVlIHNlIGluY2x1eWEgZW4gZWwgUklVRCB5IGhhc3RhIHBvciB1biBwbGF6byBkZSBkaWV6ICgxMCkgQcOxb3MsIHByb3Jyb2dhYmxlIGluZGVmaW5pZGFtZW50ZSBwb3IgZWwgdGllbXBvIHF1ZSBkdXJlIGVsIGRlcmVjaG8gUGF0cmltb25pYWwgZGVsIGF1dG9yOyBsYSBjdWFsIHBvZHLDoSBkYXJzZSBwb3IgdGVybWluYWRhIHByZXZpYSBzb2xpY2l0dWQgYSBMQSBVTklWRVJTSURBRCBwb3IgZXNjcml0byBjb24gdW5hIGFudGVsYWNpw7NuIGRlIGRvcyAoMikgbWVzZXMgYW50ZXMgZGVsIHZlbmNpbWllbnRvIGRlbCBwbGF6byBpbmljaWFsIG8gZWwgZGUgc3UocykgcHLDs3Jyb2dhKHMpLgoKYikJTEEgVU5JVkVSU0lEQUQgcG9kcsOhIHB1YmxpY2FyIGxhIG9icmEgZW4gbGFzIGRpc3RpbnRhcyB2ZXJzaW9uZXMgcmVxdWVyaWRhcyBwb3IgZWwgUklVRCAoZGlnaXRhbCwgaW1wcmVzbywgZWxlY3Ryw7NuaWNvIHUgb3RybyBtZWRpbyBjb25vY2lkbyBvIHBvciBjb25vY2VyKSBMQSBVTklWRVJTSURBRCBubyBzZXLDoSByZXNwb25zYWJsZSBlbiBlbCBldmVudG8gcXVlIGVsIGRvY3VtZW50byBhcGFyZXpjYSByZWZlcmVuY2lhZG8gZW4gbW90b3JlcyBkZSBiw7pzcXVlZGEgbyByZXBvc2l0b3Jpb3MgZGlmZXJlbnRlcyBhbCBSSVVELCB1bmEgdmV6IGVsKG9zKSBhdXRvcihlcykgc29saWNpdGVuIHN1IGVsaW1pbmFjacOzbiBkZWwgUklVRCwgZGFkbyBxdWUgbGEgbWlzbWEgc2Vyw6EgcHVibGljYWRhIGVuIEludGVybmV0LgoKYykJTGEgYXV0b3JpemFjacOzbiBzZSBoYWNlIGEgdMOtdHVsbyBncmF0dWl0bywgcG9yIGxvIHRhbnRvLCBsb3MgYXV0b3JlcyByZW51bmNpYW4gYSByZWNpYmlyIGJlbmVmaWNpbyBhbGd1bm8gcG9yIGxhIHB1YmxpY2FjacOzbiwgZGlzdHJpYnVjacOzbiwgY29tdW5pY2FjacOzbiBww7pibGljYSB5IGN1YWxxdWllciBvdHJvIHVzbyBxdWUgc2UgaGFnYSBlbiBsb3MgdMOpcm1pbm9zIGRlIGxhIHByZXNlbnRlIGxpY2VuY2lhIHkgZGUgbGEgbGljZW5jaWEgZGUgdXNvIGNvbiBxdWUgc2UgcHVibGljYSAoQ3JlYXRpdmUgQ29tbW9ucykuCgpkKQlMb3MgY29udGVuaWRvcyBwdWJsaWNhZG9zIGVuIGVsIFJJVUQgc29uIG9icmEocykgb3JpZ2luYWwoZXMpIHNvYnJlIGxhIGN1YWwoZXMpIGVsKG9zKSBhdXRvcihlcykgY29tbyB0aXR1bGFyZXMgZGUgbG9zIGRlcmVjaG9zIGRlIGF1dG9yLCBhc3VtZW4gdG90YWwgcmVzcG9uc2FiaWxpZGFkIHBvciBlbCBjb250ZW5pZG8gZGUgc3Ugb2JyYSBhbnRlIExBIFVOSVZFUlNJREFEIHkgYW50ZSB0ZXJjZXJvcy4gRW4gdG9kbyBjYXNvIExBIFVOSVZFUlNJREFEIHNlIGNvbXByb21ldGUgYSBpbmRpY2FyIHNpZW1wcmUgbGEgYXV0b3LDrWEgaW5jbHV5ZW5kbyBlbCBub21icmUgZGVsIGF1dG9yIHkgbGEgZmVjaGEgZGUgcHVibGljYWNpw7NuLgoKZSkJTEEgVU5JVkVSU0lEQUQgcG9kcsOhIGluY2x1aXIgbGEgb2JyYSBlbiBsb3Mgw61uZGljZXMgeSBidXNjYWRvcmVzIHF1ZSBlc3RpbWVuIG5lY2VzYXJpb3MgcGFyYSBtYXhpbWl6YXIgbGEgdmlzaWJpbGlkYWQgZWwgdXNvIHkgZWwgaW1wYWN0byBkZSBsYSBwcm9kdWNjacOzbiBjaWVudMOtZmljYSwgYXJ0w61zdGljYSB5IGFjYWTDqW1pY2EgZW4gbGEgY29tdW5pZGFkIGxvY2FsLCBuYWNpb25hbCBvIGludGVybmFjaW9uYWwuCgoKZikJTEEgVU5JVkVSU0lEQUQgcG9kcsOhIGNvbnZlcnRpciBsYSBvYnJhIGEgY3VhbHF1aWVyIG1lZGlvIG8gZm9ybWF0byBjb24gZWwgZmluIGRlIHN1IHByZXNlcnZhY2nDs24gZW4gZWwgdGllbXBvIHF1ZSBsYSBwcmVzZW50ZSBsaWNlbmNpYSB5IGxhIGRlIHN1cyBwcsOzcnJvZ2FzLgoKCkNvbiBiYXNlIGVuIGxvIGFudGVyaW9yIGF1dG9yaXpvKGFtb3MpLCBhIGZhdm9yIGRlbCBSSVVEIHkgZGUgc3VzIHVzdWFyaW9zLCBsYSBwdWJsaWNhY2nDs24geSBjb25zdWx0YSBkZSBsYSBzaWd1aWVudGUgb2JyYToKClRpdHVsbwoKQXV0b3IgICAgICAgQXBlbGxpZG9zICAgICAgICAgTm9tYnJlcwoKMQoKMgoKMwoKCmcpCUF1dG9yaXpvKGFtb3MpLCBxdWUgbGEgb2JyYSBzZWEgcHVlc3RhIGEgZGlzcG9zaWNpw7NuIGRlbCBww7pibGljbyBlbiBsb3MgdMOpcm1pbm9zIGVzdGFibGVjaWRvcyBlbiBsb3MgbGl0ZXJhbGVzIGFudGVyaW9yZXMsIGJham8gbG9zIGzDrW1pdGVzIGRlZmluaWRvcyBwb3IgTEEgVU5JVkVSU0lEQUQsIGVuIGxhcyDigJxDb25kaWNpb25lcyBkZSB1c28gZGUgZXN0cmljdG8gY3VtcGxpbWllbnRv4oCdIGRlIGxvcyByZWN1cnNvcyBwdWJsaWNhZG9zIGVuIGVsIFJJVUQsIGN1eW8gdGV4dG8gY29tcGxldG8gc2UgcHVlZGUgY29uc3VsdGFyIGVuIGh0dHA6Ly9yZXBvc2l0b3J5LnVkaXN0cml0YWwuZWR1LmNvLwoKaCkJQ29ub3pjbyhjZW1vcykgeSBhY2VwdG8oYW1vcykgcXVlIG90b3JnbyhhbW9zKSB1bmEgbGljZW5jaWEgZXNwZWNpYWwgcGFyYSBwdWJsaWNhY2nDs24gZGUgb2JyYXMgZW4gZWwgUmVwb3NpdG9yaW8gSW5zdGl0dWNpb25hbCBkZSBsYSBVbml2ZXJzaWRhZCBEaXN0cml0YWwgRnJhbmNpc2NvIEpvc8OpIGRlIENhbGRhcywgbGljZW5jaWEgICBkZSBsYSBjdWFsIGhlIChoZW1vcykgb2J0ZW5pZG8gdW5hIGNvcGlhLgoKaSkJTWFuaWZpZXN0byhhbW9zKSBtaSAobnVlc3RybykgdG90YWwgYWN1ZXJkbyBjb24gbGFzIGNvbmRpY2lvbmVzIGRlIHVzbyB5IHB1YmxpY2FjacOzbiBlbiBlbCBSZXBvc2l0b3JpbyBJbnN0aXR1Y2lvbmFsIGRlIGxhIFVuaXZlcnNpZGFkIERpc3RyaXRhbCBGcmFuY2lzY28gSm9zw6kgZGUgQ2FsZGFzIHF1ZSBzZSBkZXNjcmliZW4geSBleHBsaWNhbiBlbiBlbCBwcmVzZW50ZSBkb2N1bWVudG8uCgpqKQlDb25vemNvKGNlbW9zKSBsYSBub3JtYXRpdmlkYWQgaW50ZXJuYSBkZSAgTEEgVU5JVkVSU0lEQUQ7IGVuIGNvbmNyZXRvLCBlbCBBY3VlcmRvIDAwNCBkZSAyMDEyIGRlbCBDU1UsIEFjdWVyZG8gMDIzIGRlIDIwMTIgZGVsIENTVSBzb2JyZSBQb2zDrXRpY2EgRWRpdG9yaWFsLCBBY3VlcmRvIDAyNiAgZGVsIDMxIGRlIGp1bGlvIGRlIDIwMTIgc29icmUgZWwgcHJvY2VkaW1pZW50byBwYXJhIGxhIHB1YmxpY2FjacOzbiBkZSB0ZXNpcyBkZSBwb3N0Z3JhZG8gZGUgbG9zIGVzdHVkaWFudGVzIGRlIGxhIFVuaXZlcnNpZGFkIERpc3RyaXRhbCBGcmFuY2lzY28gSm9zw6kgZGUgQ2FsZGFzLCAgQWN1ZXJkbyAwMzAgZGVsIDAzIGRlIGRpY2llbWJyZSBkZSAyMDEzIHBvciBtZWRpbyBkZWwgY3VhbCBzZSBjcmVhIGVsIFJlcG9zaXRvcmlvIEluc3RpdHVjaW9uYWwgZGUgbGEgVW5pdmVyc2lkYWQgRGlzdHJpdGFsIEZyYW5jaXNjbyBKb3PDqSBkZSBDYWxkYXMsIEFjdWVyZG8gMDM4IGRlIDIwMTUgMjAxNSDigJxwb3IgZWwgY3VhbCBzZSBtb2RpZmljYSBlbCBBY3VlcmRvIDAzMSBkZSAyMDE0IGRlIDIwMTQgcXVlIHJlZ2xhbWVudGEgZWwgdHJhYmFqbyBkZSBncmFkbyBwYXJhIGxvcyBlc3R1ZGlhbnRlcyBkZSBwcmVncmFkbyBkZSBsYSBVbml2ZXJzaWRhZCBEaXN0cml0YWwgRnJhbmNpc2NvIEpvc8OpIGRlIENhbGRhcyB5IHNlIGRpY3RhbiBvdHJhcyBkaXJlY3RyaWNlc+KAnSB5IGxhcyBkZW3DoXMgbm9ybWFzIGNvbmNvcmRhbnRlIHkgY29tcGxlbWVudGFyaWFzIHF1ZSByaWdlbiBhbCByZXNwZWN0bywgZXNwZWNpYWxtZW50ZSBsYSBsZXkgMjMgZGUgMTk4MiwgbGEgbGV5IDQ0IGRlIDE5OTMgeSBsYSBkZWNpc2nDs24gQW5kaW5hIDM1MSBkZSAxOTkzLiBFc3RvcyBkb2N1bWVudG9zIHBvZHLDoW4gc2VyIGNvbnN1bHRhZG9zIHkgZGVzY2FyZ2Fkb3MgZW4gZWwgcG9ydGFsIHdlYiBkZSBsYSBiaWJsaW90ZWNhIGh0dHA6Ly9zaXN0ZW1hZGViaWJsaW90ZWNhcy51ZGlzdHJpdGFsLmVkdS5jby8KCmspCUFjZXB0byhhbW9zKSBxdWUgTEEgVU5JVkVSU0lEQUQgbm8gc2UgcmVzcG9uc2FiaWxpemEgcG9yIGxhcyBpbmZyYWNjaW9uZXMgYSBsYSBwcm9waWVkYWQgaW50ZWxlY3R1YWwgbyBEZXJlY2hvcyBkZSBBdXRvciBjYXVzYWRhcyBwb3IgbG9zIHRpdHVsYXJlcyBkZSBsYSBwcmVzZW50ZSBMaWNlbmNpYSB5IGRlY2xhcmFtb3MgcXVlIG1hbnRlbmRyw6kgKGVtb3MpIGluZGVtbmUgYSBMQSBVTklWRVJTSURBRCBwb3IgbGFzIHJlY2xhbWFjaW9uZXMgbGVnYWxlcyBkZSBjdWFscXVpZXIgdGlwbyBxdWUgbGxlZ2FyZW4gYSBwcmVzZW50YXJzZSBwb3IgdmlvbGFjacOzbiBkZSBkZXJlY2hvcyBhIGxhIHByb3BpZWRhZCBpbnRlbGVjdHVhbCBvIGRlIEF1dG9yIHJlbGFjaW9uYWRvcyBjb24gbG9zIGRvY3VtZW50b3MgcmVnaXN0cmFkb3MgZW4gZWwgUklVRC4KCmwpCUVsIChsb3MpIGF1dG9yKGVzKSBtYW5pZmllc3RhKG1vcykgcXVlIGxhIG9icmEgb2JqZXRvIGRlIGxhIHByZXNlbnRlIGF1dG9yaXphY2nDs24gZXMgb3JpZ2luYWwsIGRlIGV4Y2x1c2l2YSBhdXRvcsOtYSwgeSBzZSByZWFsaXrDsyBzaW4gdmlvbGFyIG8gdXN1cnBhciBkZXJlY2hvcyBkZSBhdXRvciBkZSB0ZXJjZXJvczsgZGUgdGFsIHN1ZXJ0ZSwgZW4gY2FzbyBkZSBwcmVzZW50YXJzZSBjdWFscXVpZXIgcmVjbGFtYWNpw7NuIG8gYWNjacOzbiBwb3IgcGFydGUgZGUgdW4gdGVyY2VybyBlbiBjdWFudG8gYSBsb3MgZGVyZWNob3MgZGUgYXV0b3Igc29icmUgbGEgb2JyYSwgZWwgKGxvcykgZXN0dWRpYW50ZShzKSDigJMgYXV0b3IoZXMpIGFzdW1pcsOhKG4pIHRvZGEgbGEgcmVzcG9uc2FiaWxpZGFkIHkgc2FsZHLDoShuKSBlbiBkZWZlbnNhIGRlIGxvcyBkZXJlY2hvcyBhcXXDrSBhdXRvcml6YWRvcy4gUGFyYSB0b2RvcyBsb3MgZWZlY3RvcywgTEEgVU5JVkVSU0lEQUQgYWN0w7phIGNvbW8gdW4gdGVyY2VybyBkZSBidWVuYSBmZS4KCgptKQlFbCAobG9zKSBhdXRvcihlcykgbWFuaWZpZXN0YShtb3MpIHF1ZSBjb25vemNvKGNlbW9zKSBsYSBhdXRvbm9tw61hIHkgbG9zIGRlcmVjaG9zLCBxdWUgcG9zZWUobW9zKSBzb2JyZSBsYSBvYnJhIHksIGNvbW8gdGFsLCBlcyAoc29tb3MpIHJlc3BvbnNhYmxlKHMpIGRlbCBhbGNhbmNlIGp1csOtZGljbyB5IGxlZ2FsLCBkZSBlc2NvZ2VyIGxhIG9wY2nDs24gZGUgbGEgcHVibGljYWNpw7NuIG8gZGUgcmVzdHJpY2Npw7NuIGRlIGxhIHB1YmxpY2FjacOzbiBkZWwgZG9jdW1lbnRvIHJlZ2lzdHJhZG8gZW4gZWwgUklVRC4KCgoKCgoKU0kgRUwgRE9DVU1FTlRPIFNFIEJBU0EgRU4gVU4gVFJBQkFKTyBRVUUgSEEgU0lETyBQQVRST0NJTkFETyBPIEFQT1lBRE8gUE9SIFVOQSBBR0VOQ0lBIE8gVU5BIE9SR0FOSVpBQ0nDk04sIENPTiBFWENFUENJw5NOIERFIExBIFVOSVZFUlNJREFEIERJU1RSSVRBTCBGUkFOQ0lTQ08gSk9TRSBERSBDQUxEQVMsIExPUyBBVVRPUkVTIEdBUkFOVElaQU4gUVVFIFNFIEhBIENVTVBMSURPIENPTiBMT1MKREVSRUNIT1MgWSBPQkxJR0FDSU9ORVMgUkVRVUVSSURPUyBQT1IgRUwgUkVTUEVDVElWTyBDT05UUkFUTyBPIEFDVUVSRE8uCgoKCgoKCgoKCgoKCgoKCgoKCgoKCkVuIGNvbnN0YW5jaWEgZGUgbG8gYW50ZXJpb3IsIGZpcm1vKGFtb3MpIGVsIHByZXNlbnRlIGRvY3VtZW50bywgZW4gbGEgY2l1ZGFkIGRlIEJvZ290w6EsIEQuQy4sIGEgbG9zCgoKRklSTUEgREUgTE9TIFRJVFVMQVJFUyBERSBERVJFQ0hPUyBERSBBVVRPUgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICAgQy5DLiBOby4gX19fX19fX19fX19fX19fX19fCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gICBDLkMuIE5vLiBfX19fX19fX19fX19fX19fX18KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgIEMuQy4gTm8uIF9fX19fX19fX19fX19fX19fXwoKCgpDb3JyZW8gRWxlY3Ryw7NuaWNvIEluc3RpdHVjaW9uYWwgZGVsIChkZSBsb3MpIEF1dG9yKGVzKToKCkF1dG9yCSAgICAgIENvcnJlbyBFbGVjdHLDs25pY28KCjEKCjIKCjMKCk5vbWJyZSBkZSBEaXJlY3RvcihlcykgZGUgR3JhZG86CgoxCgoyCgozCgpOb21icmUgRmFjdWx0YWQgeSBQcm95ZWN0byBDdXJyaWN1bGFyOgoKRmFjdWx0YWQJUHJveWVjdG8gQ3VycmljdWxhcgoKCgoKCgoKCk5vdGE6IEVuIGNhc28gcXVlIG5vIGVzdMOpIGRlIGFjdWVyZG8gY29uIGxhcyBjb25kaWNpb25lcyBkZSBsYSBwcmVzZW50ZSBsaWNlbmNpYSwgeSBtYW5pZmllc3RlIGFsZ3VuYSByZXN0cmljY2nDs24gc29icmUgbGEgb2JyYSwganVzdGlmaXF1ZSBsb3MgbW90aXZvcyBwb3IgbG9zIGN1YWxlcyBlbCBkb2N1bWVudG8geSBzdXMgYW5leG9zIG5vIHB1ZWRlbiBzZXIgcHVibGljYWRvcyBlbiBlbCBSZXBvc2l0b3JpbyBJbnN0aXR1Y2lvbmFsIGRlIGxhIFVuaXZlcnNpZGFkIERpc3RyaXRhbCBGcmFuY2lzY28gSm9zw6kgZGUgQ2FsZGFzIFJJVUQuCgoKU2kgcmVxdWllcmUgbcOhcyBlc3BhY2lvLCBwdWVkZSBhbmV4YXIgdW5hIGNvcGlhIHNpbWlsYXIgYSBlc3RhIGhvamEK