Algoritma & Struktur Data

~ Ujian Akhir Semester ~


Kontak : \(\downarrow\)
Email
RPubs https://rpubs.com/kentzend03/


Soal

Berikut ini lampiran data perumahan di kota Melbourne Australia, dengan struktur data sebagai berikut:

Type: yang dibagi menjadi 3 bagian TipeA.csv TipeB.xlsx TipeC.rds

Dimana setiap tipe rumah (A,B,C) tersebut terdiri dari beberapa variabel sebagai berikut:

  • Suburb: Suburb

  • Rooms: Number of rooms

  • Price: Price in dollars

  • Method: Status of property sale -

    • S - property sold;

    • SP - property sold prior;

    • PI - property passed in;

    • PN - sold prior not disclosed;

    • SN - sold not disclosed;

    • VB - vendor bid;

    • W - withdrawn prior to auction;

    • SA - sold after auction;

    • SS - sold after auction price not disclosed.

  • SellerG: Real Estate Agent

  • Date: Date sold

  • Distance: Distance from CBD

  • Bedroom2: Number of Bedrooms

  • Bathroom: Number of Bathrooms

  • Car: Number of car spots

  • Landsize: Land Size

  • YearBuilt: Year the house was built

  • Regionname: General Region (West, North West, North, North east …etc)

1. Gabungkan Data Tipe A,B, C ke dalam Satu Data Frame Sehingga Membentuk Struktur Data (Type,Subur, Price, Method, SellerG, Date, Distance,Bedroom2, Bathroom, Car, Landsize, YearBuilt, Regionname)

pacman::p_load(readxl, writexl)   # Untuk dapat membaca excel
data1 <- read.csv("TipeA.csv",sep = ",")    # Import data dengan tipe csv
data2 <- read_excel("TipeB.xlsx")     # Import data dengan tipe csv
data3 <- readRDS("TipeC.rds")     # Import data dengan tipe csv

# Menambahkan variabel baru di setiap data.
data1$Type = "Cluster"
data2$Type = "Kompleks"
data3$Type = "Residence"

df <- rbind(data1,data2,data3)    # Menggabungkan ketiga data di atas
df   # Memanggil data
# Membuat satu data frame baru dengan nama ok yang berisi gabungan ketiga data
ok = data.frame("Type" =df$Type,
               "Subur" =df$Suburb,
               "Price"= df$Price,
               "Method" = df$Method,
               "SellerG" = df$SellerG,
               "Date" = df$Date,
               "Distance" = df$Distance,
               "Bedroom2" = df$Bedroom2,
               "Bathroom" = df$Bathroom,
               "Car" = df$Car,
               "Landsize" = df$Landsize,
               "YearBuilt" = df$YearBuilt,
               "Regionname" = df$Regionname)

ok  # Memanggil data frame

2. Rename Setiap Variabel di atas ke dalam Bahasa Indonesia

change <- ok   # Mengubah nama data frame ok menjadi change

# Rename semua nama varibel dengan menggunakan fungsi names
names(change) = c("Tipe",
               "Pinggiran Kota",
               "Harga",
               "Metode",
               "PenjualG",
               "Tanggal" ,
               "Jarak",
               "Kamartidur2",
               "Kamarmandi",
               "Mobil",
               "Luas",
               "Tahunbangun",
               "Daerah")

change

3. Rename Kategori Variabel “Regionname” ke dalam Bahasa Indonesia.

# Rename variabel "Regionname" ke dalam bahasa Indonesia
change$Daerah[change$Daerah=="Southern Metropolitan"] <- "Metropolitan Selatan"
change$Daerah[change$Daerah=="Northern Metropolitan"] <- "Metropolitan Utara"
change$Daerah[change$Daerah=="Western Metropolitan"] <- "Metropolitan Barat"
change$Daerah[change$Daerah=="Eastern Metropolitan"] <- "Metropolitan Timur"
change$Daerah[change$Daerah=="South-Eastern Metropolitan"] <- "Metropolitan Tenggara"
change$Daerah[change$Daerah=="Northern Victoria"] <- "Victoria Utara"
change$Daerah[change$Daerah=="Western Victoria"] <- "Victoria Barat"
change$Daerah[change$Daerah=="Eastern Victoria"] <- "Victoria Timur."

