Práticas em Bioinfo III

Prof. Heron OH

2023/01

     Olá, esta é mais uma de um conjunto de práticas em bioinformática desenvolvidas para o curso de Biomedicina da PUC MG. Você pode encontrar as demais práticas aqui.

Scripts bioinformáticos

     Na prática passada você aprendeu a construir um script que desempenhava uma função simples, de saudação, utilizando funções/programas (outros scripts) existentes na linguagem bash. Da mesma maneira, é possível utilizar estes funções/programas para resolver os problemas de bioinformática que vimos nos exercícios, como a transformação de sequências de DNA em seu complemento reverso, em RNA, ou até mesmo em proteínas.

     As ferramentas de linha de comando são especialmente eficientes para o processamento de informações de texto e tabelas. Assim, uma vez que a informação genética pode ser bem representada nesses tipos de arquivo, é possível aproveitar todo o poder dessas ferramentas, num contexto biológico.

     Mas não é necessário que cada bioinformata faça seus próprios programas. À medida que o universo da bioinfo se desenvolve, as ferramentas mais eficientes e práticas acabam se estabelecendo e se difundindo, de maneira semelhante ao que ocorre no mundo da ciência.

     Esta é a grande vantagem da (bio)informática. Por ser baseada (principalmente) em ferramentas de código aberto, qualquer pessoa pode fazer melhorias, reformulações, ou construir novas funções a partir das ferramentas existentes. E não é preciso reinventar a roda! Problemas clássicos, ou recorrentes, tendem a já possuir soluções disponíveis a alguns cliques de distância.

Tradução: o ribossomo digital

     Figura central no funcionamento celular e no fluxo da informação biológica, o ribossomo é uma máquina perfeita, modelada pela seleção natural. Como um computador na célula, ele é capaz de decodificar a traduzir a informação contida no RNA mensagiro (mRNA) em uma sequência correspondente de amino ácidos, produzindo as proteínas que desempenham as mais diversas atividades.

     Reproduzir um ribossomo no mundo virtual é relativamente simples: basta escrever um script que, para cada trinca de letras de um arquivo .fasta (representando 3 nucleotídeos do DNA/mRNA), identifique uma letra (representando um amino ácido, ou um sinal de parada, correspondentes). Este script precisaria conter um dicionário, com todas as correspondências entre as trincas de nucleotídeos e cada amino ácido, utilizando letras como representações, como o código sequências biológicas da IUPAC (a International Union of Pure and Applied Chemistry).

Baixando um tradutor

     A partir de uma busca rápida no Google, com as palavras chave “DNA protein translate command line”, você observará que há muitas opções pacotes e programas. Um programa de tradução de DNA|proteína muito utilizado é o transeq, do pacote EMBOSS (o European Molecular Biology Open Software Suite). Este é um pacote que reúne dezenas de programas para trabalhar com arquivos de sequências e outros arquivos comuns na bioinformática. Ele foi desenvolvido em conjunto, por pesquisadores de diferentes centros de pesquisa como o EMBL-EBI, o WSI, o BBSRC e o MRC. O pacote EMBOSS pode ser instalado de maneira semelhante a qualquer aplicativo da distribuição de Linux que estamos usando (Ubuntu - Debian), com o sistema de gerenciamento de pacotes apt.

Instale o pacote EMBOSS utilizando o sistema de gerenciamento de pacotes apt.

sudo apt install emboss

Após a instalação, verifique que agora você possui a ferramenta/script transeq, e abra seu manual.

transeq --help

Traduzindo um arquivo .fasta

     Antes de começar, vamos organizar uma pasta para trabalhar com os arquivos desta prática.

Na sua home, crie uma pasta aula3 para os arquivos da prática de hoje. Entre nesta pasta.

cd

mkdir aula3

cd aula3

     Agora, vamos criar o arquivo que utilizaremos. Vamos trabalhar com a sequência do gene Citocromo C Oxidase I, um gene que codifica uma das proteínas da Cadeia transportadora de elétrons da fosforilação oxidativa, responsável pela respiração celular, na mitocôndria.

Abra o vi, para editar um arquivo de nome COI.fasta. Entre no modo de inserção.

vi mtCOI.fasta

Cole o conteúdo a seguir dentro do seu arquivo no editor de textos vi. Depois salve o conteúdo e saia.

>NC_012920.1:5904-7445 Homo sapiens mitochondrion, complete genome
ATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTGGAACACTATACCTATTATTCGGCG
CATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCT
TCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTA
ATACCCATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGT
TTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATCTGCTAT
AGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGA
GCCTCCGTAGACCTAACCATCTTCTCCTTACACCTAGCAGGTGTCTCCTCTATCTTAGGGGCCATCAATT
TCATCACAACAATTATCAATATAAAACCCCCTGCCATAACCCAATACCAAACGCCCCTCTTCGTCTGATC
CGTCCTAATCACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTA
ACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCATTCTATACCAACACC
TATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCAGGCTTCGGAATAATCTCCCATAT
TGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGTATGGTCTGAGCTATGATATCAATT
GGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCAT
ATTTCACCTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACT
CCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTA
GGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTG
TAGCCCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATT
TCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATCCATTTCACTATCATATTCATCGGC
GTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACGTTACTCGGACTACC
CCGATGCATACACCACATGAAACATCCTATCATCTGTAGGCTCATTCATTTCTCTAACAGCAGTAATATT
AATAATTTTCATGATTTGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATA
AACCTGGAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTATACATAAAATCTA
GA

Verifique o conteúdo do arquivo que você criou:

cat mtCOI.fasta

     Agora, vamos traduzir essa proteína utilizando a função recém-instalada, transeq.

Traduza a sequência do arquivo mtCOI.fasta para o arquivo mtCOI.pep.

transeq mtCOI.fasta

     Observe que o programa te perguntou, interativamente, qual nome ele deveria dar ao arquivo de output. Isto poderia ser evitado caso você fornecesse o nome desse arquivo como argumento -outseq $nome-do-arquivo-de-saída.

     Agora, vamos ver o conteúdo do arquivo gerado.

