Email             :
RPubs            : https://www.rpubs.com/muhammad_naufal/
Address         : Jalan Gunung Galunggung 5 Blok E9, No.21


1 Pendahuluan

Employee Turn-over atau diketahui sebagai Employee Churn adalah masalah yang cukup berisiko bagi perusahaan, dikarenakan biaya untuk mengganti karyawan seringkali bisa sangat besar. Berdasarkan studi di Center for American Progress, ditemukan bahwa perusahaan biasanya membayar 1/5 dari gaji karyawan untuk menggantikan karyawan itu, dan biayakan dapat meningkat jika eksekutif atau karyawan dengan bayaran tertinggi harus diganti. Dengan kata lain, biaya mengganti karyawan untuk sebagian besar pemberi kerja tetap signifikan. Hal ini disebabkan banyaknya waktu yang dihabiskan untuk wawancara dan mencari pengganti, bonus, dan hilangnya produktivitas selama beberapa bulan dimana karyawan baru harus membiasakan diri dengan pekerjaannya.

Mengetahui hal itu, perlu tindakan untuk meningkatkan retensi karyawan serta merencanakan perekrutan karyawan baru telebih dahulu. Salah satunya dapat dengan menggunakan Survival Analysis. Project ini biasanya disebut dengan HR Analytics atau People Analytics.

Variabel-variabel yang terdapat pada data ini adalah: Attrition, BusinessTravel, Department, Education, EducationField, EnvironmentSatisfaction, Gender, JobInvolvement, JobLevel, JobRole, JobSatisfaction, MaritalStatus, OverTime, PerformanceRating, RelationshipSatisfaction, WorkLifeBalance, Age, DistanceFromHome, MonthlyIncome, NumCompaniesWorked, PercentSalaryHike, TotalWorkingYears, TrainingTimesLastYear, YearsAtCompany, YearsInCurrentRole, YearsSinceLastPromotion, YearsWithCurrManager. Dengan beberapa variabel kategorikal yang dituliskan dalam bentuk numerik, yaitu:

  • Education 1 ‘Below College’ 2 ‘College’ 3 ‘Bachelor’ 4 ‘Master’ 5 ‘Doctor’
  • EnvironmentSatisfaction 1 ‘Low’ 2 ‘Medium’ 3 ‘High’ 4 ‘Very High’
  • JobInvolvement 1 ‘Low’ 2 ‘Medium’ 3 ‘High’ 4 ‘Very High’
  • JobSatisfaction 1 ‘Low’ 2 ‘Medium’ 3 ‘High’ 4 ‘Very High’
  • PerformanceRating 1 ‘Low’ 2 ‘Good’ 3 ‘Excellent’ 4 ‘Outstanding’
  • RelationshipSatisfaction 1 ‘Low’ 2 ‘Medium’ 3 ‘High’ 4 ‘Very High’
  • WorkLifeBalance 1 ‘Bad’ 2 ‘Good’ 3 ‘Better’ 4 ‘Best’

Dapat kita ketahui, ada berbagai faktor yang menyebabkan terjadinya employee turnover. Salah satunya adalah Overtime. Pada projek ini, ada 2 hal yang akan dicari, yaitu: * Apakah Overtime memengaruhi secara signifikan terjadinya employee turnover? * Berapa peluang karyawan yang overtime dan tidak overtime dapat bertahan hingga 10 tahun kedepan?

2 Import Data

Data yang digunakan adalah data dari IBM HR Analytics Employee Attrition & Performance yang diambil dari kaggle yang berisikan data 1470 karyawan dengan berbagai informasi didalamnya dengan total 35 kolom dengan 237 karyawan turnover dan 1233 yang masih bertahan.

library(DT)

data <- read.csv("data_HR.csv")
datatable(data)
str(data)
## 'data.frame':    1470 obs. of  35 variables:
##  $ Age                     : int  41 49 37 33 27 32 59 30 38 36 ...
##  $ Attrition               : chr  "Yes" "No" "Yes" "No" ...
##  $ BusinessTravel          : chr  "Travel_Rarely" "Travel_Frequently" "Travel_Rarely" "Travel_Frequently" ...
##  $ DailyRate               : int  1102 279 1373 1392 591 1005 1324 1358 216 1299 ...
##  $ Department              : chr  "Sales" "Research & Development" "Research & Development" "Research & Development" ...
##  $ DistanceFromHome        : int  1 8 2 3 2 2 3 24 23 27 ...
##  $ Education               : int  2 1 2 4 1 2 3 1 3 3 ...
##  $ EducationField          : chr  "Life Sciences" "Life Sciences" "Other" "Life Sciences" ...
##  $ EmployeeCount           : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ EmployeeNumber          : int  1 2 4 5 7 8 10 11 12 13 ...
##  $ EnvironmentSatisfaction : int  2 3 4 4 1 4 3 4 4 3 ...
##  $ Gender                  : chr  "Female" "Male" "Male" "Female" ...
##  $ HourlyRate              : int  94 61 92 56 40 79 81 67 44 94 ...
##  $ JobInvolvement          : int  3 2 2 3 3 3 4 3 2 3 ...
##  $ JobLevel                : int  2 2 1 1 1 1 1 1 3 2 ...
##  $ JobRole                 : chr  "Sales Executive" "Research Scientist" "Laboratory Technician" "Research Scientist" ...
##  $ JobSatisfaction         : int  4 2 3 3 2 4 1 3 3 3 ...
##  $ MaritalStatus           : chr  "Single" "Married" "Single" "Married" ...
##  $ MonthlyIncome           : int  5993 5130 2090 2909 3468 3068 2670 2693 9526 5237 ...
##  $ MonthlyRate             : int  19479 24907 2396 23159 16632 11864 9964 13335 8787 16577 ...
##  $ NumCompaniesWorked      : int  8 1 6 1 9 0 4 1 0 6 ...
##  $ Over18                  : chr  "Y" "Y" "Y" "Y" ...
##  $ OverTime                : chr  "Yes" "No" "Yes" "Yes" ...
##  $ PercentSalaryHike       : int  11 23 15 11 12 13 20 22 21 13 ...
##  $ PerformanceRating       : int  3 4 3 3 3 3 4 4 4 3 ...
##  $ RelationshipSatisfaction: int  1 4 2 3 4 3 1 2 2 2 ...
##  $ StandardHours           : int  80 80 80 80 80 80 80 80 80 80 ...
##  $ StockOptionLevel        : int  0 1 0 0 1 0 3 1 0 2 ...
##  $ TotalWorkingYears       : int  8 10 7 8 6 8 12 1 10 17 ...
##  $ TrainingTimesLastYear   : int  0 3 3 3 3 2 3 2 2 3 ...
##  $ WorkLifeBalance         : int  1 3 3 3 3 2 2 3 3 2 ...
##  $ YearsAtCompany          : int  6 10 0 8 2 7 1 1 9 7 ...
##  $ YearsInCurrentRole      : int  4 7 0 7 2 7 0 0 7 7 ...
##  $ YearsSinceLastPromotion : int  0 1 0 3 2 3 0 0 1 7 ...
##  $ YearsWithCurrManager    : int  5 7 0 0 2 6 0 0 8 7 ...
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
Yes <- count(subset(data, Attrition == "Yes" ))
No <- count(subset(data, Attrition == "No"))
attr <- data.frame(Yes, No)
names(attr) <- c('yes', 'no')
attr
##   yes   no
## 1 237 1233

3 Exploratory Data Analysis

Sebagai permulaan, akan dilakukan eksplorasi data untuk membersihkan data dan melihat visualisasi setiap variable yang ada sehingga hasil prediksi dapat lebih baik.

3.1 Data Cleaning

Sebelum dilakukan pembersihan, tipe data Character akan diubah terlebih dahulu menjadi Character.

data <- data %>%
  mutate_if(is.character, as.factor) %>%
  select(Attrition, everything())

3.1.1 Mengatasi Data Hilang

data.frame(colSums(is.na(data)))
##                          colSums.is.na.data..
## Attrition                                   0
## Age                                         0
## BusinessTravel                              0
## DailyRate                                   0
## Department                                  0
## DistanceFromHome                            0
## Education                                   0
## EducationField                              0
## EmployeeCount                               0
## EmployeeNumber                              0
## EnvironmentSatisfaction                     0
## Gender                                      0
## HourlyRate                                  0
## JobInvolvement                              0
## JobLevel                                    0
## JobRole                                     0
## JobSatisfaction                             0
## MaritalStatus                               0
## MonthlyIncome                               0
## MonthlyRate                                 0
## NumCompaniesWorked                          0
## Over18                                      0
## OverTime                                    0
## PercentSalaryHike                           0
## PerformanceRating                           0
## RelationshipSatisfaction                    0
## StandardHours                               0
## StockOptionLevel                            0
## TotalWorkingYears                           0
## TrainingTimesLastYear                       0
## WorkLifeBalance                             0
## YearsAtCompany                              0
## YearsInCurrentRole                          0
## YearsSinceLastPromotion                     0
## YearsWithCurrManager                        0

Dari hasil di atas, dapat dilihat tidak ada data yang hilang. Maka selanjutkan akan melakukan pengecekan data duplikat.

3.1.2 Mengatasi Data Duplikat

check.duplicate <- data.frame(
                   row_of_data = data %>% nrow(),
                   row_of_unique.data = data %>% distinct() %>% nrow())
check.duplicate
##   row_of_data row_of_unique.data
## 1        1470               1470

Dapat dilihat jumlah row of data dan row of unique data sama-sama 1470. Oleh karena itu, dapat dibilang tidak ada data yang duplikat.

3.1.3 Menghapus Kolom yang Tidak Digunakan

Dalam hal ini ada beberapa kolom yang tidak digunakan seperti employeecount, standardhour, dan over18. Untuk mengurasi jumlah kolom, maka dapat dihapus.

data <- data [, c(-9, -22, -27)]

3.1.4 Mengatasi Outlier

Outlier dapat mengganggu hasil dari penelitian, oleh karena itu harus diatasi.

library(DT)

outlier <- boxplot.stats(data$YearsWithCurrManager)$out
out_idx <- which(data$YearsWithCurrManager %in% c(outlier))
data <- data [-out_idx,]
datatable(data)

Pada variabel YearsWithCurrManager terdapat 14 data yang outlier, oleh karena itu untuk membantu penelitian maka dihapuskan. Sehingga data akhir menjadi 1456 dengan 32 kolom.

3.2 Visualisasi Data Kategorik

library(ggplot2)

plot1 <- ggplot(data, aes(x = MonthlyIncome, fill = Attrition)) +
  geom_density(alpha = 0.6) +
  labs(x = "Monthly Income", y = "") +
  ggtitle("Attrition by Income Level") +
  theme_classic()
  print(plot1)

library(ggplot2)
library(dplyr)

# Attrition berdasarkan Department
dept <- data %>%
  group_by(Department, Attrition) %>%
  summarise(n = n())
## `summarise()` has grouped output by 'Department'. You can override using the
## `.groups` argument.
# Membuat variabel 'totals' untuk menyimpan jumlah total karyawan di setiap departemen
dept_totals <- data %>%
  group_by(Department) %>%
  summarise(totals = n())

# Gabungkan 'totals' ke dalam data 'dept'
dept <- left_join(dept, dept_totals, by = "Department")

# Membuat variabel 'attr_perc' untuk menyimpan persentase attrition di setiap departemen
dept <- dept %>%
  mutate(attr_perc = n / totals * 100)

# Filter hanya data dengan Attrition == "Yes"
plot2 <- dept %>%
  filter(Attrition == "Yes") %>%
  ggplot(aes(x = reorder(Department, attr_perc), y = attr_perc, fill = Department)) +
  geom_bar(stat = "identity", alpha = 0.9) +
  labs(x = "", y = "% of employees") +
  ggtitle("Attrition % by Department") +
  theme_classic()

# Tampilkan plot
print(plot2)

library(ggplot2)
library(dplyr)

# Attrition berdasarkan BusinessTravel
trav_attr <- data %>%
  group_by(BusinessTravel, Attrition) %>%
  summarise(n = n())
## `summarise()` has grouped output by 'BusinessTravel'. You can override using
## the `.groups` argument.
# Membuat variabel 'totals' untuk menyimpan jumlah total karyawan di setiap BusinessTravel
trav_attr <- trav_attr %>%
  mutate(totals = ifelse(BusinessTravel == "Non-Travel",
                         sum(n),
                         ifelse(BusinessTravel == "Travel_Frequently",
                                sum(n),
                                ifelse(BusinessTravel == "Travel_Rarely",
                                       sum(n), n))))

# Membuat variabel 'attr_perc' untuk menyimpan persentase attrition di setiap BusinessTravel
trav_attr <- trav_attr %>%
  mutate(attr_perc = n / totals * 100)

# Filter hanya data dengan Attrition == "Yes"
plot3 <- trav_attr %>%
  filter(Attrition == "Yes") %>%
  ggplot(aes(x = reorder(BusinessTravel, attr_perc), y = attr_perc, fill = BusinessTravel)) +
  geom_bar(stat = "identity", alpha = 0.9) +
  labs(x = "", y = "% of employees") +
  ggtitle("Attrition % by Amount of Business Travel") +
  theme_classic()

# Tampilkan plot
print(plot3)

library(ggplot2)
library(dplyr)

# Attrition berdasarkan BusinessTravel
edu_attr <- data %>%
  group_by(Education, Attrition) %>%
  summarise(n = n())
## `summarise()` has grouped output by 'Education'. You can override using the
## `.groups` argument.
# Membuat variabel 'totals' untuk menyimpan jumlah total karyawan di setiap BusinessTravel
edu_tots <- data %>%
  group_by(Education) %>%
  summarise(num = n())

edu_attr <- left_join(edu_attr, edu_tots, by = "Education")

edu_attr <- edu_attr %>% mutate(attr_perc = n / num * 100)

# Filter hanya data dengan Attrition == "Yes"
plot4 <- edu_attr %>%
  filter(Attrition == "Yes") %>%
  ggplot(aes(x = reorder(Education, attr_perc), y = attr_perc, fill = Education)) +
  geom_bar(stat = "identity", alpha = 0.9) +
  labs(x = "Education Level", y = "% of employees") +
  ggtitle("Attrition % by Education Level") +
  theme_classic()

# Tampilkan plot
print(plot4)

library(ggplot2)
library(dplyr)

# Attrition berdasarkan BusinessTravel
mar_attr <- data %>%
  group_by(MaritalStatus, Attrition) %>%
  summarise(n = n())
## `summarise()` has grouped output by 'MaritalStatus'. You can override using the
## `.groups` argument.
# Membuat variabel 'totals' untuk menyimpan jumlah total karyawan di setiap BusinessTravel
mar_tots <- data %>%
  group_by(MaritalStatus) %>%
  summarise(num = n())

