Data from Busola Electorala between 11 Nov 2016 - 10 December 2016

This document provides descriptive statistics, offering an overwiew of the data we collected through https://pressone.ro/busola/.

The document unfolds as follows:

In the top right, there’s a button called Code. If you press Hide All Code, the R code will disappear and you are left with the results. I suggest doing that, it’s easier to read.

library(foreign)
library(ggplot2)
options(digits=2)
ro <- read.csv("C:/Users/poppr/Desktop/Romania data 2016.csv", header = TRUE)

First things first: we want to know how many people went through all 30 statements. We discard the others.

ro <- subset(ro, answered_all_statements != 0)
length(ro$answered_all_statements)
[1] 15022

That leaves us with 15.022 people who were able to see their position in the political landscape after going through all statements. You can your position even if you fill out the tool partially, but the results won’t be accurate.
All the analysis from now on is based on this sample of 15.022.

Let’s see where the users come from:
This is additional data we collect, not asked in the survey

ro$country[ro$country==""] <- NA
prop.table(table(ro$country)) * 100

                                      Algeria                 Angola              Australia                Austria 
                0.0000                 0.0067                 0.0067                 0.0400                 0.3068 
               Belarus                Belgium Bosnia and Herzegovina                 Brazil               Bulgaria 
                0.0067                 0.7536                 0.0000                 0.0067                 0.0600 
              Cambodia               Cameroon                 Canada             Cape Verde               Colombia 
                0.0000                 0.0067                 0.2401                 0.0067                 0.0133 
               Croatia                 Cyprus         Czech Republic                Denmark                Finland 
                0.0133                 0.0067                 0.0800                 0.3001                 0.0267 
                France                Germany                 Greece               Guernsey              Hong Kong 
                0.7669                 1.4138                 0.0000                 0.0067                 0.0133 
               Hungary                Iceland                  India              Indonesia                Ireland 
                0.2401                 0.0133                 0.0467                 0.0067                 0.1000 
                Israel                  Italy                  Japan                Lebanon                Liberia 
                0.0133                 0.3401                 0.0133                 0.0067                 0.0067 
         Liechtenstein             Luxembourg              Macedonia               Malaysia                  Malta 
                0.0067                 0.0734                 0.0133                 0.0067                 0.0133 
                Mexico                 Monaco                Morocco            Netherlands                Nigeria 
                0.0067                 0.0067                 0.0133                 0.5068                 0.0200 
                Norway                   Oman                   Peru                 Poland               Portugal 
                0.0467                 0.0067                 0.0067                 0.0800                 0.0934 
           Puerto Rico                  Qatar      Republic of Korea  Republic of Lithuania    Republic of Moldova 
                0.0067                 0.0133                 0.0067                 0.0200                 0.0734 
               Romania           Saudi Arabia                 Serbia              Singapore        Slovak Republic 
               89.9166                 0.0000                 0.0400                 0.0267                 0.0200 
              Slovenia            South Sudan                  Spain              Sri Lanka                 Sweden 
                0.0200                 0.0067                 0.2934                 0.0067                 0.1801 
           Switzerland                 Taiwan               Thailand                 Turkey                Ukraine 
                0.1467                 0.0067                 0.0133                 0.0200                 0.0200 
  United Arab Emirates         United Kingdom          United States                unknown              Venezuela 
                0.0200                 2.0874                 0.9270                 0.3401                 0.0067 
               Vietnam 
                0.0133 

Now, let’s move on to more interesting stuff:

Let’s have a look at the demographics. We ask these questions in the beginning of the tool, and quite a few people fill in this information. The variables are collected separatelly for people who took the survey on their phone, that’s why there are two variables for gender. You need to look at the last 2 rows, where coded 0 are females, code 1 are males.

ro$male <- ifelse(ro$background_question_0==0, 1,
           ifelse(ro$background_question_0==1, 0,
                NA))
   
ro$malem <- ifelse(ro$background_question_1_is_mobile==0, 1,
            ifelse(ro$background_question_1_is_mobile==1, 0,
                         NA))
ro$male[is.na(ro$male)] <- ro$malem[is.na(ro$male)]
prop.table(table(ro$male)) * 100

 0  1 
31 69 

So there are 69% (4953) men and 31% (2263) women. This is quite normal, as men are more interested in politics than women.
Next, age. I’ll create age categories, 18-29 coded 1, 30-49 coded 2, 50-64 coded 3 and 65+ coded 4

ro$age <- 2016 - (ro$background_question_2 + 1910)
ro$age[ro$age < 18] <- NA
ro$age[ro$age >= 18 & ro$age <= 29] <- 1
ro$age[ro$age >= 30 & ro$age <= 49] <- 2
ro$age[ro$age >= 50 & ro$age <= 64] <- 3
ro$age[ro$age >= 65] <- 4
ro$agea <- 2016 - (ro$background_question_3_is_mobile + 1910)
ro$agea[ro$agea < 18] <- NA
ro$agea[ro$agea >= 18 & ro$agea <= 29] <- 1
ro$agea[ro$agea >= 30 & ro$agea <= 49] <- 2
ro$agea[ro$agea >= 50 & ro$agea <= 64] <- 3
ro$agea[ro$agea >= 65] <- 4
ro$age[is.na(ro$age)] <- ro$agea[is.na(ro$age)]
prop.table(table(ro$age)) * 100

   1    2    3    4 
43.2 44.3  9.0  3.4 

I can make smaller age brackets if needed.
We move on to education 0 - no education, 1 - elementary school, 2 - high school, 3 - university degree, master and PhD, 4 - post doctoral studies

ro$edu <- ifelse(ro$background_question_4==0, 0, 
          ifelse(ro$background_question_4==1, 1,
          ifelse(ro$background_question_4==2, 2,
          ifelse(ro$background_question_4==4, 4,
          ifelse(ro$background_question_4=="Facultate\nMasterat/Doctorat", 3,
          ifelse(ro$background_question_4=="Posztgraduális végzettség ", 4,
                 NA))))))
ro$edum <- ifelse(ro$background_question_5_is_mobile==0, 0, 
           ifelse(ro$background_question_5_is_mobile==1, 1,
           ifelse(ro$background_question_5_is_mobile==2, 2,
           ifelse(ro$background_question_5_is_mobile==4, 4,
           ifelse(ro$background_question_5_is_mobile=="Facultate\nMasterat/Doctorat", 3,
           ifelse(ro$background_question_5_is_mobile=="Posztgraduális végzettség ", 4,
                 NA))))))
ro$edu[is.na(ro$edu)] <- ro$edum[is.na(ro$edu)]
table(ro$edu)

   0    1    2    3    4 
  23  107 1570 4847  483 
prop.table(table(ro$edu)) * 100

    0     1     2     3     4 
 0.33  1.52 22.33 68.95  6.87 

As expected, mostly highly educated people.

Now, we can see the city where people intend to vote (for this type of election, you can only vote in the electoral circumscription you belong to, which is usually the hometown)

ro$location <- 0
ro$location[is.na(ro$background_question_8)] <- NA # overwrite 0's with NA's if background_question_8 is NA
ro$location[ro$background_question_8==0]  <- "Alba"
ro$location[ro$background_question_8==1]  <- "Arad"
ro$location[ro$background_question_8==2]  <- "Arges"
ro$location[ro$background_question_8==3]  <- "Bacau"
ro$location[ro$background_question_8==4]  <- "Bihor"
ro$location[ro$background_question_8==5]  <- "Bistrita-Nasaud"
ro$location[ro$background_question_8==6]  <- "Botosani"
ro$location[ro$background_question_8==7]  <- "Brasov"
ro$location[ro$background_question_8==8]  <- "Braila"
ro$location[ro$background_question_8==9]  <- "Bucuresti"
ro$location[ro$background_question_8==10] <- "Buzau"
ro$location[ro$background_question_8==11] <- "Caras-Severin"
ro$location[ro$background_question_8==12] <- "Calarasi"
ro$location[ro$background_question_8==13] <- "Cluj"
ro$location[ro$background_question_8==14] <- "Constanta"
ro$location[ro$background_question_8==15] <- "Covasna"
ro$location[ro$background_question_8==16] <- "Dambovita"
ro$location[ro$background_question_8==17] <- "Dolj"
ro$location[ro$background_question_8==18] <- "Galati"
ro$location[ro$background_question_8==19] <- "Giurgiu"
ro$location[ro$background_question_8==20] <- "Gorj"
ro$location[ro$background_question_8==21] <- "harghita"
ro$location[ro$background_question_8==22] <- "Hunedoara"
ro$location[ro$background_question_8==23] <- "Ialomita"
ro$location[ro$background_question_8==24] <- "Iasi"
ro$location[ro$background_question_8==25] <- "Ilfov"
ro$location[ro$background_question_8==26] <- "Maramures"
ro$location[ro$background_question_8==27] <- "Mehendinti"
ro$location[ro$background_question_8==28] <- "Mures"
ro$location[ro$background_question_8==29] <- "Neamt"
ro$location[ro$background_question_8==30] <- "Olt"
ro$location[ro$background_question_8==31] <- "Prahova"
ro$location[ro$background_question_8==32] <- "Satu Mare"
ro$location[ro$background_question_8==33] <- "Salaj"
ro$location[ro$background_question_8==34] <- "Sibiu"
ro$location[ro$background_question_8==35] <- "Suceava"
ro$location[ro$background_question_8==36] <- "Teleorman"
ro$location[ro$background_question_8==37] <- "Timis"
ro$location[ro$background_question_8==38] <- "Tulcea"
ro$location[ro$background_question_8==39] <- "Vaslui"
ro$location[ro$background_question_8==40] <- "Valcea"
ro$location[ro$background_question_8==41] <- "Vrancea"
ro$location[ro$background_question_8==42] <- "Strainatate"
ro$locationm <- 0
ro$locationm[is.na(ro$background_question_9_is_mobile)] <- NA # overwrite 0's with NA's if background_question_8 is NA
ro$locationm[ro$background_question_9_is_mobile==0]  <- "Alba"
ro$locationm[ro$background_question_9_is_mobile==1]  <- "Arad"
ro$locationm[ro$background_question_9_is_mobile==2]  <- "Arges"
ro$locationm[ro$background_question_9_is_mobile==3]  <- "Bacau"
ro$locationm[ro$background_question_9_is_mobile==4]  <- "Bihor"
ro$locationm[ro$background_question_9_is_mobile==5]  <- "Bistrita-Nasaud"
ro$locationm[ro$background_question_9_is_mobile==6]  <- "Botosani"
ro$locationm[ro$background_question_9_is_mobile==7]  <- "Brasov"
ro$locationm[ro$background_question_9_is_mobile==8]  <- "Braila"
ro$locationm[ro$background_question_9_is_mobile==9]  <- "Bucuresti"
ro$locationm[ro$background_question_9_is_mobile==10] <- "Buzau"
ro$locationm[ro$background_question_9_is_mobile==11] <- "Caras-Severin"
ro$locationm[ro$background_question_9_is_mobile==12] <- "Calarasi"
ro$locationm[ro$background_question_9_is_mobile==13] <- "Cluj"
ro$locationm[ro$background_question_9_is_mobile==14] <- "Constanta"
ro$locationm[ro$background_question_9_is_mobile==15] <- "Covasna"
ro$locationm[ro$background_question_9_is_mobile==16] <- "Dambovita"
ro$locationm[ro$background_question_9_is_mobile==17] <- "Dolj"
ro$locationm[ro$background_question_9_is_mobile==18] <- "Galati"
ro$locationm[ro$background_question_9_is_mobile==19] <- "Giurgiu"
ro$locationm[ro$background_question_9_is_mobile==20] <- "Gorj"
ro$locationm[ro$background_question_9_is_mobile==21] <- "harghita"
ro$locationm[ro$background_question_9_is_mobile==22] <- "Hunedoara"
ro$locationm[ro$background_question_9_is_mobile==23] <- "Ialomita"
ro$locationm[ro$background_question_9_is_mobile==24] <- "Iasi"
ro$locationm[ro$background_question_9_is_mobile==25] <- "Ilfov"
ro$locationm[ro$background_question_9_is_mobile==26] <- "Maramures"
ro$locationm[ro$background_question_9_is_mobile==27] <- "Mehendinti"
ro$locationm[ro$background_question_9_is_mobile==28] <- "Mures"
ro$locationm[ro$background_question_9_is_mobile==29] <- "Neamt"
ro$locationm[ro$background_question_9_is_mobile==30] <- "Olt"
ro$locationm[ro$background_question_9_is_mobile==31] <- "Prahova"
ro$locationm[ro$background_question_9_is_mobile==32] <- "Satu Mare"
ro$locationm[ro$background_question_9_is_mobile==33] <- "Salaj"
ro$locationm[ro$background_question_9_is_mobile==34] <- "Sibiu"
ro$locationm[ro$background_question_9_is_mobile==35] <- "Suceava"
ro$locationm[ro$background_question_9_is_mobile==36] <- "Teleorman"
ro$locationm[ro$background_question_9_is_mobile==37] <- "Timis"
ro$locationm[ro$background_question_9_is_mobile==38] <- "Tulcea"
ro$locationm[ro$background_question_9_is_mobile==39] <- "Vaslui"
ro$locationm[ro$background_question_9_is_mobile==40] <- "Valcea"
ro$locationm[ro$background_question_9_is_mobile==41] <- "Vrancea"
ro$locationm[ro$background_question_9_is_mobile==42] <- "Strainatate"
ro$location[is.na(ro$location)] <- ro$locationm[is.na(ro$location)]
table(ro$location)

           Alba            Arad           Arges           Bacau           Bihor Bistrita-Nasaud        Botosani          Braila 
            133             107              95              98             162              61              40              38 
         Brasov       Bucuresti           Buzau        Calarasi   Caras-Severin            Cluj       Constanta         Covasna 
            230            2464              84              34              35             753             202              18 
      Dambovita            Dolj          Galati         Giurgiu            Gorj        harghita       Hunedoara        Ialomita 
             68              94             105              26              43              36              83              39 
           Iasi           Ilfov       Maramures      Mehendinti           Mures           Neamt             Olt         Prahova 
            342             154              61              41              96              62              35             155 
          Salaj       Satu Mare           Sibiu     Strainatate         Suceava       Teleorman           Timis          Tulcea 
             56              39             143             398              94              53             355              39 
         Valcea          Vaslui         Vrancea 
             51              46              52 

There are 398 people who will vote abroad. now it’s a small sample, maybe later is worth doing some sort of analysis on them.

We break down the location according to regions (NUTS2). I am doing this because the ultimate goal is to weight the data (using census data, trying to make the data more representative)

