Note: This R markdown relates to data processing of the book chapter entitled “O custo psicológico e econômico das medidas de distanciamento social: prejuízo de um salário mínimo e possível impacto na depressão”. To achieve the same results, please run all codes or download the original CSV file at https://osf.io/csd8q/

If you have any questions or queries, please reach us out at or

last updated: 14 July, 2021

1 Data Processing

1.1 Load packages

pacman::p_load(knitr,
               kableExtra,
               multcomp,
               tidyverse,
               janitor,
               summarytools,
               DataExplorer,
               readxl,
               emmeans,
               patchwork)

1.2 import database: T1

ds <- read_csv("https://osf.io/csd8q/download")
Duplicated column names deduplicated: 'Sexo' => 'Sexo_1' [137], 'Idade (em anos):' => 'Idade (em anos):_1' [138], 'Sua escolaridade:' => 'Sua escolaridade:_1' [139], 'Estado civil' => 'Estado civil_1' [140], 'O estado que voc攼㹡 mora 攼㸹:' => 'O estado que voc攼㹡 mora 攼㸹:_1' [141], 'A cidade que voc攼㹡 mora 攼㸹?' => 'A cidade que voc攼㹡 mora 攼㸹?_1' [142], 'Quantos filhos voc攼㹡 tem?' => 'Quantos filhos voc攼㹡 tem?_1' [143], 'Voc攼㹡 tem plano de sa昼㹡de?' => 'Voc攼㹡 tem plano de sa昼㹡de?_1' [144], 'Qual das seguintes alternativas melhor descrevem sua situa攼㸷攼㸳o no momento?' => 'Qual das seguintes alternativas melhor descrevem sua situa攼㸷攼㸳o no momento?_1' [145], 'Quantas pessoas, contando com voc攼㹡, moram em sua casa?' => 'Quantas pessoas, contando com voc攼㹡, moram em sua casa?_1' [146], 'Em rela攼㸷攼㸳o 攼㸰 sua renda familiar mensal, ou seja, a renda das pessoas moradoras da mesma casa.' => 'Em rela攼㸷攼㸳o 攼㸰 sua renda familiar mensal, ou seja, a renda das pessoas moradoras da mesma casa._1' [147], 'Quantas pessoas do grupo de risco moram contigo? (ex: pesosas com 60 anos ou mais, portadores de doen攼㸷as card攼㹤acas, hipertens攼㸳o, diabetes, etc)' => 'Quantas pessoas do grupo de risco moram contigo? (ex: pesosas com 60 anos ou mais, portadores de doen攼㸷as card攼㹤acas, hipertens攼㸳o, diabetes, etc)_1' [148], 'N昼㸳s sabemos que quest昼㸵es pol攼㹤ticas s攼㸳o densas e merecem uma especial aten攼㸷攼㸳o. No entanto,  em rela攼㸷攼㸳o 攼㸰 orienta攼㸷攼㸳o pol攼㹤tica, eu me considero:' => 'N昼㸳s sabemos que quest昼㸵es pol攼㹤ticas s攼㸳o densas e merecem uma especial aten攼㸷攼㸳o. No entanto,  em rela攼㸷攼㸳o 攼㸰 orienta攼㸷攼㸳o pol攼㹤tica, eu me considero:_1' [149], 'No futuro, podemos te contactar para saber sobre sua sa昼㹡de? Se sim, qual 攼㸹 seu e-mail?' => 'No futuro, podemos te contactar para saber sobre sua sa昼㹡de? Se sim, qual 攼㸹 seu e-mail?_1' [150]
-- Column specification --------------------------------------------------------------------------------------------------------------------------------------------------
cols(
  .default = col_character(),
  `Idade (em anos):` = col_double(),
  `Idade (em anos):_1` = col_double(),
  `Quantas pessoas, contando com voc攼㹡, moram em sua casa?_1` = col_double()
)
i Use `spec()` for the full column specifications.
backup_ds_t1 <- ds

1.3 Clean

modificar nomes

ds <- clean_names(ds)

Remove columns and rows with all missing

ds <- select(ds, -c(agora_apos_o_fim_da_quarentena_assinale_a_frequencia_com_que_lhe_ocorreram_eu_me_chateei_por_coisas_que_normalmente_nao_me_chateavam: no_futuro_podemos_te_contactar_para_saber_sobre_sua_saude_se_sim_qual_e_seu_e_mail_1))

ds %>% select(.)

1.3.1 Ajustar pelas escalas

1.3.2 CES

criar uma duplicada para os itens de depressao

ds <- ds %>% 
  mutate_at(vars(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_chateei_por_coisas_que_normalmente_nao_me_chateavam:abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_sinto_desanimado),
            list(cat = ~paste0(.))) %>% #copy all variables (duplicate) 
  rename_at(vars(ends_with( "_cat")), list(~paste0("ces_t1_", 1:20))) 

ajustar valores t1

ds <- ds %>% 
  mutate_at(vars(starts_with("ces_t1_")),
            ~replace(.,. == "Raramente (menos que 1 dia)", 0))
ds <- ds %>% 
  mutate_at(vars(starts_with("ces_t1_")),
            ~replace(.,. == "Poucas vezes (1-2 dias)", 1))
ds <- ds %>% 
  mutate_at(vars(starts_with("ces_t1_")),
            ~replace(.,. == "Às vezes (3-4 dias)", 2))
ds <- ds %>% 
  mutate_at(vars(starts_with("ces_t1_")),
            ~replace(.,. == "Quase sempre ou sempre (5-7 dias)", 3))

Converter para numerico

ds <- ds %>% 
  mutate_at(vars(starts_with("ces_t1_")), as.numeric)
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

checar respostas t1

ds %>% 
  select(starts_with("ces_t1_")) %>% 
  pivot_longer(everything()) %>% 
  ggplot(., aes(name, value)) +
  geom_boxplot() +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  labs(x = "", y = "")

Inversão dos itens t1

ds <- ds %>% 
  mutate_at(vars(ces_t1_4, 
                 ces_t1_8, 
                 ces_t1_12, 
                 ces_t1_16), list(~paste(abs(3-.)) %>% as.numeric(.)))
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

Checar

ds %>% select(ces_t1_1) %>% summary()
    ces_t1_1   
 Min.   :0.00  
 1st Qu.:0.00  
 Median :1.00  
 Mean   :1.05  
 3rd Qu.:2.00  
 Max.   :3.00  
 NA's   :28    
ds %>% select(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_senti_tao_bem_quanto_as_outras_pessoas,
              ces_t1_4)
ds %>% select(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_chateei_por_coisas_que_normalmente_nao_me_chateavam, ces_t1_1)
NA

Checar se não há casos ausentes

ds %>% 
  filter(neste_momento_em_sua_cidade_ha_alguma_recomendacao_oficial_para_ficar_em_casa_e_ou_evitar_sair != "Não") %>% 
  select(ces_t1_1:ces_t1_20) %>% 
  DataExplorer::profile_missing()

Checar se os valores numericos estão corretos

ds %>% 
  select(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_chateei_por_coisas_que_normalmente_nao_me_chateavam, ces_t1_1)

# estão ok

Checar os invertidos

ds %>% 
  select(abaixo_ha_uma_lista_de_sentimentos_e_comportamentos_por_favor_assinale_a_frequencia_com_que_lhe_ocorreram_na_ultima_semana_eu_me_senti_tao_bem_quanto_as_outras_pessoas, ces_t1_4)

1.3.3 calcular totais CES (T1)

# EScala de depressão); (20 itens)
ds <- ds %>% 
  mutate(total_ces_t1 = rowSums(select(.,ces_t1_1:ces_t1_20)))
ds %>% select(total_ces_t1) %>% head()

Ok

1.3.4 GAD

Criar uma duplicada com os itens do GAD

ds <-  ds %>% 
  mutate_at(vars(durante_as_ultimas_02_semanas_com_que_frequencia_voce_foi_incomodado_a_pelos_problemas_abaixo_sentir_se_nervoso_ansioso_ou_muito_tenso:durante_as_ultimas_02_semanas_com_que_frequencia_voce_foi_incomodado_a_pelos_problemas_abaixo_sentir_medo_como_se_algo_horrivel_fosse_acontecer), list(cat = ~paste0(.))) %>% #copy all variables (duplicate) 
  rename_at(vars(ends_with( "_cat")), list(~paste0("gad_t1_", 1:7))) 