Liste os arquivos e visualize o contaúdo do arquivo gerado pelo transeq.

ls

cat mtCOI.pep

     Atenção! Observe que há algo de estranho na sequência gerada. Note que o símbolo * aparece algumas vezes em meio à sequência de letras que representa os amino ácidos. Esse símbolo, em arquivos fasta de amino ácidos representa códons de parada*, os códons que dizem para o ribossomo que a tradução daquela proteína terminou.

     Mas, sendo o COI uma proteína única e sem íntrons, estes códons de parada não deveriam estar presentes no meio de sua sequência. Para tentarmos entender melhor, vamos usar um recurso externo.

Trabalhando na internet

     Muitos programas de bioinformática, especialmente os mais utilizados, apresentam versões online, e são hospedados em sites onde qualquer pessoa pode ter acesso aos seus recursos. Em última análise, esses programas estão realizando as mesmas operações que quando são rodados no seu próprio computador, mas nesse caso o seu processamento é feito por sevidores remotos (em outro local).

     Para a tradução de arquivos de sequências biológicas, um serviço online muito bom e muito utilizado é o Expasy translate tool, mantido pelo SBI (Swiss Institute of Bioinformatics). Vamos realizar a tradução da nossa sequência utilizando esse serviço.

Acesse o site da ferramenta Expasy translate tool.

Cole a sequência do arquivo mtCOI.fasta na caixa de texto para tradução, com ou sem o cabeçalho (>).

Acione o botão Translate, utilizando os parâmetros default.

     Veja que obtivemos um resultado semelhante, porém mais completo. Agora, temos 6 possibilidades de tradução, que correspondem a 3 fases de leitura (ORFs - Open Reading Frames) para cada uma das duas fitas, a fita codificadora e a fita complementar.

