Pendahuluan

Dalam industri ritel makanan dan minuman, khususnya pada jaringan kedai kopi (coffee chain), strategi penjualan yang efektif menjadi kunci utama dalam mempertahankan daya saing dan meningkatkan profitabilitas. Persaingan yang ketat antar pelaku industri menuntut perusahaan untuk mampu memahami faktor-faktor yang memengaruhi kinerja penjualan mereka secara lebih mendalam. Salah satu pendekatan yang dapat digunakan adalah dengan mengevaluasi kinerja berdasarkan segmentasi pasar dan lokasi operasional.

Ukuran pasar (market size) dan kinerja regional merupakan dua dimensi penting yang dapat memberikan wawasan strategis terkait potensi pendapatan dan efisiensi operasional. Ukuran pasar mencerminkan potensi konsumen yang dapat dijangkau oleh sebuah kedai, sedangkan kinerja regional menggambarkan variasi performa penjualan di berbagai wilayah. Dengan menggabungkan kedua dimensi ini dalam suatu analisis yang terstruktur, perusahaan dapat mengidentifikasi strategi terbaik untuk mengoptimalkan profit.

Penelitian ini bertujuan untuk menganalisis pengaruh ukuran pasar dan kinerja regional terhadap profit menggunakan dataset Coffee Chain, yang mencerminkan data operasional dan penjualan dari sebuah jaringan kedai kopi fiktif. Melalui pendekatan analisis statistik dan visualisasi data, studi ini diharapkan dapat memberikan rekomendasi strategis bagi manajemen dalam pengambilan keputusan berbasis data (data-driven decision making).

Deskripsi Data

Dataset Coffee Chain merupakan data penjualan dari sebuah jaringan kedai kopi yang berisi informasi terkait aktivitas operasional, keuangan, dan pemasaran di berbagai lokasi cabang. Dataset ini awalnya terdiri dari banyak variabel, namun untuk keperluan analisis ini, hanya beberapa variabel yang dipilih karena dianggap paling relevan terhadap tujuan studi, yaitu mengevaluasi pengaruh ukuran pasar dan kinerja regional terhadap profit.

Adapun variabel yang dipilih dan digunakan dalam analisis ini adalah sebagai berikut:

  • MarketSize: Ukuran pasar tempat cabang beroperasi, dikategorikan ke dalam kelas seperti Major Market, yang menggambarkan potensi pasar di lokasi tersebut.

  • State: Negara bagian lokasi operasional kedai, digunakan untuk melihat perbedaan kinerja berdasarkan wilayah geografis.

  • Profit: Keuntungan bersih yang diperoleh, menjadi variabel utama (variabel dependen) dalam studi ini.

  • Date: Tanggal transaksi atau pencatatan, memungkinkan analisis tren waktu.

Dengan fokus pada variabel-variabel ini, analisis bertujuan untuk menggali faktor-faktor yang memengaruhi profitabilitas cabang dan memberikan rekomendasi strategis berbasis data.

#Imort Data dari Excel
data_excel <- read_excel("E:/SEMESTER 4/SIM/Case Method/3. CM1 - Coffee Chain Datasets.xlsx", sheet = "data")

# Buat data frame dari beberapa kolom yang dipilih
data_coffee <- data.frame(
  MarketSize = data_excel$`Market Size`,
  State = data_excel$State,
  Profit = data_excel$Profit,
  Date = data_excel$Date
)

# Menampilkan hasil sebagai tabel
datatable(data_coffee, 
          options = list(scrollX = TRUE), 
          rownames = FALSE)

Statistika Deskriptif

Statistika deskriptif merupakan metode dalam statistika yang digunakan untuk menyajikan, menganalisis, dan meringkas sekumpulan data sehingga lebih mudah dipahami. Tujuannya adalah untuk memberikan gambaran umum tentang karakteristik data tanpa melakukan generalisasi terhadap populasi yang lebih luas. Analisis ini mencakup ukuran pemusatan (seperti rata-rata dan median), ukuran penyebaran (seperti kuartil dan rentang), serta identifikasi nilai ekstrem (outlier). Penyajian dapat dilakukan melalui ringkasan numerik maupun visualisasi seperti grafik dan tabel.

# Statistika Deskritif untuk semua variabel
summary(data_coffee)
##   MarketSize           State               Profit      
##  Length:4248        Length:4248        Min.   :-638.0  
##  Class :character   Class :character   1st Qu.:  17.0  
##  Mode  :character   Mode  :character   Median :  40.0  
##                                        Mean   :  61.1  
##                                        3rd Qu.:  92.0  
##                                        Max.   : 778.0  
##       Date                    
##  Min.   :2012-01-01 00:00:00  
##  1st Qu.:2012-06-23 12:00:00  
##  Median :2012-12-16 12:00:00  
##  Mean   :2012-12-15 22:00:00  
##  3rd Qu.:2013-06-08 12:00:00  
##  Max.   :2013-12-01 00:00:00

Pada dataset Coffee Chain, dilakukan analisis deskriptif terhadap beberapa variabel terpilih, yaitu MarketSize, State, Profit, dan Date. Berdasarkan hasil ringkasan data, variabel MarketSize dan State merupakan tipe data kategorik dengan jumlah observasi sebanyak 4.248. Kedua variabel ini menggambarkan klasifikasi ukuran pasar dan lokasi geografis dari masing-masing cabang coffee shop yang diamati. Karena bertipe karakter, interpretasi deskriptif untuk variabel ini akan lebih tepat jika dilakukan melalui tabulasi frekuensi atau visualisasi kategori.

Variabel Profit merupakan salah satu fokus utama karena menjadi indikator langsung dari keberhasilan finansial setiap cabang. Rata-rata profit sebesar 61,1 dengan median sebesar 40 menunjukkan bahwa sebagian besar cabang memiliki profit di bawah rata-rata, yang mengindikasikan distribusi data yang cenderung miring ke kanan. Nilai minimum profit sebesar -638 menunjukkan adanya cabang yang mengalami kerugian cukup besar, sedangkan nilai maksimum mencapai 778, yang menunjukkan adanya cabang yang sangat menguntungkan. Rentang nilai profit yang cukup lebar ini mencerminkan adanya variasi kinerja yang tinggi antar cabang.

Variabel Date menunjukkan bahwa data dikumpulkan dalam rentang waktu antara 1 Januari 2012 hingga 1 Desember 2013. Nilai median berada pada 16 Desember 2012, yang menandakan bahwa data tersebar cukup merata dalam kurun waktu dua tahun pengamatan. Keberadaan variabel waktu ini juga membuka peluang untuk analisis tren terhadap perubahan profit dari waktu ke waktu.

Melalui statistik deskriptif ini, dapat diperoleh pemahaman awal yang penting terkait struktur dan karakteristik data yang digunakan dalam penelitian. Hasil ini juga menjadi dasar untuk melanjutkan ke tahap analisis lanjutan seperti analisis hubungan antar variabel atau pemodelan prediktif.

data_coffee %>%
  mutate(Month = floor_date(Date, "month")) %>%
  group_by(Month) %>%
  summarise(monthly_profit = sum(Profit, na.rm = TRUE)) %>%
  ggplot(aes(x = Month, y = monthly_profit)) +
  geom_line(color = "#00C2C7", size = 1) +
  geom_point(color = "#F76C6C") +
  labs(
    title = "Tren Waktu Profit Bulanan",
    x = "Bulan",
    y = "Total Profit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5)
  )
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Kinerja Market Size

Uji Normalitas

Untuk menguji apakah distribusi profit pada masing-masing kategori Market Size berdistribusi normal, dilakukan uji normalitas menggunakan Shapiro-Wilk test. Hasil uji menunjukkan nilai p-value sebesar 5.10e-33 untuk kategori Major Market, dan 3.78e-56 untuk kategori Small Market.

# Pastikan Market.Size adalah factor
data_coffee$Market.Size <- as.factor(data_coffee$`MarketSize`)

# Uji normalitas per grup Market Size
data_coffee %>%
  group_by(Market.Size) %>%
  shapiro_test(Profit)
## # A tibble: 2 × 4
##   Market.Size  variable statistic        p
##   <fct>        <chr>        <dbl>    <dbl>
## 1 Major Market Profit       0.892 5.10e-33
## 2 Small Market Profit       0.687 3.78e-56

Karena kedua nilai p-value jauh lebih kecil dari taraf signifikansi 0,05, maka dapat disimpulkan bahwa data profit pada kedua kategori market size tidak berdistribusi normal. Hal ini mengindikasikan bahwa asumsi normalitas tidak terpenuhi.

Dengan demikian, analisis perbandingan profit antara kelompok market size tidak dapat menggunakan uji parametrik seperti ANOVA, dan harus dilanjutkan dengan uji non-parametrik, seperti uji Kruskal-Wallis.

Uji Kruskal-Wallis

Setelah diketahui bahwa data profit tidak berdistribusi normal pada masing-masing kategori Market Size, maka dilakukan uji Kruskal-Wallis, yaitu uji non-parametrik yang digunakan untuk mengetahui apakah terdapat perbedaan signifikan antara dua atau lebih kelompok independen. Untuk Kriteria uji menurut Steel dan Torrie (1993) adalah: \[H=\frac{12}{n(n+1)}\sum_{i=1}\frac{R_i^2}{n_i}-3(n+1)\] dimana : \(n_1\) = banyaknya pengamatan ke-\(i\) \(i\) = \(1,...,k\); \(n\) = \(\sum n_i\); \(R_i\) = jumlah pangkat ke-\(i\)

# Uji Kruskal-Wallis 
kruskal.test(Profit ~ Market.Size, data = data_coffee)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  Profit by Market.Size
## Kruskal-Wallis chi-squared = 424.94, df = 1, p-value < 2.2e-16

Hasil uji menunjukkan nilai statistik Kruskal-Wallis sebesar 424.94 dengan derajat kebebasan (df) = 1, dan nilai p-value < 2.2e-16. Karena nilai p jauh lebih kecil dari taraf signifikansi 0,05, maka dapat disimpulkan bahwa terdapat perbedaan profit yang signifikan antara kelompok Market Size.

Dengan demikian, ukuran pasar (Market Size) memiliki pengaruh yang signifikan terhadap profit yang diperoleh, dan hal ini dapat menjadi dasar pertimbangan strategis dalam evaluasi kinerja penjualan berdasarkan klasifikasi pasar.

Visualisasi

