Disclaimer: ini hanyalah keisengan sekaligus melatih kemampuan eksplorasi data yang saya miliki. Mohon maaf jika ada yang kurang berkenan.

Sekiranya ada yang keberatan dengan tulisan saya ini, silahkan japri.

1 Preparation

Load package yang akan digunakan. Dalam hal ini package yang akan digunakan adalah tibble, dplyr and ggplot2.

library(tibble)
library(dplyr)
library(ggplot2)

2 Data

Data diperoleh dari laporan untuk “penagihan” oleh Yoga Primanda di grup WhatsApp tanggal 24 Mei 2019. Awalnya data hanya diperoleh Name dan Spending untuk masing-masing orang yang datang. Kemudian saya tambahkan variabel Percentage (persentase spending masing-masing terhadap total spending), Gender dan Married (status pernikahan).

Saya gunakan fungsi tribble() dari package tibble untuk membuat data dengan nama bukber.

bukber <- tribble(~Name, ~Spending, ~Percentage, ~Gender, ~Married,
        "Marco", 123120, 0.040494938, "M", "N",
        "Anes", 125400, 0.041244844, "F", "Y",
        "Abud", 131100, 0.04311961, "M", "N",
        "Miko", 136800, 0.044994376, "M", "Y",
        "Opik", 136800, 0.044994376, "M", "Y",
        "Yoga", 148200, 0.048743907, "M", "N",
        "Lusi", 148200, 0.048743907, "F", "N",
        "Ais", 148200, 0.048743907, "F", "N",
        "Memey", 153900, 0.050618673, "F", "N",
        "RRPD", 153900, 0.050618673, "M", "N",
        "Martua", 157320, 0.051743532, 'M', "N",
        "Adw", 182400, 0.059992501, "F", "N",
        "Rizki R", 188100, 0.061867267, "M", "N",
        "Imam", 188100, 0.061867267, "M", "Y",
        "Karin", 199500, 0.065616798, "F", "N",
        "Rossi", 222300, 0.073115861, "F", "Y",
        "Azyl", 237120, 0.077990251, "F", "Y",
        "Devi", 259920, 0.085489314, "F", "Y")

Untuk kebutuhan visualisasi saya buat sebuah variabel baru dengan nama Currency (Spending dalam format mata uang Rupiah) ke dalam data frame yang baru bernama bukber_tbl.

bukber_tbl <- bukber %>% 
  mutate(Currency = paste(substr(bukber$Spending, 1, 3), substr(bukber$Spending, 4, 6), sep = ","))

3 Average Spending Amount by Gender

bukber_gender <- bukber_tbl %>% 
  group_by(Gender) %>% 
  summarise(total = sum(Spending),
            n = n()) %>% 
  mutate(pct_spending = total/n,
         Gender = if_else(Gender == "M", "Male", "Female"))
bukber_gender
bukber_gender %>% 
  ggplot(mapping = aes(x = Gender, y = pct_spending, fill = Gender)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0("Rp ", substr(bukber_gender$pct_spending, 1, 3), ",", substr(bukber_gender$pct_spending, 4, 6))), vjust = -0.25) +
  labs(title = "Spending of Buka Bersama STK46 2019",
       subtitle = paste("Avg Spending Amount by Gender"),
       caption = "Avg Spending = Total Spending Group/# Member of Group (Rp)",
       y = "Avg Spending (Rp)") +
  theme(legend.position = "none") +
  ylim(0, 200000)

Dari plot di atas diperoleh informasi bahwa rata-rata uang yang dihabiskan oleh Perempuan yang datang pada acara Buka Bersama STK46 2019 lebih tinggi daripada kelompok laki-laki.

4 Hypothesis Testing By Gender

Kita akan lakukan uji hipotesis dengan menggunakan hipotesis

H0: Tidak ada perbedaan rata-rata uang yang dihabiskan antara kelompok perempuan dan laki-laki.

H1: Kelompok perempuan rata-rata menghabiskan uang lebih banyak dibanding kelompok laki-laki.

male <- bukber_tbl %>% 
  filter(Gender == "M") %>% 
  select(Spending) %>% 
  as.vector()
male
female <- bukber_tbl %>% 
  filter(Gender == "F") %>% 
  select(Spending) %>% 
  as.vector()
female
t.test(x = female$Spending, y = male$Spending, alternative = "greater")

    Welch Two Sample t-test

data:  female$Spending and male$Spending
t = 2.0142, df = 11.839, p-value = 0.03364
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 3975.948      Inf
sample estimates:
mean of x mean of y 
 186326.7  151493.3 

alternative = "greater" artinya hipotesis alternatif bahwa x memiliki nilai rata-rata yang lebih besar daripada y.

