Aplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimiento

En este proyecto de grado, se abordó la creación de una aplicación web de enfoque distribuido, que utiliza técnicas avanzadas de Machine Learning y se apoya en bases de conocimiento, con el objetivo de identificar y resolver ambigüedades presentes en los requerimientos de software. Para lograrlo, se...

Full description

Autores:
Hernández Capera, Fabián Mauricio
Niño González, Julián David
Tipo de recurso:
Trabajo de grado de pregrado
Fecha de publicación:
2023
Institución:
Universidad Distrital Francisco José de Caldas
Repositorio:
RIUD: repositorio U. Distrital
Idioma:
spa
OAI Identifier:
oai:repository.udistrital.edu.co:11349/39845
Acceso en línea:
http://hdl.handle.net/11349/39845
Palabra clave:
Inteligencia Artificial
Detección de ambigüedades
Aplicación distribuida
Requerimientos de software
Machine Learning
Bases de conocimiento
Desarrollo de Software
Procesamiento de lenguaje natural
Aprendizaje automático
Ambigüedad en requisitos
Toma de decisiones
Validación automática de requisitos
Ingeniería Telemática -- Tesis y disertaciones académicas
Análisis de información -- Información
Aprendizaje automático -- Inteligencia artificial
Software -- Programación
Procesamiento electrónico de datos -- Bases de datos
Distributed application
Ambiguity detection
Software requirements
Machine Learning
Knowledge bases
software development
Natural language processing
Ambiguity in requirements
decision making
Automatic requirements validation
Artificial intelligence
Rights
License
Attribution-NonCommercial-NoDerivatives 4.0 Internacional
id UDISTRITA2_a194b0ec1dfdadae203b59559fc57e21
oai_identifier_str oai:repository.udistrital.edu.co:11349/39845
network_acronym_str UDISTRITA2
network_name_str RIUD: repositorio U. Distrital
repository_id_str
dc.title.spa.fl_str_mv Aplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimiento
dc.title.titleenglish.spa.fl_str_mv Distributed application for detecting ambiguities in software requirements using machine learning techniques and knowledge bases
title Aplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimiento
spellingShingle Aplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimiento
Inteligencia Artificial
Detección de ambigüedades
Aplicación distribuida
Requerimientos de software
Machine Learning
Bases de conocimiento
Desarrollo de Software
Procesamiento de lenguaje natural
Aprendizaje automático
Ambigüedad en requisitos
Toma de decisiones
Validación automática de requisitos
Ingeniería Telemática -- Tesis y disertaciones académicas
Análisis de información -- Información
Aprendizaje automático -- Inteligencia artificial
Software -- Programación
Procesamiento electrónico de datos -- Bases de datos
Distributed application
Ambiguity detection
Software requirements
Machine Learning
Knowledge bases
software development
Natural language processing
Ambiguity in requirements
decision making
Automatic requirements validation
Artificial intelligence
title_short Aplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimiento
title_full Aplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimiento
title_fullStr Aplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimiento
title_full_unstemmed Aplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimiento
title_sort Aplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimiento
dc.creator.fl_str_mv Hernández Capera, Fabián Mauricio
Niño González, Julián David
dc.contributor.advisor.none.fl_str_mv Hernández Gutiérrez, Jairo
dc.contributor.author.none.fl_str_mv Hernández Capera, Fabián Mauricio
Niño González, Julián David
dc.contributor.orcid.none.fl_str_mv Hernández Gutiérrez, Jairo [0000-0003-3908-2763]
dc.subject.spa.fl_str_mv Inteligencia Artificial
Detección de ambigüedades
Aplicación distribuida
Requerimientos de software
Machine Learning
Bases de conocimiento
Desarrollo de Software
Procesamiento de lenguaje natural
Aprendizaje automático
Ambigüedad en requisitos
Toma de decisiones
Validación automática de requisitos
topic Inteligencia Artificial
Detección de ambigüedades
Aplicación distribuida
Requerimientos de software
Machine Learning
Bases de conocimiento
Desarrollo de Software
Procesamiento de lenguaje natural
Aprendizaje automático
Ambigüedad en requisitos
Toma de decisiones
Validación automática de requisitos
Ingeniería Telemática -- Tesis y disertaciones académicas
Análisis de información -- Información
Aprendizaje automático -- Inteligencia artificial
Software -- Programación
Procesamiento electrónico de datos -- Bases de datos
Distributed application
Ambiguity detection
Software requirements
Machine Learning
Knowledge bases
software development
Natural language processing
Ambiguity in requirements
decision making
Automatic requirements validation
Artificial intelligence
dc.subject.lemb.none.fl_str_mv Ingeniería Telemática -- Tesis y disertaciones académicas
Análisis de información -- Información
Aprendizaje automático -- Inteligencia artificial
Software -- Programación
Procesamiento electrónico de datos -- Bases de datos
dc.subject.keyword.spa.fl_str_mv Distributed application
Ambiguity detection
Software requirements
Machine Learning
Knowledge bases
software development
Natural language processing
Ambiguity in requirements
decision making
Automatic requirements validation
Artificial intelligence
description En este proyecto de grado, se abordó la creación de una aplicación web de enfoque distribuido, que utiliza técnicas avanzadas de Machine Learning y se apoya en bases de conocimiento, con el objetivo de identificar y resolver ambigüedades presentes en los requerimientos de software. Para lograrlo, se diseñó un método que combina algoritmos de aprendizaje automático con información almacenada en bases de datos vectoriales, permitiendo una detección precisa y eficiente de las ambigüedades más comunes. La aplicación final se destaca por su interfaz de fácil acceso y su rendimiento excepcional, respaldado adicionalmente por una infraestructura distribuida en la nube que asegura una distribución equitativa de la carga y una seguridad robusta a través de la aplicación de JSON Web Tokens. En conjunto, este proyecto culmina en una solución tecnológica innovadora que potencia la calidad y eficiencia en el proceso de desarrollo de software al abordar de manera efectiva las ambigüedades presentes en los requerimientos.
publishDate 2023
dc.date.created.none.fl_str_mv 2023-08-31
dc.date.accessioned.none.fl_str_mv 2024-08-17T16:20:12Z
dc.date.available.none.fl_str_mv 2024-08-17T16:20:12Z
dc.type.spa.fl_str_mv bachelorThesis
dc.type.degree.spa.fl_str_mv Pasantía
dc.type.driver.none.fl_str_mv info:eu-repo/semantics/bachelorThesis
dc.type.coar.none.fl_str_mv http://purl.org/coar/resource_type/c_7a1f
format http://purl.org/coar/resource_type/c_7a1f
dc.identifier.uri.none.fl_str_mv http://hdl.handle.net/11349/39845
url http://hdl.handle.net/11349/39845
dc.language.iso.none.fl_str_mv spa
language spa
dc.relation.references.none.fl_str_mv ReQtest. (2020). ReQtest – A Complete Guide. Recuperado de https://reqtest.com/what-isreqtest/.
IBM. (2021). IBM Rational DOORS. Recuperado de https://www.ibm.com/products/rationaldoors.
Jama Software. (2021). Jama Connect. Recuperado de https://www.jamasoftware.com/. Micro Focus. (2021). CaliberRM. Recuperado de https://www.opentext.com/. Sparx Systems. (2021). Enterprise Architect. Recuperado de https://sparxsystems.com/products/ea/index.html
Pauzi, Z., & Capiluppi, A. (2023). Applications of natural language processing in software traceability: A systematic mapping study. Recuperado de https://www.sciencedirect.com/science/article/pii/S0164121223000110?via%3Dihub
Siahaan, D., Raharjana, I. K., & Fatichah, C. (2023). User Story Extraction from Natural Language for Requirements Elicitation: Identify Software-Related Information from Online News. Recuperado de https://www.sciencedirect.com/science/article/abs/pii/S0950584923000496?via%3Dihub.
Riaz, M. Q., Butt, W. H., & Rehman, S. (2019). Automatic Detection of Ambiguous Software Requirements: An Insight. Recuperado de https://ieeexplore.ieee.org/document/8714682
Rajender Kumar Surana, C. S., Shriya, Gupta, D. B., & Shankar, S. P. (2019). Intelligent Chatbot for Requirements Elicitation and Classification. Recuperado de https://ieeexplore.ieee.org/document/9016907.
Liu, K., Reddivari, S., & Reddivari, K. (2022). Artificial Intelligence in Software Requirements Engineering: State-of-the-Art. Recuperado de https://ieeexplore.ieee.org/document/9874229
Elsevier. (2023). A review on risk assessment techniques for building services. Recuperado de https://linkinghub.elsevier.com/retrieve/pii/S0950584923000496.
ScienceDirect. (s.f.). (2023) Explore scientific, technical, and medical research on ScienceDirect. Recuperado de https://www.sciencedirect.com/
Health Data Miner. (2019). CRISP-DM: Una metodología para minería de datos en salud. Recuperado el 19 de marzo de 2023, Recuperado de https://healthdataminer.com/datamining/crisp-dm-una-metodologia-para-mineria-de-datos-en-salud/
Biblioteca Hugging Face Transformers. (2023) Huggingface Recuperado de https://github.com/huggingface/transformers
Pinecone (2023) Búsqueda de Similitud Vectorial a Escala. Recuperado de https://www.pinecone.io/
Gensim. (2023). Documentación vía GitHub Recuperado de https://radimrehurek.com/gensim/auto_examples/index.html#core-tutorials.
Pinecone. (2023). Choosing index type and size Recuperado de https://docs.pinecone.io/docs/choosing-index-type-and-size
Hugging Face (2023). Transformers Recuperado de https://huggingface.co/docs/transformers/index.
Abstracta Chile. (2023). Herramienta para pruebas de API: Review de Insomnia. Recuperado de https://cl.abstracta.us/blog/insomnia-herramienta-pruebas-api/.
Jones, M., Bradley, J., & Sakimura, N. (2015). JSON Web Token (JWT). RFC 7519. Recuperado de https://tools.ietf.org/html/rfc7519 Auth0. (n.d.). JSON Web Token Introduction. Recuperado de https://auth0.com/learn/json-webtokens/
Leon,E. (2020). Procesamiento del lenguaje natural con Python. Recuperado de https://www.baoss.es/procesamiento-del-lenguaje-natural-pln-con-python/
Fernandez. (2023) ChatGPT: Que es, cómo usarlo y qué puedes hacer con este chat de Inteligencia Artificial Recuperado de: https://www.xataka.com/basics/chatgpt-que-como-usarlo-quepuedes-hacer-este-chat-inteligencia-artificial.
Tripathi, R. (2023). What are vector embeddings. Recuperado de www.pinecone.io/learn/vectorembeddings/
Pinecone. (2023). Arquitectura de datos. Recuperado de https://www.pinecone.io/
Pinecoce. (2023). Modelo Embeeding. Recuperado de www.pinecone.io/learn/vector-embeddings/
Rivas, A. (2023) Normas APA: La guía definitiva para presentar trabajos escritos. Guía Normas APA. Recuperado de https://normasapa.in/
dc.rights.*.fl_str_mv Attribution-NonCommercial-NoDerivatives 4.0 Internacional
Attribution-NonCommercial-NoDerivatives 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-nc-nd/4.0/
dc.rights.acceso.spa.fl_str_mv Abierto (Texto Completo)
rights_invalid_str_mv Attribution-NonCommercial-NoDerivatives 4.0 Internacional
http://creativecommons.org/licenses/by-nc-nd/4.0/
Abierto (Texto Completo)
http://purl.org/coar/access_right/c_abf2
dc.format.mimetype.spa.fl_str_mv pdf
institution Universidad Distrital Francisco José de Caldas
bitstream.url.fl_str_mv https://repository.udistrital.edu.co/bitstreams/4dfc065f-8454-48a4-862a-cdbfcb5db8af/download
https://repository.udistrital.edu.co/bitstreams/603b18fc-fe12-4757-bc65-580041939bec/download
https://repository.udistrital.edu.co/bitstreams/b6377802-41dc-4a86-b242-4222a039addc/download
https://repository.udistrital.edu.co/bitstreams/0a7aa937-c424-4a23-b3db-d64eb977508b/download
bitstream.checksum.fl_str_mv 92bb88280d6f0c832b592bf2c92a9e84
02128d357fe7c047fe20f5fb267ee5de
4460e5956bc1d1639be9ae6146a50347
997daf6c648c962d566d7b082dac908d
bitstream.checksumAlgorithm.fl_str_mv MD5
MD5
MD5
MD5
repository.name.fl_str_mv Repositorio Universidad Distrital
repository.mail.fl_str_mv repositorio@udistrital.edu.co
_version_ 1837007214937636864
spelling Hernández Gutiérrez, JairoHernández Capera, Fabián MauricioNiño González, Julián DavidHernández Gutiérrez, Jairo [0000-0003-3908-2763]2024-08-17T16:20:12Z2024-08-17T16:20:12Z2023-08-31http://hdl.handle.net/11349/39845En este proyecto de grado, se abordó la creación de una aplicación web de enfoque distribuido, que utiliza técnicas avanzadas de Machine Learning y se apoya en bases de conocimiento, con el objetivo de identificar y resolver ambigüedades presentes en los requerimientos de software. Para lograrlo, se diseñó un método que combina algoritmos de aprendizaje automático con información almacenada en bases de datos vectoriales, permitiendo una detección precisa y eficiente de las ambigüedades más comunes. La aplicación final se destaca por su interfaz de fácil acceso y su rendimiento excepcional, respaldado adicionalmente por una infraestructura distribuida en la nube que asegura una distribución equitativa de la carga y una seguridad robusta a través de la aplicación de JSON Web Tokens. En conjunto, este proyecto culmina en una solución tecnológica innovadora que potencia la calidad y eficiencia en el proceso de desarrollo de software al abordar de manera efectiva las ambigüedades presentes en los requerimientos.In this degree project, the creation of a distributed approach web application was addressed, which uses advanced Machine Learning techniques and is supported by knowledge bases, with the objective of identifying and resolving ambiguities present in software requirements. To achieve this, a method was designed that combines machine learning algorithms with information stored in vector databases, allowing an accurate and efficient detection of the most common ambiguities. The final application stands out for its easy-to-access interface and exceptional performance, additionally supported by a distributed cloud infrastructure that ensures equitable load distribution and robust security through the application of JSON Web Tokens. Overall, this project culminates in an innovative technological solution that enhances quality and efficiency in the software development process by effectively addressing the ambiguities present in the requirements.Eprocess S.A.SpdfspaAttribution-NonCommercial-NoDerivatives 4.0 InternacionalAttribution-NonCommercial-NoDerivatives 4.0 Internacionalhttp://creativecommons.org/licenses/by-nc-nd/4.0/Abierto (Texto Completo)http://purl.org/coar/access_right/c_abf2Inteligencia ArtificialDetección de ambigüedadesAplicación distribuidaRequerimientos de softwareMachine LearningBases de conocimientoDesarrollo de SoftwareProcesamiento de lenguaje naturalAprendizaje automáticoAmbigüedad en requisitosToma de decisionesValidación automática de requisitosIngeniería Telemática -- Tesis y disertaciones académicasAnálisis de información -- InformaciónAprendizaje automático -- Inteligencia artificialSoftware -- ProgramaciónProcesamiento electrónico de datos -- Bases de datosDistributed applicationAmbiguity detectionSoftware requirementsMachine LearningKnowledge basessoftware developmentNatural language processingAmbiguity in requirementsdecision makingAutomatic requirements validationArtificial intelligenceAplicación distribuida para la detección de ambigüedades en los requerimientos de software utilizando técnicas de machine learning y bases de conocimientoDistributed application for detecting ambiguities in software requirements using machine learning techniques and knowledge basesbachelorThesisPasantíainfo:eu-repo/semantics/bachelorThesishttp://purl.org/coar/resource_type/c_7a1fReQtest. (2020). ReQtest – A Complete Guide. Recuperado de https://reqtest.com/what-isreqtest/.IBM. (2021). IBM Rational DOORS. Recuperado de https://www.ibm.com/products/rationaldoors.Jama Software. (2021). Jama Connect. Recuperado de https://www.jamasoftware.com/. Micro Focus. (2021). CaliberRM. Recuperado de https://www.opentext.com/. Sparx Systems. (2021). Enterprise Architect. Recuperado de https://sparxsystems.com/products/ea/index.htmlPauzi, Z., & Capiluppi, A. (2023). Applications of natural language processing in software traceability: A systematic mapping study. Recuperado de https://www.sciencedirect.com/science/article/pii/S0164121223000110?via%3DihubSiahaan, D., Raharjana, I. K., & Fatichah, C. (2023). User Story Extraction from Natural Language for Requirements Elicitation: Identify Software-Related Information from Online News. Recuperado de https://www.sciencedirect.com/science/article/abs/pii/S0950584923000496?via%3Dihub.Riaz, M. Q., Butt, W. H., & Rehman, S. (2019). Automatic Detection of Ambiguous Software Requirements: An Insight. Recuperado de https://ieeexplore.ieee.org/document/8714682Rajender Kumar Surana, C. S., Shriya, Gupta, D. B., & Shankar, S. P. (2019). Intelligent Chatbot for Requirements Elicitation and Classification. Recuperado de https://ieeexplore.ieee.org/document/9016907.Liu, K., Reddivari, S., & Reddivari, K. (2022). Artificial Intelligence in Software Requirements Engineering: State-of-the-Art. Recuperado de https://ieeexplore.ieee.org/document/9874229Elsevier. (2023). A review on risk assessment techniques for building services. Recuperado de https://linkinghub.elsevier.com/retrieve/pii/S0950584923000496.ScienceDirect. (s.f.). (2023) Explore scientific, technical, and medical research on ScienceDirect. Recuperado de https://www.sciencedirect.com/Health Data Miner. (2019). CRISP-DM: Una metodología para minería de datos en salud. Recuperado el 19 de marzo de 2023, Recuperado de https://healthdataminer.com/datamining/crisp-dm-una-metodologia-para-mineria-de-datos-en-salud/Biblioteca Hugging Face Transformers. (2023) Huggingface Recuperado de https://github.com/huggingface/transformersPinecone (2023) Búsqueda de Similitud Vectorial a Escala. Recuperado de https://www.pinecone.io/Gensim. (2023). Documentación vía GitHub Recuperado de https://radimrehurek.com/gensim/auto_examples/index.html#core-tutorials.Pinecone. (2023). Choosing index type and size Recuperado de https://docs.pinecone.io/docs/choosing-index-type-and-sizeHugging Face (2023). Transformers Recuperado de https://huggingface.co/docs/transformers/index.Abstracta Chile. (2023). Herramienta para pruebas de API: Review de Insomnia. Recuperado de https://cl.abstracta.us/blog/insomnia-herramienta-pruebas-api/.Jones, M., Bradley, J., & Sakimura, N. (2015). JSON Web Token (JWT). RFC 7519. Recuperado de https://tools.ietf.org/html/rfc7519 Auth0. (n.d.). JSON Web Token Introduction. Recuperado de https://auth0.com/learn/json-webtokens/Leon,E. (2020). Procesamiento del lenguaje natural con Python. Recuperado de https://www.baoss.es/procesamiento-del-lenguaje-natural-pln-con-python/Fernandez. (2023) ChatGPT: Que es, cómo usarlo y qué puedes hacer con este chat de Inteligencia Artificial Recuperado de: https://www.xataka.com/basics/chatgpt-que-como-usarlo-quepuedes-hacer-este-chat-inteligencia-artificial.Tripathi, R. (2023). What are vector embeddings. Recuperado de www.pinecone.io/learn/vectorembeddings/Pinecone. (2023). Arquitectura de datos. Recuperado de https://www.pinecone.io/Pinecoce. (2023). Modelo Embeeding. Recuperado de www.pinecone.io/learn/vector-embeddings/Rivas, A. (2023) Normas APA: La guía definitiva para presentar trabajos escritos. Guía Normas APA. Recuperado de https://normasapa.in/ORIGINALTrabajo de gradoTrabajo de gradoTrabajo de gradoapplication/pdf4161664https://repository.udistrital.edu.co/bitstreams/4dfc065f-8454-48a4-862a-cdbfcb5db8af/download92bb88280d6f0c832b592bf2c92a9e84MD51Licencia de uso y autorizaciónLicencia de uso y autorizaciónLicencia de uso y autorizaciónapplication/pdf688391https://repository.udistrital.edu.co/bitstreams/603b18fc-fe12-4757-bc65-580041939bec/download02128d357fe7c047fe20f5fb267ee5deMD54CC-LICENSElicense_rdflicense_rdfapplication/rdf+xml; charset=utf-8805https://repository.udistrital.edu.co/bitstreams/b6377802-41dc-4a86-b242-4222a039addc/download4460e5956bc1d1639be9ae6146a50347MD55LICENSElicense.txtlicense.txttext/plain; charset=utf-87167https://repository.udistrital.edu.co/bitstreams/0a7aa937-c424-4a23-b3db-d64eb977508b/download997daf6c648c962d566d7b082dac908dMD5611349/39845oai:repository.udistrital.edu.co:11349/398452024-08-17 11:20:15.214http://creativecommons.org/licenses/by-nc-nd/4.0/Attribution-NonCommercial-NoDerivatives 4.0 Internacionalopen.accesshttps://repository.udistrital.edu.coRepositorio Universidad Distritalrepositorio@udistrital.edu.coTElDRU5DSUEgWSBBVVRPUklaQUNJw5NOIEVTUEVDSUFMIFBBUkEgUFVCTElDQVIgWSBQRVJNSVRJUiBMQSBDT05TVUxUQSBZIFVTTyBERSBDT05URU5JRE9TIEVOIEVMIFJFUE9TSVRPUklPIElOU1RJVFVDSU9OQUwgREUgTEEgVU5JVkVSU0lEQUQgRElTVFJJVEFMCgpUw6lybWlub3MgeSBjb25kaWNpb25lcyBkZSB1c28gcGFyYSBwdWJsaWNhY2nDs24gZGUgb2JyYXMgZW4gZWwgUmVwb3NpdG9yaW8gSW5zdGl0dWNpb25hbCBkZSBsYSBVbml2ZXJzaWRhZCBEaXN0cml0YWwgRnJhbmNpc2NvIEpvc8OpIGRlIENhbGRhcyAoUklVRCkKCkNvbW8gdGl0dWxhcihlcykgZGVsKG9zKSBkZXJlY2hvKHMpIGRlIGF1dG9yLCBjb25maWVybyAoZXJpbW9zKSBhIGxhIFVuaXZlcnNpZGFkIERpc3RyaXRhbCBGcmFuY2lzY28gSm9zw6kgZGUgQ2FsZGFzIChlbiBhZGVsYW50ZSwgTEEgVU5JVkVSU0lEQUQpIHVuYSBsaWNlbmNpYSBwYXJhIHVzbyBubyBleGNsdXNpdmEsIGxpbWl0YWRhIHkgZ3JhdHVpdGEgc29icmUgbGEgb2JyYSBxdWUgaW50ZWdyYXLDoSBlbCBSZXBvc2l0b3JpbyBJbnN0aXR1Y2lvbmFsIChlbiBhZGVsYW50ZSwgUklVRCksIGRlIGFjdWVyZG8gYSBsYXMgc2lndWllbnRlcyByZWdsYXMsIGxhcyBjdWFsZXMgZGVjbGFybyAoYW1vcykgY29ub2NlciB5IGFjZXB0YXI6CgphKQlFc3RhcsOhIHZpZ2VudGUgYSBwYXJ0aXIgZGUgbGEgZmVjaGEgZW4gcXVlIHNlIGluY2x1eWEgZW4gZWwgUklVRCB5IGhhc3RhIHBvciB1biBwbGF6byBkZSBkaWV6ICgxMCkgQcOxb3MsIHByb3Jyb2dhYmxlIGluZGVmaW5pZGFtZW50ZSBwb3IgZWwgdGllbXBvIHF1ZSBkdXJlIGVsIGRlcmVjaG8gUGF0cmltb25pYWwgZGVsIGF1dG9yOyBsYSBjdWFsIHBvZHLDoSBkYXJzZSBwb3IgdGVybWluYWRhIHByZXZpYSBzb2xpY2l0dWQgYSBMQSBVTklWRVJTSURBRCBwb3IgZXNjcml0byBjb24gdW5hIGFudGVsYWNpw7NuIGRlIGRvcyAoMikgbWVzZXMgYW50ZXMgZGVsIHZlbmNpbWllbnRvIGRlbCBwbGF6byBpbmljaWFsIG8gZWwgZGUgc3UocykgcHLDs3Jyb2dhKHMpLgoKYikJTEEgVU5JVkVSU0lEQUQgcG9kcsOhIHB1YmxpY2FyIGxhIG9icmEgZW4gbGFzIGRpc3RpbnRhcyB2ZXJzaW9uZXMgcmVxdWVyaWRhcyBwb3IgZWwgUklVRCAoZGlnaXRhbCwgaW1wcmVzbywgZWxlY3Ryw7NuaWNvIHUgb3RybyBtZWRpbyBjb25vY2lkbyBvIHBvciBjb25vY2VyKSBMQSBVTklWRVJTSURBRCBubyBzZXLDoSByZXNwb25zYWJsZSBlbiBlbCBldmVudG8gcXVlIGVsIGRvY3VtZW50byBhcGFyZXpjYSByZWZlcmVuY2lhZG8gZW4gbW90b3JlcyBkZSBiw7pzcXVlZGEgbyByZXBvc2l0b3Jpb3MgZGlmZXJlbnRlcyBhbCBSSVVELCB1bmEgdmV6IGVsKG9zKSBhdXRvcihlcykgc29saWNpdGVuIHN1IGVsaW1pbmFjacOzbiBkZWwgUklVRCwgZGFkbyBxdWUgbGEgbWlzbWEgc2Vyw6EgcHVibGljYWRhIGVuIEludGVybmV0LgoKYykJTGEgYXV0b3JpemFjacOzbiBzZSBoYWNlIGEgdMOtdHVsbyBncmF0dWl0bywgcG9yIGxvIHRhbnRvLCBsb3MgYXV0b3JlcyByZW51bmNpYW4gYSByZWNpYmlyIGJlbmVmaWNpbyBhbGd1bm8gcG9yIGxhIHB1YmxpY2FjacOzbiwgZGlzdHJpYnVjacOzbiwgY29tdW5pY2FjacOzbiBww7pibGljYSB5IGN1YWxxdWllciBvdHJvIHVzbyBxdWUgc2UgaGFnYSBlbiBsb3MgdMOpcm1pbm9zIGRlIGxhIHByZXNlbnRlIGxpY2VuY2lhIHkgZGUgbGEgbGljZW5jaWEgZGUgdXNvIGNvbiBxdWUgc2UgcHVibGljYSAoQ3JlYXRpdmUgQ29tbW9ucykuCgpkKQlMb3MgY29udGVuaWRvcyBwdWJsaWNhZG9zIGVuIGVsIFJJVUQgc29uIG9icmEocykgb3JpZ2luYWwoZXMpIHNvYnJlIGxhIGN1YWwoZXMpIGVsKG9zKSBhdXRvcihlcykgY29tbyB0aXR1bGFyZXMgZGUgbG9zIGRlcmVjaG9zIGRlIGF1dG9yLCBhc3VtZW4gdG90YWwgcmVzcG9uc2FiaWxpZGFkIHBvciBlbCBjb250ZW5pZG8gZGUgc3Ugb2JyYSBhbnRlIExBIFVOSVZFUlNJREFEIHkgYW50ZSB0ZXJjZXJvcy4gRW4gdG9kbyBjYXNvIExBIFVOSVZFUlNJREFEIHNlIGNvbXByb21ldGUgYSBpbmRpY2FyIHNpZW1wcmUgbGEgYXV0b3LDrWEgaW5jbHV5ZW5kbyBlbCBub21icmUgZGVsIGF1dG9yIHkgbGEgZmVjaGEgZGUgcHVibGljYWNpw7NuLgoKZSkJTEEgVU5JVkVSU0lEQUQgcG9kcsOhIGluY2x1aXIgbGEgb2JyYSBlbiBsb3Mgw61uZGljZXMgeSBidXNjYWRvcmVzIHF1ZSBlc3RpbWVuIG5lY2VzYXJpb3MgcGFyYSBtYXhpbWl6YXIgbGEgdmlzaWJpbGlkYWQgZWwgdXNvIHkgZWwgaW1wYWN0byBkZSBsYSBwcm9kdWNjacOzbiBjaWVudMOtZmljYSwgYXJ0w61zdGljYSB5IGFjYWTDqW1pY2EgZW4gbGEgY29tdW5pZGFkIGxvY2FsLCBuYWNpb25hbCBvIGludGVybmFjaW9uYWwuCgoKZikJTEEgVU5JVkVSU0lEQUQgcG9kcsOhIGNvbnZlcnRpciBsYSBvYnJhIGEgY3VhbHF1aWVyIG1lZGlvIG8gZm9ybWF0byBjb24gZWwgZmluIGRlIHN1IHByZXNlcnZhY2nDs24gZW4gZWwgdGllbXBvIHF1ZSBsYSBwcmVzZW50ZSBsaWNlbmNpYSB5IGxhIGRlIHN1cyBwcsOzcnJvZ2FzLgoKCkNvbiBiYXNlIGVuIGxvIGFudGVyaW9yIGF1dG9yaXpvKGFtb3MpLCBhIGZhdm9yIGRlbCBSSVVEIHkgZGUgc3VzIHVzdWFyaW9zLCBsYSBwdWJsaWNhY2nDs24geSBjb25zdWx0YSBkZSBsYSBzaWd1aWVudGUgb2JyYToKClRpdHVsbwoKQXV0b3IgICAgICAgQXBlbGxpZG9zICAgICAgICAgTm9tYnJlcwoKMQoKMgoKMwoKCmcpCUF1dG9yaXpvKGFtb3MpLCBxdWUgbGEgb2JyYSBzZWEgcHVlc3RhIGEgZGlzcG9zaWNpw7NuIGRlbCBww7pibGljbyBlbiBsb3MgdMOpcm1pbm9zIGVzdGFibGVjaWRvcyBlbiBsb3MgbGl0ZXJhbGVzIGFudGVyaW9yZXMsIGJham8gbG9zIGzDrW1pdGVzIGRlZmluaWRvcyBwb3IgTEEgVU5JVkVSU0lEQUQsIGVuIGxhcyDigJxDb25kaWNpb25lcyBkZSB1c28gZGUgZXN0cmljdG8gY3VtcGxpbWllbnRv4oCdIGRlIGxvcyByZWN1cnNvcyBwdWJsaWNhZG9zIGVuIGVsIFJJVUQsIGN1eW8gdGV4dG8gY29tcGxldG8gc2UgcHVlZGUgY29uc3VsdGFyIGVuIGh0dHA6Ly9yZXBvc2l0b3J5LnVkaXN0cml0YWwuZWR1LmNvLwoKaCkJQ29ub3pjbyhjZW1vcykgeSBhY2VwdG8oYW1vcykgcXVlIG90b3JnbyhhbW9zKSB1bmEgbGljZW5jaWEgZXNwZWNpYWwgcGFyYSBwdWJsaWNhY2nDs24gZGUgb2JyYXMgZW4gZWwgUmVwb3NpdG9yaW8gSW5zdGl0dWNpb25hbCBkZSBsYSBVbml2ZXJzaWRhZCBEaXN0cml0YWwgRnJhbmNpc2NvIEpvc8OpIGRlIENhbGRhcywgbGljZW5jaWEgICBkZSBsYSBjdWFsIGhlIChoZW1vcykgb2J0ZW5pZG8gdW5hIGNvcGlhLgoKaSkJTWFuaWZpZXN0byhhbW9zKSBtaSAobnVlc3RybykgdG90YWwgYWN1ZXJkbyBjb24gbGFzIGNvbmRpY2lvbmVzIGRlIHVzbyB5IHB1YmxpY2FjacOzbiBlbiBlbCBSZXBvc2l0b3JpbyBJbnN0aXR1Y2lvbmFsIGRlIGxhIFVuaXZlcnNpZGFkIERpc3RyaXRhbCBGcmFuY2lzY28gSm9zw6kgZGUgQ2FsZGFzIHF1ZSBzZSBkZXNjcmliZW4geSBleHBsaWNhbiBlbiBlbCBwcmVzZW50ZSBkb2N1bWVudG8uCgpqKQlDb25vemNvKGNlbW9zKSBsYSBub3JtYXRpdmlkYWQgaW50ZXJuYSBkZSAgTEEgVU5JVkVSU0lEQUQ7IGVuIGNvbmNyZXRvLCBlbCBBY3VlcmRvIDAwNCBkZSAyMDEyIGRlbCBDU1UsIEFjdWVyZG8gMDIzIGRlIDIwMTIgZGVsIENTVSBzb2JyZSBQb2zDrXRpY2EgRWRpdG9yaWFsLCBBY3VlcmRvIDAyNiAgZGVsIDMxIGRlIGp1bGlvIGRlIDIwMTIgc29icmUgZWwgcHJvY2VkaW1pZW50byBwYXJhIGxhIHB1YmxpY2FjacOzbiBkZSB0ZXNpcyBkZSBwb3N0Z3JhZG8gZGUgbG9zIGVzdHVkaWFudGVzIGRlIGxhIFVuaXZlcnNpZGFkIERpc3RyaXRhbCBGcmFuY2lzY28gSm9zw6kgZGUgQ2FsZGFzLCAgQWN1ZXJkbyAwMzAgZGVsIDAzIGRlIGRpY2llbWJyZSBkZSAyMDEzIHBvciBtZWRpbyBkZWwgY3VhbCBzZSBjcmVhIGVsIFJlcG9zaXRvcmlvIEluc3RpdHVjaW9uYWwgZGUgbGEgVW5pdmVyc2lkYWQgRGlzdHJpdGFsIEZyYW5jaXNjbyBKb3PDqSBkZSBDYWxkYXMsIEFjdWVyZG8gMDM4IGRlIDIwMTUgMjAxNSDigJxwb3IgZWwgY3VhbCBzZSBtb2RpZmljYSBlbCBBY3VlcmRvIDAzMSBkZSAyMDE0IGRlIDIwMTQgcXVlIHJlZ2xhbWVudGEgZWwgdHJhYmFqbyBkZSBncmFkbyBwYXJhIGxvcyBlc3R1ZGlhbnRlcyBkZSBwcmVncmFkbyBkZSBsYSBVbml2ZXJzaWRhZCBEaXN0cml0YWwgRnJhbmNpc2NvIEpvc8OpIGRlIENhbGRhcyB5IHNlIGRpY3RhbiBvdHJhcyBkaXJlY3RyaWNlc+KAnSB5IGxhcyBkZW3DoXMgbm9ybWFzIGNvbmNvcmRhbnRlIHkgY29tcGxlbWVudGFyaWFzIHF1ZSByaWdlbiBhbCByZXNwZWN0bywgZXNwZWNpYWxtZW50ZSBsYSBsZXkgMjMgZGUgMTk4MiwgbGEgbGV5IDQ0IGRlIDE5OTMgeSBsYSBkZWNpc2nDs24gQW5kaW5hIDM1MSBkZSAxOTkzLiBFc3RvcyBkb2N1bWVudG9zIHBvZHLDoW4gc2VyIGNvbnN1bHRhZG9zIHkgZGVzY2FyZ2Fkb3MgZW4gZWwgcG9ydGFsIHdlYiBkZSBsYSBiaWJsaW90ZWNhIGh0dHA6Ly9zaXN0ZW1hZGViaWJsaW90ZWNhcy51ZGlzdHJpdGFsLmVkdS5jby8KCmspCUFjZXB0byhhbW9zKSBxdWUgTEEgVU5JVkVSU0lEQUQgbm8gc2UgcmVzcG9uc2FiaWxpemEgcG9yIGxhcyBpbmZyYWNjaW9uZXMgYSBsYSBwcm9waWVkYWQgaW50ZWxlY3R1YWwgbyBEZXJlY2hvcyBkZSBBdXRvciBjYXVzYWRhcyBwb3IgbG9zIHRpdHVsYXJlcyBkZSBsYSBwcmVzZW50ZSBMaWNlbmNpYSB5IGRlY2xhcmFtb3MgcXVlIG1hbnRlbmRyw6kgKGVtb3MpIGluZGVtbmUgYSBMQSBVTklWRVJTSURBRCBwb3IgbGFzIHJlY2xhbWFjaW9uZXMgbGVnYWxlcyBkZSBjdWFscXVpZXIgdGlwbyBxdWUgbGxlZ2FyZW4gYSBwcmVzZW50YXJzZSBwb3IgdmlvbGFjacOzbiBkZSBkZXJlY2hvcyBhIGxhIHByb3BpZWRhZCBpbnRlbGVjdHVhbCBvIGRlIEF1dG9yIHJlbGFjaW9uYWRvcyBjb24gbG9zIGRvY3VtZW50b3MgcmVnaXN0cmFkb3MgZW4gZWwgUklVRC4KCmwpCUVsIChsb3MpIGF1dG9yKGVzKSBtYW5pZmllc3RhKG1vcykgcXVlIGxhIG9icmEgb2JqZXRvIGRlIGxhIHByZXNlbnRlIGF1dG9yaXphY2nDs24gZXMgb3JpZ2luYWwsIGRlIGV4Y2x1c2l2YSBhdXRvcsOtYSwgeSBzZSByZWFsaXrDsyBzaW4gdmlvbGFyIG8gdXN1cnBhciBkZXJlY2hvcyBkZSBhdXRvciBkZSB0ZXJjZXJvczsgZGUgdGFsIHN1ZXJ0ZSwgZW4gY2FzbyBkZSBwcmVzZW50YXJzZSBjdWFscXVpZXIgcmVjbGFtYWNpw7NuIG8gYWNjacOzbiBwb3IgcGFydGUgZGUgdW4gdGVyY2VybyBlbiBjdWFudG8gYSBsb3MgZGVyZWNob3MgZGUgYXV0b3Igc29icmUgbGEgb2JyYSwgZWwgKGxvcykgZXN0dWRpYW50ZShzKSDigJMgYXV0b3IoZXMpIGFzdW1pcsOhKG4pIHRvZGEgbGEgcmVzcG9uc2FiaWxpZGFkIHkgc2FsZHLDoShuKSBlbiBkZWZlbnNhIGRlIGxvcyBkZXJlY2hvcyBhcXXDrSBhdXRvcml6YWRvcy4gUGFyYSB0b2RvcyBsb3MgZWZlY3RvcywgTEEgVU5JVkVSU0lEQUQgYWN0w7phIGNvbW8gdW4gdGVyY2VybyBkZSBidWVuYSBmZS4KCgptKQlFbCAobG9zKSBhdXRvcihlcykgbWFuaWZpZXN0YShtb3MpIHF1ZSBjb25vemNvKGNlbW9zKSBsYSBhdXRvbm9tw61hIHkgbG9zIGRlcmVjaG9zLCBxdWUgcG9zZWUobW9zKSBzb2JyZSBsYSBvYnJhIHksIGNvbW8gdGFsLCBlcyAoc29tb3MpIHJlc3BvbnNhYmxlKHMpIGRlbCBhbGNhbmNlIGp1csOtZGljbyB5IGxlZ2FsLCBkZSBlc2NvZ2VyIGxhIG9wY2nDs24gZGUgbGEgcHVibGljYWNpw7NuIG8gZGUgcmVzdHJpY2Npw7NuIGRlIGxhIHB1YmxpY2FjacOzbiBkZWwgZG9jdW1lbnRvIHJlZ2lzdHJhZG8gZW4gZWwgUklVRC4KCgoKCgoKU0kgRUwgRE9DVU1FTlRPIFNFIEJBU0EgRU4gVU4gVFJBQkFKTyBRVUUgSEEgU0lETyBQQVRST0NJTkFETyBPIEFQT1lBRE8gUE9SIFVOQSBBR0VOQ0lBIE8gVU5BIE9SR0FOSVpBQ0nDk04sIENPTiBFWENFUENJw5NOIERFIExBIFVOSVZFUlNJREFEIERJU1RSSVRBTCBGUkFOQ0lTQ08gSk9TRSBERSBDQUxEQVMsIExPUyBBVVRPUkVTIEdBUkFOVElaQU4gUVVFIFNFIEhBIENVTVBMSURPIENPTiBMT1MKREVSRUNIT1MgWSBPQkxJR0FDSU9ORVMgUkVRVUVSSURPUyBQT1IgRUwgUkVTUEVDVElWTyBDT05UUkFUTyBPIEFDVUVSRE8uCgoKCgoKCgoKCgoKCgoKCgoKCgoKCkVuIGNvbnN0YW5jaWEgZGUgbG8gYW50ZXJpb3IsIGZpcm1vKGFtb3MpIGVsIHByZXNlbnRlIGRvY3VtZW50bywgZW4gbGEgY2l1ZGFkIGRlIEJvZ290w6EsIEQuQy4sIGEgbG9zCgoKRklSTUEgREUgTE9TIFRJVFVMQVJFUyBERSBERVJFQ0hPUyBERSBBVVRPUgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICAgQy5DLiBOby4gX19fX19fX19fX19fX19fX19fCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gICBDLkMuIE5vLiBfX19fX19fX19fX19fX19fX18KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgIEMuQy4gTm8uIF9fX19fX19fX19fX19fX19fXwoKCgpDb3JyZW8gRWxlY3Ryw7NuaWNvIEluc3RpdHVjaW9uYWwgZGVsIChkZSBsb3MpIEF1dG9yKGVzKToKCkF1dG9yCSAgICAgIENvcnJlbyBFbGVjdHLDs25pY28KCjEKCjIKCjMKCk5vbWJyZSBkZSBEaXJlY3RvcihlcykgZGUgR3JhZG86CgoxCgoyCgozCgpOb21icmUgRmFjdWx0YWQgeSBQcm95ZWN0byBDdXJyaWN1bGFyOgoKRmFjdWx0YWQJUHJveWVjdG8gQ3VycmljdWxhcgoKCgoKCgoKCk5vdGE6IEVuIGNhc28gcXVlIG5vIGVzdMOpIGRlIGFjdWVyZG8gY29uIGxhcyBjb25kaWNpb25lcyBkZSBsYSBwcmVzZW50ZSBsaWNlbmNpYSwgeSBtYW5pZmllc3RlIGFsZ3VuYSByZXN0cmljY2nDs24gc29icmUgbGEgb2JyYSwganVzdGlmaXF1ZSBsb3MgbW90aXZvcyBwb3IgbG9zIGN1YWxlcyBlbCBkb2N1bWVudG8geSBzdXMgYW5leG9zIG5vIHB1ZWRlbiBzZXIgcHVibGljYWRvcyBlbiBlbCBSZXBvc2l0b3JpbyBJbnN0aXR1Y2lvbmFsIGRlIGxhIFVuaXZlcnNpZGFkIERpc3RyaXRhbCBGcmFuY2lzY28gSm9zw6kgZGUgQ2FsZGFzIFJJVUQuCgoKU2kgcmVxdWllcmUgbcOhcyBlc3BhY2lvLCBwdWVkZSBhbmV4YXIgdW5hIGNvcGlhIHNpbWlsYXIgYSBlc3RhIGhvamEK