mar_attr <- left_join(mar_attr, mar_tots, by = "MaritalStatus")

mar_attr <- mar_attr %>% 
  mutate(attr_perc = n / num * 100)

# Filter hanya data dengan Attrition == "Yes"
plot5 <- mar_attr %>%
  filter(Attrition == "Yes") %>%
  ggplot(aes(x = reorder(MaritalStatus, attr_perc), y = attr_perc, fill = MaritalStatus)) +
  geom_bar(stat = "identity", alpha = 0.9) +
  labs(x = "", y = "% of employees") +
  ggtitle("Attrition % by Marital Status") +
  theme_classic()

# Tampilkan plot
print(plot5)

library(ggplot2)
library(dplyr)

# Attrition berdasarkan Gender dan MaritalStatus
gend_attr <- data %>%
  group_by(Gender, MaritalStatus, Attrition) %>%
  summarise(n = n())
## `summarise()` has grouped output by 'Gender', 'MaritalStatus'. You can override
## using the `.groups` argument.
# Membuat variabel 'totals' untuk menyimpan jumlah total karyawan di setiap Gender dan MaritalStatus
gend_tots <- data %>%
  group_by(Gender, MaritalStatus) %>%
  summarise(num = n())
## `summarise()` has grouped output by 'Gender'. You can override using the
## `.groups` argument.
# Menggabungkan 'gend_attr' dengan 'gend_tots' berdasarkan Gender dan MaritalStatus
gend_attr <- left_join(gend_attr, gend_tots, by = c("Gender", "MaritalStatus"))

# Menghitung persentase attrition untuk setiap kelompok Gender dan MaritalStatus
gend_attr <- gend_attr %>% 
  mutate(attr_perc = n / num * 100)

# Membuat variabel 'type' yang menyatukan Gender dan MaritalStatus
gend_attr$type <- paste(gend_attr$MaritalStatus, gend_attr$Gender, sep = " ")

# Filter hanya data dengan Attrition == "Yes"
plot6 <- gend_attr %>%
  filter(Attrition == "Yes") %>%
  ggplot(aes(x = reorder(type, attr_perc), y = attr_perc, fill = Gender)) +
  geom_bar(stat = "identity", alpha = 0.9) +
  labs(x = "", y = "% of employees") +
  ggtitle("Attrition % by Gender and Marital Status") +
  theme_classic()

# Tampilkan plot
print(plot6)

library(ggplot2)
library(dplyr)

# Attrition berdasarkan Gender dan MaritalStatus
jobinv <- data %>%
  group_by(JobInvolvement, Attrition) %>%
  summarise(n = n())
## `summarise()` has grouped output by 'JobInvolvement'. You can override using
## the `.groups` argument.
# Membuat variabel 'totals' untuk menyimpan jumlah total karyawan di setiap Gender dan MaritalStatus
jobtots <- data %>%
  group_by(JobInvolvement) %>%
  summarise(num = n())

# Menggabungkan 'gend_attr' dengan 'gend_tots' berdasarkan Gender dan MaritalStatus
jobinv <- left_join(jobinv, jobtots, by = "JobInvolvement")

# Menghitung persentase attrition untuk setiap kelompok Gender dan MaritalStatus
jobinv <- jobinv %>% 
  mutate(attr_perc = n / num * 100)

# Filter hanya data dengan Attrition == "Yes"
plot7 <- jobinv %>%
  filter(Attrition == "Yes") %>%
  ggplot(aes(x = JobInvolvement, y = attr_perc, fill = JobInvolvement)) +
  geom_bar(stat = "identity", alpha = 0.9) +
  labs(x = "Job Involvement Level", y = "% of employee attrition") +
  ggtitle("Attrition % by Job Involvement") +
  theme_classic()

# Tampilkan plot
print(plot7)

library(ggplot2)
library(dplyr)

# Attrition berdasarkan Gender dan MaritalStatus
ovt <- data %>%
  group_by(OverTime, Attrition) %>%
  summarise(n = n())
## `summarise()` has grouped output by 'OverTime'. You can override using the
## `.groups` argument.
# Membuat variabel 'totals' untuk menyimpan jumlah total karyawan di setiap Gender dan MaritalStatus
ovttos <- data %>%
  group_by(OverTime) %>%
  summarise(num = n())

# Menggabungkan 'gend_attr' dengan 'gend_tots' berdasarkan Gender dan MaritalStatus
ovt <- left_join(ovt, ovttos, by = "OverTime")

# Menghitung persentase attrition untuk setiap kelompok Gender dan MaritalStatus
ovt <- ovt %>% 
  mutate(attr_perc = n / num * 100)

# Filter hanya data dengan Attrition == "Yes"
plot8 <- ovt %>%
  filter(Attrition == "Yes") %>%
  ggplot(aes(x = OverTime, y = attr_perc, fill = OverTime)) +
  geom_bar(stat = "identity", alpha = 0.9) +
  labs(x = "Overtime", y = "% of employee attrition") +
  ggtitle("Attrition % by Overtime (Y/N)") +
  theme_classic()

# Tampilkan plot
print(plot8)

Hasil diatas menunjukkan bahwa Income memengaruhi terjadinya turnover (Attrition) dimana semakin besar income bulanannya, semakin rendah kemungkinan terjadinya turnover. Sedangkan untuk Department. Business Travel, Education Level, Gender, dan Marital status tidak menunjukkan pengaruh yang jelas terhadap terjadinya turnover.

Pada Job Involvement, terlihat semakin rendah involvement levelnya, semakin tinggi terjadinya turnover, sedangkan semakin tinggi involvement levelnya, semakin rendah tingkat terjadinya turnover itu sendiri. Perbedaan yang sangat jelas terjadi pada Attrition yang disebabkan oleh Overtime atau lembur. Hasil menunjukkan dari 237 karyawan yang turnover, tingkat yang keluar karena Overtime jauh lebih tinggi dibandingkan yang tidak. Hal ini menunjukkan Overtime memengaruhi terjadinya Employee Turnover. Hal ini akan dibahas secara lebih rincinya di bagian survival analysis.

3.3 Visualisasi Data Numerik

# attrition by years worked for company

yrcomp <- data %>%
  group_by(YearsAtCompany) %>%
  filter(Attrition == "Yes") %>%
  summarise(n = n())

yrcomp$Attrition <- "Left"

yrno <- data %>%
  group_by(YearsAtCompany) %>%
  filter(Attrition == "No") %>%
  summarise(n = n())

yrno$Attrition <- "Stayed"

yearscomp <- rbind(yrcomp, yrno)

plot9 <- ggplot(yearscomp, aes(x = YearsAtCompany, y = n, fill = Attrition)) +
  geom_bar(position = "stack", stat = "identity", alpha = 0.9) +
  xlab("Years With Company") +
  ylab("# of employees") +
  ggtitle("Attrition by years worked for company") +
  theme_classic()
# attrition by years of years in current role

yrscomp <- data %>%
  group_by(YearsInCurrentRole) %>%
  filter(Attrition == "Yes") %>%
  summarise(n = n())

yrscomp$Attrition <- "Left"

yrsno <- data %>%
  group_by(YearsInCurrentRole) %>%
  filter(Attrition == "No") %>%
  summarise(n = n())

yrsno$Attrition <- "Stayed"

jyearscomp <- rbind(yrscomp, yrsno)

plot10 <- ggplot(jyearscomp, aes(x = YearsInCurrentRole, y = n, fill = Attrition)) +
  geom_bar(position = "stack", stat = "identity", alpha = 0.9) +
  xlab("Years In CUrrent Role") +
  ylab("# of employees") +
  ggtitle("Attrition by years In Current Role") +
  theme_classic()
# attrition by number of years with current manager

mancomp <- data %>%
  group_by(YearsWithCurrManager) %>%
  filter(Attrition == "Yes") %>%
  summarise(n = n())

mancomp$Attrition <- "Left"

manno <- data %>%
  group_by(YearsWithCurrManager) %>%
  filter(Attrition == "No") %>%
  summarise(n = n())

manno$Attrition <- "Stayed"

managercomp <- rbind(mancomp, manno)

plot11 <- ggplot(managercomp, aes(x = YearsWithCurrManager, y = n, fill = Attrition)) +
  geom_bar(position = "stack", stat = "identity", alpha = 0.9) +
  xlab("Years In CUrrent Manager") +
  ylab("# of employees") +
  ggtitle("Attrition by years With Current Manager") +
  theme_classic()
library(ggpubr)

ggarrange(plot9, plot10, plot11, ncol = 2, nrow = 2)

Hasil diatas menunjukkan bahwa Years in Current Role dan Years with Currrent Manager memengaruhi terjadinya attrition. Pada years in current role, dapat dilihat bahwa semakin lama orang itu berkutat di bidangnya atau rolenya, maka kemungkinan terjadinya turnover lebih kecil. Mungkin dikarenakan bila di tahun-tahun awal employee merasa tidak cocok dengan rolenya sehingga mengundurkan diri. Jika yang sdah bertahan lama, orang tersebut sudah nyaman dan merasa itu adalah role yang tepat untuknya.

Pada attrition with current manager di beberapa waktu tertentu tingkat turnovernya lebih tinggi dibandingkan dengan yang bertahan. Tetapi semakin lama orang bersama manager yang sekarang, semakin rendah kemungkinan turnovernya.

4 Analisis Survival

Karena salah satu variabel yang paling menunjukkan terjadinya employee turnover adalah Overtime, karena itu kami akan mencari peluang bertahannya karyawan 10 tahun kedepan berdasarkan overtimenya atau kerja lembur. Dengan itu, variabel yang akan digunakan adalah Attrition dengan Yes = 1 dan No = 0, Overtime dengan Yes = 1 dan No = 0 , serta waktunya menggunakan YearsAtCompany.

library(survival)

data$event <- with(data,ifelse(Attrition=="Yes", 1,0))
data$Overtimework <- with(data, ifelse(OverTime == "Yes", 1, 0))
time <- data$YearsAtCompany
event <- data$event
group <- data$overtimework
survival <- Surv(time,event)

4.1 Compute Survival Curves

Pada tahap pertama akan dihitung dan divisualisasikan Kurva Survivalnya untuk melihat survival data dari waktu kewaktu.

4.1.1 Model Survival Berdasarkan Waktu dan Kejadiannya

library(survival)

# Asumsikan 'time' adalah waktu survival dan 'event' adalah indikator peristiwa
model <- survfit(Surv(time, event) ~ 1)

# Mendapatkan tabel dengan kolom-kolom yang diinginkan
surv_summary <- data.frame(
  time = model$time,
  n.risk = model$n.risk,
  n.event = model$n.event,
  n.censor = model$n.censor,
  surv = model$surv,
  std.err = model$std.err,
  upper = model$upper,
  lower = model$lower
)

# Mencetak tabel
surv_summary
##    time n.risk n.event n.censor      surv     std.err     upper     lower
## 1     0   1456      16       28 0.9890110 0.002762473 0.9943804 0.9836706
## 2     1   1412      59      112 0.9476855 0.006205986 0.9592830 0.9362281
## 3     2   1241      27      100 0.9270670 0.007512371 0.9408181 0.9135169
## 4     3   1114      20      108 0.9104231 0.008535012 0.9257810 0.8953199
## 5     4    986      19       91 0.8928794 0.009631916 0.9098955 0.8761816
## 6     5    876      21      175 0.8714748 0.010991449 0.8904525 0.8529015
## 7     6    680       9       67 0.8599406 0.011854816 0.8801552 0.8401902
## 8     7    604      11       79 0.8442794 0.013086183 0.8662139 0.8229003
## 9     8    514       9       71 0.8294963 0.014349944 0.8531574 0.8064914
## 10    9    434       8       74 0.8142060 0.015785794 0.8397910 0.7894005
## 11   10    352      18      102 0.7725705 0.020057272 0.8035463 0.7427888
## 12   11    232       2       30 0.7659104 0.020970823 0.7980468 0.7350681
## 13   12    200       0       14 0.7659104 0.020970823 0.7980468 0.7350681
## 14   13    186       2       22 0.7576748 0.022320707 0.7915571 0.7252428
## 15   14    162       2       16 0.7483208 0.023986964 0.7843421 0.7139537
## 16   15    144       1       19 0.7431241 0.024978731 0.7804108 0.7076189
## 17   16    124       1       11 0.7371312 0.026258373 0.7760612 0.7001541
## 18   17    112       1        6 0.7305497 0.027747788 0.7713806 0.6918800
## 19   18    105       1       10 0.7235920 0.029351573 0.7664395 0.6831399
## 20   19     94       1        9 0.7158943 0.031239480 0.7610969 0.6733762
## 21   20     84       1       22 0.7073717 0.033456479 0.7553111 0.6624750
## 22   21     61       1       12 0.6957754 0.037317021 0.7485717 0.6467029
## 23   22     48       1       12 0.6812801 0.042846499 0.7409633 0.6264043
## 24   23     35       1        1 0.6618150 0.051731601 0.7324376 0.5980019
## 25   24     33       1        4 0.6417600 0.060192427 0.7221186 0.5703438
## 26   25     28       0        4 0.6417600 0.060192427 0.7221186 0.5703438
## 27   26     24       0        4 0.6417600 0.060192427 0.7221186 0.5703438
## 28   27     20       0        2 0.6417600 0.060192427 0.7221186 0.5703438
## 29   29     18       0        2 0.6417600 0.060192427 0.7221186 0.5703438
## 30   30     16       0        1 0.6417600 0.060192427 0.7221186 0.5703438
## 31   31     15       1        2 0.5989760 0.091569826 0.7167270 0.5005702
## 32   32     12       1        2 0.5490613 0.126336023 0.7033286 0.4286309
## 33   33      9       1        4 0.4880545 0.172770598 0.6847482 0.3478610
## 34   36      4       0        2 0.4880545 0.172770598 0.6847482 0.3478610
## 35   37      2       0        1 0.4880545 0.172770598 0.6847482 0.3478610
## 36   40      1       1        0 0.0000000         Inf        NA        NA
plot(model, xlab="Time elapsed", ylab = "% surviving", main="Survival Plot")

Pada hasil di atas dapat dilihat bahwa peluang survivenya semakin turun dan berakhir pada tahun ke-40 dimana penurunan paling sering terjadi di tahun pertama hingga tahun ke-10.

4.1.2 Model Survival Time dan Event Berdasarkan Kelompok Overtime

Pada bagian ini akan dilihat model survivalnya jika dikelompoknya pada yang kerja lembur (overtime) dan yang tidak lembur.

