Relatório Atividade Econômica - Resultado de 2025 e Previsão para 2026

O relatório a seguir tem como objetivo analisar empiricamente o resultado da Atividade Econômica em 2025, bem como as projeções para esse ano de 2026.

Resultado - Atividade Econômica de 2025 em Comparação com 2024

O ano de 2025 foi marcado por uma alta taxa de juros, com a SELIC mantendo-se em 15% ao longo de todo ano, mas também com os estímulos fiscais e de crédito impulsionando o país. Dessa forma, ao se analisar o PIB Mensal e o IBC-Br do último ano em comparação ao de 2024, percebe-se que, apesar dos juros altos e de outros fatores desfavoráveis, houve sim um crescimento no ano de 2025 — 2,5% no IBC-Br e 2,5% no PIB — porém em um ritmo menor se comparado a 2024, tendência que ocorreu tanto com o PIB quanto com o Índice de Atividade Econômica. Apesar disso, em dados mais recentes o IBC-Br recuou 0.2%, evidenciando essa desacelaração da economia, com setores de grande peso na economia como Agropecuária, Serviços e Indústria perdendo a força econômica uma das razões para esse recuo.

O crescimento do PIB, portanto, acompanhou o IBC-Br, repetindo o mesmo padrão de desaceleração em relação a 2024. O PIB mensal, calculado a partir da interpolação dos valores trimestrais distribuídos ao longo dos três meses e tendo como referência séries econômicas como o Volume de Serviços (PMS) e a Arrecadação de Impostos, permite acompanhar esse movimento com maior granularidade. Esse comportamento é explicado, principalmente, pela menor contribuição do setor de Serviços — que tem o maior peso na economia —, somada a reduções no setor Industrial e no componente de Impostos. Apenas a Agropecuária aumentou sua participação, embora seu impacto seja inferior ao do setor de Serviços. No geral, o PIB iniciou o ano com forte crescimento e terminou com estabilidade, reflexo do aperto monetário e da imposição de tarifas no país.

Previsão para o ano de 2026

Para 2026, a projeção do PIB se aproxima de um cenário próximo de 1,7%, de acordo com o Boletim Focus e as maiores casas de análise — abaixo dos 2% projetados para 2025 —, refletindo essa queda controlada da economia. Esse movimento é também um reflexo da sinalização da última reunião do Copom, que indicou um ciclo de cortes de juros ao longo do ano, com a Selic devendo terminar entre 12% e 12,75% — um patamar inferior ao recente, porém ainda muito restritivo. Na prática, isso significa que, embora haja um alívio em relação aos 15% de 2025, o crédito e o consumo das famílias devem continuar operando sob restrição, ainda que em intensidade ligeiramente menor.

Esse cenário doméstico ocorre em meio a uma desaceleração da atividade global. Conforme projeções da OCDE, a economia mundial tem mostrado resiliência diante dos choques comerciais, com crescimento estimado em 3,2% para 2025, impulsionado por políticas macroeconômicas ainda favoráveis. No entanto, os impactos das tarifas implementadas pelos Estados Unidos ainda não se materializaram por completo e tendem a provocar uma desaceleração do crescimento global, que deve recuar para 2,9% em 2026.

Além disso, é importante considerar o componente político do ciclo econômico brasileiro, uma vez que 2026 será um ano de eleições presidenciais. Historicamente, períodos eleitorais costumam gerar maior volatilidade macroeconômica e mudanças de expectativas por parte de agentes econômicos e investidores. Um exemplo relevante ocorreu em 2014, quando o ambiente eleitoral foi acompanhado por deterioração das expectativas fiscais, aumento da incerteza política e redução do investimento privado. Naquele período, a taxa de crescimento do PIB desacelerou significativamente, passando de 3,0% em 2013 para apenas 0,5% em 2014, refletindo um cenário de incerteza econômica e ajuste de expectativas.

Esse padrão histórico sugere que anos eleitorais tendem a intensificar a cautela de empresas e investidores, especialmente em economias emergentes como o Brasil, onde mudanças na condução da política fiscal, monetária e regulatória podem alterar significativamente as perspectivas econômicas. Dessa forma, ainda que a política monetária esteja em trajetória de flexibilização moderada, a proximidade do ciclo eleitoral de 2026 pode contribuir para manter o ambiente de investimentos mais cauteloso, reforçando o cenário de crescimento moderado projetado para o período

Atividade Econômica nos Setores (Agropecuária/Indústria/Serviços)

Ao analisar os diferentes setores da economia, percebe-se o mesmo padrão de crescimento seguido de desaceleração que marcou o IBC-Br e o PIB ao longo do ano. As altas setoriais foram de 13,1% na agropecuária, 1,5% na indústria e 2,1% em serviços.

Apesar da desaceleração, o setor de serviços se manteve aquecido ao longo do período, com uma inflação persistente que impediu um crescimento ainda maior. Os serviços de informação e comunicação avançaram 1,7%, enquanto aqueles prestados às famílias cresceram 1,1%.

O agronegócio permanece sendo um pilar fundamental para a economia do país. Em um contexto de recuperação em culturas estratégicas, a safra de grãos 2024/25 está estimada em 350 milhões de toneladas — um aumento de 16,3% em comparação à safra de 2023/24. O desempenho do setor tem efeito direto sobre o PIB e a balança comercial, com o IBC-Br contribuindo para a elaboração da política monetária ao servir como calibrador da Selic, antecipador de tendências e termômetro do impacto de decisões anteriores.

O setor industrial, por sua vez, pode apresentar desafios em 2026 se tratando de transporte e logística, em razão de estoques elevados decorrentes da demanda enfraquecida e de um câmbio médio especulado em torno de R$ 5,50

Cenário do crédito de consumo na atividade econômica brasileira

Cenário do crédito de consumo na atividade econômica brasileira

A dinâmica do crédito constitui um dos pilares da atividade econômica no Brasil, funcionando como mecanismo relevante de amplificação da demanda doméstica. Ao facilitar o acesso a financiamento para famílias e empresas, o crédito sustenta o consumo, contribui para a expansão da demanda agregada e influencia diretamente o ritmo de crescimento econômico.

No caso das famílias, o crédito afeta diretamente a capacidade de consumo ao permitir a antecipação de gastos futuros. Em períodos de melhora do mercado de trabalho e aumento da renda, a expansão das concessões tende a reforçar o crescimento da demanda doméstica. Em momentos de desaceleração econômica, por outro lado, a retração do crédito costuma intensificar a perda de dinamismo da atividade.

A análise conjunta da massa de rendimento real habitual das famílias e das concessões de crédito com recursos livres para pessoas físicas sugere que, em determinados momentos da economia brasileira, a dinâmica do crédito pode assumir caráter antecedente em relação à evolução da renda agregada. Observa-se que períodos de aceleração nas concessões tendem a preceder movimentos mais intensos de recuperação da massa salarial, indicando que a expansão do financiamento pode atuar como um dos primeiros sinais de melhora da demanda doméstica.

Entre 2017 e 2019, por exemplo, as concessões de crédito às famílias apresentaram trajetória de crescimento consistente, saindo de patamares próximos a R$110 bilhões mensais para níveis superiores a R$150 bilhões, enquanto a massa salarial avançava de forma mais gradual. Esse comportamento sugere que a retomada do consumo ocorreu inicialmente por meio da ampliação do crédito, com a renda reagindo de maneira mais lenta ao longo do processo de recuperação econômica.

Dinâmica semelhante pode ser observada no período posterior ao choque da pandemia. Após a forte contração de 2020, as concessões de crédito às pessoas físicas retomaram trajetória de expansão relativamente rápida, ultrapassando R$200 bilhões mensais em 2021 e alcançando níveis superiores a R$300 bilhões em 2025. A massa salarial real, por sua vez, apresentou recuperação mais gradual, avançando de cerca de R$273 bilhões em 2021 para aproximadamente R$367 bilhões ao final de 2025.

Esse descompasso temporal reforça a hipótese de que o crédito pode atuar como mecanismo de antecipação do consumo, permitindo que famílias ajustem seus gastos antes da consolidação plena do crescimento da renda.

Do ponto de vista econômico, esse comportamento pode ser explicado pela maior sensibilidade das concessões às condições financeiras e às expectativas. Alterações na percepção de risco, na liquidez do sistema financeiro ou nas expectativas em relação à política monetária tendem a impactar rapidamente a oferta e a demanda por crédito, enquanto a evolução do mercado de trabalho e da renda ocorre de forma mais gradual.

Assim, a expansão do crédito não apenas reflete a atividade econômica corrente, mas também pode sinalizar mudanças futuras no ritmo da demanda doméstica.

Os dados utilizados nesta análise são provenientes do Banco Central do Brasil, por meio das séries de concessões de crédito do Sistema Financeiro Nacional, e da Instituto Brasileiro de Geografia e Estatística, a partir da PNAD Contínua, que fornece as informações sobre massa de rendimento real habitual das famílias.

Dessa forma, os dados recentes sugerem que as concessões às famílias desempenham papel relevante como indicador antecedente da dinâmica econômica brasileira. Ao ampliar a capacidade de consumo em momentos de melhora das condições financeiras, o crédito atua como vetor de propagação da atividade, reforçando movimentos de expansão e contribuindo para a evolução da massa salarial ao longo do tempo.

Análise do Mercado de Trabalho

A dinâmica do mercado de trabalho tem desempenhado papel central na trajetória recente da atividade econômica brasileira. A evolução da taxa de desocupação, da população na força de trabalho e da massa salarial real revela não apenas os efeitos das oscilações econômicas enfrentadas pelo país na última década, mas também os fundamentos que sustentam o momento atual da economia.

Entre 2015 e 2017, a economia brasileira enfrentou forte contração, refletida na deterioração abrupta do mercado de trabalho. A taxa de desocupação avançou de aproximadamente 6,5% para patamar próximo de 14%, configurando uma duplicação do desemprego em curto intervalo de tempo. Esse movimento foi acompanhado por enfraquecimento da renda agregada e retração do consumo das famílias.

Ainda que a população na força de trabalho tenha mantido tendência estrutural de crescimento, o choque recessivo se traduziu em incapacidade de absorção dessa mão de obra, ampliando a ociosidade da economia e reduzindo o dinamismo da demanda doméstica.

Nos anos subsequentes, observou-se estabilização do desemprego, porém ainda em níveis elevados, superiores a 11%. A recuperação econômica mostrou-se moderada e insuficiente para promover reabsorção rápida da mão de obra desempregada. A massa salarial apresentou crescimento limitado, restringindo a capacidade de aceleração do consumo.

Nos últimos anos, entretanto, o mercado de trabalho apresentou melhora significativa. A taxa de desocupação recuou de forma consistente e encerrou o ano em aproximadamente 5,1%, nível historicamente baixo para os padrões da economia brasileira.

Esse movimento elevou a renda disponível das famílias e fortaleceu o consumo doméstico, principal componente do PIB brasileiro. O mercado de trabalho deixou de atuar como restrição ao crescimento e passou a funcionar como mecanismo de propagação da atividade econômica.

Contudo, a economia opera atualmente com grau relativamente reduzido de ociosidade. Além do baixo nível de desemprego, indicadores de utilização da capacidade instalada da indústria apontam para níveis próximos da média histórica, segundo dados da Confederação Nacional da Indústria. A taxa de utilização da capacidade instalada tem oscilado em torno de 78% a 80%, indicando redução da ociosidade produtiva. Esse cenário implica: maior pressão potencial sobre salários, redução da margem de crescimento via absorção adicional de trabalhadores, maior dependência de ganhos de produtividade e investimento para sustentar a expansão futura Nesse contexto, a continuidade do crescimento econômico tende a exigir uma transição para um modelo mais intensivo em produtividade, investimento e eficiência alocativa.

Renda e Consumo das Famílias

Renda e Consumo das Famílias

Acerca do consumo e da renda das famílias, apesar de um cenário de juros elevados, o consumo doméstico manteve-se relativamente resiliente ao longo do período, sustentado principalmente por um mercado de trabalho aquecido e por ganhos reais de renda.

Dados recentes indicam que a taxa de desemprego no Brasil encerrou o ano em aproximadamente 5,1%, segundo o Instituto Brasileiro de Geografia e Estatística, enquanto a massa de rendimento real habitual do trabalho apresentou crescimento consistente, refletindo tanto a expansão do emprego quanto a recuperação do poder de compra da população.

Esse avanço da renda real tende a sustentar o consumo das famílias mesmo em um ambiente de crédito mais restritivo, uma vez que parcela relevante do consumo doméstico está associada à renda corrente.

Outro fator relevante foi o arrefecimento da inflação de alimentos, que contribuiu para reduzir pressões sobre o orçamento das famílias. A combinação de condições climáticas mais favoráveis para a produção agrícola, juntamente com um câmbio relativamente estável, ajudou a conter o custo de itens alimentícios ao longo do ano, liberando parcela maior da renda disponível para outros tipos de consumo.

Esse movimento teve impacto direto sobre indicadores de atividade ligados ao consumo, especialmente no varejo ampliado.

Como reflexo desses fatores, indicadores de consumo mostraram desempenho positivo no final do ano. Em dezembro, o consumo avançou 15,69%, registrando crescimento expressivo em comparação ao mesmo período de 2024, reforçando a ideia de que a combinação entre expansão do emprego, recuperação da renda real e desaceleração inflacionária contribuiu para sustentar a demanda doméstica mesmo em um ambiente de política monetária ainda restritiva.

Contudo, é importante considerar que 2026 será um ano eleitoral, o que historicamente tende a elevar o grau de incerteza econômica no Brasil. Episódios passados ilustram esse padrão.

Em 2014, por exemplo, o processo eleitoral foi acompanhado por deterioração das expectativas fiscais e aumento da volatilidade nos mercados financeiros, contribuindo para a desaceleração da atividade econômica. O PIB cresceu apenas 0,5% naquele ano, após expansão de 3,0% em 2013.

De forma semelhante, em 2018, o período eleitoral também foi marcado por elevada incerteza política e volatilidade cambial, levando empresas e investidores a adotar postura mais cautelosa em relação a investimentos e decisões de consumo de maior valor.

Esse comportamento ocorre porque anos eleitorais aumentam a incerteza sobre a condução futura da política econômica, especialmente em relação à política fiscal, reformas estruturais e diretrizes regulatórias.

Dessa forma, embora os fundamentos do mercado de trabalho e da renda ainda contribuam para sustentar o consumo das famílias, a proximidade do processo eleitoral de 2026 pode introduzir um grau adicional de cautela no comportamento de consumidores e investidores, reforçando a expectativa de crescimento econômico mais moderado ao longo do período.

REFERÊNCIAS

INFOMONEY. PIB 2026: o ano em que a economia não desaba, mas também não decola. São Paulo: InfoMoney, 2026. Disponível em: https://www.infomoney.com.br/economia/pib-2026-o-ano-em-que-a-economia-nao-desaba-mas-tambem-nao-decola/ . Acesso em: 05 mar. 2026.

INFOMONEY. Serviços: setor recua em dezembro de 2025, aponta IBGE, com impacto de juros elevados. São Paulo: InfoMoney, 2026. Disponível em: https://www.infomoney.com.br/economia/servicos-ibge-dezembro-2025-queda-juros/ . Acesso em: 05 mar. 2026.

EMPRESA BRASIL DE COMUNICAÇÃO. Prévia do PIB aponta crescimento de 2,5% da economia brasileira em 2025. Brasília, DF: Agência Brasil, 2026. Disponível em: https://agenciabrasil.ebc.com.br/economia/noticia/2026-02/previa-do-pib-aponta-crescimento-de-25-da-economia-brasileira-em-2025 . Acesso em: 05 mar. 2026.

FUNDAÇÃO GETULIO VARGAS. Economia cresceu 2,2% em 2025, segundo o Monitor do PIB-FGV. Rio de Janeiro: FGV IBRE, 2026. Disponível em: https://portalibre.fgv.br/noticias/economia-cresceu-22-em-2025-segundo-o-monitor-do-pib-fgv . Acesso em: 05 mar. 2026.

XP INVESTIMENTOS. Brasil Macro Mensal: crescimento mais forte e inflação mais baixa. São Paulo: XP Investimentos, 2026. Disponível em: https://conteudos.xpi.com.br/economia/brasil-macro-mensal-crescimento-mais-forte-inflacao-mais-baixa/ . Acesso em: 05 mar. 2026.

EDITORA ABRIL. Atividade econômica brasileira cresce 2,5% em 2025. São Paulo: Você S/A, 2026. Disponível em: https://vocesa.abril.com.br/economia/atividade-economica-brasileira-cresce-25-em-2025/ . Acesso em: 05 mar. 2026.

BANCO CENTRAL DO BRASIL. Índice de Atividade Econômica do Banco Central (IBC-Br). Brasília, DF: BCB, 2026. Disponível em: https://www.bcb.gov.br/estatisticas/ibc-br . Acesso em: 05 mar. 2026

INSTITUTO BRASILEIRO DE GEOGRAFIA E ESTATÍSTICA. Indicadores econômicos e sociais. Rio de Janeiro: IBGE, 2026. Disponível em: https://www.ibge.gov.br/indicadores . Acesso em: 05 mar. 2026.