# visualisasi 1
ggplot(data_coffee, aes(x = Market.Size, y = Profit, fill = Market.Size)) +
  geom_boxplot(alpha = 0.7) +
  theme_minimal() +
  labs(title = "Distribusi Profit Berdasarkan Ukuran Pasar") +
  theme(
    plot.title = element_text(hjust = 0.5)
  )

Berdasarkan boxplot distribusi profit terhadap ukuran pasar (Market Size), terlihat bahwa kelompok Major Market cenderung memiliki profit yang lebih tinggi dibandingkan kelompok Small Market. Median profit Major Market secara visual lebih besar, serta memiliki sebaran data (interkuartil) yang lebih lebar. Selain itu, Major Market juga menunjukkan adanya nilai profit ekstrem (outlier) yang lebih tinggi dibandingkan Small Market.

Sebaliknya, Small Market memiliki persebaran data yang lebih sempit dan median yang lebih rendah, menunjukkan performa profit yang cenderung lebih rendah secara keseluruhan. Visualisasi ini mendukung hasil uji Kruskal-Wallis sebelumnya, yang menyatakan terdapat perbedaan profit yang signifikan berdasarkan ukuran pasar.

data_coffee %>%
  group_by(Market.Size) %>%
  summarise(mean_profit = mean(Profit)) %>%
  ggplot(aes(x = Market.Size, y = mean_profit, fill = Market.Size)) +
  geom_col() +
  theme_minimal() +
  labs(title = "Rata-rata Profit Berdasarkan Ukuran Pasar",
       y = "Mean Profit") +
  theme(
    plot.title = element_text(hjust = 0.5)
  )

Berdasarkan diagram batang, terlihat bahwa rata-rata profit pada Major Market jauh lebih tinggi dibandingkan dengan Small Market. Hal ini mendukung hasil analisis sebelumnya, baik dari uji statistik Kruskal-Wallis maupun visualisasi boxplot, yang menunjukkan bahwa ukuran pasar memiliki pengaruh terhadap profit. Perbedaan rata-rata yang mencolok ini menegaskan bahwa bisnis yang beroperasi di pasar besar (Major Market) cenderung menghasilkan profit lebih besar daripada yang berada di pasar kecil (Small Market).

Kinerja Berdasarkan Region

Uji Normalitas

Untuk menguji apakah distribusi Profit pada masing-masing negara bagian dalam data berdistribusi normal, dilakukan uji normalitas menggunakan Shapiro-Wilk test. Namun, sebelum itu variabel State pada data_coffee diubah dulu menjadi tipe data faktor.

data_coffee$State <- as.factor(data_coffee$State)
table(data_coffee$State)  # Harus >= 5 per grup
## 
##    California      Colorado   Connecticut       Florida      Illinois 
##           288           264           168           216           216 
##          Iowa     Louisiana Massachusetts      Missouri        Nevada 
##           216           168           144           216           264 
## New Hampshire    New Mexico      New York          Ohio      Oklahoma 
##           168           168           192           216           168 
##        Oregon         Texas          Utah    Washington     Wisconsin 
##           264           168           288           240           216
#uji normalitas setiap grup
library(dplyr)
normality_check <- data_coffee %>%
  group_by(State) %>%
  summarise(p_value = ifelse(n() >= 3, shapiro.test(Profit)$p.value, NA))

print(normality_check)
## # A tibble: 20 × 2
##    State          p_value
##    <fct>            <dbl>
##  1 California    5.97e- 4
##  2 Colorado      1.62e- 7
##  3 Connecticut   1.14e-11
##  4 Florida       7.05e- 9
##  5 Illinois      2.36e- 6
##  6 Iowa          1.28e-14
##  7 Louisiana     4.45e- 4
##  8 Massachusetts 5.08e-17
##  9 Missouri      2.00e- 4
## 10 Nevada        3.90e-18
## 11 New Hampshire 8.25e- 7
## 12 New Mexico    1.14e- 3
## 13 New York      1.43e- 6
## 14 Ohio          1.26e-10
## 15 Oklahoma      1.84e-12
## 16 Oregon        2.55e-12
## 17 Texas         2.17e-11
## 18 Utah          1.03e- 5
## 19 Washington    7.63e-11
## 20 Wisconsin     1.09e- 2

Uji normalitas dilakukan hanya untuk kelompok dengan jumlah data minimal 3. Hasil menunjukkan bahwa semua negara bagian memiliki nilai p-value yang sangat kecil (seluruhnya < 0.05), yang berarti data profit pada tiap negara bagian tidak berdistribusi normal. Maka, dapat disimpulkan bahwa asumsi normalitas tidak terpenuhi pada seluruh kelompok negara bagian, sehingga analisis selanjutnya dapat dilakuan uji Kruskal-Wallis.

Uji Kruskall-wallis

Setelah diketahui bahwa data profit tidak berdistribusi normal pada masing-masing kategori State, maka dilakukan uji Kruskal-Wallis, yaitu uji non-parametrik yang digunakan untuk mengetahui apakah terdapat perbedaan signifikan antara dua atau lebih kelompok independen. Untuk Kriteria uji menurut Steel dan Torrie (1993) adalah: \[H=\frac{12}{n(n+1)}\sum_{i=1}\frac{R_i^2}{n_i}-3(n+1)\] dimana : \(n_1\) = banyaknya pengamatan ke-\(i\) \(i\) = \(1,...,k\); \(n\) = \(\sum n_i\); \(R_i\) = jumlah pangkat ke-\(i\)

# UJI KRUSKAL-WALLIS
kruskal.test(Profit ~ State, data = data_coffee)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  Profit by State
## Kruskal-Wallis chi-squared = 950.82, df = 19, p-value < 2.2e-16

Hasil uji menunjukkan nilai statistik Kruskal-Wallis sebesar 950.82 dengan derajat kebebasan (df) = 19, dan nilai p-value < 2.2e-16. Karena nilai p jauh lebih kecil dari taraf signifikansi 0,05, maka dapat disimpulkan bahwa terdapat perbedaan profit yang signifikan antara kelompok State.

Dengan demikian, lokasi geografis (State) memiliki pengaruh yang signifikan terhadap profit yang diperoleh, dan hal ini dapat menjadi dasar pertimbangan strategis dalam analisis wilayah penjualan dan perencanaan bisnis berdasarkan negara bagian.

Uji Bonferoni

Setelah diketahui bahwa terdapat perbedaan profit yang signifikan antara kelompok State berdasarkan uji Kruskal-Wallis, maka dilakukan uji lanjutan (post-hoc) Dunn dengan koreksi Bonferroni untuk mengetahui pasangan negara bagian mana saja yang memiliki perbedaan signifikan.

# Melakukan uji Dunn
hasil_dunn <- dunnTest(Profit ~ State, data = data_coffee, method = "bonferroni")

# Mengambil hasil dalam bentuk data frame
dunn_df <- hasil_dunn$res

# Menampilkan hasil sebagai tabel
datatable(dunn_df, 
          options = list(scrollX = TRUE), 
          rownames = FALSE)

Hasil uji menunjukkan bahwa beberapa pasangan State memiliki nilai p yang lebih kecil dari taraf signifikansi 0,05 setelah dilakukan penyesuaian dengan metode Bonferroni. Misal pasangan :

  • California – Connecticut (p.adj = 7.71e-10)

  • California – Illinois (p.adj = 2.79e-06)

  • California – Iowa (p.adj = 4.40e-03)

  • California – Louisiana (p.adj = 6.10e-07)

  • Colorado – Illinois (p.adj = 5.16e-18)

  • Connecticut – Illinois (p.adj = 2.44e-28)

  • Florida – Illinois (p.adj = 3.85e-18)

Pasangan-pasangan tersebut menunjukkan perbedaan profit yang signifikan secara statistik. Di sisi lain, beberapa pasangan seperti Colorado – Florida (p.adj = 1.000), Connecticut – Iowa (p.adj = 0.852), dan Connecticut – Florida (p.adj = 0.859) tidak menunjukkan perbedaan yang signifikan. Dengan demikian, dapat disimpulkan bahwa perbedaan profit antar negara bagian tidak merata, dan terdapat negara bagian tertentu (misalnya Illinois dan California) yang secara konsisten berbeda secara signifikan dibandingkan negara bagian lainnya.

Visualisasi

# Hitung median profit per negara bagian
median_profit <- data_coffee %>%
  group_by(State) %>%
  summarise(median_profit = median(Profit, na.rm = TRUE)) %>%
  arrange(desc(median_profit))

# Buat grafik batang (bar chart)
ggplot(median_profit, aes(x = reorder(State, median_profit), y = median_profit, fill = median_profit)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  scale_fill_gradient(low = "#F76C6C", high = "#00C2C7") +
  labs(
    title = "Median Profit per Negara Bagian",
    x = "State",
    y = "Median Profit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5)
  )

Visualisasi di atas menunjukkan perbandingan median profit untuk masing-masing negara bagian. Terlihat bahwa Illinois dan New York memiliki median profit tertinggi, diikuti oleh California dan Texas. Sementara itu, negara bagian seperti New Mexico, New Hampshire, dan Missouri berada di posisi terbawah dengan median profit yang jauh lebih rendah.

Pola yang tampak dalam grafik ini mendukung hasil uji statistik sebelumnya. Negara bagian dengan median profit yang tinggi seperti Illinois dan California terbukti memiliki perbedaan profit yang signifikan jika dibandingkan dengan sebagian besar negara bagian lain, sebagaimana terlihat dalam hasil uji Dunn dengan koreksi Bonferroni. Perbedaan visual antar kelompok semakin menegaskan bahwa profit tidak tersebar merata di seluruh wilayah, dan terdapat perbedaan mencolok antar kelompok geografis.

data_coffee %>%
  group_by(State) %>%
  summarise(total_profit = sum(Profit, na.rm = TRUE)) %>%
  arrange(desc(total_profit)) %>%
  ggplot(aes(x = reorder(State, total_profit), y = total_profit)) +
  geom_bar(stat = "identity", fill = "#00C2C7") +
  coord_flip() +
  labs(
    title = "Total Profit per Negara Bagian",
    x = "State",
    y = "Total Profit"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5)
  )

Visualisasi tersebut menunjukkan total profit yang diperoleh dari masing-masing negara bagian. California menempati posisi tertinggi dengan total profit terbesar, diikuti oleh Illinois dan Iowa. Negara-negara bagian seperti New York, Colorado, dan Massachusetts juga menyumbang profit yang cukup besar. Sementara itu, negara bagian seperti New Mexico, New Hampshire, dan Missouri memiliki total profit yang paling rendah.

