Lenda: Hyrje ne statistike

Viti: II (2023-2024)

Dega: IMI

Grupi: A1

Punimi permban keto pika:

Qellimet dhe objektivat

Qellimet tona ne kete projekt jane:

  1. Aplikimi i njohurive të marra gjatë pjesës së statistikës deskriptive dhe inferenciale, njohurive në Excel, R e RStudio për kryerjen e një analize statistikore të të dhënave që posedojmë.

  2. Bashkëpunimi në grup, ndarja e detyrave dhe realizimi sa më i plotë i të gjitha detyrave të caktuara.

  3. Përmirësimi dhe avancimi i aftësive tona në përdorimin e softwareve si: Excel, RStudio si dhe në analizimin e të dhënave.

Objektivat tona ne kete projekt jane:

  1. Për ndryshoret sasiore diskrete si: numri i mungesave në shkollë, numri i orëve të studimit, numri i pikëve të marra në provimin e lëndëve si: matematika, historia, fizika, kimia, biologjia, anglishtja e gjeografia të gjenden treguesit e poziocionit e të shpërhapjes.

  2. Të studiohet marrëdhënia mes ndryshoreve:

  • gjinia në raport me punësimin part-time, numrin e mungesave në shkollë, aktivitetet jashtëshkollore, numrin e orëve të studimit, profesionin e preferuar(profesioni që duan të bëhen) si dhe pikët në provime;

  • punësimi part-time në raport me numrin e mungesave në shkollë, aktivitetet jashtëshkollore, numrin e orëve të studimit si dhe pikët në provime;

  • numri i mungesave në shkollë në raport me aktivitetet jashtëshkollore dhe pikët në provime;

  • numri i orëve të studimit në raport me pikët në provime;

  • profesioni i ëndrrave me pikët në provime.

  1. Ndërtimi i grafikëve për studimin e marrëdhënieve mes ndryshoreve dhe komentimi i tyre, si dhe ndërtimi i metodave të parashikimit.

Njohje me databazen

Në këtë punim kemi vendosur të përzgjedhim një databazë ku pjesë e këtij studimi janë 2000 studentë dhe janë marrë në shqyrtim ndryshoret si:

  • gender -> gjinia -> ndryshore cilesore nominale;

  • part_time_job -> punësimi part-time -> ndryshore cilesore nominale;

  • absence_days -> numri i mungesave në shkollë -> ndryshore sasiore diskrete;

  • extracurricular_activity -> aktivitetet jashtëshkollore -> ndryshore cilesore nominale;

  • weekly_self_study_hours -> numri i orëve të studimit -> ndryshore sasiore diskrete;

  • career_aspiration -> profesioni i preferuar(profesioni që duan të bëhen) -> ndryshore cilesore nominale

  • pikët e tyre në provimin e zhvilluar në disa lëndë si: matematika, historia, fizika, kimia, biologjia, anglishtja e gjeografia. -> ndryshore sasiore diskrete

Përvec këtyre ndryshoreve, një ndryshore tjetër e gjendur në këtë databazë ishte dhe adresa e email-it, por në kuadër të pastrimit të të dhënave, për thjeshtim të punës sonë si dhe për shkak se nuk arritëm të studionim një marrëdhënie mes kësaj ndryshoreje në raport me ndryshoret e tjera, ne e hoqëm nga databaza jonë. Gjithashtu ndryshorja id sherben thjesht si numer rendor per secilin individ te popullates sone.

Analiza e te dhenave

Me poshte paraqitet nje pasqyre permbledhese e te dhenave tona.

Summary:

library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.3.3
str(student_scores)
tibble [2,000 × 16] (S3: tbl_df/tbl/data.frame)
 $ id                        : num [1:2000] 1 2 3 4 5 6 7 8 9 10 ...
 $ first_name                : chr [1:2000] "Paul" "Danielle" "Tina" "Tara" ...
 $ last_name                 : chr [1:2000] "Casey" "Sandoval" "Andrews" "Clark" ...
 $ gender                    : chr [1:2000] "male" "female" "female" "female" ...
 $ part_time_job             : chr [1:2000] "False" "False" "False" "False" ...
 $ absence_days              : num [1:2000] 3 2 9 5 5 2 3 2 6 3 ...
 $ extracurricular_activities: chr [1:2000] "False" "False" "True" "False" ...
 $ weekly_self_study_hours   : num [1:2000] 27 47 13 3 10 26 23 34 25 18 ...
 $ career_aspiration         : chr [1:2000] "Lawyer" "Doctor" "Government Officer" "Artist" ...
 $ math_score                : num [1:2000] 73 90 81 71 84 93 99 95 94 98 ...
 $ history_score             : num [1:2000] 81 86 97 74 77 100 96 95 68 69 ...
 $ physics_score             : num [1:2000] 93 96 95 88 65 67 97 82 94 88 ...
 $ chemistry_score           : num [1:2000] 97 100 96 80 65 78 73 63 85 71 ...
 $ biology_score             : num [1:2000] 63 90 65 89 80 72 88 84 81 67 ...
 $ english_score             : num [1:2000] 80 88 77 63 74 80 76 70 74 71 ...
 $ geography_score           : num [1:2000] 87 90 94 86 76 84 64 85 72 73 ...

Ketu paraqiten tipet e te dhenave tona, si dhe per ndryshoret sasiore jepen disa tregues statistikore si: minimumi, maksimumi, kuartilet, mesorja, mesatarja.

Summary:

summary(student_scores)
       id          first_name         last_name            gender          part_time_job     
 Min.   :   1.0   Length:2000        Length:2000        Length:2000        Length:2000       
 1st Qu.: 500.8   Class :character   Class :character   Class :character   Class :character  
 Median :1000.5   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
 Mean   :1000.5                                                                              
 3rd Qu.:1500.2                                                                              
 Max.   :2000.0                                                                              
  absence_days    extracurricular_activities weekly_self_study_hours career_aspiration 
 Min.   : 0.000   Length:2000                Min.   : 0.00           Length:2000       
 1st Qu.: 2.000   Class :character           1st Qu.: 5.00           Class :character  
 Median : 3.000   Mode  :character           Median :18.00           Mode  :character  
 Mean   : 3.666                              Mean   :17.76                             
 3rd Qu.: 5.000                              3rd Qu.:28.00                             
 Max.   :10.000                              Max.   :50.00                             
   math_score     history_score    physics_score    chemistry_score biology_score   
 Min.   : 40.00   Min.   : 50.00   Min.   : 50.00   Min.   : 50     Min.   : 30.00  
 1st Qu.: 77.00   1st Qu.: 69.75   1st Qu.: 71.00   1st Qu.: 69     1st Qu.: 69.00  
 Median : 87.00   Median : 82.00   Median : 83.00   Median : 81     Median : 81.00  
 Mean   : 83.45   Mean   : 80.33   Mean   : 81.34   Mean   : 80     Mean   : 79.58  
 3rd Qu.: 93.00   3rd Qu.: 91.00   3rd Qu.: 92.00   3rd Qu.: 91     3rd Qu.: 91.00  
 Max.   :100.00   Max.   :100.00   Max.   :100.00   Max.   :100     Max.   :100.00  
 english_score   geography_score 
 Min.   :50.00   Min.   : 60.00  
 1st Qu.:72.00   1st Qu.: 71.00  
 Median :83.00   Median : 81.00  
 Mean   :81.28   Mean   : 80.89  
 3rd Qu.:91.00   3rd Qu.: 91.00  
 Max.   :99.00   Max.   :100.00  

Me poshte paraqiten gjithashtu variacioni, devijimi standart dhe moda.

# Percaktoj student_scores si dataframe te cilit do i llogarisim variacionin dhe devijimin standard.
df <- data.frame(student_scores, replace = TRUE)

# Zgjedhim vetëm kolonat numerike.
df_numeric <- df[sapply(df, is.numeric)]

# Llogarisim variacionin, devijimin standard dhe moden për çdo kolonë numerike
apply(df_numeric, 2, function(x) c(var = var(x), sd = sd(x), mode = as.numeric(names(which.max(table(x))))))
              id absence_days weekly_self_study_hours math_score history_score physics_score
var  333500.0000     6.913066                147.1273  174.89815     162.20688     157.23789
sd      577.4946     2.629271                 12.1296   13.22491      12.73605      12.53945
mode      1.0000     2.000000                  3.0000   99.00000      88.00000      96.00000
     chemistry_score biology_score english_score geography_score
var         163.2746     188.29851     144.65082        135.4362
sd           12.7779      13.72219      12.02709         11.6377
mode         94.0000     100.00000      90.00000         88.0000

Koment mbi treguesit statistikore

Komentojmë vlerat e gjetura të treguesve statistikorë për secilën nga kolonat e shqyrtuara më sipër.

Fillojmë me kolonën e absence_days(mungesat).

Nga të dhënat më sipër vërejmë se numri i mungesave te studentët e marrë në shqyrtim është mesatarisht 4 për person. Numri i mungesave te studentët tanë është kryesisht 2. Një student ka munguar të shumtën 10 herë, por vihet re që një pjesë e tyre kanë të ngjarë të jenë frekuentues të rregullt të mësimit, duke rezultuar kështu pa mungesa. Përmes informacionit që marrim nga variacioni, duke qenë se vlera e tij është e madhe, atëherë të dhënat tona janë të shpërndara gjerësisht rreth mesatares dhe pavarësisht nga numri i përgjithshëm i dhënave tona, përmes devijimit standard duket qartë që të dhënat tona nuk janë shumë larg nga mesatarja. Për sa i përket pozicionimit të të dhënave tona në pjesën e poshtme të grupit të të dhënave numri i mungesave është më i vogël ose i barabartë me 2;në mes të grupit të dhënat janë më të vogla ose të barabarta me 3;në pjesën e sipërme numri i mungesave është më i vogël ose i barabartë me 5.

Vijojmë  me kolonën e weekly_self_study_hours:

Nga të dhënat tona vëmë re se numri i orëve të studimit për secilin student është mesatarisht 18 orë. Numri i orëve të studimit që shpenzojnë studentët gjatë jëves është kryesisht 3. Gjatë javës një student kryen më së shumti 50 orë studimi, por ka dhe prej tyre të cilët kanë angazhime të tjera dhe nuk kanë mundësi të studiojnë gjatë javës. Përmes informacionit që marrim nga variacioni duke qenë se vlera e tij është e madhe atëherë të dhënat tona janë të shpërndara gjerësisht rreth mesatares dhe pavarësisht nga numri i përgjithshëm i te dhënave tona përmes devijimit standart duket qartë se të dhënat tona nuk janë shumë larg nga mesatarja.Për sa i përket pozicionimit të të dhënave tona në pjesën e poshtme të grupit të të dhënave numri i mungesave është më i vogël ose i barabartë me 5;në mes të grupit të dhënat janë më të vogla ose të barabarta me 18;në pjesën e sipërme numri i mungesave është më i vogel ose i barabarte me 28.

Tani do shqyrtojme kolonat e pikeve te marra ne provime.

* math_score: 

Nga te dhenat tona veme re se numri i pikeve te marra ne provimin e matematikes eshte mesatarisht 83.Nje pjese e konsiderueshme e studenteve jane vleresuar me 99 pike. Vleresimi me i larte i arritur eshte 100 pike ndersa ai me i uleti eshte 40 pike. Permes informacionit qe marrim nga variacioni duke qene se vlera e tij eshte e madhe atehere te dhenat tona jane te shperndara gjeresisht rreth mesatares dhe pavaresisht nga numri i pergjithshem i te dhenave tona permes devijimit standart duket qarte se te dhenat tona jane larg nga mesatarja. Per sa i perket pozicionimit te te dhenave tona ne pjesen e poshtme te grupit te te dhenave numri i mungesave eshte me i vogel ose i barabarte me 77;ne mes te grupit te dhenat jane me te vogla ose te barabarta me 87;ne pjesen e siperme numri i mungesave eshte me i vogel ose i barabarte me 93.

*history_score: 

Nga te dhenat tona veme re se numri i pikeve te marra ne provimin e historise eshte mesatarisht 80 pike.Nje pjese e konsiderueshme e studenteve jane vlersuar me 88 pike. Vlersimi me i lart i arritur eshte 100 pike ndersa ai me i uleti eshte 50 pike. Permes informacionit qe marrim nga variacioni duke qene se vlera e tij eshte e madhe atehere te dhenat tona jane te shperndara gjeresisht rreth mesatares dhe pavarsisht nga numri i pergjithshem i te dhenave tona permes devijimit standart duket qarte se te dhenat tona jane larg nga mesatarja. Per sa i perket pozicionimit te te dhenave tona ne pjesen e poshtme te grupit te te dhenave numri i mungesave eshte me i vogel ose i barabarte me 70;ne mes te grupit te dhenat jane me te vogla ose te barabarta me 82;ne pjesen e siperme numri i mungesave eshte me i vogel ose i barabarte me 91.

*physics_score: 

Nga te dhenat tona veme re se numri i pikeve te marra ne provimin e fizikes eshte mesatarisht 81 pike.Nje pjese e konsiderueshme e studenteve jane vleresuar me 96 pike. Vleresimi me i larte i arritur eshte 100 pike ndersa ai me i uleti eshte 50 pike. Permes informacionit qe marrim nga variacioni duke qene se vlera e tij eshte e madhe atehere te dhenat tona jane te shperndara gjeresisht rreth mesatares dhe pavarsisht nga numri i pergjithshem i te dhenave tona permes devijimit standart duket qarte se te dhenat tona jane larg nga mesatarja. Per sa i perket pozicionimit te te dhenave tona ne pjesen e poshtme te grupit te te dhenave numri i mungesave eshte me i vogel ose i barabarte me 71;ne mes te grupit te dhenat jane me te vogla ose te barabarta me 83;ne pjesen e siperme numri i mungesave eshte me i vogel ose i barabarte me 92.

*chemistry_score: 

Nga te dhenat tona veme re se numri i pikeve te marra ne provimin e kimise eshte mesatarisht 80 pike.Nje pjese e konsiderueshme e studenteve jane vlersuar me 94 pike. Vleresimi me i larte i arritur eshte 100 pike ndersa ai me i uleti eshte 50 pike. Permes informacionit qe marrim nga variacioni duke qene se vlera e tij eshte e madhe atehere te dhenat tona jane te shperndara gjeresisht rreth mesatares dhe pavarsisht nga numri i pergjithshem i te dhenave tona permes devijimit standart duket qarte se te dhenat tona jane larg nga mesatarja. Per sa i perket pozicionimit te te dhenave tona ne pjesen e poshtme te grupit te te dhenave numri i mungesave eshte me i vogel ose i barabarte me 69;ne mes te grupit te dhenat jane me te vogla ose te barabarta me 81;ne pjesen e siperme numri i mungesave eshte me i vogel ose i barabarte me 91.

*biology_score:

Nga te dhenat tona veme re se numri i pikeve te marra ne provimin e biologjise eshte mesatarisht 80 pike.Nje pjese e konsiderueshme e studenteve jane vlersuar me 100 pike. Vleresimi me i larte i arritur eshte 100 pike ndersa ai me i uleti eshte 30 pike. Permes informacionit qe marrim nga variacioni duke qene se vlera e tij eshte e madhe atehere te dhenat tona jane te shperndara gjeresisht rreth mesatares dhe pavarsisht nga numri i pergjithshem i te dhenave tona permes devijimit standart duket qarte se te dhenat tona jane larg nga mesatarja. Per sa i perket pozicionimit te te dhenave tona ne pjesen e poshtme te grupit te te dhenave numri i mungesave eshte me i vogel ose i barabarte me 69;ne mes te grupit te dhenat jane me te vogla ose te barabarta me 81;ne pjesen e siperme numri i mungesave eshte me i vogel ose i barabarte me 91.

*english_score:

Nga te dhenat tona veme re se numri i pikeve te marra ne provimin e anglishtes eshte mesatarisht 81 pike.Nje pjese e konsiderueshme e studenteve jane vleresuar me 90 pike. Vleresimi me i larte i arritur eshte 99 pike ndersa ai me i uleti eshte 50 pike. Permes informacionit qe marrim nga variacioni duke qene se vlera e tij eshte e madhe atehere te dhenat tona jane te shperndara gjeresisht rreth mesatares dhe pavarsisht nga numri i pergjithshem i te dhenave tona permes devijimit standart duket qarte se te dhenat tona jane larg nga mesatarja. Per sa i perket pozicionimit te te dhenave tona ne pjesen e poshtme te grupit te te dhenave numri i mungesave eshte me i vogel ose i barabarte me 72;ne mes te grupit te dhenat jane me te vogla ose te barabarta me 83;ne pjesen e siperme numri i mungesave eshte me i vogel ose i barabarte me 91.

*geography_score: 

Nga te dhenat tona veme re se numri i pikeve te marra ne provimin e gjeografise eshte mesatarisht 81 pike.Nje pjese e konsiderueshme e studenteve jane vleresuar me 88 pike. Vleresimi me i larte i arritur eshte 100 pike ndersa ai me i uleti eshte 60 pike. Permes informacionit qe marrim nga variacioni duke qene se vlera e tij eshte e madhe atehere te dhenat tona jane te shperndara gjeresisht rreth mesatares dhe pavarsisht nga numri i pergjithshem i te dhenave tona permes devijimit standart duket qarte se te dhenat tona jane larg nga mesatarja. Per sa i perket pozicionimit te te dhenave tona ne pjesen e poshtme te grupit te te dhenave numri i mungesave eshte me i vogel ose i barabarte me 71;ne mes te grupit te dhenat jane me te vogla ose te barabarta me 81;ne pjesen e siperme numri i mungesave eshte me i vogel ose i barabarte me 91.

Grafike dhe tabela statistikore per nje ndryshore

Nje pjese e rendesishme e projektit tone eshte padyshim ndertimi i grafikeve. Si fillim do ndertojme per secilen ndryshore grafike te llojeve te ndryshme.

GRAFIKU I PUNESIMIT PART-TIME

library(ggplot2)
p1 <- ggplot(student_scores) +
  aes(x = part_time_job) +
  geom_bar(fill = "#fe6f5e") +
  labs(
    x = "Pohimi",
    y = "Denduria",
    title = "Grafiku i punesimit part-time 1.1"
  ) +
  coord_flip() +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    plot.caption = element_text(size = 14L,
    hjust = 0.5),
    axis.title.y = element_text(size = 15L,
    face = "bold"),
    axis.title.x = element_text(size = 15L,
    face = "bold")
  )

GRAFIKU MBI GJININE E INDIVIDEVE

library(ggplot2)
p2 <- ggplot(student_scores) +
  aes(x = gender) +
  geom_bar(fill = "#C68FF7") +
  labs(
    x = "Gjinia",
    y = "Denduria",
    title = "Grafiku mbi gjinine e individeve 1.2"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 15L,
    face = "bold"),
    axis.title.x = element_text(size = 15L,
    face = "bold")
  )

GRAFIKU MBI AKTIVITETET JASHTESHKOLLORE

library(ggplot2)
p3 <- ggplot(student_scores) +
  aes(x = extracurricular_activities) +
  geom_bar(fill = "#9AB6E8") +
  labs(
    x = "Pohimi",
    y = "Denduria",
    title = "Grafiku mbi aktivitetet jashteshkollore 1.3"
  ) +
  coord_flip() +
  theme_gray() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 15L,
    face = "bold"),
    axis.title.x = element_text(size = 15L,
    face = "bold")
  )
library(gridExtra)
Warning: package ‘gridExtra’ was built under R version 4.3.3
grid.arrange(p1, p2, p3, nrow = 2)

Nga grafiku 1.1 dhe 1.3 ne veme re se nje pjesa e madhe e studenteve nuk punojne part time dhe nuk kryejne aktivitete jashteshkollore, ndersa nga grafiku 1.2 veme re se kemi nr te njejte individesh si meshkuj ashtu dhe femra.

GRAFIKU MBI PROFESIONIN E ENDRRAVE

library(ggplot2)
 ggplot(student_scores) +
  aes(x = career_aspiration) +
  geom_bar(fill = "#FF69B4") +
  labs(
    x = "Profesioni",
    y = "Denduria",
    title = "Grafiku mbi profesionin e endrrave 1.4"
  ) +
  coord_flip() +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 15L,
    face = "bold"),
    axis.title.x = element_text(size = 15L,
    face = "bold")
  )

Nga grafiku 1.4 veme re se profesionet me te pelqyera jane software engineer dhe bussiness owner,ndersa ata me pak i preferuari jane writer dhe teacher.

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren mungesat.

GRAFIKU 1.5

ggplot(student_scores) +
  aes(x = absence_days) +
  geom_histogram(bins = 30L, fill = "#DC69F7", aes(y=..count..)) +
  geom_text(aes(label=..count..), stat='count', vjust=-0.5, size=3) +
  labs(
    x = "Ditet e mungesave",
    y = "Denduria",
    title = "Grafiku mbi mungesat 1.5"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 15L,
    face = "bold"),
    axis.title.x = element_text(size = 15L,
    face = "bold")
  )

Nga grafiku 1.5 veme re se kemi 344 student qe kane bere rreth 2 mungesa,nderkoh 51 prej tyre kane bere rreth 8 mungesa.

GRAFIKU 1.6

p6 <- ggplot(student_scores) +
  aes(x = "", y = absence_days) +
  geom_boxplot(fill = "#FF8C00") +
  labs(y = "Ditet e mungesave", title = "Boxplot") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold")
  )

GRAFIKU 1.7

p7 <- ggplot(student_scores) +
  aes(x = "", y = absence_days) +
  geom_violin(adjust = 1L, scale = "area", fill = "#9AE19A") +
  labs(y = "Ditet e mungesave", title = "Grafiku violine") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold")
  )

GRAFIKU 1.8

p8<-ggplot(student_scores) +
  aes(x = absence_days) +
  geom_density(adjust = 1L, fill = "#E3AE9F") +
  labs(
    x = "Ditet e mungesave",
    y = "Densiteti",
    title = "Grafiku i densitetit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(p6, p7, p8, nrow = 2)

Nga boxploti ne veme re se min eshte 0 mungesa ,ndersa max qe eshte 10 mungesa dhe shofim qe eshte shume larg vleres mesatare.Dhe meqense se kuartili i dyte eshte shume afer kuartilit te pare kjo tregon se te dhenat tona jane shume afer mesatares. Nga grafiku violine veme re se nga 0-3 grafiku vjen i gjre gje qe do te thote se te dhenat tona jane te shperndara ndersa nga 3-10 grafiku vjen duke u ngushtuar dhe kjo do te thote se te dhenat tona nuk jane te shperndara. *Grafiku i densitetit na tregon shperndarjen e densitetit te mungesave.

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren oret e studimit javore.

GRAFIKU 1.9

ggplot(student_scores) +
  aes(x = weekly_self_study_hours) +
  geom_histogram(bins = 20L, fill = "purple", color = "white") +
  stat_bin(bins = 20L, geom="text", aes(label=..count..), vjust=-0.5) +
  ggtitle("Histogrami") +
  xlab("Oret javore te studimit") +
  ylab("Denduria") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Nga histogrami ne veme re se kemi nje nr shume te madh studentesh qe studiojne shume pak ore dhe nje nr shume te vogel studentesh qe studiojne nga 45-50 ore ne jave.

GRAFIKU 1.10

p9 <- ggplot(student_scores) +
  aes(x = "", y = weekly_self_study_hours) +
  geom_boxplot(fill = "#Efdecd") +
  labs(y = "Oret javore te studimit", title = "Boxplot") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold")
  )

GRAFIKU 1.11

p10 <- ggplot(student_scores) +
  aes(x = "", y = weekly_self_study_hours) +
  geom_violin(adjust = 1L, scale = "area", fill = "#ff033e") +
  labs(y = "Oret javore te studimit", title = "Grafiku violine") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold")
  )

GRAFIKU 1.12

p11<-ggplot(student_scores) +
  aes(x = weekly_self_study_hours) +
  geom_density(adjust = 1L, fill = "#a4c639") +
  labs(
    x = "Oret javore te studimit",
    y = "Densiteti",
    title = "Grafiku i densitetit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
library(gridExtra)
Warning: package ‘gridExtra’ was built under R version 4.3.3
grid.arrange(p9, p10, p11, nrow = 2)

Nga boxploti ne veme re se min eshte 0 ore studimi,ndersa max qe eshte 50 ore studimi.Dhe meqense se kuartili i dyte eshte shume afer kuartilit te trete kjo tregon se te dhenat tona kane nje shperndarje te rregullt. Nga grafiku violine veme re se 0-5 eshte i gjere pastaj nga 5-10 vjen duke u ngushtuar, nga 10-20 vjen i gjere dhe nga 30-50 vjen duke u ngushtuar. *Grafiku i densitetit na tregon shperndarjen e densitetit te oreve te studimit.

Grafike dhe tabela statistikore per piket e marra ne provime

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren math_score.

GRAFIKU 1.13

library(ggplot2)
ggplot(student_scores) +
  aes(x = math_score) +
  geom_histogram(bins = 20L, fill = "turquoise", color = "white") +
  stat_bin(bins = 20L, geom="text", aes(label=..count..), vjust=-0.5) +
  ggtitle("Histogrami") +
  xlab("Piket e marra ne provimin e matematikes") +
  ylab("Denduria") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Nga histogrami me siper veme re se vlera max e tij 301 tregon nr e studenteve qe kane marr 90 pik ne provimin e matematikes ndersa vlera min qe eshte 13 tregon nr e studenteve qe kane marr45-50 pik ne provim.

GRAFIKU 1.14

p12 <- ggplot(student_scores) +
  aes(x = "", y = math_score) +
  geom_boxplot(fill = "#e97451") +
  labs(y = "Piket ne provimin e matematikes", title = "Boxplot") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.15

p13 <- ggplot(student_scores) +
  aes(x = "", y = math_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#e4717a") +
  labs(y = "Piket ne provimin e matematikes", title = "Grafiku violine") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.16

p14<-ggplot(student_scores) +
  aes(x = math_score) +
  geom_density(adjust = 1L, fill = "#006b3c") +
  labs(
    x = "Piket ne provimin e matematikes",
    y = "Densiteti",
    title = "Grafiku i densitetit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(p12, p13, p14, nrow = 2)

*Nga boxploti,grafiku violine dhe grafiku densitetit ne veme re se te dhenat jane te shperndara rreth vlerave 80-100 gje qe tregon se klasa ka nje performance te mire ne lenden e matematikes.

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren history_score.

GRAFIKU 1.17

library(ggplot2)
ggplot(student_scores) +
  aes(x = history_score) +
  geom_histogram(bins = 20L, fill = "#c41e3a", color = "white") +
  stat_bin(bins = 20L, geom="text", aes(label=..count..), vjust=-0.5) +
  ggtitle("Histogrami") +
  xlab("Piket e marra ne provimin e historise") +
  ylab("Denduria") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Nga histogrami me siper veme re se vlera max e tij 183 tregon nr e studenteve qe kane marr 87 pik ne provimin e historise ndersa vlera min qe eshte 14 tregon nr e studenteve qe kane marr 50 pik ne provim.

GRAFIKU 1.18

p15 <- ggplot(student_scores) +
  aes(x = "", y = history_score) +
  geom_boxplot(fill = "#ffa6c9") +
  labs(y = "Piket ne provimin e historise", title = "Boxplot") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.19

p16 <- ggplot(student_scores) +
  aes(x = "", y = history_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#7fff00") +
  labs(y = "Piket ne provimin e historise", title = "Grafiku violine") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.20

p17<-ggplot(student_scores) +
  aes(x = history_score) +
  geom_density(adjust = 1L, fill = "#99badd") +
  labs(
    x = "Piket ne provimin e historise",
    y = "Densiteti",
    title = "Grafiku i densitetit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(p15, p16, p17, nrow = 2)

Nga boxploti,grafiku violine dhe grafiku densitetit ne veme re se te dhenat jane te shperndara rreth vlerave 70-90 gje qe tregon se klasa ka nje performance te mire ne lenden e historise.

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren physics_score.

GRAFIKU 1.21

library(ggplot2)
ggplot(student_scores) +
  aes(x = physics_score) +
  geom_histogram(bins = 20L, fill = "#de3163", color = "yellow") +
  stat_bin(bins = 20L, geom="text", aes(label=..count..), vjust=-0.5) +
  ggtitle("Histogrami") +
  xlab("Piket e marra ne provimin e fizikes") +
  ylab("Denduria") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Nga histogrami me siper veme re se vlera max e tij 184 tregon nr e studenteve qe kane marr 95 pik ne provimin e fizikes ndersa vlera min qe eshte 10 tregon nr e studenteve qe kane marr 55 pik ne provim.

GRAFIKU 1.22

p18 <- ggplot(student_scores) +
  aes(x = "", y = physics_score) +
  geom_boxplot(fill = "#ffb7c5") +
  labs(y = "Piket ne provimin e fizikes", title = "Boxplot") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.23

p19 <- ggplot(student_scores) +
  aes(x = "", y = physics_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#cd5c5c") +
  labs(y = "Piket ne provimin e fizikes", title = "Grafiku violine") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.24

p20<-ggplot(student_scores) +
  aes(x = physics_score) +
  geom_density(adjust = 1L, fill = "#d2691e") +
  labs(
    x = "Piket ne provimin e fizikes",
    y = "Densiteti",
    title = "Grafiku i densitetit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(p18, p19, p20, nrow = 2)

Nga boxploti,grafiku violine dhe grafiku densitetit ne veme re se te dhenat jane te shperndara rreth vlerave 70-90 gje qe tregon se klasa ka nje performance te mire ne lenden e fizikes.

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren chemistry_score.

GRAFIKU 1.25

library(ggplot2)
ggplot(student_scores) +
  aes(x = chemistry_score) +
  geom_histogram(bins = 20L, fill = "#ffa700", color = "white") +
  stat_bin(bins = 20L, geom="text", aes(label=..count..), vjust=-0.5) +
  ggtitle("Histogrami") +
  xlab("Piket e marra ne provimin e kimise") +
  ylab("Denduria") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Nga histogrami me siper veme re se vlera max e tij 187 tregon nr e studenteve qe kane marr 95 pik ne provimin e kimise ndersa vlera min qe eshte 8 tregon nr e studenteve qe kane marr 55 pik ne provim.

GRAFIKU 1.26

p21 <- ggplot(student_scores) +
  aes(x = "", y = chemistry_score) +
  geom_boxplot(fill = "#98817b") +
  labs(y = "Piket ne provimin e kimise", title = "Boxplot") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.27

p22 <- ggplot(student_scores) +
  aes(x = "", y = chemistry_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#e34234") +
  labs(y = "Piket ne provimin e kimise", title = "Grafiku violine") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.28

p23<-ggplot(student_scores) +
  aes(x = chemistry_score) +
  geom_density(adjust = 1L, fill = "#d2691e") +
  labs(
    x = "Piket ne provimin e kimise",
    y = "Densiteti",
    title = "Grafiku i densitetit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(p21, p22, p23, nrow = 2)

Nga boxploti,grafiku violine dhe grafiku densitetit ne veme re se te dhenat jane te shperndara rreth vlerave 70-90 gje qe tregon se klasa ka nje performance te mire ne lenden e kimise.

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren biology_score.

GRAFIKU 1.29

library(ggplot2)
ggplot(student_scores) +
  aes(x = biology_score) +
  geom_histogram(bins = 20L, fill = "#e4d00a", color = "white") +
  stat_bin(bins = 20L, geom="text", aes(label=..count..), vjust=-0.5) +
  ggtitle("Histogrami") +
  xlab("Piket e marra ne provimin e biologjise") +
  ylab("Denduria") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Nga histogrami me siper veme re se vlera max e tij 208 tregon nr e studenteve qe kane marr 90 pik ne provimin e biologjise ndersa vlera min qe eshte 2 tregon nr e studenteve qe kane marr 40 pik ne provim.

GRAFIKU 1.30

library(ggplot2)
p24 <- ggplot(student_scores) +
  aes(x = "", y = biology_score)+
  geom_boxplot(fill = "#fbcce7") +
  labs(y = "Piket ne provimin e biologjise", title = "Boxplot") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.31

library(ggplot2)
p25 <- ggplot(student_scores) +
  aes(x = "", y = biology_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#0047ab") +
  labs(y = "Piket ne provimin e biologjise", title = "Grafiku violine") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.32

p26<-ggplot(student_scores) +
  aes(x = biology_score) +
  geom_density(adjust = 1L, fill = "#d2691e") +
  labs(
    x = "Piket ne provimin e biologjise",
    y = "Densiteti",
    title = "Grafiku i densitetit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(p24, p25, p26, nrow = 2)

Nga boxploti,grafiku violine dhe grafiku densitetit ne veme re se te dhenat jane te shperndara rreth vlerave 65-85 gje qe tregon se klasa ka nje performance te mire ne lenden e biologjise.

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren english_score.

GRAFIKU 1.33

library(ggplot2)
ggplot(student_scores) +
  aes(x = english_score) +
  geom_histogram(bins = 20L, fill = "#6f4e37", color = "red") +
  stat_bin(bins = 20L, geom="text", aes(label=..count..), vjust=-0.5) +
  ggtitle("Histogrami") +
  xlab("Piket e marra ne provimin e anglishtes") +
  ylab("Denduria") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Nga histogrami me siper veme re se vlera max e tij 199 tregon nr e studenteve qe kane marr 95 pik ne provimin e anglishtes ndersa vlera min qe eshte 8 tregon nr e studenteve qe kane marr 45-50 pik ne provim.

GRAFIKU 1.34

library(ggplot2)
p27 <- ggplot(student_scores) +
  aes(x = "", y = english_score)+
  geom_boxplot(fill = "#9bddff") +
  labs(y = "Piket ne provimin e anglishtes", title = "Boxplot") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.35

library(ggplot2)
p28 <- ggplot(student_scores) +
  aes(x = "", y = english_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#002e63") +
  labs(y = "Piket ne provimin e anglishtes", title = "Grafiku violine") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.36

p29<-ggplot(student_scores) +
  aes(x = english_score) +
  geom_density(adjust = 1L, fill = "#8c92ac") +
  labs(
    x = "Piket ne provimin e anglishtes",
    y = "Densiteti",
    title = "Grafiku i densitetit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(p27, p28, p29, nrow = 2)

Nga boxploti,grafiku violine dhe grafiku densitetit ne veme re se te dhenat jane te shperndara rreth vlerave 72-92 gje qe tregon se klasa ka nje performance te mire ne lenden e anglishtes.

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren geography_score.

GRAFIKU 1.37

library(ggplot2)
ggplot(student_scores) +
  aes(x = geography_score) +
  geom_histogram(bins = 20L, fill = "#b87333", color = "white") +
  stat_bin(bins = 20L, geom="text", aes(label=..count..), vjust=-0.5) +
  ggtitle("Histogrami") +
  xlab("Piket e marra ne provimin e gjeografise") +
  ylab("Denduria") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Nga histogrami me siper veme re se vlera max e tij 166 tregon nr e studenteve qe kane marr 80 pik ne provimin e gjeografise ndersa vlera min qe eshte 85 tregon nr e studenteve qe kane marr 65 pik ne provim.

GRAFIKU 1.38

library(ggplot2)
p30 <- ggplot(student_scores) +
  aes(x = "", y = geography_score)+
  geom_boxplot(fill = "#996666") +
  labs(y = "Piket ne provimin e gjeografise", title = "Boxplot") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.39

library(ggplot2)
p31 <- ggplot(student_scores) +
  aes(x = "", y = geography_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#ff3800") +
  labs(y = "Piket ne provimin e gjeografise", title = "Grafiku violine") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 13L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 10L,
    face = "bold")
  )

GRAFIKU 1.40

p32<-ggplot(student_scores) +
  aes(x = geography_score) +
  geom_density(adjust = 1L, fill = "#ff7f50") +
  labs(
    x = "Piket ne provimin e gjeografise",
    y = "Densiteti",
    title = "Grafiku i densitetit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 15L,
    face = "bold",
    hjust = 0.5),
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(p30, p31, p32, nrow = 2)

Nga boxploti,grafiku violine dhe grafiku densitetit ne veme re se te dhenat jane te shperndara rreth vlerave 72-92 gje qe tregon se klasa ka nje performance te mire ne lenden e gjeografise.

Grafike dhe tabela statistikore per 2 ndryshore per gender

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren gender ne raport me ndryshoret e tjera.

Gender ne raport me part_time_job

 ggplot(student_scores) +
  aes(x = part_time_job, fill = gender) +
  geom_bar(position = "dodge") +
  scale_fill_hue(direction = 0, h = c(0, 90)) +  
  coord_flip() +
  theme_minimal()

Nga grafiku me siper veme re se per vleren False nr i meshkujve te papunsuar eshte me i madh se ai i femreve ,ndersa per vleren true nr femrave te punesuara eshte me i madh se ai i meshkujve.

Gender ne raport me extracurricular_activities

 ggplot(student_scores) +
  aes(x = extracurricular_activities, fill = gender) +
  geom_bar(position = "dodge") +
  scale_fill_hue(direction = 0, h = c(57, 234)) +  
  coord_flip() +
  theme_minimal()

Nga grafiku me siper ve,e re se per vleren false si nr femrave dhe ai i meshkujve qe merren me aktivitete eshte i njejte ndersa per vleren true nr femrave eshte pak me i madh se sa ai i meshkujve.

Gender ne raport me career_aspiration

ggplot(student_scores) +
  aes(x = career_aspiration, fill = gender) +
  geom_bar() +
  scale_fill_hue(direction = 1) +
  coord_flip() +
  scale_fill_hue(direction = 0, h = c(4, 32)) +
  theme_minimal()
Scale for fill is already present.
Adding another scale for fill, which will replace the existing scale.

Nga grafiku me siper veme re sa ka profesione te frekuentuara vetem nga femrat sic eshte teacher por ka dhe profesione qe jane te frekuentuara pothuajse ne menyre te barabarte si nga femrat dhe meshkujt, por ka dhe profesione qe jane me shume te frekuentuar me se shumti nga meshkujt.

Gender ne raport me math_score

ggplot(student_scores) +
  aes(x = gender, y =math_score , color = gender) + 
  geom_jitter(size = 1.1) +
  labs(x = "Gjinia", y = "Piket ne provimin e matematikes") +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 14L, face = "bold"),
    axis.title.x = element_text(size = 14L, face = "bold")
  )

Nga 40-60 shikojme qe pikat jane te shperndara gje qe pak student jane vlersuar me keto pik.Por ne shofim qe pjsa me e madhe eshte e perqendruar rreth vlerave 80-100 gje qe do te thote se pjesa me e madhe e tyre jane vlersuar midis ketyre kufijve.

Gender ne raport me physics_score

ggplot(student_scores, aes(x =gender , y = career_aspiration, fill = physics_score)) +
  geom_tile() +
  scale_fill_gradient(low = "blue", high = "red") +
  theme_minimal() +
  labs(x = "Gjinia", y = "Aspirata e Karrierës", fill = "Piket ne provimin e fizikes")

Nga grafiku me siper ne shofim se meshkujt jane vlersuar me mire ne provimin e fizikes se sa femrat.

Gender ne raport me english_score

ggplot(student_scores, aes(x =gender , y = career_aspiration, fill = english_score)) +
  geom_tile() +
  scale_fill_gradient(low = "black", high = "red") +
  theme_minimal() +
  labs(x = "Gjinia", y = "Aspirata e Karrierës", fill = "Piket ne provimin e anglishtes")

Nga grafiku me siper ne nuk veme re ndonje diference te madhe midis pikeve qe kane marr te dyja gjinit.

Gender ne raport me biology_score

ggplot(student_scores, aes(x =gender , y = career_aspiration, fill = biology_score)) +
  geom_tile() +
  scale_fill_gradient(low = "blue", high = "yellow") +
  theme_minimal() +
  labs(x = "Gjinia", y = "Aspirata e Karrierës", fill = "Piket ne provimin e biologjise")

Nga grafiku shohim se femrat kane dal pak me mire ne provimin e biologjise se sa meshkujt.

Gender ne raport me chemistry_score

ggplot(student_scores) +
  aes(x = gender, y =chemistry_score , color = gender) + 
  geom_jitter(size = 1.1) +
  labs(x = "Gjinia", y = "Piket ne provimin e kimise") +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 14L, face = "bold"),
    axis.title.x = element_text(size = 14L, face = "bold")
  )

Grafiku me pika te kuqe (femrat) dhe ai blu (meshkujt) duket se kanë një shpërndarje të ngjashme horizontale përgjatë boshtit X, që tregon pikët në provimin e kimisë. Kjo sugjeron se nuk ka ndonjë dallim të madh në pikët e marra nga meshkujt dhe femrat në këtë provim.

Gender ne raport me history_score

ggplot(student_scores) +
  aes(y = history_score, x = gender, fill = gender) + 
  geom_violin(adjust = 1L, scale = "area") +
  labs(x = "Gjinia", y = "Piket ne provimin e historise") +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 14L, face = "bold"),
    axis.title.x = element_text(size = 14L, face = "bold")
  )

Nga grafiku shohim se të dyja gjinitë kanë një shpërndarje të ngjashme të pikëve, por me ndryshime në përhapje dhe tendencë qendrore.

Gender ne raport me geography_score

library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.3.3
ggplot(student_scores) +
  aes(x = geography_score, fill = gender) +
  geom_histogram(bins = 35L, colour = "brown") +
  labs(x = "Piket ne provimin e gjeografike", y = "Gjinia") +
  scale_color_hue(direction = 1) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 14L, face = "bold"),
    axis.title.x = element_text(size = 14L, face = "bold")
  )

Të dyja gjinitë kanë treguar performancë të ndryshme, pa një model ose tendencë të qartë që tregon një gjini të veçantë që performon më mirë.

Grafike dhe tabela statistikore per 2 ndryshore per part_time_job

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren part_time_job ne raport me ndryshoret e tjera

Part_time_job ne raport me absence_days

ggplot(student_scores) +
  aes(x = part_time_job, y = absence_days, color = part_time_job) +
  geom_jitter(size = 1.1) +
  labs(x = "Punesim part-time", y = "Ditet e mungesave") +
  coord_flip() +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 14L, face = "bold"),
    axis.title.x = element_text(size = 14L, face = "bold")
  ) +
  scale_color_brewer(palette = "Dark2")

Ne shofim se nga 0.5-3 ne shohim se te dhenat tona jane me te perqendruara per vleren false, dhe nga 3-7.5 vijne duke u reduktuar.Ndersa per vleren true te dhenat jane te shperndara gjithandej.

Part_time_job ne raport me extracurricular_activities

ggplot(student_scores) +
  aes(x = part_time_job, y = extracurricular_activities) +
  geom_tile(aes(fill = interaction(part_time_job, extracurricular_activities)), width = 1, height = 1) +
  scale_fill_brewer(palette = "Pastel2") +
  theme_minimal() +
  labs(fill = "Nderthurje e ndryshoreve", x = "Punesimi part-time", y = "Aktivitete jashtëshkollore")

Part_time_job ne raport me weekly_self_study_hours

ggplot(student_scores) +
  aes(x = part_time_job, y = weekly_self_study_hours) +
  geom_boxplot(fill = "#96c8a2",color="purple") +
  labs(
    x = "Punesimi part-time",
    y = "Oret javore te studimit"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 14L,
    face = "bold"),
    axis.title.x = element_text(size = 14L,
    face = "bold")
  )

Studentët që nuk janë të punësuar part-time (False) kanë një shpërndarje më të gjerë të orëve të studimit, që variojnë nga 30 deri në 50 orë. Ndërsa, studentët që janë të punësuar part-time (True) kanë një shpërndarje më të ngushtë të orëve të studimit. Kjo mund të sugjerojë se punësimi part-time mund të ketë një ndikim të caktuar në sasinë e kohës që studentët mund të dedikojnë për studim.

Part_time_job ne raport me math_score

e1<-ggplot(student_scores) +
  aes(x = part_time_job, y = math_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#D5ED9D") +
  theme_minimal()

Part_time_job ne raport me physics_score

e2<-ggplot(student_scores) +
  aes(x = part_time_job, y = physics_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#c19a6b") +
  theme_minimal()

Part_time_job ne raport me chemistry_score

e3<-ggplot(student_scores) +
  aes(x = part_time_job, y = chemistry_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#801818") +
  theme_minimal()

Part_time_job ne raport me biology_score

e4<-ggplot(student_scores) +
  aes(x = part_time_job, y = biology_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#ff00ff") +
  theme_minimal()
Error in ggplot(student_scores) : could not find function "ggplot"

Part_time_job ne raport me history_score

e5<-ggplot(student_scores) +
  aes(x = part_time_job, y = history_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#f400a1") +
  theme_minimal()

Part_time_job ne raport me geography_score

e6<-ggplot(student_scores) +
  aes(x = part_time_job, y = geography_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#4d5d53") +
  theme_minimal()

Part_time_job ne raport me english_score

e7<-ggplot(student_scores) +
  aes(x = part_time_job, y = english_score) +
  geom_violin(adjust = 1L, scale = "area", fill = "#ff2800") +
  theme_minimal()
library(gridExtra)
grid.arrange(e1, e2, e3, e4, e5, e6, e7, nrow = 2)

Grafike per 2 ndryshore per absence_days

Me poshte do te ndertojme tipe te ndryshme grafikesh per ndryshoren absence_days ne raport me ndryshoret e tjera.

Absence_days ne raport me extracurricular_activites

ggplot(student_scores) +
  aes(x = absence_days, y = extracurricular_activities, color = absence_days) +
  geom_jitter(size = 1.2) +
  labs(
    x = "Ditet e mungesave",
    y = "Aktivitetet jashteshkollore"
  ) +
  coord_flip() +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 14L,
    face = "bold"),
    axis.title.x = element_text(size = 14L,
    face = "bold")
  ) 

Nga grafiku shohim se ka një tendencë që nxënësit që marrin pjesë në aktivitete jashtëshkollorë kanë më pak ditë mungesa krahasuar me ata që nuk marrin pjesë e cila varet dhe nga punsimi i ketyre studenteve part time.

Disa lloje grafikesh qe paraqesin marredhenien mes absence_days dhe weekly_self_study_hours

library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.3.3
ggplot(student_scores) +
  aes(x = absence_days, y = weekly_self_study_hours, fill = weekly_self_study_hours) +
  geom_tile() +
  theme_minimal() +
  scale_fill_gradient(low = "green", high = "yellow")

  • Studentët që mungojnë më pak ditë kanë tendencë të studiojnë më shumë orë në mënyrë vetjake gjatë javës.
  • Ndërsa shtohet numri i ditëve të mungesës, numri i orëve të studimit vetjak duket se ulët.
f1<-ggplot(student_scores) +
  aes(x = absence_days, y = weekly_self_study_hours, colour = weekly_self_study_hours) +
  geom_line() +
  theme_minimal()
f2<-ggplot(student_scores) +
  aes(x = absence_days, y = weekly_self_study_hours, colour = weekly_self_study_hours) +
  geom_step() +
  theme_minimal()
library(gridExtra)
Warning: package ‘gridExtra’ was built under R version 4.3.3
grid.arrange(f1,f2, nrow = 2)

Disa lloje grafikesh qe paraqesin marredhenien mes absence_days dhe math_score

Nga te gjithe grafiket me poshte ne lidhje me ditet e mungesave dhe piket e provimeve ne veme re se nuk ka nje lidhje midis tyre.

q1<-ggplot(student_scores) +
  aes(x = absence_days, y = math_score) +
  geom_line(colour = "#FF69B4") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e matematikes"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 8L,
    face = "bold"),
    axis.title.x = element_text(size = 8L,
    face = "bold")
  )
q2<-ggplot(student_scores) +
  aes(x = absence_days, y = math_score) +
  geom_step(colour = "#FF69B4") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e matematikes"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 8L,
    face = "bold"),
    axis.title.x = element_text(size = 8L,
    face = "bold")
  )
q3<-ggplot(student_scores) +
  aes(x = absence_days, y = math_score) +
  geom_point(colour = "#FF69B4") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e matematikes"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 9L,
    face = "bold"),
    axis.title.x = element_text(size = 9L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(q1,q2, q3, nrow = 2)

Disa lloje grafikesh qe paraqesin marredhenien mes absence_days dhe physics_score

q4<-ggplot(student_scores) +
  aes(x = absence_days, y = physics_score) +
  geom_line(colour = "#5d8aa8") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e fizikes"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q5<-ggplot(student_scores) +
  aes(x = absence_days, y = physics_score) +
  geom_step(colour = "#5d8aa8") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e fizikes"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q6<-ggplot(student_scores) +
  aes(x = absence_days, y = physics_score) +
  geom_point(colour = "#5d8aa8") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e fizikes"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(q4,q5, q6, nrow = 2)

Disa lloje grafikesh qe paraqesin marredhenien mes absence_days dhe chemistry_score

q7<-ggplot(student_scores) +
  aes(x = absence_days, y = chemistry_score) +
  geom_line(colour = "#e32636") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e kimise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q8<-ggplot(student_scores) +
  aes(x = absence_days, y = chemistry_score) +
  geom_step(colour = "#e32636") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e kimise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q9<-ggplot(student_scores) +
  aes(x = absence_days, y = chemistry_score) +
  geom_point(colour = "#e32636") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e kimise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(q7,q8, q9, nrow = 2)

Disa lloje grafikesh qe paraqesin marredhenien mes absence_days dhe biology_score

q10<-ggplot(student_scores) +
  aes(x = absence_days, y = biology_score) +
  geom_line(colour = "#ffbf00") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e biologjise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q11<-ggplot(student_scores) +
  aes(x = absence_days, y = biology_score) +
  geom_step(colour = "#ffbf00") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e biologjise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q12<-ggplot(student_scores) +
  aes(x = absence_days, y = biology_score) +
  geom_point(colour = "#ffbf00") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e biologjise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(q10,q11, q12, nrow = 2)

Disa lloje grafikesh qe paraqesin marredhenien mes absence_days dhe history_score

q13<-ggplot(student_scores) +
  aes(x = absence_days, y = history_score) +
  geom_line(colour = "#a4c639") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e historise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q14<-ggplot(student_scores) +
  aes(x = absence_days, y = history_score) +
  geom_step(colour = "#a4c639") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e historise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q15<-ggplot(student_scores) +
  aes(x = absence_days, y = history_score) +
  geom_point(colour = "#a4c639") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e historise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(q13,q14,q15, nrow = 2)

Disa lloje grafikesh qe paraqesin marredhenien mes absence_days dhe geography_score

q16<-ggplot(student_scores) +
  aes(x = absence_days, y = geography_score) +
  geom_line(colour = "#cd9575") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e gjeografise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 9L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q17<-ggplot(student_scores) +
  aes(x = absence_days, y = geography_score) +
  geom_step(colour = "#cd9575") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e gjeografise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 8L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q18<-ggplot(student_scores) +
  aes(x = absence_days, y = geography_score) +
  geom_point(colour = "#cd9575") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e gjeografise"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(q16,q17,q18, nrow = 2)

Disa lloje grafikesh qe paraqesin marredhenien mes absence_days dhe english_score

q19<-ggplot(student_scores) +
  aes(x = absence_days, y = english_score) +
  geom_line(colour = "#4b5320") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e anglishtes"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 9L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q20<-ggplot(student_scores) +
  aes(x = absence_days, y = english_score) +
  geom_step(colour = "#4b5320") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e anglishtes"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 8L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
q21<-ggplot(student_scores) +
  aes(x = absence_days, y = english_score) +
  geom_point(colour = "#4b5320") +
  labs(
    x = "Ditet e mungesave",
    y = "Piket ne provimin e anglishtes"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 10L,
    face = "bold"),
    axis.title.x = element_text(size = 10L,
    face = "bold")
  )
library(gridExtra)
grid.arrange(q19,q20,q21, nrow = 2)

Grafike per 2 ndryshore per extracurricular_activities

Disa lloje grafikesh qe paraqesin marredhenien mes extracurricular_activities dhe weekly_self_study_hours

w1<-ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    y = weekly_self_study_hours
  ) +
  geom_violin(adjust = 1L, scale = "area", fill = "#0056F0") +
  labs(
    x = "Aktivitetet jashteshkollore",
    y = "Oret javore te studimit"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 12L,
    face = "bold"),
    axis.title.x = element_text(size = 12L,
    face = "bold")
  )
w2<-ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    y = weekly_self_study_hours
  ) +
  geom_jitter(aes(colour = weekly_self_study_hours), size = 1.2) +  
  scale_color_gradient(low = "yellow", high = "orange") +  
  labs(
    x = "Aktivitetet jashteshkollore",
    y = "Oret javore te studimit"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 14L, face = "bold"),
    axis.title.x = element_text(size = 14L, face = "bold")
  )
library(gridExtra)
grid.arrange(w1,w2, nrow = 2)

Grafiku i poshtëm tregon një shpërndarje të pikave të studentëve në krahasim me orët e vetë-studimit. Nuk duket të ketë një tendencë të qartë që tregon se pjesëmarrja në aktivitete jashtëshkollore ndikon ndjeshëm në rezultatet e studentëve.

Extracurricular_activities dhe career_aspiration

ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    fill = career_aspiration
  ) +
  geom_bar() +
  scale_fill_viridis_d(option = "magma", direction = 1) +
  labs(
    x = "Aktivitetet jashteshkollore",
    y = "Denduria",
    fill = "Profesionet "
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 7L)
  )

Nga grafiku me siper shohim se studentet qe merren me aktivitet jashteshkollore kan me pak aspirata per karrieren ndersa ata student qe nuk merren me aktivitete kane me shume aspirata per karrierren dhe me se shumti per software engineer dhe business owner.

Disa lloje grafikesh qe paraqesin marredhenien mes extracurricular_activities dhe math_score

r1<-ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    y = math_score
  ) +
  geom_jitter(aes(colour = math_score), size = 1.2) +  
  scale_color_gradient(low = "#de6fa1", high = "#9f00ff") +  
  theme_minimal()
r2<-ggplot(student_scores) +
  aes(x = extracurricular_activities, y = math_score, fill = extracurricular_activities) +
  geom_violin(adjust = 1L, scale = "area") +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() 
library(gridExtra)
grid.arrange(r1,r2, nrow = 2)

Nga grafiket me siper veme re se studentet qe nuk merren me aktivitete jashteshkollore kan tendenc te dalin me mire ne provim se sa ata qe merren me aktivitet.

Disa lloje grafikesh qe paraqesin marredhenien mes extracurricular_activities dhe physics_score

r3<-ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    y = physics_score
  ) +
  geom_jitter(aes(colour = physics_score), size = 1.2) +  
  scale_color_gradient(low = "#d2b48c", high = "gold") +  
  theme_minimal()
r4<-ggplot(student_scores) +
  aes(x = extracurricular_activities, y = physics_score, fill = extracurricular_activities) +
  geom_violin(adjust = 1L, scale = "area") +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal() 
library(gridExtra)
grid.arrange(r3,r4, nrow = 2)

Nga grafiku me siper shohim se ka me shume studentet qe nuk merren me aktivitete jashteshkollore dhe dalin mire ne provim se sa ata qe merren me aktivitete.

Disa lloje grafikesh qe paraqesin marredhenien mes extracurricular_activities dhe chemistry_score

r5<-ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    y = chemistry_score
  ) +
  geom_jitter(aes(colour = chemistry_score), size = 1.2) +  
  scale_color_gradient(low = "#d2b48c", high = "#990000") +  
  theme_minimal()
library(ggplot2)
r6<-ggplot(student_scores) +
  aes(x = extracurricular_activities, y = chemistry_score, fill = extracurricular_activities) +
  geom_violin(adjust = 1L, scale = "area") +
  scale_fill_brewer(palette = "Dark2") +
  theme_minimal()
library(gridExtra)
grid.arrange(r5,r6, nrow = 2)

Nga grafiku me siper shohim se ka me shume studentet qe nuk merren me aktivitete jashteshkollore dhe dalin mire ne provim se sa ata qe merren me aktivitete.

Disa lloje grafikesh qe paraqesin marredhenien mes extracurricular_activities dhe biology_score

r7<-ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    y = biology_score
  ) +
  geom_jitter(aes(colour = biology_score), size = 1.2) +  
  scale_color_gradient(low = "#d2b48c", high = "#4682b4") +  
  theme_minimal()
library(ggplot2)
r8<-ggplot(student_scores) +
  aes(x = extracurricular_activities, y = biology_score, fill = extracurricular_activities) +
  geom_violin(adjust = 1L, scale = "area") +
  scale_fill_brewer(palette = "Pastel1") +
  theme_minimal()
library(gridExtra)
grid.arrange(r7,r8, nrow = 2)

Nga grafiku me siper shohim se ka me shume studentet qe nuk merren me aktivitete jashteshkollore dhe dalin mire ne provim se sa ata qe merren me aktivitete.

Disa lloje grafikesh qe paraqesin marredhenien mes extracurricular_activities dhe history_score

r9<-ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    y = history_score
  ) +
  geom_jitter(aes(colour = history_score), size = 1.2) +  
  scale_color_gradient(low = "#d2b48c", high = "#100c08") +  
  theme_minimal()
library(ggplot2)
r10<-ggplot(student_scores) +
  aes(x = extracurricular_activities, y = history_score, fill = extracurricular_activities) +
  geom_violin(adjust = 1L, scale = "area") +
  scale_fill_brewer(palette = "Pastel2") +
  theme_minimal() 
library(gridExtra)
grid.arrange(r9,r10, nrow = 2)

Nga grafiku me siper shohim se ka me shume studentet qe nuk merren me aktivitete jashteshkollore dhe dalin mire ne provim se sa ata qe merren me aktivitete.

Disa lloje grafikesh qe paraqesin marredhenien mes extracurricular_activities dhe geography_score

r11<-ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    y = geography_score
  ) +
  geom_jitter(aes(colour = geography_score), size = 1.2) +  
  scale_color_gradient(low = "#d2b48c", high = "#003399") +  
  theme_minimal()
library(ggplot2)
r12<-ggplot(student_scores) +
  aes(x = extracurricular_activities, y = geography_score, fill = extracurricular_activities) +
  geom_violin(adjust = 1L, scale = "area") +
  scale_fill_brewer(palette = "Paired") +
  theme_minimal() 
library(gridExtra)
grid.arrange(r11,r12, nrow = 2)

Nga grafiku me siper shohim se ka me shume studentet qe nuk merren me aktivitete jashteshkollore dhe dalin mire ne provim se sa ata qe merren me aktivitete.

Disa lloje grafikesh qe paraqesin marredhenien mes extracurricular_activities dhe english_score

r13<-ggplot(student_scores) +
  aes(
    x = extracurricular_activities,
    y = english_score
  ) +
  geom_jitter(aes(colour = english_score), size = 1.2) +  
  scale_color_gradient(low = "#d2b48c", high = "#cf71af") +  
  theme_minimal()
library(ggplot2)
r14<-ggplot(student_scores) +
  aes(x = extracurricular_activities, y = english_score, fill = extracurricular_activities) +
  geom_violin(adjust = 1L, scale = "area") +
  scale_fill_brewer(palette = "Accent") +
  theme_minimal() 
library(gridExtra)
grid.arrange(r13,r14, nrow = 2)

Nga grafiku me siper shohim se ka me shume studentet qe nuk merren me aktivitete jashteshkollore dhe dalin mire ne provim se sa ata qe merren me aktivitete.

Grafike per 2 ndryshore per weekly_self_study_hours

Weekly_self_study_hours dhe career_aspirations

ggplot(student_scores) +
  aes(x = weekly_self_study_hours, fill = career_aspiration) +
  geom_histogram(bins = 30L) +
  scale_fill_viridis_d(option = "inferno", direction = 1) +
  labs(
    x = "Oret javore te studimit",
    y = "Denduria",
    fill = "Profesioni"
  ) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 7L)
  )

Ky grafik paraqet orët javore të studimit për individë në profesione të ndryshme. Ja disa pikat kryesore:

-Shumica e profesioneve kanë një numër të madh të orëve të studimit, me një piku të dukshëm për Kontabilistët rreth 0 deri në 10 orë në javë. - Profesionet si Artistët dhe Pronarët e Bizneseve gjithashtu kanë kohë të konsiderueshme studimi, por jo aq sa Kontabilistët. - Ngjyrat më të errëta në grafik tregojnë një densitet më të lartë të njerëzve që studiojnë për ato orë specifike. -Tendencat e studimit ndryshojnë për çdo profesion, duke treguar se disa profesione kërkojnë më shumë kohë studimi në krahasim me të tjerat.

Disa lloje grafikesh qe paraqesin marredhenien mes weekly_self_study_hours dhe math_score

library(plotly)
Warning: package ‘plotly’ was built under R version 4.3.3Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
plot_ly(student_scores,x=~weekly_self_study_hours,color=~math_score,colors="Dark2")
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arraysNo trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arrays

Për më pak orë vetë-studimi, rezultatet janë më të larta dhe përgjithësisht bien me rritjen e orëve të studimit, përveç një piku rreth 10 orëve të studimit. Kjo mund të sugjerojë se një sasi e moderuar e vetë-studimit është më efektive, ose që studentët që studiojnë shumë mund të kenë më pak kohë për të përqendruar në matematikë.

weekly_self_study_hours dhe physics_score

library(plotly)
plot_ly(student_scores,x=~weekly_self_study_hours,color=~physics_score,colors="Accent")
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arraysNo trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arrays
  • Ka një rënie të ndjeshme në orët e vetëstudimit pas 10 orëve javore, duke treguar se studentët mund të kenë kufizime në kohën e tyre ose efikasitetin e studimit.
  • Rezultatet në fizikë gjithashtu bien pas 10 orëve të studimit, që mund të sugjerojë një mungesë të korrelacionit të drejtpërdrejtë midis kohës së studimit dhe performancës akademike. Kjo analizë sugjeron se sasia e kohës së vetëstudimit nuk është gjithmonë një tregues i qartë i suksesit akademik dhe se faktorë të tjerë mund të luajnë një rol të rëndësishëm.

weekly_self_study_hours dhe chemistry_score

library(plotly)
plot_ly(student_scores,x=~weekly_self_study_hours,color=~chemistry_score,colors="Paired")
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arraysNo trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arrays
  • Grafiku tregon një rritje të përgjithshme të notave të kimisë me rritjen e orëve të studimit vetjak javor, nga 0 deri në 50 orë.
  • Notat variojnë nga 50 deri në 100, dhe shumica e të dhënave tregojnë se sa më shumë orë studimi, aq më lart është nota.
  • Ka disa raste ku pavarësisht shtimit të orëve të studimit, nota nuk është rritur siç pritej, duke treguar se ka faktorë të tjerë që ndikojnë në performancën. Ky analizë tregon se, përgjithësisht, ka një lidhje pozitive midis orëve të studimit dhe notave të kimisë.

weekly_self_study_hours dhe biology_score

library(plotly)
Warning: package ‘plotly’ was built under R version 4.3.3Loading required package: ggplot2
Warning: package ‘ggplot2’ was built under R version 4.3.3Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
plot_ly(student_scores,x=~weekly_self_study_hours,color=~biology_score,colors="Pastel1")
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arraysNo trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arrays

Nga grafiku shohim se mund të jetë që studimi i gjatë nuk është aq efektiv, dhe pas një pike, orët shtesë të studimit nuk kontribuojnë në përmirësimin e rezultateve.

weekly_self_study_hours dhe history_score

library(plotly)
plot_ly(student_scores,x=~weekly_self_study_hours,color=~history_score,colors="Pastel2")
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arraysNo trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arrays
  • Shtimi i orëve të studimit vetjak javor duket se sjell përmirësim në rezultatet e historisë. Nga grafiku, rezultatet e historisë rriten ndërsa rriten orët e studimit vetjak.

weekly_self_study_hours dhe geography_score

library(plotly)
plot_ly(student_scores,x=~weekly_self_study_hours,color=~geography_score,colors="Set1")
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arraysNo trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arrays
  • Ka një rritje të përgjithshme në rezultatet e gjeografisë me rritjen e orëve të studimit vetjak javor. Shkalla e rezultateve varion nga 60 deri në 100, dhe duket se ka një tendencë pozitive në lidhje me shtimin e orëve të studimit.

weekly_self_study_hours dhe english_score

library(plotly)
plot_ly(student_scores,x=~weekly_self_study_hours,color=~english_score,colors="Set2")
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arraysNo trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#histogram
Warning: textfont.color doesn't (yet) support data arraysWarning: no non-missing arguments to min; returning InfWarning: no non-missing arguments to max; returning -InfWarning: textfont.color doesn't (yet) support data arrays

Duket se ka një korrelacion pozitiv, sa më shumë orë studimi, aq më të larta janë pikët në anglisht.

Grafike per 2 ndryshore per career_aspiration

Disa lloje grafikesh qe paraqesin marredhenien mes career_aspiration dhe math_score

ggplot(student_scores) +
  aes(x = "", y = math_score, fill = career_aspiration) +
  geom_boxplot() +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

  • Nga grafiku shohim se profesionet si Doktor dhe Inxhinier Ndërtimi kanë mediana më të larta, që sugjeron se studentët që synojnë këto fusha kanë tendencë të kenë pikë më të larta në matematikë. Ndersa profesionet si Artist dhe Shkrimtar kanë mediana më të ulëta, që mund të tregojë një interes më të ulët ose nevojë për aftësi matematikore në këto fusha.
ggplot(student_scores) +
  aes(x = math_score, fill = career_aspiration) +
  geom_density(adjust = 1L) +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Disa lloje grafikesh qe paraqesin marredhenien mes career_aspiration dhe physics_score

ggplot(student_scores) +
  aes(x = "", y = physics_score, fill = career_aspiration) +
  geom_boxplot() +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

  • Profesionet e ndryshme si Kontabilist, Inxhinier Ndërtimi, Zyrtar Qeveritar, Inxhinier Software, Shkrimtar, etj janë të përfaqësuara. Ne provimin e fizikes pikët variojnë nga 50 deri në 100, duke treguar një gamë të gjerë të performancës së studentëve. Vizat vertikale mbi dhe poshtë çdo shtylle tregojnë variacionin ose gamën e pikëve për çdo kategori aspirate karriere.
ggplot(student_scores) +
  aes(x = physics_score, fill = career_aspiration) +
  geom_density(adjust = 1L) +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Disa lloje grafikesh qe paraqesin marredhenien mes career_aspiration dhe chemistry_score

ggplot(student_scores) +
  aes(x = "", y = chemistry_score, fill = career_aspiration) +
  geom_boxplot() +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

-Shohim se disa kategori si “Doktor” dhe “Inxhinier” mund të kenë kuti grafike me median më të lartë, që tregon një performancë më të mirë në kiminë. Kuti grafiket gjithashtu tregojnë variacionin e pikëve brenda secilës kategori, me disa kategori që kanë një shpërndarje më të ngushtë dhe të tjerët me një shpërndarje më të gjerë. Kategori të tjera mund të kenë kuti grafike me median më të ulët, që sugjeron një performancë më të dobët në kiminë.

ggplot(student_scores) +
  aes(x = chemistry_score, fill = career_aspiration) +
  geom_density(adjust = 1L) +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Disa lloje grafikesh qe paraqesin marredhenien mes career_aspiration dhe biology_score

ggplot(student_scores) +
  aes(x = "", y = biology_score, fill = career_aspiration) +
  geom_boxplot() +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Shohim se profesionet si Doktor dhe Shkencëtar kanë pikët më të larta në biologji, që tregon një korrelacion të fortë midis interesit në këto fusha dhe performancës akademike. Disa profesione si Artist dhe Lojtar i Videolojërave kanë pikë më të ulëta në biologji, që mund të tregojë një interes më të vogël në biologji ose një lidhje më të dobët me këto karriera. Ky grafik mund të jetë i dobishëm për të kuptuar më mirë se si interesat e studentëve për karriera të ndryshme korrelojnë me performancën e tyre akademike në biologji.

ggplot(student_scores) +
  aes(x = biology_score, fill = career_aspiration) +
  geom_density(adjust = 1L) +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Disa lloje grafikesh qe paraqesin marredhenien mes career_aspiration dhe history_score

ggplot(student_scores) +
  aes(x = "", y = history_score, fill = career_aspiration) +
  geom_boxplot() +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Shohim se pikët e historisë për çdo aspiratë profesionale janë shpërndarë nga 50 deri në 100. Profesionet si Inxhinier Ndërtimi, Zhvillues Lojërash, dhe Investitor në Bursë kanë një gamë më të gjerë të pikëve, që tregon një ndryshim më të madh në rezultatet e tyre.Disa profesione si Avokat, Shkencëtar, dhe Inxhinier Software duket se kanë median më të lartë të pikëve, që sugjeron një performancë më të mirë në përgjithësi.

ggplot(student_scores) +
  aes(x = history_score, fill = career_aspiration) +
  geom_density(adjust = 1L) +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Disa lloje grafikesh qe paraqesin marredhenien mes career_aspiration dhe geography_score

ggplot(student_scores) +
  aes(x = "", y = geography_score, fill = career_aspiration) +
  geom_boxplot() +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Shohim se disa profesione si Inxhinier Ndërtimi dhe Avokat, kanë një shpërndarje më të gjerë të pikëve, që tregon një variacion më të madh në njohuritë gjeografike të individëve në këto profesione.Medianet më të larta ose më të ulëta, që tregon një performancë mesatare më të lartë ose më të ulët në gjeografi për ato role.Nëse vijat qe dalin nga boxploti janë të gjata, kjo tregon se ka pikë të gjeografisë që janë shumë larg medianës, që mund të tregojnë për raste të veçanta ose të dhëna që dalin nga norma.

ggplot(student_scores) +
  aes(x = geography_score, fill = career_aspiration) +
  geom_density(adjust = 1L) +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Disa lloje grafikesh qe paraqesin marredhenien mes career_aspiration dhe english_score

ggplot(student_scores) +
  aes(x = "", y = english_score, fill = career_aspiration) +
  geom_boxplot() +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(
    axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

Shohim se shumica e profesioneve kanë një shpërndarje të ngjashme të pikëve të anglishtes, që variojnë nga 50 deri në 100. Vija që zgjaten mbi dhe poshtë kutisë tregojnë variabilitetin jashtë kuartileve të sipërme dhe të poshtme, duke treguar gamën ku bie shumica e vlerave.Pikat individuale përtej vijave te boxplotit përfaqësojnë vlera që dalin jashtë shpërndarjes së zakonshme.

ggplot(student_scores) +
  aes(x = english_score, fill = career_aspiration) +
  geom_density(adjust = 1L) +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  theme(axis.title.y = element_text(size = 13L, face = "bold"),
    axis.title.x = element_text(size = 13L, face = "bold"),
    legend.title = element_text(size = 10L),
    legend.position = "bottom",
    legend.text = element_text(size = 6L)
  )

library(wordcloud)
Warning: package ‘wordcloud’ was built under R version 4.3.3Loading required package: RColorBrewer
library(RColorBrewer)
professions <- c("Accountant","Artist","Banker","Business Owner","Construction Engineer","Designer","Doctor","Game Developer","Government Officer","Lawyer","Real Estate Developer","Scientist","Software Engineer","Stock Investor","Teacher","Writer")


filtered_data <- student_scores[student_scores$career_aspiration %in% professions, ]


freq <- table(filtered_data$career_aspiration)


wordcloud(names(freq), freq, random.order=FALSE, colors=brewer.pal(8, "Dark2"))

Tabelat e kontingjences

library(dplyr)
Warning: package ‘dplyr’ was built under R version 4.3.3
Attaching package: ‘dplyr’

The following object is masked from ‘package:gridExtra’:

    combine

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(tidyr)
Warning: package ‘tidyr’ was built under R version 4.3.3
library(ggplot2)
library(DataExplorer)
Warning: package ‘DataExplorer’ was built under R version 4.3.3
library(datawizard)
Warning: package ‘datawizard’ was built under R version 4.3.3
library(MASS)
Warning: package ‘MASS’ was built under R version 4.3.3
Attaching package: ‘MASS’

The following object is masked from ‘package:dplyr’:

    select

The following object is masked from ‘package:plotly’:

    select
glimpse(student_scores)
Rows: 2,000
Columns: 16
$ id                         <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
$ first_name                 <chr> "Paul", "Danielle", "Tina", "Tara", "Anthony", "Kelly", …
$ last_name                  <chr> "Casey", "Sandoval", "Andrews", "Clark", "Campos", "Wade…
$ gender                     <chr> "male", "female", "female", "female", "male", "female", …
$ part_time_job              <chr> "False", "False", "False", "False", "False", "False", "F…
$ absence_days               <dbl> 3, 2, 9, 5, 5, 2, 3, 2, 6, 3, 2, 1, 7, 10, 3, 6, 3, 2, 1…
$ extracurricular_activities <chr> "False", "False", "True", "False", "False", "False", "Tr…
$ weekly_self_study_hours    <dbl> 27, 47, 13, 3, 10, 26, 23, 34, 25, 18, 7, 7, 4, 2, 39, 0…
$ career_aspiration          <chr> "Lawyer", "Doctor", "Government Officer", "Artist", "Unk…
$ math_score                 <dbl> 73, 90, 81, 71, 84, 93, 99, 95, 94, 98, 65, 80, 94, 66, …
$ history_score              <dbl> 81, 86, 97, 74, 77, 100, 96, 95, 68, 69, 60, 61, 59, 94,…
$ physics_score              <dbl> 93, 96, 95, 88, 65, 67, 97, 82, 94, 88, 97, 100, 69, 86,…
$ chemistry_score            <dbl> 97, 100, 96, 80, 65, 78, 73, 63, 85, 71, 94, 65, 67, 100…
$ biology_score              <dbl> 63, 90, 65, 89, 80, 72, 88, 84, 81, 67, 71, 87, 89, 57, …
$ english_score              <dbl> 80, 88, 77, 63, 74, 80, 76, 70, 74, 71, 81, 64, 65, 90, …
$ geography_score            <dbl> 87, 90, 94, 86, 76, 84, 64, 85, 72, 73, 66, 61, 73, 63, …
library(dplyr)
df1<-student_scores %>% dplyr::select(gender,part_time_job)
head(df1)
#krijojme tabelen e kontigjences duke perdorur funksionin table
Tab_kontigjence1<-table(df1$gender,df1$part_time_job)
Tab_kontigjence1
        
         False True
  female   835  167
  male     849  149
  • Tabela tregon se ka një ndarje relativisht të barabartë mes femrave dhe meshkujve që nuk punojnë me kohë të pjesshme, me 835 femra dhe 849 meshkuj që nuk janë të punësuar në këtë mënyrë. Nga të dhënat, duket se ka një numër më të vogël të të dy gjinive që punojnë me kohë të pjesshme, me 167 femra dhe 149 meshkuj që raportojnë se kanë një punë të tillë.
prop.table(Tab_kontigjence1,margin=1)%>%round(2)
        
         False True
  female  0.83 0.17
  male    0.85 0.15
prop.table(Tab_kontigjence1)%>%round(2)
        
         False True
  female  0.42 0.08
  male    0.42 0.07
H_2.1<-chisq.test(Tab_kontigjence1)
H_2.1

    Pearson's Chi-squared test with Yates' continuity correction

data:  Tab_kontigjence1
X-squared = 1.0069, df = 1, p-value = 0.3156
H_2.1$observed
        
         False True
  female   835  167
  male     849  149
H_2.1$expected
        
           False    True
  female 843.684 158.316
  male   840.316 157.684

Tabela tregon vlerat e vëzhguara për femra dhe mashkull me dy kategori False dhe True. Rezultatet e Testit: X-squared: Vlera e llogaritur e X-squared është 1.0069. Liria e Gradës (df): Testi ka një gradë lirie, që do të thotë se ka vetëm një kategori të pavarur. P-vlera: P-vlera është 0.3156, e cila është më e madhe se niveli standard i rëndësisë prej 0.05, duke treguar se nuk ka dallim statistikisht të rëndësishëm midis grupeve të femrave dhe meshkujve për kategoritë e vëzhguara.

mosaicplot(t(Tab_kontigjence1), col=c("orange","green"), cex.axis = 1,sub="Punesimi part-time",ylab="Gjinia",main="")

library(dplyr)
df2<-student_scores %>% dplyr::select(gender,extracurricular_activities)
head(df2)
#krijojme tabelen e kontigjences duke perdorur funksionin table
Tab_kontigjence2<-table(df2$gender,df2$extracurricular_activities)
Tab_kontigjence2
        
         False True
  female   795  207
  male     797  201

Kjo tabelë mund të përdoret për të analizuar ndonjë lidhje potenciale midis gjinisë dhe aktivitetit jashtëkurrikular të shënuar si True ose False. Mund të vërehet se ka një ndarje relativisht të barabartë midis femrave dhe meshkujve për të dyja kategoritë, që sugjeron se nuk ka ndonjë dallim të madh në pjesëmarrjen në aktivitete jashtëkurrikulare bazuar në gjini.

prop.table(Tab_kontigjence2,margin=1)%>%round(2)
        
         False True
  female  0.79 0.21
  male    0.80 0.20
prop.table(Tab_kontigjence2)%>%round(2)
        
         False True
  female   0.4  0.1
  male     0.4  0.1
H_2.2<-chisq.test(Tab_kontigjence2)
H_2.2

    Pearson's Chi-squared test with Yates' continuity correction

data:  Tab_kontigjence2
X-squared = 0.053903, df = 1, p-value = 0.8164
H_2.2$observed
        
         False True
  female   795  207
  male     797  201
H_2.2$expected
        
           False    True
  female 797.592 204.408
  male   794.408 203.592

Rezultatet e testit të hi-katrorit na tregojnë një vlerë X-katrore prej 0.05903, me një gradë lirie (df) prej 1, dhe një vlerë p prej 0.8164. Kjo vlerë e lartë e p-së sugjeron se nuk ka një lidhje të rëndësishme statistikore midis variablave që janë duke u testuar, pasi është shumë më e lartë se niveli i zakonshëm alfa prej 0.05. ezultatet tregojne se nuk ka ndonjë dallim të madh midis frekuencave të vëzhguara dhe atyre të parashikuara, duke treguar se nuk ka prova të mjaftueshme për të hedhur poshtë hipotezën fillestare se nuk ka asnjë lidhje.

mosaicplot(t(Tab_kontigjence2), col=c("red","black"), cex.axis = 1,sub="Aktivitetet jashteshkollore",ylab="Gjinia",main="")

library(dplyr)
df3<-student_scores %>% dplyr::select(gender,career_aspiration)
head(df3)
#krijojme tabelen e kontigjences duke perdorur funksionin table
Tab_kontigjence3<-table(df3$career_aspiration,df3$gender)
Tab_kontigjence3
                       
                        female male
  Accountant                64   62
  Artist                    42   25
  Banker                   103   66
  Business Owner           164  145
  Construction Engineer      0   68
  Designer                  32   24
  Doctor                    53   66
  Game Developer            31   32
  Government Officer        31   30
  Lawyer                    66   72
  Real Estate Developer     45   38
  Scientist                 19   20
  Software Engineer        141  174
  Stock Investor            25   48
  Teacher                   59    0
  Unknown                  109  114
  Writer                    18   14

Tabela paraqet një ndarje të numrit të individëve sipas gjinisë në profesione të ndryshme.Disa profesione si Business Owner dhe Teacher kanë një numër të lartë të përfaqësuesve nga të dy gjinitë, ndërsa të tjerët si Software Engineer dhe Stock Investor janë më të dominuar nga meshkujt.Në profesione si Construction Engineer dhe Real Estate Developer, ka një dallim të dukshëm në numrin e përfaqësuesve nga gjinia mashkullore në krahasim me atë femërore.

library(dplyr)
prop.table(Tab_kontigjence3,margin=1)%>%round(2)
                       
                        female male
  Accountant              0.51 0.49
  Artist                  0.63 0.37
  Banker                  0.61 0.39
  Business Owner          0.53 0.47
  Construction Engineer   0.00 1.00
  Designer                0.57 0.43
  Doctor                  0.45 0.55
  Game Developer          0.49 0.51
  Government Officer      0.51 0.49
  Lawyer                  0.48 0.52
  Real Estate Developer   0.54 0.46
  Scientist               0.49 0.51
  Software Engineer       0.45 0.55
  Stock Investor          0.34 0.66
  Teacher                 1.00 0.00
  Unknown                 0.49 0.51
  Writer                  0.56 0.44
prop.table(Tab_kontigjence3)%>%round(2)
                       
                        female male
  Accountant              0.03 0.03
  Artist                  0.02 0.01
  Banker                  0.05 0.03
  Business Owner          0.08 0.07
  Construction Engineer   0.00 0.03
  Designer                0.02 0.01
  Doctor                  0.03 0.03
  Game Developer          0.02 0.02
  Government Officer      0.02 0.01
  Lawyer                  0.03 0.04
  Real Estate Developer   0.02 0.02
  Scientist               0.01 0.01
  Software Engineer       0.07 0.09
  Stock Investor          0.01 0.02
  Teacher                 0.03 0.00
  Unknown                 0.05 0.06
  Writer                  0.01 0.01
H_2.3<-chisq.test(Tab_kontigjence3)
H_2.3

    Pearson's Chi-squared test

data:  Tab_kontigjence3
X-squared = 155.39, df = 16, p-value < 2.2e-16
H_2.3$observed
                       
                        female male
  Accountant                64   62
  Artist                    42   25
  Banker                   103   66
  Business Owner           164  145
  Construction Engineer      0   68
  Designer                  32   24
  Doctor                    53   66
  Game Developer            31   32
  Government Officer        31   30
  Lawyer                    66   72
  Real Estate Developer     45   38
  Scientist                 19   20
  Software Engineer        141  174
  Stock Investor            25   48
  Teacher                   59    0
  Unknown                  109  114
  Writer                    18   14
H_2.3$expected
                       
                         female    male
  Accountant             63.126  62.874
  Artist                 33.567  33.433
  Banker                 84.669  84.331
  Business Owner        154.809 154.191
  Construction Engineer  34.068  33.932
  Designer               28.056  27.944
  Doctor                 59.619  59.381
  Game Developer         31.563  31.437
  Government Officer     30.561  30.439
  Lawyer                 69.138  68.862
  Real Estate Developer  41.583  41.417
  Scientist              19.539  19.461
  Software Engineer     157.815 157.185
  Stock Investor         36.573  36.427
  Teacher                29.559  29.441
  Unknown               111.723 111.277
  Writer                 16.032  15.968

Testi Chi-squared ka prodhuar një vlerë të X-squared prej 123.87 me shkalle lirie 12 dhe një vlerë p < 2.2e-16. Një vlerë p kaq e ulët tregon se ka një ndryshim statistikisht të rëndësishëm midis frekuencave të vëzhguara dhe atyre të pritura, duke sugjeruar një lidhje të fortë midis variablave të testuara.Kjo do të thotë se variablat që janë testuar nuk janë të pavarura nga njëra-tjetra dhe ka një lidhje ose ndikim të ndërsjellë.

mosaicplot(t(Tab_kontigjence3), col=c("pink","turquoise"), cex.axis = 0.8, las=1, sub="Gjinia", ylab="Profesionet", main="")

library(dplyr)
df4<-student_scores %>% dplyr::select(part_time_job,extracurricular_activities)
head(df4)
#krijojme tabelen e kontigjences duke perdorur funksionin table
Tab_kontigjence4<-table(df4$part_time_job,df4$extracurricular_activities)
Tab_kontigjence4
       
        False True
  False  1338  346
  True    254   62

Tabela tregon marrëdhënien midis punës me kohë të pjesshme dhe pjesëmarrjes në aktivitete jashtëkurrikulare.Ka 1338 raste ku individët nuk kanë as punë me kohë të pjesshme as pjesëmarrje në aktivitete jashtëkurrikulare, 346 raste ku nuk kanë punë por marrin pjesë në aktivitete, 254 raste ku kanë punë por nuk marrin pjesë, dhe 62 raste ku kanë të dyja. Duket se ka më shumë individë që nuk kanë punë me kohë të pjesshme dhe as nuk marrin pjesë në aktivitete jashtëkurrikulare.

prop.table(Tab_kontigjence4,margin=1)%>%round(2)
       
        False True
  False  0.79 0.21
  True   0.80 0.20
prop.table(Tab_kontigjence4)%>%round(2)
       
        False True
  False  0.67 0.17
  True   0.13 0.03
H_2.4<-chisq.test(Tab_kontigjence4)
H_2.4

    Pearson's Chi-squared test with Yates' continuity correction

data:  Tab_kontigjence4
X-squared = 0.089277, df = 1, p-value = 0.7651
H_2.4$observed
       
        False True
  False  1338  346
  True    254   62
H_2.4$expected
       
           False    True
  False 1340.464 343.536
  True   251.536  64.464

Vlera e llogaritur e X-katrore është 0.089277, e cila është shumë e ulët, duke treguar se nuk ka dallim të madh midis frekuencave të vëzhguara dhe atyre të pritura. Testi ka vetëm 1 gradë lirie, që është tipike për një tabelë kontingjence 2x2. Vlera p është 0.7651, e cila është shumë më e lartë se niveli standard i rëndësisë prej 0.05. Rezultatet tregojne se nuk ka një lidhje të rëndësishme midis variablave.

mosaicplot(t(Tab_kontigjence4), col=c("purple","gray"), cex.axis = 1,sub="part_time_job",ylab="Aktivitetet jashtshkollore",main="")

library(dplyr)
df5<-student_scores %>% dplyr::select(part_time_job,career_aspiration)
head(df5)
#krijojme tabelen e kontigjences duke perdorur funksionin table
Tab_kontigjence5<-table(df5$career_aspiration,df5$part_time_job)
Tab_kontigjence5
                       
                        False True
  Accountant              118    8
  Artist                   60    7
  Banker                  151   18
  Business Owner          149  160
  Construction Engineer    64    4
  Designer                 51    5
  Doctor                  107   12
  Game Developer           55    8
  Government Officer       57    4
  Lawyer                  129    9
  Real Estate Developer    79    4
  Scientist                35    4
  Software Engineer       277   38
  Stock Investor           61   12
  Teacher                  54    5
  Unknown                 207   16
  Writer                   30    2

*Nga te dhenat tona ne tabele ne shofim se pjesa me e madhe e studenteve qe nuk kane part time job aspirojne te behen software engineer.Ndersa ata student qe kane part time job aspirojne te behen business owner.Ne nje pjese te mire te profesioneve vihen re dallime te medha mes studenteve qe punojne e nuk punojne part-time.

library(dplyr)
prop.table(Tab_kontigjence5,margin=1)%>%round(2)
                       
                        False True
  Accountant             0.94 0.06
  Artist                 0.90 0.10
  Banker                 0.89 0.11
  Business Owner         0.48 0.52
  Construction Engineer  0.94 0.06
  Designer               0.91 0.09
  Doctor                 0.90 0.10
  Game Developer         0.87 0.13
  Government Officer     0.93 0.07
  Lawyer                 0.93 0.07
  Real Estate Developer  0.95 0.05
  Scientist              0.90 0.10
  Software Engineer      0.88 0.12
  Stock Investor         0.84 0.16
  Teacher                0.92 0.08
  Unknown                0.93 0.07
  Writer                 0.94 0.06
prop.table(Tab_kontigjence5)%>%round(2)
                       
                        False True
  Accountant             0.06 0.00
  Artist                 0.03 0.00
  Banker                 0.08 0.01
  Business Owner         0.07 0.08
  Construction Engineer  0.03 0.00
  Designer               0.03 0.00
  Doctor                 0.05 0.01
  Game Developer         0.03 0.00
  Government Officer     0.03 0.00
  Lawyer                 0.06 0.00
  Real Estate Developer  0.04 0.00
  Scientist              0.02 0.00
  Software Engineer      0.14 0.02
  Stock Investor         0.03 0.01
  Teacher                0.03 0.00
  Unknown                0.10 0.01
  Writer                 0.01 0.00
H_2.5<-chisq.test(Tab_kontigjence5)
H_2.5

    Pearson's Chi-squared test

data:  Tab_kontigjence5
X-squared = 365.99, df = 16, p-value < 2.2e-16
H_2.5$observed
                       
                        False True
  Accountant              118    8
  Artist                   60    7
  Banker                  151   18
  Business Owner          149  160
  Construction Engineer    64    4
  Designer                 51    5
  Doctor                  107   12
  Game Developer           55    8
  Government Officer       57    4
  Lawyer                  129    9
  Real Estate Developer    79    4
  Scientist                35    4
  Software Engineer       277   38
  Stock Investor           61   12
  Teacher                  54    5
  Unknown                 207   16
  Writer                   30    2
H_2.5$expected
                       
                          False   True
  Accountant            106.092 19.908
  Artist                 56.414 10.586
  Banker                142.298 26.702
  Business Owner        260.178 48.822
  Construction Engineer  57.256 10.744
  Designer               47.152  8.848
  Doctor                100.198 18.802
  Game Developer         53.046  9.954
  Government Officer     51.362  9.638
  Lawyer                116.196 21.804
  Real Estate Developer  69.886 13.114
  Scientist              32.838  6.162
  Software Engineer     265.230 49.770
  Stock Investor         61.466 11.534
  Teacher                49.678  9.322
  Unknown               187.766 35.234
  Writer                 26.944  5.056

Testi Chi-squared ka prodhuar një vlerë të X-squared prej 365.99 me shkalle lirie 16 dhe një vlerë p < 2.2e-16 Një vlerë p kaq e ulët tregon se ka një ndryshim statistikisht të rëndësishëm midis frekuencave të vëzhguara dhe atyre të pritura, duke sugjeruar një lidhje të fortë midis variablave të testuara.Kjo do të thotë se variablat që janë testuar nuk janë të pavarura nga njëra-tjetra dhe ka një lidhje ose ndikim të ndërsjellë.

mosaicplot(t(Tab_kontigjence5), col=c("red","gray"), cex.axis = 0.8, las=1, sub="Aktivitetet jashteshkollore", ylab="Profesionet", main="")

library(dplyr)
df6<-student_scores %>% dplyr::select(extracurricular_activities,career_aspiration)
head(df6)
#krijojme tabelen e kontigjences duke perdorur funksionin table
Tab_kontigjence6<-table(df6$career_aspiration,df6$extracurricular_activities)
Tab_kontigjence6
                       
                        False True
  Accountant              100   26
  Artist                   47   20
  Banker                  128   41
  Business Owner          247   62
  Construction Engineer    52   16
  Designer                 51    5
  Doctor                  104   15
  Game Developer           54    9
  Government Officer       49   12
  Lawyer                  112   26
  Real Estate Developer    55   28
  Scientist                31    8
  Software Engineer       247   68
  Stock Investor           59   14
  Teacher                  50    9
  Unknown                 179   44
  Writer                   27    5

*Nga te dhenat tona ne tabele ne shofim se pjesa me e madhe e studenteve qe nuk merren dhe qe merren me aktivitete jashteshkollore aspirojne te behen Software Engineer dhe Business Owner.Pjesa me e vogel e studenteve qe merren me aktivitete jashteshkollore aspiroje te behen writer dhe designer.

library(dplyr)
prop.table(Tab_kontigjence6,margin=1)%>%round(2)
                       
                        False True
  Accountant             0.79 0.21
  Artist                 0.70 0.30
  Banker                 0.76 0.24
  Business Owner         0.80 0.20
  Construction Engineer  0.76 0.24
  Designer               0.91 0.09
  Doctor                 0.87 0.13
  Game Developer         0.86 0.14
  Government Officer     0.80 0.20
  Lawyer                 0.81 0.19
  Real Estate Developer  0.66 0.34
  Scientist              0.79 0.21
  Software Engineer      0.78 0.22
  Stock Investor         0.81 0.19
  Teacher                0.85 0.15
  Unknown                0.80 0.20
  Writer                 0.84 0.16
prop.table(Tab_kontigjence6)%>%round(2)
                       
                        False True
  Accountant             0.05 0.01
  Artist                 0.02 0.01
  Banker                 0.06 0.02
  Business Owner         0.12 0.03
  Construction Engineer  0.03 0.01
  Designer               0.03 0.00
  Doctor                 0.05 0.01
  Game Developer         0.03 0.00
  Government Officer     0.02 0.01
  Lawyer                 0.06 0.01
  Real Estate Developer  0.03 0.01
  Scientist              0.02 0.00
  Software Engineer      0.12 0.03
  Stock Investor         0.03 0.01
  Teacher                0.03 0.00
  Unknown                0.09 0.02
  Writer                 0.01 0.00
H_2.6<-chisq.test(Tab_kontigjence6)
H_2.6

    Pearson's Chi-squared test

data:  Tab_kontigjence6
X-squared = 27.243, df = 16, p-value = 0.03886
H_2.6$observed
                       
                        False True
  Accountant              100   26
  Artist                   47   20
  Banker                  128   41
  Business Owner          247   62
  Construction Engineer    52   16
  Designer                 51    5
  Doctor                  104   15
  Game Developer           54    9
  Government Officer       49   12
  Lawyer                  112   26
  Real Estate Developer    55   28
  Scientist                31    8
  Software Engineer       247   68
  Stock Investor           59   14
  Teacher                  50    9
  Unknown                 179   44
  Writer                   27    5
H_2.6$expected
                       
                          False   True
  Accountant            100.296 25.704
  Artist                 53.332 13.668
  Banker                134.524 34.476
  Business Owner        245.964 63.036
  Construction Engineer  54.128 13.872
  Designer               44.576 11.424
  Doctor                 94.724 24.276
  Game Developer         50.148 12.852
  Government Officer     48.556 12.444
  Lawyer                109.848 28.152
  Real Estate Developer  66.068 16.932
  Scientist              31.044  7.956
  Software Engineer     250.740 64.260
  Stock Investor         58.108 14.892
  Teacher                46.964 12.036
  Unknown               177.508 45.492
  Writer                 25.472  6.528

Testi Chi-squared ka prodhuar një vlerë të X-squared prej 27.243 me shkalle lirie 16 dhe një vlerë p= 0.03886 Një vlerë p kaq e ulët tregon se ka një ndryshim statistikisht të rëndësishëm midis frekuencave të vëzhguara dhe atyre të pritura, duke sugjeruar një lidhje të fortë midis variablave të testuara.Kjo do të thotë se variablat që janë testuar nuk janë të pavarura nga njëra-tjetra dhe ka një lidhje ose ndikim të ndërsjellë.

mosaicplot(t(Tab_kontigjence6), col=c("#ffbf00","#a4c639"), cex.axis = 0.8, las=1, sub="Aktivitetet jashteshkollore", ylab="Profesionet", main="")

Ndertimi i modelit te regresit linear

library(correlation)
correlation (student_scores)
# Correlation Matrix (pearson-method)

Parameter1              |              Parameter2 |         r |         95% CI | t(1998) |         p
----------------------------------------------------------------------------------------------------
id                      |            absence_days |     -0.02 | [-0.06,  0.03] |   -0.80 | > .999   
id                      | weekly_self_study_hours |  8.52e-03 | [-0.04,  0.05] |    0.38 | > .999   
id                      |              math_score |     -0.01 | [-0.06,  0.03] |   -0.63 | > .999   
id                      |           history_score |      0.02 | [-0.02,  0.07] |    0.98 | > .999   
id                      |           physics_score | -2.00e-03 | [-0.05,  0.04] |   -0.09 | > .999   
id                      |         chemistry_score |  4.73e-03 | [-0.04,  0.05] |    0.21 | > .999   
id                      |           biology_score |      0.05 | [ 0.00,  0.09] |    2.03 | 0.422    
id                      |           english_score | -1.91e-03 | [-0.05,  0.04] |   -0.09 | > .999   
id                      |         geography_score | -5.97e-03 | [-0.05,  0.04] |   -0.27 | > .999   
absence_days            | weekly_self_study_hours |     -0.29 | [-0.33, -0.25] |  -13.35 | < .001***
absence_days            |              math_score |     -0.24 | [-0.28, -0.20] |  -10.91 | < .001***
absence_days            |           history_score |     -0.13 | [-0.17, -0.08] |   -5.78 | < .001***
absence_days            |           physics_score |     -0.14 | [-0.18, -0.09] |   -6.16 | < .001***
absence_days            |         chemistry_score |     -0.08 | [-0.13, -0.04] |   -3.77 | 0.003**  
absence_days            |           biology_score |     -0.09 | [-0.13, -0.05] |   -4.06 | 0.001**  
absence_days            |           english_score |     -0.08 | [-0.13, -0.04] |   -3.81 | 0.003**  
absence_days            |         geography_score | -2.94e-03 | [-0.05,  0.04] |   -0.13 | > .999   
weekly_self_study_hours |              math_score |      0.39 | [ 0.36,  0.43] |   19.14 | < .001***
weekly_self_study_hours |           history_score |      0.28 | [ 0.24,  0.32] |   12.85 | < .001***
weekly_self_study_hours |           physics_score |      0.20 | [ 0.16,  0.24] |    9.22 | < .001***
weekly_self_study_hours |         chemistry_score |      0.20 | [ 0.16,  0.24] |    9.19 | < .001***
weekly_self_study_hours |           biology_score |      0.19 | [ 0.15,  0.23] |    8.67 | < .001***
weekly_self_study_hours |           english_score |      0.25 | [ 0.21,  0.29] |   11.43 | < .001***
weekly_self_study_hours |         geography_score |      0.15 | [ 0.11,  0.20] |    6.95 | < .001***
math_score              |           history_score |      0.15 | [ 0.10,  0.19] |    6.65 | < .001***
math_score              |           physics_score |      0.12 | [ 0.07,  0.16] |    5.21 | < .001***
math_score              |         chemistry_score |      0.13 | [ 0.08,  0.17] |    5.73 | < .001***
math_score              |           biology_score |      0.08 | [ 0.04,  0.12] |    3.65 | 0.005**  
math_score              |           english_score |      0.13 | [ 0.09,  0.18] |    6.08 | < .001***
math_score              |         geography_score |      0.05 | [ 0.01,  0.09] |    2.22 | 0.316    
history_score           |           physics_score |      0.05 | [ 0.00,  0.09] |    2.17 | 0.332    
history_score           |         chemistry_score |      0.12 | [ 0.08,  0.16] |    5.47 | < .001***
history_score           |           biology_score |      0.09 | [ 0.04,  0.13] |    3.97 | 0.002**  
history_score           |           english_score |      0.15 | [ 0.10,  0.19] |    6.65 | < .001***
history_score           |         geography_score |      0.07 | [ 0.02,  0.11] |    2.95 | 0.049*   
physics_score           |         chemistry_score |      0.13 | [ 0.08,  0.17] |    5.68 | < .001***
physics_score           |           biology_score |      0.13 | [ 0.09,  0.18] |    5.97 | < .001***
physics_score           |           english_score |      0.05 | [ 0.01,  0.10] |    2.43 | 0.197    
physics_score           |         geography_score |      0.10 | [ 0.06,  0.15] |    4.63 | < .001***
chemistry_score         |           biology_score |      0.12 | [ 0.08,  0.16] |    5.40 | < .001***
chemistry_score         |           english_score |      0.07 | [ 0.02,  0.11] |    3.06 | 0.036*   
chemistry_score         |         geography_score |      0.07 | [ 0.02,  0.11] |    2.93 | 0.049*   
biology_score           |           english_score |      0.07 | [ 0.03,  0.12] |    3.33 | 0.016*   
biology_score           |         geography_score |      0.11 | [ 0.06,  0.15] |    4.79 | < .001***
english_score           |         geography_score |      0.07 | [ 0.03,  0.12] |    3.24 | 0.021*   

p-value adjustment method: Holm (1979)
Observations: 2000

Ne kemi zgjedhur te shqyrtojme marredhenien mes weekly_self_study_hours dhe pikeve te marra ne provime te lendeve si: matematika, anglishtja, historia, gjeografia, fizika, kimia e biologjia.

Si fillim ndertojme nje grafik te “weekly-self-study-hours” dhe “math-score” dhe gjejme koeficientin e korrelacionit ndermjet tyre.

library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.3.3
ggplot(student_scores, aes(x = weekly_self_study_hours, y = math_score)) +
  geom_point(color = "blue") + 
  labs(x = "Oret javore te studimit", y = "Rezultati ne matematike") 

Nepermjet paraqitjes grafike verejme se pjesa me e madhe e pikave eshte e shperndare ne forme reje gje qe tregon se mund te ekzistoje nje lidhje ndermjet tyre. Me poshte do te ndertojme nje model permes se cilit do te ndertojme ekuacionin e drejtezes se regresit.

modeli_3<-lm(math_score~weekly_self_study_hours, data=student_scores)
modeli_3

Call:
lm(formula = math_score ~ weekly_self_study_hours, data = student_scores)

Coefficients:
            (Intercept)  weekly_self_study_hours  
                75.8330                   0.4291  

Kjo formule mund te interpretohet ndryshe per cdo njesi te oreve javore te studimit kemi 0.4291 rritje te njesise se pikeve ne provimin e matematikes

\[math-score = 0.4291*weekly-self-study-hours+75.8330\]

library(ggpubr)
Warning: package ‘ggpubr’ was built under R version 4.3.3
ggplot(student_scores,aes(weekly_self_study_hours,y=math_score))+geom_point(size=1,color="red")+geom_smooth(method=lm,formula=y~x,color="orange")+stat_cor(label.x =2,label.y=7.5)+stat_regline_equation(label.x=8,label.y=1,size=4)+labs(x="Oret javore te studimit",y="Rezultati ne matematike",title="")

Vlera e korelacionit të dhënë nën grafik, R = 0.39, tregon një marrëdhënie pozitive mes orëve të studimit dhe rezultateve në matematikë. Grafiku tregon një tendencë pozitive. Kjo do të thotë se sa më shumë orë studimi në javë, aq më të larta janë rezultatet në matematikë. Kjo është e dukshme nga vija e regresionit që rritet me rritjen e orëve të studimit

cor(student_scores$weekly_self_study_hours,student_scores$math_score)
[1] 0.3935693

Nepermjet funksionit cor gjejme vleren e koeficientit te korrelacionit. Mesa shohim kjo vlere eshte pozitive, gje qe tregon per nje marredhenie te drejte mes dy ndryshoreve, pra me rritjen e njeres rritet dhe tjetra.

summary(modeli_3)

Call:
lm(formula = math_score ~ weekly_self_study_hours, data = student_scores)

Residuals:
    Min      1Q  Median      3Q     Max 
-37.979  -7.271   1.648   8.871  24.167 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             75.83296    0.48214  157.28   <2e-16 ***
weekly_self_study_hours  0.42911    0.02242   19.14   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12.16 on 1998 degrees of freedom
Multiple R-squared:  0.1549,    Adjusted R-squared:  0.1545 
F-statistic: 366.2 on 1 and 1998 DF,  p-value: < 2.2e-16

Vlera minimale e variablës të varur është -37.979.Vlera maksimale e variablës të varur është 24.167.Vlera e medianit është 1.648. Kjo do të thotë se gjysma e studentëve kanë një rezultat matematikë më të ulët se 1.648 pikë dhe gjysma tjetër ka një rezultat më të lartë. Kuartili i pare është -7.271, ndërsa kuartili i trete është 8.871 .Vlera e p-vleres eshte me e vogel se 0.05 gje qe na tregon nje lidhje te rendesishme statistikore ndermjet ndryshoreve Residual standard error eshte e vogelgje qe na tregon se vlerat qe jep modeli jane afer vlerave reale. Permes R-squared kuptojme se 15.45% e te dhenave shpjegohen nga modeli.

vektori2<-fitted.values(modeli_3)
View(vektori2)
predict(modeli_3, list(weekly_self_study_hours=c(1,2,3,4,5)))
       1        2        3        4        5 
76.26207 76.69118 77.12029 77.54940 77.97851 

Me siper jane disa vlera te parashikuara te modelit duke dhene disa vlera te ndryshores se pavarur.

mbetjet<-residuals(modeli_3)
sum(mbetjet)
[1] -1.482425e-13

Mbetja eshte distanca ndermjet vleres aktuale dhe asaj qe jep modeli qe kemi ndertuar.

par(mfrow=c(2,2))
plot(modeli_3)
par(mfrow=c(1,1))

Grafiku i pare na tregon qe kemi nje varesi lineare ndermjet te dhenave tona dhe devijimi standard eshte pothuajse konstant. Grafiku i 2 Normal Q-Q perdoret per te treguar nese te dhenat tona jane nga nje shperndarje normale. Pikat ne kete rast shtrihen ne nje vije te drejte diagonale, pra te dhenat tone vijne nga nje shperndarje normale. Ne grafikun e trete, ne dallim nga grafiku i pare ne boshtin vertikal kemi mbetjet e standartizuara.Po te shohim vijen e kuqe ajo eshte zbritese pra me rritjen e vlerave te perafruara kemi nje renie te mbetjeve. Ne grafikun e katert kemi nje vije qe quhet Cook’s distance, nga e cila nese kemi vlera jashte saj,ato kane ndikim te madh ne koeficientet e modelit e nese i heqim keto vlera, modeli do pesonte ndryshime te medha.

Ndertojme nje grafik te “weekly-self-study-hours” dhe “physics_score” dhe gjejme koeficientin e korrelacionit ndermjet tyre.

library(ggplot2)

ggplot(student_scores, aes(x = weekly_self_study_hours, y = physics_score)) +
  geom_point(color = "blue") + 
  labs(x = "Oret javore te studimit", y = "Rezultati ne fizik") 

Nepermjet paraqitjes grafike verejme se pjesa me e madhe e pikave eshte e shperndare ne forme reje gje qe tregon se mund te ekzistoje nje lidhje ndermjet tyre. Me poshte do te ndertojme nje model permes se cilit do te ndertojme ekuacionin e drejtezes se regresit.

modeli_4<-lm(physics_score~weekly_self_study_hours, data=student_scores)
modeli_4

Call:
lm(formula = physics_score ~ weekly_self_study_hours, data = student_scores)

Coefficients:
            (Intercept)  weekly_self_study_hours  
                77.6265                   0.2089  

Kjo formule mund te interpretohet ndryshe per cdo njesi te oreve javore te studimit kemi 0.2089 rritje te njesise se pikeve ne provimin e fizikes dhe per kete na ndihmoi ndertimi i modelit per 2 ndryshoret ku koeficienti prane weekly_self_study_hours eshte 0.2089 dhe ordinata 77.6265. Me poshte jepet ndertimi i drejtezes se regresit. Interpretimi I formules

\[physics-score= 0.2089*weekly-self-study-hours+77.6265\]

library(ggpubr)
ggplot(student_scores,aes(weekly_self_study_hours,y=physics_score))+geom_point(size=1,color="red")+geom_smooth(method=lm,formula=y~x,color="orange")+stat_cor(label.x =2,label.y=7.5)+stat_regline_equation(label.x=8,label.y=1,size=4)+labs(x="Oret javore te studimit",y="Rezultati ne fizik",title="")

Grafiku tregon një tendencë pozitive. Kjo do të thotë se sa më shumë orë studimi në javë, aq më të larta janë rezultatet në fizike. Kjo është e dukshme nga vija e regresionit që rritet me rritjen e orëve të studimit. Pika të shpërndara rreth vijës së regresionit tregojnë variabilitetin e rezultateve. Disa studentë kanë rezultate të larta edhe pse nuk studiojnë shumë, ndërsa të tjerë kanë rezultate të ulëta edhe pse studiojnë shumë. Disa pikë janë larg vijës së regresionit. Këto janë raste ku studentët kanë rezultate të ndryshme nga pritshmëritë e vijës së regresionit. Mund të jenë faktorë të tjerë që ndikojnë në rezultate, përveç orëve të studimit.

cor(student_scores$weekly_self_study_hours,student_scores$physics_score)
[1] 0.2021198

Nepermjet funksionit cor gjejme vleren e koeficientit te korrelacionit. Mesa shohim kjo vlere eshte pozitive, gje qe tregon per nje marredhenie te drejte mes dy ndryshoreve, pra me rritjen e njeres rritet dhe tjetra.

summary(modeli_4)

Call:
lm(formula = physics_score ~ weekly_self_study_hours, data = student_scores)

Residuals:
    Min      1Q  Median      3Q     Max 
-28.671  -9.839   1.448  10.348  22.373 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             77.62650    0.48702 159.392   <2e-16 ***
weekly_self_study_hours  0.20895    0.02265   9.225   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12.28 on 1998 degrees of freedom
Multiple R-squared:  0.04085,   Adjusted R-squared:  0.04037 
F-statistic:  85.1 on 1 and 1998 DF,  p-value: < 2.2e-16

Vlera minimale e variablës të varur është -28.671.Vlera maksimale e variablës të varur është 22.373.Vlera e medianit është 1.448. Kjo do të thotë se gjysma e studentëve kanë një rezultat matematikë më të ulët se 1.448 pikë dhe gjysma tjetër ka një rezultat më të lartë. Kuartili i pare është -9.839, ndërsa kuartili i trete është 10.348..Vlera e p-vleres eshte me e vogel se 0.05 gje qe na tregon nje lidhje te rendesishme statistikore ndermjet ndryshoreve Residual standard error eshte e vogel gje qe na tregon se vlerat qe jep modeli jane afer vlerave reale. Permes R-squared kuptojme se 4.037% e te dhenave shpjegohen nga modeli.

vektori3<-fitted.values(modeli_4)
View(vektori3)
predict(modeli_4, list(weekly_self_study_hours=c(1,2,3,4,5)))
       1        2        3        4        5 
77.83545 78.04440 78.25335 78.46230 78.67125 

Me siper jane disa vlera te parashikuara te modelit duke dhene disa vlera te ndryshores se pavarur.

mbetjet<-residuals(modeli_4)
sum(mbetjet)
[1] 2.045863e-12

Mbetja eshte distanca ndermjet vleres aktuale dhe asaj qe jep modeli qe kemi ndertuar.

par(mfrow=c(2,2))
plot(modeli_4)
par(mfrow=c(1,1))

Grafiku i pare na tregon qe kemi nje varesi lineare ndermjet te dhenave tona dhe devijimi standard eshte konstant pothuajse(mbetjet dhe vlerat e perafruara jo te korreluara), pra kemi homoskedasticitet. Grafiku i 2 Normal Q-Q perdoret per te treguar nese te dhenat tona jane nga nje shperndarje normale. Pikat ne kete rast shtrihen ne nje vije te drejte diagonale, pra te dhenat tone vijne nga nje shperndarje normale. Ne grafikun e trete, ne dallim nga grafiku i pare ne boshtin vertikal kemi mbetjet e standartizuara.Po te shohim vijen e kuqe ajo eshte renese(zbritese) pra me rritjen e vlerave te perafruara kemi nje renie te mbetjeve (nuk kemi homoskedasticitet). Ne grafikun e katert kemi nje vije qe quhet Cook’s distance, nga e cila nese kemi vlera jashte saj,ato kane ndikim te madh ne koeficientet e modelit e nese i heqim keto vlera, modeli do pesonte ndryshime te medha.

Ndertojme nje grafik te “weekly-self-study-hours” dhe “english_score” dhe gjejme koeficientin e korrelacionit ndermjet tyre.

library(ggplot2)

ggplot(student_scores, aes(x = weekly_self_study_hours, y = english_score)) +
  geom_point(color = "blue") + 
  labs(x = "Oret javore te studimit", y = "Rezultati ne anglisht")

Nepermjet paraqitjes grafike verejme se pjesa me e madhe e pikave eshte e shperndare ne forme reje gje qe tregon se mund te ekzistoje nje lidhje ndermjet tyre. Me poshte do te ndertojme nje model permes se cilit do te ndertojme ekuacionin e drejtezes se regresit.

modeli_5<-lm(english_score~weekly_self_study_hours, data=student_scores)
modeli_5

Call:
lm(formula = english_score ~ weekly_self_study_hours, data = student_scores)

Coefficients:
            (Intercept)  weekly_self_study_hours  
                76.9149                   0.2457  

Kjo formule mund te interpretohet ndryshe per cdo njesi te oreve javore te studimit kemi 0.2457 rritje te njesise se pikeve ne provimin e biologjise dhe per kete na ndihmoi ndertimi i modelit per 2 ndryshoret ku koeficienti prane weekly_self_study_hours eshte 0.2457 dhe ordinata 76.9149. Me poshte jepet ndertimi i drejtezes se regresit.

\[english-score = 0.2457*weekly-self-study-hours+76.9149\]

library(ggpubr)
ggplot(student_scores,aes(weekly_self_study_hours,y=english_score))+geom_point(size=1,color="red")+geom_smooth(method=lm,formula=y~x,color="orange")+stat_cor(label.x =2,label.y=7.5)+stat_regline_equation(label.x=8,label.y=1,size=4)+labs(x="Oret javore te studimit",y="Rezultati ne anglisht",title="")

Grafiku tregon një tendencë pozitive. Kjo do të thotë se sa më shumë orë studimi në javë, aq më të larta janë rezultatet në anglisht. Kjo është e dukshme nga vija e regresionit që rritet me rritjen e orëve të studimit. Pika të shpërndara rreth vijës së regresionit tregojnë variabilitetin e rezultateve. Disa studentë kanë rezultate të larta edhe pse nuk studiojnë shumë, ndërsa të tjerë kanë rezultate të ulëta edhe pse studiojnë shumë. Disa pikë janë larg vijës së regresionit. Këto janë raste ku studentët kanë rezultate të ndryshme nga pritshmëritë e vijës së regresionit. Mund të jenë faktorë të tjerë që ndikojnë në rezultate, përveç orëve të studimit.

cor(student_scores$weekly_self_study_hours,student_scores$english_score)
[1] 0.247796

Nepermjet funksionit cor gjejme vleren e koeficientit te korrelacionit. Mesa shohim kjo vlere eshte pozitive, gje qe tregon per nje marredhenie te drejte mes dy ndryshoreve, pra me rritjen e njeres rritet dhe tjetra.

summary(modeli_5)

Call:
lm(formula = english_score ~ weekly_self_study_hours, data = student_scores)

Residuals:
    Min      1Q  Median      3Q     Max 
-28.143  -8.290   1.374   9.438  21.839 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             76.91494    0.46209  166.45   <2e-16 ***
weekly_self_study_hours  0.24570    0.02149   11.43   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11.65 on 1998 degrees of freedom
Multiple R-squared:  0.0614,    Adjusted R-squared:  0.06093 
F-statistic: 130.7 on 1 and 1998 DF,  p-value: < 2.2e-16

Vlera minimale e variablës të varur është -28.143 .Vlera maksimale e variablës të varur është 21.839.Vlera e medianit është 1.374. Kjo do të thotë se gjysma e studentëve kanë një rezultat matematikë më të ulët se 1.374 pikë dhe gjysma tjetër ka një rezultat më të lartë. Kuartili i pare është -8.290, ndërsa kuartili i trete është 9.438 .Vlera e p-vleres eshte me e vogel se 0.05 gje qe na tregon nje lidhje te rendesishme statistikore ndermjet ndryshoreve Residual standard error eshte e vogel gje qe na tregon se vlerat qe jep modeli jane afer vlerave reale. Permes R-squared kuptojme se 6.093% e te dhenave shpjegohen nga modeli.

vektori4<-fitted.values(modeli_5)
View(vektori4)
predict(modeli_5, list(weekly_self_study_hours=c(1,2,3,4,5)))
       1        2        3        4        5 
77.16065 77.40635 77.65205 77.89775 78.14345 

Me siper jane disa vlera te parashikuara te modelit duke dhene disa vlera te ndryshores se pavarur.

mbetjet<-residuals(modeli_5)
sum(mbetjet)
[1] 5.211248e-13

Mbetja eshte distanca ndermjet vleres aktuale dhe asaj qe jep modeli qe kemi ndertuar.

par(mfrow=c(2,2))
plot(modeli_5)
par(mfrow=c(1,1))

Grafiku i pare na tregon qe kemi nje varesi lineare ndermjet te dhenave tona dhe devijimi standard eshte konstant pothuajse(mbetjet dhe vlerat e perafruara jo te korreluara), pra kemi homoskedasticitet. Grafiku i 2 Normal Q-Q perdoret per te treguar nese te dhenat tona jane nga nje shperndarje normale. Pikat ne kete rast shtrihen ne nje vije te drejte diagonale, pra te dhenat tone vijne nga nje shperndarje normale. Ne grafikun e trete, ne dallim nga grafiku i pare ne boshtin vertikal kemi mbetjet e standartizuara.Po te shohim vijen e kuqe ajo eshte renese(zbritese) pra me rritjen e vlerave te perafruara kemi nje renie te mbetjeve (nuk kemi homoskedasticitet). Ne grafikun e katert kemi nje vije qe quhet Cook’s distance, nga e cila nese kemi vlera jashte saj,ato kane ndikim te madh ne koeficientet e modelit e nese i heqim keto vlera, modeli do pesonte ndryshime te medha.

Ndertojme nje grafik te “weekly-self-study-hours” dhe “geography_score” dhe gjejme koeficientin e korrelacionit ndermjet tyre.

library(ggplot2)

ggplot(student_scores, aes(x = weekly_self_study_hours, y = geography_score)) +
  geom_point(color = "blue") + 
  labs(x = "Oret javore te studimit", y = "Rezultati ne gjeografi")

Nepermjet paraqitjes grafike verejme se nje e pikave eshte e shperndare ne forme reje gje qe tregon se mund te ekzistoje njefare lidhje ndermjet tyre. Me poshte do te ndertojme nje model permes se cilit do te ndertojme ekuacionin e drejtezes se regresit.

modeli_6<-lm(geography_score~weekly_self_study_hours, data=student_scores)
modeli_6

Call:
lm(formula = geography_score ~ weekly_self_study_hours, data = student_scores)

Coefficients:
            (Intercept)  weekly_self_study_hours  
                78.2710                   0.1474  

Kjo formule mund te interpretohet ndryshe per cdo njesi te oreve javore te studimit kemi 0.1474 rritje te njesise se pikeve ne provimin e biologjise dhe per kete na ndihmoi ndertimi i modelit per 2 ndryshoret ku koeficienti prane weekly_self_study_hours eshte 0.1474 dhe ordinata 78.2710. Me poshte jepet ndertimi i drejtezes se regresit.

\[geography-score= 0.1474*weekly-self-study-hours+78.2710 \]

library(ggpubr)
ggplot(student_scores,aes(weekly_self_study_hours,y=geography_score))+geom_point(size=1,color="red")+geom_smooth(method=lm,formula=y~x,color="orange")+stat_cor(label.x =2,label.y=7.5)+stat_regline_equation(label.x=8,label.y=1,size=4)+labs(x="Oret javore te studimit",y="Rezultati ne gjeografi",title="")

Grafiku tregon një tendencë pozitive. Kjo do të thotë se sa më shumë orë studimi në javë, aq më të larta janë rezultatet në gjeografi. Kjo është e dukshme nga vija e regresionit që rritet me rritjen e orëve të studimit. Pika të shpërndara rreth vijës së regresionit tregojnë variabilitetin e rezultateve. Disa studentë kanë rezultate të larta edhe pse nuk studiojnë shumë, ndërsa të tjerë kanë rezultate të ulëta edhe pse studiojnë shumë. Disa pikë janë larg vijës së regresionit. Këto janë raste ku studentët kanë rezultate të ndryshme nga pritshmëritë e vijës së regresionit. Mund të jenë faktorë të tjerë që ndikojnë në rezultate, përveç orëve të studimit.

cor(student_scores$weekly_self_study_hours,student_scores$geography_score)
[1] 0.1536224

Nepermjet funksionit cor gjejme vleren e koeficientit te korrelacionit. Mesa shohim kjo vlere eshte pozitive, gje qe tregon per nje marredhenie te drejte mes dy ndryshoreve, pra me rritjen e njeres rritet dhe tjetra.

summary(modeli_6)

Call:
lm(formula = geography_score ~ weekly_self_study_hours, data = student_scores)

Residuals:
    Min      1Q  Median      3Q     Max 
-22.988  -9.816   0.729   9.582  21.729 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             78.27097    0.45604 171.631  < 2e-16 ***
weekly_self_study_hours  0.14739    0.02121   6.949 4.95e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11.5 on 1998 degrees of freedom
Multiple R-squared:  0.0236,    Adjusted R-squared:  0.02311 
F-statistic: 48.29 on 1 and 1998 DF,  p-value: 4.952e-12

Vlera minimale e variablës të varur është -22.988 .Vlera maksimale e variablës të varur është 21.729 .Vlera e medianit është 0.729. Kjo do të thotë se gjysma e studentëve kanë një rezultat matematikë më të ulët se 0.729 pikë dhe gjysma tjetër ka një rezultat më të lartë. Kuartili i pare është -9.816, ndërsa kuartili i trete është 9.582 .Vlera e p-vleres eshte me e vogel se 0.05 gje qe na tregon nje lidhje te rendesishme statistikore ndermjet ndryshoreve Residual standard error eshte e vogel gje qe na tregon se vlerat qe jep modeli jane afer vlerave reale. Permes R-squared kuptojme se 2.311% e te dhenave shpjegohen nga modeli.

vektori5<-fitted.values(modeli_6)
View(vektori5)
predict(modeli_6, list(weekly_self_study_hours=c(1,2,3,4,5)))
       1        2        3        4        5 
78.41836 78.56576 78.71315 78.86054 79.00793 

Me siper jane disa vlera te parashikuara te modelit duke dhene disa vlera te ndryshores se pavarur.

mbetjet<-residuals(modeli_6)
sum(mbetjet)
[1] 6.979139e-14

Mbetja eshte distanca ndermjet vleres aktuale dhe asaj qe jep modeli qe kemi ndertuar.

par(mfrow=c(2,2))
plot(modeli_6)
par(mfrow=c(1,1))

Grafiku i pare na tregon qe kemi nje varesi lineare ndermjet te dhenave tona dhe devijimi standard eshte konstant pothuajse(mbetjet dhe vlerat e perafruara jo te korreluara), pra kemi homoskedasticitet. Grafiku i 2 Normal Q-Q perdoret per te treguar nese te dhenat tona jane nga nje shperndarje normale. Pikat ne kete rast shtrihen ne nje vije te drejte diagonale, pra te dhenat tone vijne nga nje shperndarje normale. Ne grafikun e trete, ne dallim nga grafiku i pare ne boshtin vertikal kemi mbetjet e standartizuara.Po te shohim vijen e kuqe ajo eshte renese(zbritese) pra me rritjen e vlerave te perafruara kemi nje renie te mbetjeve (nuk kemi homoskedasticitet). Ne grafikun e katert kemi nje vije qe quhet Cook’s distance, nga e cila nese kemi vlera jashte saj,ato kane ndikim te madh ne koeficientet e modelit e nese i heqim keto vlera, modeli do pesonte ndryshime te medha.

Ndertojme nje grafik te “weekly-self-study-hours” dhe “chemistry_score” dhe gjejme koeficientin e korrelacionit ndermjet tyre.

library(ggplot2)

ggplot(student_scores, aes(x = weekly_self_study_hours, y = chemistry_score)) +
  geom_point(color = "blue") + 
  labs(x = "Oret javore te studimit", y = "Rezultati ne kimi")

Nepermjet paraqitjes grafike verejme se pjesa me e madhe e pikave eshte e shperndare ne forme reje gje qe tregon se mund te ekzistoje nje lidhje ndermjet tyre. Me poshte do te ndertojme nje model permes se cilit do te ndertojme ekuacionin e drejtezes se regresit.

modeli_7<-lm(chemistry_score~weekly_self_study_hours, data=student_scores)
modeli_7

Call:
lm(formula = chemistry_score ~ weekly_self_study_hours, data = student_scores)

Coefficients:
            (Intercept)  weekly_self_study_hours  
                76.2290                   0.2121  

Kjo formule mund te interpretohet ndryshe per cdo njesi te oreve javore te studimit kemi 0.2121 rritje te njesise se pikeve ne provimin e kimise dhe per kete na ndihmoi ndertimi i modelit per 2 ndryshoret ku koeficienti prane weekly_self_study_hours eshte 0.2121 dhe ordinata 76.2290. Me poshte jepet ndertimi i drejtezes se regresit.

\[chemistry-score = 0.2121*weekly-self-study-hours+76.2290 \]

library(ggpubr)
ggplot(student_scores,aes(weekly_self_study_hours,y=chemistry_score))+geom_point(size=1,color="red")+geom_smooth(method=lm,formula=y~x,color="orange")+stat_cor(label.x =2,label.y=7.5)+stat_regline_equation(label.x=8,label.y=1,size=4)+labs(x="Oret javore te studimit",y="Rezultati ne kimi",title="")

Grafiku tregon një tendencë pozitive. Kjo do të thotë se sa më shumë orë studimi në javë, aq më të larta janë rezultatet në kimi. Kjo është e dukshme nga vija e regresionit që rritet me rritjen e orëve të studimit. Pika të shpërndara rreth vijës së regresionit tregojnë variabilitetin e rezultateve. Disa studentë kanë rezultate të larta edhe pse nuk studiojnë shumë, ndërsa të tjerë kanë rezultate të ulëta edhe pse studiojnë shumë. Disa pikë janë larg vijës së regresionit. Këto janë raste ku studentët kanë rezultate të ndryshme nga pritshmëritë e vijës së regresionit. Mund të jenë faktorë të tjerë që ndikojnë në rezultate, përveç orëve të studimit.

cor(student_scores$weekly_self_study_hours,student_scores$chemistry_score)
[1] 0.2013402

Nepermjet funksionit cor gjejme vleren e koeficientit te korrelacionit. Mesa shohim kjo vlere eshte pozitive, gje qe tregon per nje marredhenie te drejte mes dy ndryshoreve, pra me rritjen e njeres rritet dhe tjetra.

summary(modeli_7)

Call:
lm(formula = chemistry_score ~ weekly_self_study_hours, data = student_scores)

Residuals:
     Min       1Q   Median       3Q      Max 
-27.2895 -10.9558   0.9378  10.3474  23.5589 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             76.22904    0.49636 153.576   <2e-16 ***
weekly_self_study_hours  0.21210    0.02308   9.188   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12.52 on 1998 degrees of freedom
Multiple R-squared:  0.04054,   Adjusted R-squared:  0.04006 
F-statistic: 84.42 on 1 and 1998 DF,  p-value: < 2.2e-16

Vlera minimale e variablës të varur është -27.2895.Vlera maksimale e variablës të varur është 23.5589.Vlera e medianit është 0.9378. Kjo do të thotë se gjysma e studentëve kanë një rezultat matematikë më të ulët se 0.9378 pikë dhe gjysma tjetër ka një rezultat më të lartë. Kuartili i pare është -10.9558, ndërsa kuartili i trete është 10.3474 .Vlera e p-vleres eshte me e vogel se 0.05 gje qe na tregon nje lidhje te rendesishme statistikore ndermjet ndryshoreve Residual standard error eshte e vogel gje qe na tregon se vlerat qe jep modeli jane afer vlerave reale. Permes R-squared kuptojme se 4.006% e te dhenave shpjegohen nga modeli.

vektori6<-fitted.values(modeli_7)
View(vektori6)
predict(modeli_7, list(weekly_self_study_hours=c(1,2,3,4,5)))
       1        2        3        4        5 
76.44114 76.65324 76.86534 77.07744 77.28954 

Me siper jane disa vlera te parashikuara te modelit duke dhene disa vlera te ndryshores se pavarur.

mbetjet<-residuals(modeli_7)
sum(mbetjet)
[1] -6.777634e-13

Mbetja eshte distanca ndermjet vleres aktuale dhe asaj qe jep modeli qe kemi ndertuar.

par(mfrow=c(2,2))
plot(modeli_7)
par(mfrow=c(1,1))

Grafiku i pare na tregon qe kemi nje varesi lineare ndermjet te dhenave tona dhe devijimi standard eshte konstant pothuajse(mbetjet dhe vlerat e perafruara jo te korreluara), pra kemi homoskedasticitet. Grafiku i 2 Normal Q-Q perdoret per te treguar nese te dhenat tona jane nga nje shperndarje normale. Pikat ne kete rast shtrihen ne nje vije te drejte diagonale, pra te dhenat tone vijne nga nje shperndarje normale. Ne grafikun e trete, ne dallim nga grafiku i pare ne boshtin vertikal kemi mbetjet e standartizuara.Po te shohim vijen e kuqe ajo eshte renese(zbritese) pra me rritjen e vlerave te perafruara kemi nje renie te mbetjeve (nuk kemi homoskedasticitet). Ne grafikun e katert kemi nje vije qe quhet Cook’s distance, nga e cila nese kemi vlera jashte saj,ato kane ndikim te madh ne koeficientet e modelit e nese i heqim keto vlera, modeli do pesonte ndryshime te medha.

Ndertojme nje grafik te “weekly-self-study-hours” dhe “biology_score” dhe gjejme koeficientin e korrelacionit ndermjet tyre.

library(ggplot2)

ggplot(student_scores, aes(x = weekly_self_study_hours, y = biology_score)) +
  geom_point(color = "blue") + 
  labs(x = "Oret javore te studimit", y = "Rezultati ne biologji")

Nepermjet paraqitjes grafike verejme se pjesa me e madhe e pikave eshte e shperndare ne forme reje gje qe tregon se mund te ekzistoje nje lidhje ndermjet tyre. Me poshte do te ndertojme nje model permes se cilit do te ndertojme ekuacionin e drejtezes se regresit.

modeli_8<-lm(biology_score~weekly_self_study_hours, data=student_scores)
modeli_8

Call:
lm(formula = biology_score ~ weekly_self_study_hours, data = student_scores)

Coefficients:
            (Intercept)  weekly_self_study_hours  
                75.7554                   0.2155  

Kjo formule mund te interpretohet ndryshe per cdo njesi te oreve javore te studimit kemi 0.2155 rritje te njesise se pikeve ne provimin e biologjise dhe per kete na ndihmoi ndertimi i modelit per 2 ndryshoret ku koeficienti prane weekly_self_study_hours eshte 0.2155 dhe ordinata 75.7554. Me poshte jepet ndertimi i drejtezes se regresit.

\[biology-score = 0.2155*weekly-self-study-hourso+75.7554\]

library(ggpubr)
ggplot(student_scores,aes(weekly_self_study_hours,y=biology_score))+geom_point(size=1,color="red")+geom_smooth(method=lm,formula=y~x,color="orange")+stat_cor(label.x =2,label.y=7.5)+stat_regline_equation(label.x=8,label.y=1,size=4)+labs(x="Oret javore te studimit",y="Rezultati ne biologji",title="")

Grafiku tregon një tendencë pozitive. Kjo do të thotë se sa më shumë orë studimi në javë, aq më të larta janë rezultatet në biologji. Kjo është e dukshme nga vija e regresionit që rritet me rritjen e orëve të studimit. Pika të shpërndara rreth vijës së regresionit tregojnë variabilitetin e rezultateve. Disa studentë kanë rezultate të larta edhe pse nuk studiojnë shumë, ndërsa të tjerë kanë rezultate të ulëta edhe pse studiojnë shumë. Disa pikë janë larg vijës së regresionit. Këto janë raste ku studentët kanë rezultate të ndryshme nga pritshmëritë e vijës së regresionit. Mund të jenë faktorë të tjerë që ndikojnë në rezultate, përveç orëve të studimit.

cor(student_scores$weekly_self_study_hours,student_scores$biology_score)
[1] 0.1904808

Nepermjet funksionit cor gjejme vleren e koeficientit te korrelacionit. Mesa shohim kjo vlere eshte pozitive, gje qe tregon per nje marredhenie te drejte mes dy ndryshoreve, pra me rritjen e njeres rritet dhe tjetra.

summary(modeli_8)

Call:
lm(formula = biology_score ~ weekly_self_study_hours, data = student_scores)

Residuals:
    Min      1Q  Median      3Q     Max 
-51.358  -9.975   1.245  10.933  24.245 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             75.75536    0.53422 141.805   <2e-16 ***
weekly_self_study_hours  0.21549    0.02485   8.673   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 13.47 on 1998 degrees of freedom
Multiple R-squared:  0.03628,   Adjusted R-squared:  0.0358 
F-statistic: 75.22 on 1 and 1998 DF,  p-value: < 2.2e-16

Vlera minimale e variablës të varur është -51.358 .Vlera maksimale e variablës të varur është 24.245.Vlera e medianit është 1.245 . Kjo do të thotë se gjysma e studentëve kanë një rezultat matematikë më të ulët se 1.245 pikë dhe gjysma tjetër ka një rezultat më të lartë. Kuartili i pare është -9.975, ndërsa kuartili i trete është 10.933 .Vlera e p-vleres eshte me e vogel se 0.05 gje qe na tregon nje lidhje te rendesishme statistikore ndermjet ndryshoreve Residual standard error eshte e vogel gje qe na tregon se vlerat qe jep modeli jane afer vlerave reale. Permes R-squared kuptojme se 3.58% e te dhenave shpjegohen nga modeli.

vektori7<-fitted.values(modeli_8)
View(vektori7)
predict(modeli_8, list(weekly_self_study_hours=c(1,2,3,4,5)))
       1        2        3        4        5 
75.97085 76.18634 76.40183 76.61732 76.83281 

Me siper jane disa vlera te parashikuara te modelit duke dhene disa vlera te ndryshores se pavarur.

mbetjet<-residuals(modeli_8)
sum(mbetjet)
[1] -8.737455e-13

Mbetja eshte distanca ndermjet vleres aktuale dhe asaj qe jep modeli qe kemi ndertuar.

par(mfrow=c(2,2))
plot(modeli_8)
par(mfrow=c(1,1))

Grafiku i pare na tregon qe kemi nje varesi lineare ndermjet te dhenave tona dhe devijimi standard eshte konstant pothuajse(mbetjet dhe vlerat e perafruara jo te korreluara), pra kemi homoskedasticitet. Grafiku i 2 Normal Q-Q perdoret per te treguar nese te dhenat tona jane nga nje shperndarje normale. Pikat ne kete rast shtrihen ne nje vije te drejte diagonale, pra te dhenat tone vijne nga nje shperndarje normale. Ne grafikun e trete, ne dallim nga grafiku i pare ne boshtin vertikal kemi mbetjet e standartizuara.Po te shohim vijen e kuqe ajo eshte renese(zbritese) pra me rritjen e vlerave te perafruara kemi nje renie te mbetjeve (nuk kemi homoskedasticitet). Ne grafikun e katert kemi nje vije qe quhet Cook’s distance, nga e cila nese kemi vlera jashte saj,ato kane ndikim te madh ne koeficientet e modelit e nese i heqim keto vlera, modeli do pesonte ndryshime te medha.

Ndertojme nje grafik te “weekly-self-study-hours” dhe “history_score” dhe gjejme koeficientin e korrelacionit ndermjet tyre.

library(ggplot2)

ggplot(student_scores, aes(x = weekly_self_study_hours, y = history_score)) +
  geom_point(color = "blue") + 
  labs(x = "Oret javore te studimit", y = "Rezultati ne histori")

Nepermjet paraqitjes grafike verejme se pjesa me e madhe e pikave eshte e shperndare ne forme reje gje qe tregon se mund te ekzistoje nje lidhje ndermjet tyre. Me poshte do te ndertojme nje model permes se cilit do te ndertojme ekuacionin e drejtezes se regresit.

modeli_9<-lm(history_score~weekly_self_study_hours, data=student_scores)
modeli_9

Call:
lm(formula = history_score ~ weekly_self_study_hours, data = student_scores)

Coefficients:
            (Intercept)  weekly_self_study_hours  
                  75.18                     0.29  

Kjo formule mund te interpretohet ndryshe per cdo njesi te oreve javore te studimit kemi 0.29 rritje te njesise se pikeve ne provimin e biologjise dhe per kete na ndihmoi ndertimi i modelit per 2 ndryshoret ku koeficienti prane weekly_self_study_hours eshte 0.29 dhe ordinata 75.18 Me poshte jepet ndertimi i drejtezes se regresit.

\[history-score = 0.29*weekly-self-study-hour+75.18\]

library(ggpubr)
ggplot(student_scores,aes(weekly_self_study_hours,y=history_score))+geom_point(size=1,color="red")+geom_smooth(method=lm,formula=y~x,color="orange")+stat_cor(label.x =2,label.y=7.5)+stat_regline_equation(label.x=8,label.y=1,size=4)+labs(x="Oret javore te studimit",y="Rezultati ne histori",title="")

Grafiku tregon një tendencë pozitive. Kjo do të thotë se sa më shumë orë studimi në javë, aq më të larta janë rezultatet në histori. Kjo është e dukshme nga vija e regresionit që rritet me rritjen e orëve të studimit. Pika të shpërndara rreth vijës së regresionit tregojnë variabilitetin e rezultateve. Disa studentë kanë rezultate të larta edhe pse nuk studiojnë shumë, ndërsa të tjerë kanë rezultate të ulëta edhe pse studiojnë shumë. Disa pikë janë larg vijës së regresionit. Këto janë raste ku studentët kanë rezultate të ndryshme nga pritshmëritë e vijës së regresionit. Mund të jenë faktorë të tjerë që ndikojnë në rezultate, përveç orëve të studimit.

cor(student_scores$weekly_self_study_hours,student_scores$history_score)
[1] 0.2762308

Nepermjet funksionit cor gjejme vleren e koeficientit te korrelacionit. Mesa shohim kjo vlere eshte pozitive, gje qe tregon per nje marredhenie te drejte mes dy ndryshoreve, pra me rritjen e njeres rritet dhe tjetra.

summary(modeli_9)

Call:
lm(formula = history_score ~ weekly_self_study_hours, data = student_scores)

Residuals:
     Min       1Q   Median       3Q      Max 
-26.3423 -10.0436   0.5516   9.8947  24.8178 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             75.18217    0.48543  154.88   <2e-16 ***
weekly_self_study_hours  0.29004    0.02258   12.85   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12.24 on 1998 degrees of freedom
Multiple R-squared:  0.0763,    Adjusted R-squared:  0.07584 
F-statistic:   165 on 1 and 1998 DF,  p-value: < 2.2e-16

Vlera minimale e variablës të varur është -26.3423 .Vlera maksimale e variablës të varur është 24.8178.Vlera e medianit është 0.5516 . Kjo do të thotë se gjysma e studentëve kanë një rezultat matematikë më të ulët se 0.5516 pikë dhe gjysma tjetër ka një rezultat më të lartë. Kuartili i pare është -10.0436, ndërsa kuartili i trete është 9.8947 .Vlera e p-vleres eshte me e vogel se 0.05 gje qe na tregon nje lidhje te rendesishme statistikore ndermjet ndryshoreve Residual standard error eshte e vogel gje qe na tregon se vlerat qe jep modeli jane afer vlerave reale. Permes R-squared kuptojme se 7.584% e te dhenave shpjegohen nga modeli.

vektori8<-fitted.values(modeli_9)
View(vektori8)
predict(modeli_9, list(weekly_self_study_hours=c(1,2,3,4,5)))
       1        2        3        4        5 
75.47221 75.76225 76.05229 76.34233 76.63238 

Me siper jane disa vlera te parashikuara te modelit duke dhene disa vlera te ndryshores se pavarur.

mbetjet<-residuals(modeli_9)
sum(mbetjet)
[1] 5.317136e-13

Mbetja eshte distanca ndermjet vleres aktuale dhe asaj qe jep modeli qe kemi ndertuar.

par(mfrow=c(2,2))
plot(modeli_9)
par(mfrow=c(1,1))

Grafiku i pare na tregon qe kemi nje varesi lineare ndermjet te dhenave tona dhe devijimi standard eshte konstant pothuajse(mbetjet dhe vlerat e perafruara jo te korreluara), pra kemi homoskedasticitet. Grafiku i 2 Normal Q-Q perdoret per te treguar nese te dhenat tona jane nga nje shperndarje normale. Pikat ne kete rast shtrihen ne nje vije te drejte diagonale, pra te dhenat tone vijne nga nje shperndarje normale. Ne grafikun e trete, ne dallim nga grafiku i pare ne boshtin vertikal kemi mbetjet e standartizuara.Po te shohim vijen e kuqe ajo eshte renese(zbritese) pra me rritjen e vlerave te perafruara kemi nje renie te mbetjeve (nuk kemi homoskedasticitet). Ne grafikun e katert kemi nje vije qe quhet Cook’s distance, nga e cila nese kemi vlera jashte saj,ato kane ndikim te madh ne koeficientet e modelit e nese i heqim keto vlera, modeli do pesonte ndryshime te medha.

Perfundimet

Ne kete punim jane studiuar arritjet e 2000 studenteve ne provimet e matematikes,fizikes,historise,kimise,gjeografise,anglishtes,biologjise per te gjithe studentet oret e studimit ne jave, gjinia e tyre,numri i mungesave gjate vitit shkollor,aktivitetet jshteshkollore,nese jane te punesuar me kohe te pjesshme ose jo. Gjate analizimit te te dhenave tona u shqyrtua se pjesa me e madhe e studenteve nuk kryenin aktivitete jashteshkolore ose ishin te punsuar part-time. Profesionet me te aspiruara per studentet ishin software engineer me mbi 300 studente pasuar nga business owner,ndersa ato me pak te aspiruara ishin scientist pasuar nga writer. Nese do te krahasonim performancen ne provime ne baze te gjinise te studenteve, vihet re se performanca me e mire ne pjesen me te madhe te lendeve u realizua nga meshkujt, por dhe femrat kane patur rezultate te larta ne provimin e gjeografise kryesisht. Gjate studimit te faktoreve qe ndikojne ne numrin e mungesave te studenteve vihet re se 12.5% kishte ndikim punsimi part-time i studenteve dhe 20% marrja me aktivitete jashteshkollore. Nepermjet analizimit te nje nderlidhjeje midis oreve javore te studimit dhe pikeve te marra ne provime vihet re se sa me shume ore studentet kalojne duke studiuar aq me te larta jane rezultatat e provimeve,por kemi dhe raste kur shpenzojne me pak ore studimi por dalin me rezultate te larta. Nga statistikat e kryera rreth 44.15% e studenteve kishin dale mire ne te gjitha provimet.

LS0tDQp0aXRsZTogIlByb2pla3QiDQphdXRob3I6ICJKb2FuYSBNZXJrYWosIEdsZWRpc2EgSGVycmkiDQpkYXRhOiBNYXkgMjAyNA0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCkxlbmRhOiBIeXJqZSBuZSBzdGF0aXN0aWtlDQoNCg0KVml0aTogSUkgKDIwMjMtMjAyNCkNCg0KRGVnYTogSU1JDQoNCkdydXBpOiBBMQ0KDQojIyBQdW5pbWkgcGVybWJhbiBrZXRvIHBpa2E6IHsudGFic2V0fQ0KIyMjICoqYHIgY29sb3Jpc2UoIlFlbGxpbWV0IGRoZSBvYmpla3RpdmF0IiwicmVkIilgKioNCg0KIyMjIyAqKmByIGNvbG9yaXNlKCJRZWxsaW1ldCB0b25hIG5lIGtldGUgcHJvamVrdCBqYW5lOiIsImdyZWVuIilgKioNCg0KMS4gQXBsaWtpbWkgaSBuam9odXJpdmUgdMOrIG1hcnJhIGdqYXTDqyBwamVzw6tzIHPDqyBzdGF0aXN0aWvDq3MgZGVza3JpcHRpdmUgZGhlIGluZmVyZW5jaWFsZSwgbmpvaHVyaXZlIG7DqyBFeGNlbCwgUiBlIFJTdHVkaW8gIHDDq3Iga3J5ZXJqZW4gZSBuasOrIGFuYWxpemUgc3RhdGlzdGlrb3JlIHTDqyB0w6sgZGjDq25hdmUgccOrIHBvc2Vkb2ptw6suDQoNCjIuIEJhc2hrw6twdW5pbWkgbsOrIGdydXAsIG5kYXJqYSBlIGRldHlyYXZlIGRoZSByZWFsaXppbWkgc2EgbcOrIGkgcGxvdMOrIGkgdMOrIGdqaXRoYSBkZXR5cmF2ZSB0w6sgY2FrdHVhcmEuDQoNCjMuIFDDq3JtaXLDq3NpbWkgZGhlIGF2YW5jaW1pIGkgYWZ0w6tzaXZlIHRvbmEgbsOrIHDDq3Jkb3JpbWluIGUgc29mdHdhcmV2ZSBzaTogRXhjZWwsIFJTdHVkaW8gc2kgZGhlIG7DqyBhbmFsaXppbWluIGUgdMOrIGRow6tuYXZlLg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIk9iamVrdGl2YXQgdG9uYSBuZSBrZXRlIHByb2pla3QgamFuZToiLCJibHVlIilgKioNCiAgIA0KMS4gUMOrciBuZHJ5c2hvcmV0IHNhc2lvcmUgZGlza3JldGUgc2k6IG51bXJpIGkgbXVuZ2VzYXZlIG7DqyBzaGtvbGzDqywgbnVtcmkgaSBvcsOrdmUgdMOrIHN0dWRpbWl0LCBudW1yaSBpIHBpa8OrdmUgdMOrIG1hcnJhIG7DqyBwcm92aW1pbiBlIGzDq25kw6t2ZSBzaTogbWF0ZW1hdGlrYSwgaGlzdG9yaWEsIGZpemlrYSwga2ltaWEsIGJpb2xvZ2ppYSwgYW5nbGlzaHRqYSBlIGdqZW9ncmFmaWEgdMOrIGdqZW5kZW4gdHJlZ3Vlc2l0IGUgcG96aW9jaW9uaXQgZSB0w6sgc2hww6tyaGFwamVzLg0KDQoyLiBUw6sgc3R1ZGlvaGV0IG1hcnLDq2Row6tuaWEgbWVzIG5kcnlzaG9yZXZlOiANCg0KLSBnamluaWEgbsOrIHJhcG9ydCBtZSBwdW7Dq3NpbWluIHBhcnQtdGltZSwgbnVtcmluIGUgbXVuZ2VzYXZlIG7DqyBzaGtvbGzDqywgYWt0aXZpdGV0ZXQgamFzaHTDq3Noa29sbG9yZSwgbnVtcmluIGUgb3LDq3ZlIHTDqyBzdHVkaW1pdCwgcHJvZmVzaW9uaW4gZSBwcmVmZXJ1YXIocHJvZmVzaW9uaSBxw6sgZHVhbiB0w6sgYsOraGVuKSBzaSBkaGUgcGlrw6t0IG7DqyBwcm92aW1lOyANCg0KLSBwdW7Dq3NpbWkgcGFydC10aW1lIG7DqyByYXBvcnQgbWUgbnVtcmluIGUgbXVuZ2VzYXZlIG7DqyBzaGtvbGzDqywgYWt0aXZpdGV0ZXQgamFzaHTDq3Noa29sbG9yZSwgbnVtcmluIGUgb3LDq3ZlIHTDqyBzdHVkaW1pdCBzaSBkaGUgcGlrw6t0IG7DqyBwcm92aW1lOw0KDQotIG51bXJpIGkgbXVuZ2VzYXZlIG7DqyBzaGtvbGzDqyBuw6sgcmFwb3J0IG1lIGFrdGl2aXRldGV0IGphc2h0w6tzaGtvbGxvcmUgZGhlIHBpa8OrdCBuw6sgcHJvdmltZTsNCg0KLSBudW1yaSBpIG9yw6t2ZSB0w6sgc3R1ZGltaXQgbsOrIHJhcG9ydCBtZSBwaWvDq3QgbsOrIHByb3ZpbWU7DQoNCi0gcHJvZmVzaW9uaSBpIMOrbmRycmF2ZSBtZSBwaWvDq3QgbsOrIHByb3ZpbWUuDQoNCjMuIE5kw6tydGltaSBpIGdyYWZpa8OrdmUgcMOrciBzdHVkaW1pbiBlIG1hcnLDq2Row6tuaWV2ZSBtZXMgbmRyeXNob3JldmUgZGhlIGtvbWVudGltaSBpIHR5cmUsIHNpIGRoZSBuZMOrcnRpbWkgaSBtZXRvZGF2ZSB0w6sgcGFyYXNoaWtpbWl0Lg0KDQojIyMgKipgciBjb2xvcmlzZSgiTmpvaGplIG1lIGRhdGFiYXplbiIsInB1cnBsZSIpYCoqDQoNCiBOw6sga8OrdMOrIHB1bmltIGtlbWkgdmVuZG9zdXIgdMOrIHDDq3J6Z2plZGhpbSBuasOrIGRhdGFiYXrDqyBrdSBwamVzw6sgZSBrw6t0aWogc3R1ZGltaSBqYW7DqyAyMDAwIHN0dWRlbnTDqyBkaGUgamFuw6sgbWFycsOrIG7DqyBzaHF5cnRpbSBuZHJ5c2hvcmV0IHNpOiANCiANCiAtIGdlbmRlciAtPiBnamluaWEgLT4gbmRyeXNob3JlIGNpbGVzb3JlIG5vbWluYWxlOw0KIA0KIC0gcGFydF90aW1lX2pvYiAtPiBwdW7Dq3NpbWkgcGFydC10aW1lIC0+IG5kcnlzaG9yZSBjaWxlc29yZSBub21pbmFsZTsNCiANCiAtIGFic2VuY2VfZGF5cyAtPiBudW1yaSBpIG11bmdlc2F2ZSBuw6sgc2hrb2xsw6sgLT4gbmRyeXNob3JlIHNhc2lvcmUgZGlza3JldGU7DQogDQogLSBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdHkgLT4gYWt0aXZpdGV0ZXQgamFzaHTDq3Noa29sbG9yZSAtPiBuZHJ5c2hvcmUgY2lsZXNvcmUgbm9taW5hbGU7DQogDQogLSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycyAtPiBudW1yaSBpIG9yw6t2ZSB0w6sgc3R1ZGltaXQgLT4gbmRyeXNob3JlIHNhc2lvcmUgZGlza3JldGU7DQogDQogLSBjYXJlZXJfYXNwaXJhdGlvbiAtPiBwcm9mZXNpb25pIGkgcHJlZmVydWFyKHByb2Zlc2lvbmkgccOrIGR1YW4gdMOrIGLDq2hlbikgLT4gbmRyeXNob3JlIGNpbGVzb3JlIG5vbWluYWxlDQogDQogLSBwaWvDq3QgZSB0eXJlIG7DqyBwcm92aW1pbiBlIHpodmlsbHVhciBuw6sgZGlzYSBsw6tuZMOrIHNpOiBtYXRlbWF0aWthLCBoaXN0b3JpYSwgZml6aWthLCBraW1pYSwgYmlvbG9namlhLCBhbmdsaXNodGphIGUgZ2plb2dyYWZpYS4gLT4gbmRyeXNob3JlIHNhc2lvcmUgZGlza3JldGUNCiANCiBQw6tydmVjIGvDq3R5cmUgbmRyeXNob3JldmUsIG5qw6sgbmRyeXNob3JlIHRqZXTDq3IgZSBnamVuZHVyIG7DqyBrw6t0w6sgZGF0YWJhesOrIGlzaHRlIGRoZSBhZHJlc2EgZSBlbWFpbC1pdCwgcG9yIG7DqyBrdWFkw6tyIHTDqyBwYXN0cmltaXQgdMOrIHTDqyBkaMOrbmF2ZSwgcMOrciB0aGplc2h0aW0gdMOrIHB1bsOrcyBzb27DqyBzaSBkaGUgcMOrciBzaGthayBzZSBudWsgYXJyaXTDq20gdMOrIHN0dWRpb25pbSBuasOrIG1hcnLDq2Row6tuaWUgbWVzIGvDq3NhaiBuZHJ5c2hvcmVqZSBuw6sgcmFwb3J0IG1lIG5kcnlzaG9yZXQgZSB0amVyYSwgbmUgZSBob3HDq20gbmdhIGRhdGFiYXphIGpvbsOrLiBHaml0aGFzaHR1IG5kcnlzaG9yamEgaWQgc2hlcmJlbiB0aGplc2h0IHNpIG51bWVyIHJlbmRvciBwZXIgc2VjaWxpbiBpbmRpdmlkIHRlIHBvcHVsbGF0ZXMgc29uZS4NCg0KIyMjICoqYHIgY29sb3Jpc2UoIkFuYWxpemEgZSB0ZSBkaGVuYXZlIiwiYmx1ZSIpYCoqDQpNZSBwb3NodGUgcGFyYXFpdGV0IG5qZSBwYXNxeXJlIHBlcm1ibGVkaGVzZSBlIHRlIGRoZW5hdmUgdG9uYS4NCg0KIyMjIyAqKmByIGNvbG9yaXNlKCJTdW1tYXJ5OiIsInR1cnF1b2lzZSIpYCoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0Kc3RyKHN0dWRlbnRfc2NvcmVzKQ0KYGBgDQpLZXR1IHBhcmFxaXRlbiB0aXBldCBlIHRlIGRoZW5hdmUgdG9uYSwgc2kgZGhlIHBlciBuZHJ5c2hvcmV0IHNhc2lvcmUgamVwZW4gZGlzYSB0cmVndWVzIHN0YXRpc3Rpa29yZSBzaTogbWluaW11bWksIG1ha3NpbXVtaSwga3VhcnRpbGV0LCBtZXNvcmphLCBtZXNhdGFyamEuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiU3VtbWFyeToiLCIjNWQ4YWE4IilgKioNCmBgYHtyfQ0Kc3VtbWFyeShzdHVkZW50X3Njb3JlcykNCmBgYA0KTWUgcG9zaHRlIHBhcmFxaXRlbiBnaml0aGFzaHR1IHZhcmlhY2lvbmksIGRldmlqaW1pIHN0YW5kYXJ0IGRoZSBtb2RhLg0KYGBge3J9DQojIFBlcmNha3RvaiBzdHVkZW50X3Njb3JlcyBzaSBkYXRhZnJhbWUgdGUgY2lsaXQgZG8gaSBsbG9nYXJpc2ltIHZhcmlhY2lvbmluIGRoZSBkZXZpamltaW4gc3RhbmRhcmQuDQpkZiA8LSBkYXRhLmZyYW1lKHN0dWRlbnRfc2NvcmVzLCByZXBsYWNlID0gVFJVRSkNCg0KIyBaZ2plZGhpbSB2ZXTDq20ga29sb25hdCBudW1lcmlrZS4NCmRmX251bWVyaWMgPC0gZGZbc2FwcGx5KGRmLCBpcy5udW1lcmljKV0NCg0KIyBMbG9nYXJpc2ltIHZhcmlhY2lvbmluLCBkZXZpamltaW4gc3RhbmRhcmQgZGhlIG1vZGVuIHDDq3Igw6dkbyBrb2xvbsOrIG51bWVyaWtlDQphcHBseShkZl9udW1lcmljLCAyLCBmdW5jdGlvbih4KSBjKHZhciA9IHZhcih4KSwgc2QgPSBzZCh4KSwgbW9kZSA9IGFzLm51bWVyaWMobmFtZXMod2hpY2gubWF4KHRhYmxlKHgpKSkpKSkNCmBgYA0KDQoNCiMjIyAqKmByIGNvbG9yaXNlKCJLb21lbnQgbWJpIHRyZWd1ZXNpdCBzdGF0aXN0aWtvcmUiLCIjNGI1MzIwIilgKioNCiMjIyMgKipgciBjb2xvcmlzZSgiS29tZW50b2ptw6sgdmxlcmF0IGUgZ2pldHVyYSB0w6sgdHJlZ3Vlc3ZlIHN0YXRpc3Rpa29yw6sgcMOrciBzZWNpbMOrbiBuZ2Ega29sb25hdCBlIHNocXlydHVhcmEgbcOrIHNpcMOrci4iLCIjNGI1MzIwIilgKioNCg0KICAgIEZpbGxvam3DqyBtZSBrb2xvbsOrbiBlIGFic2VuY2VfZGF5cyhtdW5nZXNhdCkuDQogIE5nYSB0w6sgZGjDq25hdCBtw6sgc2lww6tyIHbDq3Jlam3DqyBzZSBudW1yaSBpIG11bmdlc2F2ZSB0ZSBzdHVkZW50w6t0IGUgbWFycsOrIG7DqyBzaHF5cnRpbSDDq3NodMOrIG1lc2F0YXJpc2h0IDQgcMOrciBwZXJzb24uIE51bXJpIGkgbXVuZ2VzYXZlIHRlIHN0dWRlbnTDq3QgdGFuw6sgw6tzaHTDqyBrcnllc2lzaHQgMi4gTmrDqyBzdHVkZW50IGthIG11bmd1YXIgdMOrIHNodW10w6tuIDEwIGhlcsOrLCBwb3IgdmloZXQgcmUgccOrIG5qw6sgcGplc8OrIGUgdHlyZSBrYW7DqyB0w6sgbmdqYXLDqyB0w6sgamVuw6sgZnJla3VlbnR1ZXMgdMOrIHJyZWd1bGx0IHTDqyBtw6tzaW1pdCwgZHVrZSByZXp1bHR1YXIga8Orc2h0dSBwYSBtdW5nZXNhLiBQw6tybWVzIGluZm9ybWFjaW9uaXQgccOrIG1hcnJpbSBuZ2EgdmFyaWFjaW9uaSwgZHVrZSBxZW7DqyBzZSB2bGVyYSBlIHRpaiDDq3NodMOrIGUgbWFkaGUsIGF0w6toZXLDqyB0w6sgZGjDq25hdCB0b25hIGphbsOrIHTDqyBzaHDDq3JuZGFyYSBnamVyw6tzaXNodCBycmV0aCBtZXNhdGFyZXMgZGhlIHBhdmFyw6tzaXNodCBuZ2EgbnVtcmkgaSBww6tyZ2ppdGhzaMOrbSBpIGRow6tuYXZlIHRvbmEsIHDDq3JtZXMgZGV2aWppbWl0IHN0YW5kYXJkIGR1a2V0IHFhcnTDqyBxw6sgdMOrIGRow6tuYXQgdG9uYSBudWsgamFuw6sgc2h1bcOrIGxhcmcgbmdhIG1lc2F0YXJqYS4gUMOrciBzYSBpIHDDq3JrZXQgcG96aWNpb25pbWl0IHTDqyB0w6sgZGjDq25hdmUgdG9uYSBuw6sgcGplc8OrbiBlIHBvc2h0bWUgdMOrIGdydXBpdCB0w6sgdMOrIGRow6tuYXZlIG51bXJpIGkgbXVuZ2VzYXZlIMOrc2h0w6sgIG3DqyBpIHZvZ8OrbCAgb3NlIGkgYmFyYWJhcnTDqyBtZSAyO27DqyBtZXMgdMOrIGdydXBpdCB0w6sgZGjDq25hdCBqYW7DqyBtw6sgdMOrIHZvZ2xhIG9zZSB0w6sgYmFyYWJhcnRhIG1lIDM7bsOrIHBqZXPDq24gZSBzaXDDq3JtZSBudW1yaSBpIG11bmdlc2F2ZSDDq3NodMOrIG3DqyBpIHZvZ8OrbCBvc2UgaSBiYXJhYmFydMOrIG1lIDUuDQogICANCiAgICBWaWpvam3DqyAgbWUga29sb27Dq24gZSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VyczoNCiAgTmdhIHTDqyBkaMOrbmF0IHRvbmEgdsOrbcOrIHJlIHNlIG51bXJpIGkgb3LDq3ZlIHTDqyBzdHVkaW1pdCBww6tyIHNlY2lsaW4gc3R1ZGVudCDDq3NodMOrIG1lc2F0YXJpc2h0IDE4IG9yw6suDQpOdW1yaSBpIG9yw6t2ZSB0w6sgc3R1ZGltaXQgccOrIHNocGVuem9qbsOrIHN0dWRlbnTDq3QgZ2phdMOrIGrDq3ZlcyAgw6tzaHTDqyBrcnllc2lzaHQgMy4NCkdqYXTDqyBqYXbDq3MgbmrDqyBzdHVkZW50IGtyeWVuIG3DqyBzw6sgc2h1bXRpIDUwIG9yw6sgc3R1ZGltaSwgcG9yIGthIGRoZSBwcmVqIHR5cmUgdMOrIGNpbMOrdCBrYW7DqyBhbmdhemhpbWUgdMOrIHRqZXJhIGRoZSBudWsga2Fuw6sgbXVuZMOrc2kgdMOrIHN0dWRpb2puw6sgZ2phdMOrIGphdsOrcy4NClDDq3JtZXMgaW5mb3JtYWNpb25pdCBxw6sgbWFycmltIG5nYSB2YXJpYWNpb25pIGR1a2UgcWVuw6sgc2UgdmxlcmEgZSB0aWogw6tzaHTDqyBlIG1hZGhlIGF0w6toZXLDqyB0w6sgZGjDq25hdCB0b25hIGphbsOrIHTDqyBzaHDDq3JuZGFyYSBnamVyw6tzaXNodCBycmV0aCBtZXNhdGFyZXMgZGhlIHBhdmFyw6tzaXNodCBuZ2EgbnVtcmkgaSBww6tyZ2ppdGhzaMOrbSBpIHRlIGRow6tuYXZlIHRvbmEgcMOrcm1lcyBkZXZpamltaXQgc3RhbmRhcnQgZHVrZXQgcWFydMOrIHNlIHTDqyBkaMOrbmF0IHRvbmEgbnVrIGphbsOrIHNodW3DqyBsYXJnIG5nYSBtZXNhdGFyamEuUMOrciBzYSBpIHDDq3JrZXQgcG96aWNpb25pbWl0IHTDqyB0w6sgZGjDq25hdmUgdG9uYSBuw6sgcGplc8OrbiBlIHBvc2h0bWUgdMOrIGdydXBpdCB0w6sgdMOrIGRow6tuYXZlIG51bXJpIGkgbXVuZ2VzYXZlIMOrc2h0w6sgIG3DqyBpIHZvZ8OrbCAgb3NlIGkgYmFyYWJhcnTDqyBtZSA1O27DqyBtZXMgdMOrIGdydXBpdCB0w6sgZGjDq25hdCBqYW7DqyBtw6sgdMOrIHZvZ2xhIG9zZSB0w6sgYmFyYWJhcnRhIG1lIDE4O27DqyBwamVzw6tuIGUgc2lww6tybWUgbnVtcmkgaSBtdW5nZXNhdmUgw6tzaHTDqyBtw6sgaSB2b2dlbCBvc2UgaSBiYXJhYmFydGUgbWUgMjguDQogICAgDQojIyMjICoqYHIgY29sb3Jpc2UoIlRhbmkgZG8gc2hxeXJ0b2ptZSBrb2xvbmF0IGUgcGlrZXZlIHRlIG1hcnJhIG5lIHByb3ZpbWUuIiwiIzk5NjZjYyIpYCoqDQogICAgKiBtYXRoX3Njb3JlOiANCiAgIE5nYSB0ZSBkaGVuYXQgdG9uYSB2ZW1lIHJlIHNlIG51bXJpIGkgcGlrZXZlIHRlIG1hcnJhIG5lIHByb3ZpbWluIGUgbWF0ZW1hdGlrZXMgZXNodGUgbWVzYXRhcmlzaHQgODMuTmplIHBqZXNlIGUga29uc2lkZXJ1ZXNobWUgZSBzdHVkZW50ZXZlIGphbmUgdmxlcmVzdWFyIG1lIDk5IHBpa2UuDQpWbGVyZXNpbWkgbWUgaSBsYXJ0ZSBpIGFycml0dXIgZXNodGUgMTAwIHBpa2UgbmRlcnNhIGFpIG1lIGkgdWxldGkgZXNodGUgNDAgcGlrZS4NClBlcm1lcyBpbmZvcm1hY2lvbml0IHFlIG1hcnJpbSBuZ2EgdmFyaWFjaW9uaSBkdWtlIHFlbmUgc2UgdmxlcmEgZSB0aWogZXNodGUgZSBtYWRoZSBhdGVoZXJlIHRlIGRoZW5hdCB0b25hIGphbmUgdGUgc2hwZXJuZGFyYSBnamVyZXNpc2h0IHJyZXRoIG1lc2F0YXJlcyBkaGUgcGF2YXJlc2lzaHQgbmdhIG51bXJpIGkgcGVyZ2ppdGhzaGVtIGkgdGUgZGhlbmF2ZSB0b25hIHBlcm1lcyBkZXZpamltaXQgc3RhbmRhcnQgZHVrZXQgcWFydGUgc2UgdGUgZGhlbmF0IHRvbmEgIGphbmUgbGFyZyBuZ2EgbWVzYXRhcmphLg0KUGVyIHNhIGkgcGVya2V0IHBvemljaW9uaW1pdCB0ZSB0ZSBkaGVuYXZlIHRvbmEgbmUgcGplc2VuIGUgcG9zaHRtZSB0ZSBncnVwaXQgdGUgdGUgZGhlbmF2ZSBudW1yaSBpIG11bmdlc2F2ZSBlc2h0ZSAgbWUgaSB2b2dlbCAgb3NlIGkgYmFyYWJhcnRlIG1lIDc3O25lIG1lcyB0ZSBncnVwaXQgdGUgZGhlbmF0IGphbmUgbWUgdGUgdm9nbGEgb3NlIHRlIGJhcmFiYXJ0YSBtZSA4NztuZSBwamVzZW4gZSBzaXBlcm1lIG51bXJpIGkgbXVuZ2VzYXZlIGVzaHRlIG1lIGkgdm9nZWwgb3NlIGkgYmFyYWJhcnRlIG1lIDkzLg0KICAgIA0KICAgICpoaXN0b3J5X3Njb3JlOiANCiAgTmdhIHRlIGRoZW5hdCB0b25hIHZlbWUgcmUgc2UgbnVtcmkgaSBwaWtldmUgdGUgbWFycmEgbmUgcHJvdmltaW4gZSBoaXN0b3Jpc2UgZXNodGUgbWVzYXRhcmlzaHQgODAgcGlrZS5OamUgcGplc2UgZSBrb25zaWRlcnVlc2htZSBlIHN0dWRlbnRldmUgamFuZSB2bGVyc3VhciBtZSA4OCBwaWtlLg0KVmxlcnNpbWkgbWUgaSBsYXJ0IGkgYXJyaXR1ciBlc2h0ZSAxMDAgcGlrZSBuZGVyc2EgYWkgbWUgaSB1bGV0aSBlc2h0ZSA1MCBwaWtlLg0KUGVybWVzIGluZm9ybWFjaW9uaXQgcWUgbWFycmltIG5nYSB2YXJpYWNpb25pIGR1a2UgcWVuZSBzZSB2bGVyYSBlIHRpaiBlc2h0ZSBlIG1hZGhlIGF0ZWhlcmUgdGUgZGhlbmF0IHRvbmEgamFuZSB0ZSBzaHBlcm5kYXJhIGdqZXJlc2lzaHQgcnJldGggbWVzYXRhcmVzIGRoZSBwYXZhcnNpc2h0IG5nYSBudW1yaSBpIHBlcmdqaXRoc2hlbSBpIHRlIGRoZW5hdmUgdG9uYSBwZXJtZXMgZGV2aWppbWl0IHN0YW5kYXJ0IGR1a2V0IHFhcnRlIHNlIHRlIGRoZW5hdCB0b25hICBqYW5lIGxhcmcgbmdhIG1lc2F0YXJqYS4NClBlciBzYSBpIHBlcmtldCBwb3ppY2lvbmltaXQgdGUgdGUgZGhlbmF2ZSB0b25hIG5lIHBqZXNlbiBlIHBvc2h0bWUgdGUgZ3J1cGl0IHRlIHRlIGRoZW5hdmUgbnVtcmkgaSBtdW5nZXNhdmUgZXNodGUgIG1lIGkgdm9nZWwgIG9zZSBpIGJhcmFiYXJ0ZSBtZSA3MDtuZSBtZXMgdGUgZ3J1cGl0IHRlIGRoZW5hdCBqYW5lIG1lIHRlIHZvZ2xhIG9zZSB0ZSBiYXJhYmFydGEgbWUgODI7bmUgcGplc2VuIGUgc2lwZXJtZSBudW1yaSBpIG11bmdlc2F2ZSBlc2h0ZSBtZSBpIHZvZ2VsIG9zZSBpIGJhcmFiYXJ0ZSBtZSA5MS4NCg0KICAgICpwaHlzaWNzX3Njb3JlOiANCiAgTmdhIHRlIGRoZW5hdCB0b25hIHZlbWUgcmUgc2UgbnVtcmkgaSBwaWtldmUgdGUgbWFycmEgbmUgcHJvdmltaW4gZSBmaXppa2VzIGVzaHRlIG1lc2F0YXJpc2h0IDgxIHBpa2UuTmplIHBqZXNlIGUga29uc2lkZXJ1ZXNobWUgZSBzdHVkZW50ZXZlIGphbmUgdmxlcmVzdWFyIG1lIDk2IHBpa2UuDQpWbGVyZXNpbWkgbWUgaSBsYXJ0ZSBpIGFycml0dXIgZXNodGUgMTAwIHBpa2UgbmRlcnNhIGFpIG1lIGkgdWxldGkgZXNodGUgNTAgcGlrZS4NClBlcm1lcyBpbmZvcm1hY2lvbml0IHFlIG1hcnJpbSBuZ2EgdmFyaWFjaW9uaSBkdWtlIHFlbmUgc2UgdmxlcmEgZSB0aWogZXNodGUgZSBtYWRoZSBhdGVoZXJlIHRlIGRoZW5hdCB0b25hIGphbmUgdGUgc2hwZXJuZGFyYSBnamVyZXNpc2h0IHJyZXRoIG1lc2F0YXJlcyBkaGUgcGF2YXJzaXNodCBuZ2EgbnVtcmkgaSBwZXJnaml0aHNoZW0gaSB0ZSBkaGVuYXZlIHRvbmEgcGVybWVzIGRldmlqaW1pdCBzdGFuZGFydCBkdWtldCBxYXJ0ZSBzZSB0ZSBkaGVuYXQgdG9uYSAgamFuZSBsYXJnIG5nYSBtZXNhdGFyamEuDQpQZXIgc2EgaSBwZXJrZXQgcG96aWNpb25pbWl0IHRlIHRlIGRoZW5hdmUgdG9uYSBuZSBwamVzZW4gZSBwb3NodG1lIHRlIGdydXBpdCB0ZSB0ZSBkaGVuYXZlIG51bXJpIGkgbXVuZ2VzYXZlIGVzaHRlICBtZSBpIHZvZ2VsICBvc2UgaSBiYXJhYmFydGUgbWUgNzE7bmUgbWVzIHRlIGdydXBpdCB0ZSBkaGVuYXQgamFuZSBtZSB0ZSB2b2dsYSBvc2UgdGUgYmFyYWJhcnRhIG1lIDgzO25lIHBqZXNlbiBlIHNpcGVybWUgbnVtcmkgaSBtdW5nZXNhdmUgZXNodGUgbWUgaSB2b2dlbCBvc2UgaSBiYXJhYmFydGUgbWUgOTIuDQoNCiAgICAqY2hlbWlzdHJ5X3Njb3JlOiANCiAgTmdhIHRlIGRoZW5hdCB0b25hIHZlbWUgcmUgc2UgbnVtcmkgaSBwaWtldmUgdGUgbWFycmEgbmUgcHJvdmltaW4gZSBraW1pc2UgZXNodGUgbWVzYXRhcmlzaHQgODAgcGlrZS5OamUgcGplc2UgZSBrb25zaWRlcnVlc2htZSBlIHN0dWRlbnRldmUgamFuZSB2bGVyc3VhciBtZSA5NCBwaWtlLg0KVmxlcmVzaW1pIG1lIGkgbGFydGUgaSBhcnJpdHVyIGVzaHRlIDEwMCBwaWtlIG5kZXJzYSBhaSBtZSBpIHVsZXRpIGVzaHRlIDUwIHBpa2UuDQpQZXJtZXMgaW5mb3JtYWNpb25pdCBxZSBtYXJyaW0gbmdhIHZhcmlhY2lvbmkgZHVrZSBxZW5lIHNlIHZsZXJhIGUgdGlqIGVzaHRlIGUgbWFkaGUgYXRlaGVyZSB0ZSBkaGVuYXQgdG9uYSBqYW5lIHRlIHNocGVybmRhcmEgZ2plcmVzaXNodCBycmV0aCBtZXNhdGFyZXMgZGhlIHBhdmFyc2lzaHQgbmdhIG51bXJpIGkgcGVyZ2ppdGhzaGVtIGkgdGUgZGhlbmF2ZSB0b25hIHBlcm1lcyBkZXZpamltaXQgc3RhbmRhcnQgZHVrZXQgcWFydGUgc2UgdGUgZGhlbmF0IHRvbmEgIGphbmUgbGFyZyBuZ2EgbWVzYXRhcmphLg0KUGVyIHNhIGkgcGVya2V0IHBvemljaW9uaW1pdCB0ZSB0ZSBkaGVuYXZlIHRvbmEgbmUgcGplc2VuIGUgcG9zaHRtZSB0ZSBncnVwaXQgdGUgdGUgZGhlbmF2ZSBudW1yaSBpIG11bmdlc2F2ZSBlc2h0ZSAgbWUgaSB2b2dlbCAgb3NlIGkgYmFyYWJhcnRlIG1lIDY5O25lIG1lcyB0ZSBncnVwaXQgdGUgZGhlbmF0IGphbmUgbWUgdGUgdm9nbGEgb3NlIHRlIGJhcmFiYXJ0YSBtZSA4MTtuZSBwamVzZW4gZSBzaXBlcm1lIG51bXJpIGkgbXVuZ2VzYXZlIGVzaHRlIG1lIGkgdm9nZWwgb3NlIGkgYmFyYWJhcnRlIG1lIDkxLg0KIA0KICAgICpiaW9sb2d5X3Njb3JlOg0KICAgTmdhIHRlIGRoZW5hdCB0b25hIHZlbWUgcmUgc2UgbnVtcmkgaSBwaWtldmUgdGUgbWFycmEgbmUgcHJvdmltaW4gZSBiaW9sb2dqaXNlIGVzaHRlIG1lc2F0YXJpc2h0IDgwIHBpa2UuTmplIHBqZXNlIGUga29uc2lkZXJ1ZXNobWUgZSBzdHVkZW50ZXZlIGphbmUgdmxlcnN1YXIgbWUgMTAwIHBpa2UuDQpWbGVyZXNpbWkgbWUgaSBsYXJ0ZSBpIGFycml0dXIgZXNodGUgMTAwIHBpa2UgbmRlcnNhIGFpIG1lIGkgdWxldGkgZXNodGUgMzAgcGlrZS4NClBlcm1lcyBpbmZvcm1hY2lvbml0IHFlIG1hcnJpbSBuZ2EgdmFyaWFjaW9uaSBkdWtlIHFlbmUgc2UgdmxlcmEgZSB0aWogZXNodGUgZSBtYWRoZSBhdGVoZXJlIHRlIGRoZW5hdCB0b25hIGphbmUgdGUgc2hwZXJuZGFyYSBnamVyZXNpc2h0IHJyZXRoIG1lc2F0YXJlcyBkaGUgcGF2YXJzaXNodCBuZ2EgbnVtcmkgaSBwZXJnaml0aHNoZW0gaSB0ZSBkaGVuYXZlIHRvbmEgcGVybWVzIGRldmlqaW1pdCBzdGFuZGFydCBkdWtldCBxYXJ0ZSBzZSB0ZSBkaGVuYXQgdG9uYSAgamFuZSBsYXJnIG5nYSBtZXNhdGFyamEuDQpQZXIgc2EgaSBwZXJrZXQgcG96aWNpb25pbWl0IHRlIHRlIGRoZW5hdmUgdG9uYSBuZSBwamVzZW4gZSBwb3NodG1lIHRlIGdydXBpdCB0ZSB0ZSBkaGVuYXZlIG51bXJpIGkgbXVuZ2VzYXZlIGVzaHRlICBtZSBpIHZvZ2VsICBvc2UgaSBiYXJhYmFydGUgbWUgNjk7bmUgbWVzIHRlIGdydXBpdCB0ZSBkaGVuYXQgamFuZSBtZSB0ZSB2b2dsYSBvc2UgdGUgYmFyYWJhcnRhIG1lIDgxO25lIHBqZXNlbiBlIHNpcGVybWUgbnVtcmkgaSBtdW5nZXNhdmUgZXNodGUgbWUgaSB2b2dlbCBvc2UgaSBiYXJhYmFydGUgbWUgOTEuDQoNCiAgICAqZW5nbGlzaF9zY29yZToNCiAgIE5nYSB0ZSBkaGVuYXQgdG9uYSB2ZW1lIHJlIHNlIG51bXJpIGkgcGlrZXZlIHRlIG1hcnJhIG5lIHByb3ZpbWluIGUgYW5nbGlzaHRlcyBlc2h0ZSBtZXNhdGFyaXNodCA4MSBwaWtlLk5qZSBwamVzZSBlIGtvbnNpZGVydWVzaG1lIGUgc3R1ZGVudGV2ZSBqYW5lIHZsZXJlc3VhciBtZSA5MCBwaWtlLg0KVmxlcmVzaW1pIG1lIGkgbGFydGUgaSBhcnJpdHVyIGVzaHRlIDk5IHBpa2UgbmRlcnNhIGFpIG1lIGkgdWxldGkgZXNodGUgNTAgcGlrZS4NClBlcm1lcyBpbmZvcm1hY2lvbml0IHFlIG1hcnJpbSBuZ2EgdmFyaWFjaW9uaSBkdWtlIHFlbmUgc2UgdmxlcmEgZSB0aWogZXNodGUgZSBtYWRoZSBhdGVoZXJlIHRlIGRoZW5hdCB0b25hIGphbmUgdGUgc2hwZXJuZGFyYSBnamVyZXNpc2h0IHJyZXRoIG1lc2F0YXJlcyBkaGUgcGF2YXJzaXNodCBuZ2EgbnVtcmkgaSBwZXJnaml0aHNoZW0gaSB0ZSBkaGVuYXZlIHRvbmEgcGVybWVzIGRldmlqaW1pdCBzdGFuZGFydCBkdWtldCBxYXJ0ZSBzZSB0ZSBkaGVuYXQgdG9uYSAgamFuZSBsYXJnIG5nYSBtZXNhdGFyamEuDQpQZXIgc2EgaSBwZXJrZXQgcG96aWNpb25pbWl0IHRlIHRlIGRoZW5hdmUgdG9uYSBuZSBwamVzZW4gZSBwb3NodG1lIHRlIGdydXBpdCB0ZSB0ZSBkaGVuYXZlIG51bXJpIGkgbXVuZ2VzYXZlIGVzaHRlICBtZSBpIHZvZ2VsICBvc2UgaSBiYXJhYmFydGUgbWUgNzI7bmUgbWVzIHRlIGdydXBpdCB0ZSBkaGVuYXQgamFuZSBtZSB0ZSB2b2dsYSBvc2UgdGUgYmFyYWJhcnRhIG1lIDgzO25lIHBqZXNlbiBlIHNpcGVybWUgbnVtcmkgaSBtdW5nZXNhdmUgZXNodGUgbWUgaSB2b2dlbCBvc2UgaSBiYXJhYmFydGUgbWUgOTEuDQoNCiAgICAqZ2VvZ3JhcGh5X3Njb3JlOiANCiAgTmdhIHRlIGRoZW5hdCB0b25hIHZlbWUgcmUgc2UgbnVtcmkgaSBwaWtldmUgdGUgbWFycmEgbmUgcHJvdmltaW4gZSBnamVvZ3JhZmlzZSBlc2h0ZSBtZXNhdGFyaXNodCA4MSBwaWtlLk5qZSBwamVzZSBlIGtvbnNpZGVydWVzaG1lIGUgc3R1ZGVudGV2ZSBqYW5lIHZsZXJlc3VhciBtZSA4OCBwaWtlLg0KVmxlcmVzaW1pIG1lIGkgbGFydGUgaSBhcnJpdHVyIGVzaHRlIDEwMCBwaWtlIG5kZXJzYSBhaSBtZSBpIHVsZXRpIGVzaHRlIDYwIHBpa2UuDQpQZXJtZXMgaW5mb3JtYWNpb25pdCBxZSBtYXJyaW0gbmdhIHZhcmlhY2lvbmkgZHVrZSBxZW5lIHNlIHZsZXJhIGUgdGlqIGVzaHRlIGUgbWFkaGUgYXRlaGVyZSB0ZSBkaGVuYXQgdG9uYSBqYW5lIHRlIHNocGVybmRhcmEgZ2plcmVzaXNodCBycmV0aCBtZXNhdGFyZXMgZGhlIHBhdmFyc2lzaHQgbmdhIG51bXJpIGkgcGVyZ2ppdGhzaGVtIGkgdGUgZGhlbmF2ZSB0b25hIHBlcm1lcyBkZXZpamltaXQgc3RhbmRhcnQgZHVrZXQgcWFydGUgc2UgdGUgZGhlbmF0IHRvbmEgIGphbmUgbGFyZyBuZ2EgbWVzYXRhcmphLg0KUGVyIHNhIGkgcGVya2V0IHBvemljaW9uaW1pdCB0ZSB0ZSBkaGVuYXZlIHRvbmEgbmUgcGplc2VuIGUgcG9zaHRtZSB0ZSBncnVwaXQgdGUgdGUgZGhlbmF2ZSBudW1yaSBpIG11bmdlc2F2ZSBlc2h0ZSAgbWUgaSB2b2dlbCAgb3NlIGkgYmFyYWJhcnRlIG1lIDcxO25lIG1lcyB0ZSBncnVwaXQgdGUgZGhlbmF0IGphbmUgbWUgdGUgdm9nbGEgb3NlIHRlIGJhcmFiYXJ0YSBtZSA4MTtuZSBwamVzZW4gZSBzaXBlcm1lIG51bXJpIGkgbXVuZ2VzYXZlIGVzaHRlIG1lIGkgdm9nZWwgb3NlIGkgYmFyYWJhcnRlIG1lIDkxLg0KDQoNCiMjIyAqKmByIGNvbG9yaXNlKCJHcmFmaWtlIGRoZSB0YWJlbGEgc3RhdGlzdGlrb3JlIHBlciBuamUgbmRyeXNob3JlIiwiZ3JlZW4iKWAqKg0KDQpOamUgcGplc2UgZSByZW5kZXNpc2htZSBlIHByb2pla3RpdCB0b25lIGVzaHRlIHBhZHlzaGltIG5kZXJ0aW1pIGkgZ3JhZmlrZXZlLiBTaSBmaWxsaW0gZG8gbmRlcnRvam1lIHBlciBzZWNpbGVuIG5kcnlzaG9yZSBncmFmaWtlIHRlIGxsb2pldmUgdGUgbmRyeXNobWUuDQoNCg0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSBJIFBVTkVTSU1JVCBQQVJULVRJTUUiLCJyZWQiKWANCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpwMSA8LSBnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBwYXJ0X3RpbWVfam9iKSArDQogIGdlb21fYmFyKGZpbGwgPSAiI2ZlNmY1ZSIpICsNCiAgbGFicygNCiAgICB4ID0gIlBvaGltaSIsDQogICAgeSA9ICJEZW5kdXJpYSIsDQogICAgdGl0bGUgPSAiR3JhZmlrdSBpIHB1bmVzaW1pdCBwYXJ0LXRpbWUgMS4xIg0KICApICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCmByIGNvbG9yaXNlKCJHUkFGSUtVIE1CSSBHSklOSU5FIEUgSU5ESVZJREVWRSIsImdyZWVuIilgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCnAyIDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGdlbmRlcikgKw0KICBnZW9tX2JhcihmaWxsID0gIiNDNjhGRjciKSArDQogIGxhYnMoDQogICAgeCA9ICJHamluaWEiLA0KICAgIHkgPSAiRGVuZHVyaWEiLA0KICAgIHRpdGxlID0gIkdyYWZpa3UgbWJpIGdqaW5pbmUgZSBpbmRpdmlkZXZlIDEuMiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgTUJJIEFLVElWSVRFVEVUIEpBU0hURVNIS09MTE9SRSIsInB1cnBsZSIpYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpwMyA8LSBnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcykgKw0KICBnZW9tX2JhcihmaWxsID0gIiM5QUI2RTgiKSArDQogIGxhYnMoDQogICAgeCA9ICJQb2hpbWkiLA0KICAgIHkgPSAiRGVuZHVyaWEiLA0KICAgIHRpdGxlID0gIkdyYWZpa3UgbWJpIGFrdGl2aXRldGV0IGphc2h0ZXNoa29sbG9yZSAxLjMiDQogICkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9ncmF5KCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsDQogICAgZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShncmlkRXh0cmEpDQpncmlkLmFycmFuZ2UocDEsIHAyLCBwMywgbnJvdyA9IDIpDQpgYGANCk5nYSBncmFmaWt1IDEuMSAgZGhlIDEuMyBuZSB2ZW1lIHJlIHNlIG5qZSBwamVzYSBlIG1hZGhlIGUgc3R1ZGVudGV2ZSBudWsgcHVub2puZSBwYXJ0IHRpbWUgZGhlIG51ayBrcnllam5lIGFrdGl2aXRldGUgamFzaHRlc2hrb2xsb3JlLCBuZGVyc2EgbmdhIGdyYWZpa3UgMS4yIHZlbWUgcmUgc2Uga2VtaSBuciB0ZSBuamVqdGUgaW5kaXZpZGVzaCBzaSBtZXNoa3VqIGFzaHR1IGRoZSBmZW1yYS4NCg0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSBNQkkgUFJPRkVTSU9OSU4gRSBFTkRSUkFWRSIsImJsYWNrIilgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCiBnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBjYXJlZXJfYXNwaXJhdGlvbikgKw0KICBnZW9tX2JhcihmaWxsID0gIiNGRjY5QjQiKSArDQogIGxhYnMoDQogICAgeCA9ICJQcm9mZXNpb25pIiwNCiAgICB5ID0gIkRlbmR1cmlhIiwNCiAgICB0aXRsZSA9ICJHcmFmaWt1IG1iaSBwcm9mZXNpb25pbiBlIGVuZHJyYXZlIDEuNCINCiAgKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0TCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCk5nYSBncmFmaWt1IDEuNCB2ZW1lIHJlIHNlIHByb2Zlc2lvbmV0IG1lIHRlIHBlbHF5ZXJhIGphbmUgc29mdHdhcmUgZW5naW5lZXIgZGhlIGJ1c3NpbmVzcyBvd25lcixuZGVyc2EgYXRhIG1lIHBhayBpIHByZWZlcnVhcmkgamFuZSB3cml0ZXIgZGhlIHRlYWNoZXIuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiTWUgcG9zaHRlIGRvIHRlIG5kZXJ0b2ptZSB0aXBlIHRlIG5kcnlzaG1lIGdyYWZpa2VzaCBwZXIgbmRyeXNob3JlbiBtdW5nZXNhdC4iLCJibGFjayIpYCoqDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjUiLCJibGFjayIpYA0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwTCwgZmlsbCA9ICIjREM2OUY3IiwgYWVzKHk9Li5jb3VudC4uKSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPS4uY291bnQuLiksIHN0YXQ9J2NvdW50Jywgdmp1c3Q9LTAuNSwgc2l6ZT0zKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJEZW5kdXJpYSIsDQogICAgdGl0bGUgPSAiR3JhZmlrdSBtYmkgbXVuZ2VzYXQgMS41Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KTmdhIGdyYWZpa3UgMS41IHZlbWUgcmUgc2Uga2VtaSAzNDQgc3R1ZGVudCBxZSBrYW5lIGJlcmUgcnJldGggMiBtdW5nZXNhLG5kZXJrb2ggNTEgcHJlaiB0eXJlIGthbmUgYmVyZSBycmV0aCA4IG11bmdlc2EuDQoNCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuNiIsImJsYWNrIilgDQpgYGB7cn0NCnA2IDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gYWJzZW5jZV9kYXlzKSArDQogIGdlb21fYm94cGxvdChmaWxsID0gIiNGRjhDMDAiKSArDQogIGxhYnMoeSA9ICJEaXRldCBlIG11bmdlc2F2ZSIsIHRpdGxlID0gIkJveHBsb3QiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS43IiwiYmxhY2siKWANCmBgYHtyfQ0KcDcgPC0gZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gIiIsIHkgPSBhYnNlbmNlX2RheXMpICsNCiAgZ2VvbV92aW9saW4oYWRqdXN0ID0gMUwsIHNjYWxlID0gImFyZWEiLCBmaWxsID0gIiM5QUUxOUEiKSArDQogIGxhYnMoeSA9ICJEaXRldCBlIG11bmdlc2F2ZSIsIHRpdGxlID0gIkdyYWZpa3UgdmlvbGluZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjgiLCJibGFjayIpYA0KYGBge3J9DQpwODwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzKSArDQogIGdlb21fZGVuc2l0eShhZGp1c3QgPSAxTCwgZmlsbCA9ICIjRTNBRTlGIikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiRGVuc2l0ZXRpIiwNCiAgICB0aXRsZSA9ICJHcmFmaWt1IGkgZGVuc2l0ZXRpdCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShwNiwgcDcsIHA4LCBucm93ID0gMikNCmBgYA0KKk5nYSBib3hwbG90aSBuZSB2ZW1lIHJlIHNlIG1pbiBlc2h0ZSAwIG11bmdlc2EgLG5kZXJzYSBtYXggcWUgZXNodGUgMTAgbXVuZ2VzYSBkaGUgc2hvZmltIHFlIGVzaHRlIHNodW1lIGxhcmcgdmxlcmVzIG1lc2F0YXJlLkRoZSBtZXFlbnNlIHNlIGt1YXJ0aWxpIGkgZHl0ZSBlc2h0ZSBzaHVtZSBhZmVyIGt1YXJ0aWxpdCB0ZSBwYXJlIGtqbyB0cmVnb24gc2UgdGUgZGhlbmF0IHRvbmEgamFuZSBzaHVtZSBhZmVyIG1lc2F0YXJlcy4NCipOZ2EgZ3JhZmlrdSB2aW9saW5lIHZlbWUgcmUgc2UgbmdhIDAtMyBncmFmaWt1IHZqZW4gaSBnanJlIGdqZSBxZSBkbyB0ZSB0aG90ZSBzZSB0ZSBkaGVuYXQgdG9uYSBqYW5lIHRlIHNocGVybmRhcmEgbmRlcnNhIG5nYSAzLTEwIGdyYWZpa3UgdmplbiBkdWtlIHUgbmd1c2h0dWFyIGRoZSBram8gZG8gdGUgdGhvdGUgc2UgdGUgZGhlbmF0IHRvbmEgbnVrIGphbmUgdGUgc2hwZXJuZGFyYS4NCipHcmFmaWt1IGkgZGVuc2l0ZXRpdCBuYSB0cmVnb24gc2hwZXJuZGFyamVuIGUgZGVuc2l0ZXRpdCB0ZSBtdW5nZXNhdmUuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiTWUgcG9zaHRlIGRvIHRlIG5kZXJ0b2ptZSB0aXBlIHRlIG5kcnlzaG1lIGdyYWZpa2VzaCBwZXIgbmRyeXNob3JlbiBvcmV0IGUgc3R1ZGltaXQgamF2b3JlLiIsImJsYWNrIilgKioNCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuOSIsImJsYWNrIilgDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAyMEwsIGZpbGwgPSAicHVycGxlIiwgY29sb3IgPSAid2hpdGUiKSArDQogIHN0YXRfYmluKGJpbnMgPSAyMEwsIGdlb209InRleHQiLCBhZXMobGFiZWw9Li5jb3VudC4uKSwgdmp1c3Q9LTAuNSkgKw0KICBnZ3RpdGxlKCJIaXN0b2dyYW1pIikgKw0KICB4bGFiKCJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIpICsNCiAgeWxhYigiRGVuZHVyaWEiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQpOZ2EgaGlzdG9ncmFtaSBuZSB2ZW1lIHJlIHNlIGtlbWkgbmplIG5yIHNodW1lIHRlIG1hZGggc3R1ZGVudGVzaCBxZSBzdHVkaW9qbmUgc2h1bWUgcGFrIG9yZSBkaGUgbmplIG5yIHNodW1lIHRlIHZvZ2VsIHN0dWRlbnRlc2ggcWUgc3R1ZGlvam5lIG5nYSA0NS01MCBvcmUgbmUgamF2ZS4NCg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4xMCIsImJsYWNrIilgDQpgYGB7cn0NCnA5IDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMpICsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiI0VmZGVjZCIpICsNCiAgbGFicyh5ID0gIk9yZXQgamF2b3JlIHRlIHN0dWRpbWl0IiwgdGl0bGUgPSAiQm94cGxvdCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjExIiwiYmxhY2siKWANCmBgYHtyfQ0KcDEwIDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMpICsNCiAgZ2VvbV92aW9saW4oYWRqdXN0ID0gMUwsIHNjYWxlID0gImFyZWEiLCBmaWxsID0gIiNmZjAzM2UiKSArDQogIGxhYnMoeSA9ICJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIsIHRpdGxlID0gIkdyYWZpa3UgdmlvbGluZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4xMiIsImJsYWNrIilgDQpgYGB7cn0NCnAxMTwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMpICsNCiAgZ2VvbV9kZW5zaXR5KGFkanVzdCA9IDFMLCBmaWxsID0gIiNhNGM2MzkiKSArDQogIGxhYnMoDQogICAgeCA9ICJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIsDQogICAgeSA9ICJEZW5zaXRldGkiLA0KICAgIHRpdGxlID0gIkdyYWZpa3UgaSBkZW5zaXRldGl0Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHA5LCBwMTAsIHAxMSwgbnJvdyA9IDIpDQpgYGANCipOZ2EgYm94cGxvdGkgbmUgdmVtZSByZSBzZSBtaW4gZXNodGUgMCBvcmUgc3R1ZGltaSxuZGVyc2EgbWF4IHFlIGVzaHRlIDUwIG9yZSBzdHVkaW1pLkRoZSBtZXFlbnNlIHNlIGt1YXJ0aWxpIGkgZHl0ZSBlc2h0ZSBzaHVtZSBhZmVyIGt1YXJ0aWxpdCB0ZSB0cmV0ZSBram8gdHJlZ29uIHNlIHRlIGRoZW5hdCB0b25hIGthbmUgbmplIHNocGVybmRhcmplIHRlIHJyZWd1bGx0Lg0KKk5nYSBncmFmaWt1IHZpb2xpbmUgdmVtZSByZSBzZSAwLTUgZXNodGUgaSBnamVyZSBwYXN0YWogbmdhIDUtMTAgdmplbiBkdWtlIHUgbmd1c2h0dWFyLCBuZ2EgMTAtMjAgdmplbiBpIGdqZXJlIGRoZSBuZ2EgMzAtNTAgdmplbiBkdWtlIHUgbmd1c2h0dWFyLg0KKkdyYWZpa3UgaSBkZW5zaXRldGl0IG5hIHRyZWdvbiBzaHBlcm5kYXJqZW4gZSBkZW5zaXRldGl0IHRlIG9yZXZlIHRlIHN0dWRpbWl0Lg0KDQojIyMgKipgciBjb2xvcmlzZSgiR3JhZmlrZSBkaGUgdGFiZWxhIHN0YXRpc3Rpa29yZSBwZXIgcGlrZXQgZSBtYXJyYSBuZSBwcm92aW1lIiwidHVycXVvaXNlIilgKioNCiMjIyMgKipgciBjb2xvcmlzZSgiTWUgcG9zaHRlIGRvIHRlIG5kZXJ0b2ptZSB0aXBlIHRlIG5kcnlzaG1lIGdyYWZpa2VzaCBwZXIgbmRyeXNob3JlbiBtYXRoX3Njb3JlLiIsImJsYWNrIilgKioNCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuMTMiLCJibGFjayIpYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBtYXRoX3Njb3JlKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAyMEwsIGZpbGwgPSAidHVycXVvaXNlIiwgY29sb3IgPSAid2hpdGUiKSArDQogIHN0YXRfYmluKGJpbnMgPSAyMEwsIGdlb209InRleHQiLCBhZXMobGFiZWw9Li5jb3VudC4uKSwgdmp1c3Q9LTAuNSkgKw0KICBnZ3RpdGxlKCJIaXN0b2dyYW1pIikgKw0KICB4bGFiKCJQaWtldCBlIG1hcnJhIG5lIHByb3ZpbWluIGUgbWF0ZW1hdGlrZXMiKSArDQogIHlsYWIoIkRlbmR1cmlhIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KTmdhIGhpc3RvZ3JhbWkgbWUgc2lwZXIgdmVtZSByZSBzZSB2bGVyYSBtYXggZSB0aWogMzAxIHRyZWdvbiBuciBlIHN0dWRlbnRldmUgcWUga2FuZSBtYXJyIDkwIHBpayBuZSBwcm92aW1pbiBlIG1hdGVtYXRpa2VzIG5kZXJzYSB2bGVyYSBtaW4gcWUgZXNodGUgMTMgdHJlZ29uIG5yIGUgc3R1ZGVudGV2ZSBxZSBrYW5lIG1hcnI0NS01MCBwaWsgbmUgcHJvdmltLg0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjE0IiwiYmxhY2siKWANCmBgYHtyfQ0KcDEyIDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gbWF0aF9zY29yZSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICIjZTk3NDUxIikgKw0KICBsYWJzKHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBtYXRlbWF0aWtlcyIsIHRpdGxlID0gIkJveHBsb3QiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuMTUiLCJibGFjayIpYA0KYGBge3J9DQpwMTMgPC0gZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gIiIsIHkgPSBtYXRoX3Njb3JlKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIiwgZmlsbCA9ICIjZTQ3MTdhIikgKw0KICBsYWJzKHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBtYXRlbWF0aWtlcyIsIHRpdGxlID0gIkdyYWZpa3UgdmlvbGluZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4xNiIsImJsYWNrIilgDQpgYGB7cn0NCnAxNDwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gbWF0aF9zY29yZSkgKw0KICBnZW9tX2RlbnNpdHkoYWRqdXN0ID0gMUwsIGZpbGwgPSAiIzAwNmIzYyIpICsNCiAgbGFicygNCiAgICB4ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgbWF0ZW1hdGlrZXMiLA0KICAgIHkgPSAiRGVuc2l0ZXRpIiwNCiAgICB0aXRsZSA9ICJHcmFmaWt1IGkgZGVuc2l0ZXRpdCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShwMTIsIHAxMywgcDE0LCBucm93ID0gMikNCmBgYA0KKk5nYSBib3hwbG90aSxncmFmaWt1IHZpb2xpbmUgZGhlIGdyYWZpa3UgZGVuc2l0ZXRpdCBuZSB2ZW1lIHJlIHNlIHRlIGRoZW5hdCBqYW5lIHRlIHNocGVybmRhcmEgcnJldGggdmxlcmF2ZSA4MC0xMDAgZ2plIHFlIHRyZWdvbiBzZSBrbGFzYSBrYSBuamUgcGVyZm9ybWFuY2UgdGUgbWlyZSBuZSBsZW5kZW4gZSBtYXRlbWF0aWtlcy4NCg0KIyMjIyAqKmByIGNvbG9yaXNlKCJNZSBwb3NodGUgZG8gdGUgbmRlcnRvam1lIHRpcGUgdGUgbmRyeXNobWUgZ3JhZmlrZXNoIHBlciBuZHJ5c2hvcmVuIGhpc3Rvcnlfc2NvcmUuIiwiYmxhY2siKWAqKg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4xNyIsImJsYWNrIilgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGhpc3Rvcnlfc2NvcmUpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwTCwgZmlsbCA9ICIjYzQxZTNhIiwgY29sb3IgPSAid2hpdGUiKSArDQogIHN0YXRfYmluKGJpbnMgPSAyMEwsIGdlb209InRleHQiLCBhZXMobGFiZWw9Li5jb3VudC4uKSwgdmp1c3Q9LTAuNSkgKw0KICBnZ3RpdGxlKCJIaXN0b2dyYW1pIikgKw0KICB4bGFiKCJQaWtldCBlIG1hcnJhIG5lIHByb3ZpbWluIGUgaGlzdG9yaXNlIikgKw0KICB5bGFiKCJEZW5kdXJpYSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCk5nYSBoaXN0b2dyYW1pIG1lIHNpcGVyIHZlbWUgcmUgc2UgdmxlcmEgbWF4IGUgdGlqIDE4MyB0cmVnb24gbnIgZSBzdHVkZW50ZXZlIHFlIGthbmUgbWFyciA4NyBwaWsgbmUgcHJvdmltaW4gZSBoaXN0b3Jpc2UgbmRlcnNhIHZsZXJhIG1pbiBxZSBlc2h0ZSAxNCB0cmVnb24gbnIgZSBzdHVkZW50ZXZlIHFlIGthbmUgbWFyciA1MCBwaWsgbmUgcHJvdmltLg0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjE4IiwiYmxhY2siKWANCmBgYHtyfQ0KcDE1IDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gaGlzdG9yeV9zY29yZSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICIjZmZhNmM5IikgKw0KICBsYWJzKHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBoaXN0b3Jpc2UiLCB0aXRsZSA9ICJCb3hwbG90IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsDQogICAgZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuMTkiLCJibGFjayIpYA0KYGBge3J9DQpwMTYgPC0gZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gIiIsIHkgPSBoaXN0b3J5X3Njb3JlKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIiwgZmlsbCA9ICIjN2ZmZjAwIikgKw0KICBsYWJzKHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBoaXN0b3Jpc2UiLCB0aXRsZSA9ICJHcmFmaWt1IHZpb2xpbmUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4yMCIsImJsYWNrIilgDQpgYGB7cn0NCnAxNzwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gaGlzdG9yeV9zY29yZSkgKw0KICBnZW9tX2RlbnNpdHkoYWRqdXN0ID0gMUwsIGZpbGwgPSAiIzk5YmFkZCIpICsNCiAgbGFicygNCiAgICB4ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgaGlzdG9yaXNlIiwNCiAgICB5ID0gIkRlbnNpdGV0aSIsDQogICAgdGl0bGUgPSAiR3JhZmlrdSBpIGRlbnNpdGV0aXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsDQogICAgZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMkwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMkwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShwMTUsIHAxNiwgcDE3LCBucm93ID0gMikNCmBgYA0KTmdhIGJveHBsb3RpLGdyYWZpa3UgdmlvbGluZSBkaGUgZ3JhZmlrdSBkZW5zaXRldGl0IG5lIHZlbWUgcmUgc2UgdGUgZGhlbmF0IGphbmUgdGUgc2hwZXJuZGFyYSBycmV0aCB2bGVyYXZlIDcwLTkwIGdqZSBxZSB0cmVnb24gc2Uga2xhc2Ega2EgbmplIHBlcmZvcm1hbmNlIHRlIG1pcmUgbmUgbGVuZGVuIGUgaGlzdG9yaXNlLg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIk1lIHBvc2h0ZSBkbyB0ZSBuZGVydG9qbWUgdGlwZSB0ZSBuZHJ5c2htZSBncmFmaWtlc2ggcGVyIG5kcnlzaG9yZW4gcGh5c2ljc19zY29yZS4iLCJibGFjayIpYCoqDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjIxIiwiYmxhY2siKWANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gcGh5c2ljc19zY29yZSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjBMLCBmaWxsID0gIiNkZTMxNjMiLCBjb2xvciA9ICJ5ZWxsb3ciKSArDQogIHN0YXRfYmluKGJpbnMgPSAyMEwsIGdlb209InRleHQiLCBhZXMobGFiZWw9Li5jb3VudC4uKSwgdmp1c3Q9LTAuNSkgKw0KICBnZ3RpdGxlKCJIaXN0b2dyYW1pIikgKw0KICB4bGFiKCJQaWtldCBlIG1hcnJhIG5lIHByb3ZpbWluIGUgZml6aWtlcyIpICsNCiAgeWxhYigiRGVuZHVyaWEiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpgYGANCk5nYSBoaXN0b2dyYW1pIG1lIHNpcGVyIHZlbWUgcmUgc2UgdmxlcmEgbWF4IGUgdGlqIDE4NCB0cmVnb24gbnIgZSBzdHVkZW50ZXZlIHFlIGthbmUgbWFyciA5NSBwaWsgbmUgcHJvdmltaW4gZSBmaXppa2VzIG5kZXJzYSB2bGVyYSBtaW4gcWUgZXNodGUgMTAgdHJlZ29uIG5yIGUgc3R1ZGVudGV2ZSBxZSBrYW5lIG1hcnIgNTUgcGlrIG5lIHByb3ZpbS4NCg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4yMiIsImJsYWNrIilgDQpgYGB7cn0NCnAxOCA8LSBnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSAiIiwgeSA9IHBoeXNpY3Nfc2NvcmUpICsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiI2ZmYjdjNSIpICsNCiAgbGFicyh5ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgZml6aWtlcyIsIHRpdGxlID0gIkJveHBsb3QiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQoNCmBgYA0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjIzIiwiYmxhY2siKWANCmBgYHtyfQ0KcDE5IDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gcGh5c2ljc19zY29yZSkgKw0KICBnZW9tX3Zpb2xpbihhZGp1c3QgPSAxTCwgc2NhbGUgPSAiYXJlYSIsIGZpbGwgPSAiI2NkNWM1YyIpICsNCiAgbGFicyh5ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgZml6aWtlcyIsIHRpdGxlID0gIkdyYWZpa3UgdmlvbGluZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjI0IiwiYmxhY2siKWANCmBgYHtyfQ0KcDIwPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBwaHlzaWNzX3Njb3JlKSArDQogIGdlb21fZGVuc2l0eShhZGp1c3QgPSAxTCwgZmlsbCA9ICIjZDI2OTFlIikgKw0KICBsYWJzKA0KICAgIHggPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBmaXppa2VzIiwNCiAgICB5ID0gIkRlbnNpdGV0aSIsDQogICAgdGl0bGUgPSAiR3JhZmlrdSBpIGRlbnNpdGV0aXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsDQogICAgZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMkwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMkwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShncmlkRXh0cmEpDQpncmlkLmFycmFuZ2UocDE4LCBwMTksIHAyMCwgbnJvdyA9IDIpDQpgYGANCk5nYSBib3hwbG90aSxncmFmaWt1IHZpb2xpbmUgZGhlIGdyYWZpa3UgZGVuc2l0ZXRpdCBuZSB2ZW1lIHJlIHNlIHRlIGRoZW5hdCBqYW5lIHRlIHNocGVybmRhcmEgcnJldGggdmxlcmF2ZSA3MC05MCBnamUgcWUgdHJlZ29uIHNlIGtsYXNhIGthIG5qZSBwZXJmb3JtYW5jZSB0ZSBtaXJlIG5lIGxlbmRlbiBlIGZpemlrZXMuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiTWUgcG9zaHRlIGRvIHRlIG5kZXJ0b2ptZSB0aXBlIHRlIG5kcnlzaG1lIGdyYWZpa2VzaCBwZXIgbmRyeXNob3JlbiBjaGVtaXN0cnlfc2NvcmUuIiwiYmxhY2siKWAqKg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4yNSIsImJsYWNrIilgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGNoZW1pc3RyeV9zY29yZSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjBMLCBmaWxsID0gIiNmZmE3MDAiLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgc3RhdF9iaW4oYmlucyA9IDIwTCwgZ2VvbT0idGV4dCIsIGFlcyhsYWJlbD0uLmNvdW50Li4pLCB2anVzdD0tMC41KSArDQogIGdndGl0bGUoIkhpc3RvZ3JhbWkiKSArDQogIHhsYWIoIlBpa2V0IGUgbWFycmEgbmUgcHJvdmltaW4gZSBraW1pc2UiKSArDQogIHlsYWIoIkRlbmR1cmlhIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KTmdhIGhpc3RvZ3JhbWkgbWUgc2lwZXIgdmVtZSByZSBzZSB2bGVyYSBtYXggZSB0aWogMTg3IHRyZWdvbiBuciBlIHN0dWRlbnRldmUgcWUga2FuZSBtYXJyIDk1IHBpayBuZSBwcm92aW1pbiBlIGtpbWlzZSBuZGVyc2EgdmxlcmEgbWluIHFlIGVzaHRlIDggdHJlZ29uIG5yIGUgc3R1ZGVudGV2ZSBxZSBrYW5lIG1hcnIgNTUgcGlrIG5lIHByb3ZpbS4NCg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4yNiIsImJsYWNrIilgDQpgYGB7cn0NCnAyMSA8LSBnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSAiIiwgeSA9IGNoZW1pc3RyeV9zY29yZSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICIjOTg4MTdiIikgKw0KICBsYWJzKHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBraW1pc2UiLCB0aXRsZSA9ICJCb3hwbG90IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsDQogICAgZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuMjciLCJibGFjayIpYA0KYGBge3J9DQpwMjIgPC0gZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gIiIsIHkgPSBjaGVtaXN0cnlfc2NvcmUpICsNCiAgZ2VvbV92aW9saW4oYWRqdXN0ID0gMUwsIHNjYWxlID0gImFyZWEiLCBmaWxsID0gIiNlMzQyMzQiKSArDQogIGxhYnMoeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGtpbWlzZSIsIHRpdGxlID0gIkdyYWZpa3UgdmlvbGluZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjI4IiwiYmxhY2siKWANCmBgYHtyfQ0KcDIzPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBjaGVtaXN0cnlfc2NvcmUpICsNCiAgZ2VvbV9kZW5zaXR5KGFkanVzdCA9IDFMLCBmaWxsID0gIiNkMjY5MWUiKSArDQogIGxhYnMoDQogICAgeCA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGtpbWlzZSIsDQogICAgeSA9ICJEZW5zaXRldGkiLA0KICAgIHRpdGxlID0gIkdyYWZpa3UgaSBkZW5zaXRldGl0Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHAyMSwgcDIyLCBwMjMsIG5yb3cgPSAyKQ0KYGBgDQpOZ2EgYm94cGxvdGksZ3JhZmlrdSB2aW9saW5lIGRoZSBncmFmaWt1IGRlbnNpdGV0aXQgbmUgdmVtZSByZSBzZSB0ZSBkaGVuYXQgamFuZSB0ZSBzaHBlcm5kYXJhIHJyZXRoIHZsZXJhdmUgNzAtOTAgZ2plIHFlIHRyZWdvbiBzZSBrbGFzYSBrYSBuamUgcGVyZm9ybWFuY2UgdGUgbWlyZSBuZSBsZW5kZW4gZSBraW1pc2UuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiTWUgcG9zaHRlIGRvIHRlIG5kZXJ0b2ptZSB0aXBlIHRlIG5kcnlzaG1lIGdyYWZpa2VzaCBwZXIgbmRyeXNob3JlbiBiaW9sb2d5X3Njb3JlLiIsImJsYWNrIilgKioNCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuMjkiLCJibGFjayIpYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBiaW9sb2d5X3Njb3JlKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAyMEwsIGZpbGwgPSAiI2U0ZDAwYSIsIGNvbG9yID0gIndoaXRlIikgKw0KICBzdGF0X2JpbihiaW5zID0gMjBMLCBnZW9tPSJ0ZXh0IiwgYWVzKGxhYmVsPS4uY291bnQuLiksIHZqdXN0PS0wLjUpICsNCiAgZ2d0aXRsZSgiSGlzdG9ncmFtaSIpICsNCiAgeGxhYigiUGlrZXQgZSBtYXJyYSBuZSBwcm92aW1pbiBlIGJpb2xvZ2ppc2UiKSArDQogIHlsYWIoIkRlbmR1cmlhIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KTmdhIGhpc3RvZ3JhbWkgbWUgc2lwZXIgdmVtZSByZSBzZSB2bGVyYSBtYXggZSB0aWogMjA4IHRyZWdvbiBuciBlIHN0dWRlbnRldmUgcWUga2FuZSBtYXJyIDkwIHBpayBuZSBwcm92aW1pbiBlIGJpb2xvZ2ppc2UgbmRlcnNhIHZsZXJhIG1pbiBxZSBlc2h0ZSAyIHRyZWdvbiBuciBlIHN0dWRlbnRldmUgcWUga2FuZSBtYXJyIDQwIHBpayBuZSBwcm92aW0uDQoNCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuMzAiLCJibGFjayIpYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpwMjQgPC0gZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gIiIsIHkgPSBiaW9sb2d5X3Njb3JlKSsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiI2ZiY2NlNyIpICsNCiAgbGFicyh5ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgYmlvbG9namlzZSIsIHRpdGxlID0gIkJveHBsb3QiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQoNCmBgYA0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjMxIiwiYmxhY2siKWANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KcDI1IDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gYmlvbG9neV9zY29yZSkgKw0KICBnZW9tX3Zpb2xpbihhZGp1c3QgPSAxTCwgc2NhbGUgPSAiYXJlYSIsIGZpbGwgPSAiIzAwNDdhYiIpICsNCiAgbGFicyh5ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgYmlvbG9namlzZSIsIHRpdGxlID0gIkdyYWZpa3UgdmlvbGluZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjMyIiwiYmxhY2siKWANCmBgYHtyfQ0KcDI2PC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBiaW9sb2d5X3Njb3JlKSArDQogIGdlb21fZGVuc2l0eShhZGp1c3QgPSAxTCwgZmlsbCA9ICIjZDI2OTFlIikgKw0KICBsYWJzKA0KICAgIHggPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBiaW9sb2dqaXNlIiwNCiAgICB5ID0gIkRlbnNpdGV0aSIsDQogICAgdGl0bGUgPSAiR3JhZmlrdSBpIGRlbnNpdGV0aXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsDQogICAgZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMkwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMkwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHAyNCwgcDI1LCBwMjYsIG5yb3cgPSAyKQ0KYGBgDQpOZ2EgYm94cGxvdGksZ3JhZmlrdSB2aW9saW5lIGRoZSBncmFmaWt1IGRlbnNpdGV0aXQgbmUgdmVtZSByZSBzZSB0ZSBkaGVuYXQgamFuZSB0ZSBzaHBlcm5kYXJhIHJyZXRoIHZsZXJhdmUgNjUtODUgZ2plIHFlIHRyZWdvbiBzZSBrbGFzYSBrYSBuamUgcGVyZm9ybWFuY2UgdGUgbWlyZSBuZSBsZW5kZW4gZSBiaW9sb2dqaXNlLg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIk1lIHBvc2h0ZSBkbyB0ZSBuZGVydG9qbWUgdGlwZSB0ZSBuZHJ5c2htZSBncmFmaWtlc2ggcGVyIG5kcnlzaG9yZW4gZW5nbGlzaF9zY29yZS4iLCJibGFjayIpYCoqDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjMzIiwiYmxhY2siKWANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gZW5nbGlzaF9zY29yZSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjBMLCBmaWxsID0gIiM2ZjRlMzciLCBjb2xvciA9ICJyZWQiKSArDQogIHN0YXRfYmluKGJpbnMgPSAyMEwsIGdlb209InRleHQiLCBhZXMobGFiZWw9Li5jb3VudC4uKSwgdmp1c3Q9LTAuNSkgKw0KICBnZ3RpdGxlKCJIaXN0b2dyYW1pIikgKw0KICB4bGFiKCJQaWtldCBlIG1hcnJhIG5lIHByb3ZpbWluIGUgYW5nbGlzaHRlcyIpICsNCiAgeWxhYigiRGVuZHVyaWEiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQpOZ2EgaGlzdG9ncmFtaSBtZSBzaXBlciB2ZW1lIHJlIHNlIHZsZXJhIG1heCBlIHRpaiAxOTkgdHJlZ29uIG5yIGUgc3R1ZGVudGV2ZSBxZSBrYW5lIG1hcnIgOTUgcGlrIG5lIHByb3ZpbWluIGUgYW5nbGlzaHRlcyBuZGVyc2EgdmxlcmEgbWluIHFlIGVzaHRlIDggdHJlZ29uIG5yIGUgc3R1ZGVudGV2ZSBxZSBrYW5lIG1hcnIgNDUtNTAgcGlrIG5lIHByb3ZpbS4NCg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4zNCIsImJsYWNrIilgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCnAyNyA8LSBnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSAiIiwgeSA9IGVuZ2xpc2hfc2NvcmUpKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICIjOWJkZGZmIikgKw0KICBsYWJzKHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBhbmdsaXNodGVzIiwgdGl0bGUgPSAiQm94cGxvdCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjM1IiwiYmxhY2siKWANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KcDI4IDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gZW5nbGlzaF9zY29yZSkgKw0KICBnZW9tX3Zpb2xpbihhZGp1c3QgPSAxTCwgc2NhbGUgPSAiYXJlYSIsIGZpbGwgPSAiIzAwMmU2MyIpICsNCiAgbGFicyh5ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgYW5nbGlzaHRlcyIsIHRpdGxlID0gIkdyYWZpa3UgdmlvbGluZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjM2IiwiYmxhY2siKWANCmBgYHtyfQ0KcDI5PC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBlbmdsaXNoX3Njb3JlKSArDQogIGdlb21fZGVuc2l0eShhZGp1c3QgPSAxTCwgZmlsbCA9ICIjOGM5MmFjIikgKw0KICBsYWJzKA0KICAgIHggPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBhbmdsaXNodGVzIiwNCiAgICB5ID0gIkRlbnNpdGV0aSIsDQogICAgdGl0bGUgPSAiR3JhZmlrdSBpIGRlbnNpdGV0aXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsDQogICAgZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMkwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMkwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShncmlkRXh0cmEpDQpncmlkLmFycmFuZ2UocDI3LCBwMjgsIHAyOSwgbnJvdyA9IDIpDQpgYGANCk5nYSBib3hwbG90aSxncmFmaWt1IHZpb2xpbmUgZGhlIGdyYWZpa3UgZGVuc2l0ZXRpdCBuZSB2ZW1lIHJlIHNlIHRlIGRoZW5hdCBqYW5lIHRlIHNocGVybmRhcmEgcnJldGggdmxlcmF2ZSA3Mi05MiBnamUgcWUgdHJlZ29uIHNlIGtsYXNhIGthIG5qZSBwZXJmb3JtYW5jZSB0ZSBtaXJlIG5lIGxlbmRlbiBlIGFuZ2xpc2h0ZXMuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiTWUgcG9zaHRlIGRvIHRlIG5kZXJ0b2ptZSB0aXBlIHRlIG5kcnlzaG1lIGdyYWZpa2VzaCBwZXIgbmRyeXNob3JlbiBnZW9ncmFwaHlfc2NvcmUuIiwiYmxhY2siKWAqKg0KYHIgY29sb3Jpc2UoIkdSQUZJS1UgMS4zNyIsImJsYWNrIilgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGdlb2dyYXBoeV9zY29yZSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjBMLCBmaWxsID0gIiNiODczMzMiLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgc3RhdF9iaW4oYmlucyA9IDIwTCwgZ2VvbT0idGV4dCIsIGFlcyhsYWJlbD0uLmNvdW50Li4pLCB2anVzdD0tMC41KSArDQogIGdndGl0bGUoIkhpc3RvZ3JhbWkiKSArDQogIHhsYWIoIlBpa2V0IGUgbWFycmEgbmUgcHJvdmltaW4gZSBnamVvZ3JhZmlzZSIpICsNCiAgeWxhYigiRGVuZHVyaWEiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQpOZ2EgaGlzdG9ncmFtaSBtZSBzaXBlciB2ZW1lIHJlIHNlIHZsZXJhIG1heCBlIHRpaiAxNjYgdHJlZ29uIG5yIGUgc3R1ZGVudGV2ZSBxZSBrYW5lIG1hcnIgODAgcGlrIG5lIHByb3ZpbWluIGUgZ2plb2dyYWZpc2UgbmRlcnNhIHZsZXJhIG1pbiBxZSBlc2h0ZSA4NSB0cmVnb24gbnIgZSBzdHVkZW50ZXZlIHFlIGthbmUgbWFyciA2NSBwaWsgbmUgcHJvdmltLg0KDQpgciBjb2xvcmlzZSgiR1JBRklLVSAxLjM4IiwiYmxhY2siKWANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KcDMwIDwtIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gZ2VvZ3JhcGh5X3Njb3JlKSsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiIzk5NjY2NiIpICsNCiAgbGFicyh5ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgZ2plb2dyYWZpc2UiLCB0aXRsZSA9ICJCb3hwbG90IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsDQogICAgZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuMzkiLCJibGFjayIpYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpwMzEgPC0gZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gIiIsIHkgPSBnZW9ncmFwaHlfc2NvcmUpICsNCiAgZ2VvbV92aW9saW4oYWRqdXN0ID0gMUwsIHNjYWxlID0gImFyZWEiLCBmaWxsID0gIiNmZjM4MDAiKSArDQogIGxhYnMoeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGdqZW9ncmFmaXNlIiwgdGl0bGUgPSAiR3JhZmlrdSB2aW9saW5lIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsDQogICAgZmFjZSA9ICJib2xkIiwNCiAgICBoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmByIGNvbG9yaXNlKCJHUkFGSUtVIDEuNDAiLCJibGFjayIpYA0KYGBge3J9DQpwMzI8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGdlb2dyYXBoeV9zY29yZSkgKw0KICBnZW9tX2RlbnNpdHkoYWRqdXN0ID0gMUwsIGZpbGwgPSAiI2ZmN2Y1MCIpICsNCiAgbGFicygNCiAgICB4ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgZ2plb2dyYWZpc2UiLA0KICAgIHkgPSAiRGVuc2l0ZXRpIiwNCiAgICB0aXRsZSA9ICJHcmFmaWt1IGkgZGVuc2l0ZXRpdCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQoNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHAzMCwgcDMxLCBwMzIsIG5yb3cgPSAyKQ0KYGBgDQpOZ2EgYm94cGxvdGksZ3JhZmlrdSB2aW9saW5lIGRoZSBncmFmaWt1IGRlbnNpdGV0aXQgbmUgdmVtZSByZSBzZSB0ZSBkaGVuYXQgamFuZSB0ZSBzaHBlcm5kYXJhIHJyZXRoIHZsZXJhdmUgNzItOTIgZ2plIHFlIHRyZWdvbiBzZSBrbGFzYSBrYSBuamUgcGVyZm9ybWFuY2UgdGUgbWlyZSBuZSBsZW5kZW4gZSBnamVvZ3JhZmlzZS4NCg0KDQojIyMgKipgciBjb2xvcmlzZSgiR3JhZmlrZSBkaGUgdGFiZWxhIHN0YXRpc3Rpa29yZSBwZXIgMiBuZHJ5c2hvcmUgcGVyIGdlbmRlciIsIiNmZTZmNWUiKWAqKg0KIyMjIyAqKmByIGNvbG9yaXNlKCJNZSBwb3NodGUgZG8gdGUgbmRlcnRvam1lIHRpcGUgdGUgbmRyeXNobWUgZ3JhZmlrZXNoIHBlciBuZHJ5c2hvcmVuIGdlbmRlciBuZSByYXBvcnQgbWUgbmRyeXNob3JldCBlIHRqZXJhLiIsImJsYWNrIilgKioNCiMjIyMgKipgciBjb2xvcmlzZSgiR2VuZGVyIG5lIHJhcG9ydCBtZSBwYXJ0X3RpbWVfam9iIiwiYmx1ZSIpYCoqDQoNCmBgYHtyfQ0KIGdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IHBhcnRfdGltZV9qb2IsIGZpbGwgPSBnZW5kZXIpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX2ZpbGxfaHVlKGRpcmVjdGlvbiA9IDAsIGggPSBjKDAsIDkwKSkgKyAgDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQpOZ2EgZ3JhZmlrdSBtZSBzaXBlciB2ZW1lIHJlIHNlIHBlciB2bGVyZW4gRmFsc2UgbnIgaSBtZXNoa3VqdmUgdGUgcGFwdW5zdWFyIGVzaHRlIG1lIGkgbWFkaCBzZSBhaSBpIGZlbXJldmUgLG5kZXJzYSBwZXIgdmxlcmVuIHRydWUgbnIgZmVtcmF2ZSB0ZSBwdW5lc3VhcmEgZXNodGUgbWUgaSBtYWRoIHNlIGFpIGkgbWVzaGt1anZlLg0KDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiR2VuZGVyIG5lIHJhcG9ydCBtZSBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcyIsImJsdWUiKWAqKg0KYGBge3J9DQogZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMsIGZpbGwgPSBnZW5kZXIpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX2ZpbGxfaHVlKGRpcmVjdGlvbiA9IDAsIGggPSBjKDU3LCAyMzQpKSArICANCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCk5nYSBncmFmaWt1IG1lIHNpcGVyIHZlLGUgcmUgc2UgcGVyIHZsZXJlbiBmYWxzZSBzaSBuciBmZW1yYXZlIGRoZSBhaSBpIG1lc2hrdWp2ZSBxZSBtZXJyZW4gbWUgYWt0aXZpdGV0ZSBlc2h0ZSBpIG5qZWp0ZSBuZGVyc2EgcGVyIHZsZXJlbiB0cnVlIG5yIGZlbXJhdmUgZXNodGUgcGFrIG1lIGkgbWFkaCBzZSBzYSBhaSBpIG1lc2hrdWp2ZS4NCg0KIyMjIyAqKmByIGNvbG9yaXNlKCJHZW5kZXIgbmUgcmFwb3J0IG1lIGNhcmVlcl9hc3BpcmF0aW9uIiwiYmx1ZSIpYCoqDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGNhcmVlcl9hc3BpcmF0aW9uLCBmaWxsID0gZ2VuZGVyKSArDQogIGdlb21fYmFyKCkgKw0KICBzY2FsZV9maWxsX2h1ZShkaXJlY3Rpb24gPSAxKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX2ZpbGxfaHVlKGRpcmVjdGlvbiA9IDAsIGggPSBjKDQsIDMyKSkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KTmdhIGdyYWZpa3UgbWUgc2lwZXIgdmVtZSByZSBzYSBrYSBwcm9mZXNpb25lIHRlIGZyZWt1ZW50dWFyYSB2ZXRlbSBuZ2EgZmVtcmF0IHNpYyBlc2h0ZSB0ZWFjaGVyIHBvciBrYSBkaGUgcHJvZmVzaW9uZSBxZSBqYW5lIHRlIGZyZWt1ZW50dWFyYSBwb3RodWFqc2UgbmUgbWVueXJlIHRlIGJhcmFiYXJ0ZSBzaSBuZ2EgZmVtcmF0IGRoZSBtZXNoa3VqdCwgcG9yIGthIGRoZSBwcm9mZXNpb25lIHFlIGphbmUgbWUgc2h1bWUgdGUgZnJla3VlbnR1YXIgbWUgc2Ugc2h1bXRpIG5nYSBtZXNoa3VqdC4NCg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIkdlbmRlciBuZSByYXBvcnQgbWUgbWF0aF9zY29yZSIsImJsdWUiKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBnZW5kZXIsIHkgPW1hdGhfc2NvcmUgLCBjb2xvciA9IGdlbmRlcikgKyANCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDEuMSkgKw0KICBsYWJzKHggPSAiR2ppbmlhIiwgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIG1hdGVtYXRpa2VzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0TCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNEwsIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KTmdhIDQwLTYwIHNoaWtvam1lIHFlIHBpa2F0IGphbmUgdGUgc2hwZXJuZGFyYSBnamUgcWUgcGFrIHN0dWRlbnQgamFuZSB2bGVyc3VhciBtZSBrZXRvIHBpay5Qb3IgbmUgc2hvZmltIHFlIHBqc2EgbWUgZSBtYWRoZSBlc2h0ZSBlIHBlcnFlbmRydWFyIHJyZXRoIHZsZXJhdmUgODAtMTAwIGdqZSBxZSBkbyB0ZSB0aG90ZSBzZSBwamVzYSBtZSBlIG1hZGhlIGUgdHlyZSBqYW5lIHZsZXJzdWFyIG1pZGlzIGtldHlyZSBrdWZpanZlLg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIkdlbmRlciBuZSByYXBvcnQgbWUgcGh5c2ljc19zY29yZSIsImJsdWUiKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMsIGFlcyh4ID1nZW5kZXIgLCB5ID0gY2FyZWVyX2FzcGlyYXRpb24sIGZpbGwgPSBwaHlzaWNzX3Njb3JlKSkgKw0KICBnZW9tX3RpbGUoKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh4ID0gIkdqaW5pYSIsIHkgPSAiQXNwaXJhdGEgZSBLYXJyaWVyw6tzIiwgZmlsbCA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGZpemlrZXMiKQ0KYGBgDQpOZ2EgZ3JhZmlrdSBtZSBzaXBlciBuZSBzaG9maW0gc2UgbWVzaGt1anQgamFuZSB2bGVyc3VhciBtZSBtaXJlIG5lIHByb3ZpbWluIGUgZml6aWtlcyBzZSBzYSBmZW1yYXQuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiR2VuZGVyIG5lIHJhcG9ydCBtZSBlbmdsaXNoX3Njb3JlIiwiYmx1ZSIpYCoqDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcywgYWVzKHggPWdlbmRlciAsIHkgPSBjYXJlZXJfYXNwaXJhdGlvbiwgZmlsbCA9IGVuZ2xpc2hfc2NvcmUpKSArDQogIGdlb21fdGlsZSgpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiYmxhY2siLCBoaWdoID0gInJlZCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh4ID0gIkdqaW5pYSIsIHkgPSAiQXNwaXJhdGEgZSBLYXJyaWVyw6tzIiwgZmlsbCA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGFuZ2xpc2h0ZXMiKQ0KYGBgDQpOZ2EgZ3JhZmlrdSBtZSBzaXBlciBuZSBudWsgdmVtZSByZSBuZG9uamUgZGlmZXJlbmNlIHRlIG1hZGhlIG1pZGlzIHBpa2V2ZSBxZSBrYW5lIG1hcnIgdGUgZHlqYSBnamluaXQuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiR2VuZGVyIG5lIHJhcG9ydCBtZSBiaW9sb2d5X3Njb3JlIiwiYmx1ZSIpYCoqDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcywgYWVzKHggPWdlbmRlciAsIHkgPSBjYXJlZXJfYXNwaXJhdGlvbiwgZmlsbCA9IGJpb2xvZ3lfc2NvcmUpKSArDQogIGdlb21fdGlsZSgpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAieWVsbG93IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHggPSAiR2ppbmlhIiwgeSA9ICJBc3BpcmF0YSBlIEthcnJpZXLDq3MiLCBmaWxsID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgYmlvbG9namlzZSIpDQpgYGANCk5nYSBncmFmaWt1IHNob2hpbSBzZSBmZW1yYXQga2FuZSBkYWwgcGFrIG1lIG1pcmUgbmUgcHJvdmltaW4gZSBiaW9sb2dqaXNlIHNlIHNhIG1lc2hrdWp0Lg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIkdlbmRlciBuZSByYXBvcnQgbWUgY2hlbWlzdHJ5X3Njb3JlIiwiYmx1ZSIpYCoqDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGdlbmRlciwgeSA9Y2hlbWlzdHJ5X3Njb3JlICwgY29sb3IgPSBnZW5kZXIpICsgDQogIGdlb21faml0dGVyKHNpemUgPSAxLjEpICsNCiAgbGFicyh4ID0gIkdqaW5pYSIsIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBraW1pc2UiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0TCwgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQpHcmFmaWt1IG1lIHBpa2EgdGUga3VxZSAoZmVtcmF0KSBkaGUgYWkgYmx1IChtZXNoa3VqdCkgZHVrZXQgc2Uga2Fuw6sgbmrDqyBzaHDDq3JuZGFyamUgdMOrIG5namFzaG1lIGhvcml6b250YWxlIHDDq3JnamF0w6sgYm9zaHRpdCBYLCBxw6sgdHJlZ29uIHBpa8OrdCBuw6sgcHJvdmltaW4gZSBraW1pc8OrLiBLam8gc3VnamVyb24gc2UgbnVrIGthIG5kb25qw6sgZGFsbGltIHTDqyBtYWRoIG7DqyBwaWvDq3QgZSBtYXJyYSBuZ2EgbWVzaGt1anQgZGhlIGZlbXJhdCBuw6sga8OrdMOrIHByb3ZpbS4NCg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIkdlbmRlciBuZSByYXBvcnQgbWUgaGlzdG9yeV9zY29yZSIsImJsdWUiKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHkgPSBoaXN0b3J5X3Njb3JlLCB4ID0gZ2VuZGVyLCBmaWxsID0gZ2VuZGVyKSArIA0KICBnZW9tX3Zpb2xpbihhZGp1c3QgPSAxTCwgc2NhbGUgPSAiYXJlYSIpICsNCiAgbGFicyh4ID0gIkdqaW5pYSIsIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBoaXN0b3Jpc2UiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0TCwgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQogTmdhIGdyYWZpa3Ugc2hvaGltIHNlIHTDqyBkeWphIGdqaW5pdMOrIGthbsOrIG5qw6sgc2hww6tybmRhcmplIHTDqyBuZ2phc2htZSB0w6sgcGlrw6t2ZSwgcG9yIG1lIG5kcnlzaGltZSBuw6sgcMOrcmhhcGplIGRoZSB0ZW5kZW5jw6sgcWVuZHJvcmUuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiR2VuZGVyIG5lIHJhcG9ydCBtZSBnZW9ncmFwaHlfc2NvcmUiLCJibHVlIilgKioNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gZ2VvZ3JhcGh5X3Njb3JlLCBmaWxsID0gZ2VuZGVyKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzNUwsIGNvbG91ciA9ICJicm93biIpICsNCiAgbGFicyh4ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgZ2plb2dyYWZpa2UiLCB5ID0gIkdqaW5pYSIpICsNCiAgc2NhbGVfY29sb3JfaHVlKGRpcmVjdGlvbiA9IDEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNEwsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLCBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANClTDqyBkeWphIGdqaW5pdMOrIGthbsOrIHRyZWd1YXIgcGVyZm9ybWFuY8OrIHTDqyBuZHJ5c2htZSwgcGEgbmrDqyBtb2RlbCBvc2UgdGVuZGVuY8OrIHTDqyBxYXJ0w6sgccOrIHRyZWdvbiBuasOrIGdqaW5pIHTDqyB2ZcOnYW50w6sgccOrIHBlcmZvcm1vbiBtw6sgbWlyw6suDQoNCiMjIyAqKmByIGNvbG9yaXNlKCJHcmFmaWtlIGRoZSB0YWJlbGEgc3RhdGlzdGlrb3JlIHBlciAyIG5kcnlzaG9yZSBwZXIgcGFydF90aW1lX2pvYiIsIiNlMWE5NWYiKWAqKg0KIyMjIyAqKmByIGNvbG9yaXNlKCJNZSBwb3NodGUgZG8gdGUgbmRlcnRvam1lIHRpcGUgdGUgbmRyeXNobWUgZ3JhZmlrZXNoIHBlciBuZHJ5c2hvcmVuIHBhcnRfdGltZV9qb2IgbmUgcmFwb3J0IG1lIG5kcnlzaG9yZXQgZSB0amVyYSIsImJsYWNrIilgKioNCiMjIyMgKipgciBjb2xvcmlzZSgiUGFydF90aW1lX2pvYiBuZSByYXBvcnQgbWUgYWJzZW5jZV9kYXlzIiwiZ3JlZW4iKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBwYXJ0X3RpbWVfam9iLCB5ID0gYWJzZW5jZV9kYXlzLCBjb2xvciA9IHBhcnRfdGltZV9qb2IpICsNCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDEuMSkgKw0KICBsYWJzKHggPSAiUHVuZXNpbSBwYXJ0LXRpbWUiLCB5ID0gIkRpdGV0IGUgbXVuZ2VzYXZlIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0TCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNEwsIGZhY2UgPSAiYm9sZCIpDQogICkgKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpDQoNCmBgYA0KTmUgc2hvZmltIHNlIG5nYSAwLjUtMyBuZSBzaG9oaW0gc2UgdGUgZGhlbmF0IHRvbmEgamFuZSBtZSB0ZSBwZXJxZW5kcnVhcmEgcGVyIHZsZXJlbiBmYWxzZSwgZGhlIG5nYSAzLTcuNSB2aWpuZSBkdWtlIHUgcmVkdWt0dWFyLk5kZXJzYSBwZXIgdmxlcmVuIHRydWUgdGUgZGhlbmF0IGphbmUgdGUgc2hwZXJuZGFyYSBnaml0aGFuZGVqLg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIlBhcnRfdGltZV9qb2IgbmUgcmFwb3J0IG1lIGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzIiwiZ3JlZW4iKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBwYXJ0X3RpbWVfam9iLCB5ID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMpICsNCiAgZ2VvbV90aWxlKGFlcyhmaWxsID0gaW50ZXJhY3Rpb24ocGFydF90aW1lX2pvYiwgZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMpKSwgd2lkdGggPSAxLCBoZWlnaHQgPSAxKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMiIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyhmaWxsID0gIk5kZXJ0aHVyamUgZSBuZHJ5c2hvcmV2ZSIsIHggPSAiUHVuZXNpbWkgcGFydC10aW1lIiwgeSA9ICJBa3Rpdml0ZXRlIGphc2h0w6tzaGtvbGxvcmUiKQ0KYGBgDQojIyMjICoqYHIgY29sb3Jpc2UoIlBhcnRfdGltZV9qb2IgbmUgcmFwb3J0IG1lIHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzIiwiZ3JlZW4iKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBwYXJ0X3RpbWVfam9iLCB5ID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMpICsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiIzk2YzhhMiIsY29sb3I9InB1cnBsZSIpICsNCiAgbGFicygNCiAgICB4ID0gIlB1bmVzaW1pIHBhcnQtdGltZSIsDQogICAgeSA9ICJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KU3R1ZGVudMOrdCBxw6sgbnVrIGphbsOrIHTDqyBwdW7Dq3N1YXIgcGFydC10aW1lIChGYWxzZSkga2Fuw6sgbmrDqyBzaHDDq3JuZGFyamUgbcOrIHTDqyBnamVyw6sgdMOrIG9yw6t2ZSB0w6sgc3R1ZGltaXQsIHHDqyB2YXJpb2puw6sgbmdhIDMwIGRlcmkgbsOrIDUwIG9yw6suIE5kw6tyc2EsIHN0dWRlbnTDq3QgccOrIGphbsOrIHTDqyBwdW7Dq3N1YXIgcGFydC10aW1lIChUcnVlKSBrYW7DqyBuasOrIHNocMOrcm5kYXJqZSBtw6sgdMOrIG5ndXNodMOrIHTDqyBvcsOrdmUgdMOrIHN0dWRpbWl0Lg0KS2pvIG11bmQgdMOrIHN1Z2plcm9qw6sgc2UgcHVuw6tzaW1pIHBhcnQtdGltZSBtdW5kIHTDqyBrZXTDqyBuasOrIG5kaWtpbSB0w6sgY2FrdHVhciBuw6sgc2FzaW7DqyBlIGtvaMOrcyBxw6sgc3R1ZGVudMOrdCBtdW5kIHTDqyBkZWRpa29qbsOrIHDDq3Igc3R1ZGltLg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIlBhcnRfdGltZV9qb2IgbmUgcmFwb3J0IG1lIG1hdGhfc2NvcmUiLCJncmVlbiIpYCoqDQpgYGB7cn0NCmUxPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBwYXJ0X3RpbWVfam9iLCB5ID0gbWF0aF9zY29yZSkgKw0KICBnZW9tX3Zpb2xpbihhZGp1c3QgPSAxTCwgc2NhbGUgPSAiYXJlYSIsIGZpbGwgPSAiI0Q1RUQ5RCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCiMjIyMgKipgciBjb2xvcmlzZSgiUGFydF90aW1lX2pvYiBuZSByYXBvcnQgbWUgcGh5c2ljc19zY29yZSIsImdyZWVuIilgKioNCmBgYHtyfQ0KZTI8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IHBhcnRfdGltZV9qb2IsIHkgPSBwaHlzaWNzX3Njb3JlKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIiwgZmlsbCA9ICIjYzE5YTZiIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KIyMjIyAqKmByIGNvbG9yaXNlKCJQYXJ0X3RpbWVfam9iIG5lIHJhcG9ydCBtZSBjaGVtaXN0cnlfc2NvcmUiLCJncmVlbiIpYCoqDQpgYGB7cn0NCmUzPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBwYXJ0X3RpbWVfam9iLCB5ID0gY2hlbWlzdHJ5X3Njb3JlKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIiwgZmlsbCA9ICIjODAxODE4IikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KIyMjIyAqKmByIGNvbG9yaXNlKCJQYXJ0X3RpbWVfam9iIG5lIHJhcG9ydCBtZSBiaW9sb2d5X3Njb3JlIiwiZ3JlZW4iKWAqKg0KYGBge3J9DQplNDwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gcGFydF90aW1lX2pvYiwgeSA9IGJpb2xvZ3lfc2NvcmUpICsNCiAgZ2VvbV92aW9saW4oYWRqdXN0ID0gMUwsIHNjYWxlID0gImFyZWEiLCBmaWxsID0gIiNmZjAwZmYiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiUGFydF90aW1lX2pvYiBuZSByYXBvcnQgbWUgaGlzdG9yeV9zY29yZSIsImdyZWVuIilgKioNCmBgYHtyfQ0KZTU8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IHBhcnRfdGltZV9qb2IsIHkgPSBoaXN0b3J5X3Njb3JlKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIiwgZmlsbCA9ICIjZjQwMGExIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KIyMjIyAqKmByIGNvbG9yaXNlKCJQYXJ0X3RpbWVfam9iIG5lIHJhcG9ydCBtZSBnZW9ncmFwaHlfc2NvcmUiLCJncmVlbiIpYCoqDQpgYGB7cn0NCmU2PC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBwYXJ0X3RpbWVfam9iLCB5ID0gZ2VvZ3JhcGh5X3Njb3JlKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIiwgZmlsbCA9ICIjNGQ1ZDUzIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KIyMjIyAqKmByIGNvbG9yaXNlKCJQYXJ0X3RpbWVfam9iIG5lIHJhcG9ydCBtZSBlbmdsaXNoX3Njb3JlIiwiZ3JlZW4iKWAqKg0KYGBge3J9DQplNzwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gcGFydF90aW1lX2pvYiwgeSA9IGVuZ2xpc2hfc2NvcmUpICsNCiAgZ2VvbV92aW9saW4oYWRqdXN0ID0gMUwsIHNjYWxlID0gImFyZWEiLCBmaWxsID0gIiNmZjI4MDAiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShncmlkRXh0cmEpDQpncmlkLmFycmFuZ2UoZTEsIGUyLCBlMywgZTQsIGU1LCBlNiwgZTcsIG5yb3cgPSAyKQ0KYGBgDQojIyMgKipgciBjb2xvcmlzZSgiR3JhZmlrZSBwZXIgMiBuZHJ5c2hvcmUgcGVyIGFic2VuY2VfZGF5cyIsIiM1NTU1NTUiKWAqKg0KIyMjIyAqKmByIGNvbG9yaXNlKCJNZSBwb3NodGUgZG8gdGUgbmRlcnRvam1lIHRpcGUgdGUgbmRyeXNobWUgZ3JhZmlrZXNoIHBlciBuZHJ5c2hvcmVuIGFic2VuY2VfZGF5cyBuZSByYXBvcnQgbWUgbmRyeXNob3JldCBlIHRqZXJhLiIsImJsYWNrIilgKioNCiMjIyMgKipgciBjb2xvcmlzZSgiQWJzZW5jZV9kYXlzIG5lIHJhcG9ydCBtZSBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGVzIiwiYnJvd24iKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMsIHkgPSBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcywgY29sb3IgPSBhYnNlbmNlX2RheXMpICsNCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDEuMikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiQWt0aXZpdGV0ZXQgamFzaHRlc2hrb2xsb3JlIg0KICApICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNEwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKSANCmBgYA0KTmdhIGdyYWZpa3Ugc2hvaGltIHNlIGthIG5qw6sgdGVuZGVuY8OrIHHDqyBueMOrbsOrc2l0IHHDqyBtYXJyaW4gcGplc8OrIG7DqyBha3Rpdml0ZXRlIGphc2h0w6tzaGtvbGxvcsOrIGthbsOrIG3DqyBwYWsgZGl0w6sgbXVuZ2VzYSBrcmFoYXN1YXIgbWUgYXRhIHHDqyBudWsgbWFycmluIHBqZXPDqyBlIGNpbGEgdmFyZXQgZGhlIG5nYSBwdW5zaW1pIGkga2V0eXJlIHN0dWRlbnRldmUgcGFydCB0aW1lLg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIkRpc2EgbGxvamUgZ3JhZmlrZXNoIHFlIHBhcmFxZXNpbiBtYXJyZWRoZW5pZW4gbWVzIGFic2VuY2VfZGF5cyBkaGUgd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMiLCJicm93biIpYCoqDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGFic2VuY2VfZGF5cywgeSA9IHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzLCBmaWxsID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMpICsNCiAgZ2VvbV90aWxlKCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmVlbiIsIGhpZ2ggPSAieWVsbG93IikNCmBgYA0KLSBTdHVkZW50w6t0IHHDqyBtdW5nb2puw6sgbcOrIHBhayBkaXTDqyBrYW7DqyB0ZW5kZW5jw6sgdMOrIHN0dWRpb2puw6sgbcOrIHNodW3DqyBvcsOrIG7DqyBtw6tueXLDqyB2ZXRqYWtlIGdqYXTDqyBqYXbDq3MuDQotIE5kw6tyc2Egc2h0b2hldCBudW1yaSBpIGRpdMOrdmUgdMOrIG11bmdlc8OrcywgbnVtcmkgaSBvcsOrdmUgdMOrIHN0dWRpbWl0IHZldGphayBkdWtldCBzZSB1bMOrdC4NCg0KDQpgYGB7cn0NCmYxPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMsIHkgPSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgY29sb3VyID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMpICsNCiAgZ2VvbV9saW5lKCkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCmYyPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMsIHkgPSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgY29sb3VyID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMpICsNCiAgZ2VvbV9zdGVwKCkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKGYxLGYyLCBucm93ID0gMikNCmBgYA0KIyMjIyAqKmByIGNvbG9yaXNlKCJEaXNhIGxsb2plIGdyYWZpa2VzaCBxZSBwYXJhcWVzaW4gbWFycmVkaGVuaWVuIG1lcyBhYnNlbmNlX2RheXMgZGhlIG1hdGhfc2NvcmUiLCJicm93biIpYCoqDQoNCk5nYSB0ZSBnaml0aGUgZ3JhZmlrZXQgbWUgcG9zaHRlIG5lIGxpZGhqZSBtZSBkaXRldCBlIG11bmdlc2F2ZSBkaGUgcGlrZXQgZSBwcm92aW1ldmUgbmUgdmVtZSByZSBzZSBudWsga2EgbmplIGxpZGhqZSBtaWRpcyB0eXJlLg0KDQoNCmBgYHtyfQ0KcTE8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGFic2VuY2VfZGF5cywgeSA9IG1hdGhfc2NvcmUpICsNCiAgZ2VvbV9saW5lKGNvbG91ciA9ICIjRkY2OUI0IikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBtYXRlbWF0aWtlcyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOEwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4TCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYGBge3J9DQpxMjwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gbWF0aF9zY29yZSkgKw0KICBnZW9tX3N0ZXAoY29sb3VyID0gIiNGRjY5QjQiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIG1hdGVtYXRpa2VzIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4TCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDhMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCnEzPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMsIHkgPSBtYXRoX3Njb3JlKSArDQogIGdlb21fcG9pbnQoY29sb3VyID0gIiNGRjY5QjQiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIG1hdGVtYXRpa2VzIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5TCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDlMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHExLHEyLCBxMywgbnJvdyA9IDIpDQpgYGANCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgYWJzZW5jZV9kYXlzIGRoZSBwaHlzaWNzX3Njb3JlIiwiYnJvd24iKWAqKg0KYGBge3J9DQpxNDwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gcGh5c2ljc19zY29yZSkgKw0KICBnZW9tX2xpbmUoY29sb3VyID0gIiM1ZDhhYTgiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGZpemlrZXMiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYGBge3J9DQpxNTwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gcGh5c2ljc19zY29yZSkgKw0KICBnZW9tX3N0ZXAoY29sb3VyID0gIiM1ZDhhYTgiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGZpemlrZXMiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYGBge3J9DQpxNjwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gcGh5c2ljc19zY29yZSkgKw0KICBnZW9tX3BvaW50KGNvbG91ciA9ICIjNWQ4YWE4IikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBmaXppa2VzIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShncmlkRXh0cmEpDQpncmlkLmFycmFuZ2UocTQscTUsIHE2LCBucm93ID0gMikNCmBgYA0KIyMjIyAqKmByIGNvbG9yaXNlKCJEaXNhIGxsb2plIGdyYWZpa2VzaCBxZSBwYXJhcWVzaW4gbWFycmVkaGVuaWVuIG1lcyBhYnNlbmNlX2RheXMgZGhlIGNoZW1pc3RyeV9zY29yZSIsImJyb3duIilgKioNCmBgYHtyfQ0KcTc8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGFic2VuY2VfZGF5cywgeSA9IGNoZW1pc3RyeV9zY29yZSkgKw0KICBnZW9tX2xpbmUoY29sb3VyID0gIiNlMzI2MzYiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGtpbWlzZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCnE4PC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMsIHkgPSBjaGVtaXN0cnlfc2NvcmUpICsNCiAgZ2VvbV9zdGVwKGNvbG91ciA9ICIjZTMyNjM2IikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBraW1pc2UiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYGBge3J9DQpxOTwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gY2hlbWlzdHJ5X3Njb3JlKSArDQogIGdlb21fcG9pbnQoY29sb3VyID0gIiNlMzI2MzYiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGtpbWlzZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHE3LHE4LCBxOSwgbnJvdyA9IDIpDQpgYGANCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgYWJzZW5jZV9kYXlzIGRoZSBiaW9sb2d5X3Njb3JlIiwiYnJvd24iKWAqKg0KYGBge3J9DQpxMTA8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGFic2VuY2VfZGF5cywgeSA9IGJpb2xvZ3lfc2NvcmUpICsNCiAgZ2VvbV9saW5lKGNvbG91ciA9ICIjZmZiZjAwIikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBiaW9sb2dqaXNlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KcTExPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMsIHkgPSBiaW9sb2d5X3Njb3JlKSArDQogIGdlb21fc3RlcChjb2xvdXIgPSAiI2ZmYmYwMCIpICsNCiAgbGFicygNCiAgICB4ID0gIkRpdGV0IGUgbXVuZ2VzYXZlIiwNCiAgICB5ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgYmlvbG9namlzZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCnExMjwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gYmlvbG9neV9zY29yZSkgKw0KICBnZW9tX3BvaW50KGNvbG91ciA9ICIjZmZiZjAwIikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBiaW9sb2dqaXNlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShncmlkRXh0cmEpDQpncmlkLmFycmFuZ2UocTEwLHExMSwgcTEyLCBucm93ID0gMikNCmBgYA0KIyMjIyAqKmByIGNvbG9yaXNlKCJEaXNhIGxsb2plIGdyYWZpa2VzaCBxZSBwYXJhcWVzaW4gbWFycmVkaGVuaWVuIG1lcyBhYnNlbmNlX2RheXMgZGhlIGhpc3Rvcnlfc2NvcmUiLCJicm93biIpYCoqDQpgYGB7cn0NCnExMzwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gaGlzdG9yeV9zY29yZSkgKw0KICBnZW9tX2xpbmUoY29sb3VyID0gIiNhNGM2MzkiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGhpc3RvcmlzZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCnExNDwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gaGlzdG9yeV9zY29yZSkgKw0KICBnZW9tX3N0ZXAoY29sb3VyID0gIiNhNGM2MzkiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGhpc3RvcmlzZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCnExNTwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gaGlzdG9yeV9zY29yZSkgKw0KICBnZW9tX3BvaW50KGNvbG91ciA9ICIjYTRjNjM5IikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBoaXN0b3Jpc2UiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShxMTMscTE0LHExNSwgbnJvdyA9IDIpDQpgYGANCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgYWJzZW5jZV9kYXlzIGRoZSBnZW9ncmFwaHlfc2NvcmUiLCJicm93biIpYCoqDQpgYGB7cn0NCnExNjwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gZ2VvZ3JhcGh5X3Njb3JlKSArDQogIGdlb21fbGluZShjb2xvdXIgPSAiI2NkOTU3NSIpICsNCiAgbGFicygNCiAgICB4ID0gIkRpdGV0IGUgbXVuZ2VzYXZlIiwNCiAgICB5ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgZ2plb2dyYWZpc2UiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDlMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCg0KYGBgDQoNCmBgYHtyfQ0KcTE3PC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMsIHkgPSBnZW9ncmFwaHlfc2NvcmUpICsNCiAgZ2VvbV9zdGVwKGNvbG91ciA9ICIjY2Q5NTc1IikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBnamVvZ3JhZmlzZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOEwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KDQpgYGANCg0KYGBge3J9DQpxMTg8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGFic2VuY2VfZGF5cywgeSA9IGdlb2dyYXBoeV9zY29yZSkgKw0KICBnZW9tX3BvaW50KGNvbG91ciA9ICIjY2Q5NTc1IikgKw0KICBsYWJzKA0KICAgIHggPSAiRGl0ZXQgZSBtdW5nZXNhdmUiLA0KICAgIHkgPSAiUGlrZXQgbmUgcHJvdmltaW4gZSBnamVvZ3JhZmlzZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHExNixxMTcscTE4LCBucm93ID0gMikNCmBgYA0KIyMjIyAqKmByIGNvbG9yaXNlKCJEaXNhIGxsb2plIGdyYWZpa2VzaCBxZSBwYXJhcWVzaW4gbWFycmVkaGVuaWVuIG1lcyBhYnNlbmNlX2RheXMgZGhlIGVuZ2xpc2hfc2NvcmUiLCJicm93biIpYCoqDQpgYGB7cn0NCnExOTwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gYWJzZW5jZV9kYXlzLCB5ID0gZW5nbGlzaF9zY29yZSkgKw0KICBnZW9tX2xpbmUoY29sb3VyID0gIiM0YjUzMjAiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGFuZ2xpc2h0ZXMiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDlMLA0KICAgIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMLA0KICAgIGZhY2UgPSAiYm9sZCIpDQogICkNCg0KYGBgDQoNCmBgYHtyfQ0KcTIwPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMsIHkgPSBlbmdsaXNoX3Njb3JlKSArDQogIGdlb21fc3RlcChjb2xvdXIgPSAiIzRiNTMyMCIpICsNCiAgbGFicygNCiAgICB4ID0gIkRpdGV0IGUgbXVuZ2VzYXZlIiwNCiAgICB5ID0gIlBpa2V0IG5lIHByb3ZpbWluIGUgYW5nbGlzaHRlcyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOEwsDQogICAgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwsDQogICAgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KcTIxPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBhYnNlbmNlX2RheXMsIHkgPSBlbmdsaXNoX3Njb3JlKSArDQogIGdlb21fcG9pbnQoY29sb3VyID0gIiM0YjUzMjAiKSArDQogIGxhYnMoDQogICAgeCA9ICJEaXRldCBlIG11bmdlc2F2ZSIsDQogICAgeSA9ICJQaWtldCBuZSBwcm92aW1pbiBlIGFuZ2xpc2h0ZXMiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShxMTkscTIwLHEyMSwgbnJvdyA9IDIpDQpgYGANCiMjIyAqKmByIGNvbG9yaXNlKCJHcmFmaWtlIHBlciAyIG5kcnlzaG9yZSBwZXIgZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMiLCIjMDAxNGE4IilgKioNCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMgZGhlIHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzIiwib3JhbmdlIilgKioNCmBgYHtyfQ0KdzE8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoDQogICAgeCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzLA0KICAgIHkgPSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3Vycw0KICApICsNCiAgZ2VvbV92aW9saW4oYWRqdXN0ID0gMUwsIHNjYWxlID0gImFyZWEiLCBmaWxsID0gIiMwMDU2RjAiKSArDQogIGxhYnMoDQogICAgeCA9ICJBa3Rpdml0ZXRldCBqYXNodGVzaGtvbGxvcmUiLA0KICAgIHkgPSAiT3JldCBqYXZvcmUgdGUgc3R1ZGltaXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwNCiAgICBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwNCiAgICBmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KYGBge3J9DQp3MjwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcygNCiAgICB4ID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMsDQogICAgeSA9IHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzDQogICkgKw0KICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMpLCBzaXplID0gMS4yKSArICANCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gInllbGxvdyIsIGhpZ2ggPSAib3JhbmdlIikgKyAgDQogIGxhYnMoDQogICAgeCA9ICJBa3Rpdml0ZXRldCBqYXNodGVzaGtvbGxvcmUiLA0KICAgIHkgPSAiT3JldCBqYXZvcmUgdGUgc3R1ZGltaXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0TCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNEwsIGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHcxLHcyLCBucm93ID0gMikNCmBgYA0KR3JhZmlrdSBpIHBvc2h0w6ttIHRyZWdvbiBuasOrIHNocMOrcm5kYXJqZSB0w6sgcGlrYXZlIHTDqyBzdHVkZW50w6t2ZSBuw6sga3JhaGFzaW0gbWUgb3LDq3QgZSB2ZXTDqy1zdHVkaW1pdC4gTnVrIGR1a2V0IHTDqyBrZXTDqyBuasOrIHRlbmRlbmPDqyB0w6sgcWFydMOrIHHDqyB0cmVnb24gc2UgcGplc8OrbWFycmphIG7DqyBha3Rpdml0ZXRlIGphc2h0w6tzaGtvbGxvcmUgbmRpa29uIG5kamVzaMOrbSBuw6sgcmV6dWx0YXRldCBlIHN0dWRlbnTDq3ZlLg0KDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiRXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMgZGhlIGNhcmVlcl9hc3BpcmF0aW9uIiwib3JhbmdlIilgKioNCmBgYHtyfQ0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcygNCiAgICB4ID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMsDQogICAgZmlsbCA9IGNhcmVlcl9hc3BpcmF0aW9uDQogICkgKw0KICBnZW9tX2JhcigpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gMSkgKw0KICBsYWJzKA0KICAgIHggPSAiQWt0aXZpdGV0ZXQgamFzaHRlc2hrb2xsb3JlIiwNCiAgICB5ID0gIkRlbmR1cmlhIiwNCiAgICBmaWxsID0gIlByb2Zlc2lvbmV0ICINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3TCkNCiAgKQ0KYGBgDQpOZ2EgZ3JhZmlrdSBtZSBzaXBlciBzaG9oaW0gc2Ugc3R1ZGVudGV0IHFlIG1lcnJlbiBtZSBha3Rpdml0ZXQgamFzaHRlc2hrb2xsb3JlIGthbiBtZSBwYWsgYXNwaXJhdGEgcGVyIGthcnJpZXJlbiBuZGVyc2EgYXRhIHN0dWRlbnQgcWUgbnVrIG1lcnJlbiBtZSBha3Rpdml0ZXRlIGthbmUgbWUgc2h1bWUgYXNwaXJhdGEgcGVyIGthcnJpZXJyZW4gZGhlIG1lIHNlIHNodW10aSBwZXIgc29mdHdhcmUgZW5naW5lZXIgZGhlIGJ1c2luZXNzIG93bmVyLg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIkRpc2EgbGxvamUgZ3JhZmlrZXNoIHFlIHBhcmFxZXNpbiBtYXJyZWRoZW5pZW4gbWVzIGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzIGRoZSBtYXRoX3Njb3JlIiwib3JhbmdlIilgKioNCmBgYHtyfQ0KcjE8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoDQogICAgeCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzLA0KICAgIHkgPSBtYXRoX3Njb3JlDQogICkgKw0KICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gbWF0aF9zY29yZSksIHNpemUgPSAxLjIpICsgIA0KICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAiI2RlNmZhMSIsIGhpZ2ggPSAiIzlmMDBmZiIpICsgIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCnIyPC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcywgeSA9IG1hdGhfc2NvcmUsIGZpbGwgPSBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcykgKw0KICBnZW9tX3Zpb2xpbihhZGp1c3QgPSAxTCwgc2NhbGUgPSAiYXJlYSIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKw0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShyMSxyMiwgbnJvdyA9IDIpDQpgYGANCk5nYSBncmFmaWtldCBtZSBzaXBlciB2ZW1lIHJlIHNlIHN0dWRlbnRldCBxZSBudWsgbWVycmVuIG1lIGFrdGl2aXRldGUgamFzaHRlc2hrb2xsb3JlIGthbiB0ZW5kZW5jIHRlIGRhbGluIG1lIG1pcmUgbmUgcHJvdmltIHNlIHNhIGF0YSBxZSBtZXJyZW4gbWUgYWt0aXZpdGV0Lg0KDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMgZGhlIHBoeXNpY3Nfc2NvcmUiLCJvcmFuZ2UiKWAqKg0KYGBge3J9DQpyMzwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcygNCiAgICB4ID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMsDQogICAgeSA9IHBoeXNpY3Nfc2NvcmUNCiAgKSArDQogIGdlb21faml0dGVyKGFlcyhjb2xvdXIgPSBwaHlzaWNzX3Njb3JlKSwgc2l6ZSA9IDEuMikgKyAgDQogIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICIjZDJiNDhjIiwgaGlnaCA9ICJnb2xkIikgKyAgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyfQ0KcjQ8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzLCB5ID0gcGh5c2ljc19zY29yZSwgZmlsbCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSArDQogIHRoZW1lX21pbmltYWwoKSANCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHIzLHI0LCBucm93ID0gMikNCmBgYA0KTmdhIGdyYWZpa3UgbWUgc2lwZXIgc2hvaGltIHNlIGthIG1lIHNodW1lIHN0dWRlbnRldCBxZSBudWsgbWVycmVuIG1lIGFrdGl2aXRldGUgamFzaHRlc2hrb2xsb3JlIGRoZSBkYWxpbiBtaXJlIG5lIHByb3ZpbSBzZSBzYSBhdGEgcWUgbWVycmVuIG1lIGFrdGl2aXRldGUuIA0KDQojIyMjICoqYHIgY29sb3Jpc2UoIkRpc2EgbGxvamUgZ3JhZmlrZXNoIHFlIHBhcmFxZXNpbiBtYXJyZWRoZW5pZW4gbWVzIGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzIGRoZSBjaGVtaXN0cnlfc2NvcmUiLCJvcmFuZ2UiKWAqKg0KYGBge3J9DQpyNTwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcygNCiAgICB4ID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMsDQogICAgeSA9IGNoZW1pc3RyeV9zY29yZQ0KICApICsNCiAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG91ciA9IGNoZW1pc3RyeV9zY29yZSksIHNpemUgPSAxLjIpICsgIA0KICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAiI2QyYjQ4YyIsIGhpZ2ggPSAiIzk5MDAwMCIpICsgIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCnI2PC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcywgeSA9IGNoZW1pc3RyeV9zY29yZSwgZmlsbCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHI1LHI2LCBucm93ID0gMikNCmBgYA0KTmdhIGdyYWZpa3UgbWUgc2lwZXIgc2hvaGltIHNlIGthIG1lIHNodW1lIHN0dWRlbnRldCBxZSBudWsgbWVycmVuIG1lIGFrdGl2aXRldGUgamFzaHRlc2hrb2xsb3JlIGRoZSBkYWxpbiBtaXJlIG5lIHByb3ZpbSBzZSBzYSBhdGEgcWUgbWVycmVuIG1lIGFrdGl2aXRldGUuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMgZGhlIGJpb2xvZ3lfc2NvcmUiLCJvcmFuZ2UiKWAqKg0KYGBge3J9DQpyNzwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcygNCiAgICB4ID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMsDQogICAgeSA9IGJpb2xvZ3lfc2NvcmUNCiAgKSArDQogIGdlb21faml0dGVyKGFlcyhjb2xvdXIgPSBiaW9sb2d5X3Njb3JlKSwgc2l6ZSA9IDEuMikgKyAgDQogIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICIjZDJiNDhjIiwgaGlnaCA9ICIjNDY4MmI0IikgKyAgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0Kcjg8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzLCB5ID0gYmlvbG9neV9zY29yZSwgZmlsbCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhc3RlbDEiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShncmlkRXh0cmEpDQpncmlkLmFycmFuZ2UocjcscjgsIG5yb3cgPSAyKQ0KYGBgDQpOZ2EgZ3JhZmlrdSBtZSBzaXBlciBzaG9oaW0gc2Uga2EgbWUgc2h1bWUgc3R1ZGVudGV0IHFlIG51ayBtZXJyZW4gbWUgYWt0aXZpdGV0ZSBqYXNodGVzaGtvbGxvcmUgZGhlIGRhbGluIG1pcmUgbmUgcHJvdmltIHNlIHNhIGF0YSBxZSBtZXJyZW4gbWUgYWt0aXZpdGV0ZS4NCg0KIyMjIyAqKmByIGNvbG9yaXNlKCJEaXNhIGxsb2plIGdyYWZpa2VzaCBxZSBwYXJhcWVzaW4gbWFycmVkaGVuaWVuIG1lcyBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcyBkaGUgaGlzdG9yeV9zY29yZSIsIm9yYW5nZSIpYCoqDQpgYGB7cn0NCnI5PC1nZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKA0KICAgIHggPSBleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcywNCiAgICB5ID0gaGlzdG9yeV9zY29yZQ0KICApICsNCiAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG91ciA9IGhpc3Rvcnlfc2NvcmUpLCBzaXplID0gMS4yKSArICANCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gIiNkMmI0OGMiLCBoaWdoID0gIiMxMDBjMDgiKSArICANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpyMTA8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzLCB5ID0gaGlzdG9yeV9zY29yZSwgZmlsbCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzKSArDQogIGdlb21fdmlvbGluKGFkanVzdCA9IDFMLCBzY2FsZSA9ICJhcmVhIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhc3RlbDIiKSArDQogIHRoZW1lX21pbmltYWwoKSANCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KZ3JpZC5hcnJhbmdlKHI5LHIxMCwgbnJvdyA9IDIpDQpgYGANCk5nYSBncmFmaWt1IG1lIHNpcGVyIHNob2hpbSBzZSBrYSBtZSBzaHVtZSBzdHVkZW50ZXQgcWUgbnVrIG1lcnJlbiBtZSBha3Rpdml0ZXRlIGphc2h0ZXNoa29sbG9yZSBkaGUgZGFsaW4gbWlyZSBuZSBwcm92aW0gc2Ugc2EgYXRhIHFlIG1lcnJlbiBtZSBha3Rpdml0ZXRlLg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIkRpc2EgbGxvamUgZ3JhZmlrZXNoIHFlIHBhcmFxZXNpbiBtYXJyZWRoZW5pZW4gbWVzIGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzIGRoZSBnZW9ncmFwaHlfc2NvcmUiLCJvcmFuZ2UiKWAqKg0KYGBge3J9DQpyMTE8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoDQogICAgeCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzLA0KICAgIHkgPSBnZW9ncmFwaHlfc2NvcmUNCiAgKSArDQogIGdlb21faml0dGVyKGFlcyhjb2xvdXIgPSBnZW9ncmFwaHlfc2NvcmUpLCBzaXplID0gMS4yKSArICANCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gIiNkMmI0OGMiLCBoaWdoID0gIiMwMDMzOTkiKSArICANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpyMTI8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzLCB5ID0gZ2VvZ3JhcGh5X3Njb3JlLCBmaWxsID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMpICsNCiAgZ2VvbV92aW9saW4oYWRqdXN0ID0gMUwsIHNjYWxlID0gImFyZWEiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKw0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShyMTEscjEyLCBucm93ID0gMikNCmBgYA0KTmdhIGdyYWZpa3UgbWUgc2lwZXIgc2hvaGltIHNlIGthIG1lIHNodW1lIHN0dWRlbnRldCBxZSBudWsgbWVycmVuIG1lIGFrdGl2aXRldGUgamFzaHRlc2hrb2xsb3JlIGRoZSBkYWxpbiBtaXJlIG5lIHByb3ZpbSBzZSBzYSBhdGEgcWUgbWVycmVuIG1lIGFrdGl2aXRldGUuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMgZGhlIGVuZ2xpc2hfc2NvcmUiLCJvcmFuZ2UiKWAqKg0KYGBge3J9DQpyMTM8LWdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoDQogICAgeCA9IGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzLA0KICAgIHkgPSBlbmdsaXNoX3Njb3JlDQogICkgKw0KICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gZW5nbGlzaF9zY29yZSksIHNpemUgPSAxLjIpICsgIA0KICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAiI2QyYjQ4YyIsIGhpZ2ggPSAiI2NmNzFhZiIpICsgIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCnIxNDwtZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMsIHkgPSBlbmdsaXNoX3Njb3JlLCBmaWxsID0gZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMpICsNCiAgZ2VvbV92aW9saW4oYWRqdXN0ID0gMUwsIHNjYWxlID0gImFyZWEiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikgKw0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShyMTMscjE0LCBucm93ID0gMikNCmBgYA0KTmdhIGdyYWZpa3UgbWUgc2lwZXIgc2hvaGltIHNlIGthIG1lIHNodW1lIHN0dWRlbnRldCBxZSBudWsgbWVycmVuIG1lIGFrdGl2aXRldGUgamFzaHRlc2hrb2xsb3JlIGRoZSBkYWxpbiBtaXJlIG5lIHByb3ZpbSBzZSBzYSBhdGEgcWUgbWVycmVuIG1lIGFrdGl2aXRldGUuDQoNCiMjIyAqKmByIGNvbG9yaXNlKCJHcmFmaWtlIHBlciAyIG5kcnlzaG9yZSBwZXIgd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMiLCJibGFjayIpYCoqDQojIyMjICoqYHIgY29sb3Jpc2UoIldlZWtseV9zZWxmX3N0dWR5X2hvdXJzIGRoZSBjYXJlZXJfYXNwaXJhdGlvbnMiLCJwdXJwbGUiKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgZmlsbCA9IGNhcmVlcl9hc3BpcmF0aW9uKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMEwpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gImluZmVybm8iLCBkaXJlY3Rpb24gPSAxKSArDQogIGxhYnMoDQogICAgeCA9ICJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIsDQogICAgeSA9ICJEZW5kdXJpYSIsDQogICAgZmlsbCA9ICJQcm9mZXNpb25pIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDdMKQ0KICApDQpgYGANCkt5IGdyYWZpayBwYXJhcWV0IG9yw6t0IGphdm9yZSB0w6sgc3R1ZGltaXQgcMOrciBpbmRpdmlkw6sgbsOrIHByb2Zlc2lvbmUgdMOrIG5kcnlzaG1lLiBKYSBkaXNhIHBpa2F0IGtyeWVzb3JlOg0KDQotU2h1bWljYSBlIHByb2Zlc2lvbmV2ZSBrYW7DqyBuasOrIG51bcOrciB0w6sgbWFkaCB0w6sgb3LDq3ZlIHTDqyBzdHVkaW1pdCwgbWUgbmrDqyBwaWt1IHTDqyBkdWtzaMOrbSBww6tyIEtvbnRhYmlsaXN0w6t0IHJyZXRoIDAgZGVyaSBuw6sgMTAgb3LDqyBuw6sgamF2w6suDQotIFByb2Zlc2lvbmV0IHNpIEFydGlzdMOrdCBkaGUgUHJvbmFyw6t0IGUgQml6bmVzZXZlIGdqaXRoYXNodHUga2Fuw6sga29ow6sgdMOrIGtvbnNpZGVydWVzaG1lIHN0dWRpbWksIHBvciBqbyBhcSBzYSBLb250YWJpbGlzdMOrdC4NCi0gTmdqeXJhdCBtw6sgdMOrIGVycsOrdGEgbsOrIGdyYWZpayB0cmVnb2puw6sgbmrDqyBkZW5zaXRldCBtw6sgdMOrIGxhcnTDqyB0w6sgbmplcsOrenZlIHHDqyBzdHVkaW9qbsOrIHDDq3IgYXRvIG9yw6sgc3BlY2lmaWtlLg0KLVRlbmRlbmNhdCBlIHN0dWRpbWl0IG5kcnlzaG9qbsOrIHDDq3Igw6dkbyBwcm9mZXNpb24sIGR1a2UgdHJlZ3VhciBzZSBkaXNhIHByb2Zlc2lvbmUga8Orcmtvam7DqyBtw6sgc2h1bcOrIGtvaMOrIHN0dWRpbWkgbsOrIGtyYWhhc2ltIG1lIHTDqyB0amVyYXQuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMgZGhlIG1hdGhfc2NvcmUiLCJwdXJwbGUiKWAqKg0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCnBsb3RfbHkoc3R1ZGVudF9zY29yZXMseD1+d2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsY29sb3I9fm1hdGhfc2NvcmUsY29sb3JzPSJEYXJrMiIpDQpgYGANCiBQw6tyIG3DqyBwYWsgb3LDqyB2ZXTDqy1zdHVkaW1pLCByZXp1bHRhdGV0IGphbsOrIG3DqyB0w6sgbGFydGEgZGhlIHDDq3Jnaml0aMOrc2lzaHQgYmllbiBtZSBycml0amVuIGUgb3LDq3ZlIHTDqyBzdHVkaW1pdCwgcMOrcnZlw6cgbmrDqyBwaWt1IHJyZXRoIDEwIG9yw6t2ZSB0w6sgc3R1ZGltaXQuDQogS2pvIG11bmQgdMOrIHN1Z2plcm9qw6sgc2UgbmrDqyBzYXNpIGUgbW9kZXJ1YXIgZSB2ZXTDqy1zdHVkaW1pdCDDq3NodMOrIG3DqyBlZmVrdGl2ZSwgb3NlIHHDqyBzdHVkZW50w6t0IHHDqyBzdHVkaW9qbsOrIHNodW3DqyBtdW5kIHTDqyBrZW7DqyBtw6sgcGFrIGtvaMOrIHDDq3IgdMOrIHDDq3JxZW5kcnVhciBuw6sgbWF0ZW1hdGlrw6suDQoNCiMjIyMgKipgciBjb2xvcmlzZSgiIHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzIGRoZSBwaHlzaWNzX3Njb3JlIiwicHVycGxlIilgKioNCmBgYHtyfQ0KbGlicmFyeShwbG90bHkpDQpwbG90X2x5KHN0dWRlbnRfc2NvcmVzLHg9fndlZWtseV9zZWxmX3N0dWR5X2hvdXJzLGNvbG9yPX5waHlzaWNzX3Njb3JlLGNvbG9ycz0iQWNjZW50IikNCmBgYA0KLSBLYSBuasOrIHLDq25pZSB0w6sgbmRqZXNobWUgbsOrIG9yw6t0IGUgdmV0w6tzdHVkaW1pdCBwYXMgMTAgb3LDq3ZlIGphdm9yZSwgZHVrZSB0cmVndWFyIHNlIHN0dWRlbnTDq3QgbXVuZCB0w6sga2Vuw6sga3VmaXppbWUgbsOrIGtvaMOrbiBlIHR5cmUgb3NlIGVmaWthc2l0ZXRpbiBlIHN0dWRpbWl0Lg0KLSBSZXp1bHRhdGV0IG7DqyBmaXppa8OrIGdqaXRoYXNodHUgYmllbiBwYXMgMTAgb3LDq3ZlIHTDqyBzdHVkaW1pdCwgccOrIG11bmQgdMOrIHN1Z2plcm9qw6sgbmrDqyBtdW5nZXPDqyB0w6sga29ycmVsYWNpb25pdCB0w6sgZHJlanRww6tyZHJlanTDqyBtaWRpcyBrb2jDq3Mgc8OrIHN0dWRpbWl0IGRoZSBwZXJmb3JtYW5jw6tzIGFrYWRlbWlrZS4NCktqbyBhbmFsaXrDqyBzdWdqZXJvbiBzZSBzYXNpYSBlIGtvaMOrcyBzw6sgdmV0w6tzdHVkaW1pdCBudWsgw6tzaHTDqyBnaml0aG1vbsOrIG5qw6sgdHJlZ3VlcyBpIHFhcnTDqyBpIHN1a3Nlc2l0IGFrYWRlbWlrIGRoZSBzZSBmYWt0b3LDqyB0w6sgdGplcsOrIG11bmQgdMOrIGx1YWpuw6sgbmrDqyByb2wgdMOrIHLDq25kw6tzaXNow6ttLg0KDQoNCiMjIyMgKipgciBjb2xvcmlzZSgid2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMgZGhlIGNoZW1pc3RyeV9zY29yZSIsInB1cnBsZSIpYCoqDQpgYGB7cn0NCmxpYnJhcnkocGxvdGx5KQ0KcGxvdF9seShzdHVkZW50X3Njb3Jlcyx4PX53ZWVrbHlfc2VsZl9zdHVkeV9ob3Vycyxjb2xvcj1+Y2hlbWlzdHJ5X3Njb3JlLGNvbG9ycz0iUGFpcmVkIikNCmBgYA0KLSBHcmFmaWt1IHRyZWdvbiBuasOrIHJyaXRqZSB0w6sgcMOrcmdqaXRoc2htZSB0w6sgbm90YXZlIHTDqyBraW1pc8OrIG1lIHJyaXRqZW4gZSBvcsOrdmUgdMOrIHN0dWRpbWl0IHZldGphayBqYXZvciwgbmdhIDAgZGVyaSBuw6sgNTAgb3LDqy4NCi0gTm90YXQgdmFyaW9qbsOrIG5nYSA1MCBkZXJpIG7DqyAxMDAsIGRoZSBzaHVtaWNhIGUgdMOrIGRow6tuYXZlIHRyZWdvam7DqyBzZSBzYSBtw6sgc2h1bcOrIG9yw6sgc3R1ZGltaSwgYXEgbcOrIGxhcnQgw6tzaHTDqyBub3RhLg0KLSBLYSBkaXNhIHJhc3RlIGt1IHBhdmFyw6tzaXNodCBzaHRpbWl0IHTDqyBvcsOrdmUgdMOrIHN0dWRpbWl0LCBub3RhIG51ayDDq3NodMOrIHJyaXR1ciBzacOnIHByaXRlaiwgZHVrZSB0cmVndWFyIHNlIGthIGZha3RvcsOrIHTDqyB0amVyw6sgccOrIG5kaWtvam7DqyBuw6sgcGVyZm9ybWFuY8Orbi4NCkt5IGFuYWxpesOrIHRyZWdvbiBzZSwgcMOrcmdqaXRow6tzaXNodCwga2EgbmrDqyBsaWRoamUgcG96aXRpdmUgbWlkaXMgb3LDq3ZlIHTDqyBzdHVkaW1pdCBkaGUgbm90YXZlIHTDqyBraW1pc8OrLg0KDQoNCiMjIyMgKipgciBjb2xvcmlzZSgid2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMgZGhlIGJpb2xvZ3lfc2NvcmUiLCJwdXJwbGUiKWAqKg0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCnBsb3RfbHkoc3R1ZGVudF9zY29yZXMseD1+d2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsY29sb3I9fmJpb2xvZ3lfc2NvcmUsY29sb3JzPSJQYXN0ZWwxIikNCmBgYA0KDQpOZ2EgZ3JhZmlrdSBzaG9oaW0gc2UgbXVuZCB0w6sgamV0w6sgccOrIHN0dWRpbWkgaSBnamF0w6sgbnVrIMOrc2h0w6sgYXEgZWZla3RpdiwgZGhlIHBhcyBuasOrIHBpa2UsIG9yw6t0IHNodGVzw6sgdMOrIHN0dWRpbWl0IG51ayBrb250cmlidW9qbsOrIG7DqyBww6tybWlyw6tzaW1pbiBlIHJlenVsdGF0ZXZlLg0KDQoNCiMjIyMgKipgciBjb2xvcmlzZSgid2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMgZGhlIGhpc3Rvcnlfc2NvcmUiLCJwdXJwbGUiKWAqKg0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCnBsb3RfbHkoc3R1ZGVudF9zY29yZXMseD1+d2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsY29sb3I9fmhpc3Rvcnlfc2NvcmUsY29sb3JzPSJQYXN0ZWwyIikNCmBgYA0KLSBTaHRpbWkgaSBvcsOrdmUgdMOrIHN0dWRpbWl0IHZldGphayBqYXZvciBkdWtldCBzZSBzamVsbCBww6tybWlyw6tzaW0gbsOrIHJlenVsdGF0ZXQgZSBoaXN0b3Jpc8OrLg0KIE5nYSBncmFmaWt1LCByZXp1bHRhdGV0IGUgaGlzdG9yaXPDqyBycml0ZW4gbmTDq3JzYSBycml0ZW4gb3LDq3QgZSBzdHVkaW1pdCB2ZXRqYWsuDQoNCiMjIyMgKipgciBjb2xvcmlzZSgid2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMgZGhlIGdlb2dyYXBoeV9zY29yZSIsInB1cnBsZSIpYCoqDQpgYGB7cn0NCmxpYnJhcnkocGxvdGx5KQ0KcGxvdF9seShzdHVkZW50X3Njb3Jlcyx4PX53ZWVrbHlfc2VsZl9zdHVkeV9ob3Vycyxjb2xvcj1+Z2VvZ3JhcGh5X3Njb3JlLGNvbG9ycz0iU2V0MSIpDQpgYGANCi0gS2EgbmrDqyBycml0amUgdMOrIHDDq3Jnaml0aHNobWUgbsOrIHJlenVsdGF0ZXQgZSBnamVvZ3JhZmlzw6sgbWUgcnJpdGplbiBlIG9yw6t2ZSB0w6sgc3R1ZGltaXQgdmV0amFrIGphdm9yLiBTaGthbGxhIGUgcmV6dWx0YXRldmUgdmFyaW9uIG5nYSA2MCBkZXJpIG7DqyAxMDAsIGRoZSBkdWtldCBzZSBrYSBuasOrIHRlbmRlbmPDqyBwb3ppdGl2ZSBuw6sgbGlkaGplIG1lIHNodGltaW4gZSBvcsOrdmUgdMOrIHN0dWRpbWl0Lg0KDQojIyMjICoqYHIgY29sb3Jpc2UoIndlZWtseV9zZWxmX3N0dWR5X2hvdXJzIGRoZSBlbmdsaXNoX3Njb3JlIiwicHVycGxlIilgKioNCmBgYHtyfQ0KbGlicmFyeShwbG90bHkpDQpwbG90X2x5KHN0dWRlbnRfc2NvcmVzLHg9fndlZWtseV9zZWxmX3N0dWR5X2hvdXJzLGNvbG9yPX5lbmdsaXNoX3Njb3JlLGNvbG9ycz0iU2V0MiIpDQpgYGANCkR1a2V0IHNlIGthIG5qw6sga29ycmVsYWNpb24gcG96aXRpdiwgc2EgbcOrIHNodW3DqyBvcsOrIHN0dWRpbWksIGFxIG3DqyB0w6sgbGFydGEgamFuw6sgcGlrw6t0IG7DqyBhbmdsaXNodC4NCg0KIyMjICoqYHIgY29sb3Jpc2UoIkdyYWZpa2UgcGVyIDIgbmRyeXNob3JlIHBlciBjYXJlZXJfYXNwaXJhdGlvbiIsIiNkZTVkODMiKWAqKg0KIyMjIyAqKmByIGNvbG9yaXNlKCJEaXNhIGxsb2plIGdyYWZpa2VzaCBxZSBwYXJhcWVzaW4gbWFycmVkaGVuaWVuIG1lcyBjYXJlZXJfYXNwaXJhdGlvbiBkaGUgbWF0aF9zY29yZSIsIiM3OTQ0M2IiKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSAiIiwgeSA9IG1hdGhfc2NvcmUsIGZpbGwgPSBjYXJlZXJfYXNwaXJhdGlvbikgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHNjYWxlX2ZpbGxfaHVlKGRpcmVjdGlvbiA9IDEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDZMKQ0KICApDQpgYGANCi0gTmdhIGdyYWZpa3Ugc2hvaGltIHNlICBwcm9mZXNpb25ldCBzaSBEb2t0b3IgZGhlIElueGhpbmllciBOZMOrcnRpbWkga2Fuw6sgbWVkaWFuYSBtw6sgdMOrIGxhcnRhLCBxw6sgc3VnamVyb24gc2Ugc3R1ZGVudMOrdCBxw6sgc3lub2puw6sga8OrdG8gZnVzaGEga2Fuw6sgdGVuZGVuY8OrIHTDqyBrZW7DqyBwaWvDqyBtw6sgdMOrIGxhcnRhIG7DqyBtYXRlbWF0aWvDqy4NCiBOZGVyc2EgIHByb2Zlc2lvbmV0IHNpIEFydGlzdCBkaGUgU2hrcmltdGFyIGthbsOrIG1lZGlhbmEgbcOrIHTDqyB1bMOrdGEsIHHDqyBtdW5kIHTDqyB0cmVnb2rDqyBuasOrIGludGVyZXMgbcOrIHTDqyB1bMOrdCBvc2UgbmV2b2rDqyBww6tyIGFmdMOrc2kgbWF0ZW1hdGlrb3JlIG7DqyBrw6t0byBmdXNoYS4NCg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSBtYXRoX3Njb3JlLCBmaWxsID0gY2FyZWVyX2FzcGlyYXRpb24pICsNCiAgZ2VvbV9kZW5zaXR5KGFkanVzdCA9IDFMKSArDQogIHNjYWxlX2ZpbGxfaHVlKGRpcmVjdGlvbiA9IDEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDZMKQ0KICApDQpgYGANCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgY2FyZWVyX2FzcGlyYXRpb24gZGhlIHBoeXNpY3Nfc2NvcmUiLCIjNzk0NDNiIilgKioNCmBgYHtyfQ0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gIiIsIHkgPSBwaHlzaWNzX3Njb3JlLCBmaWxsID0gY2FyZWVyX2FzcGlyYXRpb24pICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX2h1ZShkaXJlY3Rpb24gPSAxKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2TCkNCiAgKQ0KYGBgDQotIFByb2Zlc2lvbmV0IGUgbmRyeXNobWUgc2kgS29udGFiaWxpc3QsIElueGhpbmllciBOZMOrcnRpbWksIFp5cnRhciBRZXZlcml0YXIsIElueGhpbmllciBTb2Z0d2FyZSwgU2hrcmltdGFyLCBldGogamFuw6sgdMOrIHDDq3JmYXHDq3N1YXJhLg0KTmUgcHJvdmltaW4gZSBmaXppa2VzIHBpa8OrdCB2YXJpb2puw6sgbmdhIDUwIGRlcmkgbsOrIDEwMCwgZHVrZSB0cmVndWFyIG5qw6sgZ2Ftw6sgdMOrIGdqZXLDqyB0w6sgcGVyZm9ybWFuY8OrcyBzw6sgc3R1ZGVudMOrdmUuIFZpemF0IHZlcnRpa2FsZSBtYmkgZGhlIHBvc2h0w6sgw6dkbyBzaHR5bGxlIHRyZWdvam7DqyB2YXJpYWNpb25pbiBvc2UgZ2Ftw6tuIGUgcGlrw6t2ZSBww6tyIMOnZG8ga2F0ZWdvcmkgYXNwaXJhdGUga2FycmllcmUuDQoNCmBgYHtyfQ0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gcGh5c2ljc19zY29yZSwgZmlsbCA9IGNhcmVlcl9hc3BpcmF0aW9uKSArDQogIGdlb21fZGVuc2l0eShhZGp1c3QgPSAxTCkgKw0KICBzY2FsZV9maWxsX2h1ZShkaXJlY3Rpb24gPSAxKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2TCkNCiAgKQ0KYGBgDQojIyMjICoqYHIgY29sb3Jpc2UoIkRpc2EgbGxvamUgZ3JhZmlrZXNoIHFlIHBhcmFxZXNpbiBtYXJyZWRoZW5pZW4gbWVzIGNhcmVlcl9hc3BpcmF0aW9uIGRoZSBjaGVtaXN0cnlfc2NvcmUiLCIjNzk0NDNiIilgKioNCmBgYHtyfQ0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gIiIsIHkgPSBjaGVtaXN0cnlfc2NvcmUsIGZpbGwgPSBjYXJlZXJfYXNwaXJhdGlvbikgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHNjYWxlX2ZpbGxfaHVlKGRpcmVjdGlvbiA9IDEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDZMKQ0KICApDQpgYGANCi1TaG9oaW0gc2UgIGRpc2Ega2F0ZWdvcmkgc2kgIkRva3RvciIgZGhlICJJbnhoaW5pZXIiIG11bmQgdMOrIGtlbsOrIGt1dGkgZ3JhZmlrZSBtZSBtZWRpYW4gbcOrIHTDqyBsYXJ0w6ssIHHDqyB0cmVnb24gbmrDqyBwZXJmb3JtYW5jw6sgbcOrIHTDqyBtaXLDqyBuw6sga2ltaW7Dqy4gS3V0aSBncmFmaWtldCBnaml0aGFzaHR1IHRyZWdvam7DqyB2YXJpYWNpb25pbiBlIHBpa8OrdmUgYnJlbmRhIHNlY2lsw6tzIGthdGVnb3JpLCBtZSBkaXNhIGthdGVnb3JpIHHDqyBrYW7DqyBuasOrIHNocMOrcm5kYXJqZSBtw6sgdMOrIG5ndXNodMOrIGRoZSB0w6sgdGplcsOrdCBtZSBuasOrIHNocMOrcm5kYXJqZSBtw6sgdMOrIGdqZXLDqy4NCkthdGVnb3JpIHTDqyB0amVyYSBtdW5kIHTDqyBrZW7DqyBrdXRpIGdyYWZpa2UgbWUgbWVkaWFuIG3DqyB0w6sgdWzDq3QsIHHDqyBzdWdqZXJvbiBuasOrIHBlcmZvcm1hbmPDqyBtw6sgdMOrIGRvYsOrdCBuw6sga2ltaW7Dqy4NCg0KDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGNoZW1pc3RyeV9zY29yZSwgZmlsbCA9IGNhcmVlcl9hc3BpcmF0aW9uKSArDQogIGdlb21fZGVuc2l0eShhZGp1c3QgPSAxTCkgKw0KICBzY2FsZV9maWxsX2h1ZShkaXJlY3Rpb24gPSAxKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2TCkNCiAgKQ0KYGBgDQojIyMjICoqYHIgY29sb3Jpc2UoIkRpc2EgbGxvamUgZ3JhZmlrZXNoIHFlIHBhcmFxZXNpbiBtYXJyZWRoZW5pZW4gbWVzIGNhcmVlcl9hc3BpcmF0aW9uIGRoZSBiaW9sb2d5X3Njb3JlIiwiIzc5NDQzYiIpYCoqDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gYmlvbG9neV9zY29yZSwgZmlsbCA9IGNhcmVlcl9hc3BpcmF0aW9uKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9odWUoZGlyZWN0aW9uID0gMSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNkwpDQogICkNCmBgYA0KU2hvaGltIHNlIHByb2Zlc2lvbmV0IHNpIERva3RvciBkaGUgU2hrZW5jw6t0YXIga2Fuw6sgcGlrw6t0IG3DqyB0w6sgbGFydGEgbsOrIGJpb2xvZ2ppLCBxw6sgdHJlZ29uIG5qw6sga29ycmVsYWNpb24gdMOrIGZvcnTDqyBtaWRpcyBpbnRlcmVzaXQgbsOrIGvDq3RvIGZ1c2hhIGRoZSBwZXJmb3JtYW5jw6tzIGFrYWRlbWlrZS4gRGlzYSBwcm9mZXNpb25lIHNpIEFydGlzdCBkaGUgTG9qdGFyIGkgVmlkZW9sb2rDq3JhdmUga2Fuw6sgcGlrw6sgbcOrIHTDqyB1bMOrdGEgbsOrIGJpb2xvZ2ppLCBxw6sgbXVuZCB0w6sgdHJlZ29qw6sgbmrDqyBpbnRlcmVzIG3DqyB0w6sgdm9nw6tsIG7DqyBiaW9sb2dqaSBvc2UgbmrDqyBsaWRoamUgbcOrIHTDqyBkb2LDq3QgbWUga8OrdG8ga2FycmllcmEuDQpLeSBncmFmaWsgbXVuZCB0w6sgamV0w6sgaSBkb2Jpc2jDq20gcMOrciB0w6sga3VwdHVhciBtw6sgbWlyw6sgc2Ugc2kgaW50ZXJlc2F0IGUgc3R1ZGVudMOrdmUgcMOrciBrYXJyaWVyYSB0w6sgbmRyeXNobWUga29ycmVsb2puw6sgbWUgcGVyZm9ybWFuY8OrbiBlIHR5cmUgYWthZGVtaWtlIG7DqyBiaW9sb2dqaS4NCg0KDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGJpb2xvZ3lfc2NvcmUsIGZpbGwgPSBjYXJlZXJfYXNwaXJhdGlvbikgKw0KICBnZW9tX2RlbnNpdHkoYWRqdXN0ID0gMUwpICsNCiAgc2NhbGVfZmlsbF9odWUoZGlyZWN0aW9uID0gMSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNkwpDQogICkNCmBgYA0KIyMjIyAqKmByIGNvbG9yaXNlKCJEaXNhIGxsb2plIGdyYWZpa2VzaCBxZSBwYXJhcWVzaW4gbWFycmVkaGVuaWVuIG1lcyBjYXJlZXJfYXNwaXJhdGlvbiBkaGUgaGlzdG9yeV9zY29yZSIsIiM3OTQ0M2IiKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSAiIiwgeSA9IGhpc3Rvcnlfc2NvcmUsIGZpbGwgPSBjYXJlZXJfYXNwaXJhdGlvbikgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHNjYWxlX2ZpbGxfaHVlKGRpcmVjdGlvbiA9IDEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwTCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDZMKQ0KICApDQpgYGANClNob2hpbSBzZSBwaWvDq3QgZSBoaXN0b3Jpc8OrIHDDq3Igw6dkbyBhc3BpcmF0w6sgcHJvZmVzaW9uYWxlIGphbsOrIHNocMOrcm5kYXLDqyBuZ2EgNTAgZGVyaSBuw6sgMTAwLg0KUHJvZmVzaW9uZXQgc2kgSW54aGluaWVyIE5kw6tydGltaSwgWmh2aWxsdWVzIExvasOrcmFzaCwgZGhlIEludmVzdGl0b3IgbsOrIEJ1cnPDqyBrYW7DqyBuasOrIGdhbcOrIG3DqyB0w6sgZ2plcsOrIHTDqyBwaWvDq3ZlLCBxw6sgdHJlZ29uIG5qw6sgbmRyeXNoaW0gbcOrIHTDqyBtYWRoIG7DqyByZXp1bHRhdGV0IGUgdHlyZS5EaXNhIHByb2Zlc2lvbmUgc2kgQXZva2F0LCBTaGtlbmPDq3RhciwgZGhlIElueGhpbmllciBTb2Z0d2FyZSBkdWtldCBzZSBrYW7DqyBtZWRpYW4gbcOrIHTDqyBsYXJ0w6sgdMOrIHBpa8OrdmUsIHHDqyBzdWdqZXJvbiBuasOrIHBlcmZvcm1hbmPDqyBtw6sgdMOrIG1pcsOrIG7DqyBww6tyZ2ppdGjDq3NpLg0KDQoNCmBgYHtyfQ0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzKSArDQogIGFlcyh4ID0gaGlzdG9yeV9zY29yZSwgZmlsbCA9IGNhcmVlcl9hc3BpcmF0aW9uKSArDQogIGdlb21fZGVuc2l0eShhZGp1c3QgPSAxTCkgKw0KICBzY2FsZV9maWxsX2h1ZShkaXJlY3Rpb24gPSAxKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2TCkNCiAgKQ0KDQpgYGANCiMjIyMgKipgciBjb2xvcmlzZSgiRGlzYSBsbG9qZSBncmFmaWtlc2ggcWUgcGFyYXFlc2luIG1hcnJlZGhlbmllbiBtZXMgY2FyZWVyX2FzcGlyYXRpb24gZGhlIGdlb2dyYXBoeV9zY29yZSIsIiM3OTQ0M2IiKWAqKg0KYGBge3J9DQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMpICsNCiAgYWVzKHggPSAiIiwgeSA9IGdlb2dyYXBoeV9zY29yZSwgZmlsbCA9IGNhcmVlcl9hc3BpcmF0aW9uKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9odWUoZGlyZWN0aW9uID0gMSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNkwpDQogICkNCmBgYA0KIFNob2hpbSBzZSBkaXNhIHByb2Zlc2lvbmUgIHNpIElueGhpbmllciBOZMOrcnRpbWkgZGhlIEF2b2thdCwga2Fuw6sgbmrDqyBzaHDDq3JuZGFyamUgbcOrIHTDqyBnamVyw6sgdMOrIHBpa8OrdmUsIHHDqyB0cmVnb24gbmrDqyB2YXJpYWNpb24gbcOrIHTDqyBtYWRoIG7DqyBuam9odXJpdMOrIGdqZW9ncmFmaWtlIHTDqyBpbmRpdmlkw6t2ZSBuw6sga8OrdG8gcHJvZmVzaW9uZS5NZWRpYW5ldCBtw6sgdMOrIGxhcnRhIG9zZSBtw6sgdMOrIHVsw6t0YSwgccOrIHRyZWdvbiBuasOrIHBlcmZvcm1hbmPDqyBtZXNhdGFyZSBtw6sgdMOrIGxhcnTDqyBvc2UgbcOrIHTDqyB1bMOrdCBuw6sgZ2plb2dyYWZpIHDDq3IgYXRvIHJvbGUuTsOrc2UgdmlqYXQgcWUgZGFsaW4gbmdhIGJveHBsb3RpIGphbsOrIHTDqyBnamF0YSwga2pvIHRyZWdvbiBzZSBrYSBwaWvDqyB0w6sgZ2plb2dyYWZpc8OrIHHDqyBqYW7DqyBzaHVtw6sgbGFyZyBtZWRpYW7Dq3MsIHHDqyBtdW5kIHTDqyB0cmVnb2puw6sgcMOrciByYXN0ZSB0w6sgdmXDp2FudGEgb3NlIHTDqyBkaMOrbmEgccOrIGRhbGluIG5nYSBub3JtYS4NCg0KDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGdlb2dyYXBoeV9zY29yZSwgZmlsbCA9IGNhcmVlcl9hc3BpcmF0aW9uKSArDQogIGdlb21fZGVuc2l0eShhZGp1c3QgPSAxTCkgKw0KICBzY2FsZV9maWxsX2h1ZShkaXJlY3Rpb24gPSAxKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMEwpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2TCkNCiAgKQ0KYGBgDQojIyMjICoqYHIgY29sb3Jpc2UoIkRpc2EgbGxvamUgZ3JhZmlrZXNoIHFlIHBhcmFxZXNpbiBtYXJyZWRoZW5pZW4gbWVzIGNhcmVlcl9hc3BpcmF0aW9uIGRoZSBlbmdsaXNoX3Njb3JlIiwiIzc5NDQzYiIpYCoqDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9ICIiLCB5ID0gZW5nbGlzaF9zY29yZSwgZmlsbCA9IGNhcmVlcl9hc3BpcmF0aW9uKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9odWUoZGlyZWN0aW9uID0gMSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNkwpDQogICkNCmBgYA0KU2hvaGltIHNlIHNodW1pY2EgZSBwcm9mZXNpb25ldmUga2Fuw6sgbmrDqyBzaHDDq3JuZGFyamUgdMOrIG5namFzaG1lIHTDqyBwaWvDq3ZlIHTDqyBhbmdsaXNodGVzLCBxw6sgdmFyaW9qbsOrIG5nYSA1MCBkZXJpIG7DqyAxMDAuIFZpamEgccOrIHpnamF0ZW4gbWJpIGRoZSBwb3NodMOrIGt1dGlzw6sgdHJlZ29qbsOrIHZhcmlhYmlsaXRldGluIGphc2h0w6sga3VhcnRpbGV2ZSB0w6sgc2lww6tybWUgZGhlIHTDqyBwb3NodG1lLCBkdWtlIHRyZWd1YXIgZ2Ftw6tuIGt1IGJpZSBzaHVtaWNhIGUgdmxlcmF2ZS5QaWthdCBpbmRpdmlkdWFsZSBww6tydGVqIHZpamF2ZSB0ZSBib3hwbG90aXQgcMOrcmZhccOrc29qbsOrIHZsZXJhIHHDqyBkYWxpbiBqYXNodMOrIHNocMOrcm5kYXJqZXMgc8OrIHpha29uc2htZS4NCg0KDQpgYGB7cn0NCmdncGxvdChzdHVkZW50X3Njb3JlcykgKw0KICBhZXMoeCA9IGVuZ2xpc2hfc2NvcmUsIGZpbGwgPSBjYXJlZXJfYXNwaXJhdGlvbikgKw0KICBnZW9tX2RlbnNpdHkoYWRqdXN0ID0gMUwpICsNCiAgc2NhbGVfZmlsbF9odWUoZGlyZWN0aW9uID0gMSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxM0wsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTBMKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNkwpDQogICkNCmBgYA0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHdvcmRjbG91ZCkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KcHJvZmVzc2lvbnMgPC0gYygiQWNjb3VudGFudCIsIkFydGlzdCIsIkJhbmtlciIsIkJ1c2luZXNzIE93bmVyIiwiQ29uc3RydWN0aW9uIEVuZ2luZWVyIiwiRGVzaWduZXIiLCJEb2N0b3IiLCJHYW1lIERldmVsb3BlciIsIkdvdmVybm1lbnQgT2ZmaWNlciIsIkxhd3llciIsIlJlYWwgRXN0YXRlIERldmVsb3BlciIsIlNjaWVudGlzdCIsIlNvZnR3YXJlIEVuZ2luZWVyIiwiU3RvY2sgSW52ZXN0b3IiLCJUZWFjaGVyIiwiV3JpdGVyIikNCg0KDQpmaWx0ZXJlZF9kYXRhIDwtIHN0dWRlbnRfc2NvcmVzW3N0dWRlbnRfc2NvcmVzJGNhcmVlcl9hc3BpcmF0aW9uICVpbiUgcHJvZmVzc2lvbnMsIF0NCg0KDQpmcmVxIDwtIHRhYmxlKGZpbHRlcmVkX2RhdGEkY2FyZWVyX2FzcGlyYXRpb24pDQoNCg0Kd29yZGNsb3VkKG5hbWVzKGZyZXEpLCBmcmVxLCByYW5kb20ub3JkZXI9RkFMU0UsIGNvbG9ycz1icmV3ZXIucGFsKDgsICJEYXJrMiIpKQ0KDQpgYGANCiMjIyAqKmByIGNvbG9yaXNlKCJUYWJlbGF0IGUga29udGluZ2plbmNlcyIsImJsdWUiKWAqKg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQ0KbGlicmFyeShkYXRhd2l6YXJkKQ0KbGlicmFyeShNQVNTKQ0KZ2xpbXBzZShzdHVkZW50X3Njb3JlcykNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KZGYxPC1zdHVkZW50X3Njb3JlcyAlPiUgZHBseXI6OnNlbGVjdChnZW5kZXIscGFydF90aW1lX2pvYikNCmhlYWQoZGYxKQ0KYGBgDQpgYGB7cn0NCiNrcmlqb2ptZSB0YWJlbGVuIGUga29udGlnamVuY2VzIGR1a2UgcGVyZG9ydXIgZnVua3Npb25pbiB0YWJsZQ0KVGFiX2tvbnRpZ2plbmNlMTwtdGFibGUoZGYxJGdlbmRlcixkZjEkcGFydF90aW1lX2pvYikNClRhYl9rb250aWdqZW5jZTENCmBgYA0KLSBUYWJlbGEgdHJlZ29uIHNlIGthIG5qw6sgbmRhcmplIHJlbGF0aXZpc2h0IHTDqyBiYXJhYmFydMOrIG1lcyBmZW1yYXZlIGRoZSBtZXNoa3VqdmUgccOrIG51ayBwdW5vam7DqyBtZSBrb2jDqyB0w6sgcGplc3NobWUsIG1lIDgzNSBmZW1yYSBkaGUgODQ5IG1lc2hrdWogccOrIG51ayBqYW7DqyB0w6sgcHVuw6tzdWFyIG7DqyBrw6t0w6sgbcOrbnlyw6suDQpOZ2EgdMOrIGRow6tuYXQsIGR1a2V0IHNlIGthIG5qw6sgbnVtw6tyIG3DqyB0w6sgdm9nw6tsIHTDqyB0w6sgZHkgZ2ppbml2ZSBxw6sgcHVub2puw6sgbWUga29ow6sgdMOrIHBqZXNzaG1lLCBtZSAxNjcgZmVtcmEgZGhlIDE0OSBtZXNoa3VqIHHDqyByYXBvcnRvam7DqyBzZSBrYW7DqyBuasOrIHB1bsOrIHTDqyB0aWxsw6suDQoNCg0KDQpgYGB7cn0NCnByb3AudGFibGUoVGFiX2tvbnRpZ2plbmNlMSxtYXJnaW49MSklPiVyb3VuZCgyKQ0KYGBgDQpgYGB7cn0NCnByb3AudGFibGUoVGFiX2tvbnRpZ2plbmNlMSklPiVyb3VuZCgyKQ0KYGBgDQpgYGB7cn0NCkhfMi4xPC1jaGlzcS50ZXN0KFRhYl9rb250aWdqZW5jZTEpDQpIXzIuMQ0KSF8yLjEkb2JzZXJ2ZWQNCkhfMi4xJGV4cGVjdGVkDQpgYGANClRhYmVsYSB0cmVnb24gdmxlcmF0IGUgdsOremhndWFyYSBww6tyIGZlbXJhIGRoZSBtYXNoa3VsbCBtZSBkeSBrYXRlZ29yaSBGYWxzZSBkaGUgVHJ1ZS4NClJlenVsdGF0ZXQgZSBUZXN0aXQ6DQpYLXNxdWFyZWQ6IFZsZXJhIGUgbGxvZ2FyaXR1ciBlIFgtc3F1YXJlZCDDq3NodMOrIDEuMDA2OS4NCkxpcmlhIGUgR3JhZMOrcyAoZGYpOiBUZXN0aSBrYSBuasOrIGdyYWTDqyBsaXJpZSwgccOrIGRvIHTDqyB0aG90w6sgc2Uga2EgdmV0w6ttIG5qw6sga2F0ZWdvcmkgdMOrIHBhdmFydXIuDQpQLXZsZXJhOiBQLXZsZXJhIMOrc2h0w6sgMC4zMTU2LCBlIGNpbGEgw6tzaHTDqyBtw6sgZSBtYWRoZSBzZSBuaXZlbGkgc3RhbmRhcmQgaSByw6tuZMOrc2lzw6sgcHJlaiAwLjA1LCBkdWtlIHRyZWd1YXIgc2UgbnVrIGthIGRhbGxpbSBzdGF0aXN0aWtpc2h0IHTDqyByw6tuZMOrc2lzaMOrbSBtaWRpcyBncnVwZXZlIHTDqyBmZW1yYXZlIGRoZSBtZXNoa3VqdmUgcMOrciBrYXRlZ29yaXTDqyBlIHbDq3poZ3VhcmEuDQoNCmBgYHtyfQ0KbW9zYWljcGxvdCh0KFRhYl9rb250aWdqZW5jZTEpLCBjb2w9Yygib3JhbmdlIiwiZ3JlZW4iKSwgY2V4LmF4aXMgPSAxLHN1Yj0iUHVuZXNpbWkgcGFydC10aW1lIix5bGFiPSJHamluaWEiLG1haW49IiIpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmRmMjwtc3R1ZGVudF9zY29yZXMgJT4lIGRwbHlyOjpzZWxlY3QoZ2VuZGVyLGV4dHJhY3VycmljdWxhcl9hY3Rpdml0aWVzKQ0KaGVhZChkZjIpDQpgYGANCmBgYHtyfQ0KI2tyaWpvam1lIHRhYmVsZW4gZSBrb250aWdqZW5jZXMgZHVrZSBwZXJkb3J1ciBmdW5rc2lvbmluIHRhYmxlDQpUYWJfa29udGlnamVuY2UyPC10YWJsZShkZjIkZ2VuZGVyLGRmMiRleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcykNClRhYl9rb250aWdqZW5jZTINCmBgYA0KS2pvIHRhYmVsw6sgbXVuZCB0w6sgcMOrcmRvcmV0IHDDq3IgdMOrIGFuYWxpenVhciBuZG9uasOrIGxpZGhqZSBwb3RlbmNpYWxlIG1pZGlzIGdqaW5pc8OrIGRoZSBha3Rpdml0ZXRpdCBqYXNodMOra3VycmlrdWxhciB0w6sgc2jDq251YXIgc2kgVHJ1ZSBvc2UgRmFsc2UuIE11bmQgdMOrIHbDq3JlaGV0IHNlIGthIG5qw6sgbmRhcmplIHJlbGF0aXZpc2h0IHTDqyBiYXJhYmFydMOrIG1pZGlzIGZlbXJhdmUgZGhlIG1lc2hrdWp2ZSBww6tyIHTDqyBkeWphIGthdGVnb3JpdMOrLCBxw6sgc3VnamVyb24gc2UgbnVrIGthIG5kb25qw6sgZGFsbGltIHTDqyBtYWRoIG7DqyBwamVzw6ttYXJyamVuIG7DqyBha3Rpdml0ZXRlIGphc2h0w6trdXJyaWt1bGFyZSBiYXp1YXIgbsOrIGdqaW5pLg0KDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShUYWJfa29udGlnamVuY2UyLG1hcmdpbj0xKSU+JXJvdW5kKDIpDQpgYGANCmBgYHtyfQ0KcHJvcC50YWJsZShUYWJfa29udGlnamVuY2UyKSU+JXJvdW5kKDIpDQpgYGANCmBgYHtyfQ0KSF8yLjI8LWNoaXNxLnRlc3QoVGFiX2tvbnRpZ2plbmNlMikNCkhfMi4yDQpIXzIuMiRvYnNlcnZlZA0KSF8yLjIkZXhwZWN0ZWQNCmBgYA0KUmV6dWx0YXRldCBlIHRlc3RpdCB0w6sgaGkta2F0cm9yaXQgbmEgdHJlZ29qbsOrIG5qw6sgdmxlcsOrIFgta2F0cm9yZSBwcmVqIDAuMDU5MDMsIG1lIG5qw6sgZ3JhZMOrIGxpcmllIChkZikgcHJlaiAxLCBkaGUgbmrDqyB2bGVyw6sgcCBwcmVqIDAuODE2NC4gS2pvIHZsZXLDqyBlIGxhcnTDqyBlIHAtc8OrIHN1Z2plcm9uIHNlIG51ayBrYSBuasOrIGxpZGhqZSB0w6sgcsOrbmTDq3Npc2htZSBzdGF0aXN0aWtvcmUgbWlkaXMgdmFyaWFibGF2ZSBxw6sgamFuw6sgZHVrZSB1IHRlc3R1YXIsIHBhc2kgw6tzaHTDqyBzaHVtw6sgbcOrIGUgbGFydMOrIHNlIG5pdmVsaSBpIHpha29uc2jDq20gYWxmYSBwcmVqIDAuMDUuDQplenVsdGF0ZXQgdHJlZ29qbmUgc2UgbnVrIGthIG5kb25qw6sgZGFsbGltIHTDqyBtYWRoIG1pZGlzIGZyZWt1ZW5jYXZlIHTDqyB2w6t6aGd1YXJhIGRoZSBhdHlyZSB0w6sgcGFyYXNoaWt1YXJhLCBkdWtlIHRyZWd1YXIgc2UgbnVrIGthIHByb3ZhIHTDqyBtamFmdHVlc2htZSBww6tyIHTDqyBoZWRodXIgcG9zaHTDqyBoaXBvdGV6w6tuIGZpbGxlc3RhcmUgc2UgbnVrIGthIGFzbmrDqyBsaWRoamUuDQoNCg0KYGBge3J9DQptb3NhaWNwbG90KHQoVGFiX2tvbnRpZ2plbmNlMiksIGNvbD1jKCJyZWQiLCJibGFjayIpLCBjZXguYXhpcyA9IDEsc3ViPSJBa3Rpdml0ZXRldCBqYXNodGVzaGtvbGxvcmUiLHlsYWI9IkdqaW5pYSIsbWFpbj0iIikNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KZGYzPC1zdHVkZW50X3Njb3JlcyAlPiUgZHBseXI6OnNlbGVjdChnZW5kZXIsY2FyZWVyX2FzcGlyYXRpb24pDQpoZWFkKGRmMykNCmBgYA0KYGBge3J9DQoja3Jpam9qbWUgdGFiZWxlbiBlIGtvbnRpZ2plbmNlcyBkdWtlIHBlcmRvcnVyIGZ1bmtzaW9uaW4gdGFibGUNClRhYl9rb250aWdqZW5jZTM8LXRhYmxlKGRmMyRjYXJlZXJfYXNwaXJhdGlvbixkZjMkZ2VuZGVyKQ0KVGFiX2tvbnRpZ2plbmNlMw0KYGBgDQogVGFiZWxhIHBhcmFxZXQgbmrDqyBuZGFyamUgdMOrIG51bXJpdCB0w6sgaW5kaXZpZMOrdmUgc2lwYXMgZ2ppbmlzw6sgbsOrIHByb2Zlc2lvbmUgdMOrIG5kcnlzaG1lLkRpc2EgcHJvZmVzaW9uZSBzaSBCdXNpbmVzcyBPd25lciBkaGUgVGVhY2hlciBrYW7DqyBuasOrIG51bcOrciB0w6sgbGFydMOrIHTDqyBww6tyZmFxw6tzdWVzdmUgbmdhIHTDqyBkeSBnamluaXTDqywgbmTDq3JzYSB0w6sgdGplcsOrdCBzaSBTb2Z0d2FyZSBFbmdpbmVlciBkaGUgU3RvY2sgSW52ZXN0b3IgamFuw6sgbcOrIHTDqyBkb21pbnVhciBuZ2EgbWVzaGt1anQuTsOrIHByb2Zlc2lvbmUgc2kgQ29uc3RydWN0aW9uIEVuZ2luZWVyIGRoZSBSZWFsIEVzdGF0ZSBEZXZlbG9wZXIsIGthIG5qw6sgZGFsbGltIHTDqyBkdWtzaMOrbSBuw6sgbnVtcmluIGUgcMOrcmZhccOrc3Vlc3ZlIG5nYSBnamluaWEgbWFzaGt1bGxvcmUgbsOrIGtyYWhhc2ltIG1lIGF0w6sgZmVtw6tyb3JlLiANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpwcm9wLnRhYmxlKFRhYl9rb250aWdqZW5jZTMsbWFyZ2luPTEpJT4lcm91bmQoMikNCmBgYA0KYGBge3J9DQpwcm9wLnRhYmxlKFRhYl9rb250aWdqZW5jZTMpJT4lcm91bmQoMikNCmBgYA0KYGBge3J9DQpIXzIuMzwtY2hpc3EudGVzdChUYWJfa29udGlnamVuY2UzKQ0KSF8yLjMNCkhfMi4zJG9ic2VydmVkDQpIXzIuMyRleHBlY3RlZA0KYGBgDQoqVGVzdGkgQ2hpLXNxdWFyZWQga2EgcHJvZGh1YXIgbmrDqyB2bGVyw6sgdMOrIFgtc3F1YXJlZCBwcmVqIDEyMy44NyBtZSAgc2hrYWxsZSBsaXJpZSAxMiAgZGhlIG5qw6sgdmxlcsOrIHAgPCAyLjJlLTE2Lg0KKk5qw6sgdmxlcsOrIHAga2FxIGUgdWzDq3QgdHJlZ29uIHNlIGthIG5qw6sgbmRyeXNoaW0gc3RhdGlzdGlraXNodCB0w6sgcsOrbmTDq3Npc2jDq20gbWlkaXMgZnJla3VlbmNhdmUgdMOrIHbDq3poZ3VhcmEgZGhlIGF0eXJlIHTDqyBwcml0dXJhLCBkdWtlIHN1Z2plcnVhciBuasOrIGxpZGhqZSAgdMOrIGZvcnTDqyBtaWRpcyB2YXJpYWJsYXZlIHTDqyB0ZXN0dWFyYS5Lam8gZG8gdMOrIHRob3TDqyBzZSB2YXJpYWJsYXQgccOrIGphbsOrIHRlc3R1YXIgbnVrIGphbsOrIHTDqyBwYXZhcnVyYSBuZ2EgbmrDq3JhLXRqZXRyYSBkaGUga2EgbmrDqyBsaWRoamUgb3NlIG5kaWtpbSB0w6sgbmTDq3JzamVsbMOrLg0KDQoNCmBgYHtyfQ0KbW9zYWljcGxvdCh0KFRhYl9rb250aWdqZW5jZTMpLCBjb2w9YygicGluayIsInR1cnF1b2lzZSIpLCBjZXguYXhpcyA9IDAuOCwgbGFzPTEsIHN1Yj0iR2ppbmlhIiwgeWxhYj0iUHJvZmVzaW9uZXQiLCBtYWluPSIiKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpkZjQ8LXN0dWRlbnRfc2NvcmVzICU+JSBkcGx5cjo6c2VsZWN0KHBhcnRfdGltZV9qb2IsZXh0cmFjdXJyaWN1bGFyX2FjdGl2aXRpZXMpDQpoZWFkKGRmNCkNCmBgYA0KYGBge3J9DQoja3Jpam9qbWUgdGFiZWxlbiBlIGtvbnRpZ2plbmNlcyBkdWtlIHBlcmRvcnVyIGZ1bmtzaW9uaW4gdGFibGUNClRhYl9rb250aWdqZW5jZTQ8LXRhYmxlKGRmNCRwYXJ0X3RpbWVfam9iLGRmNCRleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcykNClRhYl9rb250aWdqZW5jZTQNCmBgYA0KVGFiZWxhIHRyZWdvbiBtYXJyw6tkaMOrbmllbiBtaWRpcyBwdW7Dq3MgbWUga29ow6sgdMOrIHBqZXNzaG1lIGRoZSBwamVzw6ttYXJyamVzIG7DqyBha3Rpdml0ZXRlIGphc2h0w6trdXJyaWt1bGFyZS5LYSAxMzM4IHJhc3RlIGt1IGluZGl2aWTDq3QgbnVrIGthbsOrIGFzIHB1bsOrIG1lIGtvaMOrIHTDqyBwamVzc2htZSBhcyBwamVzw6ttYXJyamUgbsOrIGFrdGl2aXRldGUgamFzaHTDq2t1cnJpa3VsYXJlLCAzNDYgcmFzdGUga3UgbnVrIGthbsOrIHB1bsOrIHBvciBtYXJyaW4gcGplc8OrIG7DqyBha3Rpdml0ZXRlLCAyNTQgcmFzdGUga3Uga2Fuw6sgcHVuw6sgcG9yIG51ayBtYXJyaW4gcGplc8OrLCBkaGUgNjIgcmFzdGUga3Uga2Fuw6sgdMOrIGR5amEuDQpEdWtldCBzZSBrYSBtw6sgc2h1bcOrIGluZGl2aWTDqyBxw6sgbnVrIGthbsOrIHB1bsOrIG1lIGtvaMOrIHTDqyBwamVzc2htZSBkaGUgYXMgbnVrIG1hcnJpbiBwamVzw6sgbsOrIGFrdGl2aXRldGUgamFzaHTDq2t1cnJpa3VsYXJlLg0KDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShUYWJfa29udGlnamVuY2U0LG1hcmdpbj0xKSU+JXJvdW5kKDIpDQpgYGANCmBgYHtyfQ0KcHJvcC50YWJsZShUYWJfa29udGlnamVuY2U0KSU+JXJvdW5kKDIpDQpgYGANCmBgYHtyfQ0KSF8yLjQ8LWNoaXNxLnRlc3QoVGFiX2tvbnRpZ2plbmNlNCkNCkhfMi40DQpIXzIuNCRvYnNlcnZlZA0KSF8yLjQkZXhwZWN0ZWQNCmBgYA0KIFZsZXJhIGUgbGxvZ2FyaXR1ciBlIFgta2F0cm9yZSDDq3NodMOrIDAuMDg5Mjc3LCBlIGNpbGEgw6tzaHTDqyBzaHVtw6sgZSB1bMOrdCwgZHVrZSB0cmVndWFyIHNlIG51ayBrYSBkYWxsaW0gdMOrIG1hZGggbWlkaXMgZnJla3VlbmNhdmUgdMOrIHbDq3poZ3VhcmEgZGhlIGF0eXJlIHTDqyBwcml0dXJhLg0KVGVzdGkga2EgdmV0w6ttIDEgZ3JhZMOrIGxpcmllLCBxw6sgw6tzaHTDqyB0aXBpa2UgcMOrciBuasOrIHRhYmVsw6sga29udGluZ2plbmNlIDJ4Mi4NClZsZXJhIHAgw6tzaHTDqyAwLjc2NTEsIGUgY2lsYSDDq3NodMOrIHNodW3DqyBtw6sgZSBsYXJ0w6sgc2Ugbml2ZWxpIHN0YW5kYXJkIGkgcsOrbmTDq3Npc8OrIHByZWogMC4wNS4NClJlenVsdGF0ZXQgdHJlZ29qbmUgc2UgbnVrIGthIG5qw6sgbGlkaGplIHTDqyByw6tuZMOrc2lzaG1lIG1pZGlzIHZhcmlhYmxhdmUuDQoNCg0KYGBge3J9DQptb3NhaWNwbG90KHQoVGFiX2tvbnRpZ2plbmNlNCksIGNvbD1jKCJwdXJwbGUiLCJncmF5IiksIGNleC5heGlzID0gMSxzdWI9InBhcnRfdGltZV9qb2IiLHlsYWI9IkFrdGl2aXRldGV0IGphc2h0c2hrb2xsb3JlIixtYWluPSIiKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpkZjU8LXN0dWRlbnRfc2NvcmVzICU+JSBkcGx5cjo6c2VsZWN0KHBhcnRfdGltZV9qb2IsY2FyZWVyX2FzcGlyYXRpb24pDQpoZWFkKGRmNSkNCmBgYA0KYGBge3J9DQoja3Jpam9qbWUgdGFiZWxlbiBlIGtvbnRpZ2plbmNlcyBkdWtlIHBlcmRvcnVyIGZ1bmtzaW9uaW4gdGFibGUNClRhYl9rb250aWdqZW5jZTU8LXRhYmxlKGRmNSRjYXJlZXJfYXNwaXJhdGlvbixkZjUkcGFydF90aW1lX2pvYikNClRhYl9rb250aWdqZW5jZTUNCmBgYA0KKk5nYSB0ZSBkaGVuYXQgdG9uYSBuZSB0YWJlbGUgbmUgc2hvZmltIHNlIHBqZXNhIG1lIGUgbWFkaGUgZSBzdHVkZW50ZXZlIHFlIG51ayBrYW5lIHBhcnQgdGltZSBqb2IgYXNwaXJvam5lIHRlIGJlaGVuIHNvZnR3YXJlIGVuZ2luZWVyLk5kZXJzYSBhdGEgc3R1ZGVudCBxZSBrYW5lIHBhcnQgdGltZSBqb2IgYXNwaXJvam5lIHRlIGJlaGVuIGJ1c2luZXNzIG93bmVyLk5lIG5qZSBwamVzZSB0ZSBtaXJlIHRlIHByb2Zlc2lvbmV2ZSB2aWhlbiByZSBkYWxsaW1lIHRlIG1lZGhhIG1lcyBzdHVkZW50ZXZlIHFlIHB1bm9qbmUgZSBudWsgcHVub2puZSBwYXJ0LXRpbWUuDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KcHJvcC50YWJsZShUYWJfa29udGlnamVuY2U1LG1hcmdpbj0xKSU+JXJvdW5kKDIpDQpgYGANCmBgYHtyfQ0KcHJvcC50YWJsZShUYWJfa29udGlnamVuY2U1KSU+JXJvdW5kKDIpDQpgYGANCmBgYHtyfQ0KSF8yLjU8LWNoaXNxLnRlc3QoVGFiX2tvbnRpZ2plbmNlNSkNCkhfMi41DQpIXzIuNSRvYnNlcnZlZA0KSF8yLjUkZXhwZWN0ZWQNCmBgYA0KKlRlc3RpIENoaS1zcXVhcmVkIGthIHByb2RodWFyIG5qw6sgdmxlcsOrIHTDqyBYLXNxdWFyZWQgcHJlaiAzNjUuOTkgbWUgc2hrYWxsZSBsaXJpZSAxNiBkaGUgbmrDqyB2bGVyw6sgcCA8IDIuMmUtMTYNCipOasOrIHZsZXLDqyBwIGthcSBlIHVsw6t0IHRyZWdvbiBzZSBrYSBuasOrIG5kcnlzaGltIHN0YXRpc3Rpa2lzaHQgdMOrIHLDq25kw6tzaXNow6ttIG1pZGlzIGZyZWt1ZW5jYXZlIHTDqyB2w6t6aGd1YXJhIGRoZSBhdHlyZSB0w6sgcHJpdHVyYSwgZHVrZSBzdWdqZXJ1YXIgbmrDqyBsaWRoamUgIHTDqyBmb3J0w6sgbWlkaXMgdmFyaWFibGF2ZSB0w6sgdGVzdHVhcmEuS2pvIGRvIHTDqyB0aG90w6sgc2UgdmFyaWFibGF0IHHDqyBqYW7DqyB0ZXN0dWFyIG51ayBqYW7DqyB0w6sgcGF2YXJ1cmEgbmdhIG5qw6tyYS10amV0cmEgZGhlIGthIG5qw6sgbGlkaGplIG9zZSBuZGlraW0gdMOrIG5kw6tyc2plbGzDqy4NCg0KDQpgYGB7cn0NCm1vc2FpY3Bsb3QodChUYWJfa29udGlnamVuY2U1KSwgY29sPWMoInJlZCIsImdyYXkiKSwgY2V4LmF4aXMgPSAwLjgsIGxhcz0xLCBzdWI9IkFrdGl2aXRldGV0IGphc2h0ZXNoa29sbG9yZSIsIHlsYWI9IlByb2Zlc2lvbmV0IiwgbWFpbj0iIikNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KZGY2PC1zdHVkZW50X3Njb3JlcyAlPiUgZHBseXI6OnNlbGVjdChleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcyxjYXJlZXJfYXNwaXJhdGlvbikNCmhlYWQoZGY2KQ0KYGBgDQpgYGB7cn0NCiNrcmlqb2ptZSB0YWJlbGVuIGUga29udGlnamVuY2VzIGR1a2UgcGVyZG9ydXIgZnVua3Npb25pbiB0YWJsZQ0KVGFiX2tvbnRpZ2plbmNlNjwtdGFibGUoZGY2JGNhcmVlcl9hc3BpcmF0aW9uLGRmNiRleHRyYWN1cnJpY3VsYXJfYWN0aXZpdGllcykNClRhYl9rb250aWdqZW5jZTYNCmBgYA0KKk5nYSB0ZSBkaGVuYXQgdG9uYSBuZSB0YWJlbGUgbmUgc2hvZmltIHNlIHBqZXNhIG1lIGUgbWFkaGUgZSBzdHVkZW50ZXZlIHFlIG51ayBtZXJyZW4gZGhlIHFlIG1lcnJlbiBtZSBha3Rpdml0ZXRlIGphc2h0ZXNoa29sbG9yZSBhc3Bpcm9qbmUgdGUgYmVoZW4gU29mdHdhcmUgRW5naW5lZXIgZGhlIEJ1c2luZXNzIE93bmVyLlBqZXNhIG1lIGUgdm9nZWwgZSBzdHVkZW50ZXZlIHFlIG1lcnJlbiBtZSBha3Rpdml0ZXRlIGphc2h0ZXNoa29sbG9yZSBhc3Bpcm9qZSB0ZSBiZWhlbiB3cml0ZXIgZGhlIGRlc2lnbmVyLg0KDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCnByb3AudGFibGUoVGFiX2tvbnRpZ2plbmNlNixtYXJnaW49MSklPiVyb3VuZCgyKQ0KYGBgDQpgYGB7cn0NCnByb3AudGFibGUoVGFiX2tvbnRpZ2plbmNlNiklPiVyb3VuZCgyKQ0KYGBgDQpgYGB7cn0NCkhfMi42PC1jaGlzcS50ZXN0KFRhYl9rb250aWdqZW5jZTYpDQpIXzIuNg0KSF8yLjYkb2JzZXJ2ZWQNCkhfMi42JGV4cGVjdGVkDQpgYGANCipUZXN0aSBDaGktc3F1YXJlZCBrYSBwcm9kaHVhciBuasOrIHZsZXLDqyB0w6sgWC1zcXVhcmVkIHByZWogIDI3LjI0MyBtZSBzaGthbGxlIGxpcmllIDE2IGRoZSBuasOrIHZsZXLDqyBwPSAwLjAzODg2DQoqTmrDqyB2bGVyw6sgcCBrYXEgZSB1bMOrdCB0cmVnb24gc2Uga2EgbmrDqyBuZHJ5c2hpbSBzdGF0aXN0aWtpc2h0IHTDqyByw6tuZMOrc2lzaMOrbSBtaWRpcyBmcmVrdWVuY2F2ZSB0w6sgdsOremhndWFyYSBkaGUgYXR5cmUgdMOrIHByaXR1cmEsIGR1a2Ugc3VnamVydWFyIG5qw6sgbGlkaGplICB0w6sgZm9ydMOrIG1pZGlzIHZhcmlhYmxhdmUgdMOrIHRlc3R1YXJhLktqbyBkbyB0w6sgdGhvdMOrIHNlIHZhcmlhYmxhdCBxw6sgamFuw6sgdGVzdHVhciBudWsgamFuw6sgdMOrIHBhdmFydXJhIG5nYSBuasOrcmEtdGpldHJhIGRoZSBrYSBuasOrIGxpZGhqZSBvc2UgbmRpa2ltIHTDqyBuZMOrcnNqZWxsw6suDQoNCg0KYGBge3J9DQptb3NhaWNwbG90KHQoVGFiX2tvbnRpZ2plbmNlNiksIGNvbD1jKCIjZmZiZjAwIiwiI2E0YzYzOSIpLCBjZXguYXhpcyA9IDAuOCwgbGFzPTEsIHN1Yj0iQWt0aXZpdGV0ZXQgamFzaHRlc2hrb2xsb3JlIiwgeWxhYj0iUHJvZmVzaW9uZXQiLCBtYWluPSIiKQ0KYGBgDQojIyMgKipgciBjb2xvcmlzZSgiTmRlcnRpbWkgaSBtb2RlbGl0IHRlIHJlZ3Jlc2l0IGxpbmVhciIsIiMyMjhiMjIiKWAqKg0KYGBge3J9DQpsaWJyYXJ5KGNvcnJlbGF0aW9uKQ0KY29ycmVsYXRpb24gKHN0dWRlbnRfc2NvcmVzKQ0KYGBgDQoNCg0KTmUga2VtaSB6Z2plZGh1ciB0ZSBzaHF5cnRvam1lIG1hcnJlZGhlbmllbiBtZXMgd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMgZGhlIHBpa2V2ZSB0ZSBtYXJyYSBuZSBwcm92aW1lIHRlIGxlbmRldmUgc2k6IG1hdGVtYXRpa2EsIGFuZ2xpc2h0amEsIGhpc3RvcmlhLCBnamVvZ3JhZmlhLCBmaXppa2EsIGtpbWlhIGUgYmlvbG9namlhLiANCg0KU2kgZmlsbGltIG5kZXJ0b2ptZSBuamUgZ3JhZmlrIHRlICJ3ZWVrbHktc2VsZi1zdHVkeS1ob3VycyIgZGhlICJtYXRoLXNjb3JlIiBkaGUgZ2plam1lIGtvZWZpY2llbnRpbiBlIGtvcnJlbGFjaW9uaXQgbmRlcm1qZXQgdHlyZS4NCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMsIGFlcyh4ID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsIHkgPSBtYXRoX3Njb3JlKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiKSArIA0KICBsYWJzKHggPSAiT3JldCBqYXZvcmUgdGUgc3R1ZGltaXQiLCB5ID0gIlJlenVsdGF0aSBuZSBtYXRlbWF0aWtlIikgDQpgYGANCg0KTmVwZXJtamV0IHBhcmFxaXRqZXMgZ3JhZmlrZSB2ZXJlam1lIHNlIHBqZXNhIG1lIGUgbWFkaGUgZSBwaWthdmUgZXNodGUgZSBzaHBlcm5kYXJlIG5lIGZvcm1lIHJlamUgZ2plIHFlIHRyZWdvbiBzZSBtdW5kIHRlIGVremlzdG9qZSBuamUgbGlkaGplIG5kZXJtamV0IHR5cmUuIE1lIHBvc2h0ZSBkbyB0ZSBuZGVydG9qbWUgbmplIG1vZGVsIHBlcm1lcyBzZSBjaWxpdCBkbyB0ZSBuZGVydG9qbWUgZWt1YWNpb25pbiBlIGRyZWp0ZXplcyBzZSByZWdyZXNpdC4NCg0KYGBge3J9DQptb2RlbGlfMzwtbG0obWF0aF9zY29yZX53ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgZGF0YT1zdHVkZW50X3Njb3JlcykNCm1vZGVsaV8zDQpgYGANCg0KS2pvIGZvcm11bGUgbXVuZCB0ZSBpbnRlcnByZXRvaGV0IG5kcnlzaGUgcGVyIGNkbyBuamVzaSB0ZSBvcmV2ZSBqYXZvcmUgdGUgc3R1ZGltaXQga2VtaSAwLjQyOTEgcnJpdGplICB0ZSBuamVzaXNlIHNlIHBpa2V2ZSBuZSBwcm92aW1pbiBlIG1hdGVtYXRpa2VzDQoNCiQkbWF0aC1zY29yZSA9IDAuNDI5MSp3ZWVrbHktc2VsZi1zdHVkeS1ob3Vycys3NS44MzMwJCQgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3B1YnIpDQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMsYWVzKHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzLHk9bWF0aF9zY29yZSkpK2dlb21fcG9pbnQoc2l6ZT0xLGNvbG9yPSJyZWQiKStnZW9tX3Ntb290aChtZXRob2Q9bG0sZm9ybXVsYT15fngsY29sb3I9Im9yYW5nZSIpK3N0YXRfY29yKGxhYmVsLnggPTIsbGFiZWwueT03LjUpK3N0YXRfcmVnbGluZV9lcXVhdGlvbihsYWJlbC54PTgsbGFiZWwueT0xLHNpemU9NCkrbGFicyh4PSJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIseT0iUmV6dWx0YXRpIG5lIG1hdGVtYXRpa2UiLHRpdGxlPSIiKQ0KYGBgDQoNClZsZXJhIGUga29yZWxhY2lvbml0IHTDqyBkaMOrbsOrIG7Dq24gZ3JhZmlrLCBSID0gMC4zOSwgdHJlZ29uIG5qw6sgbWFycsOrZGjDq25pZSBwb3ppdGl2ZSBtZXMgb3LDq3ZlIHTDqyBzdHVkaW1pdCBkaGUgcmV6dWx0YXRldmUgbsOrIG1hdGVtYXRpa8OrLg0KR3JhZmlrdSB0cmVnb24gbmrDqyB0ZW5kZW5jw6sgcG96aXRpdmUuIEtqbyBkbyB0w6sgdGhvdMOrIHNlIHNhIG3DqyBzaHVtw6sgb3LDqyBzdHVkaW1pIG7DqyBqYXbDqywgYXEgbcOrIHTDqyBsYXJ0YSBqYW7DqyByZXp1bHRhdGV0IG7DqyBtYXRlbWF0aWvDqy4gS2pvIMOrc2h0w6sgZSBkdWtzaG1lIG5nYSB2aWphIGUgcmVncmVzaW9uaXQgccOrIHJyaXRldCBtZSBycml0amVuIGUgb3LDq3ZlIHTDqyBzdHVkaW1pdA0KDQpgYGB7cn0NCmNvcihzdHVkZW50X3Njb3JlcyR3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycyxzdHVkZW50X3Njb3JlcyRtYXRoX3Njb3JlKQ0KDQpgYGANCg0KTmVwZXJtamV0IGZ1bmtzaW9uaXQgY29yIGdqZWptZSB2bGVyZW4gZSBrb2VmaWNpZW50aXQgdGUga29ycmVsYWNpb25pdC4gTWVzYSBzaG9oaW0ga2pvIHZsZXJlIGVzaHRlIHBveml0aXZlLCBnamUgcWUgdHJlZ29uIHBlciBuamUgbWFycmVkaGVuaWUgdGUgZHJlanRlIG1lcyBkeSBuZHJ5c2hvcmV2ZSwgcHJhIG1lIHJyaXRqZW4gZSBuamVyZXMgcnJpdGV0IGRoZSB0amV0cmEuDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbGlfMykNCmBgYA0KDQpWbGVyYSBtaW5pbWFsZSBlIHZhcmlhYmzDq3MgdMOrIHZhcnVyIMOrc2h0w6sgLTM3Ljk3OS5WbGVyYSBtYWtzaW1hbGUgZSB2YXJpYWJsw6tzIHTDqyB2YXJ1ciDDq3NodMOrIDI0LjE2Ny5WbGVyYSBlIG1lZGlhbml0IMOrc2h0w6sgMS42NDguICBLam8gZG8gdMOrIHRob3TDqyBzZSBnanlzbWEgZSBzdHVkZW50w6t2ZSBrYW7DqyBuasOrIHJlenVsdGF0IG1hdGVtYXRpa8OrIG3DqyB0w6sgdWzDq3Qgc2UgMS42NDggcGlrw6sgZGhlIGdqeXNtYSB0amV0w6tyIGthIG5qw6sgcmV6dWx0YXQgbcOrIHTDqyBsYXJ0w6suIEt1YXJ0aWxpIGkgcGFyZSDDq3NodMOrIC03LjI3MSwgbmTDq3JzYSBrdWFydGlsaSBpIHRyZXRlIMOrc2h0w6sgOC44NzEgLlZsZXJhIGUgcC12bGVyZXMgZXNodGUgbWUgZSB2b2dlbCBzZSAwLjA1IGdqZSBxZSBuYSB0cmVnb24gbmplIGxpZGhqZSB0ZSByZW5kZXNpc2htZSBzdGF0aXN0aWtvcmUgbmRlcm1qZXQgbmRyeXNob3JldmUNClJlc2lkdWFsIHN0YW5kYXJkIGVycm9yIGVzaHRlICBlIHZvZ2VsZ2plIHFlIG5hIHRyZWdvbiBzZSB2bGVyYXQgcWUgamVwIG1vZGVsaSBqYW5lIGFmZXIgdmxlcmF2ZSByZWFsZS4gUGVybWVzIFItc3F1YXJlZCBrdXB0b2ptZSBzZSAxNS40NSUgZSB0ZSBkaGVuYXZlIHNocGplZ29oZW4gbmdhIG1vZGVsaS4NCg0KYGBge3J9DQp2ZWt0b3JpMjwtZml0dGVkLnZhbHVlcyhtb2RlbGlfMykNClZpZXcodmVrdG9yaTIpDQpwcmVkaWN0KG1vZGVsaV8zLCBsaXN0KHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzPWMoMSwyLDMsNCw1KSkpDQpgYGANCg0KTWUgc2lwZXIgamFuZSBkaXNhIHZsZXJhIHRlIHBhcmFzaGlrdWFyYSB0ZSBtb2RlbGl0IGR1a2UgZGhlbmUgZGlzYSB2bGVyYSB0ZSBuZHJ5c2hvcmVzIHNlIHBhdmFydXIuDQoNCmBgYHtyfQ0KbWJldGpldDwtcmVzaWR1YWxzKG1vZGVsaV8zKQ0Kc3VtKG1iZXRqZXQpDQpgYGANCg0KTWJldGphIGVzaHRlIGRpc3RhbmNhIG5kZXJtamV0IHZsZXJlcyBha3R1YWxlIGRoZSBhc2FqIHFlIGplcCBtb2RlbGkgcWUga2VtaSBuZGVydHVhci4NCg0KYGBge3J9DQpwYXIobWZyb3c9YygyLDIpKQ0KcGxvdChtb2RlbGlfMykNCnBhcihtZnJvdz1jKDEsMSkpDQpgYGANCg0KR3JhZmlrdSBpIHBhcmUgbmEgdHJlZ29uIHFlIGtlbWkgbmplIHZhcmVzaSBsaW5lYXJlIG5kZXJtamV0IHRlIGRoZW5hdmUgdG9uYSBkaGUgZGV2aWppbWkgc3RhbmRhcmQgZXNodGUgcG90aHVhanNlIGtvbnN0YW50Lg0KR3JhZmlrdSBpIDIgTm9ybWFsIFEtUSBwZXJkb3JldCBwZXIgdGUgdHJlZ3VhciBuZXNlIHRlIGRoZW5hdCB0b25hIGphbmUgbmdhIG5qZSBzaHBlcm5kYXJqZSBub3JtYWxlLiBQaWthdCBuZSBrZXRlIHJhc3Qgc2h0cmloZW4gbmUgbmplIHZpamUgdGUgZHJlanRlIGRpYWdvbmFsZSwgcHJhIHRlIGRoZW5hdCB0b25lIHZpam5lIG5nYSBuamUgc2hwZXJuZGFyamUgbm9ybWFsZS4NCk5lIGdyYWZpa3VuIGUgdHJldGUsIG5lIGRhbGxpbSBuZ2EgZ3JhZmlrdSBpIHBhcmUgbmUgYm9zaHRpbiB2ZXJ0aWthbCBrZW1pIG1iZXRqZXQgZSBzdGFuZGFydGl6dWFyYS5QbyB0ZSBzaG9oaW0gdmlqZW4gZSBrdXFlIGFqbyBlc2h0ZSB6YnJpdGVzZSAgcHJhIG1lIHJyaXRqZW4gZSB2bGVyYXZlIHRlIHBlcmFmcnVhcmEga2VtaSBuamUgcmVuaWUgdGUgbWJldGpldmUuDQpOZSBncmFmaWt1biBlIGthdGVydCBrZW1pIG5qZSB2aWplIHFlIHF1aGV0IENvb2sncyBkaXN0YW5jZSwgbmdhIGUgY2lsYSBuZXNlIGtlbWkgdmxlcmEgamFzaHRlIHNhaixhdG8ga2FuZSBuZGlraW0gdGUgbWFkaCBuZSBrb2VmaWNpZW50ZXQgZSBtb2RlbGl0IGUgbmVzZSBpIGhlcWltIGtldG8gdmxlcmEsIG1vZGVsaSBkbyBwZXNvbnRlIG5kcnlzaGltZSB0ZSBtZWRoYS4NCg0KDQoNCk5kZXJ0b2ptZSBuamUgZ3JhZmlrIHRlICJ3ZWVrbHktc2VsZi1zdHVkeS1ob3VycyIgZGhlICJwaHlzaWNzX3Njb3JlIiBkaGUgZ2plam1lIGtvZWZpY2llbnRpbiBlIGtvcnJlbGFjaW9uaXQgbmRlcm1qZXQgdHlyZS4NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChzdHVkZW50X3Njb3JlcywgYWVzKHggPSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgeSA9IHBoeXNpY3Nfc2NvcmUpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsgDQogIGxhYnMoeCA9ICJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIsIHkgPSAiUmV6dWx0YXRpIG5lIGZpemlrIikgDQpgYGANCk5lcGVybWpldCBwYXJhcWl0amVzIGdyYWZpa2UgdmVyZWptZSBzZSBwamVzYSBtZSBlIG1hZGhlIGUgcGlrYXZlIGVzaHRlIGUgc2hwZXJuZGFyZSBuZSBmb3JtZSByZWplIGdqZSBxZSB0cmVnb24gc2UgbXVuZCB0ZSBla3ppc3RvamUgbmplIGxpZGhqZSBuZGVybWpldCB0eXJlLiBNZSBwb3NodGUgZG8gdGUgbmRlcnRvam1lIG5qZSBtb2RlbCBwZXJtZXMgc2UgY2lsaXQgZG8gdGUgbmRlcnRvam1lIGVrdWFjaW9uaW4gZSBkcmVqdGV6ZXMgc2UgcmVncmVzaXQuDQoNCmBgYHtyfQ0KbW9kZWxpXzQ8LWxtKHBoeXNpY3Nfc2NvcmV+d2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsIGRhdGE9c3R1ZGVudF9zY29yZXMpDQptb2RlbGlfNA0KYGBgDQoNCktqbyBmb3JtdWxlIG11bmQgdGUgaW50ZXJwcmV0b2hldCBuZHJ5c2hlIHBlciBjZG8gbmplc2kgdGUgb3JldmUgamF2b3JlIHRlIHN0dWRpbWl0IGtlbWkgMC4yMDg5ICBycml0amUgIHRlIG5qZXNpc2Ugc2UgcGlrZXZlIG5lIHByb3ZpbWluIGUgZml6aWtlcyBkaGUgcGVyIGtldGUgbmEgbmRpaG1vaSBuZGVydGltaSBpIG1vZGVsaXQgcGVyIDIgbmRyeXNob3JldCBrdSBrb2VmaWNpZW50aSBwcmFuZSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycyBlc2h0ZSAwLjIwODkgZGhlIG9yZGluYXRhIDc3LjYyNjUuIE1lIHBvc2h0ZSBqZXBldCBuZGVydGltaSBpIGRyZWp0ZXplcyBzZSByZWdyZXNpdC4gSW50ZXJwcmV0aW1pIEkgZm9ybXVsZXMNCg0KICAkJHBoeXNpY3Mtc2NvcmU9IDAuMjA4OSp3ZWVrbHktc2VsZi1zdHVkeS1ob3Vycys3Ny42MjY1JCQNCmBgYHtyfQ0KbGlicmFyeShnZ3B1YnIpDQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMsYWVzKHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzLHk9cGh5c2ljc19zY29yZSkpK2dlb21fcG9pbnQoc2l6ZT0xLGNvbG9yPSJyZWQiKStnZW9tX3Ntb290aChtZXRob2Q9bG0sZm9ybXVsYT15fngsY29sb3I9Im9yYW5nZSIpK3N0YXRfY29yKGxhYmVsLnggPTIsbGFiZWwueT03LjUpK3N0YXRfcmVnbGluZV9lcXVhdGlvbihsYWJlbC54PTgsbGFiZWwueT0xLHNpemU9NCkrbGFicyh4PSJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIseT0iUmV6dWx0YXRpIG5lIGZpemlrIix0aXRsZT0iIikNCmBgYA0KDQpHcmFmaWt1IHRyZWdvbiBuasOrIHRlbmRlbmPDqyBwb3ppdGl2ZS4gS2pvIGRvIHTDqyB0aG90w6sgc2Ugc2EgbcOrIHNodW3DqyBvcsOrIHN0dWRpbWkgbsOrIGphdsOrLCBhcSBtw6sgdMOrIGxhcnRhIGphbsOrIHJlenVsdGF0ZXQgbsOrIGZpemlrZS4gS2pvIMOrc2h0w6sgZSBkdWtzaG1lIG5nYSB2aWphIGUgcmVncmVzaW9uaXQgccOrIHJyaXRldCBtZSBycml0amVuIGUgb3LDq3ZlIHTDqyBzdHVkaW1pdC4gUGlrYSB0w6sgc2hww6tybmRhcmEgcnJldGggdmlqw6tzIHPDqyByZWdyZXNpb25pdCB0cmVnb2puw6sgdmFyaWFiaWxpdGV0aW4gZSByZXp1bHRhdGV2ZS4gRGlzYSBzdHVkZW50w6sga2Fuw6sgcmV6dWx0YXRlIHTDqyBsYXJ0YSBlZGhlIHBzZSBudWsgc3R1ZGlvam7DqyBzaHVtw6ssIG5kw6tyc2EgdMOrIHRqZXLDqyBrYW7DqyByZXp1bHRhdGUgdMOrIHVsw6t0YSBlZGhlIHBzZSBzdHVkaW9qbsOrIHNodW3Dqy4gRGlzYSBwaWvDqyBqYW7DqyBsYXJnIHZpasOrcyBzw6sgcmVncmVzaW9uaXQuIEvDq3RvIGphbsOrIHJhc3RlIGt1IHN0dWRlbnTDq3Qga2Fuw6sgcmV6dWx0YXRlIHTDqyBuZHJ5c2htZSBuZ2EgcHJpdHNobcOrcml0w6sgZSB2aWrDq3Mgc8OrIHJlZ3Jlc2lvbml0LiBNdW5kIHTDqyBqZW7DqyBmYWt0b3LDqyB0w6sgdGplcsOrIHHDqyBuZGlrb2puw6sgbsOrIHJlenVsdGF0ZSwgcMOrcnZlw6cgb3LDq3ZlIHTDqyBzdHVkaW1pdC4NCg0KYGBge3J9DQpjb3Ioc3R1ZGVudF9zY29yZXMkd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsc3R1ZGVudF9zY29yZXMkcGh5c2ljc19zY29yZSkNCmBgYA0KDQpOZXBlcm1qZXQgZnVua3Npb25pdCBjb3IgZ2plam1lIHZsZXJlbiBlIGtvZWZpY2llbnRpdCB0ZSBrb3JyZWxhY2lvbml0LiBNZXNhIHNob2hpbSBram8gdmxlcmUgZXNodGUgcG96aXRpdmUsIGdqZSBxZSB0cmVnb24gcGVyIG5qZSBtYXJyZWRoZW5pZSB0ZSBkcmVqdGUgbWVzIGR5IG5kcnlzaG9yZXZlLCBwcmEgbWUgcnJpdGplbiBlIG5qZXJlcyBycml0ZXQgZGhlIHRqZXRyYS4NCg0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsaV80KQ0KYGBgDQoNClZsZXJhIG1pbmltYWxlIGUgdmFyaWFibMOrcyB0w6sgdmFydXIgw6tzaHTDqyAtMjguNjcxLlZsZXJhIG1ha3NpbWFsZSBlIHZhcmlhYmzDq3MgdMOrIHZhcnVyIMOrc2h0w6sgMjIuMzczLlZsZXJhIGUgbWVkaWFuaXQgw6tzaHTDqyAxLjQ0OC4gIEtqbyBkbyB0w6sgdGhvdMOrIHNlIGdqeXNtYSBlIHN0dWRlbnTDq3ZlIGthbsOrIG5qw6sgcmV6dWx0YXQgbWF0ZW1hdGlrw6sgbcOrIHTDqyB1bMOrdCBzZSAxLjQ0OCBwaWvDqyBkaGUgZ2p5c21hIHRqZXTDq3Iga2EgbmrDqyByZXp1bHRhdCBtw6sgdMOrIGxhcnTDqy4gS3VhcnRpbGkgaSBwYXJlIMOrc2h0w6sgLTkuODM5LCBuZMOrcnNhIGt1YXJ0aWxpIGkgdHJldGUgw6tzaHTDqyAxMC4zNDguLlZsZXJhIGUgcC12bGVyZXMgZXNodGUgbWUgZSB2b2dlbCBzZSAwLjA1IGdqZSBxZSBuYSB0cmVnb24gbmplIGxpZGhqZSB0ZSByZW5kZXNpc2htZSBzdGF0aXN0aWtvcmUgbmRlcm1qZXQgbmRyeXNob3JldmUNClJlc2lkdWFsIHN0YW5kYXJkIGVycm9yIGVzaHRlICBlIHZvZ2VsIGdqZSBxZSBuYSB0cmVnb24gc2UgdmxlcmF0IHFlIGplcCBtb2RlbGkgamFuZSBhZmVyIHZsZXJhdmUgcmVhbGUuIFBlcm1lcyBSLXNxdWFyZWQga3VwdG9qbWUgc2UgNC4wMzclIGUgdGUgZGhlbmF2ZSBzaHBqZWdvaGVuIG5nYSBtb2RlbGkuDQoNCmBgYHtyfQ0KdmVrdG9yaTM8LWZpdHRlZC52YWx1ZXMobW9kZWxpXzQpDQpWaWV3KHZla3RvcmkzKQ0KcHJlZGljdChtb2RlbGlfNCwgbGlzdCh3ZWVrbHlfc2VsZl9zdHVkeV9ob3Vycz1jKDEsMiwzLDQsNSkpKQ0KYGBgDQoNCk1lIHNpcGVyIGphbmUgZGlzYSB2bGVyYSB0ZSBwYXJhc2hpa3VhcmEgdGUgbW9kZWxpdCBkdWtlIGRoZW5lIGRpc2EgdmxlcmEgdGUgbmRyeXNob3JlcyBzZSBwYXZhcnVyLg0KDQpgYGB7cn0NCm1iZXRqZXQ8LXJlc2lkdWFscyhtb2RlbGlfNCkNCnN1bShtYmV0amV0KQ0KYGBgDQoNCk1iZXRqYSBlc2h0ZSBkaXN0YW5jYSBuZGVybWpldCB2bGVyZXMgYWt0dWFsZSBkaGUgYXNhaiBxZSBqZXAgbW9kZWxpIHFlIGtlbWkgbmRlcnR1YXIuDQoNCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwyKSkNCnBsb3QobW9kZWxpXzQpDQpwYXIobWZyb3c9YygxLDEpKQ0KYGBgDQoNCkdyYWZpa3UgaSBwYXJlIG5hIHRyZWdvbiBxZSBrZW1pIG5qZSB2YXJlc2kgbGluZWFyZSBuZGVybWpldCB0ZSBkaGVuYXZlIHRvbmEgZGhlIGRldmlqaW1pIHN0YW5kYXJkIGVzaHRlIGtvbnN0YW50IHBvdGh1YWpzZShtYmV0amV0IGRoZSB2bGVyYXQgZSBwZXJhZnJ1YXJhIGpvIHRlIGtvcnJlbHVhcmEpLCBwcmEga2VtaSBob21vc2tlZGFzdGljaXRldC4NCkdyYWZpa3UgaSAyIE5vcm1hbCBRLVEgcGVyZG9yZXQgcGVyIHRlIHRyZWd1YXIgbmVzZSB0ZSBkaGVuYXQgdG9uYSBqYW5lIG5nYSBuamUgc2hwZXJuZGFyamUgbm9ybWFsZS4gUGlrYXQgbmUga2V0ZSByYXN0IHNodHJpaGVuIG5lIG5qZSB2aWplIHRlIGRyZWp0ZSBkaWFnb25hbGUsIHByYSB0ZSBkaGVuYXQgdG9uZSB2aWpuZSBuZ2EgbmplIHNocGVybmRhcmplIG5vcm1hbGUuDQpOZSBncmFmaWt1biBlIHRyZXRlLCBuZSBkYWxsaW0gbmdhIGdyYWZpa3UgaSBwYXJlIG5lIGJvc2h0aW4gdmVydGlrYWwga2VtaSBtYmV0amV0IGUgc3RhbmRhcnRpenVhcmEuUG8gdGUgc2hvaGltIHZpamVuIGUga3VxZSBham8gZXNodGUgcmVuZXNlKHpicml0ZXNlKSBwcmEgbWUgcnJpdGplbiBlIHZsZXJhdmUgdGUgcGVyYWZydWFyYSBrZW1pIG5qZSByZW5pZSB0ZSBtYmV0amV2ZSAobnVrIGtlbWkgaG9tb3NrZWRhc3RpY2l0ZXQpLg0KTmUgZ3JhZmlrdW4gZSBrYXRlcnQga2VtaSBuamUgdmlqZSBxZSBxdWhldCBDb29rJ3MgZGlzdGFuY2UsIG5nYSBlIGNpbGEgbmVzZSBrZW1pIHZsZXJhIGphc2h0ZSBzYWosYXRvIGthbmUgbmRpa2ltIHRlIG1hZGggbmUga29lZmljaWVudGV0IGUgbW9kZWxpdCBlIG5lc2UgaSBoZXFpbSBrZXRvIHZsZXJhLCBtb2RlbGkgZG8gcGVzb250ZSBuZHJ5c2hpbWUgdGUgbWVkaGEuDQoNCg0KDQpOZGVydG9qbWUgbmplIGdyYWZpayB0ZSAid2Vla2x5LXNlbGYtc3R1ZHktaG91cnMiIGRoZSAiZW5nbGlzaF9zY29yZSIgZGhlIGdqZWptZSBrb2VmaWNpZW50aW4gZSBrb3JyZWxhY2lvbml0IG5kZXJtamV0IHR5cmUuDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChzdHVkZW50X3Njb3JlcywgYWVzKHggPSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgeSA9IGVuZ2xpc2hfc2NvcmUpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsgDQogIGxhYnMoeCA9ICJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIsIHkgPSAiUmV6dWx0YXRpIG5lIGFuZ2xpc2h0IikNCmBgYA0KDQpOZXBlcm1qZXQgcGFyYXFpdGplcyBncmFmaWtlIHZlcmVqbWUgc2UgcGplc2EgbWUgZSBtYWRoZSBlIHBpa2F2ZSBlc2h0ZSBlIHNocGVybmRhcmUgbmUgZm9ybWUgcmVqZSBnamUgcWUgdHJlZ29uIHNlIG11bmQgdGUgZWt6aXN0b2plIG5qZSBsaWRoamUgbmRlcm1qZXQgdHlyZS4gTWUgcG9zaHRlIGRvIHRlIG5kZXJ0b2ptZSBuamUgbW9kZWwgcGVybWVzIHNlIGNpbGl0IGRvIHRlIG5kZXJ0b2ptZSBla3VhY2lvbmluIGUgZHJlanRlemVzIHNlIHJlZ3Jlc2l0Lg0KDQpgYGB7cn0NCm1vZGVsaV81PC1sbShlbmdsaXNoX3Njb3JlfndlZWtseV9zZWxmX3N0dWR5X2hvdXJzLCBkYXRhPXN0dWRlbnRfc2NvcmVzKQ0KbW9kZWxpXzUNCg0KYGBgDQoNCktqbyBmb3JtdWxlIG11bmQgdGUgaW50ZXJwcmV0b2hldCBuZHJ5c2hlIHBlciBjZG8gbmplc2kgdGUgb3JldmUgamF2b3JlIHRlIHN0dWRpbWl0IGtlbWkgMC4yNDU3ICBycml0amUgIHRlIG5qZXNpc2Ugc2UgcGlrZXZlIG5lIHByb3ZpbWluIGUgYmlvbG9namlzZSBkaGUgcGVyIGtldGUgbmEgbmRpaG1vaSBuZGVydGltaSBpIG1vZGVsaXQgcGVyIDIgbmRyeXNob3JldCBrdSBrb2VmaWNpZW50aSBwcmFuZSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycyBlc2h0ZSAwLjI0NTcgZGhlIG9yZGluYXRhIDc2LjkxNDkuIE1lIHBvc2h0ZSBqZXBldCBuZGVydGltaSBpIGRyZWp0ZXplcyBzZSByZWdyZXNpdC4NCg0KJCRlbmdsaXNoLXNjb3JlID0gMC4yNDU3KndlZWtseS1zZWxmLXN0dWR5LWhvdXJzKzc2LjkxNDkkJA0KYGBge3J9DQpsaWJyYXJ5KGdncHVicikNCmdncGxvdChzdHVkZW50X3Njb3JlcyxhZXMod2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMseT1lbmdsaXNoX3Njb3JlKSkrZ2VvbV9wb2ludChzaXplPTEsY29sb3I9InJlZCIpK2dlb21fc21vb3RoKG1ldGhvZD1sbSxmb3JtdWxhPXl+eCxjb2xvcj0ib3JhbmdlIikrc3RhdF9jb3IobGFiZWwueCA9MixsYWJlbC55PTcuNSkrc3RhdF9yZWdsaW5lX2VxdWF0aW9uKGxhYmVsLng9OCxsYWJlbC55PTEsc2l6ZT00KStsYWJzKHg9Ik9yZXQgamF2b3JlIHRlIHN0dWRpbWl0Iix5PSJSZXp1bHRhdGkgbmUgYW5nbGlzaHQiLHRpdGxlPSIiKQ0KYGBgDQoNCkdyYWZpa3UgdHJlZ29uIG5qw6sgdGVuZGVuY8OrIHBveml0aXZlLiBLam8gZG8gdMOrIHRob3TDqyBzZSBzYSBtw6sgc2h1bcOrIG9yw6sgc3R1ZGltaSBuw6sgamF2w6ssIGFxIG3DqyB0w6sgbGFydGEgamFuw6sgcmV6dWx0YXRldCBuw6sgYW5nbGlzaHQuIEtqbyDDq3NodMOrIGUgZHVrc2htZSBuZ2EgdmlqYSBlIHJlZ3Jlc2lvbml0IHHDqyBycml0ZXQgbWUgcnJpdGplbiBlIG9yw6t2ZSB0w6sgc3R1ZGltaXQuIFBpa2EgdMOrIHNocMOrcm5kYXJhIHJyZXRoIHZpasOrcyBzw6sgcmVncmVzaW9uaXQgdHJlZ29qbsOrIHZhcmlhYmlsaXRldGluIGUgcmV6dWx0YXRldmUuIERpc2Egc3R1ZGVudMOrIGthbsOrIHJlenVsdGF0ZSB0w6sgbGFydGEgZWRoZSBwc2UgbnVrIHN0dWRpb2puw6sgc2h1bcOrLCBuZMOrcnNhIHTDqyB0amVyw6sga2Fuw6sgcmV6dWx0YXRlIHTDqyB1bMOrdGEgZWRoZSBwc2Ugc3R1ZGlvam7DqyBzaHVtw6suIERpc2EgcGlrw6sgamFuw6sgbGFyZyB2aWrDq3Mgc8OrIHJlZ3Jlc2lvbml0LiBLw6t0byBqYW7DqyByYXN0ZSBrdSBzdHVkZW50w6t0IGthbsOrIHJlenVsdGF0ZSB0w6sgbmRyeXNobWUgbmdhIHByaXRzaG3Dq3JpdMOrIGUgdmlqw6tzIHPDqyByZWdyZXNpb25pdC4gTXVuZCB0w6sgamVuw6sgZmFrdG9yw6sgdMOrIHRqZXLDqyBxw6sgbmRpa29qbsOrIG7DqyByZXp1bHRhdGUsIHDDq3J2ZcOnIG9yw6t2ZSB0w6sgc3R1ZGltaXQuDQoNCmBgYHtyfQ0KY29yKHN0dWRlbnRfc2NvcmVzJHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzLHN0dWRlbnRfc2NvcmVzJGVuZ2xpc2hfc2NvcmUpDQpgYGANCg0KTmVwZXJtamV0IGZ1bmtzaW9uaXQgY29yIGdqZWptZSB2bGVyZW4gZSBrb2VmaWNpZW50aXQgdGUga29ycmVsYWNpb25pdC4gTWVzYSBzaG9oaW0ga2pvIHZsZXJlIGVzaHRlIHBveml0aXZlLCBnamUgcWUgdHJlZ29uIHBlciBuamUgbWFycmVkaGVuaWUgdGUgZHJlanRlIG1lcyBkeSBuZHJ5c2hvcmV2ZSwgcHJhIG1lIHJyaXRqZW4gZSBuamVyZXMgcnJpdGV0IGRoZSB0amV0cmEuDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbGlfNSkNCmBgYA0KDQpWbGVyYSBtaW5pbWFsZSBlIHZhcmlhYmzDq3MgdMOrIHZhcnVyIMOrc2h0w6sgLTI4LjE0MyAuVmxlcmEgbWFrc2ltYWxlIGUgdmFyaWFibMOrcyB0w6sgdmFydXIgw6tzaHTDqyAyMS44MzkuVmxlcmEgZSBtZWRpYW5pdCDDq3NodMOrIDEuMzc0LiAgS2pvIGRvIHTDqyB0aG90w6sgc2UgZ2p5c21hIGUgc3R1ZGVudMOrdmUga2Fuw6sgbmrDqyByZXp1bHRhdCBtYXRlbWF0aWvDqyBtw6sgdMOrIHVsw6t0IHNlIDEuMzc0IHBpa8OrIGRoZSBnanlzbWEgdGpldMOrciBrYSBuasOrIHJlenVsdGF0IG3DqyB0w6sgbGFydMOrLiBLdWFydGlsaSBpIHBhcmUgw6tzaHTDqyAtOC4yOTAsIG5kw6tyc2Ega3VhcnRpbGkgaSB0cmV0ZSDDq3NodMOrIDkuNDM4IC5WbGVyYSBlIHAtdmxlcmVzIGVzaHRlIG1lIGUgdm9nZWwgc2UgMC4wNSBnamUgcWUgbmEgdHJlZ29uIG5qZSBsaWRoamUgdGUgcmVuZGVzaXNobWUgc3RhdGlzdGlrb3JlIG5kZXJtamV0IG5kcnlzaG9yZXZlDQpSZXNpZHVhbCBzdGFuZGFyZCBlcnJvciBlc2h0ZSAgZSB2b2dlbCBnamUgcWUgbmEgdHJlZ29uIHNlIHZsZXJhdCBxZSBqZXAgbW9kZWxpIGphbmUgYWZlciB2bGVyYXZlIHJlYWxlLiBQZXJtZXMgUi1zcXVhcmVkIGt1cHRvam1lIHNlIDYuMDkzJSBlIHRlIGRoZW5hdmUgc2hwamVnb2hlbiBuZ2EgbW9kZWxpLg0KDQpgYGB7cn0NCnZla3Rvcmk0PC1maXR0ZWQudmFsdWVzKG1vZGVsaV81KQ0KVmlldyh2ZWt0b3JpNCkNCnByZWRpY3QobW9kZWxpXzUsIGxpc3Qod2Vla2x5X3NlbGZfc3R1ZHlfaG91cnM9YygxLDIsMyw0LDUpKSkNCmBgYA0KDQpNZSBzaXBlciBqYW5lIGRpc2EgdmxlcmEgdGUgcGFyYXNoaWt1YXJhIHRlIG1vZGVsaXQgZHVrZSBkaGVuZSBkaXNhIHZsZXJhIHRlIG5kcnlzaG9yZXMgc2UgcGF2YXJ1ci4NCg0KYGBge3J9DQptYmV0amV0PC1yZXNpZHVhbHMobW9kZWxpXzUpDQpzdW0obWJldGpldCkNCmBgYA0KDQpNYmV0amEgZXNodGUgZGlzdGFuY2EgbmRlcm1qZXQgdmxlcmVzIGFrdHVhbGUgZGhlIGFzYWogcWUgamVwIG1vZGVsaSBxZSBrZW1pIG5kZXJ0dWFyLg0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMikpDQpwbG90KG1vZGVsaV81KQ0KcGFyKG1mcm93PWMoMSwxKSkNCmBgYA0KDQpHcmFmaWt1IGkgcGFyZSBuYSB0cmVnb24gcWUga2VtaSBuamUgdmFyZXNpIGxpbmVhcmUgbmRlcm1qZXQgdGUgZGhlbmF2ZSB0b25hIGRoZSBkZXZpamltaSBzdGFuZGFyZCBlc2h0ZSBrb25zdGFudCBwb3RodWFqc2UobWJldGpldCBkaGUgdmxlcmF0IGUgcGVyYWZydWFyYSBqbyB0ZSBrb3JyZWx1YXJhKSwgcHJhIGtlbWkgaG9tb3NrZWRhc3RpY2l0ZXQuDQpHcmFmaWt1IGkgMiBOb3JtYWwgUS1RIHBlcmRvcmV0IHBlciB0ZSB0cmVndWFyIG5lc2UgdGUgZGhlbmF0IHRvbmEgamFuZSBuZ2EgbmplIHNocGVybmRhcmplIG5vcm1hbGUuIFBpa2F0IG5lIGtldGUgcmFzdCBzaHRyaWhlbiBuZSBuamUgdmlqZSB0ZSBkcmVqdGUgZGlhZ29uYWxlLCBwcmEgdGUgZGhlbmF0IHRvbmUgdmlqbmUgbmdhIG5qZSBzaHBlcm5kYXJqZSBub3JtYWxlLg0KTmUgZ3JhZmlrdW4gZSB0cmV0ZSwgbmUgZGFsbGltIG5nYSBncmFmaWt1IGkgcGFyZSBuZSBib3NodGluIHZlcnRpa2FsIGtlbWkgbWJldGpldCBlIHN0YW5kYXJ0aXp1YXJhLlBvIHRlIHNob2hpbSB2aWplbiBlIGt1cWUgYWpvIGVzaHRlIHJlbmVzZSh6YnJpdGVzZSkgcHJhIG1lIHJyaXRqZW4gZSB2bGVyYXZlIHRlIHBlcmFmcnVhcmEga2VtaSBuamUgcmVuaWUgdGUgbWJldGpldmUgKG51ayBrZW1pIGhvbW9za2VkYXN0aWNpdGV0KS4NCk5lIGdyYWZpa3VuIGUga2F0ZXJ0IGtlbWkgbmplIHZpamUgcWUgcXVoZXQgQ29vaydzIGRpc3RhbmNlLCBuZ2EgZSBjaWxhIG5lc2Uga2VtaSB2bGVyYSBqYXNodGUgc2FqLGF0byBrYW5lIG5kaWtpbSB0ZSBtYWRoIG5lIGtvZWZpY2llbnRldCBlIG1vZGVsaXQgZSBuZXNlIGkgaGVxaW0ga2V0byB2bGVyYSwgbW9kZWxpIGRvIHBlc29udGUgbmRyeXNoaW1lIHRlIG1lZGhhLg0KDQoNCg0KTmRlcnRvam1lIG5qZSBncmFmaWsgdGUgIndlZWtseS1zZWxmLXN0dWR5LWhvdXJzIiBkaGUgImdlb2dyYXBoeV9zY29yZSIgZGhlIGdqZWptZSBrb2VmaWNpZW50aW4gZSBrb3JyZWxhY2lvbml0IG5kZXJtamV0IHR5cmUuDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMsIGFlcyh4ID0gd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsIHkgPSBnZW9ncmFwaHlfc2NvcmUpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsgDQogIGxhYnMoeCA9ICJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIsIHkgPSAiUmV6dWx0YXRpIG5lIGdqZW9ncmFmaSIpDQpgYGANCg0KTmVwZXJtamV0IHBhcmFxaXRqZXMgZ3JhZmlrZSB2ZXJlam1lIHNlIG5qZSBlIHBpa2F2ZSBlc2h0ZSBlIHNocGVybmRhcmUgbmUgZm9ybWUgcmVqZSBnamUgcWUgdHJlZ29uIHNlIG11bmQgdGUgZWt6aXN0b2plIG5qZWZhcmUgbGlkaGplIG5kZXJtamV0IHR5cmUuIE1lIHBvc2h0ZSBkbyB0ZSBuZGVydG9qbWUgbmplIG1vZGVsIHBlcm1lcyBzZSBjaWxpdCBkbyB0ZSBuZGVydG9qbWUgZWt1YWNpb25pbiBlIGRyZWp0ZXplcyBzZSByZWdyZXNpdC4NCg0KYGBge3J9DQptb2RlbGlfNjwtbG0oZ2VvZ3JhcGh5X3Njb3JlfndlZWtseV9zZWxmX3N0dWR5X2hvdXJzLCBkYXRhPXN0dWRlbnRfc2NvcmVzKQ0KbW9kZWxpXzYNCmBgYA0KDQpLam8gZm9ybXVsZSBtdW5kIHRlIGludGVycHJldG9oZXQgbmRyeXNoZSBwZXIgY2RvIG5qZXNpIHRlIG9yZXZlIGphdm9yZSB0ZSBzdHVkaW1pdCBrZW1pIDAuMTQ3NCAgcnJpdGplICB0ZSBuamVzaXNlIHNlIHBpa2V2ZSBuZSBwcm92aW1pbiBlIGJpb2xvZ2ppc2UgZGhlIHBlciBrZXRlIG5hIG5kaWhtb2kgbmRlcnRpbWkgaSBtb2RlbGl0IHBlciAyIG5kcnlzaG9yZXQga3Uga29lZmljaWVudGkgcHJhbmUgd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMgZXNodGUgMC4xNDc0IGRoZSBvcmRpbmF0YSA3OC4yNzEwLiBNZSBwb3NodGUgamVwZXQgbmRlcnRpbWkgaSBkcmVqdGV6ZXMgc2UgcmVncmVzaXQuDQoNCiQkZ2VvZ3JhcGh5LXNjb3JlPSAwLjE0NzQqd2Vla2x5LXNlbGYtc3R1ZHktaG91cnMrNzguMjcxMCAkJA0KYGBge3J9DQpsaWJyYXJ5KGdncHVicikNCmdncGxvdChzdHVkZW50X3Njb3JlcyxhZXMod2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMseT1nZW9ncmFwaHlfc2NvcmUpKStnZW9tX3BvaW50KHNpemU9MSxjb2xvcj0icmVkIikrZ2VvbV9zbW9vdGgobWV0aG9kPWxtLGZvcm11bGE9eX54LGNvbG9yPSJvcmFuZ2UiKStzdGF0X2NvcihsYWJlbC54ID0yLGxhYmVsLnk9Ny41KStzdGF0X3JlZ2xpbmVfZXF1YXRpb24obGFiZWwueD04LGxhYmVsLnk9MSxzaXplPTQpK2xhYnMoeD0iT3JldCBqYXZvcmUgdGUgc3R1ZGltaXQiLHk9IlJlenVsdGF0aSBuZSBnamVvZ3JhZmkiLHRpdGxlPSIiKQ0KYGBgDQoNCkdyYWZpa3UgdHJlZ29uIG5qw6sgdGVuZGVuY8OrIHBveml0aXZlLiBLam8gZG8gdMOrIHRob3TDqyBzZSBzYSBtw6sgc2h1bcOrIG9yw6sgc3R1ZGltaSBuw6sgamF2w6ssIGFxIG3DqyB0w6sgbGFydGEgamFuw6sgcmV6dWx0YXRldCBuw6sgZ2plb2dyYWZpLiBLam8gw6tzaHTDqyBlIGR1a3NobWUgbmdhIHZpamEgZSByZWdyZXNpb25pdCBxw6sgcnJpdGV0IG1lIHJyaXRqZW4gZSBvcsOrdmUgdMOrIHN0dWRpbWl0LiBQaWthIHTDqyBzaHDDq3JuZGFyYSBycmV0aCB2aWrDq3Mgc8OrIHJlZ3Jlc2lvbml0IHRyZWdvam7DqyB2YXJpYWJpbGl0ZXRpbiBlIHJlenVsdGF0ZXZlLiBEaXNhIHN0dWRlbnTDqyBrYW7DqyByZXp1bHRhdGUgdMOrIGxhcnRhIGVkaGUgcHNlIG51ayBzdHVkaW9qbsOrIHNodW3DqywgbmTDq3JzYSB0w6sgdGplcsOrIGthbsOrIHJlenVsdGF0ZSB0w6sgdWzDq3RhIGVkaGUgcHNlIHN0dWRpb2puw6sgc2h1bcOrLiBEaXNhIHBpa8OrIGphbsOrIGxhcmcgdmlqw6tzIHPDqyByZWdyZXNpb25pdC4gS8OrdG8gamFuw6sgcmFzdGUga3Ugc3R1ZGVudMOrdCBrYW7DqyByZXp1bHRhdGUgdMOrIG5kcnlzaG1lIG5nYSBwcml0c2htw6tyaXTDqyBlIHZpasOrcyBzw6sgcmVncmVzaW9uaXQuIE11bmQgdMOrIGplbsOrIGZha3RvcsOrIHTDqyB0amVyw6sgccOrIG5kaWtvam7DqyBuw6sgcmV6dWx0YXRlLCBww6tydmXDpyBvcsOrdmUgdMOrIHN0dWRpbWl0Lg0KDQoNCmBgYHtyfQ0KY29yKHN0dWRlbnRfc2NvcmVzJHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzLHN0dWRlbnRfc2NvcmVzJGdlb2dyYXBoeV9zY29yZSkNCmBgYA0KDQpOZXBlcm1qZXQgZnVua3Npb25pdCBjb3IgZ2plam1lIHZsZXJlbiBlIGtvZWZpY2llbnRpdCB0ZSBrb3JyZWxhY2lvbml0LiBNZXNhIHNob2hpbSBram8gdmxlcmUgZXNodGUgcG96aXRpdmUsIGdqZSBxZSB0cmVnb24gcGVyIG5qZSBtYXJyZWRoZW5pZSB0ZSBkcmVqdGUgbWVzIGR5IG5kcnlzaG9yZXZlLCBwcmEgbWUgcnJpdGplbiBlIG5qZXJlcyBycml0ZXQgZGhlIHRqZXRyYS4NCg0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsaV82KQ0KYGBgDQoNClZsZXJhIG1pbmltYWxlIGUgdmFyaWFibMOrcyB0w6sgdmFydXIgw6tzaHTDqyAtMjIuOTg4IC5WbGVyYSBtYWtzaW1hbGUgZSB2YXJpYWJsw6tzIHTDqyB2YXJ1ciDDq3NodMOrIDIxLjcyOSAuVmxlcmEgZSBtZWRpYW5pdCDDq3NodMOrIDAuNzI5LiAgS2pvIGRvIHTDqyB0aG90w6sgc2UgZ2p5c21hIGUgc3R1ZGVudMOrdmUga2Fuw6sgbmrDqyByZXp1bHRhdCBtYXRlbWF0aWvDqyBtw6sgdMOrIHVsw6t0IHNlIDAuNzI5IHBpa8OrIGRoZSBnanlzbWEgdGpldMOrciBrYSBuasOrIHJlenVsdGF0IG3DqyB0w6sgbGFydMOrLiBLdWFydGlsaSBpIHBhcmUgw6tzaHTDqyAtOS44MTYsIG5kw6tyc2Ega3VhcnRpbGkgaSB0cmV0ZSDDq3NodMOrIDkuNTgyIC5WbGVyYSBlIHAtdmxlcmVzIGVzaHRlIG1lIGUgdm9nZWwgc2UgMC4wNSBnamUgcWUgbmEgdHJlZ29uIG5qZSBsaWRoamUgdGUgcmVuZGVzaXNobWUgc3RhdGlzdGlrb3JlIG5kZXJtamV0IG5kcnlzaG9yZXZlDQpSZXNpZHVhbCBzdGFuZGFyZCBlcnJvciBlc2h0ZSAgZSB2b2dlbCBnamUgcWUgbmEgdHJlZ29uIHNlIHZsZXJhdCBxZSBqZXAgbW9kZWxpIGphbmUgYWZlciB2bGVyYXZlIHJlYWxlLiBQZXJtZXMgUi1zcXVhcmVkIGt1cHRvam1lIHNlIDIuMzExJSBlIHRlIGRoZW5hdmUgc2hwamVnb2hlbiBuZ2EgbW9kZWxpLg0KDQpgYGB7cn0NCnZla3Rvcmk1PC1maXR0ZWQudmFsdWVzKG1vZGVsaV82KQ0KVmlldyh2ZWt0b3JpNSkNCnByZWRpY3QobW9kZWxpXzYsIGxpc3Qod2Vla2x5X3NlbGZfc3R1ZHlfaG91cnM9YygxLDIsMyw0LDUpKSkNCmBgYA0KDQpNZSBzaXBlciBqYW5lIGRpc2EgdmxlcmEgdGUgcGFyYXNoaWt1YXJhIHRlIG1vZGVsaXQgZHVrZSBkaGVuZSBkaXNhIHZsZXJhIHRlIG5kcnlzaG9yZXMgc2UgcGF2YXJ1ci4NCg0KYGBge3J9DQptYmV0amV0PC1yZXNpZHVhbHMobW9kZWxpXzYpDQpzdW0obWJldGpldCkNCmBgYA0KDQpNYmV0amEgZXNodGUgZGlzdGFuY2EgbmRlcm1qZXQgdmxlcmVzIGFrdHVhbGUgZGhlIGFzYWogcWUgamVwIG1vZGVsaSBxZSBrZW1pIG5kZXJ0dWFyLg0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMikpDQpwbG90KG1vZGVsaV82KQ0KcGFyKG1mcm93PWMoMSwxKSkNCmBgYA0KDQpHcmFmaWt1IGkgcGFyZSBuYSB0cmVnb24gcWUga2VtaSBuamUgdmFyZXNpIGxpbmVhcmUgbmRlcm1qZXQgdGUgZGhlbmF2ZSB0b25hIGRoZSBkZXZpamltaSBzdGFuZGFyZCBlc2h0ZSBrb25zdGFudCBwb3RodWFqc2UobWJldGpldCBkaGUgdmxlcmF0IGUgcGVyYWZydWFyYSBqbyB0ZSBrb3JyZWx1YXJhKSwgcHJhIGtlbWkgaG9tb3NrZWRhc3RpY2l0ZXQuDQpHcmFmaWt1IGkgMiBOb3JtYWwgUS1RIHBlcmRvcmV0IHBlciB0ZSB0cmVndWFyIG5lc2UgdGUgZGhlbmF0IHRvbmEgamFuZSBuZ2EgbmplIHNocGVybmRhcmplIG5vcm1hbGUuIFBpa2F0IG5lIGtldGUgcmFzdCBzaHRyaWhlbiBuZSBuamUgdmlqZSB0ZSBkcmVqdGUgZGlhZ29uYWxlLCBwcmEgdGUgZGhlbmF0IHRvbmUgdmlqbmUgbmdhIG5qZSBzaHBlcm5kYXJqZSBub3JtYWxlLg0KTmUgZ3JhZmlrdW4gZSB0cmV0ZSwgbmUgZGFsbGltIG5nYSBncmFmaWt1IGkgcGFyZSBuZSBib3NodGluIHZlcnRpa2FsIGtlbWkgbWJldGpldCBlIHN0YW5kYXJ0aXp1YXJhLlBvIHRlIHNob2hpbSB2aWplbiBlIGt1cWUgYWpvIGVzaHRlIHJlbmVzZSh6YnJpdGVzZSkgcHJhIG1lIHJyaXRqZW4gZSB2bGVyYXZlIHRlIHBlcmFmcnVhcmEga2VtaSBuamUgcmVuaWUgdGUgbWJldGpldmUgKG51ayBrZW1pIGhvbW9za2VkYXN0aWNpdGV0KS4NCk5lIGdyYWZpa3VuIGUga2F0ZXJ0IGtlbWkgbmplIHZpamUgcWUgcXVoZXQgQ29vaydzIGRpc3RhbmNlLCBuZ2EgZSBjaWxhIG5lc2Uga2VtaSB2bGVyYSBqYXNodGUgc2FqLGF0byBrYW5lIG5kaWtpbSB0ZSBtYWRoIG5lIGtvZWZpY2llbnRldCBlIG1vZGVsaXQgZSBuZXNlIGkgaGVxaW0ga2V0byB2bGVyYSwgbW9kZWxpIGRvIHBlc29udGUgbmRyeXNoaW1lIHRlIG1lZGhhLg0KDQoNCg0KTmRlcnRvam1lIG5qZSBncmFmaWsgdGUgIndlZWtseS1zZWxmLXN0dWR5LWhvdXJzIiBkaGUgImNoZW1pc3RyeV9zY29yZSAiIGRoZSBnamVqbWUga29lZmljaWVudGluIGUga29ycmVsYWNpb25pdCBuZGVybWpldCB0eXJlLg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzLCBhZXMoeCA9IHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzLCB5ID0gY2hlbWlzdHJ5X3Njb3JlKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiKSArIA0KICBsYWJzKHggPSAiT3JldCBqYXZvcmUgdGUgc3R1ZGltaXQiLCB5ID0gIlJlenVsdGF0aSBuZSBraW1pIikNCmBgYA0KDQpOZXBlcm1qZXQgcGFyYXFpdGplcyBncmFmaWtlIHZlcmVqbWUgc2UgcGplc2EgbWUgZSBtYWRoZSBlIHBpa2F2ZSBlc2h0ZSBlIHNocGVybmRhcmUgbmUgZm9ybWUgcmVqZSBnamUgcWUgdHJlZ29uIHNlIG11bmQgdGUgZWt6aXN0b2plIG5qZSBsaWRoamUgbmRlcm1qZXQgdHlyZS4gTWUgcG9zaHRlIGRvIHRlIG5kZXJ0b2ptZSBuamUgbW9kZWwgcGVybWVzIHNlIGNpbGl0IGRvIHRlIG5kZXJ0b2ptZSBla3VhY2lvbmluIGUgZHJlanRlemVzIHNlIHJlZ3Jlc2l0Lg0KDQoNCmBgYHtyfQ0KbW9kZWxpXzc8LWxtKGNoZW1pc3RyeV9zY29yZX53ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgZGF0YT1zdHVkZW50X3Njb3JlcykNCm1vZGVsaV83DQpgYGANCg0KS2pvIGZvcm11bGUgbXVuZCB0ZSBpbnRlcnByZXRvaGV0IG5kcnlzaGUgcGVyIGNkbyBuamVzaSB0ZSBvcmV2ZSBqYXZvcmUgdGUgc3R1ZGltaXQga2VtaSAwLjIxMjEgIHJyaXRqZSAgdGUgbmplc2lzZSBzZSBwaWtldmUgbmUgcHJvdmltaW4gZSBraW1pc2UgZGhlIHBlciBrZXRlIG5hIG5kaWhtb2kgbmRlcnRpbWkgaSBtb2RlbGl0IHBlciAyIG5kcnlzaG9yZXQga3Uga29lZmljaWVudGkgcHJhbmUgd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMgZXNodGUgMC4yMTIxIGRoZSBvcmRpbmF0YSA3Ni4yMjkwLiBNZSBwb3NodGUgamVwZXQgbmRlcnRpbWkgaSBkcmVqdGV6ZXMgc2UgcmVncmVzaXQuDQoNCiQkY2hlbWlzdHJ5LXNjb3JlID0gIDAuMjEyMSp3ZWVrbHktc2VsZi1zdHVkeS1ob3Vycys3Ni4yMjkwICQkDQpgYGB7cn0NCmxpYnJhcnkoZ2dwdWJyKQ0KZ2dwbG90KHN0dWRlbnRfc2NvcmVzLGFlcyh3ZWVrbHlfc2VsZl9zdHVkeV9ob3Vycyx5PWNoZW1pc3RyeV9zY29yZSkpK2dlb21fcG9pbnQoc2l6ZT0xLGNvbG9yPSJyZWQiKStnZW9tX3Ntb290aChtZXRob2Q9bG0sZm9ybXVsYT15fngsY29sb3I9Im9yYW5nZSIpK3N0YXRfY29yKGxhYmVsLnggPTIsbGFiZWwueT03LjUpK3N0YXRfcmVnbGluZV9lcXVhdGlvbihsYWJlbC54PTgsbGFiZWwueT0xLHNpemU9NCkrbGFicyh4PSJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIseT0iUmV6dWx0YXRpIG5lIGtpbWkiLHRpdGxlPSIiKQ0KYGBgDQoNCkdyYWZpa3UgdHJlZ29uIG5qw6sgdGVuZGVuY8OrIHBveml0aXZlLiBLam8gZG8gdMOrIHRob3TDqyBzZSBzYSBtw6sgc2h1bcOrIG9yw6sgc3R1ZGltaSBuw6sgamF2w6ssIGFxIG3DqyB0w6sgbGFydGEgamFuw6sgcmV6dWx0YXRldCBuw6sga2ltaS4gS2pvIMOrc2h0w6sgZSBkdWtzaG1lIG5nYSB2aWphIGUgcmVncmVzaW9uaXQgccOrIHJyaXRldCBtZSBycml0amVuIGUgb3LDq3ZlIHTDqyBzdHVkaW1pdC4gUGlrYSB0w6sgc2hww6tybmRhcmEgcnJldGggdmlqw6tzIHPDqyByZWdyZXNpb25pdCB0cmVnb2puw6sgdmFyaWFiaWxpdGV0aW4gZSByZXp1bHRhdGV2ZS4gRGlzYSBzdHVkZW50w6sga2Fuw6sgcmV6dWx0YXRlIHTDqyBsYXJ0YSBlZGhlIHBzZSBudWsgc3R1ZGlvam7DqyBzaHVtw6ssIG5kw6tyc2EgdMOrIHRqZXLDqyBrYW7DqyByZXp1bHRhdGUgdMOrIHVsw6t0YSBlZGhlIHBzZSBzdHVkaW9qbsOrIHNodW3Dqy4gRGlzYSBwaWvDqyBqYW7DqyBsYXJnIHZpasOrcyBzw6sgcmVncmVzaW9uaXQuIEvDq3RvIGphbsOrIHJhc3RlIGt1IHN0dWRlbnTDq3Qga2Fuw6sgcmV6dWx0YXRlIHTDqyBuZHJ5c2htZSBuZ2EgcHJpdHNobcOrcml0w6sgZSB2aWrDq3Mgc8OrIHJlZ3Jlc2lvbml0LiBNdW5kIHTDqyBqZW7DqyBmYWt0b3LDqyB0w6sgdGplcsOrIHHDqyBuZGlrb2puw6sgbsOrIHJlenVsdGF0ZSwgcMOrcnZlw6cgb3LDq3ZlIHTDqyBzdHVkaW1pdC4NCg0KDQpgYGB7cn0NCmNvcihzdHVkZW50X3Njb3JlcyR3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycyxzdHVkZW50X3Njb3JlcyRjaGVtaXN0cnlfc2NvcmUpDQpgYGANCg0KTmVwZXJtamV0IGZ1bmtzaW9uaXQgY29yIGdqZWptZSB2bGVyZW4gZSBrb2VmaWNpZW50aXQgdGUga29ycmVsYWNpb25pdC4gTWVzYSBzaG9oaW0ga2pvIHZsZXJlIGVzaHRlIHBveml0aXZlLCBnamUgcWUgdHJlZ29uIHBlciBuamUgbWFycmVkaGVuaWUgdGUgZHJlanRlIG1lcyBkeSBuZHJ5c2hvcmV2ZSwgcHJhIG1lIHJyaXRqZW4gZSBuamVyZXMgcnJpdGV0IGRoZSB0amV0cmEuDQoNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbGlfNykNCmBgYA0KDQpWbGVyYSBtaW5pbWFsZSBlIHZhcmlhYmzDq3MgdMOrIHZhcnVyIMOrc2h0w6sgLTI3LjI4OTUuVmxlcmEgbWFrc2ltYWxlIGUgdmFyaWFibMOrcyB0w6sgdmFydXIgw6tzaHTDqyAyMy41NTg5LlZsZXJhIGUgbWVkaWFuaXQgw6tzaHTDqyAwLjkzNzguICBLam8gZG8gdMOrIHRob3TDqyBzZSBnanlzbWEgZSBzdHVkZW50w6t2ZSBrYW7DqyBuasOrIHJlenVsdGF0IG1hdGVtYXRpa8OrIG3DqyB0w6sgdWzDq3Qgc2UgMC45Mzc4IHBpa8OrIGRoZSBnanlzbWEgdGpldMOrciBrYSBuasOrIHJlenVsdGF0IG3DqyB0w6sgbGFydMOrLiBLdWFydGlsaSBpIHBhcmUgw6tzaHTDqyAtMTAuOTU1OCwgbmTDq3JzYSBrdWFydGlsaSBpIHRyZXRlIMOrc2h0w6sgMTAuMzQ3NCAuVmxlcmEgZSBwLXZsZXJlcyBlc2h0ZSBtZSBlIHZvZ2VsIHNlIDAuMDUgZ2plIHFlIG5hIHRyZWdvbiBuamUgbGlkaGplIHRlIHJlbmRlc2lzaG1lIHN0YXRpc3Rpa29yZSBuZGVybWpldCBuZHJ5c2hvcmV2ZQ0KUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IgZXNodGUgIGUgdm9nZWwgZ2plIHFlIG5hIHRyZWdvbiBzZSB2bGVyYXQgcWUgamVwIG1vZGVsaSBqYW5lIGFmZXIgdmxlcmF2ZSByZWFsZS4gUGVybWVzIFItc3F1YXJlZCBrdXB0b2ptZSBzZSA0LjAwNiUgZSB0ZSBkaGVuYXZlIHNocGplZ29oZW4gbmdhIG1vZGVsaS4NCg0KYGBge3J9DQp2ZWt0b3JpNjwtZml0dGVkLnZhbHVlcyhtb2RlbGlfNykNClZpZXcodmVrdG9yaTYpDQpwcmVkaWN0KG1vZGVsaV83LCBsaXN0KHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzPWMoMSwyLDMsNCw1KSkpDQpgYGANCg0KTWUgc2lwZXIgamFuZSBkaXNhIHZsZXJhIHRlIHBhcmFzaGlrdWFyYSB0ZSBtb2RlbGl0IGR1a2UgZGhlbmUgZGlzYSB2bGVyYSB0ZSBuZHJ5c2hvcmVzIHNlIHBhdmFydXIuDQoNCmBgYHtyfQ0KbWJldGpldDwtcmVzaWR1YWxzKG1vZGVsaV83KQ0Kc3VtKG1iZXRqZXQpDQpgYGANCg0KTWJldGphIGVzaHRlIGRpc3RhbmNhIG5kZXJtamV0IHZsZXJlcyBha3R1YWxlIGRoZSBhc2FqIHFlIGplcCBtb2RlbGkgcWUga2VtaSBuZGVydHVhci4NCg0KYGBge3J9DQpwYXIobWZyb3c9YygyLDIpKQ0KcGxvdChtb2RlbGlfNykNCnBhcihtZnJvdz1jKDEsMSkpDQpgYGANCiANCkdyYWZpa3UgaSBwYXJlIG5hIHRyZWdvbiBxZSBrZW1pIG5qZSB2YXJlc2kgbGluZWFyZSBuZGVybWpldCB0ZSBkaGVuYXZlIHRvbmEgZGhlIGRldmlqaW1pIHN0YW5kYXJkIGVzaHRlIGtvbnN0YW50IHBvdGh1YWpzZShtYmV0amV0IGRoZSB2bGVyYXQgZSBwZXJhZnJ1YXJhIGpvIHRlIGtvcnJlbHVhcmEpLCBwcmEga2VtaSBob21vc2tlZGFzdGljaXRldC4NCkdyYWZpa3UgaSAyIE5vcm1hbCBRLVEgcGVyZG9yZXQgcGVyIHRlIHRyZWd1YXIgbmVzZSB0ZSBkaGVuYXQgdG9uYSBqYW5lIG5nYSBuamUgc2hwZXJuZGFyamUgbm9ybWFsZS4gUGlrYXQgbmUga2V0ZSByYXN0IHNodHJpaGVuIG5lIG5qZSB2aWplIHRlIGRyZWp0ZSBkaWFnb25hbGUsIHByYSB0ZSBkaGVuYXQgdG9uZSB2aWpuZSBuZ2EgbmplIHNocGVybmRhcmplIG5vcm1hbGUuDQpOZSBncmFmaWt1biBlIHRyZXRlLCBuZSBkYWxsaW0gbmdhIGdyYWZpa3UgaSBwYXJlIG5lIGJvc2h0aW4gdmVydGlrYWwga2VtaSBtYmV0amV0IGUgc3RhbmRhcnRpenVhcmEuUG8gdGUgc2hvaGltIHZpamVuIGUga3VxZSBham8gZXNodGUgcmVuZXNlKHpicml0ZXNlKSBwcmEgbWUgcnJpdGplbiBlIHZsZXJhdmUgdGUgcGVyYWZydWFyYSBrZW1pIG5qZSByZW5pZSB0ZSBtYmV0amV2ZSAobnVrIGtlbWkgaG9tb3NrZWRhc3RpY2l0ZXQpLg0KTmUgZ3JhZmlrdW4gZSBrYXRlcnQga2VtaSBuamUgdmlqZSBxZSBxdWhldCBDb29rJ3MgZGlzdGFuY2UsIG5nYSBlIGNpbGEgbmVzZSBrZW1pIHZsZXJhIGphc2h0ZSBzYWosYXRvIGthbmUgbmRpa2ltIHRlIG1hZGggbmUga29lZmljaWVudGV0IGUgbW9kZWxpdCBlIG5lc2UgaSBoZXFpbSBrZXRvIHZsZXJhLCBtb2RlbGkgZG8gcGVzb250ZSBuZHJ5c2hpbWUgdGUgbWVkaGEuDQoNCiANCiANCiBOZGVydG9qbWUgbmplIGdyYWZpayB0ZSAid2Vla2x5LXNlbGYtc3R1ZHktaG91cnMiIGRoZSAiYmlvbG9neV9zY29yZSAiIGRoZSBnamVqbWUga29lZmljaWVudGluIGUga29ycmVsYWNpb25pdCBuZGVybWpldCB0eXJlLg0KIA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChzdHVkZW50X3Njb3JlcywgYWVzKHggPSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgeSA9IGJpb2xvZ3lfc2NvcmUpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsgDQogIGxhYnMoeCA9ICJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIsIHkgPSAiUmV6dWx0YXRpIG5lIGJpb2xvZ2ppIikNCmBgYA0KIA0KTmVwZXJtamV0IHBhcmFxaXRqZXMgZ3JhZmlrZSB2ZXJlam1lIHNlIHBqZXNhIG1lIGUgbWFkaGUgZSBwaWthdmUgZXNodGUgZSBzaHBlcm5kYXJlIG5lIGZvcm1lIHJlamUgZ2plIHFlIHRyZWdvbiBzZSBtdW5kIHRlIGVremlzdG9qZSBuamUgbGlkaGplIG5kZXJtamV0IHR5cmUuIE1lIHBvc2h0ZSBkbyB0ZSBuZGVydG9qbWUgbmplIG1vZGVsIHBlcm1lcyBzZSBjaWxpdCBkbyB0ZSBuZGVydG9qbWUgZWt1YWNpb25pbiBlIGRyZWp0ZXplcyBzZSByZWdyZXNpdC4NCg0KYGBge3J9DQptb2RlbGlfODwtbG0oYmlvbG9neV9zY29yZX53ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgZGF0YT1zdHVkZW50X3Njb3JlcykNCm1vZGVsaV84DQpgYGANCg0KS2pvIGZvcm11bGUgbXVuZCB0ZSBpbnRlcnByZXRvaGV0IG5kcnlzaGUgcGVyIGNkbyBuamVzaSB0ZSBvcmV2ZSBqYXZvcmUgdGUgc3R1ZGltaXQga2VtaSAwLjIxNTUgIHJyaXRqZSAgdGUgbmplc2lzZSBzZSBwaWtldmUgbmUgcHJvdmltaW4gZSBiaW9sb2dqaXNlIGRoZSBwZXIga2V0ZSBuYSBuZGlobW9pIG5kZXJ0aW1pIGkgbW9kZWxpdCBwZXIgMiBuZHJ5c2hvcmV0IGt1IGtvZWZpY2llbnRpIHByYW5lIHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzIGVzaHRlIDAuMjE1NSBkaGUgb3JkaW5hdGEgNzUuNzU1NC4gTWUgcG9zaHRlIGplcGV0IG5kZXJ0aW1pIGkgZHJlanRlemVzIHNlIHJlZ3Jlc2l0Lg0KDQokJGJpb2xvZ3ktc2NvcmUgPSAgMC4yMTU1KndlZWtseS1zZWxmLXN0dWR5LWhvdXJzbys3NS43NTU0JCQNCg0KYGBge3J9DQpsaWJyYXJ5KGdncHVicikNCmdncGxvdChzdHVkZW50X3Njb3JlcyxhZXMod2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMseT1iaW9sb2d5X3Njb3JlKSkrZ2VvbV9wb2ludChzaXplPTEsY29sb3I9InJlZCIpK2dlb21fc21vb3RoKG1ldGhvZD1sbSxmb3JtdWxhPXl+eCxjb2xvcj0ib3JhbmdlIikrc3RhdF9jb3IobGFiZWwueCA9MixsYWJlbC55PTcuNSkrc3RhdF9yZWdsaW5lX2VxdWF0aW9uKGxhYmVsLng9OCxsYWJlbC55PTEsc2l6ZT00KStsYWJzKHg9Ik9yZXQgamF2b3JlIHRlIHN0dWRpbWl0Iix5PSJSZXp1bHRhdGkgbmUgYmlvbG9namkiLHRpdGxlPSIiKQ0KYGBgDQoNCkdyYWZpa3UgdHJlZ29uIG5qw6sgdGVuZGVuY8OrIHBveml0aXZlLiBLam8gZG8gdMOrIHRob3TDqyBzZSBzYSBtw6sgc2h1bcOrIG9yw6sgc3R1ZGltaSBuw6sgamF2w6ssIGFxIG3DqyB0w6sgbGFydGEgamFuw6sgcmV6dWx0YXRldCBuw6sgYmlvbG9namkuIEtqbyDDq3NodMOrIGUgZHVrc2htZSBuZ2EgdmlqYSBlIHJlZ3Jlc2lvbml0IHHDqyBycml0ZXQgbWUgcnJpdGplbiBlIG9yw6t2ZSB0w6sgc3R1ZGltaXQuIFBpa2EgdMOrIHNocMOrcm5kYXJhIHJyZXRoIHZpasOrcyBzw6sgcmVncmVzaW9uaXQgdHJlZ29qbsOrIHZhcmlhYmlsaXRldGluIGUgcmV6dWx0YXRldmUuIERpc2Egc3R1ZGVudMOrIGthbsOrIHJlenVsdGF0ZSB0w6sgbGFydGEgZWRoZSBwc2UgbnVrIHN0dWRpb2puw6sgc2h1bcOrLCBuZMOrcnNhIHTDqyB0amVyw6sga2Fuw6sgcmV6dWx0YXRlIHTDqyB1bMOrdGEgZWRoZSBwc2Ugc3R1ZGlvam7DqyBzaHVtw6suIERpc2EgcGlrw6sgamFuw6sgbGFyZyB2aWrDq3Mgc8OrIHJlZ3Jlc2lvbml0LiBLw6t0byBqYW7DqyByYXN0ZSBrdSBzdHVkZW50w6t0IGthbsOrIHJlenVsdGF0ZSB0w6sgbmRyeXNobWUgbmdhIHByaXRzaG3Dq3JpdMOrIGUgdmlqw6tzIHPDqyByZWdyZXNpb25pdC4gTXVuZCB0w6sgamVuw6sgZmFrdG9yw6sgdMOrIHRqZXLDqyBxw6sgbmRpa29qbsOrIG7DqyByZXp1bHRhdGUsIHDDq3J2ZcOnIG9yw6t2ZSB0w6sgc3R1ZGltaXQuDQoNCg0KYGBge3J9DQpjb3Ioc3R1ZGVudF9zY29yZXMkd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsc3R1ZGVudF9zY29yZXMkYmlvbG9neV9zY29yZSkNCmBgYA0KDQpOZXBlcm1qZXQgZnVua3Npb25pdCBjb3IgZ2plam1lIHZsZXJlbiBlIGtvZWZpY2llbnRpdCB0ZSBrb3JyZWxhY2lvbml0LiBNZXNhIHNob2hpbSBram8gdmxlcmUgZXNodGUgcG96aXRpdmUsIGdqZSBxZSB0cmVnb24gcGVyIG5qZSBtYXJyZWRoZW5pZSB0ZSBkcmVqdGUgbWVzIGR5IG5kcnlzaG9yZXZlLCBwcmEgbWUgcnJpdGplbiBlIG5qZXJlcyBycml0ZXQgZGhlIHRqZXRyYS4NCg0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsaV84KQ0KYGBgDQoNClZsZXJhIG1pbmltYWxlIGUgdmFyaWFibMOrcyB0w6sgdmFydXIgw6tzaHTDqyAtNTEuMzU4IC5WbGVyYSBtYWtzaW1hbGUgZSB2YXJpYWJsw6tzIHTDqyB2YXJ1ciDDq3NodMOrIDI0LjI0NS5WbGVyYSBlIG1lZGlhbml0IMOrc2h0w6sgMS4yNDUgLiAgS2pvIGRvIHTDqyB0aG90w6sgc2UgZ2p5c21hIGUgc3R1ZGVudMOrdmUga2Fuw6sgbmrDqyByZXp1bHRhdCBtYXRlbWF0aWvDqyBtw6sgdMOrIHVsw6t0IHNlIDEuMjQ1IHBpa8OrIGRoZSBnanlzbWEgdGpldMOrciBrYSBuasOrIHJlenVsdGF0IG3DqyB0w6sgbGFydMOrLiBLdWFydGlsaSBpIHBhcmUgw6tzaHTDqyAtOS45NzUsIG5kw6tyc2Ega3VhcnRpbGkgaSB0cmV0ZSDDq3NodMOrIDEwLjkzMyAuVmxlcmEgZSBwLXZsZXJlcyBlc2h0ZSBtZSBlIHZvZ2VsIHNlIDAuMDUgZ2plIHFlIG5hIHRyZWdvbiBuamUgbGlkaGplIHRlIHJlbmRlc2lzaG1lIHN0YXRpc3Rpa29yZSBuZGVybWpldCBuZHJ5c2hvcmV2ZQ0KUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IgZXNodGUgIGUgdm9nZWwgZ2plIHFlIG5hIHRyZWdvbiBzZSB2bGVyYXQgcWUgamVwIG1vZGVsaSBqYW5lIGFmZXIgdmxlcmF2ZSByZWFsZS4gUGVybWVzIFItc3F1YXJlZCBrdXB0b2ptZSBzZSAzLjU4JSBlIHRlIGRoZW5hdmUgc2hwamVnb2hlbiBuZ2EgbW9kZWxpLg0KDQpgYGB7cn0NCnZla3Rvcmk3PC1maXR0ZWQudmFsdWVzKG1vZGVsaV84KQ0KVmlldyh2ZWt0b3JpNykNCnByZWRpY3QobW9kZWxpXzgsIGxpc3Qod2Vla2x5X3NlbGZfc3R1ZHlfaG91cnM9YygxLDIsMyw0LDUpKSkNCmBgYA0KDQpNZSBzaXBlciBqYW5lIGRpc2EgdmxlcmEgdGUgcGFyYXNoaWt1YXJhIHRlIG1vZGVsaXQgZHVrZSBkaGVuZSBkaXNhIHZsZXJhIHRlIG5kcnlzaG9yZXMgc2UgcGF2YXJ1ci4NCg0KYGBge3J9DQptYmV0amV0PC1yZXNpZHVhbHMobW9kZWxpXzgpDQpzdW0obWJldGpldCkNCmBgYA0KDQpNYmV0amEgZXNodGUgZGlzdGFuY2EgbmRlcm1qZXQgdmxlcmVzIGFrdHVhbGUgZGhlIGFzYWogcWUgamVwIG1vZGVsaSBxZSBrZW1pIG5kZXJ0dWFyLg0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMikpDQpwbG90KG1vZGVsaV84KQ0KcGFyKG1mcm93PWMoMSwxKSkNCmBgYA0KIA0KR3JhZmlrdSBpIHBhcmUgbmEgdHJlZ29uIHFlIGtlbWkgbmplIHZhcmVzaSBsaW5lYXJlIG5kZXJtamV0IHRlIGRoZW5hdmUgdG9uYSBkaGUgZGV2aWppbWkgc3RhbmRhcmQgZXNodGUga29uc3RhbnQgcG90aHVhanNlKG1iZXRqZXQgZGhlIHZsZXJhdCBlIHBlcmFmcnVhcmEgam8gdGUga29ycmVsdWFyYSksIHByYSBrZW1pIGhvbW9za2VkYXN0aWNpdGV0Lg0KR3JhZmlrdSBpIDIgTm9ybWFsIFEtUSBwZXJkb3JldCBwZXIgdGUgdHJlZ3VhciBuZXNlIHRlIGRoZW5hdCB0b25hIGphbmUgbmdhIG5qZSBzaHBlcm5kYXJqZSBub3JtYWxlLiBQaWthdCBuZSBrZXRlIHJhc3Qgc2h0cmloZW4gbmUgbmplIHZpamUgdGUgZHJlanRlIGRpYWdvbmFsZSwgcHJhIHRlIGRoZW5hdCB0b25lIHZpam5lIG5nYSBuamUgc2hwZXJuZGFyamUgbm9ybWFsZS4NCk5lIGdyYWZpa3VuIGUgdHJldGUsIG5lIGRhbGxpbSBuZ2EgZ3JhZmlrdSBpIHBhcmUgbmUgYm9zaHRpbiB2ZXJ0aWthbCBrZW1pIG1iZXRqZXQgZSBzdGFuZGFydGl6dWFyYS5QbyB0ZSBzaG9oaW0gdmlqZW4gZSBrdXFlIGFqbyBlc2h0ZSByZW5lc2UoemJyaXRlc2UpIHByYSBtZSBycml0amVuIGUgdmxlcmF2ZSB0ZSBwZXJhZnJ1YXJhIGtlbWkgbmplIHJlbmllIHRlIG1iZXRqZXZlIChudWsga2VtaSBob21vc2tlZGFzdGljaXRldCkuDQpOZSBncmFmaWt1biBlIGthdGVydCBrZW1pIG5qZSB2aWplIHFlIHF1aGV0IENvb2sncyBkaXN0YW5jZSwgbmdhIGUgY2lsYSBuZXNlIGtlbWkgdmxlcmEgamFzaHRlIHNhaixhdG8ga2FuZSBuZGlraW0gdGUgbWFkaCBuZSBrb2VmaWNpZW50ZXQgZSBtb2RlbGl0IGUgbmVzZSBpIGhlcWltIGtldG8gdmxlcmEsIG1vZGVsaSBkbyBwZXNvbnRlIG5kcnlzaGltZSB0ZSBtZWRoYS4NCg0KDQpOZGVydG9qbWUgbmplIGdyYWZpayB0ZSAid2Vla2x5LXNlbGYtc3R1ZHktaG91cnMiIGRoZSAiaGlzdG9yeV9zY29yZSAiIGRoZSBnamVqbWUga29lZmljaWVudGluIGUga29ycmVsYWNpb25pdCBuZGVybWpldCB0eXJlLg0KIA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChzdHVkZW50X3Njb3JlcywgYWVzKHggPSB3ZWVrbHlfc2VsZl9zdHVkeV9ob3VycywgeSA9IGhpc3Rvcnlfc2NvcmUpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsgDQogIGxhYnMoeCA9ICJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIsIHkgPSAiUmV6dWx0YXRpIG5lIGhpc3RvcmkiKQ0KYGBgDQoNCk5lcGVybWpldCBwYXJhcWl0amVzIGdyYWZpa2UgdmVyZWptZSBzZSBwamVzYSBtZSBlIG1hZGhlIGUgcGlrYXZlIGVzaHRlIGUgc2hwZXJuZGFyZSBuZSBmb3JtZSByZWplIGdqZSBxZSB0cmVnb24gc2UgbXVuZCB0ZSBla3ppc3RvamUgbmplIGxpZGhqZSBuZGVybWpldCB0eXJlLiBNZSBwb3NodGUgZG8gdGUgbmRlcnRvam1lIG5qZSBtb2RlbCBwZXJtZXMgc2UgY2lsaXQgZG8gdGUgbmRlcnRvam1lIGVrdWFjaW9uaW4gZSBkcmVqdGV6ZXMgc2UgcmVncmVzaXQuDQoNCmBgYHtyfQ0KbW9kZWxpXzk8LWxtKGhpc3Rvcnlfc2NvcmV+d2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsIGRhdGE9c3R1ZGVudF9zY29yZXMpDQptb2RlbGlfOQ0KYGBgDQoNCktqbyBmb3JtdWxlIG11bmQgdGUgaW50ZXJwcmV0b2hldCBuZHJ5c2hlIHBlciBjZG8gbmplc2kgdGUgb3JldmUgamF2b3JlIHRlIHN0dWRpbWl0IGtlbWkgMC4yOSAgcnJpdGplICB0ZSBuamVzaXNlIHNlIHBpa2V2ZSBuZSBwcm92aW1pbiBlIGJpb2xvZ2ppc2UgZGhlIHBlciBrZXRlIG5hIG5kaWhtb2kgbmRlcnRpbWkgaSBtb2RlbGl0IHBlciAyIG5kcnlzaG9yZXQga3Uga29lZmljaWVudGkgcHJhbmUgd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMgZXNodGUgMC4yOSBkaGUgb3JkaW5hdGEgNzUuMTggTWUgcG9zaHRlIGplcGV0IG5kZXJ0aW1pIGkgZHJlanRlemVzIHNlIHJlZ3Jlc2l0Lg0KDQokJGhpc3Rvcnktc2NvcmUgPSAgMC4yOSp3ZWVrbHktc2VsZi1zdHVkeS1ob3VyKzc1LjE4JCQNCmBgYHtyfQ0KbGlicmFyeShnZ3B1YnIpDQpnZ3Bsb3Qoc3R1ZGVudF9zY29yZXMsYWVzKHdlZWtseV9zZWxmX3N0dWR5X2hvdXJzLHk9aGlzdG9yeV9zY29yZSkpK2dlb21fcG9pbnQoc2l6ZT0xLGNvbG9yPSJyZWQiKStnZW9tX3Ntb290aChtZXRob2Q9bG0sZm9ybXVsYT15fngsY29sb3I9Im9yYW5nZSIpK3N0YXRfY29yKGxhYmVsLnggPTIsbGFiZWwueT03LjUpK3N0YXRfcmVnbGluZV9lcXVhdGlvbihsYWJlbC54PTgsbGFiZWwueT0xLHNpemU9NCkrbGFicyh4PSJPcmV0IGphdm9yZSB0ZSBzdHVkaW1pdCIseT0iUmV6dWx0YXRpIG5lIGhpc3RvcmkiLHRpdGxlPSIiKQ0KYGBgDQoNCkdyYWZpa3UgdHJlZ29uIG5qw6sgdGVuZGVuY8OrIHBveml0aXZlLiBLam8gZG8gdMOrIHRob3TDqyBzZSBzYSBtw6sgc2h1bcOrIG9yw6sgc3R1ZGltaSBuw6sgamF2w6ssIGFxIG3DqyB0w6sgbGFydGEgamFuw6sgcmV6dWx0YXRldCBuw6sgaGlzdG9yaS4gS2pvIMOrc2h0w6sgZSBkdWtzaG1lIG5nYSB2aWphIGUgcmVncmVzaW9uaXQgccOrIHJyaXRldCBtZSBycml0amVuIGUgb3LDq3ZlIHTDqyBzdHVkaW1pdC4gUGlrYSB0w6sgc2hww6tybmRhcmEgcnJldGggdmlqw6tzIHPDqyByZWdyZXNpb25pdCB0cmVnb2puw6sgdmFyaWFiaWxpdGV0aW4gZSByZXp1bHRhdGV2ZS4gRGlzYSBzdHVkZW50w6sga2Fuw6sgcmV6dWx0YXRlIHTDqyBsYXJ0YSBlZGhlIHBzZSBudWsgc3R1ZGlvam7DqyBzaHVtw6ssIG5kw6tyc2EgdMOrIHRqZXLDqyBrYW7DqyByZXp1bHRhdGUgdMOrIHVsw6t0YSBlZGhlIHBzZSBzdHVkaW9qbsOrIHNodW3Dqy4gRGlzYSBwaWvDqyBqYW7DqyBsYXJnIHZpasOrcyBzw6sgcmVncmVzaW9uaXQuIEvDq3RvIGphbsOrIHJhc3RlIGt1IHN0dWRlbnTDq3Qga2Fuw6sgcmV6dWx0YXRlIHTDqyBuZHJ5c2htZSBuZ2EgcHJpdHNobcOrcml0w6sgZSB2aWrDq3Mgc8OrIHJlZ3Jlc2lvbml0LiBNdW5kIHTDqyBqZW7DqyBmYWt0b3LDqyB0w6sgdGplcsOrIHHDqyBuZGlrb2puw6sgbsOrIHJlenVsdGF0ZSwgcMOrcnZlw6cgb3LDq3ZlIHTDqyBzdHVkaW1pdC4NCg0KYGBge3J9DQpjb3Ioc3R1ZGVudF9zY29yZXMkd2Vla2x5X3NlbGZfc3R1ZHlfaG91cnMsc3R1ZGVudF9zY29yZXMkaGlzdG9yeV9zY29yZSkNCmBgYA0KDQpOZXBlcm1qZXQgZnVua3Npb25pdCBjb3IgZ2plam1lIHZsZXJlbiBlIGtvZWZpY2llbnRpdCB0ZSBrb3JyZWxhY2lvbml0LiBNZXNhIHNob2hpbSBram8gdmxlcmUgZXNodGUgcG96aXRpdmUsIGdqZSBxZSB0cmVnb24gcGVyIG5qZSBtYXJyZWRoZW5pZSB0ZSBkcmVqdGUgbWVzIGR5IG5kcnlzaG9yZXZlLCBwcmEgbWUgcnJpdGplbiBlIG5qZXJlcyBycml0ZXQgZGhlIHRqZXRyYS4NCg0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsaV85KQ0KYGBgDQoNClZsZXJhIG1pbmltYWxlIGUgdmFyaWFibMOrcyB0w6sgdmFydXIgw6tzaHTDqyAtMjYuMzQyMyAuVmxlcmEgbWFrc2ltYWxlIGUgdmFyaWFibMOrcyB0w6sgdmFydXIgw6tzaHTDqyAyNC44MTc4LlZsZXJhIGUgbWVkaWFuaXQgw6tzaHTDqyAwLjU1MTYgLiAgS2pvIGRvIHTDqyB0aG90w6sgc2UgZ2p5c21hIGUgc3R1ZGVudMOrdmUga2Fuw6sgbmrDqyByZXp1bHRhdCBtYXRlbWF0aWvDqyBtw6sgdMOrIHVsw6t0IHNlIDAuNTUxNiBwaWvDqyBkaGUgZ2p5c21hIHRqZXTDq3Iga2EgbmrDqyByZXp1bHRhdCBtw6sgdMOrIGxhcnTDqy4gS3VhcnRpbGkgaSBwYXJlIMOrc2h0w6sgLTEwLjA0MzYsIG5kw6tyc2Ega3VhcnRpbGkgaSB0cmV0ZSDDq3NodMOrICA5Ljg5NDcgLlZsZXJhIGUgcC12bGVyZXMgZXNodGUgbWUgZSB2b2dlbCBzZSAwLjA1IGdqZSBxZSBuYSB0cmVnb24gbmplIGxpZGhqZSB0ZSByZW5kZXNpc2htZSBzdGF0aXN0aWtvcmUgbmRlcm1qZXQgbmRyeXNob3JldmUNClJlc2lkdWFsIHN0YW5kYXJkIGVycm9yIGVzaHRlICBlIHZvZ2VsIGdqZSBxZSBuYSB0cmVnb24gc2UgdmxlcmF0IHFlIGplcCBtb2RlbGkgamFuZSBhZmVyIHZsZXJhdmUgcmVhbGUuIFBlcm1lcyBSLXNxdWFyZWQga3VwdG9qbWUgc2UgNy41ODQlIGUgdGUgZGhlbmF2ZSBzaHBqZWdvaGVuIG5nYSBtb2RlbGkuDQoNCmBgYHtyfQ0KdmVrdG9yaTg8LWZpdHRlZC52YWx1ZXMobW9kZWxpXzkpDQpWaWV3KHZla3Rvcmk4KQ0KcHJlZGljdChtb2RlbGlfOSwgbGlzdCh3ZWVrbHlfc2VsZl9zdHVkeV9ob3Vycz1jKDEsMiwzLDQsNSkpKQ0KYGBgDQoNCk1lIHNpcGVyIGphbmUgZGlzYSB2bGVyYSB0ZSBwYXJhc2hpa3VhcmEgdGUgbW9kZWxpdCBkdWtlIGRoZW5lIGRpc2EgdmxlcmEgdGUgbmRyeXNob3JlcyBzZSBwYXZhcnVyLg0KDQpgYGB7cn0NCm1iZXRqZXQ8LXJlc2lkdWFscyhtb2RlbGlfOSkNCnN1bShtYmV0amV0KQ0KYGBgDQoNCk1iZXRqYSBlc2h0ZSBkaXN0YW5jYSBuZGVybWpldCB2bGVyZXMgYWt0dWFsZSBkaGUgYXNhaiBxZSBqZXAgbW9kZWxpIHFlIGtlbWkgbmRlcnR1YXIuDQoNCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwyKSkNCnBsb3QobW9kZWxpXzkpDQpwYXIobWZyb3c9YygxLDEpKQ0KYGBgDQoNCkdyYWZpa3UgaSBwYXJlIG5hIHRyZWdvbiBxZSBrZW1pIG5qZSB2YXJlc2kgbGluZWFyZSBuZGVybWpldCB0ZSBkaGVuYXZlIHRvbmEgZGhlIGRldmlqaW1pIHN0YW5kYXJkIGVzaHRlIGtvbnN0YW50IHBvdGh1YWpzZShtYmV0amV0IGRoZSB2bGVyYXQgZSBwZXJhZnJ1YXJhIGpvIHRlIGtvcnJlbHVhcmEpLCBwcmEga2VtaSBob21vc2tlZGFzdGljaXRldC4NCkdyYWZpa3UgaSAyIE5vcm1hbCBRLVEgcGVyZG9yZXQgcGVyIHRlIHRyZWd1YXIgbmVzZSB0ZSBkaGVuYXQgdG9uYSBqYW5lIG5nYSBuamUgc2hwZXJuZGFyamUgbm9ybWFsZS4gUGlrYXQgbmUga2V0ZSByYXN0IHNodHJpaGVuIG5lIG5qZSB2aWplIHRlIGRyZWp0ZSBkaWFnb25hbGUsIHByYSB0ZSBkaGVuYXQgdG9uZSB2aWpuZSBuZ2EgbmplIHNocGVybmRhcmplIG5vcm1hbGUuDQpOZSBncmFmaWt1biBlIHRyZXRlLCBuZSBkYWxsaW0gbmdhIGdyYWZpa3UgaSBwYXJlIG5lIGJvc2h0aW4gdmVydGlrYWwga2VtaSBtYmV0amV0IGUgc3RhbmRhcnRpenVhcmEuUG8gdGUgc2hvaGltIHZpamVuIGUga3VxZSBham8gZXNodGUgcmVuZXNlKHpicml0ZXNlKSBwcmEgbWUgcnJpdGplbiBlIHZsZXJhdmUgdGUgcGVyYWZydWFyYSBrZW1pIG5qZSByZW5pZSB0ZSBtYmV0amV2ZSAobnVrIGtlbWkgaG9tb3NrZWRhc3RpY2l0ZXQpLg0KTmUgZ3JhZmlrdW4gZSBrYXRlcnQga2VtaSBuamUgdmlqZSBxZSBxdWhldCBDb29rJ3MgZGlzdGFuY2UsIG5nYSBlIGNpbGEgbmVzZSBrZW1pIHZsZXJhIGphc2h0ZSBzYWosYXRvIGthbmUgbmRpa2ltIHRlIG1hZGggbmUga29lZmljaWVudGV0IGUgbW9kZWxpdCBlIG5lc2UgaSBoZXFpbSBrZXRvIHZsZXJhLCBtb2RlbGkgZG8gcGVzb250ZSBuZHJ5c2hpbWUgdGUgbWVkaGEuDQoNCiMjIyAqKmByIGNvbG9yaXNlKCJQZXJmdW5kaW1ldCIsInB1cnBsZSIpYCoqDQoNCk5lIGtldGUgcHVuaW0gamFuZSBzdHVkaXVhciBhcnJpdGpldCBlIDIwMDAgc3R1ZGVudGV2ZSBuZSBwcm92aW1ldCBlIG1hdGVtYXRpa2VzLGZpemlrZXMsaGlzdG9yaXNlLGtpbWlzZSxnamVvZ3JhZmlzZSxhbmdsaXNodGVzLGJpb2xvZ2ppc2UgcGVyIHRlIGdqaXRoZSBzdHVkZW50ZXQgb3JldCBlIHN0dWRpbWl0IG5lIGphdmUsIGdqaW5pYSBlIHR5cmUsbnVtcmkgaSBtdW5nZXNhdmUgZ2phdGUgdml0aXQgc2hrb2xsb3IsYWt0aXZpdGV0ZXQganNodGVzaGtvbGxvcmUsbmVzZSBqYW5lIHRlIHB1bmVzdWFyIG1lIGtvaGUgdGUgcGplc3NobWUgb3NlIGpvLg0KR2phdGUgYW5hbGl6aW1pdCB0ZSB0ZSBkaGVuYXZlIHRvbmEgdSBzaHF5cnR1YSBzZSBwamVzYSBtZSBlIG1hZGhlIGUgc3R1ZGVudGV2ZSBudWsga3J5ZW5pbiBha3Rpdml0ZXRlIGphc2h0ZXNoa29sb3JlIG9zZSBpc2hpbiB0ZSBwdW5zdWFyIHBhcnQtdGltZS4NClByb2Zlc2lvbmV0IG1lIHRlIGFzcGlydWFyYSBwZXIgc3R1ZGVudGV0IGlzaGluIHNvZnR3YXJlIGVuZ2luZWVyIG1lIG1iaSAzMDAgc3R1ZGVudGUgcGFzdWFyIG5nYSBidXNpbmVzcyBvd25lcixuZGVyc2EgYXRvIG1lIHBhayB0ZSBhc3BpcnVhcmEgaXNoaW4gc2NpZW50aXN0IHBhc3VhciBuZ2Egd3JpdGVyLg0KTmVzZSBkbyB0ZSBrcmFoYXNvbmltIHBlcmZvcm1hbmNlbiBuZSBwcm92aW1lIG5lIGJhemUgdGUgZ2ppbmlzZSB0ZSBzdHVkZW50ZXZlLCB2aWhldCByZSBzZSBwZXJmb3JtYW5jYSBtZSBlIG1pcmUgbmUgcGplc2VuIG1lIHRlIG1hZGhlIHRlIGxlbmRldmUgdSByZWFsaXp1YSBuZ2EgbWVzaGt1anQsIHBvciBkaGUgZmVtcmF0IGthbmUgcGF0dXIgcmV6dWx0YXRlIHRlIGxhcnRhIG5lIHByb3ZpbWluIGUgZ2plb2dyYWZpc2Uga3J5ZXNpc2h0Lg0KR2phdGUgc3R1ZGltaXQgdGUgZmFrdG9yZXZlIHFlIG5kaWtvam5lIG5lIG51bXJpbiBlIG11bmdlc2F2ZSB0ZSBzdHVkZW50ZXZlIHZpaGV0IHJlIHNlIDEyLjUlIGtpc2h0ZSBuZGlraW0gcHVuc2ltaSBwYXJ0LXRpbWUgaSBzdHVkZW50ZXZlIGRoZSAyMCUgbWFycmphIG1lIGFrdGl2aXRldGUgamFzaHRlc2hrb2xsb3JlLg0KTmVwZXJtamV0IGFuYWxpemltaXQgdGUgbmplIG5kZXJsaWRoamVqZSBtaWRpcyBvcmV2ZSBqYXZvcmUgdGUgc3R1ZGltaXQgZGhlIHBpa2V2ZSB0ZSBtYXJyYSBuZSBwcm92aW1lIHZpaGV0IHJlIHNlIHNhIG1lIHNodW1lIG9yZSBzdHVkZW50ZXQga2Fsb2puZSBkdWtlIHN0dWRpdWFyIGFxIG1lIHRlIGxhcnRhIGphbmUgcmV6dWx0YXRhdCBlIHByb3ZpbWV2ZSxwb3Iga2VtaSBkaGUgcmFzdGUga3VyIHNocGVuem9qbmUgbWUgcGFrIG9yZSBzdHVkaW1pIHBvciBkYWxpbiBtZSByZXp1bHRhdGUgdGUgbGFydGEuDQpOZ2Egc3RhdGlzdGlrYXQgZSBrcnllcmEgcnJldGggNDQuMTUlIGUgc3R1ZGVudGV2ZSBraXNoaW4gZGFsZSBtaXJlIG5lIHRlIGdqaXRoYSBwcm92aW1ldC4NCg0K