Dengan tingkat kepercayaan (1 - \(\alpha\)) sebesar 95%, rata-rata uang yang dihabiskan oleh kelompok perempuan lebih besar dibanding kelompok laki-laki signifikan secara statistik. Hal ini dapat dilihat dari nilai p-value yang kurang dari \(\alpha\) (p-value < 0.05).

5 Average Spending Amount by Marital

bukber_married <- bukber_tbl %>% 
  group_by(Married) %>% 
  summarise(total = sum(Spending),
            n = n()) %>% 
  mutate(pct_spending = total/n,
         Married = if_else(Married == "Y", "Yes", "No")) 
bukber_married %>% 
  ggplot(mapping = aes(x = Married, y = pct_spending, fill = Married)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0("Rp ", substr(bukber_married$pct_spending, 1, 3), ",", substr(bukber_married$pct_spending, 4, 6))), vjust = -0.25) +
  labs(title = "Spending of Buka Bersama STK46 2019",
       subtitle = paste("Avg Spending Amount by Married Status"),
       caption = "Avg Spending = Total Spending Group/# Member of Group (Rp)",
       x = "Married Status",
       y = "Avg Spending (Rp)") +
  theme(legend.position = "none") +
  ylim(0, 200000)

Melihat plot di atas saya cukup kaget. Awalnya saya pikir orang-orang yang belum menikah akan cenderung menghabiskan lebih banyak uang. Namun ternyata rata-rata uang yang dihabiskan oleh orang-orang yang sudah menikah lebih tinggi dibanding yang belum menikah.

6 Hypothesis Testing By Marital

Kita akan lakukan uji hipotesis dengan menggunakan hipotesis

H0: Tidak ada perbedaan rata-rata uang yang dihabiskan antara kelompok yang sudah menikah dan yang belum menikah.

H1: Kelompok yang sudah menikah rata-rata menghabiskan uang lebih banyak dibanding kelompok yang belum menikah.

married <- bukber_tbl %>% 
  filter(Married == "Y") %>% 
  select(Spending) %>% 
  as.vector()
married
unmarried <- bukber_tbl %>% 
  filter(Married == "N") %>% 
  select(Spending) %>% 
  as.vector()
unmarried
t.test(x = married$Spending, y = unmarried$Spending, alternative = "greater")

    Welch Two Sample t-test

data:  married$Spending and unmarried$Spending
t = 1.329, df = 7.4242, p-value = 0.1116
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 -11991.64       Inf
sample estimates:
mean of x mean of y 
 186634.3  157630.9 

alternative = "greater" artinya hipotesis alternatif bahwa x memiliki nilai rata-rata yang lebih besar daripada y.

Dengan tingkat kepercayaan yang sama dengan uji hipotesis kelompok perempuan dan laki-laki yaitu sebesar 95%, rata-rata uang yang dihabiskan oleh kelompok yang sudah menikah tidak signifikan lebih besar dibanding kelompok yang belum menikah secara statistik. Hal ini dapat dilihat dari nilai p-value yang lebih besar dari \(\alpha\) (p-value > 0.05).

7 Top Spender

avg_spending <- mean(bukber_tbl$Spending)
avg_spending <- paste0("Avg Spending: Rp ", substr(avg_spending, 1, 3), ",", substr(avg_spending, 4, 6))
avg_spending
[1] "Avg Spending: Rp 168,910"
total_spending <- sum(bukber_tbl$Spending)
total_spending <- paste0("Total Spending: Rp ", substr(total_spending, 1, 1), ",", substr(total_spending, 2, 4), ",", substr(total_spending, 5, 7))
total_spending
[1] "Total Spending: Rp 3,040,380"

Vector character ini akan digunakan untuk anotasi pada grafik di bawah ini.

bukber_tbl %>% 
  ggplot(mapping = aes(x = reorder(Name, Percentage*100), y = Percentage*100)) +
  geom_bar(aes(fill = Percentage*100), stat = "identity") +
  geom_text(aes(label = paste0("Rp ", Currency, " (", round(Percentage*100, 2), "%)")), hjust = -0.25) +
  coord_flip() +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        axis.line.x.bottom = element_blank(),
        legend.position = "none") +
  labs(title = "Spending of Buka Bersama STK46 2019",
       subtitle = paste0(avg_spending, " and ", total_spending),
       x = "",
       y = "Spending Amount (in %*)",
       caption = "*Percentage from Total Spending") +
  ylim(0, 12)

Dilihat dari grafik di atas, 3 (tiga) orang top spender adalah perempuan yang sudah menikah. Hal ini cukup menjelaskan dua grafik sebelumnya. Dari 3 orang top spender, total spending mereka adalah Rp 719,340 atau sekitar 23,7% dari total spending semua orang yang hadir pada acara tersebut.

8 Conclusion

