Introducción

Para este análisis se contó con los siguentes datasets:

1. Exportaciones madera

Principales compañías exportadoras de madera

exportaciones <-
    list.files(path = "~/r_projects/chompiras/data partidas arancelarias/exportaciones",
               pattern = "*.xlsx", 
               full.names = T) %>% 
    map_df(~read_excel(.,skip = 5, col_types = c("text","text","text","text","date","text","text","text","numeric","numeric","numeric","text","numeric","text","numeric","numeric","numeric","text","text","text","text","text","text","text","text","text","text","text","text","text","text","text"))) %>% 
  as_tibble() %>% 
   separate(
    Fecha, into =c('anio','mes','dia')
  ) %>% 
  filter(str_detect(`Partida Aduanera`,"^44|9403600000|9403500000|9401610000|9401690000|9403300000")) %>% 
  distinct()## Versión nueva

(Acumulado 2012-2020)

2020

2019

2018

2017

2016

2015

2014

2013

DataViz Principales compañías exportadoras de madera

Por Valor FOB (US$)

[1] -0.03972603

Por Peso Neto (Kg)

[1] -0.03972603

Principales destinos de la madera exportada

exportaciones %>% 
  group_by(`Pais de Destino`) %>% 
  summarise(
    valor_fob_us = sum(`U$ FOB Tot`,na.rm = T),
    kg_neto = sum(`Kg Neto`,na.rm = T)
  ) %>% 
  mutate(
    per_valor_fob = valor_fob_us*100/sum(valor_fob_us, na.rm = T),
    per_peso_neto = kg_neto*100/sum(kg_neto, na.rm = T)
  ) %>% 
  arrange(desc(valor_fob_us)) %>% 
  datatable(colnames = c("País de Destino","Valor FOB (US$)","Peso Neto (Kg)","Valor FOB (%)","Peso Neto (%)")) %>% 
  DT::formatRound(columns =2:5 ,digits = 2, mark = ".", dec.mark = ",") 

Principales compañías extranjeras que importan madera del Perú

Nota: Estas compañías también puede ser agencias de aduanas, por lo tanto, no necesariamente el receptor final de la madera.

exportaciones %>% 
  group_by(Importador) %>% 
  summarise(
    valor_fob_us = sum(`U$ FOB Tot`,na.rm = T),
    kg_neto = sum(`Kg Neto`, na.rm = T)
  ) %>% 
  mutate(
    per_valor_fob = valor_fob_us*100/sum(valor_fob_us, na.rm = T),
    per_peso_neto = kg_neto*100/sum(kg_neto, na.rm = T)
  ) %>% 
  arrange(desc(valor_fob_us)) %>% 
  datatable(colnames = c("Exportador","Valor FOB (US$)","Peso Neto (Kg)","Valor FOB (%)","Pesto Neto (%)")) %>% 
  DT::formatRound(columns =2:5 ,digits = 2, mark = ".", dec.mark = ",") 

Evolución de las exportaciones de madera

Data

exportaciones %>% 
    group_by(anio) %>% 
    summarise(
        kg_neto = sum(`Kg Neto`, na.rm = T),
        valor_fob = sum(`U$ FOB Tot`, na.rm = T)
    ) %>% 
  arrange(desc(anio)) %>% 
  datatable(colnames = c("Año","Peso Neto (Kg)","Valor Fob (US$)")) %>% 
  DT::formatRound(columns =2:3 ,digits = 2, mark = ".", dec.mark = ",") 

Viz

Por Valor FOB US$

Por Kg Neto

2. Investigaciones fiscales sobre delitos ambientales en Perú

delitos_ambientales_all <- read_sheet("https://docs.google.com/spreadsheets/d/1bJxzQKdUzXoQBIPnVSkOOfQ2tJ9UAJKsiX3fDnubyAU/edit#gid=1582440060", sheet = "DATA UNIDA", col_types = "cccccccccccccccccc") %>% 
  filter(!is.na(Imputado))
Reading from "Delitos Ambientales (Actualización 29.01.20)"
Range "'DATA UNIDA'"
delitos_ambientales_all$Imputado <- toupper(stri_trans_general(gsub(",|\\.|-", "", delitos_ambientales_all$Imputado), "Latin-ASCII")) 

Imputados con más investigaciones

delitos_ambientales_all %>% 
  group_by(Imputado) %>% 
  summarise(
    n_investigaciones = n()
  ) %>% 
  arrange(desc(n_investigaciones)) %>% 
  datatable(colnames = c("Imputado","Cantidad de investigaciones")) %>% 
  DT::formatRound(columns =2:2 ,digits = 0, mark = ".", dec.mark = ",") 

Evolución de la cantidad de investigaciones por año

Data

delitos_ambientales_all %>% 
  mutate(
    fecha_expediente = case_when(
      str_detect(Expediente, "2011") ~ "2011",
      str_detect(Expediente, "2012") ~ "2012",
      str_detect(Expediente, "2013") ~ "2013",
      str_detect(Expediente, "2014") ~ "2014",
      str_detect(Expediente, "2015") ~ "2015",
      str_detect(Expediente, "2016") ~ "2016",
      str_detect(Expediente, "2017") ~ "2017",
      str_detect(Expediente, "2018") ~ "2018",
      str_detect(Expediente, "2019") ~ "2019")) %>% 
  
  group_by(fecha_expediente) %>% 
  summarise(
    n_investigaciones = n_distinct(Expediente, `Nº Legajo`)
  ) %>% 
  arrange(desc(fecha_expediente)) %>% 
  datatable(colnames = c("Fecha Expediente","Cantidad de Investigaciones")) %>% 
  DT::formatRound(columns =2:2 ,digits = 0, mark = ".", dec.mark = ",") 

Viz

delitos_ambientales_all %>% 
  mutate(
    fecha_expediente = case_when(
      str_detect(Expediente, "2011") ~ "2011",
      str_detect(Expediente, "2012") ~ "2012",
      str_detect(Expediente, "2013") ~ "2013",
      str_detect(Expediente, "2014") ~ "2014",
      str_detect(Expediente, "2015") ~ "2015",
      str_detect(Expediente, "2016") ~ "2016",
      str_detect(Expediente, "2017") ~ "2017",
      str_detect(Expediente, "2018") ~ "2018",
      str_detect(Expediente, "2019") ~ "2019")) %>% 
  ggplot(aes(x=fecha_expediente))+
  geom_bar()+
  labs(x="Año", y="Cantidad de Investigaciones")+
  scale_y_continuous(label = scales::number_format(big.mark = ".",decimal.mark = ","))

Delitos más comunes

delitos_ambientales_all %>% 
  group_by(Materia) %>% 
  summarise(
    n_casos = n_distinct(`Nº Legajo`,Expediente)
  ) %>% 
  arrange(desc(n_casos)) %>% 
  datatable(colnames = c("Materia o delito","Cantidad de Casos")) %>% 
  DT::formatRound(columns =2:2 ,digits = 0, mark = ".", dec.mark = ",") 

Ubicación de las investigaciones

Ranking

delitos_ambientales_all %>% 
  group_by(`Distrito Judicial`) %>% 
  summarise(
    n_casos = n_distinct(`Nº Legajo`, Expediente)
  ) %>% arrange(desc(n_casos)) %>% 
  datatable(colnames = c("Distrito Judicial","Cantidad de Casos")) %>% 
  DT::formatRound(columns =2:2 ,digits = 0, mark = ".", dec.mark = ",") 

3. Infracciones Osinfor

Ranking infractores

Resumen

infractores_osinfor_all %>% 
  group_by(Titular) %>% 
  summarise(
    n_infracciones = n(),
    multa_total = sum(`Valor multa (S/)`,na.rm = T)  
  ) %>% arrange(desc(multa_total)) %>% 
  datatable(colnames = c("Titular","Cantidad infracciones", "Multa total (S/)")) %>% 
  DT::formatRound(columns =3:3 ,digits = 2, mark = ".", dec.mark = ",") 

Solo personas jurídicas (No comunidades)

infractores_osinfor_all %>% 
  filter(!str_detect(Titular, regex("comunidad",ignore_case = T))) %>% 
  group_by(Titular) %>% 
  summarise(
    n_infracciones = n(),
    multa_total = sum(`Valor multa (S/)`,na.rm = T)  
  ) %>% arrange(desc(multa_total)) %>% 
  datatable(colnames = c("Titular","Cantidad infracciones", "Multa total (S/)")) %>% 
  DT::formatRound(columns =3:3 ,digits = 2, mark = ".", dec.mark = ",") 

Por tipo de infracción

infractores_osinfor_all %>% 
  group_by(Infracciones) %>% 
  summarise(
    n_infracciones = n(),
    multa_total = sum(`Valor multa (S/)`,na.rm = T)  
  ) %>% arrange(desc(multa_total)) %>% 
  datatable(colnames = c("Infracciones","Cantidad infracciones", "Multa total (S/)")) %>% 
  DT::formatRound(columns =3:3 ,digits = 2, mark = ".", dec.mark = ",") 

