데이터의 종류

변수 : var_ // variable
상수 : const_ // constant
값 : data
스페이스 두 번 줄 바꾸기
샵 글자 크기 키우기

var.a <- 1
var.b <- 2
var.a + var.b

함수의 종류

c() 숫자타입의 벡터를 생성
vec.a <- c(1,2,5,7,8)
vec.a
vec.b <- c(1:5)
vec.c <- seq(1,10,by=2)
vec.c
vec.b + vec.c
c() 문자타입의 벡터를 생성
var.a <- c("Hello", "world","is","good!!!")
var.a
[1] "Hello"   "world"   "is"      "good!!!"

scalar

스칼라(영어: scalar 스케일러[*])란 크기와 방향을 가지는 벡터에 대비하는 개념으로, 크기만 있고 방향을 가지지 않는 양을 말한다.
위키백과

vector

벡터(vector)는 방향과 크기의 의미를 모두 포함하는 표현 도구로서 주로 힘이나 자기장, 전기장, 변위 등의 물리적 개념을 설명할 때 이용된다. 위키백과 동일한 패턴.,

dataframe

정형 데이터를 저장하는 장소 벡터가 확장된 개념 > row(case, 대상 하나의 정보)과 column(var.data)로 구성된 표

vec.name <- c("김지훈","이유진","박동현","김민지")
vec.name
vec.eng <- c(90,80,60,70)
vec.eng
vec.math <- c(50,60,100,20)
vec.math
df.score <- data.frame(vec.name, vec.eng, vec.math)
df.score
id <- c(1:6)
class <- c(1,1,1,1,2,2)
math <- c(50,60,45,30,23,50)
english <- c(98,97,86,98,80,89)
science <- c(50,60,78,58,65,98)

df.score <- data.frame(id,class,math,english,science)
df.score

vec.name <- c(“김지훈”,“이유진”,“박동현”,“김민지”) vec.name vec.eng <- c(90,80,60,70) vec.eng vec.math <- c(50,60,100,20) vec.math vec.class <- c(1,1,2,2) vec.class df.score <- data.frame(vec.name, vec.eng, vec.math, vec.class) df.score

id <- c(1:10) class <- c(1,1,1,1,1,2,2,2,2,2) math <- c(50,60,45,30,23,50,30,25,50,50) english <- c(98,97,86,98,80,89,30,25,50,50) science <- c(50,60,78,58,65,98,30,25,50,50)

df.score <- data.frame(id,class,math,english,science) #전체 학생 점수 보기 df.score # n번째 row 까지만 보여주기 head(df.n) 함수 p.101 head(df.score, 8)

밑에서 n번째 row 까지만 보여주기 tail(df.n) 함수 p.102

tail(df.score, 8)

뷰어창에서 df 확인 View(df) *View의 V는 대문자 View(df.score)

df , row count, col count // 디멘션은 쓰지 말고 보통 스트럭쳐 씀

dim(df.score)

str() structure 를 나타내는 함수

str(df.score)

summary() 요약

summary(df.score)

df.score <- difly::rename( df.score, id=uid)

df.score %>% #파이프라인

data.table::setnames(

)

library(dplyr)

df.score %>% data.table::setnames( old = “id”, new = “아이디” ) df.score df.score\(총점 <- df.score\)math + df.score\(english + df.score\)science df.score\(평균 <- df.score\)총점 / 3 df.score

hist(df.score$총점) #p.116

ifelse()

df.score\(합격여부 <- ifelse(df.score\)평균>=50, “합격”, “불합격”)

df.score\(등급 <- ifelse(df.score\)평균>=50, “A”, ifelse(df.score$평균>=30, “B”, “C”))

table()

library(ggplot2) ggplot2::qplot(df.score$합격여부)

package

library(ggplot2) # 이 파일로 불러오는 것 df.mpg <- as.data.frame(ggplot2::mpg)

4함수 :: headm tail, str, summary

head(df.mpg) tail(df.mpg) str(df.mpg) summary(df.mpg)

‘data.frame’: 234 obs. of 11 variables:

$ manufacturer(제조회사): chr “audi” “audi” “audi” “audi” …

$ model(모델) : chr “a4” “a4” “a4” “a4” …

$ displ(배기량) : num 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 …