ro$regiune <- 0
ro$regiune[is.na(ro$location)] <- NA # overwrite 0's with NA's if background_question_8 is NA
# Nord-Vest - RO11; Bihor, Bistrita-Nasaud, Cluj, Maramures, Satu Mare, Salaj
ro$regiune[ro$location=="Bihor"] <-         "RO11"
ro$regiune[ro$location=="Cluj"] <-          "RO11"
ro$regiune[ro$location=="Bistrita-Nasaud"]<-"RO11"
ro$regiune[ro$location=="Maramures"] <-     "RO11"
ro$regiune[ro$location=="Satu Mare"] <-     "RO11"
ro$regiune[ro$location=="Salaj"] <-         "RO11"
# Centru - RO12; Alba, Brasov, Covasna, Harghita, Mures, Sibiu
ro$regiune[ro$location=="Alba"] <-       "RO12"
ro$regiune[ro$location=="Brasov"] <-     "RO12"
ro$regiune[ro$location=="Covasna"] <-    "RO12"
ro$regiune[ro$location=="Harghita"] <-   "RO12"
ro$regiune[ro$location=="Mures"] <-      "RO12"
ro$regiune[ro$location=="Sibiu"] <-      "RO12"
# Nord-Est - RO21; Bacau, Botosani, Iasi, Neamt, Suceava, Vaslui
ro$regiune[ro$location=="Bacau"] <-      "RO21"
ro$regiune[ro$location=="Botosani"] <-   "RO21"
ro$regiune[ro$location=="Iasi"] <-       "RO21"
ro$regiune[ro$location=="Neamt"] <-      "RO21"
ro$regiune[ro$location=="Suceava"] <-    "RO21"
ro$regiune[ro$location=="Vaslui"] <-     "RO21"
# Sud-Est - RO22;  Braila, Buzau, Constanta, Galati, Tulcea, Vrancea
ro$regiune[ro$location=="Braila"] <-     "RO22"
ro$regiune[ro$location=="Buzau"] <-      "RO22"
ro$regiune[ro$location=="Constanta"] <-  "RO22"
ro$regiune[ro$location=="Galati"] <-     "RO22"
ro$regiune[ro$location=="Tulcea"] <-     "RO22"
ro$regiune[ro$location=="Vrancea"] <-    "RO22"
# Sud - Muntenia - RO31; Arges, Calarasi, Dambovita, Giurgiu, Ialomita, Prahova, Teleorman
ro$regiune[ro$location=="Arges"] <-      "RO31"
ro$regiune[ro$location=="Calarasi"] <-   "RO31"
ro$regiune[ro$location=="Dambovita"] <-  "RO31"
ro$regiune[ro$location=="Giurgiu"] <-    "RO31"
ro$regiune[ro$location=="Ialomita"] <-   "RO31"
ro$regiune[ro$location=="Prahova"] <-    "RO31"
ro$regiune[ro$location=="Teleorman"] <-  "RO31"
# Bucuresti - Ilfov - RO32; Bucuresti, Ilfov
ro$regiune[ro$location=="Bucuresti"] <-  "RO32"
ro$regiune[ro$location=="Ilfov"] <-      "RO32"
# Sud-Vest Oltenia - RO41; Dolj, Gorj, Mehedinti, Olt, Valcea
ro$regiune[ro$location=="Dolj"] <-       "RO41"
ro$regiune[ro$location=="Gorj"] <-       "RO41"
ro$regiune[ro$location=="Mehedinti"] <-  "RO41"
ro$regiune[ro$location=="Olt"] <-        "RO41"
ro$regiune[ro$location=="Valcea"] <-     "RO41"
# Vest - RO42; Arad, Caras-Severin, Hunedoara, Timis
ro$regiune[ro$location=="Arad"] <-        "RO42"
ro$regiune[ro$location=="Caras-Severin"]<-"RO42"
ro$regiune[ro$location=="Hunedoara"] <-   "RO42"
ro$regiune[ro$location=="Timis"] <-       "RO42"
# strainatate = abroad
ro$regiune[ro$location=="Strainatate"] <- "abroad"
ro$regiune[ro$regiune==0] <- NA
table(ro$regiune)

abroad   RO11   RO12   RO21   RO22   RO31   RO32   RO41 

After we have an idea about who the users are and where they come from, let’s look into their political affilition. Here we see for which coalition they voted for in the last parliamentary elections of 2012. Here we miss quite a few users, because they dont remember who they voted for (tipically).

ro$voterec <- 0
ro$voterec[is.na(ro$background_question_10)] <- NA
ro$voterec <- ifelse(ro$background_question_10==0, "USL",
              ifelse(ro$background_question_10==1, "ARD",
              ifelse(ro$background_question_10==2, "PPDD",
              ifelse(ro$background_question_10==3, "UDMR",
              ifelse(ro$background_question_10==4, "other",
              ifelse(ro$background_question_10==6, "did not vote",
                     NA))))))
ro$voterecm <- 0
ro$voterecm[is.na(ro$background_question_11_is_mobile)] <- NA
ro$voterecm <- ifelse(ro$background_question_11_is_mobile==0, "USL",
               ifelse(ro$background_question_11_is_mobile==1, "ARD",
               ifelse(ro$background_question_11_is_mobile==2, "PPDD",
               ifelse(ro$background_question_11_is_mobile==3, "UDMR",
               ifelse(ro$background_question_11_is_mobile==4, "other",
               ifelse(ro$background_question_11_is_mobile==6, "did not vote",
                         NA))))))
ro$voterec[is.na(ro$voterec)] <- ro$voterecm[is.na(ro$voterec)]
voterec <- ro[c("voterec")]
voterec <- na.omit(voterec)
voterec$voterec <- factor(voterec$voterec, c("ARD", "PPDD", "UDMR", "USL", "other", "did not vote"))
require(scales)
ggplot(voterec, aes(x = factor(voterec))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "Vot la alegerile parlamentare 2012", x="") + theme_minimal() 

prop.table(table(voterec$voterec)) * 100

         ARD         PPDD         UDMR          USL        other did not vote 
        16.1          1.7          2.9         33.5         14.4         31.4 

We can see who they intend to vote for, which is quite exciting

library(ggplot2)
ro$voteint <- ifelse(ro$popup_question_6==0, "PSD",
              ifelse(ro$popup_question_6==1, "ALDE",
              ifelse(ro$popup_question_6==2, "PNL",
              ifelse(ro$popup_question_6==3, "UDMR",
              ifelse(ro$popup_question_6==4, "USR",
              ifelse(ro$popup_question_6==5, "other",
                            NA))))))
voteint <- ro[c("voteint")]
voteint <- na.omit(voteint)
voteint$voteint <- factor(voteint$voteint, c("ALDE", "PNL", "PSD", "UDMR", "USR", "other"))
ggplot(voteint, aes(x = factor(voteint))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "Intentie de vot la alegerile parlamentare 2016", x="") + theme_minimal() 

prop.table(table(voteint$voteint)) * 100

 ALDE   PNL   PSD  UDMR   USR other 
  5.2  16.4   9.5   2.2  64.6   2.1 

I saved the best for the end: we can see how the users answered on the statements. I used percentages

1 means “Completely dissagree, 3,”Neither agree nor disagree“, 5”“Completely agree”, -1 “No opinion”

Free market makes the health system to function better
Competitia economica libera face sistemul de sanatate sa functioneze mai eficient

ro$statement_0[ro$statement_0=="-1"] <- NA
prop.table(table(ro$statement_0)) * 100

   1    2    3    4    5 
 5.1 13.3 23.1 39.2 19.3 

The number of employees in the public sector should be reduced
Numarul angajatilor din sectorul public ar trebui redus

ro$statement_1[ro$statement_1=="-1"] <- NA
prop.table(table(ro$statement_1)) * 100

   1    2    3    4    5 
 4.4 11.5 15.8 35.0 33.4 

The state should intervene in the economy as little as possible
Statul ar trebui sa intervina cat mai putin posibil in economie

ro$statement_2[ro$statement_2=="-1"] <- NA
prop.table(table(ro$statement_2)) * 100

   1    2    3    4    5 
 7.2 20.3 21.8 33.6 17.1 

Romania should adopt a progressive taxation system
Romania ar trebui sa adopte un sistem de taxare progresiva

ro$statement_3[ro$statement_3=="-1"] <- NA
prop.table(table(ro$statement_3)) * 100

 1  2  3  4  5 
11 17 15 39 18 

Foreign investors are a threat to Romania’s national sovereignty
Investitorii straini sunt o amenintare la suveranitatea nationala a Romaniei

ro$statement_4[ro$statement_4=="-1"] <- NA
prop.table(table(ro$statement_4)) * 100

   1    2    3    4    5 
47.1 29.5 12.6  6.8  3.9 

VTA should be reduced under 20%
TVA trebuie redus sub pragul de 20%

ro$statement_5[ro$statement_5=="-1"] <- NA
prop.table(table(ro$statement_5)) * 100

   1    2    3    4    5 
 2.0  7.7 23.8 41.7 24.9 

Romania should never adopt the euro
Romania ar trebui sa nu adopte niciodata moneda Euro

ro$statement_6[ro$statement_6=="-1"] <- NA
prop.table(table(ro$statement_6)) * 100

   1    2    3    4    5 
26.6 29.7 21.8 12.8  9.1 

International actors (such as EU or USA) have the right to intervene in Romania’s internal affairs if the state of democracy is threatend
Partenerii internationali (precum UE sau SUA) pot interveni in afacerile interne ale Romaniei atunci cand exista o amenintare la adresa democratiei

ro$statement_7[ro$statement_7=="-1"] <- NA
prop.table(table(ro$statement_7)) * 100

 1  2  3  4  5 
15 19 15 37 14 

The strategic partnership with USA is essential for Romania’s national security
Parteneriatul strategic cu SUA este esential pentru securitatea nationala

ro$statement_8[ro$statement_8=="-1"] <- NA
prop.table(table(ro$statement_8)) * 100

   1    2    3    4    5 
 4.0  6.5 16.6 42.0 30.9 

Women should be able to decide on any matters related to abortion
Femeile ar trebui sa aiba libertatea de a decide asupra chestiunilor legate de avort

ro$statement_9[ro$statement_9=="-1"] <- NA
prop.table(table(ro$statement_9)) * 100

   1    2    3    4    5 
 3.3  3.3  5.5 26.6 61.2 

Romania should not receive refugees that try to enter the EU
Romania ar trebui sa accepte mai multi migranti care intra in UE, ca semn de solidaritate

ro$statement_10[ro$statement_10=="-1"] <- NA
prop.table(table(ro$statement_10)) * 100

   1    2    3    4    5 
21.8 21.9 25.1 21.3  9.8 

Gay couples should have the same rights as the heterosexual ones
Cuplurile homosexuale ar trebui sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale

library(ggplot2)
table(ro$statement_11)

  -1    1    2    3    4    5 
 178 2433 1580 1918 3082 5831 
