1 Proposta de projeto

O objetivo desse projeto é demonstrar minhas habilidades com R em manipulação e estruturação de dados, bem como uma análise dos dados apresentados. Com isso em vista, vou deixar exposto boa parte dos códigos, mas não todos para que não fique muito repetitivo. Devo ressaltar que embora presente em algumas tabelas, a etnia “amarela ou indígena” não será apresentada no relatório final, uma vez que hpá uma quantidade grande de outliers e que acabam inviesando a análise.

Todos os arquivos utilizados nesse projetos podem ser encontrados no link abaixo.
link para os arquivos

1.1 Método de Análises

No decorrer da análise vou fazer várias previsões de população, pois nem todas as tabelas apresentam dados de 2019. Para previsão da população, vou me basear no método aritmético presente no livro de Marcos Von Sperling (Von Sperling 2014).

Método aritmético

Este método pressupõe uma taxa de crescimento constante para os anos que se seguem, a partir de dados conhecidos, por exemplo, a população do último censo. Matematicamente, pode ser representado da seguinte forma:

\[\frac{dP}{dt} = k_a\] nos quais dP/dt representa a variação da população (P) por unidade de tempo (t), e ka éuma constante. Considerando que P1 é a população do penúltimo censo (ano t1) e P2, a população do último censo (ano t2), tem-se:

\[\int_{P_2}^{P_1} = k_a\int_{t_1}^{t_2}dt\]

Integrando entre os limites definidos, tem-se:

\[P_2-P_1 = k_a(t_2-t_1)\] \[k_a = \frac{P_2-P_1}{t_2-t_1}\]

Utilizando-se a equação, chega-se à expressão geral do método aritmético:

\[P=P_2 + k_n(t-t_2)\]

onde t representa o ano da projeção.

Este método admite que a população varie linearmente com o tempo e pode ser utilizado para a previsão populacional para um período pequeno, de 1 a 5 anos. Para previsão por período muito longo, toma-se acentuada a discrepância com a realidade histórica, uma vez que o crescimento é pressuposto ilimitado.

Para aplicar essa fórmula do método aritmético, vou usar essa função logo a baixo.

formula <- function(P2, t2, P0, t0, t) {
  Ka <- (P2 - P0) / (t2 - t0)
  Pt <- P2 + Ka * (t - t2)
  return(Pt)
}

1.2 Preparação do Ambiente R

Antes de mais nada, vou carregar os pacotes que vou usar para manipular os dados, fazer análises e gerar esse relatório.

knitr::opts_chunk$set(cache= TRUE, warning=FALSE, message=FALSE)
library(foreign)
library(lmtest)
library(readxl)
library(writexl)
library(stringi)
library(stringr)
library(purrr)
library(tidyverse)
library(knitr)
library(markdown)
library(kableExtra)
library(htmltools)
library(rstatix)                                
library(emmeans)

2 O INFOPEN

“O Infopen é um sistema de informações estatísticas do sistema penitenciário brasileiro. O sistema, atualizado pelos gestores dos estabelecimentos desde 2004, sintetiza informações sobre os estabelecimentos penais e a população prisional. Em 2014, o DEPEN reformulou a metodologia utilizada, com vistas a modernizar o instrumento de coleta e ampliar o leque de informações coletadas. O tratamento dos dados permitiu amplo diagnóstico da realidade estudada, mas que não esgotam, de forma alguma, todas as possibilidades de análise.”

2.1 Carregamentos dos Dados Iniciais Passo a Passo

Primeiro vou criar um dicionário de estados que vou usar. Fiz isso afim de padroniazar os nomes dos estados, pois algumas tabelas apresentam os nomes completos, outras apresentam apenas as siglas dos estados.

head(uf_dict, 20)
##                Acre             Alagoas               Amapá            Amazonas 
##                "AC"                "AL"                "AP"                "AM" 
##               Bahia               Ceará    Distrito Federal      Espírito Santo 
##                "BA"                "CE"                "DF"                "ES" 
##               Goiás            Maranhão         Mato Grosso  Mato Grosso do Sul 
##                "GO"                "MA"                "MT"                "MS" 
##        Minas Gerais                Pará             Paraíba              Paraná 
##                "MG"                "PA"                "PB"                "PR" 
##          Pernambuco               Piauí      Rio de Janeiro Rio Grande do Norte 
##                "PE"                "PI"                "RJ"                "RN"

Aqui a lista de colunas que vou estrair das tabelas do INFOPEN. Criei essa lista usando manipulação com Excel.

Fazer um loop nos arquivos das tabelas do INFOPEN e listar os nomes deles

Combinar o diretorio ao nome do arquivo

arquivos_infopen <- str_c("INFOPEN/tabelas excel/",nome_dos_arquivos_infopen)

Dar nome a cada elemento do vetor

names(arquivos_infopen) <- gsub("\\.xlsx$", "", nome_dos_arquivos_infopen)

Aplicar a função read_excel para cada elemento do vetor importando assim todos os arquivos de uma só vez

infopen_br<- map_df(.x = arquivos_infopen, .f = read_excel, .id = "data") %>% 
  select("UF",data, all_of(colunas))

2.2 Reconhecendo a Tabela

As tabelas do INFOPEN apresentam dados em painel, onde cada individo é representado mais de uma vez.

Cada tabela do INFOPEN contém mais de 1300 colunas e aproximadamente 1500 linhas.

jun_2017 <- read_excel("INFOPEN/tabelas excel/jun 2017.xlsx")

Numero de colunas: 1332
Número de linas: 1514

Após analisar cada tabela, decidi filtrar apenas as colunas mais interessantes para a minha analise e o resultado foi uma tabela com 8932 linhas e 328 colunas.

2.3 Começando manipular o dataframe

Após agrupar todas as tabelas e escolher apenas as colunas que vou utiliar, o próximo passo será transformar de formato largo para longo. O Formato longo facilita algumas manipulações,e o formato largo outras. No decorrer dessa análise vou utilizar os dois formatos.

infopen_2_formato_longo <-infopen_br%>% 
  gather(variavel , quantidade, - c(UF,data)) %>% 
  drop_na()

Vou resumir os valores para que sejam removidas as linhas repetidas e obtenha-se o total de cada variavel

infopen_3_resumido <- infopen_2_formato_longo %>%
  group_by(UF, data, variavel) %>%
  mutate(data = gsub("dez", "dec", data))%>% ## precisei usar "dec" para que o programa entendesse que se referia ao mes de dezembro
  summarise(presos = sum(quantidade, na.rm = TRUE)) %>% 
  merge(uf_regiao, by = "UF", all.x = TRUE)

2.4 Criar as Variáveis Que Vou Trabalhar

Após resumir os dados e remover os ‘NAs’, chegou o momento de separar os dados em colunas que vou utilizar.

infopen_4_final <- infopen_3_resumido %>%
  rowwise() %>% ## define o escopo das operacoes seguinte, para serem trabalhadas por linha e nao colunas
  filter(!str_detect(variavel, "Não_Informado|Não_informado|Sem informação"))%>% ## remover as variáveis que nao serao necessarias
  mutate( ## aqui comeco a definir as colunas que vou usar. Vou extrair as novas colunas da coluna variavel
    genero = case_when(
      str_detect(variavel, "(Feminino)") ~ "Feminino",
      str_detect(variavel, "(Masculino)") ~ "Masculino",
      TRUE ~ NA_character_),
    variavel = gsub("_Masculino|_Feminino|", "", variavel), ## nesse ponto eu preciso remover a string de genero para evitar conflitos mais a frente no código
    etnia = ifelse(grepl("etnia_", variavel),
                   sub("etnia_", "", variavel), NA),
    etnia = if_else(etnia == "Branca", "Branca", 
                    if_else(etnia %in% c("Preta", "Parda"), "Preta ou Parda", 
                           if_else(etnia %in% c("Amarela", "Indigena"), "Amarela ou Indigena"
                                   ,NA))),
    grau_de_instrucao = ifelse(grepl("grau_de_instrucao_", variavel),
                               sub("grau_de_instrucao_","", variavel), NA), 
    remuneracao = ifelse(grepl("remuneracao_",variavel),
                         sub("remuneracao_","",variavel),NA),
    faixa_etaria = ifelse(grepl("faixa_etaria_", variavel),
                          sub("faixa_etaria_","",variavel),NA))%>% 
  mutate_at(vars(-presos), as.factor) %>% 
  ungroup() %>% 
  select("data","regiao","UF", "genero","etnia", 
         "grau_de_instrucao", "faixa_etaria", "remuneracao","presos") %>% ## usei select() apenas porque gostaria de vizualiar as colunas nessa ordem
  filter(!is.na(genero))

2.5 Geração das Tabelas

Em relação à quantidade de presos, essa é a tabela mais confiável pois nem todos os presídios têm capacidade de recolher todos os dados. Logo, com as outras tabelas vou trabalhar apenas a porcentagem de presos em relacao ao total e extrair daqui o valor correspondente.

2.5.1 Tabela com a população prisional total

populacao_prisional <-infopen_3_resumido %>%
  filter(str_detect(variavel, "População_prisional"))%>%
  rowwise() %>% 
  mutate(
    genero = case_when(
      str_detect(variavel, "(Feminino)") ~ "Feminino",
      str_detect(variavel, "(Masculino)") ~ "Masculino",
      TRUE ~ NA_character_)) %>% 
  select(regiao, UF,data,genero, presos) %>% 
  drop_na() %>% 
  ungroup()

populacao_prisional_2_resumido <- populacao_prisional %>% 
  filter(grepl("^dec", data) | data == "jun 2019") %>% ## após algumas análises decidí usar apenas 1 referência por ano, ao inves de uma média dos valores. 
  group_by(regiao, UF, data) %>%
  mutate(ano = str_replace(data, "\\D*(\\d{4}).*", "\\1")) %>% ## removendo os 4 primerios characteres dos valores na coluna 'ano'
  ungroup() %>% 
  group_by(ano, regiao, UF) %>% 
  summarise(total_presos = sum(presos)) %>% 
  ungroup() %>% 
  select(ano, regiao, UF, total_presos)

Vou deixar apenas mais esse exmplo de código, pois para a criação das demais tabelas não há muita diferença em relação ao processo dessa. O que pode mudar são alguns ajustes pontuais, mas nada que mereça mensão.

infopen_faixa_de_idade <-infopen_4_final %>% 
  select(regiao,UF,data,genero, faixa_etaria, presos) %>% ## selecionar as colunas
  mutate(faixa_etaria = gsub("_", " ", faixa_etaria)) %>% ## remover os "_" para facilitar leitura e exportacao para csv 
  mutate_at(vars(-presos), as.factor) %>% ## converter todas as colunas para factor - presos
  drop_na() ## remover NA

infopen_faixa_de_idade_2_porcentagem <- infopen_faixa_de_idade %>% 
  filter(grepl("^dec", data) | data == "jun 2019") %>%
  group_by(regiao, UF, data) %>%
  mutate(ano = str_replace(data, "\\D*(\\d{4}).*", "\\1"),
         total_presos_faixa = sum(presos, na.rm = TRUE), # soma total de presos por região, UF, gênero e ano
         porcentagem_presos = round(((presos / total_presos_faixa) * 100),2),
         UF = as.factor(UF),
         ano = as.character(ano)) %>% 
  ungroup() %>% 
  select(ano, regiao, UF, genero, faixa_etaria, porcentagem_presos)

infopen_faixa_de_idade_3_final <- infopen_faixa_de_idade_2_porcentagem %>%
  left_join(populacao_prisional_2_resumido, by = c("ano", "regiao", "UF")) %>%
  mutate(presos = round(((porcentagem_presos / 100) * total_presos), 0)) %>%
  select(ano, regiao, UF, genero, faixa_etaria, presos)

infopen_faixa_de_idade_4 <- infopen_faixa_de_idade_3_final %>% 
  group_by(ano,faixa_etaria) %>% 
  summarise(presos = sum(presos)) %>% 
  mutate(ano = as.numeric(ano))

2.6 Visualização dos Dados do INFOPEN

Aqui estão as tabelas do INFOPEN que irei utilizar. Obseve que combinei várias tabelas, rearanjei as colunas e extraí 5 tabelas distintas, com dados em painel.

2.6.1 Populacao prisional

regiao UF data genero presos
Sudeste SP jun 2019 Masculino 134002
Sudeste SP dec 2018 Masculino 129255
Sudeste SP jun 2018 Masculino 124912
Sudeste SP dec 2017 Masculino 121808
Sudeste SP jun 2017 Masculino 120332
Sudeste SP dec 2016 Masculino 119372
Sudeste SP dec 2016 Masculino 56185
Sudeste SP jun 2017 Masculino 54000
Sudeste SP dec 2017 Masculino 51915
Sudeste SP jun 2018 Masculino 51270

2.6.2 Etnia

ano regiao UF etnia presos
2019 Sudeste SP preta ou parda 136560
2018 Sudeste SP preta ou parda 132756
2016 Sudeste SP preta ou parda 129392
2017 Sudeste SP preta ou parda 128026
2016 Sudeste SP branca 100415
2019 Sudeste SP branca 96821
2017 Sudeste SP branca 95929
2018 Sudeste SP branca 94901
2018 Sudeste MG preta ou parda 57464
2019 Sudeste MG preta ou parda 56521

2.6.3 Grau de instrução

ano regiao UF genero grau_de_instrucao presos
2019 Sudeste SP Masculino Ensino Fundamental Incompleto 99346
2017 Sudeste SP Masculino Ensino Fundamental Incompleto 98797
2018 Sudeste SP Masculino Ensino Fundamental Incompleto 97082
2016 Sudeste SP Masculino Ensino Fundamental Incompleto 96434
2019 Sudeste SP Masculino Ensino Médio Incompleto 47265
2018 Sudeste SP Masculino Ensino Médio Incompleto 46693
2017 Sudeste SP Masculino Ensino Médio Incompleto 43707
2016 Sudeste SP Masculino Ensino Médio Incompleto 42049
2018 Sudeste MG Masculino Ensino Fundamental Incompleto 41789
2019 Sudeste MG Masculino Ensino Fundamental Incompleto 40967

2.6.4 Faixa etária

ano faixa_etaria presos
2016 18 a 24 anos 214624
2018 18 a 24 anos 206467
2019 18 a 24 anos 204917
2017 18 a 24 anos 202629
2019 25 a 29 anos 178737
2018 25 a 29 anos 173891
2016 25 a 29 anos 169540
2017 25 a 29 anos 168851
2019 35 a 45 anos 157032
2018 35 a 45 anos 145968

2.6.5 Faixa de remuneração

ano regiao UF remuneracao presos
2016 Sudeste SP Entre 3/4 e 1 salário mínimo mensal 230152
2019 Sudeste SP Menos do que 3/4 do salário mínimo mensal 155026
2018 Sudeste SP Menos do que 3/4 do salário mínimo mensal 106953
2018 Sudeste SP Não recebe 94809
2017 Sudeste RJ Entre 3/4 e 1 salário mínimo mensal 51132
2019 Sudeste RJ Não recebe 49260
2019 Sudeste SP Entre 3/4 e 1 salário mínimo mensal 47639
2019 Sudeste MG Não recebe 46006
2016 Sudeste RJ Entre 3/4 e 1 salário mínimo mensal 38273
2016 Sudeste MG Não recebe 37727

3 Tabela IBGE Grau de Instrução

A proposta dessa análise é comparar os dados da população carcerária com os dados do IBGE, e fazer uma correlação entre eles. Os dados que vou utilizar aqui fazem parte da Pesquina Nacional Por Amostra de Domicílios Continua (PNADC) e podem ser encontradas na página de estatísticas do IBGE.

Aqui começo trabalhar a segunda tabela que será usada. Essa tabela única possui varias folhas que vou extrair e manipular os dados. A tabela “PNAD_Continua_2018_Educacao.xls”, possui dados referentes à educação da população. São várias informações, dentre as quais: nível educacional por região, gereno e etnia. Essa tabela também apresenta dados em painel.
Amarelos e Indigenas constam no Total

Vou pular a parte de importação da tabela e ir diretamente para o dataframe.

Visualização da Tabela do PNAD
indicador nivel_territorial abertura_territorial variavel_1 categoria_1 variavel_2 categoria_2 2016 2017 2018
População (mil pessoas) País Brasil Sexo Total Grupos de idade Total 204325.470 205999.691 207651.621
População (mil pessoas) País Brasil Sexo Total Grupos de idade 0 a 3 anos 10223.229 10141.908 10171.730
População (mil pessoas) País Brasil Sexo Total Grupos de idade 4 e 5 anos 5262.563 5268.945 5350.024
População (mil pessoas) País Brasil Sexo Total Grupos de idade 6 a 9 anos 11100.370 10962.806 10947.352
População (mil pessoas) País Brasil Sexo Total Grupos de idade 10 a 14 anos 15445.672 15363.810 15023.146
População (mil pessoas) País Brasil Sexo Total Grupos de idade 15 a 17 anos 10617.588 10426.076 9752.471
População (mil pessoas) País Brasil Sexo Total Grupos de idade 18 a 24 anos 22234.284 22727.774 22703.814
População (mil pessoas) País Brasil Sexo Total Grupos de idade 25 a 29 anos 15306.030 15138.452 14890.647
População (mil pessoas) País Brasil Sexo Total Grupos de idade 30 a 39 anos 32134.993 32462.937 32597.356
População (mil pessoas) País Brasil Sexo Total Grupos de idade 40 a 59 anos 52417.780 53172.422 54100.608

Esse dataframe reune dados de todas as abas do arquivo “PNAD_Continua_2018_Educacao.xls”, ainda há muita manipulação a ser feita.

3.1 Manipulação dos Dados

Primeiro, vou transpor os dados para que eu possa transformá-los em formato longo, tal como no modelo anterior, com a tabela do INFOPEN.

pnad_2_formato_longo <- pivot_longer(pnad_br, 8:10, 
                                     names_to = "ano", 
                                     values_to = "valor", 
                                     values_drop_na = TRUE)

Vou multiplicar o valor na coluna ‘valor’ por 1000 se a coluna ‘indicador’ contiver a string ‘(mil pessoas)’ e, em seguida, removê-la. Depois vou criar uma variável ‘regiao’ para armazenar a região de cada estado.

pnad_3_com_regioes <- pnad_2_formato_longo %>%
  mutate(valor = ifelse(grepl("(mil pessoas)", indicador), valor * 1000, valor),
         indicador = gsub("\\s*\\(mil pessoas\\)", "", indicador),
         regiao = case_when(abertura_territorial %in% c("Acre", "Amazonas", "Amapá", "Pará", "Rondônia", "Roraima", "Tocantins") ~ "Norte",
                            abertura_territorial %in% c("Maranhão", "Piauí", "Ceará", "Rio Grande do Norte", "Paraíba", "Pernambuco", "Alagoas", "Sergipe", "Bahia") ~ "Nordeste",
                            abertura_territorial %in% c("Minas Gerais", "Espírito Santo", "Rio de Janeiro", "São Paulo") ~ "Sudeste",
                            abertura_territorial %in% c("Paraná", "Santa Catarina", "Rio Grande do Sul") ~ "Sul",
                            abertura_territorial %in% c("Mato Grosso", "Mato Grosso do Sul", "Goiás", "Distrito Federal") ~ "Centro-Oeste",
                            TRUE ~ NA_character_))

3.1.1 Tabela PNAD População com 18 anos ou mais

Vou combinar essa tabela do IBGE , com a primeira tabela do INFOPEN que diz respeito a população carcerária, podendo assim tambem correlacionar o total de presos com pessoas de 18 anos ou mais, mas de forma resumida.

Aqui podemos ter uma ideia dos dados presentes nessa tabela.

## # A tibble: 6 × 4
## # Groups:   ano, regiao [2]
##   ano   regiao       UF       total
##   <chr> <chr>        <chr>    <dbl>
## 1 2016  Centro-Oeste DF     2141121
## 2 2016  Centro-Oeste GO     4946837
## 3 2016  Centro-Oeste MS     1915936
## 4 2016  Centro-Oeste MT     2389984
## 5 2016  Nordeste     AL     2306187
## 6 2016  Nordeste     BA    10517994

Essa tabela possui dados de 2016 a 2018. O primeiro passo vai ser calcular o total de pessoas para cada variável no ano de 2019, usando o método aritimético descrito no começo dessa análise.

3.2 Usando Método Aritmético Para Estimar uma População

Vou começar transformando esses dados em formato largo (wide), logo em seguida aplico a função com a fórmula e por fim volto com a tabela para formato longo(long).

populacao_18_anos_ou_mais_3 <- pivot_wider(populacao_18_anos_ou_mais_2,
                                            names_from = ano,
                                            values_from = total)

populacao_18_anos_ou_mais_4 <- populacao_18_anos_ou_mais_3 %>% 
 mutate(
    `2019` = round(formula(`2018`,2018,`2016`,2016,2019))
  )
populacao_18_anos_ou_mais_5 <- pivot_longer(populacao_18_anos_ou_mais_4, cols = -c(UF,regiao),names_to = "ano",values_to = "populacao") %>% 
  mutate(across(-populacao, as.factor))

Vou agora combinar essa tabela com a população prisional do INFOPEN.

ano regiao UF presos populacao
2016 Centro-Oeste DF 14958 2141121
2016 Centro-Oeste GO 18626 4946837
2016 Centro-Oeste MS 18320 1915936
2016 Centro-Oeste MT 11642 2389984
2016 Nordeste AL 7111 2306187
2016 Nordeste BA 13596 10517994
2016 Nordeste CE 24682 6460288
2016 Nordeste MA 8187 4577042
2016 Nordeste PB 12241 2838058
2016 Nordeste PE 45878 6858365

3.3 Tabela PNAD Dados Sobre a Educação

Vou repetir basicamente o mesmo processo na tabela com dados sobre a população. Essa tabela porém, consideda pessoas de 14 anos ou mais de idade, como pode se notar pelo indicador.

alfabetizacao_populacao <- pnad_3_com_regioes %>%
  filter(indicador == "Pessoas de 14 anos ou mais de idade",
         nivel_territorial == "Unidade da Federação",
         categoria_1 %in% c("Homem", "Mulher","Branca","Preta ou parda","Total¹"),
         variavel_2 == "Nível de instrução",
         !(categoria_2 %in% c("Total"))) %>%
  mutate( ano = as.numeric(ano),
    genero = ifelse(categoria_1 == "Homem", "Masculino",
                         ifelse(categoria_1 == "Mulher", "Feminino", NA)),
         UF = uf_dict[as.character(abertura_territorial)]) %>%
  select(regiao, UF, genero, grau_de_instrucao = categoria_2, ano, total = valor) %>% 
  drop_na()

Mesmo Processo para calcular a população no ano de 2019.

alfabetizacao_populacao_2 <- pivot_wider(alfabetizacao_populacao,
                                            names_from = ano,
                                            values_from = total)

alfabetizacao_populacao_3 <- alfabetizacao_populacao_2 %>% 
 mutate(
    `2019` = round(formula(`2018`,2018,`2016`,2016,2019))
  )
alfabetizacao_populacao_4 <- pivot_longer(alfabetizacao_populacao_3, cols = -c(regiao:grau_de_instrucao),names_to = "ano",values_to = "populacao") %>% 
  mutate(across(-populacao, as.factor))
## # A tibble: 6 × 6
##   regiao UF    genero    grau_de_instrucao                       ano   populacao
##   <fct>  <fct> <fct>     <fct>                                   <fct>     <dbl>
## 1 Norte  RO    Masculino Sem instrução                           2016      51545
## 2 Norte  RO    Masculino Sem instrução                           2017      45943
## 3 Norte  RO    Masculino Sem instrução                           2018      44963
## 4 Norte  RO    Masculino Sem instrução                           2019      41672
## 5 Norte  RO    Masculino Fundamental incompleto (ou curso equiv… 2016     265952
## 6 Norte  RO    Masculino Fundamental incompleto (ou curso equiv… 2017     277958

Como pode se imaginar, as distribuições de grau de instrução não estão padronizadas, vou usar uma função para criar esse padrão entre a tabela do PNAD e a do INFOPEN.

padronizar_grau_de_instrucao <- function(grau) {
  grau_simplificado <- gsub(" \\(ou curso equivalente\\)", "", grau)
  recode(grau_simplificado,
         "Sem instrução" = "Analfabeto",
         "Fundamental incompleto" = "Ensino Fundamental Incompleto",
         "Fundamental completo" = "Ensino Fundamental Completo",
         "Médio incompleto" = "Ensino Médio Incompleto",
         "Médio completo" = "Ensino Médio Completo",
         "Superior incompleto" = "Ensino Superior Incompleto",
         "Superior completo" = "Ensino Superior Completo",
         "Alfabetizado sem cursos regulares" = "Ensino Fundamental Incompleto")
}

depois de rodar a função nas duas tabelas, eis o resultado:

3.4 Tabelas Padronizadas PNADC e INFOPEN

3.4.1 Alfabetização da população

ano regiao UF genero grau_de_instrucao populacao
2016 Centro-Oeste DF Feminino Analfabeto 36913
2016 Centro-Oeste DF Feminino Ensino Fundamental Completo 115600
2016 Centro-Oeste DF Feminino Ensino Fundamental Incompleto 243841
2016 Centro-Oeste DF Feminino Ensino Médio Completo 361021
2016 Centro-Oeste DF Feminino Ensino Médio Incompleto 79367
2016 Centro-Oeste DF Feminino Ensino Superior Completo 326836
2016 Centro-Oeste DF Feminino Ensino Superior Incompleto 81125
2016 Centro-Oeste DF Masculino Analfabeto 35713
2016 Centro-Oeste DF Masculino Ensino Fundamental Completo 112742
2016 Centro-Oeste DF Masculino Ensino Fundamental Incompleto 222558

3.4.2 Alfabetização dos presos

ano regiao UF genero grau_de_instrucao presos
2016 Centro-Oeste DF Feminino Analfabeto 12
2016 Centro-Oeste DF Feminino Ensino Fundamental Completo 34
2016 Centro-Oeste DF Feminino Ensino Fundamental Incompleto 317
2016 Centro-Oeste DF Feminino Ensino Médio Completo 127
2016 Centro-Oeste DF Feminino Ensino Médio Incompleto 118
2016 Centro-Oeste DF Feminino Ensino Superior Completo 10
2016 Centro-Oeste DF Feminino Ensino Superior Incompleto 39
2016 Centro-Oeste DF Masculino Analfabeto 311
2016 Centro-Oeste DF Masculino Ensino Fundamental Completo 1496
2016 Centro-Oeste DF Masculino Ensino Fundamental Incompleto 8489

3.5 Dados Ausentes na Tabela INFOPEN

Percebi que após todas as padronizações as tabelas voltaram com quantidades diferentes de observações. A tabela infopen_grau_de_instrucao_31_padrao possui 1509 observações, enquanto alfabetizacao_populacao_5 possui 1512 observações. Resolvi investigar usando anti_join e descobri que a tabela do infopen não tem as observações da tabela criada abaixo.

## # A tibble: 3 × 6
##   ano   regiao   UF    genero   grau_de_instrucao        populacao
##   <fct> <fct>    <fct> <fct>    <chr>                        <dbl>
## 1 2016  Norte    RR    Feminino Ensino Superior Completo     30467
## 2 2017  Nordeste MA    Feminino Ensino Superior Completo    199776
## 3 2016  Nordeste SE    Feminino Ensino Superior Completo    101357

Para não deixar esses valores em branco, decidi usar media simples do número de presos nos outros anos para cada observação ausente, usar essa média como valor e só então combinar as tabelas do PNADC com INFOPEN.

Agora a tabela do INFOPEN contém 1512 colunas, tal como a tabela do PNAD, logo posso combiná-las.

3.6 Tabela PNADC - INFOPEN Grau de Instrução

ano regiao UF genero grau_de_instrucao presos populacao
2016 Centro-Oeste DF Feminino Analfabeto 12 36913
2016 Centro-Oeste DF Feminino Ensino Fundamental Completo 34 115600
2016 Centro-Oeste DF Feminino Ensino Fundamental Incompleto 317 243841
2016 Centro-Oeste DF Feminino Ensino Médio Completo 127 361021
2016 Centro-Oeste DF Feminino Ensino Médio Incompleto 118 79367
2016 Centro-Oeste DF Feminino Ensino Superior Completo 10 326836
2016 Centro-Oeste DF Feminino Ensino Superior Incompleto 39 81125
2016 Centro-Oeste DF Masculino Analfabeto 311 35713
2016 Centro-Oeste DF Masculino Ensino Fundamental Completo 1496 112742
2016 Centro-Oeste DF Masculino Ensino Fundamental Incompleto 8489 222558

4 Tabela IBGE Etnia

Essa Tabela possui a distribuição percentual etnica da população brasileira por estado. O arquivo a ser trabalhado aqui chama-se “Tabela 1.1 DIST PERCET RACA.xls”, e pode ser encontrado no site do IBGE

Vou pular a parte de leitura dos dados pois não difere em nada das tabelas anteriores.

ano UF Total Branca Preta Parda
1 2018 RO 1747.154 29.47056 6.710325 62.40118
2 2018 AC 853.023 21.02601 5.346175 72.31678
3 2018 AM 3921.508 16.80872 2.989718 77.40833
4 2018 RR 513.466 23.69004 7.674129 60.86162
5 2018 PA 8472.029 17.83819 8.171171 72.69580
6 2018 AP 821.545 17.42855 6.996881 74.26081
7 2018 TO 1542.150 21.09303 12.447240 65.01775
9 2018 MA 7000.726 18.29311 11.947581 68.54424
10 2018 PI 3263.754 19.79728 9.072589 70.89077
11 2018 CE 9072.980 28.22352 5.288679 65.71442

Essa tabela possui dados de 2012 a 2018. Vou utilizar a fórmula que discutimos no começo para estimar a população em 2019.
Vou começar transformando os dados da tabela, pois o numero presente na coluna total ainda deve ser multiplicado por 1000, e os valores das etnias estão em porcentagem em relação ao total.

distribuicao_populacao_por_etnia_e_regiao_3 <- distribuicao_populacao_por_etnia_e_regiao_2 %>% 
  mutate(
    Total = round(Total*1000),
    Branca = round(Branca*Total/100),
    Preta = round(Preta*Total/100),
    Parda = round(Parda*Total/100))

Por fim a tabela que iremos utilizar para combinar com a do INFOPEN

4.1 Distribuição Étnica da População Brasileira

ano regiao UF etnia populacao
2016 Norte AC branca 149493
2016 Norte AC preta ou parda 674372
2016 Nordeste AL branca 788828
2016 Nordeste AL preta ou parda 2470246
2016 Norte AM branca 679764
2016 Norte AM preta ou parda 3034052
2016 Norte AP branca 162565
2016 Norte AP preta ou parda 619211
2016 Nordeste BA branca 2608310
2016 Nordeste BA preta ou parda 11944048

4.2 Observações Ausentes na Tabela do INFOPEN

Após manipulação dos dados dessa tabela do IBGE, vou combiná-la com a tabela do INFOPEN, para ter como correlacionar o total de presos e a população para cada variável. Porém, na hora de combinar os dataframes, descobri que que há observações faltantes na tabela infopen_etnia_3_final pois ela possui menos linhas que a tabela do PNAD. Vou usar anti-join para descobrí-los e regressao linear para calcular-los

São essas as observações ausentes na tabela do INFOPEN

head(diferenca_infopen_populacao_etnia)
## # A tibble: 2 × 4
## # Groups:   ano, UF, regiao [1]
##     ano regiao   UF    etnia         
##   <dbl> <chr>    <chr> <chr>         
## 1  2019 Nordeste SE    branca        
## 2  2019 Nordeste SE    preta ou parda

Após alguns cálculos, cheguei nesse resultado de previão de presos e cada observação:

head(previsoes_2019_infopen_etnia)
## # A tibble: 2 × 5
## # Groups:   regiao, UF, etnia [2]
##   regiao   UF    etnia          presos   ano
##   <chr>    <chr> <chr>           <dbl> <dbl>
## 1 Nordeste SE    branca            457  2019
## 2 Nordeste SE    preta ou parda   5124  2019

Agora basta combinar as tabelas com dados sobre a etnia da população brasileira total com a população carcerária e então chegaremos nessa tabela:

4.3 Tabela PNADC - INFOPEN Etnia

ano regiao UF etnia presos populacao
2016 Centro-Oeste DF branca 2515 1113132
2016 Centro-Oeste DF preta ou parda 12364 1753738
2016 Centro-Oeste GO branca 4266 2426334
2016 Centro-Oeste GO preta ou parda 14288 4253442
2016 Centro-Oeste MS branca 5560 1130769
2016 Centro-Oeste MS preta ou parda 12737 1452699
2016 Centro-Oeste MT branca 2660 1076121
2016 Centro-Oeste MT preta ou parda 8916 2211143
2016 Nordeste AL branca 1377 788828
2016 Nordeste AL preta ou parda 5735 2470246

5 Tabela IBGE Faixa Etária

O arquivo a ser trabalhado aqui chama-se “Tabela 1.2 DIST POP ETARIA.xls”, e pode ser encontrado no site do IBGE

Essa tabela possui dados sobre a distribuição da faixa etária da população por etnia. Indígenas, amarelos e pessoas sem declaração de cor ou raça constam no total.

faixa_etaria Total cv_total branca cv_branca Preta_ou_Parda cv_preta_parda proporcao_branca cv_proporcao_branca proporcao_preta_parda cv_proporcao_preta_parda ano
0 a 4 anos 13124.30 0.88427169197711608 6076.469 1.451866 6939.813 1.155815 46.29937 1.021138 52.87758 0.8912887 2018
5 a 9 anos 13645.48 0.85759498658148692 5629.184 1.409402 7899.687 1.121951 41.25310 1.074214 57.89233 0.7720677 2018
10 a 14 anos 14923.04 0.77302798278891072 5756.714 1.359373 9039.822 1.043748 38.57603 1.111292 60.57629 0.7071651 2018
15 a 19 anos 16442.07 0.75758111621423652 6010.282 1.296194 10293.966 1.031182 36.55429 1.105113 62.60748 0.6485969 2018
20 a 24 anos 16048.18 0.75135656586436339 6348.342 1.308184 9541.958 1.019381 39.55802 1.057401 59.45820 0.7094211 2018
25 a 29 anos 15006.06 0.83216738688741987 6160.098 1.441365 8686.275 1.068971 41.05073 1.082387 57.88510 0.7691143 2018
30 a 34 anos 16071.92 0.84090771846315848 6600.026 1.448793 9274.408 1.043940 41.06559 1.057334 57.70568 0.7619637 2018
35 a 39 anos 16905.90 0.82142719564900768 7026.611 1.517426 9688.656 1.026723 41.56308 1.113020 57.30932 0.8102016 2018
40 a 44 anos 15186.72 0.78765297599262696 6390.305 1.356850 8621.957 1.049632 42.07823 1.035301 56.77299 0.7678529 2018
45 a 49 anos 13519.07 0.83775955165508598 5857.937 1.412991 7506.854 1.127709 43.33091 1.061985 55.52788 0.8343097 2018

Assim como a tabela anterior, essa possui dados apenas de 2012 a 2018, logo vou utilizar a mesma fórmula para prever a população em 2019.

5.1 Padronização das Faixas de Idade

Como é possivel ver logo a baixo, embora agora tenhamos os dados de 2016 a 2019, as faixas etárias não são exatamente iguais às do INFOPEN, mas são bem proximas.
faixa_etaria ano populacao
25 a 29 anos 2018 15006064
25 a 29 anos 2017 15361348
25 a 29 anos 2016 15417271
25 a 29 anos 2019 14834679
30 a 34 anos 2018 16071915
30 a 34 anos 2017 16187827
30 a 34 anos 2016 16565123
30 a 34 anos 2019 16054589
35 a 39 anos 2018 16905898
35 a 39 anos 2017 16504662

O que vou fazer, é criar uma função que ajusta as faixas etárias para estarem de acordo com as do INFOPEN

ajusta_faixa_etaria <- function(faixa) {
  if (faixa %in% c("25 a 29 anos")) {
    return("25 a 29 anos")
  } else if (faixa %in% c("30 a 34 anos")) {
    return("30 a 34 anos")
  } else if (faixa %in% c("35 a 39 anos", "40 a 44 anos")) {
    return("35 a 45 anos")
  } else if (faixa %in% c("45 a 49 anos", "50 a 54 anos", "55 a 59 anos")) {
    return("46 a 60 anos")
  } else if (faixa %in% c("60 a 64 anos", "65 a 69 anos")) {
    return("61 a 70 anos")
  } else if (faixa %in% c("70 a 74 anos", "75 a 79 anos", "80 anos e mais")) {
    return("Mais de 70 anos")
  } else {
    return(NA)
  }
}
Aqui dá pra se ter uma visualização da tabela que tenho até então.
ano faixa_etaria populacao
2016 25 a 29 anos 15417271
2016 30 a 34 anos 16565123
2016 35 a 45 anos 30697363
2016 46 a 60 anos 37633650
2016 61 a 70 anos 16444403
2016 Mais de 70 anos 12997738
2017 25 a 29 anos 15361348
2017 30 a 34 anos 16187827
2017 35 a 45 anos 31462107
2017 46 a 60 anos 37959837

Pode-se notar que não tenho a população de 18 a 24 anos. Vou extrair essa faixa etária de outra tabela do PNAD, que já trabalhamos antes.

populacao_18_a_24_anos <- pnad_4_populacao_idade %>%
  filter(grepl("18 a 24 anos", grupo_de_idade),
         grepl("Total¹", etnia)) %>% 
  select(-genero) %>% # vou remover genero para remover duplicados (pois tenho genero e etnia)
  rename(faixa_etaria = grupo_de_idade,
         populacao = valor)%>%
  group_by(ano,faixa_etaria, etnia) %>% 
  summarise(populacao = sum(populacao)) %>% 
  select(-etnia) %>% # por fim removo a coluna de etnia que consta apenas 'Total'
  drop_na()

Como já demonstrado anteriormente, vou usar aritmérica para prever a população em 2019.

5.2 Distribuição da Faixa Etária da População Brasileira

Finalmente a tabela com todas as faixas etarias igual a do INFOPEN
faixa_etaria ano populacao
18 a 24 anos 2016 22234284
25 a 29 anos 2016 15417271
30 a 34 anos 2016 16565123
35 a 45 anos 2016 30697363
46 a 60 anos 2016 37633650
61 a 70 anos 2016 16444403
Mais de 70 anos 2016 12997738
18 a 24 anos 2017 22727774
25 a 29 anos 2017 15361348
30 a 34 anos 2017 16187827

Agora resta apenas combinar as tabelas de faixa etária.

populacao_infopen_faixa_etaria <- as.data.frame(left_join(infopen_faixa_de_idade_4,
                                            populacao_faixa_etaria,
                                            by = join_by(ano, faixa_etaria))) %>% 
  mutate(faixa_etaria = as.factor(faixa_etaria))

5.3 Tabela PNADC - INFOPEN por Faixa etária

ano faixa_etaria presos populacao
2016 18 a 24 anos 214624 22234284
2016 25 a 29 anos 169540 15417271
2016 30 a 34 anos 127187 16565123
2016 35 a 45 anos 133083 30697363
2016 46 a 60 anos 49033 37633650
2016 61 a 70 anos 7527 16444403
2016 Mais de 70 anos 1376 12997738
2017 18 a 24 anos 202629 22727774
2017 25 a 29 anos 168851 15361348
2017 30 a 34 anos 130889 16187827

6 Tabela IBGE Rendimentos

6.1 População Total com 14 Anos ou Mais.

Preciso dessa tabela com a populacao geral acima de 14 anos, pois a tabela com rendimentos do IBGE considera apenas essa faixa de idade. A tabela sobre educação, que já usamos considera essa faixa da população.

6.1.1 Tabela Com a População Total com 14 Anos ou Mais.

regiao UF ano populacao
Centro-Oeste DF 2016 2335338
Centro-Oeste DF 2017 2391985
Centro-Oeste DF 2018 2452741
Centro-Oeste DF 2019 2511443
Centro-Oeste GO 2016 5384235
Centro-Oeste GO 2017 5505555
Centro-Oeste GO 2018 5599123
Centro-Oeste GO 2019 5706569
Centro-Oeste MS 2016 2073359
Centro-Oeste MS 2017 2109297

6.2 Explicação dos Dados

Essa tabela possui a distribuição de rendimentos da população brasileira. O próprio IBGE divulgou um informativo sobre a distribuição dos rendimentos da população brasileira entre 2012 e 2019.

Eu vou trabalhar apenas com uma fração dos dados disponíveis nessa tabela: o rendimento habitualmente recebido, a preços médio e somente para as pessoas de 14 anos ou mais de idade. De acordo com o IBGE, rendimento habitual se define da seguinte forma:

” O rendimento habitual consiste no rendimento recebido por empregados, empregadores e trabalhadores por conta própria, mensalmente, sem acréscimos extraordinários ou descontos esporádicos. Para o empregado, o rendimento mensal habitualmente recebido exclui todas as parcelas que não tenham caráter contínuo (bonificação anual, salário atrasado, horas extras, participação anual nos lucros, 13o salário, 14o salário, adiantamento de salário, etc.) e não considera os descontos ocasionais (faltas, parte do 13o salário antecipado, prejuízo eventual causado ao empreendimento etc.).

Caso o rendimento recebido de empregado, de trabalhador por conta própria e de empregador seja variável, considera-se o rendimento habitual aquele em média recebido pela pessoa no período em que realizava o trabalho declarado na semana de referência. Quando a remuneração varia em função do período ou estação do ano, considera-se o rendimento mensal que a pessoa ganha habitualmente nesse período sazonal.” fonte: glossário

6.3 Exploração de Dados

Essa tabela é bem simples. Na coluna ‘classe’, temos a classe percentual de pessoas por rendimento, e nas demais colunas o rendimento habitual dessa classe de pessoas.

Vou utilizar uma tabela ja presente no relatorio do IBGE para melhor exemplificar a utilizadade da tabela

Fonte: IBGE, Diretoria de Pesquisas, Coordenação de Trabalho e Rendimento, Pesquisa Nacional por Amostra de Domicílios Contínua 2012-2019.   Notas:     1. Rendimento habitualmente recebido, a preços médios de 2019.     2. Rendimento captado somente para as pessoas de 14 anos ou mais de idade. Na primeira linha ‘2012’, na coluna ‘Mais de 80% até 90%’, temos o valor 3 351, que representa um rendimento habitual de R$ 3.351,00 mensal. Ou seja, 90% dos brasileiros recebem até esse valor, apenas 10% recebem mais que isso.

6.4 Manipulando os Dados

Para que possa ter como padronizar as tabelas de rendimento do PNAD e do INFOPEN vou precisar de um ajuste de acordo com o salário mínimo. Para isso vou criar uma tabela com os valores do anos 2016 a 2019.

ano <- c(2019, 2018, 2017, 2016)
salario_minimo <- c(998.00, 954.00, 937.00, 880.00)
salario_minimo_2016_a_2019 <- data.frame(ano, salario_minimo)

Essa tabela considera apenas percentual de pessoas com algum rendimento. O IBGE considera desempregados pessoas que estão a procura de trabalho no periodo da amostra. Porém, não considera pessoas sem rendimentos que não estavam a procura de emprego como desempregadas. Essa parcela de pessoas sem rendimentos é a que vamos tratar aqui.

Para extrair esses dados, vou utilizar a mesma tabela já usada, que também possui essas informações. A tabela ‘PNAD_Continua_2019_Rendimento_de_Todas_as_Fontes’, possui como indicador o “Percentual de pessoas com rendimento”, logo vou extrair ‘100%’ desse valor e obeter o percentual de pessoas sem rendimentos.

percentual_empregados <-rendimentos %>% 
  filter(`Abertura geográfica` == "Brasil",
         Tipo == "Valor",
         sub.classe %in% c("Todas as fontes¹"   ),
         ind == "Percentual de pessoas com rendimento, na população residente") %>% 
  select(sub.classe, '2016','2017','2018','2019') %>% 
  unique()

percentual_empregados_2_formato_longo <- pivot_longer(percentual_empregados, 
                                                                   cols = c("2016", "2017", "2018", "2019"), 
                                                                   names_to = "ano", 
                                                                   values_to = "valor")

percentual_sem_rendimentos <- percentual_empregados_2_formato_longo %>% 
  mutate(sub.classe = (100 - valor),
         valor = 0,
         remuneracao = "Não recebe",
         ano = as.factor(ano))

sem_rendimentos <- left_join(percentual_sem_rendimentos, populacao_total_14_anos_ou_mais, by = join_by(ano)) %>% 
  mutate(populacao = (sub.classe*populacao)/100,) %>% 
  group_by(ano, remuneracao) %>% 
  summarise(populacao = sum(populacao)) %>% 
  select(ano, remuneracao, populacao)

Antes de combinar as tabelas, preciso ainda padronizar as variaveis.

# Criando a nova coluna com as categorias
remuneracao_populacao_3 <- remuneracao_populacao_2_salario_minimo %>%
  mutate(remuneracao = case_when(
    valor >= salario_minimo & valor < 2 * salario_minimo ~ "Entre 1 e 2 salários mínimos mensais",
    valor >= 3/4 * salario_minimo & valor < salario_minimo ~ "Entre 3/4 e 1 salário mínimo mensal",
    valor >= 2 * salario_minimo ~ "Mais que 2 salários mínimos mensais",
    valor > 0 & valor< 3/4 * salario_minimo ~ "Menos do que 3/4 do salário mínimo mensal"
  )) %>% 
  select(classe, ano, porcentagem_populacao, remuneracao)


remuneracao_populacao_4 <-merge(remuneracao_populacao_3, 
                                populacao_total_14_anos_ou_mais, by = "ano") %>% 
  mutate(populacao_remunerada = (populacao * porcentagem_populacao)/100) %>% 
  select(ano, remuneracao, populacao_remunerada) %>% 
  rename(populacao = populacao_remunerada)

remuneracao_populacao_5 <- remuneracao_populacao_4 %>% 
  group_by(ano, remuneracao) %>% 
  summarise(populacao = sum(populacao)) %>% 
  mutate( ano = as.factor(ano))
# Definir a ordem correta de rendimentos
ordem_correta_rendimentos <- c("Não recebe",
                               "Menos do que 3/4 do salário mínimo mensal",
                               "Entre 3/4 e 1 salário mínimo mensal", 
                               "Entre 1 e 2 salários mínimos mensais",
                               "Mais que 2 salários mínimos mensais")

remuneracao_populacao_6 <- rbind(remuneracao_populacao_5, sem_rendimentos)%>% 
  mutate(remuneracao = as.factor(remuneracao),
         remuneracao = factor(remuneracao, levels = ordem_correta_rendimentos))

Por fim uma visão sobre a distribuição de rendimentos no pais:

6.5 Distribuição população com e sem rendimentos

ano remuneracao populacao
2016 Não recebe 64375850
2017 Não recebe 65298473
2018 Não recebe 64819488
2019 Não recebe 63997726
2016 Menos do que 3/4 do salário mínimo mensal 16549062
2017 Menos do que 3/4 do salário mínimo mensal 33486397
2018 Menos do que 3/4 do salário mínimo mensal 33848297
2019 Menos do que 3/4 do salário mínimo mensal 34223383
2016 Entre 3/4 e 1 salário mínimo mensal 33098124
2017 Entre 3/4 e 1 salário mínimo mensal 16743198

Antes de combinar os dataframes, observei que a tabela do Infopen não possui dados sobre remuneração dos presos em 2017 para o estado de Sao Paulo. vou usar interpolação linear (Larson 1988) para prever esses dados.

# Subconjunto dos dados para o estado de São Paulo
infopen_sp <- infopen_remuneracao_3_final[infopen_remuneracao_3_final$UF == 'SP', ]

Função para prever os dados ausentes sobre a remuneração de presos em SP em 2017

predict_na <- function(ano, presos) {
  complete_cases <- !is.na(presos)
  approx(x = as.numeric(ano[complete_cases]), 
         y = presos[complete_cases], 
         xout = as.numeric(ano))$y
}

Aplicar a função para cada combinação de gênero e remuneração

infopen_sp <- infopen_sp %>% 
  group_by(remuneracao) %>% 
  mutate(presos = round(predict_na(ano, presos))) %>% 
  ungroup()

Substituir os dados originais para São Paulo com os novos dados preenchidos

infopen_remuneracao_3_final[infopen_remuneracao_3_final$UF == 'SP', ] <- infopen_sp

Finalmente a tabela final a quantidade estimada de presos por remuneração

infopen_remuneracao_4 <- infopen_remuneracao_3_final %>% 
  group_by(ano, remuneracao) %>% 
  mutate(ano = as.factor(ano)) %>% 
  summarise(presos = sum(presos))

Após todas as manipulações, posso finalmente combinar as tabelas.

6.6 Tabela PNADC - INFOPEN Rendimentos

ano remuneracao presos populacao
2016 Entre 1 e 2 salários mínimos mensais 45996 66196247
2016 Entre 3/4 e 1 salário mínimo mensal 383948 33098124
2016 Mais que 2 salários mínimos mensais 16286 49647185
2016 Menos do que 3/4 do salário mínimo mensal 81645 16549062
2016 Não recebe 174533 64375850
2017 Entre 1 e 2 salários mínimos mensais 40861 66972793
2017 Entre 3/4 e 1 salário mínimo mensal 289068 16743198
2017 Mais que 2 salários mínimos mensais 2858 50229595
2017 Menos do que 3/4 do salário mínimo mensal 120993 33486397
2017 Não recebe 251953 65298473

7 Apresentação dos Dados Coletados e Manipulados:

7.1 Tabela PNAD - INFOPEN Total

ano regiao UF presos populacao
2016 Centro-Oeste DF 14958 2141121
2016 Centro-Oeste GO 18626 4946837
2016 Centro-Oeste MS 18320 1915936
2016 Centro-Oeste MT 11642 2389984
2016 Nordeste AL 7111 2306187
2016 Nordeste BA 13596 10517994
2016 Nordeste CE 24682 6460288
2016 Nordeste MA 8187 4577042
2016 Nordeste PB 12241 2838058
2016 Nordeste PE 45878 6858365

7.2 Tabela PNADC - INFOPEN Grau de Instrução

ano regiao UF genero grau_de_instrucao presos populacao
2016 Centro-Oeste DF Feminino Analfabeto 12 36913
2016 Centro-Oeste DF Feminino Ensino Fundamental Completo 34 115600
2016 Centro-Oeste DF Feminino Ensino Fundamental Incompleto 317 243841
2016 Centro-Oeste DF Feminino Ensino Médio Completo 127 361021
2016 Centro-Oeste DF Feminino Ensino Médio Incompleto 118 79367
2016 Centro-Oeste DF Feminino Ensino Superior Completo 10 326836
2016 Centro-Oeste DF Feminino Ensino Superior Incompleto 39 81125
2016 Centro-Oeste DF Masculino Analfabeto 311 35713
2016 Centro-Oeste DF Masculino Ensino Fundamental Completo 1496 112742
2016 Centro-Oeste DF Masculino Ensino Fundamental Incompleto 8489 222558

7.3 Tabela PNADC - INFOPEN Etnia

ano regiao UF etnia presos populacao
2016 Centro-Oeste DF branca 2515 1113132
2016 Centro-Oeste DF preta ou parda 12364 1753738
2016 Centro-Oeste GO branca 4266 2426334
2016 Centro-Oeste GO preta ou parda 14288 4253442
2016 Centro-Oeste MS branca 5560 1130769
2016 Centro-Oeste MS preta ou parda 12737 1452699
2016 Centro-Oeste MT branca 2660 1076121
2016 Centro-Oeste MT preta ou parda 8916 2211143
2016 Nordeste AL branca 1377 788828
2016 Nordeste AL preta ou parda 5735 2470246

7.4 Tabela PNADC - INFOPEN Faixa etária

ano faixa_etaria presos populacao
2016 18 a 24 anos 214624 22234284
2016 25 a 29 anos 169540 15417271
2016 30 a 34 anos 127187 16565123
2016 35 a 45 anos 133083 30697363
2016 46 a 60 anos 49033 37633650
2016 61 a 70 anos 7527 16444403
2016 Mais de 70 anos 1376 12997738
2017 18 a 24 anos 202629 22727774
2017 25 a 29 anos 168851 15361348
2017 30 a 34 anos 130889 16187827

7.5 Tabela PNADC - INFOPEN Rendimentos

ano regiao UF genero grau_de_instrucao presos populacao
2016 Centro-Oeste DF Feminino Analfabeto 12 36913
2016 Centro-Oeste DF Feminino Ensino Fundamental Completo 34 115600
2016 Centro-Oeste DF Feminino Ensino Fundamental Incompleto 317 243841
2016 Centro-Oeste DF Feminino Ensino Médio Completo 127 361021
2016 Centro-Oeste DF Feminino Ensino Médio Incompleto 118 79367
2016 Centro-Oeste DF Feminino Ensino Superior Completo 10 326836
2016 Centro-Oeste DF Feminino Ensino Superior Incompleto 39 81125
2016 Centro-Oeste DF Masculino Analfabeto 311 35713
2016 Centro-Oeste DF Masculino Ensino Fundamental Completo 1496 112742
2016 Centro-Oeste DF Masculino Ensino Fundamental Incompleto 8489 222558

8 Análises e Correlações.

A Maior parde da proposta do projeto já foi passada. Desse ponto em diante, foco mais em presentar algumas correlações encontradas nas tabelas que montamos e apresentamos um pouco acima.

Vou começar criando uma coluna que relaciona a quantidade de presos ao total da população, e logo após plotar alguns graficos que ilustram a correlação entre cada variável

8.1 dataframe etnia

A variação do percentual de presos pela populacao em relação a etnia, nos mostra que em praticamente todos os estados há uma incidencia maior de presos pardos e pretos em relação à população. Isso não indica causalidade, uma vez que há outros fatores que podem influenciar o indivíduo a cometer algum crime e acabar atras das grades. Porém é um fato que precisa ser investigado mais a fundo. Seria ideal se houvesse uma forma de avaliar mais variáveis como possível racismo por parte do poder judiciário, ou até mesmo educação e renda, como estamos fazendo aqui. Nos próximos gráficos, apresento algumas correlações entre essas variáveis.

8.2 dataframe faixa_etaria

Aqui podemos observar uma diminuicão no índice de presos na faixa etária de 18 a 24 anos no decorrer do tempo. Isso pode se dar por diversas razões, dentre elas o envelhecimento da populaçãocarcerária. Porém, se pegarmos todas as outras faixas-etárias, temos um aumento considerável no número de presos no que chamamos “idade ativa”, que compreende a população até 61 anos de idade. É realmente frustrante perceber que os nossos “Bill Gates”, “Zuckerbergs”, e “Elon Musks” estão atrás das grades. A população que deveria estar na faculade, está presa, por inúmeros fatores, dentre os quais a pouca idade, junto com a baixa escolaridade e a falta de grana. Realmente seria um sonho não ter tantos jovens presos.

8.3 dataframe grau de instrução

Essa tabela mostra a distribuição de presos por grau de instrução. Claramente a chave vira no ensino médio incompleto, uma vez que a partir daí, o percentual de presos sobre a população cai drásticamente. Já não é mistério algum que uma população com baixa educação normalmente tem como resposta um grau elevado de violência, pegue países como noruéga, holanda e japão por exemplo onde há pouquíssimos presos, e compare o nível de acesso ao Ensino Superior com o do Brasil.

8.4 dataframe rendimentos

Aqui podemos observaer que a maior parte da população carcerária são pessoas que recebem até 1 salário mínimo mensal. Esse valor entre 3/4 e 1 salário mínimo mensal inclui diversas pessoas que recebem auxílios governamentais como o “Bolsa Família” ou outros. Elas não podem ser, de acordo com o IBGE classificadas como sem renda ou desempregadas.

O Departamento Intersindical de Estatpistica e Estudos Socioeconômicos (Dieese), divulga mensalmente o valor do custo da Cesta Básica de Alimentos que seria de acordo com o òrgão, “suficiente para o sustento e bem estar de um trabalhador em idade adulta, contendo quantidades balanceadas de proteínas, calorias, ferro cálcio e fósforo.(DIEESE 2019a)”. Em 2019, o valor médio da cesta-básica nacional era de R$ 422,19, o que representa quase metade o salário mínimo da época (R$ 998,00).

8.4.1 Salário Mínimo Necessário

A Constituição do Brasil, de outubro de 1988, estipula que o salário mínimo deve ser um valor estabelecido em lei e uniforme em todo o país. Este valor deve ser suficiente para cobrir as necessidades básicas de um trabalhador e de sua família, incluindo despesas com moradia, alimentação, educação, saúde, lazer, roupas, higiene, transporte e previdência social. Além disso, a Constituição prevê que esse salário mínimo deve ter reajustes periódicos para garantir seu poder de compra (Art. 7º, IV da Constituição Federal do Brasil).

O DIEESE, ao calcular o Salário Mínimo Necessário, leva em consideração estas disposições constitucionais. Eles se baseiam no Decreto Lei nº 399, que determina que os gastos com alimentação de um trabalhador adulto não devem ser menores que o custo da Cesta Básica de Alimentos.

Para esses cálculos, o DIEESE considera um modelo de família composto por 2 adultos e 2 crianças, onde se supõe que o consumo destas crianças é equivalente ao de um adulto.

O método usado para calcular o gasto alimentar de uma família começa com o custo da Cesta Básica de Alimentos mais cara entre as 27 capitais brasileiras. Esse valor é então multiplicado por 3.

O DIEESE(DIEESE 2019b) realizou a Pesquisa de Orçamento Familiar (POF) em São Paulo no período de 94/95. Os resultados mostraram que a alimentação correspondia a 35,71% das despesas das famílias do estrato mais baixo de renda. Ao comparar o custo da alimentação para uma família (a cesta mais cara multiplicada por 3) com a proporção do orçamento dessas famílias dedicado à alimentação (35,71%), é possível deduzir o orçamento total necessário para cobrir também outras despesas, como moradia, vestuário, transporte e assim por diante.

Portanto, podemos resumir a fórmula para calcular o Salário Mínimo Necessário da seguinte forma:

\[C.F.A. = 3(CC)\]

\[\frac{C.F.A.}{X} = \frac{0,3571}{1,00}\] Usando regra de 3, temos que:

\[C.F.A. = X(0,3571)\] logo:

\[ X = \frac{C.F.A.}{0,3571} \] Onde: C.F.A. = Custo Familiar de Alimentação e C.C. = Custo da Cesta Básica de maior valor

O Salário Mínimo Necessário, que é calculado mensalmente como uma avaliação do que deveria ser o salário mínimo atual, também serve como uma ferramenta que os sindicatos dos trabalhadores usam para expor a violação do princípio constitucional que define os parâmetros para a determinação do menor salário permitido no país.

Temos abaixo o valor do que seria o salário ideal do trabalhador, previsto em lei, para arcar com todos custos mensais de sua residência.

Mês Salário Minimo Salário Necessário
Dezembro 998 4342.57
Novembro 998 4021.39
Outubro 998 3978.63
Setembro 998 3980.82
Agosto 998 4044.58
Julho 998 4143.55
Junho 998 4214.62
Maio 998 4259.90
Abril 998 4385.75
Março 998 4277.04

Atravez desses dados, podemos ver a discrepância entre os valores mínimos e os necessários para a manutenção do lar no Brasil. Não é recente a queixa por reformas políticas e econômicas no Brasil. Ainda na década de 1970, o grupo “Legião Urbana” já levantava protesto com a música “Que país é esse?”. Podemos ver na decada seguinte o cantor Cazuza protestar em forma de canto a música “Brasil” que claramente já denunciava a pobreza da nação.

A população carcerária diz muito sobre o país. Jovens, pobres, pessoas de baixa escolaridade e de pele escura estão nos topos das estatísticas, isso sinaliza uma omissão por parte do governo. O Código Penal, em seu artigo 135, descreve o delito de omissão de socorro, que consiste na atitude de deixar de socorrer pessoas em situação de vulnerabilidade, como crianças abandonadas ou perdidas, pessoas inválidas, com ferimentos, ou em situação de risco ou perigo. Por esse fator, o governo também deveria estar atrás das grades.

Biografia

DIEESE. 2019a. “Metodologia Da Cesta Básica de Alimentos.” https://www.dieese.org.br/metodologia/metodologiaCestaBasica/?page=1.
———. 2019b. “Pesquisa Nacional Da Cesta Básica de Alimentos.” https://www.dieese.org.br/analisecestabasica/salarioMinimo.html#2019.
Larson, David R. 1988. “Reflexivity, Algebraic Reflexivity and Linear Interpolation.” American Journal of Mathematics 110 (2): 283–99.
Von Sperling, M. 2014. Princípios Do Tratamento Biológico de Águas Residuárias. Vol. 1. Introdução à Qualidade Das Águas e Ao Tratamento de Esgotos. 4th ed. Editora UFMG.
LS0tCnRpdGxlOiAiQW7DoWxpc2UgUG9wdWxhw6fDo28gQ2FyY2Vyw6FyaWEgZGUgMjAxNiBhIDIwMTkgbm8gQnJhc2lsIgphdXRob3I6ICJXZXZlcnNvbiBOb3NzZWlzIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGhpZ2hsaWdodDogdGV4dG1hdGUKICAgIHRoZW1lOiBmbGF0bHkKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHllcwogICAgICBzbW9vdGhfc2Nyb2xsOiBubwpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jaWFzLmJpYgotLS0KCiMgUHJvcG9zdGEgZGUgcHJvamV0bwpPIG9iamV0aXZvIGRlc3NlIHByb2pldG8gw6kgZGVtb25zdHJhciBtaW5oYXMgaGFiaWxpZGFkZXMgY29tIFIgZW0gbWFuaXB1bGHDp8OjbyBlIGVzdHJ1dHVyYcOnw6NvIGRlIGRhZG9zLCBiZW0gY29tbyB1bWEgYW7DoWxpc2UgZG9zIGRhZG9zIGFwcmVzZW50YWRvcy4gQ29tIGlzc28gZW0gdmlzdGEsIHZvdSBkZWl4YXIgZXhwb3N0byBib2EgcGFydGUgZG9zIGPDs2RpZ29zLCBtYXMgbsOjbyB0b2RvcyBwYXJhIHF1ZSBuw6NvIGZpcXVlIG11aXRvIHJlcGV0aXRpdm8uIERldm8gcmVzc2FsdGFyIHF1ZSBlbWJvcmEgcHJlc2VudGUgZW0gYWxndW1hcyB0YWJlbGFzLCBhIGV0bmlhICJhbWFyZWxhIG91IGluZMOtZ2VuYSIgbsOjbyBzZXLDoSBhcHJlc2VudGFkYSBubyByZWxhdMOzcmlvIGZpbmFsLCB1bWEgdmV6IHF1ZSBocMOhIHVtYSBxdWFudGlkYWRlIGdyYW5kZSBkZSBvdXRsaWVycyBlIHF1ZSBhY2FiYW0gaW52aWVzYW5kbyBhIGFuw6FsaXNlLgogIApUb2RvcyBvcyBhcnF1aXZvcyB1dGlsaXphZG9zIG5lc3NlIHByb2pldG9zIHBvZGVtIHNlciBlbmNvbnRyYWRvcyBubyBsaW5rIGFiYWl4by4gICAKW2xpbmsgcGFyYSBvcyBhcnF1aXZvc10oaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy9ydXg2cmd0NGNodDFjYW4vTm92byUyMHByb2pldG8lMjBSLnppcD9kbD0wKQoKIyMgTcOpdG9kbyBkZSBBbsOhbGlzZXMKCk5vIGRlY29ycmVyIGRhIGFuw6FsaXNlIHZvdSBmYXplciB2w6FyaWFzIHByZXZpc8O1ZXMgZGUgcG9wdWxhw6fDo28sIHBvaXMgbmVtIHRvZGFzIGFzIHRhYmVsYXMgYXByZXNlbnRhbSBkYWRvcyBkZSAyMDE5LiBQYXJhIHByZXZpc8OjbyBkYSBwb3B1bGHDp8Ojbywgdm91IG1lIGJhc2VhciBubyAqbcOpdG9kbyBhcml0bcOpdGljbyogcHJlc2VudGUgbm8gbGl2cm8gZGUgTWFyY29zIFZvbiBTcGVybGluZyBbQFZvblNwZXJsaW5nMjAxNF0uCiAgCgoqKk3DqXRvZG8gYXJpdG3DqXRpY28qKgogIApFc3RlIG3DqXRvZG8gcHJlc3N1cMO1ZSB1bWEgdGF4YSBkZSBjcmVzY2ltZW50byBjb25zdGFudGUgcGFyYSBvcyBhbm9zIHF1ZSBzZSBzZWd1ZW0sIGEgcGFydGlyIGRlIGRhZG9zIGNvbmhlY2lkb3MsIHBvciBleGVtcGxvLCBhIHBvcHVsYcOnw6NvIGRvIMO6bHRpbW8gY2Vuc28uIE1hdGVtYXRpY2FtZW50ZSwgcG9kZSBzZXIgcmVwcmVzZW50YWRvIGRhIHNlZ3VpbnRlIGZvcm1hOgoKJCRcZnJhY3tkUH17ZHR9ID0ga19hJCQKbm9zIHF1YWlzIGRQL2R0IHJlcHJlc2VudGEgYSB2YXJpYcOnw6NvIGRhIHBvcHVsYcOnw6NvIChQKSBwb3IgdW5pZGFkZSBkZSB0ZW1wbyAodCksIGUga2Egw6l1bWEgY29uc3RhbnRlLiBDb25zaWRlcmFuZG8gcXVlIFAxIMOpIGEgcG9wdWxhw6fDo28gZG8gcGVuw7psdGltbyBjZW5zbyAoYW5vIHQxKSBlIFAyLCBhIHBvcHVsYcOnw6NvIGRvIMO6bHRpbW8gY2Vuc28gKGFubyB0MiksIHRlbS1zZToKICAKJCRcaW50X3tQXzJ9XntQXzF9ID0ga19hXGludF97dF8xfV57dF8yfWR0JCQKCkludGVncmFuZG8gZW50cmUgb3MgbGltaXRlcyBkZWZpbmlkb3MsIHRlbS1zZToKICAKJCRQXzItUF8xID0ga19hKHRfMi10XzEpJCQKJCRrX2EgPSBcZnJhY3tQXzItUF8xfXt0XzItdF8xfSQkCgpVdGlsaXphbmRvLXNlIGEgZXF1YcOnw6NvLCBjaGVnYS1zZSDDoCBleHByZXNzw6NvIGdlcmFsIGRvIG3DqXRvZG8gYXJpdG3DqXRpY286CgokJFA9UF8yICsga19uKHQtdF8yKSQkCgpvbmRlIHQgcmVwcmVzZW50YSBvIGFubyBkYSBwcm9qZcOnw6NvLgogIApFc3RlIG3DqXRvZG8gYWRtaXRlIHF1ZSBhIHBvcHVsYcOnw6NvIHZhcmllIGxpbmVhcm1lbnRlIGNvbSBvIHRlbXBvIGUgcG9kZSBzZXIgdXRpbGl6YWRvIHBhcmEgYSBwcmV2aXPDo28gcG9wdWxhY2lvbmFsIHBhcmEgdW0gcGVyw61vZG8gcGVxdWVubywgZGUgMSBhIDUgYW5vcy4gUGFyYSBwcmV2aXPDo28gcG9yIHBlcsOtb2RvIG11aXRvIGxvbmdvLCB0b21hLXNlIGFjZW50dWFkYSBhIGRpc2NyZXDDom5jaWEgY29tIGEgcmVhbGlkYWRlIGhpc3TDs3JpY2EsIHVtYSB2ZXogcXVlIG8gY3Jlc2NpbWVudG8gw6kgcHJlc3N1cG9zdG8gaWxpbWl0YWRvLgogIApQYXJhIGFwbGljYXIgZXNzYSBmw7NybXVsYSBkbyBtw6l0b2RvIGFyaXRtw6l0aWNvLCB2b3UgdXNhciBlc3NhIGZ1bsOnw6NvIGxvZ28gYSBiYWl4by4KCmBgYHtyIGZvcm11bGEgbWV0b2RvIGFyaXRtZXRpY299CmZvcm11bGEgPC0gZnVuY3Rpb24oUDIsIHQyLCBQMCwgdDAsIHQpIHsKICBLYSA8LSAoUDIgLSBQMCkgLyAodDIgLSB0MCkKICBQdCA8LSBQMiArIEthICogKHQgLSB0MikKICByZXR1cm4oUHQpCn0KYGBgCgojIyBQcmVwYXJhw6fDo28gZG8gQW1iaWVudGUgUgogIApBbnRlcyBkZSBtYWlzIG5hZGEsIHZvdSBjYXJyZWdhciBvcyBwYWNvdGVzIHF1ZSB2b3UgdXNhciBwYXJhIG1hbmlwdWxhciBvcyBkYWRvcywgIGZhemVyIGFuw6FsaXNlcyBlIGdlcmFyIGVzc2UgcmVsYXTDs3Jpby4KYGBge3IgQ2FycmVnYW1lbnRvIGRlIFBhY290ZXMsIG1lc3NhZ2UgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlPSBUUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFKQpsaWJyYXJ5KGZvcmVpZ24pCmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeSh3cml0ZXhsKQpsaWJyYXJ5KHN0cmluZ2kpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShwdXJycikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkobWFya2Rvd24pCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShodG1sdG9vbHMpCmxpYnJhcnkocnN0YXRpeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApsaWJyYXJ5KGVtbWVhbnMpCgpgYGAKCiMgTyBJTkZPUEVOCiAgCiJPIEluZm9wZW4gw6kgdW0gc2lzdGVtYSBkZSBpbmZvcm1hw6fDtWVzIGVzdGF0w61zdGljYXMgZG8gc2lzdGVtYSBwZW5pdGVuY2nDoXJpbyBicmFzaWxlaXJvLiBPIHNpc3RlbWEsIGF0dWFsaXphZG8gcGVsb3MgZ2VzdG9yZXMgZG9zIGVzdGFiZWxlY2ltZW50b3MgZGVzZGUgMjAwNCwgc2ludGV0aXphIGluZm9ybWHDp8O1ZXMgc29icmUgb3MgZXN0YWJlbGVjaW1lbnRvcyBwZW5haXMgZSBhIHBvcHVsYcOnw6NvIHByaXNpb25hbC4gRW0gMjAxNCwgbyBERVBFTiByZWZvcm11bG91IGEgbWV0b2RvbG9naWEgdXRpbGl6YWRhLCBjb20gdmlzdGFzIGEgbW9kZXJuaXphciBvIGluc3RydW1lbnRvIGRlIGNvbGV0YSBlIGFtcGxpYXIgbyBsZXF1ZSBkZSBpbmZvcm1hw6fDtWVzIGNvbGV0YWRhcy4gTyB0cmF0YW1lbnRvIGRvcyBkYWRvcyBwZXJtaXRpdSBhbXBsbyBkaWFnbsOzc3RpY28gZGEgcmVhbGlkYWRlIGVzdHVkYWRhLCBtYXMgcXVlIG7Do28gZXNnb3RhbSwgZGUgZm9ybWEgYWxndW1hLCB0b2RhcyBhcyBwb3NzaWJpbGlkYWRlcyBkZSBhbsOhbGlzZS4iCgojIyBDYXJyZWdhbWVudG9zIGRvcyBEYWRvcyBJbmljaWFpcyBQYXNzbyBhIFBhc3NvCgpQcmltZWlybyB2b3UgY3JpYXIgdW0gZGljaW9uw6FyaW8gZGUgZXN0YWRvcyBxdWUgdm91IHVzYXIuIEZpeiBpc3NvIGFmaW0gZGUgcGFkcm9uaWF6YXIgb3Mgbm9tZXMgZG9zIGVzdGFkb3MsIHBvaXMgYWxndW1hcyB0YWJlbGFzIGFwcmVzZW50YW0gb3Mgbm9tZXMgY29tcGxldG9zLCBvdXRyYXMgYXByZXNlbnRhbSBhcGVuYXMgYXMgc2lnbGFzIGRvcyBlc3RhZG9zLgoKYGBgIHtyIERpY2lvbsOhcmlvIGRlIGVzdGFkb3MsIGluY2x1ZGUgPSBGQUxTRX0KdWZfZGljdCA8LSBjKCJBY3JlIiA9ICJBQyIsCiAgICAgICAgICAgICAiQWxhZ29hcyIgPSAiQUwiLAogICAgICAgICAgICAgIkFtYXDDoSIgPSAiQVAiLAogICAgICAgICAgICAgIkFtYXpvbmFzIiA9ICJBTSIsCiAgICAgICAgICAgICAiQmFoaWEiID0gIkJBIiwKICAgICAgICAgICAgICJDZWFyw6EiID0gIkNFIiwKICAgICAgICAgICAgICJEaXN0cml0byBGZWRlcmFsIiA9ICJERiIsCiAgICAgICAgICAgICAiRXNww61yaXRvIFNhbnRvIiA9ICJFUyIsCiAgICAgICAgICAgICAiR29pw6FzIiA9ICJHTyIsCiAgICAgICAgICAgICAiTWFyYW5ow6NvIiA9ICJNQSIsCiAgICAgICAgICAgICAiTWF0byBHcm9zc28iID0gIk1UIiwKICAgICAgICAgICAgICJNYXRvIEdyb3NzbyBkbyBTdWwiID0gIk1TIiwKICAgICAgICAgICAgICJNaW5hcyBHZXJhaXMiID0gIk1HIiwKICAgICAgICAgICAgICJQYXLDoSIgPSAiUEEiLAogICAgICAgICAgICAgIlBhcmHDrWJhIiA9ICJQQiIsCiAgICAgICAgICAgICAiUGFyYW7DoSIgPSAiUFIiLAogICAgICAgICAgICAgIlBlcm5hbWJ1Y28iID0gIlBFIiwKICAgICAgICAgICAgICJQaWF1w60iID0gIlBJIiwKICAgICAgICAgICAgICJSaW8gZGUgSmFuZWlybyIgPSAiUkoiLAogICAgICAgICAgICAgIlJpbyBHcmFuZGUgZG8gTm9ydGUiID0gIlJOIiwKICAgICAgICAgICAgICJSaW8gR3JhbmRlIGRvIFN1bCIgPSAiUlMiLAogICAgICAgICAgICAgIlJvbmTDtG5pYSIgPSAiUk8iLAogICAgICAgICAgICAgIlJvcmFpbWEiID0gIlJSIiwKICAgICAgICAgICAgICJTYW50YSBDYXRhcmluYSIgPSAiU0MiLAogICAgICAgICAgICAgIlPDo28gUGF1bG8iID0gIlNQIiwKICAgICAgICAgICAgICJTZXJnaXBlIiA9ICJTRSIsCiAgICAgICAgICAgICAiVG9jYW50aW5zIiA9ICJUTyIpCgojIE1hcGVhbWVudG8gZGFzIFVGcyDDoHMgcmVnacO1ZXMKdWZfcmVnaWFvIDwtIGRhdGEuZnJhbWUoCiAgVUYgPSBjKCJSTyIsICJBQyIsICJBTSIsICJSUiIsICJQQSIsICJBUCIsICJUTyIsICJNQSIsICJQSSIsICJDRSIsICJSTiIsICJQQiIsICJQRSIsICJBTCIsICJTRSIsICJCQSIsICJNRyIsICJFUyIsICJSSiIsICJTUCIsICJQUiIsICJTQyIsICJSUyIsICJNUyIsICJNVCIsICJHTyIsICJERiIpLAogIHJlZ2lhbyA9IGMocmVwKCJOb3J0ZSIsIDcpLCByZXAoIk5vcmRlc3RlIiwgOSksIHJlcCgiU3VkZXN0ZSIsIDQpLCByZXAoIlN1bCIsIDMpLCByZXAoIkNlbnRyby1PZXN0ZSIsIDQpKQopCmBgYAoKYGBge3IgaGVhZCB1Zl9kaWN0fQpoZWFkKHVmX2RpY3QsIDIwKQpgYGAKCkFxdWkgYSBsaXN0YSBkZSBjb2x1bmFzIHF1ZSB2b3UgZXN0cmFpciBkYXMgdGFiZWxhcyBkbyBJTkZPUEVOLiBDcmllaSBlc3NhIGxpc3RhIHVzYW5kbyBtYW5pcHVsYcOnw6NvIGNvbSBFeGNlbC4KYGBge3IgQ29sdW5hcyB1c2FkYXMgSU5GT1BFTiwgaW5jbHVkZSA9IEZBTFNFfQpjb2x1bmFzIDwtIGMoUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19wcm92aXPDs3Jpb3Nfc2VtX2NvbmRlbmHDp8Ojb19KdXN0acOnYV9Fc3RhZHVhbF9NYXNjdWxpbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBwcm92aXPDs3Jpb3MgKHNlbSBjb25kZW5hw6fDo28pIHwgSnVzdGnDp2EgRXN0YWR1YWwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3Byb3Zpc8Ozcmlvc19zZW1fY29uZGVuYcOnw6NvX0p1c3Rpw6dhX0VzdGFkdWFsX0ZlbWluaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3MgcHJvdmlzw7NyaW9zIChzZW0gY29uZGVuYcOnw6NvKSB8IEp1c3Rpw6dhIEVzdGFkdWFsIEZlbWluaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3Byb3Zpc8Ozcmlvc19zZW1fY29uZGVuYcOnw6NvX0p1c3Rpw6dhX0ZlZGVyYWxfTWFzY3VsaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3MgcHJvdmlzw7NyaW9zIChzZW0gY29uZGVuYcOnw6NvKSB8IEp1c3Rpw6dhIEZlZGVyYWwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3Byb3Zpc8Ozcmlvc19zZW1fY29uZGVuYcOnw6NvX0p1c3Rpw6dhX0ZlZGVyYWxfRmVtaW5pbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBwcm92aXPDs3Jpb3MgKHNlbSBjb25kZW5hw6fDo28pIHwgSnVzdGnDp2EgRmVkZXJhbCBGZW1pbmlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19wcm92aXPDs3Jpb3Nfc2VtX2NvbmRlbmHDp8Ojb19PdXRyb3NKdXN0X1RyYWJfY8OtdmVsX01hc2N1bGlubwk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHByb3Zpc8OzcmlvcyAoc2VtIGNvbmRlbmHDp8OjbykgfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3Byb3Zpc8Ozcmlvc19zZW1fY29uZGVuYcOnw6NvX091dHJvc0p1c3RfVHJhYl9jw612ZWxfRmVtaW5pbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBwcm92aXPDs3Jpb3MgKHNlbSBjb25kZW5hw6fDo28pIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIEZlbWluaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3Byb3Zpc8Ozcmlvc19zZW1fY29uZGVuYcOnw6NvX1RvdGFsCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3MgcHJvdmlzw7NyaW9zIChzZW0gY29uZGVuYcOnw6NvKSB8IFRvdGFsIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3NlbnRlbmNpYWRvc19yZWdpbWVfZmVjaGFkb19KdXN0acOnYV9Fc3RhZHVhbF9NYXNjdWxpbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgZmVjaGFkbyB8IEp1c3Rpw6dhIEVzdGFkdWFsIE1hc2N1bGlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19zZW50ZW5jaWFkb3NfcmVnaW1lX2ZlY2hhZG9fSnVzdGnDp2FfRXN0YWR1YWxfRmVtaW5pbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgZmVjaGFkbyB8IEp1c3Rpw6dhIEVzdGFkdWFsIEZlbWluaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3NlbnRlbmNpYWRvc19yZWdpbWVfZmVjaGFkb19KdXN0acOnYV9GZWRlcmFsX01hc2N1bGlubwk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBmZWNoYWRvIHwgSnVzdGnDp2EgRmVkZXJhbCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIFBvcHVsYcOnw6NvX3ByaXNpb25hbF9QcmVzb3Nfc2VudGVuY2lhZG9zX3JlZ2ltZV9mZWNoYWRvX0p1c3Rpw6dhX0ZlZGVyYWxfRmVtaW5pbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgZmVjaGFkbyB8IEp1c3Rpw6dhIEZlZGVyYWwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIFBvcHVsYcOnw6NvX3ByaXNpb25hbF9QcmVzb3Nfc2VudGVuY2lhZG9zX3JlZ2ltZV9mZWNoYWRvX091dHJvc0p1c3RfVHJhYl9jw612ZWxfTWFzY3VsaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGZlY2hhZG8gfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3NlbnRlbmNpYWRvc19yZWdpbWVfZmVjaGFkb19PdXRyb3NKdXN0X1RyYWJfY8OtdmVsX0ZlbWluaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGZlY2hhZG8gfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIFBvcHVsYcOnw6NvX3ByaXNpb25hbF9QcmVzb3Nfc2VudGVuY2lhZG9zX3JlZ2ltZV9mZWNoYWRvX1RvdGFsCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGZlY2hhZG8gfCBUb3RhbCIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19zZW50ZW5jaWFkb3NfcmVnaW1lX3NlbWlhYmVydG9fSnVzdGnDp2FfRXN0YWR1YWxfTWFzY3VsaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIHNlbWlhYmVydG8gfCBKdXN0acOnYSBFc3RhZHVhbCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIFBvcHVsYcOnw6NvX3ByaXNpb25hbF9QcmVzb3Nfc2VudGVuY2lhZG9zX3JlZ2ltZV9zZW1pYWJlcnRvX0p1c3Rpw6dhX0VzdGFkdWFsX0ZlbWluaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIHNlbWlhYmVydG8gfCBKdXN0acOnYSBFc3RhZHVhbCBGZW1pbmlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19zZW50ZW5jaWFkb3NfcmVnaW1lX3NlbWlhYmVydG9fSnVzdGnDp2FfRmVkZXJhbF9NYXNjdWxpbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgc2VtaWFiZXJ0byB8IEp1c3Rpw6dhIEZlZGVyYWwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3NlbnRlbmNpYWRvc19yZWdpbWVfc2VtaWFiZXJ0b19KdXN0acOnYV9GZWRlcmFsX0ZlbWluaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIHNlbWlhYmVydG8gfCBKdXN0acOnYSBGZWRlcmFsIEZlbWluaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3NlbnRlbmNpYWRvc19yZWdpbWVfc2VtaWFiZXJ0b19PdXRyb3NKdXN0X1RyYWJfY8OtdmVsX01hc2N1bGlubwk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBzZW1pYWJlcnRvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIE1hc2N1bGlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19zZW50ZW5jaWFkb3NfcmVnaW1lX3NlbWlhYmVydG9fT3V0cm9zSnVzdF9UcmFiX2PDrXZlbF9GZW1pbmlubwk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBzZW1pYWJlcnRvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIEZlbWluaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfUHJlc29zX3NlbnRlbmNpYWRvc19yZWdpbWVfc2VtaWFiZXJ0b19Ub3RhbAk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBzZW1pYWJlcnRvIHwgVG90YWwiCSwKICAgICAgICAgICAgIFBvcHVsYcOnw6NvX3ByaXNpb25hbF9QcmVzb3Nfc2VudGVuY2lhZG9zX3JlZ2ltZV9hYmVydG9fSnVzdGnDp2FfRXN0YWR1YWxfTWFzY3VsaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IEp1c3Rpw6dhIEVzdGFkdWFsIE1hc2N1bGlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19zZW50ZW5jaWFkb3NfcmVnaW1lX2FiZXJ0b19KdXN0acOnYV9Fc3RhZHVhbF9GZW1pbmlubwk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBhYmVydG8gfCBKdXN0acOnYSBFc3RhZHVhbCBGZW1pbmlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19zZW50ZW5jaWFkb3NfcmVnaW1lX2FiZXJ0b19KdXN0acOnYV9GZWRlcmFsX01hc2N1bGlubwk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBhYmVydG8gfCBKdXN0acOnYSBGZWRlcmFsIE1hc2N1bGlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19zZW50ZW5jaWFkb3NfcmVnaW1lX2FiZXJ0b19KdXN0acOnYV9GZWRlcmFsX0ZlbWluaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IEp1c3Rpw6dhIEZlZGVyYWwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIFBvcHVsYcOnw6NvX3ByaXNpb25hbF9QcmVzb3Nfc2VudGVuY2lhZG9zX3JlZ2ltZV9hYmVydG9fT3V0cm9zSnVzdF9UcmFiX2PDrXZlbF9NYXNjdWxpbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgYWJlcnRvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIE1hc2N1bGlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19zZW50ZW5jaWFkb3NfcmVnaW1lX2FiZXJ0b19PdXRyb3NKdXN0X1RyYWJfY8OtdmVsX0ZlbWluaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IE91dHJvcyhKdXN0LiBUcmFiLiwgY8OtdmVsKSBGZW1pbmlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX1ByZXNvc19zZW50ZW5jaWFkb3NfcmVnaW1lX2FiZXJ0b19Ub3RhbAk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBhYmVydG8gfCBUb3RhbCIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX01lZGlkYV9kZV9zZWd1cmFuw6dhX2ludGVybmHDp8Ojb19KdXN0acOnYV9Fc3RhZHVhbF9NYXNjdWxpbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gaW50ZXJuYcOnw6NvIHwgSnVzdGnDp2EgRXN0YWR1YWwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfTWVkaWRhX2RlX3NlZ3VyYW7Dp2FfaW50ZXJuYcOnw6NvX0p1c3Rpw6dhX0VzdGFkdWFsX0ZlbWluaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIGludGVybmHDp8OjbyB8IEp1c3Rpw6dhIEVzdGFkdWFsIEZlbWluaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfTWVkaWRhX2RlX3NlZ3VyYW7Dp2FfaW50ZXJuYcOnw6NvX0p1c3Rpw6dhX0ZlZGVyYWxfTWFzY3VsaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIGludGVybmHDp8OjbyB8IEp1c3Rpw6dhIEZlZGVyYWwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfTWVkaWRhX2RlX3NlZ3VyYW7Dp2FfaW50ZXJuYcOnw6NvX0p1c3Rpw6dhX0ZlZGVyYWxfRmVtaW5pbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gaW50ZXJuYcOnw6NvIHwgSnVzdGnDp2EgRmVkZXJhbCBGZW1pbmlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX01lZGlkYV9kZV9zZWd1cmFuw6dhX2ludGVybmHDp8Ojb19PdXRyb3NKdXN0X1RyYWJfY8OtdmVsX01hc2N1bGlubwk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSBpbnRlcm5hw6fDo28gfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfTWVkaWRhX2RlX3NlZ3VyYW7Dp2FfaW50ZXJuYcOnw6NvX091dHJvc0p1c3RfVHJhYl9jw612ZWxfRmVtaW5pbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gaW50ZXJuYcOnw6NvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIEZlbWluaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfTWVkaWRhX2RlX3NlZ3VyYW7Dp2FfaW50ZXJuYcOnw6NvX1RvdGFsCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIGludGVybmHDp8OjbyB8IFRvdGFsIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfTWVkaWRhX2RlX3NlZ3VyYW7Dp2FfdHJhdGFtZW50b19hbWJ1bGF0b3JpYWxfSnVzdGnDp2FfRXN0YWR1YWxfTWFzY3VsaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIHRyYXRhbWVudG8gYW1idWxhdG9yaWFsIHwgSnVzdGnDp2EgRXN0YWR1YWwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfTWVkaWRhX2RlX3NlZ3VyYW7Dp2FfdHJhdGFtZW50b19hbWJ1bGF0b3JpYWxfSnVzdGnDp2FfRXN0YWR1YWxfRmVtaW5pbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gdHJhdGFtZW50byBhbWJ1bGF0b3JpYWwgfCBKdXN0acOnYSBFc3RhZHVhbCBGZW1pbmlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX01lZGlkYV9kZV9zZWd1cmFuw6dhX3RyYXRhbWVudG9fYW1idWxhdG9yaWFsX0p1c3Rpw6dhX0ZlZGVyYWxfTWFzY3VsaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIHRyYXRhbWVudG8gYW1idWxhdG9yaWFsIHwgSnVzdGnDp2EgRmVkZXJhbCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIFBvcHVsYcOnw6NvX3ByaXNpb25hbF9NZWRpZGFfZGVfc2VndXJhbsOnYV90cmF0YW1lbnRvX2FtYnVsYXRvcmlhbF9KdXN0acOnYV9GZWRlcmFsX0ZlbWluaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIHRyYXRhbWVudG8gYW1idWxhdG9yaWFsIHwgSnVzdGnDp2EgRmVkZXJhbCBGZW1pbmlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX01lZGlkYV9kZV9zZWd1cmFuw6dhX3RyYXRhbWVudG9fYW1idWxhdG9yaWFsX091dHJvc0p1c3RfVHJhYl9jw612ZWxfTWFzY3VsaW5vCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIHRyYXRhbWVudG8gYW1idWxhdG9yaWFsIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIE1hc2N1bGlubyIJLAogICAgICAgICAgICAgUG9wdWxhw6fDo29fcHJpc2lvbmFsX01lZGlkYV9kZV9zZWd1cmFuw6dhX3RyYXRhbWVudG9fYW1idWxhdG9yaWFsX091dHJvc0p1c3RfVHJhYl9jw612ZWxfRmVtaW5pbm8JPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gdHJhdGFtZW50byBhbWJ1bGF0b3JpYWwgfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIFBvcHVsYcOnw6NvX3ByaXNpb25hbF9NZWRpZGFfZGVfc2VndXJhbsOnYV90cmF0YW1lbnRvX2FtYnVsYXRvcmlhbF9Ub3RhbAk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSB0cmF0YW1lbnRvIGFtYnVsYXRvcmlhbCB8IFRvdGFsIgksCiAgICAgICAgICAgICBQb3B1bGHDp8Ojb19wcmlzaW9uYWxfVG90YWwJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFRvdGFsIgksCiAgICAgICAgICAgICBmYWl4YV9ldGFyaWFfTWFzY3VsaW5vXzE4X2FfMjRfYW5vcwk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDE4IGEgMjQgYW5vcyB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZmFpeGFfZXRhcmlhX0ZlbWluaW5vXzE4X2FfMjRfYW5vcwk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDE4IGEgMjQgYW5vcyB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBmYWl4YV9ldGFyaWFfVG90YWxfMThfYV8yNF9hbm9zCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMTggYSAyNCBhbm9zIHwgVG90YWwiCSwKICAgICAgICAgICAgIGZhaXhhX2V0YXJpYV9NYXNjdWxpbm9fMjVfYV8yOV9hbm9zCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMjUgYSAyOSBhbm9zIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBmYWl4YV9ldGFyaWFfRmVtaW5pbm9fMjVfYV8yOV9hbm9zCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMjUgYSAyOSBhbm9zIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGZhaXhhX2V0YXJpYV9Ub3RhbF8yNV9hXzI5X2Fub3MJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAyNSBhIDI5IGFub3MgfCBUb3RhbCIJLAogICAgICAgICAgICAgZmFpeGFfZXRhcmlhX01hc2N1bGlub18zMF9hXzM0X2Fub3MJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAzMCBhIDM0IGFub3MgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGZhaXhhX2V0YXJpYV9GZW1pbmlub18zMF9hXzM0X2Fub3MJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAzMCBhIDM0IGFub3MgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgZmFpeGFfZXRhcmlhX1RvdGFsXzMwX2FfMzRfYW5vcwk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDMwIGEgMzQgYW5vcyB8IFRvdGFsIgksCiAgICAgICAgICAgICBmYWl4YV9ldGFyaWFfTWFzY3VsaW5vXzM1X2FfNDVfYW5vcwk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDM1IGEgNDUgYW5vcyB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZmFpeGFfZXRhcmlhX0ZlbWluaW5vXzM1X2FfNDVfYW5vcwk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDM1IGEgNDUgYW5vcyB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBmYWl4YV9ldGFyaWFfVG90YWxfMzVfYV80NV9hbm9zCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMzUgYSA0NSBhbm9zIHwgVG90YWwiCSwKICAgICAgICAgICAgIGZhaXhhX2V0YXJpYV9NYXNjdWxpbm9fNDZfYV82MF9hbm9zCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgNDYgYSA2MCBhbm9zIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBmYWl4YV9ldGFyaWFfRmVtaW5pbm9fNDZfYV82MF9hbm9zCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgNDYgYSA2MCBhbm9zIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGZhaXhhX2V0YXJpYV9Ub3RhbF80Nl9hXzYwX2Fub3MJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCA0NiBhIDYwIGFub3MgfCBUb3RhbCIJLAogICAgICAgICAgICAgZmFpeGFfZXRhcmlhX01hc2N1bGlub182MV9hXzcwX2Fub3MJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCA2MSBhIDcwIGFub3MgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGZhaXhhX2V0YXJpYV9GZW1pbmlub182MV9hXzcwX2Fub3MJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCA2MSBhIDcwIGFub3MgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgZmFpeGFfZXRhcmlhX1RvdGFsXzYxX2FfNzBfYW5vcwk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDYxIGEgNzAgYW5vcyB8IFRvdGFsIgksCiAgICAgICAgICAgICBmYWl4YV9ldGFyaWFfTWFzY3VsaW5vX01haXNfZGVfNzBfYW5vcwk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IE1haXMgZGUgNzAgYW5vcyB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZmFpeGFfZXRhcmlhX0ZlbWluaW5vX01haXNfZGVfNzBfYW5vcwk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IE1haXMgZGUgNzAgYW5vcyB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBmYWl4YV9ldGFyaWFfVG90YWxfTWFpc19kZV83MF9hbm9zCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgTWFpcyBkZSA3MCBhbm9zIHwgVG90YWwiCSwKICAgICAgICAgICAgIGZhaXhhX2V0YXJpYV9NYXNjdWxpbm9fTsOjb19pbmZvcm1hZG8JPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCBOw6NvIGluZm9ybWFkbyB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZmFpeGFfZXRhcmlhX0ZlbWluaW5vX07Do29faW5mb3JtYWRvCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgTsOjbyBpbmZvcm1hZG8gfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgZXRuaWFfTWFzY3VsaW5vX0JyYW5jYQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBCcmFuY2EgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGV0bmlhX0ZlbWluaW5vX0JyYW5jYQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBCcmFuY2EgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgZXRuaWFfVG90YWxfQnJhbmNhCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEJyYW5jYSB8IFRvdGFsIgksCiAgICAgICAgICAgICBldG5pYV9NYXNjdWxpbm9fUHJldGEJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgUHJldGEgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGV0bmlhX0ZlbWluaW5vX1ByZXRhCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IFByZXRhIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGV0bmlhX1RvdGFsX1ByZXRhCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IFByZXRhIHwgVG90YWwiCSwKICAgICAgICAgICAgIGV0bmlhX01hc2N1bGlub19QYXJkYQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBQYXJkYSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZXRuaWFfRmVtaW5pbm9fUGFyZGEJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgUGFyZGEgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgZXRuaWFfVG90YWxfUGFyZGEJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgUGFyZGEgfCBUb3RhbCIJLAogICAgICAgICAgICAgZXRuaWFfTWFzY3VsaW5vX0FtYXJlbGEJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgQW1hcmVsYSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZXRuaWFfRmVtaW5pbm9fQW1hcmVsYQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBBbWFyZWxhIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGV0bmlhX1RvdGFsX0FtYXJlbGEJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgQW1hcmVsYSB8IFRvdGFsIgksCiAgICAgICAgICAgICBldG5pYV9NYXNjdWxpbm9fSW5kw61nZW5hCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEluZMOtZ2VuYSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZXRuaWFfRmVtaW5pbm9fSW5kw61nZW5hCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEluZMOtZ2VuYSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBldG5pYV9Ub3RhbF9JbmTDrWdlbmEJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgSW5kw61nZW5hIHwgVG90YWwiCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX01hc2N1bGlub19BbmFsZmFiZXRvCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgQW5hbGZhYmV0byB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fRmVtaW5pbm9fQW5hbGZhYmV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEFuYWxmYWJldG8gfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fVG90YWxfQW5hbGZhYmV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEFuYWxmYWJldG8gfCBUb3RhbCIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fTWFzY3VsaW5vX0FsZmFiZXRpemFkb19zZW1fY3Vyc29zX3JlZ3VsYXJlcwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEFsZmFiZXRpemFkbyAoc2VtIGN1cnNvcyByZWd1bGFyZXMpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19GZW1pbmlub19BbGZhYmV0aXphZG9fc2VtX2N1cnNvc19yZWd1bGFyZXMJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBBbGZhYmV0aXphZG8gKHNlbSBjdXJzb3MgcmVndWxhcmVzKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19Ub3RhbF9BbGZhYmV0aXphZG9fc2VtX2N1cnNvc19yZWd1bGFyZXMJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBBbGZhYmV0aXphZG8gKHNlbSBjdXJzb3MgcmVndWxhcmVzKSB8IFRvdGFsIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19NYXNjdWxpbm9fRW5zaW5vX0Z1bmRhbWVudGFsX0luY29tcGxldG8JPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gRnVuZGFtZW50YWwgSW5jb21wbGV0byB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fRmVtaW5pbm9fRW5zaW5vX0Z1bmRhbWVudGFsX0luY29tcGxldG8JPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gRnVuZGFtZW50YWwgSW5jb21wbGV0byB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19Ub3RhbF9FbnNpbm9fRnVuZGFtZW50YWxfSW5jb21wbGV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBGdW5kYW1lbnRhbCBJbmNvbXBsZXRvIHwgVG90YWwiCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX01hc2N1bGlub19FbnNpbm9fRnVuZGFtZW50YWxfQ29tcGxldG8JPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gRnVuZGFtZW50YWwgQ29tcGxldG8gfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX0ZlbWluaW5vX0Vuc2lub19GdW5kYW1lbnRhbF9Db21wbGV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBGdW5kYW1lbnRhbCBDb21wbGV0byB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19Ub3RhbF9FbnNpbm9fRnVuZGFtZW50YWxfQ29tcGxldG8JPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gRnVuZGFtZW50YWwgQ29tcGxldG8gfCBUb3RhbCIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fTWFzY3VsaW5vX0Vuc2lub19Nw6lkaW9fSW5jb21wbGV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBNw6lkaW8gSW5jb21wbGV0byB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fRmVtaW5pbm9fRW5zaW5vX03DqWRpb19JbmNvbXBsZXRvCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIE3DqWRpbyBJbmNvbXBsZXRvIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX1RvdGFsX0Vuc2lub19Nw6lkaW9fSW5jb21wbGV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBNw6lkaW8gSW5jb21wbGV0byB8IFRvdGFsIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19NYXNjdWxpbm9fRW5zaW5vX03DqWRpb19Db21wbGV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBNw6lkaW8gQ29tcGxldG8gfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX0ZlbWluaW5vX0Vuc2lub19Nw6lkaW9fQ29tcGxldG8JPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gTcOpZGlvIENvbXBsZXRvIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX1RvdGFsX0Vuc2lub19Nw6lkaW9fQ29tcGxldG8JPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gTcOpZGlvIENvbXBsZXRvIHwgVG90YWwiCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX01hc2N1bGlub19FbnNpbm9fU3VwZXJpb3JfSW5jb21wbGV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBTdXBlcmlvciBJbmNvbXBsZXRvIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19GZW1pbmlub19FbnNpbm9fU3VwZXJpb3JfSW5jb21wbGV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBTdXBlcmlvciBJbmNvbXBsZXRvIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX1RvdGFsX0Vuc2lub19TdXBlcmlvcl9JbmNvbXBsZXRvCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIFN1cGVyaW9yIEluY29tcGxldG8gfCBUb3RhbCIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fTWFzY3VsaW5vX0Vuc2lub19TdXBlcmlvcl9Db21wbGV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBTdXBlcmlvciBDb21wbGV0byB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fRmVtaW5pbm9fRW5zaW5vX1N1cGVyaW9yX0NvbXBsZXRvCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIFN1cGVyaW9yIENvbXBsZXRvIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX1RvdGFsX0Vuc2lub19TdXBlcmlvcl9Db21wbGV0bwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBTdXBlcmlvciBDb21wbGV0byB8IFRvdGFsIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19NYXNjdWxpbm9fRW5zaW5vX2FjaW1hX2RlX1N1cGVyaW9yX0NvbXBsZXRvCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIGFjaW1hIGRlIFN1cGVyaW9yIENvbXBsZXRvIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19GZW1pbmlub19FbnNpbm9fYWNpbWFfZGVfU3VwZXJpb3JfQ29tcGxldG8JPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gYWNpbWEgZGUgU3VwZXJpb3IgQ29tcGxldG8gfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fVG90YWxfRW5zaW5vX2FjaW1hX2RlX1N1cGVyaW9yX0NvbXBsZXRvCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIGFjaW1hIGRlIFN1cGVyaW9yIENvbXBsZXRvIHwgVG90YWwiCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX01hc2N1bGlub19Ow6NvX0luZm9ybWFkbwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IE7Do28gSW5mb3JtYWRvIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19GZW1pbmlub19Ow6NvX0luZm9ybWFkbwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IE7Do28gSW5mb3JtYWRvIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGdyYXVfZGVfaW5zdHJ1Y2FvX1RvdGFsX07Do29fSW5mb3JtYWRvCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgTsOjbyBJbmZvcm1hZG8gfCBUb3RhbCIJLAogICAgICAgICAgICAgZ3JhdV9kZV9pbnN0cnVjYW9fTWFzY3VsaW5vCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19GZW1pbmlubwk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBncmF1X2RlX2luc3RydWNhb19Ub3RhbAk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IFRvdGFsIgksCiAgICAgICAgICAgICB0ZW1wb190b3RhbF9kZV9wZW5hX01hc2N1bGlub19BdMOpXzZfbWVzZXMJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgQXTDqSA2IG1lc2VzIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICB0ZW1wb190b3RhbF9kZV9wZW5hX0ZlbWluaW5vX0F0w6lfNl9tZXNlcwk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBBdMOpIDYgbWVzZXMgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9NYXNjdWxpbm9fTWFpc19kZV82X21lc2VzX2F0w6lfMV9hbm8JPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA2IG1lc2VzIGF0w6kgMSBhbm8gKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3RvdGFsX2RlX3BlbmFfRmVtaW5pbm9fTWFpc19kZV82X21lc2VzX2F0w6lfMV9hbm8JPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA2IG1lc2VzIGF0w6kgMSBhbm8gKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9NYXNjdWxpbm9fTWFpc19kZV8xX2Fub19hdMOpXzJfYW5vcwk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDEgYW5vIGF0w6kgMiBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICB0ZW1wb190b3RhbF9kZV9wZW5hX0ZlbWluaW5vX01haXNfZGVfMV9hbm9fYXTDqV8yX2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAxIGFubyBhdMOpIDIgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICB0ZW1wb190b3RhbF9kZV9wZW5hX01hc2N1bGlub19NYWlzX2RlXzJfYXTDqV80X2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAyIGF0w6kgNCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICB0ZW1wb190b3RhbF9kZV9wZW5hX0ZlbWluaW5vX01haXNfZGVfMl9hdMOpXzRfYW5vcwk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDIgYXTDqSA0IGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9NYXNjdWxpbm9fTWFpc19kZV80X2F0w6lfOF9hbm9zCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgNCBhdMOpIDggYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9GZW1pbmlub19NYWlzX2RlXzRfYXTDqV84X2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA0IGF0w6kgOCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3RvdGFsX2RlX3BlbmFfTWFzY3VsaW5vX01haXNfZGVfOF9hdMOpXzE1X2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA4IGF0w6kgMTUgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9GZW1pbmlub19NYWlzX2RlXzhfYXTDqV8xNV9hbm9zCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgOCBhdMOpIDE1IGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9NYXNjdWxpbm9fTWFpc19kZV8xNV9hdMOpXzIwX2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAxNSBhdMOpIDIwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3RvdGFsX2RlX3BlbmFfRmVtaW5pbm9fTWFpc19kZV8xNV9hdMOpXzIwX2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAxNSBhdMOpIDIwIGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9NYXNjdWxpbm9fTWFpc19kZV8yMF9hdMOpXzMwX2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAyMCBhdMOpIDMwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3RvdGFsX2RlX3BlbmFfRmVtaW5pbm9fTWFpc19kZV8yMF9hdMOpXzMwX2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAyMCBhdMOpIDMwIGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9NYXNjdWxpbm9fTWFpc19kZV8zMF9hdMOpXzUwX2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAzMCBhdMOpIDUwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3RvdGFsX2RlX3BlbmFfRmVtaW5pbm9fTWFpc19kZV8zMF9hdMOpXzUwX2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAzMCBhdMOpIDUwIGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9NYXNjdWxpbm9fTWFpc19kZV81MF9hdMOpXzEwMF9hbm9zCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgNTAgYXTDqSAxMDAgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9GZW1pbmlub19NYWlzX2RlXzUwX2F0w6lfMTAwX2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA1MCBhdMOpIDEwMCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3RvdGFsX2RlX3BlbmFfTWFzY3VsaW5vX01haXNfZGVfMTAwX2Fub3MJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAxMDAgYW5vcyB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgdGVtcG9fdG90YWxfZGVfcGVuYV9GZW1pbmlub19NYWlzX2RlXzEwMF9hbm9zCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMTAwIGFub3MgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgdGVtcG9fcmVtYW5lc2NlbnRlX2RlX3BlbmFfTWFzY3VsaW5vX0F0w6lfNl9tZXNlcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IEF0w6kgNiBtZXNlcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgdGVtcG9fcmVtYW5lc2NlbnRlX2RlX3BlbmFfRmVtaW5pbm9fQXTDqV82X21lc2VzCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgQXTDqSA2IG1lc2VzIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX01hc2N1bGlub19NYWlzX2RlXzZfbWVzZXNfYXTDqV8xX2Fubwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNiBtZXNlcyBhdMOpIDEgYW5vIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICB0ZW1wb19yZW1hbmVzY2VudGVfZGVfcGVuYV9GZW1pbmlub19NYWlzX2RlXzZfbWVzZXNfYXTDqV8xX2Fubwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNiBtZXNlcyBhdMOpIDEgYW5vIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX01hc2N1bGlub19NYWlzX2RlXzFfYW5vX2F0w6lfMl9hbm9zCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAxIGFubyBhdMOpIDIgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgdGVtcG9fcmVtYW5lc2NlbnRlX2RlX3BlbmFfRmVtaW5pbm9fTWFpc19kZV8xX2Fub19hdMOpXzJfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMSBhbm8gYXTDqSAyIGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgdGVtcG9fcmVtYW5lc2NlbnRlX2RlX3BlbmFfTWFzY3VsaW5vX01haXNfZGVfMl9hdMOpXzRfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMiBhdMOpIDQgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgdGVtcG9fcmVtYW5lc2NlbnRlX2RlX3BlbmFfRmVtaW5pbm9fTWFpc19kZV8yX2F0w6lfNF9hbm9zCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAyIGF0w6kgNCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX01hc2N1bGlub19NYWlzX2RlXzRfYXTDqV84X2Fub3MJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDQgYXTDqSA4IGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX0ZlbWluaW5vX01haXNfZGVfNF9hdMOpXzhfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNCBhdMOpIDggYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICB0ZW1wb19yZW1hbmVzY2VudGVfZGVfcGVuYV9NYXNjdWxpbm9fTWFpc19kZV84X2F0w6lfMTVfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgOCBhdMOpIDE1IGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX0ZlbWluaW5vX01haXNfZGVfOF9hdMOpXzE1X2Fub3MJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDggYXTDqSAxNSBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX01hc2N1bGlub19NYWlzX2RlXzE1X2F0w6lfMjBfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMTUgYXTDqSAyMCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICB0ZW1wb19yZW1hbmVzY2VudGVfZGVfcGVuYV9GZW1pbmlub19NYWlzX2RlXzE1X2F0w6lfMjBfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMTUgYXTDqSAyMCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX01hc2N1bGlub19NYWlzX2RlXzIwX2F0w6lfMzBfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMjAgYXTDqSAzMCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICB0ZW1wb19yZW1hbmVzY2VudGVfZGVfcGVuYV9GZW1pbmlub19NYWlzX2RlXzIwX2F0w6lfMzBfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMjAgYXTDqSAzMCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX01hc2N1bGlub19NYWlzX2RlXzMwX2F0w6lfNTBfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMzAgYXTDqSA1MCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICB0ZW1wb19yZW1hbmVzY2VudGVfZGVfcGVuYV9GZW1pbmlub19NYWlzX2RlXzMwX2F0w6lfNTBfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMzAgYXTDqSA1MCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX01hc2N1bGlub19NYWlzX2RlXzUwX2F0w6lfMTAwX2Fub3MJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDUwIGF0w6kgMTAwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX0ZlbWluaW5vX01haXNfZGVfNTBfYXTDqV8xMDBfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNTAgYXTDqSAxMDAgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICB0ZW1wb19yZW1hbmVzY2VudGVfZGVfcGVuYV9NYXNjdWxpbm9fTWFpc19kZV8xMDBfYW5vcwk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMTAwIGFub3MgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHRlbXBvX3JlbWFuZXNjZW50ZV9kZV9wZW5hX0ZlbWluaW5vX01haXNfZGVfMTAwX2Fub3MJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDEwMCBhbm9zIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19Ib21pY8OtZGlvX3NpbXBsZXMJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWRpbyBzaW1wbGVzIChBcnQuIDEyMSwgY2FwdXQpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Ib21pY8OtZGlvX3NpbXBsZXMJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWRpbyBzaW1wbGVzIChBcnQuIDEyMSwgY2FwdXQpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX0hvbWljw61kaW9fc2ltcGxlcwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBIb21pY8OtZGlvIHNpbXBsZXMgKEFydC4gMTIxLCBjYXB1dCkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX0hvbWljw61saW9fY3VscG9zbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBIb21pY8OtbGlvIGN1bHBvc28gKEFydC4gMTIxLCDCpyAzwrApIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Ib21pY8OtbGlvX2N1bHBvc28JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWxpbyBjdWxwb3NvIChBcnQuIDEyMSwgwqcgM8KwKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9Ib21pY8OtbGlvX2N1bHBvc28JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWxpbyBjdWxwb3NvIChBcnQuIDEyMSwgwqcgM8KwKSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fSG9taWPDrWRpb19xdWFsaWZpY2Fkbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBIb21pY8OtZGlvIHF1YWxpZmljYWRvIChBcnQuIDEyMSwgwqcgMsKwKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fSG9taWPDrWRpb19xdWFsaWZpY2Fkbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBIb21pY8OtZGlvIHF1YWxpZmljYWRvIChBcnQuIDEyMSwgwqcgMsKwKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9Ib21pY8OtZGlvX3F1YWxpZmljYWRvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IEhvbWljw61kaW8gcXVhbGlmaWNhZG8gKEFydC4gMTIxLCDCpyAywrApIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19BYm9ydG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgQWJvcnRvIChBcnQuIDEyNCwgMTI1LCAxMjYgZSAxMjcpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19BYm9ydG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgQWJvcnRvIChBcnQuIDEyNCwgMTI1LCAxMjYgZSAxMjcpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX0Fib3J0bwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBBYm9ydG8gKEFydC4gMTI0LCAxMjUsIDEyNiBlIDEyNykgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX0xlc8Ojb19jb3Jwb3JhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBMZXPDo28gY29ycG9yYWwgKEFydC4gMTI5LCBjYXB1dCBlIMKnIDHCsCwgMsKwLCAzwrAgZSA2wrApIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19MZXPDo29fY29ycG9yYWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgTGVzw6NvIGNvcnBvcmFsIChBcnQuIDEyOSwgY2FwdXQgZSDCpyAxwrAsIDLCsCwgM8KwIGUgNsKwKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9MZXPDo29fY29ycG9yYWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgTGVzw6NvIGNvcnBvcmFsIChBcnQuIDEyOSwgY2FwdXQgZSDCpyAxwrAsIDLCsCwgM8KwIGUgNsKwKSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fVmlvbMOqbmNpYV9kb23DqXN0aWNhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IFZpb2zDqm5jaWEgZG9tw6lzdGljYSAoQXJ0LiAxMjksICDCpyA5wrApIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19WaW9sw6puY2lhX2RvbcOpc3RpY2EJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgVmlvbMOqbmNpYSBkb23DqXN0aWNhIChBcnQuIDEyOSwgIMKnIDnCsCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfVmlvbMOqbmNpYV9kb23DqXN0aWNhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IFZpb2zDqm5jaWEgZG9tw6lzdGljYSAoQXJ0LiAxMjksICDCpyA5wrApIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19TZXF1ZXN0cm9fZV9jw6FyY2VyZV9wcml2YWRvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IFNlcXVlc3RybyBlIGPDoXJjZXJlIHByaXZhZG8gKEFydC4gMTQ4KSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fU2VxdWVzdHJvX2VfY8OhcmNlcmVfcHJpdmFkbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBTZXF1ZXN0cm8gZSBjw6FyY2VyZSBwcml2YWRvIChBcnQuIDE0OCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfU2VxdWVzdHJvX2VfY8OhcmNlcmVfcHJpdmFkbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBTZXF1ZXN0cm8gZSBjw6FyY2VyZSBwcml2YWRvIChBcnQuIDE0OCkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX091dHJvc19uw6NvX2xpc3RhZG9zX2FjaW1hX2VudHJlX29zX2FydGlnb3NfMTIyX2VfMTU0X0EJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDEyMiBlIDE1NC1BIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19PdXRyb3NfbsOjb19saXN0YWRvc19hY2ltYV9lbnRyZV9vc19hcnRpZ29zXzEyMl9lXzE1NF9BCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IE91dHJvcyAtIG7Do28gbGlzdGFkb3MgYWNpbWEgZW50cmUgb3MgYXJ0aWdvcyAxMjIgZSAxNTQtQSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9PdXRyb3NfbsOjb19saXN0YWRvc19hY2ltYV9lbnRyZV9vc19hcnRpZ29zXzEyMl9lXzE1NF9BCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IE91dHJvcyAtIG7Do28gbGlzdGFkb3MgYWNpbWEgZW50cmUgb3MgYXJ0aWdvcyAxMjIgZSAxNTQtQSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fRnVydG9fc2ltcGxlcwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEZ1cnRvIHNpbXBsZXMgKEFydC4gMTU1KSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fRnVydG9fc2ltcGxlcwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEZ1cnRvIHNpbXBsZXMgKEFydC4gMTU1KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9GdXJ0b19zaW1wbGVzCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRnVydG8gc2ltcGxlcyAoQXJ0LiAxNTUpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19GdXJ0b19xdWFsaWZpY2Fkbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEZ1cnRvIHF1YWxpZmljYWRvIChBcnQuIDE1NSwgwqcgNMKwIGUgNcKwKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fRnVydG9fcXVhbGlmaWNhZG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBGdXJ0byBxdWFsaWZpY2FkbyAoQXJ0LiAxNTUsIMKnIDTCsCBlIDXCsCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfRnVydG9fcXVhbGlmaWNhZG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBGdXJ0byBxdWFsaWZpY2FkbyAoQXJ0LiAxNTUsIMKnIDTCsCBlIDXCsCkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX1JvdWJvX3NpbXBsZXMJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSb3VibyBzaW1wbGVzIChBcnQuIDE1NykgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX1JvdWJvX3NpbXBsZXMJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSb3VibyBzaW1wbGVzIChBcnQuIDE1NykgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfUm91Ym9fc2ltcGxlcwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJvdWJvIHNpbXBsZXMgKEFydC4gMTU3KSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fUm91Ym9fcXVhbGlmaWNhZG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSb3VibyBxdWFsaWZpY2FkbyAoQXJ0LiAxNTcsIMKnIDLCsCB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fUm91Ym9fcXVhbGlmaWNhZG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSb3VibyBxdWFsaWZpY2FkbyAoQXJ0LiAxNTcsIMKnIDLCsCB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9Sb3Vib19xdWFsaWZpY2Fkbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJvdWJvIHF1YWxpZmljYWRvIChBcnQuIDE1NywgwqcgMsKwIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19MYXRyb2PDrW5pbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IExhdHJvY8OtbmlvIChBcnQuIDE1NywgwqcgM8KwKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fTGF0cm9jw61uaW8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBMYXRyb2PDrW5pbyAoQXJ0LiAxNTcsIMKnIDPCsCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfTGF0cm9jw61uaW8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBMYXRyb2PDrW5pbyAoQXJ0LiAxNTcsIMKnIDPCsCkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX0V4dG9yc8Ojbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEV4dG9yc8OjbyAoQXJ0LiAxNTgpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19FeHRvcnPDo28JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFeHRvcnPDo28gKEFydC4gMTU4KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9FeHRvcnPDo28JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFeHRvcnPDo28gKEFydC4gMTU4KSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fRXh0b3Jzw6NvX21lZGlhbnRlX3NlcXVlc3Rybwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEV4dG9yc8OjbyBtZWRpYW50ZSBzZXF1ZXN0cm8gKEFydC4gMTU5KSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fRXh0b3Jzw6NvX21lZGlhbnRlX3NlcXVlc3Rybwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEV4dG9yc8OjbyBtZWRpYW50ZSBzZXF1ZXN0cm8gKEFydC4gMTU5KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9FeHRvcnPDo29fbWVkaWFudGVfc2VxdWVzdHJvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRXh0b3Jzw6NvIG1lZGlhbnRlIHNlcXVlc3RybyAoQXJ0LiAxNTkpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19BcHJvcHJpYcOnw6NvX2luZMOpYml0YQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIChBcnQuIDE2OCkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX0Fwcm9wcmlhw6fDo29faW5kw6liaXRhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgQXByb3ByaWHDp8OjbyBpbmTDqWJpdGEgKEFydC4gMTY4KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9BcHJvcHJpYcOnw6NvX2luZMOpYml0YQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIChBcnQuIDE2OCkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX0Fwcm9wcmlhw6fDo29faW5kw6liaXRhX3ByZXZpZGVuY2nDoXJpYQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIHByZXZpZGVuY2nDoXJpYSAoQXJ0LiAxNjgtQSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX0Fwcm9wcmlhw6fDo29faW5kw6liaXRhX3ByZXZpZGVuY2nDoXJpYQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIHByZXZpZGVuY2nDoXJpYSAoQXJ0LiAxNjgtQSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfQXByb3ByaWHDp8Ojb19pbmTDqWJpdGFfcHJldmlkZW5jacOhcmlhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgQXByb3ByaWHDp8OjbyBpbmTDqWJpdGEgcHJldmlkZW5jacOhcmlhIChBcnQuIDE2OC1BKSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fRXN0ZWxpb25hdG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFc3RlbGlvbmF0byAoQXJ0LiAxNzEpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Fc3RlbGlvbmF0bwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEVzdGVsaW9uYXRvIChBcnQuIDE3MSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfRXN0ZWxpb25hdG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFc3RlbGlvbmF0byAoQXJ0LiAxNzEpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19SZWNlcHRhw6fDo28JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSZWNlcHRhw6fDo28gKEFydC4gMTgwKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fUmVjZXB0YcOnw6NvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUmVjZXB0YcOnw6NvIChBcnQuIDE4MCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfUmVjZXB0YcOnw6NvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUmVjZXB0YcOnw6NvIChBcnQuIDE4MCkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX1JlY2VwdGHDp8Ojb19xdWFsaWZpY2FkYQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJlY2VwdGHDp8OjbyBxdWFsaWZpY2FkYSAoQXJ0LiAxODAsIMKnIDHCsCkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX1JlY2VwdGHDp8Ojb19xdWFsaWZpY2FkYQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJlY2VwdGHDp8OjbyBxdWFsaWZpY2FkYSAoQXJ0LiAxODAsIMKnIDHCsCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfUmVjZXB0YcOnw6NvX3F1YWxpZmljYWRhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUmVjZXB0YcOnw6NvIHF1YWxpZmljYWRhIChBcnQuIDE4MCwgwqcgMcKwKSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fT3V0cm9zX27Do29fbGlzdGFkb3NfYWNpbWFfZW50cmVfb3NfYXJ0aWdvc18xNTZfZV8xNzkgCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDE1NiBlIDE3OSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fT3V0cm9zX27Do29fbGlzdGFkb3NfYWNpbWFfZW50cmVfb3NfYXJ0aWdvc18xNTZfZV8xNzkJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBPdXRyb3MgLSBuw6NvIGxpc3RhZG9zIGFjaW1hIGVudHJlIG9zIGFydGlnb3MgMTU2IGUgMTc5IHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX091dHJvc19uw6NvX2xpc3RhZG9zX2FjaW1hX2VudHJlX29zX2FydGlnb3NfMTU2X2VfMTc5CT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDE1NiBlIDE3OSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fRXN0dXBybwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgRXN0dXBybyAoQXJ0LiAyMTMpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Fc3R1cHJvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBFc3R1cHJvIChBcnQuIDIxMykgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfRXN0dXBybwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgRXN0dXBybyAoQXJ0LiAyMTMpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19BdGVudGFkb192aW9sZW50b19hb19wdWRvcgk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgQXRlbnRhZG8gdmlvbGVudG8gYW8gcHVkb3IgKEFydC4gMjE0KSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fQXRlbnRhZG9fdmlvbGVudG9fYW9fcHVkb3IJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEF0ZW50YWRvIHZpb2xlbnRvIGFvIHB1ZG9yIChBcnQuIDIxNCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfQXRlbnRhZG9fdmlvbGVudG9fYW9fcHVkb3IJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEF0ZW50YWRvIHZpb2xlbnRvIGFvIHB1ZG9yIChBcnQuIDIxNCkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX0VzdHVwcm9fZGVfdnVsbmVyw6F2ZWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEVzdHVwcm8gZGUgdnVsbmVyw6F2ZWwgKEFydC4gMjE3LUEpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Fc3R1cHJvX2RlX3Z1bG5lcsOhdmVsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBFc3R1cHJvIGRlIHZ1bG5lcsOhdmVsIChBcnQuIDIxNy1BKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9Fc3R1cHJvX2RlX3Z1bG5lcsOhdmVsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBFc3R1cHJvIGRlIHZ1bG5lcsOhdmVsIChBcnQuIDIxNy1BKSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fQ29ycnVww6fDo29fZGVfbWVub3Jlcwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgQ29ycnVww6fDo28gZGUgbWVub3JlcyAoQXJ0LiAyMTgpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Db3JydXDDp8Ojb19kZV9tZW5vcmVzCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBDb3JydXDDp8OjbyBkZSBtZW5vcmVzIChBcnQuIDIxOCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfQ29ycnVww6fDo29fZGVfbWVub3Jlcwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgQ29ycnVww6fDo28gZGUgbWVub3JlcyAoQXJ0LiAyMTgpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19UcsOhZmljb19pbnRlcm5hY2lvbmFsX2RlX3Blc3NvYV9wYXJhX2ZpbV9kZV9leHBsb3Jhw6fDo29fc2V4dWFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBUcsOhZmljbyBpbnRlcm5hY2lvbmFsIGRlIHBlc3NvYSBwYXJhIGZpbSBkZSBleHBsb3Jhw6fDo28gc2V4dWFsIChBcnQuIDIzMSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX1Ryw6FmaWNvX2ludGVybmFjaW9uYWxfZGVfcGVzc29hX3BhcmFfZmltX2RlX2V4cGxvcmHDp8Ojb19zZXh1YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgcGVzc29hIHBhcmEgZmltIGRlIGV4cGxvcmHDp8OjbyBzZXh1YWwgKEFydC4gMjMxKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9UcsOhZmljb19pbnRlcm5hY2lvbmFsX2RlX3Blc3NvYV9wYXJhX2ZpbV9kZV9leHBsb3Jhw6fDo29fc2V4dWFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBUcsOhZmljbyBpbnRlcm5hY2lvbmFsIGRlIHBlc3NvYSBwYXJhIGZpbSBkZSBleHBsb3Jhw6fDo28gc2V4dWFsIChBcnQuIDIzMSkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX1Ryw6FmaWNvX2ludGVybm9fZGVfcGVzc29hX3BhcmFfZmltX2RlX2V4cGxvcmHDp8Ojb19zZXh1YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IFRyw6FmaWNvIGludGVybm8gZGUgcGVzc29hIHBhcmEgZmltIGRlIGV4cGxvcmHDp8OjbyBzZXh1YWwgKEFydC4gMjMxLUEpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19UcsOhZmljb19pbnRlcm5vX2RlX3Blc3NvYV9wYXJhX2ZpbV9kZV9leHBsb3Jhw6fDo29fc2V4dWFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBUcsOhZmljbyBpbnRlcm5vIGRlIHBlc3NvYSBwYXJhIGZpbSBkZSBleHBsb3Jhw6fDo28gc2V4dWFsIChBcnQuIDIzMS1BKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9UcsOhZmljb19pbnRlcm5vX2RlX3Blc3NvYV9wYXJhX2ZpbV9kZV9leHBsb3Jhw6fDo29fc2V4dWFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBUcsOhZmljbyBpbnRlcm5vIGRlIHBlc3NvYSBwYXJhIGZpbSBkZSBleHBsb3Jhw6fDo28gc2V4dWFsIChBcnQuIDIzMS1BKSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fT3V0cm9zX0FydGlnb3NfMjE1XzIxNl9BXzIxOF9BXzIxOF9CXzIyN18yMjhfMjI5XzIzMAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgT3V0cm9zIChBcnRpZ29zIDIxNSwgMjE2LUEsIDIxOC1BLCAyMTgtQiwgMjI3LCAyMjgsIDIyOSwgMjMwKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fT3V0cm9zX0FydGlnb3NfMjE1XzIxNl9BXzIxOF9BXzIxOF9CXzIyN18yMjhfMjI5XzIzMAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgT3V0cm9zIChBcnRpZ29zIDIxNSwgMjE2LUEsIDIxOC1BLCAyMTgtQiwgMjI3LCAyMjgsIDIyOSwgMjMwKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9PdXRyb3NfQXJ0aWdvc18yMTVfMjE2X0FfMjE4X0FfMjE4X0JfMjI3XzIyOF8yMjlfMjMwCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBPdXRyb3MgKEFydGlnb3MgMjE1LCAyMTYtQSwgMjE4LUEsIDIxOC1CLCAyMjcsIDIyOCwgMjI5LCAyMzApIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19RdWFkcmlsaGFfb3VfYmFuZG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGF6IHDDumJsaWNhIHwgUXVhZHJpbGhhIG91IGJhbmRvIChBcnQuIDI4OCkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX1F1YWRyaWxoYV9vdV9iYW5kbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwYXogcMO6YmxpY2EgfCBRdWFkcmlsaGEgb3UgYmFuZG8gKEFydC4gMjg4KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9RdWFkcmlsaGFfb3VfYmFuZG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGF6IHDDumJsaWNhIHwgUXVhZHJpbGhhIG91IGJhbmRvIChBcnQuIDI4OCkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX01vZWRhX2ZhbHNhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IE1vZWRhIGZhbHNhIChBcnQuIDI4OSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX01vZWRhX2ZhbHNhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IE1vZWRhIGZhbHNhIChBcnQuIDI4OSkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfTW9lZGFfZmFsc2EJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgTW9lZGEgZmFsc2EgKEFydC4gMjg5KSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fRmFsc2lmaWNhw6fDo29fZGVfcGFww6lpc19zZWxvc19zaW5hbF9lX2RvY3VtZW50b3NfcMO6YmxpY29zCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IEZhbHNpZmljYcOnw6NvIGRlIHBhcMOpaXMsIHNlbG9zLCBzaW5hbCBlIGRvY3VtZW50b3MgcMO6YmxpY29zICggQXJ0LiAyOTMgYSAyOTcpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19GYWxzaWZpY2HDp8Ojb19kZV9wYXDDqWlzX3NlbG9zX3NpbmFsX2VfZG9jdW1lbnRvc19ww7pibGljb3MJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgRmFsc2lmaWNhw6fDo28gZGUgcGFww6lpcywgc2Vsb3MsIHNpbmFsIGUgZG9jdW1lbnRvcyBww7pibGljb3MgKCBBcnQuIDI5MyBhIDI5NykgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfRmFsc2lmaWNhw6fDo29fZGVfcGFww6lpc19zZWxvc19zaW5hbF9lX2RvY3VtZW50b3NfcMO6YmxpY29zCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IEZhbHNpZmljYcOnw6NvIGRlIHBhcMOpaXMsIHNlbG9zLCBzaW5hbCBlIGRvY3VtZW50b3MgcMO6YmxpY29zICggQXJ0LiAyOTMgYSAyOTcpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19GYWxzaWRhZGVfaWRlb2zDs2dpY2EJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgRmFsc2lkYWRlIGlkZW9sw7NnaWNhIChBcnQuIDI5OSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX0ZhbHNpZGFkZV9pZGVvbMOzZ2ljYQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBmw6kgcMO6YmxpY2EgfCBGYWxzaWRhZGUgaWRlb2zDs2dpY2EgKEFydC4gMjk5KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9GYWxzaWRhZGVfaWRlb2zDs2dpY2EJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgRmFsc2lkYWRlIGlkZW9sw7NnaWNhIChBcnQuIDI5OSkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX1Vzb19kZV9kb2N1bWVudG9fZmFsc28JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgVXNvIGRlIGRvY3VtZW50byBmYWxzbyAoQXJ0LiAzMDQpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Vc29fZGVfZG9jdW1lbnRvX2ZhbHNvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IFVzbyBkZSBkb2N1bWVudG8gZmFsc28gKEFydC4gMzA0KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9Vc29fZGVfZG9jdW1lbnRvX2ZhbHNvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IFVzbyBkZSBkb2N1bWVudG8gZmFsc28gKEFydC4gMzA0KSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fUGVjdWxhdG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgUGVjdWxhdG8gKEFydC4gMzEyIGUgMzEzKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fUGVjdWxhdG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgUGVjdWxhdG8gKEFydC4gMzEyIGUgMzEzKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9QZWN1bGF0bwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBQZWN1bGF0byAoQXJ0LiAzMTIgZSAzMTMpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19Db25jdXNzw6NvX2VfZXhjZXNzb19kZV9leGHDp8Ojbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb25jdXNzw6NvIGUgZXhjZXNzbyBkZSBleGHDp8OjbyAoQXJ0LiAzMTYpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Db25jdXNzw6NvX2VfZXhjZXNzb19kZV9leGHDp8Ojbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb25jdXNzw6NvIGUgZXhjZXNzbyBkZSBleGHDp8OjbyAoQXJ0LiAzMTYpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX0NvbmN1c3PDo29fZV9leGNlc3NvX2RlX2V4YcOnw6NvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvbmN1c3PDo28gZSBleGNlc3NvIGRlIGV4YcOnw6NvIChBcnQuIDMxNikgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX0NvcnJ1cMOnw6NvX3Bhc3NpdmEJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29ycnVww6fDo28gcGFzc2l2YSAoQXJ0LiAzMTcpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Db3JydXDDp8Ojb19wYXNzaXZhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvcnJ1cMOnw6NvIHBhc3NpdmEgKEFydC4gMzE3KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9Db3JydXDDp8Ojb19wYXNzaXZhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvcnJ1cMOnw6NvIHBhc3NpdmEgKEFydC4gMzE3KSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fQ29ycnVww6fDo29fYXRpdmEJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgcHJhdGljYWRvcyBwb3IgcGFydGljdWxhciBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb3JydXDDp8OjbyBhdGl2YSAoQXJ0LiAzMzMpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Db3JydXDDp8Ojb19hdGl2YQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBwcmF0aWNhZG9zIHBvciBwYXJ0aWN1bGFyIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvcnJ1cMOnw6NvIGF0aXZhIChBcnQuIDMzMykgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfQ29ycnVww6fDo29fYXRpdmEJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgcHJhdGljYWRvcyBwb3IgcGFydGljdWxhciBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb3JydXDDp8OjbyBhdGl2YSAoQXJ0LiAzMzMpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19Db250cmFiYW5kb19vdV9kZXNjYW1pbmhvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIHByYXRpY2Fkb3MgcG9yIHBhcnRpY3VsYXIgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29udHJhYmFuZG8gb3UgZGVzY2FtaW5obyAoQXJ0LiAzMzQpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Db250cmFiYW5kb19vdV9kZXNjYW1pbmhvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIHByYXRpY2Fkb3MgcG9yIHBhcnRpY3VsYXIgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29udHJhYmFuZG8gb3UgZGVzY2FtaW5obyAoQXJ0LiAzMzQpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX0NvbnRyYWJhbmRvX291X2Rlc2NhbWluaG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgcHJhdGljYWRvcyBwb3IgcGFydGljdWxhciBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb250cmFiYW5kbyBvdSBkZXNjYW1pbmhvIChBcnQuIDMzNCkgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX1Ryw6FmaWNvX2RlX2Ryb2dhcwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IFRyw6FmaWNvIGRlIGRyb2dhcyAoQXJ0LiAxMiBkYSBMZWkgNi4zNjgvNzYgZSBBcnQuIDMzIGRhIExlaSAxMS4zNDMvMDYpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19UcsOhZmljb19kZV9kcm9nYXMJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IERyb2dhcyAoTGVpIDYuMzY4Lzc2IGUgTGVpIDExLjM0My8wNikgfCBUcsOhZmljbyBkZSBkcm9nYXMgKEFydC4gMTIgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzMyBkYSBMZWkgMTEuMzQzLzA2KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9UcsOhZmljb19kZV9kcm9nYXMJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IERyb2dhcyAoTGVpIDYuMzY4Lzc2IGUgTGVpIDExLjM0My8wNikgfCBUcsOhZmljbyBkZSBkcm9nYXMgKEFydC4gMTIgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzMyBkYSBMZWkgMTEuMzQzLzA2KSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fQXNzb2NpYcOnw6NvX3BhcmFfb190csOhZmljbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IEFzc29jaWHDp8OjbyBwYXJhIG8gdHLDoWZpY28gKEFydC4gMTQgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzNSBkYSBMZWkgMTEuMzQzLzA2KSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fQXNzb2NpYcOnw6NvX3BhcmFfb190csOhZmljbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IEFzc29jaWHDp8OjbyBwYXJhIG8gdHLDoWZpY28gKEFydC4gMTQgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzNSBkYSBMZWkgMTEuMzQzLzA2KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9Bc3NvY2lhw6fDo29fcGFyYV9vX3Ryw6FmaWNvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBEcm9nYXMgKExlaSA2LjM2OC83NiBlIExlaSAxMS4zNDMvMDYpIHwgQXNzb2NpYcOnw6NvIHBhcmEgbyB0csOhZmljbyAoQXJ0LiAxNCBkYSBMZWkgNi4zNjgvNzYgZSBBcnQuIDM1IGRhIExlaSAxMS4zNDMvMDYpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19UcsOhZmljb19pbnRlcm5hY2lvbmFsX2RlX2Ryb2dhcwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgZHJvZ2FzIChBcnQuIDE4IGRhIExlaSA2LjM2OC83NiBlIEFydC4gMzMgZSA0MCwgaW5jaXNvIEkgZGEgTGVpIDExLjM0My8wNikgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX1Ryw6FmaWNvX2ludGVybmFjaW9uYWxfZGVfZHJvZ2FzCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBEcm9nYXMgKExlaSA2LjM2OC83NiBlIExlaSAxMS4zNDMvMDYpIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBkcm9nYXMgKEFydC4gMTggZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzMyBlIDQwLCBpbmNpc28gSSBkYSBMZWkgMTEuMzQzLzA2KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9UcsOhZmljb19pbnRlcm5hY2lvbmFsX2RlX2Ryb2dhcwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgZHJvZ2FzIChBcnQuIDE4IGRhIExlaSA2LjM2OC83NiBlIEFydC4gMzMgZSA0MCwgaW5jaXNvIEkgZGEgTGVpIDExLjM0My8wNikgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX1BvcnRlX2lsZWdhbF9kZV9hcm1hX2RlX2ZvZ29fZGVfdXNvX3Blcm1pdGlkbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IFBvcnRlIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gZGUgdXNvIHBlcm1pdGlkbyAoQXJ0LiAxNCkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX1BvcnRlX2lsZWdhbF9kZV9hcm1hX2RlX2ZvZ29fZGVfdXNvX3Blcm1pdGlkbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IFBvcnRlIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gZGUgdXNvIHBlcm1pdGlkbyAoQXJ0LiAxNCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfUG9ydGVfaWxlZ2FsX2RlX2FybWFfZGVfZm9nb19kZV91c29fcGVybWl0aWRvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgUG9ydGUgaWxlZ2FsIGRlIGFybWEgZGUgZm9nbyBkZSB1c28gcGVybWl0aWRvIChBcnQuIDE0KSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fRGlzcGFyb19kZV9hcm1hX2RlX2ZvZ28JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBEaXNwYXJvIGRlIGFybWEgZGUgZm9nbyAoQXJ0LiAxNSkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX0Rpc3Bhcm9fZGVfYXJtYV9kZV9mb2dvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgRGlzcGFybyBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTUpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX0Rpc3Bhcm9fZGVfYXJtYV9kZV9mb2dvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgRGlzcGFybyBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTUpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19Qb3NzZV9vdV9wb3J0ZV9pbGVnYWxfZGVfYXJtYV9kZV9mb2dvX2RlX3Vzb19yZXN0cml0bwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IFBvc3NlIG91IHBvcnRlIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gZGUgdXNvIHJlc3RyaXRvIChBcnQuIDE2KSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fUG9zc2Vfb3VfcG9ydGVfaWxlZ2FsX2RlX2FybWFfZGVfZm9nb19kZV91c29fcmVzdHJpdG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBQb3NzZSBvdSBwb3J0ZSBpbGVnYWwgZGUgYXJtYSBkZSBmb2dvIGRlIHVzbyByZXN0cml0byAoQXJ0LiAxNikgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfUG9zc2Vfb3VfcG9ydGVfaWxlZ2FsX2RlX2FybWFfZGVfZm9nb19kZV91c29fcmVzdHJpdG8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBQb3NzZSBvdSBwb3J0ZSBpbGVnYWwgZGUgYXJtYSBkZSBmb2dvIGRlIHVzbyByZXN0cml0byAoQXJ0LiAxNikgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX0NvbcOpcmNpb19pbGVnYWxfZGVfYXJtYV9kZV9mb2dvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgQ29tw6lyY2lvIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTcpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19Db23DqXJjaW9faWxlZ2FsX2RlX2FybWFfZGVfZm9nbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IENvbcOpcmNpbyBpbGVnYWwgZGUgYXJtYSBkZSBmb2dvIChBcnQuIDE3KSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9Db23DqXJjaW9faWxlZ2FsX2RlX2FybWFfZGVfZm9nbwk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IENvbcOpcmNpbyBpbGVnYWwgZGUgYXJtYSBkZSBmb2dvIChBcnQuIDE3KSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fVHLDoWZpY29faW50ZXJuYWNpb25hbF9kZV9hcm1hX2RlX2ZvZ28JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBUcsOhZmljbyBpbnRlcm5hY2lvbmFsIGRlIGFybWEgZGUgZm9nbyAoQXJ0LiAxOCkgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIGNyaW1lX0ZlbWluaW5vX1Ryw6FmaWNvX2ludGVybmFjaW9uYWxfZGVfYXJtYV9kZV9mb2dvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTgpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX1Ryw6FmaWNvX2ludGVybmFjaW9uYWxfZGVfYXJtYV9kZV9mb2dvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTgpIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19Ib21pY8OtZGlvX2N1bHBvc29fbmFfY29uZHXDp8Ojb19kZV92ZcOtY3Vsb19hdXRvbW90b3IJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IENyaW1lcyBkZSBUcsOibnNpdG8gKExlaSA5LjUwMywgZGUgMjMvMDkvMTk5NykgfCBIb21pY8OtZGlvIGN1bHBvc28gbmEgY29uZHXDp8OjbyBkZSB2ZcOtY3VsbyBhdXRvbW90b3IgKEFydC4gMzAyKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fSG9taWPDrWRpb19jdWxwb3NvX25hX2NvbmR1w6fDo29fZGVfdmXDrWN1bG9fYXV0b21vdG9yCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBDcmltZXMgZGUgVHLDom5zaXRvIChMZWkgOS41MDMsIGRlIDIzLzA5LzE5OTcpIHwgSG9taWPDrWRpbyBjdWxwb3NvIG5hIGNvbmR1w6fDo28gZGUgdmXDrWN1bG8gYXV0b21vdG9yIChBcnQuIDMwMikgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfSG9taWPDrWRpb19jdWxwb3NvX25hX2NvbmR1w6fDo29fZGVfdmXDrWN1bG9fYXV0b21vdG9yCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBDcmltZXMgZGUgVHLDom5zaXRvIChMZWkgOS41MDMsIGRlIDIzLzA5LzE5OTcpIHwgSG9taWPDrWRpbyBjdWxwb3NvIG5hIGNvbmR1w6fDo28gZGUgdmXDrWN1bG8gYXV0b21vdG9yIChBcnQuIDMwMikgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX091dHJvc19BcnRpZ29fMzAzX2FfMzEyCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBPdXRyb3MgKEFydC4gMzAzIGEgMzEyKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fT3V0cm9zX0FydGlnb18zMDNfYV8zMTIJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IExlZ2lzbGHDp8OjbyBlc3BlY8OtZmljYSAtIG91dHJvcyB8IE91dHJvcyAoQXJ0LiAzMDMgYSAzMTIpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX091dHJvc19BcnRpZ29fMzAzX2FfMzEyCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBPdXRyb3MgKEFydC4gMzAzIGEgMzEyKSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fRXN0YXR1dG9fZGFfQ3JpYW7Dp2FfZV9kb19BZG9sZXNjZW50ZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgRXN0YXR1dG8gZGEgQ3JpYW7Dp2EgZSBkbyBBZG9sZXNjZW50ZSAoTGVpIDguMDY5LCBkZSAxMy8wMS8xOTkwKSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fRXN0YXR1dG9fZGFfQ3JpYW7Dp2FfZV9kb19BZG9sZXNjZW50ZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgRXN0YXR1dG8gZGEgQ3JpYW7Dp2EgZSBkbyBBZG9sZXNjZW50ZSAoTGVpIDguMDY5LCBkZSAxMy8wMS8xOTkwKSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICBjcmltZV9Ub3RhbF9Fc3RhdHV0b19kYV9DcmlhbsOnYV9lX2RvX0Fkb2xlc2NlbnRlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBFc3RhdHV0byBkYSBDcmlhbsOnYSBlIGRvIEFkb2xlc2NlbnRlIChMZWkgOC4wNjksIGRlIDEzLzAxLzE5OTApIHwgVG90YWwiCSwKICAgICAgICAgICAgIGNyaW1lX01hc2N1bGlub19HZW5vY8OtZGlvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBHZW5vY8OtZGlvIChMZWkgMi44ODksIGRlIDAxLzEwLzE5NTYpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19HZW5vY8OtZGlvCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBHZW5vY8OtZGlvIChMZWkgMi44ODksIGRlIDAxLzEwLzE5NTYpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX0dlbm9jw61kaW8JPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IExlZ2lzbGHDp8OjbyBlc3BlY8OtZmljYSAtIG91dHJvcyB8IEdlbm9jw61kaW8gKExlaSAyLjg4OSwgZGUgMDEvMTAvMTk1NikgfCBUb3RhbCIJLAogICAgICAgICAgICAgY3JpbWVfTWFzY3VsaW5vX0NyaW1lc19kZV90b3J0dXJhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgZGUgdG9ydHVyYSAoTGVpIDkuNDU1LCBkZSAwNy8wNC8xOTk3KSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgY3JpbWVfRmVtaW5pbm9fQ3JpbWVzX2RlX3RvcnR1cmEJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IExlZ2lzbGHDp8OjbyBlc3BlY8OtZmljYSAtIG91dHJvcyB8IENyaW1lcyBkZSB0b3J0dXJhIChMZWkgOS40NTUsIGRlIDA3LzA0LzE5OTcpIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIGNyaW1lX1RvdGFsX0NyaW1lc19kZV90b3J0dXJhCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgZGUgdG9ydHVyYSAoTGVpIDkuNDU1LCBkZSAwNy8wNC8xOTk3KSB8IFRvdGFsIgksCiAgICAgICAgICAgICBjcmltZV9NYXNjdWxpbm9fQ3JpbWVzX2NvbnRyYV9vX01laW9fQW1iaWVudGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IExlZ2lzbGHDp8OjbyBlc3BlY8OtZmljYSAtIG91dHJvcyB8IENyaW1lcyBjb250cmEgbyBNZWlvIEFtYmllbnRlIChMZWkgOS42MDUsIGRlIDEyLzAyLzE5OTgpIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICBjcmltZV9GZW1pbmlub19DcmltZXNfY29udHJhX29fTWVpb19BbWJpZW50ZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgQ3JpbWVzIGNvbnRyYSBvIE1laW8gQW1iaWVudGUgKExlaSA5LjYwNSwgZGUgMTIvMDIvMTk5OCkgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgY3JpbWVfVG90YWxfQ3JpbWVzX2NvbnRyYV9vX01laW9fQW1iaWVudGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IExlZ2lzbGHDp8OjbyBlc3BlY8OtZmljYSAtIG91dHJvcyB8IENyaW1lcyBjb250cmEgbyBNZWlvIEFtYmllbnRlIChMZWkgOS42MDUsIGRlIDEyLzAyLzE5OTgpIHwgVG90YWwiCSwKICAgICAgICAgICAgIHJlbXVuZXJhY2FvX01hc2N1bGlub19Ow6NvX3JlY2ViZV8JPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBOw6NvIHJlY2ViZSB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgcmVtdW5lcmFjYW9fRmVtaW5pbm9fTsOjb19yZWNlYmUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBOw6NvIHJlY2ViZSB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICByZW11bmVyYWNhb19NYXNjdWxpbm9fTWVub3NfZG9fcXVlXzMuNF9kb19zYWzDoXJpb19tw61uaW1vX21lbnNhbAk9CSI2LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgcmVtdW5lcmHDp8OjbyB8IE1lbm9zIGRvIHF1ZSAzLzQgZG8gc2Fsw6FyaW8gbcOtbmltbyBtZW5zYWwgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHJlbXVuZXJhY2FvX0ZlbWluaW5vX01lbm9zX2RvX3F1ZV8zLjRfZG9fc2Fsw6FyaW9fbcOtbmltb19tZW5zYWwJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBNZW5vcyBkbyBxdWUgMy80IGRvIHNhbMOhcmlvIG3DrW5pbW8gbWVuc2FsIHwgRmVtaW5pbm8iCSwKICAgICAgICAgICAgIHJlbXVuZXJhY2FvX01hc2N1bGlub19FbnRyZV8zLjRfZV8xX3NhbMOhcmlvX23DrW5pbW9fbWVuc2FsCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgRW50cmUgMy80IGUgMSBzYWzDoXJpbyBtw61uaW1vIG1lbnNhbCB8IE1hc2N1bGlubyIJLAogICAgICAgICAgICAgcmVtdW5lcmFjYW9fRmVtaW5pbm9fRW50cmVfMy40X2VfMV9zYWzDoXJpb19tw61uaW1vX21lbnNhbAk9CSI2LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgcmVtdW5lcmHDp8OjbyB8IEVudHJlIDMvNCBlIDEgc2Fsw6FyaW8gbcOtbmltbyBtZW5zYWwgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgcmVtdW5lcmFjYW9fTWFzY3VsaW5vX0VudHJlXzFfZV8yX3NhbMOhcmlvc19tw61uaW1vc19tZW5zYWlzCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgRW50cmUgMSBlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMgfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHJlbXVuZXJhY2FvX0ZlbWluaW5vX0VudHJlXzFfZV8yX3NhbMOhcmlvc19tw61uaW1vc19tZW5zYWlzCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgRW50cmUgMSBlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMgfCBGZW1pbmlubyIJLAogICAgICAgICAgICAgcmVtdW5lcmFjYW9fTWFzY3VsaW5vX01haXNfcXVlXzJfc2Fsw6FyaW9zX23DrW5pbW9zX21lbnNhaXMJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBNYWlzIHF1ZSAyIHNhbMOhcmlvcyBtw61uaW1vcyBtZW5zYWlzIHwgTWFzY3VsaW5vIgksCiAgICAgICAgICAgICByZW11bmVyYWNhb19GZW1pbmlub19NYWlzX3F1ZV8yX3NhbMOhcmlvc19tw61uaW1vc19tZW5zYWlzCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgTWFpcyBxdWUgMiBzYWzDoXJpb3MgbcOtbmltb3MgbWVuc2FpcyB8IEZlbWluaW5vIgksCiAgICAgICAgICAgICByZW11bmVyYWNhb19NYXNjdWxpbm9fU2VtX2luZm9ybWHDp8Ojbwk9CSI2LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgcmVtdW5lcmHDp8OjbyB8IFNlbSBpbmZvcm1hw6fDo28gfCBNYXNjdWxpbm8iCSwKICAgICAgICAgICAgIHJlbXVuZXJhY2FvX0ZlbWluaW5vX1NlbV9pbmZvcm1hw6fDo28JPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBTZW0gaW5mb3JtYcOnw6NvIHwgRmVtaW5pbm8iCSkKYGBgCgpGYXplciB1bSBsb29wIG5vcyBhcnF1aXZvcyBkYXMgdGFiZWxhcyBkbyBJTkZPUEVOIGUgbGlzdGFyIG9zIG5vbWVzIGRlbGVzCmBgYHtyIG5vbWVfZG9zX2FycXVpdm9zX2luZm9wZW4sIGluY2x1ZGU9RkFMU0V9Cm5vbWVfZG9zX2FycXVpdm9zX2luZm9wZW4gPC0gbGlzdC5maWxlcyhwYXRoID0gIklORk9QRU4vdGFiZWxhcyBleGNlbC8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiKi54bHN4KiIpCmBgYAoKQ29tYmluYXIgbyBkaXJldG9yaW8gYW8gbm9tZSBkbyBhcnF1aXZvCmBgYHtyIGFycXVpdm9zX2luZm9wZW4gfQphcnF1aXZvc19pbmZvcGVuIDwtIHN0cl9jKCJJTkZPUEVOL3RhYmVsYXMgZXhjZWwvIixub21lX2Rvc19hcnF1aXZvc19pbmZvcGVuKQpgYGAKCkRhciBub21lIGEgY2FkYSBlbGVtZW50byBkbyB2ZXRvcgpgYGB7ciBuYW1lc30KbmFtZXMoYXJxdWl2b3NfaW5mb3BlbikgPC0gZ3N1YigiXFwueGxzeCQiLCAiIiwgbm9tZV9kb3NfYXJxdWl2b3NfaW5mb3BlbikKYGBgCgpBcGxpY2FyIGEgZnVuw6fDo28gcmVhZF9leGNlbCBwYXJhIGNhZGEgZWxlbWVudG8gZG8gdmV0b3IgaW1wb3J0YW5kbyBhc3NpbSB0b2RvcyBvcyBhcnF1aXZvcyBkZSB1bWEgc8OzIHZlegpgYGB7ciBjcmlhY2FvIHRhYmVsYSBpbmZvcGVufQppbmZvcGVuX2JyPC0gbWFwX2RmKC54ID0gYXJxdWl2b3NfaW5mb3BlbiwgLmYgPSByZWFkX2V4Y2VsLCAuaWQgPSAiZGF0YSIpICU+JSAKICBzZWxlY3QoIlVGIixkYXRhLCBhbGxfb2YoY29sdW5hcykpCmBgYAoKIyMgUmVjb25oZWNlbmRvIGEgVGFiZWxhCgpBcyB0YWJlbGFzIGRvIElORk9QRU4gYXByZXNlbnRhbSBkYWRvcyBlbSBwYWluZWwsIG9uZGUgY2FkYSBpbmRpdmlkbyDDqSByZXByZXNlbnRhZG8gbWFpcyBkZSB1bWEgdmV6LgogIApDYWRhIHRhYmVsYSBkbyBJTkZPUEVOIGNvbnTDqW0gbWFpcyBkZSAxMzAwIGNvbHVuYXMgZSBhcHJveGltYWRhbWVudGUgMTUwMCBsaW5oYXMuICAKYGBge3IgZXhlbXBsbyBkZSB1bWEgdGFiZWxhIGRvIElORk9QRU4gfQpqdW5fMjAxNyA8LSByZWFkX2V4Y2VsKCJJTkZPUEVOL3RhYmVsYXMgZXhjZWwvanVuIDIwMTcueGxzeCIpCmBgYApOdW1lcm8gZGUgY29sdW5hczogYHIgbmNvbChqdW5fMjAxNylgICAKTsO6bWVybyBkZSBsaW5hczogYHIgbnJvdyhqdW5fMjAxNylgICAgCiAgCkFww7NzIGFuYWxpc2FyIGNhZGEgdGFiZWxhLCBkZWNpZGkgZmlsdHJhciBhcGVuYXMgYXMgY29sdW5hcyBtYWlzIGludGVyZXNzYW50ZXMgcGFyYSBhIG1pbmhhIGFuYWxpc2UgZSBvIHJlc3VsdGFkbyBmb2kgdW1hIHRhYmVsYSBjb20gYHIgbnJvdyhpbmZvcGVuX2JyKWAgbGluaGFzIGUgYHIgbmNvbChpbmZvcGVuX2JyKWAgY29sdW5hcy4KCiMjIENvbWXDp2FuZG8gbWFuaXB1bGFyIG8gZGF0YWZyYW1lCgpBcMOzcyBhZ3J1cGFyIHRvZGFzIGFzIHRhYmVsYXMgZSBlc2NvbGhlciBhcGVuYXMgYXMgY29sdW5hcyBxdWUgdm91IHV0aWxpYXIsIG8gcHLDs3hpbW8gcGFzc28gc2Vyw6EgdHJhbnNmb3JtYXIgZGUgZm9ybWF0byBsYXJnbyBwYXJhIGxvbmdvLiBPIEZvcm1hdG8gbG9uZ28gZmFjaWxpdGEgYWxndW1hcyBtYW5pcHVsYcOnw7VlcyxlIG8gZm9ybWF0byBsYXJnbyBvdXRyYXMuIE5vIGRlY29ycmVyIGRlc3NhIGFuw6FsaXNlIHZvdSB1dGlsaXphciBvcyBkb2lzIGZvcm1hdG9zLgpgYGB7ciB0YWJlbGEgaW5mb3BlbiBsb25nb30KaW5mb3Blbl8yX2Zvcm1hdG9fbG9uZ28gPC1pbmZvcGVuX2JyJT4lIAogIGdhdGhlcih2YXJpYXZlbCAsIHF1YW50aWRhZGUsIC0gYyhVRixkYXRhKSkgJT4lIAogIGRyb3BfbmEoKQpgYGAKClZvdSByZXN1bWlyIG9zIHZhbG9yZXMgcGFyYSBxdWUgc2VqYW0gcmVtb3ZpZGFzIGFzIGxpbmhhcyByZXBldGlkYXMgZSBvYnRlbmhhLXNlIG8gdG90YWwgZGUgY2FkYSB2YXJpYXZlbApgYGB7ciB0YWJlbGEgaW5mb3BlbiByZXN1bWlkb30KaW5mb3Blbl8zX3Jlc3VtaWRvIDwtIGluZm9wZW5fMl9mb3JtYXRvX2xvbmdvICU+JQogIGdyb3VwX2J5KFVGLCBkYXRhLCB2YXJpYXZlbCkgJT4lCiAgbXV0YXRlKGRhdGEgPSBnc3ViKCJkZXoiLCAiZGVjIiwgZGF0YSkpJT4lICMjIHByZWNpc2VpIHVzYXIgImRlYyIgcGFyYSBxdWUgbyBwcm9ncmFtYSBlbnRlbmRlc3NlIHF1ZSBzZSByZWZlcmlhIGFvIG1lcyBkZSBkZXplbWJybwogIHN1bW1hcmlzZShwcmVzb3MgPSBzdW0ocXVhbnRpZGFkZSwgbmEucm0gPSBUUlVFKSkgJT4lIAogIG1lcmdlKHVmX3JlZ2lhbywgYnkgPSAiVUYiLCBhbGwueCA9IFRSVUUpCmBgYAoKIyMgQ3JpYXIgYXMgVmFyacOhdmVpcyBRdWUgVm91IFRyYWJhbGhhcgoKQXDDs3MgcmVzdW1pciBvcyBkYWRvcyBlIHJlbW92ZXIgb3MgJ05BcycsIGNoZWdvdSBvIG1vbWVudG8gZGUgc2VwYXJhciBvcyBkYWRvcyBlbSBjb2x1bmFzIHF1ZSB2b3UgdXRpbGl6YXIuCmBgYHtyIHRhYmVsYSBmaW5hbCBpbmZvcGVufQppbmZvcGVuXzRfZmluYWwgPC0gaW5mb3Blbl8zX3Jlc3VtaWRvICU+JQogIHJvd3dpc2UoKSAlPiUgIyMgZGVmaW5lIG8gZXNjb3BvIGRhcyBvcGVyYWNvZXMgc2VndWludGUsIHBhcmEgc2VyZW0gdHJhYmFsaGFkYXMgcG9yIGxpbmhhIGUgbmFvIGNvbHVuYXMKICBmaWx0ZXIoIXN0cl9kZXRlY3QodmFyaWF2ZWwsICJOw6NvX0luZm9ybWFkb3xOw6NvX2luZm9ybWFkb3xTZW0gaW5mb3JtYcOnw6NvIikpJT4lICMjIHJlbW92ZXIgYXMgdmFyacOhdmVpcyBxdWUgbmFvIHNlcmFvIG5lY2Vzc2FyaWFzCiAgbXV0YXRlKCAjIyBhcXVpIGNvbWVjbyBhIGRlZmluaXIgYXMgY29sdW5hcyBxdWUgdm91IHVzYXIuIFZvdSBleHRyYWlyIGFzIG5vdmFzIGNvbHVuYXMgZGEgY29sdW5hIHZhcmlhdmVsCiAgICBnZW5lcm8gPSBjYXNlX3doZW4oCiAgICAgIHN0cl9kZXRlY3QodmFyaWF2ZWwsICIoRmVtaW5pbm8pIikgfiAiRmVtaW5pbm8iLAogICAgICBzdHJfZGV0ZWN0KHZhcmlhdmVsLCAiKE1hc2N1bGlubykiKSB+ICJNYXNjdWxpbm8iLAogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICB2YXJpYXZlbCA9IGdzdWIoIl9NYXNjdWxpbm98X0ZlbWluaW5vfCIsICIiLCB2YXJpYXZlbCksICMjIG5lc3NlIHBvbnRvIGV1IHByZWNpc28gcmVtb3ZlciBhIHN0cmluZyBkZSBnZW5lcm8gcGFyYSBldml0YXIgY29uZmxpdG9zIG1haXMgYSBmcmVudGUgbm8gY8OzZGlnbwogICAgZXRuaWEgPSBpZmVsc2UoZ3JlcGwoImV0bmlhXyIsIHZhcmlhdmVsKSwKICAgICAgICAgICAgICAgICAgIHN1YigiZXRuaWFfIiwgIiIsIHZhcmlhdmVsKSwgTkEpLAogICAgZXRuaWEgPSBpZl9lbHNlKGV0bmlhID09ICJCcmFuY2EiLCAiQnJhbmNhIiwgCiAgICAgICAgICAgICAgICAgICAgaWZfZWxzZShldG5pYSAlaW4lIGMoIlByZXRhIiwgIlBhcmRhIiksICJQcmV0YSBvdSBQYXJkYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKGV0bmlhICVpbiUgYygiQW1hcmVsYSIsICJJbmRpZ2VuYSIpLCAiQW1hcmVsYSBvdSBJbmRpZ2VuYSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTkEpKSksCiAgICBncmF1X2RlX2luc3RydWNhbyA9IGlmZWxzZShncmVwbCgiZ3JhdV9kZV9pbnN0cnVjYW9fIiwgdmFyaWF2ZWwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKCJncmF1X2RlX2luc3RydWNhb18iLCIiLCB2YXJpYXZlbCksIE5BKSwgCiAgICByZW11bmVyYWNhbyA9IGlmZWxzZShncmVwbCgicmVtdW5lcmFjYW9fIix2YXJpYXZlbCksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWIoInJlbXVuZXJhY2FvXyIsIiIsdmFyaWF2ZWwpLE5BKSwKICAgIGZhaXhhX2V0YXJpYSA9IGlmZWxzZShncmVwbCgiZmFpeGFfZXRhcmlhXyIsIHZhcmlhdmVsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIoImZhaXhhX2V0YXJpYV8iLCIiLHZhcmlhdmVsKSxOQSkpJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1wcmVzb3MpLCBhcy5mYWN0b3IpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdCgiZGF0YSIsInJlZ2lhbyIsIlVGIiwgImdlbmVybyIsImV0bmlhIiwgCiAgICAgICAgICJncmF1X2RlX2luc3RydWNhbyIsICJmYWl4YV9ldGFyaWEiLCAicmVtdW5lcmFjYW8iLCJwcmVzb3MiKSAlPiUgIyMgdXNlaSBzZWxlY3QoKSBhcGVuYXMgcG9ycXVlIGdvc3RhcmlhIGRlIHZpenVhbGlhciBhcyBjb2x1bmFzIG5lc3NhIG9yZGVtCiAgZmlsdGVyKCFpcy5uYShnZW5lcm8pKQpgYGAKCiMjIEdlcmHDp8OjbyBkYXMgVGFiZWxhcwoKRW0gcmVsYcOnw6NvIMOgIHF1YW50aWRhZGUgZGUgcHJlc29zLCBlc3NhIMOpIGEgdGFiZWxhIG1haXMgY29uZmnDoXZlbCBwb2lzIG5lbSB0b2RvcyBvcyBwcmVzw61kaW9zIHTDqm0gY2FwYWNpZGFkZSBkZSByZWNvbGhlciB0b2RvcyBvcyBkYWRvcy4gTG9nbywgY29tIGFzIG91dHJhcyB0YWJlbGFzIHZvdSB0cmFiYWxoYXIgYXBlbmFzIGEgcG9yY2VudGFnZW0gZGUgcHJlc29zIGVtIHJlbGFjYW8gYW8gdG90YWwgZSBleHRyYWlyIGRhcXVpIG8gdmFsb3IgY29ycmVzcG9uZGVudGUuCgojIyMgVGFiZWxhIGNvbSBhIHBvcHVsYcOnw6NvIHByaXNpb25hbCB0b3RhbApgYGB7ciBwb3B1bGFjYW9fcHJpc2lvbmFsfQpwb3B1bGFjYW9fcHJpc2lvbmFsIDwtaW5mb3Blbl8zX3Jlc3VtaWRvICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KHZhcmlhdmVsLCAiUG9wdWxhw6fDo29fcHJpc2lvbmFsIikpJT4lCiAgcm93d2lzZSgpICU+JSAKICBtdXRhdGUoCiAgICBnZW5lcm8gPSBjYXNlX3doZW4oCiAgICAgIHN0cl9kZXRlY3QodmFyaWF2ZWwsICIoRmVtaW5pbm8pIikgfiAiRmVtaW5pbm8iLAogICAgICBzdHJfZGV0ZWN0KHZhcmlhdmVsLCAiKE1hc2N1bGlubykiKSB+ICJNYXNjdWxpbm8iLAogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXykpICU+JSAKICBzZWxlY3QocmVnaWFvLCBVRixkYXRhLGdlbmVybywgcHJlc29zKSAlPiUgCiAgZHJvcF9uYSgpICU+JSAKICB1bmdyb3VwKCkKCnBvcHVsYWNhb19wcmlzaW9uYWxfMl9yZXN1bWlkbyA8LSBwb3B1bGFjYW9fcHJpc2lvbmFsICU+JSAKICBmaWx0ZXIoZ3JlcGwoIl5kZWMiLCBkYXRhKSB8IGRhdGEgPT0gImp1biAyMDE5IikgJT4lICMjIGFww7NzIGFsZ3VtYXMgYW7DoWxpc2VzIGRlY2lkw60gdXNhciBhcGVuYXMgMSByZWZlcsOqbmNpYSBwb3IgYW5vLCBhbyBpbnZlcyBkZSB1bWEgbcOpZGlhIGRvcyB2YWxvcmVzLiAKICBncm91cF9ieShyZWdpYW8sIFVGLCBkYXRhKSAlPiUKICBtdXRhdGUoYW5vID0gc3RyX3JlcGxhY2UoZGF0YSwgIlxcRCooXFxkezR9KS4qIiwgIlxcMSIpKSAlPiUgIyMgcmVtb3ZlbmRvIG9zIDQgcHJpbWVyaW9zIGNoYXJhY3RlcmVzIGRvcyB2YWxvcmVzIG5hIGNvbHVuYSAnYW5vJwogIHVuZ3JvdXAoKSAlPiUgCiAgZ3JvdXBfYnkoYW5vLCByZWdpYW8sIFVGKSAlPiUgCiAgc3VtbWFyaXNlKHRvdGFsX3ByZXNvcyA9IHN1bShwcmVzb3MpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBzZWxlY3QoYW5vLCByZWdpYW8sIFVGLCB0b3RhbF9wcmVzb3MpCmBgYAoKVm91IGRlaXhhciBhcGVuYXMgbWFpcyBlc3NlIGV4bXBsbyBkZSBjw7NkaWdvLCBwb2lzIHBhcmEgYSBjcmlhw6fDo28gZGFzIGRlbWFpcyB0YWJlbGFzIG7Do28gaMOhIG11aXRhIGRpZmVyZW7Dp2EgZW0gcmVsYcOnw6NvIGFvIHByb2Nlc3NvIGRlc3NhLiBPIHF1ZSBwb2RlIG11ZGFyIHPDo28gYWxndW5zIGFqdXN0ZXMgcG9udHVhaXMsIG1hcyBuYWRhIHF1ZSBtZXJlw6dhIG1lbnPDo28uIApgYGAge3IgQ3JpYW5kbyB0YWJlbGEgZmFpeGEgZGUgaWRhZGV9CmluZm9wZW5fZmFpeGFfZGVfaWRhZGUgPC1pbmZvcGVuXzRfZmluYWwgJT4lIAogIHNlbGVjdChyZWdpYW8sVUYsZGF0YSxnZW5lcm8sIGZhaXhhX2V0YXJpYSwgcHJlc29zKSAlPiUgIyMgc2VsZWNpb25hciBhcyBjb2x1bmFzCiAgbXV0YXRlKGZhaXhhX2V0YXJpYSA9IGdzdWIoIl8iLCAiICIsIGZhaXhhX2V0YXJpYSkpICU+JSAjIyByZW1vdmVyIG9zICJfIiBwYXJhIGZhY2lsaXRhciBsZWl0dXJhIGUgZXhwb3J0YWNhbyBwYXJhIGNzdiAKICBtdXRhdGVfYXQodmFycygtcHJlc29zKSwgYXMuZmFjdG9yKSAlPiUgIyMgY29udmVydGVyIHRvZGFzIGFzIGNvbHVuYXMgcGFyYSBmYWN0b3IgLSBwcmVzb3MKICBkcm9wX25hKCkgIyMgcmVtb3ZlciBOQQoKaW5mb3Blbl9mYWl4YV9kZV9pZGFkZV8yX3BvcmNlbnRhZ2VtIDwtIGluZm9wZW5fZmFpeGFfZGVfaWRhZGUgJT4lIAogIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGEpIHwgZGF0YSA9PSAianVuIDIwMTkiKSAlPiUKICBncm91cF9ieShyZWdpYW8sIFVGLCBkYXRhKSAlPiUKICBtdXRhdGUoYW5vID0gc3RyX3JlcGxhY2UoZGF0YSwgIlxcRCooXFxkezR9KS4qIiwgIlxcMSIpLAogICAgICAgICB0b3RhbF9wcmVzb3NfZmFpeGEgPSBzdW0ocHJlc29zLCBuYS5ybSA9IFRSVUUpLCAjIHNvbWEgdG90YWwgZGUgcHJlc29zIHBvciByZWdpw6NvLCBVRiwgZ8OqbmVybyBlIGFubwogICAgICAgICBwb3JjZW50YWdlbV9wcmVzb3MgPSByb3VuZCgoKHByZXNvcyAvIHRvdGFsX3ByZXNvc19mYWl4YSkgKiAxMDApLDIpLAogICAgICAgICBVRiA9IGFzLmZhY3RvcihVRiksCiAgICAgICAgIGFubyA9IGFzLmNoYXJhY3Rlcihhbm8pKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBzZWxlY3QoYW5vLCByZWdpYW8sIFVGLCBnZW5lcm8sIGZhaXhhX2V0YXJpYSwgcG9yY2VudGFnZW1fcHJlc29zKQoKaW5mb3Blbl9mYWl4YV9kZV9pZGFkZV8zX2ZpbmFsIDwtIGluZm9wZW5fZmFpeGFfZGVfaWRhZGVfMl9wb3JjZW50YWdlbSAlPiUKICBsZWZ0X2pvaW4ocG9wdWxhY2FvX3ByaXNpb25hbF8yX3Jlc3VtaWRvLCBieSA9IGMoImFubyIsICJyZWdpYW8iLCAiVUYiKSkgJT4lCiAgbXV0YXRlKHByZXNvcyA9IHJvdW5kKCgocG9yY2VudGFnZW1fcHJlc29zIC8gMTAwKSAqIHRvdGFsX3ByZXNvcyksIDApKSAlPiUKICBzZWxlY3QoYW5vLCByZWdpYW8sIFVGLCBnZW5lcm8sIGZhaXhhX2V0YXJpYSwgcHJlc29zKQoKaW5mb3Blbl9mYWl4YV9kZV9pZGFkZV80IDwtIGluZm9wZW5fZmFpeGFfZGVfaWRhZGVfM19maW5hbCAlPiUgCiAgZ3JvdXBfYnkoYW5vLGZhaXhhX2V0YXJpYSkgJT4lIAogIHN1bW1hcmlzZShwcmVzb3MgPSBzdW0ocHJlc29zKSkgJT4lIAogIG11dGF0ZShhbm8gPSBhcy5udW1lcmljKGFubykpCmBgYAoKYGBgIHtyIENyaWFuZG8gYXMgZGVtYWlzIHRhYmVsYXMgZG8gSU5GT1BFTiwgaW5jbHVkZSA9IEZBTFNFfQppbmZvcGVuX2V0bmlhIDwtIGluZm9wZW5fNF9maW5hbCAlPiUgCiAgc2VsZWN0KHJlZ2lhbyxVRixkYXRhLGdlbmVybywgZXRuaWEsIHByZXNvcykgJT4lIAogIG11dGF0ZShldG5pYSA9IGdzdWIoIl8iLCAiICIsIGV0bmlhKSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1wcmVzb3MpLCBhcy5mYWN0b3IpICU+JQogIGdyb3VwX2J5KHJlZ2lhbyxVRixkYXRhLGdlbmVybywgZXRuaWEpICU+JSAKICBzdW1tYXJpc2UocHJlc29zID0gc3VtKHByZXNvcykpICU+JSAKICBkcm9wX25hKCkKCmluZm9wZW5fZXRuaWFfMl9wb3JjZW50YWdlbSA8LSBpbmZvcGVuX2V0bmlhICU+JSAKICBmaWx0ZXIoZ3JlcGwoIl5kZWMiLCBkYXRhKSB8IGRhdGEgPT0gImp1biAyMDE5IikgJT4lCiAgZ3JvdXBfYnkocmVnaWFvLCBVRiwgZGF0YSkgJT4lCiAgbXV0YXRlKGFubyA9IHN0cl9yZXBsYWNlKGRhdGEsICJcXEQqKFxcZHs0fSkuKiIsICJcXDEiKSwKICAgICAgICAgdG90YWxfcHJlc29zX2ZhaXhhID0gc3VtKHByZXNvcywgbmEucm0gPSBUUlVFKSwgIyBzb21hIHRvdGFsIGRlIHByZXNvcyBwb3IgcmVnacOjbywgVUYsIGfDqm5lcm8gZSBhbm8KICAgICAgICAgcG9yY2VudGFnZW1fcHJlc29zID0gcm91bmQoKChwcmVzb3MgLyB0b3RhbF9wcmVzb3NfZmFpeGEpICogMTAwKSwyKSwKICAgICAgICAgVUYgPSBhcy5mYWN0b3IoVUYpLAogICAgICAgICBhbm8gPSBhcy5jaGFyYWN0ZXIoYW5vKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgc2VsZWN0KGFubywgcmVnaWFvLCBVRiwgZ2VuZXJvLCBldG5pYSwgcG9yY2VudGFnZW1fcHJlc29zKQoKaW5mb3Blbl9ldG5pYV8zX2ZpbmFsIDwtIGluZm9wZW5fZXRuaWFfMl9wb3JjZW50YWdlbSAlPiUKICBsZWZ0X2pvaW4ocG9wdWxhY2FvX3ByaXNpb25hbF8yX3Jlc3VtaWRvLCBieSA9IGMoImFubyIsICJyZWdpYW8iLCAiVUYiKSkgJT4lCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KGV0bmlhLCAiQW1hcmVsYSBvdSBJbmRpZ2VuYSIpKSAlPiUgCiAgbXV0YXRlKHByZXNvcyA9IHJvdW5kKCgocG9yY2VudGFnZW1fcHJlc29zIC8gMTAwKSAqIHRvdGFsX3ByZXNvcyksIDApLAogICAgICAgICBldG5pYSA9IHRvbG93ZXIoZXRuaWEpLAogICAgICAgICBhbm8gPSBhcy5udW1lcmljKGFubykpICU+JQogIGdyb3VwX2J5KGFubywgcmVnaWFvLCBVRixldG5pYSwpICU+JSAKICBzdW1tYXJpc2UocHJlc29zID0gc3VtKHByZXNvcykpICU+JSAKICBzZWxlY3QoYW5vLCByZWdpYW8sIFVGLCBldG5pYSwgcHJlc29zKQoKIyBwcmVzb3MgZGUgYWNvcmRvIGNvbSBhIHJlbXVuZXJhY2FvLiBEZSB0b2RhcyBhcyB0YWJlbGFzLCBlc3NhIMOpIGEgcXVlIG1haXMgZmFsdGEgZGFkb3MKCmluZm9wZW5fcmVtdW5lcmFjYW8gPC1pbmZvcGVuXzRfZmluYWwgJT4lIAogIHNlbGVjdChyZWdpYW8sVUYsZGF0YSxnZW5lcm8sIHJlbXVuZXJhY2FvLCBwcmVzb3MpICU+JSAKICBtdXRhdGUocmVtdW5lcmFjYW8gPSBnc3ViKCJfIiwgIiAiLCByZW11bmVyYWNhbyksCiAgICAgICAgIHJlbXVuZXJhY2FvID0gZ3N1YigiMy40IiwgIjMvNCIsIHJlbXVuZXJhY2FvKSwKICAgICAgICAgcmVtdW5lcmFjYW8gPSBnc3ViKCJOw6NvIHJlY2ViZSAiLCJOw6NvIHJlY2ViZSIsIHJlbXVuZXJhY2FvKSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1wcmVzb3MpLCBhcy5mYWN0b3IpICU+JQogIGRyb3BfbmEoKQoKaW5mb3Blbl9yZW11bmVyYWNhb18yX3BvcmNlbnRhZ2VtIDwtIGluZm9wZW5fcmVtdW5lcmFjYW8gJT4lIAogIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGEpIHwgZGF0YSA9PSAianVuIDIwMTkiLAogICAgICAgICAhZ3JlcGwoIlNlbSBpbmZvcm1hw6fDo28iLCByZW11bmVyYWNhbykpICU+JQogIGdyb3VwX2J5KHJlZ2lhbywgVUYsIGRhdGEpICU+JQogIG11dGF0ZShhbm8gPSBzdHJfcmVwbGFjZShkYXRhLCAiXFxEKihcXGR7NH0pLioiLCAiXFwxIiksCiAgICAgICAgIHRvdGFsX3ByZXNvc19mYWl4YSA9IHN1bShwcmVzb3MsIG5hLnJtID0gVFJVRSksIAogICAgICAgICBwb3JjZW50YWdlbV9wcmVzb3MgPSByb3VuZCgoKHByZXNvcyAvIHRvdGFsX3ByZXNvc19mYWl4YSkgKiAxMDApLDIpLAogICAgICAgICBVRiA9IGFzLmZhY3RvcihVRiksCiAgICAgICAgIGFubyA9IGFzLmNoYXJhY3Rlcihhbm8pKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBzZWxlY3QoYW5vLCByZWdpYW8sIFVGLCBnZW5lcm8sIHJlbXVuZXJhY2FvLCBwb3JjZW50YWdlbV9wcmVzb3MpCgppbmZvcGVuX3JlbXVuZXJhY2FvXzNfZmluYWwgPC0gaW5mb3Blbl9yZW11bmVyYWNhb18yX3BvcmNlbnRhZ2VtICU+JQogIGxlZnRfam9pbihwb3B1bGFjYW9fcHJpc2lvbmFsXzJfcmVzdW1pZG8sIGJ5ID0gYygiYW5vIiwgInJlZ2lhbyIsICJVRiIpKSAlPiUKICBtdXRhdGUocHJlc29zID0gcm91bmQoKChwb3JjZW50YWdlbV9wcmVzb3MgLyAxMDApICogdG90YWxfcHJlc29zKSwgMCkpICU+JQogIHNlbGVjdChhbm8sIHJlZ2lhbywgVUYsIGdlbmVybywgcmVtdW5lcmFjYW8sIHByZXNvcykgJT4lIAogIGdyb3VwX2J5KGFubywgcmVnaWFvLCBVRiwgcmVtdW5lcmFjYW8sKSAlPiUgCiAgc3VtbWFyaXNlKCBwcmVzb3MgPSBzdW0ocHJlc29zKSkKCiMgUG9yIGZpbSBhIHRhYmVsYSBncmF1IGRlIGluc3RydcOnw6NvLCBxdWUgYWluZGEgcmVjZWJlcsOhIG91dHJvIHRyYXRhbWVudG8gbWFpcyBhZGlhbnRlCgppbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvIDwtaW5mb3Blbl80X2ZpbmFsICU+JSAKICBzZWxlY3QocmVnaWFvLFVGLGRhdGEsZ2VuZXJvLCBncmF1X2RlX2luc3RydWNhbywgcHJlc29zKSAlPiUgCiAgbXV0YXRlKGdyYXVfZGVfaW5zdHJ1Y2FvID0gZ3N1YigiXyIsICIgIiwgZ3JhdV9kZV9pbnN0cnVjYW8pKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLXByZXNvcyksIGFzLmZhY3RvcikgJT4lCiAgZHJvcF9uYSgpCgppbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvXzJfcG9yY2VudGFnZW0gPC0gaW5mb3Blbl9ncmF1X2RlX2luc3RydWNhbyAlPiUgCiAgZmlsdGVyKGdyZXBsKCJeZGVjIiwgZGF0YSkgfCBkYXRhID09ICJqdW4gMjAxOSIpICU+JQogIGdyb3VwX2J5KHJlZ2lhbywgVUYsIGRhdGEpICU+JQogIG11dGF0ZShhbm8gPSBzdHJfcmVwbGFjZShkYXRhLCAiXFxEKihcXGR7NH0pLioiLCAiXFwxIiksCiAgICAgICAgIHRvdGFsX3ByZXNvc19mYWl4YSA9IHN1bShwcmVzb3MsIG5hLnJtID0gVFJVRSksICMgc29tYSB0b3RhbCBkZSBwcmVzb3MgcG9yIHJlZ2nDo28sIFVGLCBnw6puZXJvIGUgYW5vCiAgICAgICAgIHBvcmNlbnRhZ2VtX3ByZXNvcyA9IHJvdW5kKCgocHJlc29zIC8gdG90YWxfcHJlc29zX2ZhaXhhKSAqIDEwMCksMiksCiAgICAgICAgIFVGID0gYXMuZmFjdG9yKFVGKSwKICAgICAgICAgYW5vID0gYXMuY2hhcmFjdGVyKGFubykpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdChhbm8sIHJlZ2lhbywgVUYsIGdlbmVybywgZ3JhdV9kZV9pbnN0cnVjYW8sIHBvcmNlbnRhZ2VtX3ByZXNvcykKCmluZm9wZW5fZ3JhdV9kZV9pbnN0cnVjYW9fM19maW5hbCA8LSBpbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvXzJfcG9yY2VudGFnZW0gJT4lCiAgbGVmdF9qb2luKHBvcHVsYWNhb19wcmlzaW9uYWxfMl9yZXN1bWlkbywgYnkgPSBjKCJhbm8iLCAicmVnaWFvIiwgIlVGIikpICU+JQogIG11dGF0ZShwcmVzb3MgPSByb3VuZCgoKHBvcmNlbnRhZ2VtX3ByZXNvcyAvIDEwMCkgKiB0b3RhbF9wcmVzb3MpLCAwKSkgJT4lCiAgc2VsZWN0KGFubywgcmVnaWFvLCBVRiwgZ2VuZXJvLCBncmF1X2RlX2luc3RydWNhbywgcHJlc29zKQpgYGAKCgoKIyMgVmlzdWFsaXphw6fDo28gZG9zIERhZG9zIGRvIElORk9QRU57LnRhYnNldCAudGFic2V0LWZhZGV9CgpBcXVpIGVzdMOjbyBhcyB0YWJlbGFzIGRvIElORk9QRU4gcXVlIGlyZWkgdXRpbGl6YXIuIE9ic2V2ZSBxdWUgY29tYmluZWkgdsOhcmlhcyB0YWJlbGFzLCByZWFyYW5qZWkgYXMgY29sdW5hcyBlIGV4dHJhw60gNSB0YWJlbGFzIGRpc3RpbnRhcywgY29tIGRhZG9zIGVtIHBhaW5lbC4KCiMjIyBQb3B1bGFjYW8gcHJpc2lvbmFsCmBgYCB7ciBQb3B1bGFjYW8gcHJpc2lvbmFsLCBlY2hvID0gRkFMU0UgfQpyZXN1bW8gPC0gIHBvcHVsYWNhb19wcmlzaW9uYWwgJT4lCiAgICBhcnJhbmdlKGRlc2MocHJlc29zKSkKCmthYmxlKGhlYWQocmVzdW1vLDEwKSkgJT4lCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkKCmBgYAogIAojIyMgIEV0bmlhIApgYGAge3IgRXRuaWEsIGVjaG8gPSBGQUxTRSB9CnJlc3Vtb19ldG5pYSA8LSAgaW5mb3Blbl9ldG5pYV8zX2ZpbmFsICU+JQogICAgYXJyYW5nZShkZXNjKHByZXNvcykpCgprYWJsZShoZWFkKHJlc3Vtb19ldG5pYSwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpCmBgYAoKIyMjIEdyYXUgZGUgaW5zdHJ1w6fDo28KYGBgIHtyIEdyYXUgZGUgaW5zdHJ1w6fDo28gLCBlY2hvID0gRkFMU0UgfQpyZXN1bW9faW5zdHJ1Y2FvIDwtICBpbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvXzNfZmluYWwgJT4lCiAgYXJyYW5nZShkZXNjKHByZXNvcykpCgprYWJsZShoZWFkKHJlc3Vtb19pbnN0cnVjYW8sMTApKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkKYGBgCgojIyMgRmFpeGEgZXTDoXJpYSAKYGBgIHtyIEZhaXhhIGV0w6FyaWEgLCBlY2hvID0gRkFMU0UgfQpyZXN1bW9faWRhZGUgPC0gIGluZm9wZW5fZmFpeGFfZGVfaWRhZGVfNCAlPiUKICBhcnJhbmdlKGRlc2MocHJlc29zKSkKCmthYmxlKGhlYWQocmVzdW1vX2lkYWRlLDEwKSkgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpCmBgYAoKIyMjIEZhaXhhIGRlIHJlbXVuZXJhw6fDo28gCmBgYCB7ciBGYWl4YSBkZSByZW11bmVyYcOnw6NvICwgZWNobyA9IEZBTFNFIH0KcmVzdW1vX3JlbXVuZXJhw6fDo28gPC0gIGluZm9wZW5fcmVtdW5lcmFjYW9fM19maW5hbCAlPiUKICBhcnJhbmdlKGRlc2MocHJlc29zKSkKCmthYmxlKGhlYWQocmVzdW1vX3JlbXVuZXJhw6fDo28sMTApKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkKYGBgCgojIFRhYmVsYSBJQkdFIEdyYXUgZGUgSW5zdHJ1w6fDo28KQSBwcm9wb3N0YSBkZXNzYSBhbsOhbGlzZSDDqSBjb21wYXJhciBvcyBkYWRvcyBkYSBwb3B1bGHDp8OjbyBjYXJjZXLDoXJpYSBjb20gb3MgZGFkb3MgZG8gSUJHRSwgZSBmYXplciB1bWEgY29ycmVsYcOnw6NvIGVudHJlIGVsZXMuIE9zIGRhZG9zIHF1ZSB2b3UgdXRpbGl6YXIgYXF1aSBmYXplbSBwYXJ0ZSBkYSBQZXNxdWluYSBOYWNpb25hbCBQb3IgQW1vc3RyYSBkZSBEb21pY8OtbGlvcyBDb250aW51YSAoUE5BREMpIGUgcG9kZW0gc2VyIGVuY29udHJhZGFzIG5hIHDDoWdpbmEgZGUgZXN0YXTDrXN0aWNhcyBkbyBbSUJHRV0oaHR0cHM6Ly93d3cuaWJnZS5nb3YuYnIvZXN0YXRpc3RpY2FzL2Rvd25sb2Fkcy1lc3RhdGlzdGljYXMuaHRtbCkuCiAgCkFxdWkgY29tZcOnbyB0cmFiYWxoYXIgYSBzZWd1bmRhIHRhYmVsYSBxdWUgc2Vyw6EgdXNhZGEuIEVzc2EgdGFiZWxhIMO6bmljYSBwb3NzdWkgdmFyaWFzIGZvbGhhcyBxdWUgdm91IGV4dHJhaXIgZSBtYW5pcHVsYXIgb3MgZGFkb3MuIEEgdGFiZWxhICJQTkFEX0NvbnRpbnVhXzIwMThfRWR1Y2FjYW8ueGxzIiwgcG9zc3VpIGRhZG9zIHJlZmVyZW50ZXMgw6AgZWR1Y2HDp8OjbyBkYSBwb3B1bGHDp8Ojby4gU8OjbyB2w6FyaWFzIGluZm9ybWHDp8O1ZXMsIGRlbnRyZSBhcyBxdWFpczogbsOtdmVsIGVkdWNhY2lvbmFsIHBvciByZWdpw6NvLCBnZXJlbm8gZSBldG5pYS4gRXNzYSB0YWJlbGEgdGFtYsOpbSBhcHJlc2VudGEgZGFkb3MgZW0gcGFpbmVsLiAgCipBbWFyZWxvcyBlIEluZGlnZW5hcyBjb25zdGFtIG5vIFRvdGFsKgoKICAKVm91IHB1bGFyIGEgcGFydGUgZGUgaW1wb3J0YcOnw6NvIGRhIHRhYmVsYSBlIGlyIGRpcmV0YW1lbnRlIHBhcmEgbyBkYXRhZnJhbWUuCmBgYHtyIFBOQURfQ29udGludWFfMjAxOF9FZHVjYWNhbywgaW5jbHVkZT1GQUxTRX0KIyBkZWZpbmUgY2FtaW5obyBwYXJhIG8gYXJxdWl2byBleGNlbApjYW1pbmhvX2FycXVpdm9fcG5hZCA8LSAiUE5BRGMvUE5BRF9Db250aW51YV8yMDE4X0VkdWNhY2FvLnhscyIKCiMgcGVnYSBvcyBub21lcyBkYXMgZm9saGFzIHF1ZSBzZXJhbyB1c2FkYXMKbm9tZXNfZm9saGFzX3BuYWQgPC0gZXhjZWxfc2hlZXRzKGNhbWluaG9fYXJxdWl2b19wbmFkKQoKIyByZW1vdmUgYXMgZHVhcyBwcmltZWlyYXMgZm9saGFzCm5vbWVzX2ZvbGhhc19wbmFkIDwtIG5vbWVzX2ZvbGhhc19wbmFkWy1jKDEsIDIpXQoKIyBjcmlhciB1bSBkYXRhIGZyYW1lIHZhemlvCnBuYWRfYnIgPC0gZGF0YS5mcmFtZSgpCgojIGZhemVyIHVtIGxvb3AgcG9yIHRvZGFzIGFzIGZvbGhhcyBlIGFkaWNpb25hciBlbGFzIG5vIGRhdGFmcmFtZSBxdWUgZXN0YXZhIHZhemlvCmZvciAoaSBpbiBzZXFfYWxvbmcobm9tZXNfZm9saGFzX3BuYWQpKSB7CiAgZm9saGFfcG5hZCA8LSByZWFkX2V4Y2VsKGNhbWluaG9fYXJxdWl2b19wbmFkLCBzaGVldCA9IG5vbWVzX2ZvbGhhc19wbmFkW2ldLCBza2lwID0gNykKICBwbmFkX2JyIDwtIGJpbmRfcm93cyhwbmFkX2JyLCBmb2xoYV9wbmFkKQp9CgojIHBhcmEgZXZpdGFyIGRpc3RyYWNvZXMsIHZvdSByZW1vdmVyIGEgdmFyacOhdmVsIGZvbGhhX3BuYWQgcXVlIGZvaSBjcmlhZGEgcGFyYSBmYXplciBvIGxvb3Agbm8gZGF0YWZyYW1lIHBuYWQgCnJtKGZvbGhhX3BuYWQpCgojcmVub21lYXIgYXMgY29sdW5hcyBwYXJhIGZpY2FyIG1haXMgZmFjaWwgdHJhYmFsaGFyIGNvbSBlbGFzCmNvbG5hbWVzKHBuYWRfYnIpPC0gYygiaW5kaWNhZG9yIiwgIm5pdmVsX3RlcnJpdG9yaWFsIiwgCiAgICAgICAgICAgICAgICAgICAiYWJlcnR1cmFfdGVycml0b3JpYWwiLCJ2YXJpYXZlbF8xIiwKICAgICAgICAgICAgICAgICAgICJjYXRlZ29yaWFfMSIsICJ2YXJpYXZlbF8yIiwgCiAgICAgICAgICAgICAgICAgICAiY2F0ZWdvcmlhXzIiLCIyMDE2IiwiMjAxNyIsIjIwMTgiKQoKI3JlbW92ZXIgbGluaGFzIGR1cGxpY2FkYXMgcG9pcyBuaXZlbCBicmFzaWwgZXN0w6EgcHJlc2VudGUgZW0gdG9kYXMgYXMgZm9saGFzCnBuYWRfYnIgPC0gcG5hZF9iclshZHVwbGljYXRlZChwbmFkX2JyKSwgXQpgYGAKICAKVmlzdWFsaXphw6fDo28gZGEgVGFiZWxhIGRvIFBOQUQKYGBge3IgdmlzdWFsaXphw6fDo28gZGEgdGFiZWxhIGRvIFBOQUQsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG5hZF9iciwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCkVzc2UgZGF0YWZyYW1lIHJldW5lIGRhZG9zIGRlIHRvZGFzIGFzIGFiYXMgZG8gYXJxdWl2byAiUE5BRF9Db250aW51YV8yMDE4X0VkdWNhY2FvLnhscyIsIGFpbmRhIGjDoSBtdWl0YSBtYW5pcHVsYcOnw6NvIGEgc2VyIGZlaXRhLiAgCgojIyAgTWFuaXB1bGHDp8OjbyBkb3MgRGFkb3MKClByaW1laXJvLCB2b3UgdHJhbnNwb3Igb3MgZGFkb3MgcGFyYSBxdWUgZXUgcG9zc2EgdHJhbnNmb3Jtw6EtbG9zIGVtIGZvcm1hdG8gbG9uZ28sIHRhbCBjb21vIG5vIG1vZGVsbyBhbnRlcmlvciwgY29tIGEgdGFiZWxhIGRvIElORk9QRU4uCmBgYHtyIHRyYW5zZm9ybWFyIHRhYmVsYSBkbyBwbmFkLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbmFkXzJfZm9ybWF0b19sb25nbyA8LSBwaXZvdF9sb25nZXIocG5hZF9iciwgODoxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJhbm8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWxvciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKQpgYGAKClZvdSBtdWx0aXBsaWNhciBvIHZhbG9yIG5hIGNvbHVuYSAndmFsb3InIHBvciAxMDAwIHNlIGEgY29sdW5hICdpbmRpY2Fkb3InIGNvbnRpdmVyIGEgc3RyaW5nICcobWlsIHBlc3NvYXMpJyBlLCBlbSBzZWd1aWRhLCByZW1vdsOqLWxhLiBEZXBvaXMgdm91IGNyaWFyIHVtYSB2YXJpw6F2ZWwgJ3JlZ2lhbycgcGFyYSBhcm1hemVuYXIgYSByZWdpw6NvIGRlIGNhZGEgZXN0YWRvLgpgYGB7ciBwbmFkXzNfY29tX3JlZ2lvZXMsfQpwbmFkXzNfY29tX3JlZ2lvZXMgPC0gcG5hZF8yX2Zvcm1hdG9fbG9uZ28gJT4lCiAgbXV0YXRlKHZhbG9yID0gaWZlbHNlKGdyZXBsKCIobWlsIHBlc3NvYXMpIiwgaW5kaWNhZG9yKSwgdmFsb3IgKiAxMDAwLCB2YWxvciksCiAgICAgICAgIGluZGljYWRvciA9IGdzdWIoIlxccypcXChtaWwgcGVzc29hc1xcKSIsICIiLCBpbmRpY2Fkb3IpLAogICAgICAgICByZWdpYW8gPSBjYXNlX3doZW4oYWJlcnR1cmFfdGVycml0b3JpYWwgJWluJSBjKCJBY3JlIiwgIkFtYXpvbmFzIiwgIkFtYXDDoSIsICJQYXLDoSIsICJSb25kw7RuaWEiLCAiUm9yYWltYSIsICJUb2NhbnRpbnMiKSB+ICJOb3J0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmVydHVyYV90ZXJyaXRvcmlhbCAlaW4lIGMoIk1hcmFuaMOjbyIsICJQaWF1w60iLCAiQ2VhcsOhIiwgIlJpbyBHcmFuZGUgZG8gTm9ydGUiLCAiUGFyYcOtYmEiLCAiUGVybmFtYnVjbyIsICJBbGFnb2FzIiwgIlNlcmdpcGUiLCAiQmFoaWEiKSB+ICJOb3JkZXN0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmVydHVyYV90ZXJyaXRvcmlhbCAlaW4lIGMoIk1pbmFzIEdlcmFpcyIsICJFc3DDrXJpdG8gU2FudG8iLCAiUmlvIGRlIEphbmVpcm8iLCAiU8OjbyBQYXVsbyIpIH4gIlN1ZGVzdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJlcnR1cmFfdGVycml0b3JpYWwgJWluJSBjKCJQYXJhbsOhIiwgIlNhbnRhIENhdGFyaW5hIiwgIlJpbyBHcmFuZGUgZG8gU3VsIikgfiAiU3VsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiZXJ0dXJhX3RlcnJpdG9yaWFsICVpbiUgYygiTWF0byBHcm9zc28iLCAiTWF0byBHcm9zc28gZG8gU3VsIiwgIkdvacOhcyIsICJEaXN0cml0byBGZWRlcmFsIikgfiAiQ2VudHJvLU9lc3RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSkKYGBgCgoKYGBge3IgVGFiZWxhcyBmaW5haXMgcG9wdWxhw6fDo28gcG9yIHJlZ2nDo28gZSAxNCBhbm9zIG91IG1haXMsIGluY2x1ZGU9RkFMU0V9CnBuYWRfNF9wb3B1bGFjYW9faWRhZGUgPC0gcG5hZF8zX2NvbV9yZWdpb2VzICU+JQogIGZpbHRlcihpbmRpY2Fkb3IgPT0gIlBvcHVsYcOnw6NvIiwKICAgICAgICAgbml2ZWxfdGVycml0b3JpYWwgPT0gIlVuaWRhZGUgZGEgRmVkZXJhw6fDo28iLAogICAgICAgICBjYXRlZ29yaWFfMSAlaW4lIGMoIkhvbWVtIiwgIk11bGhlciIsIkJyYW5jYSIsIlByZXRhIG91IHBhcmRhIiwiVG90YWzCuSIpLAogICAgICAgICBjYXRlZ29yaWFfMiAhPSAiVG90YWwiKSAlPiUKICBtdXRhdGUoZ2VuZXJvID0gaWZlbHNlKGNhdGVnb3JpYV8xICVpbiUgYygiSG9tZW0iLCAiTXVsaGVyIiksIGNhdGVnb3JpYV8xLCBOQSksCiAgICAgICAgIGV0bmlhID0gaWZlbHNlKGNhdGVnb3JpYV8xICVpbiUgYygiQnJhbmNhIiwgIlByZXRhIG91IHBhcmRhIiwiVG90YWzCuSIpLCBjYXRlZ29yaWFfMSwgTkEpLAogICAgICAgICBVRiA9IHVmX2RpY3RbYXMuY2hhcmFjdGVyKGFiZXJ0dXJhX3RlcnJpdG9yaWFsKV0pICU+JQogIHNlbGVjdChyZWdpYW8sIFVGLCBnZW5lcm8sIGV0bmlhLCAiZ3J1cG9fZGVfaWRhZGUiID0gY2F0ZWdvcmlhXzIsIGFubywgdmFsb3IpCmBgYAoKIyMjIFRhYmVsYSBQTkFEIFBvcHVsYcOnw6NvIGNvbSAxOCBhbm9zIG91IG1haXMKClZvdSBjb21iaW5hciBlc3NhIHRhYmVsYSBkbyBJQkdFICwgY29tIGEgcHJpbWVpcmEgdGFiZWxhIGRvIElORk9QRU4gcXVlIGRpeiByZXNwZWl0byBhIHBvcHVsYcOnw6NvIGNhcmNlcsOhcmlhLCBwb2RlbmRvIGFzc2ltIHRhbWJlbSBjb3JyZWxhY2lvbmFyIG8gdG90YWwgZGUgcHJlc29zIGNvbSBwZXNzb2FzIGRlIDE4IGFub3Mgb3UgbWFpcywgbWFzIGRlIGZvcm1hIHJlc3VtaWRhLgoKYGBge3IgcG9wdWxhY2FvIHByaXNpb25hbCB2cyBwb3B1bGFjYW8gYnJhc2lsZWlyYSBjb20gMTggYW5vcyBvdSBtYWlzLCBpbmNsdWRlPUZBTFNFfQpwb3B1bGFjYW9fMThfYW5vc19vdV9tYWlzIDwtIHBuYWRfNF9wb3B1bGFjYW9faWRhZGUgJT4lIAogIHNlbGVjdCgtZXRuaWEpICU+JSAKICBmaWx0ZXIoIXN0cl9kZXRlY3QoZ3J1cG9fZGVfaWRhZGUsICIwIGEgMyBhbm9zfDQgZSA1IGFub3N8NiBhIDkgYW5vc3wxMCBhIDE0IGFub3N8MTUgYSAxNyBhbm9zIikpICU+JSAKICBuYS5vbWl0KCkKCnBvcHVsYWNhb18xOF9hbm9zX291X21haXNfMiA8LSBwb3B1bGFjYW9fMThfYW5vc19vdV9tYWlzICU+JSAKICBncm91cF9ieShhbm8sIHJlZ2lhbywgVUYpICU+JSAKICBzdW1tYXJpc2UoIHZhbG9yID0gc3VtKHZhbG9yKSkgJT4lIAogIHJlbmFtZSh0b3RhbCA9IHZhbG9yKQpgYGAKCkFxdWkgcG9kZW1vcyB0ZXIgdW1hIGlkZWlhIGRvcyBkYWRvcyBwcmVzZW50ZXMgbmVzc2EgdGFiZWxhLiAKYGBge3IgaGVhZChwb3B1bGFjYW9fMThfYW5vc19vdV9tYWlzXzIpLCBlY2hvPUZBTFNFfQpoZWFkKHBvcHVsYWNhb18xOF9hbm9zX291X21haXNfMikKYGBgCgpFc3NhIHRhYmVsYSBwb3NzdWkgZGFkb3MgZGUgMjAxNiBhIDIwMTguIE8gcHJpbWVpcm8gcGFzc28gdmFpIHNlciBjYWxjdWxhciBvIHRvdGFsIGRlIHBlc3NvYXMgcGFyYSBjYWRhIHZhcmnDoXZlbCBubyBhbm8gZGUgMjAxOSwgdXNhbmRvIG8gbcOpdG9kbyBhcml0aW3DqXRpY28gZGVzY3JpdG8gbm8gY29tZcOnbyBkZXNzYSBhbsOhbGlzZS4KCiMjIFVzYW5kbyBNw6l0b2RvIEFyaXRtw6l0aWNvIFBhcmEgRXN0aW1hciB1bWEgUG9wdWxhw6fDo28KClZvdSBjb21lw6dhciB0cmFuc2Zvcm1hbmRvIGVzc2VzIGRhZG9zIGVtIGZvcm1hdG8gbGFyZ28gKHdpZGUpLCBsb2dvIGVtIHNlZ3VpZGEgYXBsaWNvIGEgZnVuw6fDo28gY29tIGEgZsOzcm11bGEgZSBwb3IgZmltIHZvbHRvIGNvbSBhIHRhYmVsYSBwYXJhIGZvcm1hdG8gbG9uZ28obG9uZykuCgpgYGB7ciBwb3B1bGFjYW8gYWNpbWRhIGRlIDE4IGFub3MgZXN0YXTDrXN0aWNhIGRlIHBvcHVsYcOnw6NvfQpwb3B1bGFjYW9fMThfYW5vc19vdV9tYWlzXzMgPC0gcGl2b3Rfd2lkZXIocG9wdWxhY2FvXzE4X2Fub3Nfb3VfbWFpc18yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBhbm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSB0b3RhbCkKCnBvcHVsYWNhb18xOF9hbm9zX291X21haXNfNCA8LSBwb3B1bGFjYW9fMThfYW5vc19vdV9tYWlzXzMgJT4lIAogbXV0YXRlKAogICAgYDIwMTlgID0gcm91bmQoZm9ybXVsYShgMjAxOGAsMjAxOCxgMjAxNmAsMjAxNiwyMDE5KSkKICApCnBvcHVsYWNhb18xOF9hbm9zX291X21haXNfNSA8LSBwaXZvdF9sb25nZXIocG9wdWxhY2FvXzE4X2Fub3Nfb3VfbWFpc180LCBjb2xzID0gLWMoVUYscmVnaWFvKSxuYW1lc190byA9ICJhbm8iLHZhbHVlc190byA9ICJwb3B1bGFjYW8iKSAlPiUgCiAgbXV0YXRlKGFjcm9zcygtcG9wdWxhY2FvLCBhcy5mYWN0b3IpKQpgYGAKClZvdSBhZ29yYSBjb21iaW5hciBlc3NhIHRhYmVsYSBjb20gYSBwb3B1bGHDp8OjbyBwcmlzaW9uYWwgZG8gSU5GT1BFTi4KYGBge3IgcG9wdWxhY2FvX2luZm9wZW5fdG90YWwsIGluY2x1ZGU9RkFMU0V9CnBvcHVsYWNhb19pbmZvcGVuX3RvdGFsIDwtIGxlZnRfam9pbihwb3B1bGFjYW9fcHJpc2lvbmFsXzJfcmVzdW1pZG8sIHBvcHVsYWNhb18xOF9hbm9zX291X21haXNfNSwgYnkgPSBqb2luX2J5KGFubywgcmVnaWFvLCBVRikgKSAlPiUgCiAgcmVuYW1lKHByZXNvcyA9IHRvdGFsX3ByZXNvcykKCmBgYAoKCmBgYHtyIHZpc3VhbGl6YcOnw6NvIHBvcHVsYWNhb19pbmZvcGVuX3RvdGFsICwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGFjYW9faW5mb3Blbl90b3RhbCwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIFRhYmVsYSBQTkFEIERhZG9zIFNvYnJlIGEgRWR1Y2HDp8OjbwogIApWb3UgcmVwZXRpciBiYXNpY2FtZW50ZSBvIG1lc21vIHByb2Nlc3NvIG5hIHRhYmVsYSBjb20gZGFkb3Mgc29icmUgYSBwb3B1bGHDp8Ojby4gRXNzYSB0YWJlbGEgcG9yw6ltLCBjb25zaWRlZGEgcGVzc29hcyBkZSAxNCBhbm9zIG91IG1haXMgZGUgaWRhZGUsIGNvbW8gcG9kZSBzZSBub3RhciBwZWxvIGluZGljYWRvci4gCmBgYHtyIGFsZmFiZXRpemFjYW9fcG9wdWxhY2FvIH0KYWxmYWJldGl6YWNhb19wb3B1bGFjYW8gPC0gcG5hZF8zX2NvbV9yZWdpb2VzICU+JQogIGZpbHRlcihpbmRpY2Fkb3IgPT0gIlBlc3NvYXMgZGUgMTQgYW5vcyBvdSBtYWlzIGRlIGlkYWRlIiwKICAgICAgICAgbml2ZWxfdGVycml0b3JpYWwgPT0gIlVuaWRhZGUgZGEgRmVkZXJhw6fDo28iLAogICAgICAgICBjYXRlZ29yaWFfMSAlaW4lIGMoIkhvbWVtIiwgIk11bGhlciIsIkJyYW5jYSIsIlByZXRhIG91IHBhcmRhIiwiVG90YWzCuSIpLAogICAgICAgICB2YXJpYXZlbF8yID09ICJOw612ZWwgZGUgaW5zdHJ1w6fDo28iLAogICAgICAgICAhKGNhdGVnb3JpYV8yICVpbiUgYygiVG90YWwiKSkpICU+JQogIG11dGF0ZSggYW5vID0gYXMubnVtZXJpYyhhbm8pLAogICAgZ2VuZXJvID0gaWZlbHNlKGNhdGVnb3JpYV8xID09ICJIb21lbSIsICJNYXNjdWxpbm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNhdGVnb3JpYV8xID09ICJNdWxoZXIiLCAiRmVtaW5pbm8iLCBOQSkpLAogICAgICAgICBVRiA9IHVmX2RpY3RbYXMuY2hhcmFjdGVyKGFiZXJ0dXJhX3RlcnJpdG9yaWFsKV0pICU+JQogIHNlbGVjdChyZWdpYW8sIFVGLCBnZW5lcm8sIGdyYXVfZGVfaW5zdHJ1Y2FvID0gY2F0ZWdvcmlhXzIsIGFubywgdG90YWwgPSB2YWxvcikgJT4lIAogIGRyb3BfbmEoKQpgYGAKICAKTWVzbW8gUHJvY2Vzc28gcGFyYSBjYWxjdWxhciBhIHBvcHVsYcOnw6NvIG5vIGFubyBkZSAyMDE5LiAKYGBge3IgYWxmYWJldGl6YWNhb19wb3B1bGFjYW8gZXN0YXTDrXN0aWNhIGRlIHBvcHVsYcOnw6NvfQphbGZhYmV0aXphY2FvX3BvcHVsYWNhb18yIDwtIHBpdm90X3dpZGVyKGFsZmFiZXRpemFjYW9fcG9wdWxhY2FvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBhbm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSB0b3RhbCkKCmFsZmFiZXRpemFjYW9fcG9wdWxhY2FvXzMgPC0gYWxmYWJldGl6YWNhb19wb3B1bGFjYW9fMiAlPiUgCiBtdXRhdGUoCiAgICBgMjAxOWAgPSByb3VuZChmb3JtdWxhKGAyMDE4YCwyMDE4LGAyMDE2YCwyMDE2LDIwMTkpKQogICkKYWxmYWJldGl6YWNhb19wb3B1bGFjYW9fNCA8LSBwaXZvdF9sb25nZXIoYWxmYWJldGl6YWNhb19wb3B1bGFjYW9fMywgY29scyA9IC1jKHJlZ2lhbzpncmF1X2RlX2luc3RydWNhbyksbmFtZXNfdG8gPSAiYW5vIix2YWx1ZXNfdG8gPSAicG9wdWxhY2FvIikgJT4lIAogIG11dGF0ZShhY3Jvc3MoLXBvcHVsYWNhbywgYXMuZmFjdG9yKSkKYGBgCgpgYGB7ciB2aXN1YWxpemFjYW8gZGEgdGFiZWxhIGFsZmFiZXRpemFjYW9fcG9wdWxhY2FvXzQsIGVjaG89RkFMU0V9CmhlYWQoYWxmYWJldGl6YWNhb19wb3B1bGFjYW9fNCkKYGBgCgpDb21vIHBvZGUgc2UgaW1hZ2luYXIsIGFzIGRpc3RyaWJ1acOnw7VlcyBkZSBncmF1IGRlIGluc3RydcOnw6NvIG7Do28gZXN0w6NvIHBhZHJvbml6YWRhcywgdm91IHVzYXIgdW1hIGZ1bsOnw6NvIHBhcmEgY3JpYXIgZXNzZSBwYWRyw6NvIGVudHJlIGEgdGFiZWxhIGRvIFBOQUQgZSBhIGRvIElORk9QRU4uCgpgYGB7ciBGdW7Dp8OjbyBwYXJhIHBhZHJvbml6YXIgZ3JhdSBkZSBpbnN0cnXDp8Ojb30KcGFkcm9uaXphcl9ncmF1X2RlX2luc3RydWNhbyA8LSBmdW5jdGlvbihncmF1KSB7CiAgZ3JhdV9zaW1wbGlmaWNhZG8gPC0gZ3N1YigiIFxcKG91IGN1cnNvIGVxdWl2YWxlbnRlXFwpIiwgIiIsIGdyYXUpCiAgcmVjb2RlKGdyYXVfc2ltcGxpZmljYWRvLAogICAgICAgICAiU2VtIGluc3RydcOnw6NvIiA9ICJBbmFsZmFiZXRvIiwKICAgICAgICAgIkZ1bmRhbWVudGFsIGluY29tcGxldG8iID0gIkVuc2lubyBGdW5kYW1lbnRhbCBJbmNvbXBsZXRvIiwKICAgICAgICAgIkZ1bmRhbWVudGFsIGNvbXBsZXRvIiA9ICJFbnNpbm8gRnVuZGFtZW50YWwgQ29tcGxldG8iLAogICAgICAgICAiTcOpZGlvIGluY29tcGxldG8iID0gIkVuc2lubyBNw6lkaW8gSW5jb21wbGV0byIsCiAgICAgICAgICJNw6lkaW8gY29tcGxldG8iID0gIkVuc2lubyBNw6lkaW8gQ29tcGxldG8iLAogICAgICAgICAiU3VwZXJpb3IgaW5jb21wbGV0byIgPSAiRW5zaW5vIFN1cGVyaW9yIEluY29tcGxldG8iLAogICAgICAgICAiU3VwZXJpb3IgY29tcGxldG8iID0gIkVuc2lubyBTdXBlcmlvciBDb21wbGV0byIsCiAgICAgICAgICJBbGZhYmV0aXphZG8gc2VtIGN1cnNvcyByZWd1bGFyZXMiID0gIkVuc2lubyBGdW5kYW1lbnRhbCBJbmNvbXBsZXRvIikKfQpgYGAKCgpgYGB7ciBjb2x1bmFzIHBhZHJvbml6YWRhcywgaW5jbHVkZT1GQUxTRX0KIyBQcmltZWlybyBhIHRhYmVsYSBkbyBQTkFECmFsZmFiZXRpemFjYW9fcG9wdWxhY2FvXzUgPC0gYWxmYWJldGl6YWNhb19wb3B1bGFjYW9fNCAlPiUKICBtdXRhdGUoZ3JhdV9kZV9pbnN0cnVjYW8gPSBtYXBfY2hyKGdyYXVfZGVfaW5zdHJ1Y2FvLCBwYWRyb25pemFyX2dyYXVfZGVfaW5zdHJ1Y2FvKSkgJT4lIAogIHNlbGVjdCAoImFubyIsICJyZWdpYW8iLCAiVUYiLCAiZ2VuZXJvIiwgImdyYXVfZGVfaW5zdHJ1Y2FvIiwgInBvcHVsYWNhbyIpCgojIEUgZW50w6NvIGEgdGFiZWxhIGRvIElORk9QRU4KaW5mb3Blbl9ncmF1X2RlX2luc3RydWNhb18zMV9wYWRyYW8gPC0gaW5mb3Blbl9ncmF1X2RlX2luc3RydWNhb18zX2ZpbmFsICU+JQogIG11dGF0ZShncmF1X2RlX2luc3RydWNhbyA9IG1hcF9jaHIoZ3JhdV9kZV9pbnN0cnVjYW8sIHBhZHJvbml6YXJfZ3JhdV9kZV9pbnN0cnVjYW8pLAogICAgICAgICBncmF1X2RlX2luc3RydWNhbyA9IGlmZWxzZShncmF1X2RlX2luc3RydWNhbyAlaW4lIGMoIkVuc2lubyBTdXBlcmlvciBDb21wbGV0byIsICJFbnNpbm8gYWNpbWEgZGUgU3VwZXJpb3IgQ29tcGxldG8iKSwiRW5zaW5vIFN1cGVyaW9yIENvbXBsZXRvIiwgZ3JhdV9kZV9pbnN0cnVjYW8pKSAlPiUgCiAgZ3JvdXBfYnkoYW5vLCByZWdpYW8sIFVGLCBnZW5lcm8sZ3JhdV9kZV9pbnN0cnVjYW8pICU+JSAKICBzdW1tYXJpc2UocHJlc29zID0gc3VtKHByZXNvcykpICU+JQogIHNlbGVjdCAoImFubyIsICJyZWdpYW8iLCAiVUYiLCAiZ2VuZXJvIiwgImdyYXVfZGVfaW5zdHJ1Y2FvIiwgInByZXNvcyIpCmBgYAoKZGVwb2lzIGRlIHJvZGFyIGEgZnVuw6fDo28gbmFzIGR1YXMgdGFiZWxhcywgZWlzIG8gcmVzdWx0YWRvOiAKCiMjIFRhYmVsYXMgUGFkcm9uaXphZGFzIFBOQURDIGUgSU5GT1BFTiB7LnRhYnNldCAudGFic2V0LWZhZGV9CgojIyMgQWxmYWJldGl6YcOnw6NvIGRhIHBvcHVsYcOnw6NvCgpgYGB7ciB2aXN1YWxpemHDp8OjbyBhbGZhYmV0aXphY2FvX3BvcHVsYWNhb181IHBhZHJvbml6YWRhLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGFycmFuZ2UoYWxmYWJldGl6YWNhb19wb3B1bGFjYW9fNSxhbm8sIHJlZ2lhbywgVUYsIGdlbmVybyxncmF1X2RlX2luc3RydWNhbywgcG9wdWxhY2FvKSwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIyBBbGZhYmV0aXphw6fDo28gZG9zIHByZXNvcwpgYGB7ciB2aXN1YWxpemHDp8OjbyBpbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvXzMxX3BhZHJhbyBwYWRyb25pemFkYSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChpbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvXzMxX3BhZHJhbywxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIERhZG9zIEF1c2VudGVzIG5hIFRhYmVsYSBJTkZPUEVOCgpQZXJjZWJpIHF1ZSBhcMOzcyB0b2RhcyBhcyBwYWRyb25pemHDp8O1ZXMgYXMgdGFiZWxhcyB2b2x0YXJhbSBjb20gcXVhbnRpZGFkZXMgZGlmZXJlbnRlcyBkZSBvYnNlcnZhw6fDtWVzLiBBIHRhYmVsYSBpbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvXzMxX3BhZHJhbyBwb3NzdWkgYHIgbnJvdyhpbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvXzMxX3BhZHJhbylgIG9ic2VydmHDp8O1ZXMsIGVucXVhbnRvIGFsZmFiZXRpemFjYW9fcG9wdWxhY2FvXzUgcG9zc3VpIGByIG5yb3coYWxmYWJldGl6YWNhb19wb3B1bGFjYW9fNSlgIG9ic2VydmHDp8O1ZXMuIFJlc29sdmkgaW52ZXN0aWdhciB1c2FuZG8gYW50aV9qb2luIGUgZGVzY29icmkgcXVlIGEgdGFiZWxhIGRvIGluZm9wZW4gbsOjbyB0ZW0gYXMgb2JzZXJ2YcOnw7VlcyBkYSB0YWJlbGEgY3JpYWRhIGFiYWl4by4KICAKYGBge3Igb2JzZXJ2YWNvZXNfZmFsdGFudGVzLCBpbmNsdWRlPUZBTFNFfQpvYnNlcnZhY29lc19mYWx0YW50ZXMgPC0gYW50aV9qb2luKGFsZmFiZXRpemFjYW9fcG9wdWxhY2FvXzUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9wZW5fZ3JhdV9kZV9pbnN0cnVjYW9fMzFfcGFkcmFvLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoImFubyIsICJVRiIsICJnZW5lcm8iLCAicmVnaWFvIiwgImdyYXVfZGVfaW5zdHJ1Y2FvIikpCmBgYAogIApgYGB7ciBoZWFkKG9ic2VydmFjb2VzX2ZhbHRhbnRlcyksIGVjaG89RkFMU0V9CmhlYWQob2JzZXJ2YWNvZXNfZmFsdGFudGVzKQpgYGAKClBhcmEgbsOjbyBkZWl4YXIgZXNzZXMgdmFsb3JlcyBlbSBicmFuY28sIGRlY2lkaSB1c2FyIG1lZGlhIHNpbXBsZXMgZG8gbsO6bWVybyBkZSBwcmVzb3Mgbm9zIG91dHJvcyBhbm9zIHBhcmEgY2FkYSBvYnNlcnZhw6fDo28gYXVzZW50ZSwgdXNhciBlc3NhIG3DqWRpYSBjb21vIHZhbG9yIGUgc8OzIGVudMOjbyBjb21iaW5hciBhcyB0YWJlbGFzIGRvIFBOQURDIGNvbSBJTkZPUEVOLgoKYGBge3IgRmlsdHJhciBhZ3J1cGFyIGUgY2FsY3VsYXIgYSBtw6lkaWEgZG9zIHByZXNvcyBwb3IgZ3J1cG8sIGluY2x1ZGU9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm1lZGlhc19wb3JfZ3J1cG8gPC0gaW5mb3Blbl9ncmF1X2RlX2luc3RydWNhb18zMV9wYWRyYW8gJT4lCiAgZmlsdGVyKGFubyAlaW4lIGMoIjIwMTYiLCAiMjAxOCIsICIyMDE5IikgfCBhbm8gJWluJSBjKCIyMDE3IiwgIjIwMTgiLCAiMjAxOSIpKSAlPiUKICBncm91cF9ieShVRiwgZ2VuZXJvLCByZWdpYW8sIGdyYXVfZGVfaW5zdHJ1Y2FvKSAlPiUKICBzdW1tYXJpc2UobWVkaWFfcHJlc29zID0gbWVhbihwcmVzb3MpKQoKIyBBdHVhbGl6YXIgbyBkYXRhZnJhbWUgb2JzZXJ2YWNvZXNfZmFsdGFudGVzIGNvbSBvcyB2YWxvcmVzIGVzdGltYWRvcyBkZSBwcmVzb3MKb2JzZXJ2YWNvZXNfZmFsdGFudGVzXzJfYXR1YWxpemFkYXMgPC0gbWVyZ2Uob2JzZXJ2YWNvZXNfZmFsdGFudGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYXNfcG9yX2dydXBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIlVGIiwgImdlbmVybyIsInJlZ2lhbyIsImdyYXVfZGVfaW5zdHJ1Y2FvIiksYWxsLnggPSBUUlVFLCBhbGwueSA9IEZBTFNFKQpgYGAKCmBgYHtyIGluZm9wZW5fZ3JhdV9kZV9pbnN0cnVjYW9fNF9maW5hbCwgaW5jbHVkZT1GQUxTRX0KaW5mb3Blbl9ncmF1X2RlX2luc3RydWNhb180X2ZpbmFsIDwtIHJiaW5kKGluZm9wZW5fZ3JhdV9kZV9pbnN0cnVjYW9fMzFfcGFkcmFvLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmFjb2VzX2ZhbHRhbnRlc18yX2F0dWFsaXphZGFzKSAlPiUgCiAgbXV0YXRlKHByZXNvcyA9IGlmZWxzZShpcy5uYShwcmVzb3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfcHJlc29zLAogICAgICAgICAgICAgICAgICAgICAgICAgcHJlc29zKSwKICAgICAgICAgcHJlc29zID0gcm91bmQocHJlc29zLCAwKSkgJT4lIAogIHNlbGVjdCgtYyhtZWRpYV9wcmVzb3MsIHBvcHVsYWNhbykpCmBgYAoKQWdvcmEgYSB0YWJlbGEgZG8gSU5GT1BFTiBjb250w6ltIGByIG5yb3coaW5mb3Blbl9ncmF1X2RlX2luc3RydWNhb180X2ZpbmFsKWAgY29sdW5hcywgdGFsIGNvbW8gYSB0YWJlbGEgZG8gUE5BRCwgbG9nbyBwb3NzbyBjb21iaW7DoS1sYXMuCgpgYGB7ciBEZWZpbmlyIGEgb3JkZW0gY29ycmV0YSBkZSBncmF1cyBkZSBpbnN0cnVjYW8sIGluY2x1ZGU9RkFMU0V9Cm9yZGVtX2NvcnJldGFfZ3JhdXNfZGVfaW5zdHJ1Y2FvIDwtIGMoIkFuYWxmYWJldG8iLCAiRW5zaW5vIEZ1bmRhbWVudGFsIEluY29tcGxldG8iLCAiRW5zaW5vIEZ1bmRhbWVudGFsIENvbXBsZXRvIiwgIkVuc2lubyBNw6lkaW8gSW5jb21wbGV0byIsICJFbnNpbm8gTcOpZGlvIENvbXBsZXRvIiwgIkVuc2lubyBTdXBlcmlvciBJbmNvbXBsZXRvIiwiRW5zaW5vIFN1cGVyaW9yIENvbXBsZXRvIikKCgpwb3B1bGFjYW9faW5mb3Blbl9ncmF1X2RlX2luc3RydWNhbyA8LSBhcy5kYXRhLmZyYW1lKGxlZnRfam9pbihpbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvXzRfZmluYWwsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsZmFiZXRpemFjYW9fcG9wdWxhY2FvXzUsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gam9pbl9ieShhbm8sIHJlZ2lhbywgVUYsIGdlbmVybywgZ3JhdV9kZV9pbnN0cnVjYW8pKSkgJT4lCiAgbXV0YXRlKGFubyA9IGFzLm51bWVyaWMoYW5vKSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1jKHByZXNvcywgcG9wdWxhY2FvLCBhbm8pKSwgYXMuZmFjdG9yKSAlPiUKICBtdXRhdGUoZ3JhdV9kZV9pbnN0cnVjYW8gPSBmYWN0b3IoZ3JhdV9kZV9pbnN0cnVjYW8sIGxldmVscyA9IG9yZGVtX2NvcnJldGFfZ3JhdXNfZGVfaW5zdHJ1Y2FvKSkKYGBgCgojIyBUYWJlbGEgUE5BREMgLSBJTkZPUEVOIEdyYXUgZGUgSW5zdHJ1w6fDo28KCmBgYHtyIHZpc3VhbGl6YcOnw6NvIHBvcHVsYWNhb19pbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvICwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGFjYW9faW5mb3Blbl9ncmF1X2RlX2luc3RydWNhbywxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCgojIFRhYmVsYSBJQkdFIEV0bmlhCgpFc3NhIFRhYmVsYSBwb3NzdWkgYSBkaXN0cmlidWnDp8OjbyBwZXJjZW50dWFsIGV0bmljYSBkYSBwb3B1bGHDp8OjbyBicmFzaWxlaXJhIHBvciBlc3RhZG8uIE8gYXJxdWl2byBhIHNlciB0cmFiYWxoYWRvIGFxdWkgY2hhbWEtc2UgIlRhYmVsYSAxLjEgRElTVCBQRVJDRVQgUkFDQS54bHMiLCBlIHBvZGUgc2VyIGVuY29udHJhZG8gbm8gc2l0ZSBkbyBbSUJHRV0oaHR0cHM6Ly93d3cuaWJnZS5nb3YuYnIvZXN0YXRpc3RpY2FzL2Rvd25sb2Fkcy1lc3RhdGlzdGljYXMuaHRtbCkKIApWb3UgcHVsYXIgYSBwYXJ0ZSBkZSBsZWl0dXJhIGRvcyBkYWRvcyBwb2lzIG7Do28gZGlmZXJlIGVtIG5hZGEgZGFzIHRhYmVsYXMgYW50ZXJpb3Jlcy4KYGBge3IgVGFiZWxhIDEuMSBESVNUIFBFUkNFVCBSQUNBLCBpbmNsdWRlPUZBTFNFfQojIE9idGVyIG8gbm9tZSBkZSB0b2RhcyBhcyBmb2xoYXMgZG8gYXJxdWl2bwpub21lc19mb2xoYXNfZXRuaWFfcmVnaWFvX3RhYmVsYV8xLjEgPC0gZXhjZWxfc2hlZXRzKCJQTkFEYy9UYWJlbGEgMS4xIERJU1QgUEVSQ0VUIFJBQ0EueGxzIikKCiMgSW5pY2lhbGl6YXIgdW0gZGF0YWZyYW1lIHZhemlvCmRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2V0bmlhX2VfcmVnaWFvIDwtIGRhdGEuZnJhbWUoKQoKIyBMb29wIHBhcmEgbGVyIGNhZGEgZm9saGEgZSBhZGljaW9uYXIgYW8gZGF0YWZyYW1lIGRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2V0bmlhX2VfcmVnaWFvCmZvciAobm9tZV9mb2xoYV90YWJlbGFfMS4xIGluIG5vbWVzX2ZvbGhhc19ldG5pYV9yZWdpYW9fdGFiZWxhXzEuMSkgewogICMgTGVyIGEgZm9saGEgYXR1YWwKICBmb2xoYV9hdHVhbF90YWJlbGFfMS4xIDwtIHJlYWRfeGxzKCJQTkFEYy9UYWJlbGEgMS4xIERJU1QgUEVSQ0VUIFJBQ0EueGxzIiwgc2hlZXQgPSBub21lX2ZvbGhhX3RhYmVsYV8xLjEsIHJhbmdlID0gIkE1OkszNyIpCiAgCiAgIyBBZGljaW9uYXIgdW1hIGNvbHVuYSAnYW5vJyBjb20gbyBub21lIGRhIGZvbGhhCiAgZm9saGFfYXR1YWxfdGFiZWxhXzEuMSRhbm8gPC0gbm9tZV9mb2xoYV90YWJlbGFfMS4xCiAgCiAgIyBSZW5vbWVhciBjb2x1bmFzCiAgY29sbmFtZXMoZm9saGFfYXR1YWxfdGFiZWxhXzEuMSkgPC0gYygiVUYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbCIsICJjdl90b3RhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJyYW5jYSIsICJjdl9icmFuY2EiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmV0YSIsICJjdl9wcmV0YSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmRhIiwgImN2X1BhcmRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW1hcmVsb19pbmRpZ2VuYSIsICJjdl9BbWFyZWxvX2luZGlnZW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbm8iKQogIAogICMgUmVtb3ZlciBhIHByaW1laXJhIGxpbmhhCiAgZm9saGFfYXR1YWxfdGFiZWxhXzEuMSA8LSBmb2xoYV9hdHVhbF90YWJlbGFfMS4xWy0xLF0KICAKICAjIEFkaWNpb25hciBhIGZvbGhhIGF0dWFsIGFvIGRhdGFmcmFtZSBkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9ldG5pYV9lX3JlZ2lhbwogIGRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2V0bmlhX2VfcmVnaWFvIDwtIGJpbmRfcm93cyhkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9ldG5pYV9lX3JlZ2lhbywgZm9saGFfYXR1YWxfdGFiZWxhXzEuMSkgCn0KCiMjIHJlbW92ZW5kbyBhcyBjb2x1bmFzIGRlIGNvZWZpY2llbnRlIGRlIHZhcmlhY2FvCmRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2V0bmlhX2VfcmVnaWFvXzIgPC0gZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfZXRuaWFfZV9yZWdpYW8gJT4lIAogIHNlbGVjdChhbm8sIFVGLCBUb3RhbCwgQnJhbmNhLCAKICAgICAgICAgUHJldGEsIFBhcmRhKSAlPiUgCiAgbXV0YXRlKGFubyA9IGFzLm51bWVyaWMoYW5vKSwKICAgICAgICAgVUYgPSB1Zl9kaWN0W2FzLmNoYXJhY3RlcihVRildLCAjIyB1c2FuZG8gbyBkaWNpb25hcmlvIGRlIGVzdGFkb3MgcGFyYSBwb2RlciBmaWx0cmFyIGFzIHJlZ2lvZXMKICAgICAgICAgVUYgPSBhcy5mYWN0b3IoVUYpKSAlPiUgCiAgbmEub21pdCgpCgpkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9ldG5pYV9lX3JlZ2lhb18yIDwtIGFzLmRhdGEuZnJhbWUoZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfZXRuaWFfZV9yZWdpYW9fMikKCmBgYAoKYGBge3IgdmlzdWFsaXphY2FvIGRpc3QgZXRuaWEgZSByZWdpYW8sIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfZXRuaWFfZV9yZWdpYW9fMiwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCkVzc2EgdGFiZWxhIHBvc3N1aSBkYWRvcyBkZSAyMDEyIGEgMjAxOC4gVm91IHV0aWxpemFyIGEgZsOzcm11bGEgcXVlIGRpc2N1dGltb3Mgbm8gY29tZcOnbyBwYXJhIGVzdGltYXIgYSBwb3B1bGHDp8OjbyBlbSAyMDE5LiAgClZvdSBjb21lw6dhciB0cmFuc2Zvcm1hbmRvIG9zIGRhZG9zIGRhIHRhYmVsYSwgcG9pcyBvIG51bWVybyBwcmVzZW50ZSBuYSBjb2x1bmEgdG90YWwgYWluZGEgZGV2ZSBzZXIgbXVsdGlwbGljYWRvIHBvciAxMDAwLCBlIG9zIHZhbG9yZXMgZGFzIGV0bmlhcyBlc3TDo28gZW0gcG9yY2VudGFnZW0gZW0gcmVsYcOnw6NvIGFvIHRvdGFsLgoKYGBge3IgdHJhbnNmb3JtYXIgcG9yY2VudGFnZW5zIGVtIHZhbG9yZXN9CmRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2V0bmlhX2VfcmVnaWFvXzMgPC0gZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfZXRuaWFfZV9yZWdpYW9fMiAlPiUgCiAgbXV0YXRlKAogICAgVG90YWwgPSByb3VuZChUb3RhbCoxMDAwKSwKICAgIEJyYW5jYSA9IHJvdW5kKEJyYW5jYSpUb3RhbC8xMDApLAogICAgUHJldGEgPSByb3VuZChQcmV0YSpUb3RhbC8xMDApLAogICAgUGFyZGEgPSByb3VuZChQYXJkYSpUb3RhbC8xMDApKQoKYGBgCgoKYGBge3IgZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfZXRuaWFfZV9yZWdpYW9fMyBjYWxjdWxhciB2YWxvcmVzIHBhcmEgMjAxOSwgaW5jbHVkZT1GQUxTRX0KZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfZXRuaWFfZV9yZWdpYW9fNCA8LSBkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9ldG5pYV9lX3JlZ2lhb18zICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBhbm8sIHZhbHVlc19mcm9tID0gVG90YWw6UGFyZGEpCgpkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9ldG5pYV9lX3JlZ2lhb181IDwtIGRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2V0bmlhX2VfcmVnaWFvXzQgJT4lIAogIG11dGF0ZSgKICAgIFRvdGFsXzIwMTkgPSByb3VuZChmb3JtdWxhKFRvdGFsXzIwMTgsMjAxOCxUb3RhbF8yMDEyLDIwMTIsMjAxOSkpLAogICAgQnJhbmNhXzIwMTkgPSByb3VuZChmb3JtdWxhKEJyYW5jYV8yMDE4LDIwMTgsQnJhbmNhXzIwMTIsMjAxMiwyMDE5KSksCiAgICBQYXJkYV8yMDE5ID0gIHJvdW5kKGZvcm11bGEoUGFyZGFfMjAxOCwyMDE4LFBhcmRhXzIwMTIsMjAxMiwyMDE5KSksCiAgICBQcmV0YV8yMDE5ID0gcm91bmQoZm9ybXVsYShQcmV0YV8yMDE4LDIwMTgsUHJldGFfMjAxMiwyMDEyLDIwMTkpKSkKCmRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2V0bmlhX2VfcmVnaWFvXzYgPC0gZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfZXRuaWFfZV9yZWdpYW9fNSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1VRiwgbmFtZXNfdG8gPSBjKCIudmFsdWUiLCAiYW5vIiksIG5hbWVzX3NlcCA9ICJfIikgJT4lIAogIGZpbHRlcihhbm8gJWluJSBjKCIyMDE2IiwiMjAxNyIsIjIwMTgiLCIyMDE5IikpICU+JSAKICBzZWxlY3QoLVRvdGFsKQoKZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfZXRuaWFfZV9yZWdpYW9fNyA8LSBkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9ldG5pYV9lX3JlZ2lhb182ICU+JSAKICAgIHBpdm90X2xvbmdlcihjb2xzID0gYygiUHJldGEiLCAiQnJhbmNhIiwgIlBhcmRhIiksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImV0bmlhIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInBvcHVsYWNhbyIpCgpgYGAKClBvciBmaW0gYSB0YWJlbGEgcXVlIGlyZW1vcyB1dGlsaXphciBwYXJhIGNvbWJpbmFyIGNvbSBhIGRvIElORk9QRU4KYGBge3IgdGFiZWxhIHBvcHVsYWNhb19ldG5pYSxpbmNsdWRlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwb3B1bGFjYW9fZXRuaWEgPC0gZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfZXRuaWFfZV9yZWdpYW9fNyAlPiUKICBtZXJnZSh1Zl9yZWdpYW8sIGJ5ID0gIlVGIiwgYWxsLnggPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGFubyA9IGFzLm51bWVyaWMoYW5vKSwKICAgIGV0bmlhID0gaWZfZWxzZShldG5pYSA9PSAiQnJhbmNhIiwgImJyYW5jYSIsIAogICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UoZXRuaWEgJWluJSBjKCJQcmV0YSIsICJQYXJkYSIpLCAicHJldGEgb3UgcGFyZGEiLE5BKSkpICU+JSAKICBncm91cF9ieShhbm8sIFVGLCByZWdpYW8sIGV0bmlhKSAlPiUgCiAgc3VtbWFyaXNlKHBvcHVsYWNhbyA9IHN1bShwb3B1bGFjYW8pKSAlPiUgCiAgc2VsZWN0KGFubywgcmVnaWFvLCBVRiwgZXRuaWEsIHBvcHVsYWNhbykKCmBgYAoKIyMgRGlzdHJpYnVpw6fDo28gw4l0bmljYSBkYSBQb3B1bGHDp8OjbyBCcmFzaWxlaXJhCgpgYGB7ciB2aXN1YWxpemHDp8OjbyBkYSB0YWJlbGEgcG9wdWxhY2FvX2V0bmlhLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYWNhb19ldG5pYSwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIE9ic2VydmHDp8O1ZXMgQXVzZW50ZXMgbmEgVGFiZWxhIGRvIElORk9QRU4KQXDDs3MgbWFuaXB1bGHDp8OjbyBkb3MgZGFkb3MgZGVzc2EgdGFiZWxhIGRvIElCR0UsIHZvdSBjb21iaW7DoS1sYSBjb20gYSB0YWJlbGEgZG8gSU5GT1BFTiwgcGFyYSB0ZXIgY29tbyBjb3JyZWxhY2lvbmFyIG8gdG90YWwgZGUgcHJlc29zIGUgYSBwb3B1bGHDp8OjbyBwYXJhIGNhZGEgdmFyacOhdmVsLiBQb3LDqW0sIG5hIGhvcmEgZGUgY29tYmluYXIgb3MgZGF0YWZyYW1lcywgZGVzY29icmkgcXVlIHF1ZSBow6Egb2JzZXJ2YcOnw7VlcyBmYWx0YW50ZXMgbmEgdGFiZWxhIGluZm9wZW5fZXRuaWFfM19maW5hbCBwb2lzIGVsYSBwb3NzdWkgbWVub3MgbGluaGFzIHF1ZSBhIHRhYmVsYSBkbyBQTkFELiBWb3UgdXNhciBhbnRpLWpvaW4gcGFyYSBkZXNjb2Jyw60tbG9zIGUgcmVncmVzc2FvIGxpbmVhciBwYXJhIGNhbGN1bGFyLWxvcyAKCmBgYHtyIGRpZmVyZW5jYV9pbmZvcGVuX3BvcHVsYWNhb19ldG5pYSwgaW5jbHVkZT1GQUxTRX0KZGlmZXJlbmNhX2luZm9wZW5fcG9wdWxhY2FvX2V0bmlhIDwtIGFudGlfam9pbihwb3B1bGFjYW9fZXRuaWEsIGluZm9wZW5fZXRuaWFfM19maW5hbCwgYnkgPSBqb2luX2J5KGFubywgcmVnaWFvLCBVRiwgZXRuaWEpKSAlPiUgCiAgbXV0YXRlKFVGID0gYXMuY2hhcmFjdGVyKFVGKSkgJT4lIAogIHNlbGVjdCgtcG9wdWxhY2FvKQpgYGAKClPDo28gZXNzYXMgYXMgb2JzZXJ2YcOnw7VlcyBhdXNlbnRlcyBuYSB0YWJlbGEgZG8gSU5GT1BFTgpgYGB7ciBoZWFkKGRpZmVyZW5jYV9pbmZvcGVuX3BvcHVsYWNhb19ldG5pYSl9CmhlYWQoZGlmZXJlbmNhX2luZm9wZW5fcG9wdWxhY2FvX2V0bmlhKQpgYGAKCmBgYHtyIHNlcmdpcGVfZXRuaWEsIGluY2x1ZGU9RkFMU0V9CnNlcmdpcGVfZXRuaWEgPC0gaW5mb3Blbl9ldG5pYV8zX2ZpbmFsICU+JSAKICBmaWx0ZXIoVUYgPT0gIlNFIiwgYW5vIDwgMjAxOSkKCgojIGZ1bmNhbyBwYXJhIHByZXZlciBvIGFubyAyMDE5CnByZXZlcl9pbmZvcGVuX2V0bmlhIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBtb2RlbCA8LSBsbShwcmVzb3MgfiBhbm8sIGRhdGEgPSBkYXRhKQogIHByZWRpY3QobW9kZWwsIG5ld2RhdGEgPSBkYXRhLmZyYW1lKGFubyA9IDIwMTkpKQp9CgojIyBwcmV2aXNhbyBwYXJhIDIwMTkKcHJldmlzb2VzXzIwMTlfaW5mb3Blbl9ldG5pYSA8LSBzZXJnaXBlX2V0bmlhICU+JQogIGdyb3VwX2J5KHJlZ2lhbywgVUYsIGV0bmlhKSAlPiUKICBuZXN0KCkgJT4lCiAgbXV0YXRlKHByZXNvcyA9IHJvdW5kKG1hcF9kYmwoZGF0YSwgcHJldmVyX2luZm9wZW5fZXRuaWEpKSwKICAgICAgICAgYW5vID0gMjAxOSkgJT4lICNhY3Jlc2NlbnRhciBhIGNvbHVuYSBhbm8gY29tIG8gdmFsb3IgMjAxOQogIHNlbGVjdCgtZGF0YSkKYGBgCgpBcMOzcyBhbGd1bnMgY8OhbGN1bG9zLCBjaGVndWVpIG5lc3NlIHJlc3VsdGFkbyBkZSBwcmV2acOjbyBkZSBwcmVzb3MgZSBjYWRhIG9ic2VydmHDp8OjbzoKYGBge3IgaGVhZChwcmV2aXNvZXNfMjAxOV9pbmZvcGVuX2V0bmlhKX0KaGVhZChwcmV2aXNvZXNfMjAxOV9pbmZvcGVuX2V0bmlhKQpgYGAKICAKQWdvcmEgYmFzdGEgY29tYmluYXIgYXMgdGFiZWxhcyBjb20gZGFkb3Mgc29icmUgYSBldG5pYSBkYSBwb3B1bGHDp8OjbyBicmFzaWxlaXJhIHRvdGFsIGNvbSBhIHBvcHVsYcOnw6NvIGNhcmNlcsOhcmlhIGUgZW50w6NvIGNoZWdhcmVtb3MgbmVzc2EgdGFiZWxhOiAKYGBge3IgY29tYmluYXIgdGFiZWxhcyBpbmZvcGVuIGV0bmlhIGNvbSBkYWRvcyBmYWx0YW50ZXMsIGluY2x1ZGU9RkFMU0V9CnNlcmdpcGVfZXRuaWEgPC1yYmluZChzZXJnaXBlX2V0bmlhLCBwcmV2aXNvZXNfMjAxOV9pbmZvcGVuX2V0bmlhKQoKIyMgZmluYWxtZW50ZSBhIHRhYmVsYSBjb21wbGV0YSBkbyBpbmZvcGVuCmluZm9wZW5fZXRuaWFfNCA8LSByYmluZChpbmZvcGVuX2V0bmlhXzNfZmluYWwsIHNlcmdpcGVfZXRuaWEpICU+JSAKICBkaXN0aW5jdCgpCgojIyB0YWJlbGEgY29tIGNvbWJpbmFjYW8gZG9zIGRhZG9zCnBvcHVsYWNhb19pbmZvcGVuX2V0bmlhIDwtIGFzLmRhdGEuZnJhbWUobGVmdF9qb2luKGluZm9wZW5fZXRuaWFfNCwgcG9wdWxhY2FvX2V0bmlhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGpvaW5fYnkoYW5vLCByZWdpYW8sIFVGLCBldG5pYSkpKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLWMocHJlc29zLCBwb3B1bGFjYW8sIGFubykpLCBhcy5mYWN0b3IpICU+JSAKICBtdXRhdGUocHJlc29zID0gYXMubnVtZXJpYyhwcmVzb3MpKQoKYGBgCiAgCiMjIFRhYmVsYSBQTkFEQyAtIElORk9QRU4gRXRuaWEKICAKYGBge3IgdmlzdWFsaXphw6fDo28gZGEgdGFiZWxhIHBvcHVsYWNhb19pbmZvcGVuX2V0bmlhLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYWNhb19pbmZvcGVuX2V0bmlhLDEwKSkgJT4lCiAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAoKCiMgVGFiZWxhIElCR0UgRmFpeGEgRXTDoXJpYQoKTyBhcnF1aXZvIGEgc2VyIHRyYWJhbGhhZG8gYXF1aSBjaGFtYS1zZSAiVGFiZWxhIDEuMiBESVNUIFBPUCBFVEFSSUEueGxzIiwgZSBwb2RlIHNlciBlbmNvbnRyYWRvIG5vIHNpdGUgZG8gW0lCR0VdKGh0dHBzOi8vd3d3LmliZ2UuZ292LmJyL2VzdGF0aXN0aWNhcy9kb3dubG9hZHMtZXN0YXRpc3RpY2FzLmh0bWwpCiAgCkVzc2EgdGFiZWxhIHBvc3N1aSBkYWRvcyBzb2JyZSBhIGRpc3RyaWJ1acOnw6NvIGRhIGZhaXhhIGV0w6FyaWEgZGEgcG9wdWxhw6fDo28gcG9yIGV0bmlhLgoqSW5kw61nZW5hcywgYW1hcmVsb3MgZSBwZXNzb2FzIHNlbSBkZWNsYXJhw6fDo28gZGUgY29yIG91IHJhw6dhIGNvbnN0YW0gbm8gdG90YWwuKgoKYGBge3IgVGFiZWxhIDEuMiBESVNUIFBPUCBFVEFSSUEsIGluY2x1ZGU9RkFMU0V9CgojIE9idGVyIG8gbm9tZSBkZSB0b2RhcyBhcyBmb2xoYXMgZG8gYXJxdWl2bwpub21lc19mb2xoYXNfcG9wdWxhY2FvX3Bvcl9pZGFkZV90YWJlbGFfMS4yIDwtIGV4Y2VsX3NoZWV0cygiUE5BRGMvVGFiZWxhIDEuMiBESVNUIFBPUCBFVEFSSUEueGxzIikKCiMgSW5pY2lhbGl6YXIgdW0gZGF0YWZyYW1lIHZhemlvCmRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2lkYWRlIDwtIGRhdGEuZnJhbWUoKQoKIyBMb29wIHBhcmEgbGVyIGNhZGEgZm9saGEgZSBhZGljaW9uYXIgYW8gZGF0YWZyYW1lIGRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2lkYWRlCmZvciAobm9tZV9kYV9mb2xoYV90YWJlbGFfMS4yIGluIG5vbWVzX2ZvbGhhc19wb3B1bGFjYW9fcG9yX2lkYWRlX3RhYmVsYV8xLjIpIHsKICAjIExlciBhIGZvbGhhIGF0dWFsCiAgZm9saGFfYXR1YWxfdGFiZWxhXzEuMiA8LSByZWFkX3hscygiUE5BRGMvVGFiZWxhIDEuMiBESVNUIFBPUCBFVEFSSUEueGxzIiwgc2hlZXQgPSBub21lX2RhX2ZvbGhhX3RhYmVsYV8xLjIsIHJhbmdlID0gIkE1OksyMyIpCiAgCiAgIyBBZGljaW9uYXIgdW1hIGNvbHVuYSAnYW5vJyBjb20gbyBub21lIGRhIGZvbGhhCiAgZm9saGFfYXR1YWxfdGFiZWxhXzEuMiRhbm8gPC0gbm9tZV9kYV9mb2xoYV90YWJlbGFfMS4yCiAgCiAgIyBSZW5vbWVhciBjb2x1bmFzCiAgY29sbmFtZXMoZm9saGFfYXR1YWxfdGFiZWxhXzEuMikgPC0gYygiZmFpeGFfZXRhcmlhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG90YWwiLCAiY3ZfdG90YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJicmFuY2EiLCAiY3ZfYnJhbmNhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJldGFfb3VfUGFyZGEiLCAiY3ZfcHJldGFfcGFyZGEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wb3JjYW9fYnJhbmNhIiwgImN2X3Byb3BvcmNhb19icmFuY2EiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wb3JjYW9fcHJldGFfcGFyZGEiLCAiY3ZfcHJvcG9yY2FvX3ByZXRhX3BhcmRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5vIikKICAKICAjIFJlbW92ZXIgYSBwcmltZWlyYSBsaW5oYQogIGZvbGhhX2F0dWFsX3RhYmVsYV8xLjIgPC0gZm9saGFfYXR1YWxfdGFiZWxhXzEuMlstMSxdCiAgCiAgIyBBZGljaW9uYXIgYSBmb2xoYSBhdHVhbCBhbyBkYXRhZnJhbWUgZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfaWRhZGUKICBkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9pZGFkZSA8LSBiaW5kX3Jvd3MoZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfaWRhZGUsIGZvbGhhX2F0dWFsX3RhYmVsYV8xLjIpCn0KYGBgCgpgYGB7ciB2aXN1YWxpemHDp8OjbyBkYSB0YWJlbGEgVGFiZWxhIDEuMiBESVNUIFBPUCBFVEFSSUEsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfaWRhZGUsMTApKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgpgYGB7ciBmaWx0cmFuZG8gZSBvcmdhbml6YW5kbyBvcyBkYWRvcyBxdWUgdm91IHByZWNpc2FyLCBpbmNsdWRlPUZBTFNFfQpkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9pZGFkZV8yIDwtIGRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2lkYWRlICU+JSAKICBzZWxlY3QoYW5vLCBmYWl4YV9ldGFyaWEsVG90YWwpICU+JSAKICBtdXRhdGUoYW5vID0gYXMubnVtZXJpYyhhbm8pLAogICAgICAgICBmYWl4YV9ldGFyaWEgPSBhcy5mYWN0b3IoZmFpeGFfZXRhcmlhKSwKICAgICAgICAgVG90YWwgPSBUb3RhbCoxMDAwKSAlPiUgCiAgICBmaWx0ZXIoIXN0cl9kZXRlY3QoZmFpeGFfZXRhcmlhLCAiMCBhIDQgYW5vc3w1IGEgOSBhbm9zfDEwIGEgMTQgYW5vc3wxNSBhIDE5IGFub3N8MjAgYSAyNCBhbm9zIikpCgpgYGAKCkFzc2ltIGNvbW8gYSB0YWJlbGEgYW50ZXJpb3IsIGVzc2EgcG9zc3VpIGRhZG9zIGFwZW5hcyBkZSAyMDEyIGEgMjAxOCwgbG9nbyB2b3UgdXRpbGl6YXIgYSBtZXNtYSBmw7NybXVsYSBwYXJhIHByZXZlciBhIHBvcHVsYcOnw6NvIGVtIDIwMTkuCgpgYGB7ciBmYWl4YV9ldGFyaWEgd2lkZSwgaW5jbHVkZT1GQUxTRX0KZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfaWRhZGVfMyA8LSBwaXZvdF93aWRlcihkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9pZGFkZV8yLCBuYW1lc19mcm9tID0gYW5vLCB2YWx1ZXNfZnJvbSA9IFRvdGFsKQoKZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfaWRhZGVfMyA8LSBkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9pZGFkZV8zICU+JSAKICBtdXRhdGUoCiAgICBgMjAxOWAgPSByb3VuZChmb3JtdWxhKGAyMDE4YCwyMDE4LGAyMDEyYCwyMDEyLDIwMTkpKQogICkKCmRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2lkYWRlXzQgPC0gcGl2b3RfbG9uZ2VyKGRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2lkYWRlXzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IC1mYWl4YV9ldGFyaWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiYW5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicG9wdWxhY2FvIikgJT4lIAogIGZpbHRlcihhbm8gJWluJSBjKCIyMDE2IiwiMjAxNyIsIjIwMTgiLCIyMDE5IikpCmBgYAogIAojIyBQYWRyb25pemHDp8OjbyBkYXMgRmFpeGFzIGRlIElkYWRlCiAgCkNvbW8gw6kgcG9zc2l2ZWwgdmVyIGxvZ28gYSBiYWl4bywgZW1ib3JhIGFnb3JhIHRlbmhhbW9zIG9zIGRhZG9zIGRlIDIwMTYgYSAyMDE5LCBhcyBmYWl4YXMgZXTDoXJpYXMgbsOjbyBzw6NvIGV4YXRhbWVudGUgaWd1YWlzIMOgcyBkbyBJTkZPUEVOLCBtYXMgc8OjbyBiZW0gcHJveGltYXMuCmBgYHtyIHZpc3VhbGl6YWNhbyBkYSB0YWJlbGEgY29tIGRhZG9zIDIwMTIgYSAyMDE5LCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2lkYWRlXzQsMTApKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCk8gcXVlIHZvdSBmYXplciwgw6kgY3JpYXIgdW1hIGZ1bsOnw6NvIHF1ZSBhanVzdGEgYXMgZmFpeGFzIGV0w6FyaWFzIHBhcmEgZXN0YXJlbSBkZSBhY29yZG8gY29tIGFzIGRvIElORk9QRU4KYGBge3IgZnVuY2FvIHF1ZSBhanVzdGEgYSBmYWl4YSBldGFyaWF9CmFqdXN0YV9mYWl4YV9ldGFyaWEgPC0gZnVuY3Rpb24oZmFpeGEpIHsKICBpZiAoZmFpeGEgJWluJSBjKCIyNSBhIDI5IGFub3MiKSkgewogICAgcmV0dXJuKCIyNSBhIDI5IGFub3MiKQogIH0gZWxzZSBpZiAoZmFpeGEgJWluJSBjKCIzMCBhIDM0IGFub3MiKSkgewogICAgcmV0dXJuKCIzMCBhIDM0IGFub3MiKQogIH0gZWxzZSBpZiAoZmFpeGEgJWluJSBjKCIzNSBhIDM5IGFub3MiLCAiNDAgYSA0NCBhbm9zIikpIHsKICAgIHJldHVybigiMzUgYSA0NSBhbm9zIikKICB9IGVsc2UgaWYgKGZhaXhhICVpbiUgYygiNDUgYSA0OSBhbm9zIiwgIjUwIGEgNTQgYW5vcyIsICI1NSBhIDU5IGFub3MiKSkgewogICAgcmV0dXJuKCI0NiBhIDYwIGFub3MiKQogIH0gZWxzZSBpZiAoZmFpeGEgJWluJSBjKCI2MCBhIDY0IGFub3MiLCAiNjUgYSA2OSBhbm9zIikpIHsKICAgIHJldHVybigiNjEgYSA3MCBhbm9zIikKICB9IGVsc2UgaWYgKGZhaXhhICVpbiUgYygiNzAgYSA3NCBhbm9zIiwgIjc1IGEgNzkgYW5vcyIsICI4MCBhbm9zIGUgbWFpcyIpKSB7CiAgICByZXR1cm4oIk1haXMgZGUgNzAgYW5vcyIpCiAgfSBlbHNlIHsKICAgIHJldHVybihOQSkKICB9Cn0KYGBgCgpgYGB7ciBBanVzdGFuZG8gYXMgZmFpeGFzIGV0w6FyaWFzLCBpbmNsdWRlPUZBTFNFfQpkaXN0cmlidWljYW9fcG9wdWxhY2FvX3Bvcl9pZGFkZV80JGZhaXhhX2V0YXJpYSA8LSBzYXBwbHkoZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfaWRhZGVfNCRmYWl4YV9ldGFyaWEsIGFqdXN0YV9mYWl4YV9ldGFyaWEpCmBgYAoKCmBgYHtyIG9yZ2FuaXphw6fDo28gZGEgdGFiZWxhIGUgc3VtYXJpemHDp8OjbyBkb3MgZGFkb3MsIGluY2x1ZGU9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2lkYWRlXzUgPC0gZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfaWRhZGVfNCAlPiUKICBncm91cF9ieShhbm8sIGZhaXhhX2V0YXJpYSkgJT4lIAogIHN1bW1hcmlzZShwb3B1bGFjYW8gPSBzdW0ocG9wdWxhY2FvKSkKYGBgCgpBcXVpIGTDoSBwcmEgc2UgdGVyIHVtYSB2aXN1YWxpemHDp8OjbyBkYSB0YWJlbGEgcXVlIHRlbmhvIGF0w6kgZW50w6NvLgpgYGB7ciB2aXN1YWxpemFyIGEgdGFiZWxhIGRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2lkYWRlXzUsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoZGlzdHJpYnVpY2FvX3BvcHVsYWNhb19wb3JfaWRhZGVfNSwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKUG9kZS1zZSBub3RhciBxdWUgbsOjbyB0ZW5obyBhIHBvcHVsYcOnw6NvIGRlIDE4IGEgMjQgYW5vcy4gVm91IGV4dHJhaXIgZXNzYSBmYWl4YSBldMOhcmlhIGRlIG91dHJhIHRhYmVsYSBkbyBQTkFELCBxdWUgasOhIHRyYWJhbGhhbW9zIGFudGVzLgoKYGBge3IgcG9wdWxhY2FvXzE4X2FfMjRfYW5vcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcG9wdWxhY2FvXzE4X2FfMjRfYW5vcyA8LSBwbmFkXzRfcG9wdWxhY2FvX2lkYWRlICU+JQogIGZpbHRlcihncmVwbCgiMTggYSAyNCBhbm9zIiwgZ3J1cG9fZGVfaWRhZGUpLAogICAgICAgICBncmVwbCgiVG90YWzCuSIsIGV0bmlhKSkgJT4lIAogIHNlbGVjdCgtZ2VuZXJvKSAlPiUgIyB2b3UgcmVtb3ZlciBnZW5lcm8gcGFyYSByZW1vdmVyIGR1cGxpY2Fkb3MgKHBvaXMgdGVuaG8gZ2VuZXJvIGUgZXRuaWEpCiAgcmVuYW1lKGZhaXhhX2V0YXJpYSA9IGdydXBvX2RlX2lkYWRlLAogICAgICAgICBwb3B1bGFjYW8gPSB2YWxvciklPiUKICBncm91cF9ieShhbm8sZmFpeGFfZXRhcmlhLCBldG5pYSkgJT4lIAogIHN1bW1hcmlzZShwb3B1bGFjYW8gPSBzdW0ocG9wdWxhY2FvKSkgJT4lIAogIHNlbGVjdCgtZXRuaWEpICU+JSAjIHBvciBmaW0gcmVtb3ZvIGEgY29sdW5hIGRlIGV0bmlhIHF1ZSBjb25zdGEgYXBlbmFzICdUb3RhbCcKICBkcm9wX25hKCkKYGBgCgpDb21vIGrDoSBkZW1vbnN0cmFkbyBhbnRlcmlvcm1lbnRlLCB2b3UgdXNhciBhcml0bcOpcmljYSBwYXJhIHByZXZlciBhIHBvcHVsYcOnw6NvIGVtIDIwMTkuCmBgYHtyIHBvcHVsYWNhb18xOF9hXzI0X2Fub3MgMjAxNiBhIDIwMTksaW5jbHVkZT1GQUxTRX0KcG9wdWxhY2FvXzE4X2FfMjRfYW5vc193aWRlIDwtIHBpdm90X3dpZGVyKHBvcHVsYWNhb18xOF9hXzI0X2Fub3MsIG5hbWVzX2Zyb20gPSBhbm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHBvcHVsYWNhbykKCnBvcHVsYWNhb18xOF9hXzI0X2Fub3NfMiA8LSBwb3B1bGFjYW9fMThfYV8yNF9hbm9zX3dpZGUgJT4lIAogIG11dGF0ZSgKICAgIGAyMDE5YCA9IHJvdW5kKGZvcm11bGEoYDIwMThgLDIwMTgsYDIwMTZgLDIwMTYsMjAxOSkpCiAgKQoKcG9wdWxhY2FvXzE4X2FfMjRfYW5vc18zIDwtIHBpdm90X2xvbmdlcihwb3B1bGFjYW9fMThfYV8yNF9hbm9zXzIsIGNvbHMgPSAtZmFpeGFfZXRhcmlhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImFubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInBvcHVsYWNhbyIpCmBgYAoKYGBge3IgcG9wdWxhY2FvX2ZhaXhhX2V0YXJpYSwgZWNobz1GQUxTRX0KcG9wdWxhY2FvX2ZhaXhhX2V0YXJpYSA8LSByYmluZChwb3B1bGFjYW9fMThfYV8yNF9hbm9zXzMsIGRpc3RyaWJ1aWNhb19wb3B1bGFjYW9fcG9yX2lkYWRlXzUpICU+JSBtdXRhdGUoCiAgYW5vID0gYXMubnVtZXJpYyhhbm8pLAogIGZhaXhhX2V0YXJpYSA9IGFzLmZhY3RvcihmYWl4YV9ldGFyaWEpLAopCmBgYAogIAojIyBEaXN0cmlidWnDp8OjbyBkYSBGYWl4YSBFdMOhcmlhIGRhIFBvcHVsYcOnw6NvIEJyYXNpbGVpcmEKICAKRmluYWxtZW50ZSBhIHRhYmVsYSBjb20gdG9kYXMgYXMgZmFpeGFzIGV0YXJpYXMgaWd1YWwgYSBkbyBJTkZPUEVOCmBgYHtyIHZpc3VhbGl6YXIgYSB0YWJlbGEgcG9wdWxhY2FvX2ZhaXhhX2V0YXJpYSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChhcnJhbmdlKHBvcHVsYWNhb19mYWl4YV9ldGFyaWEsYW5vKSwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKICAKQWdvcmEgcmVzdGEgYXBlbmFzIGNvbWJpbmFyIGFzIHRhYmVsYXMgZGUgZmFpeGEgZXTDoXJpYS4KYGBge3IgY29tYmluYXIgYXMgdGFiZWxhcyBkZSBmYWl4YSBldGFyaWEgZG8gSU5GT1BFTiBlIGRvIFBOQUQgfQpwb3B1bGFjYW9faW5mb3Blbl9mYWl4YV9ldGFyaWEgPC0gYXMuZGF0YS5mcmFtZShsZWZ0X2pvaW4oaW5mb3Blbl9mYWl4YV9kZV9pZGFkZV80LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYWNhb19mYWl4YV9ldGFyaWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBqb2luX2J5KGFubywgZmFpeGFfZXRhcmlhKSkpICU+JSAKICBtdXRhdGUoZmFpeGFfZXRhcmlhID0gYXMuZmFjdG9yKGZhaXhhX2V0YXJpYSkpCgpgYGAKCgojIyBUYWJlbGEgUE5BREMgLSBJTkZPUEVOIHBvciBGYWl4YSBldMOhcmlhCgpgYGB7ciB2aXN1YWxpemFyIGEgdGFiZWxhIHBvcHVsYWNhb19pbmZvcGVuX2ZhaXhhX2V0YXJpYSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChhcnJhbmdlKHBvcHVsYWNhb19pbmZvcGVuX2ZhaXhhX2V0YXJpYSxhbm8pLDEwKSkgJT4lCiAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAoKIyBUYWJlbGEgSUJHRSBSZW5kaW1lbnRvcwoKIyMgUG9wdWxhw6fDo28gVG90YWwgY29tIDE0IEFub3Mgb3UgTWFpcy4KClByZWNpc28gZGVzc2EgdGFiZWxhIGNvbSBhIHBvcHVsYWNhbyBnZXJhbCBhY2ltYSBkZSAxNCBhbm9zLCBwb2lzIGEgdGFiZWxhIGNvbSByZW5kaW1lbnRvcyBkbyBJQkdFIGNvbnNpZGVyYSBhcGVuYXMgZXNzYSBmYWl4YSBkZSBpZGFkZS4gQSB0YWJlbGEgc29icmUgZWR1Y2HDp8OjbywgcXVlIGrDoSB1c2Ftb3MgY29uc2lkZXJhIGVzc2EgZmFpeGEgZGEgcG9wdWxhw6fDo28uCgpgYGB7ciBwb3B1bGFjYW9fdG90YWxfMTRfYW5vc19vdV9tYWlzLCBpbmNsdWRlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwb3B1bGFjYW9fdG90YWxfMTRfYW5vc19vdV9tYWlzIDwtIGFsZmFiZXRpemFjYW9fcG9wdWxhY2FvXzUgJT4lIAogIGdyb3VwX2J5KHJlZ2lhbyxVRiwgYW5vKSAlPiUgCiAgc3VtbWFyaXplKHBvcHVsYWNhbyA9IHN1bShwb3B1bGFjYW8pKQpgYGAKCiMjIyBUYWJlbGEgQ29tIGEgUG9wdWxhw6fDo28gVG90YWwgY29tIDE0IEFub3Mgb3UgTWFpcy4KYGBge3IgdmlzdWFsaXphw6fDo28gUG9wdWxhw6fDo28gdG90YWwgY29tIDE0IGFub3Mgb3UgbWFpcywgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGFjYW9fdG90YWxfMTRfYW5vc19vdV9tYWlzLDEwKSkgJT4lCiAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAoKIyMgRXhwbGljYcOnw6NvIGRvcyBEYWRvcwoKRXNzYSB0YWJlbGEgcG9zc3VpIGEgZGlzdHJpYnVpw6fDo28gZGUgcmVuZGltZW50b3MgZGEgcG9wdWxhw6fDo28gYnJhc2lsZWlyYS4KTyBwcsOzcHJpbyBJQkdFIGRpdnVsZ291IHVtIFtpbmZvcm1hdGl2b10oaHR0cHM6Ly9iaWJsaW90ZWNhLmliZ2UuZ292LmJyL3Zpc3VhbGl6YWNhby9saXZyb3MvbGl2MTAxNzA5X2luZm9ybWF0aXZvLnBkZikgc29icmUgYSBkaXN0cmlidWnDp8OjbyBkb3MgcmVuZGltZW50b3MgZGEgcG9wdWxhw6fDo28gYnJhc2lsZWlyYSBlbnRyZSAyMDEyIGUgMjAxOS4KCkV1IHZvdSB0cmFiYWxoYXIgYXBlbmFzIGNvbSB1bWEgZnJhw6fDo28gZG9zIGRhZG9zIGRpc3BvbsOtdmVpcyBuZXNzYSB0YWJlbGE6IG8gcmVuZGltZW50byBoYWJpdHVhbG1lbnRlIHJlY2ViaWRvLCBhIHByZWPMp29zIG1lzIFkaW8gZSBzb21lbnRlIHBhcmEgYXMgcGVzc29hcyBkZSAxNCBhbm9zIG91IG1haXMgZGUgaWRhZGUuCkRlIGFjb3JkbyBjb20gbyBJQkdFLCByZW5kaW1lbnRvIGhhYml0dWFsIHNlIGRlZmluZSBkYSBzZWd1aW50ZSBmb3JtYToKICAKIiBPIHJlbmRpbWVudG8gaGFiaXR1YWwgY29uc2lzdGUgbm8gcmVuZGltZW50byByZWNlYmlkbyBwb3IgZW1wcmVnYWRvcywgZW1wcmVnYWRvcmVzIGUgdHJhYmFsaGFkb3JlcyBwb3IgY29udGEgcHLDs3ByaWEsIG1lbnNhbG1lbnRlLCBzZW0gYWNyw6lzY2ltb3MgZXh0cmFvcmRpbsOhcmlvcyBvdSBkZXNjb250b3MgZXNwb3LDoWRpY29zLiBQYXJhIG8gZW1wcmVnYWRvLCBvIHJlbmRpbWVudG8gbWVuc2FsIGhhYml0dWFsbWVudGUgcmVjZWJpZG8gZXhjbHVpIHRvZGFzIGFzIHBhcmNlbGFzIHF1ZSBuw6NvIHRlbmhhbSBjYXLDoXRlciBjb250w61udW8gKGJvbmlmaWNhw6fDo28gYW51YWwsIHNhbMOhcmlvIGF0cmFzYWRvLCBob3JhcyBleHRyYXMsIHBhcnRpY2lwYcOnw6NvIGFudWFsIG5vcyBsdWNyb3MsIDEzbyBzYWzDoXJpbywgMTRvIHNhbMOhcmlvLCBhZGlhbnRhbWVudG8gZGUgc2Fsw6FyaW8sIGV0Yy4pIGUgbsOjbyBjb25zaWRlcmEgb3MgZGVzY29udG9zIG9jYXNpb25haXMgKGZhbHRhcywgcGFydGUgZG8gMTNvIHNhbMOhcmlvIGFudGVjaXBhZG8sIHByZWp1w616byBldmVudHVhbCBjYXVzYWRvIGFvIGVtcHJlZW5kaW1lbnRvIGV0Yy4pLgogIApDYXNvIG8gcmVuZGltZW50byByZWNlYmlkbyBkZSBlbXByZWdhZG8sIGRlIHRyYWJhbGhhZG9yIHBvciBjb250YSBwcsOzcHJpYSBlIGRlIGVtcHJlZ2Fkb3Igc2VqYSB2YXJpw6F2ZWwsIGNvbnNpZGVyYS1zZSBvIHJlbmRpbWVudG8gaGFiaXR1YWwgYXF1ZWxlIGVtIG3DqWRpYSByZWNlYmlkbyBwZWxhIHBlc3NvYSBubyBwZXLDrW9kbyBlbSBxdWUgcmVhbGl6YXZhIG8gdHJhYmFsaG8gZGVjbGFyYWRvIG5hIHNlbWFuYSBkZSByZWZlcsOqbmNpYS4gUXVhbmRvIGEgcmVtdW5lcmHDp8OjbyB2YXJpYSBlbSBmdW7Dp8OjbyBkbyBwZXLDrW9kbyBvdSBlc3Rhw6fDo28gZG8gYW5vLCBjb25zaWRlcmEtc2UgbyByZW5kaW1lbnRvIG1lbnNhbCBxdWUgYSBwZXNzb2EgZ2FuaGEgaGFiaXR1YWxtZW50ZSBuZXNzZSBwZXLDrW9kbyBzYXpvbmFsLiIgZm9udGU6IFtnbG9zc8OhcmlvXShodHRwOi8vZnRwLmliZ2UuZ292LmJyL1RyYWJhbGhvX2VfUmVuZGltZW50by9QZXNxdWlzYV9OYWNpb25hbF9wb3JfQW1vc3RyYV9kZV9Eb21pY2lsaW9zX2NvbnRpbnVhL01lbnNhbC9nbG9zc2FyaW9fcG5hZGNfbWVuc2FsLnBkZikKCiMjIEV4cGxvcmHDp8OjbyBkZSBEYWRvcwoKYGBge3IgUE5BRF9Db250aW51YV8yMDE5X1JlbmRpbWVudG9fZGVfVG9kYXNfYXNfRm9udGVzLCBpbmNsdWRlPUZBTFNFfQpjYW1pbmhvX2RvX2FycXVpdm9fcmVuZGltZW50b3MgPC0gIlBOQURjL1BOQURfQ29udGludWFfMjAxOV9SZW5kaW1lbnRvX2RlX1RvZGFzX2FzX0ZvbnRlcy54bHN4Igpmb2xoYV91c2FkYV9yZW5kaW1lbnRvcyA8LSAiUkRQQyAoVHJhYiBoYWIrT3V0cm9zIGVmZXRpdm8pIgoKcmVuZGltZW50b3MgPC0gcmVhZF9leGNlbChjYW1pbmhvX2RvX2FycXVpdm9fcmVuZGltZW50b3MsIHNoZWV0ID0gZm9saGFfdXNhZGFfcmVuZGltZW50b3MsIHNraXAgPSAxMikKCnJlbXVuZXJhY2FvX3BvcHVsYWNhbyA8LXJlbmRpbWVudG9zICU+JSAKICBmaWx0ZXIoYEFiZXJ0dXJhIGdlb2dyw6FmaWNhYCA9PSAiQnJhc2lsIiwKICAgICAgICAgVGlwbyA9PSAiVmFsb3IiLAogICAgICAgICBzdWIuY2xhc3NlICVpbiUgYygiYXTDqSA1JSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSA1JSBhdMOpIDEwJSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSAxMCUgYXTDqSAyMCUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgMjAlIGF0w6kgMzAlIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDMwJSBhdMOpIDQwJSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSA0MCUgYXTDqSA1MCUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgNTAlIGF0w6kgNjAlIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDYwJSBhdMOpIDcwJSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSA3MCUgYXTDqSA4MCUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgODAlIGF0w6kgOTAlIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDkwJSBhdMOpIDk1JSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSA5NSUgYXTDqSA5OSUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgOTklIGF0w6kgMTAwJSIJKSwKICAgICAgICAgaW5kID09ICJSZW5kaW1lbnRvIG3DqWRpbyBtZW5zYWwgcmVhbCBkYXMgcGVzc29hcyBkZSAxNCBhbm9zIG91IG1haXMgZGUgaWRhZGUsIGRlIHRvZG9zIG9zIHRyYWJhbGhvcywgYSBwcmXDp29zIG3DqWRpb3MgZG8gYW5vIikgJT4lIAogIHNlbGVjdChzdWIuY2xhc3NlLCAnMjAxNicsJzIwMTcnLCcyMDE4JywnMjAxOScpICU+JQogIG11dGF0ZShjbGFzc2UgPSBnc3ViKCJhdMOpIDUlIiwgIm1haXMgZGUgMCUgYXRlIDUlIiwgc3ViLmNsYXNzZSkpICU+JQogIHNlbGVjdCgtc3ViLmNsYXNzZSkgJT4lIAogIHVuaXF1ZSgpCgpgYGAKRXNzYSB0YWJlbGEgw6kgYmVtIHNpbXBsZXMuIE5hIGNvbHVuYSAnY2xhc3NlJywgdGVtb3MgYSBjbGFzc2UgcGVyY2VudHVhbCBkZSBwZXNzb2FzIHBvciByZW5kaW1lbnRvLCBlIG5hcyBkZW1haXMgY29sdW5hcyBvIHJlbmRpbWVudG8gaGFiaXR1YWwgZGVzc2EgY2xhc3NlIGRlIHBlc3NvYXMuCiAgClZvdSB1dGlsaXphciB1bWEgdGFiZWxhIGphIHByZXNlbnRlIG5vIHJlbGF0b3JpbyBkbyBJQkdFIHBhcmEgbWVsaG9yIGV4ZW1wbGlmaWNhciBhIHV0aWxpemFkYWRlIGRhIHRhYmVsYQoKIVtGb250ZTogSUJHRSwgRGlyZXRvcmlhIGRlIFBlc3F1aXNhcywgQ29vcmRlbmHDp8OjbyBkZSBUcmFiYWxobyBlIFJlbmRpbWVudG8sIFBlc3F1aXNhIE5hY2lvbmFsIHBvciBBbW9zdHJhIGRlIERvbWljw61saW9zIENvbnTDrW51YSAyMDEyLTIwMTkuPGJyPiZuYnNwOyZuYnNwO05vdGFzOjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsxLiBSZW5kaW1lbnRvIGhhYml0dWFsbWVudGUgcmVjZWJpZG8sIGEgcHJlw6dvcyBtw6lkaW9zIGRlIDIwMTkuPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzIuIFJlbmRpbWVudG8gY2FwdGFkbyBzb21lbnRlIHBhcmEgYXMgcGVzc29hcyBkZSAxNCBhbm9zIG91IG1haXMgZGUgaWRhZGUuXShodHRwczovL2kuaWJiLmNvLzVNajZMS2gvU2NyZWVuc2hvdC0yMDIzLTA2LTEwLWF0LTE5LTM5LTI2LnBuZykKTmEgcHJpbWVpcmEgbGluaGEgJzIwMTInLCBuYSBjb2x1bmEgJ01haXMgZGUgODAlIGF0w6kgOTAlJywgdGVtb3MgbyB2YWxvciAzIDM1MSwgcXVlIHJlcHJlc2VudGEgdW0gcmVuZGltZW50byBoYWJpdHVhbCBkZSBSJCAzLjM1MSwwMCBtZW5zYWwuIE91IHNlamEsIDkwJSBkb3MgYnJhc2lsZWlyb3MgcmVjZWJlbSBhdMOpIGVzc2UgdmFsb3IsIGFwZW5hcyAxMCUgcmVjZWJlbSBtYWlzIHF1ZSBpc3NvLgogIAojIyBNYW5pcHVsYW5kbyBvcyBEYWRvcwogIApQYXJhIHF1ZSBwb3NzYSB0ZXIgY29tbyBwYWRyb25pemFyIGFzIHRhYmVsYXMgZGUgcmVuZGltZW50byBkbyBQTkFEIGUgZG8gSU5GT1BFTiB2b3UgcHJlY2lzYXIgZGUgdW0gYWp1c3RlIGRlIGFjb3JkbyBjb20gbyBzYWzDoXJpbyBtw61uaW1vLiBQYXJhIGlzc28gdm91IGNyaWFyIHVtYSB0YWJlbGEgY29tIG9zIHZhbG9yZXMgZG8gYW5vcyAyMDE2IGEgMjAxOS4KCmBgYHtyIHNhbGFyaW9fbWluaW1vXzIwMTZfYV8yMDE5fQphbm8gPC0gYygyMDE5LCAyMDE4LCAyMDE3LCAyMDE2KQpzYWxhcmlvX21pbmltbyA8LSBjKDk5OC4wMCwgOTU0LjAwLCA5MzcuMDAsIDg4MC4wMCkKc2FsYXJpb19taW5pbW9fMjAxNl9hXzIwMTkgPC0gZGF0YS5mcmFtZShhbm8sIHNhbGFyaW9fbWluaW1vKQpgYGAKCgpgYGB7ciBjb21iaW5hciB2YWxvcmVzIGRlIHNhbGFyaW8gbWluaW1vIGNvbSByZW11bmVyYcOnw6NvLCBpbmNsdWRlPUZBTFNFfQpyZW11bmVyYWNhb19wb3B1bGFjYW9fMl9zYWxhcmlvX21pbmltbyA8LSBwaXZvdF9sb25nZXIocmVtdW5lcmFjYW9fcG9wdWxhY2FvLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IGMoIjIwMTYiLCAiMjAxNyIsICIyMDE4IiwgIjIwMTkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImFubyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAidmFsb3IiKSU+JQogIG11dGF0ZShhbm8gPSBhcy5udW1lcmljKGFubyksCiAgICBwb3JjZW50YWdlbV9wb3B1bGFjYW8gPSBhcy5udW1lcmljKGNhc2Vfd2hlbigKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDAlIGF0ZSA1JSIgfiAiNSIgLAogICAgY2xhc3NlID09Im1haXMgZGUgNSUgYXTDqSAxMCUiIH4gIjUiICwKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDEwJSBhdMOpIDIwJSIgfiAiMTAiICwKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDIwJSBhdMOpIDMwJSIgfiAiMTAiICwKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDMwJSBhdMOpIDQwJSIgfiAiMTAiICwKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDQwJSBhdMOpIDUwJSIgfiAiMTAiICwKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDUwJSBhdMOpIDYwJSIgfiAiMTAiICwKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDYwJSBhdMOpIDcwJSIgfiAiMTAiICwKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDcwJSBhdMOpIDgwJSIgfiAiMTAiICwKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDgwJSBhdMOpIDkwJSIgfiAiMTAiICwKICAgIGNsYXNzZSA9PSJtYWlzIGRlIDkwJSBhdMOpIDk1JSIgfiAiNSIgLAogICAgY2xhc3NlID09Im1haXMgZGUgOTUlIGF0w6kgOTklIiB+ICI0IiAsCiAgICBjbGFzc2UgPT0ibWFpcyBkZSA5OSUgYXTDqSAxMDAlIiB+ICIxIiAsCiAgKSkpICU+JSAKICBsZWZ0X2pvaW4oc2FsYXJpb19taW5pbW9fMjAxNl9hXzIwMTksIGJ5ID0gImFubyIpCgpgYGAKRXNzYSB0YWJlbGEgY29uc2lkZXJhIGFwZW5hcyBwZXJjZW50dWFsIGRlIHBlc3NvYXMgY29tIGFsZ3VtIHJlbmRpbWVudG8uIE8gSUJHRSBjb25zaWRlcmEgZGVzZW1wcmVnYWRvcyBwZXNzb2FzIHF1ZSBlc3TDo28gYSBwcm9jdXJhIGRlIHRyYWJhbGhvIG5vIHBlcmlvZG8gZGEgYW1vc3RyYS4gUG9yw6ltLCBuw6NvIGNvbnNpZGVyYSBwZXNzb2FzIHNlbSByZW5kaW1lbnRvcyBxdWUgbsOjbyBlc3RhdmFtIGEgcHJvY3VyYSBkZSBlbXByZWdvIGNvbW8gZGVzZW1wcmVnYWRhcy4gRXNzYSBwYXJjZWxhIGRlIHBlc3NvYXMgc2VtIHJlbmRpbWVudG9zIMOpIGEgcXVlIHZhbW9zIHRyYXRhciBhcXVpLgogIApQYXJhIGV4dHJhaXIgZXNzZXMgZGFkb3MsIHZvdSB1dGlsaXphciBhIG1lc21hIHRhYmVsYSBqw6EgdXNhZGEsIHF1ZSB0YW1iw6ltIHBvc3N1aSBlc3NhcyBpbmZvcm1hw6fDtWVzLgpBIHRhYmVsYSAnUE5BRF9Db250aW51YV8yMDE5X1JlbmRpbWVudG9fZGVfVG9kYXNfYXNfRm9udGVzJywgcG9zc3VpIGNvbW8gaW5kaWNhZG9yIG8gIlBlcmNlbnR1YWwgZGUgcGVzc29hcyBjb20gcmVuZGltZW50byIsIGxvZ28gdm91IGV4dHJhaXIgJzEwMCUnIGRlc3NlIHZhbG9yIGUgb2JldGVyIG8gcGVyY2VudHVhbCBkZSBwZXNzb2FzIHNlbSByZW5kaW1lbnRvcy4KCmBgYHtyIGRpY2lvbmFyIG8gbnVtZXJvIGRlIHNlbV9yZW5kaW1lbnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGVyY2VudHVhbF9lbXByZWdhZG9zIDwtcmVuZGltZW50b3MgJT4lIAogIGZpbHRlcihgQWJlcnR1cmEgZ2VvZ3LDoWZpY2FgID09ICJCcmFzaWwiLAogICAgICAgICBUaXBvID09ICJWYWxvciIsCiAgICAgICAgIHN1Yi5jbGFzc2UgJWluJSBjKCJUb2RhcyBhcyBmb250ZXPCuSIJKSwKICAgICAgICAgaW5kID09ICJQZXJjZW50dWFsIGRlIHBlc3NvYXMgY29tIHJlbmRpbWVudG8sIG5hIHBvcHVsYcOnw6NvIHJlc2lkZW50ZSIpICU+JSAKICBzZWxlY3Qoc3ViLmNsYXNzZSwgJzIwMTYnLCcyMDE3JywnMjAxOCcsJzIwMTknKSAlPiUgCiAgdW5pcXVlKCkKCnBlcmNlbnR1YWxfZW1wcmVnYWRvc18yX2Zvcm1hdG9fbG9uZ28gPC0gcGl2b3RfbG9uZ2VyKHBlcmNlbnR1YWxfZW1wcmVnYWRvcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzID0gYygiMjAxNiIsICIyMDE3IiwgIjIwMTgiLCAiMjAxOSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImFubyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInZhbG9yIikKCnBlcmNlbnR1YWxfc2VtX3JlbmRpbWVudG9zIDwtIHBlcmNlbnR1YWxfZW1wcmVnYWRvc18yX2Zvcm1hdG9fbG9uZ28gJT4lIAogIG11dGF0ZShzdWIuY2xhc3NlID0gKDEwMCAtIHZhbG9yKSwKICAgICAgICAgdmFsb3IgPSAwLAogICAgICAgICByZW11bmVyYWNhbyA9ICJOw6NvIHJlY2ViZSIsCiAgICAgICAgIGFubyA9IGFzLmZhY3Rvcihhbm8pKQoKc2VtX3JlbmRpbWVudG9zIDwtIGxlZnRfam9pbihwZXJjZW50dWFsX3NlbV9yZW5kaW1lbnRvcywgcG9wdWxhY2FvX3RvdGFsXzE0X2Fub3Nfb3VfbWFpcywgYnkgPSBqb2luX2J5KGFubykpICU+JSAKICBtdXRhdGUocG9wdWxhY2FvID0gKHN1Yi5jbGFzc2UqcG9wdWxhY2FvKS8xMDAsKSAlPiUgCiAgZ3JvdXBfYnkoYW5vLCByZW11bmVyYWNhbykgJT4lIAogIHN1bW1hcmlzZShwb3B1bGFjYW8gPSBzdW0ocG9wdWxhY2FvKSkgJT4lIAogIHNlbGVjdChhbm8sIHJlbXVuZXJhY2FvLCBwb3B1bGFjYW8pCgpgYGAKCkFudGVzIGRlIGNvbWJpbmFyIGFzIHRhYmVsYXMsIHByZWNpc28gYWluZGEgcGFkcm9uaXphciBhcyB2YXJpYXZlaXMuCmBgYHtyIHBhZHJvbml6YXIgdmFyacOhdmVpcyBkZSByZW5kaW1lbnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCiMgQ3JpYW5kbyBhIG5vdmEgY29sdW5hIGNvbSBhcyBjYXRlZ29yaWFzCnJlbXVuZXJhY2FvX3BvcHVsYWNhb18zIDwtIHJlbXVuZXJhY2FvX3BvcHVsYWNhb18yX3NhbGFyaW9fbWluaW1vICU+JQogIG11dGF0ZShyZW11bmVyYWNhbyA9IGNhc2Vfd2hlbigKICAgIHZhbG9yID49IHNhbGFyaW9fbWluaW1vICYgdmFsb3IgPCAyICogc2FsYXJpb19taW5pbW8gfiAiRW50cmUgMSBlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMiLAogICAgdmFsb3IgPj0gMy80ICogc2FsYXJpb19taW5pbW8gJiB2YWxvciA8IHNhbGFyaW9fbWluaW1vIH4gIkVudHJlIDMvNCBlIDEgc2Fsw6FyaW8gbcOtbmltbyBtZW5zYWwiLAogICAgdmFsb3IgPj0gMiAqIHNhbGFyaW9fbWluaW1vIH4gIk1haXMgcXVlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMiLAogICAgdmFsb3IgPiAwICYgdmFsb3I8IDMvNCAqIHNhbGFyaW9fbWluaW1vIH4gIk1lbm9zIGRvIHF1ZSAzLzQgZG8gc2Fsw6FyaW8gbcOtbmltbyBtZW5zYWwiCiAgKSkgJT4lIAogIHNlbGVjdChjbGFzc2UsIGFubywgcG9yY2VudGFnZW1fcG9wdWxhY2FvLCByZW11bmVyYWNhbykKCgpyZW11bmVyYWNhb19wb3B1bGFjYW9fNCA8LW1lcmdlKHJlbXVuZXJhY2FvX3BvcHVsYWNhb18zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGFjYW9fdG90YWxfMTRfYW5vc19vdV9tYWlzLCBieSA9ICJhbm8iKSAlPiUgCiAgbXV0YXRlKHBvcHVsYWNhb19yZW11bmVyYWRhID0gKHBvcHVsYWNhbyAqIHBvcmNlbnRhZ2VtX3BvcHVsYWNhbykvMTAwKSAlPiUgCiAgc2VsZWN0KGFubywgcmVtdW5lcmFjYW8sIHBvcHVsYWNhb19yZW11bmVyYWRhKSAlPiUgCiAgcmVuYW1lKHBvcHVsYWNhbyA9IHBvcHVsYWNhb19yZW11bmVyYWRhKQoKcmVtdW5lcmFjYW9fcG9wdWxhY2FvXzUgPC0gcmVtdW5lcmFjYW9fcG9wdWxhY2FvXzQgJT4lIAogIGdyb3VwX2J5KGFubywgcmVtdW5lcmFjYW8pICU+JSAKICBzdW1tYXJpc2UocG9wdWxhY2FvID0gc3VtKHBvcHVsYWNhbykpICU+JSAKICBtdXRhdGUoIGFubyA9IGFzLmZhY3Rvcihhbm8pKQpgYGAKCmBgYHtyIGRlZmluaW5kbyBvcmRlbSBjb3JyZXRhIGRlIHJlbmRpbWVudG9zfQojIERlZmluaXIgYSBvcmRlbSBjb3JyZXRhIGRlIHJlbmRpbWVudG9zCm9yZGVtX2NvcnJldGFfcmVuZGltZW50b3MgPC0gYygiTsOjbyByZWNlYmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lbm9zIGRvIHF1ZSAzLzQgZG8gc2Fsw6FyaW8gbcOtbmltbyBtZW5zYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudHJlIDMvNCBlIDEgc2Fsw6FyaW8gbcOtbmltbyBtZW5zYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRyZSAxIGUgMiBzYWzDoXJpb3MgbcOtbmltb3MgbWVuc2FpcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFpcyBxdWUgMiBzYWzDoXJpb3MgbcOtbmltb3MgbWVuc2FpcyIpCgpyZW11bmVyYWNhb19wb3B1bGFjYW9fNiA8LSByYmluZChyZW11bmVyYWNhb19wb3B1bGFjYW9fNSwgc2VtX3JlbmRpbWVudG9zKSU+JSAKICBtdXRhdGUocmVtdW5lcmFjYW8gPSBhcy5mYWN0b3IocmVtdW5lcmFjYW8pLAogICAgICAgICByZW11bmVyYWNhbyA9IGZhY3RvcihyZW11bmVyYWNhbywgbGV2ZWxzID0gb3JkZW1fY29ycmV0YV9yZW5kaW1lbnRvcykpCgpgYGAKClBvciBmaW0gdW1hIHZpc8OjbyBzb2JyZSBhIGRpc3RyaWJ1acOnw6NvIGRlIHJlbmRpbWVudG9zIG5vIHBhaXM6CgojIyBEaXN0cmlidWnDp8OjbyBwb3B1bGHDp8OjbyBjb20gZSBzZW0gcmVuZGltZW50b3MgCgpgYGB7ciB2aXN1YWxpemHDp8OjbyBwb3B1bGHDp8OjbyBjb20gZSBzZW0gcmVuZGltZW50b3MsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoYXJyYW5nZShyZW11bmVyYWNhb19wb3B1bGFjYW9fNixyZW11bmVyYWNhbyksMTApKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgpBbnRlcyBkZSBjb21iaW5hciBvcyBkYXRhZnJhbWVzLCBvYnNlcnZlaSBxdWUgYSB0YWJlbGEgZG8gSW5mb3BlbiBuw6NvIHBvc3N1aSBkYWRvcyBzb2JyZSByZW11bmVyYcOnw6NvIGRvcyBwcmVzb3MgZW0gMjAxNyBwYXJhIG8gZXN0YWRvIGRlIFNhbyBQYXVsby4gdm91IHVzYXIgaW50ZXJwb2xhw6fDo28gbGluZWFyIFtAbGFyc29uMTk4OHJlZmxleGl2aXR5XSBwYXJhIHByZXZlciBlc3NlcyBkYWRvcy4KCmBgYHtyIHJlbXVuZXJhw6fDo28gZGUgcHJlc29zIGVtIFNQIDIwMTd9CiMgU3ViY29uanVudG8gZG9zIGRhZG9zIHBhcmEgbyBlc3RhZG8gZGUgU8OjbyBQYXVsbwppbmZvcGVuX3NwIDwtIGluZm9wZW5fcmVtdW5lcmFjYW9fM19maW5hbFtpbmZvcGVuX3JlbXVuZXJhY2FvXzNfZmluYWwkVUYgPT0gJ1NQJywgXQpgYGAKICAKRnVuw6fDo28gcGFyYSBwcmV2ZXIgb3MgZGFkb3MgYXVzZW50ZXMgc29icmUgYSByZW11bmVyYcOnw6NvIGRlIHByZXNvcyBlbSBTUCBlbSAyMDE3CmBgYHtyIEZ1bsOnw6NvIHBhcmEgcHJldmVyIHZhbG9yZXMgYXVzZW50ZXMgc29icmUgYSByZW11bmVyYWNhbyBkZSBwcmVzb3MgZW0gU1B9CnByZWRpY3RfbmEgPC0gZnVuY3Rpb24oYW5vLCBwcmVzb3MpIHsKICBjb21wbGV0ZV9jYXNlcyA8LSAhaXMubmEocHJlc29zKQogIGFwcHJveCh4ID0gYXMubnVtZXJpYyhhbm9bY29tcGxldGVfY2FzZXNdKSwgCiAgICAgICAgIHkgPSBwcmVzb3NbY29tcGxldGVfY2FzZXNdLCAKICAgICAgICAgeG91dCA9IGFzLm51bWVyaWMoYW5vKSkkeQp9CmBgYAogIApBcGxpY2FyIGEgZnVuw6fDo28gcGFyYSBjYWRhIGNvbWJpbmHDp8OjbyBkZSBnw6puZXJvIGUgcmVtdW5lcmHDp8OjbwpgYGB7ciBBcGxpY2FyIGEgZnVuw6fDo28gcGFyYSBjYWRhIGNvbWJpbmHDp8OjbyBkZSBnw6puZXJvIGUgcmVtdW5lcmHDp8Ojb30KaW5mb3Blbl9zcCA8LSBpbmZvcGVuX3NwICU+JSAKICBncm91cF9ieShyZW11bmVyYWNhbykgJT4lIAogIG11dGF0ZShwcmVzb3MgPSByb3VuZChwcmVkaWN0X25hKGFubywgcHJlc29zKSkpICU+JSAKICB1bmdyb3VwKCkKYGBgCgpTdWJzdGl0dWlyIG9zIGRhZG9zIG9yaWdpbmFpcyBwYXJhIFPDo28gUGF1bG8gY29tIG9zIG5vdm9zIGRhZG9zIHByZWVuY2hpZG9zCmBgYHtyIGRhZG9zIHByZWVuY2hpZG9zfQppbmZvcGVuX3JlbXVuZXJhY2FvXzNfZmluYWxbaW5mb3Blbl9yZW11bmVyYWNhb18zX2ZpbmFsJFVGID09ICdTUCcsIF0gPC0gaW5mb3Blbl9zcAoKYGBgCiAgCkZpbmFsbWVudGUgYSB0YWJlbGEgZmluYWwgYSBxdWFudGlkYWRlIGVzdGltYWRhIGRlIHByZXNvcyBwb3IgcmVtdW5lcmHDp8OjbwpgYGB7ciB0YWJlbGEgZmluYWwgaW5mb3Blbl9yZW11bmVyYcOnw6NvfQppbmZvcGVuX3JlbXVuZXJhY2FvXzQgPC0gaW5mb3Blbl9yZW11bmVyYWNhb18zX2ZpbmFsICU+JSAKICBncm91cF9ieShhbm8sIHJlbXVuZXJhY2FvKSAlPiUgCiAgbXV0YXRlKGFubyA9IGFzLmZhY3Rvcihhbm8pKSAlPiUgCiAgc3VtbWFyaXNlKHByZXNvcyA9IHN1bShwcmVzb3MpKQpgYGAKCkFww7NzIHRvZGFzIGFzIG1hbmlwdWxhw6fDtWVzLCBwb3NzbyBmaW5hbG1lbnRlIGNvbWJpbmFyIGFzIHRhYmVsYXMuCgpgYGB7ciBwb3B1bGFjYW9faW5mb3Blbl9yZW5kaW1lbnRvcywgaW5jbHVkZT1GQUxTRX0KcG9wdWxhY2FvX2luZm9wZW5fcmVuZGltZW50b3MgPC0gYXMuZGF0YS5mcmFtZShsZWZ0X2pvaW4oaW5mb3Blbl9yZW11bmVyYWNhb180LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtdW5lcmFjYW9fcG9wdWxhY2FvXzYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGpvaW5fYnkoYW5vLCByZW11bmVyYWNhbykpKSAlPiUgCiAgbXV0YXRlKHJlbXVuZXJhY2FvID0gYXMuZmFjdG9yKHJlbXVuZXJhY2FvKSwKICAgICAgICAgcmVtdW5lcmFjYW8gPSBmYWN0b3IocmVtdW5lcmFjYW8sIGxldmVscyA9IG9yZGVtX2NvcnJldGFfcmVuZGltZW50b3MpLAogICAgICAgICBhbm8gPSBhcy5mYWN0b3IoYW5vKSkKCmBgYAoKIyMgVGFiZWxhIFBOQURDIC0gSU5GT1BFTiBSZW5kaW1lbnRvcwoKYGBge3IgdmlzdWFsaXphw6fDo28gcG9wdWxhY2FvX2luZm9wZW5fcmVuZGltZW50b3MsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG9wdWxhY2FvX2luZm9wZW5fcmVuZGltZW50b3MsMTApKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgoKCiMgQXByZXNlbnRhw6fDo28gZG9zIERhZG9zIENvbGV0YWRvcyBlIE1hbmlwdWxhZG9zOiB7LnRhYnNldCAudGFic2V0LWZhZGV9CgojIyBUYWJlbGEgUE5BRCAtIElORk9QRU4gVG90YWwKCmBgYHtyIHZpc3VhbGl6YcOnw6NvIGZpbmFsIHBvcHVsYWNhb19pbmZvcGVuX3RvdGFsICwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGFjYW9faW5mb3Blbl90b3RhbCwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKICAKIyMgVGFiZWxhIFBOQURDIC0gSU5GT1BFTiBHcmF1IGRlIEluc3RydcOnw6NvCmBgYHtyIHZpc3VhbGl6YcOnw6NvIGZpbmFsIHBvcHVsYWNhb19pbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvICwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGFjYW9faW5mb3Blbl9ncmF1X2RlX2luc3RydWNhbywxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKICAKIyMgVGFiZWxhIFBOQURDIC0gSU5GT1BFTiBFdG5pYQpgYGB7ciB2aXN1YWxpemHDp8OjbyBmaW5hbCB0YWJlbGEgcG9wdWxhY2FvX2luZm9wZW5fZXRuaWEsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG9wdWxhY2FvX2luZm9wZW5fZXRuaWEsMTApKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCiAgCiMjIFRhYmVsYSBQTkFEQyAtIElORk9QRU4gRmFpeGEgZXTDoXJpYQpgYGB7ciB2aXN1YWxpemHDp8OjbyBmaW5hbCB0YWJlbGEgcG9wdWxhY2FvX2luZm9wZW5fZmFpeGFfZXRhcmlhLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGFycmFuZ2UocG9wdWxhY2FvX2luZm9wZW5fZmFpeGFfZXRhcmlhLGFubyksMTApKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCiAgCiMjIFRhYmVsYSBQTkFEQyAtIElORk9QRU4gUmVuZGltZW50b3MKYGBge3IgdmlzdWFsaXphw6fDo28gZmluYWwgcG9wdWxhY2FvX2luZm9wZW5fcmVuZGltZW50b3MsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG9wdWxhY2FvX2luZm9wZW5fZ3JhdV9kZV9pbnN0cnVjYW8sMTApKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgojIEFuw6FsaXNlcyBlIENvcnJlbGHDp8O1ZXMuCgpBIE1haW9yIHBhcmRlIGRhIHByb3Bvc3RhIGRvIHByb2pldG8gasOhIGZvaSBwYXNzYWRhLiBEZXNzZSBwb250byBlbSBkaWFudGUsIGZvY28gbWFpcyBlbSBwcmVzZW50YXIgYWxndW1hcyBjb3JyZWxhw6fDtWVzIGVuY29udHJhZGFzIG5hcyB0YWJlbGFzIHF1ZSBtb250YW1vcyBlIGFwcmVzZW50YW1vcyB1bSBwb3VjbyBhY2ltYS4gCiAgCgpWb3UgY29tZcOnYXIgY3JpYW5kbyB1bWEgY29sdW5hIHF1ZSByZWxhY2lvbmEgYSBxdWFudGlkYWRlIGRlIHByZXNvcyBhbyB0b3RhbCBkYSBwb3B1bGHDp8OjbywgZSBsb2dvIGFww7NzIHBsb3RhciBhbGd1bnMgZ3JhZmljb3MgcXVlIGlsdXN0cmFtIGEgY29ycmVsYcOnw6NvIGVudHJlIGNhZGEgdmFyacOhdmVsCgojIyBkYXRhZnJhbWUgZXRuaWEKCkEgdmFyaWHDp8OjbyBkbyBwZXJjZW50dWFsIGRlIHByZXNvcyBwZWxhIHBvcHVsYWNhbyBlbSByZWxhw6fDo28gYSBldG5pYSwgbm9zIG1vc3RyYSBxdWUgZW0gcHJhdGljYW1lbnRlIHRvZG9zIG9zIGVzdGFkb3MgaMOhIHVtYSBpbmNpZGVuY2lhIG1haW9yIGRlIHByZXNvcyBwYXJkb3MgZSBwcmV0b3MgZW0gcmVsYcOnw6NvIMOgIHBvcHVsYcOnw6NvLiBJc3NvIG7Do28gaW5kaWNhIGNhdXNhbGlkYWRlLCB1bWEgdmV6IHF1ZSBow6Egb3V0cm9zIGZhdG9yZXMgcXVlIHBvZGVtIGluZmx1ZW5jaWFyIG8gaW5kaXbDrWR1byBhIGNvbWV0ZXIgYWxndW0gY3JpbWUgZSBhY2FiYXIgYXRyYXMgZGFzIGdyYWRlcy4gUG9yw6ltIMOpIHVtIGZhdG8gcXVlIHByZWNpc2Egc2VyIGludmVzdGlnYWRvIG1haXMgYSBmdW5kby4gU2VyaWEgaWRlYWwgc2UgaG91dmVzc2UgdW1hIGZvcm1hIGRlIGF2YWxpYXIgbWFpcyB2YXJpw6F2ZWlzIGNvbW8gcG9zc8OtdmVsIHJhY2lzbW8gcG9yIHBhcnRlIGRvIHBvZGVyIGp1ZGljacOhcmlvLCBvdSBhdMOpIG1lc21vIGVkdWNhw6fDo28gZSByZW5kYSwgY29tbyBlc3RhbW9zIGZhemVuZG8gYXF1aS4gTm9zIHByw7N4aW1vcyBncsOhZmljb3MsIGFwcmVzZW50byBhbGd1bWFzIGNvcnJlbGHDp8O1ZXMgZW50cmUgZXNzYXMgdmFyacOhdmVpcy4KYGBge3IgcGxvdCBkb3MgZ3JhZmljb3MgZGUgZXRuaWEgcG9yIGVzdGFkbywgZWNobz1GQUxTRX0KZ2dwbG90KHBvcHVsYWNhb19pbmZvcGVuX2V0bmlhLCBhZXMoeD1hbm8sIHk9KHByZXNvcy9wb3B1bGFjYW8pLCBjb2xvcj1ldG5pYSkpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh+VUYsIHNjYWxlcyA9ICJmcmVlX3kiLCAgbmNvbCA9IDUpICsgCiAgbGFicyh4PSJBbm8iLCB5PSJWYWxvciIsIGNvbG91cj0iRXRuaWEiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCgojIyBkYXRhZnJhbWUgZmFpeGFfZXRhcmlhCgpBcXVpIHBvZGVtb3Mgb2JzZXJ2YXIgdW1hIGRpbWludWljw6NvIG5vIMOtbmRpY2UgZGUgcHJlc29zIG5hIGZhaXhhIGV0w6FyaWEgZGUgMTggYSAyNCBhbm9zIG5vIGRlY29ycmVyIGRvIHRlbXBvLiBJc3NvIHBvZGUgc2UgZGFyIHBvciBkaXZlcnNhcyByYXrDtWVzLCBkZW50cmUgZWxhcyBvIGVudmVsaGVjaW1lbnRvIGRhIHBvcHVsYcOnw6NvY2FyY2Vyw6FyaWEuIFBvcsOpbSwgc2UgcGVnYXJtb3MgdG9kYXMgYXMgb3V0cmFzIGZhaXhhcy1ldMOhcmlhcywgdGVtb3MgdW0gYXVtZW50byBjb25zaWRlcsOhdmVsIG5vIG7Dum1lcm8gZGUgcHJlc29zIG5vIHF1ZSBjaGFtYW1vcyAiaWRhZGUgYXRpdmEiLCBxdWUgY29tcHJlZW5kZSBhIHBvcHVsYcOnw6NvIGF0w6kgNjEgYW5vcyBkZSBpZGFkZS4gw4kgcmVhbG1lbnRlIGZydXN0cmFudGUgcGVyY2ViZXIgcXVlIG9zIG5vc3NvcyAiQmlsbCBHYXRlcyIsICJadWNrZXJiZXJncyIsIGUgIkVsb24gTXVza3MiIGVzdMOjbyBhdHLDoXMgZGFzIGdyYWRlcy4gQSBwb3B1bGHDp8OjbyBxdWUgZGV2ZXJpYSBlc3RhciBuYSBmYWN1bGFkZSwgZXN0w6EgcHJlc2EsIHBvciBpbsO6bWVyb3MgZmF0b3JlcywgZGVudHJlIG9zIHF1YWlzIGEgcG91Y2EgaWRhZGUsIGp1bnRvIGNvbSBhIGJhaXhhIGVzY29sYXJpZGFkZSBlIGEgZmFsdGEgZGUgZ3JhbmEuIFJlYWxtZW50ZSBzZXJpYSB1bSBzb25obyBuw6NvIHRlciB0YW50b3Mgam92ZW5zIHByZXNvcy4KYGBge3IgZ2dwbG90IHBvcHVsYWNhb19pbmZvcGVuX2ZhaXhhX2V0YXJpYSwgZWNobz1GQUxTRX0KCmdncGxvdChwb3B1bGFjYW9faW5mb3Blbl9mYWl4YV9ldGFyaWEsIGFlcyh4PWFubywgeT0ocHJlc29zL3BvcHVsYWNhbyksIGNvbG9yPWZhaXhhX2V0YXJpYSkpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh+ZmFpeGFfZXRhcmlhLCBzY2FsZXMgPSAiZnJlZV95IiwgIG5jb2wgPSAyKSArIAogIGxhYnMoeD0iQW5vIiwgeT0iVmFsb3IiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCgojIyBkYXRhZnJhbWUgZ3JhdSBkZSBpbnN0cnXDp8OjbyAKCkVzc2EgdGFiZWxhIG1vc3RyYSBhIGRpc3RyaWJ1acOnw6NvIGRlIHByZXNvcyBwb3IgZ3JhdSBkZSBpbnN0cnXDp8Ojby4gQ2xhcmFtZW50ZSBhIGNoYXZlIHZpcmEgbm8gZW5zaW5vIG3DqWRpbyBpbmNvbXBsZXRvLCB1bWEgdmV6IHF1ZSBhIHBhcnRpciBkYcOtLCBvIHBlcmNlbnR1YWwgZGUgcHJlc29zIHNvYnJlIGEgcG9wdWxhw6fDo28gY2FpIGRyw6FzdGljYW1lbnRlLiBKw6EgbsOjbyDDqSBtaXN0w6lyaW8gYWxndW0gcXVlIHVtYSBwb3B1bGHDp8OjbyBjb20gYmFpeGEgZWR1Y2HDp8OjbyBub3JtYWxtZW50ZSB0ZW0gY29tbyByZXNwb3N0YSB1bSBncmF1IGVsZXZhZG8gZGUgdmlvbMOqbmNpYSwgcGVndWUgcGHDrXNlcyBjb21vIG5vcnXDqWdhLCBob2xhbmRhIGUgamFww6NvIHBvciBleGVtcGxvIG9uZGUgaMOhIHBvdXF1w61zc2ltb3MgcHJlc29zLCBlIGNvbXBhcmUgbyBuw612ZWwgZGUgYWNlc3NvIGFvIEVuc2lubyBTdXBlcmlvciBjb20gbyBkbyBCcmFzaWwuIAoKYGBge3IgZ2dwbG90IHBvcHVsYWNhb19pbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoZGF0YSA9IHBvcHVsYWNhb19pbmZvcGVuX2dyYXVfZGVfaW5zdHJ1Y2FvLCBhZXMoeCA9IGdyYXVfZGVfaW5zdHJ1Y2FvLCB5ID0gKHByZXNvcy9wb3B1bGFjYW8pLGZpbGwgPSBncmF1X2RlX2luc3RydWNhbykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGxhYnMoeCA9ICJHcmF1IGRlIEluc3RydcOnw6NvIiwgeSA9ICJQcm9wb3LDp8OjbyBkZSBQcmVzb3MvUG9wdWxhw6fDo28iLCBmaWxsID0gIkdyYXUgZGUgSW5zdHJ1w6fDo28iKSArCiAgZmFjZXRfd3JhcCh+VUYsIHNjYWxlcyA9ICJmcmVlX3kiLCAgbmNvbCA9IDUpKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyBkYXRhZnJhbWUgcmVuZGltZW50b3MKCkFxdWkgcG9kZW1vcyBvYnNlcnZhZXIgcXVlIGEgbWFpb3IgcGFydGUgZGEgcG9wdWxhw6fDo28gY2FyY2Vyw6FyaWEgc8OjbyBwZXNzb2FzIHF1ZSByZWNlYmVtIGF0w6kgMSBzYWzDoXJpbyBtw61uaW1vIG1lbnNhbC4gRXNzZSB2YWxvciBlbnRyZSAzLzQgZSAxIHNhbMOhcmlvIG3DrW5pbW8gbWVuc2FsIGluY2x1aSBkaXZlcnNhcyBwZXNzb2FzIHF1ZSByZWNlYmVtIGF1eMOtbGlvcyBnb3Zlcm5hbWVudGFpcyBjb21vIG8gIkJvbHNhIEZhbcOtbGlhIiBvdSBvdXRyb3MuIEVsYXMgbsOjbyBwb2RlbSBzZXIsIGRlIGFjb3JkbyBjb20gbyBJQkdFIGNsYXNzaWZpY2FkYXMgY29tbyBzZW0gcmVuZGEgb3UgZGVzZW1wcmVnYWRhcy4KCk8gRGVwYXJ0YW1lbnRvIEludGVyc2luZGljYWwgZGUgRXN0YXRwaXN0aWNhIGUgRXN0dWRvcyBTb2Npb2Vjb27DtG1pY29zIChEaWVlc2UpLCBkaXZ1bGdhIG1lbnNhbG1lbnRlIG8gdmFsb3IgZG8gY3VzdG8gZGEgQ2VzdGEgQsOhc2ljYSBkZSBBbGltZW50b3MgcXVlIHNlcmlhIGRlIGFjb3JkbyBjb20gbyDDsnJnw6NvLCAic3VmaWNpZW50ZSBwYXJhIG8gc3VzdGVudG8gZSBiZW0gZXN0YXIgZGUgdW0gdHJhYmFsaGFkb3IgZW0gaWRhZGUgYWR1bHRhLCBjb250ZW5kbyBxdWFudGlkYWRlcyBiYWxhbmNlYWRhcyBkZSBwcm90ZcOtbmFzLCBjYWxvcmlhcywgZmVycm8gY8OhbGNpbyBlIGbDs3Nmb3JvLltATWV0b2RvbG9naWFdIi4gRW0gMjAxOSwgbyB2YWxvciBtw6lkaW8gZGEgY2VzdGEtYsOhc2ljYSBuYWNpb25hbCBlcmEgZGUgUlwkIDQyMiwxOSwgbyBxdWUgcmVwcmVzZW50YSBxdWFzZSBtZXRhZGUgbyBzYWzDoXJpbyBtw61uaW1vIGRhIMOpcG9jYSAoUlwkIDk5OCwwMCkuCgpgYGB7ciBnZ3Bsb3QgcG9wdWxhY2FvX2luZm9wZW5fcmVuZGltZW50b3MsIGVjaG89RkFMU0UgfQoKZ2dwbG90KHBvcHVsYWNhb19pbmZvcGVuX3JlbmRpbWVudG9zLCBhZXMoeD1hbm8sIHk9KHByZXNvcy9wb3B1bGFjYW8pLCBmaWxsPXJlbXVuZXJhY2FvKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZSA9ICJOw7ptZXJvIGRlIHByZXNvcyBwb3IgYW5vIGUgcmVtdW5lcmHDp8OjbyIsCiAgICAgICB4ID0gIkFubyIsCiAgICAgICB5ID0gIk7Dum1lcm8gZGUgUHJlc29zIiwKICAgICAgIGZpbGwgPSAiUmVtdW5lcmHDp8OjbyIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQoKYGBgCgojIyMgU2FsYcyBcmlvIE1pzIFuaW1vIE5lY2Vzc2HMgXJpbwoKQSBDb25zdGl0dWnDp8OjbyBkbyBCcmFzaWwsIGRlIG91dHVicm8gZGUgMTk4OCwgZXN0aXB1bGEgcXVlIG8gc2Fsw6FyaW8gbcOtbmltbyBkZXZlIHNlciB1bSB2YWxvciBlc3RhYmVsZWNpZG8gZW0gbGVpIGUgdW5pZm9ybWUgZW0gdG9kbyBvIHBhw61zLiBFc3RlIHZhbG9yIGRldmUgc2VyIHN1ZmljaWVudGUgcGFyYSBjb2JyaXIgYXMgbmVjZXNzaWRhZGVzIGLDoXNpY2FzIGRlIHVtIHRyYWJhbGhhZG9yIGUgZGUgc3VhIGZhbcOtbGlhLCBpbmNsdWluZG8gZGVzcGVzYXMgY29tIG1vcmFkaWEsIGFsaW1lbnRhw6fDo28sIGVkdWNhw6fDo28sIHNhw7pkZSwgbGF6ZXIsIHJvdXBhcywgaGlnaWVuZSwgdHJhbnNwb3J0ZSBlIHByZXZpZMOqbmNpYSBzb2NpYWwuIEFsw6ltIGRpc3NvLCBhIENvbnN0aXR1acOnw6NvIHByZXbDqiBxdWUgZXNzZSBzYWzDoXJpbyBtw61uaW1vIGRldmUgdGVyIHJlYWp1c3RlcyBwZXJpw7NkaWNvcyBwYXJhIGdhcmFudGlyIHNldSBwb2RlciBkZSBjb21wcmEgKEFydC4gN8K6LCBJViBkYSBDb25zdGl0dWnDp8OjbyBGZWRlcmFsIGRvIEJyYXNpbCkuCgpPIERJRUVTRSwgYW8gY2FsY3VsYXIgbyBTYWzDoXJpbyBNw61uaW1vIE5lY2Vzc8OhcmlvLCBsZXZhIGVtIGNvbnNpZGVyYcOnw6NvIGVzdGFzIGRpc3Bvc2nDp8O1ZXMgY29uc3RpdHVjaW9uYWlzLiBFbGVzIHNlIGJhc2VpYW0gbm8gRGVjcmV0byBMZWkgbsK6IDM5OSwgcXVlIGRldGVybWluYSBxdWUgb3MgZ2FzdG9zIGNvbSBhbGltZW50YcOnw6NvIGRlIHVtIHRyYWJhbGhhZG9yIGFkdWx0byBuw6NvIGRldmVtIHNlciBtZW5vcmVzIHF1ZSBvIGN1c3RvIGRhIENlc3RhIELDoXNpY2EgZGUgQWxpbWVudG9zLgoKUGFyYSBlc3NlcyBjw6FsY3Vsb3MsIG8gRElFRVNFIGNvbnNpZGVyYSB1bSBtb2RlbG8gZGUgZmFtw61saWEgY29tcG9zdG8gcG9yIDIgYWR1bHRvcyBlIDIgY3JpYW7Dp2FzLCBvbmRlIHNlIHN1cMO1ZSBxdWUgbyBjb25zdW1vIGRlc3RhcyBjcmlhbsOnYXMgw6kgZXF1aXZhbGVudGUgYW8gZGUgdW0gYWR1bHRvLgoKTyBtw6l0b2RvIHVzYWRvIHBhcmEgY2FsY3VsYXIgbyBnYXN0byBhbGltZW50YXIgZGUgdW1hIGZhbcOtbGlhIGNvbWXDp2EgY29tIG8gY3VzdG8gZGEgQ2VzdGEgQsOhc2ljYSBkZSBBbGltZW50b3MgbWFpcyBjYXJhIGVudHJlIGFzIDI3IGNhcGl0YWlzIGJyYXNpbGVpcmFzLiBFc3NlIHZhbG9yIMOpIGVudMOjbyBtdWx0aXBsaWNhZG8gcG9yIDMuCgpPIERJRUVTRVtARElFRVNFXSByZWFsaXpvdSBhIFBlc3F1aXNhIGRlIE9yw6dhbWVudG8gRmFtaWxpYXIgKFBPRikgZW0gU8OjbyBQYXVsbyBubyBwZXLDrW9kbyBkZSA5NC85NS4gT3MgcmVzdWx0YWRvcyBtb3N0cmFyYW0gcXVlIGEgYWxpbWVudGHDp8OjbyBjb3JyZXNwb25kaWEgYSAzNSw3MSUgZGFzIGRlc3Blc2FzIGRhcyBmYW3DrWxpYXMgZG8gZXN0cmF0byBtYWlzIGJhaXhvIGRlIHJlbmRhLiBBbyBjb21wYXJhciBvIGN1c3RvIGRhIGFsaW1lbnRhw6fDo28gcGFyYSB1bWEgZmFtw61saWEgKGEgY2VzdGEgbWFpcyBjYXJhIG11bHRpcGxpY2FkYSBwb3IgMykgY29tIGEgcHJvcG9yw6fDo28gZG8gb3LDp2FtZW50byBkZXNzYXMgZmFtw61saWFzIGRlZGljYWRvIMOgIGFsaW1lbnRhw6fDo28gKDM1LDcxJSksIMOpIHBvc3PDrXZlbCBkZWR1emlyIG8gb3LDp2FtZW50byB0b3RhbCBuZWNlc3PDoXJpbyBwYXJhIGNvYnJpciB0YW1iw6ltIG91dHJhcyBkZXNwZXNhcywgY29tbyBtb3JhZGlhLCB2ZXN0dcOhcmlvLCB0cmFuc3BvcnRlIGUgYXNzaW0gcG9yIGRpYW50ZS4KClBvcnRhbnRvLCBwb2RlbW9zIHJlc3VtaXIgYSBmw7NybXVsYSBwYXJhIGNhbGN1bGFyIG8gU2Fsw6FyaW8gTcOtbmltbyBOZWNlc3PDoXJpbyBkYSBzZWd1aW50ZSBmb3JtYToKCiQkQy5GLkEuID0gMyhDQykkJAoKJCRcZnJhY3tDLkYuQS59e1h9ID0gXGZyYWN7MCwzNTcxfXsxLDAwfSQkClVzYW5kbyByZWdyYSBkZSAzLCB0ZW1vcyBxdWU6CgokJEMuRi5BLiA9ICBYKDAsMzU3MSkkJApsb2dvOgoKJCQgWCA9IFxmcmFje0MuRi5BLn17MCwzNTcxfSAkJApPbmRlOgpDLkYuQS4gPSBDdXN0byBGYW1pbGlhciBkZSBBbGltZW50YWPMp2HMg28gCmUgQy5DLiA9IEN1c3RvIGRhIENlc3RhIEJhzIFzaWNhIGRlIG1haW9yIHZhbG9yCgpPIFNhbMOhcmlvIE3DrW5pbW8gTmVjZXNzw6FyaW8sIHF1ZSDDqSBjYWxjdWxhZG8gbWVuc2FsbWVudGUgY29tbyB1bWEgYXZhbGlhw6fDo28gZG8gcXVlIGRldmVyaWEgc2VyIG8gc2Fsw6FyaW8gbcOtbmltbyBhdHVhbCwgdGFtYsOpbSBzZXJ2ZSBjb21vIHVtYSBmZXJyYW1lbnRhIHF1ZSBvcyBzaW5kaWNhdG9zIGRvcyB0cmFiYWxoYWRvcmVzIHVzYW0gcGFyYSBleHBvciBhIHZpb2xhw6fDo28gZG8gcHJpbmPDrXBpbyBjb25zdGl0dWNpb25hbCBxdWUgZGVmaW5lIG9zIHBhcsOibWV0cm9zIHBhcmEgYSBkZXRlcm1pbmHDp8OjbyBkbyBtZW5vciBzYWzDoXJpbyBwZXJtaXRpZG8gbm8gcGHDrXMuCgpUZW1vcyBhYmFpeG8gbyB2YWxvciBkbyBxdWUgc2VyaWEgbyBzYWzDoXJpbyBpZGVhbCBkbyB0cmFiYWxoYWRvciwgcHJldmlzdG8gZW0gbGVpLCBwYXJhIGFyY2FyIGNvbSB0b2RvcyBjdXN0b3MgbWVuc2FpcyBkZSBzdWEgcmVzaWTDqm5jaWEuCgpgYGB7ciBESUVFU0UsIGluY2x1ZGU9RkFMU0V9CmRpZWVzZV8yMDE5IDwtIHJlYWRfZXhjZWwoImRpZWVzZV8yMDE5Lnhsc3giKQpgYGAKCmBgYHtyIHZpc3VhbGl6YcOnw6NvIERJRUVTRSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChkaWVlc2VfMjAxOSwxMCkpICU+JQogICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCkF0cmF2ZXogZGVzc2VzIGRhZG9zLCBwb2RlbW9zIHZlciBhIGRpc2NyZXDDom5jaWEgZW50cmUgb3MgdmFsb3JlcyBtw61uaW1vcyBlIG9zIG5lY2Vzc8OhcmlvcyBwYXJhIGEgbWFudXRlbsOnw6NvIGRvIGxhciBubyBCcmFzaWwuIE7Do28gw6kgcmVjZW50ZSBhIHF1ZWl4YSBwb3IgcmVmb3JtYXMgcG9sw610aWNhcyBlIGVjb27DtG1pY2FzIG5vIEJyYXNpbC4gQWluZGEgbmEgZMOpY2FkYSBkZSAxOTcwLCBvIGdydXBvICJMZWdpw6NvIFVyYmFuYSIgasOhIGxldmFudGF2YSBwcm90ZXN0byBjb20gYSBtw7pzaWNhICJRdWUgcGHDrXMgw6kgZXNzZT8iLiBQb2RlbW9zIHZlciBuYSBkZWNhZGEgc2VndWludGUgbyBjYW50b3IgQ2F6dXphIHByb3Rlc3RhciBlbSBmb3JtYSBkZSBjYW50byBhIG3DunNpY2EgIkJyYXNpbCIgcXVlIGNsYXJhbWVudGUgasOhIGRlbnVuY2lhdmEgYSBwb2JyZXphIGRhIG5hw6fDo28uCgpBIHBvcHVsYcOnw6NvIGNhcmNlcsOhcmlhIGRpeiBtdWl0byBzb2JyZSBvIHBhw61zLiBKb3ZlbnMsIHBvYnJlcywgcGVzc29hcyBkZSBiYWl4YSBlc2NvbGFyaWRhZGUgZSBkZSBwZWxlIGVzY3VyYSBlc3TDo28gbm9zIHRvcG9zIGRhcyBlc3RhdMOtc3RpY2FzLCBpc3NvIHNpbmFsaXphIHVtYSBvbWlzc8OjbyBwb3IgcGFydGUgZG8gZ292ZXJuby4gTyBDw7NkaWdvIFBlbmFsLCBlbSBzZXUgYXJ0aWdvIDEzNSwgZGVzY3JldmUgbyBkZWxpdG8gZGUgb21pc3PDo28gZGUgc29jb3JybywgcXVlIGNvbnNpc3RlIG5hIGF0aXR1ZGUgZGUgZGVpeGFyIGRlIHNvY29ycmVyIHBlc3NvYXMgZW0gc2l0dWHDp8OjbyBkZSB2dWxuZXJhYmlsaWRhZGUsIGNvbW8gY3JpYW7Dp2FzIGFiYW5kb25hZGFzIG91IHBlcmRpZGFzLCBwZXNzb2FzIGludsOhbGlkYXMsIGNvbSBmZXJpbWVudG9zLCBvdSBlbSBzaXR1YcOnw6NvIGRlIHJpc2NvIG91IHBlcmlnby4gUG9yIGVzc2UgZmF0b3IsIG8gZ292ZXJubyB0YW1iw6ltIGRldmVyaWEgZXN0YXIgYXRyw6FzIGRhcyBncmFkZXMuCgojIEJpb2dyYWZpYQoKCgo=