Por modalidad de aprovechamiento

infractores_osinfor_all %>% 
  group_by(Modalidad_de_Aprovechamiento) %>% 
  summarise(
    n_infracciones = n(),
    multa_total = sum(`Valor multa (S/)`,na.rm = T)  
  ) %>% arrange(desc(multa_total)) %>% 
  datatable(colnames = c("Modalida aprovechamiento","Cantidad infracciones", "Multa total (S/)")) %>% 
  DT::formatRound(columns =3:3 ,digits = 2, mark = ".", dec.mark = ",") 

Evolución de infracciones

Ranking

infractores_osinfor_all %>% 
  group_by(Fecha) %>% 
  summarise(
    n_infracciones = n(),
    monto_multa = sum(`Valor multa (S/)`,na.rm = T)
  ) %>% arrange(desc(Fecha)) %>% 
  datatable(colnames = c("Fecha","Cantidad infracciones", "Multa total (S/)")) %>% 
  DT::formatRound(columns =3:3 ,digits = 2, mark = ".", dec.mark = ",") 

Viz

infractores_osinfor_all %>% 
  ggplot(aes(Fecha, `Valor multa (S/)`))+
  geom_col() +
  labs(x="Año", y="Valor Multa (S/)")+
  scale_y_continuous(label = scales::number_format(big.mark = ".",decimal.mark = ","))

Ubicación de infracciones

infractores_osinfor_all %>% 
  group_by(Departamento) %>% 
  summarise(
    n_infracciones = n(),
    n_multa = sum(`Valor multa (S/)`, na.rm = T)
  ) %>% arrange(desc(n_infracciones)) %>% 
  datatable(colnames = c("Departamento","Cantidad infracciones", "Multa total (S/)")) %>% 
  DT::formatRound(columns =3:3 ,digits = 2, mark = ".", dec.mark = ",") 

4. Match de los datasets

Importadoras con antecedentes

Se muestra un resumen de las empresas exportadores de madera que tienen infraciones de Osinfor. Para realizar el cruce con la investigaciones fiscales se necesita crear un dataset con los representantes legales de los importadores, debido a que es poco común procesar a personas jurídicas como responsables, en su lugar se imputa a los representantes legales o apoderados. Además que un mismo representante legal puede estar vinculada a otras empresas. Por ejemplo, Jose Luis Ascencio Jurado es Gerente General de Inversiones La Oroza, la mayor exportadora de madera en el Perú, y está siendo investigado en la Fiscalía Especializada en Materia Ambiental de Loreto - Maynas / Cuarto Juzgado de Investigacion Preparatoria de Loreto, por un caso de la empresa Industria Forestal Iquitos y por Delito contra los bosques o formaciones Boscosas (Art. 310)||TIP_0206.

exportaciones %>% 
  group_by(`Cod. Tributario`, Exportador) %>% 
  summarise(
    valor_fob = sum(`U$ FOB Tot`,na.rm = T),
    kg_neto = sum(`Kg Neto`, na.rm = T)
  ) %>% arrange(desc(valor_fob)) %>% 
  rename(ruc = `Cod. Tributario`) %>% 
  inner_join(
    infractores_osinfor_all %>% 
      rename(ruc =`N_Documento(DNI/RUC)`), by = "ruc" 
  ) %>% 
  group_by(ruc, Exportador, valor_fob, kg_neto) %>% 
  summarise(
    n_infracciones_osinfor = n(),
    multa = sum(`Valor multa (S/)`,na.rm = T)
  ) %>% arrange(desc(valor_fob)) %>% 
  datatable(colnames = c("RUC","Exportador", "Valor FOB (US$)","Peso Neto (Kg)","Infracciones Osinfor","Multa total (S/)")) %>% 
  DT::formatRound(columns =3:6 ,digits = 2, mark = ".", dec.mark = ",") 
NA

Imputados que cometieron infracciones impuesta por Osinfor y estan investigadas en Fiscalía

Se hizo un match de los infractores e investigados en fiscalía para conocer a personas naturales o jurídicas que son recurrentes en actos perjudiciales para el sector maderero

nombres <- read_sheet("https://docs.google.com/spreadsheets/d/1wgyjFSx73TPpon6v_DLaUIekQ836wFuzdle7XkLxoLo/edit#gid=1344915534", sheet ="nombres",col_types = "ccc")
nombres %>% 
  left_join(infractores_osinfor_all %>% 
               rename(nombre_infractores = Titular), by = "nombre_infractores") %>% 
  group_by(nombre_delitos_ambientales, nombre_infractores) %>% 
  summarise(
    n_infracciones = n(),
    multa = sum(`Valor multa (S/)`, na.rm = T)
  ) %>% 
  left_join(delitos_ambientales_all %>% 
              rename(nombre_delitos_ambientales = Imputado), by = "nombre_delitos_ambientales") %>% 
  group_by(nombre_delitos_ambientales, nombre_infractores, n_infracciones, multa) %>% 
  summarise(
    n_investigaciones = n_distinct(`Nº Legajo`, Expediente)
  ) %>% arrange(desc(multa)) %>% 
  datatable(colnames = c("Nombre (Delitos ambientales)","Nombre (Infractores Osinfor)", "Cantidad infracciones","Multa total (S/)", "Cantidad investigaciones")) %>% 
  DT::formatRound(columns =4:4 ,digits = 2, mark = ".", dec.mark = ",") 