ORFs - Open Reading Frames](https://en.wikipedia.org/wiki/Open_reading_frame)

     Isso acontece porquê o local de início da tradução pelo ribossomo não é exato, mas sim definido pela própria composição da sequência, em funções de sinais como o primeiro códon de iniciação, que também corresponde à incorporação do amino ácido metionina (representado por M, ou Met). Ou seja, todas as protéinas tem sua síntese iniciada por uma metionina (em eucariotos e archea; e por fenil-metionina (fMet) em bactérias, mitocôndrias e plastídeos).

     Agora, vamos entender os nossos resultados. Na página gerada pelo Expasy translate tool, observe que há um campo Genetic code que está definido como Standard. Veja as outras opções disponíveis. Vamos avaliar outras possivilidades. Lembre-se que: o gene COI é um gene mitocondrial.

Altere o Genetic code de Standard para Vertebrate mitochondrial. Acione o botão Translate novamente.

     Veja que agora temos um resultado mais pertinente com a realidade! O primeiro resultado (correspondente à fita codificadora em sua primeira fase de leitura) apresenta uma proteína completa, iniciada por uma metionina, e finalizada por um códon de parada!

     Ou seja, o nosso resultado estava errado pois estávamos utilizando o código genético (o dicionário) errado! Os nossos ribossomos e os ribossomos de nossas mitocôndrias utilizam códigos ligeiramente diferentes.

     Este é um exemplo de que, quando um script/programa/código funciona, não significa que ele gerou um resultado correto, biológicamente pertininete. A expertise do bioinformata esta justamente em compreender o que o o computador executou, avaliar se o resultado faz sentido e, caso não, entender o que precisa ser modificado para o funcionamento adequado.

Exercícios

Utilizando a ferramenta transeq, refaça a tradução da sequência do arquivo mtCOI.fasta. Lembre-se de explorar as possibilidades de configuração com o argumento –help.

Visualize o arquivo gerado e confira se o resultado esperado foi obtido.


Voltar para a página inicial

LS0tCnRpdGxlOiAiUHLDoXRpY2FzIGVtIEJpb2luZm8gSUlJIgphdXRob3I6ICJQcm9mLiBIZXJvbiBPSCIKcGxhY2U6ICJCaW9tZWRpY2luYSAtIFBVQyBNaW5hcyIKZGF0ZTogMjAyMy8wMQpvdXRwdXQ6IAogIHJtZGZvcm1hdHM6OmRvd25jdXRlOgogICAgdGhlbWU6IGNvc21vCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCiAgICBoaWdobGlnaHQ6IGVzcHJlc3NvCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7ciBjb2xvciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9CiNjb25maWd1cmFyIHByb3MgcmVzdWx0YWRvcyBkbyBiYXNoIHNhaXJlbSBjb2xvcmlkb3MgZSBuw6NvIEFOU0kKCm9sZF9ob29rcyA8LSBmYW5zaTo6c2V0X2tuaXRfaG9va3MoCiAga25pdHI6OmtuaXRfaG9va3MsIAogIHdoaWNoID0gYygib3V0cHV0IiwgIm1lc3NhZ2UiLCAiZXJyb3IiKQopCmBgYAoKPHN0eWxlPgpib2R5IHsKdGV4dC1hbGlnbjoganVzdGlmeX0KPC9zdHlsZT4KCjxzdHlsZT4KI3RvYyB1bC5uYXYgbGkgdWwgbGkgewogICAgZGlzcGxheTogbm9uZTsKICAgIG1heC1oZWlnaHQ6IG5vbmU7Cn0KCiN0b2MgdWwubmF2IGxpLmFjdGl2ZSB1bCBsaSAgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXgtaGVpZ2h0OiBub25lOwp9CgojdG9jIHVsLm5hdiBsaSB1bCBsaSB1bCBsaSB7CiAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgojdG9jIHVsLm5hdiBsaSB1bCBsaS5hY3RpdmUgdWwgbGkgewogICAgbWF4LWhlaWdodDogbm9uZTsKICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7Cn0KPC9zdHlsZT4KCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKT2zDoSwgZXN0YSDDqSBtYWlzIHVtYSBkZSB1bSBjb25qdW50byBkZSBwcsOhdGljYXMgZW0gYmlvaW5mb3Jtw6F0aWNhIGRlc2Vudm9sdmlkYXMgcGFyYSBvIGN1cnNvIGRlIEJpb21lZGljaW5hIGRhIFBVQyBNRy4KVm9jw6ogcG9kZSBlbmNvbnRyYXIgYXMgZGVtYWlzIHByw6F0aWNhcyBbKmFxdWkqXShodHRwczovL2hlcm9ub2guZ2l0aHViLmlvL2Jpb2luZm8pLgoKIyMgX1NjcmlwdHNfIGJpb2luZm9ybcOhdGljb3MKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpOYSBwcsOhdGljYSBwYXNzYWRhIHZvY8OqIGFwcmVuZGV1IGEgY29uc3RydWlyIHVtIF9zY3JpcHRfIHF1ZSBkZXNlbXBlbmhhdmEgdW1hIGZ1bsOnw6NvIHNpbXBsZXMsIGRlIHNhdWRhw6fDo28sIHV0aWxpemFuZG8gZnVuw6fDtWVzL3Byb2dyYW1hcyAob3V0cm9zIF9zY3JpcHRzXykgZXhpc3RlbnRlcyBuYSBsaW5ndWFnZW0gX2Jhc2hfLiBEYSBtZXNtYSBtYW5laXJhLCDDqSBwb3Nzw612ZWwgdXRpbGl6YXIgZXN0ZXMgZnVuw6fDtWVzL3Byb2dyYW1hcyBwYXJhIHJlc29sdmVyIG9zIHByb2JsZW1hcyBkZSBiaW9pbmZvcm3DoXRpY2EgcXVlIHZpbW9zIG5vcyBleGVyY8OtY2lvcywgY29tbyBhIHRyYW5zZm9ybWHDp8OjbyBkZSBzZXF1w6puY2lhcyBkZSBETkEgZW0gc2V1IGNvbXBsZW1lbnRvIHJldmVyc28sIGVtIFJOQSwgb3UgYXTDqSBtZXNtbyBlbSBwcm90ZcOtbmFzLgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFzIGZlcnJhbWVudGFzIGRlIF9saW5oYSBkZSBjb21hbmRvXyBzw6NvIGVzcGVjaWFsbWVudGUgZWZpY2llbnRlcyBwYXJhIG8gcHJvY2Vzc2FtZW50byBkZSBpbmZvcm1hw6fDtWVzIGRlIHRleHRvIGUgdGFiZWxhcy4gQXNzaW0sIHVtYSB2ZXogcXVlIGEgaW5mb3JtYcOnw6NvIGdlbsOpdGljYSBwb2RlIHNlciBiZW0gcmVwcmVzZW50YWRhIG5lc3NlcyB0aXBvcyBkZSBhcnF1aXZvLCDDqSBwb3Nzw612ZWwgYXByb3ZlaXRhciB0b2RvIG8gcG9kZXIgZGVzc2FzIGZlcnJhbWVudGFzLCBudW0gY29udGV4dG8gYmlvbMOzZ2ljby4KCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpNYXMgbsOjbyDDqSBuZWNlc3PDoXJpbyBxdWUgY2FkYSBiaW9pbmZvcm1hdGEgZmHDp2Egc2V1cyBwcsOzcHJpb3MgcHJvZ3JhbWFzLiDDgCBtZWRpZGEgcXVlIG8gdW5pdmVyc28gZGEgYmlvaW5mbyBzZSBkZXNlbnZvbHZlLCBhcyBmZXJyYW1lbnRhcyBtYWlzIGVmaWNpZW50ZXMgZSBwcsOhdGljYXMgYWNhYmFtIHNlIGVzdGFiZWxlY2VuZG8gZSBzZSBkaWZ1bmRpbmRvLCBkZSBtYW5laXJhIHNlbWVsaGFudGUgYW8gcXVlIG9jb3JyZSBubyBtdW5kbyBkYSBjacOqbmNpYS4gCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKRXN0YSDDqSBhIGdyYW5kZSB2YW50YWdlbSBkYSAoYmlvKWluZm9ybcOhdGljYS4gUG9yIHNlciBiYXNlYWRhIChwcmluY2lwYWxtZW50ZSkgZW0gZmVycmFtZW50YXMgZGUgX2PDs2RpZ28gYWJlcnRvXywgcXVhbHF1ZXIgcGVzc29hIHBvZGUgZmF6ZXIgbWVsaG9yaWFzLCByZWZvcm11bGHDp8O1ZXMsIG91IGNvbnN0cnVpciBub3ZhcyBmdW7Dp8O1ZXMgYSBwYXJ0aXIgZGFzIGZlcnJhbWVudGFzIGV4aXN0ZW50ZXMuIEUgbsOjbyDDqSBwcmVjaXNvICoqKnJlaW52ZW50YXIgYSByb2RhISoqKiBQcm9ibGVtYXMgY2zDoXNzaWNvcywgb3UgcmVjb3JyZW50ZXMsIHRlbmRlbSBhIGrDoSBwb3NzdWlyIHNvbHXDp8O1ZXMgZGlzcG9uw612ZWlzIGEgYWxndW5zIGNsaXF1ZXMgZGUgZGlzdMOibmNpYS4KCiMjIyBUcmFkdcOnw6NvOiBvIHJpYm9zc29tbyBkaWdpdGFsCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKRmlndXJhIGNlbnRyYWwgbm8gZnVuY2lvbmFtZW50byBjZWx1bGFyIGUgbm8gZmx1eG8gZGEgaW5mb3JtYcOnw6NvIGJpb2zDs2dpY2EsIG8gKipyaWJvc3NvbW8qKiDDqSB1bWEgbcOhcXVpbmEgcGVyZmVpdGEsIG1vZGVsYWRhIHBlbGEgc2VsZcOnw6NvIG5hdHVyYWwuIENvbW8gdW0gY29tcHV0YWRvciBuYSBjw6lsdWxhLCBlbGUgw6kgY2FwYXogZGUgZGVjb2RpZmljYXIgYSB0cmFkdXppciBhIGluZm9ybWHDp8OjbyBjb250aWRhIG5vIF9STkEgbWVuc2FnaXJvXyAobVJOQSkgZW0gdW1hIHNlcXXDqm5jaWEgY29ycmVzcG9uZGVudGUgZGUgX2FtaW5vIMOhY2lkb3NfLCBwcm9kdXppbmRvIGFzIF9wcm90ZcOtbmFzXyBxdWUgZGVzZW1wZW5oYW0gYXMgbWFpcyBkaXZlcnNhcyBhdGl2aWRhZGVzLgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ClJlcHJvZHV6aXIgdW0gX3JpYm9zc29tb18gbm8gbXVuZG8gdmlydHVhbCDDqSByZWxhdGl2YW1lbnRlIHNpbXBsZXM6IGJhc3RhIGVzY3JldmVyIHVtIF9zY3JpcHRfIHF1ZSwgcGFyYSBjYWRhIHRyaW5jYSBkZSBsZXRyYXMgZGUgdW0gYXJxdWl2byBfLmZhc3RhXyAocmVwcmVzZW50YW5kbyAzIG51Y2xlb3TDrWRlb3MgZG8gX0ROQS9tUk5BXyksIGlkZW50aWZpcXVlIHVtYSBsZXRyYSAocmVwcmVzZW50YW5kbyB1bSBfYW1pbm8gw6FjaWRvXywgb3UgdW0gX3NpbmFsIGRlIHBhcmFkYV8sIGNvcnJlc3BvbmRlbnRlcykuIEVzdGUgX3NjcmlwdF8gcHJlY2lzYXJpYSBjb250ZXIgdW0gZGljaW9uw6FyaW8sIGNvbSB0b2RhcyBhcyBjb3JyZXNwb25kw6puY2lhcyBlbnRyZSBhcyB0cmluY2FzIGRlIG51Y2xlb3TDrWRlb3MgZSBjYWRhIF9hbWlubyDDoWNpZG9fLCB1dGlsaXphbmRvIGxldHJhcyBjb21vIHJlcHJlc2VudGHDp8O1ZXMsIGNvbW8gbyBbY8OzZGlnbyBzZXF1w6puY2lhcyBiaW9sw7NnaWNhcyBkYSAqKklVUEFDKipdKGh0dHBzOi8vd3d3LmJpb2luZm9ybWF0aWNzLm9yZy9zbXMvaXVwYWMuaHRtbCkgKGEgX0ludGVybmF0aW9uYWwgVW5pb24gb2YgUHVyZSBhbmQgQXBwbGllZCBDaGVtaXN0cnlfKS4KCiMjIyMgQmFpeGFuZG8gdW0gdHJhZHV0b3IgCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKQSBwYXJ0aXIgZGUgdW1hIGJ1c2NhIHLDoXBpZGEgbm8gW19Hb29nbGVfXShodHRwczovL3d3dy5nb29nbGUuY29tLyksIGNvbSBhcyBwYWxhdnJhcyBjaGF2ZSAiKioqRE5BIHByb3RlaW4gdHJhbnNsYXRlIGNvbW1hbmQgbGluZSoqKiIsIHZvY8OqIG9ic2VydmFyw6EgcXVlIGjDoSBtdWl0YXMgb3DDp8O1ZXMgcGFjb3RlcyBlIHByb2dyYW1hcy4gVW0gcHJvZ3JhbWEgZGUgdHJhZHXDp8OjbyBkZSAqKkROQXxwcm90ZcOtbmEqKiBtdWl0byB1dGlsaXphZG8gw6kgbyBfdHJhbnNlcV8sIGRvIHBhY290ZSBbKipFTUJPU1MqKl0oaHR0cDovL2VtYm9zcy5vcGVuLWJpby5vcmcvKSAobyBfRXVyb3BlYW4gTW9sZWN1bGFyIEJpb2xvZ3kgT3BlbiBTb2Z0d2FyZSBTdWl0ZV8pLiBFc3RlIMOpIHVtIHBhY290ZSBxdWUgcmXDum5lIFtkZXplbmFzIGRlIHByb2dyYW1hc10oaHR0cHM6Ly93d3cuYmlvaW5mb3JtYXRpY3MubmwvZW1ib3NzLWV4cGxvcmVyLykgcGFyYSB0cmFiYWxoYXIgY29tIGFycXVpdm9zIGRlIHNlcXXDqm5jaWFzIGUgb3V0cm9zIGFycXVpdm9zIGNvbXVucyBuYSBiaW9pbmZvcm3DoXRpY2EuIEVsZSBmb2kgZGVzZW52b2x2aWRvIGVtIGNvbmp1bnRvLCBwb3IgcGVzcXVpc2Fkb3JlcyBkZSBkaWZlcmVudGVzIGNlbnRyb3MgZGUgcGVzcXVpc2EgY29tbyBvIFsqKkVNQkwtRUJJKipdKGh0dHBzOi8vd3d3LmViaS5hYy51ay9hYm91dCksIG8gWyoqV1NJKipdKGh0dHBzOi8vd3d3LnNhbmdlci5hYy51ay8pLCBvIFsqKkJCU1JDKipdKGh0dHBzOi8vd3d3LnVrcmkub3JnL2NvdW5jaWxzL2Jic3JjLykgZSBvIFsqKk1SQyoqXShodHRwczovL3d3dy5tcmMtYnN1LmNhbS5hYy51ay8pLiBPIHBhY290ZSAqKkVNQk9TUyoqIHBvZGUgc2VyIGluc3RhbGFkbyBkZSBtYW5laXJhIHNlbWVsaGFudGUgYSBxdWFscXVlciBhcGxpY2F0aXZvIGRhIGRpc3RyaWJ1acOnw6NvIGRlIF9MaW51eF8gcXVlIGVzdGFtb3MgdXNhbmRvICgqKlVidW50dSAtIERlYmlhbioqKSwgY29tIG8gX3Npc3RlbWEgZGUgZ2VyZW5jaWFtZW50byBkZSBwYWNvdGVzXyAqKmFwdCoqLgoKPiBJbnN0YWxlIG8gcGFjb3RlICoqRU1CT1NTKiogdXRpbGl6YW5kbyBvIF9zaXN0ZW1hIGRlIGdlcmVuY2lhbWVudG8gZGUgcGFjb3Rlc18gKiphcHQqKi4KCmBgYHtiYXNoLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0Kc3VkbyBhcHQgaW5zdGFsbCBlbWJvc3MKCmBgYAoKPiBBcMOzcyBhIGluc3RhbGHDp8OjbywgdmVyaWZpcXVlIHF1ZSBhZ29yYSB2b2PDqiBwb3NzdWkgYSBmZXJyYW1lbnRhL19zY3JpcHRfIF90cmFuc2VxXywgZSBhYnJhIHNldSBtYW51YWwuCgpgYGB7YmFzaCwgZWNobz1UUlVFLGV2YWw9RkFMU0V9CnRyYW5zZXEgLS1oZWxwCgpgYGAKCiMjIyMgVHJhZHV6aW5kbyB1bSBhcnF1aXZvIF8uZmFzdGFfCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKQW50ZXMgZGUgY29tZcOnYXIsIHZhbW9zIG9yZ2FuaXphciB1bWEgcGFzdGEgcGFyYSB0cmFiYWxoYXIgY29tIG9zIGFycXVpdm9zIGRlc3RhIHByw6F0aWNhLgoKPiBOYSBzdWEgKioqaG9tZSoqKiwgY3JpZSB1bWEgcGFzdGEgX2F1bGEzXyBwYXJhIG9zIGFycXVpdm9zIGRhIHByw6F0aWNhIGRlIGhvamUuIEVudHJlIG5lc3RhIHBhc3RhLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQpjZAoKbWtkaXIgYXVsYTMKCmNkIGF1bGEzCgpgYGAKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpBZ29yYSwgdmFtb3MgY3JpYXIgbyBhcnF1aXZvIHF1ZSB1dGlsaXphcmVtb3MuIFZhbW9zIHRyYWJhbGhhciBjb20gYSBzZXF1w6puY2lhIGRvIGdlbmUgW19DaXRvY3JvbW8gQyBPeGlkYXNlIElfXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DeXRvY2hyb21lX2Nfb3hpZGFzZV9zdWJ1bml0X0kpLCB1bSBnZW5lIHF1ZSBjb2RpZmljYSB1bWEgZGFzIHByb3Rlw61uYXMgZGEgX0NhZGVpYSB0cmFuc3BvcnRhZG9yYSBkZSBlbMOpdHJvbnNfIGRhIF9mb3Nmb3JpbGHDp8OjbyBveGlkYXRpdmFfLCByZXNwb25zw6F2ZWwgcGVsYSByZXNwaXJhw6fDo28gY2VsdWxhciwgbmEgbWl0b2PDtG5kcmlhLgoKPiBBYnJhIG8gX3ZpXywgcGFyYSBlZGl0YXIgdW0gYXJxdWl2byBkZSBub21lICoqQ09JLmZhc3RhKiouIEVudHJlIG5vIF9tb2RvIGRlIGluc2Vyw6fDo29fLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQp2aSBtdENPSS5mYXN0YQoKYGBgCgo+IENvbGUgbyBjb250ZcO6ZG8gYSBzZWd1aXIgZGVudHJvIGRvIHNldSBhcnF1aXZvIG5vIGVkaXRvciBkZSB0ZXh0b3MgX3ZpXy4gRGVwb2lzIHNhbHZlIG8gY29udGXDumRvIGUgc2FpYS4KCmBgYHtiYXNoLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0KPk5DXzAxMjkyMC4xOjU5MDQtNzQ0NSBIb21vIHNhcGllbnMgbWl0b2Nob25kcmlvbiwgY29tcGxldGUgZ2Vub21lCkFUR1RUQ0dDQ0dBQ0NHVFRHQUNUQVRUQ1RDVEFDQUFBQ0NBQ0FBQUdBQ0FUVEdHQUFDQUNUQVRBQ0NUQVRUQVRUQ0dHQ0cKQ0FUR0FHQ1RHR0FHVENDVEFHR0NBQ0FHQ1RDVEFBR0NDVENDVFRBVFRDR0FHQ0NHQUdDVEdHR0NDQUdDQ0FHR0NBQUNDVApUQ1RBR0dUQUFDR0FDQ0FDQVRDVEFDQUFDR1RUQVRDR1RDQUNBR0NDQ0FUR0NBVFRUR1RBQVRBQVRDVFRDVFRDQVRBR1RBCkFUQUNDQ0FUQ0FUQUFUQ0dHQUdHQ1RUVEdHQ0FBQ1RHQUNUQUdUVENDQ0NUQUFUQUFUQ0dHVEdDQ0NDQ0dBVEFUR0dDR1QKVFRDQ0NDR0NBVEFBQUNBQUNBVEFBR0NUVENUR0FDVENUVEFDQ1RDQ0NUQ1RDVENDVEFDVENDVEdDVENHQ0FUQ1RHQ1RBVApBR1RHR0FHR0NDR0dBR0NBR0dBQUNBR0dUVEdBQUNBR1RDVEFDQ0NUQ0NDVFRBR0NBR0dHQUFDVEFDVENDQ0FDQ0NUR0dBCkdDQ1RDQ0dUQUdBQ0NUQUFDQ0FUQ1RUQ1RDQ1RUQUNBQ0NUQUdDQUdHVEdUQ1RDQ1RDVEFUQ1RUQUdHR0dDQ0FUQ0FBVFQKVENBVENBQ0FBQ0FBVFRBVENBQVRBVEFBQUFDQ0NDQ1RHQ0NBVEFBQ0NDQUFUQUNDQUFBQ0dDQ0NDVENUVENHVENUR0FUQwpDR1RDQ1RBQVRDQUNBR0NBR1RDQ1RBQ1RUQ1RDQ1RBVENUQ1RDQ0NBR1RDQ1RBR0NUR0NUR0dDQVRDQUNUQVRBQ1RBQ1RBCkFDQUdBQ0NHQ0FBQ0NUQ0FBQ0FDQ0FDQ1RUQ1RUQ0dBQ0NDQ0dDQ0dHQUdHQUdHQUdBQ0NDQ0FUVENUQVRBQ0NBQUNBQ0MKVEFUVENUR0FUVFRUVENHR1RDQUNDQ1RHQUFHVFRUQVRBVFRDVFRBVENDVEFDQ0FHR0NUVENHR0FBVEFBVENUQ0NDQVRBVApUR1RBQUNUVEFDVEFDVENDR0dBQUFBQUFBR0FBQ0NBVFRUR0dBVEFDQVRBR0dUQVRHR1RDVEdBR0NUQVRHQVRBVENBQVRUCkdHQ1RUQ0NUQUdHR1RUVEFUQ0dUR1RHQUdDQUNBQ0NBVEFUQVRUVEFDQUdUQUdHQUFUQUdBQ0dUQUdBQ0FDQUNHQUdDQVQKQVRUVENBQ0NUQ0NHQ1RBQ0NBVEFBVENBVENHQ1RBVENDQ0NBQ0NHR0NHVENBQUFHVEFUVFRBR0NUR0FDVENHQ0NBQ0FDVApDQ0FDR0dBQUdDQUFUQVRHQUFBVEdBVENUR0NUR0NBR1RHQ1RDVEdBR0NDQ1RBR0dBVFRDQVRDVFRUQ1RUVFRDQUNDR1RBCkdHVEdHQ0NUR0FDVEdHQ0FUVEdUQVRUQUdDQUFBQ1RDQVRDQUNUQUdBQ0FUQ0dUQUNUQUNBQ0dBQ0FDR1RBQ1RBQ0dUVEcKVEFHQ0NDQUNUVENDQUNUQVRHVENDVEFUQ0FBVEFHR0FHQ1RHVEFUVFRHQ0NBVENBVEFHR0FHR0NUVENBVFRDQUNUR0FUVApUQ0NDQ1RBVFRDVENBR0dDVEFDQUNDQ1RBR0FDQ0FBQUNDVEFDR0NDQUFBQVRDQ0FUVFRDQUNUQVRDQVRBVFRDQVRDR0dDCkdUQUFBVENUQUFDVFRUQ1RUQ0NDQUNBQUNBQ1RUVENUQ0dHQ0NUQVRDQ0dHQUFUR0NDQ0NHQUNHVFRBQ1RDR0dBQ1RBQ0MKQ0NHQVRHQ0FUQUNBQ0NBQ0FUR0FBQUNBVENDVEFUQ0FUQ1RHVEFHR0NUQ0FUVENBVFRUQ1RDVEFBQ0FHQ0FHVEFBVEFUVApBQVRBQVRUVFRDQVRHQVRUVEdBR0FBR0NDVFRDR0NUVENHQUFHQ0dBQUFBR1RDQ1RBQVRBR1RBR0FBR0FBQ0NDVENDQVRBCkFBQ0NUR0dBR1RHQUNUQVRBVEdHQVRHQ0NDQ0NDQUNDQ1RBQ0NBQ0FDQVRUQ0dBQUdBQUNDQ0dUQVRBQ0FUQUFBQVRDVEEKR0EKCmBgYAoKPiBWZXJpZmlxdWUgbyBjb250ZcO6ZG8gZG8gYXJxdWl2byBxdWUgdm9jw6ogY3Jpb3U6CgpgYGB7YmFzaCwgZWNobz1UUlVFLGV2YWw9RkFMU0V9CmNhdCBtdENPSS5mYXN0YQoKYGBgCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKQWdvcmEsIHZhbW9zIHRyYWR1emlyIGVzc2EgcHJvdGXDrW5hIHV0aWxpemFuZG8gYSBmdW7Dp8OjbyByZWPDqW0taW5zdGFsYWRhLCBfdHJhbnNlcV8uCgo+IFRyYWR1emEgYSBzZXF1w6puY2lhIGRvIGFycXVpdm8gbXRDT0kuZmFzdGEgcGFyYSBvIGFycXVpdm8gbXRDT0kucGVwLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQp0cmFuc2VxIG10Q09JLmZhc3RhCgpgYGAKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpPYnNlcnZlIHF1ZSBvIHByb2dyYW1hIHRlIHBlcmd1bnRvdSwgaW50ZXJhdGl2YW1lbnRlLCBxdWFsIG5vbWUgZWxlIGRldmVyaWEgZGFyIGFvIGFycXVpdm8gZGUgX291dHB1dF8uIElzdG8gcG9kZXJpYSBzZXIgZXZpdGFkbyBjYXNvIHZvY8OqIGZvcm5lY2Vzc2UgbyBub21lIGRlc3NlIGFycXVpdm8gY29tbyBhcmd1bWVudG8gXy1vdXRzZXEgJG5vbWUtZG8tYXJxdWl2by1kZS1zYcOtZGFfLgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFnb3JhLCB2YW1vcyB2ZXIgbyBjb250ZcO6ZG8gZG8gYXJxdWl2byBnZXJhZG8uCgo+IExpc3RlIG9zIGFycXVpdm9zIGUgdmlzdWFsaXplIG8gY29udGHDumRvIGRvIGFycXVpdm8gZ2VyYWRvIHBlbG8gX3RyYW5zZXFfLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQpscwoKY2F0IG10Q09JLnBlcAoKYGBgCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKipBdGVuw6fDo28hKiogT2JzZXJ2ZSBxdWUgaMOhIGFsZ28gZGUgZXN0cmFuaG8gbmEgc2VxdcOqbmNpYSBnZXJhZGEuIE5vdGUgcXVlIG8gc8OtbWJvbG8gKioqXCoqKiBhcGFyZWNlIGFsZ3VtYXMgdmV6ZXMgZW0gbWVpbyDDoCBzZXF1w6puY2lhIGRlIGxldHJhcyBxdWUgcmVwcmVzZW50YSBvcyBhbWlubyDDoWNpZG9zLiBFc3NlIHPDrW1ib2xvLCBlbSBfYXJxdWl2b3MgZmFzdGEgZGUgYW1pbm8gw6FjaWRvc18gcmVwcmVzZW50YSAqKipjw7Nkb25zIGRlIHBhcmFkYSoqKiwgb3MgY8OzZG9ucyBxdWUgZGl6ZW0gcGFyYSBvIHJpYm9zc29tbyBxdWUgYSB0cmFkdcOnw6NvIGRhcXVlbGEgcHJvdGXDrW5hIHRlcm1pbm91LiAKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpNYXMsIHNlbmRvIG8gQ09JIHVtYSBwcm90ZcOtbmEgw7puaWNhIGUgc2VtIMOtbnRyb25zLCBlc3RlcyAqKipjw7Nkb25zIGRlIHBhcmFkYSoqKiBuw6NvIGRldmVyaWFtIGVzdGFyIHByZXNlbnRlcyBubyBtZWlvIGRlIHN1YSBzZXF1w6puY2lhLiBQYXJhIHRlbnRhcm1vcyBlbnRlbmRlciBtZWxob3IsIHZhbW9zIHVzYXIgdW0gcmVjdXJzbyBleHRlcm5vLgoKIyMjIyBUcmFiYWxoYW5kbyBuYSBpbnRlcm5ldAoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ck11aXRvcyBwcm9ncmFtYXMgZGUgYmlvaW5mb3Jtw6F0aWNhLCBlc3BlY2lhbG1lbnRlIG9zIG1haXMgdXRpbGl6YWRvcywgYXByZXNlbnRhbSB2ZXJzw7VlcyBfb25saW5lXywgZSBzw6NvIGhvc3BlZGFkb3MgZW0gX3NpdGVzXyBvbmRlIHF1YWxxdWVyIHBlc3NvYSBwb2RlIHRlciBhY2Vzc28gYW9zIHNldXMgcmVjdXJzb3MuIEVtIMO6bHRpbWEgYW7DoWxpc2UsIGVzc2VzIHByb2dyYW1hcyBlc3TDo28gcmVhbGl6YW5kbyBhcyBtZXNtYXMgb3BlcmHDp8O1ZXMgcXVlIHF1YW5kbyBzw6NvIHJvZGFkb3Mgbm8gc2V1IHByw7NwcmlvIGNvbXB1dGFkb3IsIG1hcyBuZXNzZSBjYXNvIG8gc2V1IHByb2Nlc3NhbWVudG8gw6kgZmVpdG8gcG9yIHNldmlkb3JlcyByZW1vdG9zIChlbSBvdXRybyBsb2NhbCkuCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKUGFyYSBhIF90cmFkdcOnw6NvIGRlIGFycXVpdm9zIGRlIHNlcXXDqm5jaWFzIGJpb2zDs2dpY2FzXywgdW0gc2VydmnDp28gb25saW5lIG11aXRvIGJvbSBlIG11aXRvIHV0aWxpemFkbyDDqSBvIFtfRXhwYXN5IHRyYW5zbGF0ZSB0b29sX10oaHR0cHM6Ly93ZWIuZXhwYXN5Lm9yZy90cmFuc2xhdGUvKSwgbWFudGlkbyBwZWxvICoqU0JJKiogKF9Td2lzcyBJbnN0aXR1dGUgb2YgQmlvaW5mb3JtYXRpY3NfKS4gVmFtb3MgcmVhbGl6YXIgYSB0cmFkdcOnw6NvIGRhIG5vc3NhIHNlcXXDqm5jaWEgdXRpbGl6YW5kbyBlc3NlIHNlcnZpw6dvLgoKPiBBY2Vzc2UgbyBzaXRlIGRhIGZlcnJhbWVudGEgW0V4cGFzeSB0cmFuc2xhdGUgdG9vbF0oaHR0cHM6Ly93ZWIuZXhwYXN5Lm9yZy90cmFuc2xhdGUvKS4KCj4gQ29sZSBhIHNlcXXDqm5jaWEgZG8gYXJxdWl2byBtdENPSS5mYXN0YSBuYSBjYWl4YSBkZSB0ZXh0byBwYXJhIHRyYWR1w6fDo28sIGNvbSBvdSBzZW0gbyBjYWJlw6dhbGhvICg+KS4KCj4gQWNpb25lIG8gYm90w6NvICoqKlRyYW5zbGF0ZSoqKiwgdXRpbGl6YW5kbyBvcyBwYXLDom1ldHJvcyBfZGVmYXVsdF8uCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKVmVqYSBxdWUgb2J0aXZlbW9zIHVtIHJlc3VsdGFkbyBzZW1lbGhhbnRlLCBwb3LDqW0gbWFpcyBjb21wbGV0by4gQWdvcmEsIHRlbW9zIDYgcG9zc2liaWxpZGFkZXMgZGUgdHJhZHXDp8OjbywgcXVlIGNvcnJlc3BvbmRlbSBhIDMgZmFzZXMgZGUgbGVpdHVyYSAoX09SRnNfIC0gW19PcGVuIFJlYWRpbmcgRnJhbWVzX10oaHR0cHM6Ly9wdC53aWtpcGVkaWEub3JnL3dpa2kvRmFzZV9kZV9sZWl0dXJhX2FiZXJ0YSkpIHBhcmEgY2FkYSB1bWEgZGFzIGR1YXMgZml0YXMsIGEgX2ZpdGEgY29kaWZpY2Fkb3JhXyBlIGEgX2ZpdGEgY29tcGxlbWVudGFyXy4gCgohW19PUkZzIC0gT3BlbiBSZWFkaW5nIEZyYW1lc19dKC9ob21lL2hlcm9uL3ByamN0cy9iaW9pbmZvL21pc2MvT1JGcy5wbmcpXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGVuX3JlYWRpbmdfZnJhbWUpCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKSXNzbyBhY29udGVjZSBwb3JxdcOqIG8gbG9jYWwgZGUgaW7DrWNpbyBkYSB0cmFkdcOnw6NvIHBlbG8gcmlib3Nzb21vIG7Do28gw6kgZXhhdG8sIG1hcyBzaW0gZGVmaW5pZG8gcGVsYSBwcsOzcHJpYSBjb21wb3Npw6fDo28gZGEgc2VxdcOqbmNpYSwgZW0gZnVuw6fDtWVzIGRlIHNpbmFpcyBjb21vIG8gcHJpbWVpcm8gX2PDs2RvbiBkZSBpbmljaWHDp8Ojb18sIHF1ZSB0YW1iw6ltIGNvcnJlc3BvbmRlIMOgIGluY29ycG9yYcOnw6NvIGRvIGFtaW5vIMOhY2lkbyAqKm1ldGlvbmluYSoqIChyZXByZXNlbnRhZG8gcG9yIF9NXywgb3UgX01ldF8pLiBPdSBzZWphLCB0b2RhcyBhcyBwcm90w6lpbmFzIHRlbSBzdWEgc8OtbnRlc2UgaW5pY2lhZGEgcG9yIHVtYSAqKm1ldGlvbmluYSoqIChlbSBldWNhcmlvdG9zIGUgX2FyY2hlYV87IGUgcG9yIGZlbmlsLW1ldGlvbmluYSAoX2ZNZXRfKSBlbSBiYWN0w6lyaWFzLCBtaXRvY8O0bmRyaWFzIGUgcGxhc3TDrWRlb3MpLgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFnb3JhLCB2YW1vcyBlbnRlbmRlciBvcyBub3Nzb3MgcmVzdWx0YWRvcy4gTmEgcMOhZ2luYSBnZXJhZGEgcGVsbyBfRXhwYXN5IHRyYW5zbGF0ZSB0b29sXywgb2JzZXJ2ZSBxdWUgaMOhIHVtIGNhbXBvICoqR2VuZXRpYyBjb2RlKiogcXVlIGVzdMOhIGRlZmluaWRvIGNvbW8gX1N0YW5kYXJkXy4gVmVqYSBhcyBvdXRyYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzLiBWYW1vcyBhdmFsaWFyIG91dHJhcyBwb3NzaXZpbGlkYWRlcy4gTGVtYnJlLXNlIHF1ZTogX28gZ2VuZSBDT0kgw6kgdW0gZ2VuZSBtaXRvY29uZHJpYWxfLgoKPiBBbHRlcmUgbyAqKkdlbmV0aWMgY29kZSoqIGRlIF9TdGFuZGFyZF8gcGFyYSBfVmVydGVicmF0ZSBtaXRvY2hvbmRyaWFsXy4gQWNpb25lIG8gYm90w6NvICoqKlRyYW5zbGF0ZSoqKiBub3ZhbWVudGUuCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKVmVqYSBxdWUgYWdvcmEgdGVtb3MgdW0gcmVzdWx0YWRvIG1haXMgcGVydGluZW50ZSBjb20gYSByZWFsaWRhZGUhIE8gcHJpbWVpcm8gcmVzdWx0YWRvIChjb3JyZXNwb25kZW50ZSDDoCBfZml0YSBjb2RpZmljYWRvcmFfIGVtIHN1YSBfcHJpbWVpcmEgZmFzZSBkZSBsZWl0dXJhXykgYXByZXNlbnRhIHVtYSBwcm90ZcOtbmEgY29tcGxldGEsIGluaWNpYWRhIHBvciB1bWEgbWV0aW9uaW5hLCBlIGZpbmFsaXphZGEgcG9yIHVtIGPDs2RvbiBkZSBwYXJhZGEhCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKT3Ugc2VqYSwgbyBub3NzbyByZXN1bHRhZG8gZXN0YXZhIGVycmFkbyBwb2lzIGVzdMOhdmFtb3MgdXRpbGl6YW5kbyBvIF9jw7NkaWdvIGdlbsOpdGljb18gKG8gX2RpY2lvbsOhcmlvXykgZXJyYWRvISBPcyBub3Nzb3Mgcmlib3Nzb21vcyBlIG9zIHJpYm9zc29tb3MgZGUgbm9zc2FzIG1pdG9jw7RuZHJpYXMgdXRpbGl6YW0gY8OzZGlnb3MgbGlnZWlyYW1lbnRlIGRpZmVyZW50ZXMuCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKRXN0ZSDDqSB1bSBleGVtcGxvIGRlIHF1ZSwgcXVhbmRvIHVtIF9zY3JpcHRfL3Byb2dyYW1hL2PDs2RpZ28gZnVuY2lvbmEsIG7Do28gc2lnbmlmaWNhIHF1ZSBlbGUgZ2Vyb3UgdW0gcmVzdWx0YWRvIGNvcnJldG8sIGJpb2zDs2dpY2FtZW50ZSBwZXJ0aW5pbmV0ZS4gQSBleHBlcnRpc2UgZG8gYmlvaW5mb3JtYXRhIGVzdGEganVzdGFtZW50ZSBlbSBjb21wcmVlbmRlciBvIHF1ZSBvIG8gY29tcHV0YWRvciBleGVjdXRvdSwgYXZhbGlhciBzZSBvIHJlc3VsdGFkbyBmYXogc2VudGlkbyBlLCBjYXNvIG7Do28sIGVudGVuZGVyIG8gcXVlIHByZWNpc2Egc2VyIG1vZGlmaWNhZG8gcGFyYSBvIGZ1bmNpb25hbWVudG8gYWRlcXVhZG8uCgojIyBFeGVyY8OtY2lvcwoKPiBVdGlsaXphbmRvIGEgZmVycmFtZW50YSBfdHJhbnNlcV8sIHJlZmHDp2EgYSB0cmFkdcOnw6NvIGRhIHNlcXXDqm5jaWEgZG8gYXJxdWl2byBtdENPSS5mYXN0YS4gTGVtYnJlLXNlIGRlIGV4cGxvcmFyIGFzIHBvc3NpYmlsaWRhZGVzIGRlIGNvbmZpZ3VyYcOnw6NvIGNvbSBvIGFyZ3VtZW50byBfLS1oZWxwXy4KCj4gVmlzdWFsaXplIG8gYXJxdWl2byBnZXJhZG8gZSBjb25maXJhIHNlIG8gcmVzdWx0YWRvIGVzcGVyYWRvIGZvaSBvYnRpZG8uCgoKKioqCgo+Pj4+IFZvbHRhciBwYXJhIGEgWypww6FnaW5hIGluaWNpYWwqXShodHRwczovL2hlcm9ub2guZ2l0aHViLmlvL2Jpb2luZm8pCgoKCgoKCg==