4.5 R을 이용한 군집분석 사례(1)


자료 4.1에는 미국에서 판매되고 있는 20개 맥주 브랜드를 대상으로 칼로리량, 염분량, 알코올농도, 가격 등을 측정한 자료가 주어져 있다. 군집분석에서는 변숫값들을 이용하여 각 관찰치 사이의 거리 또는 유사성을 측정하게 되는데 이 경우 각 변수의 관측단위가 다르기 때문에 발생되는 영향력을 없애기 위하여 4.2절에서 설명한 바와 같이 각 변수를 표준화하여 이용한다. 이 자료를 이용하여 R을 이용한 계층적 군집분석과 K-평균 군집분석을 실시하는 과정과 분석결과를 살펴보자.


4.5.1 계층적 군집분석 실행하기


(1) 데이터 읽기


<R 4.1> 데이터 파일 읽기
summary(beer)
    calories         sodium         alcohol          cost       
 Min.   : 68.0   Min.   : 6.00   Min.   :2.30   Min.   :0.2800  
 1st Qu.:110.2   1st Qu.: 9.50   1st Qu.:4.20   1st Qu.:0.4300  
 Median :144.0   Median :15.00   Median :4.65   Median :0.4400  
 Mean   :132.4   Mean   :14.95   Mean   :4.44   Mean   :0.4965  
 3rd Qu.:150.2   3rd Qu.:19.00   3rd Qu.:4.90   3rd Qu.:0.4850  
 Max.   :175.0   Max.   :27.00   Max.   :5.50   Max.   :0.7900  


  • “header = T”는 데이터의 첫 번째 행은 컬럼의 명칭이라는 뜻이다.
  • “row.names = 1”은 행별 명칭은 첫 번째 열에 있는 값이라는 의미. 그 결과 각 행의 명칭은 맥주 이름으로 인식되었다.


  • (2) 자료를 표준화하기


    4.2.2항에서 언급한 바와 같이 군집분석을 하기 전에 표준화를 수행한 후 군집분석을 수행하는 것이 더 바람직한 경우가 많다. 그 이유는 군집분석에서는 거리 혹은 유사도함수를 사용하는데 그러한 함수는 변수의 단위에 의해 영향을 받기 때문이다.


    표준화를 수행하는 명령어는 <R 4.2>와 같다. 여기서 표준화를 위하여 “scale()” 명령어를 사용하였다. 표준화의 효과를 확인하기 위해 평균과 표준편차를 계산해 본 결과 평균은 0이고 표준편차는 1이 나오므로 표준화는 잘 진행되었다. 표준화된 데이터프레임은 ’zbeer’라는 이름으로 저장되었다.


    <R 4.2> 표준화 절차
    round(apply(zbeer, 2, mean), 3)
    
    calories   sodium  alcohol     cost 
           0        0        0        0 
    round(apply(zbeer, 2, sd), 3)
    
    calories   sodium  alcohol     cost 
           1        1        1        1 


    (3) 거리행렬 계산하기


    계층적 군집분석을 수행하기 위해서는 관찰치 간 거리의 계산이 필수적이다. 만약 관찰치의 총 수가 N명이라면, 거리행렬은 N * N 크기가 될 것이다. 거리행렬을 계산하는 절차는 <R 4.3>과 같다. 여기서 거리행렬을 계산하는 명령어는 “dist()”이다. 이 명령어의 인수로 거리함수를 지정해 줄 수 있는데, “euclidean”은 디폴트 인수이고, 그 외에도 “manhattan”, “minkowski” 등이 있다.


    <R 4.3> 거리행렬 계산 절차
    zbeer_euc[1]
    
    [1] 0.7015818
    zbeer_man[1]
    
    [1] 1.102367


    4.2.2 항에서 맥주 데이터를 예시로 하여 유클리디안 거리와 맨해튼 거리를 계산하였는데 첫 번째 쌍인 ‘BUDWEISER’와 ’SCHLITZ’ 맥주 사이의 유클라디안 거리와 맨해튼 거리는 각각 0.7016과 1.1024로 4.2.2항의 결과와 일치한다.


    (4) 계층적 군집분석 실행하기 - 최단연결법


    먼저 최단연결법을 이용하여 계층적 군집분석을 수행해 보기로 한다. 거리행렬은 유클리디안 거리를 사용하였다. 결과는 <R 4.4>와 같다.


    <R 4.4> 계층적 군집분석 실행 - 최단연결법
    hc_s
    
    
    Call:
    hclust(d = zbeer_euc, method = "single")
    
    Cluster method   : single 
    Distance         : euclidean 
    Number of objects: 20 


  • <R 4.4>에서 “hclust” 명령어는 계층적 군집분석을 수행한다.
  • “method = single”은 최단연결법을 이용한다는 옵션이다. 만약 “중심연결법”을 사용하고자 하면 “method = centroid”를 사용. 이외에도 “complete”, “average”, “ward.D” 등의 사용이 가능하다.
  • “plot()”는 계층적 군집분석의 결과를 그림으로 나타내는 덴드로그램을 그릴 수 있다.
  • “plot(hc_s, hang = -1)”에서 “hang = -1”이라는 명령을 사용하면 덴드로그램 내 관찰치의 이름이 정렬되어 보기에 좋다. 최단연결법에 의한 덴드로그램은 다음과 같다.



  • (5) 계층적 군집분석 실행하기 - 최장연결법


    만약 최단연결법이 아닌 최장연결법을 사용하게 되면 다음과 같은 덴드로그램을 구할 수 있다. “method = ‘complete’”라는 옵션을 사용한다. 위의 최단연결법의 결과와 상당한 차이가 있음을 알 수 있다.


    <R 4.5> 계층적 군집분석 실행 - 최장연결법
    hc_c
    
    
    Call:
    hclust(d = zbeer_euc, method = "complete")
    
    Cluster method   : complete 
    Distance         : euclidean 
    Number of objects: 20 


    (6) 계층적 군집분석 실행 - 중심연결법


    <R 4.6>은 중심연결법을 사용한 계층적 군집분석의 R 코드와 결과이다. 그 아래 그림은 중심연결법에 의한 덴드로그램이다.


    <R 4.6> 계층적 군집분석 실행 - 중심연결법
    hc_cen
    
    
    Call:
    hclust(d = zbeer_euc, method = "centroid")
    
    Cluster method   : centroid 
    Distance         : euclidean 
    Number of objects: 20 


    (7) 계층적 군집분석 실행 - 와드의 방법


    와드의 방법을 사용하여 계층적 군집분석을 수행하는 명령은 <R 4.7>과 같다.


    <R 4.7> 계층적 군집분석 실행 - 와드의 방법
    hc_w
    
    
    Call:
    hclust(d = zbeer_euc, method = "ward.D")
    
    Cluster method   : ward.D 
    Distance         : euclidean 
    Number of objects: 20 


    (8) 소속 군집 알기


  • 계층적 군집분석을 한 후 군집 수를 정하고, 소속 군집을 알기 위해서는 계층적 군집분석의 덴드로그램을 이용하면 된다.
  • 각 개체에 소속 군집 id를 할당하려면 “cutree()” 함수를 이용한다.

    <R 4.8>은 중심연결법을 이용한 계층적 군집분석 결과에서 군집 수를 2~4개로 하였을 때의 소속 군집을 할당하는 내용이다. 예를 들어
  • 군집의 수를 2개로 하는 경우에는 (PABST EXTRA LIGHT, OLYMPIA GOLD LIGHT) (나머지)로 군집을 정하고,
  • 군집의 수를 3개로 하는 경우에는 (PABST EXTRA LIGHT, OLYMPIA GOLD LIGHT), (KRONENBOURG, HEINEKEN, BECKS, KIRIN), (나머지)로 나눈다.
  • 덴드로그램의 결과와 비교해 보자.


  • <R 4.8> 소속 군집 알기
    hc_cen24 <- cutree(hc_cen, 2:4)
    hc_cen24
                          2 3 4
    BUDWEISER             1 1 1
    SCHLITZ               1 1 1
    LOWENBRAU             1 1 1
    KRONENBOURG           1 2 2
    HEINEKEN              1 2 2
    OLD MILWAUKEE         1 1 1
    AUGSBERGER            1 1 1
    STROHS BOHEMIAN STYLE 1 1 1
    MILLER LITE           1 1 1
    BUDWEISER LIGHT       1 1 1
    COORS                 1 1 1
    COORS LIGHT           1 1 1
    MICHELOB LIGHT        1 1 1
    BECKS                 1 2 2
    KIRIN                 1 2 2
    PABST EXTRA LIGHT     2 3 3
    HAMMS                 1 1 1
    HEILEMANS OLD STYLE   1 1 1
    OLYMPIA GOLD LIGHT    2 3 4
    SCHLITZ LIGHT         1 1 1



    4.5.2 K-평균 군집분석 실행


    (1) K-평균 군집분석


    앞에서 읽어들인 zbeer 자료를 이용해 K-평균 군집분석을 수행해 보자. 표준화를 수행한 후 군집의 개수가 K=2인 K-평균 군집분석을 수행하는 절차는 <R 4.9>와 같다. K-평균 군집분석 결과에서는 각 변수별 최종 군집의 중심값 및 각 관찰치별 소속 군집분석의 결과를 보여준다.


    <R 4.9> K-평균 군집분석
    kmc <- kmeans(zbeer, centers = 2)
    kmc
    K-means clustering with 2 clusters of sizes 14, 6
    
    Cluster means:
        calories     sodium    alcohol       cost
    1  0.5745921  0.3114899  0.4832236  0.1684391
    2 -1.3407148 -0.7268097 -1.1275218 -0.3930246
    
    Clustering vector:
                BUDWEISER               SCHLITZ             LOWENBRAU           KRONENBOURG              HEINEKEN         OLD MILWAUKEE            AUGSBERGER 
                        1                     1                     1                     1                     1                     1                     1 
    STROHS BOHEMIAN STYLE           MILLER LITE       BUDWEISER LIGHT                 COORS           COORS LIGHT       MICHELOB LIGHT                  BECKS 
                        1                     2                     2                     1                     2                     1                     1 
                    KIRIN     PABST EXTRA LIGHT                HAMMS    HEILEMANS OLD STYLE    OLYMPIA GOLD LIGHT         SCHLITZ LIGHT 
                        1                     2                     1                     1                     2                     2 
    
    Within cluster sum of squares by cluster:
    [1] 34.328491  9.515432
     (between_SS / total_SS =  42.3 %)
    
    Available components:
    
    [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"         "iter"         "ifault"      


    (2) 소속 군집 산점도


    K-평균 군집분석에서 생성된 군집 데이터를 그림으로 나타내기 위한 절차는 <R 4.10>과 같다.

  • “kmc$cluster”는 군집의 번호를 의미
  • “pch = 16”은 산점도의 점을 생상으로 채우는 옵션


  • <R 4.10> 소속 군집 산점도


  • 위의 그림은 “zbeer” 데이터프레임의 처음 2개 변수인 “CALORIES”와 “SODIUM”을 이용한 산점도이다.
  • 하지만 “zbeer”에는 총 4개의 변수가 있으므로, 이를 모두 그림으로 그리려면 <R 4.11>과 같은 명령어를 사용한다.
  • <R 4.11>에서 “cex.labels = 1.5”는 대각선에 출력되는 변수명의 크기 조절 옵션이다.
  • 모든 산점도에서 군집 1과 군집 2의 구분이 명확함을 확인할 수 있다.


  • <R 4.11> K-평균 군집 데이터의 모든 변수를 그리기


    계층적 군집분석과 K-평균 군집분석을 실시한 결과 두 가지 분석결과가 매우 다름을 알 수 있다. 즉, K-평균 군집분석에서 K=2로 하였을 때의 군집분석 결과와 계층적 군집분석에서 군집의 개수를 2로 한 결과가 서로 다른 것을 알 수 있다. 구체적으로 계층적 군집분석 방법에서는 군집에 속한 관찰치 수가 18개와 2개로 나누어지는 데 비해 K-평균 군집분석방법에서는 14개와 6개로 나누어짐을 알 수 있다.


    이와 같이 군집분석에서는 방법에 따라 다른 형태의 군집이 만들어진다. 또한 계층적 군집분석 내에서도 4.3.4항에서 본 바와 같이 연결방법에 따라 결과가 다르게 나온다. 따라서 군집분석을 실시하고자 하는 경우에는 주어진 자료에 가장 적합한 방법을 찾아서 분석을 실시하여야 하고 4.3.5항과 4.4.3항에 언급하였드스이 군집분석의 결과의 검증에 주의하여야 한다.




    LS0tCnRpdGxlOiAiW+uLpOuzgOufieu2hOyEnV0gY2hhcHRlciA0LiDqtbDsp5HrtoTshJ0iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KPGJyPgo8aHI+Cjxicj4KCiMjIyA0LjUgUuydhCDsnbTsmqntlZwg6rWw7KeR67aE7ISdIOyCrOuhgCgxKQoKPGJyPgrsnpDro4wgNC4x7JeQ64qUIOuvuOq1reyXkOyEnCDtjJDrp6TrkJjqs6Ag7J6I64qUIDIw6rCcIOunpeyjvCDruIzrnpzrk5zrpbwg64yA7IOB7Jy866GcIOy5vOuhnOumrOufiSwg7Je867aE65+JLCDslYzsvZTsmKzrho3rj4QsIOqwgOqyqSDrk7HsnYQg7Lih7KCV7ZWcIOyekOujjOqwgCDso7zslrTsoLgg7J6I64ukLiDqtbDsp5HrtoTshJ3sl5DshJzripQg67OA7Iir6rCS65Ok7J2EIOydtOyaqe2VmOyXrCDqsIEg6rSA7LCw7LmYIOyCrOydtOydmCDqsbDrpqwg65iQ64qUIOycoOyCrOyEseydhCDsuKHsoJXtlZjqsowg65CY64qU642wIOydtCDqsr3smrAg6rCBIOuzgOyImOydmCDqtIDsuKHri6jsnITqsIAg64uk66W06riwIOuVjOusuOyXkCDrsJzsg53rkJjripQg7JiB7Zal66Cl7J2EIOyXhuyVoOq4sCDsnITtlZjsl6wgNC4y7KCI7JeQ7IScIOyEpOuqhe2VnCDrsJTsmYAg6rCZ7J20IOqwgSDrs4DsiJjrpbwg7ZGc7KSA7ZmU7ZWY7JesIOydtOyaqe2VnOuLpC4g7J20IOyekOujjOulvCDsnbTsmqntlZjsl6wgUuydhCDsnbTsmqntlZwg6rOE7Li17KCBIOq1sOynkeu2hOyEneqzvCBLLe2Pieq3oCDqtbDsp5HrtoTshJ3snYQg7Iuk7Iuc7ZWY64qUIOqzvOygleqzvCDrtoTshJ3qsrDqs7zrpbwg7IK07Y6067O07J6QLiAKCjxicj4KCiMjIyMgNC41LjEg6rOE7Li17KCBIOq1sOynkeu2hOyEnSDsi6TtlontlZjquLAKCjxicj4KCiMjIyMjICgxKSDrjbDsnbTthLAg7J296riwCgo8YnI+CgojIyMjIyA8UiA0LjE+IOuNsOydtO2EsCDtjIzsnbwg7J296riwIApgYGB7cn0KYmVlciA8LSByZWFkLmNzdigiLi4vRGF0YTIwMjIvYmVlcmJyYW5kLmNzdiIsIGhlYWRlciA9IFQsIHJvdy5uYW1lcyA9IDEpCmhlYWQoYmVlcikKYGBgCmBgYHtyfQpzdW1tYXJ5KGJlZXIpCmBgYAo8YnI+Cgo8bGk+ICJoZWFkZXIgPSBUIuuKlCDrjbDsnbTthLDsnZgg7LKrIOuyiOynuCDtlonsnYAg7Lus65+87J2YIOuqhey5reydtOudvOuKlCDrnLvsnbTri6QuIAo8bGk+ICJyb3cubmFtZXMgPSAxIuydgCDtlonrs4Qg66qF7Lmt7J2AIOyyqyDrsojsp7gg7Je07JeQIOyeiOuKlCDqsJLsnbTrnbzripQg7J2Y66+4LiDqt7gg6rKw6rO8IOqwgSDtlonsnZgg66qF7Lmt7J2AIOunpeyjvCDsnbTrpoTsnLzroZwg7J247Iud65CY7JeI64ukLiAKCjxicj4KCiMjIyMjICgyKSDsnpDro4zrpbwg7ZGc7KSA7ZmU7ZWY6riwCgo8YnI+Cgo0LjIuMu2VreyXkOyEnCDslrjquIntlZwg67CU7JmAIOqwmeydtCDqtbDsp5HrtoTshJ3snYQg7ZWY6riwIOyghOyXkCDtkZzspIDtmZTrpbwg7IiY7ZaJ7ZWcIO2bhCDqtbDsp5HrtoTshJ3snYQg7IiY7ZaJ7ZWY64qUIOqyg+ydtCDrjZQg67CU656M7KeB7ZWcIOqyveyasOqwgCDrp47ri6QuIOq3uCDsnbTsnKDripQg6rWw7KeR67aE7ISd7JeQ7ISc64qUIOqxsOumrCDtmLnsnYAg7Jyg7IKs64+E7ZWo7IiY66W8IOyCrOyaqe2VmOuKlOuNsCDqt7jrn6ztlZwg7ZWo7IiY64qUIOuzgOyImOydmCDri6jsnITsl5Ag7J2Y7ZW0IOyYge2WpeydhCDrsJvquLAg65WM66y47J2064ukLgoKPGJyPgrtkZzspIDtmZTrpbwg7IiY7ZaJ7ZWY64qUIOuqheugueyWtOuKlCA8UiA0LjI+7JmAIOqwmeuLpC4g7Jes6riw7IScIO2RnOykgO2ZlOulvCDsnITtlZjsl6wgInNjYWxlKCkiIOuqheugueyWtOulvCDsgqzsmqntlZjsmIDri6QuIO2RnOykgO2ZlOydmCDtmqjqs7zrpbwg7ZmV7J247ZWY6riwIOychO2VtCDtj4nqt6Dqs7wg7ZGc7KSA7Y647LCo66W8IOqzhOyCsO2VtCDrs7gg6rKw6rO8IO2Pieq3oOydgCAw7J206rOgIO2RnOykgO2OuOywqOuKlCAx7J20IOuCmOyYpOuvgOuhnCDtkZzspIDtmZTripQg7J6YIOynhO2WieuQmOyXiOuLpC4g7ZGc7KSA7ZmU65CcIOuNsOydtO2EsO2UhOugiOyehOydgCAnemJlZXIn652864qUIOydtOumhOycvOuhnCDsoIDsnqXrkJjsl4jri6QuCgo8YnI+CgojIyMjIyA8UiA0LjI+IO2RnOykgO2ZlCDsoIjssKgKYGBge3J9CnpiZWVyIDwtIHNjYWxlKGJlZXIpCmBgYApgYGB7cn0Kcm91bmQoYXBwbHkoemJlZXIsIDIsIG1lYW4pLCAzKQpgYGAKYGBge3J9CnJvdW5kKGFwcGx5KHpiZWVyLCAyLCBzZCksIDMpCmBgYAoKPGJyPgoKIyMjIyMgKDMpIOqxsOumrO2WieugrCDqs4TsgrDtlZjquLAKCjxicj4K6rOE7Li17KCBIOq1sOynkeu2hOyEneydhCDsiJjtlontlZjquLAg7JyE7ZW07ISc64qUIOq0gOywsOy5mCDqsIQg6rGw66as7J2YIOqzhOyCsOydtCDtlYTsiJjsoIHsnbTri6QuIOunjOyVvSDqtIDssLDsuZjsnZgg7LSdIOyImOqwgCBO66qF7J20652866m0LCDqsbDrpqztlonroKzsnYAgTiAqIE4g7YGs6riw6rCAIOuQoCDqsoPsnbTri6QuIOqxsOumrO2WieugrOydhCDqs4TsgrDtlZjripQg7KCI7LCo64qUIDxSIDQuMz7qs7wg6rCZ64ukLiDsl6zquLDshJwg6rGw66as7ZaJ66Cs7J2EIOqzhOyCsO2VmOuKlCDrqoXroLnslrTripQgImRpc3QoKSLsnbTri6QuIOydtCDrqoXroLnslrTsnZgg7J247IiY66GcIOqxsOumrO2VqOyImOulvCDsp4DsoJXtlbQg7KSEIOyImCDsnojripTrjbAsICJldWNsaWRlYW4i7J2AIOuUlO2PtO2KuCDsnbjsiJjsnbTqs6AsIOq3uCDsmbjsl5Drj4QgIm1hbmhhdHRhbiIsICJtaW5rb3dza2kiIOuTseydtCDsnojri6QuCgo8YnI+CgojIyMjIyA8UiA0LjM+IOqxsOumrO2WieugrCDqs4TsgrAg7KCI7LCoCmBgYHtyfQp6YmVlcl9ldWMgPC0gZGlzdCh6YmVlcikKemJlZXJfZXVjWzFdCmBgYApgYGB7cn0KemJlZXJfbWFuIDwtIGRpc3QoemJlZXIsICJtYW5oYXR0YW4iKQp6YmVlcl9tYW5bMV0KYGBgCgo8YnI+CjQuMi4yIO2VreyXkOyEnCDrp6Xso7wg642w7J207YSw66W8IOyYiOyLnOuhnCDtlZjsl6wg7Jyg7YG066as65SU7JWIIOqxsOumrOyZgCDrp6jtlbTtirwg6rGw66as66W8IOqzhOyCsO2VmOyYgOuKlOuNsCDssqsg67KI7Ke4IOyMjeyduCAnQlVEV0VJU0VSJ+yZgCAnU0NITElUWicg66el7KO8IOyCrOydtOydmCDsnKDtgbTrnbzrlJTslYgg6rGw66as7JmAIOunqO2VtO2KvCDqsbDrpqzripQg6rCB6rCBIDAuNzAxNuqzvCAxLjEwMjTroZwgNC4yLjLtla3snZgg6rKw6rO87JmAIOydvOy5mO2VnOuLpC4KCjxicj4KCiMjIyMjICg0KSDqs4TsuLXsoIEg6rWw7KeR67aE7ISdIOyLpO2Wie2VmOq4sCAtIOy1nOuLqOyXsOqysOuylQoKPGJyPgrrqLzsoIAg7LWc64uo7Jew6rKw67KV7J2EIOydtOyaqe2VmOyXrCDqs4TsuLXsoIEg6rWw7KeR67aE7ISd7J2EIOyImO2Wie2VtCDrs7TquLDroZwg7ZWc64ukLiDqsbDrpqztlonroKzsnYAg7Jyg7YG066as65SU7JWIIOqxsOumrOulvCDsgqzsmqntlZjsmIDri6QuIOqysOqzvOuKlCA8UiA0LjQ+7JmAIOqwmeuLpC4KCjxicj4KCiMjIyMjIDxSIDQuND4g6rOE7Li17KCBIOq1sOynkeu2hOyEnSDsi6TtlokgLSDstZzri6jsl7DqsrDrspUKYGBge3J9CmhjX3MgPC0gaGNsdXN0KHpiZWVyX2V1YywgbWV0aG9kID0gJ3NpbmdsZScpCmhjX3MKYGBgCjxicj4KCjxsaT4gPFIgNC40PuyXkOyEnCAiaGNsdXN0IiDrqoXroLnslrTripQg6rOE7Li17KCBIOq1sOynkeu2hOyEneydhCDsiJjtlontlZzri6QuCjxsaT4gIm1ldGhvZCA9IHNpbmdsZSLsnYAg7LWc64uo7Jew6rKw67KV7J2EIOydtOyaqe2VnOuLpOuKlCDsmLXshZjsnbTri6QuIOunjOyVvSAi7KSR7Ius7Jew6rKw67KVIuydhCDsgqzsmqntlZjqs6DsnpAg7ZWY66m0ICJtZXRob2QgPSBjZW50cm9pZCLrpbwg7IKs7JqpLiDsnbTsmbjsl5Drj4QgImNvbXBsZXRlIiwgImF2ZXJhZ2UiLCAid2FyZC5EIiDrk7HsnZgg7IKs7Jqp7J20IOqwgOuKpe2VmOuLpC4KPGxpPiAicGxvdCgpIuuKlCDqs4TsuLXsoIEg6rWw7KeR67aE7ISd7J2YIOqysOqzvOulvCDqt7jrprzsnLzroZwg64KY7YOA64K064qUIOuNtOuTnOuhnOq3uOueqOydhCDqt7jrprQg7IiYIOyeiOuLpC4KPGxpPiAicGxvdChoY19zLCBoYW5nID0gLTEpIuyXkOyEnCAiaGFuZyA9IC0xIuydtOudvOuKlCDrqoXroLnsnYQg7IKs7Jqp7ZWY66m0IOuNtOuTnOuhnOq3uOueqCDrgrQg6rSA7LCw7LmY7J2YIOydtOumhOydtCDsoJXroKzrkJjslrQg67O06riw7JeQIOyii+uLpC4g7LWc64uo7Jew6rKw67KV7JeQIOydmO2VnCDrjbTrk5zroZzqt7jrnqjsnYAg64uk7J2M6rO8IOqwmeuLpC4KCjxicj4KCmBgYHtyfQpwbG90KGhjX3MsIGhhbmcgPSAtMSkKYGBgCjxicj4KCiMjIyMjICg1KSDqs4TsuLXsoIEg6rWw7KeR67aE7ISdIOyLpO2Wie2VmOq4sCAtIOy1nOyepeyXsOqysOuylQoKPGJyPgoK66eM7JW9IOy1nOuLqOyXsOqysOuyleydtCDslYTri4wg7LWc7J6l7Jew6rKw67KV7J2EIOyCrOyaqe2VmOqyjCDrkJjrqbQg64uk7J2M6rO8IOqwmeydgCDrjbTrk5zroZzqt7jrnqjsnYQg6rWs7ZWgIOyImCDsnojri6QuICJtZXRob2QgPSAnY29tcGxldGUnIuudvOuKlCDsmLXshZjsnYQg7IKs7Jqp7ZWc64ukLiDsnITsnZgg7LWc64uo7Jew6rKw67KV7J2YIOqysOqzvOyZgCDsg4Hri7ntlZwg7LCo7J206rCAIOyeiOydjOydhCDslYwg7IiYIOyeiOuLpC4KCjxicj4KCiMjIyMjIDxSIDQuNT4g6rOE7Li17KCBIOq1sOynkeu2hOyEnSDsi6TtlokgLSDstZzsnqXsl7DqsrDrspUKYGBge3J9CmhjX2MgPC0gaGNsdXN0KHpiZWVyX2V1YywgbWV0aG9kID0gJ2NvbXBsZXRlJykKaGNfYwpgYGAKCmBgYHtyfQpwbG90KGhjX2MsIGhhbmcgPSAtMSkKYGBgCjxicj4KCiMjIyMjICg2KSDqs4TsuLXsoIEg6rWw7KeR67aE7ISdIOyLpO2WiSAtIOykkeyLrOyXsOqysOuylQoKPGJyPgoKPFIgNC42PuydgCDspJHsi6zsl7DqsrDrspXsnYQg7IKs7Jqp7ZWcIOqzhOy4teyggSDqtbDsp5HrtoTshJ3snZggUiDsvZTrk5zsmYAg6rKw6rO87J2064ukLiDqt7gg7JWE656YIOq3uOumvOydgCDspJHsi6zsl7DqsrDrspXsl5Ag7J2Y7ZWcIOuNtOuTnOuhnOq3uOueqOydtOuLpC4KCjxicj4KCgojIyMjIyA8UiA0LjY+IOqzhOy4teyggSDqtbDsp5HrtoTshJ0g7Iuk7ZaJIC0g7KSR7Ius7Jew6rKw67KVCmBgYHtyfQpoY19jZW4gPC0gaGNsdXN0KHpiZWVyX2V1YywgbWV0aG9kID0gJ2NlbnRyb2lkJykKaGNfY2VuCmBgYApgYGB7cn0KcGxvdChoY19jZW4sIGhhbmcgPSAtMSkKYGBgCgo8YnI+CgojIyMjIyAoNykg6rOE7Li17KCBIOq1sOynkeu2hOyEnSDsi6TtlokgLSDsmYDrk5zsnZgg67Cp67KVCgo8YnI+CgrsmYDrk5zsnZgg67Cp67KV7J2EIOyCrOyaqe2VmOyXrCDqs4TsuLXsoIEg6rWw7KeR67aE7ISd7J2EIOyImO2Wie2VmOuKlCDrqoXroLnsnYAgPFIgNC43PuqzvCDqsJnri6QuCgo8YnI+CgojIyMjIyA8UiA0Ljc+IOqzhOy4teyggSDqtbDsp5HrtoTshJ0g7Iuk7ZaJIC0g7JmA65Oc7J2YIOuwqeuylQpgYGB7cn0KaGNfdyA8LSBoY2x1c3QoemJlZXJfZXVjLCBtZXRob2QgPSAnd2FyZC5EJykKaGNfdwpgYGAKCmBgYHtyfQpwbG90KGhjX3csIGhhbmcgPSAtMSkKYGBgCjxicj4KCiMjIyMjICg4KSDshozsho0g6rWw7KeRIOyVjOq4sCAKCjxicj4KCjxsaT4g6rOE7Li17KCBIOq1sOynkeu2hOyEneydhCDtlZwg7ZuEIOq1sOynkSDsiJjrpbwg7KCV7ZWY6rOgLCDshozsho0g6rWw7KeR7J2EIOyVjOq4sCDsnITtlbTshJzripQg6rOE7Li17KCBIOq1sOynkeu2hOyEneydmCDrjbTrk5zroZzqt7jrnqjsnYQg7J207Jqp7ZWY66m0IOuQnOuLpC4gCjxsaT4g6rCBIOqwnOyytOyXkCDshozsho0g6rWw7KeRIGlk66W8IO2VoOuLue2VmOugpOuptCAiY3V0cmVlKCkiIO2VqOyImOulvCDsnbTsmqntlZzri6QuCgo8UiA0Ljg+7J2AIOykkeyLrOyXsOqysOuyleydhCDsnbTsmqntlZwg6rOE7Li17KCBIOq1sOynkeu2hOyEnSDqsrDqs7zsl5DshJwg6rWw7KeRIOyImOulvCAyfjTqsJzroZwg7ZWY7JiA7J2EIOuVjOydmCDshozsho0g6rWw7KeR7J2EIO2VoOuLue2VmOuKlCDrgrTsmqnsnbTri6QuIOyYiOulvCDrk6TslrQKPGxpPiDqtbDsp5HsnZgg7IiY66W8IDLqsJzroZwg7ZWY64qUIOqyveyasOyXkOuKlCAoUEFCU1QgRVhUUkEgTElHSFQsIE9MWU1QSUEgR09MRCBMSUdIVCkgKOuCmOuouOyngCnroZwg6rWw7KeR7J2EIOygle2VmOqzoCwKPGxpPiDqtbDsp5HsnZgg7IiY66W8IDPqsJzroZwg7ZWY64qUIOqyveyasOyXkOuKlCAoUEFCU1QgRVhUUkEgTElHSFQsIE9MWU1QSUEgR09MRCBMSUdIVCksIChLUk9ORU5CT1VSRywgSEVJTkVLRU4sIEJFQ0tTLCBLSVJJTiksICjrgpjrqLjsp4Ap66GcIOuCmOuIiOuLpC4KPGxpPiDrjbTrk5zroZzqt7jrnqjsnZgg6rKw6rO87JmAIOu5hOq1kO2VtCDrs7TsnpAuCgo8YnI+CgojIyMjIyA8UiA0Ljg+IOyGjOyGjSDqtbDsp5Eg7JWM6riwCmBgYHtyfQpoY19jZW4yNCA8LSBjdXRyZWUoaGNfY2VuLCAyOjQpCmhjX2NlbjI0CmBgYAoKPGJyPgo8aHI+Cjxicj4KCiMjIyMgNC41LjIgSy3tj4nqt6Ag6rWw7KeR67aE7ISdIOyLpO2WiQoKPGJyPgoKIyMjIyMgKDEpIEst7Y+J6regIOq1sOynkeu2hOyEnQoKPGJyPgoK7JWe7JeQ7IScIOydveyWtOuTpOyduCB6YmVlciDsnpDro4zrpbwg7J207Jqp7ZW0IEst7Y+J6regIOq1sOynkeu2hOyEneydhCDsiJjtlontlbQg67O07J6QLiDtkZzspIDtmZTrpbwg7IiY7ZaJ7ZWcIO2bhCDqtbDsp5HsnZgg6rCc7IiY6rCAIEs9MuyduCBLLe2Pieq3oCDqtbDsp5HrtoTshJ3snYQg7IiY7ZaJ7ZWY64qUIOygiOywqOuKlCA8UiA0Ljk+7JmAIOqwmeuLpC4gSy3tj4nqt6Ag6rWw7KeR67aE7ISdIOqysOqzvOyXkOyEnOuKlCDqsIEg67OA7IiY67OEIOy1nOyihSDqtbDsp5HsnZgg7KSR7Ius6rCSIOuwjyDqsIEg6rSA7LCw7LmY67OEIOyGjOyGjSDqtbDsp5HrtoTshJ3snZgg6rKw6rO866W8IOuztOyXrOykgOuLpC4KCjxicj4KCiMjIyMjIDxSIDQuOT4gSy3tj4nqt6Ag6rWw7KeR67aE7ISdCmBgYHtyfQprbWMgPC0ga21lYW5zKHpiZWVyLCBjZW50ZXJzID0gMikKa21jCmBgYAoKPGJyPgoKIyMjIyMgKDIpIOyGjOyGjSDqtbDsp5Eg7IKw7KCQ64+ECgo8YnI+CgpLLe2Pieq3oCDqtbDsp5HrtoTshJ3sl5DshJwg7IOd7ISx65CcIOq1sOynkSDrjbDsnbTthLDrpbwg6re466a87Jy866GcIOuCmO2DgOuCtOq4sCDsnITtlZwg7KCI7LCo64qUIDxSIDQuMTA+6rO8IOqwmeuLpC4KCjxsaT4gImttYyRjbHVzdGVyIuuKlCDqtbDsp5HsnZgg67KI7Zi466W8IOydmOuvuAo8bGk+ICJwY2ggPSAxNiLsnYAg7IKw7KCQ64+E7J2YIOygkOydhCDsg53sg4HsnLzroZwg7LGE7Jqw64qUIOyYteyFmAoKPGJyPgoKIyMjIyMgPFIgNC4xMD4g7IaM7IaNIOq1sOynkSDsgrDsoJDrj4QKYGBge3J9CnBsb3QoemJlZXIsIGNvbCA9IGttYyRjbHVzdGVyLCBwY2ggPSAxNikKYGBgCjxicj4KCjxsaT4g7JyE7J2YIOq3uOumvOydgCAiemJlZXIiIOuNsOydtO2EsO2UhOugiOyehOydmCDsspjsnYwgMuqwnCDrs4DsiJjsnbggIkNBTE9SSUVTIuyZgCAiU09ESVVNIuydhCDsnbTsmqntlZwg7IKw7KCQ64+E7J2064ukLgo8bGk+IO2VmOyngOunjCAiemJlZXIi7JeQ64qUIOy0nSA06rCc7J2YIOuzgOyImOqwgCDsnojsnLzrr4DroZwsIOydtOulvCDrqqjrkZAg6re466a87Jy866GcIOq3uOumrOugpOuptCA8UiA0LjExPuqzvCDqsJnsnYAg66qF66C57Ja066W8IOyCrOyaqe2VnOuLpC4KPGxpPiA8UiA0LjExPuyXkOyEnCAiY2V4LmxhYmVscyA9IDEuNSLripQg64yA6rCB7ISg7JeQIOy2nOugpeuQmOuKlCDrs4DsiJjrqoXsnZgg7YGs6riwIOyhsOygiCDsmLXshZjsnbTri6QuIAo8bGk+IOuqqOuToCDsgrDsoJDrj4Tsl5DshJwg6rWw7KeRIDHqs7wg6rWw7KeRIDLsnZgg6rWs67aE7J20IOuqhe2Zle2VqOydhCDtmZXsnbjtlaAg7IiYIOyeiOuLpC4gCgo8YnI+CgojIyMjIyA8UiA0LjExPiBLLe2Pieq3oCDqtbDsp5Eg642w7J207YSw7J2YIOuqqOuToCDrs4DsiJjrpbwg6re466as6riwIApgYGB7cn0KcGFpcnMoemJlZXIsIGNvbCA9IGttYyRjbHVzdGVyLCBwY2ggPSAxNiwgY2V4LmxhYmVscyA9IDEuNSkKYGBgCgo8YnI+Cgrqs4TsuLXsoIEg6rWw7KeR67aE7ISd6rO8IEst7Y+J6regIOq1sOynkeu2hOyEneydhCDsi6Tsi5ztlZwg6rKw6rO8IOuRkCDqsIDsp4Ag67aE7ISd6rKw6rO86rCAIOunpOyasCDri6TrpoTsnYQg7JWMIOyImCDsnojri6QuIOymiSwgSy3tj4nqt6Ag6rWw7KeR67aE7ISd7JeQ7IScIEs9MuuhnCDtlZjsmIDsnYQg65WM7J2YIOq1sOynkeu2hOyEnSDqsrDqs7zsmYAg6rOE7Li17KCBIOq1sOynkeu2hOyEneyXkOyEnCDqtbDsp5HsnZgg6rCc7IiY66W8IDLroZwg7ZWcIOqysOqzvOqwgCDshJzroZwg64uk66W4IOqyg+ydhCDslYwg7IiYIOyeiOuLpC4g6rWs7LK07KCB7Jy866GcIOqzhOy4teyggSDqtbDsp5HrtoTshJ0g67Cp67KV7JeQ7ISc64qUIOq1sOynkeyXkCDsho3tlZwg6rSA7LCw7LmYIOyImOqwgCAxOOqwnOyZgCAy6rCc66GcIOuCmOuIhOyWtOyngOuKlCDrjbAg67mE7ZW0IEst7Y+J6regIOq1sOynkeu2hOyEneuwqeuyleyXkOyEnOuKlCAxNOqwnOyZgCA26rCc66GcIOuCmOuIhOyWtOynkOydhCDslYwg7IiYIOyeiOuLpC4KCjxicj4KCuydtOyZgCDqsJnsnbQg6rWw7KeR67aE7ISd7JeQ7ISc64qUIOuwqeuyleyXkCDrlLDrnbwg64uk66W4IO2Yle2DnOydmCDqtbDsp5HsnbQg66eM65Ok7Ja07KeE64ukLiDrmJDtlZwg6rOE7Li17KCBIOq1sOynkeu2hOyEnSDrgrTsl5DshJzrj4QgNC4zLjTtla3sl5DshJwg67O4IOuwlOyZgCDqsJnsnbQg7Jew6rKw67Cp67KV7JeQIOuUsOudvCDqsrDqs7zqsIAg64uk66W06rKMIOuCmOyYqOuLpC4g65Sw65287IScIOq1sOynkeu2hOyEneydhCDsi6Tsi5ztlZjqs6DsnpAg7ZWY64qUIOqyveyasOyXkOuKlCDso7zslrTsp4Qg7J6Q66OM7JeQIOqwgOyepSDsoIHtlantlZwg67Cp67KV7J2EIOywvuyVhOyEnCDrtoTshJ3snYQg7Iuk7Iuc7ZWY7Jes7JW8IO2VmOqzoCA0LjMuNe2VreqzvCA0LjQuM+2VreyXkCDslrjquIntlZjsmIDrk5zsiqTsnbQg6rWw7KeR67aE7ISd7J2YIOqysOqzvOydmCDqsoDspp3sl5Ag7KO87J2Y7ZWY7Jes7JW8IO2VnOuLpC4gCgo8YnI+Cjxocj4KPGJyPgoK