O objeto principal da análise são as buscas e a navegação depois da busca. Criamos esses dados a partir dos dados originais da wikimedia em /data/search_data.csv.

Aqui, exploramos esses dados.

buscas = read_csv(here::here("data/search_data.csv"))
Parsed with column specification:
cols(
  session_id = col_character(),
  search_index = col_double(),
  session_length = col_double(),
  session_start_timestamp = col_double(),
  session_start_date = col_datetime(format = ""),
  group = col_character(),
  results = col_double(),
  num_clicks = col_double(),
  first_click = col_double()
)
glimpse(buscas)
Observations: 136,234
Variables: 9
$ session_id              <chr> "0000cbcb67c19c45", "0001382e027b2ea4", "0001e8bb…
$ search_index            <dbl> 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 2, 1, 1, 1, 1, 1…
$ session_length          <dbl> 0, 303, 435, 58, 58, 58, 58, 58, 58, 0, 43, 43, 0…
$ session_start_timestamp <dbl> 20160303152045, 20160307084955, 20160305092415, 2…
$ session_start_date      <dttm> 2016-03-03 15:20:45, 2016-03-07 08:49:55, 2016-0…
$ group                   <chr> "b", "b", "b", "a", "a", "a", "a", "a", "a", "b",…
$ results                 <dbl> 20, 18, 20, 20, 20, 20, 20, 20, 20, 1, 0, 1, 20, …
$ num_clicks              <dbl> 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0…
$ first_click             <dbl> NA, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, …
buscas %>% 
    ggplot(aes(x = results)) + 
    geom_histogram(binwidth = 5) 

Tarefa

Você deve criar um relatório reproduzível respondendo às seguintes perguntas:

1) Qual é a nossa taxa de cliques geral diária? Como isso varia entre os grupos?

Vamos analisar o número geral de cliques e a média de cliques apenas quando o usuário clica em alguma coisa, ou seja, quando num_clicks > 0 no geral.

#coluna dia day
buscas <- mutate(buscas, day = round_date(buscas$session_start_date, "day"))

#coluna data date
buscas <- mutate(buscas, date = as.Date(format(session_start_date, "%Y-%m-%d")))

cliques_por_dia_geral = buscas %>% 
filter(num_clicks > 0) %>%
group_by(date) %>%
summarise(total_clicks = sum(num_clicks))

  ggplot(data=cliques_por_dia_geral, aes(x = date, y = total_clicks)) +
  geom_line() + 
    geom_point() + 
    scale_x_date(date_breaks = "1 day") +
    #scale_y_continuous(breaks = seq(0,10000,200), trans = "log10") +
    scale_y_continuous(breaks = seq(0,10000,200)) +
  labs(
      x = "Data",
      y = "cliques",
      title = "Total de cliques por dia") 

  
  media_cliques_por_dia_geral = buscas %>% 
filter(num_clicks > 0) %>%
group_by(date) %>%
summarise(media_total_clicks = mean(num_clicks))


  ggplot(data=media_cliques_por_dia_geral, aes(x = date, y = media_total_clicks)) +
  geom_line() + 
    geom_point() + 
    scale_x_date(date_breaks = "1 day") +
    #scale_y_continuous(breaks = seq(0,10000,200), trans = "log10") +
    #scale_y_continuous(breaks = seq(0,10000,200)) +
  labs(
      x = "Data",
      y = "cliques",
      title = "Média de cliques por dia")

Vamos analisar o número geral de cliques e a média de cliques apenas quando o usuário clica em alguma coisa, ou seja, quando num_clicks > 0 por grupo.


cliques_por_dia_geral = buscas %>% 
filter(num_clicks > 0) %>%
group_by(date, group) %>%
summarise(total_clicks = sum(num_clicks))

  ggplot(data=cliques_por_dia_geral, aes(x = as.Date(date), y = total_clicks, color = group)) +
  geom_line() + 
    geom_point() + 
    scale_x_date(date_breaks = "1 day") +
    #scale_y_continuous(breaks = seq(0,10000,200), trans = "log10") +
    scale_y_continuous(breaks = seq(0,6000,200)) +
  labs(
      y = "cliques",
      x = "Data",
      title = "Total de cliques por dia por grupo") 

  
  media_cliques_por_dia_geral = buscas %>% 
filter(num_clicks > 0) %>%
group_by(date, group) %>%
summarise(media_total_clicks = mean(num_clicks))


  ggplot(data=media_cliques_por_dia_geral, aes(x = as.Date(date), y = media_total_clicks, color = group)) +
  geom_line() + 
    geom_point() + 
    scale_x_date(date_breaks = "1 day") +
    #scale_y_continuous(breaks = seq(0,10000,200), trans = "log10") +
    #scale_y_continuous(breaks = seq(0,0.6,0.1)) +
  labs(
      y = "cliques",
      x = "Data",
      title = "Média de cliques por dia por grupo")