# Memperbarui model survival dengan variabel 'Overtime'
model_comp <- survfit(Surv(time, event) ~ OverTime, data = data)

# Plot survival
plot(model_comp, xlab = "Time elapsed", ylab = "% surviving", main = "Survival Plot", legend = TRUE, col = c('blue', 'red'))
## Warning in plot.window(...): "legend" is not a graphical parameter
## Warning in plot.xy(xy, type, ...): "legend" is not a graphical parameter
## Warning in axis(side = side, at = at, labels = labels, ...): "legend" is not a
## graphical parameter

## Warning in axis(side = side, at = at, labels = labels, ...): "legend" is not a
## graphical parameter
## Warning in box(...): "legend" is not a graphical parameter
## Warning in title(...): "legend" is not a graphical parameter
legend('bottomleft', c("Overtime=No", "Overtime=Yes"), col = c('blue', 'red'), lty = 1, bty = "n")

Pada Hasil diatas dapat dilihat untuk Group 0 (Tidak overtime) karyawan ada yang bertahan hingga 40 tahun. Sedangkan untuk Group 1 (Overtime) karyawan paling lama bertahan hingga 31 tahun. Pada grafik juga dapat dilihat peluang bertahannya karyawan yang overtime lebih rendah dibandingkan dengan yang tidak overtime.

4.2 Kaplan - Meier LIfe Table

library(DT)
library(survival)

# Asumsikan model_comp adalah model survival Anda
# Contoh: model_comp <- survfit(Surv(time, event) ~ group, data = data)

# Mendapatkan informasi yang relevan dari model survival
surv_summary <- summary(model_comp)

# Menyiapkan data frame dari informasi yang relevan
sm1 <- data.frame(Time = surv_summary$time,
                     Number_at_risk = surv_summary$n.risk,
                     Number_of_events = surv_summary$n.event,
                     Number_censored = surv_summary$n.censor,
                     Survival_Probability = surv_summary$surv,
                     Standard_Error = surv_summary$std.err,
                     Lower_Confidence_Interval = surv_summary$lower,
                     Upper_Confidence_Interval = surv_summary$upper,
                     Strata = surv_summary$strata)

# Tampilkan tabel interaktif menggunakan DT
datatable(sm1,
          caption = htmltools::tags$caption(
            style = 'caption-side: bottom; text-align: center;',
            htmltools::em('Summary of Survival Curves')))

Pada tabel dapat dilihat peluang survive untuk setiap tahunnya beserta batas atas dan bawahnya. Dari sini dapat dilihat peluang karyawan bertahan 10 tahun kedepan adalah 0.8814 atau 88.14%. Hal ini menunjukkan peluang untuk bertahan 10 tahun kedepan untuk karyawan yang tidak overtime lumayan besar.

4.3 The Median Survival

summary(model_comp)$table
##              records n.max n.start events    rmean se(rmean) median 0.95LCL
## OverTime=No     1042  1042    1042    110 30.52316  1.351791     33      32
## OverTime=Yes     414   414     414    127 22.58698  1.396738     24      16
##              0.95UCL
## OverTime=No       NA
## OverTime=Yes      NA

Pada hasil ini dapat dilihat ketika peluangnya 50% (nilai median) untuk group 0 atau tidak lembur peluangnya akan dibawah 50% ketika sudah kerja selama 33 tahun, sedangkan untuk group 1 atau yang lembur, peluangnya akan dibawah 50% jika telah bekerja hinga 24 tahun.

4.4 Visualize Survival Curves

Visualisasi untuk data tersebut beserta batas atas dan bawahnya adalah sebagai berikut.

library(survminer)
## 
## Attaching package: 'survminer'
## The following object is masked from 'package:survival':
## 
##     myeloma
ggsurvplot(model_comp,
           data = data,
           pval = TRUE,
           conf.int = TRUE,
           xlab = "Time in Years",
           ggtheme = theme_bw(),
           risk.table = "abs_pct",
           risk.table.y.text.col = TRUE,
           risk.table.y.text = FALSE,
           ncensor.plot = TRUE,
           surv.median.line = "hv",
           legend.labs = c("Overtime", "No Overtime"),
           palette = c("#2E9FDF", "#965986"))

Dari visualisasi ini dapat dilihat bahwa kebanyakan turnover terjadi di tahun pertama hingga tahun ke-10. dimana jumlah karyawan yang tersisa di tahun ke-10 adalah 257 untuk yang tidak lembur dan 85 untuk yang lembur. Hingga pada tahun ke-40 hanya ada 1 karyawan yang tidak lembur yang masih bertahan di perusahaan.

4.5 Comparing Survival Curves

Untuk mengetahui apakah Overtime memengaruhi survival karyawan, dapat dilihat dari hasil comparenya.

surv_diff <- survdiff(Surv(time, event) ~ OverTime, data = data)
surv_diff
## Call:
## survdiff(formula = Surv(time, event) ~ OverTime, data = data)
## 
##                 N Observed Expected (O-E)^2/E (O-E)^2/V
## OverTime=No  1042      110    170.5      21.5      78.9
## OverTime=Yes  414      127     66.5      55.1      78.9
## 
##  Chisq= 78.9  on 1 degrees of freedom, p= <2e-16

Dari hasil tersebut dapat dibilang bahwa Overtime memengaruhi terjadinya employee turnover karena berdasarkan test tersebut dapat dilihat overtime memengaruhi secara signigikan dengan p value lebih kecil dari 0.05. Dari Observed dan Expected juga dapat dilihat untuk group 1 yang lembur, angka observe melebihi ekspektasi yang berarti angka turnovernya tinggi.

5 Kesimpulan Akhir

data.frame(subset(sm1, time==10))
##        Time Number_at_risk Number_of_events Number_censored
## 2         1           1012               31              85
## 16       18             71                1               8
## 27        4            270                8              22
## 32        9            114                2              17
## NA       NA             NA               NA              NA
## NA.1     NA             NA               NA              NA
## NA.2     NA             NA               NA              NA
## NA.3     NA             NA               NA              NA
## NA.4     NA             NA               NA              NA
## NA.5     NA             NA               NA              NA
## NA.6     NA             NA               NA              NA
## NA.7     NA             NA               NA              NA
## NA.8     NA             NA               NA              NA
## NA.9     NA             NA               NA              NA
## NA.10    NA             NA               NA              NA
## NA.11    NA             NA               NA              NA
## NA.12    NA             NA               NA              NA
## NA.13    NA             NA               NA              NA
## NA.14    NA             NA               NA              NA
## NA.15    NA             NA               NA              NA
## NA.16    NA             NA               NA              NA
## NA.17    NA             NA               NA              NA
## NA.18    NA             NA               NA              NA
## NA.19    NA             NA               NA              NA
## NA.20    NA             NA               NA              NA
## NA.21    NA             NA               NA              NA
## NA.22    NA             NA               NA              NA
## NA.23    NA             NA               NA              NA
## NA.24    NA             NA               NA              NA
## NA.25    NA             NA               NA              NA
## NA.26    NA             NA               NA              NA
## NA.27    NA             NA               NA              NA
## NA.28    NA             NA               NA              NA
## NA.29    NA             NA               NA              NA
## NA.30    NA             NA               NA              NA
## NA.31    NA             NA               NA              NA
## NA.32    NA             NA               NA              NA
## NA.33    NA             NA               NA              NA
## NA.34    NA             NA               NA              NA
## NA.35    NA             NA               NA              NA
## NA.36    NA             NA               NA              NA
## NA.37    NA             NA               NA              NA
## NA.38    NA             NA               NA              NA
## NA.39    NA             NA               NA              NA
## NA.40    NA             NA               NA              NA
## NA.41    NA             NA               NA              NA
## NA.42    NA             NA               NA              NA
## NA.43    NA             NA               NA              NA
## NA.44    NA             NA               NA              NA
## NA.45    NA             NA               NA              NA
## NA.46    NA             NA               NA              NA
## NA.47    NA             NA               NA              NA
## NA.48    NA             NA               NA              NA
## NA.49    NA             NA               NA              NA
## NA.50    NA             NA               NA              NA
## NA.51    NA             NA               NA              NA
## NA.52    NA             NA               NA              NA
## NA.53    NA             NA               NA              NA
## NA.54    NA             NA               NA              NA
## NA.55    NA             NA               NA              NA
## NA.56    NA             NA               NA              NA
## NA.57    NA             NA               NA              NA
## NA.58    NA             NA               NA              NA
## NA.59    NA             NA               NA              NA
## NA.60    NA             NA               NA              NA
## NA.61    NA             NA               NA              NA
## NA.62    NA             NA               NA              NA
## NA.63    NA             NA               NA              NA
## NA.64    NA             NA               NA              NA
## NA.65    NA             NA               NA              NA
## NA.66    NA             NA               NA              NA
## NA.67    NA             NA               NA              NA
## NA.68    NA             NA               NA              NA
## NA.69    NA             NA               NA              NA
## NA.70    NA             NA               NA              NA
## NA.71    NA             NA               NA              NA
## NA.72    NA             NA               NA              NA
## NA.73    NA             NA               NA              NA
## NA.74    NA             NA               NA              NA
## NA.75    NA             NA               NA              NA
## NA.76    NA             NA               NA              NA
## NA.77    NA             NA               NA              NA
## NA.78    NA             NA               NA              NA
## NA.79    NA             NA               NA              NA
## NA.80    NA             NA               NA              NA
## NA.81    NA             NA               NA              NA
## NA.82    NA             NA               NA              NA
## NA.83    NA             NA               NA              NA
## NA.84    NA             NA               NA              NA
## NA.85    NA             NA               NA              NA
## NA.86    NA             NA               NA              NA
## NA.87    NA             NA               NA              NA
## NA.88    NA             NA               NA              NA
## NA.89    NA             NA               NA              NA
## NA.90    NA             NA               NA              NA
## NA.91    NA             NA               NA              NA
## NA.92    NA             NA               NA              NA
## NA.93    NA             NA               NA              NA
## NA.94    NA             NA               NA              NA
## NA.95    NA             NA               NA              NA
## NA.96    NA             NA               NA              NA
## NA.97    NA             NA               NA              NA
## NA.98    NA             NA               NA              NA
## NA.99    NA             NA               NA              NA
## NA.100   NA             NA               NA              NA
## NA.101   NA             NA               NA              NA
## NA.102   NA             NA               NA              NA
## NA.103   NA             NA               NA              NA
## NA.104   NA             NA               NA              NA
## NA.105   NA             NA               NA              NA
## NA.106   NA             NA               NA              NA
## NA.107   NA             NA               NA              NA
## NA.108   NA             NA               NA              NA
## NA.109   NA             NA               NA              NA
## NA.110   NA             NA               NA              NA
## NA.111   NA             NA               NA              NA
## NA.112   NA             NA               NA              NA
## NA.113   NA             NA               NA              NA
## NA.114   NA             NA               NA              NA
## NA.115   NA             NA               NA              NA
##        Survival_Probability Standard_Error Lower_Confidence_Interval
## 2                 0.9637858    0.005845325                 0.9523970
## 16                0.7995182    0.025475587                 0.7511142
## 27                0.8043154    0.020433015                 0.7652481
## 32                0.6574766    0.028478792                 0.6039629
## NA                       NA             NA                        NA
## NA.1                     NA             NA                        NA
## NA.2                     NA             NA                        NA
## NA.3                     NA             NA                        NA
## NA.4                     NA             NA                        NA
## NA.5                     NA             NA                        NA
## NA.6                     NA             NA                        NA
## NA.7                     NA             NA                        NA
## NA.8                     NA             NA                        NA
## NA.9                     NA             NA                        NA
## NA.10                    NA             NA                        NA
## NA.11                    NA             NA                        NA
## NA.12                    NA             NA                        NA
## NA.13                    NA             NA                        NA
## NA.14                    NA             NA                        NA
## NA.15                    NA             NA                        NA
## NA.16                    NA             NA                        NA
## NA.17                    NA             NA                        NA
## NA.18                    NA             NA                        NA
## NA.19                    NA             NA                        NA
## NA.20                    NA             NA                        NA
## NA.21                    NA             NA                        NA
## NA.22                    NA             NA                        NA
## NA.23                    NA             NA                        NA
## NA.24                    NA             NA                        NA
## NA.25                    NA             NA                        NA
## NA.26                    NA             NA                        NA
## NA.27                    NA             NA                        NA
## NA.28                    NA             NA                        NA
## NA.29                    NA             NA                        NA
## NA.30                    NA             NA                        NA
## NA.31                    NA             NA                        NA
## NA.32                    NA             NA                        NA
## NA.33                    NA             NA                        NA
## NA.34                    NA             NA                        NA
## NA.35                    NA             NA                        NA
## NA.36                    NA             NA                        NA
## NA.37                    NA             NA                        NA
## NA.38                    NA             NA                        NA
## NA.39                    NA             NA                        NA
## NA.40                    NA             NA                        NA
## NA.41                    NA             NA                        NA
## NA.42                    NA             NA                        NA
## NA.43                    NA             NA                        NA
## NA.44                    NA             NA                        NA
## NA.45                    NA             NA                        NA
## NA.46                    NA             NA                        NA
## NA.47                    NA             NA                        NA
## NA.48                    NA             NA                        NA
## NA.49                    NA             NA                        NA
## NA.50                    NA             NA                        NA
## NA.51                    NA             NA                        NA
## NA.52                    NA             NA                        NA
## NA.53                    NA             NA                        NA
## NA.54                    NA             NA                        NA
## NA.55                    NA             NA                        NA
## NA.56                    NA             NA                        NA
## NA.57                    NA             NA                        NA
## NA.58                    NA             NA                        NA
## NA.59                    NA             NA                        NA
## NA.60                    NA             NA                        NA
## NA.61                    NA             NA                        NA
## NA.62                    NA             NA                        NA
## NA.63                    NA             NA                        NA
## NA.64                    NA             NA                        NA
## NA.65                    NA             NA                        NA
## NA.66                    NA             NA                        NA
## NA.67                    NA             NA                        NA
## NA.68                    NA             NA                        NA
## NA.69                    NA             NA                        NA
## NA.70                    NA             NA                        NA
## NA.71                    NA             NA                        NA
## NA.72                    NA             NA                        NA
## NA.73                    NA             NA                        NA
## NA.74                    NA             NA                        NA
## NA.75                    NA             NA                        NA
## NA.76                    NA             NA                        NA
## NA.77                    NA             NA                        NA
## NA.78                    NA             NA                        NA
## NA.79                    NA             NA                        NA
## NA.80                    NA             NA                        NA
## NA.81                    NA             NA                        NA
## NA.82                    NA             NA                        NA
## NA.83                    NA             NA                        NA
## NA.84                    NA             NA                        NA
## NA.85                    NA             NA                        NA
## NA.86                    NA             NA                        NA
## NA.87                    NA             NA                        NA
## NA.88                    NA             NA                        NA
## NA.89                    NA             NA                        NA
## NA.90                    NA             NA                        NA
## NA.91                    NA             NA                        NA
## NA.92                    NA             NA                        NA
## NA.93                    NA             NA                        NA
## NA.94                    NA             NA                        NA
## NA.95                    NA             NA                        NA
## NA.96                    NA             NA                        NA
## NA.97                    NA             NA                        NA
## NA.98                    NA             NA                        NA
## NA.99                    NA             NA                        NA
## NA.100                   NA             NA                        NA
## NA.101                   NA             NA                        NA
## NA.102                   NA             NA                        NA
## NA.103                   NA             NA                        NA
## NA.104                   NA             NA                        NA
## NA.105                   NA             NA                        NA
## NA.106                   NA             NA                        NA
## NA.107                   NA             NA                        NA
## NA.108                   NA             NA                        NA
## NA.109                   NA             NA                        NA
## NA.110                   NA             NA                        NA
## NA.111                   NA             NA                        NA
## NA.112                   NA             NA                        NA
## NA.113                   NA             NA                        NA
## NA.114                   NA             NA                        NA
## NA.115                   NA             NA                        NA
##        Upper_Confidence_Interval       Strata
## 2                      0.9753108  OverTime=No
## 16                     0.8510416  OverTime=No
## 27                     0.8453771 OverTime=Yes
## 32                     0.7157319 OverTime=Yes
## NA                            NA         <NA>
## NA.1                          NA         <NA>
## NA.2                          NA         <NA>
## NA.3                          NA         <NA>
## NA.4                          NA         <NA>
## NA.5                          NA         <NA>
## NA.6                          NA         <NA>
## NA.7                          NA         <NA>
## NA.8                          NA         <NA>
## NA.9                          NA         <NA>
## NA.10                         NA         <NA>
## NA.11                         NA         <NA>
## NA.12                         NA         <NA>
## NA.13                         NA         <NA>
## NA.14                         NA         <NA>
## NA.15                         NA         <NA>
## NA.16                         NA         <NA>
## NA.17                         NA         <NA>
## NA.18                         NA         <NA>
## NA.19                         NA         <NA>
## NA.20                         NA         <NA>
## NA.21                         NA         <NA>
## NA.22                         NA         <NA>
## NA.23                         NA         <NA>
## NA.24                         NA         <NA>
## NA.25                         NA         <NA>
## NA.26                         NA         <NA>
## NA.27                         NA         <NA>
## NA.28                         NA         <NA>
## NA.29                         NA         <NA>
## NA.30                         NA         <NA>
## NA.31                         NA         <NA>
## NA.32                         NA         <NA>
## NA.33                         NA         <NA>
## NA.34                         NA         <NA>
## NA.35                         NA         <NA>
## NA.36                         NA         <NA>
## NA.37                         NA         <NA>
## NA.38                         NA         <NA>
## NA.39                         NA         <NA>
## NA.40                         NA         <NA>
## NA.41                         NA         <NA>
## NA.42                         NA         <NA>
## NA.43                         NA         <NA>
## NA.44                         NA         <NA>
## NA.45                         NA         <NA>
## NA.46                         NA         <NA>
## NA.47                         NA         <NA>
## NA.48                         NA         <NA>
## NA.49                         NA         <NA>
## NA.50                         NA         <NA>
## NA.51                         NA         <NA>
## NA.52                         NA         <NA>
## NA.53                         NA         <NA>
## NA.54                         NA         <NA>
## NA.55                         NA         <NA>
## NA.56                         NA         <NA>
## NA.57                         NA         <NA>
## NA.58                         NA         <NA>
## NA.59                         NA         <NA>
## NA.60                         NA         <NA>
## NA.61                         NA         <NA>
## NA.62                         NA         <NA>
## NA.63                         NA         <NA>
## NA.64                         NA         <NA>
## NA.65                         NA         <NA>
## NA.66                         NA         <NA>
## NA.67                         NA         <NA>
## NA.68                         NA         <NA>
## NA.69                         NA         <NA>
## NA.70                         NA         <NA>
## NA.71                         NA         <NA>
## NA.72                         NA         <NA>
## NA.73                         NA         <NA>
## NA.74                         NA         <NA>
## NA.75                         NA         <NA>
## NA.76                         NA         <NA>
## NA.77                         NA         <NA>
## NA.78                         NA         <NA>
## NA.79                         NA         <NA>
## NA.80                         NA         <NA>
## NA.81                         NA         <NA>
## NA.82                         NA         <NA>
## NA.83                         NA         <NA>
## NA.84                         NA         <NA>
## NA.85                         NA         <NA>
## NA.86                         NA         <NA>
## NA.87                         NA         <NA>
## NA.88                         NA         <NA>
## NA.89                         NA         <NA>
## NA.90                         NA         <NA>
## NA.91                         NA         <NA>
## NA.92                         NA         <NA>
## NA.93                         NA         <NA>
## NA.94                         NA         <NA>
## NA.95                         NA         <NA>
## NA.96                         NA         <NA>
## NA.97                         NA         <NA>
## NA.98                         NA         <NA>
## NA.99                         NA         <NA>
## NA.100                        NA         <NA>
## NA.101                        NA         <NA>
## NA.102                        NA         <NA>
## NA.103                        NA         <NA>
## NA.104                        NA         <NA>
## NA.105                        NA         <NA>
## NA.106                        NA         <NA>
## NA.107                        NA         <NA>
## NA.108                        NA         <NA>
## NA.109                        NA         <NA>
## NA.110                        NA         <NA>
## NA.111                        NA         <NA>
## NA.112                        NA         <NA>
## NA.113                        NA         <NA>
## NA.114                        NA         <NA>
## NA.115                        NA         <NA>