$ year(생산연도) : int 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 …

$ cyl(실린더 개수) : int 4 4 4 4 6 6 6 4 4 4 …

$ trans(변속기 종류) : chr “auto(l5)” “manual(m5)” “manual(m6)” “auto(av)” …

$ drv(구동 방식) : chr “f” “f” “f” “f” …

$ cty(도시 연비) : int 18 21 20 21 16 18 18 18 16 20 …

$ hwy(고속도로 연비) : int 29 29 31 30 26 26 27 26 25 28 …

$ fl(연료 종류) : chr “p” “p” “p” “p” …

$ class(자동차 종류) : chr “compact” “compact” “compact” “compact” …

> summary(df.mpg)

manufacturer model displ year

Length:234 Length:234 Min. :1.600 Min. :1999

Class :character Class :character 1st Qu.:2.400 1st Qu.:1999

Mode :character Mode :character Median :3.300 Median :2004

Mean :3.472 Mean :2004

3rd Qu.:4.600 3rd Qu.:2008

Max. :7.000 Max. :2008

cyl trans drv cty

Min. :4.000 Length:234 Length:234 Min. : 9.00

1st Qu.:4.000 Class :character Class :character 1st Qu.:14.00

Median :6.000 Mode :character Mode :character Median :17.00

Mean :5.889 Mean :16.86

3rd Qu.:8.000 3rd Qu.:19.00

Max. :8.000 Max. :35.00

hwy fl class

Min. :12.00 Length:234 Length:234

1st Qu.:18.00 Class :character Class :character

Median :24.00 Mode :character Mode :character

Mean :23.44

3rd Qu.:27.00

Max. :44.00

library(ggplot2) midwest <- as.data.frame(ggplot2::midwest)

head(midwest)

library(dplyr) df.midwest %>% data.table::setnames(old = “popasian”, new = “asian”) df.midwest

midwest\(ratio <- midwest\)asian/midwest\(total*100 hist(midwest\)ratio)

mean(midwest$ratio)

midwest\(group <- ifelse(midwest\)ratio > 0.4872462, “large”, “small”)

table(midwest$group)