Data ini melengkapi hasil analisis sebelumnya, khususnya setelah diketahui adanya perbedaan signifikan antar negara bagian berdasarkan uji Kruskal-Wallis dan uji post-hoc Dunn dengan koreksi Bonferroni. Meskipun median profit menunjukkan bahwa Illinois dan New York berada di urutan teratas dalam hal profit per transaksi, total profit yang lebih tinggi di California menunjukkan bahwa volume transaksi atau cakupan bisnis di negara bagian ini sangat besar, sehingga menghasilkan akumulasi keuntungan yang dominan secara keseluruhan.

Secara keseluruhan, median profit mencerminkan kualitas keuntungan per transaksi, sedangkan total profit mencerminkan kontribusi keseluruhan wilayah terhadap pendapatan perusahaan. Oleh karena itu, untuk pengambilan keputusan strategis, perusahaan perlu mempertimbangkan kedua aspek ini: negara bagian dengan median profit tinggi untuk menjaga margin keuntungan, dan negara bagian dengan total profit besar untuk mendorong volume dan pertumbuhan pasar.

Kesimpulan

Berdasarkan hasil analisis terhadap data Coffee Chain, diketahui bahwa profit cabang secara signifikan dipengaruhi oleh dua faktor utama, yaitu ukuran pasar (Market Size) dan lokasi geografis (State). Cabang yang beroperasi di pasar besar (Major Market) cenderung menghasilkan profit yang lebih tinggi dibandingkan yang berada di pasar kecil (Small Market). Selain itu, terdapat perbedaan profit yang signifikan antar negara bagian, dengan California, Illinois, dan New York menjadi wilayah dengan performa tertinggi, baik dari segi total maupun median profit.

Temuan ini menunjukkan bahwa faktor eksternal seperti potensi pasar dan lokasi operasional berperan penting dalam keberhasilan finansial suatu cabang. Oleh karena itu, beberapa langkah strategis dapat diambil. Pertama, perusahaan sebaiknya memprioritaskan ekspansi ke wilayah dengan karakteristik Major Market, karena potensi keuntungannya lebih besar. Kedua, cabang di pasar kecil perlu dievaluasi lebih lanjut untuk meningkatkan efisiensi operasional atau menyesuaikan strategi pemasaran. Ketiga, wilayah dengan profit rendah seperti New Mexico dan New Hampshire perlu ditinjau ulang keberlanjutannya, apakah masih layak dipertahankan atau perlu dilakukan restrukturisasi.

Selain itu, negara bagian dengan profit tinggi dapat dijadikan pusat penguatan strategi jangka panjang, misalnya melalui inovasi produk, promosi intensif, atau pengembangan program loyalitas pelanggan. Hasil studi ini juga menggarisbawahi pentingnya penggunaan data dalam pengambilan keputusan bisnis yang lebih akurat dan tepat sasaran. Dengan mempertimbangkan hasil analisis secara menyeluruh, Coffee Chain diharapkan dapat meningkatkan profitabilitas dan daya saingnya secara berkelanjutan.