2) Quais resultados as pessoas tendem a experimentar primeiro? Como isso muda no dia-a-dia?

Vamos observar a distribuição de qual resultado as pessoas clicam primeiro por grupo. Pela distribuição, vemos que a maior parte experimentam os resultados de 1 a 7.


buscas %>% 
    filter(!is.na(first_click), first_click<=20) %>%
    count(first_click, group) %>% 
    ggplot(aes(x = first_click, y = n, fill = group)) + 
    geom_area() +
    #scale_x_continuous(breaks = seq(0,20,1), trans = "log10") 
    scale_x_continuous(breaks = seq(0,20,1)) +
    labs(
      x = "Primeiro clique",
      y = "Número de cliques",
      fill = "Grupo",
      title = "")

3) Qual é a nossa taxa de resultados zero no geral? Como isso varia entre os grupos?

Vamos observar o número de resultados zero a cada dia por grupo e geral. Depois, vamos visualizar a média de resultados zero a cada dia por grupo e geral.


resultado_zero_diario_geral = buscas %>% 
                        filter(results==0) %>% 
                            group_by(date) %>% 
                                summarise(numero_resultado_zero_geral=n()) 

resultado_total_diario_geral = buscas  %>%
                        group_by(date) %>% 
                            summarise(total_resultados_geral=n())

resultado_zero_diario_grupo = buscas %>% 
                        filter(results==0) %>% 
                            group_by(date, group) %>% 
                                summarise(numero_resultado_zero_grupo=n()) 

resultado_total_diario_grupo = buscas  %>%
                        group_by(date, group) %>% 
                            summarise(total_resultados_grupo=n())



calculo_taxa_resultado_zero_geral = resultado_zero_diario_geral %>% 
                            inner_join(resultado_total_diario_geral, by=c("date")) %>%
                                mutate(taxa_resultado_zero_geral = numero_resultado_zero_geral/total_resultados_geral)

calculo_taxa_resultado_zero_grupo = resultado_zero_diario_grupo %>% 
                            inner_join(resultado_total_diario_grupo, by=c("date", "group")) %>%
                                mutate(taxa_resultado_zero_grupo = numero_resultado_zero_grupo/total_resultados_grupo)


ggplot(data=resultado_zero_diario_geral, aes(x=date, y=numero_resultado_zero_geral))+
geom_line() + 
geom_point() + 
  scale_x_date(date_breaks = "1 day") +
  #scale_y_continuous(breaks = seq(0,2600,100)) +
  labs(title = "",
       x = "Data", 
       y="Resultados Zero",
       group = "")


ggplot(data=resultado_zero_diario_grupo, aes(x=date, y=numero_resultado_zero_grupo, group=group, color=group))+
geom_line() + 
geom_point() + 
  scale_x_date(date_breaks = "1 day") +
  scale_y_continuous(breaks = seq(0,2600,100)) +
  labs(title = "",
       x = "Data", 
       y="Resultados Zero",
       group = "Grupo", 
       color = "Grupo")

  
ggplot(data=calculo_taxa_resultado_zero_geral, aes(x=date, y=taxa_resultado_zero_geral))+
geom_line() + 
geom_point() + 
  scale_x_date(date_breaks = "1 day") +
  #scale_y_continuous(breaks = seq(0,2600,100)) +
  labs(title = "",
       x = "Data", 
       y="Resultados Zero",
       group = "")


ggplot(data=calculo_taxa_resultado_zero_grupo, aes(x=date, y=taxa_resultado_zero_grupo, group=group, color=group))+
geom_line() + 
geom_point() + 
  scale_x_date(date_breaks = "1 day") +
  #scale_y_continuous(breaks = seq(0,2600,100)) +
  labs(title = "",
       x = "Data", 
       y="Resultados Zero",
       group = "Grupo", 
       color = "Grupo")

4) Seja a duração da sessão aproximadamente o tempo entre o primeiro e o último evento de uma sessão. Escolha uma variável do conjunto de dados e descreva sua relação com o tamanho da sessão. Visualize o relacionamento.

Escolhemos a variável número de cliques e vemos sua relação com o tamanho da sessão. Após, vamos visualizar correlação entre as variáveis (pearson, spearman, kendall)


