Pemograman Ilmu Data

Pemograman Dasar

Logo


1 Praktikum 1

1.1 Mengidentifikasi Tipe Data

Menentukan tipe data variabel berikut dalam Python dan R:

a = 42

b = 3.14

c = "Hello"

d = FALSE

e = [1, 2, 3]

f = {"name": "Alice", "age" : 25}

1.1.1 Tipe Data di Python

# Python
a = 42 # Integer
b = 3.14 #Float
c = "Hello" # String
d = False # Boolean
e = [1, 2, 3] # List
f = {"name": "Alice", "age": 25} # Dictionary

# Mengidentifikasi tipe data
print("Tipe data a:", type(a))
## Tipe data a: <class 'int'>
print("Tipe data b:", type(b))
## Tipe data b: <class 'float'>
print("Tipe data c:", type(c))
## Tipe data c: <class 'str'>
print("Tipe data d:", type(d))
## Tipe data d: <class 'bool'>
print("Tipe data e:", type(e))
## Tipe data e: <class 'list'>
print("Tipe data f:", type(f))
## Tipe data f: <class 'dict'>

1.1.2 Tipe Data di R

# R
a <- 42 # Integer
b <- 3.14 # Numeric
c <- "Hello" # Character
d <- FALSE # Logical
e <- c(1, 2, 3) # Vektor
f <- list(name = "Alice", age = 25) # List

print(class(a))  # "integer"
## [1] "numeric"
print(class(b))  # "numeric"
## [1] "numeric"
print(class(c))  # "character"
## [1] "character"
print(class(d))  # "logical"
## [1] "logical"
print(class(e))  # "vektor"
## [1] "numeric"
print(class(f))  # "list"
## [1] "list"

1.2 Variabel dan Manipulasi Data

Membuat variabel berikut dalam Python dan R:

x = 20

y = 5

text1 = "Data"

text2 = "Science"

Kode Python

x = 20
y=5
text1 = "Data"
text2 = "Science"

# menggabungkan text1 dan text2 
combined_text = text1 + " " + text2

# mengubah teks gabungan menjadi huruf besar.
combined_text_uppercase = combined_text.upper()

print (x + 10) # Output 30
## 30
print (combined_text)
## Data Science
print (combined_text_uppercase)
## DATA SCIENCE

Kode R

x <- 20
y <- 5
text1 <- "Data"
text2 <- "Science"

# menggabungkan text1 dan text2 
combined_text <- paste (text1, text2)

# mengubah teks gabungan menjadi huruf besar.
combined_text_uppercase <- toupper(combined_text)

print (x + 10) # Output 30
## [1] 30
print (combined_text)
## [1] "Data Science"
print (combined_text_uppercase)
## [1] "DATA SCIENCE"

1.3 Operasi Aritmatika

Mengingat variabel berikut:

a = 15 

b = 4

Kode Python

a = 15 
b = 4

# menghitung jumlah, selisih,produk,pembagian, dan modulo 

print(a + b)
## 19
print(a - b)
## 11
print(a * b)
## 60
print(a / b)
## 3.75
print(a % b)
## 3
# menghitung a pangkat b
print(a ** b)
## 50625
# membuat variabel baru c 
c = a / b
c = int(c) # mengubah menjadi integer
print(c) 
## 3

Kode R

a <- 15 
b <- 4

# menghitung jumlah, selisih,produk,pembagian, dan modulo 

print(a + b)
## [1] 19
print(a - b)
## [1] 11
print(a * b)
## [1] 60
print(a / b)
## [1] 3.75
print(a %% b)
## [1] 3
# menghitung a pangkat b
print(a ^ b)
## [1] 50625
# membuat variabel baru c 
c <- a / b
c <- as.integer(c) # mengubah menjadi integer
print(c) 
## [1] 3

1.4 Operasi String

Diberikan teks berikut:

text = "Hello, Data Science!"

Kode Pyhton

text = "Hello, Data Science!"

# mengestrak 5 karakter pertama dari teks
print(text[0:5])
## Hello
# menghitung jumlah karakter dalam teks
print(len(text))
## 20
# mengubah teks menjadi huruf kecil
print(text.lower())
## hello, data science!

Kode R

text <- "Hello, Data Science!"

# mengestrak 5 karakter pertama dari teks
print(substr(text, 1, 5))
## [1] "Hello"
# menghitung jumlah karakter dalam teks
print(nchar(text))
## [1] 20
# mengubah teks menjadi huruf kecil
print(tolower(text))
## [1] "hello, data science!"