change  # Memanggil data

4. Lakukan Pengecekan Missing Value dan Pengendalian

# Cek semua missing value
t_NA = na.omit(change)  # Menghapus missing value pada data
t_NA  # Memanggil data
ada.NA = setdiff(change, t_NA)  # Memunculkan data "change" yang hanya memiliki missing value
ada.NA  # Memanggil Data
summary(change)  # Meringkas semua data "change"
##      Tipe           Pinggiran Kota         Harga             Metode         
##  Length:34857       Length:34857       Min.   :   85000   Length:34857      
##  Class :character   Class :character   1st Qu.:  635000   Class :character  
##  Mode  :character   Mode  :character   Median :  870000   Mode  :character  
##                                        Mean   : 1050173                     
##                                        3rd Qu.: 1295000                     
##                                        Max.   :11200000                     
##                                        NA's   :7610                         
##    PenjualG           Tanggal              Jarak        Kamartidur2    
##  Length:34857       Length:34857       Min.   : 0.00   Min.   : 0.000  
##  Class :character   Class :character   1st Qu.: 6.40   1st Qu.: 2.000  
##  Mode  :character   Mode  :character   Median :10.30   Median : 3.000  
##                                        Mean   :11.18   Mean   : 3.085  
##                                        3rd Qu.:14.00   3rd Qu.: 4.000  
##                                        Max.   :48.10   Max.   :30.000  
##                                        NA's   :1       NA's   :8217    
##    Kamarmandi         Mobil             Luas           Tahunbangun   
##  Min.   : 0.000   Min.   : 0.000   Min.   :     0.0   Min.   :1196   
##  1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.:   224.0   1st Qu.:1940   
##  Median : 2.000   Median : 2.000   Median :   521.0   Median :1970   
##  Mean   : 1.625   Mean   : 1.729   Mean   :   593.6   Mean   :1965   
##  3rd Qu.: 2.000   3rd Qu.: 2.000   3rd Qu.:   670.0   3rd Qu.:2000   
##  Max.   :12.000   Max.   :26.000   Max.   :433014.0   Max.   :2106   
##  NA's   :8226     NA's   :8728     NA's   :11810      NA's   :19306  
##     Daerah         
##  Length:34857      
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 

5.Buatlah Visualisasi Data secara Lengkap untuk Mendapatkan Informasi Penting yang Terkandung dalam Data_Perumahan_Melbourne.xlsx.

library(ggplot2) # Memanggil package ggplot2 untuk keperluan visualisasi data
ggplot(t_NA, aes(Harga)) +
  geom_histogram(binwidth=500000,
                 fill="lightgrey",
                 color="red",
                 bins =10,
                 size=1)+
  
  scale_x_continuous(breaks = c(1000000,2000000,3000000,4000000),
                     labels = c("$1m","$2m","$3m","$4m"))+
  labs(title="Price of Melbourne House")

library(ggplot2)  #Memanggil package ggplot2 untuk keperluan visualisasi data
ggplot(t_NA, aes(Tipe, Harga)) +
  geom_boxplot(outlier.colour = "yellow") + 
  scale_x_discrete(labels = c('A','B','C')) +
  scale_y_continuous(breaks=seq(0,10000000,1500000)) +
  xlab("Tipe") +
  ylab("Harga") +
  ggtitle("Price Distribution of Home Type")

library(scales)
library(dplyr)
plotdata <- t_NA %>%
  count(Daerah) %>%
  arrange(desc(Daerah)) %>%
  mutate(prop = round(n*100/sum(n),1),
         lab.ypos = cumsum(prop) - 0.5*prop)


ggplot(plotdata,
       aes(x = "",
           y = prop,
           fill = Daerah)) +
  geom_bar(width = 1, stat = "identity", color = "black") +
  coord_polar("y", start = 0) +
  geom_text(aes(y = lab.ypos, label = prop), color = "black") +
  scale_fill_brewer(palette="Greens", direction=-1) +
  theme_void() +
  labs(title = "Total Population")