library(ggplot2) qplot(midwest$group)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIyMjIOuNsOydtO2EsOydmCDsooXrpZgNCuuzgOyImCA6IHZhcl8gLy8gdmFyaWFibGUgIA0K7IOB7IiYIDogY29uc3RfIC8vIGNvbnN0YW50ICANCuqwkiA6IGRhdGEgIA0K7Iqk7Y6Y7J207IqkIOuRkCDrsogg7KSEIOuwlOq+uOq4sCAgDQrsg7Ug6riA7J6QIO2BrOq4sCDtgqTsmrDquLAgIA0KDQpgYGB7cn0NCnZhci5hIDwtIDENCnZhci5iIDwtIDINCnZhci5hICsgdmFyLmINCg0KYGBgDQoNCiMjIyDtlajsiJjsnZgg7KKF66WYDQojIyMjIyBjKCkg7Iir7J6Q7YOA7J6F7J2YIOuyoe2EsOulvCDsg53shLENCg0KYGBge3J9DQp2ZWMuYSA8LSBjKDEsMiw1LDcsOCkNCnZlYy5hDQp2ZWMuYiA8LSBjKDE6NSkNCnZlYy5jIDwtIHNlcSgxLDEwLGJ5PTIpDQp2ZWMuYw0KdmVjLmIgKyB2ZWMuYw0KYGBgDQoNCg0KIyMjIyMgYygpIOusuOyekO2DgOyeheydmCDrsqHthLDrpbwg7IOd7ISxDQpgYGB7cn0NCnZhci5hIDwtIGMoIkhlbGxvIiwid29ybGQiLCJpcyIsImdvb2QhISEiKQ0KdmFyLmENCmBgYA0KDQojIyMjIHNjYWxhciANCj7siqTsubzrnbwo7JiB7Ja0OiBzY2FsYXIg7Iqk7LyA7J2865+sWypdKeuegCDtgazquLDsmYAg67Cp7Zal7J2EIOqwgOyngOuKlCDrsqHthLDsl5Ag64yA67mE7ZWY64qUIOqwnOuFkOycvOuhnCwg7YGs6riw66eMIOyeiOqzoCDrsKntlqXsnYQg6rCA7KeA7KeAIOyViuuKlCDslpHsnYQg66eQ7ZWc64ukLiAgDQpb7JyE7YKk67Cx6rO8XShodHRwczovL2tvLndpa2lwZWRpYS5vcmcvd2lraS8lRUMlOEElQTQlRUMlQjklQkMlRUIlOUQlQkNfKCVFQyU4OCU5OCVFRCU5NSU5OSkpICANCg0KIyMjIyB2ZWN0b3INCj7rsqHthLAodmVjdG9yKeuKlCDrsKntlqXqs7wg7YGs6riw7J2YIOydmOuvuOulvCDrqqjrkZAg7Y+s7ZWo7ZWY64qUIO2RnO2YhCDrj4TqtazroZzshJwg7KO866GcIO2emOydtOuCmCDsnpDquLDsnqUsIOyghOq4sOyepSwg67OA7JyEIOuTseydmCDrrLzrpqzsoIEg6rCc64WQ7J2EIOyEpOuqhe2VoCDrlYwg7J207Jqp65Cc64ukLiANClvsnITtgqTrsLHqs7xdKGh0dHBzOi8va28ud2lraXBlZGlhLm9yZy93aWtpLyVFQiVCMiVBMSVFRCU4NCVCMF8oJUVCJUFDJUJDJUVCJUE2JUFDKSkNCuuPmeydvO2VnCDtjKjthLQuLCANCg0KDQojIyMjIGRhdGFmcmFtZQ0K7KCV7ZiVIOuNsOydtO2EsOulvCDsoIDsnqXtlZjripQg7J6l7IaMDQrrsqHthLDqsIAg7ZmV7J6l65CcIOqwnOuFkA0KPiByb3coY2FzZSwg64yA7IOBIO2VmOuCmOydmCDsoJXrs7Qp6rO8IGNvbHVtbih2YXIuZGF0YSnroZwg6rWs7ISx65CcIO2RnCAgDQogIA0KICANCg0KYGBge3J9DQp2ZWMubmFtZSA8LSBjKCLquYDsp4Dtm4giLCLsnbTsnKDsp4QiLCLrsJXrj5ntmIQiLCLquYDrr7zsp4AiKQ0KdmVjLm5hbWUNCnZlYy5lbmcgPC0gYyg5MCw4MCw2MCw3MCkNCnZlYy5lbmcNCnZlYy5tYXRoIDwtIGMoNTAsNjAsMTAwLDIwKQ0KdmVjLm1hdGgNCmRmLnNjb3JlIDwtIGRhdGEuZnJhbWUodmVjLm5hbWUsIHZlYy5lbmcsIHZlYy5tYXRoKQ0KZGYuc2NvcmUNCmBgYA0KDQoNCmBgYHtyfQ0KaWQgPC0gYygxOjYpDQpjbGFzcyA8LSBjKDEsMSwxLDEsMiwyKQ0KbWF0aCA8LSBjKDUwLDYwLDQ1LDMwLDIzLDUwKQ0KZW5nbGlzaCA8LSBjKDk4LDk3LDg2LDk4LDgwLDg5KQ0Kc2NpZW5jZSA8LSBjKDUwLDYwLDc4LDU4LDY1LDk4KQ0KDQpkZi5zY29yZSA8LSBkYXRhLmZyYW1lKGlkLGNsYXNzLG1hdGgsZW5nbGlzaCxzY2llbmNlKQ0KZGYuc2NvcmUNCmBgYA0KDQoNCg0KdmVjLm5hbWUgPC0gYygi6rmA7KeA7ZuIIiwi7J207Jyg7KeEIiwi67CV64+Z7ZiEIiwi6rmA66+87KeAIikNCnZlYy5uYW1lDQp2ZWMuZW5nIDwtIGMoOTAsODAsNjAsNzApDQp2ZWMuZW5nDQp2ZWMubWF0aCA8LSBjKDUwLDYwLDEwMCwyMCkNCnZlYy5tYXRoDQp2ZWMuY2xhc3MgPC0gYygxLDEsMiwyKQ0KdmVjLmNsYXNzDQpkZi5zY29yZSA8LSBkYXRhLmZyYW1lKHZlYy5uYW1lLCB2ZWMuZW5nLCB2ZWMubWF0aCwgdmVjLmNsYXNzKQ0KZGYuc2NvcmUNCg0KDQppZCA8LSBjKDE6MTApDQpjbGFzcyA8LSBjKDEsMSwxLDEsMSwyLDIsMiwyLDIpDQptYXRoIDwtIGMoNTAsNjAsNDUsMzAsMjMsNTAsMzAsMjUsNTAsNTApDQplbmdsaXNoIDwtIGMoOTgsOTcsODYsOTgsODAsODksMzAsMjUsNTAsNTApDQpzY2llbmNlIDwtIGMoNTAsNjAsNzgsNTgsNjUsOTgsMzAsMjUsNTAsNTApDQoNCmRmLnNjb3JlIDwtIGRhdGEuZnJhbWUoaWQsY2xhc3MsbWF0aCxlbmdsaXNoLHNjaWVuY2UpDQoj7KCE7LK0IO2VmeyDnSDsoJDsiJgg67O06riwDQpkZi5zY29yZQ0KIyBu67KI7Ke4IHJvdyDquYzsp4Drp4wg67O07Jes7KO86riwIGhlYWQoZGYubikg7ZWo7IiYIHAuMTAxDQpoZWFkKGRmLnNjb3JlLCA4KQ0KDQojIOuwkeyXkOyEnCBu67KI7Ke4IHJvdyDquYzsp4Drp4wg67O07Jes7KO86riwIHRhaWwoZGYubikg7ZWo7IiYIHAuMTAyDQp0YWlsKGRmLnNjb3JlLCA4KQ0KDQojIOu3sOyWtOywveyXkOyEnCBkZiDtmZXsnbggVmlldyhkZikgKlZpZXfsnZggVuuKlCDrjIDrrLjsnpANClZpZXcoZGYuc2NvcmUpDQoNCiMgZGYgLCByb3cgY291bnQsIGNvbCBjb3VudCAvLyDrlJTrqZjshZjsnYAg7JOw7KeAIOunkOqzoCDrs7TthrUg7Iqk7Yq465+t7LOQIOyUgA0KZGltKGRmLnNjb3JlKQ0KDQojIHN0cigpIHN0cnVjdHVyZSDrpbwg64KY7YOA64K064qUIO2VqOyImA0Kc3RyKGRmLnNjb3JlKQ0KDQojIHN1bW1hcnkoKSDsmpTslb0NCnN1bW1hcnkoZGYuc2NvcmUpDQoNCg0KIyBkZi5zY29yZSA8LSBkaWZseTo6cmVuYW1lKCBkZi5zY29yZSwgaWQ9dWlkKSAgICANCg0KI2RmLnNjb3JlICU+JSAgI+2MjOydtO2UhOudvOyduA0KIyAgZGF0YS50YWJsZTo6c2V0bmFtZXMoDQogICAgDQojICApDQpsaWJyYXJ5KGRwbHlyKQ0KDQpkZi5zY29yZSAlPiUgDQogIGRhdGEudGFibGU6OnNldG5hbWVzKA0KICAgIG9sZCA9ICJpZCIsDQogICAgbmV3ID0gIuyVhOydtOuUlCINCiAgKQ0KZGYuc2NvcmUNCmRmLnNjb3JlJOy0neygkCA8LSBkZi5zY29yZSRtYXRoICsgZGYuc2NvcmUkZW5nbGlzaCArIGRmLnNjb3JlJHNjaWVuY2UNCmRmLnNjb3JlJO2Pieq3oCA8LSBkZi5zY29yZSTstJ3soJAgLyAzDQpkZi5zY29yZQ0KDQpoaXN0KGRmLnNjb3JlJOy0neygkCkgI3AuMTE2DQoNCiNpZmVsc2UoKQ0KDQpkZi5zY29yZSTtlanqsqnsl6zrtoAgPC0gaWZlbHNlKGRmLnNjb3JlJO2Pieq3oD49NTAsICLtlanqsqkiLCAi67aI7ZWp6rKpIikNCg0KZGYuc2NvcmUk65Ox6riJIDwtIGlmZWxzZShkZi5zY29yZSTtj4nqt6A+PTUwLA0KICAgICAgICAgICAgICAgICAgICAgICJBIiwNCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGYuc2NvcmUk7Y+J6regPj0zMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQyIpKQ0KDQoNCiMgdGFibGUoKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90Mjo6cXBsb3QoZGYuc2NvcmUk7ZWp6rKp7Jes67aAKQ0KDQoNCg0KDQoNCg0KIyBwYWNrYWdlDQpsaWJyYXJ5KGdncGxvdDIpICMg7J20IO2MjOydvOuhnCDrtojrn6zsmKTripQg6rKDIA0KZGYubXBnIDwtIGFzLmRhdGEuZnJhbWUoZ2dwbG90Mjo6bXBnKQ0KDQojIyA07ZWo7IiYIDo6IGhlYWRtIHRhaWwsIHN0ciwgc3VtbWFyeQ0KaGVhZChkZi5tcGcpDQp0YWlsKGRmLm1wZykNCnN0cihkZi5tcGcpDQpzdW1tYXJ5KGRmLm1wZykNCg0KDQojICdkYXRhLmZyYW1lJzoJMjM0IG9icy4gb2YgIDExIHZhcmlhYmxlczoNCiMgICQgbWFudWZhY3R1cmVyKOygnOyhsO2ajOyCrCk6IGNociAgImF1ZGkiICJhdWRpIiAiYXVkaSIgImF1ZGkiIC4uLg0KIyAgJCBtb2RlbCjrqqjrjbgpICAgICAgIDogY2hyICAiYTQiICJhNCIgImE0IiAiYTQiIC4uLg0KIyAgJCBkaXNwbCjrsLDquLDrn4kpICAgICAgIDogbnVtICAxLjggMS44IDIgMiAyLjggMi44IDMuMSAxLjggMS44IDIgLi4uDQojICAkIHllYXIo7IOd7IKw7Jew64+EKSAgICAgICAgOiBpbnQgIDE5OTkgMTk5OSAyMDA4IDIwMDggMTk5OSAxOTk5IDIwMDggMTk5OSAxOTk5IDIwMDggLi4uDQojICAkIGN5bCjsi6TrprDrjZQg6rCc7IiYKSAgICAgICAgIDogaW50ICA0IDQgNCA0IDYgNiA2IDQgNCA0IC4uLg0KIyAgJCB0cmFucyjrs4Dsho3quLAg7KKF66WYKSAgICAgICA6IGNociAgImF1dG8obDUpIiAibWFudWFsKG01KSIgIm1hbnVhbChtNikiICJhdXRvKGF2KSIgLi4uDQojICAkIGRydijqtazrj5kg67Cp7IudKSAgICAgICAgIDogY2hyICAiZiIgImYiICJmIiAiZiIgLi4uDQojICAkIGN0eSjrj4Tsi5wg7Jew67mEKSAgICAgICAgIDogaW50ICAxOCAyMSAyMCAyMSAxNiAxOCAxOCAxOCAxNiAyMCAuLi4NCiMgICQgaHd5KOqzoOyGjeuPhOuhnCDsl7DruYQpICAgICAgICAgOiBpbnQgIDI5IDI5IDMxIDMwIDI2IDI2IDI3IDI2IDI1IDI4IC4uLg0KIyAgJCBmbCjsl7Dro4wg7KKF66WYKSAgICAgICAgICA6IGNociAgInAiICJwIiAicCIgInAiIC4uLg0KIyAgJCBjbGFzcyjsnpDrj5nssKgg7KKF66WYKSAgICAgICA6IGNociAgImNvbXBhY3QiICJjb21wYWN0IiAiY29tcGFjdCIgImNvbXBhY3QiIC4uLg0KDQojID4gc3VtbWFyeShkZi5tcGcpDQojICBtYW51ZmFjdHVyZXIgICAgICAgICAgbW9kZWwgICAgICAgICAgICAgICBkaXNwbCAgICAgICAgICAgIHllYXIgICAgIA0KIyAgTGVuZ3RoOjIzNCAgICAgICAgIExlbmd0aDoyMzQgICAgICAgICBNaW4uICAgOjEuNjAwICAgTWluLiAgIDoxOTk5ICANCiMgIENsYXNzIDpjaGFyYWN0ZXIgICBDbGFzcyA6Y2hhcmFjdGVyICAgMXN0IFF1LjoyLjQwMCAgIDFzdCBRdS46MTk5OSAgDQojICBNb2RlICA6Y2hhcmFjdGVyICAgTW9kZSAgOmNoYXJhY3RlciAgIE1lZGlhbiA6My4zMDAgICBNZWRpYW4gOjIwMDQgIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuICAgOjMuNDcyICAgTWVhbiAgIDoyMDA0ICANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM3JkIFF1Ljo0LjYwMCAgIDNyZCBRdS46MjAwOCAgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heC4gICA6Ny4wMDAgICBNYXguICAgOjIwMDggIA0KIyAgICAgICBjeWwgICAgICAgICAgIHRyYW5zICAgICAgICAgICAgICAgZHJ2ICAgICAgICAgICAgICAgICBjdHkgICAgICAgDQojICBNaW4uICAgOjQuMDAwICAgTGVuZ3RoOjIzNCAgICAgICAgIExlbmd0aDoyMzQgICAgICAgICBNaW4uICAgOiA5LjAwICANCiMgIDFzdCBRdS46NC4wMDAgICBDbGFzcyA6Y2hhcmFjdGVyICAgQ2xhc3MgOmNoYXJhY3RlciAgIDFzdCBRdS46MTQuMDAgIA0KIyAgTWVkaWFuIDo2LjAwMCAgIE1vZGUgIDpjaGFyYWN0ZXIgICBNb2RlICA6Y2hhcmFjdGVyICAgTWVkaWFuIDoxNy4wMCAgDQojICBNZWFuICAgOjUuODg5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuICAgOjE2Ljg2ICANCiMgIDNyZCBRdS46OC4wMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNyZCBRdS46MTkuMDAgIA0KIyAgTWF4LiAgIDo4LjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4LiAgIDozNS4wMCAgDQojICAgICAgIGh3eSAgICAgICAgICAgICBmbCAgICAgICAgICAgICAgIGNsYXNzICAgICAgICAgIA0KIyAgTWluLiAgIDoxMi4wMCAgIExlbmd0aDoyMzQgICAgICAgICBMZW5ndGg6MjM0ICAgICAgICANCiMgIDFzdCBRdS46MTguMDAgICBDbGFzcyA6Y2hhcmFjdGVyICAgQ2xhc3MgOmNoYXJhY3RlciAgDQojICBNZWRpYW4gOjI0LjAwICAgTW9kZSAgOmNoYXJhY3RlciAgIE1vZGUgIDpjaGFyYWN0ZXIgIA0KIyAgTWVhbiAgIDoyMy40NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiMgIDNyZCBRdS46MjcuMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQojICBNYXguICAgOjQ0LjAwICAgICAgICAgICAgICAgICAgICAgICANCg0KDQpsaWJyYXJ5KGdncGxvdDIpDQptaWR3ZXN0IDwtIGFzLmRhdGEuZnJhbWUoZ2dwbG90Mjo6bWlkd2VzdCkNCg0KaGVhZChtaWR3ZXN0KQ0KDQoNCmxpYnJhcnkoZHBseXIpDQpkZi5taWR3ZXN0ICU+JSANCiAgZGF0YS50YWJsZTo6c2V0bmFtZXMob2xkID0gInBvcGFzaWFuIiwgbmV3ID0gImFzaWFuIikNCmRmLm1pZHdlc3QNCg0KbWlkd2VzdCRyYXRpbyA8LSBtaWR3ZXN0JGFzaWFuL21pZHdlc3QkdG90YWwqMTAwDQpoaXN0KG1pZHdlc3QkcmF0aW8pDQoNCm1lYW4obWlkd2VzdCRyYXRpbykNCg0KbWlkd2VzdCRncm91cCA8LSBpZmVsc2UobWlkd2VzdCRyYXRpbyA+IDAuNDg3MjQ2MiwgImxhcmdlIiwgInNtYWxsIikNCg0KDQp0YWJsZShtaWR3ZXN0JGdyb3VwKQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQpxcGxvdChtaWR3ZXN0JGdyb3VwKQ0KDQoNCg0KDQoNCg0K