1.5 Operator Perbandingan dan Logika

Mengingat variabel-variabel berikut:

x = 7

y = 10

Kode Pyhton

x = 7
y = 10

# memeriksa apakah x lebih besar dari y
print(x > y) # False
## False
# memeriksa apakah x kurang dari atau sama dengan y
print(x < y) # True
## True
# memeriksa apakah x tidak sama dengan y
print(x != y) # True
## True
# mengevaluasi ekspresi (x > 5) AND (y < 20)
print((x > 5) and (y < 20)) # True
## True

Kode R

x <- 7
y <- 10

# memeriksa apakah x lebih besar dari y
print(x > y) #FALSE
## [1] FALSE
# memeriksa apakah x kurang dari atau sama dengan y
print(x < y) #TRUE
## [1] TRUE
# memeriksa apakah x tidak sama dengan y
print(x != y) #TRUE
## [1] TRUE
# mengevaluasi ekspresi (x > 5) AND (y < 20)
print((x > 5) & (y < 20)) #TRUE
## [1] TRUE

1.6 Konfersi Tipe Data

Mengingat variabel-variabel berikut:

num_str = "123"

num_float = 45.67

Kode Pyhton

num_str = "123"
num_float = 45.67

# mengubah num_str ke bilangan bulat dan tambahkan 10
num_str = "123"
num = int(num_str)
print(num + 10)
## 133
# mengubah num_float ke bilangan bulat
num_int = int(num_float)
print(num_int)
## 45
# mengonversi num_float kembali menjadi string
num_str = str(num_float)
print(num_str)
## 45.67

Kode R

num_str <- "123"
num_float <- 45.67

# mengubah num_str ke bilangan bulat dan tambahkan 10
num_str <- "123"
num <- as.integer(num_str) 
print(num + 10)
## [1] 133
# mengubah num_float ke bilangan bulat
num_int <- as.integer(num_float)
print(num_int)
## [1] 45
# mengonversi num_float kembali menjadi string

num_str <- as.character(num_float)
print(num_str)
## [1] "45.67"

1.7 Tantangan Bonus

Membuat program interaktif yang meminta pengguna untuk memasukkan:

  1. Nama

  2. Usia

  3. Kota kelahiran

Kemudian, cetak output sebagai berikut:

"Hello [Name], you are [Age] years old and from [Hometown]."

Kode Pyhton

https://colab.research.google.com/drive/1uPkD_aXIZvjYCVWQZGTrpr5gXiTq14Q7?usp=sharing

Kode R

# Meminta input dari pengguna
name <- readline("Masukkan nama anda: ")
## Masukkan nama anda:
age <- readline("Masukkan usia anda: ")
## Masukkan usia anda:
hometown <- readline(": ")
## :
# Menampilkan output
cat("Hello", name, ", you are", age, "years old and from", hometown,".\n")
## Hello  , you are  years old and from  .

Keterangan: Pada kode r dapat dijalankan dan memasukkan data dari console.