ro$statement_11[ro$statement_11=="-1"] <- NA
ro$statement_11[ro$statement_11=="1"] <- "Total impotriva"
ro$statement_11[ro$statement_11=="2"] <- "Impotriva"
ro$statement_11[ro$statement_11=="3"] <- "Neutru"
ro$statement_11[ro$statement_11=="4"] <- "De acord"
ro$statement_11[ro$statement_11=="5"] <- "Total de acord"
ro$statement_11 <- factor(ro$statement_11, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
ggplot(ro, aes(x = factor(statement_11))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "", y = "Numar utilizatori") + theme_minimal() 

Smoking should be prohibited in all the public places, even the open-space ones
Fumatul trebuie interzis in toate locurile publice, chiar si cele deschise

ro$statement_12[ro$statement_12=="-1"] <- NA
prop.table(table(ro$statement_12)) * 100

 1  2  3  4  5 
16 25 17 19 22 

Immigrants should adopt the values and culture of Romania
Imigrantii ar trebui sa se adapteze la valorile si cultura Romaniei

ro$statement_13[ro$statement_13=="-1"] <- NA
prop.table(table(ro$statement_13)) * 100

   1    2    3    4    5 
 2.1  5.9 14.6 39.7 37.7 

Romania should pursue state unification with Moldova
Romania ar trebui sa urmareasca reunificarea statala cu Republica Moldova

ro$statement_14[ro$statement_14=="-1"] <- NA
prop.table(table(ro$statement_14)) * 100

 1  2  3  4  5 
13 18 30 22 16 

A territorial reform should include the creation of an autonomous Hungarian region
O reforma teritoriala ar trebui sa includa crearea unei regiuni maghiare autonome

ro$statement_15[ro$statement_15=="-1"] <- NA
prop.table(table(ro$statement_15)) * 100

   1    2    3    4    5 
49.8 29.5 12.6  5.3  2.8 
ro$statement_15[ro$statement_15=="1"] <- "Total impotriva"
ro$statement_15[ro$statement_15=="2"] <- "Impotriva"
ro$statement_15[ro$statement_15=="3"] <- "Neutru"
ro$statement_15[ro$statement_15=="4"] <- "De acord"
ro$statement_15[ro$statement_15=="5"] <- "Total de acord"
ro$statement_15 <- factor(ro$statement_15, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
ggplot(ro, aes(x = factor(statement_15))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "O reforma teritoriala ar trebui sa includa \n crearea unei regiuni maghiare autonome", x = "", y = "Numar utilizatori")+ theme_minimal() 

The state should give privileged status to the orthodox church
Statul ar trebui sa acorde un statut privilegiat Bisericii Ortodoxe

ro$statement_16[ro$statement_16=="-1"] <- NA
prop.table(table(ro$statement_16)) * 100

   1    2    3    4    5 
66.9 19.6  7.9  3.6  2.0 
ro$statement_16[ro$statement_16=="1"] <- "Total impotriva"
ro$statement_16[ro$statement_16=="2"] <- "Impotriva"
ro$statement_16[ro$statement_16=="3"] <- "Neutru"
ro$statement_16[ro$statement_16=="4"] <- "De acord"
ro$statement_16[ro$statement_16=="5"] <- "Total de acord"
ro$statement_16 <- factor(ro$statement_16, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
ggplot(ro, aes(x = factor(statement_16))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "Statul ar trebui sa acorde un statut privilegiat Bisericii Ortodoxe", x = "", y = "Numar utilizatori")+ theme_minimal() 

The electoral treshold should be lowered, so smaller parties can gain access to the parliament
Pragul electoral ar trebui redus pentru a permite intrarea partidelor mai mici în parlament

ro$statement_17[ro$statement_17=="-1"] <- NA
prop.table(table(ro$statement_17)) * 100

   1    2    3    4    5 
 9.8 15.4 14.5 33.4 26.9 

The electoral reform should include lowering the number of signatures needed for candidacy for all election types
Numarul de semnaturi pentru candidatura la toate tipurile de alegeri ar trebui redus

ro$statement_18[ro$statement_18=="-1"] <- NA
prop.table(table(ro$statement_18)) * 100

   1    2    3    4    5 
 6.8 12.2 14.4 33.2 33.4 

The number of polling stations for diaspora should be increased for all election types
Numarul de sectii de votare in diaspora trebuie marit pentru toate tipurile de alegeri

ro$statement_19[ro$statement_19=="-1"] <- NA
prop.table(table(ro$statement_19)) * 100

   1    2    3    4    5 
 2.7  4.3  9.3 35.1 48.7 

The postal vote should be introduced for all election types
Votul prin corespondenta ar trebui introdus pentru toate tipurile de alegeri

ro$statement_20[ro$statement_20=="-1"] <- NA
prop.table(table(ro$statement_20)) * 100

   1    2    3    4    5 
 3.2  5.1  8.8 32.8 50.1 

The digitalization of the judicial process should be continued by publishing on-line all the decisions
Digitalizarea procesului judiciar trebuie continuata prin publicarea on-line a tuturor hotararilor judecatoresti

ro$statement_21[ro$statement_21=="-1"] <- NA
prop.table(table(ro$statement_21)) * 100

    1     2     3     4     5 
 0.63  1.16  3.84 33.49 60.89 

Government’s public information must be accessible online
Informatiile publice ale guvernului ar trebui sa fie accesibile on-line

ro$statement_22[ro$statement_22=="-1"] <- NA
prop.table(table(ro$statement_22)) * 100

    1     2     3     4     5 
 0.33  0.29  0.93 26.71 71.74 

The open vote should be introduced for all decisions made in the parliament
Votul deschis trebuie introdus pentru toate deciziile luate in Parlament

ro$statement_23[ro$statement_23=="-1"] <- NA
prop.table(table(ro$statement_23)) * 100

   1    2    3    4    5 
 1.0  4.0  7.9 29.2 57.8 

Politicians prosecuted for corruption should give up any public function
Politicienii urmariti penal pentru fapte de coruptie trebuie sa renunte la orice functie publica

ro$statement_24[ro$statement_24=="-1"] <- NA
prop.table(table(ro$statement_24)) * 100

   1    2    3    4    5 
 2.9  5.5  6.7 16.5 68.4 

MPs should enjoy immunity rights only for votes and declarations
Parlamentarii ar trebui sa aiba imunitate doar pentru voturi si declaratii

ro$statement_25[ro$statement_25=="-1"] <- NA
prop.table(table(ro$statement_25)) * 100

   1    2    3    4    5 
 3.8  5.0  8.9 30.2 52.1 

Governments formed exclusivelly from non-partisan tehnocrats work better than those formed from politicians
Guvernele formate exclusiv din tehnocrati neafiliati politic functioneaza mai bine decat cele formate din politicieni

ro$statement_26[ro$statement_26=="-1"] <- NA
prop.table(table(ro$statement_26)) * 100

   1    2    3    4    5 
10.5  9.6 26.1 28.5 25.3 

Prosecutors have too much power in prosecuting citizens
Procurorii au prea multa putere în ceea ce priveste anchetarea cetatenilor

ro$statement_27[ro$statement_27=="-1"] <- NA
prop.table(table(ro$statement_27)) * 100

   1    2    3    4    5 
12.3 27.2 34.8 17.0  8.7 

The Mechanism of Cooperation and Verification, which tracks progress in the judiciary system reform should be maintained
Mecanismul de Cooperare si Verificare, prin care se verifica progresele in reformarea justitiei, ar trebui inlaturat

ro$statement_28[ro$statement_28=="-1"] <- NA
prop.table(table(ro$statement_28)) * 100

   1    2    3    4    5 
23.7 35.0 26.6  9.6  5.1 

Romania should work on strengthening its diplomatic relations with Rusia
Romania ar trebui sa isi consolideze relatiile diplomatice cu Rusia

ro$statement_29[ro$statement_29=="-1"] <- NA
prop.table(table(ro$statement_29)) * 100

   1    2    3    4    5 
11.3 14.1 31.5 35.3  7.8 

Interest in politics 0 very much, 3 not at all

ro$popup_question_2[ro$popup_question_2==4] <- NA
prop.table(table(ro$popup_question_2)) * 100

   0    1    2    3 
51.0 39.3  7.9  1.8 

Left-right self-positioning, 0 left 10 right

ro$popup_question_3[ro$popup_question_3==11] <- NA
ro$popup_question_3[ro$popup_question_3==12] <- NA
prop.table(table(ro$popup_question_3)) * 100

   0    1    2    3    4    5    6    7    8    9   10 
 3.3  1.9  2.4  4.9  5.4 16.4  9.9 17.5 18.0  6.5 13.7 

Evaluation of Ciolos’ government performance 0 very good, 4 very bad, 5 don’t know

prop.table(table(ro$popup_question_4)) * 100

    0     1     2     3     4     5 
40.13 41.19  3.65  0.92  8.89  5.22 

We can do stacked barplots, looking at age and positions on statements, like this example on the statement on gay marriage

toplot2 <- table(ro$age, ro$statement_11)
toplot2 <- ro[c(67, 109)]
toplot2$age[toplot2$age=="1"] <- "18-29"
toplot2$age[toplot2$age=="2"] <- "30-49"
toplot2$age[toplot2$age=="3"] <- "50-64"
toplot2$age[toplot2$age=="4"] <- "65+"
toplot2$statement_11[toplot2$statement_11=="1"] <- "Total impotriva"
toplot2$statement_11[toplot2$statement_11=="2"] <- "Impotriva"
toplot2$statement_11[toplot2$statement_11=="3"] <- "Neutru"
toplot2$statement_11[toplot2$statement_11=="4"] <- "De acord"
toplot2$statement_11[toplot2$statement_11=="5"] <- "Total de acord"
toplot2$statement_11 <- factor(toplot2$statement_11, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
toplot2 <- na.omit(toplot2) 
library(ggplot2)
library(plyr)
library(reshape2)
library(gridExtra)
k <- ggplot(toplot2, aes(statement_11, fill=age))
k + geom_bar() + scale_fill_brewer() + labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "Opinia utilizatorului", y = "Numar utilizatori") + theme_minimal() 

We can have a look at the same statement, on gay marriage, by eduaction

toplot3 <- ro[c(67, 111)]
# rename factor levels age
toplot3$edu[toplot3$edu=="0"] <- "Nu am fost niciodata la scoala"
toplot3$edu[toplot3$edu=="1"] <- "Scoala generala"
toplot3$edu[toplot3$edu=="2"] <- "Liceu sau scoala profesionala"
toplot3$edu[toplot3$edu=="3"] <- "Facultate/Masterat/Doctorat"
toplot3$edu[toplot3$edu=="4"] <- "Studii postuniversitare"
toplot3$edu <- factor(toplot3$edu, c("Nu am fost niciodata la scoala", "Scoala generala", "Liceu sau Scoala profesionala", "Facultate/Masterat/Doctorat", "Studii postuniversitare"))
toplot3$statement_11[toplot3$statement_11=="1"] <- "Total impotriva"
toplot3$statement_11[toplot3$statement_11=="2"] <- "Impotriva"
toplot3$statement_11[toplot3$statement_11=="3"] <- "Neutru"
toplot3$statement_11[toplot3$statement_11=="4"] <- "De acord"
toplot3$statement_11[toplot3$statement_11=="5"] <- "Total de acord"
toplot3$statement_11 <- factor(toplot3$statement_11, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
toplot3 <- na.omit(toplot3)
l <- ggplot(toplot3, aes(statement_11, fill=edu))
l + geom_bar() + scale_fill_brewer() + labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "Opinia utilizatorului", y = "Numar utilizatori") + theme_minimal() 

And the possibilities are endless! Just tell me what you would like to see in a graph and I’ll do it.

WE can look at the opinions on statements given the user’s political preferences, more precisely the propensity to vote for the parties (I selected PTV > 7, then the party with the maximum value)

ro$PSD <- ifelse(ro$ptv_option_6_question_32 ==7, 7,
             ifelse(ro$ptv_option_6_question_32 ==8, 8,
             ifelse(ro$ptv_option_6_question_32 ==9, 9,
             ifelse(ro$ptv_option_6_question_32 ==10, 10,
                        NA))))
                    
ro$PNL <- ifelse(ro$ptv_option_7_question_32 ==7, 7,
             ifelse(ro$ptv_option_7_question_32 ==8, 8,
             ifelse(ro$ptv_option_7_question_32 ==9, 9,
             ifelse(ro$ptv_option_7_question_32 ==10, 10,
                    NA))))
ro$ALDE <- ifelse(ro$ptv_option_8_question_32 ==7, 7,
              ifelse(ro$ptv_option_8_question_32 ==8, 8,
              ifelse(ro$ptv_option_8_question_32 ==9, 9,
              ifelse(ro$ptv_option_8_question_32 ==10, 10,
                         NA))))
ro$UDMR <- ifelse(ro$ptv_option_9_question_32 ==7, 7,
              ifelse(ro$ptv_option_9_question_32 ==8, 8,
              ifelse(ro$ptv_option_9_question_32 ==9, 9,
              ifelse(ro$ptv_option_9_question_32 ==10, 10,
                      NA))))
ro$USR <- ifelse(ro$ptv_option_10_question_32 ==7, 7,
             ifelse(ro$ptv_option_10_question_32 ==8, 8,
             ifelse(ro$ptv_option_10_question_32 ==9, 9,
             ifelse(ro$ptv_option_10_question_32 ==10, 10,
                     NA))))
ro$PMP <-  ifelse(ro$ptv_option_11_question_32 ==7, 7,
              ifelse(ro$ptv_option_11_question_32 ==8, 8,
              ifelse(ro$ptv_option_11_question_32 ==9, 9,
              ifelse(ro$ptv_option_11_question_32 ==10, 10,
                    NA))))
ptv <- ro[c(119:124)]
ptv$ptvmax <- apply(ptv, 1, function(x) names (x) [which.max(x)])
ptv$ptvmax[ptv$ptvmax=="character(0)"] <- NA
ptv <-ptv[,7]
ptv <- data.frame(unlist(ptv))
toplotgay <- cbind(ptv, ro[c(67)])
toplotgay <- na.omit(toplotgay)
require(ggplot2)
ggplot(toplotgay, aes(x = factor(statement_11))) + geom_bar(stat = "count", fill="darkblue", colour="black") + facet_grid(~ unlist.ptv.)+ labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "1 - Total impotriva, 2 - Impotriva, 3 - Neutru, 4 - De acord, 5 - Total de acord", y = "Numar utilizatori") + theme_minimal() + theme(text = element_text(size=10))

The same approach, different presentation

toplotgay$statement_11[toplotgay$statement_11=="1"] <- "Total impotriva"
toplotgay$statement_11[toplotgay$statement_11=="2"] <- "Impotriva"
toplotgay$statement_11[toplotgay$statement_11=="3"] <- "Neutru"
toplotgay$statement_11[toplotgay$statement_11=="4"] <- "De acord"
toplotgay$statement_11[toplotgay$statement_11=="5"] <- "Total de acord"
toplotgay$statement_11 <- factor(toplotgay$statement_11, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))                                                                                                                          
p <- ggplot(toplotgay, aes(statement_11, fill=unlist.ptv.))
p + geom_bar() + scale_fill_brewer(palette="Spectral") + labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "", y = "Numar utilizatori") + guides(fill=guide_legend(title=NULL)) + theme_minimal() 

