Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2021-2022. El repo del trabajo está aquí.

La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.


1. Introducción

Desde hace muchos años, La Liga española ha sido una de las principales, e incluso la principal, liga de fútbol del mundo; sin embargo, tras la pandemia del COVID-21, otras ligas están por encima de esta, con más fichajes y más nivel (es el caso de la Premier). En este trabajo analizamos la situación actual de los equipos de primera división, un poquito de su evolución en los últimos años y terminamos con la parte del trabajo que más tiempo le he dedicado: Predicción de resultados de La Liga.


2. Datos

Los datos que he usado para este trabajo provienen del paquete WorldFootballR, donde he podido obtener la mayoría de los datos acerca de los partidos (para la predicción), de los jugadores, de los fichajes…

El procesamiento de los datos lo veremos con detenimiento en cada uno de los apartados siguientes, pues con el paquete WorldFootballR podemos obtener datos de páginas web de deporte diferentes y cada dataset tendrá un tratamiento diferente

3. La Liga.

3.1 Temporada actual.

Evolución

En primer lugar, vamos a ver la situación actual del valor de los equipos, que, en principio, se esperaba que liderasen la clasificación este año.

Aquí vemos los equipos con mayor valor de la liga, (suma del valor de todos los jugadores del equipo).

Sin embargo, el valor, no siempre asegura victorias, y es el caso de La Liga este año. Esta temporada está siendo especial, y lo podemos analizar con esta tendencia:

En este gráfico vemos cómo el valor del equipo no lo es todo, y con un valor muy bajo, observamos la situación del Rayo Vallecano, en puesto de Europa, por encima de mucho clubes con un valor de jugadores mayor.

También sorprende, negativamente, el Barcelona, que está firmando una temporada extraña dado el valor de su equipo.

La R= 0,8, nos indica que el 80% de los datos se ve representado por la tendencia mostrada en azul en el gráfico, que, aproximadamente nos indica que inversión habría que realizar para conseguir un número determinado de puntos.

Código

valor<-get_player_market_values("Spain", 2021) 

valor<- valor %>% select(squad, player_num, player_age, player_name, player_nationality, current_club,player_foot,
                         date_joined, contract_expiry, player_market_value_euro)

a<-valor %>% group_by(squad) %>% summarise(valor = sum(player_market_value_euro))

b<-a %>% slice_max(valor, n=5) %>% mutate(escudo= c( "https://logodownload.org/wp-content/uploads/2016/03/real-madrid-logo-escudo-1.png",
                                                     "https://4.bp.blogspot.com/-WovWyVV6wK0/WW6rg05K9fI/AAAAAAABNU4/5rrftOg2aX88L8gLqYOnsi4vk5UO0VjTwCLcBGAs/s1600/Club%2BAtletico%2Bde%2BMadrid.png",
                                                     "http://assets.stickpng.com/images/584a9b3bb080d7616d298777.png", 
                                                    "http://assets.stickpng.com/images/584ad36ab519ea740933a8d3.png",
                                                    "http://assets.stickpng.com/thumbs/584ad291b519ea740933a8ba.png"))

p1<- ggplot(b, aes(x= reorder(squad, valor), y= valor, fill= squad), width=0.5) + 
  geom_bar(stat="identity") + scale_fill_brewer(palette = "Accent") + 
  geom_image(aes(image = escudo), size=0.1) + coord_flip() + theme(legend.position = "none")
p1

clasificacion<- get_season_team_stats("ESP", "M", 2022, "1st", "league_table") %>% 
  select(Squad,Pts) %>% rename("squad"= "Squad")
a<-a %>% mutate(squad = ifelse(squad == "Athletic Bilbao", "Athletic Club", squad),
                squad = ifelse(squad == "Atlético de Madrid", "Atlético Madrid", squad),
                squad = ifelse(squad == "CA Osasuna", "Osasuna", squad),
                squad = ifelse(squad == "Cádiz CF", "Cádiz", squad),
                squad = ifelse(squad == "Celta de Vigo", "Celta Vigo", squad),
                squad = ifelse(squad == "Deportivo Alavés", "Alavés", squad),
                squad = ifelse(squad == "Elche CF", "Elche", squad),
                squad = ifelse(squad == "FC Barcelona", "Barcelona", squad),
                squad = ifelse(squad == "Getafe CF", "Getafe", squad),
                squad = ifelse(squad == "Granada CF", "Granada", squad),
                squad = ifelse(squad == "Levante UD", "Levante", squad),
                squad = ifelse(squad == "RCD Espanyol Barcelona", "Espanyol", squad),
                squad = ifelse(squad == "RCD Mallorca", "Mallorca", squad),
                squad = ifelse(squad == "Real Betis Balompié", "Betis", squad),
                squad = ifelse(squad == "Sevilla FC", "Sevilla", squad),
                squad = ifelse(squad == "Valencia CF", "Valencia", squad),
                squad = ifelse(squad == "Villarreal CF", "Villarreal", squad),)

c<-full_join(a,clasificacion) 

ggplot(data = c, aes(valor, Pts, label = squad)) +
  geom_point(aes(color=squad)) + 
  geom_smooth(method = "lm", se = FALSE) +
  geom_text_repel() +
  theme_classic() +
  xlab("Valor del equipo") +
  ylab("Puntos") +
  theme(legend.position = "none") +
  stat_cor(label.x = 50000000, label.y = 42) 

3.1 Temporadas anteriores.

Este año, nos sorprende cómo la pelea por la liga no es entre el FC Barcelona, Atlético de Madrid y el Real Madrid.

Últimos años

Aquí vemos la evolución de los últimos años, siendo y la posición en la liga; es decir, cuanto más abajo, mejor.

Este año, como dijimos está siendo diferente y los equipos más pequeños están consiguiendo vencer al FC Barcelona y al Atlético de Madrid; quizás es el año del Pancrudo FC, quién sabe.

Código


veintidos<- get_season_team_stats("ESP", "M", 2022, "1st", "league_table") %>% select(Squad, Rk, Pts, Season_End_Year) 
veintiuno<- get_season_team_stats("ESP", "M", 2021, "1st", "league_table") %>% select(Squad, Rk, Pts, Season_End_Year)
veinte<- get_season_team_stats("ESP", "M", 2020, "1st", "league_table") %>% select(Squad, Rk, Pts, Season_End_Year)
diecinueve<- get_season_team_stats("ESP", "M", 2019, "1st", "league_table")%>% select(Squad, Rk, Pts, Season_End_Year)
dieciocho<- get_season_team_stats("ESP", "M", 2018, "1st", "league_table") %>% select(Squad, Rk, Pts, Season_End_Year)
diecisiete<- get_season_team_stats("ESP", "M", 2017, "1st", "league_table")%>% select(Squad, Rk, Pts, Season_End_Year)
dieciseis<- get_season_team_stats("ESP", "M", 2016, "1st", "league_table") %>% select(Squad, Rk, Pts, Season_End_Year)
quince<- get_season_team_stats("ESP", "M", 2015, "1st", "league_table") %>% select(Squad, Rk, Pts, Season_End_Year)
catorce<- get_season_team_stats("ESP", "M", 2014, "1st", "league_table")%>% select(Squad, Rk, Pts, Season_End_Year)
trece<- get_season_team_stats("ESP", "M", 2013, "1st", "league_table") %>% select(Squad, Rk, Pts, Season_End_Year)
doce<- get_season_team_stats("ESP", "M", 2012, "1st", "league_table") %>% select(Squad, Rk, Pts, Season_End_Year)
once<- get_season_team_stats("ESP", "M", 2011, "1st", "league_table")%>% select(Squad, Rk, Pts, Season_End_Year)
diez<- get_season_team_stats("ESP", "M", 2010, "1st", "league_table")%>% select(Squad, Rk, Pts, Season_End_Year)

a<-full_join(veintidos, veintiuno)
b<-full_join(a,veinte)
c<-full_join(b,diecinueve)
d<-full_join(c,dieciocho)
e<-full_join(d,diecisiete)
f<-full_join(e,dieciseis)
g<-full_join(f,quince)
h<-full_join(g,catorce)
i<-full_join(h,trece)
j<-full_join(i,doce)
k<-full_join(j,once)
l<-full_join(k,diez) %>% filter(!Season_End_Year=="2022")

m<- l %>% group_by(Season_End_Year) %>% filter(Squad %in% c( "Real Madrid", "Barcelona", "Atlético Madrid"))

ggplot(m, aes(Season_End_Year, Rk, color=Squad)) + geom_line() + 
  theme(legend.position = "none") 


x<-ggplot(m,aes(x= Season_End_Year, y= Rk)) + 
  labs(title = "Evolución posiciones en liga",
       x= "Año",
       y= "Posición",
       color = "Equipo") +
  geom_point(aes(color= Squad), size= 3) +
  geom_line(aes(color= Squad), size= 1.5) + 
  scale_color_manual(values= c("red", "#900C3F", "white"),
                     labels = c("Atlético de Madrid",
                                "FC Barcelona",
                                "Real Madrid"))+
  theme_minimal() +
  theme(plot.title = element_text(size = 20, face = "bold",
                                  hjust = 0.5),
        axis.title.x = element_text(size = 13, hjust = 1,
                                    vjust = 0),
        axis.title.y = element_text(size = 13, hjust = 1, vjust = 1),
        legend.title = element_text(face = "bold"),
        plot.background = element_rect(colour = "#B082FF"),
        panel.background = element_rect(colour = "#B082FF")) +
  transition_reveal(Season_End_Year) + 
  view_follow()

x + theme(panel.grid.major = element_line(colour = "#B082FF"),
    panel.grid.minor = element_line(colour = "#B082FF"),
    panel.background = element_rect(fill = "#B082FF"),
    plot.background = element_rect(fill = "#B082FF"))

4. Otras ligas.

Inversión

Es necesario ver una de las razones por las que poco a poco La Liga ha ido perdiendo calidad frente a otras ligas, y esa razón es la inversión en jugadores de alto nivel:

Código

library(tidyverse)
library(worldfootballR)


library(gridExtra)

library(readr)
spain2020 <- read_csv("./datos/spain2020.csv")
england2020 <- read_csv("./datos/england2020.csv")
france2020 <- read_csv("./datos/france2020.csv")

a<-spain2020 %>% filter(!is.na(transfer_fee)) %>% filter(transfer_type=="Arrivals") %>%
  select(country,season, player_name, team_name,transfer_fee, player_age, player_position)%>% 
  mutate(suma= sum(transfer_fee))
b<- england2020 %>% filter(!is.na(transfer_fee)) %>%
  select(country,season, player_name, team_name,transfer_fee, player_age, player_position)%>% 
  mutate(suma= sum(transfer_fee))
c<- france2020 %>% filter(!is.na(transfer_fee)) %>%
  select(country,season, player_name, team_name,transfer_fee, player_age, player_position) %>% 
  mutate(suma= sum(transfer_fee))



spain2015 <- read_csv("./datos/spain2015.csv")
england2015 <- read_csv("./datos/england2015.csv")
france2015 <- read_csv("./datos/france2015.csv")

d<- spain2015%>% filter(!is.na(transfer_fee)) %>% filter(transfer_type=="Arrivals") %>%
  select(country,season, player_name, team_name,transfer_fee, player_age, player_position)%>% 
  mutate(suma= sum(transfer_fee))
e<-england2015%>% filter(!is.na(transfer_fee)) %>% filter(transfer_type=="Arrivals") %>%
  select(country,season, player_name, team_name,transfer_fee, player_age, player_position)%>% 
  mutate(suma= sum(transfer_fee))
f<-france2015%>% filter(!is.na(transfer_fee)) %>% filter(transfer_type=="Arrivals") %>%
  select(country,season, player_name, team_name,transfer_fee, player_age, player_position)%>% 
  mutate(suma= sum(transfer_fee))

library(ggplot2)

g<-full_join(a, b)
h<-full_join(g,c)
i<-full_join(d,e)
j<-full_join(i,f) %>% filter(!is.na(country))


bar1<-ggplot(h) +
  aes(x = country, fill = country, weight = suma) +
  geom_bar() +
  scale_fill_viridis_d(option = "viridis")+ theme_light()+
  theme(plot.subtitle = element_text(size = 10),
          axis.title = element_text(size = 9),
          plot.title = element_text(size = 13)) + 
  labs(title = "Inversión en jugadores por país",
       x = "Liga (País)", y = "Inversión en jugadores",
       subtitle = "Año: 2020") + theme(legend.position = "none")

bar2<- ggplot(j) +
  aes(x = country, fill = country, weight = suma) +
  geom_bar() +
  scale_fill_viridis_d(option = "viridis")+ theme_light()+
  theme(plot.subtitle = element_text(size = 10),
        axis.title = element_text(size = 9),
        plot.title = element_text(size = 13)) + 
  labs(title = "Inversión en jugadores por país",
       x = "Liga (País)", y = "Inversión en jugadores",
       subtitle = "Año: 2015") + theme(legend.position = "none")

grid.arrange(bar1, bar2, ncol = 2, widths = c(3.5, 3.5))

5. Real Madrid y Vinicius Jr. 

Soy del Real Madrid, y Vinicius es un crack, por tanto, me parecía conveniente dedicarle un pequeño apartado a Vini:

5.1 Vinicius

Vinicius

El año pasado Vinicius no andaba muy acertado de cara a portería…


La verdad que hasta este año Vinicius fallaba mucho, podemos ver en transparente todos los tiro que hizo y los puntos no transparentes son los que acabaron en gol (pocos).

Sin embargo, este año ha cambiado:

Vemos cómo este año ya ha marcado un porcentaje mucho mayor de goles.

Código


veinte<-understat_league_match_results("La liga", 2020)
uno<-understat_league_match_results("La liga", 2021)



#Otra info-----

team_urls<- understat_team_meta("Real Madrid")
RMA<-understat_team_stats_breakdown("https://understat.com/team/Real_Madrid/2020")

vini<-understat_player_shots("https://understat.com/player/7008")

library(ggplot2)

vini2<-vini %>% mutate(X= X*100) %>% mutate(Y = Y*100)

vini2<- vini2 %>% mutate(resultado = case_when( result == "Goal" ~ "1",
                                                result == "MissedShots" ~ "0.4",
                                                result == "BlockedShot" ~ "0.4",
                                                result == "SavedShot" ~ "0.4",
                                                result == "ShotOnPost" ~ "0.3")) %>%
  mutate(resultado= as.numeric(resultado)) %>% mutate(resulta2 = 1-resultado) %>%
  filter(!season == 2021)
  
  
ggplot(vini2) + annotate_pitch(colour = "white",
                                 fill   = "springgreen4",
                                 limits = FALSE) +
  geom_point(aes(x=X, y=100-Y, colour= shotType, alpha = resultado), size=7) +  
  coord_flip(xlim = c(60, 101), ylim = c(-1, 101)) +
  theme_pitch() +  theme(panel.background = element_rect(fill = "springgreen4"))


vini3<-vini %>% mutate(X= X*100) %>% mutate(Y = Y*100)

vini3<- vini3 %>% mutate(resultado = case_when( result == "Goal" ~ "1",
                                                result == "MissedShots" ~ "0.6",
                                                result == "BlockedShot" ~ "0.6",
                                                result == "SavedShot" ~ "0.5",
                                                result == "ShotOnPost" ~ "0.6")) %>%
  mutate(resultado= as.numeric(resultado)) %>% mutate(resulta2 = 1-resultado) %>%
  filter(season == 2021)


ggplot(vini3) + annotate_pitch(colour = "white",
                               fill   = "springgreen4",
                               limits = FALSE) +
  geom_point(aes(x=X, y=100-Y, colour= shotType, alpha = resultado), size=7) +  
  coord_flip(xlim = c(60, 101), ylim = c(-1, 101)) +
  theme_pitch() +  theme(panel.background = element_rect(fill = "springgreen4"))

5.2 Asistentes

Asistentes

Los principales asistentes del Real Madrid esta temporada han sido los siguientes:

Esto explica gran parte de los buenos resultados de Vinicius, el delantero del equipo, Benzema es el principal asistente del Real Madrid, ayudando mucho a quien juega de extremo

Código

a<-get_match_report("https://fbref.com/en/matches/f6fab33c/Getafe-Real-Madrid-January-2-2022-La-Liga")
b<-get_match_summary("https://fbref.com/en/matches/f6fab33c/Getafe-Real-Madrid-January-2-2022-La-Liga")
c<-get_match_lineups("https://fbref.com/en/matches/f6fab33c/Getafe-Real-Madrid-January-2-2022-La-Liga")
d<-get_advanced_match_stats("https://fbref.com/en/matches/f6fab33c/Getafe-Real-Madrid-January-2-2022-La-Liga", "passing", "team")
e<-vini<-understat_player_shots("https://understat.com/player/7008")

e<-e %>% select(minute, player_assisted) %>% group_by(player_assisted) %>% count() %>% 
  filter(!is.na(player_assisted))


m1<-treemap(e, index = "player_assisted",
            vSize = "n",
            type = "index",
            palette = "BrBG",
            border.lwds=3,
            border.col=c("white"),
            fontface.labels=1,
            bg.labels=c("transparent"))

6. Predicciones partidos de la liga

Esta es la parte que más tiempo le he dedicado, he cogido mucha información acerca de las estadísticas de los equipos de La Liga y he creado predicciones de los partidos del fin de semana del 9 de enero (Estas predicciones se han empezado a hacer antes de los partidos del 31 de Diciembre, por lo que los datos de esta jornada no están incluídos).

Vamos a tomar un ejemplo primero de un partido, el Real Madrid Valencia, donde explicaré como lo he hecho y después, usaré el mismo código para todos los partidos y ya veremos si acierto o no…

6.1 Datos

En este caso, vamos a ver el código, pues la idea es que sea fácil de repetir para cualquier partido y he puesto unas pequeñas instrucciones para copiar y pegar el código en un Rscript y poder usarlo para cada partido

#Intrucciones:
#1- Hacer Ctrl+f y reemplazar (Replace): Real Madrid por el equipo local y Valencia por el equipo Visitante
#2- Modificiar la línea que pone IMPORTANTÍSIMO
#3- Reemplaza 2021-12-31 por la fecha del primer partido de la jornada que estudiamos (haciendo lo mismo que en el paso 1)

library(tidyverse)
library(worldfootballR)

#Jugando con FBREF------

clasificacion<- get_season_team_stats("ESP", "M", 2022, "1st", "league_table") %>% 
  select(Squad,Rk,Pts,xG, xGA) 

datos<- get_match_results("ESP", "M", 2022, "1st")

Las instrucciones son simples, he intentado que sea todo bastante “automático” para cambiar lo menos posible. Los datos de donde siempre, tomamos esta temporada, y a jugar…

6.2 +1, -1 …

Como no sabía muy bien como usar los datos mi idea fue simple, partimos de un marcados = 0, y si el equipo Local gana al Visitante en un ámbito (por ejemplo, de media tira más a puerta), le sumo +1 al marcador; si es al revés, le resto -1. En el caso de que el marcador final quede, por ejemplo:

Marcador: -6; es que el equipo visitante tiene más probabilidad de ganar. Vamos allá:

#Vamos a ver la probabilidad de que gane el Real Madrid

ve<- clasificacion %>% 
  filter(Squad %in% c("Real Madrid", "Valencia")) %>% #Poner los equipos que quieras (Local y Visitante)
  mutate(orden= c(2,1)) %>% slice_min(orden, n=2) %>%
  mutate(DxG= xG- lag(xG)) %>% mutate(DPts= Pts - lag(Pts)) %>%
  mutate(DxGA= xGA - lag(xGA)) 

#IMPORTANTÍSIMO, cambiar los números,--> (1,2): Si equipo local es alfabéticamente superior al equipo visitante ej: Real Madrid>Valencia; en caso contrario: (2,1)


prueba<- ve %>% mutate(prueba = 0) %>% 
  mutate( prueba= ifelse(DPts>15, prueba+1, prueba),
          prueba= ifelse(DPts<(-15), prueba-1, prueba),
          prueba= ifelse(DxG>0, prueba+1, prueba-1),
          prueba= ifelse(DxG>10, prueba+1, prueba),
          prueba= ifelse(DxG<(-10), prueba-1, prueba),
          prueba= ifelse(DxGA>0, prueba -1, prueba+1))

#Poner el equipo Local (En ambos) 
#Cuidado, los datos son del 2021-12-31, se debería poner la fecha de la última jornada

Localv<- datos %>% filter(Home == "Real Madrid") %>% filter(Date<"2021-12-31") %>%
  slice_max(Date, n=6) %>% select(Home, HomeGoals, Away, AwayGoals) %>% 
  mutate(Ganador= HomeGoals-AwayGoals) %>% 
  mutate(Resultado = ifelse(Ganador >=1, "1", Ganador)) %>%
  mutate(Resultado = as.numeric( ifelse(Resultado <= -1, "-1", Resultado))) %>%
  summarise(Localv=sum(Resultado)) %>% mutate(Squad= "Real Madrid")

Visitantev <- datos %>% filter(Away=="Real Madrid")%>% filter(Date<"2021-12-31") %>%
  slice_max(Date, n=6) %>% select(Home, HomeGoals, Away, AwayGoals) %>% 
  mutate(Ganador= HomeGoals-AwayGoals) %>% 
  mutate(Resultado = ifelse(Ganador >=1, "-1", Ganador)) %>%
  mutate(Resultado = as.numeric(ifelse(Resultado >= 1, "1", Resultado))) %>% 
  summarise(Visitantev=sum(Resultado)) %>% mutate(Squad= "Real Madrid")

#Poner el equipo visitante (En ambos) 
#Cuidado, los datos son del 2021-12-31, se debería poner la fecha de la última jornada

Locale<- datos %>% filter(Home == "Valencia") %>% filter(Date<"2021-12-31") %>%
  slice_max(Date, n=6) %>% select(Home, HomeGoals, Away, AwayGoals) %>% 
  mutate(Ganador= HomeGoals-AwayGoals) %>% 
  mutate(Resultado = ifelse(Ganador >=1, "1", Ganador)) %>%
  mutate(Resultado = as.numeric( ifelse(Resultado <= -1, "-1", Resultado))) %>%
  summarise(Localv=sum(Resultado)) %>% mutate(Squad= "Valencia")

Visitantee <- datos %>% filter(Away=="Valencia")%>% filter(Date<"2021-12-31") %>%
  slice_max(Date, n=6) %>% select(Home, HomeGoals, Away, AwayGoals) %>% 
  mutate(Ganador= HomeGoals-AwayGoals) %>% 
  mutate(Resultado = ifelse(Ganador >=1, "-1", Ganador)) %>%
  mutate(Resultado = as.numeric(ifelse(Resultado >= 1, "1", Resultado))) %>% 
  summarise(Visitantee=sum(Resultado)) %>% mutate(Squad= "Valencia")

prueba<-full_join(prueba,Localv) 
prueba<-full_join(prueba, Visitantee)
prueba<-prueba %>% mutate(DGan= Localv-lag(Visitantee)) %>%
  mutate(prueba= ifelse(DGan>0, prueba+1, prueba),
         prueba= ifelse(DGan<0, prueba-1, prueba))


#Ahora vamos a crear una variable que sea la suma de todas las variables de defensa: presión con éxito, bloquear un pase... pero como tienen distintas magnitudes, vamos a tipificar la variable para poder sumarlas

vamos<-get_season_team_stats(country = "ESP", gender = "M", season_end_year = 2022,tier="1st", stat_type =  "defense")


vamosT<- vamos %>% select(Squad,TklW_Tackles, Succ_Pressures, Blocks_Blocks) %>% 
  mutate(TklW_Tackles = (TklW_Tackles- mean(TklW_Tackles))/sd(TklW_Tackles)) %>%
  mutate(Succ_Pressures = (Succ_Pressures- mean(Succ_Pressures))/sd(Succ_Pressures)) %>%
  mutate(Blocks_Blocks = (Blocks_Blocks- mean(Blocks_Blocks))/sd(Blocks_Blocks)) %>% 
  filter(Squad %in% c("vs Valencia", "Real Madrid")) %>% #vs es el equipo visitante y el otro el equipo local
  mutate(Squad = ifelse(Squad=="vs Valencia", "Valencia", Squad)) #Esto es un coñazo pero hay que cambiarlo


prueba<-full_join(prueba, vamosT) %>% 
  mutate(Ddef= (TklW_Tackles - lag(TklW_Tackles)) + (Succ_Pressures - lag(Succ_Pressures))+ (Blocks_Blocks- lag(Blocks_Blocks)))

prueba<- prueba %>% mutate(prueba = ifelse(Ddef > 0, prueba+1 , prueba-1))

#Vamos a hacer lo mismo con los pases:

vamos2<-get_season_team_stats(country = "ESP", gender = "M", season_end_year = 2022,tier="1st", stat_type = "passing")


vamosT2<- vamos2 %>% select(Squad,Cmp_percent_Total,Ast,A_minus_xA, Final_Third, Prog)%>% 
  mutate(Cmp_percent_Total = (Cmp_percent_Total- mean(Cmp_percent_Total))/sd(Cmp_percent_Total)) %>%
  mutate(Ast = (Ast- mean(Ast))/sd(Ast)) %>%
  mutate(A_minus_xA = (A_minus_xA- mean(A_minus_xA))/sd(A_minus_xA)) %>% 
  mutate(Final_Third = (Final_Third- mean(Final_Third))/sd(Final_Third)) %>%
  mutate(Prog = (Prog- mean(Prog))/sd(Prog)) %>%
  filter(Squad %in% c("vs Valencia", "Real Madrid")) %>% #vs es el equipo visitante y el otro el equipo local
  mutate(Squad = ifelse(Squad=="vs Valencia", "Valencia", Squad)) #Esto es un coñazo pero hay que cambiarlo

prueba<-full_join(prueba, vamosT2) %>% 
  mutate(Dpas= (Cmp_percent_Total - lag(Cmp_percent_Total)) + (Ast - lag(Ast))+ (A_minus_xA- lag(A_minus_xA))+ (Final_Third - lag(Final_Third))+ (Prog- lag(Prog)))

prueba<- prueba %>% mutate(prueba = ifelse(Dpas > 0, prueba+1 , prueba-1))

#Lo mismo con los disparos:

vamos3<-get_season_team_stats(country = "ESP", gender = "M", season_end_year = 2022,tier="1st", stat_type = "shooting")


vamosT3<- vamos3 %>% select(Squad,Gls_Standard, SoT_Standard,G_per_Sh_Standard)  %>% 
  mutate(Gls_Standard = (Gls_Standard- mean(Gls_Standard))/sd(Gls_Standard)) %>%
  mutate(SoT_Standard = (SoT_Standard- mean(SoT_Standard))/sd(SoT_Standard)) %>%
  mutate(G_per_Sh_Standard = (G_per_Sh_Standard- mean(G_per_Sh_Standard))/sd(G_per_Sh_Standard)) %>% 
  filter(Squad %in% c("vs Valencia", "Real Madrid")) %>% #vs es el equipo visitante y el otro el equipo local
  mutate(Squad = ifelse(Squad=="vs Valencia", "Valencia", Squad)) #Esto es un coñazo pero hay que cambiarlo

prueba<-full_join(prueba, vamosT3) %>% 
  mutate(Ddis= (Gls_Standard - lag(Gls_Standard)) + (SoT_Standard - lag(SoT_Standard))+ (G_per_Sh_Standard- lag(G_per_Sh_Standard)))

prueba<- prueba %>% mutate(prueba = ifelse(Ddis > 0, prueba+1 , prueba-1))

#Limpio un poquito el DF prueba:

prueba<- prueba %>% select(Squad, orden, prueba)


#Hago lo mismo con la posesión:

vamos4<-get_season_team_stats(country = "ESP", gender = "M", season_end_year = 2022,tier="1st", stat_type = "possession")


vamosT4<- vamos4 %>% select(Squad, Poss,Succ_percent_Dribbles, Final_Third_Carries)%>% 
  mutate(Poss = (Poss- mean(Poss))/sd(Poss)) %>%
  mutate(Succ_percent_Dribbles = (Succ_percent_Dribbles- mean(Succ_percent_Dribbles))/sd(Succ_percent_Dribbles)) %>%
  mutate(Final_Third_Carries = (Final_Third_Carries- mean(Final_Third_Carries))/sd(Final_Third_Carries)) %>% 
  filter(Squad %in% c("vs Valencia", "Real Madrid")) %>% #vs es el equipo visitante y el otro el equipo local
  mutate(Squad = ifelse(Squad=="vs Valencia", "Valencia", Squad)) #Esto es un rollo pero hay que cambiarlo

prueba<-full_join(prueba, vamosT4) %>% 
  mutate(Ddis= (Poss - lag(Poss)) + (Succ_percent_Dribbles - lag(Succ_percent_Dribbles))+ (Final_Third_Carries- lag(Final_Third_Carries)))

prueba<- prueba %>% mutate(prueba = ifelse(Ddis > 0, prueba+1 , prueba-1))

En vez de marcador, lo llamé prueba, como podemos ver. Y a estas alturas, después de aplicar los criterios que he considerado, está tal que así:

Squad prueba
Valencia NA
Real Madrid 7

Pero esto queda un poco raro… además, surge el problema de que el marcador quede en 0, o en +/- 1, lo cual tampoco sería un resultado muy claro…

