R을 이용한 실습


1. 의사결정나무 R 함수


rpart package : recursive partitioning

CART 의사결정나무의 알고리즘을 구현한 것이다. rpart package로 분류나무와 회귀나무 모두를 수행할 수 있다.


(1) rpart 함수

[함수의 구조] rpart(formula, data, weights, subset, na.action=na.rpart, method, parms, control, cost, …)

[기능] 훈련 데이터를 이용하여 의사결정나무를 생성한다. R의 rpart 오브젝트를 생성한다.

[옵션]
  • formula : R에서 사용하는 모형 관련 공식. 옵션 data의 데이터 프레임에 존재하는 변수 이름만 사용 가능하다.
  • data : 훈련 데이터에 해당하는 데이터 프레임 이름
  • weights : 훈련 데이터의 관찰값에 대한 가중치 벡터. default는 균등가중치
  • subset : 조건에 맞는 훈련 데이터의 일부분만 사용하고자 할 때. default는 전체 사용
  • na.action = na.rpart : 목표변수가 결측치이면 전체 관찰값을 삭제. 입력변수가 결측치인 경우에는 삭제하지 않음
  • method : 의사결정나무의 종류를 지정. “anova”, “poisson”, “class”, “exp” 중에서 선택해야 하며, “anova” 선택시 회귀나무, “poisson” 선택시 포아송 회귀나무, “class” 선택시 분류나무, “exp” 선택시 생존나무가 생성됨. default는 “class”
  • parms : 분할을 위한 옵션. 회귀나무에는 해당사항이 없고, 분류나무에는 사전확률을 주거나 불순도 함수를 지정할 때 사용. 예를 들어 parms = list(prior=c(0.65, 0.35), split=“information”)인 경우, 집단 1과 집단 2의 사전 확률은 65:35이다. 불순도 함수는 엔트로피 함수 사용을 의미함. default는 집단 간 데이터 비율(proportion) 사전확률과 지니계수
  • control : rpart.control과 같은 역할 (rpart.control에서 설명)
  • cost : 오분류 비용을 지정할 때 사용. default는 균등비용



  • (2) rpart.control 함수


    [함수의 구조] rpart.control(minsplit = 20, minbucket = round(minsplit/3), cp=0.01, maxcompete = 4, maxsurrogate=5, xval=10, maxdepth=30, …)

    [기능] 의사결정나무를 생성할 때, 분할규칙 등을 정한다.

    [옵션]
  • minsplit : 한 노드를 분할하기 위해 필요한 데이터의 개수. 이 값보다 적은 수의 관찰값이 있는 노드는 분할하지 않음. default는 20개
  • minbucket : 최종노드에 포함되어야 하는 최소 데이터의 개수. minsplit이 지정되면 자동으로 minsplit/3으로 지정되고, minbucket보다 적은 수의 관찰값이 있는 노드는 만들지 않게 됨
  • cp : 비용복잡함수의 벌점 모수. 노드를 분할할 때 분할 전과 비교하여 오분류율이 cp 값 이상으로 향상되지 않으면 더 이상 분할하지 않고 나무 구조 생성을 멈춘다. default는 0.01
  • maxcompete : CART 분할방법에서 우수했던 분할후보점을 maxcompete 개수만큼 출력. default 는 4개
  • maxsurrogate : 결과물에 출력할 서로게이트 분할점의 개수를 지정(서로게이트란 결측치를 처리하기 위한 대체 분할법의 일종임). default는 5개
  • xval : 가지치기를 위한 교차타당성의 fold 개수. default는 10
  • maxdepth : 나무구조의 깊이를 설정. 뿌리노드가 0이고, 가령 maxdepth=5이면 나무구조는 뿌리노드로부터 5단계 아래로 내려감. default는 30



  • (3) printcp 함수


    [함수의 구조] printcp(x, digits = getOption(“digits”) - 2)


    [기능] R의 rpart 오브젝트를 대상으로 cp 값에 대한 나무구조 순서를 출력한다.


    [옵션]
  • x : rpart 오브젝트 이름
  • digits : 출력할 숫자의 소숫점 이하 자릿수



  • (4) prune.rpart 함수


    [함수의 구조] prune(tree, cp, …)


    [기능] 의사결정나무의 가지치기를 실시한다.


    [옵션]
  • tree : rpart 오브젝트의 이름
  • cp : 가지치기할 비용복잡함수의 벌점모수값



  • (5) plot.rpart 함수


    [함수의 구조] plot(x, uniform=FALSE, branch=1, compress=FALSE, nspace, margin=0, …)


    [기능] 생성된 의사결정나무를 나무그림으로 표현한다.


    [옵션]
  • x : rpart 오브젝트 이름
  • uniform : 부모노드와 자식노드의 간격 크기. 만약 FALSE이면 분할개선도에 비례하여 간격이 커지거나 작아지고, TRUE이면 균등한 간격을 유지함. default는 FALSE
  • branch : 중간노드를 잇는 가지의 형태. 만약 1이면 직교형이고, 0이면 V자 형태이며, 0과 1 사이 값이면 직교와 V자의 혼합형임. default는 1
  • compress : 출력 시 노드의 배치에 관한 사항. 만약 TRUE이면 더 압축된 의사결정나무 그림을 출력. default는 FALSE
  • nspace : 중간노드와 최종노드 사이의 공간 여백 값. default는 branch의 값과 동일
  • margin : 나무 출력 시 주변 여백 값. 너무 작은 값을 사용하면 분할규칙이 잘리는 경우도 있음. default는 0



  • (6) text.rpart 함수


    [함수의 구조] text(x, splits=TRUE, all=FALSE, digits=getOption(“digits) - 3, use.n=FLASE, fancy=FALSE, fwidth=0.8, bg=par(”bg”), col, …)


    [기능] plot에 의해 그려진 나무구조에 텍스트를 삽입한다.


    [옵션]
  • x : rpart 오브젝트 이름
  • splits : 나무 출력 시 분할규칙도 함께 출력하는지 여부. default는 TRUE.
  • all : 최종노드만 분류집단명을 출력할지 여부. TRUE이면 중간노드에도 분류집단을 출력. default는 FALSE
  • digits : 분할규칙에 사용할 소숫점 이하 자릿수
  • use.n : 최종노드에 대한 정보 출력. TRUE이면 정보를 출력. 분류나무이면 각 집단별 관찰값 개수를 출력하고, 회귀나무이면 최종노드의 관찰값 개수를 출력. default는 FALSE
  • fancy : TRUE이면 중간노드는 타원으로, 최종노드는 직사각형으로 출력. default는 FALSE
  • fwidth : fancy 옵션이 TRUE일 때 사용하는 것으로, 타원과 직사각형의 넓이를 조절, default는 0.8
  • fheight : fancy 옵션이 TRUE일 때 사용하는 것으로, 타원과 직사각형의 높이를 조절. default는 0.8
  • bg : fancy 옵션이 TRUE일 때 사용하는 것으로, 나무의 배경 색상
  • col : 나무의 문자 색상



  • (7) predict.rpart 함수


    [함수의 구조] predict(object, newdata, type=c(“vector”, “prob”, “class”, “matrix”), na.action=na.pass, …)


    [기능] 생성된 의사결정나무 오브젝트에 새로운 데이터 newdata를 적용하여 예측한다.


    [옵션]
  • object : rpart 오브젝트 이름
  • newdata : 예측의 대상인 데이터 프레임
  • type : 분류나무인 경우 “vector”이면 예측된 집단명이 출력되고, “prob”이면 집단별 예측확률이 출력되며, “class”이면 예측된 집단이 factor 형태로 출력되고, “matrix”이면 위의 모든 겻을 출력. 회귀나무인 경우, “vector” 혹은 “matrix”이면 예측값이 출력되고, 다른 옵션은 회귀나무와 관계가 없음
  • na.action : newdata의 결측치에 대한 처리 방법. na.omit는 결측치를 제외하는 방법이고, na.pass는 서로게이트 분할을 이용하는 방법임 (서로게이트란 결측치를 처리하기 위한 대체 분할법의 일종임). default는 na.pass



  • (8) prp 함수


    의사결정나무 생성 함수인 rpart에 의해 생성된 rpart 오브젝트는 rpart.plot 이라는 패키지를 활용하면 더 보기 좋게 나무 구조를 출력할 수 있다. rpart.plot 패키지의 prp 함수를 소개한다.


    [함수의 구조] prp(object, type=2, extra=“auto”, digits=2, box.palette=“auto”, …)


    [기능] 생성된 의사결정나무 오브젝트를 나무구조의 형태로 출력한다.


    [옵션]
  • object : rpart 오브젝트 이름
  • type : 의사결정나무 출력 형식 지정. 0이면 중간노드를 그리지 않고, 1이면 중간노드를 도형으로 표현하고 노드를 분할하는 조건을 노드 위쪽에 출력, 2이면 중간노드를 그리면서 노드를 분할하는 조건을 노드 아래쪽에 출력, 3이면 중간노드를 그리지 않으면서 왼쪽으로 분할하는 조건과 오른쪽으로 분할하는 조건을 모두 출력, 4이면 중간노드를 그리면서 왼쪽으로 분할하는 조건과 오른쪽으로 분할하는 조건을 모두 출력함
  • extra : 중간노드 내의 출력 형식을 지정. 0인 경우 분류나무이면 다수 범주를 출력하고 회귀나무이면 노드의 목표변수 평균을 출력. 1인 경우 0 옵션의 결과에 추가하여 분류나무이면 범주별 관찰값 개수 출력, 회귀나무이면 노드의 총 관찰값 개수 출력, 2인 경우 분류나무인 경우 다수 범주의 관찰값 개수와 총 관찰값 개수를 출력함. 회귀나무는 해당 사항 없음.
  • digits : 출력 시 사용하는 소숫점 자릿수. default는 2
  • box.palette : 노드별로 목표변수의 요약값을 색상으로 표현하는 색상표 ’auto’인 경우 모델의 형태에 따라 자동으로 선택하고, ’Grays’인 경우 회색으로 표현함



  • 2. 분류의사결정나무 사례 분석


    분류의사결정나무를 생성하는 사례분석으로 앞서 사용되었던 와인품질 데이터(‘winequalityCLASS.csv’)를 이용하여 가장 대중적 의사결정나무인 CART 방법을 이용한 의사결정나무를 구축해 본다.


    (1) 데이터를 읽고 CART 의사결정나무 실행하기

    먼저 와인 품질 데이터가 담긴 ‘winequalityCLASS.csv’ 파일을 확인한다. 데이터 파일을 읽고 CART 의사결정나무를 실행하기 위해서 <R 3-1>과 같이 수행하면 된다.


    3-1 의사결정나무 실행
    # importing data
    wine <- read.csv("./data/winequalityCLASS.csv")
    # factorize for classification
    wine$quality <- factor(wine$quality)
    # classification tree
    library(rpart)
    set.seed(1234)
    my.control <- rpart.control(xval = 10, cp = 0, minsplit = 20)
    tree.wine <- rpart(quality ~ ., data = wine, method = "class", control = my.control)
    print(tree.wine)
    n= 1194 
    
    node), split, n, loss, yval, (yprob)
          * denotes terminal node
    
       1) root 1194 549 1 (0.45979899 0.54020101)  
         2) alcohol< 10.15 613 204 0 (0.66721044 0.33278956)  
           4) sulphates< 0.575 276  54 0 (0.80434783 0.19565217)  
             8) chlorides>=0.0795 138  16 0 (0.88405797 0.11594203) *
             9) chlorides< 0.0795 138  38 0 (0.72463768 0.27536232)  
              18) volatile>=0.42 124  29 0 (0.76612903 0.23387097)  
                36) fixed< 7.65 60   6 0 (0.90000000 0.10000000) *
                37) fixed>=7.65 64  23 0 (0.64062500 0.35937500)  
                  74) citric>=0.245 23   4 0 (0.82608696 0.17391304) *
                  75) citric< 0.245 41  19 0 (0.53658537 0.46341463)  
                   150) freeSD< 12.5 28   9 0 (0.67857143 0.32142857)  
                     300) chlorides>=0.0695 20   4 0 (0.80000000 0.20000000) *
                     301) chlorides< 0.0695 8   3 1 (0.37500000 0.62500000) *
                   151) freeSD>=12.5 13   3 1 (0.23076923 0.76923077) *
              19) volatile< 0.42 14   5 1 (0.35714286 0.64285714) *
           5) sulphates>=0.575 337 150 0 (0.55489614 0.44510386)  
            10) fixed< 10.05 296 117 0 (0.60472973 0.39527027)  
              20) volatile>=0.385 254  89 0 (0.64960630 0.35039370)  
                40) totalSD>=46.5 115  26 0 (0.77391304 0.22608696)  
                  80) volatile>=0.6475 28   1 0 (0.96428571 0.03571429) *
                  81) volatile< 0.6475 87  25 0 (0.71264368 0.28735632)  
                   162) fixed>=8.7 26   2 0 (0.92307692 0.07692308) *
                   163) fixed< 8.7 61  23 0 (0.62295082 0.37704918)  
                     326) fixed< 7.85 45  13 0 (0.71111111 0.28888889)  
                       652) citric< 0.205 21   3 0 (0.85714286 0.14285714) *
                       653) citric>=0.205 24  10 0 (0.58333333 0.41666667)  
                        1306) citric>=0.275 17   4 0 (0.76470588 0.23529412) *
                        1307) citric< 0.275 7   1 1 (0.14285714 0.85714286) *
                     327) fixed>=7.85 16   6 1 (0.37500000 0.62500000) *
                41) totalSD< 46.5 139  63 0 (0.54676259 0.45323741)  
                  82) pH>=3.535 17   2 0 (0.88235294 0.11764706) *
                  83) pH< 3.535 122  61 0 (0.50000000 0.50000000)  
                   166) citric>=0.35 7   0 0 (1.00000000 0.00000000) *
                   167) citric< 0.35 115  54 1 (0.46956522 0.53043478)  
                     334) volatile>=0.555 70  30 0 (0.57142857 0.42857143)  
                       668) totalSD< 23.5 25   4 0 (0.84000000 0.16000000) *
                       669) totalSD>=23.5 45  19 1 (0.42222222 0.57777778)  
                        1338) density>=0.99685 35  17 0 (0.51428571 0.48571429)  
                          2676) sulphates< 0.655 16   3 0 (0.81250000 0.18750000) *
                          2677) sulphates>=0.655 19   5 1 (0.26315789 0.73684211) *
                        1339) density< 0.99685 10   1 1 (0.10000000 0.90000000) *
                     335) volatile< 0.555 45  14 1 (0.31111111 0.68888889)  
                       670) density< 0.99715 24  12 0 (0.50000000 0.50000000)  
                        1340) citric>=0.2 7   0 0 (1.00000000 0.00000000) *
                        1341) citric< 0.2 17   5 1 (0.29411765 0.70588235) *
                       671) density>=0.99715 21   2 1 (0.09523810 0.90476190) *
              21) volatile< 0.385 42  14 1 (0.33333333 0.66666667)  
                42) fixed>=9.1 10   3 0 (0.70000000 0.30000000) *
                43) fixed< 9.1 32   7 1 (0.21875000 0.78125000)  
                  86) density< 0.9965 8   3 0 (0.62500000 0.37500000) *
                  87) density>=0.9965 24   2 1 (0.08333333 0.91666667) *
            11) fixed>=10.05 41   8 1 (0.19512195 0.80487805) *
         3) alcohol>=10.15 581 140 1 (0.24096386 0.75903614)  
           6) sulphates< 0.715 392 127 1 (0.32397959 0.67602041)  
            12) alcohol< 11.03333 222  96 1 (0.43243243 0.56756757)  
              24) chlorides>=0.097 24   6 0 (0.75000000 0.25000000) *
              25) chlorides< 0.097 198  78 1 (0.39393939 0.60606061)  
                50) sulphates< 0.505 20   5 0 (0.75000000 0.25000000) *
                51) sulphates>=0.505 178  63 1 (0.35393258 0.64606742)  
                 102) density>=0.99591 111  47 1 (0.42342342 0.57657658)  
                   204) residsugar< 1.85 16   3 0 (0.81250000 0.18750000) *
                   205) residsugar>=1.85 95  34 1 (0.35789474 0.64210526)  
                     410) pH>=3.335 35  17 0 (0.51428571 0.48571429)  
                       820) freeSD< 10 13   2 0 (0.84615385 0.15384615) *
                       821) freeSD>=10 22   7 1 (0.31818182 0.68181818)  
                        1642) sulphates>=0.655 9   4 0 (0.55555556 0.44444444) *
                        1643) sulphates< 0.655 13   2 1 (0.15384615 0.84615385) *
                     411) pH< 3.335 60  16 1 (0.26666667 0.73333333)  
                       822) sulphates< 0.625 29  12 1 (0.41379310 0.58620690)  
                        1644) volatile>=0.615 10   3 0 (0.70000000 0.30000000) *
                        1645) volatile< 0.615 19   5 1 (0.26315789 0.73684211) *
                       823) sulphates>=0.625 31   4 1 (0.12903226 0.87096774) *
                 103) density< 0.99591 67  16 1 (0.23880597 0.76119403)  
                   206) totalSD>=43.5 17   8 0 (0.52941176 0.47058824) *
                   207) totalSD< 43.5 50   7 1 (0.14000000 0.86000000) *
            13) alcohol>=11.03333 170  31 1 (0.18235294 0.81764706)  
              26) fixed< 6.35 28  14 0 (0.50000000 0.50000000)  
                52) chlorides< 0.0535 9   1 0 (0.88888889 0.11111111) *
                53) chlorides>=0.0535 19   6 1 (0.31578947 0.68421053) *
              27) fixed>=6.35 142  17 1 (0.11971831 0.88028169)  
                54) volatile>=0.765 9   4 0 (0.55555556 0.44444444) *
                55) volatile< 0.765 133  12 1 (0.09022556 0.90977444) *
           7) sulphates>=0.715 189  13 1 (0.06878307 0.93121693)  
            14) totalSD>=57.5 32   8 1 (0.25000000 0.75000000)  
              28) alcohol< 11.5 20   8 1 (0.40000000 0.60000000)  
                56) pH>=3.325 9   3 0 (0.66666667 0.33333333) *
                57) pH< 3.325 11   2 1 (0.18181818 0.81818182) *
              29) alcohol>=11.5 12   0 1 (0.00000000 1.00000000) *
            15) totalSD< 57.5 157   5 1 (0.03184713 0.96815287) *

  • 목표변수인 ‘quality’ 변수는 와인의 품질이 우수등급인 경우 1의 값을 가지고, 보통등급인 경우 0의 값을 가지는 범주형 변수이므로, 이를 factor() 함수를 통해 범주형 변수로 변경하였다. 만약 이렇게 하지 않으면 0과 1이라는 정수형 변수로 인식하게 되어 회귀나무를 수행하게 될 위험이 있다. CART 방법을 R에서 수행하기 위해서는 ’rpart’라는 패키지를 우선 호출한다.
  • ‘set.seed(1234)’ 명령어를 수행하는데, 이는 가지치기를 위한 교차타당성을 수행하는 과정에서 무작위 난수가 사용되기 때문에 난수의 발생을 위한 시드번호를 정해주는 역할을 한다. 이렇게 하면 매번 동일한 나수가 생성되므로 가지치기를 수행해도 동일한 결과를 재현할 수 있다.
  • CART 분류나무 생성을 위해 수행해 볼 수 있는 다양한 옵션은 ’rpart.control()’이라는 명령어로 조절할 수 있다.
  • ‘xval’은 의사결정나무의 가지치기에 필요한 ’cross-validation’의 약어로서 ’xval=10’이면 ’10-fold’ 교차타당성(cross-validation) 오분류율을 계산하게 된다.
  • ‘cp’ 라는 옵션은 ‘cost-complexity’의 약어로서 비용복잡함수에서의 a(alpha) 값을 의미한다. 즉, ’cp=0’이란 오분류율값이 최솟값이 될 때까지 계속 분할하라는 뜻이다. 또한 ’minsplit=20’이라는 옵션은 ’rpart’ 함수에서 중간노드를 분할하기 위한 최소 자료의 수이다. 이 값보다 적은 개수의 관찰값이 있는 노드는 더 이상 분할하지 않고 멈추게 된다. 따라서 이 값을 크게 할 수록 분할하기 어려워지므로 의사결정나무는 더 짧고 단순해진다.
  • ‘rpart()’ 명령어를 수행하는 부분을 보자. 와인품질 데이터의 경우 목표변수는 품질등급을 지칭하는 ‘quality’ 변수가 되고 나머지 변수들은 입력변수가 되므로 R의 formula는 ’quality ~ .’가 된다. 분류나무를 생성하기 위해서는 ’method=“class”’라고 지정해 주어야 한다.
  • 생성된 의사결정나무를 간단하게 출력하기 위해서는 ‘print()’ 함수를 사용하는데, 이 결과는 텍스트 형태의 의사결정나무 결과로 출력되고 있다. 노드번호, 분할규칙, 해당 노드의 총 관찰값 수, 해당 노드에서 오분류되는 관찰값 수, 해당 노드의 목표 변수 예측값의 순서로 정보가 제공되고 있다. 그리고 괄호 안에는 목표변수의 각 집단별 비유을 보이고 있다. 줄 마지막에 있는 * 표시는 해당 노드가 최종 노드임을 의미한다.

  • 의사결정나무를 나무형태이 그래프로 그리기 위해서는 prp() 함수를 사용하면 된다.

    3-2 의사결정나무의 그래프 출력
    # display tree
    # install.packages("rpart.plot")
    library(rpart.plot)
    prp(tree.wine, type = 4, extra = 1, digits = 2, box.palette = "auto") # grays




    (2) 가지치기 수행하기


    3-3 CART 의사결정나무 가지치기 단계별 정보
    # pruning with c-s.e.
    cps <- printcp(tree.wine)
    
    Classification tree:
    rpart(formula = quality ~ ., data = wine, method = "class", control = my.control)
    
    Variables actually used in tree construction:
     [1] alcohol    chlorides  citric     density    fixed      freeSD     pH         residsugar sulphates  totalSD    volatile  
    
    Root node error: 549/1194 = 0.4598
    
    n= 1194 
    
             CP nsplit rel error  xerror     xstd
    1 0.3734062      0   1.00000 1.00000 0.031368
    2 0.0227687      1   0.62659 0.65392 0.028861
    3 0.0077413      4   0.55556 0.61384 0.028329
    4 0.0072860     11   0.49362 0.61384 0.028329
    5 0.0063752     20   0.41166 0.60291 0.028174
    6 0.0036430     24   0.38616 0.58834 0.027960
    7 0.0024287     33   0.35155 0.62113 0.028430
    8 0.0018215     38   0.33515 0.62842 0.028529
    9 0.0000000     44   0.32423 0.62842 0.028529


  • printcp() 함수에 의해 결과를 얻었다. 뿌리노드에서 나무구조가 종료되도록 하려면 ‘cp’ 값은 0.3734062를 사용하면 된다. 중간노드를 계속 분할해 나가려면 ‘cp’ 값은 이보다는 작은 값이어야 한다. ‘cp’ 값이 0.0일 때는 분할의 횟사가 44(nslplit=44)인 상당히 규모가 큰 나무구조가 도출되며, 이 단계에 해당하는 나무구조가 최대나무 (maximal tree)이다. 이 나무구조는 위에서 보인 것을 의미한다.
  • ‘xerror’ : 이 값은 교차타당성(cross-validation) 방법에 의한 오분류율을 의미하는 것으로서 ’xerror’의 최솟값은 4번째 단계이며 분리의 횟수가 11(nsplit=11)인 나무를 의미한다.
  • 따라서 ’cp=0.0072860’이 교차타당성 오분류율을 최소화시키는 최적의 나무 사이즈이며, 이 값을 기준으로 가지치기를 진행하면 된다. 하지만 결과 3-3에 따르면 3번째 단계이며 분리의 횟수가 4 (nsplit=4)인 나무는 교차타당성 오분류율이 최소는 아니지만 4번째 단계의 나무가 가지는 최소 오분류율과는 크게 차이가 나지 않는다. 그리고 최소 오분류율 표준오차의 1배 범위 (0.63934 < 0.62477 + 0.02848) 내에 있다. 이런 경우 3-3절에 소개한 바와 같이 1-s.e. 법칙에 의해 3번째 단계이며 분리의 횟수가 4 (nsplit=4)인 나무를 선택하는 것도 가능하다.

  • 3-4 1-s.e. 법칙으로 가지치기 수행
    # pruning with c-s.e.
    cps <- printcp(tree.wine)
    
    Classification tree:
    rpart(formula = quality ~ ., data = wine, method = "class", control = my.control)
    
    Variables actually used in tree construction:
     [1] alcohol    chlorides  citric     density    fixed      freeSD     pH         residsugar sulphates  totalSD    volatile  
    
    Root node error: 549/1194 = 0.4598
    
    n= 1194 
    
             CP nsplit rel error  xerror     xstd
    1 0.3734062      0   1.00000 1.00000 0.031368
    2 0.0227687      1   0.62659 0.65392 0.028861
    3 0.0077413      4   0.55556 0.61384 0.028329
    4 0.0072860     11   0.49362 0.61384 0.028329
    5 0.0063752     20   0.41166 0.60291 0.028174
    6 0.0036430     24   0.38616 0.58834 0.027960
    7 0.0024287     33   0.35155 0.62113 0.028430
    8 0.0018215     38   0.33515 0.62842 0.028529
    9 0.0000000     44   0.32423 0.62842 0.028529
    k <- which.min(cps[, "xerror"])
    err <- cps[k, "xerror"]; se <- cps[k, "xstd"]
    c <-1  # 1-s.e.
    
    k1 <- which(cps[, "xerror"] <= err + c * se)[1]
    cp.chosen <- cps[k1, "CP"]
    tree.pruned.wine <- prune(tree.wine, cp = cp.chosen)
    print(tree.pruned.wine)
    n= 1194 
    
    node), split, n, loss, yval, (yprob)
          * denotes terminal node
    
     1) root 1194 549 1 (0.4597990 0.5402010)  
       2) alcohol< 10.15 613 204 0 (0.6672104 0.3327896)  
         4) sulphates< 0.575 276  54 0 (0.8043478 0.1956522) *
         5) sulphates>=0.575 337 150 0 (0.5548961 0.4451039)  
          10) fixed< 10.05 296 117 0 (0.6047297 0.3952703)  
            20) volatile>=0.385 254  89 0 (0.6496063 0.3503937) *
            21) volatile< 0.385 42  14 1 (0.3333333 0.6666667) *
          11) fixed>=10.05 41   8 1 (0.1951220 0.8048780) *
       3) alcohol>=10.15 581 140 1 (0.2409639 0.7590361) *


  • prune() 함수를 이용하여 가지치기를 하고 있다. 가지치기에 사용할 ‘cp’ 는 1-s.e. 법칙에 의한 ‘cp’ 값을 사용하는 부분이 포함되어 있다. 여기서 0.5-s.e. 법칙을 사용하려면 ’c=0.5’처럼 ’c’의 값을 변경해 주면 된다.
  • 위의 결과에는 1-s.e. 법칙에 의해 가지치기한 CART 의사결정나무의 결과가 텍스트 형태로 출력되어 있다. 노드번호, 분할규칙, 해당 노드의 총 관찰값 수, 해당 노드에서 오분류되는 관찰값 수, 해당 노드의 목표변수 예측값의 순서로 정보가 제공되고 있다. 그리고 괄호 안에는 목표변수의 각 집단별 비율을 보이고 있다. 줄 마지막에 있는 * 표시는 해당 노드가 최종노드임을 의미한다.
  • 가지치기가 수행된 의사결정나무를 나무형태의 그래프로 그리기 위해서는 다음과 같이 ‘prp()’ 함수를 사용하였다.

  • 3-5 의사결정나무의 그래프 출력
    # display tree
    prp(tree.pruned.wine, type = 4, extra = 1, digits = 2, box.palette = "Grays")


  • prp() 함수에서 ’type = 4’는 의사결정나무의 노드를 표현하는 방식을 의미하고, ’extra = 1’은 중간노드 내의 값을 출력하는 형식을 지정한다. ’digits = 2’는 출력값의 자릿수를 의미하고, ’box.palette = “Grays”’는 노드별 색상을 부여할 때의 색상표이다.
  • 위의 결과를 살펴 보면, 549개의 보통등급(‘0’ 범주)의 와인과 645개의 우수등급(‘1’ 범주)의 와인이 포함되어 있다. 이 뿌리노드를 좌우로 분할하는 분할규칙은 ‘alcohol < 10’인지 여부이다. 만약 사실이면 해당되는 와인은 좌측 노드로 내려가고, 만약 반대의 경우라면 우측노드로 내려가면 된다. 우측노드로 내려간 경우에는 140개의 ’0’ 범주의 와인과 441개의 ‘1’ 범주의 와인이 포함되어 있어 절대다수가 ‘1’ 범주인 우수등급 와인들이다. 반면 좌측노드를 보면 추가로 ‘sulphate’ 값에 의해 분할되는데, 이 변수가 0.58보다 큰지 혹은 작은지를 기준으로 추가로 분할되게 된다. 예를 들어 ‘sulphate < 0.58’에 의해 좌측노드에 속한 와인들은 222개의 ’0’ 범주의 와인과 54개의 ‘1’ 범주의 와인이 포함되어 있어 절대다수가 ‘0’ 범주인 보통등급 와인들이다.

  • (3) 분류정확도 계산하기


    와인품질 데이터에서 목표변수의 분류예측값을 구하고, 정확도를 평가하는 방법에 대해서 알아보자. 우선 분류예측 확률을 구하고, 이를 토대로 목표변수의 범주값을 예측하는 과정을 3-6에서 알 수 있다.


    3-6 CART 의사결정나무의 예측값 산출
    # making predictions - probability prediction
    prob.tree.wine <- predict(tree.pruned.wine, newdata = wine, type = "prob")
    head(prob.tree.wine, 5)
              0         1
    1 0.8043478 0.1956522
    2 0.6496063 0.3503937
    3 0.6496063 0.3503937
    4 0.1951220 0.8048780
    5 0.8043478 0.1956522
    cutoff <- 0.5  # cutoff
    yhat.tree.wine <- ifelse(prob.tree.wine[, 2] > cutoff, 1, 0)


    한가지 주목할 것은 ‘predict’ 명령문의 ’newdata’이다. 위의 코드에서는 ’newdata = wine’이라 하여 wine 데이터를 다시 사용하였기 때문에 기존 학습 데이터에 대한 분류나무의 분류예측값을 구할 수 있었다. 만일 ’newdata’에 wine 데이터와 도오일한 형식의 새로운 데이터를 사용하게 된다면, 새로운 데이터에 대한 예측값을 구할 수 있게 된다. 이것은 미래의 관찰값에 대한 예측을 수행해야 하는 경우에 필요한 기법이다.
  • ‘predict’ 명령문의 ’type = “prob”’는 목표변수의 범주값에 대한 예측확률을 의미한다. 만약 회귀나무라면 ’type = “vector”’라고 해야만 목표변수의 값을 예측한다.
  • 목표변수의 범주값에 대한 예측확률인 ’prob.tree.wine’이라는 개체는 범주 ’0’일 예측확률과 범주 ’1’일 예측확률을 포함하고 있다. 위의 결과에는 처음 5개 관찰값에 대한 두 범주별 예측확률이 출력되어 있다.
  • ‘ifelse()’ 명령어를 통해 ‘1’ 범주에 대한 예측확률값이 기준값인 cutoff = 0.5를 상회하면 ‘1’ 범주로 예측하고, 그렇지 않으면 ‘0’ 범주로 예측하는 부분을 포함하고 있다.

  • 3-7 CART 의사결정나무의 예측값과 실제 목표변수값 비교
    # evaluation
    tab <- table(wine$quality, yhat.tree.wine, dnn = c("Observed", "Predicted"))
    print(tab) # confusion matrix
            Predicted
    Observed   0   1
           0 387 162
           1 143 502
    sum(diag(tab) / sum(tab)) # accuracy
    [1] 0.7445561
    tab[2, 2] / sum(tab[2, ]) # sensitivity
    [1] 0.7782946
    tab[1, 1] / sum(tab[1, ]) # specificity
    [1] 0.704918


    table() 함수를 이용하여 학습 데이터의 실제 목표변수와 의사결정나무에 의해 예측된 목표변수의 예측값의 일치성을 확인하기 위해 빈도기준으로 분할표를 만들고 있다. 흔히 이 분할표를 ‘confusion matrix’라고 한다. 또한 보통등급(’0’ 범주)과 우수등급(‘1’ 범주)의 예측 결과에 대한 비교를 위해 정확도, 민감도, 특이도를 계산하는 부분이 나온다.


    결과에 따르면 보통 등급 와인을 보통 등급 와인으로 예측한 경우는 387번이고, 우수 등급 와인을 우수 등급 와인으로 예측한 경우는 502번이다. 따라서 학습 데이터에 대한 정확도는 (387 + 502) / 1,194 = 74.46%로 계산되었다. 총 645개의 우수등급 와인 중에서 실제로 우수 등급 와인으로 예측한 경우는 502번이다. 따라서 민감도는 502/645 = 77.8%이다. 마지막으로 총 549개의 보통 등급 와인 중에서 실제로 보통 등급 와인으로 예측한 경우는 387번이다. 따라서 특이도는 387/549=70.5%이다.




    3. 회귀의사결정나무 사례 분석


    회귀나무를 생성하는 사례분석으로 앞서 사용되었던 의류생산성 데이터(‘productivityREG.csv’)를 이용하여 CART 방법을 이용한 회귀나무를 구축해 보고자 한다.


    (1) 데이터 읽고 CART 의사결정나무 실행하기


    먼저 의류생산성 데이터가 담긴 ‘productivityREG.csv’ 파일을 확인한다. CART 의사결정나무를 실행하기 위해서 다음과 같이 수행하면 된다.

    # importing data
    prod <- read.csv("./data/productivityREG.csv", header = T)
    # factorizing predictor variables
    prod$quarter <- factor(prod$quarter)
    prod$department <- factor(prod$quarter)
    prod$day <- factor(prod$day)
    prod$team <- factor(prod$team)
    library(rpart)
    set.seed(1234)
    my.control <- rpart.control(xval = 10, cp = 0.01, minsplit = 30)
    tree.prod <- rpart(productivity ~ ., data = prod, method = "anova", control = my.control)
    print(tree.prod)
    n= 936 
    
    node), split, n, deviance, yval
          * denotes terminal node
    
      1) root 936 19.0783800 0.7745872  
        2) target< 0.725 256  5.9939720 0.6987081  
          4) over_time>=3210 147  1.9551960 0.6661212  
            8) incentive< 28 59  1.1297170 0.5911298 *
            9) incentive>=28 88  0.2712242 0.7163995 *
          5) over_time< 3210 109  3.6721560 0.7426556  
           10) numworkers< 9.5 72  2.3460690 0.6953575  
             20) team=2,6,7,9,10,11 28  0.8858318 0.5938276 *
             21) team=1,4,5,8,12 44  0.9879286 0.7599675 *
           11) numworkers>=9.5 37  0.8515788 0.8346949  
             22) team=8,9,11 10  0.2922560 0.6892305 *
             23) team=1,2,4,5,6,7,10 27  0.2693539 0.8885707 *
        3) target>=0.725 680 11.0555500 0.8031535  
          6) incentive< 84.5 626  9.5634660 0.7899670  
           12) smv< 3.4 74  1.4816030 0.6786105  
             24) numworkers< 8.5 61  0.9512037 0.6481869 *
             25) numworkers>=8.5 13  0.2090045 0.8213672 *
           13) smv>=3.4 552  7.0412290 0.8048952  
             26) smv>=30.25 13  0.2204477 0.6076220 *
             27) smv< 30.25 539  6.3026620 0.8096532  
               54) smv>=4.115 383  3.3506460 0.7921739  
                108) numworkers< 8.5 28  0.9711016 0.7003731 *
                109) numworkers>=8.5 355  2.1249660 0.7994145 *
               55) smv< 4.115 156  2.5477100 0.8525670  
                110) over_time< 1020 32  0.9787853 0.7835423  
                  220) team=3,7,9,10 20  0.5727786 0.7122460 *
                  221) team=1,2,4 12  0.1349048 0.9023694 *
                111) over_time>=1020 124  1.3771190 0.8703799 *
          7) incentive>=84.5 54  0.1213521 0.9560197 *

  • ‘quarter’, ‘department’, ‘day’, ‘team’ 변수는 범주형 변수이므로 factor() 함수를 사용해 범주형으로 인식되게 한다.
  • 제2장에서는 위의 범주형 변수들에 대해서 가변수를 생성했어야 하지만, 회귀의사결정나무모형에서는 범주형 변수를 가변수로 변환하지 않고 있는 그래도 사용할 수 있다.
  • 분류의사결정나무와 마찬가지로 회귀의사결정나무도 R에서는 ‘rpart’라는 패키지를 이용한다. ’rpart.control()’ 함수에서 10-fold 교차타당성 오분류율을 계산하고, 가지치기 방법에서 a(alpha)값은 0.01이 될 때까지 순차적인 나무구조를 저장하도록 한다. 그리고 노드를 나누는 최소 자료의 수인 ’minsplit’은 30개로 하였다.
  • ‘rpart()’ 명령어를 수행하는 부분을 보자. 의류생산성 데이터의 경우 목표변수는 생산성을 지칭하는 ‘productivity’ 변수가 되고 나머지 변수들은 입력변수가 되므로 R의 formula는 ’productivity ~ .’가 된다. 회귀나무를 생성하기 위해서는 ’method = “anova”’라고 지정해 주어야 한다.
  • 생성된 의사결정나무를 간단하게 출력하기 위해서는 ‘print()’ 함수를 사용하는데 이 결과는 노드번호, 분할규칙, 해당 노드의 총 관찰값 수, 해당 노드의 평균제곱오차, 해당 노드의 목표변수 평균값의 순서로 정보가 제공되고 있다. 줄 마지막에 있는 * 표시는 해당 노드가 최종노드임을 의미한다.

  • 의사결정나무를 나무형태의 그래프로 그리기 위해서는 다음과 같이 ‘prp()’ 함수를 사용하면 된다.


    3-9 의사결정나무 그래프의 출력
    # display tree
    library(rpart.plot)
    prp(tree.prod, type = 4, extra = 1, digits = 2, box.palette = "auto")


    위의 의사결정나무는 가지치기 전의 결과이므로 대단히 사이즈가 큰 상태이다. 이처럼 나무 구조가 과도하게 크면 의사결정나무를 해석하는 것이 매우 어려울 것이다.




    (2) 가지치기 수행하기


    의사결정나무의 가지치기를 수행하기 위해서는 다음처럼 가지치기 단계별 정보를 파악할 필요가 있다.


    3-10 CART 의사결정나무 가지치기 단계별 정보
    # pruning with c-s.e.
    cps <- printcp(tree.prod)
    
    Regression tree:
    rpart(formula = productivity ~ ., data = prod, method = "anova", 
        control = my.control)
    
    Variables actually used in tree construction:
    [1] incentive  numworkers over_time  smv        target     team      
    
    Root node error: 19.078/936 = 0.020383
    
    n= 936 
    
             CP nsplit rel error  xerror     xstd
    1  0.106343      0   1.00000 1.00131 0.051171
    2  0.071847      1   0.89366 0.91542 0.049271
    3  0.054545      2   0.82181 0.85369 0.048553
    4  0.027157      3   0.76726 0.78994 0.047001
    5  0.024380      4   0.74011 0.79369 0.049856
    6  0.021192      8   0.64221 0.76571 0.049399
    7  0.016846      9   0.62102 0.74842 0.049034
    8  0.015199     10   0.60417 0.74757 0.049209
    9  0.013344     11   0.58897 0.74632 0.049216
    10 0.012132     12   0.57563 0.73686 0.048710
    11 0.010000     14   0.55137 0.71037 0.046591


    가지치기를 수행하기 위해서 비용복잡함수의 a(alpha)와 해당되는 나무구조의 교차타당성 오류율을 알아야 한다. printcp() 함수에 의해 실행된 결과를 살펴 보자.

  • 결과에 따르면 10-fold 교차타당성(cross-validation) 방법에 의한 오류율이 최소가 되는 나무구조는 11번째 단계예 있는 나무구조이며 분리의 횟수가 14인 나무구조를 의미한다. 하지만 이 나무구조는 크기가 너무 방대하여 해석이 난해할 것이기 때문에, 1-s.e. 법칙을 사용하여 더 작은 크기의 회귀나무를 선택하기로 한다.
  • 1-s.e 법칙에 의하면 최소 교차타당성 오류율+표준오차는 0.756961 (=0.71037+0.046591)이다. 따라서 교차타당성 오류율이 0.756961보다 작은 나무구조 중에서 가장 작은 크기의 나무를 선택하면 7번째 단계이며, 분할의 횟수가 9번인 나무구조가 될 것이다.

  • 다음의 코드 3-11에는 prune() 함수를 이용하여 1-s.e. 법칙에 의한 ‘cp’ 값을 사용하여 가지치기 하는 부분이 포함되어 있다.


    3-11 1-s.e. 법칙으로 가지치기 수행
    # pruning with c-s.e.
    k <- which.min(cps[, "xerror"])
    err <- cps[k, "xerror"]; se <- cps[k, "xstd"]
    c <- 1  # 1-s.e.
    
    k1 <- which(cps[, "xerror"] <= err+c*se)[1]
    cp.chosen <- cps[k1, "CP"]
    treee.pruned.prod <- prune(tree.prod, cp=cp.chosen)
    print(treee.pruned.prod)
    n= 936 
    
    node), split, n, deviance, yval
          * denotes terminal node
    
     1) root 936 19.0783800 0.7745872  
       2) target< 0.725 256  5.9939720 0.6987081  
         4) over_time>=3210 147  1.9551960 0.6661212  
           8) incentive< 28 59  1.1297170 0.5911298 *
           9) incentive>=28 88  0.2712242 0.7163995 *
         5) over_time< 3210 109  3.6721560 0.7426556  
          10) numworkers< 9.5 72  2.3460690 0.6953575  
            20) team=2,6,7,9,10,11 28  0.8858318 0.5938276 *
            21) team=1,4,5,8,12 44  0.9879286 0.7599675 *
          11) numworkers>=9.5 37  0.8515788 0.8346949 *
       3) target>=0.725 680 11.0555500 0.8031535  
         6) incentive< 84.5 626  9.5634660 0.7899670  
          12) smv< 3.4 74  1.4816030 0.6786105 *
          13) smv>=3.4 552  7.0412290 0.8048952  
            26) smv>=30.25 13  0.2204477 0.6076220 *
            27) smv< 30.25 539  6.3026620 0.8096532  
              54) smv>=4.115 383  3.3506460 0.7921739 *
              55) smv< 4.115 156  2.5477100 0.8525670 *
         7) incentive>=84.5 54  0.1213521 0.9560197 *


    결과에서는 1-s.e. 법칙에 의해 가지치기한 CART 의사결정나무의 결과가 텍스트 형식으로 출력되어 있다. 노드번호, 분할규칙, 해당 노드의 총 관찰값 수, 해당 노드의 평균 제곱 오차, 해당 노드의 목표변수 예측값 (회귀나무일 때는 평균값)의 순서로 정보가 제공되고 있다. 줄 마지막에 있는 * 표시는 해당 노드가 최종 노드임을 의미한다.


    가지치기가 수행된 의사결정나무를 나무형태 그래프로 그리기 위해서 prp() 함수를 이용한다.


    3-12 의사결정나무 그래프 출력
    # display tree
    prp(treee.pruned.prod, type = 4, extra = 1, digits = 2, box.palette = "Grays")


    위의 그래프는 prp() 함수를 활용하여 1-s.e. 법칙에 의해 가지치기한 의사결정나무 그래프이다.
  • prp()에서 ‘type = 4’ : 의사결정나무의 노드를 표현하는 방식을 의미
  • ‘extra = 1’ : 중간노드 내의 값을 출력하는 형식을 지정한다.
  • ‘digits = 2’ : 출력값의 자릿수를 의미
  • ‘box.palette = “Grays”’ : 노드별 색상을 부여할 때의 색상표

  • 결과 그래프에서 뿌리노드를 살펴 보면 936개의 관찰값이 있고, 목표변수인 생산성의 평균값은 0.787이다. 이 뿌리노드를 좌우로 분할하는 분할규칙은 ’target < 0.73’인지 여부이다. 만약 사실이면 해당되는 관찰값은 좌측노드로 내려가고, 만약 반대의 경우라면 우측노드로 내려가면 된다. 좌측노드로 내려간 경우에는 총 256개의 관찰값이 있고 그 평균이 0.7이므로, 뿌리노드에 비하면 생산성이 낮아진 노드라고 할 수 있다. 반면 우측노드로 내려간 경우에는 680개의 관찰값과 평균 0.8의 생산성을 보이고 있다.


    좌측노드를 추가로 ‘over_time’ 값에 의해 분할했는데, 이 변수가 3,210보다 큰지 혹은 작은지를 기준으로 추가로 분할하게 된다. 예를 들어 ’over_time >= 3210’에 의해 좌측노드에 속하게 되는 관찰값들은 생산성의 평균이 0.67에 불과하다. 반면 뿌리노드에서 우측으로 간 노드를 다시 한 번 ’incentive >= 85’에 의해 분할을 하면 총 54개의 관찰값이 속하는데, 그들의 평균 생산성은 0.96으로 매우 높다.




    (3) 회귀예측 정확도 계산하기


    의류생산성 데이터에서 목표변수의 예측값을 구하고 평가하는 방법에 대해서 알아보자.


    3-13 CART 의사결정나무의 예측값 및 정확도 산출
    # making predictions
    pred.tree.prod <- predict(treee.pruned.prod, newdata = prod, type = "vector")
    head(pred.tree.prod, 5)
            1         2         3         4         5 
    0.9560197 0.8525670 0.7921739 0.7921739 0.7921739 

  • predict() 함수에 ’newdata = prod’라고 하여 prod 데이터를 다시 사용하였기 때문에 기존 학습 데이터에 대한 회귀나무의 예측값을 구할 수 있다. 만일 ’newdata’에 prod 데이터와 동일한 형식의 새로운 데이터를 사용하게 된다면 새로운 데이터에 대한 예측값을 구할 수 있다. 이것은 미래의 관찰값에 대한 예측을 수행해야 하는 경우에 필요한 기법이다.
  • predict() 함수의 ‘type = “vector”’ : 회귀나무에 해당하는 목표변수의 예측결과를 의미한다. 회귀나무에 의해 예측된 목표변수의 값은 ’pred.tree.prod’에 저장되어 있고, 처음 5개 관찰값에 대한 목표변수의 예측값을 출력하고 있다.

  • 아래는 평균제곱오차(Mean Squared Error, MSE)와 평균절대오차(Mean Absolute Error, MAE)를 계산하는 코드이다. 평균절대오차는 실제값과 계측값 차이의 절댓값들을 평균한 것이다. 출력값에 따르면 회귀나무의 평균제곱오차는 0.0127이고 평균절대오차는 0.0784이다.

    # evaluation
    mean((prod$productivity - pred.tree.prod)^2) # MSE
    [1] 0.01265816
    mean(abs(prod$productivity - pred.tree.prod)) # MAE
    [1] 0.07839877


    다음으로 CART 회귀이사결정나무의 예측값과 실제값의 일치도를 산점도로 그리고자 한다. 결과를 살펴 보면 회귀의사결정나무에서 최종노드 내 관찰값들의 평균값을 예측값으로 사용하기 때문에 동일한 값을 가진 점이 많은 것을 확인할 수 있다.


    3-14 CART 회귀의사결정나무의 예측값과 실제값의 산점도
    # observed vs. predicted
    plot(prod$productivity, pred.tree.prod, xlab = "Observed Values", ylab = "Fitted Values")
    abline(0, 1)

    LS0tCnRpdGxlOiAnW0RhdGEgTWluaW5nXSBjaGFwLjMgRGVjaXNpb24gVHJlZScKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgUuydhCDsnbTsmqntlZwg7Iuk7Iq1Cjxicj4KCiMjIyMgMS4g7J2Y7IKs6rKw7KCV64KY66y0IFIg7ZWo7IiYCjxicj4KCnJwYXJ0IHBhY2thZ2UgOiByZWN1cnNpdmUgcGFydGl0aW9uaW5nCjxicj4KCkNBUlQg7J2Y7IKs6rKw7KCV64KY66y07J2YIOyVjOqzoOumrOymmOydhCDqtaztmITtlZwg6rKD7J2064ukLiBycGFydCBwYWNrYWdl66GcIOu2hOulmOuCmOustOyZgCDtmozqt4DrgpjrrLQg66qo65GQ66W8IOyImO2Wie2VoCDsiJgg7J6I64ukLgo8YnI+Cjxocj4KPGJyPgoKIyMjIyMgKDEpIHJwYXJ0IO2VqOyImAoKW+2VqOyImOydmCDqtazsobBdCnJwYXJ0KGZvcm11bGEsIGRhdGEsIHdlaWdodHMsIHN1YnNldCwgbmEuYWN0aW9uPW5hLnJwYXJ0LCBtZXRob2QsIHBhcm1zLCBjb250cm9sLCBjb3N0LCAuLi4pCgpb6riw64qlXQrtm4jroKgg642w7J207YSw66W8IOydtOyaqe2VmOyXrCDsnZjsgqzqsrDsoJXrgpjrrLTrpbwg7IOd7ISx7ZWc64ukLiBS7J2YIHJwYXJ0IOyYpOu4jOygne2KuOulvCDsg53shLHtlZzri6QuCgpb7Ji17IWYXQo8bGk+IGZvcm11bGEgOiBS7JeQ7IScIOyCrOyaqe2VmOuKlCDrqqjtmJUg6rSA66CoIOqzteyLnS4g7Ji17IWYIGRhdGHsnZgg642w7J207YSwIO2UhOugiOyehOyXkCDsobTsnqztlZjripQg67OA7IiYIOydtOumhOunjCDsgqzsmqkg6rCA64ql7ZWY64ukLjwvbGk+CjxsaT4gZGF0YSA6IO2biOugqCDrjbDsnbTthLDsl5Ag7ZW064u57ZWY64qUIOuNsOydtO2EsCDtlITroIjsnoQg7J2066aEPC9saT4KPGxpPiB3ZWlnaHRzIDog7ZuI66CoIOuNsOydtO2EsOydmCDqtIDssLDqsJLsl5Ag64yA7ZWcIOqwgOykkey5mCDrsqHthLAuIGRlZmF1bHTripQg6reg65Ox6rCA7KSR7LmYPC9saT4KPGxpPiBzdWJzZXQgOiDsobDqsbTsl5Ag66ee64qUIO2biOugqCDrjbDsnbTthLDsnZgg7J2867aA67aE66eMIOyCrOyaqe2VmOqzoOyekCDtlaAg65WMLiBkZWZhdWx064qUIOyghOyytCDsgqzsmqk8L2xpPgo8bGk+IG5hLmFjdGlvbiA9IG5hLnJwYXJ0IDog66qp7ZGc67OA7IiY6rCAIOqysOy4oey5mOydtOuptCDsoITssrQg6rSA7LCw6rCS7J2EIOyCreygnC4g7J6F66Cl67OA7IiY6rCAIOqysOy4oey5mOyduCDqsr3smrDsl5DripQg7IKt7KCc7ZWY7KeAIOyViuydjDwvbGk+CjxsaT4gbWV0aG9kIDog7J2Y7IKs6rKw7KCV64KY66y07J2YIOyiheulmOulvCDsp4DsoJUuICJhbm92YSIsICJwb2lzc29uIiwgImNsYXNzIiwgImV4cCIg7KSR7JeQ7IScIOyEoO2Dne2VtOyVvCDtlZjrqbAsICJhbm92YSIg7ISg7YOd7IucIO2ajOq3gOuCmOustCwgInBvaXNzb24iIOyEoO2DneyLnCDtj6zslYTshqEg7ZqM6reA64KY66y0LCAiY2xhc3MiIOyEoO2DneyLnCDrtoTrpZjrgpjrrLQsICJleHAiIOyEoO2DneyLnCDsg53sobTrgpjrrLTqsIAg7IOd7ISx65CoLiBkZWZhdWx064qUICJjbGFzcyI8L2xpPgo8bGk+IHBhcm1zIDog67aE7ZWg7J2EIOychO2VnCDsmLXshZguIO2ajOq3gOuCmOustOyXkOuKlCDtlbTri7nsgqztla3snbQg7JeG6rOgLCDrtoTrpZjrgpjrrLTsl5DripQg7IKs7KCE7ZmV66Wg7J2EIOyjvOqxsOuCmCDrtojsiJzrj4Qg7ZWo7IiY66W8IOyngOygle2VoCDrlYwg7IKs7JqpLiDsmIjrpbwg65Ok7Ja0IHBhcm1zID0gbGlzdChwcmlvcj1jKDAuNjUsIDAuMzUpLCBzcGxpdD0iaW5mb3JtYXRpb24iKeyduCDqsr3smrAsIOynkeuLqCAx6rO8IOynkeuLqCAy7J2YIOyCrOyghCDtmZXrpaDsnYAgNjU6MzXsnbTri6QuIOu2iOyInOuPhCDtlajsiJjripQg7JeU7Yq466Gc7ZS8IO2VqOyImCDsgqzsmqnsnYQg7J2Y66+47ZWoLiBkZWZhdWx064qUIOynkeuLqCDqsIQg642w7J207YSwIOu5hOycqChwcm9wb3J0aW9uKSDsgqzsoITtmZXrpaDqs7wg7KeA64uI6rOE7IiYIDwvbGk+CjxsaT4gY29udHJvbCA6IHJwYXJ0LmNvbnRyb2zqs7wg6rCZ7J2AIOyXre2VoCAocnBhcnQuY29udHJvbOyXkOyEnCDshKTrqoUpPC9saT4KPGxpPiBjb3N0IDog7Jik67aE66WYIOu5hOyaqeydhCDsp4DsoJXtlaAg65WMIOyCrOyaqS4gZGVmYXVsdOuKlCDqt6Drk7HruYTsmqk8L2xpPgoKPGJyPgo8aHI+Cjxicj4KCiMjIyMjICgyKSBycGFydC5jb250cm9sIO2VqOyImAo8YnI+ClvtlajsiJjsnZgg6rWs7KGwXQpycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMjAsIG1pbmJ1Y2tldCA9IHJvdW5kKG1pbnNwbGl0LzMpLCBjcD0wLjAxLCBtYXhjb21wZXRlID0gNCwgbWF4c3Vycm9nYXRlPTUsIHh2YWw9MTAsIG1heGRlcHRoPTMwLCAuLi4pCgpb6riw64qlXQrsnZjsgqzqsrDsoJXrgpjrrLTrpbwg7IOd7ISx7ZWgIOuVjCwg67aE7ZWg6rec7LmZIOuTseydhCDsoJXtlZzri6QuCgpb7Ji17IWYXQo8bGk+IG1pbnNwbGl0IDog7ZWcIOuFuOuTnOulvCDrtoTtlaDtlZjquLAg7JyE7ZW0IO2VhOyalO2VnCDrjbDsnbTthLDsnZgg6rCc7IiYLiDsnbQg6rCS67O064ukIOyggeydgCDsiJjsnZgg6rSA7LCw6rCS7J20IOyeiOuKlCDrhbjrk5zripQg67aE7ZWg7ZWY7KeAIOyViuydjC4gZGVmYXVsdOuKlCAyMOqwnDwvbGk+CjxsaT4gbWluYnVja2V0IDog7LWc7KKF64W465Oc7JeQIO2PrO2VqOuQmOyWtOyVvCDtlZjripQg7LWc7IaMIOuNsOydtO2EsOydmCDqsJzsiJguIG1pbnNwbGl07J20IOyngOygleuQmOuptCDsnpDrj5nsnLzroZwgbWluc3BsaXQvM+ycvOuhnCDsp4DsoJXrkJjqs6AsIG1pbmJ1Y2tldOuztOuLpCDsoIHsnYAg7IiY7J2YIOq0gOywsOqwkuydtCDsnojripQg64W465Oc64qUIOunjOuTpOyngCDslYrqsowg65CoPC9saT4KPGxpPiBjcCA6IOu5hOyaqeuzteyeoe2VqOyImOydmCDrsozsoJAg66qo7IiYLiDrhbjrk5zrpbwg67aE7ZWg7ZWgIOuVjCDrtoTtlaAg7KCE6rO8IOu5hOq1kO2VmOyXrCDsmKTrtoTrpZjsnKjsnbQgY3Ag6rCSIOydtOyDgeycvOuhnCDtlqXsg4HrkJjsp4Ag7JWK7Jy866m0IOuNlCDsnbTsg4Eg67aE7ZWg7ZWY7KeAIOyViuqzoCDrgpjrrLQg6rWs7KGwIOyDneyEseydhCDrqYjstpjri6QuIGRlZmF1bHTripQgMC4wMTwvbGk+CjxsaT4gbWF4Y29tcGV0ZSA6IENBUlQg67aE7ZWg67Cp67KV7JeQ7IScIOyasOyImO2WiOuNmCDrtoTtlaDtm4Trs7TsoJDsnYQgbWF4Y29tcGV0ZSDqsJzsiJjrp4ztgbwg7Lac66ClLiBkZWZhdWx0IOuKlCA06rCcPC9saT4KPGxpPiBtYXhzdXJyb2dhdGUgOiDqsrDqs7zrrLzsl5Ag7Lac66Cl7ZWgIOyEnOuhnOqyjOydtO2KuCDrtoTtlaDsoJDsnZgg6rCc7IiY66W8IOyngOyglSjshJzroZzqsozsnbTtirjrnoAg6rKw7Lih7LmY66W8IOyymOumrO2VmOq4sCDsnITtlZwg64yA7LK0IOu2hO2VoOuyleydmCDsnbzsooXsnoQpLiBkZWZhdWx064qUIDXqsJw8L2xpPgo8bGk+IHh2YWwgOiDqsIDsp4DsuZjquLDrpbwg7JyE7ZWcIOq1kOywqO2DgOuLueyEseydmCBmb2xkIOqwnOyImC4gZGVmYXVsdOuKlCAxMDwvbGk+CjxsaT4gbWF4ZGVwdGggOiDrgpjrrLTqtazsobDsnZgg6rmK7J2066W8IOyEpOyglS4g67+M66as64W465Oc6rCAIDDsnbTqs6AsIOqwgOuguSBtYXhkZXB0aD017J2066m0IOuCmOustOq1rOyhsOuKlCDrv4zrpqzrhbjrk5zroZzrtoDthLAgNeuLqOqzhCDslYTrnpjroZwg64K066Ck6rCQLiBkZWZhdWx064qUIDMwPC9saT4KCjxicj4KPGhyPgo8YnI+CgojIyMjIyAoMykgcHJpbnRjcCDtlajsiJgKPGJyPgpb7ZWo7IiY7J2YIOq1rOyhsF0KcHJpbnRjcCh4LCBkaWdpdHMgPSBnZXRPcHRpb24oImRpZ2l0cyIpIC0gMikKCjxicj4KW+q4sOuKpV0KUuydmCBycGFydCDsmKTruIzsoJ3tirjrpbwg64yA7IOB7Jy866GcIGNwIOqwkuyXkCDrjIDtlZwg64KY66y06rWs7KGwIOyInOyEnOulvCDstpzroKXtlZzri6QuCgo8YnI+ClvsmLXshZhdCjxsaT4geCA6IHJwYXJ0IOyYpOu4jOygne2KuCDsnbTrpoQ8L2xpPgo8bGk+IGRpZ2l0cyA6IOy2nOugpe2VoCDsiKvsnpDsnZgg7IaM7Iir7KCQIOydtO2VmCDsnpDrpr/siJg8L2xpPgoKPGJyPgo8aHI+Cjxicj4KCiMjIyMjICg0KSBwcnVuZS5ycGFydCDtlajsiJgKPGJyPgpb7ZWo7IiY7J2YIOq1rOyhsF0KcHJ1bmUodHJlZSwgY3AsIC4uLikKCjxicj4KW+q4sOuKpV0K7J2Y7IKs6rKw7KCV64KY66y07J2YIOqwgOyngOy5mOq4sOulvCDsi6Tsi5ztlZzri6QuCgo8YnI+ClvsmLXshZhdCjxsaT4gdHJlZSA6IHJwYXJ0IOyYpOu4jOygne2KuOydmCDsnbTrpoQ8L2xpPgo8bGk+IGNwIDog6rCA7KeA7LmY6riw7ZWgIOu5hOyaqeuzteyeoe2VqOyImOydmCDrsozsoJDrqqjsiJjqsJI8L2xpPgoKPGJyPgo8aHI+Cjxicj4KCiMjIyMjICg1KSBwbG90LnJwYXJ0IO2VqOyImAo8YnI+ClvtlajsiJjsnZgg6rWs7KGwXQpwbG90KHgsIHVuaWZvcm09RkFMU0UsIGJyYW5jaD0xLCBjb21wcmVzcz1GQUxTRSwgbnNwYWNlLCBtYXJnaW49MCwgLi4uKQoKPGJyPgpb6riw64qlXQrsg53shLHrkJwg7J2Y7IKs6rKw7KCV64KY66y066W8IOuCmOustOq3uOumvOycvOuhnCDtkZztmITtlZzri6QuCgo8YnI+ClvsmLXshZhdCjxsaT4geCA6IHJwYXJ0IOyYpOu4jOygne2KuCDsnbTrpoQ8L2xpPgo8bGk+IHVuaWZvcm0gOiDrtoDrqqjrhbjrk5zsmYAg7J6Q7Iud64W465Oc7J2YIOqwhOqyqSDtgazquLAuIOunjOyVvSBGQUxTReydtOuptCDrtoTtlaDqsJzshKDrj4Tsl5Ag67mE66GA7ZWY7JesIOqwhOqyqeydtCDsu6Tsp4DqsbDrgpgg7J6R7JWE7KeA6rOgLCBUUlVF7J2066m0IOq3oOuTse2VnCDqsITqsqnsnYQg7Jyg7KeA7ZWoLiBkZWZhdWx064qUIEZBTFNFPC9saT4KPGxpPiBicmFuY2ggOiDspJHqsITrhbjrk5zrpbwg7J6H64qUIOqwgOyngOydmCDtmJXtg5wuIOunjOyVvSAx7J2066m0IOyngeq1kO2YleydtOqzoCwgMOydtOuptCBW7J6QIO2Yle2DnOydtOupsCwgMOqzvCAxIOyCrOydtCDqsJLsnbTrqbQg7KeB6rWQ7JmAIFbsnpDsnZgg7Zi87ZWp7ZiV7J6ELiBkZWZhdWx064qUIDE8L2xpPgo8bGk+IGNvbXByZXNzIDog7Lac66ClIOyLnCDrhbjrk5zsnZgg67Cw7LmY7JeQIOq0gO2VnCDsgqztla0uIOunjOyVvSBUUlVF7J2066m0IOuNlCDslZXstpXrkJwg7J2Y7IKs6rKw7KCV64KY66y0IOq3uOumvOydhCDstpzroKUuIGRlZmF1bHTripQgRkFMU0U8L2xpPgo8bGk+IG5zcGFjZSA6IOykkeqwhOuFuOuTnOyZgCDstZzsooXrhbjrk5wg7IKs7J207J2YIOqzteqwhCDsl6zrsLEg6rCSLiBkZWZhdWx064qUIGJyYW5jaOydmCDqsJLqs7wg64+Z7J28PC9saT4KPGxpPiBtYXJnaW4gOiDrgpjrrLQg7Lac66ClIOyLnCDso7zrs4Ag7Jes67CxIOqwki4g64SI66y0IOyekeydgCDqsJLsnYQg7IKs7Jqp7ZWY66m0IOu2hO2VoOq3nOy5meydtCDsnpjrpqzripQg6rK97Jqw64+EIOyeiOydjC4gZGVmYXVsdOuKlCAwPC9saT4KCjxicj4KPGhyPgo8YnI+CgojIyMjIyAoNikgdGV4dC5ycGFydCDtlajsiJgKPGJyPgpb7ZWo7IiY7J2YIOq1rOyhsF0KdGV4dCh4LCBzcGxpdHM9VFJVRSwgYWxsPUZBTFNFLCBkaWdpdHM9Z2V0T3B0aW9uKCJkaWdpdHMpIC0gMywgdXNlLm49RkxBU0UsIGZhbmN5PUZBTFNFLCBmd2lkdGg9MC44LCBiZz1wYXIoImJnIiksIGNvbCwgLi4uKQoKPGJyPgpb6riw64qlXQpwbG907JeQIOydmO2VtCDqt7jroKTsp4Qg64KY66y06rWs7KGw7JeQIO2FjeyKpO2KuOulvCDsgr3snoXtlZzri6QuCgo8YnI+ClvsmLXshZhdCjxsaT4geCA6IHJwYXJ0IOyYpOu4jOygne2KuCDsnbTrpoQ8L2xpPgo8bGk+IHNwbGl0cyA6IOuCmOustCDstpzroKUg7IucIOu2hO2VoOq3nOy5meuPhCDtlajqu5gg7Lac66Cl7ZWY64qU7KeAIOyXrOu2gC4gZGVmYXVsdOuKlCBUUlVFLiA8L2xpPgo8bGk+IGFsbCA6IOy1nOyiheuFuOuTnOunjCDrtoTrpZjsp5Hri6jrqoXsnYQg7Lac66Cl7ZWg7KeAIOyXrOu2gC4gVFJVReydtOuptCDspJHqsITrhbjrk5zsl5Drj4Qg67aE66WY7KeR64uo7J2EIOy2nOugpS4gZGVmYXVsdOuKlCBGQUxTRSA8L2xpPgo8bGk+IGRpZ2l0cyA6IOu2hO2VoOq3nOy5meyXkCDsgqzsmqntlaAg7IaM7Iir7KCQIOydtO2VmCDsnpDrpr/siJggPC9saT4KPGxpPiB1c2UubiA6IOy1nOyiheuFuOuTnOyXkCDrjIDtlZwg7KCV67O0IOy2nOugpS4gVFJVReydtOuptCDsoJXrs7Trpbwg7Lac66ClLiDrtoTrpZjrgpjrrLTsnbTrqbQg6rCBIOynkeuLqOuzhCDqtIDssLDqsJIg6rCc7IiY66W8IOy2nOugpe2VmOqzoCwg7ZqM6reA64KY66y07J2066m0IOy1nOyiheuFuOuTnOydmCDqtIDssLDqsJIg6rCc7IiY66W8IOy2nOugpS4gZGVmYXVsdOuKlCBGQUxTRSA8L2xpPgo8bGk+IGZhbmN5IDogVFJVReydtOuptCDspJHqsITrhbjrk5zripQg7YOA7JuQ7Jy866GcLCDstZzsooXrhbjrk5zripQg7KeB7IKs6rCB7ZiV7Jy866GcIOy2nOugpS4gZGVmYXVsdOuKlCBGQUxTRTwvbGk+CjxsaT4gZndpZHRoIDogZmFuY3kg7Ji17IWY7J20IFRSVUXsnbwg65WMIOyCrOyaqe2VmOuKlCDqsoPsnLzroZwsIO2DgOybkOqzvCDsp4HsgqzqsIHtmJXsnZgg64ST7J2066W8IOyhsOygiCwgZGVmYXVsdOuKlCAwLjggPC9saT4KPGxpPiBmaGVpZ2h0IDogZmFuY3kg7Ji17IWY7J20IFRSVUXsnbwg65WMIOyCrOyaqe2VmOuKlCDqsoPsnLzroZwsIO2DgOybkOqzvCDsp4HsgqzqsIHtmJXsnZgg64aS7J2066W8IOyhsOygiC4gZGVmYXVsdOuKlCAwLjggPC9saT4KPGxpPiBiZyA6IGZhbmN5IOyYteyFmOydtCBUUlVF7J28IOuVjCDsgqzsmqntlZjripQg6rKD7Jy866GcLCDrgpjrrLTsnZgg67Cw6rK9IOyDieyDgSA8L2xpPgo8bGk+IGNvbCA6IOuCmOustOydmCDrrLjsnpAg7IOJ7IOBIDwvbGk+Cgo8YnI+Cjxocj4KPGJyPgoKIyMjIyMgKDcpIHByZWRpY3QucnBhcnQg7ZWo7IiYCgo8YnI+ClvtlajsiJjsnZgg6rWs7KGwXQpwcmVkaWN0KG9iamVjdCwgbmV3ZGF0YSwgdHlwZT1jKCJ2ZWN0b3IiLCAicHJvYiIsICJjbGFzcyIsICJtYXRyaXgiKSwgbmEuYWN0aW9uPW5hLnBhc3MsIC4uLikKCjxicj4KW+q4sOuKpV0K7IOd7ISx65CcIOydmOyCrOqysOygleuCmOustCDsmKTruIzsoJ3tirjsl5Ag7IOI66Gc7Jq0IOuNsOydtO2EsCBuZXdkYXRh66W8IOyggeyaqe2VmOyXrCDsmIjsuKHtlZzri6QuCgo8YnI+ClvsmLXshZhdCjxsaT4gb2JqZWN0IDogcnBhcnQg7Jik67iM7KCd7Yq4IOydtOumhCA8L2xpPgo8bGk+IG5ld2RhdGEgOiDsmIjsuKHsnZgg64yA7IOB7J24IOuNsOydtO2EsCDtlITroIjsnoQgPC9saT4KPGxpPiB0eXBlIDog67aE66WY64KY66y07J24IOqyveyasCAidmVjdG9yIuydtOuptCDsmIjsuKHrkJwg7KeR64uo66qF7J20IOy2nOugpeuQmOqzoCwgInByb2Ii7J2066m0IOynkeuLqOuzhCDsmIjsuKHtmZXrpaDsnbQg7Lac66Cl65CY66mwLCAiY2xhc3Mi7J2066m0IOyYiOy4oeuQnCDsp5Hri6jsnbQgZmFjdG9yIO2Yle2DnOuhnCDstpzroKXrkJjqs6AsICJtYXRyaXgi7J2066m0IOychOydmCDrqqjrk6Ag6rK77J2EIOy2nOugpS4g7ZqM6reA64KY66y07J24IOqyveyasCwgInZlY3RvciIg7Zi57J2AICJtYXRyaXgi7J2066m0IOyYiOy4oeqwkuydtCDstpzroKXrkJjqs6AsIOuLpOuluCDsmLXshZjsnYAg7ZqM6reA64KY66y07JmAIOq0gOqzhOqwgCDsl4bsnYwgPC9saT4KPGxpPiBuYS5hY3Rpb24gOiBuZXdkYXRh7J2YIOqysOy4oey5mOyXkCDrjIDtlZwg7LKY66asIOuwqeuylS4gbmEub21pdOuKlCDqsrDsuKHsuZjrpbwg7KCc7Jm47ZWY64qUIOuwqeuyleydtOqzoCwgbmEucGFzc+uKlCDshJzroZzqsozsnbTtirgg67aE7ZWg7J2EIOydtOyaqe2VmOuKlCDrsKnrspXsnoQgKOyEnOuhnOqyjOydtO2KuOuegCDqsrDsuKHsuZjrpbwg7LKY66as7ZWY6riwIOychO2VnCDrjIDssrQg67aE7ZWg67KV7J2YIOydvOyiheyehCkuIGRlZmF1bHTripQgbmEucGFzcyA8L2xpPgoKPGJyPgo8aHI+Cjxicj4KCiMjIyMjICg4KSBwcnAg7ZWo7IiYCjxicj4K7J2Y7IKs6rKw7KCV64KY66y0IOyDneyEsSDtlajsiJjsnbggcnBhcnTsl5Ag7J2Y7ZW0IOyDneyEseuQnCBycGFydCDsmKTruIzsoJ3tirjripQgcnBhcnQucGxvdCDsnbTrnbzripQg7Yyo7YKk7KeA66W8IO2ZnOyaqe2VmOuptCDrjZQg67O06riwIOyii+qyjCDrgpjrrLQg6rWs7KGw66W8IOy2nOugpe2VoCDsiJgg7J6I64ukLiBycGFydC5wbG90IO2MqO2CpOyngOydmCBwcnAg7ZWo7IiY66W8IOyGjOqwnO2VnOuLpC4KCjxicj4KW+2VqOyImOydmCDqtazsobBdCnBycChvYmplY3QsIHR5cGU9MiwgZXh0cmE9ImF1dG8iLCBkaWdpdHM9MiwgYm94LnBhbGV0dGU9ImF1dG8iLCAuLi4pCgo8YnI+ClvquLDriqVdCuyDneyEseuQnCDsnZjsgqzqsrDsoJXrgpjrrLQg7Jik67iM7KCd7Yq466W8IOuCmOustOq1rOyhsOydmCDtmJXtg5zroZwg7Lac66Cl7ZWc64ukLgoKPGJyPgpb7Ji17IWYXQo8bGk+IG9iamVjdCA6IHJwYXJ0IOyYpOu4jOygne2KuCDsnbTrpoQgPC9saT4KPGxpPiB0eXBlIDog7J2Y7IKs6rKw7KCV64KY66y0IOy2nOugpSDtmJXsi50g7KeA7KCVLiAw7J2066m0IOykkeqwhOuFuOuTnOulvCDqt7jrpqzsp4Ag7JWK6rOgLCAx7J2066m0IOykkeqwhOuFuOuTnOulvCDrj4TtmJXsnLzroZwg7ZGc7ZiE7ZWY6rOgIOuFuOuTnOulvCDrtoTtlaDtlZjripQg7KGw6rG07J2EIOuFuOuTnCDsnITsqr3sl5Ag7Lac66ClLCAy7J2066m0IOykkeqwhOuFuOuTnOulvCDqt7jrpqzrqbTshJwg64W465Oc66W8IOu2hO2VoO2VmOuKlCDsobDqsbTsnYQg64W465OcIOyVhOuemOyqveyXkCDstpzroKUsIDPsnbTrqbQg7KSR6rCE64W465Oc66W8IOq3uOumrOyngCDslYrsnLzrqbTshJwg7Jm87Kq97Jy866GcIOu2hO2VoO2VmOuKlCDsobDqsbTqs7wg7Jik66W47Kq97Jy866GcIOu2hO2VoO2VmOuKlCDsobDqsbTsnYQg66qo65GQIOy2nOugpSwgNOydtOuptCDspJHqsITrhbjrk5zrpbwg6re466as66m07IScIOyZvOyqveycvOuhnCDrtoTtlaDtlZjripQg7KGw6rG06rO8IOyYpOuluOyqveycvOuhnCDrtoTtlaDtlZjripQg7KGw6rG07J2EIOuqqOuRkCDstpzroKXtlaggPC9saT4KPGxpPiBleHRyYSA6IOykkeqwhOuFuOuTnCDrgrTsnZgg7Lac66ClIO2YleyLneydhCDsp4DsoJUuIDDsnbgg6rK97JqwIOu2hOulmOuCmOustOydtOuptCDri6TsiJgg67KU7KO866W8IOy2nOugpe2VmOqzoCDtmozqt4DrgpjrrLTsnbTrqbQg64W465Oc7J2YIOuqqe2RnOuzgOyImCDtj4nqt6DsnYQg7Lac66ClLiAx7J24IOqyveyasCAwIOyYteyFmOydmCDqsrDqs7zsl5Ag7LaU6rCA7ZWY7JesIOu2hOulmOuCmOustOydtOuptCDrspTso7zrs4Qg6rSA7LCw6rCSIOqwnOyImCDstpzroKUsIO2ajOq3gOuCmOustOydtOuptCDrhbjrk5zsnZgg7LSdIOq0gOywsOqwkiDqsJzsiJgg7Lac66ClLCAy7J24IOqyveyasCDrtoTrpZjrgpjrrLTsnbgg6rK97JqwIOuLpOyImCDrspTso7zsnZgg6rSA7LCw6rCSIOqwnOyImOyZgCDstJ0g6rSA7LCw6rCSIOqwnOyImOulvCDstpzroKXtlaguIO2ajOq3gOuCmOustOuKlCDtlbTri7kg7IKs7ZWtIOyXhuydjC4gPC9saT4KPGxpPiBkaWdpdHMgOiDstpzroKUg7IucIOyCrOyaqe2VmOuKlCDshozsiKvsoJAg7J6Q66a/7IiYLiBkZWZhdWx064qUIDIgPC9saT4KPGxpPiBib3gucGFsZXR0ZSA6IOuFuOuTnOuzhOuhnCDrqqntkZzrs4DsiJjsnZgg7JqU7JW96rCS7J2EIOyDieyDgeycvOuhnCDtkZztmITtlZjripQg7IOJ7IOB7ZGcICdhdXRvJ+yduCDqsr3smrAg66qo64247J2YIO2Yle2DnOyXkCDrlLDrnbwg7J6Q64+Z7Jy866GcIOyEoO2Dne2VmOqzoCwgJ0dyYXlzJ+yduCDqsr3smrAg7ZqM7IOJ7Jy866GcIO2RnO2YhO2VqCA8L2xpPgoKPGJyPgo8aHI+Cjxicj4KCiMjIyMgMi4g67aE66WY7J2Y7IKs6rKw7KCV64KY66y0IOyCrOuhgCDrtoTshJ0KPGJyPgrrtoTrpZjsnZjsgqzqsrDsoJXrgpjrrLTrpbwg7IOd7ISx7ZWY64qUIOyCrOuhgOu2hOyEneycvOuhnCDslZ7shJwg7IKs7Jqp65CY7JeI642YIOyZgOyduO2SiOyniCDrjbDsnbTthLAoJ3dpbmVxdWFsaXR5Q0xBU1MuY3N2Jynrpbwg7J207Jqp7ZWY7JesIOqwgOyepSDrjIDspJHsoIEg7J2Y7IKs6rKw7KCV64KY66y07J24IENBUlQg67Cp67KV7J2EIOydtOyaqe2VnCDsnZjsgqzqsrDsoJXrgpjrrLTrpbwg6rWs7LaV7ZW0IOuzuOuLpC4KCjxicj4KCiMjIyMjICgxKSDrjbDsnbTthLDrpbwg7J296rOgIENBUlQg7J2Y7IKs6rKw7KCV64KY66y0IOyLpO2Wie2VmOq4sArrqLzsoIAg7JmA7J24IO2SiOyniCDrjbDsnbTthLDqsIAg64u06ri0ICd3aW5lcXVhbGl0eUNMQVNTLmNzdicg7YyM7J287J2EIO2ZleyduO2VnOuLpC4g642w7J207YSwIO2MjOydvOydhCDsnb3qs6AgQ0FSVCDsnZjsgqzqsrDsoJXrgpjrrLTrpbwg7Iuk7ZaJ7ZWY6riwIOychO2VtOyEnCA8UiAzLTE+6rO8IOqwmeydtCDsiJjtlontlZjrqbQg65Cc64ukLgoKPGJyPgoKIyMjIyMjIDMtMSDsnZjsgqzqsrDsoJXrgpjrrLQg7Iuk7ZaJCmBgYHtyfQojIGltcG9ydGluZyBkYXRhCndpbmUgPC0gcmVhZC5jc3YoIi4vZGF0YS93aW5lcXVhbGl0eUNMQVNTLmNzdiIpCmBgYAoKYGBge3J9CiMgZmFjdG9yaXplIGZvciBjbGFzc2lmaWNhdGlvbgp3aW5lJHF1YWxpdHkgPC0gZmFjdG9yKHdpbmUkcXVhbGl0eSkKYGBgCgpgYGB7cn0KIyBjbGFzc2lmaWNhdGlvbiB0cmVlCmxpYnJhcnkocnBhcnQpCmBgYAoKYGBge3J9CnNldC5zZWVkKDEyMzQpCm15LmNvbnRyb2wgPC0gcnBhcnQuY29udHJvbCh4dmFsID0gMTAsIGNwID0gMCwgbWluc3BsaXQgPSAyMCkKdHJlZS53aW5lIDwtIHJwYXJ0KHF1YWxpdHkgfiAuLCBkYXRhID0gd2luZSwgbWV0aG9kID0gImNsYXNzIiwgY29udHJvbCA9IG15LmNvbnRyb2wpCnByaW50KHRyZWUud2luZSkKYGBgCgo8YnI+CjxsaT4g66qp7ZGc67OA7IiY7J24ICdxdWFsaXR5JyDrs4DsiJjripQg7JmA7J247J2YIO2SiOyniOydtCDsmrDsiJjrk7HquInsnbgg6rK97JqwIDHsnZgg6rCS7J2EIOqwgOyngOqzoCwg67O07Ya165Ox6riJ7J24IOqyveyasCAw7J2YIOqwkuydhCDqsIDsp4DripQg67KU7KO87ZiVIOuzgOyImOydtOuvgOuhnCwg7J2066W8IGZhY3RvcigpIO2VqOyImOulvCDthrXtlbQg67KU7KO87ZiVIOuzgOyImOuhnCDrs4Dqsr3tlZjsmIDri6QuIOunjOyVvSDsnbTroIfqsowg7ZWY7KeAIOyViuycvOuptCAw6rO8IDHsnbTrnbzripQg7KCV7IiY7ZiVIOuzgOyImOuhnCDsnbjsi53tlZjqsowg65CY7Ja0IO2ajOq3gOuCmOustOulvCDsiJjtlontlZjqsowg65CgIOychO2XmOydtCDsnojri6QuIENBUlQg67Cp67KV7J2EIFLsl5DshJwg7IiY7ZaJ7ZWY6riwIOychO2VtOyEnOuKlCAncnBhcnQn652864qUIO2MqO2CpOyngOulvCDsmrDshKAg7Zi47Lac7ZWc64ukLiA8L2xpPgo8bGk+ICdzZXQuc2VlZCgxMjM0KScg66qF66C57Ja066W8IOyImO2Wie2VmOuKlOuNsCwg7J2064qUIOqwgOyngOy5mOq4sOulvCDsnITtlZwg6rWQ7LCo7YOA64u57ISx7J2EIOyImO2Wie2VmOuKlCDqs7zsoJXsl5DshJwg66y07J6R7JyEIOuCnOyImOqwgCDsgqzsmqnrkJjquLAg65WM66y47JeQIOuCnOyImOydmCDrsJzsg53snYQg7JyE7ZWcIOyLnOuTnOuyiO2YuOulvCDsoJXtlbTso7zripQg7Jet7ZWg7J2EIO2VnOuLpC4g7J2066CH6rKMIO2VmOuptCDrp6Trsogg64+Z7J287ZWcIOuCmOyImOqwgCDsg53shLHrkJjrr4DroZwg6rCA7KeA7LmY6riw66W8IOyImO2Wie2VtOuPhCDrj5nsnbztlZwg6rKw6rO866W8IOyerO2YhO2VoCDsiJgg7J6I64ukLiA8L2xpPgo8bGk+IENBUlQg67aE66WY64KY66y0IOyDneyEseydhCDsnITtlbQg7IiY7ZaJ7ZW0IOuzvCDsiJgg7J6I64qUIOuLpOyWke2VnCDsmLXshZjsnYAgJ3JwYXJ0LmNvbnRyb2woKSfsnbTrnbzripQg66qF66C57Ja066GcIOyhsOygiO2VoCDsiJgg7J6I64ukLiA8L2xpPgo8bGk+ICd4dmFsJ+ydgCDsnZjsgqzqsrDsoJXrgpjrrLTsnZgg6rCA7KeA7LmY6riw7JeQIO2VhOyalO2VnCAnY3Jvc3MtdmFsaWRhdGlvbifsnZgg7JW97Ja066Gc7IScICd4dmFsPTEwJ+ydtOuptCAnMTAtZm9sZCcg6rWQ7LCo7YOA64u57ISxKGNyb3NzLXZhbGlkYXRpb24pIOyYpOu2hOulmOycqOydhCDqs4TsgrDtlZjqsowg65Cc64ukLiA8L2xpPgo8bGk+ICdjcCcg652864qUIOyYteyFmOydgCAnY29zdC1jb21wbGV4aXR5J+ydmCDslb3slrTroZzshJwg67mE7Jqp67O17J6h7ZWo7IiY7JeQ7ISc7J2YIGEoYWxwaGEpIOqwkuydhCDsnZjrr7jtlZzri6QuIOymiSwgJ2NwPTAn7J20656AIOyYpOu2hOulmOycqOqwkuydtCDstZzshp/qsJLsnbQg65CgIOuVjOq5jOyngCDqs4Tsho0g67aE7ZWg7ZWY652864qUIOucu+ydtOuLpC4g65iQ7ZWcICdtaW5zcGxpdD0yMCfsnbTrnbzripQg7Ji17IWY7J2AICdycGFydCcg7ZWo7IiY7JeQ7IScIOykkeqwhOuFuOuTnOulvCDrtoTtlaDtlZjquLAg7JyE7ZWcIOy1nOyGjCDsnpDro4zsnZgg7IiY7J2064ukLiDsnbQg6rCS67O064ukIOyggeydgCDqsJzsiJjsnZgg6rSA7LCw6rCS7J20IOyeiOuKlCDrhbjrk5zripQg642UIOydtOyDgSDrtoTtlaDtlZjsp4Ag7JWK6rOgIOupiOy2lOqyjCDrkJzri6QuIOuUsOudvOyEnCDsnbQg6rCS7J2EIO2BrOqyjCDtlaAg7IiY66GdIOu2hO2VoO2VmOq4sCDslrTroKTsm4zsp4Drr4DroZwg7J2Y7IKs6rKw7KCV64KY66y064qUIOuNlCDsp6fqs6Ag64uo7Iic7ZW07KeE64ukLiA8L2xpPgo8bGk+ICdycGFydCgpJyDrqoXroLnslrTrpbwg7IiY7ZaJ7ZWY64qUIOu2gOu2hOydhCDrs7TsnpAuIOyZgOyduO2SiOyniCDrjbDsnbTthLDsnZgg6rK97JqwIOuqqe2RnOuzgOyImOuKlCDtkojsp4jrk7HquInsnYQg7KeA7Lmt7ZWY64qUICdxdWFsaXR5JyDrs4DsiJjqsIAg65CY6rOgIOuCmOuouOyngCDrs4DsiJjrk6TsnYAg7J6F66Cl67OA7IiY6rCAIOuQmOuvgOuhnCBS7J2YIGZvcm11bGHripQgJ3F1YWxpdHkgfiAuJ+qwgCDrkJzri6QuIOu2hOulmOuCmOustOulvCDsg53shLHtlZjquLAg7JyE7ZW07ISc64qUICdtZXRob2Q9ImNsYXNzIifrnbzqs6Ag7KeA7KCV7ZW0IOyjvOyWtOyVvCDtlZzri6QuPC9saT4KPGxpPiDsg53shLHrkJwg7J2Y7IKs6rKw7KCV64KY66y066W8IOqwhOuLqO2VmOqyjCDstpzroKXtlZjquLAg7JyE7ZW07ISc64qUICdwcmludCgpJyDtlajsiJjrpbwg7IKs7Jqp7ZWY64qU642wLCDsnbQg6rKw6rO864qUIO2FjeyKpO2KuCDtmJXtg5zsnZgg7J2Y7IKs6rKw7KCV64KY66y0IOqysOqzvOuhnCDstpzroKXrkJjqs6Ag7J6I64ukLiDrhbjrk5zrsojtmLgsIOu2hO2VoOq3nOy5mSwg7ZW064u5IOuFuOuTnOydmCDstJ0g6rSA7LCw6rCSIOyImCwg7ZW064u5IOuFuOuTnOyXkOyEnCDsmKTrtoTrpZjrkJjripQg6rSA7LCw6rCSIOyImCwg7ZW064u5IOuFuOuTnOydmCDrqqntkZwg67OA7IiYIOyYiOy4oeqwkuydmCDsiJzshJzroZwg7KCV67O06rCAIOygnOqzteuQmOqzoCDsnojri6QuIOq3uOumrOqzoCDqtITtmLgg7JWI7JeQ64qUIOuqqe2RnOuzgOyImOydmCDqsIEg7KeR64uo67OEIOu5hOycoOydhCDrs7TsnbTqs6Ag7J6I64ukLiDspIQg66eI7KeA66eJ7JeQIOyeiOuKlCAqIO2RnOyLnOuKlCDtlbTri7kg64W465Oc6rCAIOy1nOyihSDrhbjrk5zsnoTsnYQg7J2Y66+47ZWc64ukLiA8L2xpPgoKPGJyPgrsnZjsgqzqsrDsoJXrgpjrrLTrpbwg64KY66y07ZiV7YOc7J20IOq3uOuemO2UhOuhnCDqt7jrpqzquLAg7JyE7ZW07ISc64qUIHBycCgpIO2VqOyImOulvCDsgqzsmqntlZjrqbQg65Cc64ukLgo8YnI+Cjxicj4KCiMjIyMjIyAzLTIg7J2Y7IKs6rKw7KCV64KY66y07J2YIOq3uOuemO2UhCDstpzroKUKYGBge3J9CiMgZGlzcGxheSB0cmVlCiMgaW5zdGFsbC5wYWNrYWdlcygicnBhcnQucGxvdCIpCmxpYnJhcnkocnBhcnQucGxvdCkKcHJwKHRyZWUud2luZSwgdHlwZSA9IDQsIGV4dHJhID0gMSwgZGlnaXRzID0gMiwgYm94LnBhbGV0dGUgPSAiYXV0byIpICMgZ3JheXMKYGBgCjxicj4KPGhyPgo8YnI+CgojIyMjIyAoMikg6rCA7KeA7LmY6riwIOyImO2Wie2VmOq4sAo8YnI+CgojIyMjIyMgMy0zIENBUlQg7J2Y7IKs6rKw7KCV64KY66y0IOqwgOyngOy5mOq4sCDri6jqs4Trs4Qg7KCV67O0CmBgYHtyfQojIHBydW5pbmcgd2l0aCBjLXMuZS4KY3BzIDwtIHByaW50Y3AodHJlZS53aW5lKQpgYGAKPGJyPgoKPGxpPiBwcmludGNwKCkg7ZWo7IiY7JeQIOydmO2VtCDqsrDqs7zrpbwg7Ja77JeI64ukLiDrv4zrpqzrhbjrk5zsl5DshJwg64KY66y06rWs7KGw6rCAIOyiheujjOuQmOuPhOuhnSDtlZjroKTrqbQgJ2NwJyDqsJLsnYAgMC4zNzM0MDYy66W8IOyCrOyaqe2VmOuptCDrkJzri6QuIOykkeqwhOuFuOuTnOulvCDqs4Tsho0g67aE7ZWg7ZW0IOuCmOqwgOugpOuptCAnY3AnIOqwkuydgCDsnbTrs7Tri6TripQg7J6R7J2AIOqwkuydtOyWtOyVvCDtlZzri6QuICdjcCcg6rCS7J20IDAuMOydvCDrlYzripQg67aE7ZWg7J2YIO2an+yCrOqwgCA0NChuc2xwbGl0PTQ0KeyduCDsg4Hri7ntnogg6rec66qo6rCAIO2BsCDrgpjrrLTqtazsobDqsIAg64+E7Lac65CY66mwLCDsnbQg64uo6rOE7JeQIO2VtOuLue2VmOuKlCDrgpjrrLTqtazsobDqsIAg7LWc64yA64KY66y0IChtYXhpbWFsIHRyZWUp7J2064ukLiDsnbQg64KY66y06rWs7KGw64qUIOychOyXkOyEnCDrs7Tsnbgg6rKD7J2EIOydmOuvuO2VnOuLpC48L2xpPgo8bGk+ICd4ZXJyb3InIDog7J20IOqwkuydgCDqtZDssKjtg4Dri7nshLEoY3Jvc3MtdmFsaWRhdGlvbikg67Cp67KV7JeQIOydmO2VnCDsmKTrtoTrpZjsnKjsnYQg7J2Y66+47ZWY64qUIOqyg+ycvOuhnOyEnCAneGVycm9yJ+ydmCDstZzshp/qsJLsnYAgNOuyiOynuCDri6jqs4TsnbTrqbAg67aE66as7J2YIO2an+yImOqwgCAxMShuc3BsaXQ9MTEp7J24IOuCmOustOulvCDsnZjrr7jtlZzri6QuIDwvbGk+CjxsaT4g65Sw65287IScICdjcD0wLjAwNzI4NjAn7J20IOq1kOywqO2DgOuLueyEsSDsmKTrtoTrpZjsnKjsnYQg7LWc7IaM7ZmU7Iuc7YKk64qUIOy1nOyggeydmCDrgpjrrLQg7IKs7J207KaI7J2066mwLCDsnbQg6rCS7J2EIOq4sOykgOycvOuhnCDqsIDsp4DsuZjquLDrpbwg7KeE7ZaJ7ZWY66m0IOuQnOuLpC4g7ZWY7KeA66eMIOqysOqzvCAzLTPsl5Ag65Sw66W066m0IDPrsojsp7gg64uo6rOE7J2066mwIOu2hOumrOydmCDtmp/siJjqsIAgNCAobnNwbGl0PTQp7J24IOuCmOustOuKlCDqtZDssKjtg4Dri7nshLEg7Jik67aE66WY7Jyo7J20IOy1nOyGjOuKlCDslYTri4jsp4Drp4wgNOuyiOynuCDri6jqs4TsnZgg64KY66y06rCAIOqwgOyngOuKlCDstZzshowg7Jik67aE66WY7Jyo6rO864qUIO2BrOqyjCDssKjsnbTqsIAg64KY7KeAIOyViuuKlOuLpC4g6re466as6rOgIOy1nOyGjCDsmKTrtoTrpZjsnKgg7ZGc7KSA7Jik7LCo7J2YIDHrsLAg67KU7JyEICgwLjYzOTM0IDwgMC42MjQ3NyArIDAuMDI4NDgpIOuCtOyXkCDsnojri6QuIOydtOufsCDqsr3smrAgMy0z7KCI7JeQIOyGjOqwnO2VnCDrsJTsmYAg6rCZ7J20IDEtcy5lLiDrspXsuZnsl5Ag7J2Y7ZW0IDPrsojsp7gg64uo6rOE7J2066mwIOu2hOumrOydmCDtmp/siJjqsIAgNCAobnNwbGl0PTQp7J24IOuCmOustOulvCDshKDtg53tlZjripQg6rKD64+EIOqwgOuKpe2VmOuLpC4gPC9saT4KCjxicj4KCiMjIyMjIyAzLTQgMS1zLmUuIOuyley5meycvOuhnCDqsIDsp4DsuZjquLAg7IiY7ZaJCmBgYHtyfQojIHBydW5pbmcgd2l0aCBjLXMuZS4KY3BzIDwtIHByaW50Y3AodHJlZS53aW5lKQprIDwtIHdoaWNoLm1pbihjcHNbLCAieGVycm9yIl0pCmVyciA8LSBjcHNbaywgInhlcnJvciJdOyBzZSA8LSBjcHNbaywgInhzdGQiXQpjIDwtMSAgIyAxLXMuZS4KCmsxIDwtIHdoaWNoKGNwc1ssICJ4ZXJyb3IiXSA8PSBlcnIgKyBjICogc2UpWzFdCmNwLmNob3NlbiA8LSBjcHNbazEsICJDUCJdCnRyZWUucHJ1bmVkLndpbmUgPC0gcHJ1bmUodHJlZS53aW5lLCBjcCA9IGNwLmNob3NlbikKcHJpbnQodHJlZS5wcnVuZWQud2luZSkKYGBgCjxicj4KCjxsaT4gcHJ1bmUoKSDtlajsiJjrpbwg7J207Jqp7ZWY7JesIOqwgOyngOy5mOq4sOulvCDtlZjqs6Ag7J6I64ukLiDqsIDsp4DsuZjquLDsl5Ag7IKs7Jqp7ZWgICdjcCcg64qUIDEtcy5lLiDrspXsuZnsl5Ag7J2Y7ZWcICdjcCcg6rCS7J2EIOyCrOyaqe2VmOuKlCDrtoDrtoTsnbQg7Y+s7ZWo65CY7Ja0IOyeiOuLpC4g7Jes6riw7IScIDAuNS1zLmUuIOuyley5meydhCDsgqzsmqntlZjroKTrqbQgJ2M9MC41J+yymOufvCAnYyfsnZgg6rCS7J2EIOuzgOqyve2VtCDso7zrqbQg65Cc64ukLiA8L2xpPgoKPGxpPiDsnITsnZgg6rKw6rO87JeQ64qUIDEtcy5lLiDrspXsuZnsl5Ag7J2Y7ZW0IOqwgOyngOy5mOq4sO2VnCBDQVJUIOydmOyCrOqysOygleuCmOustOydmCDqsrDqs7zqsIAg7YWN7Iqk7Yq4IO2Yle2DnOuhnCDstpzroKXrkJjslrQg7J6I64ukLiDrhbjrk5zrsojtmLgsIOu2hO2VoOq3nOy5mSwg7ZW064u5IOuFuOuTnOydmCDstJ0g6rSA7LCw6rCSIOyImCwg7ZW064u5IOuFuOuTnOyXkOyEnCDsmKTrtoTrpZjrkJjripQg6rSA7LCw6rCSIOyImCwg7ZW064u5IOuFuOuTnOydmCDrqqntkZzrs4DsiJgg7JiI7Lih6rCS7J2YIOyInOyEnOuhnCDsoJXrs7TqsIAg7KCc6rO165CY6rOgIOyeiOuLpC4g6re466as6rOgIOq0hO2YuCDslYjsl5DripQg66qp7ZGc67OA7IiY7J2YIOqwgSDsp5Hri6jrs4Qg67mE7Jyo7J2EIOuztOydtOqzoCDsnojri6QuIOykhCDrp4jsp4Drp4nsl5Ag7J6I64qUICog7ZGc7Iuc64qUIO2VtOuLuSDrhbjrk5zqsIAg7LWc7KKF64W465Oc7J6E7J2EIOydmOuvuO2VnOuLpC4gPC9saT4KCjxsaT4g6rCA7KeA7LmY6riw6rCAIOyImO2WieuQnCDsnZjsgqzqsrDsoJXrgpjrrLTrpbwg64KY66y07ZiV7YOc7J2YIOq3uOuemO2UhOuhnCDqt7jrpqzquLAg7JyE7ZW07ISc64qUIOuLpOydjOqzvCDqsJnsnbQgJ3BycCgpJyDtlajsiJjrpbwg7IKs7Jqp7ZWY7JiA64ukLiA8L2xpPgoKPGJyPgoKIyMjIyMjIDMtNSDsnZjsgqzqsrDsoJXrgpjrrLTsnZgg6re4656Y7ZSEIOy2nOugpQpgYGB7cn0KIyBkaXNwbGF5IHRyZWUKcHJwKHRyZWUucHJ1bmVkLndpbmUsIHR5cGUgPSA0LCBleHRyYSA9IDEsIGRpZ2l0cyA9IDIsIGJveC5wYWxldHRlID0gIkdyYXlzIikKYGBgCjxicj4KPGxpPiBwcnAoKSDtlajsiJjsl5DshJwgJ3R5cGUgPSA0J+uKlCDsnZjsgqzqsrDsoJXrgpjrrLTsnZgg64W465Oc66W8IO2RnO2YhO2VmOuKlCDrsKnsi53snYQg7J2Y66+47ZWY6rOgLCAnZXh0cmEgPSAxJ+ydgCDspJHqsITrhbjrk5wg64K07J2YIOqwkuydhCDstpzroKXtlZjripQg7ZiV7Iud7J2EIOyngOygle2VnOuLpC4gJ2RpZ2l0cyA9IDIn64qUIOy2nOugpeqwkuydmCDsnpDrpr/siJjrpbwg7J2Y66+47ZWY6rOgLCAnYm94LnBhbGV0dGUgPSAiR3JheXMiJ+uKlCDrhbjrk5zrs4Qg7IOJ7IOB7J2EIOu2gOyXrO2VoCDrlYzsnZgg7IOJ7IOB7ZGc7J2064ukLiA8L2xpPgoKPGxpPiDsnITsnZgg6rKw6rO866W8IOyCtO2OtCDrs7TrqbQsIDU0OeqwnOydmCDrs7TthrXrk7HquIkoJzAnIOuylOyjvCnsnZgg7JmA7J246rO8IDY0NeqwnOydmCDsmrDsiJjrk7HquIkoJzEnIOuylOyjvCnsnZgg7JmA7J247J20IO2PrO2VqOuQmOyWtCDsnojri6QuIOydtCDrv4zrpqzrhbjrk5zrpbwg7KKM7Jqw66GcIOu2hO2VoO2VmOuKlCDrtoTtlaDqt5zsuZnsnYAgJ2FsY29ob2wgPCAxMCfsnbjsp4Ag7Jes67aA7J2064ukLiDrp4zslb0g7IKs7Iuk7J2066m0IO2VtOuLueuQmOuKlCDsmYDsnbjsnYAg7KKM7LihIOuFuOuTnOuhnCDrgrTroKTqsIDqs6AsIOunjOyVvSDrsJjrjIDsnZgg6rK97Jqw652866m0IOyasOy4oeuFuOuTnOuhnCDrgrTroKTqsIDrqbQg65Cc64ukLiDsmrDsuKHrhbjrk5zroZwg64K066Ck6rCEIOqyveyasOyXkOuKlCAxNDDqsJzsnZggJzAnIOuylOyjvOydmCDsmYDsnbjqs7wgNDQx6rCc7J2YICcxJyDrspTso7zsnZgg7JmA7J247J20IO2PrO2VqOuQmOyWtCDsnojslrQg7KCI64yA64uk7IiY6rCAICcxJyDrspTso7zsnbgg7Jqw7IiY65Ox6riJIOyZgOyduOuTpOydtOuLpC4g67CY66m0IOyijOy4oeuFuOuTnOulvCDrs7TrqbQg7LaU6rCA66GcICdzdWxwaGF0ZScg6rCS7JeQIOydmO2VtCDrtoTtlaDrkJjripTrjbAsIOydtCDrs4DsiJjqsIAgMC41OOuztOuLpCDtgbDsp4Ag7Zi57J2AIOyekeydgOyngOulvCDquLDspIDsnLzroZwg7LaU6rCA66GcIOu2hO2VoOuQmOqyjCDrkJzri6QuIOyYiOulvCDrk6TslrQgJ3N1bHBoYXRlIDwgMC41OCfsl5Ag7J2Y7ZW0IOyijOy4oeuFuOuTnOyXkCDsho3tlZwg7JmA7J2465Ok7J2AIDIyMuqwnOydmCAnMCcg67KU7KO87J2YIOyZgOyduOqzvCA1NOqwnOydmCAnMScg67KU7KO87J2YIOyZgOyduOydtCDtj6ztlajrkJjslrQg7J6I7Ja0IOygiOuMgOuLpOyImOqwgCAnMCcg67KU7KO87J24IOuztO2GteuTseq4iSDsmYDsnbjrk6TsnbTri6QuIDwvbGk+Cgo8YnI+CgojIyMjIyAoMykg67aE66WY7KCV7ZmV64+EIOqzhOyCsO2VmOq4sAo8YnI+CuyZgOyduO2SiOyniCDrjbDsnbTthLDsl5DshJwg66qp7ZGc67OA7IiY7J2YIOu2hOulmOyYiOy4oeqwkuydhCDqtaztlZjqs6AsIOygle2ZleuPhOulvCDtj4nqsIDtlZjripQg67Cp67KV7JeQIOuMgO2VtOyEnCDslYzslYTrs7TsnpAuIOyasOyEoCDrtoTrpZjsmIjsuKEg7ZmV66Wg7J2EIOq1rO2VmOqzoCwg7J2066W8IO2GoOuMgOuhnCDrqqntkZzrs4DsiJjsnZgg67KU7KO86rCS7J2EIOyYiOy4oe2VmOuKlCDqs7zsoJXsnYQgMy027JeQ7IScIOyVjCDsiJgg7J6I64ukLgoKPGJyPgoKIyMjIyMjIDMtNiBDQVJUIOydmOyCrOqysOygleuCmOustOydmCDsmIjsuKHqsJIg7IKw7LacCmBgYHtyfQojIG1ha2luZyBwcmVkaWN0aW9ucyAtIHByb2JhYmlsaXR5IHByZWRpY3Rpb24KcHJvYi50cmVlLndpbmUgPC0gcHJlZGljdCh0cmVlLnBydW5lZC53aW5lLCBuZXdkYXRhID0gd2luZSwgdHlwZSA9ICJwcm9iIikKaGVhZChwcm9iLnRyZWUud2luZSwgNSkKY3V0b2ZmIDwtIDAuNSAgIyBjdXRvZmYKeWhhdC50cmVlLndpbmUgPC0gaWZlbHNlKHByb2IudHJlZS53aW5lWywgMl0gPiBjdXRvZmYsIDEsIDApCmBgYAo8YnI+CgrtlZzqsIDsp4Ag7KO866qp7ZWgIOqyg+ydgCAncHJlZGljdCcg66qF66C566y47J2YICduZXdkYXRhJ+ydtOuLpC4g7JyE7J2YIOy9lOuTnOyXkOyEnOuKlCAnbmV3ZGF0YSA9IHdpbmUn7J206528IO2VmOyXrCB3aW5lIOuNsOydtO2EsOulvCDri6Tsi5wg7IKs7Jqp7ZWY7JiA6riwIOuVjOusuOyXkCDquLDsobQg7ZWZ7Iq1IOuNsOydtO2EsOyXkCDrjIDtlZwg67aE66WY64KY66y07J2YIOu2hOulmOyYiOy4oeqwkuydhCDqtaztlaAg7IiYIOyeiOyXiOuLpC4g66eM7J28ICduZXdkYXRhJ+yXkCB3aW5lIOuNsOydtO2EsOyZgCDrj4TsmKTsnbztlZwg7ZiV7Iud7J2YIOyDiOuhnOyatCDrjbDsnbTthLDrpbwg7IKs7Jqp7ZWY6rKMIOuQnOuLpOuptCwg7IOI66Gc7Jq0IOuNsOydtO2EsOyXkCDrjIDtlZwg7JiI7Lih6rCS7J2EIOq1rO2VoCDsiJgg7J6I6rKMIOuQnOuLpC4g7J206rKD7J2AIOuvuOuemOydmCDqtIDssLDqsJLsl5Ag64yA7ZWcIOyYiOy4oeydhCDsiJjtlontlbTslbwg7ZWY64qUIOqyveyasOyXkCDtlYTsmpTtlZwg6riw67KV7J2064ukLgo8bGk+ICdwcmVkaWN0JyDrqoXroLnrrLjsnZggJ3R5cGUgPSAicHJvYiIn64qUIOuqqe2RnOuzgOyImOydmCDrspTso7zqsJLsl5Ag64yA7ZWcIOyYiOy4oe2ZleuloOydhCDsnZjrr7jtlZzri6QuIOunjOyVvSDtmozqt4DrgpjrrLTrnbzrqbQgJ3R5cGUgPSAidmVjdG9yIifrnbzqs6Ag7ZW07JW866eMIOuqqe2RnOuzgOyImOydmCDqsJLsnYQg7JiI7Lih7ZWc64ukLiA8L2xpPgo8bGk+IOuqqe2RnOuzgOyImOydmCDrspTso7zqsJLsl5Ag64yA7ZWcIOyYiOy4oe2ZleuloOyduCAncHJvYi50cmVlLndpbmUn7J20652864qUIOqwnOyytOuKlCDrspTso7wgJzAn7J28IOyYiOy4oe2ZleuloOqzvCDrspTso7wgJzEn7J28IOyYiOy4oe2ZleuloOydhCDtj6ztlajtlZjqs6Ag7J6I64ukLiDsnITsnZgg6rKw6rO87JeQ64qUIOyymOydjCA16rCcIOq0gOywsOqwkuyXkCDrjIDtlZwg65GQIOuylOyjvOuzhCDsmIjsuKHtmZXrpaDsnbQg7Lac66Cl65CY7Ja0IOyeiOuLpC4gPC9saT4KPGxpPiAnaWZlbHNlKCknIOuqheugueyWtOulvCDthrXtlbQgJzEnIOuylOyjvOyXkCDrjIDtlZwg7JiI7Lih7ZmV66Wg6rCS7J20IOq4sOykgOqwkuyduCBjdXRvZmYgPSAwLjXrpbwg7IOB7ZqM7ZWY66m0ICcxJyDrspTso7zroZwg7JiI7Lih7ZWY6rOgLCDqt7jroIfsp4Ag7JWK7Jy866m0ICcwJyDrspTso7zroZwg7JiI7Lih7ZWY64qUIOu2gOu2hOydhCDtj6ztlajtlZjqs6Ag7J6I64ukLiA8L2xpPgoKPGJyPgoKIyMjIyMjIDMtNyBDQVJUIOydmOyCrOqysOygleuCmOustOydmCDsmIjsuKHqsJLqs7wg7Iuk7KCcIOuqqe2RnOuzgOyImOqwkiDruYTqtZAKYGBge3J9CiMgZXZhbHVhdGlvbgp0YWIgPC0gdGFibGUod2luZSRxdWFsaXR5LCB5aGF0LnRyZWUud2luZSwgZG5uID0gYygiT2JzZXJ2ZWQiLCAiUHJlZGljdGVkIikpCnByaW50KHRhYikgIyBjb25mdXNpb24gbWF0cml4CmBgYAoKYGBge3J9CnN1bShkaWFnKHRhYikgLyBzdW0odGFiKSkgIyBhY2N1cmFjeQpgYGAKYGBge3J9CnRhYlsyLCAyXSAvIHN1bSh0YWJbMiwgXSkgIyBzZW5zaXRpdml0eQpgYGAKYGBge3J9CnRhYlsxLCAxXSAvIHN1bSh0YWJbMSwgXSkgIyBzcGVjaWZpY2l0eQpgYGAKPGJyPgoKdGFibGUoKSDtlajsiJjrpbwg7J207Jqp7ZWY7JesIO2VmeyKtSDrjbDsnbTthLDsnZgg7Iuk7KCcIOuqqe2RnOuzgOyImOyZgCDsnZjsgqzqsrDsoJXrgpjrrLTsl5Ag7J2Y7ZW0IOyYiOy4oeuQnCDrqqntkZzrs4DsiJjsnZgg7JiI7Lih6rCS7J2YIOydvOy5mOyEseydhCDtmZXsnbjtlZjquLAg7JyE7ZW0IOu5iOuPhOq4sOykgOycvOuhnCDrtoTtlaDtkZzrpbwg66eM65Ok6rOgIOyeiOuLpC4g7Z2U7Z6IIOydtCDrtoTtlaDtkZzrpbwgJ2NvbmZ1c2lvbiBtYXRyaXgn65286rOgIO2VnOuLpC4g65iQ7ZWcIOuztO2GteuTseq4iSgnMCcg67KU7KO8KeqzvCDsmrDsiJjrk7HquIkoJzEnIOuylOyjvCnsnZgg7JiI7LihIOqysOqzvOyXkCDrjIDtlZwg67mE6rWQ66W8IOychO2VtCDsoJXtmZXrj4QsIOuvvOqwkOuPhCwg7Yq57J2064+E66W8IOqzhOyCsO2VmOuKlCDrtoDrtoTsnbQg64KY7Jio64ukLgoKPGJyPgrqsrDqs7zsl5Ag65Sw66W066m0IOuztO2GtSDrk7HquIkg7JmA7J247J2EIOuztO2GtSDrk7HquIkg7JmA7J247Jy866GcIOyYiOy4oe2VnCDqsr3smrDripQgMzg367KI7J206rOgLCDsmrDsiJgg65Ox6riJIOyZgOyduOydhCDsmrDsiJgg65Ox6riJIOyZgOyduOycvOuhnCDsmIjsuKHtlZwg6rK97Jqw64qUIDUwMuuyiOydtOuLpC4g65Sw65287IScIO2VmeyKtSDrjbDsnbTthLDsl5Ag64yA7ZWcIOygle2ZleuPhOuKlCAoMzg3ICsgNTAyKSAvIDEsMTk0ID0gNzQuNDYl66GcIOqzhOyCsOuQmOyXiOuLpC4g7LSdIDY0NeqwnOydmCDsmrDsiJjrk7HquIkg7JmA7J24IOykkeyXkOyEnCDsi6TsoJzroZwg7Jqw7IiYIOuTseq4iSDsmYDsnbjsnLzroZwg7JiI7Lih7ZWcIOqyveyasOuKlCA1MDLrsojsnbTri6QuIOuUsOudvOyEnCDrr7zqsJDrj4TripQgNTAyLzY0NSA9IDc3Ljgl7J2064ukLiDrp4jsp4Drp4nsnLzroZwg7LSdIDU0OeqwnOydmCDrs7TthrUg65Ox6riJIOyZgOyduCDspJHsl5DshJwg7Iuk7KCc66GcIOuztO2GtSDrk7HquIkg7JmA7J247Jy866GcIOyYiOy4oe2VnCDqsr3smrDripQgMzg367KI7J2064ukLiDrlLDrnbzshJwg7Yq57J2064+E64qUIDM4Ny81NDk9NzAuNSXsnbTri6QuCgo8YnI+Cjxocj4KPGJyPgoKIyMjIyAzLiDtmozqt4DsnZjsgqzqsrDsoJXrgpjrrLQg7IKs66GAIOu2hOyEnQoKPGJyPgrtmozqt4DrgpjrrLTrpbwg7IOd7ISx7ZWY64qUIOyCrOuhgOu2hOyEneycvOuhnCDslZ7shJwg7IKs7Jqp65CY7JeI642YIOydmOulmOyDneyCsOyEsSDrjbDsnbTthLAoJ3Byb2R1Y3Rpdml0eVJFRy5jc3YnKeulvCDsnbTsmqntlZjsl6wgQ0FSVCDrsKnrspXsnYQg7J207Jqp7ZWcIO2ajOq3gOuCmOustOulvCDqtazstpXtlbQg67O06rOg7J6QIO2VnOuLpC4KCjxicj4KCiMjIyMjICgxKSDrjbDsnbTthLAg7J296rOgIENBUlQg7J2Y7IKs6rKw7KCV64KY66y0IOyLpO2Wie2VmOq4sAoKPGJyPgrrqLzsoIAg7J2Y66WY7IOd7IKw7ISxIOuNsOydtO2EsOqwgCDri7TquLQgJ3Byb2R1Y3Rpdml0eVJFRy5jc3YnIO2MjOydvOydhCDtmZXsnbjtlZzri6QuIENBUlQg7J2Y7IKs6rKw7KCV64KY66y066W8IOyLpO2Wie2VmOq4sCDsnITtlbTshJwg64uk7J2M6rO8IOqwmeydtCDsiJjtlontlZjrqbQg65Cc64ukLgoKYGBge3J9CiMgaW1wb3J0aW5nIGRhdGEKcHJvZCA8LSByZWFkLmNzdigiLi9kYXRhL3Byb2R1Y3Rpdml0eVJFRy5jc3YiLCBoZWFkZXIgPSBUKQpgYGAKYGBge3J9CiMgZmFjdG9yaXppbmcgcHJlZGljdG9yIHZhcmlhYmxlcwpwcm9kJHF1YXJ0ZXIgPC0gZmFjdG9yKHByb2QkcXVhcnRlcikKcHJvZCRkZXBhcnRtZW50IDwtIGZhY3Rvcihwcm9kJHF1YXJ0ZXIpCnByb2QkZGF5IDwtIGZhY3Rvcihwcm9kJGRheSkKcHJvZCR0ZWFtIDwtIGZhY3Rvcihwcm9kJHRlYW0pCmBgYApgYGB7cn0KbGlicmFyeShycGFydCkKc2V0LnNlZWQoMTIzNCkKbXkuY29udHJvbCA8LSBycGFydC5jb250cm9sKHh2YWwgPSAxMCwgY3AgPSAwLjAxLCBtaW5zcGxpdCA9IDMwKQp0cmVlLnByb2QgPC0gcnBhcnQocHJvZHVjdGl2aXR5IH4gLiwgZGF0YSA9IHByb2QsIG1ldGhvZCA9ICJhbm92YSIsIGNvbnRyb2wgPSBteS5jb250cm9sKQpwcmludCh0cmVlLnByb2QpCmBgYAo8YnI+CjxsaT4gJ3F1YXJ0ZXInLCAnZGVwYXJ0bWVudCcsICdkYXknLCAndGVhbScg67OA7IiY64qUIOuylOyjvO2YlSDrs4DsiJjsnbTrr4DroZwgZmFjdG9yKCkg7ZWo7IiY66W8IOyCrOyaqe2VtCDrspTso7ztmJXsnLzroZwg7J247Iud65CY6rKMIO2VnOuLpC48L2xpPgo8bGk+IOygnDLsnqXsl5DshJzripQg7JyE7J2YIOuylOyjvO2YlSDrs4DsiJjrk6Tsl5Ag64yA7ZW07IScIOqwgOuzgOyImOulvCDsg53shLHtlojslrTslbwg7ZWY7KeA66eMLCDtmozqt4DsnZjsgqzqsrDsoJXrgpjrrLTrqqjtmJXsl5DshJzripQg67KU7KO87ZiVIOuzgOyImOulvCDqsIDrs4DsiJjroZwg67OA7ZmY7ZWY7KeAIOyViuqzoCDsnojripQg6re4656Y64+EIOyCrOyaqe2VoCDsiJgg7J6I64ukLiA8L2xpPgo8bGk+IOu2hOulmOydmOyCrOqysOygleuCmOustOyZgCDrp4jssKzqsIDsp4DroZwg7ZqM6reA7J2Y7IKs6rKw7KCV64KY66y064+EIFLsl5DshJzripQgJ3JwYXJ0J+udvOuKlCDtjKjtgqTsp4Drpbwg7J207Jqp7ZWc64ukLiAncnBhcnQuY29udHJvbCgpJyDtlajsiJjsl5DshJwgMTAtZm9sZCDqtZDssKjtg4Dri7nshLEg7Jik67aE66WY7Jyo7J2EIOqzhOyCsO2VmOqzoCwg6rCA7KeA7LmY6riwIOuwqeuyleyXkOyEnCBhKGFscGhhKeqwkuydgCAwLjAx7J20IOuQoCDrlYzquYzsp4Ag7Iic7LCo7KCB7J24IOuCmOustOq1rOyhsOulvCDsoIDsnqXtlZjrj4TroZ0g7ZWc64ukLiDqt7jrpqzqs6Ag64W465Oc66W8IOuCmOuIhOuKlCDstZzshowg7J6Q66OM7J2YIOyImOyduCAnbWluc3BsaXQn7J2AIDMw6rCc66GcIO2VmOyYgOuLpC48L2xpPgo8bGk+ICdycGFydCgpJyDrqoXroLnslrTrpbwg7IiY7ZaJ7ZWY64qUIOu2gOu2hOydhCDrs7TsnpAuIOydmOulmOyDneyCsOyEsSDrjbDsnbTthLDsnZgg6rK97JqwIOuqqe2RnOuzgOyImOuKlCDsg53sgrDshLHsnYQg7KeA7Lmt7ZWY64qUICdwcm9kdWN0aXZpdHknIOuzgOyImOqwgCDrkJjqs6Ag64KY66i47KeAIOuzgOyImOuTpOydgCDsnoXroKXrs4DsiJjqsIAg65CY66+A66GcIFLsnZggZm9ybXVsYeuKlCAncHJvZHVjdGl2aXR5IH4gLifqsIAg65Cc64ukLiDtmozqt4DrgpjrrLTrpbwg7IOd7ISx7ZWY6riwIOychO2VtOyEnOuKlCAnbWV0aG9kID0gImFub3ZhIifrnbzqs6Ag7KeA7KCV7ZW0IOyjvOyWtOyVvCDtlZzri6QuIDwvbGk+CjxsaT4g7IOd7ISx65CcIOydmOyCrOqysOygleuCmOustOulvCDqsITri6jtlZjqsowg7Lac66Cl7ZWY6riwIOychO2VtOyEnOuKlCAncHJpbnQoKScg7ZWo7IiY66W8IOyCrOyaqe2VmOuKlOuNsCDsnbQg6rKw6rO864qUIOuFuOuTnOuyiO2YuCwg67aE7ZWg6rec7LmZLCDtlbTri7kg64W465Oc7J2YIOy0nSDqtIDssLDqsJIg7IiYLCDtlbTri7kg64W465Oc7J2YIO2Pieq3oOygnOqzseyYpOywqCwg7ZW064u5IOuFuOuTnOydmCDrqqntkZzrs4DsiJgg7Y+J6reg6rCS7J2YIOyInOyEnOuhnCDsoJXrs7TqsIAg7KCc6rO165CY6rOgIOyeiOuLpC4g7KSEIOuniOyngOunieyXkCDsnojripQgKiDtkZzsi5zripQg7ZW064u5IOuFuOuTnOqwgCDstZzsooXrhbjrk5zsnoTsnYQg7J2Y66+47ZWc64ukLiA8L2xpPgoKCjxicj4K7J2Y7IKs6rKw7KCV64KY66y066W8IOuCmOustO2Yle2DnOydmCDqt7jrnpjtlITroZwg6re466as6riwIOychO2VtOyEnOuKlCDri6TsnYzqs7wg6rCZ7J20ICdwcnAoKScg7ZWo7IiY66W8IOyCrOyaqe2VmOuptCDrkJzri6QuCgo8YnI+CgojIyMjIyMgMy05IOydmOyCrOqysOygleuCmOustCDqt7jrnpjtlITsnZgg7Lac66ClCmBgYHtyfQojIGRpc3BsYXkgdHJlZQpsaWJyYXJ5KHJwYXJ0LnBsb3QpCnBycCh0cmVlLnByb2QsIHR5cGUgPSA0LCBleHRyYSA9IDEsIGRpZ2l0cyA9IDIsIGJveC5wYWxldHRlID0gImF1dG8iKQpgYGAKCjxicj4K7JyE7J2YIOydmOyCrOqysOygleuCmOustOuKlCDqsIDsp4DsuZjquLAg7KCE7J2YIOqysOqzvOydtOuvgOuhnCDrjIDri6jtnogg7IKs7J207KaI6rCAIO2BsCDsg4Htg5zsnbTri6QuIOydtOyymOufvCDrgpjrrLQg6rWs7KGw6rCAIOqzvOuPhO2VmOqyjCDtgazrqbQg7J2Y7IKs6rKw7KCV64KY66y066W8IO2VtOyEne2VmOuKlCDqsoPsnbQg66ek7JqwIOyWtOugpOyauCDqsoPsnbTri6QuIAoKCjxicj4KPGhyPgo8YnI+CgojIyMjIyAoMikg6rCA7KeA7LmY6riwIOyImO2Wie2VmOq4sAo8YnI+CuydmOyCrOqysOygleuCmOustOydmCDqsIDsp4DsuZjquLDrpbwg7IiY7ZaJ7ZWY6riwIOychO2VtOyEnOuKlCDri6TsnYzsspjrn7wg6rCA7KeA7LmY6riwIOuLqOqzhOuzhCDsoJXrs7Trpbwg7YyM7JWF7ZWgIO2VhOyalOqwgCDsnojri6QuCgo8YnI+CgojIyMjIyMgMy0xMCBDQVJUIOydmOyCrOqysOygleuCmOustCDqsIDsp4DsuZjquLAg64uo6rOE67OEIOygleuztApgYGB7cn0KIyBwcnVuaW5nIHdpdGggYy1zLmUuCmNwcyA8LSBwcmludGNwKHRyZWUucHJvZCkKYGBgCjxicj4K6rCA7KeA7LmY6riw66W8IOyImO2Wie2VmOq4sCDsnITtlbTshJwg67mE7Jqp67O17J6h7ZWo7IiY7J2YIGEoYWxwaGEp7JmAIO2VtOuLueuQmOuKlCDrgpjrrLTqtazsobDsnZgg6rWQ7LCo7YOA64u57ISxIOyYpOulmOycqOydhCDslYzslYTslbwg7ZWc64ukLiBwcmludGNwKCkg7ZWo7IiY7JeQIOydmO2VtCDsi6TtlonrkJwg6rKw6rO866W8IOyCtO2OtCDrs7TsnpAuCgo8bGk+IOqysOqzvOyXkCDrlLDrpbTrqbQgMTAtZm9sZCDqtZDssKjtg4Dri7nshLEoY3Jvc3MtdmFsaWRhdGlvbikg67Cp67KV7JeQIOydmO2VnCDsmKTrpZjsnKjsnbQg7LWc7IaM6rCAIOuQmOuKlCDrgpjrrLTqtazsobDripQgMTHrsojsp7gg64uo6rOE7JiIIOyeiOuKlCDrgpjrrLTqtazsobDsnbTrqbAg67aE66as7J2YIO2an+yImOqwgCAxNOyduCDrgpjrrLTqtazsobDrpbwg7J2Y66+47ZWc64ukLiDtlZjsp4Drp4wg7J20IOuCmOustOq1rOyhsOuKlCDtgazquLDqsIAg64SI66y0IOuwqeuMgO2VmOyXrCDtlbTshJ3snbQg64Kc7ZW07ZWgIOqyg+ydtOq4sCDrlYzrrLjsl5AsIDEtcy5lLiDrspXsuZnsnYQg7IKs7Jqp7ZWY7JesIOuNlCDsnpHsnYAg7YGs6riw7J2YIO2ajOq3gOuCmOustOulvCDshKDtg53tlZjquLDroZwg7ZWc64ukLjwvbGk+CjxsaT4gMS1zLmUg67KV7LmZ7JeQIOydmO2VmOuptCDstZzshowg6rWQ7LCo7YOA64u57ISxIOyYpOulmOycqCvtkZzspIDsmKTssKjripQgMC43NTY5NjEgKD0wLjcxMDM3KzAuMDQ2NTkxKeydtOuLpC4g65Sw65287IScIOq1kOywqO2DgOuLueyEsSDsmKTrpZjsnKjsnbQgMC43NTY5NjHrs7Tri6Qg7J6R7J2AIOuCmOustOq1rOyhsCDspJHsl5DshJwg6rCA7J6lIOyekeydgCDtgazquLDsnZgg64KY66y066W8IOyEoO2Dne2VmOuptCA367KI7Ke4IOuLqOqzhOydtOupsCwg67aE7ZWg7J2YIO2an+yImOqwgCA567KI7J24IOuCmOustOq1rOyhsOqwgCDrkKAg6rKD7J2064ukLiA8L2xpPgoKPGJyPgrri6TsnYzsnZgg7L2U65OcIDMtMTHsl5DripQgcHJ1bmUoKSDtlajsiJjrpbwg7J207Jqp7ZWY7JesIDEtcy5lLiDrspXsuZnsl5Ag7J2Y7ZWcICdjcCcg6rCS7J2EIOyCrOyaqe2VmOyXrCDqsIDsp4DsuZjquLAg7ZWY64qUIOu2gOu2hOydtCDtj6ztlajrkJjslrQg7J6I64ukLgoKPGJyPgoKIyMjIyMjIDMtMTEgMS1zLmUuIOuyley5meycvOuhnCDqsIDsp4DsuZjquLAg7IiY7ZaJCmBgYHtyfQojIHBydW5pbmcgd2l0aCBjLXMuZS4KayA8LSB3aGljaC5taW4oY3BzWywgInhlcnJvciJdKQplcnIgPC0gY3BzW2ssICJ4ZXJyb3IiXTsgc2UgPC0gY3BzW2ssICJ4c3RkIl0KYyA8LSAxICAjIDEtcy5lLgoKazEgPC0gd2hpY2goY3BzWywgInhlcnJvciJdIDw9IGVycitjKnNlKVsxXQpjcC5jaG9zZW4gPC0gY3BzW2sxLCAiQ1AiXQp0cmVlZS5wcnVuZWQucHJvZCA8LSBwcnVuZSh0cmVlLnByb2QsIGNwPWNwLmNob3NlbikKcHJpbnQodHJlZWUucHJ1bmVkLnByb2QpCmBgYAoKPGJyPgrqsrDqs7zsl5DshJzripQgMS1zLmUuIOuyley5meyXkCDsnZjtlbQg6rCA7KeA7LmY6riw7ZWcIENBUlQg7J2Y7IKs6rKw7KCV64KY66y07J2YIOqysOqzvOqwgCDthY3siqTtirgg7ZiV7Iud7Jy866GcIOy2nOugpeuQmOyWtCDsnojri6QuIOuFuOuTnOuyiO2YuCwg67aE7ZWg6rec7LmZLCDtlbTri7kg64W465Oc7J2YIOy0nSDqtIDssLDqsJIg7IiYLCDtlbTri7kg64W465Oc7J2YIO2Pieq3oCDsoJzqs7Eg7Jik7LCoLCDtlbTri7kg64W465Oc7J2YIOuqqe2RnOuzgOyImCDsmIjsuKHqsJIgKO2ajOq3gOuCmOustOydvCDrlYzripQg7Y+J6reg6rCSKeydmCDsiJzshJzroZwg7KCV67O06rCAIOygnOqzteuQmOqzoCDsnojri6QuIOykhCDrp4jsp4Drp4nsl5Ag7J6I64qUICog7ZGc7Iuc64qUIO2VtOuLuSDrhbjrk5zqsIAg7LWc7KKFIOuFuOuTnOyehOydhCDsnZjrr7jtlZzri6QuCgo8YnI+CuqwgOyngOy5mOq4sOqwgCDsiJjtlonrkJwg7J2Y7IKs6rKw7KCV64KY66y066W8IOuCmOustO2Yle2DnCDqt7jrnpjtlITroZwg6re466as6riwIOychO2VtOyEnCBwcnAoKSDtlajsiJjrpbwg7J207Jqp7ZWc64ukLgoKPGJyPgoKIyMjIyMjIDMtMTIg7J2Y7IKs6rKw7KCV64KY66y0IOq3uOuemO2UhCDstpzroKUKYGBge3J9CiMgZGlzcGxheSB0cmVlCnBycCh0cmVlZS5wcnVuZWQucHJvZCwgdHlwZSA9IDQsIGV4dHJhID0gMSwgZGlnaXRzID0gMiwgYm94LnBhbGV0dGUgPSAiR3JheXMiKQpgYGAKPGJyPgrsnITsnZgg6re4656Y7ZSE64qUIHBycCgpIO2VqOyImOulvCDtmZzsmqntlZjsl6wgMS1zLmUuIOuyley5meyXkCDsnZjtlbQg6rCA7KeA7LmY6riw7ZWcIOydmOyCrOqysOygleuCmOustCDqt7jrnpjtlITsnbTri6QuCjxsaT4gcHJwKCnsl5DshJwgJ3R5cGUgPSA0JyA6IOydmOyCrOqysOygleuCmOustOydmCDrhbjrk5zrpbwg7ZGc7ZiE7ZWY64qUIOuwqeyLneydhCDsnZjrr7g8L2xpPgo8bGk+ICdleHRyYSA9IDEnIDog7KSR6rCE64W465OcIOuCtOydmCDqsJLsnYQg7Lac66Cl7ZWY64qUIO2YleyLneydhCDsp4DsoJXtlZzri6QuIDwvbGk+CjxsaT4gJ2RpZ2l0cyA9IDInIDog7Lac66Cl6rCS7J2YIOyekOumv+yImOulvCDsnZjrr7ggPC9saT4KPGxpPiAnYm94LnBhbGV0dGUgPSAiR3JheXMiJyA6IOuFuOuTnOuzhCDsg4nsg4HsnYQg67aA7Jes7ZWgIOuVjOydmCDsg4nsg4HtkZwgPC9saT4KPGJyPgoK6rKw6rO8IOq3uOuemO2UhOyXkOyEnCDrv4zrpqzrhbjrk5zrpbwg7IK07Y60IOuztOuptCA5MzbqsJzsnZgg6rSA7LCw6rCS7J20IOyeiOqzoCwg66qp7ZGc67OA7IiY7J24IOyDneyCsOyEseydmCDtj4nqt6DqsJLsnYAgMC43ODfsnbTri6QuIOydtCDrv4zrpqzrhbjrk5zrpbwg7KKM7Jqw66GcIOu2hO2VoO2VmOuKlCDrtoTtlaDqt5zsuZnsnYAgJ3RhcmdldCA8IDAuNzMn7J247KeAIOyXrOu2gOydtOuLpC4g66eM7JW9IOyCrOyLpOydtOuptCDtlbTri7nrkJjripQg6rSA7LCw6rCS7J2AIOyijOy4oeuFuOuTnOuhnCDrgrTroKTqsIDqs6AsIOunjOyVvSDrsJjrjIDsnZgg6rK97Jqw652866m0IOyasOy4oeuFuOuTnOuhnCDrgrTroKTqsIDrqbQg65Cc64ukLiDsoozsuKHrhbjrk5zroZwg64K066Ck6rCEIOqyveyasOyXkOuKlCDstJ0gMjU26rCc7J2YIOq0gOywsOqwkuydtCDsnojqs6Ag6re4IO2Pieq3oOydtCAwLjfsnbTrr4DroZwsIOu/jOumrOuFuOuTnOyXkCDruYTtlZjrqbQg7IOd7IKw7ISx7J20IOuCruyVhOynhCDrhbjrk5zrnbzqs6Ag7ZWgIOyImCDsnojri6QuIOuwmOuptCDsmrDsuKHrhbjrk5zroZwg64K066Ck6rCEIOqyveyasOyXkOuKlCA2ODDqsJzsnZgg6rSA7LCw6rCS6rO8IO2Pieq3oCAwLjjsnZgg7IOd7IKw7ISx7J2EIOuztOydtOqzoCDsnojri6QuCgo8YnI+CuyijOy4oeuFuOuTnOulvCDstpTqsIDroZwgJ292ZXJfdGltZScg6rCS7JeQIOydmO2VtCDrtoTtlaDtlojripTrjbAsIOydtCDrs4DsiJjqsIAgMywyMTDrs7Tri6Qg7YGw7KeAIO2YueydgCDsnpHsnYDsp4Drpbwg6riw7KSA7Jy866GcIOy2lOqwgOuhnCDrtoTtlaDtlZjqsowg65Cc64ukLiDsmIjrpbwg65Ok7Ja0ICdvdmVyX3RpbWUgPj0gMzIxMCfsl5Ag7J2Y7ZW0IOyijOy4oeuFuOuTnOyXkCDsho3tlZjqsowg65CY64qUIOq0gOywsOqwkuuTpOydgCDsg53sgrDshLHsnZgg7Y+J6reg7J20IDAuNjfsl5Ag67aI6rO87ZWY64ukLiDrsJjrqbQg67+M66as64W465Oc7JeQ7IScIOyasOy4oeycvOuhnCDqsIQg64W465Oc66W8IOuLpOyLnCDtlZwg67KIICdpbmNlbnRpdmUgPj0gODUn7JeQIOydmO2VtCDrtoTtlaDsnYQg7ZWY66m0IOy0nSA1NOqwnOydmCDqtIDssLDqsJLsnbQg7IaN7ZWY64qU642wLCDqt7jrk6TsnZgg7Y+J6regIOyDneyCsOyEseydgCAwLjk27Jy866GcIOunpOyasCDrhpLri6QuCgo8YnI+Cjxocj4KPGJyPgoKIyMjIyMgKDMpIO2ajOq3gOyYiOy4oSDsoJXtmZXrj4Qg6rOE7IKw7ZWY6riwCjxicj4K7J2Y66WY7IOd7IKw7ISxIOuNsOydtO2EsOyXkOyEnCDrqqntkZzrs4DsiJjsnZgg7JiI7Lih6rCS7J2EIOq1rO2VmOqzoCDtj4nqsIDtlZjripQg67Cp67KV7JeQIOuMgO2VtOyEnCDslYzslYTrs7TsnpAuCgo8YnI+CgojIyMjIyMgMy0xMyBDQVJUIOydmOyCrOqysOygleuCmOustOydmCDsmIjsuKHqsJIg67CPIOygle2ZleuPhCDsgrDstpwKYGBge3J9CiMgbWFraW5nIHByZWRpY3Rpb25zCnByZWQudHJlZS5wcm9kIDwtIHByZWRpY3QodHJlZWUucHJ1bmVkLnByb2QsIG5ld2RhdGEgPSBwcm9kLCB0eXBlID0gInZlY3RvciIpCmhlYWQocHJlZC50cmVlLnByb2QsIDUpCmBgYAo8YnI+CjxsaT4gcHJlZGljdCgpIO2VqOyImOyXkCAnbmV3ZGF0YSA9IHByb2Qn65286rOgIO2VmOyXrCBwcm9kIOuNsOydtO2EsOulvCDri6Tsi5wg7IKs7Jqp7ZWY7JiA6riwIOuVjOusuOyXkCDquLDsobQg7ZWZ7Iq1IOuNsOydtO2EsOyXkCDrjIDtlZwg7ZqM6reA64KY66y07J2YIOyYiOy4oeqwkuydhCDqtaztlaAg7IiYIOyeiOuLpC4g66eM7J28ICduZXdkYXRhJ+yXkCBwcm9kIOuNsOydtO2EsOyZgCDrj5nsnbztlZwg7ZiV7Iud7J2YIOyDiOuhnOyatCDrjbDsnbTthLDrpbwg7IKs7Jqp7ZWY6rKMIOuQnOuLpOuptCDsg4jroZzsmrQg642w7J207YSw7JeQIOuMgO2VnCDsmIjsuKHqsJLsnYQg6rWs7ZWgIOyImCDsnojri6QuIOydtOqyg+ydgCDrr7jrnpjsnZgg6rSA7LCw6rCS7JeQIOuMgO2VnCDsmIjsuKHsnYQg7IiY7ZaJ7ZW07JW8IO2VmOuKlCDqsr3smrDsl5Ag7ZWE7JqU7ZWcIOq4sOuyleydtOuLpC4gPC9saT4KPGxpPiBwcmVkaWN0KCkg7ZWo7IiY7J2YICd0eXBlID0gInZlY3RvciInIDog7ZqM6reA64KY66y07JeQIO2VtOuLue2VmOuKlCDrqqntkZzrs4DsiJjsnZgg7JiI7Lih6rKw6rO866W8IOydmOuvuO2VnOuLpC4g7ZqM6reA64KY66y07JeQIOydmO2VtCDsmIjsuKHrkJwg66qp7ZGc67OA7IiY7J2YIOqwkuydgCAncHJlZC50cmVlLnByb2Qn7JeQIOyggOyepeuQmOyWtCDsnojqs6AsIOyymOydjCA16rCcIOq0gOywsOqwkuyXkCDrjIDtlZwg66qp7ZGc67OA7IiY7J2YIOyYiOy4oeqwkuydhCDstpzroKXtlZjqs6Ag7J6I64ukLiA8L2xpPgoKPGJyPgrslYTrnpjripQg7Y+J6reg7KCc6rOx7Jik7LCoKE1lYW4gU3F1YXJlZCBFcnJvciwgTVNFKeyZgCDtj4nqt6DsoIjrjIDsmKTssKgoTWVhbiBBYnNvbHV0ZSBFcnJvciwgTUFFKeulvCDqs4TsgrDtlZjripQg7L2U65Oc7J2064ukLiDtj4nqt6DsoIjrjIDsmKTssKjripQg7Iuk7KCc6rCS6rO8IOqzhOy4oeqwkiDssKjsnbTsnZgg7KCI64yT6rCS65Ok7J2EIO2Pieq3oO2VnCDqsoPsnbTri6QuIOy2nOugpeqwkuyXkCDrlLDrpbTrqbQg7ZqM6reA64KY66y07J2YIO2Pieq3oOygnOqzseyYpOywqOuKlCAwLjAxMjfsnbTqs6Ag7Y+J6reg7KCI64yA7Jik7LCo64qUIDAuMDc4NOydtOuLpC4KYGBge3J9CiMgZXZhbHVhdGlvbgptZWFuKChwcm9kJHByb2R1Y3Rpdml0eSAtIHByZWQudHJlZS5wcm9kKV4yKSAjIE1TRQpgYGAKYGBge3J9Cm1lYW4oYWJzKHByb2QkcHJvZHVjdGl2aXR5IC0gcHJlZC50cmVlLnByb2QpKSAjIE1BRQpgYGAKPGJyPgrri6TsnYzsnLzroZwgQ0FSVCDtmozqt4DsnbTsgqzqsrDsoJXrgpjrrLTsnZgg7JiI7Lih6rCS6rO8IOyLpOygnOqwkuydmCDsnbzsuZjrj4Trpbwg7IKw7KCQ64+E66GcIOq3uOumrOqzoOyekCDtlZzri6QuIOqysOqzvOulvCDsgrTtjrQg67O066m0IO2ajOq3gOydmOyCrOqysOygleuCmOustOyXkOyEnCDstZzsooXrhbjrk5wg64K0IOq0gOywsOqwkuuTpOydmCDtj4nqt6DqsJLsnYQg7JiI7Lih6rCS7Jy866GcIOyCrOyaqe2VmOq4sCDrlYzrrLjsl5Ag64+Z7J287ZWcIOqwkuydhCDqsIDsp4Qg7KCQ7J20IOunjuydgCDqsoPsnYQg7ZmV7J247ZWgIOyImCDsnojri6QuCgo8YnI+CgojIyMjIyMgMy0xNCBDQVJUIO2ajOq3gOydmOyCrOqysOygleuCmOustOydmCDsmIjsuKHqsJLqs7wg7Iuk7KCc6rCS7J2YIOyCsOygkOuPhApgYGB7cn0KIyBvYnNlcnZlZCB2cy4gcHJlZGljdGVkCnBsb3QocHJvZCRwcm9kdWN0aXZpdHksIHByZWQudHJlZS5wcm9kLCB4bGFiID0gIk9ic2VydmVkIFZhbHVlcyIsIHlsYWIgPSAiRml0dGVkIFZhbHVlcyIpCmFibGluZSgwLCAxKQpgYGAKCg==