LS0tDQp0aXRsZTogIkV2YWx1YXNpIFN0cmF0ZWdpcyBQZW5qdWFsYW46IEFuYWxpc2lzIFBlbmdhcnVoIEtpbmVyamEgVWt1cmFuIFBhc2FyIGRhbiBLaW5lcmphIFJlZ2lvbmFsIHRlcmhhZGFwIFByb2ZpdCBwYWRhIERhdGFzZXQgQ29mZmVlIENoYWluIg0KYXV0aG9yOiAiQWxmaSBBdHVyb2htYWggLSBNMDcyMzAwNSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogIG9wZW5pbnRybzo6bGFiX3JlcG9ydDoNCiAgICBoaWdobGlnaHQ6ICJ6ZW5idXJuIg0KICAgIHRoZW1lOiAiZmxhdGx5Ig0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KbGlicmFyeShodG1sdG9vbHMpDQpgYGANCg0KYGBge3IgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCmh0bWx0b29sczo6aW5jbHVkZUhUTUwoInN0eWxlLmh0bWwiKQ0KYGBgDQoNCg0KIyMgUGVuZGFodWx1YW4NCg0KRGFsYW0gaW5kdXN0cmkgcml0ZWwgbWFrYW5hbiBkYW4gbWludW1hbiwga2h1c3VzbnlhIHBhZGEgamFyaW5nYW4ga2VkYWkga29waSAoKmNvZmZlZSBjaGFpbiopLCBzdHJhdGVnaSBwZW5qdWFsYW4geWFuZyBlZmVrdGlmIG1lbmphZGkga3VuY2kgdXRhbWEgZGFsYW0gbWVtcGVydGFoYW5rYW4gZGF5YSBzYWluZyBkYW4gbWVuaW5na2F0a2FuIHByb2ZpdGFiaWxpdGFzLiBQZXJzYWluZ2FuIHlhbmcga2V0YXQgYW50YXIgcGVsYWt1IGluZHVzdHJpIG1lbnVudHV0IHBlcnVzYWhhYW4gdW50dWsgbWFtcHUgbWVtYWhhbWkgZmFrdG9yLWZha3RvciB5YW5nIG1lbWVuZ2FydWhpIGtpbmVyamEgcGVuanVhbGFuIG1lcmVrYSBzZWNhcmEgbGViaWggbWVuZGFsYW0uIFNhbGFoIHNhdHUgcGVuZGVrYXRhbiB5YW5nIGRhcGF0IGRpZ3VuYWthbiBhZGFsYWggZGVuZ2FuIG1lbmdldmFsdWFzaSBraW5lcmphIGJlcmRhc2Fya2FuIHNlZ21lbnRhc2kgcGFzYXIgZGFuIGxva2FzaSBvcGVyYXNpb25hbC4NCg0KVWt1cmFuIHBhc2FyICgqbWFya2V0IHNpemUqKSBkYW4ga2luZXJqYSByZWdpb25hbCBtZXJ1cGFrYW4gZHVhIGRpbWVuc2kgcGVudGluZyB5YW5nIGRhcGF0IG1lbWJlcmlrYW4gd2F3YXNhbiBzdHJhdGVnaXMgdGVya2FpdCBwb3RlbnNpIHBlbmRhcGF0YW4gZGFuIGVmaXNpZW5zaSBvcGVyYXNpb25hbC4gVWt1cmFuIHBhc2FyIG1lbmNlcm1pbmthbiBwb3RlbnNpIGtvbnN1bWVuIHlhbmcgZGFwYXQgZGlqYW5na2F1IG9sZWggc2VidWFoIGtlZGFpLCBzZWRhbmdrYW4ga2luZXJqYSByZWdpb25hbCBtZW5nZ2FtYmFya2FuIHZhcmlhc2kgcGVyZm9ybWEgcGVuanVhbGFuIGRpIGJlcmJhZ2FpIHdpbGF5YWguIERlbmdhbiBtZW5nZ2FidW5na2FuIGtlZHVhIGRpbWVuc2kgaW5pIGRhbGFtIHN1YXR1IGFuYWxpc2lzIHlhbmcgdGVyc3RydWt0dXIsIHBlcnVzYWhhYW4gZGFwYXQgbWVuZ2lkZW50aWZpa2FzaSBzdHJhdGVnaSB0ZXJiYWlrIHVudHVrIG1lbmdvcHRpbWFsa2FuIHByb2ZpdC4NCg0KUGVuZWxpdGlhbiBpbmkgYmVydHVqdWFuIHVudHVrIG1lbmdhbmFsaXNpcyBwZW5nYXJ1aCB1a3VyYW4gcGFzYXIgZGFuIGtpbmVyamEgcmVnaW9uYWwgdGVyaGFkYXAgcHJvZml0IG1lbmdndW5ha2FuIGRhdGFzZXQgKkNvZmZlZSBDaGFpbiosIHlhbmcgbWVuY2VybWlua2FuIGRhdGEgb3BlcmFzaW9uYWwgZGFuIHBlbmp1YWxhbiBkYXJpIHNlYnVhaCBqYXJpbmdhbiBrZWRhaSBrb3BpIGZpa3RpZi4gTWVsYWx1aSBwZW5kZWthdGFuIGFuYWxpc2lzIHN0YXRpc3RpayBkYW4gdmlzdWFsaXNhc2kgZGF0YSwgc3R1ZGkgaW5pIGRpaGFyYXBrYW4gZGFwYXQgbWVtYmVyaWthbiByZWtvbWVuZGFzaSBzdHJhdGVnaXMgYmFnaSBtYW5hamVtZW4gZGFsYW0gcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIGJlcmJhc2lzIGRhdGEgKCpkYXRhLWRyaXZlbiBkZWNpc2lvbiBtYWtpbmcqKS4NCg0KIyMgRGVza3JpcHNpIERhdGENCg0KRGF0YXNldCAqQ29mZmVlIENoYWluKiBtZXJ1cGFrYW4gZGF0YSBwZW5qdWFsYW4gZGFyaSBzZWJ1YWggamFyaW5nYW4ga2VkYWkga29waSB5YW5nIGJlcmlzaSBpbmZvcm1hc2kgdGVya2FpdCBha3Rpdml0YXMgb3BlcmFzaW9uYWwsIGtldWFuZ2FuLCBkYW4gcGVtYXNhcmFuIGRpIGJlcmJhZ2FpIGxva2FzaSBjYWJhbmcuIERhdGFzZXQgaW5pIGF3YWxueWEgdGVyZGlyaSBkYXJpIGJhbnlhayB2YXJpYWJlbCwgbmFtdW4gdW50dWsga2VwZXJsdWFuIGFuYWxpc2lzIGluaSwgaGFueWEgYmViZXJhcGEgdmFyaWFiZWwgeWFuZyBkaXBpbGloIGthcmVuYSBkaWFuZ2dhcCBwYWxpbmcgcmVsZXZhbiB0ZXJoYWRhcCB0dWp1YW4gc3R1ZGksIHlhaXR1IG1lbmdldmFsdWFzaSBwZW5nYXJ1aCB1a3VyYW4gcGFzYXIgZGFuIGtpbmVyamEgcmVnaW9uYWwgdGVyaGFkYXAgcHJvZml0Lg0KDQpBZGFwdW4gdmFyaWFiZWwgeWFuZyBkaXBpbGloIGRhbiBkaWd1bmFrYW4gZGFsYW0gYW5hbGlzaXMgaW5pIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNCi0gICAqKk1hcmtldFNpemUqKjogVWt1cmFuIHBhc2FyIHRlbXBhdCBjYWJhbmcgYmVyb3BlcmFzaSwgZGlrYXRlZ29yaWthbiBrZSBkYWxhbSBrZWxhcyBzZXBlcnRpICpNYWpvciBNYXJrZXQqLCB5YW5nIG1lbmdnYW1iYXJrYW4gcG90ZW5zaSBwYXNhciBkaSBsb2thc2kgdGVyc2VidXQuDQoNCi0gICAqKlN0YXRlKio6IE5lZ2FyYSBiYWdpYW4gbG9rYXNpIG9wZXJhc2lvbmFsIGtlZGFpLCBkaWd1bmFrYW4gdW50dWsgbWVsaWhhdCBwZXJiZWRhYW4ga2luZXJqYSBiZXJkYXNhcmthbiB3aWxheWFoIGdlb2dyYWZpcy4NCg0KLSAgICoqUHJvZml0Kio6IEtldW50dW5nYW4gYmVyc2loIHlhbmcgZGlwZXJvbGVoLCBtZW5qYWRpIHZhcmlhYmVsIHV0YW1hICh2YXJpYWJlbCBkZXBlbmRlbikgZGFsYW0gc3R1ZGkgaW5pLg0KDQotICAgKipEYXRlKio6IFRhbmdnYWwgdHJhbnNha3NpIGF0YXUgcGVuY2F0YXRhbiwgbWVtdW5na2lua2FuIGFuYWxpc2lzIHRyZW4gd2FrdHUuDQoNCkRlbmdhbiBmb2t1cyBwYWRhIHZhcmlhYmVsLXZhcmlhYmVsIGluaSwgYW5hbGlzaXMgYmVydHVqdWFuIHVudHVrIG1lbmdnYWxpIGZha3Rvci1mYWt0b3IgeWFuZyBtZW1lbmdhcnVoaSBwcm9maXRhYmlsaXRhcyBjYWJhbmcgZGFuIG1lbWJlcmlrYW4gcmVrb21lbmRhc2kgc3RyYXRlZ2lzIGJlcmJhc2lzIGRhdGEuDQoNCmBgYHtyIHBhY2thZ2UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkocnN0YXRpeCkNCmxpYnJhcnkoRlNBKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KERUKQ0KYGBgDQoNCmBgYHtyIGltcG9ydC1kYXRhfQ0KI0ltb3J0IERhdGEgZGFyaSBFeGNlbA0KZGF0YV9leGNlbCA8LSByZWFkX2V4Y2VsKCJFOi9TRU1FU1RFUiA0L1NJTS9DYXNlIE1ldGhvZC8zLiBDTTEgLSBDb2ZmZWUgQ2hhaW4gRGF0YXNldHMueGxzeCIsIHNoZWV0ID0gImRhdGEiKQ0KDQojIEJ1YXQgZGF0YSBmcmFtZSBkYXJpIGJlYmVyYXBhIGtvbG9tIHlhbmcgZGlwaWxpaA0KZGF0YV9jb2ZmZWUgPC0gZGF0YS5mcmFtZSgNCiAgTWFya2V0U2l6ZSA9IGRhdGFfZXhjZWwkYE1hcmtldCBTaXplYCwNCiAgU3RhdGUgPSBkYXRhX2V4Y2VsJFN0YXRlLA0KICBQcm9maXQgPSBkYXRhX2V4Y2VsJFByb2ZpdCwNCiAgRGF0ZSA9IGRhdGFfZXhjZWwkRGF0ZQ0KKQ0KDQojIE1lbmFtcGlsa2FuIGhhc2lsIHNlYmFnYWkgdGFiZWwNCmRhdGF0YWJsZShkYXRhX2NvZmZlZSwgDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICByb3duYW1lcyA9IEZBTFNFKQ0KYGBgDQoNCiMjIFN0YXRpc3Rpa2EgRGVza3JpcHRpZg0KDQpTdGF0aXN0aWthIGRlc2tyaXB0aWYgbWVydXBha2FuIG1ldG9kZSBkYWxhbSBzdGF0aXN0aWthIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbnlhamlrYW4sIG1lbmdhbmFsaXNpcywgZGFuIG1lcmluZ2thcyBzZWt1bXB1bGFuIGRhdGEgc2VoaW5nZ2EgbGViaWggbXVkYWggZGlwYWhhbWkuIFR1anVhbm55YSBhZGFsYWggdW50dWsgbWVtYmVyaWthbiBnYW1iYXJhbiB1bXVtIHRlbnRhbmcga2FyYWt0ZXJpc3RpayBkYXRhIHRhbnBhIG1lbGFrdWthbiBnZW5lcmFsaXNhc2kgdGVyaGFkYXAgcG9wdWxhc2kgeWFuZyBsZWJpaCBsdWFzLiBBbmFsaXNpcyBpbmkgbWVuY2FrdXAgdWt1cmFuIHBlbXVzYXRhbiAoc2VwZXJ0aSByYXRhLXJhdGEgZGFuIG1lZGlhbiksIHVrdXJhbiBwZW55ZWJhcmFuIChzZXBlcnRpIGt1YXJ0aWwgZGFuIHJlbnRhbmcpLCBzZXJ0YSBpZGVudGlmaWthc2kgbmlsYWkgZWtzdHJlbSAob3V0bGllcikuIFBlbnlhamlhbiBkYXBhdCBkaWxha3VrYW4gbWVsYWx1aSByaW5na2FzYW4gbnVtZXJpayBtYXVwdW4gdmlzdWFsaXNhc2kgc2VwZXJ0aSBncmFmaWsgZGFuIHRhYmVsLg0KDQpgYGB7ciBzdGF0LWRlc2tyaXB0aWZ9DQojIFN0YXRpc3Rpa2EgRGVza3JpdGlmIHVudHVrIHNlbXVhIHZhcmlhYmVsDQpzdW1tYXJ5KGRhdGFfY29mZmVlKQ0KYGBgDQoNClBhZGEgZGF0YXNldCBDb2ZmZWUgQ2hhaW4sIGRpbGFrdWthbiBhbmFsaXNpcyBkZXNrcmlwdGlmIHRlcmhhZGFwIGJlYmVyYXBhIHZhcmlhYmVsIHRlcnBpbGloLCB5YWl0dSBNYXJrZXRTaXplLCBTdGF0ZSwgUHJvZml0LCBkYW4gRGF0ZS4gQmVyZGFzYXJrYW4gaGFzaWwgcmluZ2thc2FuIGRhdGEsIHZhcmlhYmVsIE1hcmtldFNpemUgZGFuIFN0YXRlIG1lcnVwYWthbiB0aXBlIGRhdGEga2F0ZWdvcmlrIGRlbmdhbiBqdW1sYWggb2JzZXJ2YXNpIHNlYmFueWFrIDQuMjQ4LiBLZWR1YSB2YXJpYWJlbCBpbmkgbWVuZ2dhbWJhcmthbiBrbGFzaWZpa2FzaSB1a3VyYW4gcGFzYXIgZGFuIGxva2FzaSBnZW9ncmFmaXMgZGFyaSBtYXNpbmctbWFzaW5nIGNhYmFuZyBjb2ZmZWUgc2hvcCB5YW5nIGRpYW1hdGkuIEthcmVuYSBiZXJ0aXBlIGthcmFrdGVyLCBpbnRlcnByZXRhc2kgZGVza3JpcHRpZiB1bnR1ayB2YXJpYWJlbCBpbmkgYWthbiBsZWJpaCB0ZXBhdCBqaWthIGRpbGFrdWthbiBtZWxhbHVpIHRhYnVsYXNpIGZyZWt1ZW5zaSBhdGF1IHZpc3VhbGlzYXNpIGthdGVnb3JpLg0KDQpWYXJpYWJlbCBQcm9maXQgbWVydXBha2FuIHNhbGFoIHNhdHUgZm9rdXMgdXRhbWEga2FyZW5hIG1lbmphZGkgaW5kaWthdG9yIGxhbmdzdW5nIGRhcmkga2ViZXJoYXNpbGFuIGZpbmFuc2lhbCBzZXRpYXAgY2FiYW5nLiBSYXRhLXJhdGEgcHJvZml0IHNlYmVzYXIgNjEsMSBkZW5nYW4gbWVkaWFuIHNlYmVzYXIgNDAgbWVudW5qdWtrYW4gYmFod2Egc2ViYWdpYW4gYmVzYXIgY2FiYW5nIG1lbWlsaWtpIHByb2ZpdCBkaSBiYXdhaCByYXRhLXJhdGEsIHlhbmcgbWVuZ2luZGlrYXNpa2FuIGRpc3RyaWJ1c2kgZGF0YSB5YW5nIGNlbmRlcnVuZyBtaXJpbmcga2Uga2FuYW4uIE5pbGFpIG1pbmltdW0gcHJvZml0IHNlYmVzYXIgLTYzOCBtZW51bmp1a2thbiBhZGFueWEgY2FiYW5nIHlhbmcgbWVuZ2FsYW1pIGtlcnVnaWFuIGN1a3VwIGJlc2FyLCBzZWRhbmdrYW4gbmlsYWkgbWFrc2ltdW0gbWVuY2FwYWkgNzc4LCB5YW5nIG1lbnVuanVra2FuIGFkYW55YSBjYWJhbmcgeWFuZyBzYW5nYXQgbWVuZ3VudHVuZ2thbi4gUmVudGFuZyBuaWxhaSBwcm9maXQgeWFuZyBjdWt1cCBsZWJhciBpbmkgbWVuY2VybWlua2FuIGFkYW55YSB2YXJpYXNpIGtpbmVyamEgeWFuZyB0aW5nZ2kgYW50YXIgY2FiYW5nLg0KDQpWYXJpYWJlbCBEYXRlIG1lbnVuanVra2FuIGJhaHdhIGRhdGEgZGlrdW1wdWxrYW4gZGFsYW0gcmVudGFuZyB3YWt0dSBhbnRhcmEgMSBKYW51YXJpIDIwMTIgaGluZ2dhIDEgRGVzZW1iZXIgMjAxMy4gTmlsYWkgbWVkaWFuIGJlcmFkYSBwYWRhIDE2IERlc2VtYmVyIDIwMTIsIHlhbmcgbWVuYW5kYWthbiBiYWh3YSBkYXRhIHRlcnNlYmFyIGN1a3VwIG1lcmF0YSBkYWxhbSBrdXJ1biB3YWt0dSBkdWEgdGFodW4gcGVuZ2FtYXRhbi4gS2ViZXJhZGFhbiB2YXJpYWJlbCB3YWt0dSBpbmkganVnYSBtZW1idWthIHBlbHVhbmcgdW50dWsgYW5hbGlzaXMgdHJlbiB0ZXJoYWRhcCBwZXJ1YmFoYW4gcHJvZml0IGRhcmkgd2FrdHUga2Ugd2FrdHUuDQoNCk1lbGFsdWkgc3RhdGlzdGlrIGRlc2tyaXB0aWYgaW5pLCBkYXBhdCBkaXBlcm9sZWggcGVtYWhhbWFuIGF3YWwgeWFuZyBwZW50aW5nIHRlcmthaXQgc3RydWt0dXIgZGFuIGthcmFrdGVyaXN0aWsgZGF0YSB5YW5nIGRpZ3VuYWthbiBkYWxhbSBwZW5lbGl0aWFuLiBIYXNpbCBpbmkganVnYSBtZW5qYWRpIGRhc2FyIHVudHVrIG1lbGFuanV0a2FuIGtlIHRhaGFwIGFuYWxpc2lzIGxhbmp1dGFuIHNlcGVydGkgYW5hbGlzaXMgaHVidW5nYW4gYW50YXIgdmFyaWFiZWwgYXRhdSBwZW1vZGVsYW4gcHJlZGlrdGlmLg0KDQpgYGB7ciB2aXN1YWwtcGVuZGFodWx1YW59DQpkYXRhX2NvZmZlZSAlPiUNCiAgbXV0YXRlKE1vbnRoID0gZmxvb3JfZGF0ZShEYXRlLCAibW9udGgiKSkgJT4lDQogIGdyb3VwX2J5KE1vbnRoKSAlPiUNCiAgc3VtbWFyaXNlKG1vbnRobHlfcHJvZml0ID0gc3VtKFByb2ZpdCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IE1vbnRoLCB5ID0gbW9udGhseV9wcm9maXQpKSArDQogIGdlb21fbGluZShjb2xvciA9ICIjMDBDMkM3Iiwgc2l6ZSA9IDEpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjRjc2QzZDIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRyZW4gV2FrdHUgUHJvZml0IEJ1bGFuYW4iLA0KICAgIHggPSAiQnVsYW4iLA0KICAgIHkgPSAiVG90YWwgUHJvZml0Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkNCiAgKQ0KDQpgYGANCg0KIyMgS2luZXJqYSBNYXJrZXQgU2l6ZXsudGFic2V0fQ0KDQojIyMgVWppIE5vcm1hbGl0YXMNCg0KVW50dWsgbWVuZ3VqaSBhcGFrYWggZGlzdHJpYnVzaSBwcm9maXQgcGFkYSBtYXNpbmctbWFzaW5nIGthdGVnb3JpIE1hcmtldCBTaXplIGJlcmRpc3RyaWJ1c2kgbm9ybWFsLCBkaWxha3VrYW4gdWppIG5vcm1hbGl0YXMgbWVuZ2d1bmFrYW4gU2hhcGlyby1XaWxrIHRlc3QuIEhhc2lsIHVqaSBtZW51bmp1a2thbiBuaWxhaSAqKnAtdmFsdWUqKiBzZWJlc2FyICoqNS4xMGUtMzMqKiB1bnR1ayBrYXRlZ29yaSBNYWpvciBNYXJrZXQsIGRhbiAqKjMuNzhlLTU2KiogdW50dWsga2F0ZWdvcmkgU21hbGwgTWFya2V0Lg0KDQpgYGB7ciBub3JtYWxpdGFzLTF9DQojIFBhc3Rpa2FuIE1hcmtldC5TaXplIGFkYWxhaCBmYWN0b3INCmRhdGFfY29mZmVlJE1hcmtldC5TaXplIDwtIGFzLmZhY3RvcihkYXRhX2NvZmZlZSRgTWFya2V0U2l6ZWApDQoNCiMgVWppIG5vcm1hbGl0YXMgcGVyIGdydXAgTWFya2V0IFNpemUNCmRhdGFfY29mZmVlICU+JQ0KICBncm91cF9ieShNYXJrZXQuU2l6ZSkgJT4lDQogIHNoYXBpcm9fdGVzdChQcm9maXQpDQpgYGANCg0KS2FyZW5hIGtlZHVhIG5pbGFpIHAtdmFsdWUgamF1aCBsZWJpaCBrZWNpbCBkYXJpIHRhcmFmIHNpZ25pZmlrYW5zaSAwLDA1LCBtYWthIGRhcGF0IGRpc2ltcHVsa2FuIGJhaHdhIGRhdGEgcHJvZml0IHBhZGEga2VkdWEga2F0ZWdvcmkgbWFya2V0IHNpemUgKip0aWRhayBiZXJkaXN0cmlidXNpIG5vcm1hbCoqLiBIYWwgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBhc3Vtc2kgbm9ybWFsaXRhcyB0aWRhayB0ZXJwZW51aGkuDQoNCkRlbmdhbiBkZW1pa2lhbiwgYW5hbGlzaXMgcGVyYmFuZGluZ2FuIHByb2ZpdCBhbnRhcmEga2Vsb21wb2sgbWFya2V0IHNpemUgdGlkYWsgZGFwYXQgbWVuZ2d1bmFrYW4gdWppIHBhcmFtZXRyaWsgc2VwZXJ0aSBBTk9WQSwgZGFuIGhhcnVzIGRpbGFuanV0a2FuIGRlbmdhbiB1amkgbm9uLXBhcmFtZXRyaWssIHNlcGVydGkgKip1amkgS3J1c2thbC1XYWxsaXMuKioNCg0KIyMjIFVqaSBLcnVza2FsLVdhbGxpcyANCg0KU2V0ZWxhaCBkaWtldGFodWkgYmFod2EgZGF0YSBwcm9maXQgdGlkYWsgYmVyZGlzdHJpYnVzaSBub3JtYWwgcGFkYSBtYXNpbmctbWFzaW5nIGthdGVnb3JpIE1hcmtldCBTaXplLCBtYWthIGRpbGFrdWthbiB1amkgS3J1c2thbC1XYWxsaXMsIHlhaXR1IHVqaSBub24tcGFyYW1ldHJpayB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZW5nZXRhaHVpIGFwYWthaCB0ZXJkYXBhdCBwZXJiZWRhYW4gc2lnbmlmaWthbiBhbnRhcmEgZHVhIGF0YXUgbGViaWgga2Vsb21wb2sgaW5kZXBlbmRlbi4gVW50dWsgS3JpdGVyaWEgdWppIG1lbnVydXQgU3RlZWwgZGFuIFRvcnJpZSAoMTk5MykgYWRhbGFoOg0KJCRIPVxmcmFjezEyfXtuKG4rMSl9XHN1bV97aT0xfVxmcmFje1JfaV4yfXtuX2l9LTMobisxKSQkDQpkaW1hbmEgOg0KJG5fMSQgPSBiYW55YWtueWEgcGVuZ2FtYXRhbiBrZS0kaSQNCiRpJCAgID0gJDEsLi4uLGskOw0KJG4kICAgPSAkXHN1bSBuX2kkOw0KJFJfaSQgPSBqdW1sYWggcGFuZ2thdCBrZS0kaSQNCg0KYGBge3Iga3J1c2thbGwtdzF9DQojIFVqaSBLcnVza2FsLVdhbGxpcyANCmtydXNrYWwudGVzdChQcm9maXQgfiBNYXJrZXQuU2l6ZSwgZGF0YSA9IGRhdGFfY29mZmVlKQ0KYGBgDQoNCkhhc2lsIHVqaSBtZW51bmp1a2thbiBuaWxhaSBzdGF0aXN0aWsgS3J1c2thbC1XYWxsaXMgc2ViZXNhciA0MjQuOTQgZGVuZ2FuIGRlcmFqYXQga2ViZWJhc2FuIChkZikgPSAxLCBkYW4gbmlsYWkgKipwLXZhbHVlIFw8IDIuMmUtMTYqKi4gS2FyZW5hIG5pbGFpIHAgamF1aCBsZWJpaCBrZWNpbCBkYXJpIHRhcmFmIHNpZ25pZmlrYW5zaSAwLDA1LCBtYWthIGRhcGF0IGRpc2ltcHVsa2FuIGJhaHdhIHRlcmRhcGF0IHBlcmJlZGFhbiBwcm9maXQgeWFuZyBzaWduaWZpa2FuIGFudGFyYSBrZWxvbXBvayBNYXJrZXQgU2l6ZS4NCg0KRGVuZ2FuIGRlbWlraWFuLCB1a3VyYW4gcGFzYXIgKE1hcmtldCBTaXplKSBtZW1pbGlraSBwZW5nYXJ1aCB5YW5nIHNpZ25pZmlrYW4gdGVyaGFkYXAgcHJvZml0IHlhbmcgZGlwZXJvbGVoLCBkYW4gaGFsIGluaSBkYXBhdCBtZW5qYWRpIGRhc2FyIHBlcnRpbWJhbmdhbiBzdHJhdGVnaXMgZGFsYW0gZXZhbHVhc2kga2luZXJqYSBwZW5qdWFsYW4gYmVyZGFzYXJrYW4ga2xhc2lmaWthc2kgcGFzYXIuDQoNCiMjIyBWaXN1YWxpc2FzaQ0KDQpgYGB7ciB2aXN1YWxpc2FzaS0xfQ0KIyB2aXN1YWxpc2FzaSAxDQpnZ3Bsb3QoZGF0YV9jb2ZmZWUsIGFlcyh4ID0gTWFya2V0LlNpemUsIHkgPSBQcm9maXQsIGZpbGwgPSBNYXJrZXQuU2l6ZSkpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC43KSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVzaSBQcm9maXQgQmVyZGFzYXJrYW4gVWt1cmFuIFBhc2FyIikgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KQ0KICApDQpgYGANCg0KQmVyZGFzYXJrYW4gYm94cGxvdCBkaXN0cmlidXNpIHByb2ZpdCB0ZXJoYWRhcCB1a3VyYW4gcGFzYXIgKE1hcmtldCBTaXplKSwgdGVybGloYXQgYmFod2Ega2Vsb21wb2sgTWFqb3IgTWFya2V0IGNlbmRlcnVuZyBtZW1pbGlraSBwcm9maXQgeWFuZyBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIGtlbG9tcG9rIFNtYWxsIE1hcmtldC4gTWVkaWFuIHByb2ZpdCBNYWpvciBNYXJrZXQgc2VjYXJhIHZpc3VhbCBsZWJpaCBiZXNhciwgc2VydGEgbWVtaWxpa2kgc2ViYXJhbiBkYXRhIChpbnRlcmt1YXJ0aWwpIHlhbmcgbGViaWggbGViYXIuIFNlbGFpbiBpdHUsIE1ham9yIE1hcmtldCBqdWdhIG1lbnVuanVra2FuIGFkYW55YSBuaWxhaSBwcm9maXQgZWtzdHJlbSAob3V0bGllcikgeWFuZyBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIFNtYWxsIE1hcmtldC4NCg0KU2ViYWxpa255YSwgU21hbGwgTWFya2V0IG1lbWlsaWtpIHBlcnNlYmFyYW4gZGF0YSB5YW5nIGxlYmloIHNlbXBpdCBkYW4gbWVkaWFuIHlhbmcgbGViaWggcmVuZGFoLCBtZW51bmp1a2thbiBwZXJmb3JtYSBwcm9maXQgeWFuZyBjZW5kZXJ1bmcgbGViaWggcmVuZGFoIHNlY2FyYSBrZXNlbHVydWhhbi4gVmlzdWFsaXNhc2kgaW5pIG1lbmR1a3VuZyBoYXNpbCB1amkgS3J1c2thbC1XYWxsaXMgc2ViZWx1bW55YSwgeWFuZyBtZW55YXRha2FuIHRlcmRhcGF0IHBlcmJlZGFhbiBwcm9maXQgeWFuZyBzaWduaWZpa2FuIGJlcmRhc2Fya2FuIHVrdXJhbiBwYXNhci4NCg0KYGBge3IgdmlzdWFsaXNhc2ktMn0NCmRhdGFfY29mZmVlICU+JQ0KICBncm91cF9ieShNYXJrZXQuU2l6ZSkgJT4lDQogIHN1bW1hcmlzZShtZWFuX3Byb2ZpdCA9IG1lYW4oUHJvZml0KSkgJT4lDQogIGdncGxvdChhZXMoeCA9IE1hcmtldC5TaXplLCB5ID0gbWVhbl9wcm9maXQsIGZpbGwgPSBNYXJrZXQuU2l6ZSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiUmF0YS1yYXRhIFByb2ZpdCBCZXJkYXNhcmthbiBVa3VyYW4gUGFzYXIiLA0KICAgICAgIHkgPSAiTWVhbiBQcm9maXQiKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpDQogICkNCmBgYA0KDQpCZXJkYXNhcmthbiBkaWFncmFtIGJhdGFuZywgdGVybGloYXQgYmFod2EgcmF0YS1yYXRhIHByb2ZpdCBwYWRhIE1ham9yIE1hcmtldCBqYXVoIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gZGVuZ2FuIFNtYWxsIE1hcmtldC4gSGFsIGluaSBtZW5kdWt1bmcgaGFzaWwgYW5hbGlzaXMgc2ViZWx1bW55YSwgYmFpayBkYXJpIHVqaSBzdGF0aXN0aWsgS3J1c2thbC1XYWxsaXMgbWF1cHVuIHZpc3VhbGlzYXNpIGJveHBsb3QsIHlhbmcgbWVudW5qdWtrYW4gYmFod2EgdWt1cmFuIHBhc2FyIG1lbWlsaWtpIHBlbmdhcnVoIHRlcmhhZGFwIHByb2ZpdC4gUGVyYmVkYWFuIHJhdGEtcmF0YSB5YW5nIG1lbmNvbG9rIGluaSBtZW5lZ2Fza2FuIGJhaHdhIGJpc25pcyB5YW5nIGJlcm9wZXJhc2kgZGkgcGFzYXIgYmVzYXIgKE1ham9yIE1hcmtldCkgY2VuZGVydW5nIG1lbmdoYXNpbGthbiBwcm9maXQgbGViaWggYmVzYXIgZGFyaXBhZGEgeWFuZyBiZXJhZGEgZGkgcGFzYXIga2VjaWwgKFNtYWxsIE1hcmtldCkuDQoNCiMjIEtpbmVyamEgQmVyZGFzYXJrYW4gUmVnaW9uIHsudGFic2V0fQ0KDQojIyMgVWppIE5vcm1hbGl0YXMNCg0KVW50dWsgbWVuZ3VqaSBhcGFrYWggZGlzdHJpYnVzaSBQcm9maXQgcGFkYSBtYXNpbmctbWFzaW5nIG5lZ2FyYSBiYWdpYW4gZGFsYW0gZGF0YSBiZXJkaXN0cmlidXNpIG5vcm1hbCwgZGlsYWt1a2FuIHVqaSBub3JtYWxpdGFzIG1lbmdndW5ha2FuIFNoYXBpcm8tV2lsayB0ZXN0LiBOYW11biwgc2ViZWx1bSBpdHUgdmFyaWFiZWwgU3RhdGUgcGFkYSBkYXRhX2NvZmZlZSBkaXViYWggZHVsdSBtZW5qYWRpIHRpcGUgZGF0YSBmYWt0b3IuDQoNCmBgYHtyIG5vcm1hbGl0YXMtMn0NCmRhdGFfY29mZmVlJFN0YXRlIDwtIGFzLmZhY3RvcihkYXRhX2NvZmZlZSRTdGF0ZSkNCnRhYmxlKGRhdGFfY29mZmVlJFN0YXRlKSAgIyBIYXJ1cyA+PSA1IHBlciBncnVwDQoNCiN1amkgbm9ybWFsaXRhcyBzZXRpYXAgZ3J1cA0KbGlicmFyeShkcGx5cikNCm5vcm1hbGl0eV9jaGVjayA8LSBkYXRhX2NvZmZlZSAlPiUNCiAgZ3JvdXBfYnkoU3RhdGUpICU+JQ0KICBzdW1tYXJpc2UocF92YWx1ZSA9IGlmZWxzZShuKCkgPj0gMywgc2hhcGlyby50ZXN0KFByb2ZpdCkkcC52YWx1ZSwgTkEpKQ0KDQpwcmludChub3JtYWxpdHlfY2hlY2spDQpgYGANCg0KVWppIG5vcm1hbGl0YXMgZGlsYWt1a2FuIGhhbnlhIHVudHVrIGtlbG9tcG9rIGRlbmdhbiBqdW1sYWggZGF0YSBtaW5pbWFsIDMuIEhhc2lsIG1lbnVuanVra2FuIGJhaHdhIHNlbXVhIG5lZ2FyYSBiYWdpYW4gbWVtaWxpa2kgbmlsYWkgcC12YWx1ZSB5YW5nIHNhbmdhdCBrZWNpbCAoKipzZWx1cnVobnlhIFw8IDAuMDUqKiksIHlhbmcgYmVyYXJ0aSBkYXRhIHByb2ZpdCBwYWRhIHRpYXAgbmVnYXJhIGJhZ2lhbiB0aWRhayBiZXJkaXN0cmlidXNpIG5vcm1hbC4gTWFrYSwgZGFwYXQgZGlzaW1wdWxrYW4gYmFod2EgYXN1bXNpIG5vcm1hbGl0YXMgdGlkYWsgdGVycGVudWhpIHBhZGEgc2VsdXJ1aCBrZWxvbXBvayBuZWdhcmEgYmFnaWFuLCBzZWhpbmdnYSBhbmFsaXNpcyBzZWxhbmp1dG55YSBkYXBhdCBkaWxha3VhbiAqKnVqaSBLcnVza2FsLVdhbGxpcyoqLg0KDQojIyMgVWppIEtydXNrYWxsLXdhbGxpcw0KDQpTZXRlbGFoIGRpa2V0YWh1aSBiYWh3YSBkYXRhIHByb2ZpdCB0aWRhayBiZXJkaXN0cmlidXNpIG5vcm1hbCBwYWRhIG1hc2luZy1tYXNpbmcga2F0ZWdvcmkgU3RhdGUsIG1ha2EgZGlsYWt1a2FuIHVqaSBLcnVza2FsLVdhbGxpcywgeWFpdHUgdWppIG5vbi1wYXJhbWV0cmlrIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbmdldGFodWkgYXBha2FoIHRlcmRhcGF0IHBlcmJlZGFhbiBzaWduaWZpa2FuIGFudGFyYSBkdWEgYXRhdSBsZWJpaCBrZWxvbXBvayBpbmRlcGVuZGVuLiBVbnR1ayBLcml0ZXJpYSB1amkgbWVudXJ1dCBTdGVlbCBkYW4gVG9ycmllICgxOTkzKSBhZGFsYWg6DQokJEg9XGZyYWN7MTJ9e24obisxKX1cc3VtX3tpPTF9XGZyYWN7Ul9pXjJ9e25faX0tMyhuKzEpJCQNCmRpbWFuYSA6DQokbl8xJCA9IGJhbnlha255YSBwZW5nYW1hdGFuIGtlLSRpJA0KJGkkICAgPSAkMSwuLi4sayQ7DQokbiQgICA9ICRcc3VtIG5faSQ7DQokUl9pJCA9IGp1bWxhaCBwYW5na2F0IGtlLSRpJA0KDQpgYGB7ciBrcnVza2FsbC13Mn0NCiMgVUpJIEtSVVNLQUwtV0FMTElTDQprcnVza2FsLnRlc3QoUHJvZml0IH4gU3RhdGUsIGRhdGEgPSBkYXRhX2NvZmZlZSkNCmBgYA0KDQpIYXNpbCB1amkgbWVudW5qdWtrYW4gbmlsYWkgc3RhdGlzdGlrIEtydXNrYWwtV2FsbGlzIHNlYmVzYXIgOTUwLjgyIGRlbmdhbiBkZXJhamF0IGtlYmViYXNhbiAoZGYpID0gMTksIGRhbiBuaWxhaSAqKnAtdmFsdWUgXDwgMi4yZS0xNioqLiBLYXJlbmEgbmlsYWkgcCBqYXVoIGxlYmloIGtlY2lsIGRhcmkgdGFyYWYgc2lnbmlmaWthbnNpIDAsMDUsIG1ha2EgZGFwYXQgZGlzaW1wdWxrYW4gYmFod2EgdGVyZGFwYXQgcGVyYmVkYWFuIHByb2ZpdCB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGtlbG9tcG9rIFN0YXRlLg0KDQpEZW5nYW4gZGVtaWtpYW4sIGxva2FzaSBnZW9ncmFmaXMgKFN0YXRlKSBtZW1pbGlraSBwZW5nYXJ1aCB5YW5nIHNpZ25pZmlrYW4gdGVyaGFkYXAgcHJvZml0IHlhbmcgZGlwZXJvbGVoLCBkYW4gaGFsIGluaSBkYXBhdCBtZW5qYWRpIGRhc2FyIHBlcnRpbWJhbmdhbiBzdHJhdGVnaXMgZGFsYW0gYW5hbGlzaXMgd2lsYXlhaCBwZW5qdWFsYW4gZGFuIHBlcmVuY2FuYWFuIGJpc25pcyBiZXJkYXNhcmthbiBuZWdhcmEgYmFnaWFuLg0KDQojIyMgVWppIEJvbmZlcm9uaSANCg0KU2V0ZWxhaCBkaWtldGFodWkgYmFod2EgdGVyZGFwYXQgcGVyYmVkYWFuIHByb2ZpdCB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGtlbG9tcG9rIFN0YXRlIGJlcmRhc2Fya2FuIHVqaSBLcnVza2FsLVdhbGxpcywgbWFrYSBkaWxha3VrYW4gdWppIGxhbmp1dGFuIChwb3N0LWhvYykgRHVubiBkZW5nYW4ga29yZWtzaSBCb25mZXJyb25pIHVudHVrIG1lbmdldGFodWkgcGFzYW5nYW4gbmVnYXJhIGJhZ2lhbiBtYW5hIHNhamEgeWFuZyBtZW1pbGlraSBwZXJiZWRhYW4gc2lnbmlmaWthbi4NCg0KYGBge3IgYm9uZmVyb25pfQ0KIyBNZWxha3VrYW4gdWppIER1bm4NCmhhc2lsX2R1bm4gPC0gZHVublRlc3QoUHJvZml0IH4gU3RhdGUsIGRhdGEgPSBkYXRhX2NvZmZlZSwgbWV0aG9kID0gImJvbmZlcnJvbmkiKQ0KDQojIE1lbmdhbWJpbCBoYXNpbCBkYWxhbSBiZW50dWsgZGF0YSBmcmFtZQ0KZHVubl9kZiA8LSBoYXNpbF9kdW5uJHJlcw0KDQojIE1lbmFtcGlsa2FuIGhhc2lsIHNlYmFnYWkgdGFiZWwNCmRhdGF0YWJsZShkdW5uX2RmLCANCiAgICAgICAgICBvcHRpb25zID0gbGlzdChzY3JvbGxYID0gVFJVRSksIA0KICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UpDQpgYGANCg0KSGFzaWwgdWppIG1lbnVuanVra2FuIGJhaHdhIGJlYmVyYXBhIHBhc2FuZ2FuIFN0YXRlIG1lbWlsaWtpIG5pbGFpIHAgeWFuZyBsZWJpaCBrZWNpbCBkYXJpIHRhcmFmIHNpZ25pZmlrYW5zaSAwLDA1IHNldGVsYWggZGlsYWt1a2FuIHBlbnllc3VhaWFuIGRlbmdhbiBtZXRvZGUgQm9uZmVycm9uaS4gTWlzYWwgcGFzYW5nYW4gOg0KDQotICAgQ2FsaWZvcm5pYSDigJMgQ29ubmVjdGljdXQgKHAuYWRqID0gNy43MWUtMTApDQoNCi0gICBDYWxpZm9ybmlhIOKAkyBJbGxpbm9pcyAocC5hZGogPSAyLjc5ZS0wNikNCg0KLSAgIENhbGlmb3JuaWEg4oCTIElvd2EgKHAuYWRqID0gNC40MGUtMDMpDQoNCi0gICBDYWxpZm9ybmlhIOKAkyBMb3Vpc2lhbmEgKHAuYWRqID0gNi4xMGUtMDcpDQoNCi0gICBDb2xvcmFkbyDigJMgSWxsaW5vaXMgKHAuYWRqID0gNS4xNmUtMTgpDQoNCi0gICBDb25uZWN0aWN1dCDigJMgSWxsaW5vaXMgKHAuYWRqID0gMi40NGUtMjgpDQoNCi0gICBGbG9yaWRhIOKAkyBJbGxpbm9pcyAocC5hZGogPSAzLjg1ZS0xOCkNCg0KUGFzYW5nYW4tcGFzYW5nYW4gdGVyc2VidXQgbWVudW5qdWtrYW4gcGVyYmVkYWFuIHByb2ZpdCB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3Rpay4gRGkgc2lzaSBsYWluLCBiZWJlcmFwYSBwYXNhbmdhbiBzZXBlcnRpIENvbG9yYWRvIOKAkyBGbG9yaWRhIChwLmFkaiA9IDEuMDAwKSwgQ29ubmVjdGljdXQg4oCTIElvd2EgKHAuYWRqID0gMC44NTIpLCBkYW4gQ29ubmVjdGljdXQg4oCTIEZsb3JpZGEgKHAuYWRqID0gMC44NTkpIHRpZGFrIG1lbnVuanVra2FuIHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4uIERlbmdhbiBkZW1pa2lhbiwgZGFwYXQgZGlzaW1wdWxrYW4gYmFod2EgcGVyYmVkYWFuIHByb2ZpdCBhbnRhciBuZWdhcmEgYmFnaWFuIHRpZGFrIG1lcmF0YSwgZGFuIHRlcmRhcGF0IG5lZ2FyYSBiYWdpYW4gdGVydGVudHUgKG1pc2FsbnlhIElsbGlub2lzIGRhbiBDYWxpZm9ybmlhKSB5YW5nIHNlY2FyYSBrb25zaXN0ZW4gYmVyYmVkYSBzZWNhcmEgc2lnbmlmaWthbiBkaWJhbmRpbmdrYW4gbmVnYXJhIGJhZ2lhbiBsYWlubnlhLg0KDQojIyMgVmlzdWFsaXNhc2kgDQoNCmBgYHtyIHZpc3VhbGlzYXNpLTN9DQojIEhpdHVuZyBtZWRpYW4gcHJvZml0IHBlciBuZWdhcmEgYmFnaWFuDQptZWRpYW5fcHJvZml0IDwtIGRhdGFfY29mZmVlICU+JQ0KICBncm91cF9ieShTdGF0ZSkgJT4lDQogIHN1bW1hcmlzZShtZWRpYW5fcHJvZml0ID0gbWVkaWFuKFByb2ZpdCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtZWRpYW5fcHJvZml0KSkNCg0KIyBCdWF0IGdyYWZpayBiYXRhbmcgKGJhciBjaGFydCkNCmdncGxvdChtZWRpYW5fcHJvZml0LCBhZXMoeCA9IHJlb3JkZXIoU3RhdGUsIG1lZGlhbl9wcm9maXQpLCB5ID0gbWVkaWFuX3Byb2ZpdCwgZmlsbCA9IG1lZGlhbl9wcm9maXQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIiNGNzZDNkMiLCBoaWdoID0gIiMwMEMyQzciKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTWVkaWFuIFByb2ZpdCBwZXIgTmVnYXJhIEJhZ2lhbiIsDQogICAgeCA9ICJTdGF0ZSIsDQogICAgeSA9ICJNZWRpYW4gUHJvZml0Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkNCiAgKQ0KYGBgDQoNClZpc3VhbGlzYXNpIGRpIGF0YXMgbWVudW5qdWtrYW4gcGVyYmFuZGluZ2FuIG1lZGlhbiBwcm9maXQgdW50dWsgbWFzaW5nLW1hc2luZyBuZWdhcmEgYmFnaWFuLiBUZXJsaWhhdCBiYWh3YSBJbGxpbm9pcyBkYW4gTmV3IFlvcmsgbWVtaWxpa2kgbWVkaWFuIHByb2ZpdCB0ZXJ0aW5nZ2ksIGRpaWt1dGkgb2xlaCBDYWxpZm9ybmlhIGRhbiBUZXhhcy4gU2VtZW50YXJhIGl0dSwgbmVnYXJhIGJhZ2lhbiBzZXBlcnRpIE5ldyBNZXhpY28sIE5ldyBIYW1wc2hpcmUsIGRhbiBNaXNzb3VyaSBiZXJhZGEgZGkgcG9zaXNpIHRlcmJhd2FoIGRlbmdhbiBtZWRpYW4gcHJvZml0IHlhbmcgamF1aCBsZWJpaCByZW5kYWguDQoNClBvbGEgeWFuZyB0YW1wYWsgZGFsYW0gZ3JhZmlrIGluaSBtZW5kdWt1bmcgaGFzaWwgdWppIHN0YXRpc3RpayBzZWJlbHVtbnlhLiBOZWdhcmEgYmFnaWFuIGRlbmdhbiBtZWRpYW4gcHJvZml0IHlhbmcgdGluZ2dpIHNlcGVydGkgSWxsaW5vaXMgZGFuIENhbGlmb3JuaWEgdGVyYnVrdGkgbWVtaWxpa2kgcGVyYmVkYWFuIHByb2ZpdCB5YW5nIHNpZ25pZmlrYW4gamlrYSBkaWJhbmRpbmdrYW4gZGVuZ2FuIHNlYmFnaWFuIGJlc2FyIG5lZ2FyYSBiYWdpYW4gbGFpbiwgc2ViYWdhaW1hbmEgdGVybGloYXQgZGFsYW0gaGFzaWwgdWppIER1bm4gZGVuZ2FuIGtvcmVrc2kgQm9uZmVycm9uaS4gUGVyYmVkYWFuIHZpc3VhbCBhbnRhciBrZWxvbXBvayBzZW1ha2luIG1lbmVnYXNrYW4gYmFod2EgcHJvZml0IHRpZGFrIHRlcnNlYmFyIG1lcmF0YSBkaSBzZWx1cnVoIHdpbGF5YWgsIGRhbiB0ZXJkYXBhdCBwZXJiZWRhYW4gbWVuY29sb2sgYW50YXIga2Vsb21wb2sgZ2VvZ3JhZmlzLg0KDQpgYGB7ciB2aXN1YWxpc2FzaS00fQ0KZGF0YV9jb2ZmZWUgJT4lDQogIGdyb3VwX2J5KFN0YXRlKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX3Byb2ZpdCA9IHN1bShQcm9maXQsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZml0KSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoU3RhdGUsIHRvdGFsX3Byb2ZpdCksIHkgPSB0b3RhbF9wcm9maXQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gIiMwMEMyQzciKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVG90YWwgUHJvZml0IHBlciBOZWdhcmEgQmFnaWFuIiwNCiAgICB4ID0gIlN0YXRlIiwNCiAgICB5ID0gIlRvdGFsIFByb2ZpdCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpDQogICkNCmBgYA0KDQpWaXN1YWxpc2FzaSB0ZXJzZWJ1dCBtZW51bmp1a2thbiB0b3RhbCBwcm9maXQgeWFuZyBkaXBlcm9sZWggZGFyaSBtYXNpbmctbWFzaW5nIG5lZ2FyYSBiYWdpYW4uIENhbGlmb3JuaWEgbWVuZW1wYXRpIHBvc2lzaSB0ZXJ0aW5nZ2kgZGVuZ2FuIHRvdGFsIHByb2ZpdCB0ZXJiZXNhciwgZGlpa3V0aSBvbGVoIElsbGlub2lzIGRhbiBJb3dhLiBOZWdhcmEtbmVnYXJhIGJhZ2lhbiBzZXBlcnRpIE5ldyBZb3JrLCBDb2xvcmFkbywgZGFuIE1hc3NhY2h1c2V0dHMganVnYSBtZW55dW1iYW5nIHByb2ZpdCB5YW5nIGN1a3VwIGJlc2FyLiBTZW1lbnRhcmEgaXR1LCBuZWdhcmEgYmFnaWFuIHNlcGVydGkgTmV3IE1leGljbywgTmV3IEhhbXBzaGlyZSwgZGFuIE1pc3NvdXJpIG1lbWlsaWtpIHRvdGFsIHByb2ZpdCB5YW5nIHBhbGluZyByZW5kYWguDQoNCkRhdGEgaW5pIG1lbGVuZ2thcGkgaGFzaWwgYW5hbGlzaXMgc2ViZWx1bW55YSwga2h1c3VzbnlhIHNldGVsYWggZGlrZXRhaHVpIGFkYW55YSBwZXJiZWRhYW4gc2lnbmlmaWthbiBhbnRhciBuZWdhcmEgYmFnaWFuIGJlcmRhc2Fya2FuIHVqaSBLcnVza2FsLVdhbGxpcyBkYW4gdWppIHBvc3QtaG9jIER1bm4gZGVuZ2FuIGtvcmVrc2kgQm9uZmVycm9uaS4gTWVza2lwdW4gbWVkaWFuIHByb2ZpdCBtZW51bmp1a2thbiBiYWh3YSBJbGxpbm9pcyBkYW4gTmV3IFlvcmsgYmVyYWRhIGRpIHVydXRhbiB0ZXJhdGFzIGRhbGFtIGhhbCBwcm9maXQgcGVyIHRyYW5zYWtzaSwgdG90YWwgcHJvZml0IHlhbmcgbGViaWggdGluZ2dpIGRpIENhbGlmb3JuaWEgbWVudW5qdWtrYW4gYmFod2Egdm9sdW1lIHRyYW5zYWtzaSBhdGF1IGNha3VwYW4gYmlzbmlzIGRpIG5lZ2FyYSBiYWdpYW4gaW5pIHNhbmdhdCBiZXNhciwgc2VoaW5nZ2EgbWVuZ2hhc2lsa2FuIGFrdW11bGFzaSBrZXVudHVuZ2FuIHlhbmcgZG9taW5hbiBzZWNhcmEga2VzZWx1cnVoYW4uDQoNClNlY2FyYSBrZXNlbHVydWhhbiwgbWVkaWFuIHByb2ZpdCBtZW5jZXJtaW5rYW4ga3VhbGl0YXMga2V1bnR1bmdhbiBwZXIgdHJhbnNha3NpLCBzZWRhbmdrYW4gdG90YWwgcHJvZml0IG1lbmNlcm1pbmthbiBrb250cmlidXNpIGtlc2VsdXJ1aGFuIHdpbGF5YWggdGVyaGFkYXAgcGVuZGFwYXRhbiBwZXJ1c2FoYWFuLiBPbGVoIGthcmVuYSBpdHUsIHVudHVrIHBlbmdhbWJpbGFuIGtlcHV0dXNhbiBzdHJhdGVnaXMsIHBlcnVzYWhhYW4gcGVybHUgbWVtcGVydGltYmFuZ2thbiBrZWR1YSBhc3BlayBpbmk6IG5lZ2FyYSBiYWdpYW4gZGVuZ2FuIG1lZGlhbiBwcm9maXQgdGluZ2dpIHVudHVrIG1lbmphZ2EgbWFyZ2luIGtldW50dW5nYW4sIGRhbiBuZWdhcmEgYmFnaWFuIGRlbmdhbiB0b3RhbCBwcm9maXQgYmVzYXIgdW50dWsgbWVuZG9yb25nIHZvbHVtZSBkYW4gcGVydHVtYnVoYW4gcGFzYXIuDQoNCiMjIEtlc2ltcHVsYW4gDQoNCkJlcmRhc2Fya2FuIGhhc2lsIGFuYWxpc2lzIHRlcmhhZGFwIGRhdGEgQ29mZmVlIENoYWluLCBkaWtldGFodWkgYmFod2EgcHJvZml0IGNhYmFuZyBzZWNhcmEgc2lnbmlmaWthbiBkaXBlbmdhcnVoaSBvbGVoIGR1YSBmYWt0b3IgdXRhbWEsIHlhaXR1IHVrdXJhbiBwYXNhciAoTWFya2V0IFNpemUpIGRhbiBsb2thc2kgZ2VvZ3JhZmlzIChTdGF0ZSkuIENhYmFuZyB5YW5nIGJlcm9wZXJhc2kgZGkgcGFzYXIgYmVzYXIgKE1ham9yIE1hcmtldCkgY2VuZGVydW5nIG1lbmdoYXNpbGthbiBwcm9maXQgeWFuZyBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIHlhbmcgYmVyYWRhIGRpIHBhc2FyIGtlY2lsIChTbWFsbCBNYXJrZXQpLiBTZWxhaW4gaXR1LCB0ZXJkYXBhdCBwZXJiZWRhYW4gcHJvZml0IHlhbmcgc2lnbmlmaWthbiBhbnRhciBuZWdhcmEgYmFnaWFuLCBkZW5nYW4gQ2FsaWZvcm5pYSwgSWxsaW5vaXMsIGRhbiBOZXcgWW9yayBtZW5qYWRpIHdpbGF5YWggZGVuZ2FuIHBlcmZvcm1hIHRlcnRpbmdnaSwgYmFpayBkYXJpIHNlZ2kgdG90YWwgbWF1cHVuIG1lZGlhbiBwcm9maXQuDQoNClRlbXVhbiBpbmkgbWVudW5qdWtrYW4gYmFod2EgZmFrdG9yIGVrc3Rlcm5hbCBzZXBlcnRpIHBvdGVuc2kgcGFzYXIgZGFuIGxva2FzaSBvcGVyYXNpb25hbCBiZXJwZXJhbiBwZW50aW5nIGRhbGFtIGtlYmVyaGFzaWxhbiBmaW5hbnNpYWwgc3VhdHUgY2FiYW5nLiBPbGVoIGthcmVuYSBpdHUsIGJlYmVyYXBhIGxhbmdrYWggc3RyYXRlZ2lzIGRhcGF0IGRpYW1iaWwuIFBlcnRhbWEsIHBlcnVzYWhhYW4gc2ViYWlrbnlhIG1lbXByaW9yaXRhc2thbiBla3NwYW5zaSBrZSB3aWxheWFoIGRlbmdhbiBrYXJha3RlcmlzdGlrIE1ham9yIE1hcmtldCwga2FyZW5hIHBvdGVuc2kga2V1bnR1bmdhbm55YSBsZWJpaCBiZXNhci4gS2VkdWEsIGNhYmFuZyBkaSBwYXNhciBrZWNpbCBwZXJsdSBkaWV2YWx1YXNpIGxlYmloIGxhbmp1dCB1bnR1ayBtZW5pbmdrYXRrYW4gZWZpc2llbnNpIG9wZXJhc2lvbmFsIGF0YXUgbWVueWVzdWFpa2FuIHN0cmF0ZWdpIHBlbWFzYXJhbi4gS2V0aWdhLCB3aWxheWFoIGRlbmdhbiBwcm9maXQgcmVuZGFoIHNlcGVydGkgTmV3IE1leGljbyBkYW4gTmV3IEhhbXBzaGlyZSBwZXJsdSBkaXRpbmphdSB1bGFuZyBrZWJlcmxhbmp1dGFubnlhLCBhcGFrYWggbWFzaWggbGF5YWsgZGlwZXJ0YWhhbmthbiBhdGF1IHBlcmx1IGRpbGFrdWthbiByZXN0cnVrdHVyaXNhc2kuDQoNClNlbGFpbiBpdHUsIG5lZ2FyYSBiYWdpYW4gZGVuZ2FuIHByb2ZpdCB0aW5nZ2kgZGFwYXQgZGlqYWRpa2FuIHB1c2F0IHBlbmd1YXRhbiBzdHJhdGVnaSBqYW5na2EgcGFuamFuZywgbWlzYWxueWEgbWVsYWx1aSBpbm92YXNpIHByb2R1aywgcHJvbW9zaSBpbnRlbnNpZiwgYXRhdSBwZW5nZW1iYW5nYW4gcHJvZ3JhbSBsb3lhbGl0YXMgcGVsYW5nZ2FuLiBIYXNpbCBzdHVkaSBpbmkganVnYSBtZW5nZ2FyaXNiYXdhaGkgcGVudGluZ255YSBwZW5nZ3VuYWFuIGRhdGEgZGFsYW0gcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIGJpc25pcyB5YW5nIGxlYmloIGFrdXJhdCBkYW4gdGVwYXQgc2FzYXJhbi4gRGVuZ2FuIG1lbXBlcnRpbWJhbmdrYW4gaGFzaWwgYW5hbGlzaXMgc2VjYXJhIG1lbnllbHVydWgsIENvZmZlZSBDaGFpbiBkaWhhcmFwa2FuIGRhcGF0IG1lbmluZ2thdGthbiBwcm9maXRhYmlsaXRhcyBkYW4gZGF5YSBzYWluZ255YSBzZWNhcmEgYmVya2VsYW5qdXRhbi4NCg0K