library(ggplot2)                                     # untuk visualisasi
ggplot(t_NA,
       aes(x = Luas, 
           y = Harga)) +
  geom_point(color= "violet") +
  geom_smooth(method = "lm", color = "black")+
  scale_y_continuous(label = scales::dollar, 
                     limits = c(50000, 5000000)) +
  scale_x_continuous(breaks = seq(0, 2500, 200), 
                     limits=c(0, 2500)) +
  theme_minimal() +                                  # menggunakan tema minimal
  labs(x = "Luas Bangunan",
       y = "Harga",
       title = "Luas Bangunan Vs. Harga",
       subtitle = "Harga dan Luas")+
  theme(axis.text.x = element_text(angle = 60, hjust = 1))

library(ggplot2)                                     # untuk visualisasi
ggplot(t_NA,
       aes(x = Luas, 
           y = Harga)) +
  geom_point(color= "red") +
  geom_smooth(method = "lm",
              formula = y ~ poly(x, 2),
              color = "yellow")+
  scale_y_continuous(label = scales::dollar, 
                     limits = c(50000, 5000000)) +
  scale_x_continuous(breaks = seq(0, 2500, 200), 
                     limits=c(0, 2500)) +
  theme_minimal() +                                  # menggunakan tema minimal
  labs(x = "Luas Bangunan",
       y = "Harga",
       title = "Luas Bangunan Vs. Harga",
       subtitle = "Harga dan Luas")+
  theme(axis.text.x = element_text(angle = 60, hjust = 1))

library(dplyr)                                       # untuk manipulasi data
library(ggplot2)                                     # untuk visualisasi
library(scales)                                      # menentukan jeda atau label secara otomatis

# menghitung gaji rata-rata untuk setiap jabatan
plotdata <- t_NA %>%
  group_by(Daerah) %>%
  dplyr::summarize(mean_Harga = mean(Harga))
# plot gaji rata-rata dengan cara yang lebih menarik
mycols <- c("red", "orange", "yellow","green", "darkblue", "lightblue","lightgrey", "violet")
ggplot(plotdata, 
       aes(x = factor(Daerah,
                      labels = c("Selatan",
                                 "Utara",
                                 "Barat",
                                 "Timur",
                                 "Tenggara.Metropolitan",
                                 "Utara.Victoria",
                                 "Barat.Victoria",
                                 "Timur.Victoria")), 
                      y = mean_Harga)) +
  geom_bar(stat = "identity", 
           fill = mycols) +
  geom_text(aes(label = dollar(mean_Harga)), 
            vjust = -0.5) +
  scale_y_continuous(breaks = seq(0, 40000000, 500000), 
                     label = dollar) +
  theme_minimal() +                                  # menggunakan tema minimal
  labs(title = "Mean Salary by Rank", 
       x = "",
       y = "") +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))