LS0tDQp0aXRsZTogIlJlbGF0w7NyaW8gQXRpdmlkYWRlIEVjb27DtG1pY2EiDQphdXRob3I6ICJKb8OjbyBQZWRybyBHb2RpbmhvIGUgTHVpeiBSZXplbmRlIg0KZGF0ZTogIjIwMjYtMDItMTIiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdGhlbWU6IGx1bWVuDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSkNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoaGlnaGNoYXJ0ZXIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoc2lkcmFyKQ0KbGlicmFyeShpcGVhZGF0YXIpDQpsaWJyYXJ5KHF1YW50bW9kKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkocmJjYikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh3cml0ZXhsKQ0KbGlicmFyeShodHRyKQ0KbGlicmFyeSh0aWR5cikNCmBgYA0KDQojIyAqKlJlbGF0w7NyaW8gQXRpdmlkYWRlIEVjb27DtG1pY2EgLSBSZXN1bHRhZG8gZGUgMjAyNSBlIFByZXZpc8OjbyBwYXJhIDIwMjYqKg0KDQpPIHJlbGF0w7NyaW8gYSBzZWd1aXIgdGVtIGNvbW8gb2JqZXRpdm8gYW5hbGlzYXIgZW1waXJpY2FtZW50ZSBvIHJlc3VsdGFkbyBkYSBBdGl2aWRhZGUgRWNvbsO0bWljYSBlbSAyMDI1LCBiZW0gY29tbyBhcyBwcm9qZcOnw7VlcyBwYXJhIGVzc2UgYW5vIGRlIDIwMjYuDQoNCiMjICpSZXN1bHRhZG8gLSBBdGl2aWRhZGUgRWNvbsO0bWljYSBkZSAyMDI1IGVtIENvbXBhcmHDp8OjbyBjb20gMjAyNCoNCg0KTyBhbm8gZGUgMjAyNSBmb2kgbWFyY2FkbyBwb3IgdW1hIGFsdGEgdGF4YSBkZSBqdXJvcywgY29tIGEgU0VMSUMgbWFudGVuZG8tc2UgZW0gMTUlIGFvIGxvbmdvIGRlIHRvZG8gYW5vLCBtYXMgdGFtYsOpbSBjb20gb3MgZXN0w61tdWxvcyBmaXNjYWlzIGUgZGUgY3LDqWRpdG8gaW1wdWxzaW9uYW5kbyBvIHBhw61zLiBEZXNzYSBmb3JtYSwgYW8gc2UgYW5hbGlzYXIgbyBQSUIgTWVuc2FsIGUgbyBJQkMtQnIgZG8gw7psdGltbyBhbm8gZW0gY29tcGFyYcOnw6NvIGFvIGRlIDIwMjQsIHBlcmNlYmUtc2UgcXVlLCBhcGVzYXIgZG9zIGp1cm9zIGFsdG9zIGUgZGUgb3V0cm9zIGZhdG9yZXMgZGVzZmF2b3LDoXZlaXMsIGhvdXZlIHNpbSB1bSBjcmVzY2ltZW50byBubyBhbm8gZGUgMjAyNSDigJQgMiw1JSBubyBJQkMtQnIgZSAyLDUlIG5vIFBJQiDigJQgcG9yw6ltIGVtIHVtIHJpdG1vIG1lbm9yIHNlIGNvbXBhcmFkbyBhIDIwMjQsIHRlbmTDqm5jaWEgcXVlIG9jb3JyZXUgdGFudG8gY29tIG8gUElCIHF1YW50byBjb20gbyDDjW5kaWNlIGRlIEF0aXZpZGFkZSBFY29uw7RtaWNhLiBBcGVzYXIgZGlzc28sIGVtIGRhZG9zIG1haXMgcmVjZW50ZXMgbyBJQkMtQnIgcmVjdW91IDAuMiUsIGV2aWRlbmNpYW5kbyBlc3NhIGRlc2FjZWxhcmHDp8OjbyBkYSBlY29ub21pYSwgY29tIHNldG9yZXMgZGUgZ3JhbmRlIHBlc28gbmEgZWNvbm9taWEgY29tbyBBZ3JvcGVjdcOhcmlhLCBTZXJ2acOnb3MgZSBJbmTDunN0cmlhIHBlcmRlbmRvIGEgZm9yw6dhIGVjb27DtG1pY2EgdW1hIGRhcyByYXrDtWVzIHBhcmEgZXNzZQ0KcmVjdW8uDQoNCk8gY3Jlc2NpbWVudG8gZG8gUElCLCBwb3J0YW50bywgYWNvbXBhbmhvdSBvIElCQy1CciwgcmVwZXRpbmRvIG8gbWVzbW8gcGFkcsOjbyBkZSBkZXNhY2VsZXJhw6fDo28gZW0gcmVsYcOnw6NvIGEgMjAyNC4gTyBQSUIgbWVuc2FsLCBjYWxjdWxhZG8gYSBwYXJ0aXIgZGEgaW50ZXJwb2xhw6fDo28gZG9zIHZhbG9yZXMgdHJpbWVzdHJhaXMgZGlzdHJpYnXDrWRvcyBhbyBsb25nbyBkb3MgdHLDqnMgbWVzZXMgZSB0ZW5kbyBjb21vIHJlZmVyw6puY2lhIHPDqXJpZXMgZWNvbsO0bWljYXMgY29tbyBvIFZvbHVtZSBkZSBTZXJ2acOnb3MgKFBNUykgZSBhIEFycmVjYWRhw6fDo28gZGUgSW1wb3N0b3MsIHBlcm1pdGUgYWNvbXBhbmhhciBlc3NlIG1vdmltZW50byBjb20gbWFpb3IgZ3JhbnVsYXJpZGFkZS4gRXNzZSBjb21wb3J0YW1lbnRvIMOpIGV4cGxpY2FkbywgcHJpbmNpcGFsbWVudGUsIHBlbGEgbWVub3IgY29udHJpYnVpw6fDo28gZG8gc2V0b3IgZGUgU2VydmnDp29zIOKAlCBxdWUgdGVtIG8gbWFpb3IgcGVzbyBuYSBlY29ub21pYSDigJQsIHNvbWFkYSBhIHJlZHXDp8O1ZXMgbm8gc2V0b3IgSW5kdXN0cmlhbCBlIG5vIGNvbXBvbmVudGUgZGUgSW1wb3N0b3MuIEFwZW5hcyBhIEFncm9wZWN1w6FyaWEgYXVtZW50b3Ugc3VhIHBhcnRpY2lwYcOnw6NvLCBlbWJvcmEgc2V1IGltcGFjdG8gc2VqYSBpbmZlcmlvciBhbyBkbyBzZXRvciBkZSBTZXJ2acOnb3MuIE5vIGdlcmFsLCBvIFBJQiBpbmljaW91IG8gYW5vIGNvbSBmb3J0ZSBjcmVzY2ltZW50byBlIHRlcm1pbm91IGNvbSBlc3RhYmlsaWRhZGUsIHJlZmxleG8gZG8gYXBlcnRvIG1vbmV0w6FyaW8gZSBkYSBpbXBvc2nDp8OjbyBkZSB0YXJpZmFzIG5vIHBhw61zLg0KDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQoNCiMgQ29sZXRhciBkYWRvcyBkbyBQSUIgbWVuc2FsIChjw7NkaWdvIDQzODApIC0gZW0gUiQgbWlsaMO1ZXMNCmRhZG9zX3BpYiA8LSBnZXRfc2VyaWVzKDQzODAsIHN0YXJ0X2RhdGUgPSAiMjAyNC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMjYtMDItMjgiKSAlPiUgDQogIHJlbmFtZShQSUJfbWVuc2FsID0gYDQzODBgKQ0KDQojIENvbGV0YXIgZGFkb3MgZG8gSUJDLUJyIGNvbSBhanVzdGUgc2F6b25hbCAoY8OzZGlnbyAyNDM2NCkNCmRhZG9zX2liY2JyIDwtIGdldF9zZXJpZXMoMjQzNjQsIHN0YXJ0X2RhdGUgPSAiMjAyNC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMjYtMDItMjgiKSAlPiUgDQogIHJlbmFtZShJQkNCciA9IGAyNDM2NGApDQoNCiMgUHJlcGFyYXIgZGFkb3MgZG8gUElCIChjb252ZXJ0ZXIgcGFyYSB0cmlsaMO1ZXMpDQpkYWRvc19waWJfbWVuc2FsIDwtIGRhZG9zX3BpYiAlPiUNCiAgbXV0YXRlKA0KICAgIGFubyA9IHllYXIoZGF0ZSksDQogICAgbWVzID0gbW9udGgoZGF0ZSwgbGFiZWwgPSBUUlVFLCBhYmJyID0gRkFMU0UpLA0KICAgIHRpbWVzdGFtcCA9IGRhdGV0aW1lX3RvX3RpbWVzdGFtcChkYXRlKSwNCiAgICAjIENPUlJFw4fDg086IG1pbGjDtWVzIHBhcmEgdHJpbGjDtWVzID0gZGl2aWRpciBwb3IgMS4wMDAuMDAwIChuw6NvIDEwMC4wMDApDQogICAgUElCX3RyaWxob2VzID0gcm91bmQoUElCX21lbnNhbCAvIDEwMDAwMCwgMikNCiAgKSAlPiUNCiAgc2VsZWN0KGRhdGUsIHRpbWVzdGFtcCwgUElCX3RyaWxob2VzKQ0KDQojIFByZXBhcmFyIGRhZG9zIGRvIElCQy1Ccg0KZGFkb3NfaWJjYnJfbWVuc2FsIDwtIGRhZG9zX2liY2JyICU+JQ0KICBtdXRhdGUoDQogICAgdGltZXN0YW1wID0gZGF0ZXRpbWVfdG9fdGltZXN0YW1wKGRhdGUpLA0KICAgIElCQ0JyX2FycmVkb25kYWRvID0gcm91bmQoSUJDQnIsIDEpDQogICkgJT4lDQogIHNlbGVjdChkYXRlLCB0aW1lc3RhbXAsIElCQ0JyX2FycmVkb25kYWRvKQ0KDQojIENvbWJpbmFyIGRhZG9zDQpkYWRvc19jb21iaW5hZG9zIDwtIGRhZG9zX3BpYl9tZW5zYWwgJT4lDQogIGxlZnRfam9pbihkYWRvc19pYmNicl9tZW5zYWwsIGJ5ID0gYygiZGF0ZSIsICJ0aW1lc3RhbXAiKSkgJT4lDQogIGFycmFuZ2UoZGF0ZSkNCg0KIyBWZXJpZmljYXIgZGFkb3MNCmlmKG5yb3coZGFkb3NfY29tYmluYWRvcykgPT0gMCkgew0KICBzdG9wKCJEYWRvcyBuw6NvIGVuY29udHJhZG9zLiBWZXJpZmlxdWUgb3MgY8OzZGlnb3MuIikNCn0NCg0KIyBDYWxjdWxhciBsaW1pdGVzIHBhcmEgZWl4b3MNCnBpYl9taW4gPC0gbWluKGRhZG9zX2NvbWJpbmFkb3MkUElCX3RyaWxob2VzLCBuYS5ybSA9IFRSVUUpDQpwaWJfbWF4IDwtIG1heChkYWRvc19jb21iaW5hZG9zJFBJQl90cmlsaG9lcywgbmEucm0gPSBUUlVFKQ0KaWJjX21pbiA8LSBtaW4oZGFkb3NfY29tYmluYWRvcyRJQkNCcl9hcnJlZG9uZGFkbywgbmEucm0gPSBUUlVFKQ0KaWJjX21heCA8LSBtYXgoZGFkb3NfY29tYmluYWRvcyRJQkNCcl9hcnJlZG9uZGFkbywgbmEucm0gPSBUUlVFKQ0KDQojIE1hcmdlbSBkZSA1JQ0KcGliX3JhbmdlIDwtIHBpYl9tYXggLSBwaWJfbWluDQppYmNfcmFuZ2UgPC0gaWJjX21heCAtIGliY19taW4NCg0KIyBDcmlhciBncsOhZmljbyBjb21iaW5hZG8NCmhpZ2hjaGFydCh0eXBlID0gInN0b2NrIikgJT4lDQogICMgU8OpcmllIDE6IFBJQiAoY29sdW5hcykgLSBlaXhvIGVzcXVlcmRvDQogIGhjX2FkZF9zZXJpZXMoDQogICAgZGF0YSA9IGxpc3RfcGFyc2UyKGRhZG9zX2NvbWJpbmFkb3MgJT4lIHNlbGVjdCh0aW1lc3RhbXAsIFBJQl90cmlsaG9lcykpLA0KICAgIHR5cGUgPSAiY29sdW1uIiwNCiAgICBuYW1lID0gIlBJQiBNZW5zYWwgKFIkIHRyaWxow7VlcykiLA0KICAgIGNvbG9yID0gIiMwMjAyM2MiLA0KICAgIHlBeGlzID0gMCwNCiAgICB0b29sdGlwID0gbGlzdCh2YWx1ZURlY2ltYWxzID0gMiwgdmFsdWVTdWZmaXggPSAiIHRyaWxow7VlcyIpDQogICkgJT4lDQogICMgU8OpcmllIDI6IElCQy1CciAobGluaGEpIC0gZWl4byBkaXJlaXRvDQogIGhjX2FkZF9zZXJpZXMoDQogICAgZGF0YSA9IGxpc3RfcGFyc2UyKGRhZG9zX2NvbWJpbmFkb3MgJT4lIHNlbGVjdCh0aW1lc3RhbXAsIElCQ0JyX2FycmVkb25kYWRvKSksDQogICAgdHlwZSA9ICJsaW5lIiwNCiAgICBuYW1lID0gIklCQy1CciAow61uZGljZSkiLA0KICAgIGNvbG9yID0gIiNmZWI3MTIiLA0KICAgIGxpbmVXaWR0aCA9IDMsDQogICAgbWFya2VyID0gbGlzdChlbmFibGVkID0gVFJVRSwgcmFkaXVzID0gNCksDQogICAgeUF4aXMgPSAxLA0KICAgIHRvb2x0aXAgPSBsaXN0KHZhbHVlRGVjaW1hbHMgPSAxKQ0KICApICU+JQ0KICAjIENvbmZpZ3VyYXIgZWl4b3MgWSBkdWFpcw0KICBoY195QXhpc19tdWx0aXBsZXMoDQogICAgbGlzdCgNCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIlBJQiAoUiQgdHJpbGjDtWVzKSIpLA0KICAgICAgb3Bwb3NpdGUgPSBGQUxTRSwNCiAgICAgIGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gInt2YWx1ZX0gdHJpIiksDQogICAgICBtaW4gPSBmbG9vcihwaWJfbWluIC0gMC4wNSAqIHBpYl9yYW5nZSksDQogICAgICBtYXggPSBjZWlsaW5nKHBpYl9tYXggKyAwLjA1ICogcGliX3JhbmdlKQ0KICAgICksDQogICAgbGlzdCgNCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIklCQy1CciAow61uZGljZSAtIGJhc2UgMjAyMj0xMDApIiksDQogICAgICBvcHBvc2l0ZSA9IFRSVUUsDQogICAgICBsYWJlbHMgPSBsaXN0KGZvcm1hdCA9ICJ7dmFsdWV9IiksDQogICAgICBtaW4gPSBmbG9vcihpYmNfbWluIC0gMC4wNSAqIGliY19yYW5nZSksDQogICAgICBtYXggPSBjZWlsaW5nKGliY19tYXggKyAwLjA1ICogaWJjX3JhbmdlKQ0KICAgICkNCiAgKSAlPiUNCiAgaGNfeEF4aXMoDQogICAgdHlwZSA9ICdkYXRldGltZScsDQogICAgbGFiZWxzID0gbGlzdChmb3JtYXQgPSAne3ZhbHVlOiViICVZfScpDQogICkgJT4lDQogIGhjX3RpdGxlKHRleHQgPSAiUElCIHZzLiBJQkMtQnI6IEF0aXZpZGFkZSBFY29uw7RtaWNhIEJyYXNpbGVpcmEiKSAlPiUNCiAgaGNfc3VidGl0bGUodGV4dCA9ICJDb21wYXJhw6fDo28gZW50cmUgUElCIE1lbnNhbCAoUiQgdHJpbGjDtWVzKSBlIElCQy1CciAow61uZGljZSkgLSAyMDI0IGEgMjAyNiIpICU+JQ0KICBoY19jcmVkaXRzKA0KICAgIGVuYWJsZWQgPSBUUlVFLCANCiAgICB0ZXh0ID0gIkZvbnRlOiBCYW5jbyBDZW50cmFsIGRvIEJyYXNpbCAoU0dTIC0gQ8OzZGlnb3M6IDQzODAgZSAyNDM2NCkiDQogICkgJT4lDQogIGhjX3JhbmdlU2VsZWN0b3IoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgYnV0dG9ucyA9IGxpc3QoDQogICAgICBsaXN0KHR5cGUgPSAnbW9udGgnLCBjb3VudCA9IDMsIHRleHQgPSAnM00nKSwNCiAgICAgIGxpc3QodHlwZSA9ICdtb250aCcsIGNvdW50ID0gNiwgdGV4dCA9ICc2TScpLA0KICAgICAgbGlzdCh0eXBlID0gJ3llYXInLCBjb3VudCA9IDEsIHRleHQgPSAnMVknKSwNCiAgICAgIGxpc3QodHlwZSA9ICdhbGwnLCB0ZXh0ID0gJ1RvZG8gcGVyw61vZG8nKQ0KICAgICksDQogICAgc2VsZWN0ZWQgPSAyDQogICkgJT4lDQogIGhjX3Rvb2x0aXAoDQogICAgc2hhcmVkID0gVFJVRSwNCiAgICBoZWFkZXJGb3JtYXQgPSAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJweCI+PGI+e3BvaW50LmtleX08L2I+PC9zcGFuPjxici8+JywNCiAgICBwb2ludEZvcm1hdCA9ICc8c3BhbiBzdHlsZT0iY29sb3I6e3Nlcmllcy5jb2xvcn0iPuKXjzwvc3Bhbj4ge3Nlcmllcy5uYW1lfTogPGI+e3BvaW50Lnk6LjFmfXtzZXJpZXMudG9vbHRpcE9wdGlvbnMudmFsdWVTdWZmaXh9PC9iPjxici8+Jw0KICApICU+JQ0KICBoY19sZWdlbmQoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgYWxpZ24gPSAiY2VudGVyIiwNCiAgICB2ZXJ0aWNhbEFsaWduID0gImJvdHRvbSIsDQogICAgbGF5b3V0ID0gImhvcml6b250YWwiDQogICkgJT4lDQogIGhjX3Bsb3RPcHRpb25zKA0KICAgIGNvbHVtbiA9IGxpc3QoDQogICAgICBwb2ludFBhZGRpbmcgPSAwLjEsDQogICAgICBncm91cFBhZGRpbmcgPSAwLjA1LA0KICAgICAgYm9yZGVyV2lkdGggPSAwLjUNCiAgICApLA0KICAgIGxpbmUgPSBsaXN0KA0KICAgICAgYW5pbWF0aW9uID0gVFJVRSwNCiAgICAgIGNvbm5lY3ROdWxscyA9IFRSVUUNCiAgICApDQogICkNCmBgYA0KDQojIyAqUHJldmlzw6NvIHBhcmEgbyBhbm8gZGUgMjAyNioNCg0KUGFyYSAyMDI2LCBhIHByb2plw6fDo28gZG8gUElCIHNlIGFwcm94aW1hIGRlIHVtIGNlbsOhcmlvIHByw7N4aW1vIGRlIDEsNyUsIGRlIGFjb3JkbyBjb20gbyBCb2xldGltIEZvY3VzIGUgYXMgbWFpb3JlcyBjYXNhcyBkZSBhbsOhbGlzZSDigJQgYWJhaXhvIGRvcyAyJSBwcm9qZXRhZG9zIHBhcmEgMjAyNSDigJQsIHJlZmxldGluZG8gZXNzYSBxdWVkYSBjb250cm9sYWRhIGRhIGVjb25vbWlhLiBFc3NlIG1vdmltZW50byDDqSB0YW1iw6ltIHVtIHJlZmxleG8gZGEgc2luYWxpemHDp8OjbyBkYSDDumx0aW1hIHJldW5pw6NvIGRvIENvcG9tLCBxdWUgaW5kaWNvdSB1bSBjaWNsbyBkZSBjb3J0ZXMgZGUganVyb3MgYW8gbG9uZ28gZG8gYW5vLCBjb20gYSBTZWxpYyBkZXZlbmRvIHRlcm1pbmFyIGVudHJlIDEyJSBlIDEyLDc1JSDigJQgdW0gcGF0YW1hciBpbmZlcmlvciBhbyByZWNlbnRlLCBwb3LDqW0gYWluZGEgbXVpdG8gcmVzdHJpdGl2by4gTmEgcHLDoXRpY2EsIGlzc28gc2lnbmlmaWNhIHF1ZSwgZW1ib3JhIGhhamEgdW0gYWzDrXZpbyBlbSByZWxhw6fDo28gYW9zIDE1JSBkZSAyMDI1LCBvIGNyw6lkaXRvIGUgbyBjb25zdW1vIGRhcyBmYW3DrWxpYXMgZGV2ZW0gY29udGludWFyIG9wZXJhbmRvIHNvYiByZXN0cmnDp8OjbywgYWluZGEgcXVlIGVtIGludGVuc2lkYWRlIGxpZ2VpcmFtZW50ZSBtZW5vci4NCg0KRXNzZSBjZW7DoXJpbyBkb23DqXN0aWNvIG9jb3JyZSBlbSBtZWlvIGEgdW1hIGRlc2FjZWxlcmHDp8OjbyBkYSBhdGl2aWRhZGUgZ2xvYmFsLiBDb25mb3JtZSBwcm9qZcOnw7VlcyBkYSBPQ0RFLCBhIGVjb25vbWlhIG11bmRpYWwgdGVtIG1vc3RyYWRvIHJlc2lsacOqbmNpYSBkaWFudGUgZG9zIGNob3F1ZXMgY29tZXJjaWFpcywgY29tIGNyZXNjaW1lbnRvIGVzdGltYWRvIGVtIDMsMiUgcGFyYSAyMDI1LCBpbXB1bHNpb25hZG8gcG9yIHBvbMOtdGljYXMgbWFjcm9lY29uw7RtaWNhcyBhaW5kYSBmYXZvcsOhdmVpcy4gTm8gZW50YW50bywgb3MgaW1wYWN0b3MgZGFzIHRhcmlmYXMgaW1wbGVtZW50YWRhcyBwZWxvcyBFc3RhZG9zIFVuaWRvcyBhaW5kYSBuw6NvIHNlIG1hdGVyaWFsaXphcmFtIHBvciBjb21wbGV0byBlIHRlbmRlbSBhIHByb3ZvY2FyIHVtYSBkZXNhY2VsZXJhw6fDo28gZG8gY3Jlc2NpbWVudG8gZ2xvYmFsLCBxdWUgZGV2ZSByZWN1YXIgcGFyYSAyLDklIGVtIDIwMjYuDQoNCkFsw6ltIGRpc3NvLCDDqSBpbXBvcnRhbnRlIGNvbnNpZGVyYXIgbyBjb21wb25lbnRlIHBvbMOtdGljbyBkbyBjaWNsbyBlY29uw7RtaWNvIGJyYXNpbGVpcm8sIHVtYSB2ZXogcXVlIDIwMjYgc2Vyw6EgdW0gYW5vIGRlIGVsZWnDp8O1ZXMgcHJlc2lkZW5jaWFpcy4gSGlzdG9yaWNhbWVudGUsIHBlcsOtb2RvcyBlbGVpdG9yYWlzIGNvc3R1bWFtIGdlcmFyIG1haW9yIHZvbGF0aWxpZGFkZSBtYWNyb2Vjb27DtG1pY2EgZSBtdWRhbsOnYXMgZGUgZXhwZWN0YXRpdmFzIHBvciBwYXJ0ZSBkZSBhZ2VudGVzIGVjb27DtG1pY29zIGUgaW52ZXN0aWRvcmVzLiBVbSBleGVtcGxvIHJlbGV2YW50ZSBvY29ycmV1IGVtIDIwMTQsIHF1YW5kbyBvIGFtYmllbnRlIGVsZWl0b3JhbCBmb2kgYWNvbXBhbmhhZG8gcG9yIGRldGVyaW9yYcOnw6NvIGRhcyBleHBlY3RhdGl2YXMgZmlzY2FpcywgYXVtZW50byBkYSBpbmNlcnRlemEgcG9sw610aWNhIGUgcmVkdcOnw6NvIGRvIGludmVzdGltZW50byBwcml2YWRvLiBOYXF1ZWxlIHBlcsOtb2RvLCBhIHRheGEgZGUgY3Jlc2NpbWVudG8gZG8gUElCIGRlc2FjZWxlcm91IHNpZ25pZmljYXRpdmFtZW50ZSwgcGFzc2FuZG8gZGUgMywwJSBlbSAyMDEzIHBhcmEgYXBlbmFzIDAsNSUgZW0gMjAxNCwgcmVmbGV0aW5kbyB1bSBjZW7DoXJpbyBkZSBpbmNlcnRlemEgZWNvbsO0bWljYSBlIGFqdXN0ZSBkZSBleHBlY3RhdGl2YXMuDQoNCkVzc2UgcGFkcsOjbyBoaXN0w7NyaWNvIHN1Z2VyZSBxdWUgYW5vcyBlbGVpdG9yYWlzIHRlbmRlbSBhIGludGVuc2lmaWNhciBhIGNhdXRlbGEgZGUgZW1wcmVzYXMgZSBpbnZlc3RpZG9yZXMsIGVzcGVjaWFsbWVudGUgZW0gZWNvbm9taWFzIGVtZXJnZW50ZXMgY29tbyBvIEJyYXNpbCwgb25kZSBtdWRhbsOnYXMgbmEgY29uZHXDp8OjbyBkYSBwb2zDrXRpY2EgZmlzY2FsLCBtb25ldMOhcmlhIGUgcmVndWxhdMOzcmlhIHBvZGVtIGFsdGVyYXIgc2lnbmlmaWNhdGl2YW1lbnRlIGFzIHBlcnNwZWN0aXZhcyBlY29uw7RtaWNhcy4gRGVzc2EgZm9ybWEsIGFpbmRhIHF1ZSBhIHBvbMOtdGljYSBtb25ldMOhcmlhIGVzdGVqYSBlbSB0cmFqZXTDs3JpYSBkZSBmbGV4aWJpbGl6YcOnw6NvIG1vZGVyYWRhLCBhIHByb3hpbWlkYWRlIGRvIGNpY2xvIGVsZWl0b3JhbCBkZSAyMDI2IHBvZGUgY29udHJpYnVpciBwYXJhIG1hbnRlciBvIGFtYmllbnRlIGRlIGludmVzdGltZW50b3MgbWFpcyBjYXV0ZWxvc28sIHJlZm9yw6dhbmRvIG8gY2Vuw6FyaW8gZGUgY3Jlc2NpbWVudG8gbW9kZXJhZG8gcHJvamV0YWRvIHBhcmEgbyBwZXLDrW9kbw0KDQojIyAqQXRpdmlkYWRlIEVjb27DtG1pY2Egbm9zIFNldG9yZXMgKEFncm9wZWN1w6FyaWEvSW5kw7pzdHJpYS9TZXJ2acOnb3MpKg0KDQpBbyBhbmFsaXNhciBvcyBkaWZlcmVudGVzIHNldG9yZXMgZGEgZWNvbm9taWEsIHBlcmNlYmUtc2UgbyBtZXNtbyBwYWRyw6NvIGRlIGNyZXNjaW1lbnRvIHNlZ3VpZG8gZGUgZGVzYWNlbGVyYcOnw6NvIHF1ZSBtYXJjb3UgbyBJQkMtQnIgZSBvIFBJQiBhbyBsb25nbyBkbyBhbm8uIEFzIGFsdGFzIHNldG9yaWFpcyBmb3JhbSBkZSAxMywxJSBuYSBhZ3JvcGVjdcOhcmlhLCAxLDUlIG5hIGluZMO6c3RyaWEgZSAyLDElIGVtIHNlcnZpw6dvcy4NCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQoNCiMgQ29sZXRhciBkYWRvcyBkb3Mgc2V0b3JlcyAoSUJDLUJyIHNldG9yaWFsKSBkZSBqYW5laXJvLzIwMjQgYXTDqSBkZXplbWJyby8yMDI1DQojIEFURU7Dh8ODTzogU8OjbyBuw7ptZXJvcy3DrW5kaWNlIGNvbSBiYXNlIDIwMjIgPSAxMDAsIE7Dg08gc8OjbyB2YWxvcmVzIGVtIFIkIG1pbGjDtWVzDQoNCmRhZG9zX3NlcnZpY29zIDwtIGdldF9zZXJpZXMoMjk2MDYsIHN0YXJ0X2RhdGUgPSAiMjAyNC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMjUtMTItMzAiKSAlPiUgDQogIHJlbmFtZShTZXJ2aWNvcyA9IGAyOTYwNmApICAjIElCQy1CciBTZXJ2acOnb3MgKMOtbmRpY2UpIC0gY29tIGFqdXN0ZSBzYXpvbmFsDQoNCmRhZG9zX2Fncm8gPC0gZ2V0X3NlcmllcygyOTYwMiwgc3RhcnRfZGF0ZSA9ICIyMDI0LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAyNS0xMi0zMCIpICU+JSANCiAgcmVuYW1lKEFncm9wZWN1YXJpYSA9IGAyOTYwMmApICAjIElCQy1CciBBZ3JvcGVjdcOhcmlhICjDrW5kaWNlKSAtIGNvbSBhanVzdGUgc2F6b25hbA0KDQpkYWRvc19pbmR1c3RyaWEgPC0gZ2V0X3NlcmllcygyOTYwNCwgc3RhcnRfZGF0ZSA9ICIyMDI0LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAyNS0xMi0zMCIpICU+JSANCiAgcmVuYW1lKEluZHVzdHJpYSA9IGAyOTYwNGApICAjIElCQy1CciBJbmTDunN0cmlhICjDrW5kaWNlKSAtIGNvbSBhanVzdGUgc2F6b25hbA0KDQojIENvbWJpbmFyIHRvZG9zIG9zIGRhZG9zDQpkYWRvc19zZXRvcmVzIDwtIGRhZG9zX3NlcnZpY29zICU+JQ0KICBsZWZ0X2pvaW4oZGFkb3NfYWdybywgYnkgPSAiZGF0ZSIpICU+JQ0KICBsZWZ0X2pvaW4oZGFkb3NfaW5kdXN0cmlhLCBieSA9ICJkYXRlIikgJT4lDQogIG11dGF0ZSgNCiAgICB0aW1lc3RhbXAgPSBkYXRldGltZV90b190aW1lc3RhbXAoZGF0ZSksDQogICAgIyBNYW50ZXIgdmFsb3JlcyBvcmlnaW5haXMgZG8gw61uZGljZSAoYmFzZSAyMDIyID0gMTAwKQ0KICAgIFNlcnZpY29zX2luZGljZSA9IFNlcnZpY29zLA0KICAgIEFncm9wZWN1YXJpYV9pbmRpY2UgPSBBZ3JvcGVjdWFyaWEsDQogICAgSW5kdXN0cmlhX2luZGljZSA9IEluZHVzdHJpYQ0KICApICU+JQ0KICBzZWxlY3QoZGF0ZSwgdGltZXN0YW1wLCBTZXJ2aWNvc19pbmRpY2UsIEFncm9wZWN1YXJpYV9pbmRpY2UsIEluZHVzdHJpYV9pbmRpY2UpICU+JQ0KICBhcnJhbmdlKGRhdGUpDQoNCiMgVmVyaWZpY2FyIHNlIGjDoSBkYWRvcw0KaWYobnJvdyhkYWRvc19zZXRvcmVzKSA9PSAwKSB7DQogIHN0b3AoIk7Do28gZm9yYW0gZW5jb250cmFkb3MgZGFkb3MgcGFyYSBvIHBlcsOtb2RvIHNlbGVjaW9uYWRvLiBWZXJpZmlxdWUgc2Ugb3MgY8OzZGlnb3MgZXN0w6NvIGNvcnJldG9zIGUgc2Ugb3MgZGFkb3MgZXN0w6NvIGRpc3BvbsOtdmVpcy4iKQ0KfQ0KDQojIENhbGN1bGFyIGxpbWl0ZXMgZG8gZWl4byBZIHBhcmEgem9vbSBhdXRvbcOhdGljbw0KeV9taW4gPC0gbWluKGMoZGFkb3Nfc2V0b3JlcyRTZXJ2aWNvc19pbmRpY2UsIA0KICAgICAgICAgICAgICAgZGFkb3Nfc2V0b3JlcyRBZ3JvcGVjdWFyaWFfaW5kaWNlLCANCiAgICAgICAgICAgICAgIGRhZG9zX3NldG9yZXMkSW5kdXN0cmlhX2luZGljZSksIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChjKGRhZG9zX3NldG9yZXMkU2Vydmljb3NfaW5kaWNlLCANCiAgICAgICAgICAgICAgIGRhZG9zX3NldG9yZXMkQWdyb3BlY3VhcmlhX2luZGljZSwgDQogICAgICAgICAgICAgICBkYWRvc19zZXRvcmVzJEluZHVzdHJpYV9pbmRpY2UpLCBuYS5ybSA9IFRSVUUpDQoNCiMgQWRpY2lvbmFyIHVtYSBtYXJnZW0gZGUgNSUgcGFyYSBtZWxob3IgdmlzdWFsaXphw6fDo28NCnlfcmFuZ2UgPC0geV9tYXggLSB5X21pbg0KeV9taW5fYWp1c3RhZG8gPC0gbWF4KDAsIGZsb29yKHlfbWluIC0gMC4wNSAqIHlfcmFuZ2UpKQ0KeV9tYXhfYWp1c3RhZG8gPC0gY2VpbGluZyh5X21heCArIDAuMDUgKiB5X3JhbmdlKQ0KDQojIENyaWFyIG8gZ3LDoWZpY28gY29tIHBvbnRvcyAobWFya2VycykgbmFzIGxpbmhhcw0KaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUNCiAgIyBTw6lyaWU6IFNlcnZpw6dvcw0KICBoY19hZGRfc2VyaWVzKA0KICAgIGRhdGEgPSBsaXN0X3BhcnNlMihkYWRvc19zZXRvcmVzICU+JSBzZWxlY3QodGltZXN0YW1wLCBTZXJ2aWNvc19pbmRpY2UpKSwNCiAgICB0eXBlID0gImxpbmUiLA0KICAgIG5hbWUgPSAiSUJDLUJyIFNlcnZpw6dvcyIsDQogICAgY29sb3IgPSAiIzQ2YjFlMSIsICAjIEF6dWwgY2xhcm8NCiAgICBsaW5lV2lkdGggPSAyLA0KICAgIG1hcmtlciA9IGxpc3QoDQogICAgICBlbmFibGVkID0gVFJVRSwgICAgICAgICMgSEFCSUxJVEEgT1MgUE9OVE9TDQogICAgICByYWRpdXMgPSAzLCAgICAgICAgICAgICMgVGFtYW5obyBkbyBwb250bw0KICAgICAgc3ltYm9sID0gImNpcmNsZSIsICAgICAjIEZvcm1hdG86IGPDrXJjdWxvDQogICAgICBmaWxsQ29sb3IgPSAiIzQ2YjFlMSIsICMgQ29yIGRlIHByZWVuY2hpbWVudG8NCiAgICAgIGxpbmVXaWR0aCA9IDEsICAgICAgICAgIyBCb3JkYSBkbyBwb250bw0KICAgICAgbGluZUNvbG9yID0gIiNGRkZGRkYiICAjIENvciBkYSBib3JkYSAoYnJhbmNvIHBhcmEgZGVzdGFjYXIpDQogICAgKSwNCiAgICB5QXhpcyA9IDAsDQogICAgdG9vbHRpcCA9IGxpc3QodmFsdWVEZWNpbWFscyA9IDEpDQogICkgJT4lDQogICMgU8OpcmllOiBBZ3JvcGVjdcOhcmlhDQogIGhjX2FkZF9zZXJpZXMoDQogICAgZGF0YSA9IGxpc3RfcGFyc2UyKGRhZG9zX3NldG9yZXMgJT4lIHNlbGVjdCh0aW1lc3RhbXAsIEFncm9wZWN1YXJpYV9pbmRpY2UpKSwNCiAgICB0eXBlID0gImxpbmUiLA0KICAgIG5hbWUgPSAiSUJDLUJyIEFncm9wZWN1w6FyaWEiLA0KICAgIGNvbG9yID0gIiNmZWI3MTIiLCAgIyBEb3VyYWRvDQogICAgbGluZVdpZHRoID0gMiwNCiAgICBtYXJrZXIgPSBsaXN0KA0KICAgICAgZW5hYmxlZCA9IFRSVUUsDQogICAgICByYWRpdXMgPSAzLA0KICAgICAgc3ltYm9sID0gImNpcmNsZSIsDQogICAgICBmaWxsQ29sb3IgPSAiI2ZlYjcxMiIsDQogICAgICBsaW5lV2lkdGggPSAxLA0KICAgICAgbGluZUNvbG9yID0gIiNGRkZGRkYiDQogICAgKSwNCiAgICB5QXhpcyA9IDAsDQogICAgdG9vbHRpcCA9IGxpc3QodmFsdWVEZWNpbWFscyA9IDEpDQogICkgJT4lDQogICMgU8OpcmllOiBJbmTDunN0cmlhDQogIGhjX2FkZF9zZXJpZXMoDQogICAgZGF0YSA9IGxpc3RfcGFyc2UyKGRhZG9zX3NldG9yZXMgJT4lIHNlbGVjdCh0aW1lc3RhbXAsIEluZHVzdHJpYV9pbmRpY2UpKSwNCiAgICB0eXBlID0gImxpbmUiLA0KICAgIG5hbWUgPSAiSUJDLUJyIEluZMO6c3RyaWEiLA0KICAgIGNvbG9yID0gIiMwMjAyM2MiLCAgIyBBenVsIGVzY3Vybw0KICAgIGxpbmVXaWR0aCA9IDIsDQogICAgbWFya2VyID0gbGlzdCgNCiAgICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgICAgcmFkaXVzID0gMywNCiAgICAgIHN5bWJvbCA9ICJjaXJjbGUiLA0KICAgICAgZmlsbENvbG9yID0gIiMwMjAyM2MiLA0KICAgICAgbGluZVdpZHRoID0gMSwNCiAgICAgIGxpbmVDb2xvciA9ICIjRkZGRkZGIg0KICAgICksDQogICAgeUF4aXMgPSAwLA0KICAgIHRvb2x0aXAgPSBsaXN0KHZhbHVlRGVjaW1hbHMgPSAxKQ0KICApICU+JQ0KICBoY195QXhpcygNCiAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICLDjW5kaWNlIChiYXNlOiAyMDIyID0gMTAwKSIpLA0KICAgIG9wcG9zaXRlID0gRkFMU0UsDQogICAgbGFiZWxzID0gbGlzdChmb3JtYXQgPSAie3ZhbHVlfSIpLA0KICAgIG1pbiA9IHlfbWluX2FqdXN0YWRvLA0KICAgIG1heCA9IHlfbWF4X2FqdXN0YWRvLA0KICAgIHBsb3RMaW5lcyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB2YWx1ZSA9IDEwMCwNCiAgICAgICAgY29sb3IgPSAiIzY2NjY2NiIsDQogICAgICAgIGRhc2hTdHlsZSA9ICJkYXNoIiwNCiAgICAgICAgd2lkdGggPSAxLA0KICAgICAgICBsYWJlbCA9IGxpc3QodGV4dCA9ICJCYXNlICgyMDIyID0gMTAwKSIpDQogICAgICApDQogICAgKQ0KICApICU+JQ0KICBoY194QXhpcygNCiAgICB0eXBlID0gJ2RhdGV0aW1lJywNCiAgICBsYWJlbHMgPSBsaXN0KGZvcm1hdCA9ICd7dmFsdWU6JWIgJVl9JykNCiAgKSAlPiUNCiAgaGNfdGl0bGUodGV4dCA9ICJJQkMtQnIgcG9yIFNldG9yIC0gQXRpdmlkYWRlIEVjb27DtG1pY2EgY29tIEFqdXN0ZSBTYXpvbmFsIikgJT4lDQogIGhjX3N1YnRpdGxlKHRleHQgPSAiw41uZGljZSBiYXNlOiAyMDIyID0gMTAwIC0gUGVyw61vZG86IEphbi8yMDI0IGEgRGV6LzIwMjUiKSAlPiUNCiAgaGNfY3JlZGl0cygNCiAgICBlbmFibGVkID0gVFJVRSwgDQogICAgdGV4dCA9ICJGb250ZTogQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwgKFNHUyAtIEPDs2RpZ29zOiAyOTYwNiwgMjk2MDIsIDI5NjA0KSINCiAgKSAlPiUNCiAgaGNfcmFuZ2VTZWxlY3RvcigNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBidXR0b25zID0gbGlzdCgNCiAgICAgIGxpc3QodHlwZSA9ICdtb250aCcsIGNvdW50ID0gMywgdGV4dCA9ICczTScpLA0KICAgICAgbGlzdCh0eXBlID0gJ21vbnRoJywgY291bnQgPSA2LCB0ZXh0ID0gJzZNJyksDQogICAgICBsaXN0KHR5cGUgPSAnYWxsJywgdGV4dCA9ICdUb2RvIHBlcsOtb2RvJykNCiAgICApLA0KICAgIHNlbGVjdGVkID0gMg0KICApICU+JQ0KICBoY190b29sdGlwKA0KICAgIHNoYXJlZCA9IFRSVUUsDQogICAgaGVhZGVyRm9ybWF0ID0gJzxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHgiPjxiPntwb2ludC5rZXl9PC9iPjwvc3Bhbj48YnIvPicsDQogICAgcG9pbnRGb3JtYXQgPSAnPHNwYW4gc3R5bGU9ImNvbG9yOntzZXJpZXMuY29sb3J9Ij7il488L3NwYW4+IHtzZXJpZXMubmFtZX06IDxiPntwb2ludC55Oi4xZn08L2I+PGJyLz4nLA0KICAgIHZhbHVlRGVjaW1hbHMgPSAxDQogICkgJT4lDQogIGhjX2xlZ2VuZCgNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBhbGlnbiA9ICJjZW50ZXIiLA0KICAgIHZlcnRpY2FsQWxpZ24gPSAiYm90dG9tIiwNCiAgICBsYXlvdXQgPSAiaG9yaXpvbnRhbCINCiAgKSAlPiUNCiAgaGNfcGxvdE9wdGlvbnMoDQogICAgc2VyaWVzID0gbGlzdCgNCiAgICAgIGFuaW1hdGlvbiA9IFRSVUUsDQogICAgICBjb25uZWN0TnVsbHMgPSBUUlVFDQogICAgKQ0KICApDQpgYGANCkFwZXNhciBkYSBkZXNhY2VsZXJhw6fDo28sIG8gc2V0b3IgZGUgc2VydmnDp29zIHNlIG1hbnRldmUgYXF1ZWNpZG8gYW8gbG9uZ28gZG8gcGVyw61vZG8sIGNvbSB1bWEgaW5mbGHDp8OjbyBwZXJzaXN0ZW50ZSBxdWUgaW1wZWRpdSB1bSBjcmVzY2ltZW50byBhaW5kYSBtYWlvci4gT3Mgc2VydmnDp29zIGRlIGluZm9ybWHDp8OjbyBlIGNvbXVuaWNhw6fDo28gYXZhbsOnYXJhbSAxLDclLCBlbnF1YW50byBhcXVlbGVzIHByZXN0YWRvcyDDoHMgZmFtw61saWFzIGNyZXNjZXJhbSAxLDElLg0KDQpPIGFncm9uZWfDs2NpbyBwZXJtYW5lY2Ugc2VuZG8gdW0gcGlsYXIgZnVuZGFtZW50YWwgcGFyYSBhIGVjb25vbWlhIGRvIHBhw61zLiBFbSB1bSBjb250ZXh0byBkZSByZWN1cGVyYcOnw6NvIGVtIGN1bHR1cmFzIGVzdHJhdMOpZ2ljYXMsIGEgc2FmcmEgZGUgZ3LDo29zIDIwMjQvMjUgZXN0w6EgZXN0aW1hZGEgZW0gMzUwIG1pbGjDtWVzIGRlIHRvbmVsYWRhcyDigJQgdW0gYXVtZW50byBkZSAxNiwzJSBlbSBjb21wYXJhw6fDo28gw6Agc2FmcmEgZGUgMjAyMy8yNC4gTyBkZXNlbXBlbmhvIGRvIHNldG9yIHRlbSBlZmVpdG8gZGlyZXRvIHNvYnJlIG8gUElCIGUgYSBiYWxhbsOnYSBjb21lcmNpYWwsIGNvbSBvIElCQy1CciBjb250cmlidWluZG8gcGFyYSBhIGVsYWJvcmHDp8OjbyBkYSBwb2zDrXRpY2EgbW9uZXTDoXJpYSBhbyBzZXJ2aXIgY29tbyBjYWxpYnJhZG9yIGRhIFNlbGljLCBhbnRlY2lwYWRvciBkZSB0ZW5kw6puY2lhcyBlIHRlcm3DtG1ldHJvIGRvIGltcGFjdG8gZGUgZGVjaXPDtWVzIGFudGVyaW9yZXMuDQoNCk8gc2V0b3IgaW5kdXN0cmlhbCwgcG9yIHN1YSB2ZXosIHBvZGUgYXByZXNlbnRhciBkZXNhZmlvcyBlbSAyMDI2IHNlIHRyYXRhbmRvIGRlIHRyYW5zcG9ydGUgZSBsb2fDrXN0aWNhLCBlbSByYXrDo28gZGUgZXN0b3F1ZXMgZWxldmFkb3MgZGVjb3JyZW50ZXMgZGEgZGVtYW5kYSBlbmZyYXF1ZWNpZGEgZSBkZSB1bSBjw6JtYmlvIG3DqWRpbyBlc3BlY3VsYWRvIGVtIHRvcm5vIGRlIFIkIDUsNTAgIA0KDQoNCiMjICpDZW7DoXJpbyBkbyBjcsOpZGl0byBkZSBjb25zdW1vIG5hIGF0aXZpZGFkZSBlY29uw7RtaWNhIGJyYXNpbGVpcmEqDQoNCkNlbsOhcmlvIGRvIGNyw6lkaXRvIGRlIGNvbnN1bW8gbmEgYXRpdmlkYWRlIGVjb27DtG1pY2EgYnJhc2lsZWlyYQ0KDQpBIGRpbsOibWljYSBkbyBjcsOpZGl0byBjb25zdGl0dWkgdW0gZG9zIHBpbGFyZXMgZGEgYXRpdmlkYWRlIGVjb27DtG1pY2Egbm8gQnJhc2lsLCBmdW5jaW9uYW5kbyBjb21vIG1lY2FuaXNtbyByZWxldmFudGUgZGUgYW1wbGlmaWNhw6fDo28gZGEgZGVtYW5kYSBkb23DqXN0aWNhLiBBbyBmYWNpbGl0YXIgbyBhY2Vzc28gYSBmaW5hbmNpYW1lbnRvIHBhcmEgZmFtw61saWFzIGUgZW1wcmVzYXMsIG8gY3LDqWRpdG8gc3VzdGVudGEgbyBjb25zdW1vLCBjb250cmlidWkgcGFyYSBhIGV4cGFuc8OjbyBkYSBkZW1hbmRhIGFncmVnYWRhIGUgaW5mbHVlbmNpYSBkaXJldGFtZW50ZSBvIHJpdG1vIGRlIGNyZXNjaW1lbnRvIGVjb27DtG1pY28uDQoNCk5vIGNhc28gZGFzIGZhbcOtbGlhcywgbyBjcsOpZGl0byBhZmV0YSBkaXJldGFtZW50ZSBhIGNhcGFjaWRhZGUgZGUgY29uc3VtbyBhbyBwZXJtaXRpciBhIGFudGVjaXBhw6fDo28gZGUgZ2FzdG9zIGZ1dHVyb3MuIEVtIHBlcsOtb2RvcyBkZSBtZWxob3JhIGRvIG1lcmNhZG8gZGUgdHJhYmFsaG8gZSBhdW1lbnRvIGRhIHJlbmRhLCBhIGV4cGFuc8OjbyBkYXMgY29uY2Vzc8O1ZXMgdGVuZGUgYSByZWZvcsOnYXIgbyBjcmVzY2ltZW50byBkYSBkZW1hbmRhIGRvbcOpc3RpY2EuIEVtIG1vbWVudG9zIGRlIGRlc2FjZWxlcmHDp8OjbyBlY29uw7RtaWNhLCBwb3Igb3V0cm8gbGFkbywgYSByZXRyYcOnw6NvIGRvIGNyw6lkaXRvIGNvc3R1bWEgaW50ZW5zaWZpY2FyIGEgcGVyZGEgZGUgZGluYW1pc21vIGRhIGF0aXZpZGFkZS4NCg0KQSBhbsOhbGlzZSBjb25qdW50YSBkYSBtYXNzYSBkZSByZW5kaW1lbnRvIHJlYWwgaGFiaXR1YWwgZGFzIGZhbcOtbGlhcyBlIGRhcyBjb25jZXNzw7VlcyBkZSBjcsOpZGl0byBjb20gcmVjdXJzb3MgbGl2cmVzIHBhcmEgcGVzc29hcyBmw61zaWNhcyBzdWdlcmUgcXVlLCBlbSBkZXRlcm1pbmFkb3MgbW9tZW50b3MgZGEgZWNvbm9taWEgYnJhc2lsZWlyYSwgYSBkaW7Dom1pY2EgZG8gY3LDqWRpdG8gcG9kZSBhc3N1bWlyIGNhcsOhdGVyIGFudGVjZWRlbnRlIGVtIHJlbGHDp8OjbyDDoCBldm9sdcOnw6NvIGRhIHJlbmRhIGFncmVnYWRhLiBPYnNlcnZhLXNlIHF1ZSBwZXLDrW9kb3MgZGUgYWNlbGVyYcOnw6NvIG5hcyBjb25jZXNzw7VlcyB0ZW5kZW0gYSBwcmVjZWRlciBtb3ZpbWVudG9zIG1haXMgaW50ZW5zb3MgZGUgcmVjdXBlcmHDp8OjbyBkYSBtYXNzYSBzYWxhcmlhbCwgaW5kaWNhbmRvIHF1ZSBhIGV4cGFuc8OjbyBkbyBmaW5hbmNpYW1lbnRvIHBvZGUgYXR1YXIgY29tbyB1bSBkb3MgcHJpbWVpcm9zIHNpbmFpcyBkZSBtZWxob3JhIGRhIGRlbWFuZGEgZG9tw6lzdGljYS4NCg0KRW50cmUgMjAxNyBlIDIwMTksIHBvciBleGVtcGxvLCBhcyBjb25jZXNzw7VlcyBkZSBjcsOpZGl0byDDoHMgZmFtw61saWFzIGFwcmVzZW50YXJhbSB0cmFqZXTDs3JpYSBkZSBjcmVzY2ltZW50byBjb25zaXN0ZW50ZSwgc2FpbmRvIGRlIHBhdGFtYXJlcyBwcsOzeGltb3MgYSBSJDExMCBiaWxow7VlcyBtZW5zYWlzIHBhcmEgbsOtdmVpcyBzdXBlcmlvcmVzIGEgUiQxNTAgYmlsaMO1ZXMsIGVucXVhbnRvIGEgbWFzc2Egc2FsYXJpYWwgYXZhbsOnYXZhIGRlIGZvcm1hIG1haXMgZ3JhZHVhbC4gRXNzZSBjb21wb3J0YW1lbnRvIHN1Z2VyZSBxdWUgYSByZXRvbWFkYSBkbyBjb25zdW1vIG9jb3JyZXUgaW5pY2lhbG1lbnRlIHBvciBtZWlvIGRhIGFtcGxpYcOnw6NvIGRvIGNyw6lkaXRvLCBjb20gYSByZW5kYSByZWFnaW5kbyBkZSBtYW5laXJhIG1haXMgbGVudGEgYW8gbG9uZ28gZG8gcHJvY2Vzc28gZGUgcmVjdXBlcmHDp8OjbyBlY29uw7RtaWNhLg0KDQpEaW7Dom1pY2Egc2VtZWxoYW50ZSBwb2RlIHNlciBvYnNlcnZhZGEgbm8gcGVyw61vZG8gcG9zdGVyaW9yIGFvIGNob3F1ZSBkYSBwYW5kZW1pYS4gQXDDs3MgYSBmb3J0ZSBjb250cmHDp8OjbyBkZSAyMDIwLCBhcyBjb25jZXNzw7VlcyBkZSBjcsOpZGl0byDDoHMgcGVzc29hcyBmw61zaWNhcyByZXRvbWFyYW0gdHJhamV0w7NyaWEgZGUgZXhwYW5zw6NvIHJlbGF0aXZhbWVudGUgcsOhcGlkYSwgdWx0cmFwYXNzYW5kbyBSJDIwMCBiaWxow7VlcyBtZW5zYWlzIGVtIDIwMjEgZSBhbGNhbsOnYW5kbyBuw612ZWlzIHN1cGVyaW9yZXMgYSBSJDMwMCBiaWxow7VlcyBlbSAyMDI1LiBBIG1hc3NhIHNhbGFyaWFsIHJlYWwsIHBvciBzdWEgdmV6LCBhcHJlc2VudG91IHJlY3VwZXJhw6fDo28gbWFpcyBncmFkdWFsLCBhdmFuw6dhbmRvIGRlIGNlcmNhIGRlIFIkMjczIGJpbGjDtWVzIGVtIDIwMjEgcGFyYSBhcHJveGltYWRhbWVudGUgUiQzNjcgYmlsaMO1ZXMgYW8gZmluYWwgZGUgMjAyNS4NCg0KRXNzZSBkZXNjb21wYXNzbyB0ZW1wb3JhbCByZWZvcsOnYSBhIGhpcMOzdGVzZSBkZSBxdWUgbyBjcsOpZGl0byBwb2RlIGF0dWFyIGNvbW8gbWVjYW5pc21vIGRlIGFudGVjaXBhw6fDo28gZG8gY29uc3VtbywgcGVybWl0aW5kbyBxdWUgZmFtw61saWFzIGFqdXN0ZW0gc2V1cyBnYXN0b3MgYW50ZXMgZGEgY29uc29saWRhw6fDo28gcGxlbmEgZG8gY3Jlc2NpbWVudG8gZGEgcmVuZGEuDQoNCkRvIHBvbnRvIGRlIHZpc3RhIGVjb27DtG1pY28sIGVzc2UgY29tcG9ydGFtZW50byBwb2RlIHNlciBleHBsaWNhZG8gcGVsYSBtYWlvciBzZW5zaWJpbGlkYWRlIGRhcyBjb25jZXNzw7VlcyDDoHMgY29uZGnDp8O1ZXMgZmluYW5jZWlyYXMgZSDDoHMgZXhwZWN0YXRpdmFzLiBBbHRlcmHDp8O1ZXMgbmEgcGVyY2Vww6fDo28gZGUgcmlzY28sIG5hIGxpcXVpZGV6IGRvIHNpc3RlbWEgZmluYW5jZWlybyBvdSBuYXMgZXhwZWN0YXRpdmFzIGVtIHJlbGHDp8OjbyDDoCBwb2zDrXRpY2EgbW9uZXTDoXJpYSB0ZW5kZW0gYSBpbXBhY3RhciByYXBpZGFtZW50ZSBhIG9mZXJ0YSBlIGEgZGVtYW5kYSBwb3IgY3LDqWRpdG8sIGVucXVhbnRvIGEgZXZvbHXDp8OjbyBkbyBtZXJjYWRvIGRlIHRyYWJhbGhvIGUgZGEgcmVuZGEgb2NvcnJlIGRlIGZvcm1hIG1haXMgZ3JhZHVhbC4NCg0KQXNzaW0sIGEgZXhwYW5zw6NvIGRvIGNyw6lkaXRvIG7Do28gYXBlbmFzIHJlZmxldGUgYSBhdGl2aWRhZGUgZWNvbsO0bWljYSBjb3JyZW50ZSwgbWFzIHRhbWLDqW0gcG9kZSBzaW5hbGl6YXIgbXVkYW7Dp2FzIGZ1dHVyYXMgbm8gcml0bW8gZGEgZGVtYW5kYSBkb23DqXN0aWNhLg0KDQpPcyBkYWRvcyB1dGlsaXphZG9zIG5lc3RhIGFuw6FsaXNlIHPDo28gcHJvdmVuaWVudGVzIGRvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsLCBwb3IgbWVpbyBkYXMgc8OpcmllcyBkZSBjb25jZXNzw7VlcyBkZSBjcsOpZGl0byBkbyBTaXN0ZW1hIEZpbmFuY2Vpcm8gTmFjaW9uYWwsIGUgZGEgSW5zdGl0dXRvIEJyYXNpbGVpcm8gZGUgR2VvZ3JhZmlhIGUgRXN0YXTDrXN0aWNhLCBhIHBhcnRpciBkYSBQTkFEIENvbnTDrW51YSwgcXVlIGZvcm5lY2UgYXMgaW5mb3JtYcOnw7VlcyBzb2JyZSBtYXNzYSBkZSByZW5kaW1lbnRvIHJlYWwgaGFiaXR1YWwgZGFzIGZhbcOtbGlhcy4NCg0KRGVzc2EgZm9ybWEsIG9zIGRhZG9zIHJlY2VudGVzIHN1Z2VyZW0gcXVlIGFzIGNvbmNlc3PDtWVzIMOgcyBmYW3DrWxpYXMgZGVzZW1wZW5oYW0gcGFwZWwgcmVsZXZhbnRlIGNvbW8gaW5kaWNhZG9yIGFudGVjZWRlbnRlIGRhIGRpbsOibWljYSBlY29uw7RtaWNhIGJyYXNpbGVpcmEuIEFvIGFtcGxpYXIgYSBjYXBhY2lkYWRlIGRlIGNvbnN1bW8gZW0gbW9tZW50b3MgZGUgbWVsaG9yYSBkYXMgY29uZGnDp8O1ZXMgZmluYW5jZWlyYXMsIG8gY3LDqWRpdG8gYXR1YSBjb21vIHZldG9yIGRlIHByb3BhZ2HDp8OjbyBkYSBhdGl2aWRhZGUsIHJlZm9yw6dhbmRvIG1vdmltZW50b3MgZGUgZXhwYW5zw6NvIGUgY29udHJpYnVpbmRvIHBhcmEgYSBldm9sdcOnw6NvIGRhIG1hc3NhIHNhbGFyaWFsIGFvIGxvbmdvIGRvIHRlbXBvLg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShoaWdoY2hhcnRlcikNCmxpYnJhcnkobHVicmlkYXRlKQ0KDQojIENvbGV0YXIgZGFkb3MNCiMgMjg1NDU6IE1hc3NhIGRlIHJlbmRpbWVudG8gcmVhbCBoYWJpdHVhbCAoUiQgbWlsaMO1ZXMpDQpkYWRvc19yZW5kYSA8LSBnZXRfc2VyaWVzKDI4NTQ1LCBzdGFydF9kYXRlID0gIjIwMjAtMDEtMDEiLCBlbmRfZGF0ZSA9IFN5cy5EYXRlKCkpICU+JSANCiAgcmVuYW1lKE1hc3NhX3JlbmRhID0gYDI4NTQ1YCkNCg0KIyAyNDQ0NDogQ29uY2Vzc8O1ZXMgZGUgY3LDqWRpdG8gLSByZWN1cnNvcyBsaXZyZXMgLSBzYXpvbmFsbWVudGUgYWp1c3RhZGFzIChSJCBtaWxow7VlcykNCmRhZG9zX2NyZWRpdG8gPC0gZ2V0X3NlcmllcygyNDQ0NCwgc3RhcnRfZGF0ZSA9ICIyMDIwLTAxLTAxIiwgZW5kX2RhdGUgPSBTeXMuRGF0ZSgpKSAlPiUgDQogIHJlbmFtZShDcmVkaXRvID0gYDI0NDQ0YCkNCg0KIyBDb21iaW5hciBkYWRvcw0KZGFkb3NfY29tYmluYWRvcyA8LSBkYWRvc19yZW5kYSAlPiUNCiAgbGVmdF9qb2luKGRhZG9zX2NyZWRpdG8sIGJ5ID0gImRhdGUiKSAlPiUNCiAgbXV0YXRlKA0KICAgIGFubyA9IHllYXIoZGF0ZSksDQogICAgbWVzID0gbW9udGgoZGF0ZSwgbGFiZWwgPSBUUlVFLCBhYmJyID0gRkFMU0UpLA0KICAgIHRpbWVzdGFtcCA9IGRhdGV0aW1lX3RvX3RpbWVzdGFtcChkYXRlKSwNCiAgICAjIENvbnZlcnRlciBhbWJhcyBwYXJhIGJpbGjDtWVzICh2aXN1YWxpemHDp8OjbyBtYWlzIGxpbXBhKQ0KICAgIE1hc3NhX2JpbGhvZXMgPSByb3VuZChNYXNzYV9yZW5kYSAvIDEwMDAsIDEpLA0KICAgIENyZWRpdG9fYmlsaG9lcyA9IHJvdW5kKENyZWRpdG8gLyAxMDAwLCAxKQ0KICApICU+JQ0KICBzZWxlY3QoZGF0ZSwgYW5vLCBtZXMsIHRpbWVzdGFtcCwgTWFzc2FfYmlsaG9lcywgQ3JlZGl0b19iaWxob2VzLCBNYXNzYV9yZW5kYSwgQ3JlZGl0bykgJT4lDQogIGFycmFuZ2UoZGF0ZSkNCg0KIyBWZXJpZmljYXIgZGFkb3MNCmlmKG5yb3coZGFkb3NfY29tYmluYWRvcykgPT0gMCkgew0KICBzdG9wKCJEYWRvcyBuw6NvIGVuY29udHJhZG9zLiBWZXJpZmlxdWUgb3MgY8OzZGlnb3MuIikNCn0NCg0KIyBDYWxjdWxhciBsaW1pdGVzIHBhcmEgZWl4b3MNCnJlbmRhX21pbiA8LSBtaW4oZGFkb3NfY29tYmluYWRvcyRNYXNzYV9iaWxob2VzLCBuYS5ybSA9IFRSVUUpDQpyZW5kYV9tYXggPC0gbWF4KGRhZG9zX2NvbWJpbmFkb3MkTWFzc2FfYmlsaG9lcywgbmEucm0gPSBUUlVFKQ0KY3JlZGl0b19taW4gPC0gbWluKGRhZG9zX2NvbWJpbmFkb3MkQ3JlZGl0b19iaWxob2VzLCBuYS5ybSA9IFRSVUUpDQpjcmVkaXRvX21heCA8LSBtYXgoZGFkb3NfY29tYmluYWRvcyRDcmVkaXRvX2JpbGhvZXMsIG5hLnJtID0gVFJVRSkNCg0KIyBNYXJnZW0gZGUgNSUNCnJlbmRhX3JhbmdlIDwtIHJlbmRhX21heCAtIHJlbmRhX21pbg0KY3JlZGl0b19yYW5nZSA8LSBjcmVkaXRvX21heCAtIGNyZWRpdG9fbWluDQoNCiMgQ3JpYXIgZ3LDoWZpY28gY29tIGR1YXMgc8OpcmllcyBlbSBiaWxow7Vlcw0KaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUNCiAgIyBTw6lyaWUgMTogTWFzc2EgZGUgcmVuZGEgKGNvbHVuYXMpIC0gZWl4byBlc3F1ZXJkbw0KICBoY19hZGRfc2VyaWVzKA0KICAgIGRhdGEgPSBsaXN0X3BhcnNlMihkYWRvc19jb21iaW5hZG9zICU+JSBzZWxlY3QodGltZXN0YW1wLCBNYXNzYV9iaWxob2VzKSksDQogICAgdHlwZSA9ICJjb2x1bW4iLA0KICAgIG5hbWUgPSAiTWFzc2EgU2FsYXJpYWwgKFIkIGJpbGjDtWVzKSIsDQogICAgY29sb3IgPSAiI2ZlYjcxMiIsICAjIFZlcmRlDQogICAgeUF4aXMgPSAwLA0KICAgIHRvb2x0aXAgPSBsaXN0KHZhbHVlRGVjaW1hbHMgPSAxLCB2YWx1ZVN1ZmZpeCA9ICIgYmlsaMO1ZXMiKQ0KICApICU+JQ0KICAjIFPDqXJpZSAyOiBDb25jZXNzw7VlcyBkZSBjcsOpZGl0byAobGluaGEpIC0gZWl4byBkaXJlaXRvDQogIGhjX2FkZF9zZXJpZXMoDQogICAgZGF0YSA9IGxpc3RfcGFyc2UyKGRhZG9zX2NvbWJpbmFkb3MgJT4lIHNlbGVjdCh0aW1lc3RhbXAsIENyZWRpdG9fYmlsaG9lcykpLA0KICAgIHR5cGUgPSAibGluZSIsDQogICAgbmFtZSA9ICJDb25jZXNzw7VlcyBkZSBDcsOpZGl0byAoUiQgYmlsaMO1ZXMpIiwNCiAgICBjb2xvciA9ICIjMDIwMjNjIiwgICMgQXp1bA0KICAgIGxpbmVXaWR0aCA9IDIsDQogICAgbWFya2VyID0gbGlzdChlbmFibGVkID0gVFJVRSwgcmFkaXVzID0gMyksDQogICAgeUF4aXMgPSAxLA0KICAgIHRvb2x0aXAgPSBsaXN0KHZhbHVlRGVjaW1hbHMgPSAxLCB2YWx1ZVN1ZmZpeCA9ICIgYmlsaMO1ZXMiKQ0KICApICU+JQ0KICAjIENvbmZpZ3VyYXIgZWl4b3MgWSBkdWFpcyAoYW1ib3MgZW0gYmlsaMO1ZXMpDQogIGhjX3lBeGlzX211bHRpcGxlcygNCiAgICBsaXN0KA0KICAgICAgdGl0bGUgPSBsaXN0KHRleHQgPSAiTWFzc2EgU2FsYXJpYWwgKFIkIGJpbGjDtWVzKSIpLA0KICAgICAgb3Bwb3NpdGUgPSBGQUxTRSwNCiAgICAgIGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gInt2YWx1ZX0gYmkiKSwNCiAgICAgIG1pbiA9IGZsb29yKHJlbmRhX21pbiAtIDAuMDUgKiByZW5kYV9yYW5nZSksDQogICAgICBtYXggPSBjZWlsaW5nKHJlbmRhX21heCArIDAuMDUgKiByZW5kYV9yYW5nZSkNCiAgICApLA0KICAgIGxpc3QoDQogICAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJDb25jZXNzw7VlcyBkZSBDcsOpZGl0byAoUiQgYmlsaMO1ZXMpIiksDQogICAgICBvcHBvc2l0ZSA9IFRSVUUsDQogICAgICBsYWJlbHMgPSBsaXN0KGZvcm1hdCA9ICJ7dmFsdWV9IGJpIiksDQogICAgICBtaW4gPSBmbG9vcihjcmVkaXRvX21pbiAtIDAuMDUgKiBjcmVkaXRvX3JhbmdlKSwNCiAgICAgIG1heCA9IGNlaWxpbmcoY3JlZGl0b19tYXggKyAwLjA1ICogY3JlZGl0b19yYW5nZSkNCiAgICApDQogICkgJT4lDQogIGhjX3hBeGlzKA0KICAgIHR5cGUgPSAnZGF0ZXRpbWUnLA0KICAgIGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gJ3t2YWx1ZTolYiAlWX0nKQ0KICApICU+JQ0KICBoY190aXRsZSh0ZXh0ID0gIlJlbmRhIHZzLiBNZXJjYWRvIGRlIENyw6lkaXRvIikgJT4lDQogIGhjX3N1YnRpdGxlKHRleHQgPSAiTWFzc2EgU2FsYXJpYWwgZSBDb25jZXNzw7VlcyBkZSBDcsOpZGl0byAoUiQgYmlsaMO1ZXMpIC0gRGFkb3MgY29tIGFqdXN0ZSBzYXpvbmFsIikgJT4lDQogIGhjX2NyZWRpdHMoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgdGV4dCA9ICJGb250ZTogQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwgKFNHUyAtIEPDs2RpZ29zOiAyODU0NSwgMjQ0NDQpIg0KICApICU+JQ0KICBoY19yYW5nZVNlbGVjdG9yKA0KICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgIGJ1dHRvbnMgPSBsaXN0KA0KICAgICAgbGlzdCh0eXBlID0gJ3llYXInLCBjb3VudCA9IDEsIHRleHQgPSAnMVknKSwNCiAgICAgIGxpc3QodHlwZSA9ICd5ZWFyJywgY291bnQgPSAyLCB0ZXh0ID0gJzJZJyksDQogICAgICBsaXN0KHR5cGUgPSAneWVhcicsIGNvdW50ID0gMywgdGV4dCA9ICczWScpLA0KICAgICAgbGlzdCh0eXBlID0gJ2FsbCcsIHRleHQgPSAnVG9kbyBwZXLDrW9kbycpDQogICAgKSwNCiAgICBzZWxlY3RlZCA9IDINCiAgKSAlPiUNCiAgaGNfdG9vbHRpcCgNCiAgICBzaGFyZWQgPSBUUlVFLA0KICAgIGhlYWRlckZvcm1hdCA9ICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB4Ij48Yj57cG9pbnQua2V5fTwvYj48L3NwYW4+PGJyLz4nLA0KICAgIHBvaW50Rm9ybWF0ID0gJzxzcGFuIHN0eWxlPSJjb2xvcjp7c2VyaWVzLmNvbG9yfSI+4pePPC9zcGFuPiB7c2VyaWVzLm5hbWV9OiA8Yj5SJCB7cG9pbnQueTouMWZ9IGJpbGjDtWVzPC9iPjxici8+Jw0KICApICU+JQ0KICBoY19sZWdlbmQoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgYWxpZ24gPSAiY2VudGVyIiwNCiAgICB2ZXJ0aWNhbEFsaWduID0gImJvdHRvbSIsDQogICAgbGF5b3V0ID0gImhvcml6b250YWwiDQogICkgJT4lDQogIGhjX3Bsb3RPcHRpb25zKA0KICAgIGNvbHVtbiA9IGxpc3QoDQogICAgICBwb2ludFBhZGRpbmcgPSAwLjEsDQogICAgICBncm91cFBhZGRpbmcgPSAwLjA1LA0KICAgICAgYm9yZGVyV2lkdGggPSAwLjUNCiAgICApLA0KICAgIGxpbmUgPSBsaXN0KA0KICAgICAgYW5pbWF0aW9uID0gVFJVRSwNCiAgICAgIGNvbm5lY3ROdWxscyA9IFRSVUUNCiAgICApDQogICkNCmBgYA0KIyMgKkFuw6FsaXNlIGRvIE1lcmNhZG8gZGUgVHJhYmFsaG8qDQoNCkEgZGluw6JtaWNhIGRvIG1lcmNhZG8gZGUgdHJhYmFsaG8gdGVtIGRlc2VtcGVuaGFkbyBwYXBlbCBjZW50cmFsIG5hIHRyYWpldMOzcmlhIHJlY2VudGUgZGEgYXRpdmlkYWRlIGVjb27DtG1pY2EgYnJhc2lsZWlyYS4gQSBldm9sdcOnw6NvIGRhIHRheGEgZGUgZGVzb2N1cGHDp8OjbywgZGEgcG9wdWxhw6fDo28gbmEgZm9yw6dhIGRlIHRyYWJhbGhvIGUgZGEgbWFzc2Egc2FsYXJpYWwgcmVhbCByZXZlbGEgbsOjbyBhcGVuYXMgb3MgZWZlaXRvcyBkYXMgb3NjaWxhw6fDtWVzIGVjb27DtG1pY2FzIGVuZnJlbnRhZGFzIHBlbG8gcGHDrXMgbmEgw7psdGltYSBkw6ljYWRhLCBtYXMgdGFtYsOpbSBvcyBmdW5kYW1lbnRvcyBxdWUgc3VzdGVudGFtIG8gbW9tZW50byBhdHVhbCBkYSBlY29ub21pYS4NCg0KRW50cmUgMjAxNSBlIDIwMTcsIGEgZWNvbm9taWEgYnJhc2lsZWlyYSBlbmZyZW50b3UgZm9ydGUgY29udHJhw6fDo28sIHJlZmxldGlkYSBuYSBkZXRlcmlvcmHDp8OjbyBhYnJ1cHRhIGRvIG1lcmNhZG8gZGUgdHJhYmFsaG8uIEEgdGF4YSBkZSBkZXNvY3VwYcOnw6NvIGF2YW7Dp291IGRlIGFwcm94aW1hZGFtZW50ZSA2LDUlIHBhcmEgcGF0YW1hciBwcsOzeGltbyBkZSAxNCUsIGNvbmZpZ3VyYW5kbyB1bWEgZHVwbGljYcOnw6NvIGRvIGRlc2VtcHJlZ28gZW0gY3VydG8gaW50ZXJ2YWxvIGRlIHRlbXBvLiBFc3NlIG1vdmltZW50byBmb2kgYWNvbXBhbmhhZG8gcG9yIGVuZnJhcXVlY2ltZW50byBkYSByZW5kYSBhZ3JlZ2FkYSBlIHJldHJhw6fDo28gZG8gY29uc3VtbyBkYXMgZmFtw61saWFzLg0KDQpBaW5kYSBxdWUgYSBwb3B1bGHDp8OjbyBuYSBmb3LDp2EgZGUgdHJhYmFsaG8gdGVuaGEgbWFudGlkbyB0ZW5kw6puY2lhIGVzdHJ1dHVyYWwgZGUgY3Jlc2NpbWVudG8sIG8gY2hvcXVlIHJlY2Vzc2l2byBzZSB0cmFkdXppdSBlbSBpbmNhcGFjaWRhZGUgZGUgYWJzb3LDp8OjbyBkZXNzYSBtw6NvIGRlIG9icmEsIGFtcGxpYW5kbyBhIG9jaW9zaWRhZGUgZGEgZWNvbm9taWEgZSByZWR1emluZG8gbyBkaW5hbWlzbW8gZGEgZGVtYW5kYSBkb23DqXN0aWNhLg0KDQpOb3MgYW5vcyBzdWJzZXF1ZW50ZXMsIG9ic2Vydm91LXNlIGVzdGFiaWxpemHDp8OjbyBkbyBkZXNlbXByZWdvLCBwb3LDqW0gYWluZGEgZW0gbsOtdmVpcyBlbGV2YWRvcywgc3VwZXJpb3JlcyBhIDExJS4gQSByZWN1cGVyYcOnw6NvIGVjb27DtG1pY2EgbW9zdHJvdS1zZSBtb2RlcmFkYSBlIGluc3VmaWNpZW50ZSBwYXJhIHByb21vdmVyIHJlYWJzb3LDp8OjbyByw6FwaWRhIGRhIG3Do28gZGUgb2JyYSBkZXNlbXByZWdhZGEuIEEgbWFzc2Egc2FsYXJpYWwgYXByZXNlbnRvdSBjcmVzY2ltZW50byBsaW1pdGFkbywgcmVzdHJpbmdpbmRvIGEgY2FwYWNpZGFkZSBkZSBhY2VsZXJhw6fDo28gZG8gY29uc3Vtby4NCg0KTm9zIMO6bHRpbW9zIGFub3MsIGVudHJldGFudG8sIG8gbWVyY2FkbyBkZSB0cmFiYWxobyBhcHJlc2VudG91IG1lbGhvcmEgc2lnbmlmaWNhdGl2YS4gQSB0YXhhIGRlIGRlc29jdXBhw6fDo28gcmVjdW91IGRlIGZvcm1hIGNvbnNpc3RlbnRlIGUgZW5jZXJyb3UgbyBhbm8gZW0gYXByb3hpbWFkYW1lbnRlIDUsMSUsIG7DrXZlbCBoaXN0b3JpY2FtZW50ZSBiYWl4byBwYXJhIG9zIHBhZHLDtWVzIGRhIGVjb25vbWlhIGJyYXNpbGVpcmEuDQoNCkVzc2UgbW92aW1lbnRvIGVsZXZvdSBhIHJlbmRhIGRpc3BvbsOtdmVsIGRhcyBmYW3DrWxpYXMgZSBmb3J0YWxlY2V1IG8gY29uc3VtbyBkb23DqXN0aWNvLCBwcmluY2lwYWwgY29tcG9uZW50ZSBkbyBQSUIgYnJhc2lsZWlyby4gTyBtZXJjYWRvIGRlIHRyYWJhbGhvIGRlaXhvdSBkZSBhdHVhciBjb21vIHJlc3RyacOnw6NvIGFvIGNyZXNjaW1lbnRvIGUgcGFzc291IGEgZnVuY2lvbmFyIGNvbW8gbWVjYW5pc21vIGRlIHByb3BhZ2HDp8OjbyBkYSBhdGl2aWRhZGUgZWNvbsO0bWljYS4NCg0KQ29udHVkbywgYSBlY29ub21pYSBvcGVyYSBhdHVhbG1lbnRlIGNvbSBncmF1IHJlbGF0aXZhbWVudGUgcmVkdXppZG8gZGUgb2Npb3NpZGFkZS4gQWzDqW0gZG8gYmFpeG8gbsOtdmVsIGRlIGRlc2VtcHJlZ28sIGluZGljYWRvcmVzIGRlIHV0aWxpemHDp8OjbyBkYSBjYXBhY2lkYWRlIGluc3RhbGFkYSBkYSBpbmTDunN0cmlhIGFwb250YW0gcGFyYSBuw612ZWlzIHByw7N4aW1vcyBkYSBtw6lkaWEgaGlzdMOzcmljYSwgc2VndW5kbyBkYWRvcyBkYSBDb25mZWRlcmHDp8OjbyBOYWNpb25hbCBkYSBJbmTDunN0cmlhLiBBIHRheGEgZGUgdXRpbGl6YcOnw6NvIGRhIGNhcGFjaWRhZGUgaW5zdGFsYWRhIHRlbSBvc2NpbGFkbyBlbSB0b3JubyBkZSA3OCUgYSA4MCUsIGluZGljYW5kbyByZWR1w6fDo28gZGEgb2Npb3NpZGFkZSBwcm9kdXRpdmEuDQpFc3NlIGNlbsOhcmlvIGltcGxpY2E6DQptYWlvciBwcmVzc8OjbyBwb3RlbmNpYWwgc29icmUgc2Fsw6FyaW9zLCByZWR1w6fDo28gZGEgbWFyZ2VtIGRlIGNyZXNjaW1lbnRvIHZpYSBhYnNvcsOnw6NvIGFkaWNpb25hbCBkZSB0cmFiYWxoYWRvcmVzLCBtYWlvciBkZXBlbmTDqm5jaWEgZGUgZ2FuaG9zIGRlIHByb2R1dGl2aWRhZGUgZSBpbnZlc3RpbWVudG8gcGFyYSBzdXN0ZW50YXIgYSBleHBhbnPDo28gZnV0dXJhDQpOZXNzZSBjb250ZXh0bywgYSBjb250aW51aWRhZGUgZG8gY3Jlc2NpbWVudG8gZWNvbsO0bWljbyB0ZW5kZSBhIGV4aWdpciB1bWEgdHJhbnNpw6fDo28gcGFyYSB1bSBtb2RlbG8gbWFpcyBpbnRlbnNpdm8gZW0gcHJvZHV0aXZpZGFkZSwgaW52ZXN0aW1lbnRvIGUgZWZpY2nDqm5jaWEgYWxvY2F0aXZhLg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoaGlnaGNoYXJ0ZXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCg0KIyBDb2xldGFyIGRhZG9zDQojIElCQy1CciAoYXRpdmlkYWRlIGVjb27DtG1pY2EpIC0gY8OzZGlnbyAyNDM2Mw0KZGFkb3NfaWJjIDwtIGdldF9zZXJpZXMoMjQzNjMsIHN0YXJ0X2RhdGUgPSAiMjAyMC0wMS0wMSIsIGVuZF9kYXRlID0gU3lzLkRhdGUoKSkgJT4lIA0KICByZW5hbWUoSUJDID0gYDI0MzYzYCkNCg0KIyBUYXhhIGRlIGRlc29jdXBhw6fDo28gLSBQTkFEQyAtIGPDs2RpZ28gMjQzNjkNCmRhZG9zX2Rlc2VtcHJlZ28gPC0gZ2V0X3NlcmllcygyNDM2OSwgc3RhcnRfZGF0ZSA9ICIyMDIwLTAxLTAxIiwgZW5kX2RhdGUgPSBTeXMuRGF0ZSgpKSAlPiUgDQogIHJlbmFtZShEZXNlbXByZWdvID0gYDI0MzY5YCkNCg0KIyBDb21iaW5hciBkYWRvcw0KZGFkb3NfY29tYmluYWRvcyA8LSBkYWRvc19pYmMgJT4lDQogIGxlZnRfam9pbihkYWRvc19kZXNlbXByZWdvLCBieSA9ICJkYXRlIikgJT4lDQogIG11dGF0ZSgNCiAgICBhbm8gPSB5ZWFyKGRhdGUpLA0KICAgIG1lcyA9IG1vbnRoKGRhdGUsIGxhYmVsID0gVFJVRSwgYWJiciA9IEZBTFNFKSwNCiAgICB0aW1lc3RhbXAgPSBkYXRldGltZV90b190aW1lc3RhbXAoZGF0ZSkNCiAgKSAlPiUNCiAgc2VsZWN0KGRhdGUsIGFubywgbWVzLCB0aW1lc3RhbXAsIElCQywgRGVzZW1wcmVnbykgJT4lDQogIGFycmFuZ2UoZGF0ZSkNCg0KIyBWZXJpZmljYXIgZGFkb3MNCmlmKG5yb3coZGFkb3NfY29tYmluYWRvcykgPT0gMCkgew0KICBzdG9wKCJEYWRvcyBuw6NvIGVuY29udHJhZG9zLiBWZXJpZmlxdWUgb3MgY8OzZGlnb3MuIikNCn0NCg0KIyBDYWxjdWxhciBsaW1pdGVzIHBhcmEgZWl4b3MNCmliY19taW4gPC0gbWluKGRhZG9zX2NvbWJpbmFkb3MkSUJDLCBuYS5ybSA9IFRSVUUpDQppYmNfbWF4IDwtIG1heChkYWRvc19jb21iaW5hZG9zJElCQywgbmEucm0gPSBUUlVFKQ0KZGVzZW1wcmVnb19taW4gPC0gbWluKGRhZG9zX2NvbWJpbmFkb3MkRGVzZW1wcmVnbywgbmEucm0gPSBUUlVFKQ0KZGVzZW1wcmVnb19tYXggPC0gbWF4KGRhZG9zX2NvbWJpbmFkb3MkRGVzZW1wcmVnbywgbmEucm0gPSBUUlVFKQ0KDQojIE1hcmdlbSBkZSA1JQ0KaWJjX3JhbmdlIDwtIGliY19tYXggLSBpYmNfbWluDQpkZXNlbXByZWdvX3JhbmdlIDwtIGRlc2VtcHJlZ29fbWF4IC0gZGVzZW1wcmVnb19taW4NCg0KIyBDcmlhciBncsOhZmljbw0KaGlnaGNoYXJ0KHR5cGUgPSAic3RvY2siKSAlPiUNCiAgIyBTw6lyaWUgMTogSUJDLUJyIChsaW5oYSkgLSBlaXhvIGVzcXVlcmRvDQogIGhjX2FkZF9zZXJpZXMoDQogICAgZGF0YSA9IGxpc3RfcGFyc2UyKGRhZG9zX2NvbWJpbmFkb3MgJT4lIHNlbGVjdCh0aW1lc3RhbXAsIElCQykpLA0KICAgIHR5cGUgPSAibGluZSIsDQogICAgbmFtZSA9ICJJQkMtQnIgKGF0aXZpZGFkZSBlY29uw7RtaWNhKSIsDQogICAgY29sb3IgPSAiIzAyMDIzYyIsICAjIEF6dWwNCiAgICBsaW5lV2lkdGggPSAyLA0KICAgIG1hcmtlciA9IGxpc3QoZW5hYmxlZCA9IEZBTFNFKSwNCiAgICB5QXhpcyA9IDAsDQogICAgdG9vbHRpcCA9IGxpc3QodmFsdWVEZWNpbWFscyA9IDEpDQogICkgJT4lDQogICMgU8OpcmllIDI6IFRheGEgZGUgZGVzZW1wcmVnbyAobGluaGEpIC0gZWl4byBkaXJlaXRvDQogIGhjX2FkZF9zZXJpZXMoDQogICAgZGF0YSA9IGxpc3RfcGFyc2UyKGRhZG9zX2NvbWJpbmFkb3MgJT4lIHNlbGVjdCh0aW1lc3RhbXAsIERlc2VtcHJlZ28pKSwNCiAgICB0eXBlID0gImxpbmUiLA0KICAgIG5hbWUgPSAiVGF4YSBkZSBEZXNlbXByZWdvICglKSIsDQogICAgY29sb3IgPSAiI2ZlYjcxMiIsDQogICAgbGluZVdpZHRoID0gMiwNCiAgICBtYXJrZXIgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCByYWRpdXMgPSAyKSwNCiAgICB5QXhpcyA9IDEsDQogICAgdG9vbHRpcCA9IGxpc3QodmFsdWVEZWNpbWFscyA9IDEsIHZhbHVlU3VmZml4ID0gIiUiKQ0KICApICU+JQ0KICAjIENvbmZpZ3VyYXIgZWl4b3MgWSBkdWFpcyAoZWl4byBkbyBkZXNlbXByZWdvIGludmVydGlkbykNCiAgaGNfeUF4aXNfbXVsdGlwbGVzKA0KICAgIGxpc3QoDQogICAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJJQkMtQnIgKMOtbmRpY2UpIiksDQogICAgICBvcHBvc2l0ZSA9IEZBTFNFLA0KICAgICAgbGFiZWxzID0gbGlzdChmb3JtYXQgPSAie3ZhbHVlfSIpLA0KICAgICAgbWluID0gZmxvb3IoaWJjX21pbiAtIDAuMDUgKiBpYmNfcmFuZ2UpLA0KICAgICAgbWF4ID0gY2VpbGluZyhpYmNfbWF4ICsgMC4wNSAqIGliY19yYW5nZSkNCiAgICApLA0KICAgIGxpc3QoDQogICAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJUYXhhIGRlIERlc2VtcHJlZ28gKCUpIiksDQogICAgICBvcHBvc2l0ZSA9IFRSVUUsDQogICAgICBsYWJlbHMgPSBsaXN0KGZvcm1hdCA9ICJ7dmFsdWV9JSIpLA0KICAgICAgbWluID0gZmxvb3IoZGVzZW1wcmVnb19taW4gLSAwLjA1ICogZGVzZW1wcmVnb19yYW5nZSksDQogICAgICBtYXggPSBjZWlsaW5nKGRlc2VtcHJlZ29fbWF4ICsgMC4wNSAqIGRlc2VtcHJlZ29fcmFuZ2UpLA0KICAgICAgcmV2ZXJzZWQgPSBUUlVFICAjIElOVkVSVEUgTyBFSVhPOiBkZXNlbXByZWdvIGNhaW5kbyA9IGxpbmhhIHN1YmluZG8NCiAgICApDQogICkgJT4lDQogIGhjX3hBeGlzKA0KICAgIHR5cGUgPSAnZGF0ZXRpbWUnLA0KICAgIGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gJ3t2YWx1ZTolYiAlWX0nKQ0KICApICU+JQ0KICBoY190aXRsZSh0ZXh0ID0gIkF0aXZpZGFkZSBFY29uw7RtaWNhIHZzLiBNZXJjYWRvIGRlIFRyYWJhbGhvIikgJT4lDQogIGhjX3N1YnRpdGxlKHRleHQgPSAiSUJDLUJyICjDrW5kaWNlKSBlIFRheGEgZGUgRGVzZW1wcmVnbyAoJSkgLSBEYWRvcyBtZW5zYWlzIikgJT4lDQogIGhjX2NyZWRpdHMoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgdGV4dCA9ICJGb250ZTogQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwgKGPDs2QuIDI0MzYzKSBlIElCR0UvUE5BREMgKGPDs2QuIDI0MzY5KSINCiAgKSAlPiUNCiAgaGNfcmFuZ2VTZWxlY3RvcigNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBidXR0b25zID0gbGlzdCgNCiAgICAgIGxpc3QodHlwZSA9ICd5ZWFyJywgY291bnQgPSAxLCB0ZXh0ID0gJzFZJyksDQogICAgICBsaXN0KHR5cGUgPSAneWVhcicsIGNvdW50ID0gMiwgdGV4dCA9ICcyWScpLA0KICAgICAgbGlzdCh0eXBlID0gJ3llYXInLCBjb3VudCA9IDMsIHRleHQgPSAnM1knKSwNCiAgICAgIGxpc3QodHlwZSA9ICdhbGwnLCB0ZXh0ID0gJ1RvZG8gcGVyw61vZG8nKQ0KICAgICksDQogICAgc2VsZWN0ZWQgPSAyDQogICkgJT4lDQogIGhjX3Rvb2x0aXAoDQogICAgc2hhcmVkID0gVFJVRSwNCiAgICBoZWFkZXJGb3JtYXQgPSAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJweCI+PGI+e3BvaW50LmtleX08L2I+PC9zcGFuPjxici8+JywNCiAgICBwb2ludEZvcm1hdCA9ICc8c3BhbiBzdHlsZT0iY29sb3I6e3Nlcmllcy5jb2xvcn0iPuKXjzwvc3Bhbj4ge3Nlcmllcy5uYW1lfTogPGI+e3BvaW50Lnk6LjFmfXtzZXJpZXMudG9vbHRpcE9wdGlvbnMudmFsdWVTdWZmaXh9PC9iPjxici8+Jw0KICApICU+JQ0KICBoY19sZWdlbmQoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgYWxpZ24gPSAiY2VudGVyIiwNCiAgICB2ZXJ0aWNhbEFsaWduID0gImJvdHRvbSIsDQogICAgbGF5b3V0ID0gImhvcml6b250YWwiDQogICkgJT4lDQogIGhjX3Bsb3RPcHRpb25zKA0KICAgIGxpbmUgPSBsaXN0KA0KICAgICAgYW5pbWF0aW9uID0gVFJVRSwNCiAgICAgIGNvbm5lY3ROdWxscyA9IFRSVUUNCiAgICApDQogICkNCmBgYA0KIyMgKlJlbmRhIGUgQ29uc3VtbyBkYXMgRmFtw61saWFzKg0KDQpSZW5kYSBlIENvbnN1bW8gZGFzIEZhbcOtbGlhcw0KDQpBY2VyY2EgZG8gY29uc3VtbyBlIGRhIHJlbmRhIGRhcyBmYW3DrWxpYXMsIGFwZXNhciBkZSB1bSBjZW7DoXJpbyBkZSBqdXJvcyBlbGV2YWRvcywgbyBjb25zdW1vIGRvbcOpc3RpY28gbWFudGV2ZS1zZSByZWxhdGl2YW1lbnRlIHJlc2lsaWVudGUgYW8gbG9uZ28gZG8gcGVyw61vZG8sIHN1c3RlbnRhZG8gcHJpbmNpcGFsbWVudGUgcG9yIHVtIG1lcmNhZG8gZGUgdHJhYmFsaG8gYXF1ZWNpZG8gZSBwb3IgZ2FuaG9zIHJlYWlzIGRlIHJlbmRhLg0KDQpEYWRvcyByZWNlbnRlcyBpbmRpY2FtIHF1ZSBhIHRheGEgZGUgZGVzZW1wcmVnbyBubyBCcmFzaWwgZW5jZXJyb3UgbyBhbm8gZW0gYXByb3hpbWFkYW1lbnRlIDUsMSUsIHNlZ3VuZG8gbyBJbnN0aXR1dG8gQnJhc2lsZWlybyBkZSBHZW9ncmFmaWEgZSBFc3RhdMOtc3RpY2EsIGVucXVhbnRvIGEgbWFzc2EgZGUgcmVuZGltZW50byByZWFsIGhhYml0dWFsIGRvIHRyYWJhbGhvIGFwcmVzZW50b3UgY3Jlc2NpbWVudG8gY29uc2lzdGVudGUsIHJlZmxldGluZG8gdGFudG8gYSBleHBhbnPDo28gZG8gZW1wcmVnbyBxdWFudG8gYSByZWN1cGVyYcOnw6NvIGRvIHBvZGVyIGRlIGNvbXByYSBkYSBwb3B1bGHDp8Ojby4NCg0KRXNzZSBhdmFuw6dvIGRhIHJlbmRhIHJlYWwgdGVuZGUgYSBzdXN0ZW50YXIgbyBjb25zdW1vIGRhcyBmYW3DrWxpYXMgbWVzbW8gZW0gdW0gYW1iaWVudGUgZGUgY3LDqWRpdG8gbWFpcyByZXN0cml0aXZvLCB1bWEgdmV6IHF1ZSBwYXJjZWxhIHJlbGV2YW50ZSBkbyBjb25zdW1vIGRvbcOpc3RpY28gZXN0w6EgYXNzb2NpYWRhIMOgIHJlbmRhIGNvcnJlbnRlLg0KDQpPdXRybyBmYXRvciByZWxldmFudGUgZm9pIG8gYXJyZWZlY2ltZW50byBkYSBpbmZsYcOnw6NvIGRlIGFsaW1lbnRvcywgcXVlIGNvbnRyaWJ1aXUgcGFyYSByZWR1emlyIHByZXNzw7VlcyBzb2JyZSBvIG9yw6dhbWVudG8gZGFzIGZhbcOtbGlhcy4gQSBjb21iaW5hw6fDo28gZGUgY29uZGnDp8O1ZXMgY2xpbcOhdGljYXMgbWFpcyBmYXZvcsOhdmVpcyBwYXJhIGEgcHJvZHXDp8OjbyBhZ3LDrWNvbGEsIGp1bnRhbWVudGUgY29tIHVtIGPDom1iaW8gcmVsYXRpdmFtZW50ZSBlc3TDoXZlbCwgYWp1ZG91IGEgY29udGVyIG8gY3VzdG8gZGUgaXRlbnMgYWxpbWVudMOtY2lvcyBhbyBsb25nbyBkbyBhbm8sIGxpYmVyYW5kbyBwYXJjZWxhIG1haW9yIGRhIHJlbmRhIGRpc3BvbsOtdmVsIHBhcmEgb3V0cm9zIHRpcG9zIGRlIGNvbnN1bW8uDQoNCkVzc2UgbW92aW1lbnRvIHRldmUgaW1wYWN0byBkaXJldG8gc29icmUgaW5kaWNhZG9yZXMgZGUgYXRpdmlkYWRlIGxpZ2Fkb3MgYW8gY29uc3VtbywgZXNwZWNpYWxtZW50ZSBubyB2YXJlam8gYW1wbGlhZG8uDQoNCkNvbW8gcmVmbGV4byBkZXNzZXMgZmF0b3JlcywgaW5kaWNhZG9yZXMgZGUgY29uc3VtbyBtb3N0cmFyYW0gZGVzZW1wZW5obyBwb3NpdGl2byBubyBmaW5hbCBkbyBhbm8uIEVtIGRlemVtYnJvLCBvIGNvbnN1bW8gYXZhbsOnb3UgMTUsNjklLCByZWdpc3RyYW5kbyBjcmVzY2ltZW50byBleHByZXNzaXZvIGVtIGNvbXBhcmHDp8OjbyBhbyBtZXNtbyBwZXLDrW9kbyBkZSAyMDI0LCByZWZvcsOnYW5kbyBhIGlkZWlhIGRlIHF1ZSBhIGNvbWJpbmHDp8OjbyBlbnRyZSBleHBhbnPDo28gZG8gZW1wcmVnbywgcmVjdXBlcmHDp8OjbyBkYSByZW5kYSByZWFsIGUgZGVzYWNlbGVyYcOnw6NvIGluZmxhY2lvbsOhcmlhIGNvbnRyaWJ1aXUgcGFyYSBzdXN0ZW50YXIgYSBkZW1hbmRhIGRvbcOpc3RpY2EgbWVzbW8gZW0gdW0gYW1iaWVudGUgZGUgcG9sw610aWNhIG1vbmV0w6FyaWEgYWluZGEgcmVzdHJpdGl2YS4NCg0KQ29udHVkbywgw6kgaW1wb3J0YW50ZSBjb25zaWRlcmFyIHF1ZSAyMDI2IHNlcsOhIHVtIGFubyBlbGVpdG9yYWwsIG8gcXVlIGhpc3RvcmljYW1lbnRlIHRlbmRlIGEgZWxldmFyIG8gZ3JhdSBkZSBpbmNlcnRlemEgZWNvbsO0bWljYSBubyBCcmFzaWwuIEVwaXPDs2Rpb3MgcGFzc2Fkb3MgaWx1c3RyYW0gZXNzZSBwYWRyw6NvLg0KDQpFbSAyMDE0LCBwb3IgZXhlbXBsbywgbyBwcm9jZXNzbyBlbGVpdG9yYWwgZm9pIGFjb21wYW5oYWRvIHBvciBkZXRlcmlvcmHDp8OjbyBkYXMgZXhwZWN0YXRpdmFzIGZpc2NhaXMgZSBhdW1lbnRvIGRhIHZvbGF0aWxpZGFkZSBub3MgbWVyY2Fkb3MgZmluYW5jZWlyb3MsIGNvbnRyaWJ1aW5kbyBwYXJhIGEgZGVzYWNlbGVyYcOnw6NvIGRhIGF0aXZpZGFkZSBlY29uw7RtaWNhLiBPIFBJQiBjcmVzY2V1IGFwZW5hcyAwLDUlIG5hcXVlbGUgYW5vLCBhcMOzcyBleHBhbnPDo28gZGUgMywwJSBlbSAyMDEzLg0KDQpEZSBmb3JtYSBzZW1lbGhhbnRlLCBlbSAyMDE4LCBvIHBlcsOtb2RvIGVsZWl0b3JhbCB0YW1iw6ltIGZvaSBtYXJjYWRvIHBvciBlbGV2YWRhIGluY2VydGV6YSBwb2zDrXRpY2EgZSB2b2xhdGlsaWRhZGUgY2FtYmlhbCwgbGV2YW5kbyBlbXByZXNhcyBlIGludmVzdGlkb3JlcyBhIGFkb3RhciBwb3N0dXJhIG1haXMgY2F1dGVsb3NhIGVtIHJlbGHDp8OjbyBhIGludmVzdGltZW50b3MgZSBkZWNpc8O1ZXMgZGUgY29uc3VtbyBkZSBtYWlvciB2YWxvci4NCg0KRXNzZSBjb21wb3J0YW1lbnRvIG9jb3JyZSBwb3JxdWUgYW5vcyBlbGVpdG9yYWlzIGF1bWVudGFtIGEgaW5jZXJ0ZXphIHNvYnJlIGEgY29uZHXDp8OjbyBmdXR1cmEgZGEgcG9sw610aWNhIGVjb27DtG1pY2EsIGVzcGVjaWFsbWVudGUgZW0gcmVsYcOnw6NvIMOgIHBvbMOtdGljYSBmaXNjYWwsIHJlZm9ybWFzIGVzdHJ1dHVyYWlzIGUgZGlyZXRyaXplcyByZWd1bGF0w7NyaWFzLg0KDQpEZXNzYSBmb3JtYSwgZW1ib3JhIG9zIGZ1bmRhbWVudG9zIGRvIG1lcmNhZG8gZGUgdHJhYmFsaG8gZSBkYSByZW5kYSBhaW5kYSBjb250cmlidWFtIHBhcmEgc3VzdGVudGFyIG8gY29uc3VtbyBkYXMgZmFtw61saWFzLCBhIHByb3hpbWlkYWRlIGRvIHByb2Nlc3NvIGVsZWl0b3JhbCBkZSAyMDI2IHBvZGUgaW50cm9kdXppciB1bSBncmF1IGFkaWNpb25hbCBkZSBjYXV0ZWxhIG5vIGNvbXBvcnRhbWVudG8gZGUgY29uc3VtaWRvcmVzIGUgaW52ZXN0aWRvcmVzLCByZWZvcsOnYW5kbyBhIGV4cGVjdGF0aXZhIGRlIGNyZXNjaW1lbnRvIGVjb27DtG1pY28gbWFpcyBtb2RlcmFkbyBhbyBsb25nbyBkbyBwZXLDrW9kby4NCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQoNCiMgQ29sZXRhciBkYWRvcyBkbyBDb25zdW1vIGRhcyBGYW3DrWxpYXMgKDIyMTAwKQ0KZGFkb3NfY29uc3VtbyA8LSBnZXRfc2VyaWVzKDIyMTAwLCBzdGFydF9kYXRlID0gIjIwMjAtMDEtMDEiLCBlbmRfZGF0ZSA9IFN5cy5EYXRlKCkpICU+JSANCiAgcmVuYW1lKENvbnN1bW9fZmFtaWxpYXMgPSBgMjIxMDBgKQ0KDQojIENvbGV0YXIgZGFkb3MgZGEgUmVuZGEgZGFzIEZhbcOtbGlhcyAoMjkwMjgpDQpkYWRvc19yZW5kYSA8LSBnZXRfc2VyaWVzKDI5MDI4LCBzdGFydF9kYXRlID0gIjIwMjAtMDEtMDEiLCBlbmRfZGF0ZSA9IFN5cy5EYXRlKCkpICU+JSANCiAgcmVuYW1lKFJlbmRhX2ZhbWlsaWFzID0gYDI5MDI4YCkNCg0KIyBQcmVwYXJhciBkYWRvcyBkZSBDT05TVU1PDQpkYWRvc19jb25zdW1vX3RyaW0gPC0gZGFkb3NfY29uc3VtbyAlPiUNCiAgbXV0YXRlKA0KICAgIGFubyA9IHllYXIoZGF0ZSksDQogICAgdHJpbWVzdHJlID0gcXVhcnRlcihkYXRlLCB3aXRoX3llYXIgPSBGQUxTRSksDQogICAgdGltZXN0YW1wID0gZGF0ZXRpbWVfdG9fdGltZXN0YW1wKGRhdGUpLA0KICAgIGluZGljZV9jb25zdW1vID0gcm91bmQoMTAwICogQ29uc3Vtb19mYW1pbGlhcyAvIGZpcnN0KENvbnN1bW9fZmFtaWxpYXMpLCAxKQ0KICApICU+JQ0KICBzZWxlY3QoZGF0ZSwgdGltZXN0YW1wLCBpbmRpY2VfY29uc3VtbykNCg0KIyBQcmVwYXJhciBkYWRvcyBkZSBSRU5EQQ0KZGFkb3NfcmVuZGFfdHJpbSA8LSBkYWRvc19yZW5kYSAlPiUNCiAgbXV0YXRlKA0KICAgIGFubyA9IHllYXIoZGF0ZSksDQogICAgdHJpbWVzdHJlID0gcXVhcnRlcihkYXRlLCB3aXRoX3llYXIgPSBGQUxTRSksDQogICAgdGltZXN0YW1wID0gZGF0ZXRpbWVfdG9fdGltZXN0YW1wKGRhdGUpLA0KICAgIGluZGljZV9yZW5kYSA9IHJvdW5kKDEwMCAqIFJlbmRhX2ZhbWlsaWFzIC8gZmlyc3QoUmVuZGFfZmFtaWxpYXMpLCAxKQ0KICApICU+JQ0KICBzZWxlY3QoZGF0ZSwgdGltZXN0YW1wLCBpbmRpY2VfcmVuZGEpDQoNCiMgQ29tYmluYXIgZGFkb3MNCmRhZG9zX2NvbWJpbmFkb3MgPC0gZGFkb3NfY29uc3Vtb190cmltICU+JQ0KICBsZWZ0X2pvaW4oZGFkb3NfcmVuZGFfdHJpbSwgYnkgPSBjKCJkYXRlIiwgInRpbWVzdGFtcCIpKQ0KDQojIFZlcmlmaWNhciBkYWRvcw0KaWYobnJvdyhkYWRvc19jb21iaW5hZG9zKSA9PSAwKSB7DQogIHN0b3AoIkRhZG9zIG7Do28gZW5jb250cmFkb3MuIFZlcmlmaXF1ZSBvcyBjw7NkaWdvcy4iKQ0KfQ0KDQojIENhbGN1bGFyIGxpbWl0ZXMgZG8gZWl4byBZIChjb25zaWRlcmFuZG8gYW1iYXMgYXMgc8OpcmllcykNCnlfbWluIDwtIG1pbihjKGRhZG9zX2NvbWJpbmFkb3MkaW5kaWNlX2NvbnN1bW8sIGRhZG9zX2NvbWJpbmFkb3MkaW5kaWNlX3JlbmRhKSwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KGMoZGFkb3NfY29tYmluYWRvcyRpbmRpY2VfY29uc3VtbywgZGFkb3NfY29tYmluYWRvcyRpbmRpY2VfcmVuZGEpLCBuYS5ybSA9IFRSVUUpDQp5X3JhbmdlIDwtIHlfbWF4IC0geV9taW4NCnlfbWluX2FqdXN0YWRvIDwtIGZsb29yKHlfbWluIC0gMC4wNSAqIHlfcmFuZ2UpDQp5X21heF9hanVzdGFkbyA8LSBjZWlsaW5nKHlfbWF4ICsgMC4wNSAqIHlfcmFuZ2UpDQoNCiMgQ3JpYXIgZ3LDoWZpY28gY29tYmluYWRvDQpoaWdoY2hhcnQodHlwZSA9ICJzdG9jayIpICU+JQ0KICAjIFPDqXJpZTogQ29uc3VtbyAoY29sdW5hcykgLSBBWlVMDQogIGhjX2FkZF9zZXJpZXMoDQogICAgZGF0YSA9IGxpc3RfcGFyc2UyKGRhZG9zX2NvbWJpbmFkb3MgJT4lIHNlbGVjdCh0aW1lc3RhbXAsIGluZGljZV9jb25zdW1vKSksDQogICAgdHlwZSA9ICJjb2x1bW4iLA0KICAgIG5hbWUgPSAiQ29uc3VtbyBkYXMgRmFtw61saWFzIiwNCiAgICBjb2xvciA9ICIjMDIwMjNjIiwNCiAgICB5QXhpcyA9IDAsDQogICAgdG9vbHRpcCA9IGxpc3QodmFsdWVEZWNpbWFscyA9IDEpDQogICkgJT4lDQogICMgU8OpcmllOiBSZW5kYSAobGluaGEpIC0gRE9VUkFETw0KICBoY19hZGRfc2VyaWVzKA0KICAgIGRhdGEgPSBsaXN0X3BhcnNlMihkYWRvc19jb21iaW5hZG9zICU+JSBzZWxlY3QodGltZXN0YW1wLCBpbmRpY2VfcmVuZGEpKSwNCiAgICB0eXBlID0gImxpbmUiLA0KICAgIG5hbWUgPSAiUmVuZGEgZGFzIEZhbcOtbGlhcyIsDQogICAgY29sb3IgPSAiI2ZlYjcxMiIsDQogICAgbGluZVdpZHRoID0gMywNCiAgICBtYXJrZXIgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCByYWRpdXMgPSAzKSwNCiAgICB5QXhpcyA9IDAsDQogICAgdG9vbHRpcCA9IGxpc3QodmFsdWVEZWNpbWFscyA9IDEpDQogICkgJT4lDQogIGhjX3lBeGlzKA0KICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIsONbmRpY2UgKDHCuiBUcmltLzIwMjAgPSAxMDApIiksDQogICAgb3Bwb3NpdGUgPSBGQUxTRSwNCiAgICBsYWJlbHMgPSBsaXN0KGZvcm1hdCA9ICJ7dmFsdWV9IiksDQogICAgbWluID0geV9taW5fYWp1c3RhZG8sDQogICAgbWF4ID0geV9tYXhfYWp1c3RhZG8sDQogICAgcGxvdExpbmVzID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHZhbHVlID0gMTAwLA0KICAgICAgICBjb2xvciA9ICIjNjY2NjY2IiwNCiAgICAgICAgZGFzaFN0eWxlID0gImRhc2giLA0KICAgICAgICB3aWR0aCA9IDEsDQogICAgICAgIGxhYmVsID0gbGlzdCh0ZXh0ID0gIkJhc2UgKDHCuiBUcmltLzIwMjApIikNCiAgICAgICkNCiAgICApDQogICkgJT4lDQogIGhjX3hBeGlzKA0KICAgIHR5cGUgPSAnZGF0ZXRpbWUnLA0KICAgIGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gJ3t2YWx1ZTolWX0nKQ0KICApICU+JQ0KICBoY190aXRsZSh0ZXh0ID0gIlJlbmRhIHZzLiBDb25zdW1vIGRhcyBGYW3DrWxpYXMiKSAlPiUNCiAgaGNfc3VidGl0bGUodGV4dCA9ICLDjW5kaWNlIEJhc2U6IDHCuiBUcmltZXN0cmUvMjAyMCA9IDEwMCAtIERhZG9zIFRyaW1lc3RyYWlzIikgJT4lDQogIGhjX2NyZWRpdHMoDQogICAgZW5hYmxlZCA9IFRSVUUsDQogICAgdGV4dCA9ICJGb250ZTogQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwgKFNHUyAtIEPDs2RpZ29zOiAyMjEwMCBlIDI5MDI4KSINCiAgKSAlPiUNCiAgaGNfcmFuZ2VTZWxlY3RvcigNCiAgICBlbmFibGVkID0gVFJVRSwNCiAgICBidXR0b25zID0gbGlzdCgNCiAgICAgIGxpc3QodHlwZSA9ICd5ZWFyJywgY291bnQgPSAxLCB0ZXh0ID0gJzFZJyksDQogICAgICBsaXN0KHR5cGUgPSAneWVhcicsIGNvdW50ID0gMiwgdGV4dCA9ICcyWScpLA0KICAgICAgbGlzdCh0eXBlID0gJ3llYXInLCBjb3VudCA9IDMsIHRleHQgPSAnM1knKSwNCiAgICAgIGxpc3QodHlwZSA9ICdhbGwnLCB0ZXh0ID0gJ1RvZG8gcGVyw61vZG8nKQ0KICAgICksDQogICAgc2VsZWN0ZWQgPSAyDQogICkgJT4lDQogIGhjX3Rvb2x0aXAoDQogICAgc2hhcmVkID0gVFJVRSwNCiAgICBoZWFkZXJGb3JtYXQgPSAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJweCI+PGI+e3BvaW50LmtleX08L2I+PC9zcGFuPjxici8+JywNCiAgICBwb2ludEZvcm1hdCA9ICc8c3BhbiBzdHlsZT0iY29sb3I6e3Nlcmllcy5jb2xvcn0iPuKXjzwvc3Bhbj4ge3Nlcmllcy5uYW1lfTogPGI+e3BvaW50Lnk6LjFmfTwvYj48YnIvPicNCiAgKSAlPiUNCiAgaGNfbGVnZW5kKA0KICAgIGVuYWJsZWQgPSBUUlVFLA0KICAgIGFsaWduID0gImNlbnRlciIsDQogICAgdmVydGljYWxBbGlnbiA9ICJib3R0b20iLA0KICAgIGxheW91dCA9ICJob3Jpem9udGFsIg0KICApICU+JQ0KICBoY19wbG90T3B0aW9ucygNCiAgICBjb2x1bW4gPSBsaXN0KA0KICAgICAgcG9pbnRQYWRkaW5nID0gMC4xLA0KICAgICAgZ3JvdXBQYWRkaW5nID0gMC4wNSwNCiAgICAgIGJvcmRlcldpZHRoID0gMC41DQogICAgKSwNCiAgICBsaW5lID0gbGlzdCgNCiAgICAgIGFuaW1hdGlvbiA9IFRSVUUsDQogICAgICBjb25uZWN0TnVsbHMgPSBUUlVFDQogICAgKQ0KICApDQpgYGANCiMjIFJFRkVSw4pOQ0lBUw0KDQpJTkZPTU9ORVkuIFBJQiAyMDI2OiBvIGFubyBlbSBxdWUgYSBlY29ub21pYSBuw6NvIGRlc2FiYSwgbWFzIHRhbWLDqW0gbsOjbyBkZWNvbGEuIFPDo28gUGF1bG86IEluZm9Nb25leSwgMjAyNi4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL3d3dy5pbmZvbW9uZXkuY29tLmJyL2Vjb25vbWlhL3BpYi0yMDI2LW8tYW5vLWVtLXF1ZS1hLWVjb25vbWlhLW5hby1kZXNhYmEtbWFzLXRhbWJlbS1uYW8tZGVjb2xhLz4NCi4gQWNlc3NvIGVtOiAwNSBtYXIuIDIwMjYuDQoNCklORk9NT05FWS4gU2VydmnDp29zOiBzZXRvciByZWN1YSBlbSBkZXplbWJybyBkZSAyMDI1LCBhcG9udGEgSUJHRSwgY29tIGltcGFjdG8gZGUganVyb3MgZWxldmFkb3MuIFPDo28gUGF1bG86IEluZm9Nb25leSwgMjAyNi4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL3d3dy5pbmZvbW9uZXkuY29tLmJyL2Vjb25vbWlhL3NlcnZpY29zLWliZ2UtZGV6ZW1icm8tMjAyNS1xdWVkYS1qdXJvcy8+DQouIEFjZXNzbyBlbTogMDUgbWFyLiAyMDI2Lg0KDQpFTVBSRVNBIEJSQVNJTCBERSBDT01VTklDQcOHw4NPLiBQcsOpdmlhIGRvIFBJQiBhcG9udGEgY3Jlc2NpbWVudG8gZGUgMiw1JSBkYSBlY29ub21pYSBicmFzaWxlaXJhIGVtIDIwMjUuIEJyYXPDrWxpYSwgREY6IEFnw6puY2lhIEJyYXNpbCwgMjAyNi4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL2FnZW5jaWFicmFzaWwuZWJjLmNvbS5ici9lY29ub21pYS9ub3RpY2lhLzIwMjYtMDIvcHJldmlhLWRvLXBpYi1hcG9udGEtY3Jlc2NpbWVudG8tZGUtMjUtZGEtZWNvbm9taWEtYnJhc2lsZWlyYS1lbS0yMDI1Pg0KLiBBY2Vzc28gZW06IDA1IG1hci4gMjAyNi4NCg0KRlVOREHDh8ODTyBHRVRVTElPIFZBUkdBUy4gRWNvbm9taWEgY3Jlc2NldSAyLDIlIGVtIDIwMjUsIHNlZ3VuZG8gbyBNb25pdG9yIGRvIFBJQi1GR1YuIFJpbyBkZSBKYW5laXJvOiBGR1YgSUJSRSwgMjAyNi4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL3BvcnRhbGlicmUuZmd2LmJyL25vdGljaWFzL2Vjb25vbWlhLWNyZXNjZXUtMjItZW0tMjAyNS1zZWd1bmRvLW8tbW9uaXRvci1kby1waWItZmd2Pg0KLiBBY2Vzc28gZW06IDA1IG1hci4gMjAyNi4NCg0KWFAgSU5WRVNUSU1FTlRPUy4gQnJhc2lsIE1hY3JvIE1lbnNhbDogY3Jlc2NpbWVudG8gbWFpcyBmb3J0ZSBlIGluZmxhw6fDo28gbWFpcyBiYWl4YS4gU8OjbyBQYXVsbzogWFAgSW52ZXN0aW1lbnRvcywgMjAyNi4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL2NvbnRldWRvcy54cGkuY29tLmJyL2Vjb25vbWlhL2JyYXNpbC1tYWNyby1tZW5zYWwtY3Jlc2NpbWVudG8tbWFpcy1mb3J0ZS1pbmZsYWNhby1tYWlzLWJhaXhhLz4NCi4gQWNlc3NvIGVtOiAwNSBtYXIuIDIwMjYuDQoNCkVESVRPUkEgQUJSSUwuIEF0aXZpZGFkZSBlY29uw7RtaWNhIGJyYXNpbGVpcmEgY3Jlc2NlIDIsNSUgZW0gMjAyNS4gU8OjbyBQYXVsbzogVm9jw6ogUy9BLCAyMDI2LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vdm9jZXNhLmFicmlsLmNvbS5ici9lY29ub21pYS9hdGl2aWRhZGUtZWNvbm9taWNhLWJyYXNpbGVpcmEtY3Jlc2NlLTI1LWVtLTIwMjUvPg0KLiBBY2Vzc28gZW06IDA1IG1hci4gMjAyNi4NCg0KQkFOQ08gQ0VOVFJBTCBETyBCUkFTSUwuIMONbmRpY2UgZGUgQXRpdmlkYWRlIEVjb27DtG1pY2EgZG8gQmFuY28gQ2VudHJhbCAoSUJDLUJyKS4gQnJhc8OtbGlhLCBERjogQkNCLCAyMDI2LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vd3d3LmJjYi5nb3YuYnIvZXN0YXRpc3RpY2FzL2liYy1icj4NCi4gQWNlc3NvIGVtOiAwNSBtYXIuIDIwMjYNCg0KSU5TVElUVVRPIEJSQVNJTEVJUk8gREUgR0VPR1JBRklBIEUgRVNUQVTDjVNUSUNBLiBJbmRpY2Fkb3JlcyBlY29uw7RtaWNvcyBlIHNvY2lhaXMuIFJpbyBkZSBKYW5laXJvOiBJQkdFLCAyMDI2LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vd3d3LmliZ2UuZ292LmJyL2luZGljYWRvcmVzPg0KLiBBY2Vzc28gZW06IDA1IG1hci4gMjAyNi4NCg==