ajustar valores t1

ds <- ds %>% 
   mutate_at(vars(starts_with("gad_t1_")),
            ~replace(.,. == "Nenhuma vez", 0))

ds <- ds %>% 
   mutate_at(vars(starts_with("gad_t1_")),
            ~replace(.,. == "Poucos dias", 1))

ds <- ds %>% 
   mutate_at(vars(starts_with("gad_t1_")),
            ~replace(.,. == "Mais da metade do tempo", 2))

ds <- ds %>% 
   mutate_at(vars(starts_with("gad_t1_")),
            ~replace(.,. == "Quase todos os dias", 3))

Transformar em numérica t1

ds <- ds %>% 
  mutate_at(vars(starts_with("gad_t1_")), as.numeric)
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

checar respostas t1

ds %>% 
  select(starts_with("gad_t1_")) %>% 
  pivot_longer(everything()) %>% 
  ggplot(., aes(name, value)) +
  geom_boxplot() +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  labs(x = "", y = "")

1.3.5 calcular totais t1

# EScala de ansiedade; (7 itens)
ds <- ds %>% 
  mutate(total_gad_t1 = rowSums(select(.,starts_with("gad_t1_"))))

1.4 Remover cidades sem quarentena

ds %>% filter(neste_momento_em_sua_cidade_ha_alguma_recomendacao_oficial_para_ficar_em_casa_e_ou_evitar_sair=="Sim") 

ds <- ds %>% filter(neste_momento_em_sua_cidade_ha_alguma_recomendacao_oficial_para_ficar_em_casa_e_ou_evitar_sair=="Sim")

1.5 Sociodemographic features

ds %>% names

1.5.1 Rename

ds <- ds %>% 
  rename(
    fica_em_casa = incluindo_as_horas_que_voce_dorme_quantas_horas_voce_tem_ficado_em_casa,
    tem_saido_de_casa = em_media_quantas_vezes_voce_tem_saido_de_casa,
    falou_familia_pessoalmente = com_quantas_pessoas_de_sua_familia_voce_falou_hoje_pessoalmente,
    falou_familia_telefone = com_quantas_pessoas_de_sua_familia_voce_falou_hoje_por_telefone_ou_video_conferencia,
    falou_amigos_telefone = com_quantos_amigos_voce_falou_hoje_por_telefone_ou_video_conferencia,
    testou_coronavirus = voce_ja_foi_testado_para_coronavirus,
    conhece_alguem_coronavirus = voce_ja_teve_contato_com_alguem_com_coronavirus,
    segue_recomendacoes = voce_tem_seguido_as_recomendacoes_gerais_de_higiene_lavar_as_maos_evitar_tocar_no_rosto_etc,
    concordo_covid_preocupacao_saude = indique_o_quanto_voce_concorda_o_coronavirus_e_uma_grande_preocupacao_de_saude_publica,
    concordo_quarentena = indique_o_quanto_voce_concorda_a_quarentena_foi_uma_medida_acertada,
    trabalho_antes_quarentena = antes_da_epoca_de_quarentena_coronavirus_voce,
    trabalho_agora_quarentena = agora_nesta_epoca_de_quarantena_coronavirus,
    area_profissao = se_voce_trabalha_sua_area_profissional_principal_e,
    profissao = a_sua_profissao_e,
    renda_antes = em_media_sua_renda_mensal_bruta_em_reais_antes_da_quarentena_coronavirus_era,
    renda_quarentena = em_media_sua_renda_mensal_bruta_em_reais_agora_durante_a_quarentena_coronavirus_e,
    preocupacao_pagar_conta = voce_esta_preocupado_por_ter_dificuldades_em_pagar_suas_contas_principais_como_aluguel_ou_prestacoes_deste_mes_devido_a_quarentena_coronaviru,
    pensa_em_adiar_pagamento = em_caso_afirmativo_pensa_em_adiamento_deste_mes,
    preocupacao_economia_geral = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_economia_em_geral,
    preocupacao_situacao_financeira = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_sua_propria_situacao_financeira,
    preocupacao_sua_saude = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_sua_saude_se_nao_estiver_infectada,
    preocupacao_saude_amigos_familia = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_saude_dos_membros_da_familia_e_dos_amigos_proximos,
    preocupacao_coesao_social = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_coesao_social,
    preocupacao_produtos_alimentacao_higiene_medicamentos = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_fornecimento_de_produtos_importantes_como_alimentos_produtos_de_higiene_e_medicamentos,
    preocupacao_preco_produtos = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_acessibilidade_dos_precos_destes_produtos,
    preocupacao_preco_acoes = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_a_evolucao_do_preco_das_acoes_e_de_outras_formas_de_investimento,
    preocupacao_realizacao_escolar_filho = qual_e_a_sua_preocupacao_em_relacao_aos_itens_abaixo_as_realizacoes_escolares_dos_seus_filhos,
    bebida_que_usa = qual_o_tipo_de_bebida_alcoolica_que_voce_mais_consome_deixe_em_branco_se_nenhuma,
    idade = idade_em_anos,
    escolaridade = sua_escolaridade,
    estado = o_estado_que_voce_mora_e,
    cidade = a_cidade_que_voce_mora_e,
    quantos_filhos = quantos_filhos_voce_tem,
    plano_saude = voce_tem_plano_de_saude,
    como_vive = qual_das_seguintes_alternativas_melhor_descrevem_sua_situacao_no_momento,
    pessoas_na_casa = quantas_pessoas_contando_com_voce_moram_em_sua_casa,
    renda_familiar_mensal = em_relacao_a_sua_renda_familiar_mensal_ou_seja_a_renda_das_pessoas_moradoras_da_mesma_casa,
    pessoas_em_risco_casa = quantas_pessoas_do_grupo_de_risco_moram_contigo_ex_pesosas_com_60_anos_ou_mais_portadores_de_doencas_cardiacas_hipertensao_diabetes_etc,
    orientacao_politica = nos_sabemos_que_questoes_politicas_sao_densas_e_merecem_uma_especial_atencao_no_entanto_em_relacao_a_orientacao_politica_eu_me_considero
  )

1.5.2 Transform into factor

ds <- ds %>% 
  mutate(across(c(fica_em_casa,
                  tem_saido_de_casa,
                  falou_familia_pessoalmente,
                  falou_familia_telefone,
                  falou_amigos_telefone,
                  testou_coronavirus,
                  conhece_alguem_coronavirus,
                  segue_recomendacoes,
                  concordo_covid_preocupacao_saude,
                  concordo_quarentena,
                  trabalho_antes_quarentena,
                  trabalho_agora_quarentena,
                  area_profissao,

                  preocupacao_pagar_conta,
                  pensa_em_adiar_pagamento,
                  preocupacao_economia_geral,
                  preocupacao_situacao_financeira,
                  preocupacao_sua_saude,
                  preocupacao_saude_amigos_familia,
                  preocupacao_coesao_social,
                  preocupacao_produtos_alimentacao_higiene_medicamentos,
                  preocupacao_preco_produtos,
                  preocupacao_preco_acoes,
                  preocupacao_realizacao_escolar_filho,
                  bebida_que_usa,
                  sexo,
                  escolaridade,
                  estado,
                  cidade,
                  plano_saude,
                  como_vive,
                  renda_familiar_mensal,
                  pessoas_em_risco_casa,
                  orientacao_politica),
                factor))

1.5.3 Fix some factor levels

Ficar em casa

ds <- ds %>% 
  mutate_at(vars(fica_em_casa), ~fct_relevel(., 
                                      c("Entre 1 a 4 horas por dia",
                                        "Entre 5 a 8 horas por dia", 
                                        "Entre 9 a 12 horas por dia", 
                                        "Entre 13 a 16 horas por dia", 
                                        "Entre 17 a 20 horas por dia", 
                                        "Mais de 20 horas por dia ou o dia todo")))

Sai de casa

ds <- ds %>% 
  mutate_at(vars(tem_saido_de_casa), ~fct_relevel(., 
                                      c("Nenhuma",
                                        "1 vez por dia",
                                        "2 vezes por dia", 
                                        "3 vezes por dia", 
                                        "Mais de 3 vezes por dia")))