NA
LS0tCnRpdGxlOiAiUmVwb3J0ZSBhbsOhbGlzaXMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKYGBge3IgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShncmlkKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShzdHJpbmdpKQpsaWJyYXJ5KERUKQpsaWJyYXJ5KHJlYWR4bCkKYGBgCgpgYGB7ciBldmFsPUZBTFNFLCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiNEb2N1bWVudGF0aW9uCi0gaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNC8wOC8wNC9iZWF1dGlmdWwtcGxvdHRpbmctaW4tci1hLWdncGxvdDItY2hlYXRzaGVldC0zLwotIGh0dHBzOi8vZ2l0aHViLmNvbS9yb3BlbnNjaS9wbG90bHkvaXNzdWVzLzEyMjQKLSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80Mjc2MzI4MC9yLWdncGxvdC1hbmQtcGxvdGx5LWF4aXMtbWFyZ2luLXdvbnQtY2hhbmdlCi0gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTE5ODczMDgvbnVtYmVyLWZvcm1hdHRpbmctYXhpcy1sYWJlbHMtaW4tZ2dwbG90MgotIGh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vRFQvCiAgCmBgYAoKCiMgKipJbnRyb2R1Y2Npw7NuKioKClBhcmEgZXN0ZSBhbsOhbGlzaXMgc2UgY29udMOzIGNvbiBsb3Mgc2lndWVudGVzIGRhdGFzZXRzOiAKCi0gRXhwb3J0YWNpb25lcyBkZSBtYWRlcmEgMjAxMi0yMDIwKHNldGllbWJyZSksIHNlZ8O6biBsaXN0YSBkZSBwYXJ0aWRhcyBhcmFuY2VsYXJpYXMuIAotIExpc3RhIGRlIHBhcnRpZGFzIGFyYW5jZWxhcmlhcyByZWxhY2lvbmFkYXMgYSBtYWRlcmEuCi0gTGlzdGEgZGUgaW5mcmFjdG9yZXMgYW1iaWVudGFsZXMgT3NpbmZvciAob2N0dWJyZSAyMDIwKQotIEludmVzdGlnYWNpb25lcyBlbiBmaXNjYWzDrWEgc29icmUgZGVsaXRvcyBhbWJpZW50YWxlcyAoZW5lcm8gMjAyMCkgCi0gSW50ZXJ2ZW5jaW9uZXMgZm9yZXN0YWxlcyBTZXJmb3IgMjAxMy0yMDE5Ci0gSGFsbGF6Z29zIG1hZGVyYWJsZXMgU3VuYXQgMjAxNy0yMDIwCi0gSW5tb3ZpbGl6YWNpw7NuIG1hZGVyYSAyMDEwLTIwMjAKCgojIyAqKjEuIEV4cG9ydGFjaW9uZXMgbWFkZXJhKioKCiMjIFByaW5jaXBhbGVzIGNvbXBhw7HDrWFzIGV4cG9ydGFkb3JhcyBkZSBtYWRlcmEgey50YWJzZXR9CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQpleHBvcnRhY2lvbmVzX29sZCA8LSBnb29nbGVzaGVldHM0OjpyZWFkX3NoZWV0KCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xblNoVDBuSWZWSmN4RFFwcTVTNVpPY0Y1ZEJ5aWJGWDFzME5oLTlsb3czOC9lZGl0I2dpZD0wIiwgc2hlZXQgPSAiVG90YWwgZXhwb3J0YWNpb25lcyIpCmV4cG9ydGFjaW9uZXNfb2xkIDwtIGV4cG9ydGFjaW9uZXNfb2xkICU+JSAgCiAgc2VwYXJhdGUoCiAgICBGZWNoYSwgaW50byA9YygnYW5pbycsJ21lcycsJ2RpYScpICMjIFZlcnNpw7NuIGFudGlndWEKICApCmBgYAoKYGBge3J9CmV4cG9ydGFjaW9uZXMgPC0KICAgIGxpc3QuZmlsZXMocGF0aCA9ICJ+L3JfcHJvamVjdHMvY2hvbXBpcmFzL2RhdGEgcGFydGlkYXMgYXJhbmNlbGFyaWFzL2V4cG9ydGFjaW9uZXMiLAogICAgICAgICAgICAgICBwYXR0ZXJuID0gIioueGxzeCIsIAogICAgICAgICAgICAgICBmdWxsLm5hbWVzID0gVCkgJT4lIAogICAgbWFwX2RmKH5yZWFkX2V4Y2VsKC4sc2tpcCA9IDUsIGNvbF90eXBlcyA9IGMoInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJkYXRlIiwidGV4dCIsInRleHQiLCJ0ZXh0IiwibnVtZXJpYyIsIm51bWVyaWMiLCJudW1lcmljIiwidGV4dCIsIm51bWVyaWMiLCJ0ZXh0IiwibnVtZXJpYyIsIm51bWVyaWMiLCJudW1lcmljIiwidGV4dCIsInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJ0ZXh0IikpKSAlPiUgCiAgYXNfdGliYmxlKCkgJT4lIAogICBzZXBhcmF0ZSgKICAgIEZlY2hhLCBpbnRvID1jKCdhbmlvJywnbWVzJywnZGlhJykKICApICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsIl40NHw5NDAzNjAwMDAwfDk0MDM1MDAwMDB8OTQwMTYxMDAwMHw5NDAxNjkwMDAwfDk0MDMzMDAwMDAiKSkgJT4lIAogIGRpc3RpbmN0KCkjIyBWZXJzacOzbiBudWV2YQpgYGAKCiMjIyAoQWN1bXVsYWRvIDIwMTItMjAyMCkKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmV4cG9ydGFjaW9uZXMgJT4lIAogIGdyb3VwX2J5KEV4cG9ydGFkb3IpICU+JSAKICBzdW1tYXJpc2UoCiAgICB2YWxvcl9mb2JfdXMgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpLAogICAgcGVzb19uZXRvX2tnID0gc3VtKGBLZyBOZXRvYCwgbmEucm0gPSBUKSwKICAgIG5fcGFpc2VzX2Rlc3Rpbm8gPSBuX2Rpc3RpbmN0KGBQYWlzIGRlIERlc3Rpbm9gKQogICkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2JfdXMqMTAwL3N1bSh2YWxvcl9mb2JfdXMsIG5hLnJtID0gVCksCiAgICBwZXJfcGVzb19uZXRvID0gcGVzb19uZXRvX2tnKjEwMC9zdW0ocGVzb19uZXRvX2tnLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgCiAgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYl91cykpICU+JSAKICBkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJFeHBvcnRhZG9yIiwiVmFsb3IgRk9CIChVUyQpIiwiUGVzbyBOZXRvIChLZykiLCJQYWlzZXMgRGVzdGlubyIsIlZhbG9yIEZPQiAoJSkiLCJQZXN0byBOZXRvICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTI6NiAsZGlnaXRzID0gMiwgbWFyayA9ICIuIixkZWMubWFyayA9ICIsIikgCgpgYGAKCiMjIyAyMDIwCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmV4cG9ydGFjaW9uZXMgJT4lCiAgZmlsdGVyKGFuaW8gPT0gJzIwMjAnKSAlPiUgCiAgZ3JvdXBfYnkoRXhwb3J0YWRvcikgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbG9yX2ZvYl91cyA9IHN1bShgVSQgRk9CIFRvdGAsIG5hLnJtID0gVCksCiAgICBwZXNvX25ldG9fa2cgPSBzdW0oYEtnIE5ldG9gLCBuYS5ybSA9IFQpLAogICAgbl9wYWlzZXNfZGVzdGlubyA9IG5fZGlzdGluY3QoYFBhaXMgZGUgRGVzdGlub2ApCiAgKSAlPiUgCiAgbXV0YXRlKAogICAgcGVyX3ZhbG9yX2ZvYiA9IHZhbG9yX2ZvYl91cyoxMDAvc3VtKHZhbG9yX2ZvYl91cywgbmEucm0gPSBUKSwKICAgIHBlcl9wZXNvX25ldG8gPSBwZXNvX25ldG9fa2cqMTAwL3N1bShwZXNvX25ldG9fa2csIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2ModmFsb3JfZm9iX3VzKSkgJT4lIAogIGRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIkV4cG9ydGFkb3IiLCJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIE5ldG8gKEtnKSIsIlBhaXNlcyBEZXN0aW5vIiwiVmFsb3IgRk9CICglKSIsIlBlc3RvIE5ldG8gKCUpIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9Mjo2ICxkaWdpdHMgPSAyLCBtYXJrID0gIi4iLCBkZWMubWFyayA9ICIsIikgIAoKYGBgCgojIyMgMjAxOQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBvcnRhY2lvbmVzICU+JQogIGZpbHRlcihhbmlvID09ICcyMDE5JykgJT4lIAogIGdyb3VwX2J5KEV4cG9ydGFkb3IpICU+JSAKICBzdW1tYXJpc2UoCiAgICB2YWxvcl9mb2JfdXMgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpLAogICAgcGVzb19uZXRvX2tnID0gc3VtKGBLZyBOZXRvYCwgbmEucm0gPSBUKSwKICAgIG5fcGFpc2VzX2Rlc3Rpbm8gPSBuX2Rpc3RpbmN0KGBQYWlzIGRlIERlc3Rpbm9gKQogICkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2JfdXMqMTAwL3N1bSh2YWxvcl9mb2JfdXMsIG5hLnJtID0gVCksCiAgICBwZXJfcGVzb19uZXRvID0gcGVzb19uZXRvX2tnKjEwMC9zdW0ocGVzb19uZXRvX2tnLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYl91cykpICU+JSAKICBkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJFeHBvcnRhZG9yIiwiVmFsb3IgRk9CIChVUyQpIiwiUGVzbyBOZXRvIChLZykiLCJQYWlzZXMgRGVzdGlubyIsIlZhbG9yIEZPQiAoJSkiLCJQZXN0byBOZXRvICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTI6NiAsZGlnaXRzID0gMiwgbWFyayA9ICIuIiwgZGVjLm1hcmsgPSAiLCIpCmBgYAoKIyMjIDIwMTgKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwb3J0YWNpb25lcyAlPiUKICBmaWx0ZXIoYW5pbyA9PSAnMjAxOCcpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iX3VzID0gc3VtKGBVJCBGT0IgVG90YCwgbmEucm0gPSBUKSwKICAgIHBlc29fbmV0b19rZyA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICBuX3BhaXNlc19kZXN0aW5vID0gbl9kaXN0aW5jdChgUGFpcyBkZSBEZXN0aW5vYCkKICApICU+JSAKICBtdXRhdGUoCiAgICBwZXJfdmFsb3JfZm9iID0gdmFsb3JfZm9iX3VzKjEwMC9zdW0odmFsb3JfZm9iX3VzLCBuYS5ybSA9IFQpLAogICAgcGVyX3Blc29fbmV0byA9IHBlc29fbmV0b19rZyoxMDAvc3VtKHBlc29fbmV0b19rZywgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyh2YWxvcl9mb2JfdXMpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiRXhwb3J0YWRvciIsIlZhbG9yIEZPQiAoVVMkKSIsIlBlc28gTmV0byAoS2cpIiwiUGFpc2VzIERlc3Rpbm8iLCJWYWxvciBGT0IgKCUpIiwiUGVzdG8gTmV0byAoJSkiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0yOjYgLGRpZ2l0cyA9IDIsIG1hcmsgPSAiLiIsIGRlYy5tYXJrID0gIiwiKSAgCmBgYAoKIyMjIDIwMTcKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwb3J0YWNpb25lcyAlPiUKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNycpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iX3VzID0gc3VtKGBVJCBGT0IgVG90YCwgbmEucm0gPSBUKSwKICAgIHBlc29fbmV0b19rZyA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICBuX3BhaXNlc19kZXN0aW5vID0gbl9kaXN0aW5jdChgUGFpcyBkZSBEZXN0aW5vYCkKICApICU+JSAKICBtdXRhdGUoCiAgICBwZXJfdmFsb3JfZm9iID0gdmFsb3JfZm9iX3VzKjEwMC9zdW0odmFsb3JfZm9iX3VzLCBuYS5ybSA9IFQpLAogICAgcGVyX3Blc29fbmV0byA9IHBlc29fbmV0b19rZyoxMDAvc3VtKHBlc29fbmV0b19rZywgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyh2YWxvcl9mb2JfdXMpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiRXhwb3J0YWRvciIsIlZhbG9yIEZPQiAoVVMkKSIsIlBlc28gTmV0byAoS2cpIiwiUGFpc2VzIERlc3Rpbm8iLCJWYWxvciBGT0IgKCUpIiwiUGVzdG8gTmV0byAoJSkiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0yOjYgLGRpZ2l0cyA9IDIsIG1hcmsgPSAiLiIsIGRlYy5tYXJrID0gIiwiKSAKYGBgCgojIyMgMjAxNgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBvcnRhY2lvbmVzICU+JQogIGZpbHRlcihhbmlvID09ICcyMDE2JykgJT4lIAogIGdyb3VwX2J5KEV4cG9ydGFkb3IpICU+JSAKICBzdW1tYXJpc2UoCiAgICB2YWxvcl9mb2JfdXMgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpLAogICAgcGVzb19uZXRvX2tnID0gc3VtKGBLZyBOZXRvYCwgbmEucm0gPSBUKSwKICAgIG5fcGFpc2VzX2Rlc3Rpbm8gPSBuX2Rpc3RpbmN0KGBQYWlzIGRlIERlc3Rpbm9gKQogICkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2JfdXMqMTAwL3N1bSh2YWxvcl9mb2JfdXMsIG5hLnJtID0gVCksCiAgICBwZXJfcGVzb19uZXRvID0gcGVzb19uZXRvX2tnKjEwMC9zdW0ocGVzb19uZXRvX2tnLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYl91cykpICU+JSAKICBkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJFeHBvcnRhZG9yIiwiVmFsb3IgRk9CIChVUyQpIiwiUGVzbyBOZXRvIChLZykiLCJQYWlzZXMgRGVzdGlubyIsIlZhbG9yIEZPQiAoJSkiLCJQZXN0byBOZXRvICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTI6NiAsZGlnaXRzID0gMiwgbWFyayA9ICIuIiwgZGVjLm1hcmsgPSAiLCIpICAKYGBgCgojIyMgMjAxNQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBvcnRhY2lvbmVzICU+JQogIGZpbHRlcihhbmlvID09ICcyMDE1JykgJT4lIAogIGdyb3VwX2J5KEV4cG9ydGFkb3IpICU+JSAKICBzdW1tYXJpc2UoCiAgICB2YWxvcl9mb2JfdXMgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpLAogICAgcGVzb19uZXRvX2tnID0gc3VtKGBLZyBOZXRvYCwgbmEucm0gPSBUKSwKICAgIG5fcGFpc2VzX2Rlc3Rpbm8gPSBuX2Rpc3RpbmN0KGBQYWlzIGRlIERlc3Rpbm9gKQogICkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2JfdXMqMTAwL3N1bSh2YWxvcl9mb2JfdXMsIG5hLnJtID0gVCksCiAgICBwZXJfcGVzb19uZXRvID0gcGVzb19uZXRvX2tnKjEwMC9zdW0ocGVzb19uZXRvX2tnLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYl91cykpICU+JSAKICBkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJFeHBvcnRhZG9yIiwiVmFsb3IgRk9CIChVUyQpIiwiUGVzbyBOZXRvIChLZykiLCJQYWlzZXMgRGVzdGlubyIsIlZhbG9yIEZPQiAoJSkiLCJQZXN0byBOZXRvICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTI6NiAsZGlnaXRzID0gMiwgbWFyayA9ICIuIiwgZGVjLm1hcmsgPSAiLCIpIApgYGAKCiMjIyAyMDE0CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmV4cG9ydGFjaW9uZXMgJT4lCiAgZmlsdGVyKGFuaW8gPT0gJzIwMTQnKSAlPiUgCiAgZ3JvdXBfYnkoRXhwb3J0YWRvcikgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbG9yX2ZvYl91cyA9IHN1bShgVSQgRk9CIFRvdGAsIG5hLnJtID0gVCksCiAgICBwZXNvX25ldG9fa2cgPSBzdW0oYEtnIE5ldG9gLCBuYS5ybSA9IFQpLAogICAgbl9wYWlzZXNfZGVzdGlubyA9IG5fZGlzdGluY3QoYFBhaXMgZGUgRGVzdGlub2ApCiAgKSAlPiUgCiAgbXV0YXRlKAogICAgcGVyX3ZhbG9yX2ZvYiA9IHZhbG9yX2ZvYl91cyoxMDAvc3VtKHZhbG9yX2ZvYl91cywgbmEucm0gPSBUKSwKICAgIHBlcl9wZXNvX25ldG8gPSBwZXNvX25ldG9fa2cqMTAwL3N1bShwZXNvX25ldG9fa2csIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2ModmFsb3JfZm9iX3VzKSkgJT4lIAogIGRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIkV4cG9ydGFkb3IiLCJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIE5ldG8gKEtnKSIsIlBhaXNlcyBEZXN0aW5vIiwiVmFsb3IgRk9CICglKSIsIlBlc3RvIE5ldG8gKCUpIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9Mjo2ICxkaWdpdHMgPSAyLCBtYXJrID0gIi4iLCBkZWMubWFyayA9ICIsIikgCmBgYAoKIyMjIDIwMTMKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwb3J0YWNpb25lcyAlPiUKICBmaWx0ZXIoYW5pbyA9PSAnMjAxMycpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iX3VzID0gc3VtKGBVJCBGT0IgVG90YCwgbmEucm0gPSBUKSwKICAgIHBlc29fbmV0b19rZyA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICBuX3BhaXNlc19kZXN0aW5vID0gbl9kaXN0aW5jdChgUGFpcyBkZSBEZXN0aW5vYCkKICApICU+JSAKICBtdXRhdGUoCiAgICBwZXJfdmFsb3JfZm9iID0gdmFsb3JfZm9iX3VzKjEwMC9zdW0odmFsb3JfZm9iX3VzLCBuYS5ybSA9IFQpLAogICAgcGVyX3Blc29fbmV0byA9IHBlc29fbmV0b19rZyoxMDAvc3VtKHBlc29fbmV0b19rZywgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyh2YWxvcl9mb2JfdXMpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiRXhwb3J0YWRvciIsIlZhbG9yIEZPQiAoVVMkKSIsIlBlc28gTmV0byAoS2cpIiwiUGFpc2VzIERlc3Rpbm8iLCJWYWxvciBGT0IgKCUpIiwiUGVzdG8gTmV0byAoJSkiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0yOjYgLGRpZ2l0cyA9IDIsIG1hcmsgPSAiLiIsIGRlYy5tYXJrID0gIiwiKSAKYGBgCgojIyBEYXRhVml6IFByaW5jaXBhbGVzIGNvbXBhw7HDrWFzIGV4cG9ydGFkb3JhcyBkZSBtYWRlcmEgey50YWJzZXR9CgojIyMgUG9yIFZhbG9yIEZPQiAoVVMkKQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBvdXQuaGVpZ2h0PScxNTAlJywgb3V0LndpZHRoPScxMDAlJ30KCnFfMjAxNSA8LSBleHBvcnRhY2lvbmVzICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNScpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxNiA8LSBleHBvcnRhY2lvbmVzICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNicpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxNyA8LSBleHBvcnRhY2lvbmVzICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNycpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxOCA8LSBleHBvcnRhY2lvbmVzICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxOCcpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxOSA8LSBleHBvcnRhY2lvbmVzICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxOScpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAyMCA8LSBleHBvcnRhY2lvbmVzICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAyMCcpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfaW1wIDwtIGJpbmRfcm93cyhxXzIwMTUsIHFfMjAxNiwgcV8yMDE3LCBxXzIwMTgsIHFfMjAxOSxxXzIwMjApCgp0b19wbG90IDwtIHFfaW1wICU+JSAKICBzZWxlY3QoRXhwb3J0YWRvcikgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGlubmVyX2pvaW4oCiAgICBleHBvcnRhY2lvbmVzICU+JSBzZWxlY3QoRXhwb3J0YWRvciwgbWVzLCBhbmlvLCBjYW50aWRhZCA9IGBLZyBOZXRvYCwgZm9iID0gYFUkIEZPQiBUb3RgKQogICkgJT4lCiAgZ3JvdXBfYnkoRXhwb3J0YWRvciwgbWVzLCBhbmlvKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgY2FudGlkYWQgPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCksCiAgICBmb2JfbWVzID0gc3VtKGZvYiwgbmEucm0gPSBUKQogICkKCgphIDwtIGdncGxvdChkYXRhID0gdG9fcGxvdCwgYWVzKAogIHg9bWVzLCB5ID0gZm9iX21lcywgY29sb3IgPSBFeHBvcnRhZG9yKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZmFjZXRfd3JhcCh+IGFuaW8pKwogIGxhYnMoeD0gIk1lcyIsIHk9IlZhbG9yIEZPQiAoVVMkKSIpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChiaWcubWFyayA9ICIuIixkZWNpbWFsLm1hcmsgPSAiLCIpKSsgI2xhYmVsPWZ1bmN0aW9uKHgpe3JldHVybihwYXN0ZSgiTXkgdmFsdWUgaXMiLCB4LCAiZGVncmVlcyIpKX0KICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGZhY2UgPSAiYm9sZCIpLCAjIHBsb3QubWFyZ2luID0gdW5pdChjKDEsMCwxLDEpLCJjbSIpLCAgICAgICAgIAogICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwwLDEsMSksImNtIikpKyAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0CiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZSA9ICJQcmluY2lwYWxlcyBleHBvcnRhZG9yYXMiKQoKYSA8LSBnZ3Bsb3RseShhLCBoZWlnaHQgPSAxMjAwLCB3aWR0aCA9IDEyMDApCgojVWJpY2FuZG8gcG9zaWNpw7NuIGRlbCAibGFiZWwiLCBwZXJvIHF1ZSBuZSByZWFsaWRhZCBlcyB1bmEgYW5vdGFjacOzbi4gUmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80Mjc2MzI4MC9yLWdncGxvdC1hbmQtcGxvdGx5LWF4aXMtbWFyZ2luLXdvbnQtY2hhbmdlCmFbWyd4J11dW1snbGF5b3V0J11dW1snYW5ub3RhdGlvbnMnXV1bWzJdXVtbJ3gnXV0gCgojQ2FtYmlhbmRvIGxhIHBvc2ljacOzbiBkZWwgImxhYmVsIgphW1sneCddXVtbJ2xheW91dCddXVtbJ2Fubm90YXRpb25zJ11dW1syXV1bWyd4J11dIDwtIC0wLjEgCmEKYGBgCgojIyMgUG9yIFBlc28gTmV0byAoS2cpCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBvdXQuaGVpZ2h0PScxNTAlJywgb3V0LndpZHRoPScxMDAlJ30KCmJiYiA8LSBnZ3Bsb3QoZGF0YSA9IHRvX3Bsb3QsIGFlcygKICB4PW1lcywgeSA9IGNhbnRpZGFkLCBjb2xvciA9IEV4cG9ydGFkb3IpKSArCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF93cmFwKH4gYW5pbykKCmdncGxvdGx5KGJiYiwgaGVpZ2h0ID0gMTIwMCwgd2lkdGggPSAxMjAwKQoKYmJiIDwtIGdncGxvdChkYXRhID0gdG9fcGxvdCwgYWVzKAogIHg9bWVzLCB5ID0gY2FudGlkYWQsIGNvbG9yID0gRXhwb3J0YWRvcikpICsKICBnZW9tX3BvaW50KCkgKwogIGZhY2V0X3dyYXAofiBhbmlvKSsKICBsYWJzKHg9ICJNZXMiLCB5PSJQZXNvIE5ldG8gKEtnKSIpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChiaWcubWFyayA9ICIuIixkZWNpbWFsLm1hcmsgPSAiLCIpKSsgI2xhYmVsPWZ1bmN0aW9uKHgpe3JldHVybihwYXN0ZSgiTXkgdmFsdWUgaXMiLCB4LCAiZGVncmVlcyIpKX0KICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGZhY2UgPSAiYm9sZCIpLCAjIHBsb3QubWFyZ2luID0gdW5pdChjKDEsMCwxLDEpLCJjbSIpLCAgICAgICAgIAogICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwwLDEsMSksImNtIikpKyAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0CiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZSA9ICJQcmluY2lwYWxlcyBleHBvcnRhZG9yYXMiKQoKYmJiIDwtIGdncGxvdGx5KGJiYiwgaGVpZ2h0ID0gMTIwMCwgd2lkdGggPSAxMjAwKQoKI1ViaWNhbmRvIHBvc2ljacOzbiBkZWwgImxhYmVsIiwgcGVybyBxdWUgbmUgcmVhbGlkYWQgZXMgdW5hIGFub3RhY2nDs24uIFJlZjogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDI3NjMyODAvci1nZ3Bsb3QtYW5kLXBsb3RseS1heGlzLW1hcmdpbi13b250LWNoYW5nZQpiYmJbWyd4J11dW1snbGF5b3V0J11dW1snYW5ub3RhdGlvbnMnXV1bWzJdXVtbJ3gnXV0gCgojQ2FtYmlhbmRvIGxhIHBvc2ljacOzbiBkZWwgImxhYmVsIgpiYmJbWyd4J11dW1snbGF5b3V0J11dW1snYW5ub3RhdGlvbnMnXV1bWzJdXVtbJ3gnXV0gPC0gLTAuMSAKYmJiCmBgYAoKCiMjIFByaW5jaXBhbGVzIGRlc3Rpbm9zIGRlIGxhIG1hZGVyYSBleHBvcnRhZGEKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmV4cG9ydGFjaW9uZXMgJT4lIAogIGdyb3VwX2J5KGBQYWlzIGRlIERlc3Rpbm9gKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iX3VzID0gc3VtKGBVJCBGT0IgVG90YCxuYS5ybSA9IFQpLAogICAga2dfbmV0byA9IHN1bShgS2cgTmV0b2AsbmEucm0gPSBUKQogICkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2JfdXMqMTAwL3N1bSh2YWxvcl9mb2JfdXMsIG5hLnJtID0gVCksCiAgICBwZXJfcGVzb19uZXRvID0ga2dfbmV0byoxMDAvc3VtKGtnX25ldG8sIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2ModmFsb3JfZm9iX3VzKSkgJT4lIAogIGRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIlBhw61zIGRlIERlc3Rpbm8iLCJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIE5ldG8gKEtnKSIsIlZhbG9yIEZPQiAoJSkiLCJQZXNvIE5ldG8gKCUpIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9Mjo1ICxkaWdpdHMgPSAyLCBtYXJrID0gIi4iLCBkZWMubWFyayA9ICIsIikgCmBgYAoKIyMgUHJpbmNpcGFsZXMgY29tcGHDscOtYXMgZXh0cmFuamVyYXMgcXVlIGltcG9ydGFuIG1hZGVyYSBkZWwgUGVyw7oKCk5vdGE6IEVzdGFzIGNvbXBhw7HDrWFzIHRhbWJpw6luIHB1ZWRlIHNlciBhZ2VuY2lhcyBkZSBhZHVhbmFzLCBwb3IgbG8gdGFudG8sIG5vIG5lY2VzYXJpYW1lbnRlIGVsIHJlY2VwdG9yIGZpbmFsIGRlIGxhIG1hZGVyYS4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmV4cG9ydGFjaW9uZXMgJT4lIAogIGdyb3VwX2J5KEltcG9ydGFkb3IpICU+JSAKICBzdW1tYXJpc2UoCiAgICB2YWxvcl9mb2JfdXMgPSBzdW0oYFUkIEZPQiBUb3RgLG5hLnJtID0gVCksCiAgICBrZ19uZXRvID0gc3VtKGBLZyBOZXRvYCwgbmEucm0gPSBUKQogICkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2JfdXMqMTAwL3N1bSh2YWxvcl9mb2JfdXMsIG5hLnJtID0gVCksCiAgICBwZXJfcGVzb19uZXRvID0ga2dfbmV0byoxMDAvc3VtKGtnX25ldG8sIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2ModmFsb3JfZm9iX3VzKSkgJT4lIAogIGRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIkV4cG9ydGFkb3IiLCJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIE5ldG8gKEtnKSIsIlZhbG9yIEZPQiAoJSkiLCJQZXN0byBOZXRvICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTI6NSAsZGlnaXRzID0gMiwgbWFyayA9ICIuIiwgZGVjLm1hcmsgPSAiLCIpIApgYGAKCiMjIEV2b2x1Y2nDs24gZGUgbGFzIGV4cG9ydGFjaW9uZXMgZGUgbWFkZXJhIHsudGFic2V0fQoKIyMjIERhdGEKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwb3J0YWNpb25lcyAlPiUgCiAgICBncm91cF9ieShhbmlvKSAlPiUgCiAgICBzdW1tYXJpc2UoCiAgICAgICAga2dfbmV0byA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICAgICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCwgbmEucm0gPSBUKQogICAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGFuaW8pKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiQcOxbyIsIlBlc28gTmV0byAoS2cpIiwiVmFsb3IgRm9iIChVUyQpIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9MjozICxkaWdpdHMgPSAyLCBtYXJrID0gIi4iLCBkZWMubWFyayA9ICIsIikgCmBgYAoKIyMjIFZpeiB7LnRhYnNldH0KIyMjIyBQb3IgVmFsb3IgRk9CIFVTJApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBvcnRhY2lvbmVzICU+JSAKICBnZ3Bsb3QoYWVzKGFuaW8sIGBVJCBGT0IgVG90YCkpK2dlb21fY29sKCkrCiAgbGFicyh4PSJBw7FvIiwgeT0iVmFsb3IgRk9CIChVUyQiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWwgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYmlnLm1hcmsgPSAiLiIsZGVjaW1hbC5tYXJrID0gIiwiKSkgI2xhYmVsPWZ1bmN0aW9uKHgpe3JldHVybihwYXN0ZSgiTXkgdmFsdWUgaXMiLCB4LCAiZGVncmVlcyIpKX0KCgpgYGAKIyMjIyBQb3IgS2cgTmV0bwpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBvcnRhY2lvbmVzICU+JSAKICBnZ3Bsb3QoYWVzKGFuaW8sIGBLZyBOZXRvYCkpKwogIGdlb21fY29sKCkrCiAgbGFicyh4PSJBw7FvIiwgeT0iUGVzbyBOZXRvIChLZykiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWwgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYmlnLm1hcmsgPSAiLiIsZGVjaW1hbC5tYXJrID0gIiwiKSkgI2xhYmVsPWZ1bmN0aW9uKHgpe3JldHVybihwYXN0ZSgiTXkgdmFsdWUgaXMiLCB4LCAiZGVncmVlcyIpKX0KCmBgYAoKIyAqKjIuIEludmVzdGlnYWNpb25lcyBmaXNjYWxlcyBzb2JyZSBkZWxpdG9zIGFtYmllbnRhbGVzIGVuIFBlcsO6KioKYGBge3J9CmRlbGl0b3NfYW1iaWVudGFsZXNfYWxsIDwtIHJlYWRfc2hlZXQoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFiSnh6UUtkVXpYb1FCSVBuVlNrT09mUTJ0SjlVQUpLc2lYM2ZEbnVieUFVL2VkaXQjZ2lkPTE1ODI0NDAwNjAiLCBzaGVldCA9ICJEQVRBIFVOSURBIiwgY29sX3R5cGVzID0gImNjY2NjY2NjY2NjY2NjY2NjYyIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKEltcHV0YWRvKSkKCmRlbGl0b3NfYW1iaWVudGFsZXNfYWxsJEltcHV0YWRvIDwtIHRvdXBwZXIoc3RyaV90cmFuc19nZW5lcmFsKGdzdWIoIix8XFwufC0iLCAiIiwgZGVsaXRvc19hbWJpZW50YWxlc19hbGwkSW1wdXRhZG8pLCAiTGF0aW4tQVNDSUkiKSkgCmBgYAoKCiMjIEltcHV0YWRvcyBjb24gbcOhcyBpbnZlc3RpZ2FjaW9uZXMKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGVsaXRvc19hbWJpZW50YWxlc19hbGwgJT4lIAogIGdyb3VwX2J5KEltcHV0YWRvKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbl9pbnZlc3RpZ2FjaW9uZXMgPSBuKCkKICApICU+JSAKICBhcnJhbmdlKGRlc2Mobl9pbnZlc3RpZ2FjaW9uZXMpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiSW1wdXRhZG8iLCJDYW50aWRhZCBkZSBpbnZlc3RpZ2FjaW9uZXMiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0yOjIgLGRpZ2l0cyA9IDAsIG1hcmsgPSAiLiIsIGRlYy5tYXJrID0gIiwiKSAKYGBgCgojIyBFdm9sdWNpw7NuIGRlIGxhIGNhbnRpZGFkIGRlIGludmVzdGlnYWNpb25lcyBwb3IgYcOxbyB7LnRhYnNldH0KCiMjIyBEYXRhCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRlbGl0b3NfYW1iaWVudGFsZXNfYWxsICU+JSAKICBtdXRhdGUoCiAgICBmZWNoYV9leHBlZGllbnRlID0gY2FzZV93aGVuKAogICAgICBzdHJfZGV0ZWN0KEV4cGVkaWVudGUsICIyMDExIikgfiAiMjAxMSIsCiAgICAgIHN0cl9kZXRlY3QoRXhwZWRpZW50ZSwgIjIwMTIiKSB+ICIyMDEyIiwKICAgICAgc3RyX2RldGVjdChFeHBlZGllbnRlLCAiMjAxMyIpIH4gIjIwMTMiLAogICAgICBzdHJfZGV0ZWN0KEV4cGVkaWVudGUsICIyMDE0IikgfiAiMjAxNCIsCiAgICAgIHN0cl9kZXRlY3QoRXhwZWRpZW50ZSwgIjIwMTUiKSB+ICIyMDE1IiwKICAgICAgc3RyX2RldGVjdChFeHBlZGllbnRlLCAiMjAxNiIpIH4gIjIwMTYiLAogICAgICBzdHJfZGV0ZWN0KEV4cGVkaWVudGUsICIyMDE3IikgfiAiMjAxNyIsCiAgICAgIHN0cl9kZXRlY3QoRXhwZWRpZW50ZSwgIjIwMTgiKSB+ICIyMDE4IiwKICAgICAgc3RyX2RldGVjdChFeHBlZGllbnRlLCAiMjAxOSIpIH4gIjIwMTkiKSkgJT4lIAogIAogIGdyb3VwX2J5KGZlY2hhX2V4cGVkaWVudGUpICU+JSAKICBzdW1tYXJpc2UoCiAgICBuX2ludmVzdGlnYWNpb25lcyA9IG5fZGlzdGluY3QoRXhwZWRpZW50ZSwgYE7CuiBMZWdham9gKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhmZWNoYV9leHBlZGllbnRlKSkgJT4lIAogIGRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIkZlY2hhIEV4cGVkaWVudGUiLCJDYW50aWRhZCBkZSBJbnZlc3RpZ2FjaW9uZXMiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0yOjIgLGRpZ2l0cyA9IDAsIG1hcmsgPSAiLiIsIGRlYy5tYXJrID0gIiwiKSAKYGBgCiMjIyBWaXoKYGBge3J9CmRlbGl0b3NfYW1iaWVudGFsZXNfYWxsICU+JSAKICBtdXRhdGUoCiAgICBmZWNoYV9leHBlZGllbnRlID0gY2FzZV93aGVuKAogICAgICBzdHJfZGV0ZWN0KEV4cGVkaWVudGUsICIyMDExIikgfiAiMjAxMSIsCiAgICAgIHN0cl9kZXRlY3QoRXhwZWRpZW50ZSwgIjIwMTIiKSB+ICIyMDEyIiwKICAgICAgc3RyX2RldGVjdChFeHBlZGllbnRlLCAiMjAxMyIpIH4gIjIwMTMiLAogICAgICBzdHJfZGV0ZWN0KEV4cGVkaWVudGUsICIyMDE0IikgfiAiMjAxNCIsCiAgICAgIHN0cl9kZXRlY3QoRXhwZWRpZW50ZSwgIjIwMTUiKSB+ICIyMDE1IiwKICAgICAgc3RyX2RldGVjdChFeHBlZGllbnRlLCAiMjAxNiIpIH4gIjIwMTYiLAogICAgICBzdHJfZGV0ZWN0KEV4cGVkaWVudGUsICIyMDE3IikgfiAiMjAxNyIsCiAgICAgIHN0cl9kZXRlY3QoRXhwZWRpZW50ZSwgIjIwMTgiKSB+ICIyMDE4IiwKICAgICAgc3RyX2RldGVjdChFeHBlZGllbnRlLCAiMjAxOSIpIH4gIjIwMTkiKSkgJT4lIAogIGdncGxvdChhZXMoeD1mZWNoYV9leHBlZGllbnRlKSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKHg9IkHDsW8iLCB5PSJDYW50aWRhZCBkZSBJbnZlc3RpZ2FjaW9uZXMiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWwgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYmlnLm1hcmsgPSAiLiIsZGVjaW1hbC5tYXJrID0gIiwiKSkKYGBgCgoKIyMgRGVsaXRvcyBtw6FzIGNvbXVuZXMKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGVsaXRvc19hbWJpZW50YWxlc19hbGwgJT4lIAogIGdyb3VwX2J5KE1hdGVyaWEpICU+JSAKICBzdW1tYXJpc2UoCiAgICBuX2Nhc29zID0gbl9kaXN0aW5jdChgTsK6IExlZ2Fqb2AsRXhwZWRpZW50ZSkKICApICU+JSAKICBhcnJhbmdlKGRlc2Mobl9jYXNvcykpICU+JSAKICBkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJNYXRlcmlhIG8gZGVsaXRvIiwiQ2FudGlkYWQgZGUgQ2Fzb3MiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0yOjIgLGRpZ2l0cyA9IDAsIG1hcmsgPSAiLiIsIGRlYy5tYXJrID0gIiwiKSAKYGBgCgojIyBVYmljYWNpw7NuIGRlIGxhcyBpbnZlc3RpZ2FjaW9uZXMgey50YWJzZXR9CgoKIyMjIFJhbmtpbmcKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGVsaXRvc19hbWJpZW50YWxlc19hbGwgJT4lIAogIGdyb3VwX2J5KGBEaXN0cml0byBKdWRpY2lhbGApICU+JSAKICBzdW1tYXJpc2UoCiAgICBuX2Nhc29zID0gbl9kaXN0aW5jdChgTsK6IExlZ2Fqb2AsIEV4cGVkaWVudGUpCiAgKSAlPiUgYXJyYW5nZShkZXNjKG5fY2Fzb3MpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiRGlzdHJpdG8gSnVkaWNpYWwiLCJDYW50aWRhZCBkZSBDYXNvcyIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTI6MiAsZGlnaXRzID0gMCwgbWFyayA9ICIuIiwgZGVjLm1hcmsgPSAiLCIpIApgYGAKCgojICoqMy4gSW5mcmFjY2lvbmVzIE9zaW5mb3IqKgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KaW5mcmFjdG9yZXNfb3NpbmZvcl9hbGwgPC0gcmVhZF9zaGVldCgiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWNLTmV0VlYzV2J1TjgzVnZtMkxxbktuOHdpTmw4bVZZaktLUjhvUlNxUG8vZWRpdCNnaWQ9MTA1MjQyMjIzNCIsIHNoZWV0ID0gIkRhdG9zIikgCgppbmZyYWN0b3Jlc19vc2luZm9yX2FsbCRUaXR1bGFyIDwtIHN0cmlfdHJhbnNfZ2VuZXJhbChnc3ViKCIsfFxcLnwtIiwgIiIsIGluZnJhY3RvcmVzX29zaW5mb3JfYWxsJFRpdHVsYXIpLCAiTGF0aW4tQVNDSUkiKSAKYGBgCgojIyBSYW5raW5nIGluZnJhY3RvcmVzIHsudGFic2V0fQoKIyMjIFJlc3VtZW4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KaW5mcmFjdG9yZXNfb3NpbmZvcl9hbGwgJT4lIAogIGdyb3VwX2J5KFRpdHVsYXIpICU+JSAKICBzdW1tYXJpc2UoCiAgICBuX2luZnJhY2Npb25lcyA9IG4oKSwKICAgIG11bHRhX3RvdGFsID0gc3VtKGBWYWxvciBtdWx0YSAoUy8pYCxuYS5ybSA9IFQpICAKICApICU+JSBhcnJhbmdlKGRlc2MobXVsdGFfdG90YWwpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiVGl0dWxhciIsIkNhbnRpZGFkIGluZnJhY2Npb25lcyIsICJNdWx0YSB0b3RhbCAoUy8pIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9MzozICxkaWdpdHMgPSAyLCBtYXJrID0gIi4iLCBkZWMubWFyayA9ICIsIikgCmBgYAojIyMgU29sbyBwZXJzb25hcyBqdXLDrWRpY2FzIChObyBjb211bmlkYWRlcykKYGBge3J9CmluZnJhY3RvcmVzX29zaW5mb3JfYWxsICU+JSAKICBmaWx0ZXIoIXN0cl9kZXRlY3QoVGl0dWxhciwgcmVnZXgoImNvbXVuaWRhZCIsaWdub3JlX2Nhc2UgPSBUKSkpICU+JSAKICBncm91cF9ieShUaXR1bGFyKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbl9pbmZyYWNjaW9uZXMgPSBuKCksCiAgICBtdWx0YV90b3RhbCA9IHN1bShgVmFsb3IgbXVsdGEgKFMvKWAsbmEucm0gPSBUKSAgCiAgKSAlPiUgYXJyYW5nZShkZXNjKG11bHRhX3RvdGFsKSkgJT4lIAogIGRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIlRpdHVsYXIiLCJDYW50aWRhZCBpbmZyYWNjaW9uZXMiLCAiTXVsdGEgdG90YWwgKFMvKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTM6MyAsZGlnaXRzID0gMiwgbWFyayA9ICIuIiwgZGVjLm1hcmsgPSAiLCIpIApgYGAKIyMjIFBvciB0aXBvIGRlIGluZnJhY2Npw7NuCmBgYHtyfQppbmZyYWN0b3Jlc19vc2luZm9yX2FsbCAlPiUgCiAgZ3JvdXBfYnkoSW5mcmFjY2lvbmVzKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbl9pbmZyYWNjaW9uZXMgPSBuKCksCiAgICBtdWx0YV90b3RhbCA9IHN1bShgVmFsb3IgbXVsdGEgKFMvKWAsbmEucm0gPSBUKSAgCiAgKSAlPiUgYXJyYW5nZShkZXNjKG11bHRhX3RvdGFsKSkgJT4lIAogIGRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIkluZnJhY2Npb25lcyIsIkNhbnRpZGFkIGluZnJhY2Npb25lcyIsICJNdWx0YSB0b3RhbCAoUy8pIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9MzozICxkaWdpdHMgPSAyLCBtYXJrID0gIi4iLCBkZWMubWFyayA9ICIsIikgCmBgYAojIyBQb3IgbW9kYWxpZGFkIGRlIGFwcm92ZWNoYW1pZW50bwpgYGB7cn0KaW5mcmFjdG9yZXNfb3NpbmZvcl9hbGwgJT4lIAogIGdyb3VwX2J5KE1vZGFsaWRhZF9kZV9BcHJvdmVjaGFtaWVudG8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBuX2luZnJhY2Npb25lcyA9IG4oKSwKICAgIG11bHRhX3RvdGFsID0gc3VtKGBWYWxvciBtdWx0YSAoUy8pYCxuYS5ybSA9IFQpICAKICApICU+JSBhcnJhbmdlKGRlc2MobXVsdGFfdG90YWwpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiTW9kYWxpZGEgYXByb3ZlY2hhbWllbnRvIiwiQ2FudGlkYWQgaW5mcmFjY2lvbmVzIiwgIk11bHRhIHRvdGFsIChTLykiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0zOjMgLGRpZ2l0cyA9IDIsIG1hcmsgPSAiLiIsIGRlYy5tYXJrID0gIiwiKSAKYGBgCgojIyBFdm9sdWNpw7NuIGRlIGluZnJhY2Npb25lcyB7LnRhYnNldH0KCiMjIyBSYW5raW5nCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmluZnJhY3RvcmVzX29zaW5mb3JfYWxsICU+JSAKICBncm91cF9ieShGZWNoYSkgJT4lIAogIHN1bW1hcmlzZSgKICAgIG5faW5mcmFjY2lvbmVzID0gbigpLAogICAgbW9udG9fbXVsdGEgPSBzdW0oYFZhbG9yIG11bHRhIChTLylgLG5hLnJtID0gVCkKICApICU+JSBhcnJhbmdlKGRlc2MoRmVjaGEpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiRmVjaGEiLCJDYW50aWRhZCBpbmZyYWNjaW9uZXMiLCAiTXVsdGEgdG90YWwgKFMvKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTM6MyAsZGlnaXRzID0gMiwgbWFyayA9ICIuIiwgZGVjLm1hcmsgPSAiLCIpIApgYGAKCiMjIyBWaXoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KaW5mcmFjdG9yZXNfb3NpbmZvcl9hbGwgJT4lIAogIGdncGxvdChhZXMoRmVjaGEsIGBWYWxvciBtdWx0YSAoUy8pYCkpKwogIGdlb21fY29sKCkgKwogIGxhYnMoeD0iQcOxbyIsIHk9IlZhbG9yIE11bHRhIChTLykiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWwgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYmlnLm1hcmsgPSAiLiIsZGVjaW1hbC5tYXJrID0gIiwiKSkKYGBgCgojIyBVYmljYWNpw7NuIGRlIGluZnJhY2Npb25lcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQppbmZyYWN0b3Jlc19vc2luZm9yX2FsbCAlPiUgCiAgZ3JvdXBfYnkoRGVwYXJ0YW1lbnRvKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbl9pbmZyYWNjaW9uZXMgPSBuKCksCiAgICBuX211bHRhID0gc3VtKGBWYWxvciBtdWx0YSAoUy8pYCwgbmEucm0gPSBUKQogICkgJT4lIGFycmFuZ2UoZGVzYyhuX2luZnJhY2Npb25lcykpICU+JSAKICBkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJEZXBhcnRhbWVudG8iLCJDYW50aWRhZCBpbmZyYWNjaW9uZXMiLCAiTXVsdGEgdG90YWwgKFMvKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTM6MyAsZGlnaXRzID0gMiwgbWFyayA9ICIuIiwgZGVjLm1hcmsgPSAiLCIpIApgYGAKCgojICoqNC4gTWF0Y2ggZGUgbG9zIGRhdGFzZXRzKioKCiMjIEltcG9ydGFkb3JhcyBjb24gYW50ZWNlZGVudGVzCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpleHBvcnRhY2lvbmVzJGBDb2QuIFRyaWJ1dGFyaW8gKFJVQylgIDwtIGFzLmNoYXJhY3RlcihleHBvcnRhY2lvbmVzJGBDb2QuIFRyaWJ1dGFyaW8gKFJVQylgKSAKYGBgCgpTZSBtdWVzdHJhIHVuIHJlc3VtZW4gZGUgbGFzIGVtcHJlc2FzIGV4cG9ydGFkb3JlcyBkZSBtYWRlcmEgcXVlIHRpZW5lbiBpbmZyYWNpb25lcyBkZSBPc2luZm9yLiBQYXJhIHJlYWxpemFyIGVsIGNydWNlIGNvbiBsYSBpbnZlc3RpZ2FjaW9uZXMgZmlzY2FsZXMgc2UgbmVjZXNpdGEgY3JlYXIgdW4gZGF0YXNldCBjb24gbG9zIHJlcHJlc2VudGFudGVzIGxlZ2FsZXMgZGUgbG9zIGltcG9ydGFkb3JlcywgZGViaWRvIGEgcXVlIGVzIHBvY28gY29tw7puIHByb2Nlc2FyIGEgcGVyc29uYXMganVyw61kaWNhcyBjb21vIHJlc3BvbnNhYmxlcywgZW4gc3UgbHVnYXIgc2UgaW1wdXRhIGEgbG9zIHJlcHJlc2VudGFudGVzIGxlZ2FsZXMgbyBhcG9kZXJhZG9zLiBBZGVtw6FzIHF1ZSB1biBtaXNtbyByZXByZXNlbnRhbnRlIGxlZ2FsIHB1ZWRlIGVzdGFyIHZpbmN1bGFkYSBhIG90cmFzIGVtcHJlc2FzLiBQb3IgZWplbXBsbywgSm9zZSBMdWlzIEFzY2VuY2lvIEp1cmFkbyBlcyBHZXJlbnRlIEdlbmVyYWwgZGUgSW52ZXJzaW9uZXMgTGEgT3JvemEsIGxhIG1heW9yIGV4cG9ydGFkb3JhIGRlIG1hZGVyYSBlbiBlbCBQZXLDuiwgeSBlc3TDoSBzaWVuZG8gaW52ZXN0aWdhZG8gZW4gbGEgRmlzY2Fsw61hIEVzcGVjaWFsaXphZGEgZW4gTWF0ZXJpYSBBbWJpZW50YWwgZGUgTG9yZXRvIC0gTWF5bmFzIC8gQ3VhcnRvIEp1emdhZG8gZGUgSW52ZXN0aWdhY2lvbiBQcmVwYXJhdG9yaWEgZGUgTG9yZXRvLCBwb3IgdW4gY2FzbyBkZSBsYSBlbXByZXNhIEluZHVzdHJpYSBGb3Jlc3RhbCBJcXVpdG9zIHkgcG9yIERlbGl0byBjb250cmEgbG9zIGJvc3F1ZXMgbyBmb3JtYWNpb25lcyBCb3Njb3NhcyAoQXJ0LiAzMTApfHxUSVBfMDIwNi4KCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBvcnRhY2lvbmVzICU+JSAKICBncm91cF9ieShgQ29kLiBUcmlidXRhcmlvYCwgRXhwb3J0YWRvcikgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsbmEucm0gPSBUKSwKICAgIGtnX25ldG8gPSBzdW0oYEtnIE5ldG9gLCBuYS5ybSA9IFQpCiAgKSAlPiUgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYikpICU+JSAKICByZW5hbWUocnVjID0gYENvZC4gVHJpYnV0YXJpb2ApICU+JSAKICBpbm5lcl9qb2luKAogICAgaW5mcmFjdG9yZXNfb3NpbmZvcl9hbGwgJT4lIAogICAgICByZW5hbWUocnVjID1gTl9Eb2N1bWVudG8oRE5JL1JVQylgKSwgYnkgPSAicnVjIiAKICApICU+JSAKICBncm91cF9ieShydWMsIEV4cG9ydGFkb3IsIHZhbG9yX2ZvYiwga2dfbmV0bykgJT4lIAogIHN1bW1hcmlzZSgKICAgIG5faW5mcmFjY2lvbmVzX29zaW5mb3IgPSBuKCksCiAgICBtdWx0YSA9IHN1bShgVmFsb3IgbXVsdGEgKFMvKWAsbmEucm0gPSBUKQogICkgJT4lIGFycmFuZ2UoZGVzYyh2YWxvcl9mb2IpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiUlVDIiwiRXhwb3J0YWRvciIsICJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIE5ldG8gKEtnKSIsIkluZnJhY2Npb25lcyBPc2luZm9yIiwiTXVsdGEgdG90YWwgKFMvKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTM6NiAsZGlnaXRzID0gMiwgbWFyayA9ICIuIiwgZGVjLm1hcmsgPSAiLCIpIAoKYGBgCgojIyBJbXB1dGFkb3MgcXVlIGNvbWV0aWVyb24gaW5mcmFjY2lvbmVzIGltcHVlc3RhIHBvciBPc2luZm9yIHkgZXN0YW4gaW52ZXN0aWdhZGFzIGVuIEZpc2NhbMOtYQoKU2UgaGl6byB1biBtYXRjaCBkZSBsb3MgaW5mcmFjdG9yZXMgZSBpbnZlc3RpZ2Fkb3MgZW4gZmlzY2Fsw61hIHBhcmEgY29ub2NlciBhIHBlcnNvbmFzIG5hdHVyYWxlcyBvIGp1csOtZGljYXMgcXVlIHNvbiByZWN1cnJlbnRlcyBlbiBhY3RvcyBwZXJqdWRpY2lhbGVzIHBhcmEgZWwgc2VjdG9yIG1hZGVyZXJvCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm5vbWJyZXMgPC0gcmVhZF9zaGVldCgiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMXdneWpGU3g3M1RQcG9uNnZfRExhVUlla1E4MzZ3RnV6ZGxlN1hrTHhvTG8vZWRpdCNnaWQ9MTM0NDkxNTUzNCIsIHNoZWV0ID0ibm9tYnJlcyIsY29sX3R5cGVzID0gImNjYyIpCmBgYAoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpub21icmVzICU+JSAKICBsZWZ0X2pvaW4oaW5mcmFjdG9yZXNfb3NpbmZvcl9hbGwgJT4lIAogICAgICAgICAgICAgICByZW5hbWUobm9tYnJlX2luZnJhY3RvcmVzID0gVGl0dWxhciksIGJ5ID0gIm5vbWJyZV9pbmZyYWN0b3JlcyIpICU+JSAKICBncm91cF9ieShub21icmVfZGVsaXRvc19hbWJpZW50YWxlcywgbm9tYnJlX2luZnJhY3RvcmVzKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbl9pbmZyYWNjaW9uZXMgPSBuKCksCiAgICBtdWx0YSA9IHN1bShgVmFsb3IgbXVsdGEgKFMvKWAsIG5hLnJtID0gVCkKICApICU+JSAKICBsZWZ0X2pvaW4oZGVsaXRvc19hbWJpZW50YWxlc19hbGwgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShub21icmVfZGVsaXRvc19hbWJpZW50YWxlcyA9IEltcHV0YWRvKSwgYnkgPSAibm9tYnJlX2RlbGl0b3NfYW1iaWVudGFsZXMiKSAlPiUgCiAgZ3JvdXBfYnkobm9tYnJlX2RlbGl0b3NfYW1iaWVudGFsZXMsIG5vbWJyZV9pbmZyYWN0b3Jlcywgbl9pbmZyYWNjaW9uZXMsIG11bHRhKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbl9pbnZlc3RpZ2FjaW9uZXMgPSBuX2Rpc3RpbmN0KGBOwrogTGVnYWpvYCwgRXhwZWRpZW50ZSkKICApICU+JSBhcnJhbmdlKGRlc2MobXVsdGEpKSAlPiUgCiAgZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiTm9tYnJlIChEZWxpdG9zIGFtYmllbnRhbGVzKSIsIk5vbWJyZSAoSW5mcmFjdG9yZXMgT3NpbmZvcikiLCAiQ2FudGlkYWQgaW5mcmFjY2lvbmVzIiwiTXVsdGEgdG90YWwgKFMvKSIsICJDYW50aWRhZCBpbnZlc3RpZ2FjaW9uZXMiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID00OjQgLGRpZ2l0cyA9IDIsIG1hcmsgPSAiLiIsIGRlYy5tYXJrID0gIiwiKSAKICAKYGBgCgo=