cor_buscas_geral = buscas %>%
    filter (!is.na(session_length), session_length != 0) 

    ggplot(data = cor_buscas_geral, aes(x = session_length, y = num_clicks)) + 
    geom_point() +
    scale_x_continuous(trans = 'log10') +
    #facet_wrap(~ group)  +
    labs(
        x = "duração da sessão",
        y = "cliques",
        title = "Geral") 


cor_buscas_grupo = buscas %>%
    filter (!is.na(session_length), session_length != 0) 

    ggplot(data = cor_buscas_grupo, aes(x = session_length, y = num_clicks)) + 
    geom_point() +
    scale_x_continuous(trans = 'log10') +
    facet_wrap(~ group)  +
    labs(
        x = "duração da sessão",
        y = "cliques",
        title = "Grupo") 

# 
# busca_geral_cor = cor_buscas_geral %>%
#     summarise(
#     pearson = cor(session_length, num_clicks, method = "pearson"),
#     spearman = cor(session_length, num_clicks, method = "spearman"),
#     kendall = cor(session_length, num_clicks, method = "kendall")
#   )
# 
# busca_grupo_a_cor = buscas %>%
#     filter(group == 'a') %>%
#     summarise(
#     pearson = cor(session_length, num_clicks, method = "pearson"),
#     spearman = cor(session_length, num_clicks, method = "spearman"),
#     kendall = cor(session_length, num_clicks, method = "kendall")
#   )
# 
# busca_grupo_b_cor = buscas %>%
#     filter(group == 'b') %>%
#     summarise(
#     pearson = cor(session_length, num_clicks, method = "pearson"),
#     spearman = cor(session_length, num_clicks, method = "spearman"),
#     kendall = cor(session_length, num_clicks, method = "kendall")
#   )

    
LS0tCnRpdGxlOiAiV2lraW1lZGlhIgphdXRob3I6ICJBbmRyw6kgRmVsaXBlIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKIyAgICAgaHRtbF9kb2N1bWVudDoKIyAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKIyAgICAgICB0b2M6IHRydWUKIyAgICAgZGZfcHJpbnQ6IHBhZ2VkCiMgdGhlbWU6IHNhbmRzdG9uZQotLS0KCk8gb2JqZXRvIHByaW5jaXBhbCBkYSBhbsOhbGlzZSBzw6NvIGFzIGJ1c2NhcyBlIGEgbmF2ZWdhw6fDo28gZGVwb2lzIGRhIGJ1c2NhLiBDcmlhbW9zIGVzc2VzIGRhZG9zIGEgcGFydGlyIGRvcyBkYWRvcyBvcmlnaW5haXMgZGEgd2lraW1lZGlhIGVtIGAvZGF0YS9zZWFyY2hfZGF0YS5jc3ZgLiAKCkFxdWksIGV4cGxvcmFtb3MgZXNzZXMgZGFkb3MuIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShncmlkRXh0cmEpCnRoZW1lX3NldCh0aGVtZV9idygpKQpvcHRpb25zKHNjaXBlbj05OTkpICMgbmFvIG1vc3RyYSBudW1lcm9zIGVtIG5vdGFjYW8gY2llbnRpZmljYQpgYGAKCmBgYHtyIEVUTH0KYnVzY2FzID0gcmVhZF9jc3YoaGVyZTo6aGVyZSgiZGF0YS9zZWFyY2hfZGF0YS5jc3YiKSkKCmdsaW1wc2UoYnVzY2FzKQpgYGAKCmBgYHtyfQpidXNjYXMgJT4lIAogICAgZ2dwbG90KGFlcyh4ID0gcmVzdWx0cykpICsgCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUpIApgYGAKCgo8IS0tIFRhc2sgCgogICAgICAgIFlvdSBtdXN0IGNyZWF0ZSBhIHJlcHJvZHVjaWJsZSByZXBvcnQgYW5zd2VyaW5nIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zOgoKMSkgV2hhdCBpcyBvdXIgZGFpbHkgb3ZlcmFsbCBjbGlja3Rocm91Z2ggcmF0ZT8gSG93IGRvZXMgaXQgdmFyeSBiZXR3ZWVuIHRoZSBncm91cHM/IAoyKSBXaGljaCByZXN1bHRzIGRvIHBlb3BsZSB0ZW5kIHRvIHRyeSBmaXJzdD8gSG93IGRvZXMgaXQgY2hhbmdlIGRheS10by1kYXk/IAozKSBXaGF0IGlzIG91ciBkYWlseSBvdmVyYWxsIHplcm8gcmVzdWx0cyByYXRlPyBIb3cgZG9lcyBpdCB2YXJ5IGJldHdlZW4gdGhlIGdyb3Vwcz8gCjQpIExldCBzZXNzaW9uIGxlbmd0aCBiZSBhcHByb3hpbWF0ZWx5IHRoZSB0aW1lIGJldHdlZW4gdGhlIGZpcnN0IGV2ZW50IGFuZCB0aGUgbGFzdCBldmVudCBpbiBhIHNlc3Npb24uIENob29zZSBhIHZhcmlhYmxlIGZyb20gdGhlIGRhdGFzZXQgYW5kIGRlc2NyaWJlIGl0cyByZWxhdGlvbnNoaXAgdG8gc2Vzc2lvbiBsZW5ndGguIFZpc3VhbGl6ZSB0aGUgcmVsYXRpb25zaGlwLiAKNSkgU3VtbWFyaXplIHlvdXIgZmluZGluZ3MgaW4gYW4gZXhlY3V0aXZlIHN1bW1hcnkuIAotLT4KCiMjIFRhcmVmYSAKCiMjIFZvY8OqIGRldmUgY3JpYXIgdW0gcmVsYXTDs3JpbyByZXByb2R1esOtdmVsIHJlc3BvbmRlbmRvIMOgcyBzZWd1aW50ZXMgcGVyZ3VudGFzOgoKIyMjIDEpIFF1YWwgw6kgYSBub3NzYSB0YXhhIGRlIGNsaXF1ZXMgZ2VyYWwgZGnDoXJpYT8gQ29tbyBpc3NvIHZhcmlhIGVudHJlIG9zIGdydXBvcz8KClZhbW9zIGFuYWxpc2FyIG8gbsO6bWVybyBnZXJhbCBkZSBjbGlxdWVzIGUgYSBtw6lkaWEgZGUgY2xpcXVlcyBhcGVuYXMgcXVhbmRvIG8gdXN1w6FyaW8gY2xpY2EgZW0gYWxndW1hIGNvaXNhLCBvdSBzZWphLCBxdWFuZG8gbnVtX2NsaWNrcyA+IDAgbm8gZ2VyYWwuCgpgYGB7cn0KI2NvbHVuYSBkaWEgZGF5CmJ1c2NhcyA8LSBtdXRhdGUoYnVzY2FzLCBkYXkgPSByb3VuZF9kYXRlKGJ1c2NhcyRzZXNzaW9uX3N0YXJ0X2RhdGUsICJkYXkiKSkKCiNjb2x1bmEgZGF0YSBkYXRlCmJ1c2NhcyA8LSBtdXRhdGUoYnVzY2FzLCBkYXRlID0gYXMuRGF0ZShmb3JtYXQoc2Vzc2lvbl9zdGFydF9kYXRlLCAiJVktJW0tJWQiKSkpCgpjbGlxdWVzX3Bvcl9kaWFfZ2VyYWwgPSBidXNjYXMgJT4lIApmaWx0ZXIobnVtX2NsaWNrcyA+IDApICU+JQpncm91cF9ieShkYXRlKSAlPiUKc3VtbWFyaXNlKHRvdGFsX2NsaWNrcyA9IHN1bShudW1fY2xpY2tzKSkKCiAgZ2dwbG90KGRhdGE9Y2xpcXVlc19wb3JfZGlhX2dlcmFsLCBhZXMoeCA9IGRhdGUsIHkgPSB0b3RhbF9jbGlja3MpKSArCiAgZ2VvbV9saW5lKCkgKyAKICAgIGdlb21fcG9pbnQoKSArIAogICAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgZGF5IikgKwogICAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwxMDAwMCwyMDApLCB0cmFucyA9ICJsb2cxMCIpICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwxMDAwMCwyMDApKSArCiAgbGFicygKICAgICAgeCA9ICJEYXRhIiwKICAgICAgeSA9ICJjbGlxdWVzIiwKICAgICAgdGl0bGUgPSAiVG90YWwgZGUgY2xpcXVlcyBwb3IgZGlhIikgCiAgCiAgbWVkaWFfY2xpcXVlc19wb3JfZGlhX2dlcmFsID0gYnVzY2FzICU+JSAKZmlsdGVyKG51bV9jbGlja3MgPiAwKSAlPiUKZ3JvdXBfYnkoZGF0ZSkgJT4lCnN1bW1hcmlzZShtZWRpYV90b3RhbF9jbGlja3MgPSBtZWFuKG51bV9jbGlja3MpKQoKCiAgZ2dwbG90KGRhdGE9bWVkaWFfY2xpcXVlc19wb3JfZGlhX2dlcmFsLCBhZXMoeCA9IGRhdGUsIHkgPSBtZWRpYV90b3RhbF9jbGlja3MpKSArCiAgZ2VvbV9saW5lKCkgKyAKICAgIGdlb21fcG9pbnQoKSArIAogICAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgZGF5IikgKwogICAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwxMDAwMCwyMDApLCB0cmFucyA9ICJsb2cxMCIpICsKICAgICNzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMTAwMDAsMjAwKSkgKwogIGxhYnMoCiAgICAgIHggPSAiRGF0YSIsCiAgICAgIHkgPSAiY2xpcXVlcyIsCiAgICAgIHRpdGxlID0gIk3DqWRpYSBkZSBjbGlxdWVzIHBvciBkaWEiKQoKYGBgClZhbW9zIGFuYWxpc2FyIG8gbsO6bWVybyBnZXJhbCBkZSBjbGlxdWVzIGUgYSBtw6lkaWEgZGUgY2xpcXVlcyBhcGVuYXMgcXVhbmRvIG8gdXN1w6FyaW8gY2xpY2EgZW0gYWxndW1hIGNvaXNhLCBvdSBzZWphLCBxdWFuZG8gbnVtX2NsaWNrcyA+IDAgcG9yIGdydXBvLgoKYGBge3J9CgpjbGlxdWVzX3Bvcl9kaWFfZ2VyYWwgPSBidXNjYXMgJT4lIApmaWx0ZXIobnVtX2NsaWNrcyA+IDApICU+JQpncm91cF9ieShkYXRlLCBncm91cCkgJT4lCnN1bW1hcmlzZSh0b3RhbF9jbGlja3MgPSBzdW0obnVtX2NsaWNrcykpCgogIGdncGxvdChkYXRhPWNsaXF1ZXNfcG9yX2RpYV9nZXJhbCwgYWVzKHggPSBhcy5EYXRlKGRhdGUpLCB5ID0gdG90YWxfY2xpY2tzLCBjb2xvciA9IGdyb3VwKSkgKwogIGdlb21fbGluZSgpICsgCiAgICBnZW9tX3BvaW50KCkgKyAKICAgIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIGRheSIpICsKICAgICNzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMTAwMDAsMjAwKSwgdHJhbnMgPSAibG9nMTAiKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsNjAwMCwyMDApKSArCiAgbGFicygKICAgICAgeSA9ICJjbGlxdWVzIiwKICAgICAgeCA9ICJEYXRhIiwKICAgICAgdGl0bGUgPSAiVG90YWwgZGUgY2xpcXVlcyBwb3IgZGlhIHBvciBncnVwbyIpIAogIAogIG1lZGlhX2NsaXF1ZXNfcG9yX2RpYV9nZXJhbCA9IGJ1c2NhcyAlPiUgCmZpbHRlcihudW1fY2xpY2tzID4gMCkgJT4lCmdyb3VwX2J5KGRhdGUsIGdyb3VwKSAlPiUKc3VtbWFyaXNlKG1lZGlhX3RvdGFsX2NsaWNrcyA9IG1lYW4obnVtX2NsaWNrcykpCgoKICBnZ3Bsb3QoZGF0YT1tZWRpYV9jbGlxdWVzX3Bvcl9kaWFfZ2VyYWwsIGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeSA9IG1lZGlhX3RvdGFsX2NsaWNrcywgY29sb3IgPSBncm91cCkpICsKICBnZW9tX2xpbmUoKSArIAogICAgZ2VvbV9wb2ludCgpICsgCiAgICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBkYXkiKSArCiAgICAjc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDEwMDAwLDIwMCksIHRyYW5zID0gImxvZzEwIikgKwogICAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwwLjYsMC4xKSkgKwogIGxhYnMoCiAgICAgIHkgPSAiY2xpcXVlcyIsCiAgICAgIHggPSAiRGF0YSIsCiAgICAgIHRpdGxlID0gIk3DqWRpYSBkZSBjbGlxdWVzIHBvciBkaWEgcG9yIGdydXBvIikKCmBgYAoKIyMjIDIpIFF1YWlzIHJlc3VsdGFkb3MgYXMgcGVzc29hcyB0ZW5kZW0gYSBleHBlcmltZW50YXIgcHJpbWVpcm8/IENvbW8gaXNzbyBtdWRhIG5vIGRpYS1hLWRpYT8gCgpWYW1vcyBvYnNlcnZhciBhIGRpc3RyaWJ1acOnw6NvIGRlIHF1YWwgcmVzdWx0YWRvIGFzIHBlc3NvYXMgY2xpY2FtIHByaW1laXJvIHBvciBncnVwby4gUGVsYSBkaXN0cmlidWnDp8OjbywgdmVtb3MgcXVlIGEgbWFpb3IgcGFydGUgZXhwZXJpbWVudGFtIG9zIHJlc3VsdGFkb3MgZGUgMSBhIDcuCgpgYGB7cn0KCmJ1c2NhcyAlPiUgCiAgICBmaWx0ZXIoIWlzLm5hKGZpcnN0X2NsaWNrKSwgZmlyc3RfY2xpY2s8PTIwKSAlPiUKICAgIGNvdW50KGZpcnN0X2NsaWNrLCBncm91cCkgJT4lIAogICAgZ2dwbG90KGFlcyh4ID0gZmlyc3RfY2xpY2ssIHkgPSBuLCBmaWxsID0gZ3JvdXApKSArIAogICAgZ2VvbV9hcmVhKCkgKwogICAgI3NjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwyMCwxKSwgdHJhbnMgPSAibG9nMTAiKSAKICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwyMCwxKSkgKwogICAgbGFicygKICAgICAgeCA9ICJQcmltZWlybyBjbGlxdWUiLAogICAgICB5ID0gIk7Dum1lcm8gZGUgY2xpcXVlcyIsCiAgICAgIGZpbGwgPSAiR3J1cG8iLAogICAgICB0aXRsZSA9ICIiKQoKYGBgCgojIyMgMykgUXVhbCDDqSBhIG5vc3NhIHRheGEgZGUgcmVzdWx0YWRvcyB6ZXJvIG5vIGdlcmFsPyBDb21vIGlzc28gdmFyaWEgZW50cmUgb3MgZ3J1cG9zPyAKClZhbW9zIG9ic2VydmFyIG8gbsO6bWVybyBkZSByZXN1bHRhZG9zIHplcm8gYSBjYWRhIGRpYSBwb3IgZ3J1cG8gZSBnZXJhbC4KRGVwb2lzLCB2YW1vcyB2aXN1YWxpemFyIGEgbcOpZGlhIGRlIHJlc3VsdGFkb3MgemVybyBhIGNhZGEgZGlhIHBvciBncnVwbyBlIGdlcmFsLgoKYGBge3J9CgpyZXN1bHRhZG9femVyb19kaWFyaW9fZ2VyYWwgPSBidXNjYXMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIocmVzdWx0cz09MCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoZGF0ZSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShudW1lcm9fcmVzdWx0YWRvX3plcm9fZ2VyYWw9bigpKSAKCnJlc3VsdGFkb190b3RhbF9kaWFyaW9fZ2VyYWwgPSBidXNjYXMgICU+JQogICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieShkYXRlKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UodG90YWxfcmVzdWx0YWRvc19nZXJhbD1uKCkpCgpyZXN1bHRhZG9femVyb19kaWFyaW9fZ3J1cG8gPSBidXNjYXMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIocmVzdWx0cz09MCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoZGF0ZSwgZ3JvdXApICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobnVtZXJvX3Jlc3VsdGFkb196ZXJvX2dydXBvPW4oKSkgCgpyZXN1bHRhZG9fdG90YWxfZGlhcmlvX2dydXBvID0gYnVzY2FzICAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoZGF0ZSwgZ3JvdXApICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSh0b3RhbF9yZXN1bHRhZG9zX2dydXBvPW4oKSkKCgoKY2FsY3Vsb190YXhhX3Jlc3VsdGFkb196ZXJvX2dlcmFsID0gcmVzdWx0YWRvX3plcm9fZGlhcmlvX2dlcmFsICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyX2pvaW4ocmVzdWx0YWRvX3RvdGFsX2RpYXJpb19nZXJhbCwgYnk9YygiZGF0ZSIpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGF4YV9yZXN1bHRhZG9femVyb19nZXJhbCA9IG51bWVyb19yZXN1bHRhZG9femVyb19nZXJhbC90b3RhbF9yZXN1bHRhZG9zX2dlcmFsKQoKY2FsY3Vsb190YXhhX3Jlc3VsdGFkb196ZXJvX2dydXBvID0gcmVzdWx0YWRvX3plcm9fZGlhcmlvX2dydXBvICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyX2pvaW4ocmVzdWx0YWRvX3RvdGFsX2RpYXJpb19ncnVwbywgYnk9YygiZGF0ZSIsICJncm91cCIpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGF4YV9yZXN1bHRhZG9femVyb19ncnVwbyA9IG51bWVyb19yZXN1bHRhZG9femVyb19ncnVwby90b3RhbF9yZXN1bHRhZG9zX2dydXBvKQoKCmdncGxvdChkYXRhPXJlc3VsdGFkb196ZXJvX2RpYXJpb19nZXJhbCwgYWVzKHg9ZGF0ZSwgeT1udW1lcm9fcmVzdWx0YWRvX3plcm9fZ2VyYWwpKSsKZ2VvbV9saW5lKCkgKyAKZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgZGF5IikgKwogICNzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjYwMCwxMDApKSArCiAgbGFicyh0aXRsZSA9ICIiLAogICAgICAgeCA9ICJEYXRhIiwgCiAgICAgICB5PSJSZXN1bHRhZG9zIFplcm8iLAogICAgICAgZ3JvdXAgPSAiIikKCmdncGxvdChkYXRhPXJlc3VsdGFkb196ZXJvX2RpYXJpb19ncnVwbywgYWVzKHg9ZGF0ZSwgeT1udW1lcm9fcmVzdWx0YWRvX3plcm9fZ3J1cG8sIGdyb3VwPWdyb3VwLCBjb2xvcj1ncm91cCkpKwpnZW9tX2xpbmUoKSArIApnZW9tX3BvaW50KCkgKyAKICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBkYXkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDI2MDAsMTAwKSkgKwogIGxhYnModGl0bGUgPSAiIiwKICAgICAgIHggPSAiRGF0YSIsIAogICAgICAgeT0iUmVzdWx0YWRvcyBaZXJvIiwKICAgICAgIGdyb3VwID0gIkdydXBvIiwgCiAgICAgICBjb2xvciA9ICJHcnVwbyIpCiAgCmdncGxvdChkYXRhPWNhbGN1bG9fdGF4YV9yZXN1bHRhZG9femVyb19nZXJhbCwgYWVzKHg9ZGF0ZSwgeT10YXhhX3Jlc3VsdGFkb196ZXJvX2dlcmFsKSkrCmdlb21fbGluZSgpICsgCmdlb21fcG9pbnQoKSArIAogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIGRheSIpICsKICAjc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDI2MDAsMTAwKSkgKwogIGxhYnModGl0bGUgPSAiIiwKICAgICAgIHggPSAiRGF0YSIsIAogICAgICAgeT0iUmVzdWx0YWRvcyBaZXJvIiwKICAgICAgIGdyb3VwID0gIiIpCgpnZ3Bsb3QoZGF0YT1jYWxjdWxvX3RheGFfcmVzdWx0YWRvX3plcm9fZ3J1cG8sIGFlcyh4PWRhdGUsIHk9dGF4YV9yZXN1bHRhZG9femVyb19ncnVwbywgZ3JvdXA9Z3JvdXAsIGNvbG9yPWdyb3VwKSkrCmdlb21fbGluZSgpICsgCmdlb21fcG9pbnQoKSArIAogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIGRheSIpICsKICAjc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDI2MDAsMTAwKSkgKwogIGxhYnModGl0bGUgPSAiIiwKICAgICAgIHggPSAiRGF0YSIsIAogICAgICAgeT0iUmVzdWx0YWRvcyBaZXJvIiwKICAgICAgIGdyb3VwID0gIkdydXBvIiwgCiAgICAgICBjb2xvciA9ICJHcnVwbyIpCgpgYGAKCiMjIyA0KSBTZWphIGEgZHVyYcOnw6NvIGRhIHNlc3PDo28gYXByb3hpbWFkYW1lbnRlIG8gdGVtcG8gZW50cmUgbyBwcmltZWlybyBlIG8gw7psdGltbyBldmVudG8gZGUgdW1hIHNlc3PDo28uIEVzY29saGEgdW1hIHZhcmnDoXZlbCBkbyBjb25qdW50byBkZSBkYWRvcyBlIGRlc2NyZXZhIHN1YSByZWxhw6fDo28gY29tIG8gdGFtYW5obyBkYSBzZXNzw6NvLiBWaXN1YWxpemUgbyByZWxhY2lvbmFtZW50by4KCkVzY29saGVtb3MgYSB2YXJpw6F2ZWwgbsO6bWVybyBkZSBjbGlxdWVzIGUgdmVtb3Mgc3VhIHJlbGHDp8OjbyBjb20gbyB0YW1hbmhvIGRhIHNlc3PDo28uIApBcMOzcywgdmFtb3MgdmlzdWFsaXphciBjb3JyZWxhw6fDo28gZW50cmUgYXMgdmFyacOhdmVpcyAocGVhcnNvbiwgc3BlYXJtYW4sIGtlbmRhbGwpIAoKYGBge3J9Cgpjb3JfYnVzY2FzX2dlcmFsID0gYnVzY2FzICU+JQogICAgZmlsdGVyICghaXMubmEoc2Vzc2lvbl9sZW5ndGgpLCBzZXNzaW9uX2xlbmd0aCAhPSAwKSAKCiAgICBnZ3Bsb3QoZGF0YSA9IGNvcl9idXNjYXNfZ2VyYWwsIGFlcyh4ID0gc2Vzc2lvbl9sZW5ndGgsIHkgPSBudW1fY2xpY2tzKSkgKyAKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAnbG9nMTAnKSArCiAgICAjZmFjZXRfd3JhcCh+IGdyb3VwKSAgKwogICAgbGFicygKICAgICAgICB4ID0gImR1cmHDp8OjbyBkYSBzZXNzw6NvIiwKICAgICAgICB5ID0gImNsaXF1ZXMiLAogICAgICAgIHRpdGxlID0gIkdlcmFsIikgCgpjb3JfYnVzY2FzX2dydXBvID0gYnVzY2FzICU+JQogICAgZmlsdGVyICghaXMubmEoc2Vzc2lvbl9sZW5ndGgpLCBzZXNzaW9uX2xlbmd0aCAhPSAwKSAKCiAgICBnZ3Bsb3QoZGF0YSA9IGNvcl9idXNjYXNfZ3J1cG8sIGFlcyh4ID0gc2Vzc2lvbl9sZW5ndGgsIHkgPSBudW1fY2xpY2tzKSkgKyAKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAnbG9nMTAnKSArCiAgICBmYWNldF93cmFwKH4gZ3JvdXApICArCiAgICBsYWJzKAogICAgICAgIHggPSAiZHVyYcOnw6NvIGRhIHNlc3PDo28iLAogICAgICAgIHkgPSAiY2xpcXVlcyIsCiAgICAgICAgdGl0bGUgPSAiR3J1cG8iKSAKIyAKIyBidXNjYV9nZXJhbF9jb3IgPSBjb3JfYnVzY2FzX2dlcmFsICU+JQojICAgICBzdW1tYXJpc2UoCiMgICAgIHBlYXJzb24gPSBjb3Ioc2Vzc2lvbl9sZW5ndGgsIG51bV9jbGlja3MsIG1ldGhvZCA9ICJwZWFyc29uIiksCiMgICAgIHNwZWFybWFuID0gY29yKHNlc3Npb25fbGVuZ3RoLCBudW1fY2xpY2tzLCBtZXRob2QgPSAic3BlYXJtYW4iKSwKIyAgICAga2VuZGFsbCA9IGNvcihzZXNzaW9uX2xlbmd0aCwgbnVtX2NsaWNrcywgbWV0aG9kID0gImtlbmRhbGwiKQojICAgKQojIAojIGJ1c2NhX2dydXBvX2FfY29yID0gYnVzY2FzICU+JQojICAgICBmaWx0ZXIoZ3JvdXAgPT0gJ2EnKSAlPiUKIyAgICAgc3VtbWFyaXNlKAojICAgICBwZWFyc29uID0gY29yKHNlc3Npb25fbGVuZ3RoLCBudW1fY2xpY2tzLCBtZXRob2QgPSAicGVhcnNvbiIpLAojICAgICBzcGVhcm1hbiA9IGNvcihzZXNzaW9uX2xlbmd0aCwgbnVtX2NsaWNrcywgbWV0aG9kID0gInNwZWFybWFuIiksCiMgICAgIGtlbmRhbGwgPSBjb3Ioc2Vzc2lvbl9sZW5ndGgsIG51bV9jbGlja3MsIG1ldGhvZCA9ICJrZW5kYWxsIikKIyAgICkKIyAKIyBidXNjYV9ncnVwb19iX2NvciA9IGJ1c2NhcyAlPiUKIyAgICAgZmlsdGVyKGdyb3VwID09ICdiJykgJT4lCiMgICAgIHN1bW1hcmlzZSgKIyAgICAgcGVhcnNvbiA9IGNvcihzZXNzaW9uX2xlbmd0aCwgbnVtX2NsaWNrcywgbWV0aG9kID0gInBlYXJzb24iKSwKIyAgICAgc3BlYXJtYW4gPSBjb3Ioc2Vzc2lvbl9sZW5ndGgsIG51bV9jbGlja3MsIG1ldGhvZCA9ICJzcGVhcm1hbiIpLAojICAgICBrZW5kYWxsID0gY29yKHNlc3Npb25fbGVuZ3RoLCBudW1fY2xpY2tzLCBtZXRob2QgPSAia2VuZGFsbCIpCiMgICApCgogICAgCmBgYAoKPCEtLQojIyMgNSkgUmVzdW1hIHN1YXMgZGVzY29iZXJ0YXMgZW0gdW0gcmVzdW1vIGV4ZWN1dGl2by4KLS0+