LS0tDQp0aXRsZTogIkFsZ29yaXRtYSAmIFN0cnVrdHVyIERhdGEiDQpzdWJ0aXRsZTogIn4gVWppYW4gQWtoaXIgU2VtZXN0ZXIgfiINCmF1dGhvcjogIktlbnQgSnVhbiBOYXRhbmllbCBZYW9pc29raGkgWmVuZHJhdG8gKDIwMjE0NTIwMDA0KSINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJvYm9ib29rOiAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUuY3NzIg0KDQotLS0NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChjbGFzcy5zb3VyY2UgPSAibm9jb3B5IiwNCiAgICAgICAgICAgICAgICAgICAgICBjbGFzcy5vdXRwdXQgPSAibm9jb3B5IiwNCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRiwNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRikNCg0KbGlicmFyeShyZXRpY3VsYXRlKQ0KbGlicmFyeShSY3BwKQ0KYGBgDQoNCjxicj4NCg0KPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IC02NXB4IDY1cHggMHB4IDY1cHg7IHdpZHRoOjI1JSIgc3JjPSJGb3RvLnBuZyIvPiAgDQoNCnwNCjotLS0tIHw6LS0tLQ0KKipLb250YWsqKnwgKio6ICRcZG93bmFycm93JCoqDQpFbWFpbHwga2VudC56ZW5kcmF0b0BzdHVkZW50Lm1hdGFuYXVuaXZlcnNpdHkuYWMuaWQNClJQdWJzICB8IGh0dHBzOi8vcnB1YnMuY29tL2tlbnR6ZW5kMDMvDQoNCioqKg0KDQoqKioNCg0KIyBTb2FsDQoNCkJlcmlrdXQgaW5pIGxhbXBpcmFuIGRhdGEgcGVydW1haGFuIGRpIGtvdGEgTWVsYm91cm5lIEF1c3RyYWxpYSwgZGVuZ2FuIHN0cnVrdHVyIGRhdGEgc2ViYWdhaSBiZXJpa3V0Og0KDQpUeXBlOiB5YW5nIGRpYmFnaSBtZW5qYWRpIDMgYmFnaWFuDQogICAgICAgICAgVGlwZUEuY3N2DQogICAgICAgICAgVGlwZUIueGxzeA0KICAgICAgICAgIFRpcGVDLnJkcw0KDQpEaW1hbmEgc2V0aWFwIHRpcGUgcnVtYWggKEEsQixDKSB0ZXJzZWJ1dCB0ZXJkaXJpIGRhcmkgYmViZXJhcGEgdmFyaWFiZWwgc2ViYWdhaSBiZXJpa3V0Og0KDQotIFN1YnVyYjogU3VidXJiDQoNCi0gUm9vbXM6IE51bWJlciBvZiByb29tcw0KDQotIFByaWNlOiBQcmljZSBpbiBkb2xsYXJzDQoNCi0gTWV0aG9kOiBTdGF0dXMgb2YgcHJvcGVydHkgc2FsZSAtDQoNCiAgICAgKiBTIC0gcHJvcGVydHkgc29sZDsNCg0KICAgICAqIFNQIC0gcHJvcGVydHkgc29sZCBwcmlvcjsNCiAgICANCiAgICAgKiBQSSAtIHByb3BlcnR5IHBhc3NlZCBpbjsNCiAgICANCiAgICAgKiBQTiAtIHNvbGQgcHJpb3Igbm90IGRpc2Nsb3NlZDsNCiAgICANCiAgICAgKiBTTiAtIHNvbGQgbm90IGRpc2Nsb3NlZDsNCiAgICANCiAgICAgKiBWQiAtIHZlbmRvciBiaWQ7DQogICAgDQogICAgICogVyAtIHdpdGhkcmF3biBwcmlvciB0byBhdWN0aW9uOw0KICAgIA0KICAgICAqIFNBIC0gc29sZCBhZnRlciBhdWN0aW9uOw0KICAgIA0KICAgICAqIFNTIC0gc29sZCBhZnRlciBhdWN0aW9uIHByaWNlIG5vdCBkaXNjbG9zZWQuDQogICAgDQotIFNlbGxlckc6IFJlYWwgRXN0YXRlIEFnZW50DQoNCi0gRGF0ZTogRGF0ZSBzb2xkDQoNCi0gRGlzdGFuY2U6IERpc3RhbmNlIGZyb20gQ0JEDQoNCi0gQmVkcm9vbTI6IE51bWJlciBvZiBCZWRyb29tcw0KDQotIEJhdGhyb29tOiBOdW1iZXIgb2YgQmF0aHJvb21zDQoNCi0gQ2FyOiBOdW1iZXIgb2YgY2FyIHNwb3RzDQoNCi0gTGFuZHNpemU6IExhbmQgU2l6ZQ0KDQotIFllYXJCdWlsdDogWWVhciB0aGUgaG91c2Ugd2FzIGJ1aWx0DQoNCi0gUmVnaW9ubmFtZTogR2VuZXJhbCBSZWdpb24gKFdlc3QsIE5vcnRoIFdlc3QsIE5vcnRoLCBOb3J0aCBlYXN0IOKApmV0YykNCg0KIyMgKioxLiBHYWJ1bmdrYW4gRGF0YSBUaXBlIEEsQiwgQyBrZSBkYWxhbSBTYXR1IERhdGEgRnJhbWUgU2VoaW5nZ2EgTWVtYmVudHVrIFN0cnVrdHVyIERhdGEgKFR5cGUsU3VidXIsIFByaWNlLCBNZXRob2QsIFNlbGxlckcsICBEYXRlLCBEaXN0YW5jZSxCZWRyb29tMiwgQmF0aHJvb20sIENhciwgTGFuZHNpemUsIFllYXJCdWlsdCwgUmVnaW9ubmFtZSkqKg0KDQpgYGB7cn0NCnBhY21hbjo6cF9sb2FkKHJlYWR4bCwgd3JpdGV4bCkgICAjIFVudHVrIGRhcGF0IG1lbWJhY2EgZXhjZWwNCmRhdGExIDwtIHJlYWQuY3N2KCJUaXBlQS5jc3YiLHNlcCA9ICIsIikgICAgIyBJbXBvcnQgZGF0YSBkZW5nYW4gdGlwZSBjc3YNCmRhdGEyIDwtIHJlYWRfZXhjZWwoIlRpcGVCLnhsc3giKSAgICAgIyBJbXBvcnQgZGF0YSBkZW5nYW4gdGlwZSBjc3YNCmRhdGEzIDwtIHJlYWRSRFMoIlRpcGVDLnJkcyIpICAgICAjIEltcG9ydCBkYXRhIGRlbmdhbiB0aXBlIGNzdg0KDQojIE1lbmFtYmFoa2FuIHZhcmlhYmVsIGJhcnUgZGkgc2V0aWFwIGRhdGEuDQpkYXRhMSRUeXBlID0gIkNsdXN0ZXIiDQpkYXRhMiRUeXBlID0gIktvbXBsZWtzIg0KZGF0YTMkVHlwZSA9ICJSZXNpZGVuY2UiDQoNCmRmIDwtIHJiaW5kKGRhdGExLGRhdGEyLGRhdGEzKSAgICAjIE1lbmdnYWJ1bmdrYW4ga2V0aWdhIGRhdGEgZGkgYXRhcw0KZGYgICAjIE1lbWFuZ2dpbCBkYXRhDQpgYGANCg0KYGBge3J9DQojIE1lbWJ1YXQgc2F0dSBkYXRhIGZyYW1lIGJhcnUgZGVuZ2FuIG5hbWEgb2sgeWFuZyBiZXJpc2kgZ2FidW5nYW4ga2V0aWdhIGRhdGENCm9rID0gZGF0YS5mcmFtZSgiVHlwZSIgPWRmJFR5cGUsDQogICAgICAgICAgICAgICAiU3VidXIiID1kZiRTdWJ1cmIsDQogICAgICAgICAgICAgICAiUHJpY2UiPSBkZiRQcmljZSwNCiAgICAgICAgICAgICAgICJNZXRob2QiID0gZGYkTWV0aG9kLA0KICAgICAgICAgICAgICAgIlNlbGxlckciID0gZGYkU2VsbGVyRywNCiAgICAgICAgICAgICAgICJEYXRlIiA9IGRmJERhdGUsDQogICAgICAgICAgICAgICAiRGlzdGFuY2UiID0gZGYkRGlzdGFuY2UsDQogICAgICAgICAgICAgICAiQmVkcm9vbTIiID0gZGYkQmVkcm9vbTIsDQogICAgICAgICAgICAgICAiQmF0aHJvb20iID0gZGYkQmF0aHJvb20sDQogICAgICAgICAgICAgICAiQ2FyIiA9IGRmJENhciwNCiAgICAgICAgICAgICAgICJMYW5kc2l6ZSIgPSBkZiRMYW5kc2l6ZSwNCiAgICAgICAgICAgICAgICJZZWFyQnVpbHQiID0gZGYkWWVhckJ1aWx0LA0KICAgICAgICAgICAgICAgIlJlZ2lvbm5hbWUiID0gZGYkUmVnaW9ubmFtZSkNCg0Kb2sgICMgTWVtYW5nZ2lsIGRhdGEgZnJhbWUNCmBgYA0KIyMgKioyLiBSZW5hbWUgU2V0aWFwIFZhcmlhYmVsIGRpIGF0YXMga2UgZGFsYW0gQmFoYXNhIEluZG9uZXNpYSoqDQoNCmBgYHtyfQ0KY2hhbmdlIDwtIG9rICAgIyBNZW5ndWJhaCBuYW1hIGRhdGEgZnJhbWUgb2sgbWVuamFkaSBjaGFuZ2UNCg0KIyBSZW5hbWUgc2VtdWEgbmFtYSB2YXJpYmVsIGRlbmdhbiBtZW5nZ3VuYWthbiBmdW5nc2kgbmFtZXMNCm5hbWVzKGNoYW5nZSkgPSBjKCJUaXBlIiwNCiAgICAgICAgICAgICAgICJQaW5nZ2lyYW4gS290YSIsDQogICAgICAgICAgICAgICAiSGFyZ2EiLA0KICAgICAgICAgICAgICAgIk1ldG9kZSIsDQogICAgICAgICAgICAgICAiUGVuanVhbEciLA0KICAgICAgICAgICAgICAgIlRhbmdnYWwiICwNCiAgICAgICAgICAgICAgICJKYXJhayIsDQogICAgICAgICAgICAgICAiS2FtYXJ0aWR1cjIiLA0KICAgICAgICAgICAgICAgIkthbWFybWFuZGkiLA0KICAgICAgICAgICAgICAgIk1vYmlsIiwNCiAgICAgICAgICAgICAgICJMdWFzIiwNCiAgICAgICAgICAgICAgICJUYWh1bmJhbmd1biIsDQogICAgICAgICAgICAgICAiRGFlcmFoIikNCg0KY2hhbmdlDQpgYGANCg0KIyMgKiozLiBSZW5hbWUgS2F0ZWdvcmkgVmFyaWFiZWwgIlJlZ2lvbm5hbWUiIGtlIGRhbGFtIEJhaGFzYSBJbmRvbmVzaWEuKioNCg0KYGBge3J9DQojIFJlbmFtZSB2YXJpYWJlbCAiUmVnaW9ubmFtZSIga2UgZGFsYW0gYmFoYXNhIEluZG9uZXNpYQ0KY2hhbmdlJERhZXJhaFtjaGFuZ2UkRGFlcmFoPT0iU291dGhlcm4gTWV0cm9wb2xpdGFuIl0gPC0gIk1ldHJvcG9saXRhbiBTZWxhdGFuIg0KY2hhbmdlJERhZXJhaFtjaGFuZ2UkRGFlcmFoPT0iTm9ydGhlcm4gTWV0cm9wb2xpdGFuIl0gPC0gIk1ldHJvcG9saXRhbiBVdGFyYSINCmNoYW5nZSREYWVyYWhbY2hhbmdlJERhZXJhaD09Ildlc3Rlcm4gTWV0cm9wb2xpdGFuIl0gPC0gIk1ldHJvcG9saXRhbiBCYXJhdCINCmNoYW5nZSREYWVyYWhbY2hhbmdlJERhZXJhaD09IkVhc3Rlcm4gTWV0cm9wb2xpdGFuIl0gPC0gIk1ldHJvcG9saXRhbiBUaW11ciINCmNoYW5nZSREYWVyYWhbY2hhbmdlJERhZXJhaD09IlNvdXRoLUVhc3Rlcm4gTWV0cm9wb2xpdGFuIl0gPC0gIk1ldHJvcG9saXRhbiBUZW5nZ2FyYSINCmNoYW5nZSREYWVyYWhbY2hhbmdlJERhZXJhaD09Ik5vcnRoZXJuIFZpY3RvcmlhIl0gPC0gIlZpY3RvcmlhIFV0YXJhIg0KY2hhbmdlJERhZXJhaFtjaGFuZ2UkRGFlcmFoPT0iV2VzdGVybiBWaWN0b3JpYSJdIDwtICJWaWN0b3JpYSBCYXJhdCINCmNoYW5nZSREYWVyYWhbY2hhbmdlJERhZXJhaD09IkVhc3Rlcm4gVmljdG9yaWEiXSA8LSAiVmljdG9yaWEgVGltdXIuIg0KDQpjaGFuZ2UgICMgTWVtYW5nZ2lsIGRhdGENCmBgYA0KDQojIyAqKjQuIExha3VrYW4gUGVuZ2VjZWthbiBNaXNzaW5nIFZhbHVlIGRhbiBQZW5nZW5kYWxpYW4qKg0KDQpgYGB7cn0NCiMgQ2VrIHNlbXVhIG1pc3NpbmcgdmFsdWUNCnRfTkEgPSBuYS5vbWl0KGNoYW5nZSkgICMgTWVuZ2hhcHVzIG1pc3NpbmcgdmFsdWUgcGFkYSBkYXRhDQp0X05BICAjIE1lbWFuZ2dpbCBkYXRhDQoNCmFkYS5OQSA9IHNldGRpZmYoY2hhbmdlLCB0X05BKSAgIyBNZW11bmN1bGthbiBkYXRhICJjaGFuZ2UiIHlhbmcgaGFueWEgbWVtaWxpa2kgbWlzc2luZyB2YWx1ZQ0KYWRhLk5BICAjIE1lbWFuZ2dpbCBEYXRhDQpgYGANCg0KDQpgYGB7cn0NCnN1bW1hcnkoY2hhbmdlKSAgIyBNZXJpbmdrYXMgc2VtdWEgZGF0YSAiY2hhbmdlIg0KYGBgDQoNCg0KIyMgKio1LkJ1YXRsYWggVmlzdWFsaXNhc2kgRGF0YSBzZWNhcmEgTGVuZ2thcCB1bnR1ayBNZW5kYXBhdGthbiBJbmZvcm1hc2kgUGVudGluZyB5YW5nIFRlcmthbmR1bmcgZGFsYW0gRGF0YV9QZXJ1bWFoYW5fTWVsYm91cm5lLnhsc3guKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpICMgTWVtYW5nZ2lsIHBhY2thZ2UgZ2dwbG90MiB1bnR1ayBrZXBlcmx1YW4gdmlzdWFsaXNhc2kgZGF0YQ0KZ2dwbG90KHRfTkEsIGFlcyhIYXJnYSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9NTAwMDAwLA0KICAgICAgICAgICAgICAgICBmaWxsPSJsaWdodGdyZXkiLA0KICAgICAgICAgICAgICAgICBjb2xvcj0icmVkIiwNCiAgICAgICAgICAgICAgICAgYmlucyA9MTAsDQogICAgICAgICAgICAgICAgIHNpemU9MSkrDQogIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygxMDAwMDAwLDIwMDAwMDAsMzAwMDAwMCw0MDAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIiQxbSIsIiQybSIsIiQzbSIsIiQ0bSIpKSsNCiAgbGFicyh0aXRsZT0iUHJpY2Ugb2YgTWVsYm91cm5lIEhvdXNlIikNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKSAgI01lbWFuZ2dpbCBwYWNrYWdlIGdncGxvdDIgdW50dWsga2VwZXJsdWFuIHZpc3VhbGlzYXNpIGRhdGENCmdncGxvdCh0X05BLCBhZXMoVGlwZSwgSGFyZ2EpKSArDQogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG91ciA9ICJ5ZWxsb3ciKSArIA0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoJ0EnLCdCJywnQycpKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDAsMTAwMDAwMDAsMTUwMDAwMCkpICsNCiAgeGxhYigiVGlwZSIpICsNCiAgeWxhYigiSGFyZ2EiKSArDQogIGdndGl0bGUoIlByaWNlIERpc3RyaWJ1dGlvbiBvZiBIb21lIFR5cGUiKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoZHBseXIpDQpwbG90ZGF0YSA8LSB0X05BICU+JQ0KICBjb3VudChEYWVyYWgpICU+JQ0KICBhcnJhbmdlKGRlc2MoRGFlcmFoKSkgJT4lDQogIG11dGF0ZShwcm9wID0gcm91bmQobioxMDAvc3VtKG4pLDEpLA0KICAgICAgICAgbGFiLnlwb3MgPSBjdW1zdW0ocHJvcCkgLSAwLjUqcHJvcCkNCg0KDQpnZ3Bsb3QocGxvdGRhdGEsDQogICAgICAgYWVzKHggPSAiIiwNCiAgICAgICAgICAgeSA9IHByb3AsDQogICAgICAgICAgIGZpbGwgPSBEYWVyYWgpKSArDQogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCkgKw0KICBnZW9tX3RleHQoYWVzKHkgPSBsYWIueXBvcywgbGFiZWwgPSBwcm9wKSwgY29sb3IgPSAiYmxhY2siKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkdyZWVucyIsIGRpcmVjdGlvbj0tMSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKHRpdGxlID0gIlRvdGFsIFBvcHVsYXRpb24iKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdW50dWsgdmlzdWFsaXNhc2kNCmdncGxvdCh0X05BLA0KICAgICAgIGFlcyh4ID0gTHVhcywgDQogICAgICAgICAgIHkgPSBIYXJnYSkpICsNCiAgZ2VvbV9wb2ludChjb2xvcj0gInZpb2xldCIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsID0gc2NhbGVzOjpkb2xsYXIsIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyg1MDAwMCwgNTAwMDAwMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyNTAwLCAyMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKDAsIDI1MDApKSArDQogIHRoZW1lX21pbmltYWwoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVuZ2d1bmFrYW4gdGVtYSBtaW5pbWFsDQogIGxhYnMoeCA9ICJMdWFzIEJhbmd1bmFuIiwNCiAgICAgICB5ID0gIkhhcmdhIiwNCiAgICAgICB0aXRsZSA9ICJMdWFzIEJhbmd1bmFuIFZzLiBIYXJnYSIsDQogICAgICAgc3VidGl0bGUgPSAiSGFyZ2EgZGFuIEx1YXMiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bnR1ayB2aXN1YWxpc2FzaQ0KZ2dwbG90KHRfTkEsDQogICAgICAgYWVzKHggPSBMdWFzLCANCiAgICAgICAgICAgeSA9IEhhcmdhKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yPSAicmVkIikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICBmb3JtdWxhID0geSB+IHBvbHkoeCwgMiksDQogICAgICAgICAgICAgIGNvbG9yID0gInllbGxvdyIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWwgPSBzY2FsZXM6OmRvbGxhciwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDUwMDAwLCA1MDAwMDAwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI1MDAsIDIwMCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoMCwgMjUwMCkpICsNCiAgdGhlbWVfbWluaW1hbCgpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZW5nZ3VuYWthbiB0ZW1hIG1pbmltYWwNCiAgbGFicyh4ID0gIkx1YXMgQmFuZ3VuYW4iLA0KICAgICAgIHkgPSAiSGFyZ2EiLA0KICAgICAgIHRpdGxlID0gIkx1YXMgQmFuZ3VuYW4gVnMuIEhhcmdhIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJIYXJnYSBkYW4gTHVhcyIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEpKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdW50dWsgbWFuaXB1bGFzaSBkYXRhDQpsaWJyYXJ5KGdncGxvdDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdW50dWsgdmlzdWFsaXNhc2kNCmxpYnJhcnkoc2NhbGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZW5lbnR1a2FuIGplZGEgYXRhdSBsYWJlbCBzZWNhcmEgb3RvbWF0aXMNCg0KIyBtZW5naGl0dW5nIGdhamkgcmF0YS1yYXRhIHVudHVrIHNldGlhcCBqYWJhdGFuDQpwbG90ZGF0YSA8LSB0X05BICU+JQ0KICBncm91cF9ieShEYWVyYWgpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG1lYW5fSGFyZ2EgPSBtZWFuKEhhcmdhKSkNCiMgcGxvdCBnYWppIHJhdGEtcmF0YSBkZW5nYW4gY2FyYSB5YW5nIGxlYmloIG1lbmFyaWsNCm15Y29scyA8LSBjKCJyZWQiLCAib3JhbmdlIiwgInllbGxvdyIsImdyZWVuIiwgImRhcmtibHVlIiwgImxpZ2h0Ymx1ZSIsImxpZ2h0Z3JleSIsICJ2aW9sZXQiKQ0KZ2dwbG90KHBsb3RkYXRhLCANCiAgICAgICBhZXMoeCA9IGZhY3RvcihEYWVyYWgsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiU2VsYXRhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXRhcmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhcmF0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW11ciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVuZ2dhcmEuTWV0cm9wb2xpdGFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVdGFyYS5WaWN0b3JpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFyYXQuVmljdG9yaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbXVyLlZpY3RvcmlhIikpLCANCiAgICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9IYXJnYSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIA0KICAgICAgICAgICBmaWxsID0gbXljb2xzKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBkb2xsYXIobWVhbl9IYXJnYSkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDQwMDAwMDAwLCA1MDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZG9sbGFyKSArDQogIHRoZW1lX21pbmltYWwoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVuZ2d1bmFrYW4gdGVtYSBtaW5pbWFsDQogIGxhYnModGl0bGUgPSAiTWVhbiBTYWxhcnkgYnkgUmFuayIsIA0KICAgICAgIHggPSAiIiwNCiAgICAgICB5ID0gIiIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAwLjUpKQ0KYGBgDQoNCg==