Falou familia pessoalmente

ds <- ds %>% 
  mutate_at(vars(falou_familia_pessoalmente), ~fct_relevel(., 
                                      c("Nenhuma"))) 

Preocupacao covid e saude

ds <- ds %>% 
  mutate_at(vars(concordo_quarentena, concordo_covid_preocupacao_saude), ~fct_relevel(., 
                                      c("Eu discordo fortemente",
                                        "Eu discordo",
                                        "Estou neutro", 
                                        "Eu concordo", 
                                        "Eu concordo fortemente")))

preocupacao geral

ds <- ds %>% 
  mutate_at(vars(starts_with("preocupacao_")), ~fct_relevel(., 
                                      c("Nenhuma",
                                        "Pouca",
                                        "Bastante", 
                                        "Extrema")))
Unknown levels in `f`: Nenhuma, Pouca, Bastante, Extrema
ds %>% count(preocupacao_coesao_social)

Quanto_tempo_voce_acha_que_que_a_vida_voltara_ao_normal

ds <- ds %>% 
  mutate_at(vars(quanto_tempo_voce_acha_que_que_a_vida_voltara_ao_normal), ~fct_relevel(., 
                                      c("Antes do segundo semestre de 2020",
                                        "No segundo semestre de 2020",
                                        "Só em 2021", 
                                        "2022 ou depois")))

Fumo

ds <- ds %>% 
  mutate_at(vars(antes_da_quarentena_coronavirus_voce_fumava), ~fct_relevel(., 
                                      c("Não, não fumava",
                                        "Entre 1 e 5 cigarro por dia",
                                        "Até 20 cigarros por dia",
                                        "Mais de 20 cigarros por dia")))
ds <- ds %>% 
  mutate_at(vars(agora_durante_a_quarentena_coronavirus_voce_fuma), ~fct_relevel(., 
                                      c("Não, não fumo",
                                        "Entre 1 e 5 cigarro por dia",
                                        "Até 20 cigarros por dia",
                                        "Mais de 20 cigarros por dia")))

Bebida

ds <- ds %>% 
  mutate_at(vars(antes_da_quarentena_coronavirus_voce_bebia), ~fct_relevel(., 
                                      c("Não, não bebia")))
ds <- ds %>% 
  mutate_at(vars(agora_durante_a_quarentena_coronavirus_voce_bebe), ~fct_relevel(., 
                                      c("Não, não bebo")))

Exercicios físicos

ds <- ds %>% 
  mutate_at(vars(antes_da_quarentena_coronavirus_voce_fazia_exercicios_fisicos, agora_durante_a_quarentena_coronavirus_voce_faz_exercicios_fisicos), ~fct_relevel(.,
                                                                                                                                                                  c("Não, nenhum",
          "Pouco (1 vez por semana)",
          "Moderado (2 a 3 vezes por semana)",
          "Muito (mais que 3 vezes por semana)")))

Escolaridade

ds <- ds %>% 
  mutate_at(vars(escolaridade), ~fct_relevel(., 
                                      c("Ensino fundamental incompleto",
                                        "Ensino fundamental completo",
                                        "Ensino médio incompleto",
                                        "Ensino médio completo",
                                        "Ensino superior incompleto",
                                        "Ensino superior completo",
                                        "Pós-graduação")))

Estado civil

ds %>% count(estado_civil)
ds <- ds %>% mutate(estado_civil = factor(estado_civil))

Rio e sao paulo

ds <- ds %>% 
  mutate(rio_sp =  case_when(
    estado == "Rio de Janeiro (RJ)" ~ "RJ",
    estado == "São Paulo (SP)" ~ "SP",
    is.na(estado) ~ NA_character_,
    TRUE ~ "Outros"))
ds <- ds %>% mutate(rio_sp = factor(rio_sp))

Quantos filhos

ds <- ds %>% 
  mutate_at(vars(quantos_filhos), ~fct_relevel(., 
                                      c("Nenhum")))

Pessoas na casa

ds <- ds %>% 
  mutate(pessoas_na_casa = as.numeric(pessoas_na_casa))

Pessoas em risco

ds <- ds %>% 
  mutate_at(vars(pessoas_em_risco_casa), ~fct_relevel(., 
                                      c("Nenhuma")))

ds %>% count(pessoas_em_risco_casa)

Renda familiar

ds <- ds %>% 
  mutate_at(vars(renda_familiar_mensal), ~fct_relevel(., 
                                      c("Até R$ 1.908",
                                        "Mais de R$ 1.908 até R$ 2.862",
                                        "Mais de R$ 2.862 até R$ 5.724",
                                        "Mais de R$ 5.724 até R$ 9.540",
                                        "Mais de R$ 9.540 até R$ 14.310",
                                        "Acima de R$ 14.310 ate R$ 23.850",
                                        "Acima de R$ 23.850")))

Orientação política

ds <- ds %>% 
  mutate_at(vars(orientacao_politica), ~fct_relevel(., 
                                      c("Sou apolítico",
                                        "De esquerda",
                                        "De centro esquerda",
                                        "De centro",
                                        "De centro direita",
                                        "De direita")))

1.6 Export dataset

write.csv(ds, "ds_covid_book.csv", row.names = F)

1.7 Done