Resultado_final<- prueba %>% select(Squad, prueba) %>%
  mutate(Ganador = ifelse(prueba > 1, "Equipo local", prueba),
         Ganador = ifelse(prueba==1, "Nada concluyente", Ganador),
         Ganador = ifelse(prueba==(-1), "Nada concluyente", Ganador),
         Ganador = ifelse(prueba==0, "Nada concluyente", Ganador),
         Ganador = ifelse(prueba<(-1), "Equipo visitante", Ganador)

Ahora ya lo tenemos… ¿Y qué significa cada cosa? Equipo local y Equipo visitante es el ganador; en el caso de Nada Concluyente, es que el partido va a estar bastante igualado y el resultado será o empate o una victorio por un gol sólo.

Veamos el resultado en el caso del partido Real Madrid-Valencia:

prueba Ganador
7 Equipo local

Y parece que he acertado… el Real Madrid ganó 4-1 al Valencia

6.2 Resto de la jornada

Granada-Barcelona

prueba Ganador
0 Nada concluyente

Hemos acertado! Y este era difícil… Nada concluyente= Empate o diferencia de un gol.

Levante-Mallorca

prueba Ganador
-3 Equipo visitante

Real Sociedad-Celta de Vigo

prueba Ganador
1 Nada concluyente

Rayo Vallecano -Betis

prueba Ganador
-1 Nada concluyente

Sevilla-Getafe

prueba Ganador
6 Equipo local

Osasuna-Cádiz

prueba Ganador
-1 Nada concluyente

Villarreal-Atlético de Madrid

prueba Ganador
3 Equipo local

Espanyol-Elche

prueba Ganador
1 Nada concluyente

7. Trabajos en los que te has basado

Los dos trabajos en los que me he inspirado han sido:

8. RECUERDA!!!

Recuerda que tienes que mandarme un mail con tu nombre, usuario de Github y nombre de tu trabajo


Recuerda que el repo de Github se ha de llamar EXACTAMENTE “trabajo_BigData”


Por favor, no cambies el primer párrafo. Sirve para dar contexto al trabajo y remitir a los potenciales lectores a la web del curso y poder ver los otros trabajos. Bueno, si que has de cambiar algo: has de sutituir “perezp44” por tu usuario de Github, tanto en el archivo index.Rmd como en el Readme.Rmd


R️ecuerda, el 7 de enero fecha límite para la entrega .(Perdón…)


9. Bibliografía





Información de mi R-sesión:

- Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 4.1.1 (2021-08-10)
 os       Windows 10 x64              
 system   x86_64, mingw32             
 ui       RTerm                       
 language (EN)                        
 collate  Spanish_Spain.1252          
 ctype    Spanish_Spain.1252          
 tz       Europe/Paris                
 date     2022-01-09                  

- Packages -------------------------------------------------------------------
 package        * version    date       lib source                        
 abind            1.4-5      2016-07-21 [2] CRAN (R 4.1.1)                
 assertthat       0.2.1      2019-03-21 [2] CRAN (R 4.1.1)                
 backports        1.2.1      2020-12-09 [2] CRAN (R 4.1.0)                
 bit              4.0.4      2020-08-04 [2] CRAN (R 4.1.1)                
 bit64            4.0.5      2020-08-30 [2] CRAN (R 4.1.1)                
 broom            0.7.9      2021-07-27 [2] CRAN (R 4.1.1)                
 bslib            0.3.1      2021-10-06 [2] CRAN (R 4.1.1)                
 car              3.0-11     2021-06-27 [2] CRAN (R 4.1.1)                
 carData          3.0-4      2020-05-22 [2] CRAN (R 4.1.1)                
 cellranger       1.1.0      2016-07-27 [2] CRAN (R 4.1.1)                
 cli              3.0.1      2021-07-17 [2] CRAN (R 4.1.1)                
 clipr            0.7.1      2020-10-08 [2] CRAN (R 4.1.1)                
 colorspace       2.0-2      2021-06-24 [2] CRAN (R 4.1.1)                
 crayon           1.4.2      2021-10-29 [2] CRAN (R 4.1.1)                
 curl             4.3.2      2021-06-23 [2] CRAN (R 4.1.1)                
 data.table       1.14.0     2021-02-21 [2] CRAN (R 4.1.1)                
 DBI              1.1.1      2021-01-15 [2] CRAN (R 4.1.1)                
 dbplyr           2.1.1      2021-04-06 [2] CRAN (R 4.1.1)                
 desc             1.3.0      2021-03-05 [2] CRAN (R 4.1.1)                
 details          0.2.1      2020-01-12 [2] CRAN (R 4.1.1)                
 digest           0.6.28     2021-09-23 [2] CRAN (R 4.1.1)                
 dplyr          * 1.0.7      2021-06-18 [2] CRAN (R 4.1.1)                
 DT             * 0.19       2021-09-02 [2] CRAN (R 4.1.1)                
 ellipsis         0.3.2      2021-04-29 [2] CRAN (R 4.1.1)                
 evaluate         0.14       2019-05-28 [2] CRAN (R 4.1.1)                
 fansi            0.5.0      2021-05-25 [2] CRAN (R 4.1.1)                
 farver           2.1.0      2021-02-28 [2] CRAN (R 4.1.1)                
 fastmap          1.1.0      2021-01-25 [2] CRAN (R 4.1.1)                
 forcats        * 0.5.1      2021-01-27 [2] CRAN (R 4.1.1)                
 foreign          0.8-81     2020-12-22 [2] CRAN (R 4.1.1)                
 fs               1.5.0      2020-07-31 [2] CRAN (R 4.1.1)                
 generics         0.1.1      2021-10-25 [2] CRAN (R 4.1.1)                
 gganimate      * 1.0.7      2020-10-15 [2] CRAN (R 4.1.2)                
 ggfun            0.0.4      2021-09-17 [2] CRAN (R 4.1.2)                
 ggimage        * 0.3.0      2021-09-29 [2] CRAN (R 4.1.2)                
 ggplot2        * 3.3.5      2021-06-25 [2] CRAN (R 4.1.1)                
 ggplotify        0.1.0      2021-09-02 [2] CRAN (R 4.1.2)                
 ggpubr         * 0.4.0      2020-06-27 [2] CRAN (R 4.1.1)                
 ggrepel        * 0.9.1      2021-01-15 [2] CRAN (R 4.1.1)                
 ggsignif         0.6.3      2021-09-09 [2] CRAN (R 4.1.1)                
 ggsoccer       * 0.1.6      2020-06-21 [1] CRAN (R 4.1.2)                
 gifski           1.4.3-1    2021-05-02 [2] CRAN (R 4.1.2)                
 glue             1.4.2      2020-08-27 [2] CRAN (R 4.1.1)                
 gridBase         0.4-7      2014-02-24 [2] CRAN (R 4.1.1)                
 gridExtra      * 2.3        2017-09-09 [2] CRAN (R 4.1.1)                
 gridGraphics     0.5-1      2020-12-13 [2] CRAN (R 4.1.1)                
 gtable           0.3.0      2019-03-25 [2] CRAN (R 4.1.1)                
 haven            2.4.3      2021-08-04 [2] CRAN (R 4.1.1)                
 highr            0.9        2021-04-16 [2] CRAN (R 4.1.1)                
 hms              1.1.0      2021-05-17 [2] CRAN (R 4.1.1)                
 htmltools        0.5.2      2021-08-25 [2] CRAN (R 4.1.1)                
 htmlwidgets      1.5.4      2021-09-08 [2] CRAN (R 4.1.1)                
 httpuv           1.6.3      2021-09-09 [2] CRAN (R 4.1.1)                
 httr             1.4.2      2020-07-20 [2] CRAN (R 4.1.1)                
 igraph           1.2.7      2021-10-15 [2] CRAN (R 4.1.1)                
 jquerylib        0.1.4      2021-04-26 [2] CRAN (R 4.1.1)                
 jsonlite         1.7.2      2020-12-09 [2] CRAN (R 4.1.1)                
 kableExtra     * 1.3.4      2021-02-20 [2] CRAN (R 4.1.1)                
 klippy         * 0.0.0.9500 2021-11-12 [2] Github (rlesur/klippy@378c247)
 knitr          * 1.36       2021-09-29 [2] CRAN (R 4.1.1)                
 labeling         0.4.2      2020-10-20 [2] CRAN (R 4.1.0)                
 later            1.3.0      2021-08-18 [2] CRAN (R 4.1.1)                
 lattice          0.20-44    2021-05-02 [2] CRAN (R 4.1.1)                
 lifecycle        1.0.1      2021-09-24 [2] CRAN (R 4.1.1)                
 lubridate        1.7.10     2021-02-26 [2] CRAN (R 4.1.1)                
 magick           2.7.3      2021-08-18 [2] CRAN (R 4.1.1)                
 magrittr         2.0.1      2020-11-17 [2] CRAN (R 4.1.1)                
 Matrix           1.3-4      2021-06-01 [2] CRAN (R 4.1.1)                
 mgcv             1.8-36     2021-06-01 [2] CRAN (R 4.1.1)                
 mime             0.12       2021-09-28 [2] CRAN (R 4.1.1)                
 modelr           0.1.8      2020-05-19 [2] CRAN (R 4.1.1)                
 munsell          0.5.0      2018-06-12 [2] CRAN (R 4.1.1)                
 nlme             3.1-152    2021-02-04 [2] CRAN (R 4.1.1)                
 openxlsx         4.2.4      2021-06-16 [2] CRAN (R 4.1.1)                
 pillar           1.6.4      2021-10-18 [2] CRAN (R 4.1.1)                
 pkgconfig        2.0.3      2019-09-22 [2] CRAN (R 4.1.1)                
 plyr             1.8.6      2020-03-03 [2] CRAN (R 4.1.1)                
 png              0.1-7      2013-12-03 [2] CRAN (R 4.1.1)                
 prettyunits      1.1.1      2020-01-24 [2] CRAN (R 4.1.1)                
 progress         1.2.2      2019-05-16 [2] CRAN (R 4.1.1)                
 promises         1.2.0.1    2021-02-11 [2] CRAN (R 4.1.1)                
 purrr          * 0.3.4      2020-04-17 [2] CRAN (R 4.1.1)                
 qdapRegex        0.7.2      2017-04-09 [1] CRAN (R 4.1.2)                
 R6               2.5.1      2021-08-19 [2] CRAN (R 4.1.1)                
 RColorBrewer   * 1.1-2      2014-12-07 [2] CRAN (R 4.1.0)                
 Rcpp             1.0.7      2021-07-07 [2] CRAN (R 4.1.1)                
 readr          * 2.0.1      2021-08-10 [2] CRAN (R 4.1.1)                
 readxl           1.3.1      2019-03-13 [2] CRAN (R 4.1.1)                
 reprex           2.0.1      2021-08-05 [2] CRAN (R 4.1.1)                
 rio            * 0.5.27     2021-06-21 [2] CRAN (R 4.1.1)                
 rlang            0.4.11     2021-04-30 [2] CRAN (R 4.1.1)                
 rmarkdown        2.11       2021-09-14 [2] CRAN (R 4.1.1)                
 rprojroot        2.0.2      2020-11-15 [2] CRAN (R 4.1.1)                
 rstatix          0.7.0      2021-02-13 [2] CRAN (R 4.1.1)                
 rstudioapi       0.13       2020-11-12 [2] CRAN (R 4.1.1)                
 rvest            1.0.2      2021-10-16 [2] CRAN (R 4.1.2)                
 sass             0.4.0      2021-05-12 [2] CRAN (R 4.1.1)                
 scales           1.1.1      2020-05-11 [2] CRAN (R 4.1.1)                
 selectr          0.4-2      2019-11-20 [2] CRAN (R 4.1.1)                
 sessioninfo      1.1.1      2018-11-05 [2] CRAN (R 4.1.1)                
 shiny            1.7.1      2021-10-02 [2] CRAN (R 4.1.1)                
 stringi          1.7.4      2021-08-25 [2] CRAN (R 4.1.1)                
 stringr        * 1.4.0      2019-02-10 [2] CRAN (R 4.1.1)                
 svglite          2.0.0      2021-02-20 [2] CRAN (R 4.1.1)                
 systemfonts      1.0.3      2021-10-13 [2] CRAN (R 4.1.1)                
 tibble         * 3.1.4      2021-08-25 [2] CRAN (R 4.1.1)                
 tidyr          * 1.1.3      2021-03-03 [2] CRAN (R 4.1.1)                
 tidyselect       1.1.1      2021-04-30 [2] CRAN (R 4.1.1)                
 tidyverse      * 1.3.1      2021-04-15 [2] CRAN (R 4.1.1)                
 treemap        * 2.4-3      2021-08-22 [2] CRAN (R 4.1.1)                
 tweenr           1.0.2      2021-03-23 [2] CRAN (R 4.1.2)                
 tzdb             0.1.2      2021-07-20 [2] CRAN (R 4.1.1)                
 utf8             1.2.2      2021-07-24 [2] CRAN (R 4.1.1)                
 vctrs            0.3.8      2021-04-29 [2] CRAN (R 4.1.1)                
 viridisLite      0.4.0      2021-04-13 [2] CRAN (R 4.1.1)                
 vroom            1.5.4      2021-08-05 [2] CRAN (R 4.1.1)                
 webshot          0.5.2      2019-11-22 [2] CRAN (R 4.1.2)                
 withr            2.4.2      2021-04-18 [2] CRAN (R 4.1.1)                
 worldfootballR * 0.4.8      2022-01-06 [1] CRAN (R 4.1.2)                
 xfun             0.27       2021-10-18 [2] CRAN (R 4.1.1)                
 xml2             1.3.2      2020-04-23 [2] CRAN (R 4.1.1)                
 xtable           1.8-4      2019-04-21 [2] CRAN (R 4.1.1)                
 yaml             2.2.1      2020-02-01 [2] CRAN (R 4.1.0)                
 yulab.utils      0.0.4      2021-10-09 [2] CRAN (R 4.1.2)                
 zip              2.2.0      2021-05-31 [2] CRAN (R 4.1.1)                

[1] C:/Users/srale/Documents/R/win-library/4.1
[2] C:/Users/srale/Documents/R/R-4.1.1/library






LS0tDQp0aXRsZTogIkbDunRib2w6IExBIExJR0EiDQpzdWJ0aXRsZTogIkFsZWphbmRybyBDYWxkZXJlcm8gUGllcm5hKGFjYWxwaWVyQGFsdW1uaS51di5lcykiICMtIHBvbmdvIHTDuiBub21icmUgYWjDrSBwYXJhIHEgYXBhcmV6Y2EgbcOhcyBncmFuZGUgcSBlbCBkZSBsYSBVVg0KYXV0aG9yOiAiVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIxIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjc3M6ICIuL2Fzc2V0cy9teV9jc3NfZmlsZS5jc3MiDQogICAgdGhlbWU6IHBhcGVyDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBwYWNrYWdlcy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtsaXBweSkgICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmxpYnJhcnkoa25pdHIpDQpgYGANCg0KYGBge3IgY2h1bmstc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsDQogICAgICAgICAgICAgICAgICAgICAgI2ZpZy53aWR0aCA9IDcsICNmaWcuaGVpZ2h0PSA3LCAgIA0KICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywNCiAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gMC42MjgsIG91dC53aWR0aCA9ICI3NSUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXYgPSAicG5nIiwgZGV2LmFyZ3MgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpDQpgYGANCg0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSANCmBgYA0KDQoNCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFfQ0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCJ0b3AiLCAicmlnaHQiKSkgIy0gcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9DQpsaWJyYXJ5KHJpbykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHdvcmxkZm9vdGJhbGxSKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGdnaW1hZ2UpDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh3b3JsZGZvb3RiYWxsUikNCmxpYnJhcnkoZ2dzb2NjZXIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkod29ybGRmb290YmFsbFIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoZ2dpbWFnZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHRyZWVtYXApDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KYGBgDQo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4NCg0KPCEtLSBFbCBww6FycmFmbyBkZSBhYmFqbyBoYXMgZGUgZGVqYXJsbyBjYXNpIGlndWFsLCBzb2xvIEhBUyBkZSBTVVNUSVRVSVIgInBlcmV6cDQ0IiBwb3IgdHUgdXN1YXJpbyBkZSBHaXRodWItLT4NClRyYWJham8gZWxhYm9yYWRvIHBhcmEgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIiBkZSBsYSBVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEgZHVyYW50ZSBlbCBjdXJzbyAyMDIxLTIwMjIuIEVsIHJlcG8gZGVsIHRyYWJham8gZXN0w6EgW2FxdcOtXShodHRwczovL2dpdGh1Yi5jb20vYWxlamFuZHJvY3AwMC90cmFiYWpvX0JpZ0RhdGEpe3RhcmdldD0iX2JsYW5rIn0uIA0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGV4YWN0YW1lbnRlIGlndWFsLCBOTyBIQVMgREUgQ0FNQklBUiBOQURBLS0+DQoNCkxhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgeSBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi8wNy10cmFiYWpvcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQoNCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KIyAxLiBJbnRyb2R1Y2Npw7NuDQoNCg0KRGVzZGUgaGFjZSBtdWNob3MgYcOxb3MsIExhIExpZ2EgZXNwYcOxb2xhIGhhIHNpZG8gdW5hIGRlIGxhcyBwcmluY2lwYWxlcywgZSBpbmNsdXNvIGxhIHByaW5jaXBhbCwgbGlnYSBkZSBmw7p0Ym9sIGRlbCBtdW5kbzsgc2luIGVtYmFyZ28sIHRyYXMgbGEgcGFuZGVtaWEgZGVsIENPVklELTIxLCBvdHJhcyBsaWdhcyBlc3TDoW4gcG9yIGVuY2ltYSBkZSBlc3RhLCBjb24gbcOhcyBmaWNoYWplcyB5IG3DoXMgbml2ZWwgKGVzIGVsIGNhc28gZGUgbGEgUHJlbWllcikuIA0KRW4gZXN0ZSB0cmFiYWpvIGFuYWxpemFtb3MgbGEgc2l0dWFjacOzbiBhY3R1YWwgZGUgbG9zIGVxdWlwb3MgZGUgcHJpbWVyYSBkaXZpc2nDs24sIHVuIHBvcXVpdG8gZGUgc3UgZXZvbHVjacOzbiBlbiBsb3Mgw7psdGltb3MgYcOxb3MgeSB0ZXJtaW5hbW9zIGNvbiBsYSBwYXJ0ZSBkZWwgdHJhYmFqbyBxdWUgbcOhcyB0aWVtcG8gbGUgaGUgZGVkaWNhZG86IFByZWRpY2Npw7NuIGRlIHJlc3VsdGFkb3MgZGUgTGEgTGlnYS4NCg0KPGNlbnRlcj48aW1nIHNyYz0iYXNzZXRzL2ludHJvLmpwZyIgd2lkdGg9IjM1MHB4IiAvPjwvY2VudGVyPg0KDQo8YnI+DQoNCiMgMi4gRGF0b3MNCg0KTG9zIGRhdG9zIHF1ZSBoZSB1c2FkbyBwYXJhIGVzdGUgdHJhYmFqbyBwcm92aWVuZW4gZGVsIHBhcXVldGUgW1dvcmxkRm9vdGJhbGxSXShodHRwczovL2dpdGh1Yi5jb20vSmFzZVppdi93b3JsZGZvb3RiYWxsUiksIGRvbmRlIGhlIHBvZGlkbyBvYnRlbmVyIGxhIG1heW9yw61hIGRlIGxvcyBkYXRvcyBhY2VyY2EgZGUgbG9zIHBhcnRpZG9zIChwYXJhIGxhIHByZWRpY2Npw7NuKSwgZGUgbG9zIGp1Z2Fkb3JlcywgZGUgbG9zIGZpY2hhamVzLi4uDQoNCg0KRWwgcHJvY2VzYW1pZW50byBkZSBsb3MgZGF0b3MgbG8gdmVyZW1vcyBjb24gZGV0ZW5pbWllbnRvIGVuIGNhZGEgdW5vIGRlIGxvcyBhcGFydGFkb3Mgc2lndWllbnRlcywgcHVlcyBjb24gZWwgcGFxdWV0ZSBXb3JsZEZvb3RiYWxsUiBwb2RlbW9zIG9idGVuZXIgZGF0b3MgZGUgcMOhZ2luYXMgd2ViIGRlIGRlcG9ydGUgZGlmZXJlbnRlcyB5IGNhZGEgZGF0YXNldCB0ZW5kcsOhIHVuIHRyYXRhbWllbnRvIGRpZmVyZW50ZQ0KDQojIDMuIExhIExpZ2EuIA0KDQojIyAzLjEgVGVtcG9yYWRhIGFjdHVhbC4gey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKkV2b2x1Y2nDs24qKjwvRk9OVD4NCg0KRW4gcHJpbWVyIGx1Z2FyLCB2YW1vcyBhIHZlciBsYSBzaXR1YWNpw7NuIGFjdHVhbCBkZWwgdmFsb3IgZGUgbG9zIGVxdWlwb3MsIHF1ZSwgZW4gcHJpbmNpcGlvLCBzZSBlc3BlcmFiYSBxdWUgbGlkZXJhc2VuIGxhIGNsYXNpZmljYWNpw7NuIGVzdGUgYcOxby4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KdmFsb3I8LWdldF9wbGF5ZXJfbWFya2V0X3ZhbHVlcygiU3BhaW4iLCAyMDIxKSANCg0KdmFsb3I8LSB2YWxvciAlPiUgc2VsZWN0KHNxdWFkLCBwbGF5ZXJfbnVtLCBwbGF5ZXJfYWdlLCBwbGF5ZXJfbmFtZSwgcGxheWVyX25hdGlvbmFsaXR5LCBjdXJyZW50X2NsdWIscGxheWVyX2Zvb3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9qb2luZWQsIGNvbnRyYWN0X2V4cGlyeSwgcGxheWVyX21hcmtldF92YWx1ZV9ldXJvKQ0KDQphPC12YWxvciAlPiUgZ3JvdXBfYnkoc3F1YWQpICU+JSBzdW1tYXJpc2UodmFsb3IgPSBzdW0ocGxheWVyX21hcmtldF92YWx1ZV9ldXJvKSkNCg0KYjwtYSAlPiUgc2xpY2VfbWF4KHZhbG9yLCBuPTUpICU+JSBtdXRhdGUoZXNjdWRvPSBjKCAiaHR0cHM6Ly9sb2dvZG93bmxvYWQub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE2LzAzL3JlYWwtbWFkcmlkLWxvZ28tZXNjdWRvLTEucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHBzOi8vNC5icC5ibG9nc3BvdC5jb20vLVdvdld5VlY2d0swL1dXNnJnMDVLOWZJL0FBQUFBQUFCTlU0LzVycmZ0T2cyYVg4OEw4Z0xxWU9uc2k0dms1VU8wVmpUd0NMY0JHQXMvczE2MDAvQ2x1YiUyQkF0bGV0aWNvJTJCZGUlMkJNYWRyaWQucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hc3NldHMuc3RpY2twbmcuY29tL2ltYWdlcy81ODRhOWIzYmIwODBkNzYxNmQyOTg3NzcucG5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hc3NldHMuc3RpY2twbmcuY29tL2ltYWdlcy81ODRhZDM2YWI1MTllYTc0MDkzM2E4ZDMucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2Fzc2V0cy5zdGlja3BuZy5jb20vdGh1bWJzLzU4NGFkMjkxYjUxOWVhNzQwOTMzYThiYS5wbmciKSkNCg0KDQpwMTwtIGdncGxvdChiLCBhZXMoeD0gcmVvcmRlcihzcXVhZCwgdmFsb3IpLCB5PSB2YWxvciwgZmlsbD0gc3F1YWQpLCB3aWR0aD0wLjUpICsgDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkFjY2VudCIpICsgDQogIGdlb21faW1hZ2UoYWVzKGltYWdlID0gZXNjdWRvKSwgc2l6ZT0wLjEpICsgY29vcmRfZmxpcCgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KcDENCmBgYA0KDQpBcXXDrSB2ZW1vcyBsb3MgZXF1aXBvcyBjb24gbWF5b3IgdmFsb3IgZGUgbGEgbGlnYSwgKHN1bWEgZGVsIHZhbG9yIGRlIHRvZG9zIGxvcyBqdWdhZG9yZXMgZGVsIGVxdWlwbykuDQoNCg0KU2luIGVtYmFyZ28sIGVsIHZhbG9yLCBubyBzaWVtcHJlIGFzZWd1cmEgdmljdG9yaWFzLCB5IGVzIGVsIGNhc28gZGUgTGEgTGlnYSBlc3RlIGHDsW8uIA0KRXN0YSB0ZW1wb3JhZGEgZXN0w6Egc2llbmRvIGVzcGVjaWFsLCB5IGxvIHBvZGVtb3MgYW5hbGl6YXIgY29uIGVzdGEgdGVuZGVuY2lhOg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmNsYXNpZmljYWNpb248LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAyMiwgIjFzdCIsICJsZWFndWVfdGFibGUiKSAlPiUgDQogIHNlbGVjdChTcXVhZCxQdHMpICU+JSByZW5hbWUoInNxdWFkIj0gIlNxdWFkIikNCmE8LWEgJT4lIG11dGF0ZShzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiQXRobGV0aWMgQmlsYmFvIiwgIkF0aGxldGljIENsdWIiLCBzcXVhZCksDQogICAgICAgICAgICAgICAgc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIkF0bMOpdGljbyBkZSBNYWRyaWQiLCAiQXRsw6l0aWNvIE1hZHJpZCIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiQ0EgT3Nhc3VuYSIsICJPc2FzdW5hIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJDw6FkaXogQ0YiLCAiQ8OhZGl6Iiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJDZWx0YSBkZSBWaWdvIiwgIkNlbHRhIFZpZ28iLCBzcXVhZCksDQogICAgICAgICAgICAgICAgc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIkRlcG9ydGl2byBBbGF2w6lzIiwgIkFsYXbDqXMiLCBzcXVhZCksDQogICAgICAgICAgICAgICAgc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIkVsY2hlIENGIiwgIkVsY2hlIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJGQyBCYXJjZWxvbmEiLCAiQmFyY2Vsb25hIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJHZXRhZmUgQ0YiLCAiR2V0YWZlIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJHcmFuYWRhIENGIiwgIkdyYW5hZGEiLCBzcXVhZCksDQogICAgICAgICAgICAgICAgc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIkxldmFudGUgVUQiLCAiTGV2YW50ZSIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiUkNEIEVzcGFueW9sIEJhcmNlbG9uYSIsICJFc3BhbnlvbCIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiUkNEIE1hbGxvcmNhIiwgIk1hbGxvcmNhIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJSZWFsIEJldGlzIEJhbG9tcGnDqSIsICJCZXRpcyIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiU2V2aWxsYSBGQyIsICJTZXZpbGxhIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJWYWxlbmNpYSBDRiIsICJWYWxlbmNpYSIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiVmlsbGFycmVhbCBDRiIsICJWaWxsYXJyZWFsIiwgc3F1YWQpLCkNCg0KYzwtZnVsbF9qb2luKGEsY2xhc2lmaWNhY2lvbikgDQoNCmdncGxvdChkYXRhID0gYywgYWVzKHZhbG9yLCBQdHMsIGxhYmVsID0gc3F1YWQpKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yPXNxdWFkKSkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3RleHRfcmVwZWwoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHhsYWIoIlZhbG9yIGRlbCBlcXVpcG8iKSArDQogIHlsYWIoIlB1bnRvcyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHN0YXRfY29yKGxhYmVsLnggPSA1MDAwMDAwMCwgbGFiZWwueSA9IDQyKSANCmBgYA0KDQpFbiBlc3RlIGdyw6FmaWNvIHZlbW9zIGPDs21vIGVsIHZhbG9yIGRlbCBlcXVpcG8gbm8gbG8gZXMgdG9kbywgeSBjb24gdW4gdmFsb3IgbXV5IGJham8sIG9ic2VydmFtb3MgbGEgc2l0dWFjacOzbiBkZWwgUmF5byBWYWxsZWNhbm8sIGVuIHB1ZXN0byBkZSBFdXJvcGEsIHBvciBlbmNpbWEgZGUgbXVjaG8gY2x1YmVzIGNvbiB1biB2YWxvciBkZSBqdWdhZG9yZXMgbWF5b3IuDQoNClRhbWJpw6luIHNvcnByZW5kZSwgbmVnYXRpdmFtZW50ZSwgZWwgQmFyY2Vsb25hLCBxdWUgZXN0w6EgZmlybWFuZG8gdW5hIHRlbXBvcmFkYSBleHRyYcOxYSBkYWRvIGVsIHZhbG9yIGRlIHN1IGVxdWlwby4NCg0KTGEgUj0gMCw4LCBub3MgaW5kaWNhIHF1ZSBlbCA4MCUgZGUgbG9zIGRhdG9zIHNlIHZlIHJlcHJlc2VudGFkbyBwb3IgbGEgdGVuZGVuY2lhIG1vc3RyYWRhIGVuIGF6dWwgZW4gZWwgZ3LDoWZpY28sIHF1ZSwgYXByb3hpbWFkYW1lbnRlIG5vcyBpbmRpY2EgcXVlIGludmVyc2nDs24gaGFicsOtYSBxdWUgcmVhbGl6YXIgcGFyYSBjb25zZWd1aXIgdW4gbsO6bWVybyBkZXRlcm1pbmFkbyBkZSBwdW50b3MuDQoNCiMjIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKkPDs2RpZ28qKjwvRk9OVD4NCg0KYGBge3IsIGV2YWw9RkFMU0UsIGluY2x1ZGU9VFJVRX0NCnZhbG9yPC1nZXRfcGxheWVyX21hcmtldF92YWx1ZXMoIlNwYWluIiwgMjAyMSkgDQoNCnZhbG9yPC0gdmFsb3IgJT4lIHNlbGVjdChzcXVhZCwgcGxheWVyX251bSwgcGxheWVyX2FnZSwgcGxheWVyX25hbWUsIHBsYXllcl9uYXRpb25hbGl0eSwgY3VycmVudF9jbHViLHBsYXllcl9mb290LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfam9pbmVkLCBjb250cmFjdF9leHBpcnksIHBsYXllcl9tYXJrZXRfdmFsdWVfZXVybykNCg0KYTwtdmFsb3IgJT4lIGdyb3VwX2J5KHNxdWFkKSAlPiUgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHBsYXllcl9tYXJrZXRfdmFsdWVfZXVybykpDQoNCmI8LWEgJT4lIHNsaWNlX21heCh2YWxvciwgbj01KSAlPiUgbXV0YXRlKGVzY3Vkbz0gYyggImh0dHBzOi8vbG9nb2Rvd25sb2FkLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAxNi8wMy9yZWFsLW1hZHJpZC1sb2dvLWVzY3Vkby0xLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovLzQuYnAuYmxvZ3Nwb3QuY29tLy1Xb3ZXeVZWNndLMC9XVzZyZzA1SzlmSS9BQUFBQUFBQk5VNC81cnJmdE9nMmFYODhMOGdMcVlPbnNpNHZrNVVPMFZqVHdDTGNCR0FzL3MxNjAwL0NsdWIlMkJBdGxldGljbyUyQmRlJTJCTWFkcmlkLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYXNzZXRzLnN0aWNrcG5nLmNvbS9pbWFnZXMvNTg0YTliM2JiMDgwZDc2MTZkMjk4Nzc3LnBuZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYXNzZXRzLnN0aWNrcG5nLmNvbS9pbWFnZXMvNTg0YWQzNmFiNTE5ZWE3NDA5MzNhOGQzLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hc3NldHMuc3RpY2twbmcuY29tL3RodW1icy81ODRhZDI5MWI1MTllYTc0MDkzM2E4YmEucG5nIikpDQoNCnAxPC0gZ2dwbG90KGIsIGFlcyh4PSByZW9yZGVyKHNxdWFkLCB2YWxvciksIHk9IHZhbG9yLCBmaWxsPSBzcXVhZCksIHdpZHRoPTAuNSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikgKyANCiAgZ2VvbV9pbWFnZShhZXMoaW1hZ2UgPSBlc2N1ZG8pLCBzaXplPTAuMSkgKyBjb29yZF9mbGlwKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpwMQ0KDQpjbGFzaWZpY2FjaW9uPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMjIsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIA0KICBzZWxlY3QoU3F1YWQsUHRzKSAlPiUgcmVuYW1lKCJzcXVhZCI9ICJTcXVhZCIpDQphPC1hICU+JSBtdXRhdGUoc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIkF0aGxldGljIEJpbGJhbyIsICJBdGhsZXRpYyBDbHViIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJBdGzDqXRpY28gZGUgTWFkcmlkIiwgIkF0bMOpdGljbyBNYWRyaWQiLCBzcXVhZCksDQogICAgICAgICAgICAgICAgc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIkNBIE9zYXN1bmEiLCAiT3Nhc3VuYSIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiQ8OhZGl6IENGIiwgIkPDoWRpeiIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiQ2VsdGEgZGUgVmlnbyIsICJDZWx0YSBWaWdvIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJEZXBvcnRpdm8gQWxhdsOpcyIsICJBbGF2w6lzIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJFbGNoZSBDRiIsICJFbGNoZSIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiRkMgQmFyY2Vsb25hIiwgIkJhcmNlbG9uYSIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiR2V0YWZlIENGIiwgIkdldGFmZSIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiR3JhbmFkYSBDRiIsICJHcmFuYWRhIiwgc3F1YWQpLA0KICAgICAgICAgICAgICAgIHNxdWFkID0gaWZlbHNlKHNxdWFkID09ICJMZXZhbnRlIFVEIiwgIkxldmFudGUiLCBzcXVhZCksDQogICAgICAgICAgICAgICAgc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIlJDRCBFc3BhbnlvbCBCYXJjZWxvbmEiLCAiRXNwYW55b2wiLCBzcXVhZCksDQogICAgICAgICAgICAgICAgc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIlJDRCBNYWxsb3JjYSIsICJNYWxsb3JjYSIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiUmVhbCBCZXRpcyBCYWxvbXBpw6kiLCAiQmV0aXMiLCBzcXVhZCksDQogICAgICAgICAgICAgICAgc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIlNldmlsbGEgRkMiLCAiU2V2aWxsYSIsIHNxdWFkKSwNCiAgICAgICAgICAgICAgICBzcXVhZCA9IGlmZWxzZShzcXVhZCA9PSAiVmFsZW5jaWEgQ0YiLCAiVmFsZW5jaWEiLCBzcXVhZCksDQogICAgICAgICAgICAgICAgc3F1YWQgPSBpZmVsc2Uoc3F1YWQgPT0gIlZpbGxhcnJlYWwgQ0YiLCAiVmlsbGFycmVhbCIsIHNxdWFkKSwpDQoNCmM8LWZ1bGxfam9pbihhLGNsYXNpZmljYWNpb24pIA0KDQpnZ3Bsb3QoZGF0YSA9IGMsIGFlcyh2YWxvciwgUHRzLCBsYWJlbCA9IHNxdWFkKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvcj1zcXVhZCkpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsNCiAgZ2VvbV90ZXh0X3JlcGVsKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB4bGFiKCJWYWxvciBkZWwgZXF1aXBvIikgKw0KICB5bGFiKCJQdW50b3MiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBzdGF0X2NvcihsYWJlbC54ID0gNTAwMDAwMDAsIGxhYmVsLnkgPSA0MikgDQpgYGANCg0KDQoNCiMjIDMuMSBUZW1wb3JhZGFzIGFudGVyaW9yZXMuIHsudGFic2V0fQ0KDQpFc3RlIGHDsW8sIG5vcyBzb3JwcmVuZGUgY8OzbW8gbGEgcGVsZWEgcG9yIGxhIGxpZ2Egbm8gZXMgZW50cmUgZWwgRkMgQmFyY2Vsb25hLCBBdGzDqXRpY28gZGUgTWFkcmlkIHkgZWwgUmVhbCBNYWRyaWQuDQoNCiMjIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKsOabHRpbW9zIGHDsW9zKio8L0ZPTlQ+DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQp2ZWludGlkb3M8LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAyMiwgIjFzdCIsICJsZWFndWVfdGFibGUiKSAlPiUgc2VsZWN0KFNxdWFkLCBSaywgUHRzLCBTZWFzb25fRW5kX1llYXIpIA0KdmVpbnRpdW5vPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMjEsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KdmVpbnRlPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMjAsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KZGllY2ludWV2ZTwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDE5LCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KZGllY2lvY2hvPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMTgsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KZGllY2lzaWV0ZTwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDE3LCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KZGllY2lzZWlzPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMTYsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KcXVpbmNlPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMTUsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KY2F0b3JjZTwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDE0LCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KdHJlY2U8LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAxMywgIjFzdCIsICJsZWFndWVfdGFibGUiKSAlPiUgc2VsZWN0KFNxdWFkLCBSaywgUHRzLCBTZWFzb25fRW5kX1llYXIpDQpkb2NlPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMTIsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0Kb25jZTwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDExLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KZGllejwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDEwLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KDQphPC1mdWxsX2pvaW4odmVpbnRpZG9zLCB2ZWludGl1bm8pDQpiPC1mdWxsX2pvaW4oYSx2ZWludGUpDQpjPC1mdWxsX2pvaW4oYixkaWVjaW51ZXZlKQ0KZDwtZnVsbF9qb2luKGMsZGllY2lvY2hvKQ0KZTwtZnVsbF9qb2luKGQsZGllY2lzaWV0ZSkNCmY8LWZ1bGxfam9pbihlLGRpZWNpc2VpcykNCmc8LWZ1bGxfam9pbihmLHF1aW5jZSkNCmg8LWZ1bGxfam9pbihnLGNhdG9yY2UpDQppPC1mdWxsX2pvaW4oaCx0cmVjZSkNCmo8LWZ1bGxfam9pbihpLGRvY2UpDQprPC1mdWxsX2pvaW4oaixvbmNlKQ0KbDwtZnVsbF9qb2luKGssZGlleikgJT4lIGZpbHRlcighU2Vhc29uX0VuZF9ZZWFyPT0iMjAyMiIpDQoNCm08LSBsICU+JSBncm91cF9ieShTZWFzb25fRW5kX1llYXIpICU+JSBmaWx0ZXIoU3F1YWQgJWluJSBjKCAiUmVhbCBNYWRyaWQiLCAiQmFyY2Vsb25hIiwgIkF0bMOpdGljbyBNYWRyaWQiKSkNCg0KZ2dwbG90KG0sIGFlcyhTZWFzb25fRW5kX1llYXIsIFJrLCBjb2xvcj1TcXVhZCkpICsgZ2VvbV9saW5lKCkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSANCg0KDQp4PC1nZ3Bsb3QobSxhZXMoeD0gU2Vhc29uX0VuZF9ZZWFyLCB5PSBSaykpICsgDQogIGxhYnModGl0bGUgPSAiRXZvbHVjacOzbiBwb3NpY2lvbmVzIGVuIGxpZ2EiLA0KICAgICAgIHg9ICJBw7FvIiwNCiAgICAgICB5PSAiUG9zaWNpw7NuIiwNCiAgICAgICBjb2xvciA9ICJFcXVpcG8iKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yPSBTcXVhZCksIHNpemU9IDMpICsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvcj0gU3F1YWQpLCBzaXplPSAxLjUpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9IGMoInJlZCIsICIjOTAwQzNGIiwgIndoaXRlIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBdGzDqXRpY28gZGUgTWFkcmlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZDIEJhcmNlbG9uYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFsIE1hZHJpZCIpKSsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLjUpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzLCBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICIjQjA4MkZGIiksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gIiNCMDgyRkYiKSkgKw0KICB0cmFuc2l0aW9uX3JldmVhbChTZWFzb25fRW5kX1llYXIpICsgDQogIHZpZXdfZm9sbG93KCkNCg0KeCArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiNCMDgyRkYiKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjQjA4MkZGIiksDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNCMDgyRkYiKSwNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjQjA4MkZGIikpDQpgYGANCg0KQXF1w60gdmVtb3MgbGEgZXZvbHVjacOzbiBkZSBsb3Mgw7psdGltb3MgYcOxb3MsIHNpZW5kbyB5IGxhIHBvc2ljacOzbiBlbiBsYSBsaWdhOyBlcyBkZWNpciwgY3VhbnRvIG3DoXMgYWJham8sIG1lam9yLg0KDQpFc3RlIGHDsW8sIGNvbW8gZGlqaW1vcyBlc3TDoSBzaWVuZG8gZGlmZXJlbnRlIHkgbG9zIGVxdWlwb3MgbcOhcyBwZXF1ZcOxb3MgZXN0w6FuIGNvbnNpZ3VpZW5kbyB2ZW5jZXIgYWwgRkMgQmFyY2Vsb25hIHkgYWwgQXRsw6l0aWNvIGRlIE1hZHJpZDsgcXVpesOhcyBlcyBlbCBhw7FvIGRlbCBQYW5jcnVkbyBGQywgcXVpw6luIHNhYmUuDQoNCiMjIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKkPDs2RpZ28qKjwvRk9OVD4NCg0KYGBge3IsIGluY2x1ZGU9VFJVRSwgZXZhbD1GQUxTRX0NCg0KdmVpbnRpZG9zPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMjIsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKSANCnZlaW50aXVubzwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDIxLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCnZlaW50ZTwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDIwLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCmRpZWNpbnVldmU8LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAxOSwgIjFzdCIsICJsZWFndWVfdGFibGUiKSU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCmRpZWNpb2NobzwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDE4LCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCmRpZWNpc2lldGU8LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAxNywgIjFzdCIsICJsZWFndWVfdGFibGUiKSU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCmRpZWNpc2VpczwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDE2LCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCnF1aW5jZTwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDE1LCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCmNhdG9yY2U8LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAxNCwgIjFzdCIsICJsZWFndWVfdGFibGUiKSU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCnRyZWNlPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMTMsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIHNlbGVjdChTcXVhZCwgUmssIFB0cywgU2Vhc29uX0VuZF9ZZWFyKQ0KZG9jZTwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDEyLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCm9uY2U8LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAxMSwgIjFzdCIsICJsZWFndWVfdGFibGUiKSU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCmRpZXo8LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAxMCwgIjFzdCIsICJsZWFndWVfdGFibGUiKSU+JSBzZWxlY3QoU3F1YWQsIFJrLCBQdHMsIFNlYXNvbl9FbmRfWWVhcikNCg0KYTwtZnVsbF9qb2luKHZlaW50aWRvcywgdmVpbnRpdW5vKQ0KYjwtZnVsbF9qb2luKGEsdmVpbnRlKQ0KYzwtZnVsbF9qb2luKGIsZGllY2ludWV2ZSkNCmQ8LWZ1bGxfam9pbihjLGRpZWNpb2NobykNCmU8LWZ1bGxfam9pbihkLGRpZWNpc2lldGUpDQpmPC1mdWxsX2pvaW4oZSxkaWVjaXNlaXMpDQpnPC1mdWxsX2pvaW4oZixxdWluY2UpDQpoPC1mdWxsX2pvaW4oZyxjYXRvcmNlKQ0KaTwtZnVsbF9qb2luKGgsdHJlY2UpDQpqPC1mdWxsX2pvaW4oaSxkb2NlKQ0KazwtZnVsbF9qb2luKGosb25jZSkNCmw8LWZ1bGxfam9pbihrLGRpZXopICU+JSBmaWx0ZXIoIVNlYXNvbl9FbmRfWWVhcj09IjIwMjIiKQ0KDQptPC0gbCAlPiUgZ3JvdXBfYnkoU2Vhc29uX0VuZF9ZZWFyKSAlPiUgZmlsdGVyKFNxdWFkICVpbiUgYyggIlJlYWwgTWFkcmlkIiwgIkJhcmNlbG9uYSIsICJBdGzDqXRpY28gTWFkcmlkIikpDQoNCmdncGxvdChtLCBhZXMoU2Vhc29uX0VuZF9ZZWFyLCBSaywgY29sb3I9U3F1YWQpKSArIGdlb21fbGluZSgpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgDQoNCg0KeDwtZ2dwbG90KG0sYWVzKHg9IFNlYXNvbl9FbmRfWWVhciwgeT0gUmspKSArIA0KICBsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gcG9zaWNpb25lcyBlbiBsaWdhIiwNCiAgICAgICB4PSAiQcOxbyIsDQogICAgICAgeT0gIlBvc2ljacOzbiIsDQogICAgICAgY29sb3IgPSAiRXF1aXBvIikgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvcj0gU3F1YWQpLCBzaXplPSAzKSArDQogIGdlb21fbGluZShhZXMoY29sb3I9IFNxdWFkKSwgc2l6ZT0gMS41KSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPSBjKCJyZWQiLCAiIzkwMEMzRiIsICJ3aGl0ZSIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQXRsw6l0aWNvIGRlIE1hZHJpZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGQyBCYXJjZWxvbmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhbCBNYWRyaWQiKSkrDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMC41KSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgaGp1c3QgPSAxLCB2anVzdCA9IDEpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiI0IwODJGRiIpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICIjQjA4MkZGIikpICsNCiAgdHJhbnNpdGlvbl9yZXZlYWwoU2Vhc29uX0VuZF9ZZWFyKSArIA0KICB2aWV3X2ZvbGxvdygpDQoNCnggKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjQjA4MkZGIiksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiI0IwODJGRiIpLA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjQjA4MkZGIiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0IwODJGRiIpKQ0KYGBgDQoNCiMgNC4gT3RyYXMgbGlnYXMuIHsudGFic2V0fQ0KDQojIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKkludmVyc2nDs24qKjwvRk9OVD4NCg0KRXMgbmVjZXNhcmlvIHZlciB1bmEgZGUgbGFzIHJhem9uZXMgcG9yIGxhcyBxdWUgcG9jbyBhIHBvY28gTGEgTGlnYSBoYSBpZG8gcGVyZGllbmRvIGNhbGlkYWQgZnJlbnRlIGEgb3RyYXMgbGlnYXMsIHkgZXNhIHJhesOzbiBlcyBsYSBpbnZlcnNpw7NuIGVuIGp1Z2Fkb3JlcyBkZSBhbHRvIG5pdmVsOg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh3b3JsZGZvb3RiYWxsUikNCg0KDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCg0KbGlicmFyeShyZWFkcikNCnNwYWluMjAyMCA8LSByZWFkX2NzdigiLi9kYXRvcy9zcGFpbjIwMjAuY3N2IikNCmVuZ2xhbmQyMDIwIDwtIHJlYWRfY3N2KCIuL2RhdG9zL2VuZ2xhbmQyMDIwLmNzdiIpDQpmcmFuY2UyMDIwIDwtIHJlYWRfY3N2KCIuL2RhdG9zL2ZyYW5jZTIwMjAuY3N2IikNCg0KYTwtc3BhaW4yMDIwICU+JSBmaWx0ZXIoIWlzLm5hKHRyYW5zZmVyX2ZlZSkpICU+JSBmaWx0ZXIodHJhbnNmZXJfdHlwZT09IkFycml2YWxzIikgJT4lDQogIHNlbGVjdChjb3VudHJ5LHNlYXNvbiwgcGxheWVyX25hbWUsIHRlYW1fbmFtZSx0cmFuc2Zlcl9mZWUsIHBsYXllcl9hZ2UsIHBsYXllcl9wb3NpdGlvbiklPiUgDQogIG11dGF0ZShzdW1hPSBzdW0odHJhbnNmZXJfZmVlKSkNCmI8LSBlbmdsYW5kMjAyMCAlPiUgZmlsdGVyKCFpcy5uYSh0cmFuc2Zlcl9mZWUpKSAlPiUNCiAgc2VsZWN0KGNvdW50cnksc2Vhc29uLCBwbGF5ZXJfbmFtZSwgdGVhbV9uYW1lLHRyYW5zZmVyX2ZlZSwgcGxheWVyX2FnZSwgcGxheWVyX3Bvc2l0aW9uKSU+JSANCiAgbXV0YXRlKHN1bWE9IHN1bSh0cmFuc2Zlcl9mZWUpKQ0KYzwtIGZyYW5jZTIwMjAgJT4lIGZpbHRlcighaXMubmEodHJhbnNmZXJfZmVlKSkgJT4lDQogIHNlbGVjdChjb3VudHJ5LHNlYXNvbiwgcGxheWVyX25hbWUsIHRlYW1fbmFtZSx0cmFuc2Zlcl9mZWUsIHBsYXllcl9hZ2UsIHBsYXllcl9wb3NpdGlvbikgJT4lIA0KICBtdXRhdGUoc3VtYT0gc3VtKHRyYW5zZmVyX2ZlZSkpDQoNCg0KDQpzcGFpbjIwMTUgPC0gcmVhZF9jc3YoIi4vZGF0b3Mvc3BhaW4yMDE1LmNzdiIpDQplbmdsYW5kMjAxNSA8LSByZWFkX2NzdigiLi9kYXRvcy9lbmdsYW5kMjAxNS5jc3YiKQ0KZnJhbmNlMjAxNSA8LSByZWFkX2NzdigiLi9kYXRvcy9mcmFuY2UyMDE1LmNzdiIpDQoNCmQ8LSBzcGFpbjIwMTUlPiUgZmlsdGVyKCFpcy5uYSh0cmFuc2Zlcl9mZWUpKSAlPiUgZmlsdGVyKHRyYW5zZmVyX3R5cGU9PSJBcnJpdmFscyIpICU+JQ0KICBzZWxlY3QoY291bnRyeSxzZWFzb24sIHBsYXllcl9uYW1lLCB0ZWFtX25hbWUsdHJhbnNmZXJfZmVlLCBwbGF5ZXJfYWdlLCBwbGF5ZXJfcG9zaXRpb24pJT4lIA0KICBtdXRhdGUoc3VtYT0gc3VtKHRyYW5zZmVyX2ZlZSkpDQplPC1lbmdsYW5kMjAxNSU+JSBmaWx0ZXIoIWlzLm5hKHRyYW5zZmVyX2ZlZSkpICU+JSBmaWx0ZXIodHJhbnNmZXJfdHlwZT09IkFycml2YWxzIikgJT4lDQogIHNlbGVjdChjb3VudHJ5LHNlYXNvbiwgcGxheWVyX25hbWUsIHRlYW1fbmFtZSx0cmFuc2Zlcl9mZWUsIHBsYXllcl9hZ2UsIHBsYXllcl9wb3NpdGlvbiklPiUgDQogIG11dGF0ZShzdW1hPSBzdW0odHJhbnNmZXJfZmVlKSkNCmY8LWZyYW5jZTIwMTUlPiUgZmlsdGVyKCFpcy5uYSh0cmFuc2Zlcl9mZWUpKSAlPiUgZmlsdGVyKHRyYW5zZmVyX3R5cGU9PSJBcnJpdmFscyIpICU+JQ0KICBzZWxlY3QoY291bnRyeSxzZWFzb24sIHBsYXllcl9uYW1lLCB0ZWFtX25hbWUsdHJhbnNmZXJfZmVlLCBwbGF5ZXJfYWdlLCBwbGF5ZXJfcG9zaXRpb24pJT4lIA0KICBtdXRhdGUoc3VtYT0gc3VtKHRyYW5zZmVyX2ZlZSkpDQoNCmxpYnJhcnkoZ2dwbG90MikNCg0KZzwtZnVsbF9qb2luKGEsIGIpDQpoPC1mdWxsX2pvaW4oZyxjKQ0KaTwtZnVsbF9qb2luKGQsZSkNCmo8LWZ1bGxfam9pbihpLGYpICU+JSBmaWx0ZXIoIWlzLm5hKGNvdW50cnkpKQ0KDQoNCmJhcjE8LWdncGxvdChoKSArDQogIGFlcyh4ID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnksIHdlaWdodCA9IHN1bWEpICsNCiAgZ2VvbV9iYXIoKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJ2aXJpZGlzIikrIHRoZW1lX2xpZ2h0KCkrDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwNCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpICsgDQogIGxhYnModGl0bGUgPSAiSW52ZXJzacOzbiBlbiBqdWdhZG9yZXMgcG9yIHBhw61zIiwNCiAgICAgICB4ID0gIkxpZ2EgKFBhw61zKSIsIHkgPSAiSW52ZXJzacOzbiBlbiBqdWdhZG9yZXMiLA0KICAgICAgIHN1YnRpdGxlID0gIkHDsW86IDIwMjAiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KYmFyMjwtIGdncGxvdChqKSArDQogIGFlcyh4ID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnksIHdlaWdodCA9IHN1bWEpICsNCiAgZ2VvbV9iYXIoKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJ2aXJpZGlzIikrIHRoZW1lX2xpZ2h0KCkrDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgKyANCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpw7NuIGVuIGp1Z2Fkb3JlcyBwb3IgcGHDrXMiLA0KICAgICAgIHggPSAiTGlnYSAoUGHDrXMpIiwgeSA9ICJJbnZlcnNpw7NuIGVuIGp1Z2Fkb3JlcyIsDQogICAgICAgc3VidGl0bGUgPSAiQcOxbzogMjAxNSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQpncmlkLmFycmFuZ2UoYmFyMSwgYmFyMiwgbmNvbCA9IDIsIHdpZHRocyA9IGMoNC41LCAzLjUpKQ0KYGBgDQoNCiMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqQ8OzZGlnbyoqPC9GT05UPg0KDQpgYGB7ciwgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHdvcmxkZm9vdGJhbGxSKQ0KDQoNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KDQpsaWJyYXJ5KHJlYWRyKQ0Kc3BhaW4yMDIwIDwtIHJlYWRfY3N2KCIuL2RhdG9zL3NwYWluMjAyMC5jc3YiKQ0KZW5nbGFuZDIwMjAgPC0gcmVhZF9jc3YoIi4vZGF0b3MvZW5nbGFuZDIwMjAuY3N2IikNCmZyYW5jZTIwMjAgPC0gcmVhZF9jc3YoIi4vZGF0b3MvZnJhbmNlMjAyMC5jc3YiKQ0KDQphPC1zcGFpbjIwMjAgJT4lIGZpbHRlcighaXMubmEodHJhbnNmZXJfZmVlKSkgJT4lIGZpbHRlcih0cmFuc2Zlcl90eXBlPT0iQXJyaXZhbHMiKSAlPiUNCiAgc2VsZWN0KGNvdW50cnksc2Vhc29uLCBwbGF5ZXJfbmFtZSwgdGVhbV9uYW1lLHRyYW5zZmVyX2ZlZSwgcGxheWVyX2FnZSwgcGxheWVyX3Bvc2l0aW9uKSU+JSANCiAgbXV0YXRlKHN1bWE9IHN1bSh0cmFuc2Zlcl9mZWUpKQ0KYjwtIGVuZ2xhbmQyMDIwICU+JSBmaWx0ZXIoIWlzLm5hKHRyYW5zZmVyX2ZlZSkpICU+JQ0KICBzZWxlY3QoY291bnRyeSxzZWFzb24sIHBsYXllcl9uYW1lLCB0ZWFtX25hbWUsdHJhbnNmZXJfZmVlLCBwbGF5ZXJfYWdlLCBwbGF5ZXJfcG9zaXRpb24pJT4lIA0KICBtdXRhdGUoc3VtYT0gc3VtKHRyYW5zZmVyX2ZlZSkpDQpjPC0gZnJhbmNlMjAyMCAlPiUgZmlsdGVyKCFpcy5uYSh0cmFuc2Zlcl9mZWUpKSAlPiUNCiAgc2VsZWN0KGNvdW50cnksc2Vhc29uLCBwbGF5ZXJfbmFtZSwgdGVhbV9uYW1lLHRyYW5zZmVyX2ZlZSwgcGxheWVyX2FnZSwgcGxheWVyX3Bvc2l0aW9uKSAlPiUgDQogIG11dGF0ZShzdW1hPSBzdW0odHJhbnNmZXJfZmVlKSkNCg0KDQoNCnNwYWluMjAxNSA8LSByZWFkX2NzdigiLi9kYXRvcy9zcGFpbjIwMTUuY3N2IikNCmVuZ2xhbmQyMDE1IDwtIHJlYWRfY3N2KCIuL2RhdG9zL2VuZ2xhbmQyMDE1LmNzdiIpDQpmcmFuY2UyMDE1IDwtIHJlYWRfY3N2KCIuL2RhdG9zL2ZyYW5jZTIwMTUuY3N2IikNCg0KZDwtIHNwYWluMjAxNSU+JSBmaWx0ZXIoIWlzLm5hKHRyYW5zZmVyX2ZlZSkpICU+JSBmaWx0ZXIodHJhbnNmZXJfdHlwZT09IkFycml2YWxzIikgJT4lDQogIHNlbGVjdChjb3VudHJ5LHNlYXNvbiwgcGxheWVyX25hbWUsIHRlYW1fbmFtZSx0cmFuc2Zlcl9mZWUsIHBsYXllcl9hZ2UsIHBsYXllcl9wb3NpdGlvbiklPiUgDQogIG11dGF0ZShzdW1hPSBzdW0odHJhbnNmZXJfZmVlKSkNCmU8LWVuZ2xhbmQyMDE1JT4lIGZpbHRlcighaXMubmEodHJhbnNmZXJfZmVlKSkgJT4lIGZpbHRlcih0cmFuc2Zlcl90eXBlPT0iQXJyaXZhbHMiKSAlPiUNCiAgc2VsZWN0KGNvdW50cnksc2Vhc29uLCBwbGF5ZXJfbmFtZSwgdGVhbV9uYW1lLHRyYW5zZmVyX2ZlZSwgcGxheWVyX2FnZSwgcGxheWVyX3Bvc2l0aW9uKSU+JSANCiAgbXV0YXRlKHN1bWE9IHN1bSh0cmFuc2Zlcl9mZWUpKQ0KZjwtZnJhbmNlMjAxNSU+JSBmaWx0ZXIoIWlzLm5hKHRyYW5zZmVyX2ZlZSkpICU+JSBmaWx0ZXIodHJhbnNmZXJfdHlwZT09IkFycml2YWxzIikgJT4lDQogIHNlbGVjdChjb3VudHJ5LHNlYXNvbiwgcGxheWVyX25hbWUsIHRlYW1fbmFtZSx0cmFuc2Zlcl9mZWUsIHBsYXllcl9hZ2UsIHBsYXllcl9wb3NpdGlvbiklPiUgDQogIG11dGF0ZShzdW1hPSBzdW0odHJhbnNmZXJfZmVlKSkNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnPC1mdWxsX2pvaW4oYSwgYikNCmg8LWZ1bGxfam9pbihnLGMpDQppPC1mdWxsX2pvaW4oZCxlKQ0KajwtZnVsbF9qb2luKGksZikgJT4lIGZpbHRlcighaXMubmEoY291bnRyeSkpDQoNCg0KYmFyMTwtZ2dwbG90KGgpICsNCiAgYWVzKHggPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSwgd2VpZ2h0ID0gc3VtYSkgKw0KICBnZW9tX2JhcigpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInZpcmlkaXMiKSsgdGhlbWVfbGlnaHQoKSsNCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLA0KICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgKyANCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpw7NuIGVuIGp1Z2Fkb3JlcyBwb3IgcGHDrXMiLA0KICAgICAgIHggPSAiTGlnYSAoUGHDrXMpIiwgeSA9ICJJbnZlcnNpw7NuIGVuIGp1Z2Fkb3JlcyIsDQogICAgICAgc3VidGl0bGUgPSAiQcOxbzogMjAyMCIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQpiYXIyPC0gZ2dwbG90KGopICsNCiAgYWVzKHggPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSwgd2VpZ2h0ID0gc3VtYSkgKw0KICBnZW9tX2JhcigpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInZpcmlkaXMiKSsgdGhlbWVfbGlnaHQoKSsNCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSArIA0KICBsYWJzKHRpdGxlID0gIkludmVyc2nDs24gZW4ganVnYWRvcmVzIHBvciBwYcOtcyIsDQogICAgICAgeCA9ICJMaWdhIChQYcOtcykiLCB5ID0gIkludmVyc2nDs24gZW4ganVnYWRvcmVzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJBw7FvOiAyMDE1IikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCmdyaWQuYXJyYW5nZShiYXIxLCBiYXIyLCBuY29sID0gMiwgd2lkdGhzID0gYygzLjUsIDMuNSkpDQpgYGANCg0KIyA1LiBSZWFsIE1hZHJpZCB5IFZpbmljaXVzIEpyLiANCg0KU295IGRlbCBSZWFsIE1hZHJpZCwgeSBWaW5pY2l1cyBlcyB1biBjcmFjaywgcG9yIHRhbnRvLCBtZSBwYXJlY8OtYSBjb252ZW5pZW50ZSBkZWRpY2FybGUgdW4gcGVxdWXDsW8gYXBhcnRhZG8gYSBWaW5pOg0KDQojIyA1LjEgVmluaWNpdXMgey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKlZpbmljaXVzKio8L0ZPTlQ+DQoNCkVsIGHDsW8gcGFzYWRvIFZpbmljaXVzIG5vIGFuZGFiYSBtdXkgYWNlcnRhZG8gZGUgY2FyYSBhIHBvcnRlcsOtYS4uLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KdmVpbnRlPC11bmRlcnN0YXRfbGVhZ3VlX21hdGNoX3Jlc3VsdHMoIkxhIGxpZ2EiLCAyMDIwKQ0KdW5vPC11bmRlcnN0YXRfbGVhZ3VlX21hdGNoX3Jlc3VsdHMoIkxhIGxpZ2EiLCAyMDIxKQ0KDQoNCg0KI090cmEgaW5mby0tLS0tDQoNCnRlYW1fdXJsczwtIHVuZGVyc3RhdF90ZWFtX21ldGEoIlJlYWwgTWFkcmlkIikNClJNQTwtdW5kZXJzdGF0X3RlYW1fc3RhdHNfYnJlYWtkb3duKCJodHRwczovL3VuZGVyc3RhdC5jb20vdGVhbS9SZWFsX01hZHJpZC8yMDIwIikNCg0KdmluaTwtdW5kZXJzdGF0X3BsYXllcl9zaG90cygiaHR0cHM6Ly91bmRlcnN0YXQuY29tL3BsYXllci83MDA4IikNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQp2aW5pMjwtdmluaSAlPiUgbXV0YXRlKFg9IFgqMTAwKSAlPiUgbXV0YXRlKFkgPSBZKjEwMCkNCg0KdmluaTI8LSB2aW5pMiAlPiUgbXV0YXRlKHJlc3VsdGFkbyA9IGNhc2Vfd2hlbiggcmVzdWx0ID09ICJHb2FsIiB+ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9PSAiTWlzc2VkU2hvdHMiIH4gIjAuNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPT0gIkJsb2NrZWRTaG90IiB+ICIwLjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID09ICJTYXZlZFNob3QiIH4gIjAuNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPT0gIlNob3RPblBvc3QiIH4gIjAuMyIpKSAlPiUNCiAgbXV0YXRlKHJlc3VsdGFkbz0gYXMubnVtZXJpYyhyZXN1bHRhZG8pKSAlPiUgbXV0YXRlKHJlc3VsdGEyID0gMS1yZXN1bHRhZG8pICU+JQ0KICBmaWx0ZXIoIXNlYXNvbiA9PSAyMDIxKQ0KICANCiAgDQpnZ3Bsb3QodmluaTIpICsgYW5ub3RhdGVfcGl0Y2goY29sb3VyID0gIndoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgICA9ICJzcHJpbmdncmVlbjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gRkFMU0UpICsNCiAgZ2VvbV9wb2ludChhZXMoeD1YLCB5PTEwMC1ZLCBjb2xvdXI9IHNob3RUeXBlLCBhbHBoYSA9IHJlc3VsdGFkbyksIHNpemU9NykgKyAgDQogIGNvb3JkX2ZsaXAoeGxpbSA9IGMoNjAsIDEwMSksIHlsaW0gPSBjKC0xLCAxMDEpKSArDQogIHRoZW1lX3BpdGNoKCkgKyAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInNwcmluZ2dyZWVuNCIpKQ0KYGBgDQoNCjxicj4NCg0KTGEgdmVyZGFkIHF1ZSBoYXN0YSBlc3RlIGHDsW8gVmluaWNpdXMgZmFsbGFiYSBtdWNobywgcG9kZW1vcyB2ZXIgZW4gdHJhbnNwYXJlbnRlIHRvZG9zIGxvcyB0aXJvIHF1ZSBoaXpvIHkgbG9zIHB1bnRvcyBubyB0cmFuc3BhcmVudGVzIHNvbiBsb3MgcXVlIGFjYWJhcm9uIGVuIGdvbCAocG9jb3MpLg0KDQpTaW4gZW1iYXJnbywgZXN0ZSBhw7FvIGhhIGNhbWJpYWRvOg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KdmluaTM8LXZpbmkgJT4lIG11dGF0ZShYPSBYKjEwMCkgJT4lIG11dGF0ZShZID0gWSoxMDApDQoNCnZpbmkzPC0gdmluaTMgJT4lIG11dGF0ZShyZXN1bHRhZG8gPSBjYXNlX3doZW4oIHJlc3VsdCA9PSAiR29hbCIgfiAiMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPT0gIk1pc3NlZFNob3RzIiB+ICIwLjYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID09ICJCbG9ja2VkU2hvdCIgfiAiMC42IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9PSAiU2F2ZWRTaG90IiB+ICIwLjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID09ICJTaG90T25Qb3N0IiB+ICIwLjYiKSkgJT4lDQogIG11dGF0ZShyZXN1bHRhZG89IGFzLm51bWVyaWMocmVzdWx0YWRvKSkgJT4lIG11dGF0ZShyZXN1bHRhMiA9IDEtcmVzdWx0YWRvKSAlPiUNCiAgZmlsdGVyKHNlYXNvbiA9PSAyMDIxKQ0KDQoNCmdncGxvdCh2aW5pMykgKyBhbm5vdGF0ZV9waXRjaChjb2xvdXIgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgICA9ICJzcHJpbmdncmVlbjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IEZBTFNFKSArDQogIGdlb21fcG9pbnQoYWVzKHg9WCwgeT0xMDAtWSwgY29sb3VyPSBzaG90VHlwZSwgYWxwaGEgPSByZXN1bHRhZG8pLCBzaXplPTcpICsgIA0KICBjb29yZF9mbGlwKHhsaW0gPSBjKDYwLCAxMDEpLCB5bGltID0gYygtMSwgMTAxKSkgKw0KICB0aGVtZV9waXRjaCgpICsgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJzcHJpbmdncmVlbjQiKSkNCg0KYGBgDQoNClZlbW9zIGPDs21vIGVzdGUgYcOxbyB5YSBoYSBtYXJjYWRvIHVuIHBvcmNlbnRhamUgbXVjaG8gbWF5b3IgZGUgZ29sZXMuIA0KDQo8Y2VudGVyPjxpbWcgc3JjPSJhc3NldHMvZ2lwaHkuZ2lmIiB3aWR0aD0iMzUwcHgiIC8+PC9jZW50ZXI+DQoNCiMjIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKkPDs2RpZ28qKjwvRk9OVD4NCg0KYGBge3IsIGluY2x1ZGU9VFJVRSwgZXZhbD1GQUxTRX0NCg0KdmVpbnRlPC11bmRlcnN0YXRfbGVhZ3VlX21hdGNoX3Jlc3VsdHMoIkxhIGxpZ2EiLCAyMDIwKQ0KdW5vPC11bmRlcnN0YXRfbGVhZ3VlX21hdGNoX3Jlc3VsdHMoIkxhIGxpZ2EiLCAyMDIxKQ0KDQoNCg0KI090cmEgaW5mby0tLS0tDQoNCnRlYW1fdXJsczwtIHVuZGVyc3RhdF90ZWFtX21ldGEoIlJlYWwgTWFkcmlkIikNClJNQTwtdW5kZXJzdGF0X3RlYW1fc3RhdHNfYnJlYWtkb3duKCJodHRwczovL3VuZGVyc3RhdC5jb20vdGVhbS9SZWFsX01hZHJpZC8yMDIwIikNCg0KdmluaTwtdW5kZXJzdGF0X3BsYXllcl9zaG90cygiaHR0cHM6Ly91bmRlcnN0YXQuY29tL3BsYXllci83MDA4IikNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQp2aW5pMjwtdmluaSAlPiUgbXV0YXRlKFg9IFgqMTAwKSAlPiUgbXV0YXRlKFkgPSBZKjEwMCkNCg0KdmluaTI8LSB2aW5pMiAlPiUgbXV0YXRlKHJlc3VsdGFkbyA9IGNhc2Vfd2hlbiggcmVzdWx0ID09ICJHb2FsIiB+ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9PSAiTWlzc2VkU2hvdHMiIH4gIjAuNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPT0gIkJsb2NrZWRTaG90IiB+ICIwLjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID09ICJTYXZlZFNob3QiIH4gIjAuNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPT0gIlNob3RPblBvc3QiIH4gIjAuMyIpKSAlPiUNCiAgbXV0YXRlKHJlc3VsdGFkbz0gYXMubnVtZXJpYyhyZXN1bHRhZG8pKSAlPiUgbXV0YXRlKHJlc3VsdGEyID0gMS1yZXN1bHRhZG8pICU+JQ0KICBmaWx0ZXIoIXNlYXNvbiA9PSAyMDIxKQ0KICANCiAgDQpnZ3Bsb3QodmluaTIpICsgYW5ub3RhdGVfcGl0Y2goY29sb3VyID0gIndoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgICA9ICJzcHJpbmdncmVlbjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gRkFMU0UpICsNCiAgZ2VvbV9wb2ludChhZXMoeD1YLCB5PTEwMC1ZLCBjb2xvdXI9IHNob3RUeXBlLCBhbHBoYSA9IHJlc3VsdGFkbyksIHNpemU9NykgKyAgDQogIGNvb3JkX2ZsaXAoeGxpbSA9IGMoNjAsIDEwMSksIHlsaW0gPSBjKC0xLCAxMDEpKSArDQogIHRoZW1lX3BpdGNoKCkgKyAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInNwcmluZ2dyZWVuNCIpKQ0KDQoNCnZpbmkzPC12aW5pICU+JSBtdXRhdGUoWD0gWCoxMDApICU+JSBtdXRhdGUoWSA9IFkqMTAwKQ0KDQp2aW5pMzwtIHZpbmkzICU+JSBtdXRhdGUocmVzdWx0YWRvID0gY2FzZV93aGVuKCByZXN1bHQgPT0gIkdvYWwiIH4gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID09ICJNaXNzZWRTaG90cyIgfiAiMC42IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9PSAiQmxvY2tlZFNob3QiIH4gIjAuNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPT0gIlNhdmVkU2hvdCIgfiAiMC41IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9PSAiU2hvdE9uUG9zdCIgfiAiMC42IikpICU+JQ0KICBtdXRhdGUocmVzdWx0YWRvPSBhcy5udW1lcmljKHJlc3VsdGFkbykpICU+JSBtdXRhdGUocmVzdWx0YTIgPSAxLXJlc3VsdGFkbykgJT4lDQogIGZpbHRlcihzZWFzb24gPT0gMjAyMSkNCg0KDQpnZ3Bsb3QodmluaTMpICsgYW5ub3RhdGVfcGl0Y2goY29sb3VyID0gIndoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsICAgPSAic3ByaW5nZ3JlZW40IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyh4PVgsIHk9MTAwLVksIGNvbG91cj0gc2hvdFR5cGUsIGFscGhhID0gcmVzdWx0YWRvKSwgc2l6ZT03KSArICANCiAgY29vcmRfZmxpcCh4bGltID0gYyg2MCwgMTAxKSwgeWxpbSA9IGMoLTEsIDEwMSkpICsNCiAgdGhlbWVfcGl0Y2goKSArICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAic3ByaW5nZ3JlZW40IikpDQpgYGANCg0KDQoNCiMjIDUuMiBBc2lzdGVudGVzIHsudGFic2V0fQ0KDQojIyMgPEZPTlQgQ09MT1I9ImQzYTQ2YSI+KipBc2lzdGVudGVzKio8L0ZPTlQ+DQoNCkxvcyBwcmluY2lwYWxlcyBhc2lzdGVudGVzIGRlbCBSZWFsIE1hZHJpZCBlc3RhIHRlbXBvcmFkYSBoYW4gc2lkbyBsb3Mgc2lndWllbnRlczoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQphPC1nZXRfbWF0Y2hfcmVwb3J0KCJodHRwczovL2ZicmVmLmNvbS9lbi9tYXRjaGVzL2Y2ZmFiMzNjL0dldGFmZS1SZWFsLU1hZHJpZC1KYW51YXJ5LTItMjAyMi1MYS1MaWdhIikNCmI8LWdldF9tYXRjaF9zdW1tYXJ5KCJodHRwczovL2ZicmVmLmNvbS9lbi9tYXRjaGVzL2Y2ZmFiMzNjL0dldGFmZS1SZWFsLU1hZHJpZC1KYW51YXJ5LTItMjAyMi1MYS1MaWdhIikNCmM8LWdldF9tYXRjaF9saW5ldXBzKCJodHRwczovL2ZicmVmLmNvbS9lbi9tYXRjaGVzL2Y2ZmFiMzNjL0dldGFmZS1SZWFsLU1hZHJpZC1KYW51YXJ5LTItMjAyMi1MYS1MaWdhIikNCmQ8LWdldF9hZHZhbmNlZF9tYXRjaF9zdGF0cygiaHR0cHM6Ly9mYnJlZi5jb20vZW4vbWF0Y2hlcy9mNmZhYjMzYy9HZXRhZmUtUmVhbC1NYWRyaWQtSmFudWFyeS0yLTIwMjItTGEtTGlnYSIsICJwYXNzaW5nIiwgInRlYW0iKQ0KZTwtdmluaTwtdW5kZXJzdGF0X3BsYXllcl9zaG90cygiaHR0cHM6Ly91bmRlcnN0YXQuY29tL3BsYXllci83MDA4IikNCg0KZTwtZSAlPiUgc2VsZWN0KG1pbnV0ZSwgcGxheWVyX2Fzc2lzdGVkKSAlPiUgZ3JvdXBfYnkocGxheWVyX2Fzc2lzdGVkKSAlPiUgY291bnQoKSAlPiUgDQogIGZpbHRlcighaXMubmEocGxheWVyX2Fzc2lzdGVkKSkNCg0KDQptMTwtdHJlZW1hcChlLCBpbmRleCA9ICJwbGF5ZXJfYXNzaXN0ZWQiLA0KICAgICAgICAgICAgdlNpemUgPSAibiIsDQogICAgICAgICAgICB0eXBlID0gImluZGV4IiwNCiAgICAgICAgICAgIHBhbGV0dGUgPSAiQnJCRyIsDQogICAgICAgICAgICBib3JkZXIubHdkcz0zLA0KICAgICAgICAgICAgYm9yZGVyLmNvbD1jKCJ3aGl0ZSIpLA0KICAgICAgICAgICAgZm9udGZhY2UubGFiZWxzPTEsDQogICAgICAgICAgICBiZy5sYWJlbHM9YygidHJhbnNwYXJlbnQiKSkNCg0KYGBgDQoNCkVzdG8gZXhwbGljYSBncmFuIHBhcnRlIGRlIGxvcyBidWVub3MgcmVzdWx0YWRvcyBkZSBWaW5pY2l1cywgZWwgZGVsYW50ZXJvIGRlbCBlcXVpcG8sIEJlbnplbWEgZXMgZWwgcHJpbmNpcGFsIGFzaXN0ZW50ZSBkZWwgUmVhbCBNYWRyaWQsIGF5dWRhbmRvIG11Y2hvIGEgcXVpZW4ganVlZ2EgZGUgZXh0cmVtbw0KDQoNCjxjZW50ZXI+PGltZyBzcmM9ImFzc2V0cy9naWYuZ2lmIiB3aWR0aD0iMzUwcHgiIC8+PC9jZW50ZXI+DQoNCg0KIyMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqQ8OzZGlnbyoqPC9GT05UPg0KDQpgYGB7ciwgaW5jbHVkZT1UUlVFLCBldmFsPUZBTFNFfQ0KYTwtZ2V0X21hdGNoX3JlcG9ydCgiaHR0cHM6Ly9mYnJlZi5jb20vZW4vbWF0Y2hlcy9mNmZhYjMzYy9HZXRhZmUtUmVhbC1NYWRyaWQtSmFudWFyeS0yLTIwMjItTGEtTGlnYSIpDQpiPC1nZXRfbWF0Y2hfc3VtbWFyeSgiaHR0cHM6Ly9mYnJlZi5jb20vZW4vbWF0Y2hlcy9mNmZhYjMzYy9HZXRhZmUtUmVhbC1NYWRyaWQtSmFudWFyeS0yLTIwMjItTGEtTGlnYSIpDQpjPC1nZXRfbWF0Y2hfbGluZXVwcygiaHR0cHM6Ly9mYnJlZi5jb20vZW4vbWF0Y2hlcy9mNmZhYjMzYy9HZXRhZmUtUmVhbC1NYWRyaWQtSmFudWFyeS0yLTIwMjItTGEtTGlnYSIpDQpkPC1nZXRfYWR2YW5jZWRfbWF0Y2hfc3RhdHMoImh0dHBzOi8vZmJyZWYuY29tL2VuL21hdGNoZXMvZjZmYWIzM2MvR2V0YWZlLVJlYWwtTWFkcmlkLUphbnVhcnktMi0yMDIyLUxhLUxpZ2EiLCAicGFzc2luZyIsICJ0ZWFtIikNCmU8LXZpbmk8LXVuZGVyc3RhdF9wbGF5ZXJfc2hvdHMoImh0dHBzOi8vdW5kZXJzdGF0LmNvbS9wbGF5ZXIvNzAwOCIpDQoNCmU8LWUgJT4lIHNlbGVjdChtaW51dGUsIHBsYXllcl9hc3Npc3RlZCkgJT4lIGdyb3VwX2J5KHBsYXllcl9hc3Npc3RlZCkgJT4lIGNvdW50KCkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHBsYXllcl9hc3Npc3RlZCkpDQoNCg0KbTE8LXRyZWVtYXAoZSwgaW5kZXggPSAicGxheWVyX2Fzc2lzdGVkIiwNCiAgICAgICAgICAgIHZTaXplID0gIm4iLA0KICAgICAgICAgICAgdHlwZSA9ICJpbmRleCIsDQogICAgICAgICAgICBwYWxldHRlID0gIkJyQkciLA0KICAgICAgICAgICAgYm9yZGVyLmx3ZHM9MywNCiAgICAgICAgICAgIGJvcmRlci5jb2w9Yygid2hpdGUiKSwNCiAgICAgICAgICAgIGZvbnRmYWNlLmxhYmVscz0xLA0KICAgICAgICAgICAgYmcubGFiZWxzPWMoInRyYW5zcGFyZW50IikpDQoNCmBgYA0KDQojIDYuIFByZWRpY2Npb25lcyBwYXJ0aWRvcyBkZSBsYSBsaWdhDQoNCkVzdGEgZXMgbGEgcGFydGUgcXVlIG3DoXMgdGllbXBvIGxlIGhlIGRlZGljYWRvLCBoZSBjb2dpZG8gbXVjaGEgaW5mb3JtYWNpw7NuIGFjZXJjYSBkZSBsYXMgZXN0YWTDrXN0aWNhcyBkZSBsb3MgZXF1aXBvcyBkZSBMYSBMaWdhIHkgaGUgY3JlYWRvIHByZWRpY2Npb25lcyBkZSBsb3MgcGFydGlkb3MgZGVsIGZpbiBkZSBzZW1hbmEgZGVsIDkgZGUgZW5lcm8NCihFc3RhcyBwcmVkaWNjaW9uZXMgc2UgaGFuIGVtcGV6YWRvIGEgaGFjZXIgYW50ZXMgZGUgbG9zIHBhcnRpZG9zIGRlbCAzMSBkZSBEaWNpZW1icmUsIHBvciBsbyBxdWUgbG9zIGRhdG9zIGRlIGVzdGEgam9ybmFkYSBubyBlc3TDoW4gaW5jbHXDrWRvcykuDQoNClZhbW9zIGEgdG9tYXIgdW4gZWplbXBsbyBwcmltZXJvIGRlIHVuIHBhcnRpZG8sIGVsIFJlYWwgTWFkcmlkIFZhbGVuY2lhLCBkb25kZSBleHBsaWNhcsOpIGNvbW8gbG8gaGUgaGVjaG8geSBkZXNwdcOpcywgdXNhcsOpIGVsIG1pc21vIGPDs2RpZ28gcGFyYSB0b2RvcyBsb3MgcGFydGlkb3MgeSB5YSB2ZXJlbW9zIHNpIGFjaWVydG8gbyBuby4uLg0KDQojIyA2LjEgRGF0b3MNCg0KRW4gZXN0ZSBjYXNvLCB2YW1vcyBhIHZlciBlbCBjw7NkaWdvLCBwdWVzIGxhIGlkZWEgZXMgcXVlIHNlYSBmw6FjaWwgZGUgcmVwZXRpciBwYXJhIGN1YWxxdWllciBwYXJ0aWRvIHkgaGUgcHVlc3RvIHVuYXMgcGVxdWXDsWFzIGluc3RydWNjaW9uZXMgcGFyYSBjb3BpYXIgeSBwZWdhciBlbCBjw7NkaWdvIGVuIHVuIFJzY3JpcHQgeSBwb2RlciB1c2FybG8gcGFyYSBjYWRhIHBhcnRpZG8NCg0KYGBge3IsZXZhbD1GQUxTRX0NCiNJbnRydWNjaW9uZXM6DQojMS0gSGFjZXIgQ3RybCtmIHkgcmVlbXBsYXphciAoUmVwbGFjZSk6IFJlYWwgTWFkcmlkIHBvciBlbCBlcXVpcG8gbG9jYWwgeSBWYWxlbmNpYSBwb3IgZWwgZXF1aXBvIFZpc2l0YW50ZQ0KIzItIE1vZGlmaWNpYXIgbGEgbMOtbmVhIHF1ZSBwb25lIElNUE9SVEFOVMONU0lNTw0KIzMtIFJlZW1wbGF6YSAyMDIxLTEyLTMxIHBvciBsYSBmZWNoYSBkZWwgcHJpbWVyIHBhcnRpZG8gZGUgbGEgam9ybmFkYSBxdWUgZXN0dWRpYW1vcyAoaGFjaWVuZG8gbG8gbWlzbW8gcXVlIGVuIGVsIHBhc28gMSkNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHdvcmxkZm9vdGJhbGxSKQ0KDQojSnVnYW5kbyBjb24gRkJSRUYtLS0tLS0NCg0KY2xhc2lmaWNhY2lvbjwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSANCiAgc2VsZWN0KFNxdWFkLFJrLFB0cyx4RywgeEdBKSANCg0KZGF0b3M8LSBnZXRfbWF0Y2hfcmVzdWx0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IikNCmBgYA0KDQpMYXMgaW5zdHJ1Y2Npb25lcyBzb24gc2ltcGxlcywgaGUgaW50ZW50YWRvIHF1ZSBzZWEgdG9kbyBiYXN0YW50ZSAiYXV0b23DoXRpY28iIHBhcmEgY2FtYmlhciBsbyBtZW5vcyBwb3NpYmxlLg0KTG9zIGRhdG9zIGRlIGRvbmRlIHNpZW1wcmUsIHRvbWFtb3MgZXN0YSB0ZW1wb3JhZGEsIHkgYSBqdWdhci4uLg0KDQojIyA2LjIgKzEsIC0xIC4uLg0KDQpDb21vIG5vIHNhYsOtYSBtdXkgYmllbiBjb21vIHVzYXIgbG9zIGRhdG9zIG1pIGlkZWEgZnVlIHNpbXBsZSwgcGFydGltb3MgZGUgdW4gbWFyY2Fkb3MgPSAwLCB5IHNpIGVsIGVxdWlwbyBMb2NhbCBnYW5hIGFsIFZpc2l0YW50ZSBlbiB1biDDoW1iaXRvIChwb3IgZWplbXBsbywgZGUgbWVkaWEgdGlyYSBtw6FzIGEgcHVlcnRhKSwgbGUgc3VtbyArMSBhbCBtYXJjYWRvcjsgc2kgZXMgYWwgcmV2w6lzLCBsZSByZXN0byAtMS4gRW4gZWwgY2FzbyBkZSBxdWUgZWwgbWFyY2Fkb3IgZmluYWwgcXVlZGUsIHBvciBlamVtcGxvOiANCg0KTWFyY2Fkb3I6IC02OyBlcyBxdWUgZWwgZXF1aXBvIHZpc2l0YW50ZSB0aWVuZSBtw6FzIHByb2JhYmlsaWRhZCBkZSBnYW5hci4gVmFtb3MgYWxsw6E6DQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KI1ZhbW9zIGEgdmVyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgZ2FuZSBlbCBSZWFsIE1hZHJpZA0KDQp2ZTwtIGNsYXNpZmljYWNpb24gJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJSZWFsIE1hZHJpZCIsICJWYWxlbmNpYSIpKSAlPiUgI1BvbmVyIGxvcyBlcXVpcG9zIHF1ZSBxdWllcmFzIChMb2NhbCB5IFZpc2l0YW50ZSkNCiAgbXV0YXRlKG9yZGVuPSBjKDIsMSkpICU+JSBzbGljZV9taW4ob3JkZW4sIG49MikgJT4lDQogIG11dGF0ZShEeEc9IHhHLSBsYWcoeEcpKSAlPiUgbXV0YXRlKERQdHM9IFB0cyAtIGxhZyhQdHMpKSAlPiUNCiAgbXV0YXRlKER4R0E9IHhHQSAtIGxhZyh4R0EpKSANCg0KI0lNUE9SVEFOVMONU0lNTywgY2FtYmlhciBsb3MgbsO6bWVyb3MsLS0+ICgxLDIpOiBTaSBlcXVpcG8gbG9jYWwgZXMgYWxmYWLDqXRpY2FtZW50ZSBzdXBlcmlvciBhbCBlcXVpcG8gdmlzaXRhbnRlIGVqOiBSZWFsIE1hZHJpZD5WYWxlbmNpYTsgZW4gY2FzbyBjb250cmFyaW86ICgyLDEpDQoNCg0KcHJ1ZWJhPC0gdmUgJT4lIG11dGF0ZShwcnVlYmEgPSAwKSAlPiUgDQogIG11dGF0ZSggcHJ1ZWJhPSBpZmVsc2UoRFB0cz4xNSwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRFB0czwoLTE1KSwgcHJ1ZWJhLTEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPjAsIHBydWViYSsxLCBwcnVlYmEtMSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPjEwLCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc8KC0xMCksIHBydWViYS0xLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4R0E+MCwgcHJ1ZWJhIC0xLCBwcnVlYmErMSkpDQoNCiNQb25lciBlbCBlcXVpcG8gTG9jYWwgKEVuIGFtYm9zKSANCiNDdWlkYWRvLCBsb3MgZGF0b3Mgc29uIGRlbCAyMDIxLTEyLTMxLCBzZSBkZWJlcsOtYSBwb25lciBsYSBmZWNoYSBkZSBsYSDDumx0aW1hIGpvcm5hZGENCg0KTG9jYWx2PC0gZGF0b3MgJT4lIGZpbHRlcihIb21lID09ICJSZWFsIE1hZHJpZCIpICU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICIxIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyggaWZlbHNlKFJlc3VsdGFkbyA8PSAtMSwgIi0xIiwgUmVzdWx0YWRvKSkpICU+JQ0KICBzdW1tYXJpc2UoTG9jYWx2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiUmVhbCBNYWRyaWQiKQ0KDQpWaXNpdGFudGV2IDwtIGRhdG9zICU+JSBmaWx0ZXIoQXdheT09IlJlYWwgTWFkcmlkIiklPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiLTEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKGlmZWxzZShSZXN1bHRhZG8gPj0gMSwgIjEiLCBSZXN1bHRhZG8pKSkgJT4lIA0KICBzdW1tYXJpc2UoVmlzaXRhbnRldj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIlJlYWwgTWFkcmlkIikNCg0KI1BvbmVyIGVsIGVxdWlwbyB2aXNpdGFudGUgKEVuIGFtYm9zKSANCiNDdWlkYWRvLCBsb3MgZGF0b3Mgc29uIGRlbCAyMDIxLTEyLTMxLCBzZSBkZWJlcsOtYSBwb25lciBsYSBmZWNoYSBkZSBsYSDDumx0aW1hIGpvcm5hZGENCg0KTG9jYWxlPC0gZGF0b3MgJT4lIGZpbHRlcihIb21lID09ICJWYWxlbmNpYSIpICU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICIxIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyggaWZlbHNlKFJlc3VsdGFkbyA8PSAtMSwgIi0xIiwgUmVzdWx0YWRvKSkpICU+JQ0KICBzdW1tYXJpc2UoTG9jYWx2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiVmFsZW5jaWEiKQ0KDQpWaXNpdGFudGVlIDwtIGRhdG9zICU+JSBmaWx0ZXIoQXdheT09IlZhbGVuY2lhIiklPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiLTEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKGlmZWxzZShSZXN1bHRhZG8gPj0gMSwgIjEiLCBSZXN1bHRhZG8pKSkgJT4lIA0KICBzdW1tYXJpc2UoVmlzaXRhbnRlZT1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIlZhbGVuY2lhIikNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLExvY2FsdikgDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIFZpc2l0YW50ZWUpDQpwcnVlYmE8LXBydWViYSAlPiUgbXV0YXRlKERHYW49IExvY2Fsdi1sYWcoVmlzaXRhbnRlZSkpICU+JQ0KICBtdXRhdGUocHJ1ZWJhPSBpZmVsc2UoREdhbj4wLCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgIHBydWViYT0gaWZlbHNlKERHYW48MCwgcHJ1ZWJhLTEsIHBydWViYSkpDQoNCg0KI0Fob3JhIHZhbW9zIGEgY3JlYXIgdW5hIHZhcmlhYmxlIHF1ZSBzZWEgbGEgc3VtYSBkZSB0b2RhcyBsYXMgdmFyaWFibGVzIGRlIGRlZmVuc2E6IHByZXNpw7NuIGNvbiDDqXhpdG8sIGJsb3F1ZWFyIHVuIHBhc2UuLi4gcGVybyBjb21vIHRpZW5lbiBkaXN0aW50YXMgbWFnbml0dWRlcywgdmFtb3MgYSB0aXBpZmljYXIgbGEgdmFyaWFibGUgcGFyYSBwb2RlciBzdW1hcmxhcw0KDQp2YW1vczwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICAiZGVmZW5zZSIpDQoNCg0KdmFtb3NUPC0gdmFtb3MgJT4lIHNlbGVjdChTcXVhZCxUa2xXX1RhY2tsZXMsIFN1Y2NfUHJlc3N1cmVzLCBCbG9ja3NfQmxvY2tzKSAlPiUgDQogIG11dGF0ZShUa2xXX1RhY2tsZXMgPSAoVGtsV19UYWNrbGVzLSBtZWFuKFRrbFdfVGFja2xlcykpL3NkKFRrbFdfVGFja2xlcykpICU+JQ0KICBtdXRhdGUoU3VjY19QcmVzc3VyZXMgPSAoU3VjY19QcmVzc3VyZXMtIG1lYW4oU3VjY19QcmVzc3VyZXMpKS9zZChTdWNjX1ByZXNzdXJlcykpICU+JQ0KICBtdXRhdGUoQmxvY2tzX0Jsb2NrcyA9IChCbG9ja3NfQmxvY2tzLSBtZWFuKEJsb2Nrc19CbG9ja3MpKS9zZChCbG9ja3NfQmxvY2tzKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBWYWxlbmNpYSIsICJSZWFsIE1hZHJpZCIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBWYWxlbmNpYSIsICJWYWxlbmNpYSIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QpICU+JSANCiAgbXV0YXRlKERkZWY9IChUa2xXX1RhY2tsZXMgLSBsYWcoVGtsV19UYWNrbGVzKSkgKyAoU3VjY19QcmVzc3VyZXMgLSBsYWcoU3VjY19QcmVzc3VyZXMpKSsgKEJsb2Nrc19CbG9ja3MtIGxhZyhCbG9ja3NfQmxvY2tzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGVmID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNWYW1vcyBhIGhhY2VyIGxvIG1pc21vIGNvbiBsb3MgcGFzZXM6DQoNCnZhbW9zMjwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJwYXNzaW5nIikNCg0KDQp2YW1vc1QyPC0gdmFtb3MyICU+JSBzZWxlY3QoU3F1YWQsQ21wX3BlcmNlbnRfVG90YWwsQXN0LEFfbWludXNfeEEsIEZpbmFsX1RoaXJkLCBQcm9nKSU+JSANCiAgbXV0YXRlKENtcF9wZXJjZW50X1RvdGFsID0gKENtcF9wZXJjZW50X1RvdGFsLSBtZWFuKENtcF9wZXJjZW50X1RvdGFsKSkvc2QoQ21wX3BlcmNlbnRfVG90YWwpKSAlPiUNCiAgbXV0YXRlKEFzdCA9IChBc3QtIG1lYW4oQXN0KSkvc2QoQXN0KSkgJT4lDQogIG11dGF0ZShBX21pbnVzX3hBID0gKEFfbWludXNfeEEtIG1lYW4oQV9taW51c194QSkpL3NkKEFfbWludXNfeEEpKSAlPiUgDQogIG11dGF0ZShGaW5hbF9UaGlyZCA9IChGaW5hbF9UaGlyZC0gbWVhbihGaW5hbF9UaGlyZCkpL3NkKEZpbmFsX1RoaXJkKSkgJT4lDQogIG11dGF0ZShQcm9nID0gKFByb2ctIG1lYW4oUHJvZykpL3NkKFByb2cpKSAlPiUNCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgVmFsZW5jaWEiLCAiUmVhbCBNYWRyaWQiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgVmFsZW5jaWEiLCAiVmFsZW5jaWEiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDIpICU+JSANCiAgbXV0YXRlKERwYXM9IChDbXBfcGVyY2VudF9Ub3RhbCAtIGxhZyhDbXBfcGVyY2VudF9Ub3RhbCkpICsgKEFzdCAtIGxhZyhBc3QpKSsgKEFfbWludXNfeEEtIGxhZyhBX21pbnVzX3hBKSkrIChGaW5hbF9UaGlyZCAtIGxhZyhGaW5hbF9UaGlyZCkpKyAoUHJvZy0gbGFnKFByb2cpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERwYXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xvIG1pc21vIGNvbiBsb3MgZGlzcGFyb3M6DQoNCnZhbW9zMzwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJzaG9vdGluZyIpDQoNCg0KdmFtb3NUMzwtIHZhbW9zMyAlPiUgc2VsZWN0KFNxdWFkLEdsc19TdGFuZGFyZCwgU29UX1N0YW5kYXJkLEdfcGVyX1NoX1N0YW5kYXJkKSAgJT4lIA0KICBtdXRhdGUoR2xzX1N0YW5kYXJkID0gKEdsc19TdGFuZGFyZC0gbWVhbihHbHNfU3RhbmRhcmQpKS9zZChHbHNfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKFNvVF9TdGFuZGFyZCA9IChTb1RfU3RhbmRhcmQtIG1lYW4oU29UX1N0YW5kYXJkKSkvc2QoU29UX1N0YW5kYXJkKSkgJT4lDQogIG11dGF0ZShHX3Blcl9TaF9TdGFuZGFyZCA9IChHX3Blcl9TaF9TdGFuZGFyZC0gbWVhbihHX3Blcl9TaF9TdGFuZGFyZCkpL3NkKEdfcGVyX1NoX1N0YW5kYXJkKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBWYWxlbmNpYSIsICJSZWFsIE1hZHJpZCIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBWYWxlbmNpYSIsICJWYWxlbmNpYSIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUMykgJT4lIA0KICBtdXRhdGUoRGRpcz0gKEdsc19TdGFuZGFyZCAtIGxhZyhHbHNfU3RhbmRhcmQpKSArIChTb1RfU3RhbmRhcmQgLSBsYWcoU29UX1N0YW5kYXJkKSkrIChHX3Blcl9TaF9TdGFuZGFyZC0gbGFnKEdfcGVyX1NoX1N0YW5kYXJkKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGlzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNMaW1waW8gdW4gcG9xdWl0byBlbCBERiBwcnVlYmE6DQoNCnBydWViYTwtIHBydWViYSAlPiUgc2VsZWN0KFNxdWFkLCBvcmRlbiwgcHJ1ZWJhKQ0KDQoNCiNIYWdvIGxvIG1pc21vIGNvbiBsYSBwb3Nlc2nDs246DQoNCnZhbW9zNDwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJwb3NzZXNzaW9uIikNCg0KDQp2YW1vc1Q0PC0gdmFtb3M0ICU+JSBzZWxlY3QoU3F1YWQsIFBvc3MsU3VjY19wZXJjZW50X0RyaWJibGVzLCBGaW5hbF9UaGlyZF9DYXJyaWVzKSU+JSANCiAgbXV0YXRlKFBvc3MgPSAoUG9zcy0gbWVhbihQb3NzKSkvc2QoUG9zcykpICU+JQ0KICBtdXRhdGUoU3VjY19wZXJjZW50X0RyaWJibGVzID0gKFN1Y2NfcGVyY2VudF9EcmliYmxlcy0gbWVhbihTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKS9zZChTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKSAlPiUNCiAgbXV0YXRlKEZpbmFsX1RoaXJkX0NhcnJpZXMgPSAoRmluYWxfVGhpcmRfQ2Fycmllcy0gbWVhbihGaW5hbF9UaGlyZF9DYXJyaWVzKSkvc2QoRmluYWxfVGhpcmRfQ2FycmllcykpICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgVmFsZW5jaWEiLCAiUmVhbCBNYWRyaWQiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgVmFsZW5jaWEiLCAiVmFsZW5jaWEiLCBTcXVhZCkpICNFc3RvIGVzIHVuIHJvbGxvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1Q0KSAlPiUgDQogIG11dGF0ZShEZGlzPSAoUG9zcyAtIGxhZyhQb3NzKSkgKyAoU3VjY19wZXJjZW50X0RyaWJibGVzIC0gbGFnKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpKyAoRmluYWxfVGhpcmRfQ2Fycmllcy0gbGFnKEZpbmFsX1RoaXJkX0NhcnJpZXMpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KYGBgDQoNCkVuIHZleiBkZSBtYXJjYWRvciwgbG8gbGxhbcOpIHBydWViYSwgY29tbyBwb2RlbW9zIHZlci4gWSBhIGVzdGFzIGFsdHVyYXMsIGRlc3B1w6lzIGRlIGFwbGljYXIgbG9zIGNyaXRlcmlvcyBxdWUgaGUgY29uc2lkZXJhZG8sIGVzdMOhIHRhbCBxdWUgYXPDrToNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpjbGFzaWZpY2FjaW9uPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMjIsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIA0KICBzZWxlY3QoU3F1YWQsUmssUHRzLHhHLCB4R0EpIA0KDQpkYXRvczwtIGdldF9tYXRjaF9yZXN1bHRzKCJFU1AiLCAiTSIsIDIwMjIsICIxc3QiKQ0KDQojVmFtb3MgYSB2ZXIgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBnYW5lIGVsIFJlYWwgTWFkcmlkDQoNCnZlPC0gY2xhc2lmaWNhY2lvbiAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoIlJlYWwgTWFkcmlkIiwgIlZhbGVuY2lhIikpICU+JSAjUG9uZXIgbG9zIGVxdWlwb3MgcXVlIHF1aWVyYXMgKExvY2FsIHkgVmlzaXRhbnRlKQ0KICBtdXRhdGUob3JkZW49IGMoMiwxKSkgJT4lIHNsaWNlX21pbihvcmRlbiwgbj0yKSAlPiUNCiAgbXV0YXRlKER4Rz0geEctIGxhZyh4RykpICU+JSBtdXRhdGUoRFB0cz0gUHRzIC0gbGFnKFB0cykpICU+JQ0KICBtdXRhdGUoRHhHQT0geEdBIC0gbGFnKHhHQSkpIA0KDQojSU1QT1JUQU5Uw41TSU1PLCBjYW1iaWFyIGxvcyBuw7ptZXJvcywtLT4gKDEsMik6IFNpIGVxdWlwbyBsb2NhbCBlcyBhbGZhYsOpdGljYW1lbnRlIHN1cGVyaW9yIGFsIGVxdWlwbyB2aXNpdGFudGUgZWo6IFJlYWwgTWFkcmlkPlZhbGVuY2lhOyBlbiBjYXNvIGNvbnRyYXJpbzogKDIsMSkNCg0KDQpwcnVlYmE8LSB2ZSAlPiUgbXV0YXRlKHBydWViYSA9IDApICU+JSANCiAgbXV0YXRlKCBwcnVlYmE9IGlmZWxzZShEUHRzPjE1LCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEUHRzPCgtMTUpLCBwcnVlYmEtMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc+MCwgcHJ1ZWJhKzEsIHBydWViYS0xKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc+MTAsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4RzwoLTEwKSwgcHJ1ZWJhLTEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHQT4wLCBwcnVlYmEgLTEsIHBydWViYSsxKSkNCg0KI1BvbmVyIGVsIGVxdWlwbyBMb2NhbCAoRW4gYW1ib3MpIA0KI0N1aWRhZG8sIGxvcyBkYXRvcyBzb24gZGVsIDIwMjEtMTItMzEsIHNlIGRlYmVyw61hIHBvbmVyIGxhIGZlY2hhIGRlIGxhIMO6bHRpbWEgam9ybmFkYQ0KDQpMb2NhbHY8LSBkYXRvcyAlPiUgZmlsdGVyKEhvbWUgPT0gIlJlYWwgTWFkcmlkIikgJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIjEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKCBpZmVsc2UoUmVzdWx0YWRvIDw9IC0xLCAiLTEiLCBSZXN1bHRhZG8pKSkgJT4lDQogIHN1bW1hcmlzZShMb2NhbHY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJSZWFsIE1hZHJpZCIpDQoNClZpc2l0YW50ZXYgPC0gZGF0b3MgJT4lIGZpbHRlcihBd2F5PT0iUmVhbCBNYWRyaWQiKSU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICItMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoaWZlbHNlKFJlc3VsdGFkbyA+PSAxLCAiMSIsIFJlc3VsdGFkbykpKSAlPiUgDQogIHN1bW1hcmlzZShWaXNpdGFudGV2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiUmVhbCBNYWRyaWQiKQ0KDQojUG9uZXIgZWwgZXF1aXBvIHZpc2l0YW50ZSAoRW4gYW1ib3MpIA0KI0N1aWRhZG8sIGxvcyBkYXRvcyBzb24gZGVsIDIwMjEtMTItMzEsIHNlIGRlYmVyw61hIHBvbmVyIGxhIGZlY2hhIGRlIGxhIMO6bHRpbWEgam9ybmFkYQ0KDQpMb2NhbGU8LSBkYXRvcyAlPiUgZmlsdGVyKEhvbWUgPT0gIlZhbGVuY2lhIikgJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIjEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKCBpZmVsc2UoUmVzdWx0YWRvIDw9IC0xLCAiLTEiLCBSZXN1bHRhZG8pKSkgJT4lDQogIHN1bW1hcmlzZShMb2NhbHY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJWYWxlbmNpYSIpDQoNClZpc2l0YW50ZWUgPC0gZGF0b3MgJT4lIGZpbHRlcihBd2F5PT0iVmFsZW5jaWEiKSU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICItMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoaWZlbHNlKFJlc3VsdGFkbyA+PSAxLCAiMSIsIFJlc3VsdGFkbykpKSAlPiUgDQogIHN1bW1hcmlzZShWaXNpdGFudGVlPXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiVmFsZW5jaWEiKQ0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsTG9jYWx2KSANCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgVmlzaXRhbnRlZSkNCnBydWViYTwtcHJ1ZWJhICU+JSBtdXRhdGUoREdhbj0gTG9jYWx2LWxhZyhWaXNpdGFudGVlKSkgJT4lDQogIG11dGF0ZShwcnVlYmE9IGlmZWxzZShER2FuPjAsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoREdhbjwwLCBwcnVlYmEtMSwgcHJ1ZWJhKSkNCg0KDQojQWhvcmEgdmFtb3MgYSBjcmVhciB1bmEgdmFyaWFibGUgcXVlIHNlYSBsYSBzdW1hIGRlIHRvZGFzIGxhcyB2YXJpYWJsZXMgZGUgZGVmZW5zYTogcHJlc2nDs24gY29uIMOpeGl0bywgYmxvcXVlYXIgdW4gcGFzZS4uLiBwZXJvIGNvbW8gdGllbmVuIGRpc3RpbnRhcyBtYWduaXR1ZGVzLCB2YW1vcyBhIHRpcGlmaWNhciBsYSB2YXJpYWJsZSBwYXJhIHBvZGVyIHN1bWFybGFzDQoNCnZhbW9zPC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gICJkZWZlbnNlIikNCg0KdmFtb3NUPC0gdmFtb3MgJT4lIHNlbGVjdChTcXVhZCxUa2xXX1RhY2tsZXMsIFN1Y2NfUHJlc3N1cmVzLCBCbG9ja3NfQmxvY2tzKSAlPiUgDQogIG11dGF0ZShUa2xXX1RhY2tsZXMgPSAoVGtsV19UYWNrbGVzLSBtZWFuKFRrbFdfVGFja2xlcykpL3NkKFRrbFdfVGFja2xlcykpICU+JQ0KICBtdXRhdGUoU3VjY19QcmVzc3VyZXMgPSAoU3VjY19QcmVzc3VyZXMtIG1lYW4oU3VjY19QcmVzc3VyZXMpKS9zZChTdWNjX1ByZXNzdXJlcykpICU+JQ0KICBtdXRhdGUoQmxvY2tzX0Jsb2NrcyA9IChCbG9ja3NfQmxvY2tzLSBtZWFuKEJsb2Nrc19CbG9ja3MpKS9zZChCbG9ja3NfQmxvY2tzKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBWYWxlbmNpYSIsICJSZWFsIE1hZHJpZCIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBWYWxlbmNpYSIsICJWYWxlbmNpYSIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QpICU+JSANCiAgbXV0YXRlKERkZWY9IChUa2xXX1RhY2tsZXMgLSBsYWcoVGtsV19UYWNrbGVzKSkgKyAoU3VjY19QcmVzc3VyZXMgLSBsYWcoU3VjY19QcmVzc3VyZXMpKSsgKEJsb2Nrc19CbG9ja3MtIGxhZyhCbG9ja3NfQmxvY2tzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGVmID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNWYW1vcyBhIGhhY2VyIGxvIG1pc21vIGNvbiBsb3MgcGFzZXM6DQoNCnZhbW9zMjwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJwYXNzaW5nIikNCg0KDQp2YW1vc1QyPC0gdmFtb3MyICU+JSBzZWxlY3QoU3F1YWQsQ21wX3BlcmNlbnRfVG90YWwsQXN0LEFfbWludXNfeEEsIEZpbmFsX1RoaXJkLCBQcm9nKSU+JSANCiAgbXV0YXRlKENtcF9wZXJjZW50X1RvdGFsID0gKENtcF9wZXJjZW50X1RvdGFsLSBtZWFuKENtcF9wZXJjZW50X1RvdGFsKSkvc2QoQ21wX3BlcmNlbnRfVG90YWwpKSAlPiUNCiAgbXV0YXRlKEFzdCA9IChBc3QtIG1lYW4oQXN0KSkvc2QoQXN0KSkgJT4lDQogIG11dGF0ZShBX21pbnVzX3hBID0gKEFfbWludXNfeEEtIG1lYW4oQV9taW51c194QSkpL3NkKEFfbWludXNfeEEpKSAlPiUgDQogIG11dGF0ZShGaW5hbF9UaGlyZCA9IChGaW5hbF9UaGlyZC0gbWVhbihGaW5hbF9UaGlyZCkpL3NkKEZpbmFsX1RoaXJkKSkgJT4lDQogIG11dGF0ZShQcm9nID0gKFByb2ctIG1lYW4oUHJvZykpL3NkKFByb2cpKSAlPiUNCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgVmFsZW5jaWEiLCAiUmVhbCBNYWRyaWQiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgVmFsZW5jaWEiLCAiVmFsZW5jaWEiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDIpICU+JSANCiAgbXV0YXRlKERwYXM9IChDbXBfcGVyY2VudF9Ub3RhbCAtIGxhZyhDbXBfcGVyY2VudF9Ub3RhbCkpICsgKEFzdCAtIGxhZyhBc3QpKSsgKEFfbWludXNfeEEtIGxhZyhBX21pbnVzX3hBKSkrIChGaW5hbF9UaGlyZCAtIGxhZyhGaW5hbF9UaGlyZCkpKyAoUHJvZy0gbGFnKFByb2cpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERwYXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xvIG1pc21vIGNvbiBsb3MgZGlzcGFyb3M6DQoNCnZhbW9zMzwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJzaG9vdGluZyIpDQoNCg0KdmFtb3NUMzwtIHZhbW9zMyAlPiUgc2VsZWN0KFNxdWFkLEdsc19TdGFuZGFyZCwgU29UX1N0YW5kYXJkLEdfcGVyX1NoX1N0YW5kYXJkKSAgJT4lIA0KICBtdXRhdGUoR2xzX1N0YW5kYXJkID0gKEdsc19TdGFuZGFyZC0gbWVhbihHbHNfU3RhbmRhcmQpKS9zZChHbHNfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKFNvVF9TdGFuZGFyZCA9IChTb1RfU3RhbmRhcmQtIG1lYW4oU29UX1N0YW5kYXJkKSkvc2QoU29UX1N0YW5kYXJkKSkgJT4lDQogIG11dGF0ZShHX3Blcl9TaF9TdGFuZGFyZCA9IChHX3Blcl9TaF9TdGFuZGFyZC0gbWVhbihHX3Blcl9TaF9TdGFuZGFyZCkpL3NkKEdfcGVyX1NoX1N0YW5kYXJkKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBWYWxlbmNpYSIsICJSZWFsIE1hZHJpZCIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBWYWxlbmNpYSIsICJWYWxlbmNpYSIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUMykgJT4lIA0KICBtdXRhdGUoRGRpcz0gKEdsc19TdGFuZGFyZCAtIGxhZyhHbHNfU3RhbmRhcmQpKSArIChTb1RfU3RhbmRhcmQgLSBsYWcoU29UX1N0YW5kYXJkKSkrIChHX3Blcl9TaF9TdGFuZGFyZC0gbGFnKEdfcGVyX1NoX1N0YW5kYXJkKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGlzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNMaW1waW8gdW4gcG9xdWl0byBlbCBERiBwcnVlYmE6DQoNCnBydWViYTwtIHBydWViYSAlPiUgc2VsZWN0KFNxdWFkLCBvcmRlbiwgcHJ1ZWJhKQ0KDQoNCiNIYWdvIGxvIG1pc21vIGNvbiBsYSBwb3Nlc2nDs246DQoNCnZhbW9zNDwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJwb3NzZXNzaW9uIikNCg0KDQp2YW1vc1Q0PC0gdmFtb3M0ICU+JSBzZWxlY3QoU3F1YWQsIFBvc3MsU3VjY19wZXJjZW50X0RyaWJibGVzLCBGaW5hbF9UaGlyZF9DYXJyaWVzKSU+JSANCiAgbXV0YXRlKFBvc3MgPSAoUG9zcy0gbWVhbihQb3NzKSkvc2QoUG9zcykpICU+JQ0KICBtdXRhdGUoU3VjY19wZXJjZW50X0RyaWJibGVzID0gKFN1Y2NfcGVyY2VudF9EcmliYmxlcy0gbWVhbihTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKS9zZChTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKSAlPiUNCiAgbXV0YXRlKEZpbmFsX1RoaXJkX0NhcnJpZXMgPSAoRmluYWxfVGhpcmRfQ2Fycmllcy0gbWVhbihGaW5hbF9UaGlyZF9DYXJyaWVzKSkvc2QoRmluYWxfVGhpcmRfQ2FycmllcykpICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgVmFsZW5jaWEiLCAiUmVhbCBNYWRyaWQiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgVmFsZW5jaWEiLCAiVmFsZW5jaWEiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQoNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1Q0KSAlPiUgDQogIG11dGF0ZShEZGlzPSAoUG9zcyAtIGxhZyhQb3NzKSkgKyAoU3VjY19wZXJjZW50X0RyaWJibGVzIC0gbGFnKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpKyAoRmluYWxfVGhpcmRfQ2Fycmllcy0gbGFnKEZpbmFsX1RoaXJkX0NhcnJpZXMpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KDQpSZXN1bHRhZG9fZmluYWw8LSBwcnVlYmEgJT4lIHNlbGVjdChTcXVhZCwgcHJ1ZWJhKSAlPiUNCiAgbXV0YXRlKEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhID4gMSwgIkVxdWlwbyBsb2NhbCIsIHBydWViYSksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09MSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0oLTEpLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTAsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYTwoLTEpLCAiRXF1aXBvIHZpc2l0YW50ZSIsIEdhbmFkb3IpKQ0KDQpwcnVlYmE8LXBydWViYSAlPiUgc2VsZWN0KFNxdWFkLCBwcnVlYmEpDQprYWJsZShwcnVlYmEpJT4lDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYpICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCwgYm9yZGVyX3JpZ2h0ID0gVCkNCmBgYA0KDQpQZXJvIGVzdG8gcXVlZGEgdW4gcG9jbyByYXJvLi4uIGFkZW3DoXMsIHN1cmdlIGVsIHByb2JsZW1hIGRlIHF1ZSBlbCBtYXJjYWRvciBxdWVkZSBlbiAwLCBvIGVuICsvLSAxLCBsbyBjdWFsIHRhbXBvY28gc2Vyw61hIHVuIHJlc3VsdGFkbyBtdXkgY2xhcm8uLi4NCg0KYGBge3IsIGV2YWw9RkFMU0V9DQpSZXN1bHRhZG9fZmluYWw8LSBwcnVlYmEgJT4lIHNlbGVjdChTcXVhZCwgcHJ1ZWJhKSAlPiUNCiAgbXV0YXRlKEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhID4gMSwgIkVxdWlwbyBsb2NhbCIsIHBydWViYSksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09MSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0oLTEpLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTAsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYTwoLTEpLCAiRXF1aXBvIHZpc2l0YW50ZSIsIEdhbmFkb3IpDQpgYGANCg0KQWhvcmEgeWEgbG8gdGVuZW1vcy4uLiDCv1kgcXXDqSBzaWduaWZpY2EgY2FkYSBjb3NhPw0KRXF1aXBvIGxvY2FsIHkgRXF1aXBvIHZpc2l0YW50ZSBlcyBlbCBnYW5hZG9yOyBlbiBlbCBjYXNvIGRlIE5hZGEgQ29uY2x1eWVudGUsIGVzIHF1ZSBlbCBwYXJ0aWRvIHZhIGEgZXN0YXIgYmFzdGFudGUgaWd1YWxhZG8geSBlbCByZXN1bHRhZG8gc2Vyw6EgbyBlbXBhdGUgbyB1bmEgdmljdG9yaW8gcG9yIHVuIGdvbCBzw7Nsby4NCg0KVmVhbW9zIGVsIHJlc3VsdGFkbyBlbiBlbCBjYXNvIGRlbCBwYXJ0aWRvIFJlYWwgTWFkcmlkLVZhbGVuY2lhOg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmNsYXNpZmljYWNpb248LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAyMiwgIjFzdCIsICJsZWFndWVfdGFibGUiKSAlPiUgDQogIHNlbGVjdChTcXVhZCxSayxQdHMseEcsIHhHQSkgDQoNCmRhdG9zPC0gZ2V0X21hdGNoX3Jlc3VsdHMoIkVTUCIsICJNIiwgMjAyMiwgIjFzdCIpDQoNCiNWYW1vcyBhIHZlciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGdhbmUgZWwgUmVhbCBNYWRyaWQNCg0KdmU8LSBjbGFzaWZpY2FjaW9uICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygiUmVhbCBNYWRyaWQiLCAiVmFsZW5jaWEiKSkgJT4lICNQb25lciBsb3MgZXF1aXBvcyBxdWUgcXVpZXJhcyAoTG9jYWwgeSBWaXNpdGFudGUpDQogIG11dGF0ZShvcmRlbj0gYygyLDEpKSAlPiUgc2xpY2VfbWluKG9yZGVuLCBuPTIpICU+JQ0KICBtdXRhdGUoRHhHPSB4Ry0gbGFnKHhHKSkgJT4lIG11dGF0ZShEUHRzPSBQdHMgLSBsYWcoUHRzKSkgJT4lDQogIG11dGF0ZShEeEdBPSB4R0EgLSBsYWcoeEdBKSkgDQoNCiNJTVBPUlRBTlTDjVNJTU8sIGNhbWJpYXIgbG9zIG7Dum1lcm9zLC0tPiAoMSwyKTogU2kgZXF1aXBvIGxvY2FsIGVzIGFsZmFiw6l0aWNhbWVudGUgc3VwZXJpb3IgYWwgZXF1aXBvIHZpc2l0YW50ZSBlajogUmVhbCBNYWRyaWQ+VmFsZW5jaWE7IGVuIGNhc28gY29udHJhcmlvOiAoMiwxKQ0KDQoNCnBydWViYTwtIHZlICU+JSBtdXRhdGUocHJ1ZWJhID0gMCkgJT4lIA0KICBtdXRhdGUoIHBydWViYT0gaWZlbHNlKERQdHM+MTUsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKERQdHM8KC0xNSksIHBydWViYS0xLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4Rz4wLCBwcnVlYmErMSwgcHJ1ZWJhLTEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4Rz4xMCwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPCgtMTApLCBwcnVlYmEtMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEdBPjAsIHBydWViYSAtMSwgcHJ1ZWJhKzEpKQ0KDQojUG9uZXIgZWwgZXF1aXBvIExvY2FsIChFbiBhbWJvcykgDQojQ3VpZGFkbywgbG9zIGRhdG9zIHNvbiBkZWwgMjAyMS0xMi0zMSwgc2UgZGViZXLDrWEgcG9uZXIgbGEgZmVjaGEgZGUgbGEgw7psdGltYSBqb3JuYWRhDQoNCkxvY2FsdjwtIGRhdG9zICU+JSBmaWx0ZXIoSG9tZSA9PSAiUmVhbCBNYWRyaWQiKSAlPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoIGlmZWxzZShSZXN1bHRhZG8gPD0gLTEsICItMSIsIFJlc3VsdGFkbykpKSAlPiUNCiAgc3VtbWFyaXNlKExvY2Fsdj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIlJlYWwgTWFkcmlkIikNCg0KVmlzaXRhbnRldiA8LSBkYXRvcyAlPiUgZmlsdGVyKEF3YXk9PSJSZWFsIE1hZHJpZCIpJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIi0xIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyhpZmVsc2UoUmVzdWx0YWRvID49IDEsICIxIiwgUmVzdWx0YWRvKSkpICU+JSANCiAgc3VtbWFyaXNlKFZpc2l0YW50ZXY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJSZWFsIE1hZHJpZCIpDQoNCiNQb25lciBlbCBlcXVpcG8gdmlzaXRhbnRlIChFbiBhbWJvcykgDQojQ3VpZGFkbywgbG9zIGRhdG9zIHNvbiBkZWwgMjAyMS0xMi0zMSwgc2UgZGViZXLDrWEgcG9uZXIgbGEgZmVjaGEgZGUgbGEgw7psdGltYSBqb3JuYWRhDQoNCkxvY2FsZTwtIGRhdG9zICU+JSBmaWx0ZXIoSG9tZSA9PSAiVmFsZW5jaWEiKSAlPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoIGlmZWxzZShSZXN1bHRhZG8gPD0gLTEsICItMSIsIFJlc3VsdGFkbykpKSAlPiUNCiAgc3VtbWFyaXNlKExvY2Fsdj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIlZhbGVuY2lhIikNCg0KVmlzaXRhbnRlZSA8LSBkYXRvcyAlPiUgZmlsdGVyKEF3YXk9PSJWYWxlbmNpYSIpJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIi0xIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyhpZmVsc2UoUmVzdWx0YWRvID49IDEsICIxIiwgUmVzdWx0YWRvKSkpICU+JSANCiAgc3VtbWFyaXNlKFZpc2l0YW50ZWU9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJWYWxlbmNpYSIpDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSxMb2NhbHYpIA0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCBWaXNpdGFudGVlKQ0KcHJ1ZWJhPC1wcnVlYmEgJT4lIG11dGF0ZShER2FuPSBMb2NhbHYtbGFnKFZpc2l0YW50ZWUpKSAlPiUNCiAgbXV0YXRlKHBydWViYT0gaWZlbHNlKERHYW4+MCwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICBwcnVlYmE9IGlmZWxzZShER2FuPDAsIHBydWViYS0xLCBwcnVlYmEpKQ0KDQoNCiNBaG9yYSB2YW1vcyBhIGNyZWFyIHVuYSB2YXJpYWJsZSBxdWUgc2VhIGxhIHN1bWEgZGUgdG9kYXMgbGFzIHZhcmlhYmxlcyBkZSBkZWZlbnNhOiBwcmVzacOzbiBjb24gw6l4aXRvLCBibG9xdWVhciB1biBwYXNlLi4uIHBlcm8gY29tbyB0aWVuZW4gZGlzdGludGFzIG1hZ25pdHVkZXMsIHZhbW9zIGEgdGlwaWZpY2FyIGxhIHZhcmlhYmxlIHBhcmEgcG9kZXIgc3VtYXJsYXMNCg0KdmFtb3M8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAgImRlZmVuc2UiKQ0KDQoNCnZhbW9zVDwtIHZhbW9zICU+JSBzZWxlY3QoU3F1YWQsVGtsV19UYWNrbGVzLCBTdWNjX1ByZXNzdXJlcywgQmxvY2tzX0Jsb2NrcykgJT4lIA0KICBtdXRhdGUoVGtsV19UYWNrbGVzID0gKFRrbFdfVGFja2xlcy0gbWVhbihUa2xXX1RhY2tsZXMpKS9zZChUa2xXX1RhY2tsZXMpKSAlPiUNCiAgbXV0YXRlKFN1Y2NfUHJlc3N1cmVzID0gKFN1Y2NfUHJlc3N1cmVzLSBtZWFuKFN1Y2NfUHJlc3N1cmVzKSkvc2QoU3VjY19QcmVzc3VyZXMpKSAlPiUNCiAgbXV0YXRlKEJsb2Nrc19CbG9ja3MgPSAoQmxvY2tzX0Jsb2Nrcy0gbWVhbihCbG9ja3NfQmxvY2tzKSkvc2QoQmxvY2tzX0Jsb2NrcykpICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgVmFsZW5jaWEiLCAiUmVhbCBNYWRyaWQiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgVmFsZW5jaWEiLCAiVmFsZW5jaWEiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUKSAlPiUgDQogIG11dGF0ZShEZGVmPSAoVGtsV19UYWNrbGVzIC0gbGFnKFRrbFdfVGFja2xlcykpICsgKFN1Y2NfUHJlc3N1cmVzIC0gbGFnKFN1Y2NfUHJlc3N1cmVzKSkrIChCbG9ja3NfQmxvY2tzLSBsYWcoQmxvY2tzX0Jsb2NrcykpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRlZiA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojVmFtb3MgYSBoYWNlciBsbyBtaXNtbyBjb24gbG9zIHBhc2VzOg0KDQp2YW1vczI8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAicGFzc2luZyIpDQoNCg0KdmFtb3NUMjwtIHZhbW9zMiAlPiUgc2VsZWN0KFNxdWFkLENtcF9wZXJjZW50X1RvdGFsLEFzdCxBX21pbnVzX3hBLCBGaW5hbF9UaGlyZCwgUHJvZyklPiUgDQogIG11dGF0ZShDbXBfcGVyY2VudF9Ub3RhbCA9IChDbXBfcGVyY2VudF9Ub3RhbC0gbWVhbihDbXBfcGVyY2VudF9Ub3RhbCkpL3NkKENtcF9wZXJjZW50X1RvdGFsKSkgJT4lDQogIG11dGF0ZShBc3QgPSAoQXN0LSBtZWFuKEFzdCkpL3NkKEFzdCkpICU+JQ0KICBtdXRhdGUoQV9taW51c194QSA9IChBX21pbnVzX3hBLSBtZWFuKEFfbWludXNfeEEpKS9zZChBX21pbnVzX3hBKSkgJT4lIA0KICBtdXRhdGUoRmluYWxfVGhpcmQgPSAoRmluYWxfVGhpcmQtIG1lYW4oRmluYWxfVGhpcmQpKS9zZChGaW5hbF9UaGlyZCkpICU+JQ0KICBtdXRhdGUoUHJvZyA9IChQcm9nLSBtZWFuKFByb2cpKS9zZChQcm9nKSkgJT4lDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIFZhbGVuY2lhIiwgIlJlYWwgTWFkcmlkIikpICU+JSAjdnMgZXMgZWwgZXF1aXBvIHZpc2l0YW50ZSB5IGVsIG90cm8gZWwgZXF1aXBvIGxvY2FsDQogIG11dGF0ZShTcXVhZCA9IGlmZWxzZShTcXVhZD09InZzIFZhbGVuY2lhIiwgIlZhbGVuY2lhIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QyKSAlPiUgDQogIG11dGF0ZShEcGFzPSAoQ21wX3BlcmNlbnRfVG90YWwgLSBsYWcoQ21wX3BlcmNlbnRfVG90YWwpKSArIChBc3QgLSBsYWcoQXN0KSkrIChBX21pbnVzX3hBLSBsYWcoQV9taW51c194QSkpKyAoRmluYWxfVGhpcmQgLSBsYWcoRmluYWxfVGhpcmQpKSsgKFByb2ctIGxhZyhQcm9nKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEcGFzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNMbyBtaXNtbyBjb24gbG9zIGRpc3Bhcm9zOg0KDQp2YW1vczM8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAic2hvb3RpbmciKQ0KDQp2YW1vc1QzPC0gdmFtb3MzICU+JSBzZWxlY3QoU3F1YWQsR2xzX1N0YW5kYXJkLCBTb1RfU3RhbmRhcmQsR19wZXJfU2hfU3RhbmRhcmQpICAlPiUgDQogIG11dGF0ZShHbHNfU3RhbmRhcmQgPSAoR2xzX1N0YW5kYXJkLSBtZWFuKEdsc19TdGFuZGFyZCkpL3NkKEdsc19TdGFuZGFyZCkpICU+JQ0KICBtdXRhdGUoU29UX1N0YW5kYXJkID0gKFNvVF9TdGFuZGFyZC0gbWVhbihTb1RfU3RhbmRhcmQpKS9zZChTb1RfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKEdfcGVyX1NoX1N0YW5kYXJkID0gKEdfcGVyX1NoX1N0YW5kYXJkLSBtZWFuKEdfcGVyX1NoX1N0YW5kYXJkKSkvc2QoR19wZXJfU2hfU3RhbmRhcmQpKSAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIFZhbGVuY2lhIiwgIlJlYWwgTWFkcmlkIikpICU+JSAjdnMgZXMgZWwgZXF1aXBvIHZpc2l0YW50ZSB5IGVsIG90cm8gZWwgZXF1aXBvIGxvY2FsDQogIG11dGF0ZShTcXVhZCA9IGlmZWxzZShTcXVhZD09InZzIFZhbGVuY2lhIiwgIlZhbGVuY2lhIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QzKSAlPiUgDQogIG11dGF0ZShEZGlzPSAoR2xzX1N0YW5kYXJkIC0gbGFnKEdsc19TdGFuZGFyZCkpICsgKFNvVF9TdGFuZGFyZCAtIGxhZyhTb1RfU3RhbmRhcmQpKSsgKEdfcGVyX1NoX1N0YW5kYXJkLSBsYWcoR19wZXJfU2hfU3RhbmRhcmQpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xpbXBpbyB1biBwb3F1aXRvIGVsIERGIHBydWViYToNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIG9yZGVuLCBwcnVlYmEpDQoNCg0KI0hhZ28gbG8gbWlzbW8gY29uIGxhIHBvc2VzacOzbjoNCg0KdmFtb3M0PC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gInBvc3Nlc3Npb24iKQ0KDQoNCnZhbW9zVDQ8LSB2YW1vczQgJT4lIHNlbGVjdChTcXVhZCwgUG9zcyxTdWNjX3BlcmNlbnRfRHJpYmJsZXMsIEZpbmFsX1RoaXJkX0NhcnJpZXMpJT4lIA0KICBtdXRhdGUoUG9zcyA9IChQb3NzLSBtZWFuKFBvc3MpKS9zZChQb3NzKSkgJT4lDQogIG11dGF0ZShTdWNjX3BlcmNlbnRfRHJpYmJsZXMgPSAoU3VjY19wZXJjZW50X0RyaWJibGVzLSBtZWFuKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpL3NkKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpICU+JQ0KICBtdXRhdGUoRmluYWxfVGhpcmRfQ2FycmllcyA9IChGaW5hbF9UaGlyZF9DYXJyaWVzLSBtZWFuKEZpbmFsX1RoaXJkX0NhcnJpZXMpKS9zZChGaW5hbF9UaGlyZF9DYXJyaWVzKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBWYWxlbmNpYSIsICJSZWFsIE1hZHJpZCIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBWYWxlbmNpYSIsICJWYWxlbmNpYSIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1Q0KSAlPiUgDQogIG11dGF0ZShEZGlzPSAoUG9zcyAtIGxhZyhQb3NzKSkgKyAoU3VjY19wZXJjZW50X0RyaWJibGVzIC0gbGFnKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpKyAoRmluYWxfVGhpcmRfQ2Fycmllcy0gbGFnKEZpbmFsX1RoaXJkX0NhcnJpZXMpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KDQpSZXN1bHRhZG9fZmluYWw8LSBwcnVlYmEgJT4lIHNlbGVjdChTcXVhZCwgcHJ1ZWJhKSAlPiUNCiAgbXV0YXRlKEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhID4gMSwgIkVxdWlwbyBsb2NhbCIsIHBydWViYSksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09MSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0oLTEpLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTAsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYTwoLTEpLCAiRXF1aXBvIHZpc2l0YW50ZSIsIEdhbmFkb3IpKQ0KDQphPC1SZXN1bHRhZG9fZmluYWwgJT4lIGZpbHRlcighaXMubmEoR2FuYWRvcikpICU+JSBzZWxlY3QocHJ1ZWJhLCBHYW5hZG9yKQ0Ka2FibGUoYSkgJT4lDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYpICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCwgYm9yZGVyX3JpZ2h0ID0gVCkgJT4lDQogIGNvbHVtbl9zcGVjKDIsIGJhY2tncm91bmQgPSAiI0ZDRkU5RCIpDQpgYGANCg0KWSBwYXJlY2UgcXVlIGhlIGFjZXJ0YWRvLi4uIGVsIFJlYWwgTWFkcmlkIGdhbsOzIDQtMSBhbCBWYWxlbmNpYQ0KDQojIyA2LjIgUmVzdG8gZGUgbGEgam9ybmFkYSB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqR3JhbmFkYS1CYXJjZWxvbmEqKjwvRk9OVD4NCg0KYGBge3IsZWNobz1GQUxTRX0NCiNJbnRydWNjaW9uZXM6DQojMS0gSGFjZXIgQ3RybCtmIHkgcmVlbXBsYXphciAoUmVwbGFjZSk6IEdyYW5hZGEgcG9yIGVsIGVxdWlwbyBsb2NhbCB5IEJhcmNlbG9uYSBwb3IgZWwgZXF1aXBvIFZpc2l0YW50ZQ0KIzItIE1vZGlmaWNpYXIgbGEgbMOtbmVhIDI0DQojMy0gUmVlbXBsYXphIDIwMjEtMTItMzEgcG9yIGxhIGZlY2hhIGRlbCBwcmltZXIgcGFydGlkbyBkZSBsYSBqb3JuYWRhIHF1ZSBlc3R1ZGlhbW9zDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh3b3JsZGZvb3RiYWxsUikNCg0KI0p1Z2FuZG8gY29uIEZCUkVGLS0tLS0tDQoNCmNsYXNpZmljYWNpb248LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAyMiwgIjFzdCIsICJsZWFndWVfdGFibGUiKSAlPiUgDQogIHNlbGVjdChTcXVhZCxSayxQdHMseEcsIHhHQSkgDQoNCmRhdG9zPC0gZ2V0X21hdGNoX3Jlc3VsdHMoIkVTUCIsICJNIiwgMjAyMiwgIjFzdCIpDQoNCiNWYW1vcyBhIHZlciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGdhbmUgZWwgR3JhbmFkYQ0KDQp2ZTwtIGNsYXNpZmljYWNpb24gJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJHcmFuYWRhIiwgIkJhcmNlbG9uYSIpKSAlPiUgI1BvbmVyIGxvcyBlcXVpcG9zIHF1ZSBxdWllcmFzIChMb2NhbCB5IFZpc2l0YW50ZSkNCiAgbXV0YXRlKG9yZGVuPSBjKDEsMikpICU+JSBzbGljZV9taW4ob3JkZW4sIG49MikgJT4lDQogIG11dGF0ZShEeEc9IHhHLSBsYWcoeEcpKSAlPiUgbXV0YXRlKERQdHM9IFB0cyAtIGxhZyhQdHMpKSAlPiUNCiAgbXV0YXRlKER4R0E9IHhHQSAtIGxhZyh4R0EpKSANCg0KI0lNUE9SVEFOVMONU0lNTywgY2FtYmlhciBsb3MgbsO6bWVyb3MsLS0+ICgxLDIpOiBTaSBlcXVpcG8gbG9jYWwgZXMgYWxmYWLDqXRpY2FtZW50ZSBzdXBlcmlvciBhbCBlcXVpcG8gdmlzaXRhbnRlIGVqOiBHcmFuYWRhPkJhcmNlbG9uYTsgZW4gY2FzbyBjb250cmFyaW86ICgyLDEpDQoNCg0KcHJ1ZWJhPC0gdmUgJT4lIG11dGF0ZShwcnVlYmEgPSAwKSAlPiUgDQogIG11dGF0ZSggcHJ1ZWJhPSBpZmVsc2UoRFB0cz4xNSwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRFB0czwoLTE1KSwgcHJ1ZWJhLTEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPjAsIHBydWViYSsxLCBwcnVlYmEtMSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPjEwLCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc8KC0xMCksIHBydWViYS0xLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4R0E+MCwgcHJ1ZWJhIC0xLCBwcnVlYmErMSkpDQoNCiNQb25lciBlbCBlcXVpcG8gTG9jYWwgKEVuIGFtYm9zKSANCiNDdWlkYWRvLCBsb3MgZGF0b3Mgc29uIGRlbCAyMDIxLTEyLTMxLCBzZSBkZWJlcsOtYSBwb25lciBsYSBmZWNoYSBkZSBsYSDDumx0aW1hIGpvcm5hZGENCg0KTG9jYWx2PC0gZGF0b3MgJT4lIGZpbHRlcihIb21lID09ICJHcmFuYWRhIikgJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIjEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKCBpZmVsc2UoUmVzdWx0YWRvIDw9IC0xLCAiLTEiLCBSZXN1bHRhZG8pKSkgJT4lDQogIHN1bW1hcmlzZShMb2NhbHY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJHcmFuYWRhIikNCg0KVmlzaXRhbnRldiA8LSBkYXRvcyAlPiUgZmlsdGVyKEF3YXk9PSJHcmFuYWRhIiklPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiLTEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKGlmZWxzZShSZXN1bHRhZG8gPj0gMSwgIjEiLCBSZXN1bHRhZG8pKSkgJT4lIA0KICBzdW1tYXJpc2UoVmlzaXRhbnRldj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIkdyYW5hZGEiKQ0KDQojUG9uZXIgZWwgZXF1aXBvIHZpc2l0YW50ZSAoRW4gYW1ib3MpIA0KI0N1aWRhZG8sIGxvcyBkYXRvcyBzb24gZGVsIDIwMjEtMTItMzEsIHNlIGRlYmVyw61hIHBvbmVyIGxhIGZlY2hhIGRlIGxhIMO6bHRpbWEgam9ybmFkYQ0KDQpMb2NhbGU8LSBkYXRvcyAlPiUgZmlsdGVyKEhvbWUgPT0gIkJhcmNlbG9uYSIpICU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICIxIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyggaWZlbHNlKFJlc3VsdGFkbyA8PSAtMSwgIi0xIiwgUmVzdWx0YWRvKSkpICU+JQ0KICBzdW1tYXJpc2UoTG9jYWx2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiQmFyY2Vsb25hIikNCg0KVmlzaXRhbnRlZSA8LSBkYXRvcyAlPiUgZmlsdGVyKEF3YXk9PSJCYXJjZWxvbmEiKSU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICItMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoaWZlbHNlKFJlc3VsdGFkbyA+PSAxLCAiMSIsIFJlc3VsdGFkbykpKSAlPiUgDQogIHN1bW1hcmlzZShWaXNpdGFudGVlPXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiQmFyY2Vsb25hIikNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLExvY2FsdikgDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIFZpc2l0YW50ZWUpDQpwcnVlYmE8LXBydWViYSAlPiUgbXV0YXRlKERHYW49IExvY2Fsdi1sYWcoVmlzaXRhbnRlZSkpICU+JQ0KICBtdXRhdGUocHJ1ZWJhPSBpZmVsc2UoREdhbj4wLCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgIHBydWViYT0gaWZlbHNlKERHYW48MCwgcHJ1ZWJhLTEsIHBydWViYSkpDQoNCg0KI0Fob3JhIHZhbW9zIGEgY3JlYXIgdW5hIHZhcmlhYmxlIHF1ZSBzZWEgbGEgc3VtYSBkZSB0b2RhcyBsYXMgdmFyaWFibGVzIGRlIGRlZmVuc2E6IHByZXNpw7NuIGNvbiDDqXhpdG8sIGJsb3F1ZWFyIHVuIHBhc2UuLi4gcGVybyBjb21vIHRpZW5lbiBkaXN0aW50YXMgbWFnbml0dWRlcywgdmFtb3MgYSB0aXBpZmljYXIgbGEgdmFyaWFibGUgcGFyYSBwb2RlciBzdW1hcmxhcw0KDQp2YW1vczwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICAiZGVmZW5zZSIpDQoNCnZhbW9zVDwtIHZhbW9zICU+JSBzZWxlY3QoU3F1YWQsVGtsV19UYWNrbGVzLCBTdWNjX1ByZXNzdXJlcywgQmxvY2tzX0Jsb2NrcykgJT4lIA0KICBtdXRhdGUoVGtsV19UYWNrbGVzID0gKFRrbFdfVGFja2xlcy0gbWVhbihUa2xXX1RhY2tsZXMpKS9zZChUa2xXX1RhY2tsZXMpKSAlPiUNCiAgbXV0YXRlKFN1Y2NfUHJlc3N1cmVzID0gKFN1Y2NfUHJlc3N1cmVzLSBtZWFuKFN1Y2NfUHJlc3N1cmVzKSkvc2QoU3VjY19QcmVzc3VyZXMpKSAlPiUNCiAgbXV0YXRlKEJsb2Nrc19CbG9ja3MgPSAoQmxvY2tzX0Jsb2Nrcy0gbWVhbihCbG9ja3NfQmxvY2tzKSkvc2QoQmxvY2tzX0Jsb2NrcykpICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgQmFyY2Vsb25hIiwgIkdyYW5hZGEiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgQmFyY2Vsb25hIiwgIkJhcmNlbG9uYSIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QpICU+JSANCiAgbXV0YXRlKERkZWY9IChUa2xXX1RhY2tsZXMgLSBsYWcoVGtsV19UYWNrbGVzKSkgKyAoU3VjY19QcmVzc3VyZXMgLSBsYWcoU3VjY19QcmVzc3VyZXMpKSsgKEJsb2Nrc19CbG9ja3MtIGxhZyhCbG9ja3NfQmxvY2tzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGVmID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNWYW1vcyBhIGhhY2VyIGxvIG1pc21vIGNvbiBsb3MgcGFzZXM6DQoNCnZhbW9zMjwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJwYXNzaW5nIikNCg0KDQp2YW1vc1QyPC0gdmFtb3MyICU+JSBzZWxlY3QoU3F1YWQsQ21wX3BlcmNlbnRfVG90YWwsQXN0LEFfbWludXNfeEEsIEZpbmFsX1RoaXJkLCBQcm9nKSU+JSANCiAgbXV0YXRlKENtcF9wZXJjZW50X1RvdGFsID0gKENtcF9wZXJjZW50X1RvdGFsLSBtZWFuKENtcF9wZXJjZW50X1RvdGFsKSkvc2QoQ21wX3BlcmNlbnRfVG90YWwpKSAlPiUNCiAgbXV0YXRlKEFzdCA9IChBc3QtIG1lYW4oQXN0KSkvc2QoQXN0KSkgJT4lDQogIG11dGF0ZShBX21pbnVzX3hBID0gKEFfbWludXNfeEEtIG1lYW4oQV9taW51c194QSkpL3NkKEFfbWludXNfeEEpKSAlPiUgDQogIG11dGF0ZShGaW5hbF9UaGlyZCA9IChGaW5hbF9UaGlyZC0gbWVhbihGaW5hbF9UaGlyZCkpL3NkKEZpbmFsX1RoaXJkKSkgJT4lDQogIG11dGF0ZShQcm9nID0gKFByb2ctIG1lYW4oUHJvZykpL3NkKFByb2cpKSAlPiUNCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgQmFyY2Vsb25hIiwgIkdyYW5hZGEiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgQmFyY2Vsb25hIiwgIkJhcmNlbG9uYSIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUMikgJT4lIA0KICBtdXRhdGUoRHBhcz0gKENtcF9wZXJjZW50X1RvdGFsIC0gbGFnKENtcF9wZXJjZW50X1RvdGFsKSkgKyAoQXN0IC0gbGFnKEFzdCkpKyAoQV9taW51c194QS0gbGFnKEFfbWludXNfeEEpKSsgKEZpbmFsX1RoaXJkIC0gbGFnKEZpbmFsX1RoaXJkKSkrIChQcm9nLSBsYWcoUHJvZykpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRHBhcyA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojTG8gbWlzbW8gY29uIGxvcyBkaXNwYXJvczoNCg0KdmFtb3MzPC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gInNob290aW5nIikNCg0KDQp2YW1vc1QzPC0gdmFtb3MzICU+JSBzZWxlY3QoU3F1YWQsR2xzX1N0YW5kYXJkLCBTb1RfU3RhbmRhcmQsR19wZXJfU2hfU3RhbmRhcmQpICAlPiUgDQogIG11dGF0ZShHbHNfU3RhbmRhcmQgPSAoR2xzX1N0YW5kYXJkLSBtZWFuKEdsc19TdGFuZGFyZCkpL3NkKEdsc19TdGFuZGFyZCkpICU+JQ0KICBtdXRhdGUoU29UX1N0YW5kYXJkID0gKFNvVF9TdGFuZGFyZC0gbWVhbihTb1RfU3RhbmRhcmQpKS9zZChTb1RfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKEdfcGVyX1NoX1N0YW5kYXJkID0gKEdfcGVyX1NoX1N0YW5kYXJkLSBtZWFuKEdfcGVyX1NoX1N0YW5kYXJkKSkvc2QoR19wZXJfU2hfU3RhbmRhcmQpKSAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIEJhcmNlbG9uYSIsICJHcmFuYWRhIikpICU+JSAjdnMgZXMgZWwgZXF1aXBvIHZpc2l0YW50ZSB5IGVsIG90cm8gZWwgZXF1aXBvIGxvY2FsDQogIG11dGF0ZShTcXVhZCA9IGlmZWxzZShTcXVhZD09InZzIEJhcmNlbG9uYSIsICJCYXJjZWxvbmEiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDMpICU+JSANCiAgbXV0YXRlKERkaXM9IChHbHNfU3RhbmRhcmQgLSBsYWcoR2xzX1N0YW5kYXJkKSkgKyAoU29UX1N0YW5kYXJkIC0gbGFnKFNvVF9TdGFuZGFyZCkpKyAoR19wZXJfU2hfU3RhbmRhcmQtIGxhZyhHX3Blcl9TaF9TdGFuZGFyZCkpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRpcyA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojTGltcGlvIHVuIHBvcXVpdG8gZWwgREYgcHJ1ZWJhOg0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIHNlbGVjdChTcXVhZCwgb3JkZW4sIHBydWViYSkNCg0KDQojSGFnbyBsbyBtaXNtbyBjb24gbGEgcG9zZXNpw7NuOg0KDQp2YW1vczQ8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAicG9zc2Vzc2lvbiIpDQoNCnZhbW9zVDQ8LSB2YW1vczQgJT4lIHNlbGVjdChTcXVhZCwgUG9zcyxTdWNjX3BlcmNlbnRfRHJpYmJsZXMsIEZpbmFsX1RoaXJkX0NhcnJpZXMpJT4lIA0KICBtdXRhdGUoUG9zcyA9IChQb3NzLSBtZWFuKFBvc3MpKS9zZChQb3NzKSkgJT4lDQogIG11dGF0ZShTdWNjX3BlcmNlbnRfRHJpYmJsZXMgPSAoU3VjY19wZXJjZW50X0RyaWJibGVzLSBtZWFuKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpL3NkKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpICU+JQ0KICBtdXRhdGUoRmluYWxfVGhpcmRfQ2FycmllcyA9IChGaW5hbF9UaGlyZF9DYXJyaWVzLSBtZWFuKEZpbmFsX1RoaXJkX0NhcnJpZXMpKS9zZChGaW5hbF9UaGlyZF9DYXJyaWVzKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBCYXJjZWxvbmEiLCAiR3JhbmFkYSIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBCYXJjZWxvbmEiLCAiQmFyY2Vsb25hIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDQpICU+JSANCiAgbXV0YXRlKERkaXM9IChQb3NzIC0gbGFnKFBvc3MpKSArIChTdWNjX3BlcmNlbnRfRHJpYmJsZXMgLSBsYWcoU3VjY19wZXJjZW50X0RyaWJibGVzKSkrIChGaW5hbF9UaGlyZF9DYXJyaWVzLSBsYWcoRmluYWxfVGhpcmRfQ2FycmllcykpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRpcyA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQpSZXN1bHRhZG9fZmluYWw8LSBwcnVlYmEgJT4lIHNlbGVjdChTcXVhZCwgcHJ1ZWJhKSAlPiUNCiAgbXV0YXRlKEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhID4gMSwgIkVxdWlwbyBsb2NhbCIsIHBydWViYSksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09MSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0oLTEpLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTAsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYTwoLTEpLCAiRXF1aXBvIHZpc2l0YW50ZSIsIEdhbmFkb3IpKQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KYTwtUmVzdWx0YWRvX2ZpbmFsICU+JSBmaWx0ZXIoIWlzLm5hKEdhbmFkb3IpKSAlPiUgc2VsZWN0KHBydWViYSwgR2FuYWRvcikNCg0Ka2FibGUoYSkgJT4lDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYpICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCwgYm9yZGVyX3JpZ2h0ID0gVCkgJT4lDQogIGNvbHVtbl9zcGVjKDIsIGJhY2tncm91bmQgPSAiI0ZDRkU5RCIpDQpgYGANCg0KSGVtb3MgYWNlcnRhZG8hIFkgZXN0ZSBlcmEgZGlmw61jaWwuLi4gDQpOYWRhIGNvbmNsdXllbnRlPSBFbXBhdGUgbyBkaWZlcmVuY2lhIGRlIHVuIGdvbC4NCg0KIyMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqTGV2YW50ZS1NYWxsb3JjYSoqPC9GT05UPg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KI0ludHJ1Y2Npb25lczoNCiMxLSBIYWNlciBDdHJsK2YgeSByZWVtcGxhemFyIChSZXBsYWNlKTogTGV2YW50ZSBwb3IgZWwgZXF1aXBvIGxvY2FsIHkgTWFsbG9yY2EgcG9yIGVsIGVxdWlwbyBWaXNpdGFudGUNCiMyLSBNb2RpZmljaWFyIGxhIGzDrW5lYSAyNA0KIzMtIFJlZW1wbGF6YSAyMDIxLTEyLTMxIHBvciBsYSBmZWNoYSBkZWwgcHJpbWVyIHBhcnRpZG8gZGUgbGEgam9ybmFkYSBxdWUgZXN0dWRpYW1vcw0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkod29ybGRmb290YmFsbFIpDQoNCiNKdWdhbmRvIGNvbiBGQlJFRi0tLS0tLQ0KDQpjbGFzaWZpY2FjaW9uPC0gZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKCJFU1AiLCAiTSIsIDIwMjIsICIxc3QiLCAibGVhZ3VlX3RhYmxlIikgJT4lIA0KICBzZWxlY3QoU3F1YWQsUmssUHRzLHhHLCB4R0EpIA0KDQpkYXRvczwtIGdldF9tYXRjaF9yZXN1bHRzKCJFU1AiLCAiTSIsIDIwMjIsICIxc3QiKQ0KDQojVmFtb3MgYSB2ZXIgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBnYW5lIGVsIExldmFudGUNCg0KdmU8LSBjbGFzaWZpY2FjaW9uICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygiTGV2YW50ZSIsICJNYWxsb3JjYSIpKSAlPiUgI1BvbmVyIGxvcyBlcXVpcG9zIHF1ZSBxdWllcmFzIChMb2NhbCB5IFZpc2l0YW50ZSkNCiAgbXV0YXRlKG9yZGVuPSBjKDIsMSkpICU+JSBzbGljZV9taW4ob3JkZW4sIG49MikgJT4lDQogIG11dGF0ZShEeEc9IHhHLSBsYWcoeEcpKSAlPiUgbXV0YXRlKERQdHM9IFB0cyAtIGxhZyhQdHMpKSAlPiUNCiAgbXV0YXRlKER4R0E9IHhHQSAtIGxhZyh4R0EpKSANCg0KI0lNUE9SVEFOVMONU0lNTywgY2FtYmlhciBsb3MgbsO6bWVyb3MsLS0+ICgxLDIpOiBTaSBlcXVpcG8gbG9jYWwgZXMgYWxmYWLDqXRpY2FtZW50ZSBzdXBlcmlvciBhbCBlcXVpcG8gdmlzaXRhbnRlIGVqOiBMZXZhbnRlPk1hbGxvcmNhOyBlbiBjYXNvIGNvbnRyYXJpbzogKDIsMSkNCg0KDQpwcnVlYmE8LSB2ZSAlPiUgbXV0YXRlKHBydWViYSA9IDApICU+JSANCiAgbXV0YXRlKCBwcnVlYmE9IGlmZWxzZShEUHRzPjE1LCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEUHRzPCgtMTUpLCBwcnVlYmEtMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc+MCwgcHJ1ZWJhKzEsIHBydWViYS0xKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc+MTAsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4RzwoLTEwKSwgcHJ1ZWJhLTEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHQT4wLCBwcnVlYmEgLTEsIHBydWViYSsxKSkNCg0KI1BvbmVyIGVsIGVxdWlwbyBMb2NhbCAoRW4gYW1ib3MpIA0KI0N1aWRhZG8sIGxvcyBkYXRvcyBzb24gZGVsIDIwMjEtMTItMzEsIHNlIGRlYmVyw61hIHBvbmVyIGxhIGZlY2hhIGRlIGxhIMO6bHRpbWEgam9ybmFkYQ0KDQpMb2NhbHY8LSBkYXRvcyAlPiUgZmlsdGVyKEhvbWUgPT0gIkxldmFudGUiKSAlPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoIGlmZWxzZShSZXN1bHRhZG8gPD0gLTEsICItMSIsIFJlc3VsdGFkbykpKSAlPiUNCiAgc3VtbWFyaXNlKExvY2Fsdj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIkxldmFudGUiKQ0KDQpWaXNpdGFudGV2IDwtIGRhdG9zICU+JSBmaWx0ZXIoQXdheT09IkxldmFudGUiKSU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICItMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoaWZlbHNlKFJlc3VsdGFkbyA+PSAxLCAiMSIsIFJlc3VsdGFkbykpKSAlPiUgDQogIHN1bW1hcmlzZShWaXNpdGFudGV2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiTGV2YW50ZSIpDQoNCiNQb25lciBlbCBlcXVpcG8gdmlzaXRhbnRlIChFbiBhbWJvcykgDQojQ3VpZGFkbywgbG9zIGRhdG9zIHNvbiBkZWwgMjAyMS0xMi0zMSwgc2UgZGViZXLDrWEgcG9uZXIgbGEgZmVjaGEgZGUgbGEgw7psdGltYSBqb3JuYWRhDQoNCkxvY2FsZTwtIGRhdG9zICU+JSBmaWx0ZXIoSG9tZSA9PSAiTWFsbG9yY2EiKSAlPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoIGlmZWxzZShSZXN1bHRhZG8gPD0gLTEsICItMSIsIFJlc3VsdGFkbykpKSAlPiUNCiAgc3VtbWFyaXNlKExvY2Fsdj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIk1hbGxvcmNhIikNCg0KVmlzaXRhbnRlZSA8LSBkYXRvcyAlPiUgZmlsdGVyKEF3YXk9PSJNYWxsb3JjYSIpJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIi0xIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyhpZmVsc2UoUmVzdWx0YWRvID49IDEsICIxIiwgUmVzdWx0YWRvKSkpICU+JSANCiAgc3VtbWFyaXNlKFZpc2l0YW50ZWU9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJNYWxsb3JjYSIpDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSxMb2NhbHYpIA0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCBWaXNpdGFudGVlKQ0KcHJ1ZWJhPC1wcnVlYmEgJT4lIG11dGF0ZShER2FuPSBMb2NhbHYtbGFnKFZpc2l0YW50ZWUpKSAlPiUNCiAgbXV0YXRlKHBydWViYT0gaWZlbHNlKERHYW4+MCwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICBwcnVlYmE9IGlmZWxzZShER2FuPDAsIHBydWViYS0xLCBwcnVlYmEpKQ0KDQoNCiNBaG9yYSB2YW1vcyBhIGNyZWFyIHVuYSB2YXJpYWJsZSBxdWUgc2VhIGxhIHN1bWEgZGUgdG9kYXMgbGFzIHZhcmlhYmxlcyBkZSBkZWZlbnNhOiBwcmVzacOzbiBjb24gw6l4aXRvLCBibG9xdWVhciB1biBwYXNlLi4uIHBlcm8gY29tbyB0aWVuZW4gZGlzdGludGFzIG1hZ25pdHVkZXMsIHZhbW9zIGEgdGlwaWZpY2FyIGxhIHZhcmlhYmxlIHBhcmEgcG9kZXIgc3VtYXJsYXMNCg0KdmFtb3M8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAgImRlZmVuc2UiKQ0KDQoNCnZhbW9zVDwtIHZhbW9zICU+JSBzZWxlY3QoU3F1YWQsVGtsV19UYWNrbGVzLCBTdWNjX1ByZXNzdXJlcywgQmxvY2tzX0Jsb2NrcykgJT4lIA0KICBtdXRhdGUoVGtsV19UYWNrbGVzID0gKFRrbFdfVGFja2xlcy0gbWVhbihUa2xXX1RhY2tsZXMpKS9zZChUa2xXX1RhY2tsZXMpKSAlPiUNCiAgbXV0YXRlKFN1Y2NfUHJlc3N1cmVzID0gKFN1Y2NfUHJlc3N1cmVzLSBtZWFuKFN1Y2NfUHJlc3N1cmVzKSkvc2QoU3VjY19QcmVzc3VyZXMpKSAlPiUNCiAgbXV0YXRlKEJsb2Nrc19CbG9ja3MgPSAoQmxvY2tzX0Jsb2Nrcy0gbWVhbihCbG9ja3NfQmxvY2tzKSkvc2QoQmxvY2tzX0Jsb2NrcykpICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgTWFsbG9yY2EiLCAiTGV2YW50ZSIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBNYWxsb3JjYSIsICJNYWxsb3JjYSIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QpICU+JSANCiAgbXV0YXRlKERkZWY9IChUa2xXX1RhY2tsZXMgLSBsYWcoVGtsV19UYWNrbGVzKSkgKyAoU3VjY19QcmVzc3VyZXMgLSBsYWcoU3VjY19QcmVzc3VyZXMpKSsgKEJsb2Nrc19CbG9ja3MtIGxhZyhCbG9ja3NfQmxvY2tzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGVmID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNWYW1vcyBhIGhhY2VyIGxvIG1pc21vIGNvbiBsb3MgcGFzZXM6DQoNCnZhbW9zMjwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJwYXNzaW5nIikNCg0KDQp2YW1vc1QyPC0gdmFtb3MyICU+JSBzZWxlY3QoU3F1YWQsQ21wX3BlcmNlbnRfVG90YWwsQXN0LEFfbWludXNfeEEsIEZpbmFsX1RoaXJkLCBQcm9nKSU+JSANCiAgbXV0YXRlKENtcF9wZXJjZW50X1RvdGFsID0gKENtcF9wZXJjZW50X1RvdGFsLSBtZWFuKENtcF9wZXJjZW50X1RvdGFsKSkvc2QoQ21wX3BlcmNlbnRfVG90YWwpKSAlPiUNCiAgbXV0YXRlKEFzdCA9IChBc3QtIG1lYW4oQXN0KSkvc2QoQXN0KSkgJT4lDQogIG11dGF0ZShBX21pbnVzX3hBID0gKEFfbWludXNfeEEtIG1lYW4oQV9taW51c194QSkpL3NkKEFfbWludXNfeEEpKSAlPiUgDQogIG11dGF0ZShGaW5hbF9UaGlyZCA9IChGaW5hbF9UaGlyZC0gbWVhbihGaW5hbF9UaGlyZCkpL3NkKEZpbmFsX1RoaXJkKSkgJT4lDQogIG11dGF0ZShQcm9nID0gKFByb2ctIG1lYW4oUHJvZykpL3NkKFByb2cpKSAlPiUNCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgTWFsbG9yY2EiLCAiTGV2YW50ZSIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBNYWxsb3JjYSIsICJNYWxsb3JjYSIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUMikgJT4lIA0KICBtdXRhdGUoRHBhcz0gKENtcF9wZXJjZW50X1RvdGFsIC0gbGFnKENtcF9wZXJjZW50X1RvdGFsKSkgKyAoQXN0IC0gbGFnKEFzdCkpKyAoQV9taW51c194QS0gbGFnKEFfbWludXNfeEEpKSsgKEZpbmFsX1RoaXJkIC0gbGFnKEZpbmFsX1RoaXJkKSkrIChQcm9nLSBsYWcoUHJvZykpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRHBhcyA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojTG8gbWlzbW8gY29uIGxvcyBkaXNwYXJvczoNCg0KdmFtb3MzPC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gInNob290aW5nIikNCg0KDQp2YW1vc1QzPC0gdmFtb3MzICU+JSBzZWxlY3QoU3F1YWQsR2xzX1N0YW5kYXJkLCBTb1RfU3RhbmRhcmQsR19wZXJfU2hfU3RhbmRhcmQpICAlPiUgDQogIG11dGF0ZShHbHNfU3RhbmRhcmQgPSAoR2xzX1N0YW5kYXJkLSBtZWFuKEdsc19TdGFuZGFyZCkpL3NkKEdsc19TdGFuZGFyZCkpICU+JQ0KICBtdXRhdGUoU29UX1N0YW5kYXJkID0gKFNvVF9TdGFuZGFyZC0gbWVhbihTb1RfU3RhbmRhcmQpKS9zZChTb1RfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKEdfcGVyX1NoX1N0YW5kYXJkID0gKEdfcGVyX1NoX1N0YW5kYXJkLSBtZWFuKEdfcGVyX1NoX1N0YW5kYXJkKSkvc2QoR19wZXJfU2hfU3RhbmRhcmQpKSAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIE1hbGxvcmNhIiwgIkxldmFudGUiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgTWFsbG9yY2EiLCAiTWFsbG9yY2EiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDMpICU+JSANCiAgbXV0YXRlKERkaXM9IChHbHNfU3RhbmRhcmQgLSBsYWcoR2xzX1N0YW5kYXJkKSkgKyAoU29UX1N0YW5kYXJkIC0gbGFnKFNvVF9TdGFuZGFyZCkpKyAoR19wZXJfU2hfU3RhbmRhcmQtIGxhZyhHX3Blcl9TaF9TdGFuZGFyZCkpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRpcyA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojTGltcGlvIHVuIHBvcXVpdG8gZWwgREYgcHJ1ZWJhOg0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIHNlbGVjdChTcXVhZCwgb3JkZW4sIHBydWViYSkNCg0KDQojSGFnbyBsbyBtaXNtbyBjb24gbGEgcG9zZXNpw7NuOg0KDQp2YW1vczQ8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAicG9zc2Vzc2lvbiIpDQoNCg0KdmFtb3NUNDwtIHZhbW9zNCAlPiUgc2VsZWN0KFNxdWFkLCBQb3NzLFN1Y2NfcGVyY2VudF9EcmliYmxlcywgRmluYWxfVGhpcmRfQ2FycmllcyklPiUgDQogIG11dGF0ZShQb3NzID0gKFBvc3MtIG1lYW4oUG9zcykpL3NkKFBvc3MpKSAlPiUNCiAgbXV0YXRlKFN1Y2NfcGVyY2VudF9EcmliYmxlcyA9IChTdWNjX3BlcmNlbnRfRHJpYmJsZXMtIG1lYW4oU3VjY19wZXJjZW50X0RyaWJibGVzKSkvc2QoU3VjY19wZXJjZW50X0RyaWJibGVzKSkgJT4lDQogIG11dGF0ZShGaW5hbF9UaGlyZF9DYXJyaWVzID0gKEZpbmFsX1RoaXJkX0NhcnJpZXMtIG1lYW4oRmluYWxfVGhpcmRfQ2FycmllcykpL3NkKEZpbmFsX1RoaXJkX0NhcnJpZXMpKSAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIE1hbGxvcmNhIiwgIkxldmFudGUiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgTWFsbG9yY2EiLCAiTWFsbG9yY2EiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQoNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1Q0KSAlPiUgDQogIG11dGF0ZShEZGlzPSAoUG9zcyAtIGxhZyhQb3NzKSkgKyAoU3VjY19wZXJjZW50X0RyaWJibGVzIC0gbGFnKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpKyAoRmluYWxfVGhpcmRfQ2Fycmllcy0gbGFnKEZpbmFsX1RoaXJkX0NhcnJpZXMpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KDQpSZXN1bHRhZG9fZmluYWw8LSBwcnVlYmEgJT4lIHNlbGVjdChTcXVhZCwgcHJ1ZWJhKSAlPiUNCiAgbXV0YXRlKEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhID4gMSwgIkVxdWlwbyBsb2NhbCIsIHBydWViYSksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09MSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0oLTEpLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTAsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYTwoLTEpLCAiRXF1aXBvIHZpc2l0YW50ZSIsIEdhbmFkb3IpKQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KYTwtUmVzdWx0YWRvX2ZpbmFsICU+JSBmaWx0ZXIoIWlzLm5hKEdhbmFkb3IpKSAlPiUgc2VsZWN0KHBydWViYSwgR2FuYWRvcikNCg0Ka2FibGUoYSkgJT4lDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYpICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCwgYm9yZGVyX3JpZ2h0ID0gVCkgJT4lDQogIGNvbHVtbl9zcGVjKDIsIGJhY2tncm91bmQgPSAiI0ZDRkU5RCIpDQoNCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9ImQzYTQ2YSI+KipSZWFsIFNvY2llZGFkLUNlbHRhIGRlIFZpZ28qKjwvRk9OVD4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQojSW50cnVjY2lvbmVzOg0KIzEtIEhhY2VyIEN0cmwrZiB5IHJlZW1wbGF6YXIgKFJlcGxhY2UpOiBSZWFsIFNvY2llZGFkIHBvciBlbCBlcXVpcG8gbG9jYWwgeSBDZWx0YSBWaWdvIHBvciBlbCBlcXVpcG8gVmlzaXRhbnRlDQojMi0gTW9kaWZpY2lhciBsYSBsw61uZWEgMjQNCiMzLSBSZWVtcGxhemEgMjAyMS0xMi0zMSBwb3IgbGEgZmVjaGEgZGVsIHByaW1lciBwYXJ0aWRvIGRlIGxhIGpvcm5hZGEgcXVlIGVzdHVkaWFtb3MNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHdvcmxkZm9vdGJhbGxSKQ0KDQojSnVnYW5kbyBjb24gRkJSRUYtLS0tLS0NCg0KY2xhc2lmaWNhY2lvbjwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSANCiAgc2VsZWN0KFNxdWFkLFJrLFB0cyx4RywgeEdBKSANCg0KZGF0b3M8LSBnZXRfbWF0Y2hfcmVzdWx0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IikNCg0KI1ZhbW9zIGEgdmVyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgZ2FuZSBlbCBSZWFsIFNvY2llZGFkDQoNCnZlPC0gY2xhc2lmaWNhY2lvbiAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoIlJlYWwgU29jaWVkYWQiLCAiQ2VsdGEgVmlnbyIpKSAlPiUgI1BvbmVyIGxvcyBlcXVpcG9zIHF1ZSBxdWllcmFzIChMb2NhbCB5IFZpc2l0YW50ZSkNCiAgbXV0YXRlKG9yZGVuPSBjKDEsMikpICU+JSBzbGljZV9taW4ob3JkZW4sIG49MikgJT4lDQogIG11dGF0ZShEeEc9IHhHLSBsYWcoeEcpKSAlPiUgbXV0YXRlKERQdHM9IFB0cyAtIGxhZyhQdHMpKSAlPiUNCiAgbXV0YXRlKER4R0E9IHhHQSAtIGxhZyh4R0EpKSANCg0KI0lNUE9SVEFOVMONU0lNTywgY2FtYmlhciBsb3MgbsO6bWVyb3MsLS0+ICgxLDIpOiBTaSBlcXVpcG8gbG9jYWwgZXMgYWxmYWLDqXRpY2FtZW50ZSBzdXBlcmlvciBhbCBlcXVpcG8gdmlzaXRhbnRlIGVqOiBSZWFsIFNvY2llZGFkPkNlbHRhIFZpZ287IGVuIGNhc28gY29udHJhcmlvOiAoMiwxKQ0KDQoNCnBydWViYTwtIHZlICU+JSBtdXRhdGUocHJ1ZWJhID0gMCkgJT4lIA0KICBtdXRhdGUoIHBydWViYT0gaWZlbHNlKERQdHM+MTUsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKERQdHM8KC0xNSksIHBydWViYS0xLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4Rz4wLCBwcnVlYmErMSwgcHJ1ZWJhLTEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4Rz4xMCwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPCgtMTApLCBwcnVlYmEtMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEdBPjAsIHBydWViYSAtMSwgcHJ1ZWJhKzEpKQ0KDQojUG9uZXIgZWwgZXF1aXBvIExvY2FsIChFbiBhbWJvcykgDQojQ3VpZGFkbywgbG9zIGRhdG9zIHNvbiBkZWwgMjAyMS0xMi0zMSwgc2UgZGViZXLDrWEgcG9uZXIgbGEgZmVjaGEgZGUgbGEgw7psdGltYSBqb3JuYWRhDQoNCkxvY2FsdjwtIGRhdG9zICU+JSBmaWx0ZXIoSG9tZSA9PSAiUmVhbCBTb2NpZWRhZCIpICU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICIxIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyggaWZlbHNlKFJlc3VsdGFkbyA8PSAtMSwgIi0xIiwgUmVzdWx0YWRvKSkpICU+JQ0KICBzdW1tYXJpc2UoTG9jYWx2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiUmVhbCBTb2NpZWRhZCIpDQoNClZpc2l0YW50ZXYgPC0gZGF0b3MgJT4lIGZpbHRlcihBd2F5PT0iUmVhbCBTb2NpZWRhZCIpJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIi0xIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyhpZmVsc2UoUmVzdWx0YWRvID49IDEsICIxIiwgUmVzdWx0YWRvKSkpICU+JSANCiAgc3VtbWFyaXNlKFZpc2l0YW50ZXY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJSZWFsIFNvY2llZGFkIikNCg0KI1BvbmVyIGVsIGVxdWlwbyB2aXNpdGFudGUgKEVuIGFtYm9zKSANCiNDdWlkYWRvLCBsb3MgZGF0b3Mgc29uIGRlbCAyMDIxLTEyLTMxLCBzZSBkZWJlcsOtYSBwb25lciBsYSBmZWNoYSBkZSBsYSDDumx0aW1hIGpvcm5hZGENCg0KTG9jYWxlPC0gZGF0b3MgJT4lIGZpbHRlcihIb21lID09ICJDZWx0YSBWaWdvIikgJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIjEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKCBpZmVsc2UoUmVzdWx0YWRvIDw9IC0xLCAiLTEiLCBSZXN1bHRhZG8pKSkgJT4lDQogIHN1bW1hcmlzZShMb2NhbHY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJDZWx0YSBWaWdvIikNCg0KVmlzaXRhbnRlZSA8LSBkYXRvcyAlPiUgZmlsdGVyKEF3YXk9PSJDZWx0YSBWaWdvIiklPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiLTEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKGlmZWxzZShSZXN1bHRhZG8gPj0gMSwgIjEiLCBSZXN1bHRhZG8pKSkgJT4lIA0KICBzdW1tYXJpc2UoVmlzaXRhbnRlZT1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIkNlbHRhIFZpZ28iKQ0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsTG9jYWx2KSANCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgVmlzaXRhbnRlZSkNCnBydWViYTwtcHJ1ZWJhICU+JSBtdXRhdGUoREdhbj0gTG9jYWx2LWxhZyhWaXNpdGFudGVlKSkgJT4lDQogIG11dGF0ZShwcnVlYmE9IGlmZWxzZShER2FuPjAsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoREdhbjwwLCBwcnVlYmEtMSwgcHJ1ZWJhKSkNCg0KDQojQWhvcmEgdmFtb3MgYSBjcmVhciB1bmEgdmFyaWFibGUgcXVlIHNlYSBsYSBzdW1hIGRlIHRvZGFzIGxhcyB2YXJpYWJsZXMgZGUgZGVmZW5zYTogcHJlc2nDs24gY29uIMOpeGl0bywgYmxvcXVlYXIgdW4gcGFzZS4uLiBwZXJvIGNvbW8gdGllbmVuIGRpc3RpbnRhcyBtYWduaXR1ZGVzLCB2YW1vcyBhIHRpcGlmaWNhciBsYSB2YXJpYWJsZSBwYXJhIHBvZGVyIHN1bWFybGFzDQoNCnZhbW9zPC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gICJkZWZlbnNlIikNCg0KDQp2YW1vc1Q8LSB2YW1vcyAlPiUgc2VsZWN0KFNxdWFkLFRrbFdfVGFja2xlcywgU3VjY19QcmVzc3VyZXMsIEJsb2Nrc19CbG9ja3MpICU+JSANCiAgbXV0YXRlKFRrbFdfVGFja2xlcyA9IChUa2xXX1RhY2tsZXMtIG1lYW4oVGtsV19UYWNrbGVzKSkvc2QoVGtsV19UYWNrbGVzKSkgJT4lDQogIG11dGF0ZShTdWNjX1ByZXNzdXJlcyA9IChTdWNjX1ByZXNzdXJlcy0gbWVhbihTdWNjX1ByZXNzdXJlcykpL3NkKFN1Y2NfUHJlc3N1cmVzKSkgJT4lDQogIG11dGF0ZShCbG9ja3NfQmxvY2tzID0gKEJsb2Nrc19CbG9ja3MtIG1lYW4oQmxvY2tzX0Jsb2NrcykpL3NkKEJsb2Nrc19CbG9ja3MpKSAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIENlbHRhIFZpZ28iLCAiUmVhbCBTb2NpZWRhZCIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBDZWx0YSBWaWdvIiwgIkNlbHRhIFZpZ28iLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUKSAlPiUgDQogIG11dGF0ZShEZGVmPSAoVGtsV19UYWNrbGVzIC0gbGFnKFRrbFdfVGFja2xlcykpICsgKFN1Y2NfUHJlc3N1cmVzIC0gbGFnKFN1Y2NfUHJlc3N1cmVzKSkrIChCbG9ja3NfQmxvY2tzLSBsYWcoQmxvY2tzX0Jsb2NrcykpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRlZiA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojVmFtb3MgYSBoYWNlciBsbyBtaXNtbyBjb24gbG9zIHBhc2VzOg0KDQp2YW1vczI8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAicGFzc2luZyIpDQoNCg0KdmFtb3NUMjwtIHZhbW9zMiAlPiUgc2VsZWN0KFNxdWFkLENtcF9wZXJjZW50X1RvdGFsLEFzdCxBX21pbnVzX3hBLCBGaW5hbF9UaGlyZCwgUHJvZyklPiUgDQogIG11dGF0ZShDbXBfcGVyY2VudF9Ub3RhbCA9IChDbXBfcGVyY2VudF9Ub3RhbC0gbWVhbihDbXBfcGVyY2VudF9Ub3RhbCkpL3NkKENtcF9wZXJjZW50X1RvdGFsKSkgJT4lDQogIG11dGF0ZShBc3QgPSAoQXN0LSBtZWFuKEFzdCkpL3NkKEFzdCkpICU+JQ0KICBtdXRhdGUoQV9taW51c194QSA9IChBX21pbnVzX3hBLSBtZWFuKEFfbWludXNfeEEpKS9zZChBX21pbnVzX3hBKSkgJT4lIA0KICBtdXRhdGUoRmluYWxfVGhpcmQgPSAoRmluYWxfVGhpcmQtIG1lYW4oRmluYWxfVGhpcmQpKS9zZChGaW5hbF9UaGlyZCkpICU+JQ0KICBtdXRhdGUoUHJvZyA9IChQcm9nLSBtZWFuKFByb2cpKS9zZChQcm9nKSkgJT4lDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIENlbHRhIFZpZ28iLCAiUmVhbCBTb2NpZWRhZCIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBDZWx0YSBWaWdvIiwgIkNlbHRhIFZpZ28iLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDIpICU+JSANCiAgbXV0YXRlKERwYXM9IChDbXBfcGVyY2VudF9Ub3RhbCAtIGxhZyhDbXBfcGVyY2VudF9Ub3RhbCkpICsgKEFzdCAtIGxhZyhBc3QpKSsgKEFfbWludXNfeEEtIGxhZyhBX21pbnVzX3hBKSkrIChGaW5hbF9UaGlyZCAtIGxhZyhGaW5hbF9UaGlyZCkpKyAoUHJvZy0gbGFnKFByb2cpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERwYXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xvIG1pc21vIGNvbiBsb3MgZGlzcGFyb3M6DQoNCnZhbW9zMzwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJzaG9vdGluZyIpDQoNCg0KdmFtb3NUMzwtIHZhbW9zMyAlPiUgc2VsZWN0KFNxdWFkLEdsc19TdGFuZGFyZCwgU29UX1N0YW5kYXJkLEdfcGVyX1NoX1N0YW5kYXJkKSAgJT4lIA0KICBtdXRhdGUoR2xzX1N0YW5kYXJkID0gKEdsc19TdGFuZGFyZC0gbWVhbihHbHNfU3RhbmRhcmQpKS9zZChHbHNfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKFNvVF9TdGFuZGFyZCA9IChTb1RfU3RhbmRhcmQtIG1lYW4oU29UX1N0YW5kYXJkKSkvc2QoU29UX1N0YW5kYXJkKSkgJT4lDQogIG11dGF0ZShHX3Blcl9TaF9TdGFuZGFyZCA9IChHX3Blcl9TaF9TdGFuZGFyZC0gbWVhbihHX3Blcl9TaF9TdGFuZGFyZCkpL3NkKEdfcGVyX1NoX1N0YW5kYXJkKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBDZWx0YSBWaWdvIiwgIlJlYWwgU29jaWVkYWQiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgQ2VsdGEgVmlnbyIsICJDZWx0YSBWaWdvIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QzKSAlPiUgDQogIG11dGF0ZShEZGlzPSAoR2xzX1N0YW5kYXJkIC0gbGFnKEdsc19TdGFuZGFyZCkpICsgKFNvVF9TdGFuZGFyZCAtIGxhZyhTb1RfU3RhbmRhcmQpKSsgKEdfcGVyX1NoX1N0YW5kYXJkLSBsYWcoR19wZXJfU2hfU3RhbmRhcmQpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xpbXBpbyB1biBwb3F1aXRvIGVsIERGIHBydWViYToNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIG9yZGVuLCBwcnVlYmEpDQoNCg0KI0hhZ28gbG8gbWlzbW8gY29uIGxhIHBvc2VzacOzbjoNCg0KdmFtb3M0PC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gInBvc3Nlc3Npb24iKQ0KDQoNCnZhbW9zVDQ8LSB2YW1vczQgJT4lIHNlbGVjdChTcXVhZCwgUG9zcyxTdWNjX3BlcmNlbnRfRHJpYmJsZXMsIEZpbmFsX1RoaXJkX0NhcnJpZXMpJT4lIA0KICBtdXRhdGUoUG9zcyA9IChQb3NzLSBtZWFuKFBvc3MpKS9zZChQb3NzKSkgJT4lDQogIG11dGF0ZShTdWNjX3BlcmNlbnRfRHJpYmJsZXMgPSAoU3VjY19wZXJjZW50X0RyaWJibGVzLSBtZWFuKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpL3NkKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpICU+JQ0KICBtdXRhdGUoRmluYWxfVGhpcmRfQ2FycmllcyA9IChGaW5hbF9UaGlyZF9DYXJyaWVzLSBtZWFuKEZpbmFsX1RoaXJkX0NhcnJpZXMpKS9zZChGaW5hbF9UaGlyZF9DYXJyaWVzKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBDZWx0YSBWaWdvIiwgIlJlYWwgU29jaWVkYWQiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgQ2VsdGEgVmlnbyIsICJDZWx0YSBWaWdvIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUNCkgJT4lIA0KICBtdXRhdGUoRGRpcz0gKFBvc3MgLSBsYWcoUG9zcykpICsgKFN1Y2NfcGVyY2VudF9EcmliYmxlcyAtIGxhZyhTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKSsgKEZpbmFsX1RoaXJkX0NhcnJpZXMtIGxhZyhGaW5hbF9UaGlyZF9DYXJyaWVzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGlzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCg0KUmVzdWx0YWRvX2ZpbmFsPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIHBydWViYSkgJT4lDQogIG11dGF0ZShHYW5hZG9yID0gaWZlbHNlKHBydWViYSA+IDEsICJFcXVpcG8gbG9jYWwiLCBwcnVlYmEpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTEsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09KC0xKSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0wLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE8KC0xKSwgIkVxdWlwbyB2aXNpdGFudGUiLCBHYW5hZG9yKSkNCg0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmE8LVJlc3VsdGFkb19maW5hbCAlPiUgZmlsdGVyKCFpcy5uYShHYW5hZG9yKSkgJT4lIHNlbGVjdChwcnVlYmEsIEdhbmFkb3IpDQoNCmthYmxlKGEpICU+JQ0KICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQsIGJvcmRlcl9yaWdodCA9IFQpICU+JQ0KICBjb2x1bW5fc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNGQ0ZFOUQiKQ0KYGBgDQoNCiMjIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKlJheW8gVmFsbGVjYW5vIC1CZXRpcyoqPC9GT05UPg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KI0ludHJ1Y2Npb25lczoNCiMxLSBIYWNlciBDdHJsK2YgeSByZWVtcGxhemFyIChSZXBsYWNlKTogUmF5byBWYWxsZWNhbm8gcG9yIGVsIGVxdWlwbyBsb2NhbCB5IEJldGlzIHBvciBlbCBlcXVpcG8gVmlzaXRhbnRlDQojMi0gTW9kaWZpY2lhciBsYSBsw61uZWEgMjQNCiMzLSBSZWVtcGxhemEgMjAyMS0xMi0zMSBwb3IgbGEgZmVjaGEgZGVsIHByaW1lciBwYXJ0aWRvIGRlIGxhIGpvcm5hZGEgcXVlIGVzdHVkaWFtb3MNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHdvcmxkZm9vdGJhbGxSKQ0KDQojSnVnYW5kbyBjb24gRkJSRUYtLS0tLS0NCg0KY2xhc2lmaWNhY2lvbjwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSANCiAgc2VsZWN0KFNxdWFkLFJrLFB0cyx4RywgeEdBKSANCg0KZGF0b3M8LSBnZXRfbWF0Y2hfcmVzdWx0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IikNCg0KI1ZhbW9zIGEgdmVyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgZ2FuZSBlbCBSYXlvIFZhbGxlY2Fubw0KDQp2ZTwtIGNsYXNpZmljYWNpb24gJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJSYXlvIFZhbGxlY2FubyIsICJCZXRpcyIpKSAlPiUgI1BvbmVyIGxvcyBlcXVpcG9zIHF1ZSBxdWllcmFzIChMb2NhbCB5IFZpc2l0YW50ZSkNCiAgbXV0YXRlKG9yZGVuPSBjKDEsMikpICU+JSBzbGljZV9taW4ob3JkZW4sIG49MikgJT4lDQogIG11dGF0ZShEeEc9IHhHLSBsYWcoeEcpKSAlPiUgbXV0YXRlKERQdHM9IFB0cyAtIGxhZyhQdHMpKSAlPiUNCiAgbXV0YXRlKER4R0E9IHhHQSAtIGxhZyh4R0EpKSANCg0KI0lNUE9SVEFOVMONU0lNTywgY2FtYmlhciBsb3MgbsO6bWVyb3MsLS0+ICgxLDIpOiBTaSBlcXVpcG8gbG9jYWwgZXMgYWxmYWLDqXRpY2FtZW50ZSBzdXBlcmlvciBhbCBlcXVpcG8gdmlzaXRhbnRlIGVqOiBSYXlvIFZhbGxlY2Fubz5CZXRpczsgZW4gY2FzbyBjb250cmFyaW86ICgyLDEpDQoNCg0KcHJ1ZWJhPC0gdmUgJT4lIG11dGF0ZShwcnVlYmEgPSAwKSAlPiUgDQogIG11dGF0ZSggcHJ1ZWJhPSBpZmVsc2UoRFB0cz4xNSwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRFB0czwoLTE1KSwgcHJ1ZWJhLTEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPjAsIHBydWViYSsxLCBwcnVlYmEtMSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPjEwLCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc8KC0xMCksIHBydWViYS0xLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4R0E+MCwgcHJ1ZWJhIC0xLCBwcnVlYmErMSkpDQoNCiNQb25lciBlbCBlcXVpcG8gTG9jYWwgKEVuIGFtYm9zKSANCiNDdWlkYWRvLCBsb3MgZGF0b3Mgc29uIGRlbCAyMDIxLTEyLTMxLCBzZSBkZWJlcsOtYSBwb25lciBsYSBmZWNoYSBkZSBsYSDDumx0aW1hIGpvcm5hZGENCg0KTG9jYWx2PC0gZGF0b3MgJT4lIGZpbHRlcihIb21lID09ICJSYXlvIFZhbGxlY2FubyIpICU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICIxIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyggaWZlbHNlKFJlc3VsdGFkbyA8PSAtMSwgIi0xIiwgUmVzdWx0YWRvKSkpICU+JQ0KICBzdW1tYXJpc2UoTG9jYWx2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiUmF5byBWYWxsZWNhbm8iKQ0KDQpWaXNpdGFudGV2IDwtIGRhdG9zICU+JSBmaWx0ZXIoQXdheT09IlJheW8gVmFsbGVjYW5vIiklPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiLTEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKGlmZWxzZShSZXN1bHRhZG8gPj0gMSwgIjEiLCBSZXN1bHRhZG8pKSkgJT4lIA0KICBzdW1tYXJpc2UoVmlzaXRhbnRldj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIlJheW8gVmFsbGVjYW5vIikNCg0KI1BvbmVyIGVsIGVxdWlwbyB2aXNpdGFudGUgKEVuIGFtYm9zKSANCiNDdWlkYWRvLCBsb3MgZGF0b3Mgc29uIGRlbCAyMDIxLTEyLTMxLCBzZSBkZWJlcsOtYSBwb25lciBsYSBmZWNoYSBkZSBsYSDDumx0aW1hIGpvcm5hZGENCg0KTG9jYWxlPC0gZGF0b3MgJT4lIGZpbHRlcihIb21lID09ICJCZXRpcyIpICU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICIxIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyggaWZlbHNlKFJlc3VsdGFkbyA8PSAtMSwgIi0xIiwgUmVzdWx0YWRvKSkpICU+JQ0KICBzdW1tYXJpc2UoTG9jYWx2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiQmV0aXMiKQ0KDQpWaXNpdGFudGVlIDwtIGRhdG9zICU+JSBmaWx0ZXIoQXdheT09IkJldGlzIiklPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiLTEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKGlmZWxzZShSZXN1bHRhZG8gPj0gMSwgIjEiLCBSZXN1bHRhZG8pKSkgJT4lIA0KICBzdW1tYXJpc2UoVmlzaXRhbnRlZT1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIkJldGlzIikNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLExvY2FsdikgDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIFZpc2l0YW50ZWUpDQpwcnVlYmE8LXBydWViYSAlPiUgbXV0YXRlKERHYW49IExvY2Fsdi1sYWcoVmlzaXRhbnRlZSkpICU+JQ0KICBtdXRhdGUocHJ1ZWJhPSBpZmVsc2UoREdhbj4wLCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgIHBydWViYT0gaWZlbHNlKERHYW48MCwgcHJ1ZWJhLTEsIHBydWViYSkpDQoNCg0KI0Fob3JhIHZhbW9zIGEgY3JlYXIgdW5hIHZhcmlhYmxlIHF1ZSBzZWEgbGEgc3VtYSBkZSB0b2RhcyBsYXMgdmFyaWFibGVzIGRlIGRlZmVuc2E6IHByZXNpw7NuIGNvbiDDqXhpdG8sIGJsb3F1ZWFyIHVuIHBhc2UuLi4gcGVybyBjb21vIHRpZW5lbiBkaXN0aW50YXMgbWFnbml0dWRlcywgdmFtb3MgYSB0aXBpZmljYXIgbGEgdmFyaWFibGUgcGFyYSBwb2RlciBzdW1hcmxhcw0KDQp2YW1vczwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICAiZGVmZW5zZSIpDQoNCg0KdmFtb3NUPC0gdmFtb3MgJT4lIHNlbGVjdChTcXVhZCxUa2xXX1RhY2tsZXMsIFN1Y2NfUHJlc3N1cmVzLCBCbG9ja3NfQmxvY2tzKSAlPiUgDQogIG11dGF0ZShUa2xXX1RhY2tsZXMgPSAoVGtsV19UYWNrbGVzLSBtZWFuKFRrbFdfVGFja2xlcykpL3NkKFRrbFdfVGFja2xlcykpICU+JQ0KICBtdXRhdGUoU3VjY19QcmVzc3VyZXMgPSAoU3VjY19QcmVzc3VyZXMtIG1lYW4oU3VjY19QcmVzc3VyZXMpKS9zZChTdWNjX1ByZXNzdXJlcykpICU+JQ0KICBtdXRhdGUoQmxvY2tzX0Jsb2NrcyA9IChCbG9ja3NfQmxvY2tzLSBtZWFuKEJsb2Nrc19CbG9ja3MpKS9zZChCbG9ja3NfQmxvY2tzKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBCZXRpcyIsICJSYXlvIFZhbGxlY2FubyIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBCZXRpcyIsICJCZXRpcyIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QpICU+JSANCiAgbXV0YXRlKERkZWY9IChUa2xXX1RhY2tsZXMgLSBsYWcoVGtsV19UYWNrbGVzKSkgKyAoU3VjY19QcmVzc3VyZXMgLSBsYWcoU3VjY19QcmVzc3VyZXMpKSsgKEJsb2Nrc19CbG9ja3MtIGxhZyhCbG9ja3NfQmxvY2tzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGVmID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNWYW1vcyBhIGhhY2VyIGxvIG1pc21vIGNvbiBsb3MgcGFzZXM6DQoNCnZhbW9zMjwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJwYXNzaW5nIikNCg0KDQp2YW1vc1QyPC0gdmFtb3MyICU+JSBzZWxlY3QoU3F1YWQsQ21wX3BlcmNlbnRfVG90YWwsQXN0LEFfbWludXNfeEEsIEZpbmFsX1RoaXJkLCBQcm9nKSU+JSANCiAgbXV0YXRlKENtcF9wZXJjZW50X1RvdGFsID0gKENtcF9wZXJjZW50X1RvdGFsLSBtZWFuKENtcF9wZXJjZW50X1RvdGFsKSkvc2QoQ21wX3BlcmNlbnRfVG90YWwpKSAlPiUNCiAgbXV0YXRlKEFzdCA9IChBc3QtIG1lYW4oQXN0KSkvc2QoQXN0KSkgJT4lDQogIG11dGF0ZShBX21pbnVzX3hBID0gKEFfbWludXNfeEEtIG1lYW4oQV9taW51c194QSkpL3NkKEFfbWludXNfeEEpKSAlPiUgDQogIG11dGF0ZShGaW5hbF9UaGlyZCA9IChGaW5hbF9UaGlyZC0gbWVhbihGaW5hbF9UaGlyZCkpL3NkKEZpbmFsX1RoaXJkKSkgJT4lDQogIG11dGF0ZShQcm9nID0gKFByb2ctIG1lYW4oUHJvZykpL3NkKFByb2cpKSAlPiUNCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgQmV0aXMiLCAiUmF5byBWYWxsZWNhbm8iKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgQmV0aXMiLCAiQmV0aXMiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDIpICU+JSANCiAgbXV0YXRlKERwYXM9IChDbXBfcGVyY2VudF9Ub3RhbCAtIGxhZyhDbXBfcGVyY2VudF9Ub3RhbCkpICsgKEFzdCAtIGxhZyhBc3QpKSsgKEFfbWludXNfeEEtIGxhZyhBX21pbnVzX3hBKSkrIChGaW5hbF9UaGlyZCAtIGxhZyhGaW5hbF9UaGlyZCkpKyAoUHJvZy0gbGFnKFByb2cpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERwYXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xvIG1pc21vIGNvbiBsb3MgZGlzcGFyb3M6DQoNCnZhbW9zMzwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJzaG9vdGluZyIpDQoNCg0KdmFtb3NUMzwtIHZhbW9zMyAlPiUgc2VsZWN0KFNxdWFkLEdsc19TdGFuZGFyZCwgU29UX1N0YW5kYXJkLEdfcGVyX1NoX1N0YW5kYXJkKSAgJT4lIA0KICBtdXRhdGUoR2xzX1N0YW5kYXJkID0gKEdsc19TdGFuZGFyZC0gbWVhbihHbHNfU3RhbmRhcmQpKS9zZChHbHNfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKFNvVF9TdGFuZGFyZCA9IChTb1RfU3RhbmRhcmQtIG1lYW4oU29UX1N0YW5kYXJkKSkvc2QoU29UX1N0YW5kYXJkKSkgJT4lDQogIG11dGF0ZShHX3Blcl9TaF9TdGFuZGFyZCA9IChHX3Blcl9TaF9TdGFuZGFyZC0gbWVhbihHX3Blcl9TaF9TdGFuZGFyZCkpL3NkKEdfcGVyX1NoX1N0YW5kYXJkKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBCZXRpcyIsICJSYXlvIFZhbGxlY2FubyIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBCZXRpcyIsICJCZXRpcyIsIFNxdWFkKSkgI0VzdG8gZXMgdW4gY2/DsWF6byBwZXJvIGhheSBxdWUgY2FtYmlhcmxvDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUMykgJT4lIA0KICBtdXRhdGUoRGRpcz0gKEdsc19TdGFuZGFyZCAtIGxhZyhHbHNfU3RhbmRhcmQpKSArIChTb1RfU3RhbmRhcmQgLSBsYWcoU29UX1N0YW5kYXJkKSkrIChHX3Blcl9TaF9TdGFuZGFyZC0gbGFnKEdfcGVyX1NoX1N0YW5kYXJkKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGlzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNMaW1waW8gdW4gcG9xdWl0byBlbCBERiBwcnVlYmE6DQoNCnBydWViYTwtIHBydWViYSAlPiUgc2VsZWN0KFNxdWFkLCBvcmRlbiwgcHJ1ZWJhKQ0KDQoNCiNIYWdvIGxvIG1pc21vIGNvbiBsYSBwb3Nlc2nDs246DQoNCnZhbW9zNDwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJwb3NzZXNzaW9uIikNCg0KDQp2YW1vc1Q0PC0gdmFtb3M0ICU+JSBzZWxlY3QoU3F1YWQsIFBvc3MsU3VjY19wZXJjZW50X0RyaWJibGVzLCBGaW5hbF9UaGlyZF9DYXJyaWVzKSU+JSANCiAgbXV0YXRlKFBvc3MgPSAoUG9zcy0gbWVhbihQb3NzKSkvc2QoUG9zcykpICU+JQ0KICBtdXRhdGUoU3VjY19wZXJjZW50X0RyaWJibGVzID0gKFN1Y2NfcGVyY2VudF9EcmliYmxlcy0gbWVhbihTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKS9zZChTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKSAlPiUNCiAgbXV0YXRlKEZpbmFsX1RoaXJkX0NhcnJpZXMgPSAoRmluYWxfVGhpcmRfQ2Fycmllcy0gbWVhbihGaW5hbF9UaGlyZF9DYXJyaWVzKSkvc2QoRmluYWxfVGhpcmRfQ2FycmllcykpICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgQmV0aXMiLCAiUmF5byBWYWxsZWNhbm8iKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgQmV0aXMiLCAiQmV0aXMiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQoNCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1Q0KSAlPiUgDQogIG11dGF0ZShEZGlzPSAoUG9zcyAtIGxhZyhQb3NzKSkgKyAoU3VjY19wZXJjZW50X0RyaWJibGVzIC0gbGFnKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpKyAoRmluYWxfVGhpcmRfQ2Fycmllcy0gbGFnKEZpbmFsX1RoaXJkX0NhcnJpZXMpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KDQpSZXN1bHRhZG9fZmluYWw8LSBwcnVlYmEgJT4lIHNlbGVjdChTcXVhZCwgcHJ1ZWJhKSAlPiUNCiAgbXV0YXRlKEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhID4gMSwgIkVxdWlwbyBsb2NhbCIsIHBydWViYSksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09MSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0oLTEpLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTAsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYTwoLTEpLCAiRXF1aXBvIHZpc2l0YW50ZSIsIEdhbmFkb3IpKQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KYTwtUmVzdWx0YWRvX2ZpbmFsICU+JSBmaWx0ZXIoIWlzLm5hKEdhbmFkb3IpKSAlPiUgc2VsZWN0KHBydWViYSwgR2FuYWRvcikNCg0Ka2FibGUoYSkgJT4lDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYpICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCwgYm9yZGVyX3JpZ2h0ID0gVCkgJT4lDQogIGNvbHVtbl9zcGVjKDIsIGJhY2tncm91bmQgPSAiI0ZDRkU5RCIpDQoNCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9ImQzYTQ2YSI+KipTZXZpbGxhLUdldGFmZSoqPC9GT05UPg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KI0ludHJ1Y2Npb25lczoNCiMxLSBIYWNlciBDdHJsK2YgeSByZWVtcGxhemFyIChSZXBsYWNlKTogU2V2aWxsYSBwb3IgZWwgZXF1aXBvIGxvY2FsIHkgR2V0YWZlIHBvciBlbCBlcXVpcG8gVmlzaXRhbnRlDQojMi0gTW9kaWZpY2lhciBsYSBsw61uZWEgMjQNCiMzLSBSZWVtcGxhemEgMjAyMS0xMi0zMSBwb3IgbGEgZmVjaGEgZGVsIHByaW1lciBwYXJ0aWRvIGRlIGxhIGpvcm5hZGEgcXVlIGVzdHVkaWFtb3MNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHdvcmxkZm9vdGJhbGxSKQ0KDQojSnVnYW5kbyBjb24gRkJSRUYtLS0tLS0NCg0KY2xhc2lmaWNhY2lvbjwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSANCiAgc2VsZWN0KFNxdWFkLFJrLFB0cyx4RywgeEdBKSANCg0KZGF0b3M8LSBnZXRfbWF0Y2hfcmVzdWx0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IikNCg0KI1ZhbW9zIGEgdmVyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgZ2FuZSBlbCBTZXZpbGxhDQoNCnZlPC0gY2xhc2lmaWNhY2lvbiAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoIlNldmlsbGEiLCAiR2V0YWZlIikpICU+JSAjUG9uZXIgbG9zIGVxdWlwb3MgcXVlIHF1aWVyYXMgKExvY2FsIHkgVmlzaXRhbnRlKQ0KICBtdXRhdGUob3JkZW49IGMoMSwyKSkgJT4lIHNsaWNlX21pbihvcmRlbiwgbj0yKSAlPiUNCiAgbXV0YXRlKER4Rz0geEctIGxhZyh4RykpICU+JSBtdXRhdGUoRFB0cz0gUHRzIC0gbGFnKFB0cykpICU+JQ0KICBtdXRhdGUoRHhHQT0geEdBIC0gbGFnKHhHQSkpIA0KDQojSU1QT1JUQU5Uw41TSU1PLCBjYW1iaWFyIGxvcyBuw7ptZXJvcywtLT4gKDEsMik6IFNpIGVxdWlwbyBsb2NhbCBlcyBhbGZhYsOpdGljYW1lbnRlIHN1cGVyaW9yIGFsIGVxdWlwbyB2aXNpdGFudGUgZWo6IFNldmlsbGE+R2V0YWZlOyBlbiBjYXNvIGNvbnRyYXJpbzogKDIsMSkNCg0KDQpwcnVlYmE8LSB2ZSAlPiUgbXV0YXRlKHBydWViYSA9IDApICU+JSANCiAgbXV0YXRlKCBwcnVlYmE9IGlmZWxzZShEUHRzPjE1LCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEUHRzPCgtMTUpLCBwcnVlYmEtMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc+MCwgcHJ1ZWJhKzEsIHBydWViYS0xKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc+MTAsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4RzwoLTEwKSwgcHJ1ZWJhLTEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHQT4wLCBwcnVlYmEgLTEsIHBydWViYSsxKSkNCg0KI1BvbmVyIGVsIGVxdWlwbyBMb2NhbCAoRW4gYW1ib3MpIA0KI0N1aWRhZG8sIGxvcyBkYXRvcyBzb24gZGVsIDIwMjEtMTItMzEsIHNlIGRlYmVyw61hIHBvbmVyIGxhIGZlY2hhIGRlIGxhIMO6bHRpbWEgam9ybmFkYQ0KDQpMb2NhbHY8LSBkYXRvcyAlPiUgZmlsdGVyKEhvbWUgPT0gIlNldmlsbGEiKSAlPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoIGlmZWxzZShSZXN1bHRhZG8gPD0gLTEsICItMSIsIFJlc3VsdGFkbykpKSAlPiUNCiAgc3VtbWFyaXNlKExvY2Fsdj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIlNldmlsbGEiKQ0KDQpWaXNpdGFudGV2IDwtIGRhdG9zICU+JSBmaWx0ZXIoQXdheT09IlNldmlsbGEiKSU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICItMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoaWZlbHNlKFJlc3VsdGFkbyA+PSAxLCAiMSIsIFJlc3VsdGFkbykpKSAlPiUgDQogIHN1bW1hcmlzZShWaXNpdGFudGV2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiU2V2aWxsYSIpDQoNCiNQb25lciBlbCBlcXVpcG8gdmlzaXRhbnRlIChFbiBhbWJvcykgDQojQ3VpZGFkbywgbG9zIGRhdG9zIHNvbiBkZWwgMjAyMS0xMi0zMSwgc2UgZGViZXLDrWEgcG9uZXIgbGEgZmVjaGEgZGUgbGEgw7psdGltYSBqb3JuYWRhDQoNCkxvY2FsZTwtIGRhdG9zICU+JSBmaWx0ZXIoSG9tZSA9PSAiR2V0YWZlIikgJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIjEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKCBpZmVsc2UoUmVzdWx0YWRvIDw9IC0xLCAiLTEiLCBSZXN1bHRhZG8pKSkgJT4lDQogIHN1bW1hcmlzZShMb2NhbHY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJHZXRhZmUiKQ0KDQpWaXNpdGFudGVlIDwtIGRhdG9zICU+JSBmaWx0ZXIoQXdheT09IkdldGFmZSIpJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIi0xIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyhpZmVsc2UoUmVzdWx0YWRvID49IDEsICIxIiwgUmVzdWx0YWRvKSkpICU+JSANCiAgc3VtbWFyaXNlKFZpc2l0YW50ZWU9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJHZXRhZmUiKQ0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsTG9jYWx2KSANCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgVmlzaXRhbnRlZSkNCnBydWViYTwtcHJ1ZWJhICU+JSBtdXRhdGUoREdhbj0gTG9jYWx2LWxhZyhWaXNpdGFudGVlKSkgJT4lDQogIG11dGF0ZShwcnVlYmE9IGlmZWxzZShER2FuPjAsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoREdhbjwwLCBwcnVlYmEtMSwgcHJ1ZWJhKSkNCg0KDQojQWhvcmEgdmFtb3MgYSBjcmVhciB1bmEgdmFyaWFibGUgcXVlIHNlYSBsYSBzdW1hIGRlIHRvZGFzIGxhcyB2YXJpYWJsZXMgZGUgZGVmZW5zYTogcHJlc2nDs24gY29uIMOpeGl0bywgYmxvcXVlYXIgdW4gcGFzZS4uLiBwZXJvIGNvbW8gdGllbmVuIGRpc3RpbnRhcyBtYWduaXR1ZGVzLCB2YW1vcyBhIHRpcGlmaWNhciBsYSB2YXJpYWJsZSBwYXJhIHBvZGVyIHN1bWFybGFzDQoNCnZhbW9zPC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gICJkZWZlbnNlIikNCg0KDQp2YW1vc1Q8LSB2YW1vcyAlPiUgc2VsZWN0KFNxdWFkLFRrbFdfVGFja2xlcywgU3VjY19QcmVzc3VyZXMsIEJsb2Nrc19CbG9ja3MpICU+JSANCiAgbXV0YXRlKFRrbFdfVGFja2xlcyA9IChUa2xXX1RhY2tsZXMtIG1lYW4oVGtsV19UYWNrbGVzKSkvc2QoVGtsV19UYWNrbGVzKSkgJT4lDQogIG11dGF0ZShTdWNjX1ByZXNzdXJlcyA9IChTdWNjX1ByZXNzdXJlcy0gbWVhbihTdWNjX1ByZXNzdXJlcykpL3NkKFN1Y2NfUHJlc3N1cmVzKSkgJT4lDQogIG11dGF0ZShCbG9ja3NfQmxvY2tzID0gKEJsb2Nrc19CbG9ja3MtIG1lYW4oQmxvY2tzX0Jsb2NrcykpL3NkKEJsb2Nrc19CbG9ja3MpKSAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIEdldGFmZSIsICJTZXZpbGxhIikpICU+JSAjdnMgZXMgZWwgZXF1aXBvIHZpc2l0YW50ZSB5IGVsIG90cm8gZWwgZXF1aXBvIGxvY2FsDQogIG11dGF0ZShTcXVhZCA9IGlmZWxzZShTcXVhZD09InZzIEdldGFmZSIsICJHZXRhZmUiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUKSAlPiUgDQogIG11dGF0ZShEZGVmPSAoVGtsV19UYWNrbGVzIC0gbGFnKFRrbFdfVGFja2xlcykpICsgKFN1Y2NfUHJlc3N1cmVzIC0gbGFnKFN1Y2NfUHJlc3N1cmVzKSkrIChCbG9ja3NfQmxvY2tzLSBsYWcoQmxvY2tzX0Jsb2NrcykpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRlZiA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojVmFtb3MgYSBoYWNlciBsbyBtaXNtbyBjb24gbG9zIHBhc2VzOg0KDQp2YW1vczI8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAicGFzc2luZyIpDQoNCg0KdmFtb3NUMjwtIHZhbW9zMiAlPiUgc2VsZWN0KFNxdWFkLENtcF9wZXJjZW50X1RvdGFsLEFzdCxBX21pbnVzX3hBLCBGaW5hbF9UaGlyZCwgUHJvZyklPiUgDQogIG11dGF0ZShDbXBfcGVyY2VudF9Ub3RhbCA9IChDbXBfcGVyY2VudF9Ub3RhbC0gbWVhbihDbXBfcGVyY2VudF9Ub3RhbCkpL3NkKENtcF9wZXJjZW50X1RvdGFsKSkgJT4lDQogIG11dGF0ZShBc3QgPSAoQXN0LSBtZWFuKEFzdCkpL3NkKEFzdCkpICU+JQ0KICBtdXRhdGUoQV9taW51c194QSA9IChBX21pbnVzX3hBLSBtZWFuKEFfbWludXNfeEEpKS9zZChBX21pbnVzX3hBKSkgJT4lIA0KICBtdXRhdGUoRmluYWxfVGhpcmQgPSAoRmluYWxfVGhpcmQtIG1lYW4oRmluYWxfVGhpcmQpKS9zZChGaW5hbF9UaGlyZCkpICU+JQ0KICBtdXRhdGUoUHJvZyA9IChQcm9nLSBtZWFuKFByb2cpKS9zZChQcm9nKSkgJT4lDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIEdldGFmZSIsICJTZXZpbGxhIikpICU+JSAjdnMgZXMgZWwgZXF1aXBvIHZpc2l0YW50ZSB5IGVsIG90cm8gZWwgZXF1aXBvIGxvY2FsDQogIG11dGF0ZShTcXVhZCA9IGlmZWxzZShTcXVhZD09InZzIEdldGFmZSIsICJHZXRhZmUiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDIpICU+JSANCiAgbXV0YXRlKERwYXM9IChDbXBfcGVyY2VudF9Ub3RhbCAtIGxhZyhDbXBfcGVyY2VudF9Ub3RhbCkpICsgKEFzdCAtIGxhZyhBc3QpKSsgKEFfbWludXNfeEEtIGxhZyhBX21pbnVzX3hBKSkrIChGaW5hbF9UaGlyZCAtIGxhZyhGaW5hbF9UaGlyZCkpKyAoUHJvZy0gbGFnKFByb2cpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERwYXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xvIG1pc21vIGNvbiBsb3MgZGlzcGFyb3M6DQoNCnZhbW9zMzwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJzaG9vdGluZyIpDQoNCg0KdmFtb3NUMzwtIHZhbW9zMyAlPiUgc2VsZWN0KFNxdWFkLEdsc19TdGFuZGFyZCwgU29UX1N0YW5kYXJkLEdfcGVyX1NoX1N0YW5kYXJkKSAgJT4lIA0KICBtdXRhdGUoR2xzX1N0YW5kYXJkID0gKEdsc19TdGFuZGFyZC0gbWVhbihHbHNfU3RhbmRhcmQpKS9zZChHbHNfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKFNvVF9TdGFuZGFyZCA9IChTb1RfU3RhbmRhcmQtIG1lYW4oU29UX1N0YW5kYXJkKSkvc2QoU29UX1N0YW5kYXJkKSkgJT4lDQogIG11dGF0ZShHX3Blcl9TaF9TdGFuZGFyZCA9IChHX3Blcl9TaF9TdGFuZGFyZC0gbWVhbihHX3Blcl9TaF9TdGFuZGFyZCkpL3NkKEdfcGVyX1NoX1N0YW5kYXJkKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBHZXRhZmUiLCAiU2V2aWxsYSIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBHZXRhZmUiLCAiR2V0YWZlIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QzKSAlPiUgDQogIG11dGF0ZShEZGlzPSAoR2xzX1N0YW5kYXJkIC0gbGFnKEdsc19TdGFuZGFyZCkpICsgKFNvVF9TdGFuZGFyZCAtIGxhZyhTb1RfU3RhbmRhcmQpKSsgKEdfcGVyX1NoX1N0YW5kYXJkLSBsYWcoR19wZXJfU2hfU3RhbmRhcmQpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xpbXBpbyB1biBwb3F1aXRvIGVsIERGIHBydWViYToNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIG9yZGVuLCBwcnVlYmEpDQoNCg0KI0hhZ28gbG8gbWlzbW8gY29uIGxhIHBvc2VzacOzbjoNCg0KdmFtb3M0PC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gInBvc3Nlc3Npb24iKQ0KDQoNCnZhbW9zVDQ8LSB2YW1vczQgJT4lIHNlbGVjdChTcXVhZCwgUG9zcyxTdWNjX3BlcmNlbnRfRHJpYmJsZXMsIEZpbmFsX1RoaXJkX0NhcnJpZXMpJT4lIA0KICBtdXRhdGUoUG9zcyA9IChQb3NzLSBtZWFuKFBvc3MpKS9zZChQb3NzKSkgJT4lDQogIG11dGF0ZShTdWNjX3BlcmNlbnRfRHJpYmJsZXMgPSAoU3VjY19wZXJjZW50X0RyaWJibGVzLSBtZWFuKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpL3NkKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpICU+JQ0KICBtdXRhdGUoRmluYWxfVGhpcmRfQ2FycmllcyA9IChGaW5hbF9UaGlyZF9DYXJyaWVzLSBtZWFuKEZpbmFsX1RoaXJkX0NhcnJpZXMpKS9zZChGaW5hbF9UaGlyZF9DYXJyaWVzKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBHZXRhZmUiLCAiU2V2aWxsYSIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBHZXRhZmUiLCAiR2V0YWZlIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUNCkgJT4lIA0KICBtdXRhdGUoRGRpcz0gKFBvc3MgLSBsYWcoUG9zcykpICsgKFN1Y2NfcGVyY2VudF9EcmliYmxlcyAtIGxhZyhTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKSsgKEZpbmFsX1RoaXJkX0NhcnJpZXMtIGxhZyhGaW5hbF9UaGlyZF9DYXJyaWVzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGlzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCg0KUmVzdWx0YWRvX2ZpbmFsPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIHBydWViYSkgJT4lDQogIG11dGF0ZShHYW5hZG9yID0gaWZlbHNlKHBydWViYSA+IDEsICJFcXVpcG8gbG9jYWwiLCBwcnVlYmEpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTEsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09KC0xKSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0wLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE8KC0xKSwgIkVxdWlwbyB2aXNpdGFudGUiLCBHYW5hZG9yKSkNCg0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmE8LVJlc3VsdGFkb19maW5hbCAlPiUgZmlsdGVyKCFpcy5uYShHYW5hZG9yKSkgJT4lIHNlbGVjdChwcnVlYmEsIEdhbmFkb3IpDQoNCmthYmxlKGEpICU+JQ0KICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQsIGJvcmRlcl9yaWdodCA9IFQpICU+JQ0KICBjb2x1bW5fc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNGQ0ZFOUQiKQ0KDQpgYGANCg0KDQojIyMgPEZPTlQgQ09MT1I9ImQzYTQ2YSI+KipPc2FzdW5hLUPDoWRpeioqPC9GT05UPg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KI0ludHJ1Y2Npb25lczoNCiMxLSBIYWNlciBDdHJsK2YgeSByZWVtcGxhemFyIChSZXBsYWNlKTogT3Nhc3VuYSBwb3IgZWwgZXF1aXBvIGxvY2FsIHkgQ8OhZGl6IHBvciBlbCBlcXVpcG8gVmlzaXRhbnRlDQojMi0gTW9kaWZpY2lhciBsYSBsw61uZWEgMjQNCiMzLSBSZWVtcGxhemEgMjAyMS0xMi0zMSBwb3IgbGEgZmVjaGEgZGVsIHByaW1lciBwYXJ0aWRvIGRlIGxhIGpvcm5hZGEgcXVlIGVzdHVkaWFtb3MNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHdvcmxkZm9vdGJhbGxSKQ0KDQojSnVnYW5kbyBjb24gRkJSRUYtLS0tLS0NCg0KY2xhc2lmaWNhY2lvbjwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSANCiAgc2VsZWN0KFNxdWFkLFJrLFB0cyx4RywgeEdBKSANCg0KZGF0b3M8LSBnZXRfbWF0Y2hfcmVzdWx0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IikNCg0KI1ZhbW9zIGEgdmVyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgZ2FuZSBlbCBPc2FzdW5hDQoNCnZlPC0gY2xhc2lmaWNhY2lvbiAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoIk9zYXN1bmEiLCAiQ8OhZGl6IikpICU+JSAjUG9uZXIgbG9zIGVxdWlwb3MgcXVlIHF1aWVyYXMgKExvY2FsIHkgVmlzaXRhbnRlKQ0KICBtdXRhdGUob3JkZW49IGMoMSwyKSkgJT4lIHNsaWNlX21pbihvcmRlbiwgbj0yKSAlPiUNCiAgbXV0YXRlKER4Rz0geEctIGxhZyh4RykpICU+JSBtdXRhdGUoRFB0cz0gUHRzIC0gbGFnKFB0cykpICU+JQ0KICBtdXRhdGUoRHhHQT0geEdBIC0gbGFnKHhHQSkpIA0KDQojSU1QT1JUQU5Uw41TSU1PLCBjYW1iaWFyIGxvcyBuw7ptZXJvcywtLT4gKDEsMik6IFNpIGVxdWlwbyBsb2NhbCBlcyBhbGZhYsOpdGljYW1lbnRlIHN1cGVyaW9yIGFsIGVxdWlwbyB2aXNpdGFudGUgZWo6IE9zYXN1bmE+Q8OhZGl6OyBlbiBjYXNvIGNvbnRyYXJpbzogKDIsMSkNCg0KDQpwcnVlYmE8LSB2ZSAlPiUgbXV0YXRlKHBydWViYSA9IDApICU+JSANCiAgbXV0YXRlKCBwcnVlYmE9IGlmZWxzZShEUHRzPjE1LCBwcnVlYmErMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEUHRzPCgtMTUpLCBwcnVlYmEtMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc+MCwgcHJ1ZWJhKzEsIHBydWViYS0xKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEc+MTAsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4RzwoLTEwKSwgcHJ1ZWJhLTEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHQT4wLCBwcnVlYmEgLTEsIHBydWViYSsxKSkNCg0KI1BvbmVyIGVsIGVxdWlwbyBMb2NhbCAoRW4gYW1ib3MpIA0KI0N1aWRhZG8sIGxvcyBkYXRvcyBzb24gZGVsIDIwMjEtMTItMzEsIHNlIGRlYmVyw61hIHBvbmVyIGxhIGZlY2hhIGRlIGxhIMO6bHRpbWEgam9ybmFkYQ0KDQpMb2NhbHY8LSBkYXRvcyAlPiUgZmlsdGVyKEhvbWUgPT0gIk9zYXN1bmEiKSAlPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoIGlmZWxzZShSZXN1bHRhZG8gPD0gLTEsICItMSIsIFJlc3VsdGFkbykpKSAlPiUNCiAgc3VtbWFyaXNlKExvY2Fsdj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIk9zYXN1bmEiKQ0KDQpWaXNpdGFudGV2IDwtIGRhdG9zICU+JSBmaWx0ZXIoQXdheT09Ik9zYXN1bmEiKSU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICItMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoaWZlbHNlKFJlc3VsdGFkbyA+PSAxLCAiMSIsIFJlc3VsdGFkbykpKSAlPiUgDQogIHN1bW1hcmlzZShWaXNpdGFudGV2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiT3Nhc3VuYSIpDQoNCiNQb25lciBlbCBlcXVpcG8gdmlzaXRhbnRlIChFbiBhbWJvcykgDQojQ3VpZGFkbywgbG9zIGRhdG9zIHNvbiBkZWwgMjAyMS0xMi0zMSwgc2UgZGViZXLDrWEgcG9uZXIgbGEgZmVjaGEgZGUgbGEgw7psdGltYSBqb3JuYWRhDQoNCkxvY2FsZTwtIGRhdG9zICU+JSBmaWx0ZXIoSG9tZSA9PSAiQ8OhZGl6IikgJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIjEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKCBpZmVsc2UoUmVzdWx0YWRvIDw9IC0xLCAiLTEiLCBSZXN1bHRhZG8pKSkgJT4lDQogIHN1bW1hcmlzZShMb2NhbHY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJDw6FkaXoiKQ0KDQpWaXNpdGFudGVlIDwtIGRhdG9zICU+JSBmaWx0ZXIoQXdheT09IkPDoWRpeiIpJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIi0xIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyhpZmVsc2UoUmVzdWx0YWRvID49IDEsICIxIiwgUmVzdWx0YWRvKSkpICU+JSANCiAgc3VtbWFyaXNlKFZpc2l0YW50ZWU9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJDw6FkaXoiKQ0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsTG9jYWx2KSANCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgVmlzaXRhbnRlZSkNCnBydWViYTwtcHJ1ZWJhICU+JSBtdXRhdGUoREdhbj0gTG9jYWx2LWxhZyhWaXNpdGFudGVlKSkgJT4lDQogIG11dGF0ZShwcnVlYmE9IGlmZWxzZShER2FuPjAsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoREdhbjwwLCBwcnVlYmEtMSwgcHJ1ZWJhKSkNCg0KDQojQWhvcmEgdmFtb3MgYSBjcmVhciB1bmEgdmFyaWFibGUgcXVlIHNlYSBsYSBzdW1hIGRlIHRvZGFzIGxhcyB2YXJpYWJsZXMgZGUgZGVmZW5zYTogcHJlc2nDs24gY29uIMOpeGl0bywgYmxvcXVlYXIgdW4gcGFzZS4uLiBwZXJvIGNvbW8gdGllbmVuIGRpc3RpbnRhcyBtYWduaXR1ZGVzLCB2YW1vcyBhIHRpcGlmaWNhciBsYSB2YXJpYWJsZSBwYXJhIHBvZGVyIHN1bWFybGFzDQoNCnZhbW9zPC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gICJkZWZlbnNlIikNCg0KDQp2YW1vc1Q8LSB2YW1vcyAlPiUgc2VsZWN0KFNxdWFkLFRrbFdfVGFja2xlcywgU3VjY19QcmVzc3VyZXMsIEJsb2Nrc19CbG9ja3MpICU+JSANCiAgbXV0YXRlKFRrbFdfVGFja2xlcyA9IChUa2xXX1RhY2tsZXMtIG1lYW4oVGtsV19UYWNrbGVzKSkvc2QoVGtsV19UYWNrbGVzKSkgJT4lDQogIG11dGF0ZShTdWNjX1ByZXNzdXJlcyA9IChTdWNjX1ByZXNzdXJlcy0gbWVhbihTdWNjX1ByZXNzdXJlcykpL3NkKFN1Y2NfUHJlc3N1cmVzKSkgJT4lDQogIG11dGF0ZShCbG9ja3NfQmxvY2tzID0gKEJsb2Nrc19CbG9ja3MtIG1lYW4oQmxvY2tzX0Jsb2NrcykpL3NkKEJsb2Nrc19CbG9ja3MpKSAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIEPDoWRpeiIsICJPc2FzdW5hIikpICU+JSAjdnMgZXMgZWwgZXF1aXBvIHZpc2l0YW50ZSB5IGVsIG90cm8gZWwgZXF1aXBvIGxvY2FsDQogIG11dGF0ZShTcXVhZCA9IGlmZWxzZShTcXVhZD09InZzIEPDoWRpeiIsICJDw6FkaXoiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUKSAlPiUgDQogIG11dGF0ZShEZGVmPSAoVGtsV19UYWNrbGVzIC0gbGFnKFRrbFdfVGFja2xlcykpICsgKFN1Y2NfUHJlc3N1cmVzIC0gbGFnKFN1Y2NfUHJlc3N1cmVzKSkrIChCbG9ja3NfQmxvY2tzLSBsYWcoQmxvY2tzX0Jsb2NrcykpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRlZiA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojVmFtb3MgYSBoYWNlciBsbyBtaXNtbyBjb24gbG9zIHBhc2VzOg0KDQp2YW1vczI8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAicGFzc2luZyIpDQoNCg0KdmFtb3NUMjwtIHZhbW9zMiAlPiUgc2VsZWN0KFNxdWFkLENtcF9wZXJjZW50X1RvdGFsLEFzdCxBX21pbnVzX3hBLCBGaW5hbF9UaGlyZCwgUHJvZyklPiUgDQogIG11dGF0ZShDbXBfcGVyY2VudF9Ub3RhbCA9IChDbXBfcGVyY2VudF9Ub3RhbC0gbWVhbihDbXBfcGVyY2VudF9Ub3RhbCkpL3NkKENtcF9wZXJjZW50X1RvdGFsKSkgJT4lDQogIG11dGF0ZShBc3QgPSAoQXN0LSBtZWFuKEFzdCkpL3NkKEFzdCkpICU+JQ0KICBtdXRhdGUoQV9taW51c194QSA9IChBX21pbnVzX3hBLSBtZWFuKEFfbWludXNfeEEpKS9zZChBX21pbnVzX3hBKSkgJT4lIA0KICBtdXRhdGUoRmluYWxfVGhpcmQgPSAoRmluYWxfVGhpcmQtIG1lYW4oRmluYWxfVGhpcmQpKS9zZChGaW5hbF9UaGlyZCkpICU+JQ0KICBtdXRhdGUoUHJvZyA9IChQcm9nLSBtZWFuKFByb2cpKS9zZChQcm9nKSkgJT4lDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIEPDoWRpeiIsICJPc2FzdW5hIikpICU+JSAjdnMgZXMgZWwgZXF1aXBvIHZpc2l0YW50ZSB5IGVsIG90cm8gZWwgZXF1aXBvIGxvY2FsDQogIG11dGF0ZShTcXVhZCA9IGlmZWxzZShTcXVhZD09InZzIEPDoWRpeiIsICJDw6FkaXoiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDIpICU+JSANCiAgbXV0YXRlKERwYXM9IChDbXBfcGVyY2VudF9Ub3RhbCAtIGxhZyhDbXBfcGVyY2VudF9Ub3RhbCkpICsgKEFzdCAtIGxhZyhBc3QpKSsgKEFfbWludXNfeEEtIGxhZyhBX21pbnVzX3hBKSkrIChGaW5hbF9UaGlyZCAtIGxhZyhGaW5hbF9UaGlyZCkpKyAoUHJvZy0gbGFnKFByb2cpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERwYXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xvIG1pc21vIGNvbiBsb3MgZGlzcGFyb3M6DQoNCnZhbW9zMzwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJzaG9vdGluZyIpDQoNCg0KdmFtb3NUMzwtIHZhbW9zMyAlPiUgc2VsZWN0KFNxdWFkLEdsc19TdGFuZGFyZCwgU29UX1N0YW5kYXJkLEdfcGVyX1NoX1N0YW5kYXJkKSAgJT4lIA0KICBtdXRhdGUoR2xzX1N0YW5kYXJkID0gKEdsc19TdGFuZGFyZC0gbWVhbihHbHNfU3RhbmRhcmQpKS9zZChHbHNfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKFNvVF9TdGFuZGFyZCA9IChTb1RfU3RhbmRhcmQtIG1lYW4oU29UX1N0YW5kYXJkKSkvc2QoU29UX1N0YW5kYXJkKSkgJT4lDQogIG11dGF0ZShHX3Blcl9TaF9TdGFuZGFyZCA9IChHX3Blcl9TaF9TdGFuZGFyZC0gbWVhbihHX3Blcl9TaF9TdGFuZGFyZCkpL3NkKEdfcGVyX1NoX1N0YW5kYXJkKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBDw6FkaXoiLCAiT3Nhc3VuYSIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBDw6FkaXoiLCAiQ8OhZGl6IiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QzKSAlPiUgDQogIG11dGF0ZShEZGlzPSAoR2xzX1N0YW5kYXJkIC0gbGFnKEdsc19TdGFuZGFyZCkpICsgKFNvVF9TdGFuZGFyZCAtIGxhZyhTb1RfU3RhbmRhcmQpKSsgKEdfcGVyX1NoX1N0YW5kYXJkLSBsYWcoR19wZXJfU2hfU3RhbmRhcmQpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xpbXBpbyB1biBwb3F1aXRvIGVsIERGIHBydWViYToNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIG9yZGVuLCBwcnVlYmEpDQoNCg0KI0hhZ28gbG8gbWlzbW8gY29uIGxhIHBvc2VzacOzbjoNCg0KdmFtb3M0PC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gInBvc3Nlc3Npb24iKQ0KDQoNCnZhbW9zVDQ8LSB2YW1vczQgJT4lIHNlbGVjdChTcXVhZCwgUG9zcyxTdWNjX3BlcmNlbnRfRHJpYmJsZXMsIEZpbmFsX1RoaXJkX0NhcnJpZXMpJT4lIA0KICBtdXRhdGUoUG9zcyA9IChQb3NzLSBtZWFuKFBvc3MpKS9zZChQb3NzKSkgJT4lDQogIG11dGF0ZShTdWNjX3BlcmNlbnRfRHJpYmJsZXMgPSAoU3VjY19wZXJjZW50X0RyaWJibGVzLSBtZWFuKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpL3NkKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpICU+JQ0KICBtdXRhdGUoRmluYWxfVGhpcmRfQ2FycmllcyA9IChGaW5hbF9UaGlyZF9DYXJyaWVzLSBtZWFuKEZpbmFsX1RoaXJkX0NhcnJpZXMpKS9zZChGaW5hbF9UaGlyZF9DYXJyaWVzKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBDw6FkaXoiLCAiT3Nhc3VuYSIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBDw6FkaXoiLCAiQ8OhZGl6IiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUNCkgJT4lIA0KICBtdXRhdGUoRGRpcz0gKFBvc3MgLSBsYWcoUG9zcykpICsgKFN1Y2NfcGVyY2VudF9EcmliYmxlcyAtIGxhZyhTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKSsgKEZpbmFsX1RoaXJkX0NhcnJpZXMtIGxhZyhGaW5hbF9UaGlyZF9DYXJyaWVzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGlzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCg0KUmVzdWx0YWRvX2ZpbmFsPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIHBydWViYSkgJT4lDQogIG11dGF0ZShHYW5hZG9yID0gaWZlbHNlKHBydWViYSA+IDEsICJFcXVpcG8gbG9jYWwiLCBwcnVlYmEpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTEsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09KC0xKSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0wLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE8KC0xKSwgIkVxdWlwbyB2aXNpdGFudGUiLCBHYW5hZG9yKSkNCg0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmE8LVJlc3VsdGFkb19maW5hbCAlPiUgZmlsdGVyKCFpcy5uYShHYW5hZG9yKSkgJT4lIHNlbGVjdChwcnVlYmEsIEdhbmFkb3IpDQoNCmthYmxlKGEpICU+JQ0KICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQsIGJvcmRlcl9yaWdodCA9IFQpICU+JQ0KICBjb2x1bW5fc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNGQ0ZFOUQiKQ0KDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqVmlsbGFycmVhbC1BdGzDqXRpY28gZGUgTWFkcmlkKio8L0ZPTlQ+DQoNCmBgYHtyLGVjaG89RkFMU0V9DQojSW50cnVjY2lvbmVzOg0KIzEtIEhhY2VyIEN0cmwrZiB5IHJlZW1wbGF6YXIgKFJlcGxhY2UpOiBWaWxsYXJyZWFsIHBvciBlbCBlcXVpcG8gbG9jYWwgeSBBdGzDqXRpY28gTWFkcmlkIHBvciBlbCBlcXVpcG8gVmlzaXRhbnRlDQojMi0gTW9kaWZpY2lhciBsYSBsw61uZWEgMjQNCiMzLSBSZWVtcGxhemEgMjAyMS0xMi0zMSBwb3IgbGEgZmVjaGEgZGVsIHByaW1lciBwYXJ0aWRvIGRlIGxhIGpvcm5hZGEgcXVlIGVzdHVkaWFtb3MNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHdvcmxkZm9vdGJhbGxSKQ0KDQojSnVnYW5kbyBjb24gRkJSRUYtLS0tLS0NCg0KY2xhc2lmaWNhY2lvbjwtIGdldF9zZWFzb25fdGVhbV9zdGF0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IiwgImxlYWd1ZV90YWJsZSIpICU+JSANCiAgc2VsZWN0KFNxdWFkLFJrLFB0cyx4RywgeEdBKSANCg0KZGF0b3M8LSBnZXRfbWF0Y2hfcmVzdWx0cygiRVNQIiwgIk0iLCAyMDIyLCAiMXN0IikNCg0KI1ZhbW9zIGEgdmVyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgZ2FuZSBlbCBWaWxsYXJyZWFsDQoNCnZlPC0gY2xhc2lmaWNhY2lvbiAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoIlZpbGxhcnJlYWwiLCAiQXRsw6l0aWNvIE1hZHJpZCIpKSAlPiUgI1BvbmVyIGxvcyBlcXVpcG9zIHF1ZSBxdWllcmFzIChMb2NhbCB5IFZpc2l0YW50ZSkNCiAgbXV0YXRlKG9yZGVuPSBjKDEsMikpICU+JSBzbGljZV9taW4ob3JkZW4sIG49MikgJT4lDQogIG11dGF0ZShEeEc9IHhHLSBsYWcoeEcpKSAlPiUgbXV0YXRlKERQdHM9IFB0cyAtIGxhZyhQdHMpKSAlPiUNCiAgbXV0YXRlKER4R0E9IHhHQSAtIGxhZyh4R0EpKSANCg0KI0lNUE9SVEFOVMONU0lNTywgY2FtYmlhciBsb3MgbsO6bWVyb3MsLS0+ICgxLDIpOiBTaSBlcXVpcG8gbG9jYWwgZXMgYWxmYWLDqXRpY2FtZW50ZSBzdXBlcmlvciBhbCBlcXVpcG8gdmlzaXRhbnRlIGVqOiBWaWxsYXJyZWFsPkF0bMOpdGljbyBNYWRyaWQ7IGVuIGNhc28gY29udHJhcmlvOiAoMiwxKQ0KDQoNCnBydWViYTwtIHZlICU+JSBtdXRhdGUocHJ1ZWJhID0gMCkgJT4lIA0KICBtdXRhdGUoIHBydWViYT0gaWZlbHNlKERQdHM+MTUsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKERQdHM8KC0xNSksIHBydWViYS0xLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4Rz4wLCBwcnVlYmErMSwgcHJ1ZWJhLTEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4Rz4xMCwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPCgtMTApLCBwcnVlYmEtMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEdBPjAsIHBydWViYSAtMSwgcHJ1ZWJhKzEpKQ0KDQojUG9uZXIgZWwgZXF1aXBvIExvY2FsIChFbiBhbWJvcykgDQojQ3VpZGFkbywgbG9zIGRhdG9zIHNvbiBkZWwgMjAyMS0xMi0zMSwgc2UgZGViZXLDrWEgcG9uZXIgbGEgZmVjaGEgZGUgbGEgw7psdGltYSBqb3JuYWRhDQoNCkxvY2FsdjwtIGRhdG9zICU+JSBmaWx0ZXIoSG9tZSA9PSAiVmlsbGFycmVhbCIpICU+JSBmaWx0ZXIoRGF0ZTwiMjAyMS0xMi0zMSIpICU+JQ0KICBzbGljZV9tYXgoRGF0ZSwgbj02KSAlPiUgc2VsZWN0KEhvbWUsIEhvbWVHb2FscywgQXdheSwgQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShHYW5hZG9yPSBIb21lR29hbHMtQXdheUdvYWxzKSAlPiUgDQogIG11dGF0ZShSZXN1bHRhZG8gPSBpZmVsc2UoR2FuYWRvciA+PTEsICIxIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyggaWZlbHNlKFJlc3VsdGFkbyA8PSAtMSwgIi0xIiwgUmVzdWx0YWRvKSkpICU+JQ0KICBzdW1tYXJpc2UoTG9jYWx2PXN1bShSZXN1bHRhZG8pKSAlPiUgbXV0YXRlKFNxdWFkPSAiVmlsbGFycmVhbCIpDQoNClZpc2l0YW50ZXYgPC0gZGF0b3MgJT4lIGZpbHRlcihBd2F5PT0iVmlsbGFycmVhbCIpJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIi0xIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyhpZmVsc2UoUmVzdWx0YWRvID49IDEsICIxIiwgUmVzdWx0YWRvKSkpICU+JSANCiAgc3VtbWFyaXNlKFZpc2l0YW50ZXY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJWaWxsYXJyZWFsIikNCg0KI1BvbmVyIGVsIGVxdWlwbyB2aXNpdGFudGUgKEVuIGFtYm9zKSANCiNDdWlkYWRvLCBsb3MgZGF0b3Mgc29uIGRlbCAyMDIxLTEyLTMxLCBzZSBkZWJlcsOtYSBwb25lciBsYSBmZWNoYSBkZSBsYSDDumx0aW1hIGpvcm5hZGENCg0KTG9jYWxlPC0gZGF0b3MgJT4lIGZpbHRlcihIb21lID09ICJBdGzDqXRpY28gTWFkcmlkIikgJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIjEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKCBpZmVsc2UoUmVzdWx0YWRvIDw9IC0xLCAiLTEiLCBSZXN1bHRhZG8pKSkgJT4lDQogIHN1bW1hcmlzZShMb2NhbHY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJBdGzDqXRpY28gTWFkcmlkIikNCg0KVmlzaXRhbnRlZSA8LSBkYXRvcyAlPiUgZmlsdGVyKEF3YXk9PSJBdGzDqXRpY28gTWFkcmlkIiklPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiLTEiLCBHYW5hZG9yKSkgJT4lDQogIG11dGF0ZShSZXN1bHRhZG8gPSBhcy5udW1lcmljKGlmZWxzZShSZXN1bHRhZG8gPj0gMSwgIjEiLCBSZXN1bHRhZG8pKSkgJT4lIA0KICBzdW1tYXJpc2UoVmlzaXRhbnRlZT1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIkF0bMOpdGljbyBNYWRyaWQiKQ0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsTG9jYWx2KSANCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgVmlzaXRhbnRlZSkNCnBydWViYTwtcHJ1ZWJhICU+JSBtdXRhdGUoREdhbj0gTG9jYWx2LWxhZyhWaXNpdGFudGVlKSkgJT4lDQogIG11dGF0ZShwcnVlYmE9IGlmZWxzZShER2FuPjAsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoREdhbjwwLCBwcnVlYmEtMSwgcHJ1ZWJhKSkNCg0KDQojQWhvcmEgdmFtb3MgYSBjcmVhciB1bmEgdmFyaWFibGUgcXVlIHNlYSBsYSBzdW1hIGRlIHRvZGFzIGxhcyB2YXJpYWJsZXMgZGUgZGVmZW5zYTogcHJlc2nDs24gY29uIMOpeGl0bywgYmxvcXVlYXIgdW4gcGFzZS4uLiBwZXJvIGNvbW8gdGllbmVuIGRpc3RpbnRhcyBtYWduaXR1ZGVzLCB2YW1vcyBhIHRpcGlmaWNhciBsYSB2YXJpYWJsZSBwYXJhIHBvZGVyIHN1bWFybGFzDQoNCnZhbW9zPC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gICJkZWZlbnNlIikNCg0KDQp2YW1vc1Q8LSB2YW1vcyAlPiUgc2VsZWN0KFNxdWFkLFRrbFdfVGFja2xlcywgU3VjY19QcmVzc3VyZXMsIEJsb2Nrc19CbG9ja3MpICU+JSANCiAgbXV0YXRlKFRrbFdfVGFja2xlcyA9IChUa2xXX1RhY2tsZXMtIG1lYW4oVGtsV19UYWNrbGVzKSkvc2QoVGtsV19UYWNrbGVzKSkgJT4lDQogIG11dGF0ZShTdWNjX1ByZXNzdXJlcyA9IChTdWNjX1ByZXNzdXJlcy0gbWVhbihTdWNjX1ByZXNzdXJlcykpL3NkKFN1Y2NfUHJlc3N1cmVzKSkgJT4lDQogIG11dGF0ZShCbG9ja3NfQmxvY2tzID0gKEJsb2Nrc19CbG9ja3MtIG1lYW4oQmxvY2tzX0Jsb2NrcykpL3NkKEJsb2Nrc19CbG9ja3MpKSAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIEF0bMOpdGljbyBNYWRyaWQiLCAiVmlsbGFycmVhbCIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBBdGzDqXRpY28gTWFkcmlkIiwgIkF0bMOpdGljbyBNYWRyaWQiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUKSAlPiUgDQogIG11dGF0ZShEZGVmPSAoVGtsV19UYWNrbGVzIC0gbGFnKFRrbFdfVGFja2xlcykpICsgKFN1Y2NfUHJlc3N1cmVzIC0gbGFnKFN1Y2NfUHJlc3N1cmVzKSkrIChCbG9ja3NfQmxvY2tzLSBsYWcoQmxvY2tzX0Jsb2NrcykpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRlZiA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojVmFtb3MgYSBoYWNlciBsbyBtaXNtbyBjb24gbG9zIHBhc2VzOg0KDQp2YW1vczI8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAicGFzc2luZyIpDQoNCg0KdmFtb3NUMjwtIHZhbW9zMiAlPiUgc2VsZWN0KFNxdWFkLENtcF9wZXJjZW50X1RvdGFsLEFzdCxBX21pbnVzX3hBLCBGaW5hbF9UaGlyZCwgUHJvZyklPiUgDQogIG11dGF0ZShDbXBfcGVyY2VudF9Ub3RhbCA9IChDbXBfcGVyY2VudF9Ub3RhbC0gbWVhbihDbXBfcGVyY2VudF9Ub3RhbCkpL3NkKENtcF9wZXJjZW50X1RvdGFsKSkgJT4lDQogIG11dGF0ZShBc3QgPSAoQXN0LSBtZWFuKEFzdCkpL3NkKEFzdCkpICU+JQ0KICBtdXRhdGUoQV9taW51c194QSA9IChBX21pbnVzX3hBLSBtZWFuKEFfbWludXNfeEEpKS9zZChBX21pbnVzX3hBKSkgJT4lIA0KICBtdXRhdGUoRmluYWxfVGhpcmQgPSAoRmluYWxfVGhpcmQtIG1lYW4oRmluYWxfVGhpcmQpKS9zZChGaW5hbF9UaGlyZCkpICU+JQ0KICBtdXRhdGUoUHJvZyA9IChQcm9nLSBtZWFuKFByb2cpKS9zZChQcm9nKSkgJT4lDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIEF0bMOpdGljbyBNYWRyaWQiLCAiVmlsbGFycmVhbCIpKSAlPiUgI3ZzIGVzIGVsIGVxdWlwbyB2aXNpdGFudGUgeSBlbCBvdHJvIGVsIGVxdWlwbyBsb2NhbA0KICBtdXRhdGUoU3F1YWQgPSBpZmVsc2UoU3F1YWQ9PSJ2cyBBdGzDqXRpY28gTWFkcmlkIiwgIkF0bMOpdGljbyBNYWRyaWQiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDIpICU+JSANCiAgbXV0YXRlKERwYXM9IChDbXBfcGVyY2VudF9Ub3RhbCAtIGxhZyhDbXBfcGVyY2VudF9Ub3RhbCkpICsgKEFzdCAtIGxhZyhBc3QpKSsgKEFfbWludXNfeEEtIGxhZyhBX21pbnVzX3hBKSkrIChGaW5hbF9UaGlyZCAtIGxhZyhGaW5hbF9UaGlyZCkpKyAoUHJvZy0gbGFnKFByb2cpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERwYXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xvIG1pc21vIGNvbiBsb3MgZGlzcGFyb3M6DQoNCnZhbW9zMzwtZ2V0X3NlYXNvbl90ZWFtX3N0YXRzKGNvdW50cnkgPSAiRVNQIiwgZ2VuZGVyID0gIk0iLCBzZWFzb25fZW5kX3llYXIgPSAyMDIyLHRpZXI9IjFzdCIsIHN0YXRfdHlwZSA9ICJzaG9vdGluZyIpDQoNCg0KdmFtb3NUMzwtIHZhbW9zMyAlPiUgc2VsZWN0KFNxdWFkLEdsc19TdGFuZGFyZCwgU29UX1N0YW5kYXJkLEdfcGVyX1NoX1N0YW5kYXJkKSAgJT4lIA0KICBtdXRhdGUoR2xzX1N0YW5kYXJkID0gKEdsc19TdGFuZGFyZC0gbWVhbihHbHNfU3RhbmRhcmQpKS9zZChHbHNfU3RhbmRhcmQpKSAlPiUNCiAgbXV0YXRlKFNvVF9TdGFuZGFyZCA9IChTb1RfU3RhbmRhcmQtIG1lYW4oU29UX1N0YW5kYXJkKSkvc2QoU29UX1N0YW5kYXJkKSkgJT4lDQogIG11dGF0ZShHX3Blcl9TaF9TdGFuZGFyZCA9IChHX3Blcl9TaF9TdGFuZGFyZC0gbWVhbihHX3Blcl9TaF9TdGFuZGFyZCkpL3NkKEdfcGVyX1NoX1N0YW5kYXJkKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBBdGzDqXRpY28gTWFkcmlkIiwgIlZpbGxhcnJlYWwiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgQXRsw6l0aWNvIE1hZHJpZCIsICJBdGzDqXRpY28gTWFkcmlkIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QzKSAlPiUgDQogIG11dGF0ZShEZGlzPSAoR2xzX1N0YW5kYXJkIC0gbGFnKEdsc19TdGFuZGFyZCkpICsgKFNvVF9TdGFuZGFyZCAtIGxhZyhTb1RfU3RhbmRhcmQpKSsgKEdfcGVyX1NoX1N0YW5kYXJkLSBsYWcoR19wZXJfU2hfU3RhbmRhcmQpKSkNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBtdXRhdGUocHJ1ZWJhID0gaWZlbHNlKERkaXMgPiAwLCBwcnVlYmErMSAsIHBydWViYS0xKSkNCg0KI0xpbXBpbyB1biBwb3F1aXRvIGVsIERGIHBydWViYToNCg0KcHJ1ZWJhPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIG9yZGVuLCBwcnVlYmEpDQoNCg0KI0hhZ28gbG8gbWlzbW8gY29uIGxhIHBvc2VzacOzbjoNCg0KdmFtb3M0PC1nZXRfc2Vhc29uX3RlYW1fc3RhdHMoY291bnRyeSA9ICJFU1AiLCBnZW5kZXIgPSAiTSIsIHNlYXNvbl9lbmRfeWVhciA9IDIwMjIsdGllcj0iMXN0Iiwgc3RhdF90eXBlID0gInBvc3Nlc3Npb24iKQ0KDQoNCnZhbW9zVDQ8LSB2YW1vczQgJT4lIHNlbGVjdChTcXVhZCwgUG9zcyxTdWNjX3BlcmNlbnRfRHJpYmJsZXMsIEZpbmFsX1RoaXJkX0NhcnJpZXMpJT4lIA0KICBtdXRhdGUoUG9zcyA9IChQb3NzLSBtZWFuKFBvc3MpKS9zZChQb3NzKSkgJT4lDQogIG11dGF0ZShTdWNjX3BlcmNlbnRfRHJpYmJsZXMgPSAoU3VjY19wZXJjZW50X0RyaWJibGVzLSBtZWFuKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpL3NkKFN1Y2NfcGVyY2VudF9EcmliYmxlcykpICU+JQ0KICBtdXRhdGUoRmluYWxfVGhpcmRfQ2FycmllcyA9IChGaW5hbF9UaGlyZF9DYXJyaWVzLSBtZWFuKEZpbmFsX1RoaXJkX0NhcnJpZXMpKS9zZChGaW5hbF9UaGlyZF9DYXJyaWVzKSkgJT4lIA0KICBmaWx0ZXIoU3F1YWQgJWluJSBjKCJ2cyBBdGzDqXRpY28gTWFkcmlkIiwgIlZpbGxhcnJlYWwiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgQXRsw6l0aWNvIE1hZHJpZCIsICJBdGzDqXRpY28gTWFkcmlkIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUNCkgJT4lIA0KICBtdXRhdGUoRGRpcz0gKFBvc3MgLSBsYWcoUG9zcykpICsgKFN1Y2NfcGVyY2VudF9EcmliYmxlcyAtIGxhZyhTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKSsgKEZpbmFsX1RoaXJkX0NhcnJpZXMtIGxhZyhGaW5hbF9UaGlyZF9DYXJyaWVzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGlzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCg0KUmVzdWx0YWRvX2ZpbmFsPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIHBydWViYSkgJT4lDQogIG11dGF0ZShHYW5hZG9yID0gaWZlbHNlKHBydWViYSA+IDEsICJFcXVpcG8gbG9jYWwiLCBwcnVlYmEpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTEsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09KC0xKSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0wLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE8KC0xKSwgIkVxdWlwbyB2aXNpdGFudGUiLCBHYW5hZG9yKSkNCg0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmE8LVJlc3VsdGFkb19maW5hbCAlPiUgZmlsdGVyKCFpcy5uYShHYW5hZG9yKSkgJT4lIHNlbGVjdChwcnVlYmEsIEdhbmFkb3IpDQoNCmthYmxlKGEpICU+JQ0KICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQsIGJvcmRlcl9yaWdodCA9IFQpICU+JQ0KICBjb2x1bW5fc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNGQ0ZFOUQiKQ0KDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqRXNwYW55b2wtRWxjaGUqKjwvRk9OVD4NCg0KYGBge3IsZWNobz1GQUxTRX0NCiNJbnRydWNjaW9uZXM6DQojMS0gSGFjZXIgQ3RybCtmIHkgcmVlbXBsYXphciAoUmVwbGFjZSk6IEVzcGFueW9sIHBvciBlbCBlcXVpcG8gbG9jYWwgeSBFbGNoZSBwb3IgZWwgZXF1aXBvIFZpc2l0YW50ZQ0KIzItIE1vZGlmaWNpYXIgbGEgbMOtbmVhIDI0DQojMy0gUmVlbXBsYXphIDIwMjEtMTItMzEgcG9yIGxhIGZlY2hhIGRlbCBwcmltZXIgcGFydGlkbyBkZSBsYSBqb3JuYWRhIHF1ZSBlc3R1ZGlhbW9zDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh3b3JsZGZvb3RiYWxsUikNCg0KI0p1Z2FuZG8gY29uIEZCUkVGLS0tLS0tDQoNCmNsYXNpZmljYWNpb248LSBnZXRfc2Vhc29uX3RlYW1fc3RhdHMoIkVTUCIsICJNIiwgMjAyMiwgIjFzdCIsICJsZWFndWVfdGFibGUiKSAlPiUgDQogIHNlbGVjdChTcXVhZCxSayxQdHMseEcsIHhHQSkgDQoNCmRhdG9zPC0gZ2V0X21hdGNoX3Jlc3VsdHMoIkVTUCIsICJNIiwgMjAyMiwgIjFzdCIpDQoNCiNWYW1vcyBhIHZlciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGdhbmUgZWwgRXNwYW55b2wNCg0KdmU8LSBjbGFzaWZpY2FjaW9uICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygiRXNwYW55b2wiLCAiRWxjaGUiKSkgJT4lICNQb25lciBsb3MgZXF1aXBvcyBxdWUgcXVpZXJhcyAoTG9jYWwgeSBWaXNpdGFudGUpDQogIG11dGF0ZShvcmRlbj0gYygxLDIpKSAlPiUgc2xpY2VfbWluKG9yZGVuLCBuPTIpICU+JQ0KICBtdXRhdGUoRHhHPSB4Ry0gbGFnKHhHKSkgJT4lIG11dGF0ZShEUHRzPSBQdHMgLSBsYWcoUHRzKSkgJT4lDQogIG11dGF0ZShEeEdBPSB4R0EgLSBsYWcoeEdBKSkgDQoNCiNJTVBPUlRBTlTDjVNJTU8sIGNhbWJpYXIgbG9zIG7Dum1lcm9zLC0tPiAoMSwyKTogU2kgZXF1aXBvIGxvY2FsIGVzIGFsZmFiw6l0aWNhbWVudGUgc3VwZXJpb3IgYWwgZXF1aXBvIHZpc2l0YW50ZSBlajogRXNwYW55b2w+RWxjaGU7IGVuIGNhc28gY29udHJhcmlvOiAoMiwxKQ0KDQoNCnBydWViYTwtIHZlICU+JSBtdXRhdGUocHJ1ZWJhID0gMCkgJT4lIA0KICBtdXRhdGUoIHBydWViYT0gaWZlbHNlKERQdHM+MTUsIHBydWViYSsxLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKERQdHM8KC0xNSksIHBydWViYS0xLCBwcnVlYmEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4Rz4wLCBwcnVlYmErMSwgcHJ1ZWJhLTEpLA0KICAgICAgICAgIHBydWViYT0gaWZlbHNlKER4Rz4xMCwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICAgcHJ1ZWJhPSBpZmVsc2UoRHhHPCgtMTApLCBwcnVlYmEtMSwgcHJ1ZWJhKSwNCiAgICAgICAgICBwcnVlYmE9IGlmZWxzZShEeEdBPjAsIHBydWViYSAtMSwgcHJ1ZWJhKzEpKQ0KDQojUG9uZXIgZWwgZXF1aXBvIExvY2FsIChFbiBhbWJvcykgDQojQ3VpZGFkbywgbG9zIGRhdG9zIHNvbiBkZWwgMjAyMS0xMi0zMSwgc2UgZGViZXLDrWEgcG9uZXIgbGEgZmVjaGEgZGUgbGEgw7psdGltYSBqb3JuYWRhDQoNCkxvY2FsdjwtIGRhdG9zICU+JSBmaWx0ZXIoSG9tZSA9PSAiRXNwYW55b2wiKSAlPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoIGlmZWxzZShSZXN1bHRhZG8gPD0gLTEsICItMSIsIFJlc3VsdGFkbykpKSAlPiUNCiAgc3VtbWFyaXNlKExvY2Fsdj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIkVzcGFueW9sIikNCg0KVmlzaXRhbnRldiA8LSBkYXRvcyAlPiUgZmlsdGVyKEF3YXk9PSJFc3BhbnlvbCIpJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIi0xIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyhpZmVsc2UoUmVzdWx0YWRvID49IDEsICIxIiwgUmVzdWx0YWRvKSkpICU+JSANCiAgc3VtbWFyaXNlKFZpc2l0YW50ZXY9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJFc3BhbnlvbCIpDQoNCiNQb25lciBlbCBlcXVpcG8gdmlzaXRhbnRlIChFbiBhbWJvcykgDQojQ3VpZGFkbywgbG9zIGRhdG9zIHNvbiBkZWwgMjAyMS0xMi0zMSwgc2UgZGViZXLDrWEgcG9uZXIgbGEgZmVjaGEgZGUgbGEgw7psdGltYSBqb3JuYWRhDQoNCkxvY2FsZTwtIGRhdG9zICU+JSBmaWx0ZXIoSG9tZSA9PSAiRWxjaGUiKSAlPiUgZmlsdGVyKERhdGU8IjIwMjEtMTItMzEiKSAlPiUNCiAgc2xpY2VfbWF4KERhdGUsIG49NikgJT4lIHNlbGVjdChIb21lLCBIb21lR29hbHMsIEF3YXksIEF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoR2FuYWRvcj0gSG9tZUdvYWxzLUF3YXlHb2FscykgJT4lIA0KICBtdXRhdGUoUmVzdWx0YWRvID0gaWZlbHNlKEdhbmFkb3IgPj0xLCAiMSIsIEdhbmFkb3IpKSAlPiUNCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGFzLm51bWVyaWMoIGlmZWxzZShSZXN1bHRhZG8gPD0gLTEsICItMSIsIFJlc3VsdGFkbykpKSAlPiUNCiAgc3VtbWFyaXNlKExvY2Fsdj1zdW0oUmVzdWx0YWRvKSkgJT4lIG11dGF0ZShTcXVhZD0gIkVsY2hlIikNCg0KVmlzaXRhbnRlZSA8LSBkYXRvcyAlPiUgZmlsdGVyKEF3YXk9PSJFbGNoZSIpJT4lIGZpbHRlcihEYXRlPCIyMDIxLTEyLTMxIikgJT4lDQogIHNsaWNlX21heChEYXRlLCBuPTYpICU+JSBzZWxlY3QoSG9tZSwgSG9tZUdvYWxzLCBBd2F5LCBBd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKEdhbmFkb3I9IEhvbWVHb2Fscy1Bd2F5R29hbHMpICU+JSANCiAgbXV0YXRlKFJlc3VsdGFkbyA9IGlmZWxzZShHYW5hZG9yID49MSwgIi0xIiwgR2FuYWRvcikpICU+JQ0KICBtdXRhdGUoUmVzdWx0YWRvID0gYXMubnVtZXJpYyhpZmVsc2UoUmVzdWx0YWRvID49IDEsICIxIiwgUmVzdWx0YWRvKSkpICU+JSANCiAgc3VtbWFyaXNlKFZpc2l0YW50ZWU9c3VtKFJlc3VsdGFkbykpICU+JSBtdXRhdGUoU3F1YWQ9ICJFbGNoZSIpDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSxMb2NhbHYpIA0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCBWaXNpdGFudGVlKQ0KcHJ1ZWJhPC1wcnVlYmEgJT4lIG11dGF0ZShER2FuPSBMb2NhbHYtbGFnKFZpc2l0YW50ZWUpKSAlPiUNCiAgbXV0YXRlKHBydWViYT0gaWZlbHNlKERHYW4+MCwgcHJ1ZWJhKzEsIHBydWViYSksDQogICAgICAgICBwcnVlYmE9IGlmZWxzZShER2FuPDAsIHBydWViYS0xLCBwcnVlYmEpKQ0KDQoNCiNBaG9yYSB2YW1vcyBhIGNyZWFyIHVuYSB2YXJpYWJsZSBxdWUgc2VhIGxhIHN1bWEgZGUgdG9kYXMgbGFzIHZhcmlhYmxlcyBkZSBkZWZlbnNhOiBwcmVzacOzbiBjb24gw6l4aXRvLCBibG9xdWVhciB1biBwYXNlLi4uIHBlcm8gY29tbyB0aWVuZW4gZGlzdGludGFzIG1hZ25pdHVkZXMsIHZhbW9zIGEgdGlwaWZpY2FyIGxhIHZhcmlhYmxlIHBhcmEgcG9kZXIgc3VtYXJsYXMNCg0KdmFtb3M8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAgImRlZmVuc2UiKQ0KDQoNCnZhbW9zVDwtIHZhbW9zICU+JSBzZWxlY3QoU3F1YWQsVGtsV19UYWNrbGVzLCBTdWNjX1ByZXNzdXJlcywgQmxvY2tzX0Jsb2NrcykgJT4lIA0KICBtdXRhdGUoVGtsV19UYWNrbGVzID0gKFRrbFdfVGFja2xlcy0gbWVhbihUa2xXX1RhY2tsZXMpKS9zZChUa2xXX1RhY2tsZXMpKSAlPiUNCiAgbXV0YXRlKFN1Y2NfUHJlc3N1cmVzID0gKFN1Y2NfUHJlc3N1cmVzLSBtZWFuKFN1Y2NfUHJlc3N1cmVzKSkvc2QoU3VjY19QcmVzc3VyZXMpKSAlPiUNCiAgbXV0YXRlKEJsb2Nrc19CbG9ja3MgPSAoQmxvY2tzX0Jsb2Nrcy0gbWVhbihCbG9ja3NfQmxvY2tzKSkvc2QoQmxvY2tzX0Jsb2NrcykpICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgRWxjaGUiLCAiRXNwYW55b2wiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgRWxjaGUiLCAiRWxjaGUiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUKSAlPiUgDQogIG11dGF0ZShEZGVmPSAoVGtsV19UYWNrbGVzIC0gbGFnKFRrbFdfVGFja2xlcykpICsgKFN1Y2NfUHJlc3N1cmVzIC0gbGFnKFN1Y2NfUHJlc3N1cmVzKSkrIChCbG9ja3NfQmxvY2tzLSBsYWcoQmxvY2tzX0Jsb2NrcykpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRlZiA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojVmFtb3MgYSBoYWNlciBsbyBtaXNtbyBjb24gbG9zIHBhc2VzOg0KDQp2YW1vczI8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAicGFzc2luZyIpDQoNCg0KdmFtb3NUMjwtIHZhbW9zMiAlPiUgc2VsZWN0KFNxdWFkLENtcF9wZXJjZW50X1RvdGFsLEFzdCxBX21pbnVzX3hBLCBGaW5hbF9UaGlyZCwgUHJvZyklPiUgDQogIG11dGF0ZShDbXBfcGVyY2VudF9Ub3RhbCA9IChDbXBfcGVyY2VudF9Ub3RhbC0gbWVhbihDbXBfcGVyY2VudF9Ub3RhbCkpL3NkKENtcF9wZXJjZW50X1RvdGFsKSkgJT4lDQogIG11dGF0ZShBc3QgPSAoQXN0LSBtZWFuKEFzdCkpL3NkKEFzdCkpICU+JQ0KICBtdXRhdGUoQV9taW51c194QSA9IChBX21pbnVzX3hBLSBtZWFuKEFfbWludXNfeEEpKS9zZChBX21pbnVzX3hBKSkgJT4lIA0KICBtdXRhdGUoRmluYWxfVGhpcmQgPSAoRmluYWxfVGhpcmQtIG1lYW4oRmluYWxfVGhpcmQpKS9zZChGaW5hbF9UaGlyZCkpICU+JQ0KICBtdXRhdGUoUHJvZyA9IChQcm9nLSBtZWFuKFByb2cpKS9zZChQcm9nKSkgJT4lDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIEVsY2hlIiwgIkVzcGFueW9sIikpICU+JSAjdnMgZXMgZWwgZXF1aXBvIHZpc2l0YW50ZSB5IGVsIG90cm8gZWwgZXF1aXBvIGxvY2FsDQogIG11dGF0ZShTcXVhZCA9IGlmZWxzZShTcXVhZD09InZzIEVsY2hlIiwgIkVsY2hlIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KcHJ1ZWJhPC1mdWxsX2pvaW4ocHJ1ZWJhLCB2YW1vc1QyKSAlPiUgDQogIG11dGF0ZShEcGFzPSAoQ21wX3BlcmNlbnRfVG90YWwgLSBsYWcoQ21wX3BlcmNlbnRfVG90YWwpKSArIChBc3QgLSBsYWcoQXN0KSkrIChBX21pbnVzX3hBLSBsYWcoQV9taW51c194QSkpKyAoRmluYWxfVGhpcmQgLSBsYWcoRmluYWxfVGhpcmQpKSsgKFByb2ctIGxhZyhQcm9nKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEcGFzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCiNMbyBtaXNtbyBjb24gbG9zIGRpc3Bhcm9zOg0KDQp2YW1vczM8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAic2hvb3RpbmciKQ0KDQoNCnZhbW9zVDM8LSB2YW1vczMgJT4lIHNlbGVjdChTcXVhZCxHbHNfU3RhbmRhcmQsIFNvVF9TdGFuZGFyZCxHX3Blcl9TaF9TdGFuZGFyZCkgICU+JSANCiAgbXV0YXRlKEdsc19TdGFuZGFyZCA9IChHbHNfU3RhbmRhcmQtIG1lYW4oR2xzX1N0YW5kYXJkKSkvc2QoR2xzX1N0YW5kYXJkKSkgJT4lDQogIG11dGF0ZShTb1RfU3RhbmRhcmQgPSAoU29UX1N0YW5kYXJkLSBtZWFuKFNvVF9TdGFuZGFyZCkpL3NkKFNvVF9TdGFuZGFyZCkpICU+JQ0KICBtdXRhdGUoR19wZXJfU2hfU3RhbmRhcmQgPSAoR19wZXJfU2hfU3RhbmRhcmQtIG1lYW4oR19wZXJfU2hfU3RhbmRhcmQpKS9zZChHX3Blcl9TaF9TdGFuZGFyZCkpICU+JSANCiAgZmlsdGVyKFNxdWFkICVpbiUgYygidnMgRWxjaGUiLCAiRXNwYW55b2wiKSkgJT4lICN2cyBlcyBlbCBlcXVpcG8gdmlzaXRhbnRlIHkgZWwgb3RybyBlbCBlcXVpcG8gbG9jYWwNCiAgbXV0YXRlKFNxdWFkID0gaWZlbHNlKFNxdWFkPT0idnMgRWxjaGUiLCAiRWxjaGUiLCBTcXVhZCkpICNFc3RvIGVzIHVuIGNvw7Fhem8gcGVybyBoYXkgcXVlIGNhbWJpYXJsbw0KDQpwcnVlYmE8LWZ1bGxfam9pbihwcnVlYmEsIHZhbW9zVDMpICU+JSANCiAgbXV0YXRlKERkaXM9IChHbHNfU3RhbmRhcmQgLSBsYWcoR2xzX1N0YW5kYXJkKSkgKyAoU29UX1N0YW5kYXJkIC0gbGFnKFNvVF9TdGFuZGFyZCkpKyAoR19wZXJfU2hfU3RhbmRhcmQtIGxhZyhHX3Blcl9TaF9TdGFuZGFyZCkpKQ0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIG11dGF0ZShwcnVlYmEgPSBpZmVsc2UoRGRpcyA+IDAsIHBydWViYSsxICwgcHJ1ZWJhLTEpKQ0KDQojTGltcGlvIHVuIHBvcXVpdG8gZWwgREYgcHJ1ZWJhOg0KDQpwcnVlYmE8LSBwcnVlYmEgJT4lIHNlbGVjdChTcXVhZCwgb3JkZW4sIHBydWViYSkNCg0KDQojSGFnbyBsbyBtaXNtbyBjb24gbGEgcG9zZXNpw7NuOg0KDQp2YW1vczQ8LWdldF9zZWFzb25fdGVhbV9zdGF0cyhjb3VudHJ5ID0gIkVTUCIsIGdlbmRlciA9ICJNIiwgc2Vhc29uX2VuZF95ZWFyID0gMjAyMix0aWVyPSIxc3QiLCBzdGF0X3R5cGUgPSAicG9zc2Vzc2lvbiIpDQoNCg0KdmFtb3NUNDwtIHZhbW9zNCAlPiUgc2VsZWN0KFNxdWFkLCBQb3NzLFN1Y2NfcGVyY2VudF9EcmliYmxlcywgRmluYWxfVGhpcmRfQ2FycmllcyklPiUgDQogIG11dGF0ZShQb3NzID0gKFBvc3MtIG1lYW4oUG9zcykpL3NkKFBvc3MpKSAlPiUNCiAgbXV0YXRlKFN1Y2NfcGVyY2VudF9EcmliYmxlcyA9IChTdWNjX3BlcmNlbnRfRHJpYmJsZXMtIG1lYW4oU3VjY19wZXJjZW50X0RyaWJibGVzKSkvc2QoU3VjY19wZXJjZW50X0RyaWJibGVzKSkgJT4lDQogIG11dGF0ZShGaW5hbF9UaGlyZF9DYXJyaWVzID0gKEZpbmFsX1RoaXJkX0NhcnJpZXMtIG1lYW4oRmluYWxfVGhpcmRfQ2FycmllcykpL3NkKEZpbmFsX1RoaXJkX0NhcnJpZXMpKSAlPiUgDQogIGZpbHRlcihTcXVhZCAlaW4lIGMoInZzIEVsY2hlIiwgIkVzcGFueW9sIikpICU+JSAjdnMgZXMgZWwgZXF1aXBvIHZpc2l0YW50ZSB5IGVsIG90cm8gZWwgZXF1aXBvIGxvY2FsDQogIG11dGF0ZShTcXVhZCA9IGlmZWxzZShTcXVhZD09InZzIEVsY2hlIiwgIkVsY2hlIiwgU3F1YWQpKSAjRXN0byBlcyB1biBjb8OxYXpvIHBlcm8gaGF5IHF1ZSBjYW1iaWFybG8NCg0KDQoNCnBydWViYTwtZnVsbF9qb2luKHBydWViYSwgdmFtb3NUNCkgJT4lIA0KICBtdXRhdGUoRGRpcz0gKFBvc3MgLSBsYWcoUG9zcykpICsgKFN1Y2NfcGVyY2VudF9EcmliYmxlcyAtIGxhZyhTdWNjX3BlcmNlbnRfRHJpYmJsZXMpKSsgKEZpbmFsX1RoaXJkX0NhcnJpZXMtIGxhZyhGaW5hbF9UaGlyZF9DYXJyaWVzKSkpDQoNCnBydWViYTwtIHBydWViYSAlPiUgbXV0YXRlKHBydWViYSA9IGlmZWxzZShEZGlzID4gMCwgcHJ1ZWJhKzEgLCBwcnVlYmEtMSkpDQoNCg0KUmVzdWx0YWRvX2ZpbmFsPC0gcHJ1ZWJhICU+JSBzZWxlY3QoU3F1YWQsIHBydWViYSkgJT4lDQogIG11dGF0ZShHYW5hZG9yID0gaWZlbHNlKHBydWViYSA+IDEsICJFcXVpcG8gbG9jYWwiLCBwcnVlYmEpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE9PTEsICJOYWRhIGNvbmNsdXllbnRlIiwgR2FuYWRvciksDQogICAgICAgICBHYW5hZG9yID0gaWZlbHNlKHBydWViYT09KC0xKSwgIk5hZGEgY29uY2x1eWVudGUiLCBHYW5hZG9yKSwNCiAgICAgICAgIEdhbmFkb3IgPSBpZmVsc2UocHJ1ZWJhPT0wLCAiTmFkYSBjb25jbHV5ZW50ZSIsIEdhbmFkb3IpLA0KICAgICAgICAgR2FuYWRvciA9IGlmZWxzZShwcnVlYmE8KC0xKSwgIkVxdWlwbyB2aXNpdGFudGUiLCBHYW5hZG9yKSkNCg0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmE8LVJlc3VsdGFkb19maW5hbCAlPiUgZmlsdGVyKCFpcy5uYShHYW5hZG9yKSkgJT4lIHNlbGVjdChwcnVlYmEsIEdhbmFkb3IpDQoNCmthYmxlKGEpICU+JQ0KICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQsIGJvcmRlcl9yaWdodCA9IFQpICU+JQ0KICBjb2x1bW5fc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNGQ0ZFOUQiKQ0KDQpgYGANCg0KDQoNCiMgNy4gVHJhYmFqb3MgZW4gbG9zIHF1ZSB0ZSBoYXMgYmFzYWRvDQoNCkxvcyBkb3MgdHJhYmFqb3MgZW4gbG9zIHF1ZSBtZSBoZSBpbnNwaXJhZG8gaGFuIHNpZG86DQoNCi0gW0RpdmVyc29zIGFuw6FsaXNpcyBkZSBEYW5pZWwgUmVkb25kb10oaHR0cHM6Ly9kYW5pZWxyZWRvbmRvLmNvbS90YWdzL2Z1dGJvbC8pDQotIFtFamVtcGxvcyBkZSBTb2NjZXJtYXRpY3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9Kb0dhbGwvc29jY2VybWF0aWNzKS4gRW4gZXN0ZSBjYXNvLCBubyB1c8OpIGVzZSBwYXF1ZXRlLCBwZXJvIG1lIGF5dWRhcm9uIGxvcyBlamVtcGxvcyBxdWUgdmVuw61hbiBlbiBHaXRodWIuDQoNCg0KDQojIDguIFJFQ1VFUkRBISEhDQoNCg0KPGRpdiBjbGFzcyA9ICJjYWphLW1lZGl1bS1hcXVhbWFyaW5lIj4NClJlY3VlcmRhIHF1ZSAqKnRpZW5lcyBxdWUgbWFuZGFybWUgdW4gbWFpbCoqIGNvbiB0dSBub21icmUsIHVzdWFyaW8gZGUgR2l0aHViIHkgbm9tYnJlIGRlIHR1IHRyYWJham8gDQo8L2Rpdj4NCg0KPGJyPg0KDQo8ZGl2IGNsYXNzID0gImNhamEtY3JpbXNvbiI+DQpSZWN1ZXJkYSBxdWUgZWwgcmVwbyBkZSBHaXRodWIgKipzZSBoYSBkZSBsbGFtYXIgRVhBQ1RBTUVOVEUqKiAidHJhYmFqb19CaWdEYXRhIiAgDQo8L2Rpdj4NCg0KPGJyPg0KDQo8ZGl2IGNsYXNzID0gImNhamEtZGFya2toYWtpIj4NClBvciBmYXZvciwgKipubyBjYW1iaWVzIGVsIHByaW1lciBww6FycmFmbyoqLiBTaXJ2ZSBwYXJhIGRhciBjb250ZXh0byBhbCB0cmFiYWpvIHkgcmVtaXRpciBhIGxvcyBwb3RlbmNpYWxlcyBsZWN0b3JlcyBhIGxhIHdlYiBkZWwgY3Vyc28geSBwb2RlciB2ZXIgbG9zIG90cm9zIHRyYWJham9zLiBCdWVubywgc2kgcXVlIGhhcyBkZSBjYW1iaWFyIGFsZ286ICoqaGFzIGRlIHN1dGl0dWlyICJwZXJlenA0NCIgcG9yIHR1IHVzdWFyaW8gZGUgR2l0aHViKiosIHRhbnRvIGVuIGVsIGFyY2hpdm8gaW5kZXguUm1kIGNvbW8gZW4gZWwgUmVhZG1lLlJtZA0KPC9kaXY+DQoNCg0KPGJyPg0KDQo8ZGl2IGNsYXNzID0gImNhamEtbGluZWEtdmVyZGUiPg0KUu+4j2VjdWVyZGEsIGVsIDcgZGUgZW5lcm8gZmVjaGEgbMOtbWl0ZSBwYXJhIGxhIGVudHJlZ2EgLihQZXJkw7NuLi4uKQ0KPC9kaXY+DQoNCg0KPGJyPg0KDQojIDkuIEJpYmxpb2dyYWbDrWENCg0KLSBbQ3JhbiBwYXJhIGxvcyBwYXF1ZXRlc10oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3dvcmxkZm9vdGJhbGxSL3ZpZ25ldHRlcy9leHRyYWN0LXVuZGVyc3RhdC1kYXRhLmh0bWwpDQotIFtGYnJlZl0oaHR0cHM6Ly9mYnJlZi5jb20vZXMvY29tcHMvMTIvRXN0YWRpc3RpY2FzLWRlLUxhLUxpZ2EpIHBhcmEgZW50ZW5kZXIgbGFzIHNpZ2xhcyBxdWUgc2UgdXNhbiBlbiBsb3MgZGF0YXNldHMNCi0gW0NvbXVuaWRhZCBkZSBSXShodHRwczovL2NvbW11bml0eS5yc3R1ZGlvLmNvbS90L2dncGxvdC13aXRoLWdlb20taW1hZ2VzLWhlbHAvODM0NzkpDQotIFtDb2xvcmVzXShodHRwczovL2h0bWxjb2xvcmNvZGVzLmNvbS9lcy8pDQotIFtSIGNoYXJ0c10oaHR0cHM6Ly9yLWNoYXJ0cy5jb20vbWlzY2VsbGFuZW91cy9nZ3NvY2Nlci8pDQoNCjxicj48YnI+DQoNCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0Kc2Vzc2lvbmluZm86OnNlc3Npb25faW5mbygpICU+JSBkZXRhaWxzOjpkZXRhaWxzKHN1bW1hcnkgPSAnSW5mb3JtYWNpw7NuIGRlIG1pIFItc2VzacOzbjonKSANCmBgYA0KDQoNCjxicj48YnI+DQoNCjxkaXYgY2xhc3M9InRvY2lmeS1leHRlbmQtcGFnZSIgZGF0YS11bmlxdWU9InRvY2lmeS1leHRlbmQtcGFnZSIgc3R5bGU9ImhlaWdodDogMDsiPjwvZGl2Pg0KPGJyPjxicj4NCg0KPGRpdiBjbGFzcz0idG9jaWZ5LWV4dGVuZC1wYWdlIiBkYXRhLXVuaXF1ZT0idG9jaWZ5LWV4dGVuZC1wYWdlIiBzdHlsZT0iaGVpZ2h0OiAwOyI+PC9kaXY+DQo=