LS0tDQp0aXRsZTogIlBlbW9ncmFtYW4gSWxtdSBEYXRhIg0Kc3VidGl0bGU6ICJQZW1vZ3JhbWFuIERhc2FyIg0KYXV0aG9yOiANCiAgLSAiRHdpIFNyaSBZYW50aSBNYW51bGxhbmciDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogIkM6L1VzZXJzL0R3aSBNYW51bGxhbmcvRG93bmxvYWRzL3N0eWxlLmNzcyINCi0tLQ0KPGltZyBpZD0ibG9nby11dGFtYSIgc3JjPSJDOi9Vc2Vycy9Ed2kgTWFudWxsYW5nL0Rvd25sb2Fkcy9Gb3RvLmpwZWciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCi0tLQ0KDQojICoqUHJha3Rpa3VtIDEqKg0KDQojIyBNZW5naWRlbnRpZmlrYXNpIFRpcGUgRGF0YQ0KDQpNZW5lbnR1a2FuIHRpcGUgZGF0YSB2YXJpYWJlbCBiZXJpa3V0IGRhbGFtIFB5dGhvbiBkYW4gUjoNCg0KYGBgDQphID0gNDINCg0KYiA9IDMuMTQNCg0KYyA9ICJIZWxsbyINCg0KZCA9IEZBTFNFDQoNCmUgPSBbMSwgMiwgM10NCg0KZiA9IHsibmFtZSI6ICJBbGljZSIsICJhZ2UiIDogMjV9DQpgYGANCg0KIyMjIFRpcGUgRGF0YSBkaSBQeXRob24NCmBgYHtweXRob259DQojIFB5dGhvbg0KYSA9IDQyICMgSW50ZWdlcg0KYiA9IDMuMTQgI0Zsb2F0DQpjID0gIkhlbGxvIiAjIFN0cmluZw0KZCA9IEZhbHNlICMgQm9vbGVhbg0KZSA9IFsxLCAyLCAzXSAjIExpc3QNCmYgPSB7Im5hbWUiOiAiQWxpY2UiLCAiYWdlIjogMjV9ICMgRGljdGlvbmFyeQ0KDQojIE1lbmdpZGVudGlmaWthc2kgdGlwZSBkYXRhDQpwcmludCgiVGlwZSBkYXRhIGE6IiwgdHlwZShhKSkNCnByaW50KCJUaXBlIGRhdGEgYjoiLCB0eXBlKGIpKQ0KcHJpbnQoIlRpcGUgZGF0YSBjOiIsIHR5cGUoYykpDQpwcmludCgiVGlwZSBkYXRhIGQ6IiwgdHlwZShkKSkNCnByaW50KCJUaXBlIGRhdGEgZToiLCB0eXBlKGUpKQ0KcHJpbnQoIlRpcGUgZGF0YSBmOiIsIHR5cGUoZikpDQpgYGANCiMjIyBUaXBlIERhdGEgZGkgUg0KDQpgYGB7ciwgIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBlY2hvPVRSVUV9DQojIFINCmEgPC0gNDIgIyBJbnRlZ2VyDQpiIDwtIDMuMTQgIyBOdW1lcmljDQpjIDwtICJIZWxsbyIgIyBDaGFyYWN0ZXINCmQgPC0gRkFMU0UgIyBMb2dpY2FsDQplIDwtIGMoMSwgMiwgMykgIyBWZWt0b3INCmYgPC0gbGlzdChuYW1lID0gIkFsaWNlIiwgYWdlID0gMjUpICMgTGlzdA0KDQpwcmludChjbGFzcyhhKSkgICMgImludGVnZXIiDQpwcmludChjbGFzcyhiKSkgICMgIm51bWVyaWMiDQpwcmludChjbGFzcyhjKSkgICMgImNoYXJhY3RlciINCnByaW50KGNsYXNzKGQpKSAgIyAibG9naWNhbCINCnByaW50KGNsYXNzKGUpKSAgIyAidmVrdG9yIg0KcHJpbnQoY2xhc3MoZikpICAjICJsaXN0Ig0KYGBgDQoNCiMjIFZhcmlhYmVsIGRhbiBNYW5pcHVsYXNpIERhdGENCg0KTWVtYnVhdCB2YXJpYWJlbCBiZXJpa3V0IGRhbGFtIFB5dGhvbiBkYW4gUjoNCg0KYGBgDQp4ID0gMjANCg0KeSA9IDUNCg0KdGV4dDEgPSAiRGF0YSINCg0KdGV4dDIgPSAiU2NpZW5jZSINCmBgYA0KDQpLb2RlIFB5dGhvbg0KYGBge3B5dGhvbn0NCnggPSAyMA0KeT01DQp0ZXh0MSA9ICJEYXRhIg0KdGV4dDIgPSAiU2NpZW5jZSINCg0KIyBtZW5nZ2FidW5na2FuIHRleHQxIGRhbiB0ZXh0MiANCmNvbWJpbmVkX3RleHQgPSB0ZXh0MSArICIgIiArIHRleHQyDQoNCiMgbWVuZ3ViYWggdGVrcyBnYWJ1bmdhbiBtZW5qYWRpIGh1cnVmIGJlc2FyLg0KY29tYmluZWRfdGV4dF91cHBlcmNhc2UgPSBjb21iaW5lZF90ZXh0LnVwcGVyKCkNCg0KcHJpbnQgKHggKyAxMCkgIyBPdXRwdXQgMzANCnByaW50IChjb21iaW5lZF90ZXh0KQ0KcHJpbnQgKGNvbWJpbmVkX3RleHRfdXBwZXJjYXNlKQ0KYGBgDQoNCg0KS29kZSBSDQpgYGB7ciwgIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBlY2hvPVRSVUV9DQp4IDwtIDIwDQp5IDwtIDUNCnRleHQxIDwtICJEYXRhIg0KdGV4dDIgPC0gIlNjaWVuY2UiDQoNCiMgbWVuZ2dhYnVuZ2thbiB0ZXh0MSBkYW4gdGV4dDIgDQpjb21iaW5lZF90ZXh0IDwtIHBhc3RlICh0ZXh0MSwgdGV4dDIpDQoNCiMgbWVuZ3ViYWggdGVrcyBnYWJ1bmdhbiBtZW5qYWRpIGh1cnVmIGJlc2FyLg0KY29tYmluZWRfdGV4dF91cHBlcmNhc2UgPC0gdG91cHBlcihjb21iaW5lZF90ZXh0KQ0KDQpwcmludCAoeCArIDEwKSAjIE91dHB1dCAzMA0KcHJpbnQgKGNvbWJpbmVkX3RleHQpDQpwcmludCAoY29tYmluZWRfdGV4dF91cHBlcmNhc2UpDQpgYGANCg0KIyMgT3BlcmFzaSBBcml0bWF0aWthDQoNCk1lbmdpbmdhdCB2YXJpYWJlbCBiZXJpa3V0Og0KDQpgYGANCmEgPSAxNSANCg0KYiA9IDQNCmBgYA0KDQpLb2RlIFB5dGhvbg0KYGBge3B5dGhvbn0NCmEgPSAxNSANCmIgPSA0DQoNCiMgbWVuZ2hpdHVuZyBqdW1sYWgsIHNlbGlzaWgscHJvZHVrLHBlbWJhZ2lhbiwgZGFuIG1vZHVsbyANCg0KcHJpbnQoYSArIGIpDQpwcmludChhIC0gYikNCnByaW50KGEgKiBiKQ0KcHJpbnQoYSAvIGIpDQpwcmludChhICUgYikNCg0KIyBtZW5naGl0dW5nIGEgcGFuZ2thdCBiDQpwcmludChhICoqIGIpDQoNCiMgbWVtYnVhdCB2YXJpYWJlbCBiYXJ1IGMgDQpjID0gYSAvIGINCmMgPSBpbnQoYykgIyBtZW5ndWJhaCBtZW5qYWRpIGludGVnZXINCnByaW50KGMpIA0KDQoNCmBgYA0KDQpLb2RlIFINCmBgYHtyLCAgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCmEgPC0gMTUgDQpiIDwtIDQNCg0KIyBtZW5naGl0dW5nIGp1bWxhaCwgc2VsaXNpaCxwcm9kdWsscGVtYmFnaWFuLCBkYW4gbW9kdWxvIA0KDQpwcmludChhICsgYikNCnByaW50KGEgLSBiKQ0KcHJpbnQoYSAqIGIpDQpwcmludChhIC8gYikNCnByaW50KGEgJSUgYikNCg0KIyBtZW5naGl0dW5nIGEgcGFuZ2thdCBiDQpwcmludChhIF4gYikNCg0KIyBtZW1idWF0IHZhcmlhYmVsIGJhcnUgYyANCmMgPC0gYSAvIGINCmMgPC0gYXMuaW50ZWdlcihjKSAjIG1lbmd1YmFoIG1lbmphZGkgaW50ZWdlcg0KcHJpbnQoYykgDQoNCmBgYA0KIyMgT3BlcmFzaSBTdHJpbmcNCg0KRGliZXJpa2FuIHRla3MgYmVyaWt1dDoNCg0KYGBgDQp0ZXh0ID0gIkhlbGxvLCBEYXRhIFNjaWVuY2UhIg0KYGBgDQoNCktvZGUgUHlodG9uDQpgYGB7cHl0aG9ufQ0KdGV4dCA9ICJIZWxsbywgRGF0YSBTY2llbmNlISINCg0KIyBtZW5nZXN0cmFrIDUga2FyYWt0ZXIgcGVydGFtYSBkYXJpIHRla3MNCnByaW50KHRleHRbMDo1XSkNCg0KIyBtZW5naGl0dW5nIGp1bWxhaCBrYXJha3RlciBkYWxhbSB0ZWtzDQpwcmludChsZW4odGV4dCkpDQoNCiMgbWVuZ3ViYWggdGVrcyBtZW5qYWRpIGh1cnVmIGtlY2lsDQpwcmludCh0ZXh0Lmxvd2VyKCkpDQoNCmBgYA0KDQoNCktvZGUgUg0KYGBge3IsICBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRSwgZWNobz1UUlVFfQ0KdGV4dCA8LSAiSGVsbG8sIERhdGEgU2NpZW5jZSEiDQoNCiMgbWVuZ2VzdHJhayA1IGthcmFrdGVyIHBlcnRhbWEgZGFyaSB0ZWtzDQpwcmludChzdWJzdHIodGV4dCwgMSwgNSkpDQoNCiMgbWVuZ2hpdHVuZyBqdW1sYWgga2FyYWt0ZXIgZGFsYW0gdGVrcw0KcHJpbnQobmNoYXIodGV4dCkpDQoNCiMgbWVuZ3ViYWggdGVrcyBtZW5qYWRpIGh1cnVmIGtlY2lsDQpwcmludCh0b2xvd2VyKHRleHQpKQ0KYGBgDQoNCiMjIE9wZXJhdG9yIFBlcmJhbmRpbmdhbiBkYW4gTG9naWthDQoNCk1lbmdpbmdhdCB2YXJpYWJlbC12YXJpYWJlbCBiZXJpa3V0Og0KDQpgYGANCnggPSA3DQoNCnkgPSAxMA0KYGBgDQoNCktvZGUgUHlodG9uDQpgYGB7cHl0aG9ufQ0KeCA9IDcNCnkgPSAxMA0KDQojIG1lbWVyaWtzYSBhcGFrYWggeCBsZWJpaCBiZXNhciBkYXJpIHkNCnByaW50KHggPiB5KSAjIEZhbHNlDQoNCiMgbWVtZXJpa3NhIGFwYWthaCB4IGt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4geQ0KcHJpbnQoeCA8IHkpICMgVHJ1ZQ0KDQojIG1lbWVyaWtzYSBhcGFrYWggeCB0aWRhayBzYW1hIGRlbmdhbiB5DQpwcmludCh4ICE9IHkpICMgVHJ1ZQ0KDQojIG1lbmdldmFsdWFzaSBla3NwcmVzaSAoeCA+IDUpIEFORCAoeSA8IDIwKQ0KcHJpbnQoKHggPiA1KSBhbmQgKHkgPCAyMCkpICMgVHJ1ZQ0KDQpgYGANCg0KDQpLb2RlIFINCmBgYHtyLCAgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCnggPC0gNw0KeSA8LSAxMA0KDQojIG1lbWVyaWtzYSBhcGFrYWggeCBsZWJpaCBiZXNhciBkYXJpIHkNCnByaW50KHggPiB5KSAjRkFMU0UNCg0KIyBtZW1lcmlrc2EgYXBha2FoIHgga3VyYW5nIGRhcmkgYXRhdSBzYW1hIGRlbmdhbiB5DQpwcmludCh4IDwgeSkgI1RSVUUNCg0KIyBtZW1lcmlrc2EgYXBha2FoIHggdGlkYWsgc2FtYSBkZW5nYW4geQ0KcHJpbnQoeCAhPSB5KSAjVFJVRQ0KDQojIG1lbmdldmFsdWFzaSBla3NwcmVzaSAoeCA+IDUpIEFORCAoeSA8IDIwKQ0KcHJpbnQoKHggPiA1KSAmICh5IDwgMjApKSAjVFJVRQ0KYGBgDQoNCiMjIEtvbmZlcnNpIFRpcGUgRGF0YQ0KDQpNZW5naW5nYXQgdmFyaWFiZWwtdmFyaWFiZWwgYmVyaWt1dDoNCg0KYGBgDQpudW1fc3RyID0gIjEyMyINCg0KbnVtX2Zsb2F0ID0gNDUuNjcNCmBgYA0KDQpLb2RlIFB5aHRvbg0KYGBge3B5dGhvbn0NCm51bV9zdHIgPSAiMTIzIg0KbnVtX2Zsb2F0ID0gNDUuNjcNCg0KIyBtZW5ndWJhaCBudW1fc3RyIGtlIGJpbGFuZ2FuIGJ1bGF0IGRhbiB0YW1iYWhrYW4gMTANCm51bV9zdHIgPSAiMTIzIg0KbnVtID0gaW50KG51bV9zdHIpDQpwcmludChudW0gKyAxMCkNCg0KIyBtZW5ndWJhaCBudW1fZmxvYXQga2UgYmlsYW5nYW4gYnVsYXQNCm51bV9pbnQgPSBpbnQobnVtX2Zsb2F0KQ0KcHJpbnQobnVtX2ludCkNCg0KIyBtZW5nb252ZXJzaSBudW1fZmxvYXQga2VtYmFsaSBtZW5qYWRpIHN0cmluZw0KbnVtX3N0ciA9IHN0cihudW1fZmxvYXQpDQpwcmludChudW1fc3RyKQ0KDQpgYGANCg0KDQpLb2RlIFINCmBgYHtyLCAgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCm51bV9zdHIgPC0gIjEyMyINCm51bV9mbG9hdCA8LSA0NS42Nw0KDQojIG1lbmd1YmFoIG51bV9zdHIga2UgYmlsYW5nYW4gYnVsYXQgZGFuIHRhbWJhaGthbiAxMA0KbnVtX3N0ciA8LSAiMTIzIg0KbnVtIDwtIGFzLmludGVnZXIobnVtX3N0cikgDQpwcmludChudW0gKyAxMCkNCg0KIyBtZW5ndWJhaCBudW1fZmxvYXQga2UgYmlsYW5nYW4gYnVsYXQNCm51bV9pbnQgPC0gYXMuaW50ZWdlcihudW1fZmxvYXQpDQpwcmludChudW1faW50KQ0KDQojIG1lbmdvbnZlcnNpIG51bV9mbG9hdCBrZW1iYWxpIG1lbmphZGkgc3RyaW5nDQoNCm51bV9zdHIgPC0gYXMuY2hhcmFjdGVyKG51bV9mbG9hdCkNCnByaW50KG51bV9zdHIpDQpgYGANCiMjIFRhbnRhbmdhbiBCb251cw0KDQpNZW1idWF0IHByb2dyYW0gaW50ZXJha3RpZiB5YW5nIG1lbWludGEgcGVuZ2d1bmEgdW50dWsgbWVtYXN1a2thbjoNCg0KMS4gTmFtYQ0KDQoyLiBVc2lhDQoNCjMuIEtvdGEga2VsYWhpcmFuDQoNCktlbXVkaWFuLCBjZXRhayBvdXRwdXQgc2ViYWdhaSBiZXJpa3V0Og0KDQpgYGANCiJIZWxsbyBbTmFtZV0sIHlvdSBhcmUgW0FnZV0geWVhcnMgb2xkIGFuZCBmcm9tIFtIb21ldG93bl0uIg0KYGBgDQoNCktvZGUgUHlodG9uDQoNCmh0dHBzOi8vY29sYWIucmVzZWFyY2guZ29vZ2xlLmNvbS9kcml2ZS8xdVBrRF9hWEladmpZQ1ZXUVpHVHJwcjVnWGlUcTE0UTc/dXNwPXNoYXJpbmcNCg0KDQpLb2RlIFINCmBgYHtyLCAgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCiMgTWVtaW50YSBpbnB1dCBkYXJpIHBlbmdndW5hDQpuYW1lIDwtIHJlYWRsaW5lKCJNYXN1a2thbiBuYW1hIGFuZGE6ICIpDQphZ2UgPC0gcmVhZGxpbmUoIk1hc3Vra2FuIHVzaWEgYW5kYTogIikNCmhvbWV0b3duIDwtIHJlYWRsaW5lKCI6ICIpDQoNCiMgTWVuYW1waWxrYW4gb3V0cHV0DQpjYXQoIkhlbGxvIiwgbmFtZSwgIiwgeW91IGFyZSIsIGFnZSwgInllYXJzIG9sZCBhbmQgZnJvbSIsIGhvbWV0b3duLCIuXG4iKQ0KDQpgYGANCioqS2V0ZXJhbmdhbjoqKg0KUGFkYSBrb2RlIHIgZGFwYXQgZGlqYWxhbmthbiBkYW4gbWVtYXN1a2thbiBkYXRhIGRhcmkgY29uc29sZS4NCg0KDQojIFJlZmVyZW5zaQ0KDQpodHRwczovL2Jvb2tkb3duLm9yZy9kc2NpZW5jZWxhYnMvZGF0YV9zY2llbmNlX3Byb2dyYW1taW5nLzAxLUJhc2ljLVByb2dyYW1taW5nLmh0bWwjcHJhY3RpY3VtDQoNCmh0dHBzOi8vY29sYWIucmVzZWFyY2guZ29vZ2xlLmNvbS9kcml2ZS8xdVBrRF9hWEladmpZQ1ZXUVpHVHJwcjVnWGlUcTE0UTc/dXNwPXNoYXJpbmc=