LS0tDQp0aXRsZTogIkNPVklELTE5IC0gRGF0YSBwcm9jZXNzaW5nIg0KYXV0aG9yOiAiTHVpcyBBbnVuY2lhw6fDo28sIEx1Y2FzIEJhcnJvem8iDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCjxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPg0KKipOb3RlKio6IFRoaXMgUiBtYXJrZG93biByZWxhdGVzIHRvIGRhdGEgcHJvY2Vzc2luZyBvZiB0aGUgYm9vayBjaGFwdGVyIGVudGl0bGVkICJPIGN1c3RvIHBzaWNvbMOzZ2ljbyBlIGVjb27DtG1pY28gZGFzIG1lZGlkYXMgZGUgZGlzdGFuY2lhbWVudG8gc29jaWFsOiBwcmVqdcOtem8gZGUgdW0gc2Fsw6FyaW8gbcOtbmltbyBlIHBvc3PDrXZlbCBpbXBhY3RvIG5hIGRlcHJlc3PDo28iLiBUbyBhY2hpZXZlIHRoZSBzYW1lIHJlc3VsdHMsIHBsZWFzZSBydW4gYWxsIGNvZGVzIG9yIGRvd25sb2FkIHRoZSBvcmlnaW5hbCBDU1YgZmlsZSBhdCBodHRwczovL29zZi5pby9jc2Q4cS8NCg0KSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBvciBxdWVyaWVzLCBwbGVhc2UgcmVhY2ggdXMgb3V0IGF0IA0KbHVjYXMucHNpYy5yakBnbWFpbC5jb20gb3IgbHVpc2ZjYUBwdWMtcmlvLmJyDQoNCmxhc3QgdXBkYXRlZDogYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWANCjwvZGl2Pg0KDQoNCiMgRGF0YSBQcm9jZXNzaW5nDQoNCiMjIExvYWQgcGFja2FnZXMNCg0KYGBgIHtyIHBhY2thZ2VzIH0NCnBhY21hbjo6cF9sb2FkKGtuaXRyLA0KICAgICAgICAgICAgICAga2FibGVFeHRyYSwNCiAgICAgICAgICAgICAgIG11bHRjb21wLA0KICAgICAgICAgICAgICAgdGlkeXZlcnNlLA0KICAgICAgICAgICAgICAgamFuaXRvciwNCiAgICAgICAgICAgICAgIHN1bW1hcnl0b29scywNCiAgICAgICAgICAgICAgIERhdGFFeHBsb3JlciwNCiAgICAgICAgICAgICAgIHJlYWR4bCwNCiAgICAgICAgICAgICAgIGVtbWVhbnMsDQogICAgICAgICAgICAgICBwYXRjaHdvcmspDQoNCmBgYA0KDQojIyBpbXBvcnQgZGF0YWJhc2U6IFQxIA0KDQpgYGB7cn0NCmRzIDwtIHJlYWRfY3N2KCJodHRwczovL29zZi5pby9jc2Q4cS9kb3dubG9hZCIpDQpiYWNrdXBfZHNfdDEgPC0gZHMNCmBgYA0KDQojIyBDbGVhbg0KDQo+bW9kaWZpY2FyIG5vbWVzDQoNCmBgYHtyfQ0KZHMgPC0gY2xlYW5fbmFtZXMoZHMpDQpgYGANCg0KPlJlbW92ZSBjb2x1bW5zIGFuZCByb3dzIHdpdGggYWxsIG1pc3NpbmcNCg0KYGBge3J9DQpkcyA8LSBzZWxlY3QoZHMsIC1jKGFnb3JhX2Fwb3Nfb19maW1fZGFfcXVhcmVudGVuYV9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX2V1X21lX2NoYXRlZWlfcG9yX2NvaXNhc19xdWVfbm9ybWFsbWVudGVfbmFvX21lX2NoYXRlYXZhbTogbm9fZnV0dXJvX3BvZGVtb3NfdGVfY29udGFjdGFyX3BhcmFfc2FiZXJfc29icmVfc3VhX3NhdWRlX3NlX3NpbV9xdWFsX2Vfc2V1X2VfbWFpbF8xKSkNCg0KZHMgJT4lIHNlbGVjdCguKQ0KYGBgDQoNCg0KIyMjIEFqdXN0YXIgcGVsYXMgZXNjYWxhcyANCg0KDQojIyMgQ0VTIA0KDQo+IGNyaWFyIHVtYSBkdXBsaWNhZGEgcGFyYSBvcyBpdGVucyBkZSBkZXByZXNzYW8gDQoNCmBgYHtyfQ0KZHMgPC0gZHMgJT4lIA0KICBtdXRhdGVfYXQodmFycyhhYmFpeG9faGFfdW1hX2xpc3RhX2RlX3NlbnRpbWVudG9zX2VfY29tcG9ydGFtZW50b3NfcG9yX2Zhdm9yX2Fzc2luYWxlX2FfZnJlcXVlbmNpYV9jb21fcXVlX2xoZV9vY29ycmVyYW1fbmFfdWx0aW1hX3NlbWFuYV9ldV9tZV9jaGF0ZWVpX3Bvcl9jb2lzYXNfcXVlX25vcm1hbG1lbnRlX25hb19tZV9jaGF0ZWF2YW06YWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfc2ludG9fZGVzYW5pbWFkbyksDQogICAgICAgICAgICBsaXN0KGNhdCA9IH5wYXN0ZTAoLikpKSAlPiUgI2NvcHkgYWxsIHZhcmlhYmxlcyAoZHVwbGljYXRlKSANCiAgcmVuYW1lX2F0KHZhcnMoZW5kc193aXRoKCAiX2NhdCIpKSwgbGlzdCh+cGFzdGUwKCJjZXNfdDFfIiwgMToyMCkpKSANCmBgYA0KDQoNCj4gYWp1c3RhciB2YWxvcmVzIHQxDQoNCmBgYHtyIH0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImNlc190MV8iKSksDQogICAgICAgICAgICB+cmVwbGFjZSguLC4gPT0gIlJhcmFtZW50ZSAobWVub3MgcXVlIDEgZGlhKSIsIDApKQ0KZHMgPC0gZHMgJT4lIA0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiY2VzX3QxXyIpKSwNCiAgICAgICAgICAgIH5yZXBsYWNlKC4sLiA9PSAiUG91Y2FzIHZlemVzICgxLTIgZGlhcykiLCAxKSkNCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImNlc190MV8iKSksDQogICAgICAgICAgICB+cmVwbGFjZSguLC4gPT0gIsOAcyB2ZXplcyAoMy00IGRpYXMpIiwgMikpDQpkcyA8LSBkcyAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJjZXNfdDFfIikpLA0KICAgICAgICAgICAgfnJlcGxhY2UoLiwuID09ICJRdWFzZSBzZW1wcmUgb3Ugc2VtcHJlICg1LTcgZGlhcykiLCAzKSkNCmBgYA0KDQoNCj4gQ29udmVydGVyIHBhcmEgbnVtZXJpY28gDQoNCmBgYHtyIH0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImNlc190MV8iKSksIGFzLm51bWVyaWMpDQpgYGANCg0KPiBjaGVjYXIgcmVzcG9zdGFzIHQxDQoNCmBgYHtyfQ0KZHMgJT4lIA0KICBzZWxlY3Qoc3RhcnRzX3dpdGgoImNlc190MV8iKSkgJT4lIA0KICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpKSAlPiUgDQogIGdncGxvdCguLCBhZXMobmFtZSwgdmFsdWUpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEpKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIiIpDQpgYGANCg0KPiBJbnZlcnPDo28gZG9zIGl0ZW5zIHQxDQoNCmBgYHtyIH0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoY2VzX3QxXzQsIA0KICAgICAgICAgICAgICAgICBjZXNfdDFfOCwgDQogICAgICAgICAgICAgICAgIGNlc190MV8xMiwgDQogICAgICAgICAgICAgICAgIGNlc190MV8xNiksIGxpc3QofnBhc3RlKGFicygzLS4pKSAlPiUgYXMubnVtZXJpYyguKSkpDQpgYGANCg0KDQo+IENoZWNhcg0KDQpgYGB7cn0NCmRzICU+JSBzZWxlY3QoY2VzX3QxXzEpICU+JSBzdW1tYXJ5KCkNCmBgYA0KDQoNCmBgYHtyfQ0KZHMgJT4lIHNlbGVjdChhYmFpeG9faGFfdW1hX2xpc3RhX2RlX3NlbnRpbWVudG9zX2VfY29tcG9ydGFtZW50b3NfcG9yX2Zhdm9yX2Fzc2luYWxlX2FfZnJlcXVlbmNpYV9jb21fcXVlX2xoZV9vY29ycmVyYW1fbmFfdWx0aW1hX3NlbWFuYV9ldV9tZV9zZW50aV90YW9fYmVtX3F1YW50b19hc19vdXRyYXNfcGVzc29hcywNCiAgICAgICAgICAgICAgY2VzX3QxXzQpDQpgYGANCg0KDQpgYGB7cn0NCmRzICU+JSBzZWxlY3QoYWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfY2hhdGVlaV9wb3JfY29pc2FzX3F1ZV9ub3JtYWxtZW50ZV9uYW9fbWVfY2hhdGVhdmFtLCBjZXNfdDFfMSkNCg0KYGBgDQoNCg0KDQo+IENoZWNhciBzZSBuw6NvIGjDoSBjYXNvcyBhdXNlbnRlcyAgDQoNCmBgYHtyfQ0KZHMgJT4lIA0KICBmaWx0ZXIobmVzdGVfbW9tZW50b19lbV9zdWFfY2lkYWRlX2hhX2FsZ3VtYV9yZWNvbWVuZGFjYW9fb2ZpY2lhbF9wYXJhX2ZpY2FyX2VtX2Nhc2FfZV9vdV9ldml0YXJfc2FpciAhPSAiTsOjbyIpICU+JSANCiAgc2VsZWN0KGNlc190MV8xOmNlc190MV8yMCkgJT4lIA0KICBEYXRhRXhwbG9yZXI6OnByb2ZpbGVfbWlzc2luZygpDQpgYGANCg0KPiBDaGVjYXIgc2Ugb3MgdmFsb3JlcyBudW1lcmljb3MgZXN0w6NvIGNvcnJldG9zDQoNCmBgYHtyfQ0KZHMgJT4lIA0KICBzZWxlY3QoYWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfY2hhdGVlaV9wb3JfY29pc2FzX3F1ZV9ub3JtYWxtZW50ZV9uYW9fbWVfY2hhdGVhdmFtLCBjZXNfdDFfMSkNCg0KIyBlc3TDo28gb2sNCmBgYA0KDQo+IENoZWNhciBvcyBpbnZlcnRpZG9zDQoNCmBgYHtyfQ0KZHMgJT4lIA0KICBzZWxlY3QoYWJhaXhvX2hhX3VtYV9saXN0YV9kZV9zZW50aW1lbnRvc19lX2NvbXBvcnRhbWVudG9zX3Bvcl9mYXZvcl9hc3NpbmFsZV9hX2ZyZXF1ZW5jaWFfY29tX3F1ZV9saGVfb2NvcnJlcmFtX25hX3VsdGltYV9zZW1hbmFfZXVfbWVfc2VudGlfdGFvX2JlbV9xdWFudG9fYXNfb3V0cmFzX3Blc3NvYXMsIGNlc190MV80KQ0KYGBgDQoNCg0KIyMjIGNhbGN1bGFyIHRvdGFpcyBDRVMgKFQxKQ0KDQpgYGB7ciB9DQojIEVTY2FsYSBkZSBkZXByZXNzw6NvKTsgKDIwIGl0ZW5zKQ0KZHMgPC0gZHMgJT4lIA0KICBtdXRhdGUodG90YWxfY2VzX3QxID0gcm93U3VtcyhzZWxlY3QoLixjZXNfdDFfMTpjZXNfdDFfMjApKSkNCmBgYA0KDQoNCmBgYHtyfQ0KZHMgJT4lIHNlbGVjdCh0b3RhbF9jZXNfdDEpICU+JSBoZWFkKCkNCmBgYA0KDQoNCj4gT2sNCg0KDQojIyMgR0FEIA0KDQoNCj4gQ3JpYXIgdW1hIGR1cGxpY2FkYSBjb20gb3MgaXRlbnMgZG8gR0FEIA0KDQpgYGB7ciB9DQpkcyA8LSAgZHMgJT4lIA0KICBtdXRhdGVfYXQodmFycyhkdXJhbnRlX2FzX3VsdGltYXNfMDJfc2VtYW5hc19jb21fcXVlX2ZyZXF1ZW5jaWFfdm9jZV9mb2lfaW5jb21vZGFkb19hX3BlbG9zX3Byb2JsZW1hc19hYmFpeG9fc2VudGlyX3NlX25lcnZvc29fYW5zaW9zb19vdV9tdWl0b190ZW5zbzpkdXJhbnRlX2FzX3VsdGltYXNfMDJfc2VtYW5hc19jb21fcXVlX2ZyZXF1ZW5jaWFfdm9jZV9mb2lfaW5jb21vZGFkb19hX3BlbG9zX3Byb2JsZW1hc19hYmFpeG9fc2VudGlyX21lZG9fY29tb19zZV9hbGdvX2hvcnJpdmVsX2Zvc3NlX2Fjb250ZWNlciksIGxpc3QoY2F0ID0gfnBhc3RlMCguKSkpICU+JSAjY29weSBhbGwgdmFyaWFibGVzIChkdXBsaWNhdGUpIA0KICByZW5hbWVfYXQodmFycyhlbmRzX3dpdGgoICJfY2F0IikpLCBsaXN0KH5wYXN0ZTAoImdhZF90MV8iLCAxOjcpKSkgDQoNCmBgYA0KDQo+IGFqdXN0YXIgdmFsb3JlcyB0MQ0KDQpgYGB7ciB9DQpkcyA8LSBkcyAlPiUgDQogICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZ2FkX3QxXyIpKSwNCiAgICAgICAgICAgIH5yZXBsYWNlKC4sLiA9PSAiTmVuaHVtYSB2ZXoiLCAwKSkNCg0KZHMgPC0gZHMgJT4lIA0KICAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImdhZF90MV8iKSksDQogICAgICAgICAgICB+cmVwbGFjZSguLC4gPT0gIlBvdWNvcyBkaWFzIiwgMSkpDQoNCmRzIDwtIGRzICU+JSANCiAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJnYWRfdDFfIikpLA0KICAgICAgICAgICAgfnJlcGxhY2UoLiwuID09ICJNYWlzIGRhIG1ldGFkZSBkbyB0ZW1wbyIsIDIpKQ0KDQpkcyA8LSBkcyAlPiUgDQogICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZ2FkX3QxXyIpKSwNCiAgICAgICAgICAgIH5yZXBsYWNlKC4sLiA9PSAiUXVhc2UgdG9kb3Mgb3MgZGlhcyIsIDMpKQ0KDQpgYGANCg0KDQo+IFRyYW5zZm9ybWFyIGVtIG51bcOpcmljYSB0MQ0KDQpgYGB7ciB9DQpkcyA8LSBkcyAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJnYWRfdDFfIikpLCBhcy5udW1lcmljKQ0KYGBgDQoNCj4gY2hlY2FyIHJlc3Bvc3RhcyB0MQ0KDQpgYGB7cn0NCmRzICU+JSANCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJnYWRfdDFfIikpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSkgJT4lIA0KICBnZ3Bsb3QoLiwgYWVzKG5hbWUsIHZhbHVlKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICIiKQ0KYGBgDQoNCg0KIyMjIGNhbGN1bGFyIHRvdGFpcyB0MQ0KDQpgYGB7ciB9DQojIEVTY2FsYSBkZSBhbnNpZWRhZGU7ICg3IGl0ZW5zKQ0KZHMgPC0gZHMgJT4lIA0KICBtdXRhdGUodG90YWxfZ2FkX3QxID0gcm93U3VtcyhzZWxlY3QoLixzdGFydHNfd2l0aCgiZ2FkX3QxXyIpKSkpDQpgYGANCg0KIyMgUmVtb3ZlciBjaWRhZGVzIHNlbSBxdWFyZW50ZW5hDQoNCmBgYHtyfQ0KZHMgJT4lIGZpbHRlcihuZXN0ZV9tb21lbnRvX2VtX3N1YV9jaWRhZGVfaGFfYWxndW1hX3JlY29tZW5kYWNhb19vZmljaWFsX3BhcmFfZmljYXJfZW1fY2FzYV9lX291X2V2aXRhcl9zYWlyPT0iU2ltIikgDQoNCmRzIDwtIGRzICU+JSBmaWx0ZXIobmVzdGVfbW9tZW50b19lbV9zdWFfY2lkYWRlX2hhX2FsZ3VtYV9yZWNvbWVuZGFjYW9fb2ZpY2lhbF9wYXJhX2ZpY2FyX2VtX2Nhc2FfZV9vdV9ldml0YXJfc2Fpcj09IlNpbSIpDQpgYGANCg0KDQojIyBTb2Npb2RlbW9ncmFwaGljIGZlYXR1cmVzDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0KZHMgJT4lIG5hbWVzDQpgYGANCg0KDQojIyMgUmVuYW1lIA0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSANCiAgcmVuYW1lKA0KICAgIGZpY2FfZW1fY2FzYSA9IGluY2x1aW5kb19hc19ob3Jhc19xdWVfdm9jZV9kb3JtZV9xdWFudGFzX2hvcmFzX3ZvY2VfdGVtX2ZpY2Fkb19lbV9jYXNhLA0KICAgIHRlbV9zYWlkb19kZV9jYXNhID0gZW1fbWVkaWFfcXVhbnRhc192ZXplc192b2NlX3RlbV9zYWlkb19kZV9jYXNhLA0KICAgIGZhbG91X2ZhbWlsaWFfcGVzc29hbG1lbnRlID0gY29tX3F1YW50YXNfcGVzc29hc19kZV9zdWFfZmFtaWxpYV92b2NlX2ZhbG91X2hvamVfcGVzc29hbG1lbnRlLA0KICAgIGZhbG91X2ZhbWlsaWFfdGVsZWZvbmUgPSBjb21fcXVhbnRhc19wZXNzb2FzX2RlX3N1YV9mYW1pbGlhX3ZvY2VfZmFsb3VfaG9qZV9wb3JfdGVsZWZvbmVfb3VfdmlkZW9fY29uZmVyZW5jaWEsDQogICAgZmFsb3VfYW1pZ29zX3RlbGVmb25lID0gY29tX3F1YW50b3NfYW1pZ29zX3ZvY2VfZmFsb3VfaG9qZV9wb3JfdGVsZWZvbmVfb3VfdmlkZW9fY29uZmVyZW5jaWEsDQogICAgdGVzdG91X2Nvcm9uYXZpcnVzID0gdm9jZV9qYV9mb2lfdGVzdGFkb19wYXJhX2Nvcm9uYXZpcnVzLA0KICAgIGNvbmhlY2VfYWxndWVtX2Nvcm9uYXZpcnVzID0gdm9jZV9qYV90ZXZlX2NvbnRhdG9fY29tX2FsZ3VlbV9jb21fY29yb25hdmlydXMsDQogICAgc2VndWVfcmVjb21lbmRhY29lcyA9IHZvY2VfdGVtX3NlZ3VpZG9fYXNfcmVjb21lbmRhY29lc19nZXJhaXNfZGVfaGlnaWVuZV9sYXZhcl9hc19tYW9zX2V2aXRhcl90b2Nhcl9ub19yb3N0b19ldGMsDQogICAgY29uY29yZG9fY292aWRfcHJlb2N1cGFjYW9fc2F1ZGUgPSBpbmRpcXVlX29fcXVhbnRvX3ZvY2VfY29uY29yZGFfb19jb3JvbmF2aXJ1c19lX3VtYV9ncmFuZGVfcHJlb2N1cGFjYW9fZGVfc2F1ZGVfcHVibGljYSwNCiAgICBjb25jb3Jkb19xdWFyZW50ZW5hID0gaW5kaXF1ZV9vX3F1YW50b192b2NlX2NvbmNvcmRhX2FfcXVhcmVudGVuYV9mb2lfdW1hX21lZGlkYV9hY2VydGFkYSwNCiAgICB0cmFiYWxob19hbnRlc19xdWFyZW50ZW5hID0gYW50ZXNfZGFfZXBvY2FfZGVfcXVhcmVudGVuYV9jb3JvbmF2aXJ1c192b2NlLA0KICAgIHRyYWJhbGhvX2Fnb3JhX3F1YXJlbnRlbmEgPSBhZ29yYV9uZXN0YV9lcG9jYV9kZV9xdWFyYW50ZW5hX2Nvcm9uYXZpcnVzLA0KICAgIGFyZWFfcHJvZmlzc2FvID0gc2Vfdm9jZV90cmFiYWxoYV9zdWFfYXJlYV9wcm9maXNzaW9uYWxfcHJpbmNpcGFsX2UsDQogICAgcHJvZmlzc2FvID0gYV9zdWFfcHJvZmlzc2FvX2UsDQogICAgcmVuZGFfYW50ZXMgPSBlbV9tZWRpYV9zdWFfcmVuZGFfbWVuc2FsX2JydXRhX2VtX3JlYWlzX2FudGVzX2RhX3F1YXJlbnRlbmFfY29yb25hdmlydXNfZXJhLA0KICAgIHJlbmRhX3F1YXJlbnRlbmEgPSBlbV9tZWRpYV9zdWFfcmVuZGFfbWVuc2FsX2JydXRhX2VtX3JlYWlzX2Fnb3JhX2R1cmFudGVfYV9xdWFyZW50ZW5hX2Nvcm9uYXZpcnVzX2UsDQogICAgcHJlb2N1cGFjYW9fcGFnYXJfY29udGEgPSB2b2NlX2VzdGFfcHJlb2N1cGFkb19wb3JfdGVyX2RpZmljdWxkYWRlc19lbV9wYWdhcl9zdWFzX2NvbnRhc19wcmluY2lwYWlzX2NvbW9fYWx1Z3VlbF9vdV9wcmVzdGFjb2VzX2Rlc3RlX21lc19kZXZpZG9fYV9xdWFyZW50ZW5hX2Nvcm9uYXZpcnUsDQogICAgcGVuc2FfZW1fYWRpYXJfcGFnYW1lbnRvID0gZW1fY2Fzb19hZmlybWF0aXZvX3BlbnNhX2VtX2FkaWFtZW50b19kZXN0ZV9tZXMsDQogICAgcHJlb2N1cGFjYW9fZWNvbm9taWFfZ2VyYWwgPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2FfZWNvbm9taWFfZW1fZ2VyYWwsDQogICAgcHJlb2N1cGFjYW9fc2l0dWFjYW9fZmluYW5jZWlyYSA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fYV9zdWFfcHJvcHJpYV9zaXR1YWNhb19maW5hbmNlaXJhLA0KICAgIHByZW9jdXBhY2FvX3N1YV9zYXVkZSA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fYV9zdWFfc2F1ZGVfc2VfbmFvX2VzdGl2ZXJfaW5mZWN0YWRhLA0KICAgIHByZW9jdXBhY2FvX3NhdWRlX2FtaWdvc19mYW1pbGlhID0gcXVhbF9lX2Ffc3VhX3ByZW9jdXBhY2FvX2VtX3JlbGFjYW9fYW9zX2l0ZW5zX2FiYWl4b19hX3NhdWRlX2Rvc19tZW1icm9zX2RhX2ZhbWlsaWFfZV9kb3NfYW1pZ29zX3Byb3hpbW9zLA0KICAgIHByZW9jdXBhY2FvX2NvZXNhb19zb2NpYWwgPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2FfY29lc2FvX3NvY2lhbCwNCiAgICBwcmVvY3VwYWNhb19wcm9kdXRvc19hbGltZW50YWNhb19oaWdpZW5lX21lZGljYW1lbnRvcyA9IHF1YWxfZV9hX3N1YV9wcmVvY3VwYWNhb19lbV9yZWxhY2FvX2Fvc19pdGVuc19hYmFpeG9fZm9ybmVjaW1lbnRvX2RlX3Byb2R1dG9zX2ltcG9ydGFudGVzX2NvbW9fYWxpbWVudG9zX3Byb2R1dG9zX2RlX2hpZ2llbmVfZV9tZWRpY2FtZW50b3MsDQogICAgcHJlb2N1cGFjYW9fcHJlY29fcHJvZHV0b3MgPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2FfYWNlc3NpYmlsaWRhZGVfZG9zX3ByZWNvc19kZXN0ZXNfcHJvZHV0b3MsDQogICAgcHJlb2N1cGFjYW9fcHJlY29fYWNvZXMgPSBxdWFsX2VfYV9zdWFfcHJlb2N1cGFjYW9fZW1fcmVsYWNhb19hb3NfaXRlbnNfYWJhaXhvX2FfZXZvbHVjYW9fZG9fcHJlY29fZGFzX2Fjb2VzX2VfZGVfb3V0cmFzX2Zvcm1hc19kZV9pbnZlc3RpbWVudG8sDQogICAgcHJlb2N1cGFjYW9fcmVhbGl6YWNhb19lc2NvbGFyX2ZpbGhvID0gcXVhbF9lX2Ffc3VhX3ByZW9jdXBhY2FvX2VtX3JlbGFjYW9fYW9zX2l0ZW5zX2FiYWl4b19hc19yZWFsaXphY29lc19lc2NvbGFyZXNfZG9zX3NldXNfZmlsaG9zLA0KICAgIGJlYmlkYV9xdWVfdXNhID0gcXVhbF9vX3RpcG9fZGVfYmViaWRhX2FsY29vbGljYV9xdWVfdm9jZV9tYWlzX2NvbnNvbWVfZGVpeGVfZW1fYnJhbmNvX3NlX25lbmh1bWEsDQogICAgaWRhZGUgPSBpZGFkZV9lbV9hbm9zLA0KICAgIGVzY29sYXJpZGFkZSA9IHN1YV9lc2NvbGFyaWRhZGUsDQogICAgZXN0YWRvID0gb19lc3RhZG9fcXVlX3ZvY2VfbW9yYV9lLA0KICAgIGNpZGFkZSA9IGFfY2lkYWRlX3F1ZV92b2NlX21vcmFfZSwNCiAgICBxdWFudG9zX2ZpbGhvcyA9IHF1YW50b3NfZmlsaG9zX3ZvY2VfdGVtLA0KICAgIHBsYW5vX3NhdWRlID0gdm9jZV90ZW1fcGxhbm9fZGVfc2F1ZGUsDQogICAgY29tb192aXZlID0gcXVhbF9kYXNfc2VndWludGVzX2FsdGVybmF0aXZhc19tZWxob3JfZGVzY3JldmVtX3N1YV9zaXR1YWNhb19ub19tb21lbnRvLA0KICAgIHBlc3NvYXNfbmFfY2FzYSA9IHF1YW50YXNfcGVzc29hc19jb250YW5kb19jb21fdm9jZV9tb3JhbV9lbV9zdWFfY2FzYSwNCiAgICByZW5kYV9mYW1pbGlhcl9tZW5zYWwgPSBlbV9yZWxhY2FvX2Ffc3VhX3JlbmRhX2ZhbWlsaWFyX21lbnNhbF9vdV9zZWphX2FfcmVuZGFfZGFzX3Blc3NvYXNfbW9yYWRvcmFzX2RhX21lc21hX2Nhc2EsDQogICAgcGVzc29hc19lbV9yaXNjb19jYXNhID0gcXVhbnRhc19wZXNzb2FzX2RvX2dydXBvX2RlX3Jpc2NvX21vcmFtX2NvbnRpZ29fZXhfcGVzb3Nhc19jb21fNjBfYW5vc19vdV9tYWlzX3BvcnRhZG9yZXNfZGVfZG9lbmNhc19jYXJkaWFjYXNfaGlwZXJ0ZW5zYW9fZGlhYmV0ZXNfZXRjLA0KICAgIG9yaWVudGFjYW9fcG9saXRpY2EgPSBub3Nfc2FiZW1vc19xdWVfcXVlc3RvZXNfcG9saXRpY2FzX3Nhb19kZW5zYXNfZV9tZXJlY2VtX3VtYV9lc3BlY2lhbF9hdGVuY2FvX25vX2VudGFudG9fZW1fcmVsYWNhb19hX29yaWVudGFjYW9fcG9saXRpY2FfZXVfbWVfY29uc2lkZXJvDQogICkNCmBgYA0KDQojIyMgVHJhbnNmb3JtIGludG8gZmFjdG9yDQoNCg0KYGBge3J9DQpkcyA8LSBkcyAlPiUgDQogIG11dGF0ZShhY3Jvc3MoYyhmaWNhX2VtX2Nhc2EsDQogICAgICAgICAgICAgICAgICB0ZW1fc2FpZG9fZGVfY2FzYSwNCiAgICAgICAgICAgICAgICAgIGZhbG91X2ZhbWlsaWFfcGVzc29hbG1lbnRlLA0KICAgICAgICAgICAgICAgICAgZmFsb3VfZmFtaWxpYV90ZWxlZm9uZSwNCiAgICAgICAgICAgICAgICAgIGZhbG91X2FtaWdvc190ZWxlZm9uZSwNCiAgICAgICAgICAgICAgICAgIHRlc3RvdV9jb3JvbmF2aXJ1cywNCiAgICAgICAgICAgICAgICAgIGNvbmhlY2VfYWxndWVtX2Nvcm9uYXZpcnVzLA0KICAgICAgICAgICAgICAgICAgc2VndWVfcmVjb21lbmRhY29lcywNCiAgICAgICAgICAgICAgICAgIGNvbmNvcmRvX2NvdmlkX3ByZW9jdXBhY2FvX3NhdWRlLA0KICAgICAgICAgICAgICAgICAgY29uY29yZG9fcXVhcmVudGVuYSwNCiAgICAgICAgICAgICAgICAgIHRyYWJhbGhvX2FudGVzX3F1YXJlbnRlbmEsDQogICAgICAgICAgICAgICAgICB0cmFiYWxob19hZ29yYV9xdWFyZW50ZW5hLA0KICAgICAgICAgICAgICAgICAgYXJlYV9wcm9maXNzYW8sDQoNCiAgICAgICAgICAgICAgICAgIHByZW9jdXBhY2FvX3BhZ2FyX2NvbnRhLA0KICAgICAgICAgICAgICAgICAgcGVuc2FfZW1fYWRpYXJfcGFnYW1lbnRvLA0KICAgICAgICAgICAgICAgICAgcHJlb2N1cGFjYW9fZWNvbm9taWFfZ2VyYWwsDQogICAgICAgICAgICAgICAgICBwcmVvY3VwYWNhb19zaXR1YWNhb19maW5hbmNlaXJhLA0KICAgICAgICAgICAgICAgICAgcHJlb2N1cGFjYW9fc3VhX3NhdWRlLA0KICAgICAgICAgICAgICAgICAgcHJlb2N1cGFjYW9fc2F1ZGVfYW1pZ29zX2ZhbWlsaWEsDQogICAgICAgICAgICAgICAgICBwcmVvY3VwYWNhb19jb2VzYW9fc29jaWFsLA0KICAgICAgICAgICAgICAgICAgcHJlb2N1cGFjYW9fcHJvZHV0b3NfYWxpbWVudGFjYW9faGlnaWVuZV9tZWRpY2FtZW50b3MsDQogICAgICAgICAgICAgICAgICBwcmVvY3VwYWNhb19wcmVjb19wcm9kdXRvcywNCiAgICAgICAgICAgICAgICAgIHByZW9jdXBhY2FvX3ByZWNvX2Fjb2VzLA0KICAgICAgICAgICAgICAgICAgcHJlb2N1cGFjYW9fcmVhbGl6YWNhb19lc2NvbGFyX2ZpbGhvLA0KICAgICAgICAgICAgICAgICAgYmViaWRhX3F1ZV91c2EsDQogICAgICAgICAgICAgICAgICBzZXhvLA0KICAgICAgICAgICAgICAgICAgZXNjb2xhcmlkYWRlLA0KICAgICAgICAgICAgICAgICAgZXN0YWRvLA0KICAgICAgICAgICAgICAgICAgY2lkYWRlLA0KICAgICAgICAgICAgICAgICAgcGxhbm9fc2F1ZGUsDQogICAgICAgICAgICAgICAgICBjb21vX3ZpdmUsDQogICAgICAgICAgICAgICAgICByZW5kYV9mYW1pbGlhcl9tZW5zYWwsDQogICAgICAgICAgICAgICAgICBwZXNzb2FzX2VtX3Jpc2NvX2Nhc2EsDQogICAgICAgICAgICAgICAgICBvcmllbnRhY2FvX3BvbGl0aWNhKSwNCiAgICAgICAgICAgICAgICBmYWN0b3IpKQ0KYGBgDQoNCiMjIyBGaXggc29tZSBmYWN0b3IgbGV2ZWxzDQoNCkZpY2FyIGVtIGNhc2ENCg0KYGBge3J9DQpkcyA8LSBkcyAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGZpY2FfZW1fY2FzYSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiRW50cmUgMSBhIDQgaG9yYXMgcG9yIGRpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudHJlIDUgYSA4IGhvcmFzIHBvciBkaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW50cmUgOSBhIDEyIGhvcmFzIHBvciBkaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW50cmUgMTMgYSAxNiBob3JhcyBwb3IgZGlhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudHJlIDE3IGEgMjAgaG9yYXMgcG9yIGRpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIDIwIGhvcmFzIHBvciBkaWEgb3UgbyBkaWEgdG9kbyIpKSkNCmBgYA0KDQpTYWkgZGUgY2FzYQ0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnModGVtX3NhaWRvX2RlX2Nhc2EpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk5lbmh1bWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIHZleiBwb3IgZGlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMiB2ZXplcyBwb3IgZGlhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMgdmV6ZXMgcG9yIGRpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIDMgdmV6ZXMgcG9yIGRpYSIpKSkNCmBgYA0KDQpGYWxvdSBmYW1pbGlhIHBlc3NvYWxtZW50ZQ0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoZmFsb3VfZmFtaWxpYV9wZXNzb2FsbWVudGUpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk5lbmh1bWEiKSkpIA0KDQpgYGANCg0KDQpQcmVvY3VwYWNhbyBjb3ZpZCBlIHNhdWRlDQoNCmBgYHtyfQ0KZHMgPC0gZHMgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjb25jb3Jkb19xdWFyZW50ZW5hLCBjb25jb3Jkb19jb3ZpZF9wcmVvY3VwYWNhb19zYXVkZSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiRXUgZGlzY29yZG8gZm9ydGVtZW50ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV1IGRpc2NvcmRvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXN0b3UgbmV1dHJvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV1IGNvbmNvcmRvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV1IGNvbmNvcmRvIGZvcnRlbWVudGUiKSkpDQpgYGANCg0KcHJlb2N1cGFjYW8gZ2VyYWwNCg0KYGBge3J9DQpkcyA8LSBkcyAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJwcmVvY3VwYWNhb18iKSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTmVuaHVtYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvdWNhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzdGFudGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmVtYSIpKSkNCg0KZHMgJT4lIGNvdW50KHByZW9jdXBhY2FvX2NvZXNhb19zb2NpYWwpDQpgYGANCg0KUXVhbnRvX3RlbXBvX3ZvY2VfYWNoYV9xdWVfcXVlX2FfdmlkYV92b2x0YXJhX2FvX25vcm1hbA0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMocXVhbnRvX3RlbXBvX3ZvY2VfYWNoYV9xdWVfcXVlX2FfdmlkYV92b2x0YXJhX2FvX25vcm1hbCksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiQW50ZXMgZG8gc2VndW5kbyBzZW1lc3RyZSBkZSAyMDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gc2VndW5kbyBzZW1lc3RyZSBkZSAyMDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU8OzIGVtIDIwMjEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAyMiBvdSBkZXBvaXMiKSkpDQpgYGANCg0KRnVtbw0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYW50ZXNfZGFfcXVhcmVudGVuYV9jb3JvbmF2aXJ1c192b2NlX2Z1bWF2YSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTsOjbywgbsOjbyBmdW1hdmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRyZSAxIGUgNSBjaWdhcnJvIHBvciBkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdMOpIDIwIGNpZ2Fycm9zIHBvciBkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIDIwIGNpZ2Fycm9zIHBvciBkaWEiKSkpDQpgYGANCg0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYWdvcmFfZHVyYW50ZV9hX3F1YXJlbnRlbmFfY29yb25hdmlydXNfdm9jZV9mdW1hKSwgfmZjdF9yZWxldmVsKC4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJOw6NvLCBuw6NvIGZ1bW8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnRyZSAxIGUgNSBjaWdhcnJvIHBvciBkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdMOpIDIwIGNpZ2Fycm9zIHBvciBkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWlzIGRlIDIwIGNpZ2Fycm9zIHBvciBkaWEiKSkpDQpgYGANCg0KQmViaWRhDQoNCmBgYHtyfQ0KZHMgPC0gZHMgJT4lIA0KICBtdXRhdGVfYXQodmFycyhhbnRlc19kYV9xdWFyZW50ZW5hX2Nvcm9uYXZpcnVzX3ZvY2VfYmViaWEpLCB+ZmN0X3JlbGV2ZWwoLiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk7Do28sIG7Do28gYmViaWEiKSkpDQpgYGANCg0KYGBge3J9DQpkcyA8LSBkcyAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGFnb3JhX2R1cmFudGVfYV9xdWFyZW50ZW5hX2Nvcm9uYXZpcnVzX3ZvY2VfYmViZSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTsOjbywgbsOjbyBiZWJvIikpKQ0KYGBgDQoNCg0KRXhlcmNpY2lvcyBmw61zaWNvcw0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYW50ZXNfZGFfcXVhcmVudGVuYV9jb3JvbmF2aXJ1c192b2NlX2ZhemlhX2V4ZXJjaWNpb3NfZmlzaWNvcywgYWdvcmFfZHVyYW50ZV9hX3F1YXJlbnRlbmFfY29yb25hdmlydXNfdm9jZV9mYXpfZXhlcmNpY2lvc19maXNpY29zKSwgfmZjdF9yZWxldmVsKC4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJOw6NvLCBuZW5odW0iLA0KICAgICAgICAgICJQb3VjbyAoMSB2ZXogcG9yIHNlbWFuYSkiLA0KICAgICAgICAgICJNb2RlcmFkbyAoMiBhIDMgdmV6ZXMgcG9yIHNlbWFuYSkiLA0KICAgICAgICAgICJNdWl0byAobWFpcyBxdWUgMyB2ZXplcyBwb3Igc2VtYW5hKSIpKSkNCmBgYA0KDQpFc2NvbGFyaWRhZGUNCg0KYGBge3J9DQpkcyA8LSBkcyAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGVzY29sYXJpZGFkZSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiRW5zaW5vIGZ1bmRhbWVudGFsIGluY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnNpbm8gZnVuZGFtZW50YWwgY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnNpbm8gbcOpZGlvIGluY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnNpbm8gbcOpZGlvIGNvbXBsZXRvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5zaW5vIHN1cGVyaW9yIGluY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnNpbm8gc3VwZXJpb3IgY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQw7NzLWdyYWR1YcOnw6NvIikpKQ0KYGBgDQoNCg0KRXN0YWRvIGNpdmlsDQoNCmBgYHtyfQ0KZHMgJT4lIGNvdW50KGVzdGFkb19jaXZpbCkNCmBgYA0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSBtdXRhdGUoZXN0YWRvX2NpdmlsID0gZmFjdG9yKGVzdGFkb19jaXZpbCkpDQpgYGANCg0KDQpSaW8gZSBzYW8gcGF1bG8NCg0KYGBge3J9DQpkcyA8LSBkcyAlPiUgDQogIG11dGF0ZShyaW9fc3AgPSAgY2FzZV93aGVuKA0KICAgIGVzdGFkbyA9PSAiUmlvIGRlIEphbmVpcm8gKFJKKSIgfiAiUkoiLA0KICAgIGVzdGFkbyA9PSAiU8OjbyBQYXVsbyAoU1ApIiB+ICJTUCIsDQogICAgaXMubmEoZXN0YWRvKSB+IE5BX2NoYXJhY3Rlcl8sDQogICAgVFJVRSB+ICJPdXRyb3MiKSkNCmBgYA0KDQoNCmBgYHtyfQ0KZHMgPC0gZHMgJT4lIG11dGF0ZShyaW9fc3AgPSBmYWN0b3IocmlvX3NwKSkNCmBgYA0KDQoNClF1YW50b3MgZmlsaG9zDQoNCmBgYHtyfQ0KZHMgPC0gZHMgJT4lIA0KICBtdXRhdGVfYXQodmFycyhxdWFudG9zX2ZpbGhvcyksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiTmVuaHVtIikpKQ0KYGBgDQoNCg0KUGVzc29hcyBuYSBjYXNhDQoNCmBgYHtyfQ0KZHMgPC0gZHMgJT4lIA0KICBtdXRhdGUocGVzc29hc19uYV9jYXNhID0gYXMubnVtZXJpYyhwZXNzb2FzX25hX2Nhc2EpKQ0KYGBgDQoNCg0KUGVzc29hcyBlbSByaXNjbw0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMocGVzc29hc19lbV9yaXNjb19jYXNhKSwgfmZjdF9yZWxldmVsKC4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJOZW5odW1hIikpKQ0KDQpkcyAlPiUgY291bnQocGVzc29hc19lbV9yaXNjb19jYXNhKQ0KYGBgDQoNCg0KUmVuZGEgZmFtaWxpYXINCg0KYGBge3J9DQpkcyA8LSBkcyAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHJlbmRhX2ZhbWlsaWFyX21lbnNhbCksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiQXTDqSBSJCAxLjkwOCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1haXMgZGUgUiQgMS45MDggYXTDqSBSJCAyLjg2MiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1haXMgZGUgUiQgMi44NjIgYXTDqSBSJCA1LjcyNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1haXMgZGUgUiQgNS43MjQgYXTDqSBSJCA5LjU0MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1haXMgZGUgUiQgOS41NDAgYXTDqSBSJCAxNC4zMTAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2ltYSBkZSBSJCAxNC4zMTAgYXRlIFIkIDIzLjg1MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjaW1hIGRlIFIkIDIzLjg1MCIpKSkNCmBgYA0KDQoNCg0KT3JpZW50YcOnw6NvIHBvbMOtdGljYQ0KDQpgYGB7cn0NCmRzIDwtIGRzICU+JSANCiAgbXV0YXRlX2F0KHZhcnMob3JpZW50YWNhb19wb2xpdGljYSksIH5mY3RfcmVsZXZlbCguLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiU291IGFwb2zDrXRpY28iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZSBlc3F1ZXJkYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlIGNlbnRybyBlc3F1ZXJkYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlIGNlbnRybyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlIGNlbnRybyBkaXJlaXRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGUgZGlyZWl0YSIpKSkNCmBgYA0KDQoNCg0KDQojIyBFeHBvcnQgZGF0YXNldA0KDQpgYGB7cn0NCndyaXRlLmNzdihkcywgImRzX2NvdmlkX2Jvb2suY3N2Iiwgcm93Lm5hbWVzID0gRikNCmBgYA0KDQoNCiMjIERvbmUNCg0KDQo=