LS0tDQp0aXRsZTogIlJPIFZBQSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoqRGF0YSBmcm9tIEJ1c29sYSBFbGVjdG9yYWxhIGJldHdlZW4gMTEgTm92IDIwMTYgLSAxMCBEZWNlbWJlciAyMDE2Kg0KDQpUaGlzIGRvY3VtZW50IHByb3ZpZGVzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MsIG9mZmVyaW5nIGFuIG92ZXJ3aWV3IG9mIHRoZSBkYXRhIHdlIGNvbGxlY3RlZCB0aHJvdWdoIGh0dHBzOi8vcHJlc3NvbmUucm8vYnVzb2xhLy4gIA0KDQojIyMjI1RoZSBkb2N1bWVudCB1bmZvbGRzIGFzIGZvbGxvd3M6IA0KDQoqIGl0IHN0YXJ0cyBieSBzaG93aW5nIHRoZSBsb2NhdGlvbiAgICANCiAgICAgICArIGNvdW50cnkgICANCiAgICAgICArIHN1YmRpdmlzaW9uICAgIA0KICAgICAgICsgcGxhdGZvcm0gdXNlZCB0byB0YWtlIHRoZSBzdXJ2ZXkgICAgDQoqIGRlbW9ncmFwaGljIGluZm9ybWF0aW9uICAgIA0KICAgICAgICsgYWdlICAgDQogICAgICAgKyBnZW5kZXIgICANCiAgICAgICArIGVkdWNhdGlvbiAgIA0KICAgICAgICsgZWxlY3RvcmFsIGNpcmN1bXNjcmlwdGlvbiB0aGUgdXNlcnMgYmVsb25nIHRvDQogICAgICAgKyB2b3RlIHJlY2FsbA0KKiB0aGUgMzAgc3RhdGVtZW50cywgdXNlZCBpbiB0aGUgcG9zaXRpb25pbmcgb2YgdGhlIHVzZXIgaW4gdGhlIHBvbGl0aWNhbCBsYW5kc2NhcGUgDQoqIGV4dHJhIHF1ZXN0aW9ucyBhc2tlZCBpbiB0aGUgcG9wdXAgc3VydmV5LA0KICAgICAgICsgc3VjaCBhcyBnb3Zlcm5tZW50IGV2YWx1YXRpb24NCiAgICAgICArIHZvdGUgaW50ZW50aW9uDQogICAgICAgKyBsZWZ0LXJpZ2h0IHNlbGYtcG9zaXRpb25pbmcgDQogICAgICAgKyBwb2xpdGljYWwgaW50ZXJlc3QuICANCiAgICAgICANCkluIHRoZSB0b3AgcmlnaHQsIHRoZXJlJ3MgYSBidXR0b24gY2FsbGVkIF9fQ29kZV9fLiBJZiB5b3UgcHJlc3MgX19IaWRlIEFsbCBDb2RlX18sIHRoZSBSIGNvZGUgd2lsbCBkaXNhcHBlYXIgYW5kIHlvdSBhcmUgbGVmdCB3aXRoIHRoZSByZXN1bHRzLiBJIHN1Z2dlc3QgZG9pbmcgdGhhdCwgaXQncyBlYXNpZXIgdG8gcmVhZC4gIA0KDQoNCmBgYHtyIGxvYWQgZGF0YSBhbmQgbGlicmFyaWVzfQ0KbGlicmFyeShmb3JlaWduKQ0KbGlicmFyeShnZ3Bsb3QyKQ0Kb3B0aW9ucyhkaWdpdHM9MikNCnJvIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9wb3Bwci9EZXNrdG9wL1JvbWFuaWEgZGF0YSAyMDE2LmNzdiIsIGhlYWRlciA9IFRSVUUpDQpgYGANCkZpcnN0IHRoaW5ncyBmaXJzdDogd2Ugd2FudCB0byBrbm93IGhvdyBtYW55IHBlb3BsZSB3ZW50IHRocm91Z2ggYWxsIDMwIHN0YXRlbWVudHMuIFdlIGRpc2NhcmQgdGhlIG90aGVycy4gDQoNCmBgYHtyfQ0Kcm8gPC0gc3Vic2V0KHJvLCBhbnN3ZXJlZF9hbGxfc3RhdGVtZW50cyAhPSAwKQ0KbGVuZ3RoKHJvJGFuc3dlcmVkX2FsbF9zdGF0ZW1lbnRzKQ0KYGBgDQpUaGF0IGxlYXZlcyB1cyB3aXRoIDE1LjAyMiBwZW9wbGUgd2hvIHdlcmUgYWJsZSB0byBzZWUgdGhlaXIgcG9zaXRpb24gaW4gdGhlIHBvbGl0aWNhbCBsYW5kc2NhcGUgYWZ0ZXIgZ29pbmcgdGhyb3VnaCBhbGwgc3RhdGVtZW50cy4gWW91IGNhbiB5b3VyIHBvc2l0aW9uIGV2ZW4gaWYgeW91IGZpbGwgb3V0IHRoZSB0b29sIHBhcnRpYWxseSwgYnV0IHRoZSByZXN1bHRzIHdvbid0IGJlIGFjY3VyYXRlLiAgICAgICANCkFsbCB0aGUgYW5hbHlzaXMgZnJvbSBub3cgb24gaXMgYmFzZWQgb24gdGhpcyBzYW1wbGUgb2YgMTUuMDIyLg0KDQpMZXQncyBzZWUgd2hlcmUgdGhlIHVzZXJzIGNvbWUgZnJvbTogICAgIA0KKlRoaXMgaXMgYWRkaXRpb25hbCBkYXRhIHdlIGNvbGxlY3QsIG5vdCBhc2tlZCBpbiB0aGUgc3VydmV5Kg0KYGBge3J9DQoNCnJvJGNvdW50cnlbcm8kY291bnRyeT09IiJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJGNvdW50cnkpKSAqIDEwMA0KYGBgDQoNCiMjI05vdywgbGV0J3MgbW92ZSBvbiB0byBtb3JlIGludGVyZXN0aW5nIHN0dWZmOiANCkxldCdzIGhhdmUgYSBsb29rIGF0IHRoZSBkZW1vZ3JhcGhpY3MuIFdlIGFzayB0aGVzZSBxdWVzdGlvbnMgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgdG9vbCwgYW5kIHF1aXRlIGEgZmV3IHBlb3BsZSBmaWxsIGluIHRoaXMgaW5mb3JtYXRpb24uIFRoZSB2YXJpYWJsZXMgYXJlIGNvbGxlY3RlZCBzZXBhcmF0ZWxseSBmb3IgcGVvcGxlIHdobyB0b29rIHRoZSBzdXJ2ZXkgb24gdGhlaXIgcGhvbmUsIHRoYXQncyB3aHkgdGhlcmUgYXJlIHR3byB2YXJpYWJsZXMgZm9yIGdlbmRlci4gWW91IG5lZWQgdG8gbG9vayBhdCB0aGUgbGFzdCAyIHJvd3MsIHdoZXJlIGNvZGVkIDAgYXJlIGZlbWFsZXMsIGNvZGUgMSBhcmUgbWFsZXMuIA0KDQpgYGB7cn0NCnJvJG1hbGUgPC0gaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMD09MCwgMSwNCiAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMD09MSwgMCwNCiAgICAgICAgICAgICAgICBOQSkpDQogICANCnJvJG1hbGVtIDwtIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzFfaXNfbW9iaWxlPT0wLCAxLA0KICAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMV9pc19tb2JpbGU9PTEsIDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgTkEpKQ0Kcm8kbWFsZVtpcy5uYShybyRtYWxlKV0gPC0gcm8kbWFsZW1baXMubmEocm8kbWFsZSldDQpwcm9wLnRhYmxlKHRhYmxlKHJvJG1hbGUpKSAqIDEwMA0KYGBgDQpTbyB0aGVyZSBhcmUgNjklICg0OTUzKSBtZW4gYW5kIDMxJSAoMjI2Mykgd29tZW4uIFRoaXMgaXMgcXVpdGUgbm9ybWFsLCBhcyBtZW4gYXJlIG1vcmUgaW50ZXJlc3RlZCBpbiBwb2xpdGljcyB0aGFuIHdvbWVuLiAgIA0KTmV4dCwgYWdlLiBJJ2xsIGNyZWF0ZSBhZ2UgY2F0ZWdvcmllcywgMTgtMjkgY29kZWQgMSwgMzAtNDkgY29kZWQgMiwgNTAtNjQgY29kZWQgMyBhbmQgNjUrIGNvZGVkIDQNCmBgYHtyfQ0Kcm8kYWdlIDwtIDIwMTYgLSAocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8yICsgMTkxMCkNCnJvJGFnZVtybyRhZ2UgPCAxOF0gPC0gTkENCg0Kcm8kYWdlW3JvJGFnZSA+PSAxOCAmIHJvJGFnZSA8PSAyOV0gPC0gMQ0Kcm8kYWdlW3JvJGFnZSA+PSAzMCAmIHJvJGFnZSA8PSA0OV0gPC0gMg0Kcm8kYWdlW3JvJGFnZSA+PSA1MCAmIHJvJGFnZSA8PSA2NF0gPC0gMw0Kcm8kYWdlW3JvJGFnZSA+PSA2NV0gPC0gNA0KDQpybyRhZ2VhIDwtIDIwMTYgLSAocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8zX2lzX21vYmlsZSArIDE5MTApDQpybyRhZ2VhW3JvJGFnZWEgPCAxOF0gPC0gTkENCg0Kcm8kYWdlYVtybyRhZ2VhID49IDE4ICYgcm8kYWdlYSA8PSAyOV0gPC0gMQ0Kcm8kYWdlYVtybyRhZ2VhID49IDMwICYgcm8kYWdlYSA8PSA0OV0gPC0gMg0Kcm8kYWdlYVtybyRhZ2VhID49IDUwICYgcm8kYWdlYSA8PSA2NF0gPC0gMw0Kcm8kYWdlYVtybyRhZ2VhID49IDY1XSA8LSA0DQoNCnJvJGFnZVtpcy5uYShybyRhZ2UpXSA8LSBybyRhZ2VhW2lzLm5hKHJvJGFnZSldDQpwcm9wLnRhYmxlKHRhYmxlKHJvJGFnZSkpICogMTAwDQpgYGANCkkgY2FuIG1ha2Ugc21hbGxlciBhZ2UgYnJhY2tldHMgaWYgbmVlZGVkLiAgICAgICANCldlIG1vdmUgb24gdG8gZWR1Y2F0aW9uIDAgLSBubyBlZHVjYXRpb24sIDEgLSBlbGVtZW50YXJ5IHNjaG9vbCwgMiAtIGhpZ2ggc2Nob29sLCAzIC0gdW5pdmVyc2l0eSBkZWdyZWUsIG1hc3RlciBhbmQgUGhELCA0IC0gcG9zdCBkb2N0b3JhbCBzdHVkaWVzDQpgYGB7cn0NCnJvJGVkdSA8LSBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl80PT0wLCAwLCANCiAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl80PT0xLCAxLA0KICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzQ9PTIsIDIsDQogICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fND09NCwgNCwNCiAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl80PT0iRmFjdWx0YXRlXG5NYXN0ZXJhdC9Eb2N0b3JhdCIsIDMsDQogICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fND09IlBvc3p0Z3JhZHXDoWxpcyB2w6lnemV0dHPDqWcgIiwgNCwNCiAgICAgICAgICAgICAgICAgTkEpKSkpKSkNCg0Kcm8kZWR1bSA8LSBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl81X2lzX21vYmlsZT09MCwgMCwgDQogICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzVfaXNfbW9iaWxlPT0xLCAxLA0KICAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl81X2lzX21vYmlsZT09MiwgMiwNCiAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fNV9pc19tb2JpbGU9PTQsIDQsDQogICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzVfaXNfbW9iaWxlPT0iRmFjdWx0YXRlXG5NYXN0ZXJhdC9Eb2N0b3JhdCIsIDMsDQogICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzVfaXNfbW9iaWxlPT0iUG9zenRncmFkdcOhbGlzIHbDqWd6ZXR0c8OpZyAiLCA0LA0KICAgICAgICAgICAgICAgICBOQSkpKSkpKQ0KDQpybyRlZHVbaXMubmEocm8kZWR1KV0gPC0gcm8kZWR1bVtpcy5uYShybyRlZHUpXQ0KdGFibGUocm8kZWR1KQ0KcHJvcC50YWJsZSh0YWJsZShybyRlZHUpKSAqIDEwMA0KYGBgDQpBcyBleHBlY3RlZCwgbW9zdGx5IGhpZ2hseSBlZHVjYXRlZCBwZW9wbGUuDQoNCk5vdywgd2UgY2FuIHNlZSB0aGUgY2l0eSB3aGVyZSBwZW9wbGUgaW50ZW5kIHRvIHZvdGUgKGZvciB0aGlzIHR5cGUgb2YgZWxlY3Rpb24sIHlvdSBjYW4gb25seSB2b3RlIGluICB0aGUgZWxlY3RvcmFsIGNpcmN1bXNjcmlwdGlvbiB5b3UgYmVsb25nIHRvLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBob21ldG93bikNCmBgYHtyfQ0Kcm8kbG9jYXRpb24gPC0gMA0Kcm8kbG9jYXRpb25baXMubmEocm8kYmFja2dyb3VuZF9xdWVzdGlvbl84KV0gPC0gTkEgIyBvdmVyd3JpdGUgMCdzIHdpdGggTkEncyBpZiBiYWNrZ3JvdW5kX3F1ZXN0aW9uXzggaXMgTkENCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MF0gIDwtICJBbGJhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0xXSAgPC0gIkFyYWQiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTJdICA8LSAiQXJnZXMiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTNdICA8LSAiQmFjYXUiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTRdICA8LSAiQmlob3IiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTVdICA8LSAiQmlzdHJpdGEtTmFzYXVkIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT02XSAgPC0gIkJvdG9zYW5pIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT03XSAgPC0gIkJyYXNvdiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09OF0gIDwtICJCcmFpbGEiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTldICA8LSAiQnVjdXJlc3RpIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0xMF0gPC0gIkJ1emF1Ig0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0xMV0gPC0gIkNhcmFzLVNldmVyaW4iDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTEyXSA8LSAiQ2FsYXJhc2kiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTEzXSA8LSAiQ2x1aiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MTRdIDwtICJDb25zdGFudGEiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTE1XSA8LSAiQ292YXNuYSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MTZdIDwtICJEYW1ib3ZpdGEiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTE3XSA8LSAiRG9saiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MThdIDwtICJHYWxhdGkiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTE5XSA8LSAiR2l1cmdpdSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MjBdIDwtICJHb3JqIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yMV0gPC0gImhhcmdoaXRhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yMl0gPC0gIkh1bmVkb2FyYSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MjNdIDwtICJJYWxvbWl0YSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MjRdIDwtICJJYXNpIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yNV0gPC0gIklsZm92Ig0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yNl0gPC0gIk1hcmFtdXJlcyINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MjddIDwtICJNZWhlbmRpbnRpIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yOF0gPC0gIk11cmVzIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yOV0gPC0gIk5lYW10Ig0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0zMF0gPC0gIk9sdCINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzFdIDwtICJQcmFob3ZhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0zMl0gPC0gIlNhdHUgTWFyZSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzNdIDwtICJTYWxhaiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzRdIDwtICJTaWJpdSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzVdIDwtICJTdWNlYXZhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0zNl0gPC0gIlRlbGVvcm1hbiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzddIDwtICJUaW1pcyINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzhdIDwtICJUdWxjZWEiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTM5XSA8LSAiVmFzbHVpIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT00MF0gPC0gIlZhbGNlYSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09NDFdIDwtICJWcmFuY2VhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT00Ml0gPC0gIlN0cmFpbmF0YXRlIg0KDQpybyRsb2NhdGlvbm0gPC0gMA0Kcm8kbG9jYXRpb25tW2lzLm5hKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGUpXSA8LSBOQSAjIG92ZXJ3cml0ZSAwJ3Mgd2l0aCBOQSdzIGlmIGJhY2tncm91bmRfcXVlc3Rpb25fOCBpcyBOQQ0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTBdICA8LSAiQWxiYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xXSAgPC0gIkFyYWQiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09Ml0gIDwtICJBcmdlcyINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0zXSAgPC0gIkJhY2F1Ig0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTRdICA8LSAiQmlob3IiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09NV0gIDwtICJCaXN0cml0YS1OYXNhdWQiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09Nl0gIDwtICJCb3Rvc2FuaSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT03XSAgPC0gIkJyYXNvdiINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT04XSAgPC0gIkJyYWlsYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT05XSAgPC0gIkJ1Y3VyZXN0aSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xMF0gPC0gIkJ1emF1Ig0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTExXSA8LSAiQ2FyYXMtU2V2ZXJpbiINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xMl0gPC0gIkNhbGFyYXNpIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTEzXSA8LSAiQ2x1aiINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xNF0gPC0gIkNvbnN0YW50YSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xNV0gPC0gIkNvdmFzbmEiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MTZdIDwtICJEYW1ib3ZpdGEiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MTddIDwtICJEb2xqIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTE4XSA8LSAiR2FsYXRpIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTE5XSA8LSAiR2l1cmdpdSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yMF0gPC0gIkdvcmoiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MjFdIDwtICJoYXJnaGl0YSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yMl0gPC0gIkh1bmVkb2FyYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yM10gPC0gIklhbG9taXRhIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTI0XSA8LSAiSWFzaSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yNV0gPC0gIklsZm92Ig0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTI2XSA8LSAiTWFyYW11cmVzIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTI3XSA8LSAiTWVoZW5kaW50aSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yOF0gPC0gIk11cmVzIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTI5XSA8LSAiTmVhbXQiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzBdIDwtICJPbHQiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzFdIDwtICJQcmFob3ZhIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTMyXSA8LSAiU2F0dSBNYXJlIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTMzXSA8LSAiU2FsYWoiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzRdIDwtICJTaWJpdSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0zNV0gPC0gIlN1Y2VhdmEiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzZdIDwtICJUZWxlb3JtYW4iDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzddIDwtICJUaW1pcyINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0zOF0gPC0gIlR1bGNlYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0zOV0gPC0gIlZhc2x1aSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT00MF0gPC0gIlZhbGNlYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT00MV0gPC0gIlZyYW5jZWEiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09NDJdIDwtICJTdHJhaW5hdGF0ZSINCg0Kcm8kbG9jYXRpb25baXMubmEocm8kbG9jYXRpb24pXSA8LSBybyRsb2NhdGlvbm1baXMubmEocm8kbG9jYXRpb24pXQ0KdGFibGUocm8kbG9jYXRpb24pDQpgYGANClRoZXJlIGFyZSAzOTggcGVvcGxlIHdobyB3aWxsIHZvdGUgYWJyb2FkLiBub3cgaXQncyBhIHNtYWxsIHNhbXBsZSwgbWF5YmUgbGF0ZXIgaXMgd29ydGggZG9pbmcgc29tZSBzb3J0IG9mIGFuYWx5c2lzIG9uIHRoZW0uDQoNCldlIGJyZWFrIGRvd24gdGhlIGxvY2F0aW9uIGFjY29yZGluZyB0byByZWdpb25zIChOVVRTMikuIEkgYW0gZG9pbmcgdGhpcyBiZWNhdXNlIHRoZSB1bHRpbWF0ZSBnb2FsIGlzIHRvIHdlaWdodCB0aGUgZGF0YSAodXNpbmcgY2Vuc3VzIGRhdGEsIHRyeWluZyB0byBtYWtlIHRoZSBkYXRhIG1vcmUgcmVwcmVzZW50YXRpdmUpDQpgYGB7cn0NCnJvJHJlZ2l1bmUgPC0gMA0Kcm8kcmVnaXVuZVtpcy5uYShybyRsb2NhdGlvbildIDwtIE5BICMgb3ZlcndyaXRlIDAncyB3aXRoIE5BJ3MgaWYgYmFja2dyb3VuZF9xdWVzdGlvbl84IGlzIE5BDQojIE5vcmQtVmVzdCAtIFJPMTE7IEJpaG9yLCBCaXN0cml0YS1OYXNhdWQsIENsdWosIE1hcmFtdXJlcywgU2F0dSBNYXJlLCBTYWxhag0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkJpaG9yIl0gPC0gICAgICAgICAiUk8xMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJDbHVqIl0gPC0gICAgICAgICAgIlJPMTEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQmlzdHJpdGEtTmFzYXVkIl08LSJSTzExIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09Ik1hcmFtdXJlcyJdIDwtICAgICAiUk8xMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJTYXR1IE1hcmUiXSA8LSAgICAgIlJPMTEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iU2FsYWoiXSA8LSAgICAgICAgICJSTzExIg0KIyBDZW50cnUgLSBSTzEyOyBBbGJhLCBCcmFzb3YsIENvdmFzbmEsIEhhcmdoaXRhLCBNdXJlcywgU2liaXUNCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJBbGJhIl0gPC0gICAgICAgIlJPMTIiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQnJhc292Il0gPC0gICAgICJSTzEyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkNvdmFzbmEiXSA8LSAgICAiUk8xMiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJIYXJnaGl0YSJdIDwtICAgIlJPMTIiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iTXVyZXMiXSA8LSAgICAgICJSTzEyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlNpYml1Il0gPC0gICAgICAiUk8xMiINCiMgTm9yZC1Fc3QgLSBSTzIxOyBCYWNhdSwgQm90b3NhbmksIElhc2ksIE5lYW10LCBTdWNlYXZhLCBWYXNsdWkNCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJCYWNhdSJdIDwtICAgICAgIlJPMjEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQm90b3NhbmkiXSA8LSAgICJSTzIxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09Iklhc2kiXSA8LSAgICAgICAiUk8yMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJOZWFtdCJdIDwtICAgICAgIlJPMjEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iU3VjZWF2YSJdIDwtICAgICJSTzIxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlZhc2x1aSJdIDwtICAgICAiUk8yMSINCiMgU3VkLUVzdCAtIFJPMjI7ICBCcmFpbGEsIEJ1emF1LCBDb25zdGFudGEsIEdhbGF0aSwgVHVsY2VhLCBWcmFuY2VhDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQnJhaWxhIl0gPC0gICAgICJSTzIyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkJ1emF1Il0gPC0gICAgICAiUk8yMiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJDb25zdGFudGEiXSA8LSAgIlJPMjIiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iR2FsYXRpIl0gPC0gICAgICJSTzIyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlR1bGNlYSJdIDwtICAgICAiUk8yMiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJWcmFuY2VhIl0gPC0gICAgIlJPMjIiDQojIFN1ZCAtIE11bnRlbmlhIC0gUk8zMTsgQXJnZXMsIENhbGFyYXNpLCBEYW1ib3ZpdGEsIEdpdXJnaXUsIElhbG9taXRhLCBQcmFob3ZhLCBUZWxlb3JtYW4NCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJBcmdlcyJdIDwtICAgICAgIlJPMzEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQ2FsYXJhc2kiXSA8LSAgICJSTzMxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkRhbWJvdml0YSJdIDwtICAiUk8zMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJHaXVyZ2l1Il0gPC0gICAgIlJPMzEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iSWFsb21pdGEiXSA8LSAgICJSTzMxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlByYWhvdmEiXSA8LSAgICAiUk8zMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJUZWxlb3JtYW4iXSA8LSAgIlJPMzEiDQojIEJ1Y3VyZXN0aSAtIElsZm92IC0gUk8zMjsgQnVjdXJlc3RpLCBJbGZvdg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkJ1Y3VyZXN0aSJdIDwtICAiUk8zMiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJJbGZvdiJdIDwtICAgICAgIlJPMzIiDQojIFN1ZC1WZXN0IE9sdGVuaWEgLSBSTzQxOyBEb2xqLCBHb3JqLCBNZWhlZGludGksIE9sdCwgVmFsY2VhDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iRG9saiJdIDwtICAgICAgICJSTzQxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkdvcmoiXSA8LSAgICAgICAiUk80MSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJNZWhlZGludGkiXSA8LSAgIlJPNDEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iT2x0Il0gPC0gICAgICAgICJSTzQxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlZhbGNlYSJdIDwtICAgICAiUk80MSINCiMgVmVzdCAtIFJPNDI7IEFyYWQsIENhcmFzLVNldmVyaW4sIEh1bmVkb2FyYSwgVGltaXMNCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJBcmFkIl0gPC0gICAgICAgICJSTzQyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkNhcmFzLVNldmVyaW4iXTwtIlJPNDIiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iSHVuZWRvYXJhIl0gPC0gICAiUk80MiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJUaW1pcyJdIDwtICAgICAgICJSTzQyIg0KIyBzdHJhaW5hdGF0ZSA9IGFicm9hZA0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlN0cmFpbmF0YXRlIl0gPC0gImFicm9hZCINCnJvJHJlZ2l1bmVbcm8kcmVnaXVuZT09MF0gPC0gTkENCnRhYmxlKHJvJHJlZ2l1bmUpDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHJlZ2l1bmUpKSAqIDEwMA0KYGBgDQoNCkFmdGVyIHdlIGhhdmUgYW4gaWRlYSBhYm91dCB3aG8gdGhlIHVzZXJzIGFyZSBhbmQgd2hlcmUgdGhleSBjb21lIGZyb20sIGxldCdzIGxvb2sgaW50byB0aGVpciBwb2xpdGljYWwgYWZmaWxpdGlvbi4gSGVyZSB3ZSBzZWUgZm9yIHdoaWNoIGNvYWxpdGlvbiB0aGV5IHZvdGVkIGZvciBpbiB0aGUgbGFzdCBwYXJsaWFtZW50YXJ5IGVsZWN0aW9ucyBvZiAyMDEyLiBIZXJlIHdlIG1pc3MgcXVpdGUgYSBmZXcgdXNlcnMsIGJlY2F1c2UgdGhleSBkb250IHJlbWVtYmVyIHdobyB0aGV5IHZvdGVkIGZvciAodGlwaWNhbGx5KS4gDQpgYGB7cn0NCnJvJHZvdGVyZWMgPC0gMA0Kcm8kdm90ZXJlY1tpcy5uYShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzEwKV0gPC0gTkENCnJvJHZvdGVyZWMgPC0gaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMTA9PTAsICJVU0wiLA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8xMD09MSwgIkFSRCIsDQogICAgICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzEwPT0yLCAiUFBERCIsDQogICAgICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzEwPT0zLCAiVURNUiIsDQogICAgICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzEwPT00LCAib3RoZXIiLA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8xMD09NiwgImRpZCBub3Qgdm90ZSIsDQogICAgICAgICAgICAgICAgICAgICBOQSkpKSkpKQ0KDQpybyR2b3RlcmVjbSA8LSAwDQpybyR2b3RlcmVjbVtpcy5uYShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzExX2lzX21vYmlsZSldIDwtIE5BDQpybyR2b3RlcmVjbSA8LSBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8xMV9pc19tb2JpbGU9PTAsICJVU0wiLA0KICAgICAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMTFfaXNfbW9iaWxlPT0xLCAiQVJEIiwNCiAgICAgICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzExX2lzX21vYmlsZT09MiwgIlBQREQiLA0KICAgICAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMTFfaXNfbW9iaWxlPT0zLCAiVURNUiIsDQogICAgICAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8xMV9pc19tb2JpbGU9PTQsICJvdGhlciIsDQogICAgICAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8xMV9pc19tb2JpbGU9PTYsICJkaWQgbm90IHZvdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKSkpDQoNCnJvJHZvdGVyZWNbaXMubmEocm8kdm90ZXJlYyldIDwtIHJvJHZvdGVyZWNtW2lzLm5hKHJvJHZvdGVyZWMpXQ0Kdm90ZXJlYyA8LSByb1tjKCJ2b3RlcmVjIildDQp2b3RlcmVjIDwtIG5hLm9taXQodm90ZXJlYykNCnZvdGVyZWMkdm90ZXJlYyA8LSBmYWN0b3Iodm90ZXJlYyR2b3RlcmVjLCBjKCJBUkQiLCAiUFBERCIsICJVRE1SIiwgIlVTTCIsICJvdGhlciIsICJkaWQgbm90IHZvdGUiKSkNCnJlcXVpcmUoc2NhbGVzKQ0KZ2dwbG90KHZvdGVyZWMsIGFlcyh4ID0gZmFjdG9yKHZvdGVyZWMpKSkgKyBnZW9tX2JhcihzdGF0ID0gImNvdW50IiwgZmlsbD0iZGFya2JsdWUiLCBjb2xvdXI9ImJsYWNrIikgKyBsYWJzKHRpdGxlID0gIlZvdCBsYSBhbGVnZXJpbGUgcGFybGFtZW50YXJlIDIwMTIiLCB4PSIiKSArIHRoZW1lX21pbmltYWwoKSANCg0KYGBgDQpgYGB7cn0NCnByb3AudGFibGUodGFibGUodm90ZXJlYyR2b3RlcmVjKSkgKiAxMDANCmBgYA0KDQpXZSBjYW4gc2VlIHdobyB0aGV5IGludGVuZCB0byB2b3RlIGZvciwgd2hpY2ggaXMgcXVpdGUgZXhjaXRpbmcgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCnJvJHZvdGVpbnQgPC0gaWZlbHNlKHJvJHBvcHVwX3F1ZXN0aW9uXzY9PTAsICJQU0QiLA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kcG9wdXBfcXVlc3Rpb25fNj09MSwgIkFMREUiLA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kcG9wdXBfcXVlc3Rpb25fNj09MiwgIlBOTCIsDQogICAgICAgICAgICAgIGlmZWxzZShybyRwb3B1cF9xdWVzdGlvbl82PT0zLCAiVURNUiIsDQogICAgICAgICAgICAgIGlmZWxzZShybyRwb3B1cF9xdWVzdGlvbl82PT00LCAiVVNSIiwNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJHBvcHVwX3F1ZXN0aW9uXzY9PTUsICJvdGhlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpKSkNCnZvdGVpbnQgPC0gcm9bYygidm90ZWludCIpXQ0Kdm90ZWludCA8LSBuYS5vbWl0KHZvdGVpbnQpDQp2b3RlaW50JHZvdGVpbnQgPC0gZmFjdG9yKHZvdGVpbnQkdm90ZWludCwgYygiQUxERSIsICJQTkwiLCAiUFNEIiwgIlVETVIiLCAiVVNSIiwgIm90aGVyIikpDQpnZ3Bsb3Qodm90ZWludCwgYWVzKHggPSBmYWN0b3Iodm90ZWludCkpKSArIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLCBmaWxsPSJkYXJrYmx1ZSIsIGNvbG91cj0iYmxhY2siKSArIGxhYnModGl0bGUgPSAiSW50ZW50aWUgZGUgdm90IGxhIGFsZWdlcmlsZSBwYXJsYW1lbnRhcmUgMjAxNiIsIHg9IiIpICsgdGhlbWVfbWluaW1hbCgpIA0KYGBgDQpgYGB7cn0NCnByb3AudGFibGUodGFibGUodm90ZWludCR2b3RlaW50KSkgKiAxMDANCmBgYA0KDQojI0kgc2F2ZWQgdGhlIGJlc3QgZm9yIHRoZSBlbmQ6IHdlIGNhbiBzZWUgaG93IHRoZSB1c2VycyBhbnN3ZXJlZCBvbiB0aGUgc3RhdGVtZW50cy4gSSB1c2VkIHBlcmNlbnRhZ2VzDQoxIG1lYW5zICJDb21wbGV0ZWx5IGRpc3NhZ3JlZSwgMywgIk5laXRoZXIgYWdyZWUgbm9yIGRpc2FncmVlIiwgNSAiIkNvbXBsZXRlbHkgYWdyZWUiLCAtMSAiTm8gb3BpbmlvbiINCg0KX19GcmVlIG1hcmtldCBtYWtlcyB0aGUgaGVhbHRoIHN5c3RlbSB0byBmdW5jdGlvbiBiZXR0ZXJfXyAgIA0KQ29tcGV0aXRpYSBlY29ub21pY2EgbGliZXJhIGZhY2Ugc2lzdGVtdWwgZGUgc2FuYXRhdGUgc2EgZnVuY3Rpb25lemUgbWFpIGVmaWNpZW50CQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMFtybyRzdGF0ZW1lbnRfMD09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzApKSAqIDEwMA0KYGBgDQpfX1RoZSBudW1iZXIgb2YgZW1wbG95ZWVzIGluIHRoZSBwdWJsaWMgc2VjdG9yIHNob3VsZCBiZSByZWR1Y2VkX18gICAgICAgICAgIA0KTnVtYXJ1bCBhbmdhamF0aWxvciBkaW4gc2VjdG9ydWwgcHVibGljIGFyIHRyZWJ1aSByZWR1cwkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzFbcm8kc3RhdGVtZW50XzE9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8xKSkgKiAxMDANCmBgYA0KX19UaGUgc3RhdGUgc2hvdWxkIGludGVydmVuZSBpbiB0aGUgZWNvbm9teSBhcyBsaXR0bGUgYXMgcG9zc2libGVfXyAgICAgICANClN0YXR1bCBhciB0cmVidWkgc2EgaW50ZXJ2aW5hIGNhdCBtYWkgcHV0aW4gcG9zaWJpbCBpbiBlY29ub21pZQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzJbcm8kc3RhdGVtZW50XzI9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8yKSkgKiAxMDANCmBgYA0KX19Sb21hbmlhIHNob3VsZCBhZG9wdCBhIHByb2dyZXNzaXZlIHRheGF0aW9uIHN5c3RlbV9fICAgICAgICAgIA0KUm9tYW5pYSBhciB0cmVidWkgc2EgYWRvcHRlIHVuIHNpc3RlbSBkZSB0YXhhcmUgcHJvZ3Jlc2l2YQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzNbcm8kc3RhdGVtZW50XzM9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8zKSkgKiAxMDANCmBgYA0KX19Gb3JlaWduIGludmVzdG9ycyBhcmUgYSB0aHJlYXQgdG8gUm9tYW5pYSdzIG5hdGlvbmFsIHNvdmVyZWlnbnR5X18gICAgICAgICAgDQpJbnZlc3RpdG9yaWkgc3RyYWluaSBzdW50IG8gYW1lbmludGFyZSBsYSBzdXZlcmFuaXRhdGVhIG5hdGlvbmFsYSBhIFJvbWFuaWVpCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfNFtybyRzdGF0ZW1lbnRfND09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzQpKSAqIDEwMA0KYGBgDQpfX1ZUQSBzaG91bGQgYmUgcmVkdWNlZCB1bmRlciAyMCVfXyAgICAgICANClRWQSB0cmVidWllIHJlZHVzIHN1YiBwcmFndWwgZGUgMjAlCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfNVtybyRzdGF0ZW1lbnRfNT09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzUpKSAqIDEwMA0KYGBgDQpfX1JvbWFuaWEgc2hvdWxkIG5ldmVyIGFkb3B0IHRoZSBldXJvX18gICAgICAgICAgDQpSb21hbmlhIGFyIHRyZWJ1aSBzYSBudSBhZG9wdGUgbmljaW9kYXRhIG1vbmVkYSBFdXJvCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfNltybyRzdGF0ZW1lbnRfNj09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzYpKSAqIDEwMA0KYGBgDQpfX0ludGVybmF0aW9uYWwgYWN0b3JzIChzdWNoIGFzIEVVIG9yIFVTQSkgaGF2ZSB0aGUgcmlnaHQgdG8gaW50ZXJ2ZW5lIGluIFJvbWFuaWEncyBpbnRlcm5hbCBhZmZhaXJzIGlmIHRoZSBzdGF0ZSBvZiBkZW1vY3JhY3kgaXMgdGhyZWF0ZW5kX18gICAgICAgICANClBhcnRlbmVyaWkgaW50ZXJuYXRpb25hbGkgKHByZWN1bSBVRSBzYXUgU1VBKSBwb3QgaW50ZXJ2ZW5pIGluIGFmYWNlcmlsZSBpbnRlcm5lIGFsZSBSb21hbmllaSBhdHVuY2kgY2FuZCBleGlzdGEgbyBhbWVuaW50YXJlIGxhIGFkcmVzYSBkZW1vY3JhdGllaQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50Xzdbcm8kc3RhdGVtZW50Xzc9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF83KSkgKiAxMDANCmBgYA0KX19UaGUgc3RyYXRlZ2ljIHBhcnRuZXJzaGlwIHdpdGggVVNBIGlzIGVzc2VudGlhbCBmb3IgUm9tYW5pYSdzIG5hdGlvbmFsIHNlY3VyaXR5X18gICAgICAgICAgDQpQYXJ0ZW5lcmlhdHVsIHN0cmF0ZWdpYyBjdSBTVUEgZXN0ZSBlc2VudGlhbCBwZW50cnUgc2VjdXJpdGF0ZWEgbmF0aW9uYWxhCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfOFtybyRzdGF0ZW1lbnRfOD09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzgpKSAqIDEwMA0KYGBgDQpfX1dvbWVuIHNob3VsZCBiZSBhYmxlIHRvIGRlY2lkZSBvbiBhbnkgbWF0dGVycyByZWxhdGVkIHRvIGFib3J0aW9uX18gICAgICAgICAgDQpGZW1laWxlIGFyIHRyZWJ1aSBzYSBhaWJhIGxpYmVydGF0ZWEgZGUgYSBkZWNpZGUgYXN1cHJhIGNoZXN0aXVuaWxvciBsZWdhdGUgZGUgYXZvcnQNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50Xzlbcm8kc3RhdGVtZW50Xzk9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF85KSkgKiAxMDANCmBgYA0KX19Sb21hbmlhIHNob3VsZCBub3QgcmVjZWl2ZSByZWZ1Z2VlcyB0aGF0IHRyeSB0byBlbnRlciB0aGUgRVVfXyAgICAgICAgICANClJvbWFuaWEgYXIgdHJlYnVpIHNhIGFjY2VwdGUgbWFpIG11bHRpIG1pZ3JhbnRpIGNhcmUgaW50cmEgaW4gVUUsIGNhIHNlbW4gZGUgc29saWRhcml0YXRlCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMTBbcm8kc3RhdGVtZW50XzEwPT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMTApKSAqIDEwMA0KYGBgDQpfX0dheSBjb3VwbGVzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJpZ2h0cyBhcyB0aGUgaGV0ZXJvc2V4dWFsIG9uZXNfXyAgICAgICANCkN1cGx1cmlsZSBob21vc2V4dWFsZSBhciB0cmVidWkgc2Egc2UgYnVjdXJlIGRlIGFjZWxlYXNpIGRyZXB0dXJpIGNhIHNpIGN1cGx1cmlsZSBoZXRlcm9zZXh1YWxlCQ0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQp0YWJsZShybyRzdGF0ZW1lbnRfMTEpDQpybyRzdGF0ZW1lbnRfMTFbcm8kc3RhdGVtZW50XzExPT0iLTEiXSA8LSBOQQ0KDQpybyRzdGF0ZW1lbnRfMTFbcm8kc3RhdGVtZW50XzExPT0iMSJdIDwtICJUb3RhbCBpbXBvdHJpdmEiDQpybyRzdGF0ZW1lbnRfMTFbcm8kc3RhdGVtZW50XzExPT0iMiJdIDwtICJJbXBvdHJpdmEiDQpybyRzdGF0ZW1lbnRfMTFbcm8kc3RhdGVtZW50XzExPT0iMyJdIDwtICJOZXV0cnUiDQpybyRzdGF0ZW1lbnRfMTFbcm8kc3RhdGVtZW50XzExPT0iNCJdIDwtICJEZSBhY29yZCINCnJvJHN0YXRlbWVudF8xMVtybyRzdGF0ZW1lbnRfMTE9PSI1Il0gPC0gIlRvdGFsIGRlIGFjb3JkIg0Kcm8kc3RhdGVtZW50XzExIDwtIGZhY3RvcihybyRzdGF0ZW1lbnRfMTEsIGMoIlRvdGFsIGltcG90cml2YSIsICJJbXBvdHJpdmEiLCAiTmV1dHJ1IiwgIkRlIGFjb3JkIiwgIlRvdGFsIGRlIGFjb3JkIikpDQoNCmdncGxvdChybywgYWVzKHggPSBmYWN0b3Ioc3RhdGVtZW50XzExKSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIsIGZpbGw9ImRhcmtibHVlIiwgY29sb3VyPSJibGFjayIpICsgbGFicyh0aXRsZSA9ICJDdXBsdXJpbGUgaG9tb3NleHVhbGUgYXIgdHJlYnVpIFxuIHNhIHNlIGJ1Y3VyZSBkZSBhY2VsZWFzaSBkcmVwdHVyaSBjYSBzaSBjdXBsdXJpbGUgaGV0ZXJvc2V4dWFsZSIsIHggPSAiIiwgeSA9ICJOdW1hciB1dGlsaXphdG9yaSIpICsgdGhlbWVfbWluaW1hbCgpIA0KYGBgDQpfX1Ntb2tpbmcgc2hvdWxkIGJlIHByb2hpYml0ZWQgaW4gYWxsIHRoZSBwdWJsaWMgcGxhY2VzLCBldmVuIHRoZSBvcGVuLXNwYWNlIG9uZXNfXyAgICAgICAgICAgIA0KRnVtYXR1bCB0cmVidWllIGludGVyemlzIGluIHRvYXRlIGxvY3VyaWxlIHB1YmxpY2UsIGNoaWFyIHNpIGNlbGUgZGVzY2hpc2UJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8xMltybyRzdGF0ZW1lbnRfMTI9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8xMikpICogMTAwDQpgYGANCl9fSW1taWdyYW50cyBzaG91bGQgYWRvcHQgdGhlIHZhbHVlcyBhbmQgY3VsdHVyZSBvZiBSb21hbmlhX18gICAgICAgICAgDQpJbWlncmFudGlpIGFyIHRyZWJ1aSBzYSBzZSBhZGFwdGV6ZSBsYSB2YWxvcmlsZSBzaSBjdWx0dXJhIFJvbWFuaWVpCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMTNbcm8kc3RhdGVtZW50XzEzPT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMTMpKSAqIDEwMA0KYGBgDQpfX1JvbWFuaWEgc2hvdWxkIHB1cnN1ZSBzdGF0ZSB1bmlmaWNhdGlvbiB3aXRoIE1vbGRvdmFfXyAgICAgICAgIA0KUm9tYW5pYSBhciB0cmVidWkgc2EgdXJtYXJlYXNjYSByZXVuaWZpY2FyZWEgc3RhdGFsYSBjdSBSZXB1YmxpY2EgTW9sZG92YQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzE0W3JvJHN0YXRlbWVudF8xND09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzE0KSkgKiAxMDANCmBgYA0KX19BIHRlcnJpdG9yaWFsIHJlZm9ybSBzaG91bGQgaW5jbHVkZSB0aGUgY3JlYXRpb24gb2YgYW4gYXV0b25vbW91cyBIdW5nYXJpYW4gcmVnaW9uX18gICAgICAgICANCk8gcmVmb3JtYSB0ZXJpdG9yaWFsYSBhciB0cmVidWkgc2EgaW5jbHVkYSBjcmVhcmVhIHVuZWkgcmVnaXVuaSBtYWdoaWFyZSBhdXRvbm9tZQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzE1W3JvJHN0YXRlbWVudF8xNT09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzE1KSkgKiAxMDANCg0Kcm8kc3RhdGVtZW50XzE1W3JvJHN0YXRlbWVudF8xNT09IjEiXSA8LSAiVG90YWwgaW1wb3RyaXZhIg0Kcm8kc3RhdGVtZW50XzE1W3JvJHN0YXRlbWVudF8xNT09IjIiXSA8LSAiSW1wb3RyaXZhIg0Kcm8kc3RhdGVtZW50XzE1W3JvJHN0YXRlbWVudF8xNT09IjMiXSA8LSAiTmV1dHJ1Ig0Kcm8kc3RhdGVtZW50XzE1W3JvJHN0YXRlbWVudF8xNT09IjQiXSA8LSAiRGUgYWNvcmQiDQpybyRzdGF0ZW1lbnRfMTVbcm8kc3RhdGVtZW50XzE1PT0iNSJdIDwtICJUb3RhbCBkZSBhY29yZCINCnJvJHN0YXRlbWVudF8xNSA8LSBmYWN0b3Iocm8kc3RhdGVtZW50XzE1LCBjKCJUb3RhbCBpbXBvdHJpdmEiLCAiSW1wb3RyaXZhIiwgIk5ldXRydSIsICJEZSBhY29yZCIsICJUb3RhbCBkZSBhY29yZCIpKQ0KDQpnZ3Bsb3Qocm8sIGFlcyh4ID0gZmFjdG9yKHN0YXRlbWVudF8xNSkpKSArIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLCBmaWxsPSJkYXJrYmx1ZSIsIGNvbG91cj0iYmxhY2siKSArIGxhYnModGl0bGUgPSAiTyByZWZvcm1hIHRlcml0b3JpYWxhIGFyIHRyZWJ1aSBzYSBpbmNsdWRhIFxuIGNyZWFyZWEgdW5laSByZWdpdW5pIG1hZ2hpYXJlIGF1dG9ub21lIiwgeCA9ICIiLCB5ID0gIk51bWFyIHV0aWxpemF0b3JpIikrIHRoZW1lX21pbmltYWwoKSANCmBgYA0KX19UaGUgc3RhdGUgc2hvdWxkIGdpdmUgcHJpdmlsZWdlZCBzdGF0dXMgdG8gdGhlIG9ydGhvZG94IGNodXJjaF9fICAgICAgICAgDQpTdGF0dWwgYXIgdHJlYnVpIHNhIGFjb3JkZSB1biBzdGF0dXQgcHJpdmlsZWdpYXQgQmlzZXJpY2lpIE9ydG9kb3hlCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMTZbcm8kc3RhdGVtZW50XzE2PT0iLTEiXSA8LSBOQQ0KDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8xNikpICogMTAwDQoNCnJvJHN0YXRlbWVudF8xNltybyRzdGF0ZW1lbnRfMTY9PSIxIl0gPC0gIlRvdGFsIGltcG90cml2YSINCnJvJHN0YXRlbWVudF8xNltybyRzdGF0ZW1lbnRfMTY9PSIyIl0gPC0gIkltcG90cml2YSINCnJvJHN0YXRlbWVudF8xNltybyRzdGF0ZW1lbnRfMTY9PSIzIl0gPC0gIk5ldXRydSINCnJvJHN0YXRlbWVudF8xNltybyRzdGF0ZW1lbnRfMTY9PSI0Il0gPC0gIkRlIGFjb3JkIg0Kcm8kc3RhdGVtZW50XzE2W3JvJHN0YXRlbWVudF8xNj09IjUiXSA8LSAiVG90YWwgZGUgYWNvcmQiDQpybyRzdGF0ZW1lbnRfMTYgPC0gZmFjdG9yKHJvJHN0YXRlbWVudF8xNiwgYygiVG90YWwgaW1wb3RyaXZhIiwgIkltcG90cml2YSIsICJOZXV0cnUiLCAiRGUgYWNvcmQiLCAiVG90YWwgZGUgYWNvcmQiKSkNCg0KZ2dwbG90KHJvLCBhZXMoeCA9IGZhY3RvcihzdGF0ZW1lbnRfMTYpKSkgKyBnZW9tX2JhcihzdGF0ID0gImNvdW50IiwgZmlsbD0iZGFya2JsdWUiLCBjb2xvdXI9ImJsYWNrIikgKyBsYWJzKHRpdGxlID0gIlN0YXR1bCBhciB0cmVidWkgc2EgYWNvcmRlIHVuIHN0YXR1dCBwcml2aWxlZ2lhdCBCaXNlcmljaWkgT3J0b2RveGUiLCB4ID0gIiIsIHkgPSAiTnVtYXIgdXRpbGl6YXRvcmkiKSsgdGhlbWVfbWluaW1hbCgpIA0KYGBgDQpfX1RoZSBlbGVjdG9yYWwgdHJlc2hvbGQgc2hvdWxkIGJlIGxvd2VyZWQsIHNvIHNtYWxsZXIgcGFydGllcyBjYW4gZ2FpbiBhY2Nlc3MgdG8gdGhlIHBhcmxpYW1lbnRfXyAgICAgICAgIA0KUHJhZ3VsIGVsZWN0b3JhbCBhciB0cmVidWkgcmVkdXMgcGVudHJ1IGEgcGVybWl0ZSBpbnRyYXJlYSBwYXJ0aWRlbG9yIG1haSBtaWNpIO5uIHBhcmxhbWVudAkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzE3W3JvJHN0YXRlbWVudF8xNz09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzE3KSkgKiAxMDANCmBgYA0KX19UaGUgZWxlY3RvcmFsIHJlZm9ybSBzaG91bGQgaW5jbHVkZSBsb3dlcmluZyB0aGUgbnVtYmVyIG9mIHNpZ25hdHVyZXMgbmVlZGVkIGZvciBjYW5kaWRhY3kgZm9yIGFsbCBlbGVjdGlvbiB0eXBlc19fICAgICAgICAgICAgDQpOdW1hcnVsIGRlIHNlbW5hdHVyaSBwZW50cnUgY2FuZGlkYXR1cmEgbGEgdG9hdGUgdGlwdXJpbGUgZGUgYWxlZ2VyaSBhciB0cmVidWkgcmVkdXMJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8xOFtybyRzdGF0ZW1lbnRfMTg9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8xOCkpICogMTAwDQpgYGANCl9fVGhlIG51bWJlciBvZiBwb2xsaW5nIHN0YXRpb25zIGZvciBkaWFzcG9yYSBzaG91bGQgYmUgaW5jcmVhc2VkIGZvciBhbGwgZWxlY3Rpb24gdHlwZXNfXyAgICAgICAgICAgICANCk51bWFydWwgZGUgc2VjdGlpIGRlIHZvdGFyZSBpbiBkaWFzcG9yYSB0cmVidWllIG1hcml0IHBlbnRydSB0b2F0ZSB0aXB1cmlsZSBkZSBhbGVnZXJpCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMTlbcm8kc3RhdGVtZW50XzE5PT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMTkpKSAqIDEwMA0KYGBgDQpfX1RoZSBwb3N0YWwgdm90ZSBzaG91bGQgYmUgaW50cm9kdWNlZCBmb3IgYWxsIGVsZWN0aW9uIHR5cGVzX18gICAgICAgICAgICAgIA0KVm90dWwgcHJpbiBjb3Jlc3BvbmRlbnRhIGFyIHRyZWJ1aSBpbnRyb2R1cyBwZW50cnUgdG9hdGUgdGlwdXJpbGUgZGUgYWxlZ2VyaQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzIwW3JvJHN0YXRlbWVudF8yMD09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzIwKSkgKiAxMDANCmBgYA0KX19UaGUgZGlnaXRhbGl6YXRpb24gb2YgdGhlIGp1ZGljaWFsIHByb2Nlc3Mgc2hvdWxkIGJlIGNvbnRpbnVlZCBieSBwdWJsaXNoaW5nIG9uLWxpbmUgYWxsIHRoZSBkZWNpc2lvbnNfXyAgICAgICAgICAgICANCkRpZ2l0YWxpemFyZWEgcHJvY2VzdWx1aSBqdWRpY2lhciB0cmVidWllIGNvbnRpbnVhdGEgcHJpbiBwdWJsaWNhcmVhIG9uLWxpbmUgYSB0dXR1cm9yIGhvdGFyYXJpbG9yIGp1ZGVjYXRvcmVzdGkJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8yMVtybyRzdGF0ZW1lbnRfMjE9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8yMSkpICogMTAwDQpgYGANCl9fR292ZXJubWVudCdzIHB1YmxpYyBpbmZvcm1hdGlvbiBtdXN0IGJlIGFjY2Vzc2libGUgb25saW5lX18gICAgICAgICAgICANCkluZm9ybWF0aWlsZSBwdWJsaWNlIGFsZSBndXZlcm51bHVpIGFyIHRyZWJ1aSBzYSBmaWUgYWNjZXNpYmlsZSBvbi1saW5lCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMjJbcm8kc3RhdGVtZW50XzIyPT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMjIpKSAqIDEwMA0KYGBgDQpfX1RoZSBvcGVuIHZvdGUgc2hvdWxkIGJlIGludHJvZHVjZWQgZm9yIGFsbCBkZWNpc2lvbnMgbWFkZSBpbiB0aGUgcGFybGlhbWVudF9fICAgICAgICAgIA0KVm90dWwgZGVzY2hpcyB0cmVidWllIGludHJvZHVzIHBlbnRydSB0b2F0ZSBkZWNpemlpbGUgbHVhdGUgaW4gUGFybGFtZW50CQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMjNbcm8kc3RhdGVtZW50XzIzPT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMjMpKSAqIDEwMA0KYGBgDQpfX1BvbGl0aWNpYW5zIHByb3NlY3V0ZWQgZm9yIGNvcnJ1cHRpb24gc2hvdWxkIGdpdmUgdXAgYW55IHB1YmxpYyBmdW5jdGlvbl9fICAgICAgIA0KUG9saXRpY2llbmlpIHVybWFyaXRpIHBlbmFsIHBlbnRydSBmYXB0ZSBkZSBjb3J1cHRpZSB0cmVidWllIHNhIHJlbnVudGUgbGEgb3JpY2UgZnVuY3RpZSBwdWJsaWNhCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMjRbcm8kc3RhdGVtZW50XzI0PT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMjQpKSAqIDEwMA0KYGBgDQpfX01QcyBzaG91bGQgZW5qb3kgaW1tdW5pdHkgcmlnaHRzIG9ubHkgZm9yIHZvdGVzIGFuZCBkZWNsYXJhdGlvbnNfXyAgICAgDQpQYXJsYW1lbnRhcmlpIGFyIHRyZWJ1aSBzYSBhaWJhIGltdW5pdGF0ZSBkb2FyIHBlbnRydSB2b3R1cmkgc2kgZGVjbGFyYXRpaQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzI1W3JvJHN0YXRlbWVudF8yNT09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzI1KSkgKiAxMDANCmBgYA0KX19Hb3Zlcm5tZW50cyBmb3JtZWQgZXhjbHVzaXZlbGx5IGZyb20gbm9uLXBhcnRpc2FuIHRlaG5vY3JhdHMgd29yayBiZXR0ZXIgdGhhbiB0aG9zZSBmb3JtZWQgZnJvbSBwb2xpdGljaWFuc19fICAgICAgICAgICAgDQpHdXZlcm5lbGUgZm9ybWF0ZSBleGNsdXNpdiBkaW4gdGVobm9jcmF0aSBuZWFmaWxpYXRpIHBvbGl0aWMgZnVuY3Rpb25lYXphIG1haSBiaW5lIGRlY2F0IGNlbGUgZm9ybWF0ZSBkaW4gcG9saXRpY2llbmkJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8yNltybyRzdGF0ZW1lbnRfMjY9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8yNikpICogMTAwDQpgYGANCl9fUHJvc2VjdXRvcnMgaGF2ZSB0b28gbXVjaCBwb3dlciBpbiBwcm9zZWN1dGluZyBjaXRpemVuc19fICAgICANClByb2N1cm9yaWkgYXUgcHJlYSBtdWx0YSBwdXRlcmUg7m4gY2VlYSBjZSBwcml2ZXN0ZSBhbmNoZXRhcmVhIGNldGF0ZW5pbG9yCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMjdbcm8kc3RhdGVtZW50XzI3PT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMjcpKSAqIDEwMA0KYGBgDQpfX1RoZSBNZWNoYW5pc20gb2YgQ29vcGVyYXRpb24gYW5kIFZlcmlmaWNhdGlvbiwgd2hpY2ggdHJhY2tzIHByb2dyZXNzIGluIHRoZSBqdWRpY2lhcnkgc3lzdGVtIHJlZm9ybSBzaG91bGQgYmUgbWFpbnRhaW5lZF9fICANCk1lY2FuaXNtdWwgZGUgQ29vcGVyYXJlIHNpIFZlcmlmaWNhcmUsIHByaW4gY2FyZSBzZSB2ZXJpZmljYSBwcm9ncmVzZWxlIGluIHJlZm9ybWFyZWEganVzdGl0aWVpLCBhciB0cmVidWkgaW5sYXR1cmF0CQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMjhbcm8kc3RhdGVtZW50XzI4PT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMjgpKSAqIDEwMA0KYGBgDQpfX1JvbWFuaWEgc2hvdWxkIHdvcmsgb24gc3RyZW5ndGhlbmluZyBpdHMgZGlwbG9tYXRpYyByZWxhdGlvbnMgd2l0aCBSdXNpYV9fICAgICANClJvbWFuaWEgYXIgdHJlYnVpIHNhIGlzaSBjb25zb2xpZGV6ZSByZWxhdGlpbGUgZGlwbG9tYXRpY2UgY3UgUnVzaWEJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8yOVtybyRzdGF0ZW1lbnRfMjk9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8yOSkpICogMTAwDQpgYGANCg0KSW50ZXJlc3QgaW4gcG9saXRpY3MgMCB2ZXJ5IG11Y2gsIDMgbm90IGF0IGFsbA0KYGBge3J9DQpybyRwb3B1cF9xdWVzdGlvbl8yW3JvJHBvcHVwX3F1ZXN0aW9uXzI9PTRdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHBvcHVwX3F1ZXN0aW9uXzIpKSAqIDEwMA0KYGBgDQoNCg0KTGVmdC1yaWdodCBzZWxmLXBvc2l0aW9uaW5nLCAwIGxlZnQgMTAgcmlnaHQNCmBgYHtyfQ0Kcm8kcG9wdXBfcXVlc3Rpb25fM1tybyRwb3B1cF9xdWVzdGlvbl8zPT0xMV0gPC0gTkENCnJvJHBvcHVwX3F1ZXN0aW9uXzNbcm8kcG9wdXBfcXVlc3Rpb25fMz09MTJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHBvcHVwX3F1ZXN0aW9uXzMpKSAqIDEwMA0KYGBgDQpFdmFsdWF0aW9uIG9mIENpb2xvcycgZ292ZXJubWVudCBwZXJmb3JtYW5jZSAwIHZlcnkgZ29vZCwgNCB2ZXJ5IGJhZCwgNSBkb24ndCBrbm93DQpgYGB7cn0NCnByb3AudGFibGUodGFibGUocm8kcG9wdXBfcXVlc3Rpb25fNCkpICogMTAwDQpgYGANCg0KDQpXZSBjYW4gZG8gc3RhY2tlZCBiYXJwbG90cywgbG9va2luZyBhdCBhZ2UgYW5kIHBvc2l0aW9ucyBvbiBzdGF0ZW1lbnRzLCBsaWtlIHRoaXMgZXhhbXBsZSBvbiB0aGUgc3RhdGVtZW50IG9uIGdheSBtYXJyaWFnZQ0KYGBge3J9DQp0b3Bsb3QyIDwtIHRhYmxlKHJvJGFnZSwgcm8kc3RhdGVtZW50XzExKQ0KdG9wbG90MiA8LSByb1tjKDY3LCAxMDkpXQ0KdG9wbG90MiRhZ2VbdG9wbG90MiRhZ2U9PSIxIl0gPC0gIjE4LTI5Ig0KdG9wbG90MiRhZ2VbdG9wbG90MiRhZ2U9PSIyIl0gPC0gIjMwLTQ5Ig0KdG9wbG90MiRhZ2VbdG9wbG90MiRhZ2U9PSIzIl0gPC0gIjUwLTY0Ig0KdG9wbG90MiRhZ2VbdG9wbG90MiRhZ2U9PSI0Il0gPC0gIjY1KyINCg0KdG9wbG90MiRzdGF0ZW1lbnRfMTFbdG9wbG90MiRzdGF0ZW1lbnRfMTE9PSIxIl0gPC0gIlRvdGFsIGltcG90cml2YSINCnRvcGxvdDIkc3RhdGVtZW50XzExW3RvcGxvdDIkc3RhdGVtZW50XzExPT0iMiJdIDwtICJJbXBvdHJpdmEiDQp0b3Bsb3QyJHN0YXRlbWVudF8xMVt0b3Bsb3QyJHN0YXRlbWVudF8xMT09IjMiXSA8LSAiTmV1dHJ1Ig0KdG9wbG90MiRzdGF0ZW1lbnRfMTFbdG9wbG90MiRzdGF0ZW1lbnRfMTE9PSI0Il0gPC0gIkRlIGFjb3JkIg0KdG9wbG90MiRzdGF0ZW1lbnRfMTFbdG9wbG90MiRzdGF0ZW1lbnRfMTE9PSI1Il0gPC0gIlRvdGFsIGRlIGFjb3JkIg0KdG9wbG90MiRzdGF0ZW1lbnRfMTEgPC0gZmFjdG9yKHRvcGxvdDIkc3RhdGVtZW50XzExLCBjKCJUb3RhbCBpbXBvdHJpdmEiLCAiSW1wb3RyaXZhIiwgIk5ldXRydSIsICJEZSBhY29yZCIsICJUb3RhbCBkZSBhY29yZCIpKQ0KDQp0b3Bsb3QyIDwtIG5hLm9taXQodG9wbG90MikgDQoNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGx5cikNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmsgPC0gZ2dwbG90KHRvcGxvdDIsIGFlcyhzdGF0ZW1lbnRfMTEsIGZpbGw9YWdlKSkNCmsgKyBnZW9tX2JhcigpICsgc2NhbGVfZmlsbF9icmV3ZXIoKSArIGxhYnModGl0bGUgPSAiQ3VwbHVyaWxlIGhvbW9zZXh1YWxlIGFyIHRyZWJ1aSBcbiBzYSBzZSBidWN1cmUgZGUgYWNlbGVhc2kgZHJlcHR1cmkgY2Egc2kgY3VwbHVyaWxlIGhldGVyb3NleHVhbGUiLCB4ID0gIk9waW5pYSB1dGlsaXphdG9ydWx1aSIsIHkgPSAiTnVtYXIgdXRpbGl6YXRvcmkiKSArIHRoZW1lX21pbmltYWwoKSANCg0KYGBgDQoNCg0KV2UgY2FuIGhhdmUgYSBsb29rIGF0IHRoZSBzYW1lIHN0YXRlbWVudCwgb24gZ2F5IG1hcnJpYWdlLCBieSBlZHVhY3Rpb24NCmBgYHtyfQ0KdG9wbG90MyA8LSByb1tjKDY3LCAxMTEpXQ0KDQojIHJlbmFtZSBmYWN0b3IgbGV2ZWxzIGFnZQ0KdG9wbG90MyRlZHVbdG9wbG90MyRlZHU9PSIwIl0gPC0gIk51IGFtIGZvc3QgbmljaW9kYXRhIGxhIHNjb2FsYSINCnRvcGxvdDMkZWR1W3RvcGxvdDMkZWR1PT0iMSJdIDwtICJTY29hbGEgZ2VuZXJhbGEiDQp0b3Bsb3QzJGVkdVt0b3Bsb3QzJGVkdT09IjIiXSA8LSAiTGljZXUgc2F1IHNjb2FsYSBwcm9mZXNpb25hbGEiDQp0b3Bsb3QzJGVkdVt0b3Bsb3QzJGVkdT09IjMiXSA8LSAiRmFjdWx0YXRlL01hc3RlcmF0L0RvY3RvcmF0Ig0KdG9wbG90MyRlZHVbdG9wbG90MyRlZHU9PSI0Il0gPC0gIlN0dWRpaSBwb3N0dW5pdmVyc2l0YXJlIg0KdG9wbG90MyRlZHUgPC0gZmFjdG9yKHRvcGxvdDMkZWR1LCBjKCJOdSBhbSBmb3N0IG5pY2lvZGF0YSBsYSBzY29hbGEiLCAiU2NvYWxhIGdlbmVyYWxhIiwgIkxpY2V1IHNhdSBTY29hbGEgcHJvZmVzaW9uYWxhIiwgIkZhY3VsdGF0ZS9NYXN0ZXJhdC9Eb2N0b3JhdCIsICJTdHVkaWkgcG9zdHVuaXZlcnNpdGFyZSIpKQ0KdG9wbG90MyRzdGF0ZW1lbnRfMTFbdG9wbG90MyRzdGF0ZW1lbnRfMTE9PSIxIl0gPC0gIlRvdGFsIGltcG90cml2YSINCnRvcGxvdDMkc3RhdGVtZW50XzExW3RvcGxvdDMkc3RhdGVtZW50XzExPT0iMiJdIDwtICJJbXBvdHJpdmEiDQp0b3Bsb3QzJHN0YXRlbWVudF8xMVt0b3Bsb3QzJHN0YXRlbWVudF8xMT09IjMiXSA8LSAiTmV1dHJ1Ig0KdG9wbG90MyRzdGF0ZW1lbnRfMTFbdG9wbG90MyRzdGF0ZW1lbnRfMTE9PSI0Il0gPC0gIkRlIGFjb3JkIg0KdG9wbG90MyRzdGF0ZW1lbnRfMTFbdG9wbG90MyRzdGF0ZW1lbnRfMTE9PSI1Il0gPC0gIlRvdGFsIGRlIGFjb3JkIg0KdG9wbG90MyRzdGF0ZW1lbnRfMTEgPC0gZmFjdG9yKHRvcGxvdDMkc3RhdGVtZW50XzExLCBjKCJUb3RhbCBpbXBvdHJpdmEiLCAiSW1wb3RyaXZhIiwgIk5ldXRydSIsICJEZSBhY29yZCIsICJUb3RhbCBkZSBhY29yZCIpKQ0KdG9wbG90MyA8LSBuYS5vbWl0KHRvcGxvdDMpDQoNCmwgPC0gZ2dwbG90KHRvcGxvdDMsIGFlcyhzdGF0ZW1lbnRfMTEsIGZpbGw9ZWR1KSkNCmwgKyBnZW9tX2JhcigpICsgc2NhbGVfZmlsbF9icmV3ZXIoKSArIGxhYnModGl0bGUgPSAiQ3VwbHVyaWxlIGhvbW9zZXh1YWxlIGFyIHRyZWJ1aSBcbiBzYSBzZSBidWN1cmUgZGUgYWNlbGVhc2kgZHJlcHR1cmkgY2Egc2kgY3VwbHVyaWxlIGhldGVyb3NleHVhbGUiLCB4ID0gIk9waW5pYSB1dGlsaXphdG9ydWx1aSIsIHkgPSAiTnVtYXIgdXRpbGl6YXRvcmkiKSArIHRoZW1lX21pbmltYWwoKSANCg0KYGBgDQoNCkFuZCB0aGUgcG9zc2liaWxpdGllcyBhcmUgZW5kbGVzcyEgSnVzdCB0ZWxsIG1lIHdoYXQgeW91IHdvdWxkIGxpa2UgdG8gc2VlIGluIGEgZ3JhcGggYW5kIEknbGwgZG8gaXQuIA0KDQoNCldFIGNhbiBsb29rIGF0IHRoZSBvcGluaW9ucyBvbiBzdGF0ZW1lbnRzIGdpdmVuIHRoZSB1c2VyJ3MgcG9saXRpY2FsIHByZWZlcmVuY2VzLCBtb3JlIHByZWNpc2VseSB0aGUgcHJvcGVuc2l0eSB0byB2b3RlIGZvciB0aGUgcGFydGllcyAoSSBzZWxlY3RlZCBQVFYgPiA3LCB0aGVuIHRoZSBwYXJ0eSB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlKQ0KYGBge3J9DQpybyRQU0QgPC0gaWZlbHNlKHJvJHB0dl9vcHRpb25fNl9xdWVzdGlvbl8zMiA9PTcsIDcsDQogICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fNl9xdWVzdGlvbl8zMiA9PTgsIDgsDQogICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fNl9xdWVzdGlvbl8zMiA9PTksIDksDQogICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fNl9xdWVzdGlvbl8zMiA9PTEwLCAxMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKQ0KICAgICAgICAgICAgICAgICAgICANCnJvJFBOTCA8LSBpZmVsc2Uocm8kcHR2X29wdGlvbl83X3F1ZXN0aW9uXzMyID09NywgNywNCiAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl83X3F1ZXN0aW9uXzMyID09OCwgOCwNCiAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl83X3F1ZXN0aW9uXzMyID09OSwgOSwNCiAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl83X3F1ZXN0aW9uXzMyID09MTAsIDEwLA0KICAgICAgICAgICAgICAgICAgICBOQSkpKSkNCg0Kcm8kQUxERSA8LSBpZmVsc2Uocm8kcHR2X29wdGlvbl84X3F1ZXN0aW9uXzMyID09NywgNywNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fOF9xdWVzdGlvbl8zMiA9PTgsIDgsDQogICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzhfcXVlc3Rpb25fMzIgPT05LCA5LA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl84X3F1ZXN0aW9uXzMyID09MTAsIDEwLA0KICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKQ0KDQpybyRVRE1SIDwtIGlmZWxzZShybyRwdHZfb3B0aW9uXzlfcXVlc3Rpb25fMzIgPT03LCA3LA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl85X3F1ZXN0aW9uXzMyID09OCwgOCwNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fOV9xdWVzdGlvbl8zMiA9PTksIDksDQogICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzlfcXVlc3Rpb25fMzIgPT0xMCwgMTAsDQogICAgICAgICAgICAgICAgICAgICAgTkEpKSkpDQoNCnJvJFVTUiA8LSBpZmVsc2Uocm8kcHR2X29wdGlvbl8xMF9xdWVzdGlvbl8zMiA9PTcsIDcsDQogICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fMTBfcXVlc3Rpb25fMzIgPT04LCA4LA0KICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzEwX3F1ZXN0aW9uXzMyID09OSwgOSwNCiAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl8xMF9xdWVzdGlvbl8zMiA9PTEwLCAxMCwNCiAgICAgICAgICAgICAgICAgICAgIE5BKSkpKQ0KDQpybyRQTVAgPC0gIGlmZWxzZShybyRwdHZfb3B0aW9uXzExX3F1ZXN0aW9uXzMyID09NywgNywNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fMTFfcXVlc3Rpb25fMzIgPT04LCA4LA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl8xMV9xdWVzdGlvbl8zMiA9PTksIDksDQogICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzExX3F1ZXN0aW9uXzMyID09MTAsIDEwLA0KICAgICAgICAgICAgICAgICAgICBOQSkpKSkNCg0KcHR2IDwtIHJvW2MoMTE5OjEyNCldDQpwdHYkcHR2bWF4IDwtIGFwcGx5KHB0diwgMSwgZnVuY3Rpb24oeCkgbmFtZXMgKHgpIFt3aGljaC5tYXgoeCldKQ0KcHR2JHB0dm1heFtwdHYkcHR2bWF4PT0iY2hhcmFjdGVyKDApIl0gPC0gTkENCnB0diA8LXB0dlssN10NCnB0diA8LSBkYXRhLmZyYW1lKHVubGlzdChwdHYpKQ0KdG9wbG90Z2F5IDwtIGNiaW5kKHB0diwgcm9bYyg2NyldKQ0KdG9wbG90Z2F5IDwtIG5hLm9taXQodG9wbG90Z2F5KQ0KcmVxdWlyZShnZ3Bsb3QyKQ0KZ2dwbG90KHRvcGxvdGdheSwgYWVzKHggPSBmYWN0b3Ioc3RhdGVtZW50XzExKSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIsIGZpbGw9ImRhcmtibHVlIiwgY29sb3VyPSJibGFjayIpICsgZmFjZXRfZ3JpZCh+IHVubGlzdC5wdHYuKSsgbGFicyh0aXRsZSA9ICJDdXBsdXJpbGUgaG9tb3NleHVhbGUgYXIgdHJlYnVpIFxuIHNhIHNlIGJ1Y3VyZSBkZSBhY2VsZWFzaSBkcmVwdHVyaSBjYSBzaSBjdXBsdXJpbGUgaGV0ZXJvc2V4dWFsZSIsIHggPSAiMSAtIFRvdGFsIGltcG90cml2YSwgMiAtIEltcG90cml2YSwgMyAtIE5ldXRydSwgNCAtIERlIGFjb3JkLCA1IC0gVG90YWwgZGUgYWNvcmQiLCB5ID0gIk51bWFyIHV0aWxpemF0b3JpIikgKyB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKQ0KDQpgYGANCg0KVGhlIHNhbWUgYXBwcm9hY2gsIGRpZmZlcmVudCBwcmVzZW50YXRpb24NCmBgYHtyfQ0KdG9wbG90Z2F5JHN0YXRlbWVudF8xMVt0b3Bsb3RnYXkkc3RhdGVtZW50XzExPT0iMSJdIDwtICJUb3RhbCBpbXBvdHJpdmEiDQp0b3Bsb3RnYXkkc3RhdGVtZW50XzExW3RvcGxvdGdheSRzdGF0ZW1lbnRfMTE9PSIyIl0gPC0gIkltcG90cml2YSINCnRvcGxvdGdheSRzdGF0ZW1lbnRfMTFbdG9wbG90Z2F5JHN0YXRlbWVudF8xMT09IjMiXSA8LSAiTmV1dHJ1Ig0KdG9wbG90Z2F5JHN0YXRlbWVudF8xMVt0b3Bsb3RnYXkkc3RhdGVtZW50XzExPT0iNCJdIDwtICJEZSBhY29yZCINCnRvcGxvdGdheSRzdGF0ZW1lbnRfMTFbdG9wbG90Z2F5JHN0YXRlbWVudF8xMT09IjUiXSA8LSAiVG90YWwgZGUgYWNvcmQiDQp0b3Bsb3RnYXkkc3RhdGVtZW50XzExIDwtIGZhY3Rvcih0b3Bsb3RnYXkkc3RhdGVtZW50XzExLCBjKCJUb3RhbCBpbXBvdHJpdmEiLCAiSW1wb3RyaXZhIiwgIk5ldXRydSIsICJEZSBhY29yZCIsICJUb3RhbCBkZSBhY29yZCIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpwIDwtIGdncGxvdCh0b3Bsb3RnYXksIGFlcyhzdGF0ZW1lbnRfMTEsIGZpbGw9dW5saXN0LnB0di4pKQ0KcCArIGdlb21fYmFyKCkgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpICsgbGFicyh0aXRsZSA9ICJDdXBsdXJpbGUgaG9tb3NleHVhbGUgYXIgdHJlYnVpIFxuIHNhIHNlIGJ1Y3VyZSBkZSBhY2VsZWFzaSBkcmVwdHVyaSBjYSBzaSBjdXBsdXJpbGUgaGV0ZXJvc2V4dWFsZSIsIHggPSAiIiwgeSA9ICJOdW1hciB1dGlsaXphdG9yaSIpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpKSArIHRoZW1lX21pbmltYWwoKSANCg0KDQpgYGANCg0K