Data awal terdapat 1470 data dan ketika di lakukan pembersihan tersisa 1456 data. Dari data tersebut, dibuat visualisasi dan didapatkan ada beberapa variabel yang memengaruhi terjadinya Employe Turnover, yaitu: Overtime, MonthlyIncome, BusinessTravel, JobInvolvement, TotalWorkingYears, YearsAtCompany, dan YearsWithCurrManager. Karena pada penelitian ini berfokus pada OverTime, maka data yang digunakan adalah YearsAtCompany sebagai time, Attrition sebagai event, dan Overtime sebagai Group untuk pembanding.

Dari hasil penelitian, didapatkan bahwa Overtime memengaruhi secara signifikan terjadinya Employee Turnover. Peluang bertahannya karyawan 10 tahun kedepan untuk employee yang mengalami Overtime adalah 58.83% dan yang tidak mengalami overtime adalah 88.14%. Jika dilihat secara keseluruhan tanpa memperhitungkan overtime, peluang bertahan employee untuk 10 tahun kedepan adalah 77.3%. Dengan itu, mungkin lebih baik agar jam kerja karyawan diperhatikan agar dapat menurunkan kemungkinan turnover sehingga dapat mengurangi kerugian perusahaan juga.

LS0tDQp0aXRsZTogIkVtcGxveWVlIFR1cm5vdmVyIg0Kc3VidGl0bGU6ICJTdXJ2aXZhbCBBbmFseXNpcyINCmF1dGhvcjogIk11aGFtbWFkIE5hdWZhbCBBcmRpYW5zeWFoIChEYXRhIFNjaWVudGlzdCkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICBodG1sX2RvY3VtZW50OiBudWxsDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHNhbmRzdG9uZQ0KICAgIGNzczogc3R5bGUxLmNzcw0KICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQ0KLS0tDQoNCg0KPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IDBweCAxMDBweCAwcHggMHB4OyB3aWR0aDoyNSUiIHNyYz0ibmF1ZmFsLmpwZWciLz4gDQoNCmBgYHtyIGxvZ28sIGVjaG89RkFMU0UsZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGggPSAnMjUlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJMYW1iYW5nLlBORyIpDQpgYGANCg0KRW1haWwgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7OiAgbmF1ZmFsMzQzM0BnbWFpbC5jb20gPGJyPg0KUlB1YnMgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogaHR0cHM6Ly93d3cucnB1YnMuY29tL211aGFtbWFkX25hdWZhbC8gPGJyPg0KQWRkcmVzcyAgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IDogSmFsYW4gR3VudW5nIEdhbHVuZ2d1bmcgNSBCbG9rIEU5LCBOby4yMQ0KDQoqKioNCg0KIyBQZW5kYWh1bHVhbiANCg0KRW1wbG95ZWUgVHVybi1vdmVyIGF0YXUgZGlrZXRhaHVpIHNlYmFnYWkgRW1wbG95ZWUgQ2h1cm4gYWRhbGFoIG1hc2FsYWggeWFuZyBjdWt1cCBiZXJpc2lrbyBiYWdpIHBlcnVzYWhhYW4sIGRpa2FyZW5ha2FuIGJpYXlhIHVudHVrIG1lbmdnYW50aSBrYXJ5YXdhbiBzZXJpbmdrYWxpIGJpc2Egc2FuZ2F0IGJlc2FyLiBCZXJkYXNhcmthbiBzdHVkaSBkaSBDZW50ZXIgZm9yIEFtZXJpY2FuIFByb2dyZXNzLCBkaXRlbXVrYW4gYmFod2EgcGVydXNhaGFhbiBiaWFzYW55YSBtZW1iYXlhciAxLzUgZGFyaSBnYWppIGthcnlhd2FuIHVudHVrIG1lbmdnYW50aWthbiBrYXJ5YXdhbiBpdHUsIGRhbiBiaWF5YWthbiBkYXBhdCBtZW5pbmdrYXQgamlrYSBla3Nla3V0aWYgYXRhdSBrYXJ5YXdhbiBkZW5nYW4gYmF5YXJhbiB0ZXJ0aW5nZ2kgaGFydXMgZGlnYW50aS4gRGVuZ2FuIGthdGEgbGFpbiwgYmlheWEgbWVuZ2dhbnRpIGthcnlhd2FuIHVudHVrIHNlYmFnaWFuIGJlc2FyIHBlbWJlcmkga2VyamEgdGV0YXAgc2lnbmlmaWthbi4gSGFsIGluaSBkaXNlYmFia2FuIGJhbnlha255YSB3YWt0dSB5YW5nIGRpaGFiaXNrYW4gdW50dWsgd2F3YW5jYXJhIGRhbiBtZW5jYXJpIHBlbmdnYW50aSwgYm9udXMsIGRhbiBoaWxhbmdueWEgcHJvZHVrdGl2aXRhcyBzZWxhbWEgYmViZXJhcGEgYnVsYW4gZGltYW5hIGthcnlhd2FuIGJhcnUgaGFydXMgbWVtYmlhc2FrYW4gZGlyaSBkZW5nYW4gcGVrZXJqYWFubnlhLg0KDQpNZW5nZXRhaHVpIGhhbCBpdHUsIHBlcmx1IHRpbmRha2FuIHVudHVrIG1lbmluZ2thdGthbiByZXRlbnNpIGthcnlhd2FuIHNlcnRhIG1lcmVuY2FuYWthbiBwZXJla3J1dGFuIGthcnlhd2FuIGJhcnUgdGVsZWJpaCBkYWh1bHUuIFNhbGFoIHNhdHVueWEgZGFwYXQgZGVuZ2FuIG1lbmdndW5ha2FuIFN1cnZpdmFsIEFuYWx5c2lzLiBQcm9qZWN0IGluaSBiaWFzYW55YSBkaXNlYnV0IGRlbmdhbiBIUiBBbmFseXRpY3MgYXRhdSBQZW9wbGUgQW5hbHl0aWNzLg0KDQpWYXJpYWJlbC12YXJpYWJlbCB5YW5nIHRlcmRhcGF0IHBhZGEgZGF0YSBpbmkgYWRhbGFoOiBBdHRyaXRpb24sIEJ1c2luZXNzVHJhdmVsLCBEZXBhcnRtZW50LCBFZHVjYXRpb24sIEVkdWNhdGlvbkZpZWxkLCBFbnZpcm9ubWVudFNhdGlzZmFjdGlvbiwgR2VuZGVyLCBKb2JJbnZvbHZlbWVudCwgSm9iTGV2ZWwsIEpvYlJvbGUsIEpvYlNhdGlzZmFjdGlvbiwgTWFyaXRhbFN0YXR1cywgT3ZlclRpbWUsIFBlcmZvcm1hbmNlUmF0aW5nLCBSZWxhdGlvbnNoaXBTYXRpc2ZhY3Rpb24sIFdvcmtMaWZlQmFsYW5jZSwgQWdlLCBEaXN0YW5jZUZyb21Ib21lLCBNb250aGx5SW5jb21lLCBOdW1Db21wYW5pZXNXb3JrZWQsIFBlcmNlbnRTYWxhcnlIaWtlLCBUb3RhbFdvcmtpbmdZZWFycywgVHJhaW5pbmdUaW1lc0xhc3RZZWFyLCBZZWFyc0F0Q29tcGFueSwgWWVhcnNJbkN1cnJlbnRSb2xlLCBZZWFyc1NpbmNlTGFzdFByb21vdGlvbiwgWWVhcnNXaXRoQ3Vyck1hbmFnZXIuIERlbmdhbiBiZWJlcmFwYSB2YXJpYWJlbCBrYXRlZ29yaWthbCB5YW5nIGRpdHVsaXNrYW4gZGFsYW0gYmVudHVrIG51bWVyaWssIHlhaXR1Og0KDQotICoqRWR1Y2F0aW9uKiogMSDigJhCZWxvdyBDb2xsZWdl4oCZIDIg4oCYQ29sbGVnZeKAmSAzIOKAmEJhY2hlbG9y4oCZIDQg4oCYTWFzdGVy4oCZIDUg4oCYRG9jdG9y4oCZDQotICoqRW52aXJvbm1lbnRTYXRpc2ZhY3Rpb24qKiAgMSDigJhMb3figJkgMiDigJhNZWRpdW3igJkgMyDigJhIaWdo4oCZIDQg4oCYVmVyeSBIaWdo4oCZDQotICoqSm9iSW52b2x2ZW1lbnQqKiAgMSDigJhMb3figJkgMiDigJhNZWRpdW3igJkgMyDigJhIaWdo4oCZIDQg4oCYVmVyeSBIaWdo4oCZDQotICoqSm9iU2F0aXNmYWN0aW9uKiogIDEg4oCYTG934oCZIDIg4oCYTWVkaXVt4oCZIDMg4oCYSGlnaOKAmSA0IOKAmFZlcnkgSGlnaOKAmQ0KLSAqKlBlcmZvcm1hbmNlUmF0aW5nKiogIDEg4oCYTG934oCZIDIg4oCYR29vZOKAmSAzIOKAmEV4Y2VsbGVudOKAmSA0IOKAmE91dHN0YW5kaW5n4oCZDQotICoqUmVsYXRpb25zaGlwU2F0aXNmYWN0aW9uKiogIDEg4oCYTG934oCZIDIg4oCYTWVkaXVt4oCZIDMg4oCYSGlnaOKAmSA0IOKAmFZlcnkgSGlnaOKAmQ0KLSAqKldvcmtMaWZlQmFsYW5jZSoqICAxIOKAmEJhZOKAmSAyIOKAmEdvb2TigJkgMyDigJhCZXR0ZXLigJkgNCDigJhCZXN04oCZDQoNCkRhcGF0IGtpdGEga2V0YWh1aSwgYWRhIGJlcmJhZ2FpIGZha3RvciB5YW5nIG1lbnllYmFia2FuIHRlcmphZGlueWEgZW1wbG95ZWUgdHVybm92ZXIuIFNhbGFoIHNhdHVueWEgYWRhbGFoIE92ZXJ0aW1lLiBQYWRhIHByb2playBpbmksIGFkYSAyIGhhbCB5YW5nIGFrYW4gZGljYXJpLCB5YWl0dTogKiBBcGFrYWggT3ZlcnRpbWUgbWVtZW5nYXJ1aGkgc2VjYXJhIHNpZ25pZmlrYW4gdGVyamFkaW55YSBlbXBsb3llZSB0dXJub3Zlcj8gKiBCZXJhcGEgcGVsdWFuZyBrYXJ5YXdhbiB5YW5nIG92ZXJ0aW1lIGRhbiB0aWRhayBvdmVydGltZSBkYXBhdCBiZXJ0YWhhbiBoaW5nZ2EgMTAgdGFodW4ga2VkZXBhbj8NCg0KIyBJbXBvcnQgRGF0YQ0KDQpEYXRhIHlhbmcgZGlndW5ha2FuIGFkYWxhaCBkYXRhIGRhcmkgSUJNIEhSIEFuYWx5dGljcyBFbXBsb3llZSBBdHRyaXRpb24gJiBQZXJmb3JtYW5jZSB5YW5nIGRpYW1iaWwgZGFyaSBrYWdnbGUgIHlhbmcgYmVyaXNpa2FuIGRhdGEgMTQ3MCBrYXJ5YXdhbiBkZW5nYW4gYmVyYmFnYWkgaW5mb3JtYXNpIGRpZGFsYW1ueWEgZGVuZ2FuIHRvdGFsIDM1IGtvbG9tIGRlbmdhbiAyMzcga2FyeWF3YW4gdHVybm92ZXIgZGFuIDEyMzMgeWFuZyBtYXNpaCBiZXJ0YWhhbi4NCg0KYGBge3J9DQpsaWJyYXJ5KERUKQ0KDQpkYXRhIDwtIHJlYWQuY3N2KCJkYXRhX0hSLmNzdiIpDQpkYXRhdGFibGUoZGF0YSkNCmBgYA0KDQpgYGB7cn0NCnN0cihkYXRhKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KDQpZZXMgPC0gY291bnQoc3Vic2V0KGRhdGEsIEF0dHJpdGlvbiA9PSAiWWVzIiApKQ0KTm8gPC0gY291bnQoc3Vic2V0KGRhdGEsIEF0dHJpdGlvbiA9PSAiTm8iKSkNCmF0dHIgPC0gZGF0YS5mcmFtZShZZXMsIE5vKQ0KbmFtZXMoYXR0cikgPC0gYygneWVzJywgJ25vJykNCmF0dHINCmBgYA0KDQojIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMNCg0KU2ViYWdhaSBwZXJtdWxhYW4sIGFrYW4gZGlsYWt1a2FuIGVrc3Bsb3Jhc2kgZGF0YSB1bnR1ayBtZW1iZXJzaWhrYW4gZGF0YSBkYW4gbWVsaWhhdCB2aXN1YWxpc2FzaSBzZXRpYXAgdmFyaWFibGUgeWFuZyBhZGEgc2VoaW5nZ2EgaGFzaWwgcHJlZGlrc2kgZGFwYXQgbGViaWggYmFpay4NCg0KIyMgRGF0YSBDbGVhbmluZyANCg0KU2ViZWx1bSBkaWxha3VrYW4gcGVtYmVyc2loYW4sIHRpcGUgZGF0YSBDaGFyYWN0ZXIgYWthbiBkaXViYWggdGVybGViaWggZGFodWx1IG1lbmphZGkgQ2hhcmFjdGVyLg0KDQpgYGB7cn0NCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMuZmFjdG9yKSAlPiUNCiAgc2VsZWN0KEF0dHJpdGlvbiwgZXZlcnl0aGluZygpKQ0KYGBgDQoNCiMjIyBNZW5nYXRhc2kgRGF0YSBIaWxhbmcNCg0KYGBge3J9DQpkYXRhLmZyYW1lKGNvbFN1bXMoaXMubmEoZGF0YSkpKQ0KYGBgDQoNCkRhcmkgaGFzaWwgZGkgYXRhcywgZGFwYXQgZGlsaWhhdCB0aWRhayBhZGEgZGF0YSB5YW5nIGhpbGFuZy4gTWFrYSBzZWxhbmp1dGthbiBha2FuIG1lbGFrdWthbiBwZW5nZWNla2FuIGRhdGEgZHVwbGlrYXQuDQoNCiMjIyBNZW5nYXRhc2kgRGF0YSBEdXBsaWthdA0KDQpgYGB7cn0NCmNoZWNrLmR1cGxpY2F0ZSA8LSBkYXRhLmZyYW1lKA0KICAgICAgICAgICAgICAgICAgIHJvd19vZl9kYXRhID0gZGF0YSAlPiUgbnJvdygpLA0KICAgICAgICAgICAgICAgICAgIHJvd19vZl91bmlxdWUuZGF0YSA9IGRhdGEgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKSkNCmNoZWNrLmR1cGxpY2F0ZQ0KYGBgDQoNCkRhcGF0IGRpbGloYXQganVtbGFoIHJvdyBvZiBkYXRhIGRhbiByb3cgb2YgdW5pcXVlIGRhdGEgc2FtYS1zYW1hIDE0NzAuIE9sZWgga2FyZW5hIGl0dSwgZGFwYXQgZGliaWxhbmcgdGlkYWsgYWRhIGRhdGEgeWFuZyBkdXBsaWthdC4NCg0KIyMjIE1lbmdoYXB1cyBLb2xvbSB5YW5nIFRpZGFrIERpZ3VuYWthbg0KDQpEYWxhbSBoYWwgaW5pIGFkYSBiZWJlcmFwYSBrb2xvbSB5YW5nIHRpZGFrIGRpZ3VuYWthbiBzZXBlcnRpIGVtcGxveWVlY291bnQsIHN0YW5kYXJkaG91ciwgZGFuIG92ZXIxOC4gVW50dWsgbWVuZ3VyYXNpIGp1bWxhaCBrb2xvbSwgbWFrYSBkYXBhdCBkaWhhcHVzLg0KDQpgYGB7cn0NCmRhdGEgPC0gZGF0YSBbLCBjKC05LCAtMjIsIC0yNyldDQpgYGANCg0KIyMjIE1lbmdhdGFzaSBPdXRsaWVyDQoNCk91dGxpZXIgZGFwYXQgbWVuZ2dhbmdndSBoYXNpbCBkYXJpIHBlbmVsaXRpYW4sIG9sZWgga2FyZW5hIGl0dSBoYXJ1cyBkaWF0YXNpLg0KDQpgYGB7cn0NCmxpYnJhcnkoRFQpDQoNCm91dGxpZXIgPC0gYm94cGxvdC5zdGF0cyhkYXRhJFllYXJzV2l0aEN1cnJNYW5hZ2VyKSRvdXQNCm91dF9pZHggPC0gd2hpY2goZGF0YSRZZWFyc1dpdGhDdXJyTWFuYWdlciAlaW4lIGMob3V0bGllcikpDQpkYXRhIDwtIGRhdGEgWy1vdXRfaWR4LF0NCmRhdGF0YWJsZShkYXRhKQ0KYGBgDQoNClBhZGEgdmFyaWFiZWwgWWVhcnNXaXRoQ3Vyck1hbmFnZXIgdGVyZGFwYXQgMTQgZGF0YSB5YW5nIG91dGxpZXIsIG9sZWgga2FyZW5hIGl0dSB1bnR1ayBtZW1iYW50dSBwZW5lbGl0aWFuIG1ha2EgZGloYXB1c2thbi4gU2VoaW5nZ2EgZGF0YSBha2hpciBtZW5qYWRpIDE0NTYgZGVuZ2FuIDMyIGtvbG9tLg0KDQojIyBWaXN1YWxpc2FzaSBEYXRhIEthdGVnb3Jpaw0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KcGxvdDEgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gTW9udGhseUluY29tZSwgZmlsbCA9IEF0dHJpdGlvbikpICsNCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC42KSArDQogIGxhYnMoeCA9ICJNb250aGx5IEluY29tZSIsIHkgPSAiIikgKw0KICBnZ3RpdGxlKCJBdHRyaXRpb24gYnkgSW5jb21lIExldmVsIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCiAgcHJpbnQocGxvdDEpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIEF0dHJpdGlvbiBiZXJkYXNhcmthbiBEZXBhcnRtZW50DQpkZXB0IDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KERlcGFydG1lbnQsIEF0dHJpdGlvbikgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKQ0KDQojIE1lbWJ1YXQgdmFyaWFiZWwgJ3RvdGFscycgdW50dWsgbWVueWltcGFuIGp1bWxhaCB0b3RhbCBrYXJ5YXdhbiBkaSBzZXRpYXAgZGVwYXJ0ZW1lbg0KZGVwdF90b3RhbHMgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoRGVwYXJ0bWVudCkgJT4lDQogIHN1bW1hcmlzZSh0b3RhbHMgPSBuKCkpDQoNCiMgR2FidW5na2FuICd0b3RhbHMnIGtlIGRhbGFtIGRhdGEgJ2RlcHQnDQpkZXB0IDwtIGxlZnRfam9pbihkZXB0LCBkZXB0X3RvdGFscywgYnkgPSAiRGVwYXJ0bWVudCIpDQoNCiMgTWVtYnVhdCB2YXJpYWJlbCAnYXR0cl9wZXJjJyB1bnR1ayBtZW55aW1wYW4gcGVyc2VudGFzZSBhdHRyaXRpb24gZGkgc2V0aWFwIGRlcGFydGVtZW4NCmRlcHQgPC0gZGVwdCAlPiUNCiAgbXV0YXRlKGF0dHJfcGVyYyA9IG4gLyB0b3RhbHMgKiAxMDApDQoNCiMgRmlsdGVyIGhhbnlhIGRhdGEgZGVuZ2FuIEF0dHJpdGlvbiA9PSAiWWVzIg0KcGxvdDIgPC0gZGVwdCAlPiUNCiAgZmlsdGVyKEF0dHJpdGlvbiA9PSAiWWVzIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoRGVwYXJ0bWVudCwgYXR0cl9wZXJjKSwgeSA9IGF0dHJfcGVyYywgZmlsbCA9IERlcGFydG1lbnQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBhbHBoYSA9IDAuOSkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICIlIG9mIGVtcGxveWVlcyIpICsNCiAgZ2d0aXRsZSgiQXR0cml0aW9uICUgYnkgRGVwYXJ0bWVudCIpICsNCiAgdGhlbWVfY2xhc3NpYygpDQoNCiMgVGFtcGlsa2FuIHBsb3QNCnByaW50KHBsb3QyKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBBdHRyaXRpb24gYmVyZGFzYXJrYW4gQnVzaW5lc3NUcmF2ZWwNCnRyYXZfYXR0ciA8LSBkYXRhICU+JQ0KICBncm91cF9ieShCdXNpbmVzc1RyYXZlbCwgQXR0cml0aW9uKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpDQoNCiMgTWVtYnVhdCB2YXJpYWJlbCAndG90YWxzJyB1bnR1ayBtZW55aW1wYW4ganVtbGFoIHRvdGFsIGthcnlhd2FuIGRpIHNldGlhcCBCdXNpbmVzc1RyYXZlbA0KdHJhdl9hdHRyIDwtIHRyYXZfYXR0ciAlPiUNCiAgbXV0YXRlKHRvdGFscyA9IGlmZWxzZShCdXNpbmVzc1RyYXZlbCA9PSAiTm9uLVRyYXZlbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VtKG4pLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShCdXNpbmVzc1RyYXZlbCA9PSAiVHJhdmVsX0ZyZXF1ZW50bHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0obiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShCdXNpbmVzc1RyYXZlbCA9PSAiVHJhdmVsX1JhcmVseSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0obiksIG4pKSkpDQoNCiMgTWVtYnVhdCB2YXJpYWJlbCAnYXR0cl9wZXJjJyB1bnR1ayBtZW55aW1wYW4gcGVyc2VudGFzZSBhdHRyaXRpb24gZGkgc2V0aWFwIEJ1c2luZXNzVHJhdmVsDQp0cmF2X2F0dHIgPC0gdHJhdl9hdHRyICU+JQ0KICBtdXRhdGUoYXR0cl9wZXJjID0gbiAvIHRvdGFscyAqIDEwMCkNCg0KIyBGaWx0ZXIgaGFueWEgZGF0YSBkZW5nYW4gQXR0cml0aW9uID09ICJZZXMiDQpwbG90MyA8LSB0cmF2X2F0dHIgJT4lDQogIGZpbHRlcihBdHRyaXRpb24gPT0gIlllcyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKEJ1c2luZXNzVHJhdmVsLCBhdHRyX3BlcmMpLCB5ID0gYXR0cl9wZXJjLCBmaWxsID0gQnVzaW5lc3NUcmF2ZWwpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBhbHBoYSA9IDAuOSkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICIlIG9mIGVtcGxveWVlcyIpICsNCiAgZ2d0aXRsZSgiQXR0cml0aW9uICUgYnkgQW1vdW50IG9mIEJ1c2luZXNzIFRyYXZlbCIpICsNCiAgdGhlbWVfY2xhc3NpYygpDQoNCiMgVGFtcGlsa2FuIHBsb3QNCnByaW50KHBsb3QzKQ0KDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIEF0dHJpdGlvbiBiZXJkYXNhcmthbiBCdXNpbmVzc1RyYXZlbA0KZWR1X2F0dHIgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoRWR1Y2F0aW9uLCBBdHRyaXRpb24pICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSkNCg0KIyBNZW1idWF0IHZhcmlhYmVsICd0b3RhbHMnIHVudHVrIG1lbnlpbXBhbiBqdW1sYWggdG90YWwga2FyeWF3YW4gZGkgc2V0aWFwIEJ1c2luZXNzVHJhdmVsDQplZHVfdG90cyA8LSBkYXRhICU+JQ0KICBncm91cF9ieShFZHVjYXRpb24pICU+JQ0KICBzdW1tYXJpc2UobnVtID0gbigpKQ0KDQplZHVfYXR0ciA8LSBsZWZ0X2pvaW4oZWR1X2F0dHIsIGVkdV90b3RzLCBieSA9ICJFZHVjYXRpb24iKQ0KDQplZHVfYXR0ciA8LSBlZHVfYXR0ciAlPiUgbXV0YXRlKGF0dHJfcGVyYyA9IG4gLyBudW0gKiAxMDApDQoNCiMgRmlsdGVyIGhhbnlhIGRhdGEgZGVuZ2FuIEF0dHJpdGlvbiA9PSAiWWVzIg0KcGxvdDQgPC0gZWR1X2F0dHIgJT4lDQogIGZpbHRlcihBdHRyaXRpb24gPT0gIlllcyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKEVkdWNhdGlvbiwgYXR0cl9wZXJjKSwgeSA9IGF0dHJfcGVyYywgZmlsbCA9IEVkdWNhdGlvbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGFscGhhID0gMC45KSArDQogIGxhYnMoeCA9ICJFZHVjYXRpb24gTGV2ZWwiLCB5ID0gIiUgb2YgZW1wbG95ZWVzIikgKw0KICBnZ3RpdGxlKCJBdHRyaXRpb24gJSBieSBFZHVjYXRpb24gTGV2ZWwiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KDQojIFRhbXBpbGthbiBwbG90DQpwcmludChwbG90NCkNCg0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBBdHRyaXRpb24gYmVyZGFzYXJrYW4gQnVzaW5lc3NUcmF2ZWwNCm1hcl9hdHRyIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KE1hcml0YWxTdGF0dXMsIEF0dHJpdGlvbikgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKQ0KDQojIE1lbWJ1YXQgdmFyaWFiZWwgJ3RvdGFscycgdW50dWsgbWVueWltcGFuIGp1bWxhaCB0b3RhbCBrYXJ5YXdhbiBkaSBzZXRpYXAgQnVzaW5lc3NUcmF2ZWwNCm1hcl90b3RzIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KE1hcml0YWxTdGF0dXMpICU+JQ0KICBzdW1tYXJpc2UobnVtID0gbigpKQ0KDQptYXJfYXR0ciA8LSBsZWZ0X2pvaW4obWFyX2F0dHIsIG1hcl90b3RzLCBieSA9ICJNYXJpdGFsU3RhdHVzIikNCg0KbWFyX2F0dHIgPC0gbWFyX2F0dHIgJT4lIA0KICBtdXRhdGUoYXR0cl9wZXJjID0gbiAvIG51bSAqIDEwMCkNCg0KIyBGaWx0ZXIgaGFueWEgZGF0YSBkZW5nYW4gQXR0cml0aW9uID09ICJZZXMiDQpwbG90NSA8LSBtYXJfYXR0ciAlPiUNCiAgZmlsdGVyKEF0dHJpdGlvbiA9PSAiWWVzIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoTWFyaXRhbFN0YXR1cywgYXR0cl9wZXJjKSwgeSA9IGF0dHJfcGVyYywgZmlsbCA9IE1hcml0YWxTdGF0dXMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBhbHBoYSA9IDAuOSkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICIlIG9mIGVtcGxveWVlcyIpICsNCiAgZ2d0aXRsZSgiQXR0cml0aW9uICUgYnkgTWFyaXRhbCBTdGF0dXMiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KDQojIFRhbXBpbGthbiBwbG90DQpwcmludChwbG90NSkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQXR0cml0aW9uIGJlcmRhc2Fya2FuIEdlbmRlciBkYW4gTWFyaXRhbFN0YXR1cw0KZ2VuZF9hdHRyIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KEdlbmRlciwgTWFyaXRhbFN0YXR1cywgQXR0cml0aW9uKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpDQoNCiMgTWVtYnVhdCB2YXJpYWJlbCAndG90YWxzJyB1bnR1ayBtZW55aW1wYW4ganVtbGFoIHRvdGFsIGthcnlhd2FuIGRpIHNldGlhcCBHZW5kZXIgZGFuIE1hcml0YWxTdGF0dXMNCmdlbmRfdG90cyA8LSBkYXRhICU+JQ0KICBncm91cF9ieShHZW5kZXIsIE1hcml0YWxTdGF0dXMpICU+JQ0KICBzdW1tYXJpc2UobnVtID0gbigpKQ0KDQojIE1lbmdnYWJ1bmdrYW4gJ2dlbmRfYXR0cicgZGVuZ2FuICdnZW5kX3RvdHMnIGJlcmRhc2Fya2FuIEdlbmRlciBkYW4gTWFyaXRhbFN0YXR1cw0KZ2VuZF9hdHRyIDwtIGxlZnRfam9pbihnZW5kX2F0dHIsIGdlbmRfdG90cywgYnkgPSBjKCJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIpKQ0KDQojIE1lbmdoaXR1bmcgcGVyc2VudGFzZSBhdHRyaXRpb24gdW50dWsgc2V0aWFwIGtlbG9tcG9rIEdlbmRlciBkYW4gTWFyaXRhbFN0YXR1cw0KZ2VuZF9hdHRyIDwtIGdlbmRfYXR0ciAlPiUgDQogIG11dGF0ZShhdHRyX3BlcmMgPSBuIC8gbnVtICogMTAwKQ0KDQojIE1lbWJ1YXQgdmFyaWFiZWwgJ3R5cGUnIHlhbmcgbWVueWF0dWthbiBHZW5kZXIgZGFuIE1hcml0YWxTdGF0dXMNCmdlbmRfYXR0ciR0eXBlIDwtIHBhc3RlKGdlbmRfYXR0ciRNYXJpdGFsU3RhdHVzLCBnZW5kX2F0dHIkR2VuZGVyLCBzZXAgPSAiICIpDQoNCiMgRmlsdGVyIGhhbnlhIGRhdGEgZGVuZ2FuIEF0dHJpdGlvbiA9PSAiWWVzIg0KcGxvdDYgPC0gZ2VuZF9hdHRyICU+JQ0KICBmaWx0ZXIoQXR0cml0aW9uID09ICJZZXMiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcih0eXBlLCBhdHRyX3BlcmMpLCB5ID0gYXR0cl9wZXJjLCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgYWxwaGEgPSAwLjkpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiJSBvZiBlbXBsb3llZXMiKSArDQogIGdndGl0bGUoIkF0dHJpdGlvbiAlIGJ5IEdlbmRlciBhbmQgTWFyaXRhbCBTdGF0dXMiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KDQojIFRhbXBpbGthbiBwbG90DQpwcmludChwbG90NikNCg0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBBdHRyaXRpb24gYmVyZGFzYXJrYW4gR2VuZGVyIGRhbiBNYXJpdGFsU3RhdHVzDQpqb2JpbnYgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoSm9iSW52b2x2ZW1lbnQsIEF0dHJpdGlvbikgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKQ0KDQojIE1lbWJ1YXQgdmFyaWFiZWwgJ3RvdGFscycgdW50dWsgbWVueWltcGFuIGp1bWxhaCB0b3RhbCBrYXJ5YXdhbiBkaSBzZXRpYXAgR2VuZGVyIGRhbiBNYXJpdGFsU3RhdHVzDQpqb2J0b3RzIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KEpvYkludm9sdmVtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG51bSA9IG4oKSkNCg0KIyBNZW5nZ2FidW5na2FuICdnZW5kX2F0dHInIGRlbmdhbiAnZ2VuZF90b3RzJyBiZXJkYXNhcmthbiBHZW5kZXIgZGFuIE1hcml0YWxTdGF0dXMNCmpvYmludiA8LSBsZWZ0X2pvaW4oam9iaW52LCBqb2J0b3RzLCBieSA9ICJKb2JJbnZvbHZlbWVudCIpDQoNCiMgTWVuZ2hpdHVuZyBwZXJzZW50YXNlIGF0dHJpdGlvbiB1bnR1ayBzZXRpYXAga2Vsb21wb2sgR2VuZGVyIGRhbiBNYXJpdGFsU3RhdHVzDQpqb2JpbnYgPC0gam9iaW52ICU+JSANCiAgbXV0YXRlKGF0dHJfcGVyYyA9IG4gLyBudW0gKiAxMDApDQoNCiMgRmlsdGVyIGhhbnlhIGRhdGEgZGVuZ2FuIEF0dHJpdGlvbiA9PSAiWWVzIg0KcGxvdDcgPC0gam9iaW52ICU+JQ0KICBmaWx0ZXIoQXR0cml0aW9uID09ICJZZXMiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gSm9iSW52b2x2ZW1lbnQsIHkgPSBhdHRyX3BlcmMsIGZpbGwgPSBKb2JJbnZvbHZlbWVudCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGFscGhhID0gMC45KSArDQogIGxhYnMoeCA9ICJKb2IgSW52b2x2ZW1lbnQgTGV2ZWwiLCB5ID0gIiUgb2YgZW1wbG95ZWUgYXR0cml0aW9uIikgKw0KICBnZ3RpdGxlKCJBdHRyaXRpb24gJSBieSBKb2IgSW52b2x2ZW1lbnQiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KDQojIFRhbXBpbGthbiBwbG90DQpwcmludChwbG90NykNCg0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBBdHRyaXRpb24gYmVyZGFzYXJrYW4gR2VuZGVyIGRhbiBNYXJpdGFsU3RhdHVzDQpvdnQgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoT3ZlclRpbWUsIEF0dHJpdGlvbikgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKQ0KDQojIE1lbWJ1YXQgdmFyaWFiZWwgJ3RvdGFscycgdW50dWsgbWVueWltcGFuIGp1bWxhaCB0b3RhbCBrYXJ5YXdhbiBkaSBzZXRpYXAgR2VuZGVyIGRhbiBNYXJpdGFsU3RhdHVzDQpvdnR0b3MgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoT3ZlclRpbWUpICU+JQ0KICBzdW1tYXJpc2UobnVtID0gbigpKQ0KDQojIE1lbmdnYWJ1bmdrYW4gJ2dlbmRfYXR0cicgZGVuZ2FuICdnZW5kX3RvdHMnIGJlcmRhc2Fya2FuIEdlbmRlciBkYW4gTWFyaXRhbFN0YXR1cw0Kb3Z0IDwtIGxlZnRfam9pbihvdnQsIG92dHRvcywgYnkgPSAiT3ZlclRpbWUiKQ0KDQojIE1lbmdoaXR1bmcgcGVyc2VudGFzZSBhdHRyaXRpb24gdW50dWsgc2V0aWFwIGtlbG9tcG9rIEdlbmRlciBkYW4gTWFyaXRhbFN0YXR1cw0Kb3Z0IDwtIG92dCAlPiUgDQogIG11dGF0ZShhdHRyX3BlcmMgPSBuIC8gbnVtICogMTAwKQ0KDQojIEZpbHRlciBoYW55YSBkYXRhIGRlbmdhbiBBdHRyaXRpb24gPT0gIlllcyINCnBsb3Q4IDwtIG92dCAlPiUNCiAgZmlsdGVyKEF0dHJpdGlvbiA9PSAiWWVzIikgJT4lDQogIGdncGxvdChhZXMoeCA9IE92ZXJUaW1lLCB5ID0gYXR0cl9wZXJjLCBmaWxsID0gT3ZlclRpbWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBhbHBoYSA9IDAuOSkgKw0KICBsYWJzKHggPSAiT3ZlcnRpbWUiLCB5ID0gIiUgb2YgZW1wbG95ZWUgYXR0cml0aW9uIikgKw0KICBnZ3RpdGxlKCJBdHRyaXRpb24gJSBieSBPdmVydGltZSAoWS9OKSIpICsNCiAgdGhlbWVfY2xhc3NpYygpDQoNCiMgVGFtcGlsa2FuIHBsb3QNCnByaW50KHBsb3Q4KQ0KDQpgYGANCg0KSGFzaWwgZGlhdGFzIG1lbnVuanVra2FuIGJhaHdhIEluY29tZSBtZW1lbmdhcnVoaSB0ZXJqYWRpbnlhIHR1cm5vdmVyIChBdHRyaXRpb24pIGRpbWFuYSBzZW1ha2luIGJlc2FyIGluY29tZSBidWxhbmFubnlhLCBzZW1ha2luIHJlbmRhaCBrZW11bmdraW5hbiB0ZXJqYWRpbnlhIHR1cm5vdmVyLiBTZWRhbmdrYW4gdW50dWsgRGVwYXJ0bWVudC4gQnVzaW5lc3MgVHJhdmVsLCBFZHVjYXRpb24gTGV2ZWwsIEdlbmRlciwgZGFuIE1hcml0YWwgc3RhdHVzIHRpZGFrIG1lbnVuanVra2FuIHBlbmdhcnVoIHlhbmcgamVsYXMgdGVyaGFkYXAgdGVyamFkaW55YSB0dXJub3Zlci4gDQoNClBhZGEgSm9iIEludm9sdmVtZW50LCB0ZXJsaWhhdCBzZW1ha2luIHJlbmRhaCBpbnZvbHZlbWVudCBsZXZlbG55YSwgc2VtYWtpbiB0aW5nZ2kgdGVyamFkaW55YSB0dXJub3Zlciwgc2VkYW5na2FuIHNlbWFraW4gdGluZ2dpIGludm9sdmVtZW50IGxldmVsbnlhLCBzZW1ha2luIHJlbmRhaCB0aW5na2F0IHRlcmphZGlueWEgdHVybm92ZXIgaXR1IHNlbmRpcmkuIFBlcmJlZGFhbiB5YW5nIHNhbmdhdCBqZWxhcyB0ZXJqYWRpIHBhZGEgQXR0cml0aW9uIHlhbmcgZGlzZWJhYmthbiBvbGVoIE92ZXJ0aW1lIGF0YXUgbGVtYnVyLiBIYXNpbCBtZW51bmp1a2thbiBkYXJpIDIzNyBrYXJ5YXdhbiB5YW5nIHR1cm5vdmVyLCB0aW5na2F0IHlhbmcga2VsdWFyIGthcmVuYSBPdmVydGltZSBqYXVoIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4geWFuZyB0aWRhay4gSGFsIGluaSBtZW51bmp1a2thbiBPdmVydGltZSBtZW1lbmdhcnVoaSB0ZXJqYWRpbnlhIEVtcGxveWVlIFR1cm5vdmVyLiBIYWwgaW5pIGFrYW4gZGliYWhhcyBzZWNhcmEgbGViaWggcmluY2lueWEgZGkgYmFnaWFuIHN1cnZpdmFsIGFuYWx5c2lzLg0KDQojIyBWaXN1YWxpc2FzaSBEYXRhIE51bWVyaWsNCg0KYGBge3J9DQojIGF0dHJpdGlvbiBieSB5ZWFycyB3b3JrZWQgZm9yIGNvbXBhbnkNCg0KeXJjb21wIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KFllYXJzQXRDb21wYW55KSAlPiUNCiAgZmlsdGVyKEF0dHJpdGlvbiA9PSAiWWVzIikgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKQ0KDQp5cmNvbXAkQXR0cml0aW9uIDwtICJMZWZ0Ig0KDQp5cm5vIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KFllYXJzQXRDb21wYW55KSAlPiUNCiAgZmlsdGVyKEF0dHJpdGlvbiA9PSAiTm8iKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpDQoNCnlybm8kQXR0cml0aW9uIDwtICJTdGF5ZWQiDQoNCnllYXJzY29tcCA8LSByYmluZCh5cmNvbXAsIHlybm8pDQoNCnBsb3Q5IDwtIGdncGxvdCh5ZWFyc2NvbXAsIGFlcyh4ID0gWWVhcnNBdENvbXBhbnksIHkgPSBuLCBmaWxsID0gQXR0cml0aW9uKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIsIHN0YXQgPSAiaWRlbnRpdHkiLCBhbHBoYSA9IDAuOSkgKw0KICB4bGFiKCJZZWFycyBXaXRoIENvbXBhbnkiKSArDQogIHlsYWIoIiMgb2YgZW1wbG95ZWVzIikgKw0KICBnZ3RpdGxlKCJBdHRyaXRpb24gYnkgeWVhcnMgd29ya2VkIGZvciBjb21wYW55IikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KDQpgYGB7cn0NCiMgYXR0cml0aW9uIGJ5IHllYXJzIG9mIHllYXJzIGluIGN1cnJlbnQgcm9sZQ0KDQp5cnNjb21wIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KFllYXJzSW5DdXJyZW50Um9sZSkgJT4lDQogIGZpbHRlcihBdHRyaXRpb24gPT0gIlllcyIpICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSkNCg0KeXJzY29tcCRBdHRyaXRpb24gPC0gIkxlZnQiDQoNCnlyc25vIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KFllYXJzSW5DdXJyZW50Um9sZSkgJT4lDQogIGZpbHRlcihBdHRyaXRpb24gPT0gIk5vIikgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKQ0KDQp5cnNubyRBdHRyaXRpb24gPC0gIlN0YXllZCINCg0KanllYXJzY29tcCA8LSByYmluZCh5cnNjb21wLCB5cnNubykNCg0KcGxvdDEwIDwtIGdncGxvdChqeWVhcnNjb21wLCBhZXMoeCA9IFllYXJzSW5DdXJyZW50Um9sZSwgeSA9IG4sIGZpbGwgPSBBdHRyaXRpb24pKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gInN0YWNrIiwgc3RhdCA9ICJpZGVudGl0eSIsIGFscGhhID0gMC45KSArDQogIHhsYWIoIlllYXJzIEluIENVcnJlbnQgUm9sZSIpICsNCiAgeWxhYigiIyBvZiBlbXBsb3llZXMiKSArDQogIGdndGl0bGUoIkF0dHJpdGlvbiBieSB5ZWFycyBJbiBDdXJyZW50IFJvbGUiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCmBgYHtyfQ0KIyBhdHRyaXRpb24gYnkgbnVtYmVyIG9mIHllYXJzIHdpdGggY3VycmVudCBtYW5hZ2VyDQoNCm1hbmNvbXAgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoWWVhcnNXaXRoQ3Vyck1hbmFnZXIpICU+JQ0KICBmaWx0ZXIoQXR0cml0aW9uID09ICJZZXMiKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpDQoNCm1hbmNvbXAkQXR0cml0aW9uIDwtICJMZWZ0Ig0KDQptYW5ubyA8LSBkYXRhICU+JQ0KICBncm91cF9ieShZZWFyc1dpdGhDdXJyTWFuYWdlcikgJT4lDQogIGZpbHRlcihBdHRyaXRpb24gPT0gIk5vIikgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKQ0KDQptYW5ubyRBdHRyaXRpb24gPC0gIlN0YXllZCINCg0KbWFuYWdlcmNvbXAgPC0gcmJpbmQobWFuY29tcCwgbWFubm8pDQoNCnBsb3QxMSA8LSBnZ3Bsb3QobWFuYWdlcmNvbXAsIGFlcyh4ID0gWWVhcnNXaXRoQ3Vyck1hbmFnZXIsIHkgPSBuLCBmaWxsID0gQXR0cml0aW9uKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIsIHN0YXQgPSAiaWRlbnRpdHkiLCBhbHBoYSA9IDAuOSkgKw0KICB4bGFiKCJZZWFycyBJbiBDVXJyZW50IE1hbmFnZXIiKSArDQogIHlsYWIoIiMgb2YgZW1wbG95ZWVzIikgKw0KICBnZ3RpdGxlKCJBdHRyaXRpb24gYnkgeWVhcnMgV2l0aCBDdXJyZW50IE1hbmFnZXIiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3B1YnIpDQoNCmdnYXJyYW5nZShwbG90OSwgcGxvdDEwLCBwbG90MTEsIG5jb2wgPSAyLCBucm93ID0gMikNCmBgYA0KDQpIYXNpbCBkaWF0YXMgbWVudW5qdWtrYW4gYmFod2EgWWVhcnMgaW4gQ3VycmVudCBSb2xlIGRhbiBZZWFycyB3aXRoIEN1cnJyZW50IE1hbmFnZXIgbWVtZW5nYXJ1aGkgdGVyamFkaW55YSBhdHRyaXRpb24uIFBhZGEgeWVhcnMgaW4gY3VycmVudCByb2xlLCBkYXBhdCBkaWxpaGF0IGJhaHdhIHNlbWFraW4gbGFtYSBvcmFuZyBpdHUgYmVya3V0YXQgZGkgYmlkYW5nbnlhIGF0YXUgcm9sZW55YSwgbWFrYSBrZW11bmdraW5hbiB0ZXJqYWRpbnlhIHR1cm5vdmVyIGxlYmloIGtlY2lsLiBNdW5na2luIGRpa2FyZW5ha2FuIGJpbGEgZGkgdGFodW4tdGFodW4gYXdhbCBlbXBsb3llZSBtZXJhc2EgdGlkYWsgY29jb2sgZGVuZ2FuIHJvbGVueWEgc2VoaW5nZ2EgbWVuZ3VuZHVya2FuIGRpcmkuIEppa2EgeWFuZyBzZGFoIGJlcnRhaGFuIGxhbWEsIG9yYW5nIHRlcnNlYnV0IHN1ZGFoIG55YW1hbiBkYW4gbWVyYXNhIGl0dSBhZGFsYWggcm9sZSB5YW5nIHRlcGF0IHVudHVrbnlhLiANCg0KUGFkYSBhdHRyaXRpb24gd2l0aCBjdXJyZW50IG1hbmFnZXIgZGkgYmViZXJhcGEgd2FrdHUgdGVydGVudHUgdGluZ2thdCB0dXJub3Zlcm55YSBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIGRlbmdhbiB5YW5nIGJlcnRhaGFuLiBUZXRhcGkgc2VtYWtpbiBsYW1hIG9yYW5nIGJlcnNhbWEgbWFuYWdlciB5YW5nIHNla2FyYW5nLCBzZW1ha2luIHJlbmRhaCBrZW11bmdraW5hbiB0dXJub3Zlcm55YS4NCg0KIyBBbmFsaXNpcyBTdXJ2aXZhbA0KDQpLYXJlbmEgc2FsYWggc2F0dSB2YXJpYWJlbCB5YW5nIHBhbGluZyBtZW51bmp1a2thbiB0ZXJqYWRpbnlhIGVtcGxveWVlIHR1cm5vdmVyIGFkYWxhaCBPdmVydGltZSwga2FyZW5hIGl0dSBrYW1pIGFrYW4gbWVuY2FyaSBwZWx1YW5nIGJlcnRhaGFubnlhIGthcnlhd2FuIDEwIHRhaHVuIGtlZGVwYW4gYmVyZGFzYXJrYW4gb3ZlcnRpbWVueWEgYXRhdSBrZXJqYSBsZW1idXIuIERlbmdhbiBpdHUsIHZhcmlhYmVsIHlhbmcgYWthbiBkaWd1bmFrYW4gYWRhbGFoIEF0dHJpdGlvbiBkZW5nYW4gWWVzID0gMSBkYW4gTm8gPSAwLCBPdmVydGltZSBkZW5nYW4gWWVzID0gMSBkYW4gTm8gPSAwICwgc2VydGEgd2FrdHVueWEgbWVuZ2d1bmFrYW4gWWVhcnNBdENvbXBhbnkuDQoNCmBgYHtyfQ0KbGlicmFyeShzdXJ2aXZhbCkNCg0KZGF0YSRldmVudCA8LSB3aXRoKGRhdGEsaWZlbHNlKEF0dHJpdGlvbj09IlllcyIsIDEsMCkpDQpkYXRhJE92ZXJ0aW1ld29yayA8LSB3aXRoKGRhdGEsIGlmZWxzZShPdmVyVGltZSA9PSAiWWVzIiwgMSwgMCkpDQp0aW1lIDwtIGRhdGEkWWVhcnNBdENvbXBhbnkNCmV2ZW50IDwtIGRhdGEkZXZlbnQNCmdyb3VwIDwtIGRhdGEkb3ZlcnRpbWV3b3JrDQpzdXJ2aXZhbCA8LSBTdXJ2KHRpbWUsZXZlbnQpDQpgYGANCg0KIyMgQ29tcHV0ZSBTdXJ2aXZhbCBDdXJ2ZXMNCg0KUGFkYSB0YWhhcCBwZXJ0YW1hIGFrYW4gZGloaXR1bmcgZGFuIGRpdmlzdWFsaXNhc2lrYW4gS3VydmEgU3Vydml2YWxueWEgdW50dWsgbWVsaWhhdCBzdXJ2aXZhbCBkYXRhIGRhcmkgd2FrdHUga2V3YWt0dS4NCg0KIyMjIE1vZGVsIFN1cnZpdmFsIEJlcmRhc2Fya2FuIFdha3R1IGRhbiBLZWphZGlhbm55YSANCg0KYGBge3J9DQpsaWJyYXJ5KHN1cnZpdmFsKQ0KDQojIEFzdW1zaWthbiAndGltZScgYWRhbGFoIHdha3R1IHN1cnZpdmFsIGRhbiAnZXZlbnQnIGFkYWxhaCBpbmRpa2F0b3IgcGVyaXN0aXdhDQptb2RlbCA8LSBzdXJ2Zml0KFN1cnYodGltZSwgZXZlbnQpIH4gMSkNCg0KIyBNZW5kYXBhdGthbiB0YWJlbCBkZW5nYW4ga29sb20ta29sb20geWFuZyBkaWluZ2lua2FuDQpzdXJ2X3N1bW1hcnkgPC0gZGF0YS5mcmFtZSgNCiAgdGltZSA9IG1vZGVsJHRpbWUsDQogIG4ucmlzayA9IG1vZGVsJG4ucmlzaywNCiAgbi5ldmVudCA9IG1vZGVsJG4uZXZlbnQsDQogIG4uY2Vuc29yID0gbW9kZWwkbi5jZW5zb3IsDQogIHN1cnYgPSBtb2RlbCRzdXJ2LA0KICBzdGQuZXJyID0gbW9kZWwkc3RkLmVyciwNCiAgdXBwZXIgPSBtb2RlbCR1cHBlciwNCiAgbG93ZXIgPSBtb2RlbCRsb3dlcg0KKQ0KDQojIE1lbmNldGFrIHRhYmVsDQpzdXJ2X3N1bW1hcnkNCg0KYGBgDQoNCmBgYHtyfQ0KcGxvdChtb2RlbCwgeGxhYj0iVGltZSBlbGFwc2VkIiwgeWxhYiA9ICIlIHN1cnZpdmluZyIsIG1haW49IlN1cnZpdmFsIFBsb3QiKQ0KYGBgDQoNClBhZGEgaGFzaWwgZGkgYXRhcyBkYXBhdCBkaWxpaGF0IGJhaHdhIHBlbHVhbmcgc3Vydml2ZW55YSBzZW1ha2luIHR1cnVuIGRhbiBiZXJha2hpciBwYWRhIHRhaHVuIGtlLTQwIGRpbWFuYSBwZW51cnVuYW4gcGFsaW5nIHNlcmluZyB0ZXJqYWRpIGRpIHRhaHVuIHBlcnRhbWEgaGluZ2dhIHRhaHVuIGtlLTEwLg0KDQojIyMgTW9kZWwgU3Vydml2YWwgVGltZSBkYW4gRXZlbnQgQmVyZGFzYXJrYW4gS2Vsb21wb2sgT3ZlcnRpbWUNCg0KUGFkYSBiYWdpYW4gaW5pIGFrYW4gZGlsaWhhdCBtb2RlbCBzdXJ2aXZhbG55YSBqaWthIGRpa2Vsb21wb2tueWEgcGFkYSB5YW5nIGtlcmphIGxlbWJ1ciAob3ZlcnRpbWUpIGRhbiB5YW5nIHRpZGFrIGxlbWJ1ci4NCg0KYGBge3J9DQojIE1lbXBlcmJhcnVpIG1vZGVsIHN1cnZpdmFsIGRlbmdhbiB2YXJpYWJlbCAnT3ZlcnRpbWUnDQptb2RlbF9jb21wIDwtIHN1cnZmaXQoU3Vydih0aW1lLCBldmVudCkgfiBPdmVyVGltZSwgZGF0YSA9IGRhdGEpDQoNCiMgUGxvdCBzdXJ2aXZhbA0KcGxvdChtb2RlbF9jb21wLCB4bGFiID0gIlRpbWUgZWxhcHNlZCIsIHlsYWIgPSAiJSBzdXJ2aXZpbmciLCBtYWluID0gIlN1cnZpdmFsIFBsb3QiLCBsZWdlbmQgPSBUUlVFLCBjb2wgPSBjKCdibHVlJywgJ3JlZCcpKQ0KbGVnZW5kKCdib3R0b21sZWZ0JywgYygiT3ZlcnRpbWU9Tm8iLCAiT3ZlcnRpbWU9WWVzIiksIGNvbCA9IGMoJ2JsdWUnLCAncmVkJyksIGx0eSA9IDEsIGJ0eSA9ICJuIikNCg0KYGBgDQoNClBhZGEgSGFzaWwgZGlhdGFzIGRhcGF0IGRpbGloYXQgdW50dWsgR3JvdXAgMCAoVGlkYWsgb3ZlcnRpbWUpIGthcnlhd2FuIGFkYSB5YW5nIGJlcnRhaGFuIGhpbmdnYSA0MCB0YWh1bi4gU2VkYW5na2FuIHVudHVrIEdyb3VwIDEgKE92ZXJ0aW1lKSBrYXJ5YXdhbiBwYWxpbmcgbGFtYSBiZXJ0YWhhbiBoaW5nZ2EgMzEgdGFodW4uIFBhZGEgZ3JhZmlrIGp1Z2EgZGFwYXQgZGlsaWhhdCBwZWx1YW5nIGJlcnRhaGFubnlhIGthcnlhd2FuIHlhbmcgb3ZlcnRpbWUgbGViaWggcmVuZGFoIGRpYmFuZGluZ2thbiBkZW5nYW4geWFuZyB0aWRhayBvdmVydGltZS4NCg0KIyMgS2FwbGFuIC0gTWVpZXIgTElmZSBUYWJsZQ0KDQpgYGB7cn0NCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHN1cnZpdmFsKQ0KDQojIEFzdW1zaWthbiBtb2RlbF9jb21wIGFkYWxhaCBtb2RlbCBzdXJ2aXZhbCBBbmRhDQojIENvbnRvaDogbW9kZWxfY29tcCA8LSBzdXJ2Zml0KFN1cnYodGltZSwgZXZlbnQpIH4gZ3JvdXAsIGRhdGEgPSBkYXRhKQ0KDQojIE1lbmRhcGF0a2FuIGluZm9ybWFzaSB5YW5nIHJlbGV2YW4gZGFyaSBtb2RlbCBzdXJ2aXZhbA0Kc3Vydl9zdW1tYXJ5IDwtIHN1bW1hcnkobW9kZWxfY29tcCkNCg0KIyBNZW55aWFwa2FuIGRhdGEgZnJhbWUgZGFyaSBpbmZvcm1hc2kgeWFuZyByZWxldmFuDQpzbTEgPC0gZGF0YS5mcmFtZShUaW1lID0gc3Vydl9zdW1tYXJ5JHRpbWUsDQogICAgICAgICAgICAgICAgICAgICBOdW1iZXJfYXRfcmlzayA9IHN1cnZfc3VtbWFyeSRuLnJpc2ssDQogICAgICAgICAgICAgICAgICAgICBOdW1iZXJfb2ZfZXZlbnRzID0gc3Vydl9zdW1tYXJ5JG4uZXZlbnQsDQogICAgICAgICAgICAgICAgICAgICBOdW1iZXJfY2Vuc29yZWQgPSBzdXJ2X3N1bW1hcnkkbi5jZW5zb3IsDQogICAgICAgICAgICAgICAgICAgICBTdXJ2aXZhbF9Qcm9iYWJpbGl0eSA9IHN1cnZfc3VtbWFyeSRzdXJ2LA0KICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRfRXJyb3IgPSBzdXJ2X3N1bW1hcnkkc3RkLmVyciwNCiAgICAgICAgICAgICAgICAgICAgIExvd2VyX0NvbmZpZGVuY2VfSW50ZXJ2YWwgPSBzdXJ2X3N1bW1hcnkkbG93ZXIsDQogICAgICAgICAgICAgICAgICAgICBVcHBlcl9Db25maWRlbmNlX0ludGVydmFsID0gc3Vydl9zdW1tYXJ5JHVwcGVyLA0KICAgICAgICAgICAgICAgICAgICAgU3RyYXRhID0gc3Vydl9zdW1tYXJ5JHN0cmF0YSkNCg0KIyBUYW1waWxrYW4gdGFiZWwgaW50ZXJha3RpZiBtZW5nZ3VuYWthbiBEVA0KZGF0YXRhYmxlKHNtMSwNCiAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oDQogICAgICAgICAgICBzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IGJvdHRvbTsgdGV4dC1hbGlnbjogY2VudGVyOycsDQogICAgICAgICAgICBodG1sdG9vbHM6OmVtKCdTdW1tYXJ5IG9mIFN1cnZpdmFsIEN1cnZlcycpKSkNCg0KYGBgDQoNClBhZGEgdGFiZWwgZGFwYXQgZGlsaWhhdCBwZWx1YW5nIHN1cnZpdmUgdW50dWsgc2V0aWFwIHRhaHVubnlhIGJlc2VydGEgYmF0YXMgYXRhcyBkYW4gYmF3YWhueWEuIERhcmkgc2luaSBkYXBhdCBkaWxpaGF0IHBlbHVhbmcga2FyeWF3YW4gYmVydGFoYW4gMTAgdGFodW4ga2VkZXBhbiBhZGFsYWggMC44ODE0IGF0YXUgODguMTQlLiBIYWwgaW5pIG1lbnVuanVra2FuIHBlbHVhbmcgdW50dWsgYmVydGFoYW4gMTAgdGFodW4ga2VkZXBhbiB1bnR1ayBrYXJ5YXdhbiB5YW5nIHRpZGFrIG92ZXJ0aW1lIGx1bWF5YW4gYmVzYXIuDQoNCiMjIFRoZSBNZWRpYW4gU3Vydml2YWwNCg0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsX2NvbXApJHRhYmxlDQpgYGANCg0KUGFkYSBoYXNpbCBpbmkgZGFwYXQgZGlsaWhhdCBrZXRpa2EgcGVsdWFuZ255YSA1MCUgKG5pbGFpIG1lZGlhbikgdW50dWsgZ3JvdXAgMCBhdGF1IHRpZGFrIGxlbWJ1ciBwZWx1YW5nbnlhIGFrYW4gZGliYXdhaCA1MCUga2V0aWthIHN1ZGFoIGtlcmphIHNlbGFtYSAzMyB0YWh1biwgc2VkYW5na2FuIHVudHVrIGdyb3VwIDEgYXRhdSB5YW5nIGxlbWJ1ciwgcGVsdWFuZ255YSBha2FuIGRpYmF3YWggNTAlIGppa2EgdGVsYWggYmVrZXJqYSBoaW5nYSAyNCB0YWh1bi4NCg0KIyMgVmlzdWFsaXplIFN1cnZpdmFsIEN1cnZlcw0KDQpWaXN1YWxpc2FzaSB1bnR1ayBkYXRhIHRlcnNlYnV0IGJlc2VydGEgYmF0YXMgYXRhcyBkYW4gYmF3YWhueWEgYWRhbGFoIHNlYmFnYWkgYmVyaWt1dC4NCg0KYGBge3J9DQpsaWJyYXJ5KHN1cnZtaW5lcikNCg0KZ2dzdXJ2cGxvdChtb2RlbF9jb21wLA0KICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgcHZhbCA9IFRSVUUsDQogICAgICAgICAgIGNvbmYuaW50ID0gVFJVRSwNCiAgICAgICAgICAgeGxhYiA9ICJUaW1lIGluIFllYXJzIiwNCiAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX2J3KCksDQogICAgICAgICAgIHJpc2sudGFibGUgPSAiYWJzX3BjdCIsDQogICAgICAgICAgIHJpc2sudGFibGUueS50ZXh0LmNvbCA9IFRSVUUsDQogICAgICAgICAgIHJpc2sudGFibGUueS50ZXh0ID0gRkFMU0UsDQogICAgICAgICAgIG5jZW5zb3IucGxvdCA9IFRSVUUsDQogICAgICAgICAgIHN1cnYubWVkaWFuLmxpbmUgPSAiaHYiLA0KICAgICAgICAgICBsZWdlbmQubGFicyA9IGMoIk92ZXJ0aW1lIiwgIk5vIE92ZXJ0aW1lIiksDQogICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMkU5RkRGIiwgIiM5NjU5ODYiKSkNCmBgYA0KDQpEYXJpIHZpc3VhbGlzYXNpIGluaSBkYXBhdCBkaWxpaGF0IGJhaHdhIGtlYmFueWFrYW4gdHVybm92ZXIgdGVyamFkaSBkaSB0YWh1biBwZXJ0YW1hIGhpbmdnYSB0YWh1biBrZS0xMC4gZGltYW5hIGp1bWxhaCBrYXJ5YXdhbiB5YW5nIHRlcnNpc2EgZGkgdGFodW4ga2UtMTAgYWRhbGFoIDI1NyB1bnR1ayB5YW5nIHRpZGFrIGxlbWJ1ciBkYW4gODUgdW50dWsgeWFuZyBsZW1idXIuIEhpbmdnYSBwYWRhIHRhaHVuIGtlLTQwIGhhbnlhIGFkYSAxIGthcnlhd2FuIHlhbmcgdGlkYWsgbGVtYnVyIHlhbmcgbWFzaWggYmVydGFoYW4gZGkgcGVydXNhaGFhbi4NCg0KIyMgQ29tcGFyaW5nIFN1cnZpdmFsIEN1cnZlcw0KDQpVbnR1ayBtZW5nZXRhaHVpIGFwYWthaCBPdmVydGltZSBtZW1lbmdhcnVoaSBzdXJ2aXZhbCBrYXJ5YXdhbiwgZGFwYXQgZGlsaWhhdCBkYXJpIGhhc2lsIGNvbXBhcmVueWEuDQoNCmBgYHtyfQ0Kc3Vydl9kaWZmIDwtIHN1cnZkaWZmKFN1cnYodGltZSwgZXZlbnQpIH4gT3ZlclRpbWUsIGRhdGEgPSBkYXRhKQ0Kc3Vydl9kaWZmDQpgYGANCg0KRGFyaSBoYXNpbCB0ZXJzZWJ1dCBkYXBhdCBkaWJpbGFuZyBiYWh3YSBPdmVydGltZSBtZW1lbmdhcnVoaSB0ZXJqYWRpbnlhIGVtcGxveWVlIHR1cm5vdmVyIGthcmVuYSBiZXJkYXNhcmthbiB0ZXN0IHRlcnNlYnV0IGRhcGF0IGRpbGloYXQgb3ZlcnRpbWUgbWVtZW5nYXJ1aGkgc2VjYXJhIHNpZ25pZ2lrYW4gZGVuZ2FuIHAgdmFsdWUgbGViaWgga2VjaWwgZGFyaSAwLjA1LiBEYXJpIE9ic2VydmVkIGRhbiBFeHBlY3RlZCBqdWdhIGRhcGF0IGRpbGloYXQgdW50dWsgZ3JvdXAgMSB5YW5nIGxlbWJ1ciwgYW5na2Egb2JzZXJ2ZSBtZWxlYmloaSBla3NwZWt0YXNpIHlhbmcgYmVyYXJ0aSBhbmdrYSB0dXJub3Zlcm55YSB0aW5nZ2kuDQoNCiMgS2VzaW1wdWxhbiBBa2hpcg0KDQpgYGB7cn0NCmRhdGEuZnJhbWUoc3Vic2V0KHNtMSwgdGltZT09MTApKQ0KYGBgDQoNCkRhdGEgYXdhbCB0ZXJkYXBhdCAxNDcwIGRhdGEgZGFuIGtldGlrYSBkaSBsYWt1a2FuIHBlbWJlcnNpaGFuIHRlcnNpc2EgMTQ1NiBkYXRhLiBEYXJpIGRhdGEgdGVyc2VidXQsIGRpYnVhdCB2aXN1YWxpc2FzaSBkYW4gZGlkYXBhdGthbiBhZGEgYmViZXJhcGEgdmFyaWFiZWwgeWFuZyBtZW1lbmdhcnVoaSB0ZXJqYWRpbnlhIEVtcGxveWUgVHVybm92ZXIsIHlhaXR1OiBPdmVydGltZSwgTW9udGhseUluY29tZSwgQnVzaW5lc3NUcmF2ZWwsIEpvYkludm9sdmVtZW50LCBUb3RhbFdvcmtpbmdZZWFycywgWWVhcnNBdENvbXBhbnksIGRhbiBZZWFyc1dpdGhDdXJyTWFuYWdlci4gS2FyZW5hIHBhZGEgcGVuZWxpdGlhbiBpbmkgYmVyZm9rdXMgcGFkYSBPdmVyVGltZSwgbWFrYSBkYXRhIHlhbmcgZGlndW5ha2FuIGFkYWxhaCBZZWFyc0F0Q29tcGFueSBzZWJhZ2FpIHRpbWUsIEF0dHJpdGlvbiBzZWJhZ2FpIGV2ZW50LCBkYW4gT3ZlcnRpbWUgc2ViYWdhaSBHcm91cCB1bnR1ayBwZW1iYW5kaW5nLiANCg0KRGFyaSBoYXNpbCBwZW5lbGl0aWFuLCBkaWRhcGF0a2FuIGJhaHdhIE92ZXJ0aW1lIG1lbWVuZ2FydWhpIHNlY2FyYSBzaWduaWZpa2FuIHRlcmphZGlueWEgRW1wbG95ZWUgVHVybm92ZXIuIFBlbHVhbmcgYmVydGFoYW5ueWEga2FyeWF3YW4gMTAgdGFodW4ga2VkZXBhbiB1bnR1ayBlbXBsb3llZSB5YW5nIG1lbmdhbGFtaSBPdmVydGltZSBhZGFsYWggNTguODMlIGRhbiB5YW5nIHRpZGFrIG1lbmdhbGFtaSBvdmVydGltZSBhZGFsYWggODguMTQlLiBKaWthIGRpbGloYXQgc2VjYXJhIGtlc2VsdXJ1aGFuIHRhbnBhIG1lbXBlcmhpdHVuZ2thbiBvdmVydGltZSwgcGVsdWFuZyBiZXJ0YWhhbiBlbXBsb3llZSB1bnR1ayAxMCB0YWh1biBrZWRlcGFuIGFkYWxhaCA3Ny4zJS4gRGVuZ2FuIGl0dSwgbXVuZ2tpbiBsZWJpaCBiYWlrIGFnYXIgamFtIGtlcmphIGthcnlhd2FuIGRpcGVyaGF0aWthbiBhZ2FyIGRhcGF0IG1lbnVydW5rYW4ga2VtdW5na2luYW4gdHVybm92ZXIgc2VoaW5nZ2EgZGFwYXQgbWVuZ3VyYW5naSBrZXJ1Z2lhbiBwZXJ1c2FoYWFuIGp1Z2EuDQogDQog