Pada kelompok antara perempuan dan laki-laki terdapat perbedaan rata-rata uang yang dihabiskan secara signifikan dengan tingkat kepercayaan dari uji hipotesis sebesar 95%. Namun pada kelompok yang sudah menikah dan yang belum menikah, walaupun rata-rata uang yang dihabiskan pada kedua kelompok tersebut berbeda, namun ternyata tidak berbeda secara signifikan melalui uji hipotesis. Jika dilihat secara individu, 3 orang top spender memang perempuan yang sudah menikah dengan total uang yang dihabiskan oleh mereka adalah Rp 719,340 atau sekitar 23,7% dari total spending. Masing-masing menghabiskan uang lebih besar dari Rp 200,000.

LS0tDQp0aXRsZTogIkV4cGxvcmF0aW9uIG9mIFNwZW5kaW5nIEFtb3VudCBhdCBCdWthIEJlcnNhbWEgU1RLMjQ2IDIwMTkgRXZlbnQiDQphdXRob3I6ICJBZXAgSGlkYXlhdHVsb2giDQpkYXRlOiAiTGFzdCBVcGRhdGU6IDIwMTkgRGVjZW1iZXIgMzAiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IHNwYWNlbGFiDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCi0tLQ0KDQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmJvZHl7IC8qIE5vcm1hbCAgKi8NCiAgICAgIGZvbnQtc2l6ZTogMTJweDsNCiAgfQ0KdGQgeyAgLyogVGFibGUgICovDQogIGZvbnQtc2l6ZTogMTJweDsNCn0NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAzOHB4Ow0KICBjb2xvcjogbGlnaHRibHVlOw0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCmgxIHsgLyogSGVhZGVyIDEgKi8NCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya0JsdWU7DQp9DQpoMiB7IC8qIEhlYWRlciAyICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgY29sb3I6IERhcmtCbHVlOw0KfQ0KaDMgeyAvKiBIZWFkZXIgMyAqLw0KICBmb250LXNpemU6IDE2cHg7DQojICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KfQ0KaDQgeyAvKiBIZWFkZXIgNCAqLw0KICBmb250LXNpemU6IDE0cHg7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCn0NCmNvZGUucnsgLyogQ29kZSBibG9jayAqLw0KICAgIGZvbnQtc2l6ZTogMTJweDsNCn0NCnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovDQogICAgZm9udC1zaXplOiAxMnB4Ow0KfQ0KPC9zdHlsZT4NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiNrbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1UUlVFLCBmaWcuaGVpZ2h0PTMuNSwgZmlnLndpZHRoPTkuMiwgcmVzdWx0cz0naG9sZCcsIHdhcm5pbmc9RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSkgDQpvcHRpb25zKHNjaXBlbiA9IDk5KQ0KYGBgDQoNCioqRGlzY2xhaW1lcioqOiBpbmkgaGFueWFsYWgga2Vpc2VuZ2FuIHNla2FsaWd1cyBtZWxhdGloIGtlbWFtcHVhbiBla3NwbG9yYXNpIGRhdGEgeWFuZyBzYXlhIG1pbGlraS4gTW9ob24gbWFhZiBqaWthIGFkYSB5YW5nIGt1cmFuZyBiZXJrZW5hbi4NCg0KU2VraXJhbnlhIGFkYSB5YW5nIGtlYmVyYXRhbiBkZW5nYW4gdHVsaXNhbiBzYXlhIGluaSwgc2lsYWhrYW4gamFwcmkuDQoNCiMgUHJlcGFyYXRpb24NCkxvYWQgcGFja2FnZSB5YW5nIGFrYW4gZGlndW5ha2FuLiBEYWxhbSBoYWwgaW5pIHBhY2thZ2UgeWFuZyBha2FuIGRpZ3VuYWthbiBhZGFsYWggYHRpYmJsZWAsIGBkcGx5cmAgYW5kIGBnZ3Bsb3QyYC4NCg0KYGBge3IgbG9hZHBrZ30NCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIERhdGENCg0KRGF0YSBkaXBlcm9sZWggZGFyaSBsYXBvcmFuIHVudHVrICJwZW5hZ2loYW4iIG9sZWggWW9nYSBQcmltYW5kYSBkaSBncnVwIFdoYXRzQXBwIHRhbmdnYWwgMjQgTWVpIDIwMTkuIEF3YWxueWEgZGF0YSBoYW55YSBkaXBlcm9sZWggYE5hbWVgIGRhbiBgU3BlbmRpbmdgIHVudHVrIG1hc2luZy1tYXNpbmcgb3JhbmcgeWFuZyBkYXRhbmcuIEtlbXVkaWFuIHNheWEgdGFtYmFoa2FuIHZhcmlhYmVsIGBQZXJjZW50YWdlYCAocGVyc2VudGFzZSBzcGVuZGluZyBtYXNpbmctbWFzaW5nIHRlcmhhZGFwIHRvdGFsIHNwZW5kaW5nKSwgYEdlbmRlcmAgZGFuIGBNYXJyaWVkYCAoc3RhdHVzIHBlcm5pa2FoYW4pLg0KDQpTYXlhIGd1bmFrYW4gZnVuZ3NpIGB0cmliYmxlKClgIGRhcmkgcGFja2FnZSBgdGliYmxlYCB1bnR1ayBtZW1idWF0IGRhdGEgZGVuZ2FuIG5hbWEgYGJ1a2JlcmAuDQoNCmBgYHtyIGdlbmVyYXRlZGF0YX0NCmJ1a2JlciA8LSB0cmliYmxlKH5OYW1lLCB+U3BlbmRpbmcsIH5QZXJjZW50YWdlLCB+R2VuZGVyLCB+TWFycmllZCwNCiAgICAgICAgIk1hcmNvIiwgMTIzMTIwLCAwLjA0MDQ5NDkzOCwgIk0iLCAiTiIsDQogICAgICAgICJBbmVzIiwgMTI1NDAwLCAwLjA0MTI0NDg0NCwgIkYiLCAiWSIsDQogICAgICAgICJBYnVkIiwgMTMxMTAwLCAwLjA0MzExOTYxLCAiTSIsICJOIiwNCiAgICAgICAgIk1pa28iLCAxMzY4MDAsIDAuMDQ0OTk0Mzc2LCAiTSIsICJZIiwNCiAgICAgICAgIk9waWsiLCAxMzY4MDAsCTAuMDQ0OTk0Mzc2LCAiTSIsICJZIiwNCiAgICAgICAgIllvZ2EiLCAxNDgyMDAsIDAuMDQ4NzQzOTA3LCAiTSIsICJOIiwNCiAgICAgICAgIkx1c2kiLCAxNDgyMDAsIDAuMDQ4NzQzOTA3LCAiRiIsICJOIiwNCiAgICAgICAgIkFpcyIsIDE0ODIwMCwgMC4wNDg3NDM5MDcsICJGIiwgIk4iLA0KICAgICAgICAiTWVtZXkiLCAxNTM5MDAsIDAuMDUwNjE4NjczLCAiRiIsICJOIiwNCiAgICAgICAgIlJSUEQiLCAxNTM5MDAsIDAuMDUwNjE4NjczLCAiTSIsICJOIiwNCiAgICAgICAgIk1hcnR1YSIsIDE1NzMyMCwgMC4wNTE3NDM1MzIsICdNJywgIk4iLA0KICAgICAgICAiQWR3IiwgMTgyNDAwLCAwLjA1OTk5MjUwMSwgIkYiLCAiTiIsDQogICAgICAgICJSaXpraSBSIiwgMTg4MTAwLCAwLjA2MTg2NzI2NywgIk0iLCAiTiIsDQogICAgICAgICJJbWFtIiwgMTg4MTAwLCAwLjA2MTg2NzI2NywgIk0iLCAiWSIsDQogICAgICAgICJLYXJpbiIsIDE5OTUwMCwgMC4wNjU2MTY3OTgsICJGIiwgIk4iLA0KICAgICAgICAiUm9zc2kiLCAyMjIzMDAsIDAuMDczMTE1ODYxLCAiRiIsICJZIiwNCiAgICAgICAgIkF6eWwiLCAyMzcxMjAsIDAuMDc3OTkwMjUxLCAiRiIsICJZIiwNCiAgICAgICAgIkRldmkiLCAyNTk5MjAsIDAuMDg1NDg5MzE0LCAiRiIsICJZIikNCmBgYA0KDQpVbnR1ayBrZWJ1dHVoYW4gdmlzdWFsaXNhc2kgc2F5YSBidWF0IHNlYnVhaCB2YXJpYWJlbCBiYXJ1IGRlbmdhbiBuYW1hIGBDdXJyZW5jeWAgKFNwZW5kaW5nIGRhbGFtIGZvcm1hdCBtYXRhIHVhbmcgUnVwaWFoKSBrZSBkYWxhbSBkYXRhIGZyYW1lIHlhbmcgYmFydSBiZXJuYW1hIGBidWtiZXJfdGJsYC4NCg0KYGBge3IgY3VycmVuY3l9DQpidWtiZXJfdGJsIDwtIGJ1a2JlciAlPiUgDQogIG11dGF0ZShDdXJyZW5jeSA9IHBhc3RlKHN1YnN0cihidWtiZXIkU3BlbmRpbmcsIDEsIDMpLCBzdWJzdHIoYnVrYmVyJFNwZW5kaW5nLCA0LCA2KSwgc2VwID0gIiwiKSkNCmBgYA0KDQojIEF2ZXJhZ2UgU3BlbmRpbmcgQW1vdW50IGJ5IEdlbmRlcg0KDQoNCmBgYHtyIGdlbmRlcmRhdGF9DQpidWtiZXJfZ2VuZGVyIDwtIGJ1a2Jlcl90YmwgJT4lIA0KICBncm91cF9ieShHZW5kZXIpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKFNwZW5kaW5nKSwNCiAgICAgICAgICAgIG4gPSBuKCkpICU+JSANCiAgbXV0YXRlKHBjdF9zcGVuZGluZyA9IHRvdGFsL24sDQogICAgICAgICBHZW5kZXIgPSBpZl9lbHNlKEdlbmRlciA9PSAiTSIsICJNYWxlIiwgIkZlbWFsZSIpKQ0KYnVrYmVyX2dlbmRlcg0KYGBgDQoNCmBgYHtyIHBsb3RnZW5kZXJ9DQpidWtiZXJfZ2VuZGVyICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IEdlbmRlciwgeSA9IHBjdF9zcGVuZGluZywgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMCgiUnAgIiwgc3Vic3RyKGJ1a2Jlcl9nZW5kZXIkcGN0X3NwZW5kaW5nLCAxLCAzKSwgIiwiLCBzdWJzdHIoYnVrYmVyX2dlbmRlciRwY3Rfc3BlbmRpbmcsIDQsIDYpKSksIHZqdXN0ID0gLTAuMjUpICsNCiAgbGFicyh0aXRsZSA9ICJTcGVuZGluZyBvZiBCdWthIEJlcnNhbWEgU1RLNDYgMjAxOSIsDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiQXZnIFNwZW5kaW5nIEFtb3VudCBieSBHZW5kZXIiKSwNCiAgICAgICBjYXB0aW9uID0gIkF2ZyBTcGVuZGluZyA9IFRvdGFsIFNwZW5kaW5nIEdyb3VwLyMgTWVtYmVyIG9mIEdyb3VwIChScCkiLA0KICAgICAgIHkgPSAiQXZnIFNwZW5kaW5nIChScCkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB5bGltKDAsIDIwMDAwMCkNCg0KYGBgDQoNCkRhcmkgcGxvdCBkaSBhdGFzIGRpcGVyb2xlaCBpbmZvcm1hc2kgYmFod2EgcmF0YS1yYXRhIHVhbmcgeWFuZyBkaWhhYmlza2FuIG9sZWggUGVyZW1wdWFuIHlhbmcgZGF0YW5nIHBhZGEgYWNhcmEgQnVrYSBCZXJzYW1hIFNUSzQ2IDIwMTkgbGViaWggdGluZ2dpIGRhcmlwYWRhIGtlbG9tcG9rIGxha2ktbGFraS4gDQoNCiMgSHlwb3RoZXNpcyBUZXN0aW5nIEJ5IEdlbmRlcg0KDQpLaXRhIGFrYW4gbGFrdWthbiB1amkgaGlwb3Rlc2lzIGRlbmdhbiBtZW5nZ3VuYWthbiBoaXBvdGVzaXMgDQoNCkgwOiBUaWRhayBhZGEgcGVyYmVkYWFuIHJhdGEtcmF0YSB1YW5nIHlhbmcgZGloYWJpc2thbiBhbnRhcmEga2Vsb21wb2sgcGVyZW1wdWFuIGRhbiBsYWtpLWxha2kuDQoNCkgxOiBLZWxvbXBvayBwZXJlbXB1YW4gcmF0YS1yYXRhIG1lbmdoYWJpc2thbiB1YW5nIGxlYmloIGJhbnlhayBkaWJhbmRpbmcga2Vsb21wb2sgbGFraS1sYWtpLg0KDQpgYGB7ciBtYWxlfQ0KbWFsZSA8LSBidWtiZXJfdGJsICU+JSANCiAgZmlsdGVyKEdlbmRlciA9PSAiTSIpICU+JSANCiAgc2VsZWN0KFNwZW5kaW5nKSAlPiUgDQogIGFzLnZlY3RvcigpDQptYWxlDQpgYGANCg0KYGBge3IgZmVtYWxlfQ0KZmVtYWxlIDwtIGJ1a2Jlcl90YmwgJT4lIA0KICBmaWx0ZXIoR2VuZGVyID09ICJGIikgJT4lIA0KICBzZWxlY3QoU3BlbmRpbmcpICU+JSANCiAgYXMudmVjdG9yKCkNCmZlbWFsZQ0KYGBgDQoNCmBgYHtyfQ0KdC50ZXN0KHggPSBmZW1hbGUkU3BlbmRpbmcsIHkgPSBtYWxlJFNwZW5kaW5nLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikNCmBgYA0KYGFsdGVybmF0aXZlID0gImdyZWF0ZXIiYCBhcnRpbnlhIGhpcG90ZXNpcyBhbHRlcm5hdGlmIGJhaHdhIHggbWVtaWxpa2kgbmlsYWkgcmF0YS1yYXRhIHlhbmcgbGViaWggYmVzYXIgZGFyaXBhZGEgeS4NCg0KRGVuZ2FuIHRpbmdrYXQga2VwZXJjYXlhYW4gKDEgLSAkXGFscGhhJCkgc2ViZXNhciA5NSUsIHJhdGEtcmF0YSB1YW5nIHlhbmcgZGloYWJpc2thbiBvbGVoIGtlbG9tcG9rIHBlcmVtcHVhbiBsZWJpaCBiZXNhciBkaWJhbmRpbmcga2Vsb21wb2sgbGFraS1sYWtpIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3Rpay4gSGFsIGluaSBkYXBhdCBkaWxpaGF0IGRhcmkgbmlsYWkgYHAtdmFsdWVgIHlhbmcga3VyYW5nIGRhcmkgJFxhbHBoYSQgKGBwLXZhbHVlYCA8IDAuMDUpLg0KDQojIEF2ZXJhZ2UgU3BlbmRpbmcgQW1vdW50IGJ5IE1hcml0YWwNCg0KYGBge3IgbWFycmllZGRhdGF9DQpidWtiZXJfbWFycmllZCA8LSBidWtiZXJfdGJsICU+JSANCiAgZ3JvdXBfYnkoTWFycmllZCkgJT4lIA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0oU3BlbmRpbmcpLA0KICAgICAgICAgICAgbiA9IG4oKSkgJT4lIA0KICBtdXRhdGUocGN0X3NwZW5kaW5nID0gdG90YWwvbiwNCiAgICAgICAgIE1hcnJpZWQgPSBpZl9lbHNlKE1hcnJpZWQgPT0gIlkiLCAiWWVzIiwgIk5vIikpIA0KYGBgDQpgYGB7ciBwbG90bWFycmllZH0NCmJ1a2Jlcl9tYXJyaWVkICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IE1hcnJpZWQsIHkgPSBwY3Rfc3BlbmRpbmcsIGZpbGwgPSBNYXJyaWVkKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKCJScCAiLCBzdWJzdHIoYnVrYmVyX21hcnJpZWQkcGN0X3NwZW5kaW5nLCAxLCAzKSwgIiwiLCBzdWJzdHIoYnVrYmVyX21hcnJpZWQkcGN0X3NwZW5kaW5nLCA0LCA2KSkpLCB2anVzdCA9IC0wLjI1KSArDQogIGxhYnModGl0bGUgPSAiU3BlbmRpbmcgb2YgQnVrYSBCZXJzYW1hIFNUSzQ2IDIwMTkiLA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIkF2ZyBTcGVuZGluZyBBbW91bnQgYnkgTWFycmllZCBTdGF0dXMiKSwNCiAgICAgICBjYXB0aW9uID0gIkF2ZyBTcGVuZGluZyA9IFRvdGFsIFNwZW5kaW5nIEdyb3VwLyMgTWVtYmVyIG9mIEdyb3VwIChScCkiLA0KICAgICAgIHggPSAiTWFycmllZCBTdGF0dXMiLA0KICAgICAgIHkgPSAiQXZnIFNwZW5kaW5nIChScCkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB5bGltKDAsIDIwMDAwMCkNCmBgYA0KDQpNZWxpaGF0IHBsb3QgZGkgYXRhcyBzYXlhIGN1a3VwIGthZ2V0LiBBd2FsbnlhIHNheWEgcGlraXIgb3Jhbmctb3JhbmcgeWFuZyBiZWx1bSBtZW5pa2FoIGFrYW4gY2VuZGVydW5nIG1lbmdoYWJpc2thbiBsZWJpaCBiYW55YWsgdWFuZy4gTmFtdW4gdGVybnlhdGEgcmF0YS1yYXRhIHVhbmcgeWFuZyBkaWhhYmlza2FuIG9sZWggb3Jhbmctb3JhbmcgeWFuZyBzdWRhaCBtZW5pa2FoIGxlYmloIHRpbmdnaSBkaWJhbmRpbmcgeWFuZyBiZWx1bSBtZW5pa2FoLg0KDQojIEh5cG90aGVzaXMgVGVzdGluZyBCeSBNYXJpdGFsDQoNCktpdGEgYWthbiBsYWt1a2FuIHVqaSBoaXBvdGVzaXMgZGVuZ2FuIG1lbmdndW5ha2FuIGhpcG90ZXNpcyANCg0KSDA6IFRpZGFrIGFkYSBwZXJiZWRhYW4gcmF0YS1yYXRhIHVhbmcgeWFuZyBkaWhhYmlza2FuIGFudGFyYSBrZWxvbXBvayB5YW5nIHN1ZGFoIG1lbmlrYWggZGFuIHlhbmcgYmVsdW0gbWVuaWthaC4NCg0KSDE6IEtlbG9tcG9rIHlhbmcgc3VkYWggbWVuaWthaCByYXRhLXJhdGEgbWVuZ2hhYmlza2FuIHVhbmcgbGViaWggYmFueWFrIGRpYmFuZGluZyBrZWxvbXBvayB5YW5nIGJlbHVtIG1lbmlrYWguDQoNCmBgYHtyIG1hcnJpZWR9DQptYXJyaWVkIDwtIGJ1a2Jlcl90YmwgJT4lIA0KICBmaWx0ZXIoTWFycmllZCA9PSAiWSIpICU+JSANCiAgc2VsZWN0KFNwZW5kaW5nKSAlPiUgDQogIGFzLnZlY3RvcigpDQptYXJyaWVkDQpgYGANCg0KYGBge3IgdW5tYXJyaWVkfQ0KdW5tYXJyaWVkIDwtIGJ1a2Jlcl90YmwgJT4lIA0KICBmaWx0ZXIoTWFycmllZCA9PSAiTiIpICU+JSANCiAgc2VsZWN0KFNwZW5kaW5nKSAlPiUgDQogIGFzLnZlY3RvcigpDQp1bm1hcnJpZWQNCmBgYA0KDQpgYGB7cn0NCnQudGVzdCh4ID0gbWFycmllZCRTcGVuZGluZywgeSA9IHVubWFycmllZCRTcGVuZGluZywgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpDQpgYGANCmBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyImAgYXJ0aW55YSBoaXBvdGVzaXMgYWx0ZXJuYXRpZiBiYWh3YSB4IG1lbWlsaWtpIG5pbGFpIHJhdGEtcmF0YSB5YW5nIGxlYmloIGJlc2FyIGRhcmlwYWRhIHkuDQoNCkRlbmdhbiB0aW5na2F0IGtlcGVyY2F5YWFuIHlhbmcgc2FtYSBkZW5nYW4gdWppIGhpcG90ZXNpcyBrZWxvbXBvayBwZXJlbXB1YW4gZGFuIGxha2ktbGFraSB5YWl0dSBzZWJlc2FyIDk1JSwgcmF0YS1yYXRhIHVhbmcgeWFuZyBkaWhhYmlza2FuIG9sZWgga2Vsb21wb2sgeWFuZyBzdWRhaCBtZW5pa2FoIHRpZGFrIHNpZ25pZmlrYW4gbGViaWggYmVzYXIgZGliYW5kaW5nIGtlbG9tcG9rIHlhbmcgYmVsdW0gbWVuaWthaCBzZWNhcmEgc3RhdGlzdGlrLiBIYWwgaW5pIGRhcGF0IGRpbGloYXQgZGFyaSBuaWxhaSBgcC12YWx1ZWAgeWFuZyBsZWJpaCBiZXNhciBkYXJpICRcYWxwaGEkIChgcC12YWx1ZWAgPiAwLjA1KS4NCg0KIyBUb3AgU3BlbmRlcg0KDQpgYGB7ciBhbm5vdGF0ZX0NCmF2Z19zcGVuZGluZyA8LSBtZWFuKGJ1a2Jlcl90YmwkU3BlbmRpbmcpDQphdmdfc3BlbmRpbmcgPC0gcGFzdGUwKCJBdmcgU3BlbmRpbmc6IFJwICIsIHN1YnN0cihhdmdfc3BlbmRpbmcsIDEsIDMpLCAiLCIsIHN1YnN0cihhdmdfc3BlbmRpbmcsIDQsIDYpKQ0KYXZnX3NwZW5kaW5nDQoNCnRvdGFsX3NwZW5kaW5nIDwtIHN1bShidWtiZXJfdGJsJFNwZW5kaW5nKQ0KdG90YWxfc3BlbmRpbmcgPC0gcGFzdGUwKCJUb3RhbCBTcGVuZGluZzogUnAgIiwgc3Vic3RyKHRvdGFsX3NwZW5kaW5nLCAxLCAxKSwgIiwiLCBzdWJzdHIodG90YWxfc3BlbmRpbmcsIDIsIDQpLCAiLCIsIHN1YnN0cih0b3RhbF9zcGVuZGluZywgNSwgNykpDQp0b3RhbF9zcGVuZGluZw0KYGBgDQoNClZlY3RvciBjaGFyYWN0ZXIgaW5pIGFrYW4gZGlndW5ha2FuIHVudHVrIGFub3Rhc2kgcGFkYSBncmFmaWsgZGkgYmF3YWggaW5pLg0KDQpgYGB7ciB0b3BzcGVuZGVyLCBmaWcuaGVpZ2h0PTZ9DQpidWtiZXJfdGJsICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IHJlb3JkZXIoTmFtZSwgUGVyY2VudGFnZSoxMDApLCB5ID0gUGVyY2VudGFnZSoxMDApKSArDQogIGdlb21fYmFyKGFlcyhmaWxsID0gUGVyY2VudGFnZSoxMDApLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKCJScCAiLCBDdXJyZW5jeSwgIiAoIiwgcm91bmQoUGVyY2VudGFnZSoxMDAsIDIpLCAiJSkiKSksIGhqdXN0ID0gLTAuMjUpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy5saW5lLnguYm90dG9tID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgbGFicyh0aXRsZSA9ICJTcGVuZGluZyBvZiBCdWthIEJlcnNhbWEgU1RLNDYgMjAxOSIsDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoYXZnX3NwZW5kaW5nLCAiIGFuZCAiLCB0b3RhbF9zcGVuZGluZyksDQogICAgICAgeCA9ICIiLA0KICAgICAgIHkgPSAiU3BlbmRpbmcgQW1vdW50IChpbiAlKikiLA0KICAgICAgIGNhcHRpb24gPSAiKlBlcmNlbnRhZ2UgZnJvbSBUb3RhbCBTcGVuZGluZyIpICsNCiAgeWxpbSgwLCAxMikNCmBgYA0KDQpEaWxpaGF0IGRhcmkgZ3JhZmlrIGRpIGF0YXMsIDMgKHRpZ2EpIG9yYW5nIHRvcCBzcGVuZGVyIGFkYWxhaCBwZXJlbXB1YW4geWFuZyBzdWRhaCBtZW5pa2FoLiBIYWwgaW5pIGN1a3VwIG1lbmplbGFza2FuIGR1YSBncmFmaWsgc2ViZWx1bW55YS4gRGFyaSAzIG9yYW5nIHRvcCBzcGVuZGVyLCB0b3RhbCBzcGVuZGluZyBtZXJla2EgYWRhbGFoIFJwIDcxOSwzNDAgYXRhdSBzZWtpdGFyIDIzLDclIGRhcmkgdG90YWwgc3BlbmRpbmcgc2VtdWEgb3JhbmcgeWFuZyBoYWRpciBwYWRhIGFjYXJhIHRlcnNlYnV0Lg0KDQojIENvbmNsdXNpb24NCg0KUGFkYSBrZWxvbXBvayBhbnRhcmEgcGVyZW1wdWFuIGRhbiBsYWtpLWxha2kgdGVyZGFwYXQgcGVyYmVkYWFuIHJhdGEtcmF0YSB1YW5nIHlhbmcgZGloYWJpc2thbiBzZWNhcmEgc2lnbmlmaWthbiBkZW5nYW4gdGluZ2thdCBrZXBlcmNheWFhbiBkYXJpIHVqaSBoaXBvdGVzaXMgc2ViZXNhciA5NSUuIE5hbXVuIHBhZGEga2Vsb21wb2sgeWFuZyBzdWRhaCBtZW5pa2FoIGRhbiB5YW5nIGJlbHVtIG1lbmlrYWgsIHdhbGF1cHVuIHJhdGEtcmF0YSB1YW5nIHlhbmcgZGloYWJpc2thbiBwYWRhIGtlZHVhIGtlbG9tcG9rIHRlcnNlYnV0IGJlcmJlZGEsIG5hbXVuIHRlcm55YXRhIHRpZGFrIGJlcmJlZGEgc2VjYXJhIHNpZ25pZmlrYW4gbWVsYWx1aSB1amkgaGlwb3Rlc2lzLiBKaWthIGRpbGloYXQgc2VjYXJhIGluZGl2aWR1LCAzIG9yYW5nIHRvcCBzcGVuZGVyIG1lbWFuZyBwZXJlbXB1YW4geWFuZyBzdWRhaCBtZW5pa2FoIGRlbmdhbiB0b3RhbCB1YW5nIHlhbmcgZGloYWJpc2thbiBvbGVoIG1lcmVrYSBhZGFsYWggUnAgNzE5LDM0MCBhdGF1IHNla2l0YXIgMjMsNyUgZGFyaSB0b3RhbCBzcGVuZGluZy4gTWFzaW5nLW1hc2luZyBtZW5naGFiaXNrYW4gdWFuZyBsZWJpaCBiZXNhciBkYXJpIFJwIDIwMCwwMDAuDQo=