Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo

Una forma muy recurrente de evaluar la efectividad y funcionalidad de los principales algoritmos de aprendizaje por refuerzo es mediante el uso de videojuegos. En este contexto, se decide implementar un agente basado en algoritmos de aprendizaje por refuerzo profundo en un videojuego de estrategia....

Full description

Autores:
Moncayo Basante, David Santiago
Tipo de recurso:
Trabajo de grado de pregrado
Fecha de publicación:
2023
Institución:
Universidad de los Andes
Repositorio:
Séneca: repositorio Uniandes
Idioma:
spa
OAI Identifier:
oai:repositorio.uniandes.edu.co:1992/73299
Acceso en línea:
https://hdl.handle.net/1992/73299
Palabra clave:
Agente
Algoritmo
Aprendizaje por refuerzo
Inteligencia artificial
Videojuego
Ingeniería
Rights
openAccess
License
Attribution 4.0 International
id UNIANDES2_757911db06528c6715e6c5d74b21cc2b
oai_identifier_str oai:repositorio.uniandes.edu.co:1992/73299
network_acronym_str UNIANDES2
network_name_str Séneca: repositorio Uniandes
repository_id_str
dc.title.spa.fl_str_mv Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo
title Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo
spellingShingle Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo
Agente
Algoritmo
Aprendizaje por refuerzo
Inteligencia artificial
Videojuego
Ingeniería
title_short Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo
title_full Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo
title_fullStr Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo
title_full_unstemmed Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo
title_sort Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo
dc.creator.fl_str_mv Moncayo Basante, David Santiago
dc.contributor.advisor.none.fl_str_mv Lozano Martínez, Fernando Enrique
García Cárdenas, Juan José
dc.contributor.author.none.fl_str_mv Moncayo Basante, David Santiago
dc.contributor.jury.none.fl_str_mv Segura Quijano, Fredy Enrique
dc.subject.keyword.spa.fl_str_mv Agente
Algoritmo
Aprendizaje por refuerzo
Inteligencia artificial
topic Agente
Algoritmo
Aprendizaje por refuerzo
Inteligencia artificial
Videojuego
Ingeniería
dc.subject.keyword.none.fl_str_mv Videojuego
dc.subject.themes.spa.fl_str_mv Ingeniería
description Una forma muy recurrente de evaluar la efectividad y funcionalidad de los principales algoritmos de aprendizaje por refuerzo es mediante el uso de videojuegos. En este contexto, se decide implementar un agente basado en algoritmos de aprendizaje por refuerzo profundo en un videojuego de estrategia. Se trata de "Pokémon Edición Rojo Fuego", un juego bastante popular en su fecha de lanzamiento e incluso jugado hoy en día. La mecánica principal es el combate por turnos, donde se debe seguir una estrategia correcta para derrotar al rival.
publishDate 2023
dc.date.issued.none.fl_str_mv 2023-12-06
dc.date.accessioned.none.fl_str_mv 2024-01-17T16:41:48Z
dc.date.available.none.fl_str_mv 2024-01-17T16:41:48Z
dc.type.none.fl_str_mv Trabajo de grado - Pregrado
dc.type.driver.none.fl_str_mv info:eu-repo/semantics/bachelorThesis
dc.type.version.none.fl_str_mv info:eu-repo/semantics/acceptedVersion
dc.type.coar.none.fl_str_mv http://purl.org/coar/resource_type/c_7a1f
dc.type.content.none.fl_str_mv Text
dc.type.redcol.none.fl_str_mv http://purl.org/redcol/resource_type/TP
format http://purl.org/coar/resource_type/c_7a1f
status_str acceptedVersion
dc.identifier.uri.none.fl_str_mv https://hdl.handle.net/1992/73299
dc.identifier.instname.none.fl_str_mv instname:Universidad de los Andes
dc.identifier.reponame.none.fl_str_mv reponame:Repositorio Institucional Séneca
dc.identifier.repourl.none.fl_str_mv repourl:https://repositorio.uniandes.edu.co/
url https://hdl.handle.net/1992/73299
identifier_str_mv instname:Universidad de los Andes
reponame:Repositorio Institucional Séneca
repourl:https://repositorio.uniandes.edu.co/
dc.language.iso.none.fl_str_mv spa
language spa
dc.relation.references.none.fl_str_mv R. S. Sutton, Reinforcement learning an introduction. Cambridge, Mass: MIT Press, Second edition, 2018.
H. van Hasselt, A. Guez, and D. Silver, ‘Deep Reinforcement Learning with Double Qlearning’, arXiv. org, 2015.
Z. Wang, T. Schaul, M. Hessel, H. van Hasselt, M. Lanctot, and N. de Freitas, ‘Dueling Network Architectures for Deep Reinforcement Learning’, arXiv. org, 2016.
J. P. Romero Pinzón, ‘Desarrollo de un programa de computador capaz de jugar Trackmania usando técnicas de aprendizaje por refuerzo’. Universidad de los Andes, 16-Jan2023.
Goodfellow, I., Bengio, Y., and Courville, A. (2016). Deep Learning. MIT Press
A. Millán, “Los Juegos de la Serie principal de Pokémon, ordenados según Su Duración,” Nintenderos, https://www.nintenderos.com/2022/02/los-juegos-de-la-serieprincipal-de-pokemon-ordenados-segun-su-duracion/ (accessed Oct. 8, 2023).
D. A. Ballesteros Villamizar, ‘Desarrollo de un programa de computador capaz de jugar Starcraft - Brood War usando técnicas de aprendizaje por refuerzo’. Uniandes, 2011.
A. Nichol, V. Pfau, C. Hesse, O. Klimov, and J. Schulman, “Gotta Learn Fast: A New Benchmark for Generalization in RL,” arXiv preprint arXiv:1804.03720, 2018.
Mathieu and Poliquin, Stable Retro, a fork of OpenAI’s gym-retro. GitHub, 2023. [Online]. Available: https://github.com/Farama-Foundation/stable-retro
Mathieu, “OpenAI Game Integration Tool - Part 1,” YouTube, https://www.youtube.com/watch?v=lPYWaUAq_dY (accessed Oct. 8, 2023).
“Pokémon Data Structure (generation III),” Pokémon data structure (Generation III) -Bulbapedia, the community-driven Pokémon encyclopedia, https://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_data_structure_(Generation_III) (accessed Oct. 8, 2023).
O. Vinyals et al., ‘Grandmaster level in StarCraft II using multi-agent reinforcement learning’, Nature (London), vol. 575, no. 7782, pp. 350–354, 2019.
dc.rights.en.fl_str_mv Attribution 4.0 International
dc.rights.uri.none.fl_str_mv http://creativecommons.org/licenses/by/4.0/
dc.rights.accessrights.none.fl_str_mv info:eu-repo/semantics/openAccess
dc.rights.coar.none.fl_str_mv http://purl.org/coar/access_right/c_abf2
rights_invalid_str_mv Attribution 4.0 International
http://creativecommons.org/licenses/by/4.0/
http://purl.org/coar/access_right/c_abf2
eu_rights_str_mv openAccess
dc.format.extent.none.fl_str_mv 31 páginas
dc.format.mimetype.none.fl_str_mv application/pdf
dc.publisher.none.fl_str_mv Universidad de los Andes
dc.publisher.program.none.fl_str_mv Ingeniería Electrónica
dc.publisher.faculty.none.fl_str_mv Facultad de Ingeniería
dc.publisher.department.none.fl_str_mv Departamento de Ingeniería Eléctrica y Electrónica
publisher.none.fl_str_mv Universidad de los Andes
institution Universidad de los Andes
bitstream.url.fl_str_mv https://repositorio.uniandes.edu.co/bitstreams/2bda59a5-6e75-491e-a18f-05a7f278bca1/download
https://repositorio.uniandes.edu.co/bitstreams/5d6097b9-816d-4a70-85b6-491b35a1bdb1/download
https://repositorio.uniandes.edu.co/bitstreams/f3fc41ac-c923-4ef7-ab02-b31d143b1283/download
https://repositorio.uniandes.edu.co/bitstreams/59fc010d-0ee1-40c7-aa53-480c54e00135/download
https://repositorio.uniandes.edu.co/bitstreams/bff76d7a-8bdc-4afd-9c75-735067393706/download
https://repositorio.uniandes.edu.co/bitstreams/9ed03540-092b-4f27-8bda-ea9b2ae9a334/download
https://repositorio.uniandes.edu.co/bitstreams/a1772238-22c9-44b5-b600-d97edfaa63fe/download
https://repositorio.uniandes.edu.co/bitstreams/c00690eb-fecc-47d7-bb14-1cbead48ed7c/download
bitstream.checksum.fl_str_mv 91ef2bff7c19f4447025b2330ccb9761
86fbeb087740b44e4d2eabaca1259b55
0175ea4a2d4caec4bbcc37e300941108
ae9e573a68e7f92501b6913cc846c39f
35d40b2f80ece639260e0708e882285d
956217bf887cdc33897ff620e275d45b
b61039ff51bd4d8a5810130025c0d23f
2686e0ffbe93819249ea9a674c0f3d48
bitstream.checksumAlgorithm.fl_str_mv MD5
MD5
MD5
MD5
MD5
MD5
MD5
MD5
repository.name.fl_str_mv Repositorio institucional Séneca
repository.mail.fl_str_mv adminrepositorio@uniandes.edu.co
_version_ 1808390513485676544
spelling Lozano Martínez, Fernando EnriqueGarcía Cárdenas, Juan JoséMoncayo Basante, David SantiagoSegura Quijano, Fredy Enrique2024-01-17T16:41:48Z2024-01-17T16:41:48Z2023-12-06https://hdl.handle.net/1992/73299instname:Universidad de los Andesreponame:Repositorio Institucional Sénecarepourl:https://repositorio.uniandes.edu.co/Una forma muy recurrente de evaluar la efectividad y funcionalidad de los principales algoritmos de aprendizaje por refuerzo es mediante el uso de videojuegos. En este contexto, se decide implementar un agente basado en algoritmos de aprendizaje por refuerzo profundo en un videojuego de estrategia. Se trata de "Pokémon Edición Rojo Fuego", un juego bastante popular en su fecha de lanzamiento e incluso jugado hoy en día. La mecánica principal es el combate por turnos, donde se debe seguir una estrategia correcta para derrotar al rival.Ingeniero ElectrónicoPregrado31 páginasapplication/pdfspaUniversidad de los AndesIngeniería ElectrónicaFacultad de IngenieríaDepartamento de Ingeniería Eléctrica y ElectrónicaAttribution 4.0 Internationalhttp://creativecommons.org/licenses/by/4.0/info:eu-repo/semantics/openAccesshttp://purl.org/coar/access_right/c_abf2Desarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundoTrabajo de grado - Pregradoinfo:eu-repo/semantics/bachelorThesisinfo:eu-repo/semantics/acceptedVersionhttp://purl.org/coar/resource_type/c_7a1fTexthttp://purl.org/redcol/resource_type/TPAgenteAlgoritmoAprendizaje por refuerzoInteligencia artificialVideojuegoIngenieríaR. S. Sutton, Reinforcement learning an introduction. Cambridge, Mass: MIT Press, Second edition, 2018.H. van Hasselt, A. Guez, and D. Silver, ‘Deep Reinforcement Learning with Double Qlearning’, arXiv. org, 2015.Z. Wang, T. Schaul, M. Hessel, H. van Hasselt, M. Lanctot, and N. de Freitas, ‘Dueling Network Architectures for Deep Reinforcement Learning’, arXiv. org, 2016.J. P. Romero Pinzón, ‘Desarrollo de un programa de computador capaz de jugar Trackmania usando técnicas de aprendizaje por refuerzo’. Universidad de los Andes, 16-Jan2023.Goodfellow, I., Bengio, Y., and Courville, A. (2016). Deep Learning. MIT PressA. Millán, “Los Juegos de la Serie principal de Pokémon, ordenados según Su Duración,” Nintenderos, https://www.nintenderos.com/2022/02/los-juegos-de-la-serieprincipal-de-pokemon-ordenados-segun-su-duracion/ (accessed Oct. 8, 2023).D. A. Ballesteros Villamizar, ‘Desarrollo de un programa de computador capaz de jugar Starcraft - Brood War usando técnicas de aprendizaje por refuerzo’. Uniandes, 2011.A. Nichol, V. Pfau, C. Hesse, O. Klimov, and J. Schulman, “Gotta Learn Fast: A New Benchmark for Generalization in RL,” arXiv preprint arXiv:1804.03720, 2018.Mathieu and Poliquin, Stable Retro, a fork of OpenAI’s gym-retro. GitHub, 2023. [Online]. Available: https://github.com/Farama-Foundation/stable-retroMathieu, “OpenAI Game Integration Tool - Part 1,” YouTube, https://www.youtube.com/watch?v=lPYWaUAq_dY (accessed Oct. 8, 2023).“Pokémon Data Structure (generation III),” Pokémon data structure (Generation III) -Bulbapedia, the community-driven Pokémon encyclopedia, https://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_data_structure_(Generation_III) (accessed Oct. 8, 2023).O. Vinyals et al., ‘Grandmaster level in StarCraft II using multi-agent reinforcement learning’, Nature (London), vol. 575, no. 7782, pp. 350–354, 2019.202012699PublicationORIGINALDesarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo.pdfDesarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo.pdfapplication/pdf1329051https://repositorio.uniandes.edu.co/bitstreams/2bda59a5-6e75-491e-a18f-05a7f278bca1/download91ef2bff7c19f4447025b2330ccb9761MD52autorizacion tesis.pdfautorizacion tesis.pdfHIDEapplication/pdf235199https://repositorio.uniandes.edu.co/bitstreams/5d6097b9-816d-4a70-85b6-491b35a1bdb1/download86fbeb087740b44e4d2eabaca1259b55MD51CC-LICENSElicense_rdflicense_rdfapplication/rdf+xml; charset=utf-8908https://repositorio.uniandes.edu.co/bitstreams/f3fc41ac-c923-4ef7-ab02-b31d143b1283/download0175ea4a2d4caec4bbcc37e300941108MD53LICENSElicense.txtlicense.txttext/plain; charset=utf-82535https://repositorio.uniandes.edu.co/bitstreams/59fc010d-0ee1-40c7-aa53-480c54e00135/downloadae9e573a68e7f92501b6913cc846c39fMD54TEXTDesarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo.pdf.txtDesarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo.pdf.txtExtracted texttext/plain64673https://repositorio.uniandes.edu.co/bitstreams/bff76d7a-8bdc-4afd-9c75-735067393706/download35d40b2f80ece639260e0708e882285dMD55autorizacion tesis.pdf.txtautorizacion tesis.pdf.txtExtracted texttext/plain2145https://repositorio.uniandes.edu.co/bitstreams/9ed03540-092b-4f27-8bda-ea9b2ae9a334/download956217bf887cdc33897ff620e275d45bMD57THUMBNAILDesarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo.pdf.jpgDesarrollo y programación de un agente computacional capaz de jugar un juego de estrategia mediante algoritmos de aprendizaje por refuerzo profundo.pdf.jpgGenerated Thumbnailimage/jpeg9421https://repositorio.uniandes.edu.co/bitstreams/a1772238-22c9-44b5-b600-d97edfaa63fe/downloadb61039ff51bd4d8a5810130025c0d23fMD56autorizacion tesis.pdf.jpgautorizacion tesis.pdf.jpgGenerated Thumbnailimage/jpeg10994https://repositorio.uniandes.edu.co/bitstreams/c00690eb-fecc-47d7-bb14-1cbead48ed7c/download2686e0ffbe93819249ea9a674c0f3d48MD581992/73299oai:repositorio.uniandes.edu.co:1992/732992024-01-18 03:15:00.019http://creativecommons.org/licenses/by/4.0/Attribution 4.0 Internationalopen.accesshttps://repositorio.uniandes.edu.coRepositorio institucional Sénecaadminrepositorio@uniandes.edu.coPGgzPjxzdHJvbmc+RGVzY2FyZ28gZGUgUmVzcG9uc2FiaWxpZGFkIC0gTGljZW5jaWEgZGUgQXV0b3JpemFjacOzbjwvc3Ryb25nPjwvaDM+CjxwPjxzdHJvbmc+UG9yIGZhdm9yIGxlZXIgYXRlbnRhbWVudGUgZXN0ZSBkb2N1bWVudG8gcXVlIHBlcm1pdGUgYWwgUmVwb3NpdG9yaW8gSW5zdGl0dWNpb25hbCBTw6luZWNhIHJlcHJvZHVjaXIgeSBkaXN0cmlidWlyIGxvcyByZWN1cnNvcyBkZSBpbmZvcm1hY2nDs24gZGVwb3NpdGFkb3MgbWVkaWFudGUgbGEgYXV0b3JpemFjacOzbiBkZSBsb3Mgc2lndWllbnRlcyB0w6lybWlub3M6PC9zdHJvbmc+PC9wPgo8cD5Db25jZWRhIGxhIGxpY2VuY2lhIGRlIGRlcMOzc2l0byBlc3TDoW5kYXIgc2VsZWNjaW9uYW5kbyBsYSBvcGNpw7NuIDxzdHJvbmc+J0FjZXB0YXIgbG9zIHTDqXJtaW5vcyBhbnRlcmlvcm1lbnRlIGRlc2NyaXRvcyc8L3N0cm9uZz4geSBjb250aW51YXIgZWwgcHJvY2VzbyBkZSBlbnbDrW8gbWVkaWFudGUgZWwgYm90w7NuIDxzdHJvbmc+J1NpZ3VpZW50ZScuPC9zdHJvbmc+PC9wPgo8aHI+CjxwPllvLCBlbiBtaSBjYWxpZGFkIGRlIGF1dG9yIGRlbCB0cmFiYWpvIGRlIHRlc2lzLCBtb25vZ3JhZsOtYSBvIHRyYWJham8gZGUgZ3JhZG8sIGhhZ28gZW50cmVnYSBkZWwgZWplbXBsYXIgcmVzcGVjdGl2byB5IGRlIHN1cyBhbmV4b3MgZGUgc2VyIGVsIGNhc28sIGVuIGZvcm1hdG8gZGlnaXRhbCB5L28gZWxlY3Ryw7NuaWNvIHkgYXV0b3Jpem8gYSBsYSBVbml2ZXJzaWRhZCBkZSBsb3MgQW5kZXMgcGFyYSBxdWUgcmVhbGljZSBsYSBwdWJsaWNhY2nDs24gZW4gZWwgU2lzdGVtYSBkZSBCaWJsaW90ZWNhcyBvIGVuIGN1YWxxdWllciBvdHJvIHNpc3RlbWEgbyBiYXNlIGRlIGRhdG9zIHByb3BpbyBvIGFqZW5vIGEgbGEgVW5pdmVyc2lkYWQgeSBwYXJhIHF1ZSBlbiBsb3MgdMOpcm1pbm9zIGVzdGFibGVjaWRvcyBlbiBsYSBMZXkgMjMgZGUgMTk4MiwgTGV5IDQ0IGRlIDE5OTMsIERlY2lzacOzbiBBbmRpbmEgMzUxIGRlIDE5OTMsIERlY3JldG8gNDYwIGRlIDE5OTUgeSBkZW3DoXMgbm9ybWFzIGdlbmVyYWxlcyBzb2JyZSBsYSBtYXRlcmlhLCB1dGlsaWNlIGVuIHRvZGFzIHN1cyBmb3JtYXMsIGxvcyBkZXJlY2hvcyBwYXRyaW1vbmlhbGVzIGRlIHJlcHJvZHVjY2nDs24sIGNvbXVuaWNhY2nDs24gcMO6YmxpY2EsIHRyYW5zZm9ybWFjacOzbiB5IGRpc3RyaWJ1Y2nDs24gKGFscXVpbGVyLCBwcsOpc3RhbW8gcMO6YmxpY28gZSBpbXBvcnRhY2nDs24pIHF1ZSBtZSBjb3JyZXNwb25kZW4gY29tbyBjcmVhZG9yIGRlIGxhIG9icmEgb2JqZXRvIGRlbCBwcmVzZW50ZSBkb2N1bWVudG8uPC9wPgo8cD5MYSBwcmVzZW50ZSBhdXRvcml6YWNpw7NuIHNlIGVtaXRlIGVuIGNhbGlkYWQgZGUgYXV0b3IgZGUgbGEgb2JyYSBvYmpldG8gZGVsIHByZXNlbnRlIGRvY3VtZW50byB5IG5vIGNvcnJlc3BvbmRlIGEgY2VzacOzbiBkZSBkZXJlY2hvcywgc2lubyBhIGxhIGF1dG9yaXphY2nDs24gZGUgdXNvIGFjYWTDqW1pY28gZGUgY29uZm9ybWlkYWQgY29uIGxvIGFudGVyaW9ybWVudGUgc2XDsWFsYWRvLiBMYSBwcmVzZW50ZSBhdXRvcml6YWNpw7NuIHNlIGhhY2UgZXh0ZW5zaXZhIG5vIHNvbG8gYSBsYXMgZmFjdWx0YWRlcyB5IGRlcmVjaG9zIGRlIHVzbyBzb2JyZSBsYSBvYnJhIGVuIGZvcm1hdG8gbyBzb3BvcnRlIG1hdGVyaWFsLCBzaW5vIHRhbWJpw6luIHBhcmEgZm9ybWF0byBlbGVjdHLDs25pY28sIHkgZW4gZ2VuZXJhbCBwYXJhIGN1YWxxdWllciBmb3JtYXRvIGNvbm9jaWRvIG8gcG9yIGNvbm9jZXIuPC9wPgo8cD5FbCBhdXRvciwgbWFuaWZpZXN0YSBxdWUgbGEgb2JyYSBvYmpldG8gZGUgbGEgcHJlc2VudGUgYXV0b3JpemFjacOzbiBlcyBvcmlnaW5hbCB5IGxhIHJlYWxpesOzIHNpbiB2aW9sYXIgbyB1c3VycGFyIGRlcmVjaG9zIGRlIGF1dG9yIGRlIHRlcmNlcm9zLCBwb3IgbG8gdGFudG8sIGxhIG9icmEgZXMgZGUgc3UgZXhjbHVzaXZhIGF1dG9yw61hIHkgdGllbmUgbGEgdGl0dWxhcmlkYWQgc29icmUgbGEgbWlzbWEuPC9wPgo8cD5FbiBjYXNvIGRlIHByZXNlbnRhcnNlIGN1YWxxdWllciByZWNsYW1hY2nDs24gbyBhY2Npw7NuIHBvciBwYXJ0ZSBkZSB1biB0ZXJjZXJvIGVuIGN1YW50byBhIGxvcyBkZXJlY2hvcyBkZSBhdXRvciBzb2JyZSBsYSBvYnJhIGVuIGN1ZXN0acOzbiwgZWwgYXV0b3IgYXN1bWlyw6EgdG9kYSBsYSByZXNwb25zYWJpbGlkYWQsIHkgc2FsZHLDoSBkZSBkZWZlbnNhIGRlIGxvcyBkZXJlY2hvcyBhcXXDrSBhdXRvcml6YWRvcywgcGFyYSB0b2RvcyBsb3MgZWZlY3RvcyBsYSBVbml2ZXJzaWRhZCBhY3TDumEgY29tbyB1biB0ZXJjZXJvIGRlIGJ1ZW5hIGZlLjwvcD4KPHA+U2kgdGllbmUgYWxndW5hIGR1ZGEgc29icmUgbGEgbGljZW5jaWEsIHBvciBmYXZvciwgY29udGFjdGUgY29uIGVsIDxhIGhyZWY9Im1haWx0bzpiaWJsaW90ZWNhQHVuaWFuZGVzLmVkdS5jbyIgdGFyZ2V0PSJfYmxhbmsiPkFkbWluaXN0cmFkb3IgZGVsIFNpc3RlbWEuPC9hPjwvcD4K