1 Wstęp teoretyczny

1.1 Twierdzenie Bayesa

\(P(A\cap B)=P(A\mid B)\cdot P(B)\); jeżeli \(A\) i \(B\) są niezależne, to \(P(A\cap B)=P(A)\cdot P(B)\)
\(P(A\cap B)=P(B\mid A)\cdot P(A) \rightarrow P(A\mid B)\cdot P(B)=P(B\mid A)\cdot P(A)\)

\(x=(x_1, \ldots, x_n)\) – wektor wartości niezależnych predyktorów
\(C_k\) – klasa, wartość zmiennej zależnej
\(p(C_k\mid {x_1, \ldots, x_n})\) – prawdopodobieństwo, że obserwacja \(x\) należy do klasy \(C_k\)
Z twierdzenie Bayesa: \(p(C_k\mid x)=\frac{p(C_k)\cdot p(x\mid C_k)}{p(x)}\)
\(posteriori=\frac{priori\cdot wiarogodność}{dowód}\); ang. \(posterior=\frac{prior\cdot likelihood}{evidence}\)

1.2 Naiwny Klasyfikator Bayesa

licznik: \(p(C_k)\cdot p(x\mid C_k)=p(x_1, \ldots, x_n, C_k)=\)1
\(\begin{aligned} =p(x_1\mid x_2, \ldots, x_n, C_k)\cdot p(x_2\mid x_3, \ldots, C_k)\cdot\ldots\cdot p(x_{n-1}\mid x_n, C_k)\cdot p(x_n\mid C_k)\cdot p(C_k) \end{aligned}\)

Naiwność – założenie niezależności wszystkich predyktorów pod warunkiem \(C_k\)

\(\begin{aligned} p(x_i\mid x_{i+1}, \ldots, x_n, C_k)=p(x_i\mid C_k) \end{aligned}\)
licznik: \(p(C_k)\cdot\prod_{i=1}^n{p(x_i\mid C_k)}\)
mianownik: \(p(x)=\sum_k{p(C_k)\cdotp(x\mid C_k)}\) jest stały dla \(x\) i dlatego pomijany w poniższej formule


\[\hat{y}=\underset{k}{\operatorname{arg\,max}}\left(p(C_k)\cdot\prod_{i=1}^n {p(x_i\mid C_k)}\right)\]

1.3 Gaussowski Naiwny Klasyfikator Bayesa

  • założenie rozkładu Gaussa dla predyktorów o wartościach niedyskretnych
  • dla każdej klasy wyznaczana jest średnia \(\mu_k\) oraz wariancja \(\sigma_k^2\)

Dla nowej obserwacji \(\nu\): \(p(x=\nu\mid C_k)=\frac{1}{\sqrt{2\pi \sigma_k^2}}e^{-\frac{(\nu-\mu_k)^2}{2\sigma_k^2}}\)

2 Naiwny Klasyfikator Bayesowski

2.1 Załadowanie danych

Wczytanie niezbędnych pakietów.

library(e1071)
library(caret)

Ustawienie ziarna generatora liczb pseudolosowych.

set.seed(NULL)
Wczytanie zbioru danych.

Wszystkie kolumny przyjmują wartości nominalne. Opis zbioru w pliku /usr/miswdm/house-votes-84.names oraz pod adresem Congressional Voting Records Data Set.

data<-read.table('/usr/miswdm/house-votes-84.data', sep=',', header=F, na.strings='?')
colnames(data)<-c(
  'Class',
  'handicapped.infants',
  'water.project.cost.sharing',
  'adoption.of.the.budget.resolution',
  'physician.fee.freeze',
  'el.salvador.aid',
  'religious.groups.in.schools',
  'anti.satellite.test.ban',
  'aid.to.nicaraguan.contras',
  'mx.missile',
  'immigration',
  'synfuels.corporation.cutback',
  'education.spending',
  'superfund.right.to.sue',
  'crime',
  'duty.free.exports',
  'export.administration.act.south.africa')

Usunięcie rekordów niezawierających danych w przynajmniej jednej kolumnie (wartość NA).

data<-data[complete.cases(data),]

Podział na zbiór uczący i walidujący.

partition<-createDataPartition(data$Class, p=.75, list=F)
data.train<-data[partition,]
data.test<-data[-partition,]

2.2 Stworzenie modelu naiwnego klasyfikatora Bayesowskiego

model<-naiveBayes(Class~., data=data.train)

Tabele prawdopodobieństw warunkowych (ang. Conditional Probability Tables).

head(model$tables, 3)
$handicapped.infants
            handicapped.infants
Y                    n         y
  democrat   0.4193548 0.5806452
  republican 0.7530864 0.2469136

$water.project.cost.sharing
            water.project.cost.sharing
Y                    n         y
  democrat   0.5591398 0.4408602
  republican 0.5185185 0.4814815

$adoption.of.the.budget.resolution
            adoption.of.the.budget.resolution
Y                    n         y
  democrat   0.1505376 0.8494624
  republican 0.8271605 0.1728395

2.3 Walidacja modelu

Macierz pomyłek.

data.pred <- predict(model, data.test, type = "class")
cm <- table(data.pred, data.test$Class, dnn = c("Predicted", "Actual"))
            Actual
Predicted    democrat republican
  democrat         27          2
  republican        4         25
  • Trafność (ang. accuracy):
    89.66%
  • Precyzja (ang. precision), klasa=democrat:
    93.10%
  • Precyzja (ang. precision), klasa=republican:
    86.21%
  • Czułość (ang. recall), klasa=democrat:
    87.10%
  • Czułość (ang. recall), klasa=republican:
    92.59%
  • F-miara (ang. F1 score), klasa=democrat:
    90.00%
  • F-miara (ang. F1 score), klasa=republican:
    89.29%

3 Klasyfikacja wieloklasowa

3.1 Załadowanie danych

Dokładny opis dostępny pod adresem Vertebral Column Data Set.

vertebral<-read.table('/usr/miswdm/column_3C.dat')
colnames(vertebral)<-c(
  'pelvic incidence',
  'pelvic tilt',
  'lumbar lordosis angle',
  'sacral slope',
  'pelvic radius',
  'grade of spondylolisthesis',
  'class')

Klasy (kolumna class):

  • DH - Disk Hernia; 60 obserwacji.
  • NO - Normal; 100 obserwacji.
  • SL - Spondylolisthesis; 150 obserwacji.

3.2 Stworzenie modelu naiwnego klasyfikatora Bayesowskiego

Podział na zbiór trenujący i walidujący.

partition<-createDataPartition(vertebral$class, p=.75, list=FALSE)
vertebral.train<-vertebral[partition,]
vertebral.test<-vertebral[-partition,]

Wytrenowanie modelu.

model<-naiveBayes(vertebral.train[,-7], vertebral.train$class)

Alternatywnie.

model<-naiveBayes(class~., data=vertebral.train)
$`pelvic incidence`
                     pelvic incidence
vertebral.train$class     [,1]     [,2]
                   DH 48.56933 10.96031
                   NO 52.21853 13.03602
                   SL 71.60097 15.37070

$`pelvic tilt`
                     pelvic tilt
vertebral.train$class     [,1]      [,2]
                   DH 17.82356  6.632966
                   NO 12.79120  7.070293
                   SL 20.97053 12.073815

$`lumbar lordosis angle`
                     lumbar lordosis angle
vertebral.train$class     [,1]      [,2]
                   DH 36.08911  9.897192
                   NO 44.45800 12.985196
                   SL 63.52186 16.421478

3.3 Walidacja modelu

3.3.1 Macierz pomyłek

vertebral.pred<-predict(model, vertebral.test, type='class')
tt<-table(Predicted=vertebral.pred, Actual=vertebral.test$class)
         Actual
Predicted DH NO SL
       DH 13  7  0
       NO  2 18  2
       SL  0  0 35

3.3.2 Współczynniki klasyfikacji

Obliczenia pomocnicze.

diag<-diag(tt)
rowsums<-apply(tt, 1, sum)
colsums<-apply(tt, 2, sum)
  • Trafność (ang. accuracy):
    85.71%
  • Średnia precyzja (ang. mean precision):
    82.27%
  • Średnia czułość (ang. mean recall):
    84.42%
  • Średnia F-miara (ang. mean F1 score):
    82.70%

  1. Rozpisanie łącznego / wspólnego (ang. joint) rozkładu prawdopodobieństwa zmiennych losowych przy użyciu reguły łańcuchowej (ang. chain rule)

LS0tCnRpdGxlOiAiQmF5ZXNpYW4gQ2xhc3NpZmllciIKYXV0aG9yOiAiS3J6eXN6dG9mIE1pZXJ6ZWpld3NraSIKZGF0ZTogIjAxLTA0LTIwMTgiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlCi0tLQojIFdzdMSZcCB0ZW9yZXR5Y3pueQojIyBUd2llcmR6ZW5pZSBCYXllc2EKJFAoQVxjYXAgQik9UChBXG1pZCBCKVxjZG90IFAoQikkOyBqZcW8ZWxpICRBJCBpICRCJCBzxIUgbmllemFsZcW8bmUsIHRvICRQKEFcY2FwIEIpPVAoQSlcY2RvdCBQKEIpJCAgCiRQKEFcY2FwIEIpPVAoQlxtaWQgQSlcY2RvdCBQKEEpIFxyaWdodGFycm93IFAoQVxtaWQgQilcY2RvdCBQKEIpPVAoQlxtaWQgQSlcY2RvdCBQKEEpJAoKJHg9KHhfMSwgXGxkb3RzLCB4X24pJCDigJMgd2VrdG9yIHdhcnRvxZtjaSBuaWV6YWxlxbxueWNoIHByZWR5a3RvcsOzdyAgCiRDX2skIOKAkyBrbGFzYSwgd2FydG/Fm8SHIHptaWVubmVqIHphbGXFvG5laiAgCiRwKENfa1xtaWQge3hfMSwgXGxkb3RzLCB4X259KSQg4oCTIHByYXdkb3BvZG9iaWXFhHN0d28sIMW8ZSBvYnNlcndhY2phICR4JCBuYWxlxbx5IGRvIGtsYXN5ICRDX2skICAKWiB0d2llcmR6ZW5pZSBCYXllc2E6ICRwKENfa1xtaWQgeCk9XGZyYWN7cChDX2spXGNkb3QgcCh4XG1pZCBDX2spfXtwKHgpfSQgIAokcG9zdGVyaW9yaT1cZnJhY3twcmlvcmlcY2RvdCB3aWFyb2dvZG5vxZvEh317ZG93w7NkfSQ7IGFuZy4gXyRwb3N0ZXJpb3I9XGZyYWN7cHJpb3JcY2RvdCBsaWtlbGlob29kfXtldmlkZW5jZX0kXwoKIyMgTmFpd255IEtsYXN5ZmlrYXRvciBCYXllc2EKbGljem5pazogJHAoQ19rKVxjZG90IHAoeFxtaWQgQ19rKT1wKHhfMSwgXGxkb3RzLCB4X24sIENfayk9JF5bUm96cGlzYW5pZSDFgsSFY3puZWdvIC8gd3Nww7NsbmVnbyAoYW5nLiBfam9pbnRfKSByb3prxYJhZHUgcHJhd2RvcG9kb2JpZcWEc3R3YSB6bWllbm55Y2ggbG9zb3d5Y2ggcHJ6eSB1xbx5Y2l1IFsqKnJlZ3XFgnkgxYJhxYRjdWNob3dlaioqXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DaGFpbl9ydWxlXyhwcm9iYWJpbGl0eSkpIChhbmcuIF9jaGFpbiBydWxlXyldICAKJFxiZWdpbnthbGlnbmVkfQo9cCh4XzFcbWlkIHhfMiwgXGxkb3RzLCB4X24sIENfaylcY2RvdCBwKHhfMlxtaWQgeF8zLCBcbGRvdHMsIENfaylcY2RvdFxsZG90c1xjZG90IHAoeF97bi0xfVxtaWQgeF9uLCBDX2spXGNkb3QgcCh4X25cbWlkIENfaylcY2RvdCBwKENfaykKXGVuZHthbGlnbmVkfSQKCioqTmFpd25vxZvEhyoqIOKAkyB6YcWCb8W8ZW5pZSBuaWV6YWxlxbxub8WbY2kgd3N6eXN0a2ljaCBwcmVkeWt0b3LDs3cgcG9kIHdhcnVua2llbSAkQ19rJAoKJFxiZWdpbnthbGlnbmVkfQpwKHhfaVxtaWQgeF97aSsxfSwgXGxkb3RzLCB4X24sIENfayk9cCh4X2lcbWlkIENfaykKXGVuZHthbGlnbmVkfSQgIApsaWN6bmlrOiAkcChDX2spXGNkb3RccHJvZF97aT0xfV5ue3AoeF9pXG1pZCBDX2spfSQgIAptaWFub3duaWs6ICRwKHgpPVxzdW1fa3twKENfaylcY2RvdHAoeFxtaWQgQ19rKX0kIGplc3Qgc3RhxYJ5IGRsYSAkeCQgaSBkbGF0ZWdvIHBvbWlqYW55IHcgcG9uacW8c3plaiBmb3JtdWxlCgoqKioKXFtcaGF0e3l9PVx1bmRlcnNldHtrfXtcb3BlcmF0b3JuYW1le2FyZ1wsbWF4fX1cbGVmdChwKENfaylcY2RvdFxwcm9kX3tpPTF9Xm4ge3AoeF9pXG1pZCBDX2spfVxyaWdodClcXQoKIyMgR2F1c3Nvd3NraSBOYWl3bnkgS2xhc3lmaWthdG9yIEJheWVzYQoqIHphxYJvxbxlbmllIHJvemvFgmFkdSBHYXVzc2EgZGxhIHByZWR5a3RvcsOzdyBvIHdhcnRvxZtjaWFjaCBuaWVkeXNrcmV0bnljaAoqIGRsYSBrYcW8ZGVqIGtsYXN5IHd5em5hY3phbmEgamVzdCDFm3JlZG5pYSAkXG11X2skIG9yYXogd2FyaWFuY2phICRcc2lnbWFfa14yJAoKRGxhIG5vd2VqIG9ic2Vyd2FjamkgJFxudSQ6CiRwKHg9XG51XG1pZCBDX2spPVxmcmFjezF9e1xzcXJ0ezJccGkgXHNpZ21hX2teMn19ZV57LVxmcmFjeyhcbnUtXG11X2spXjJ9ezJcc2lnbWFfa14yfX0kCgojIE5haXdueSBLbGFzeWZpa2F0b3IgQmF5ZXNvd3NraQojIyBaYcWCYWRvd2FuaWUgZGFueWNoCldjenl0YW5pZSBuaWV6YsSZZG55Y2ggcGFraWV0w7N3LgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KGUxMDcxKQpsaWJyYXJ5KGNhcmV0KQpgYGAKVXN0YXdpZW5pZSB6aWFybmEgZ2VuZXJhdG9yYSBsaWN6YiBwc2V1ZG9sb3Nvd3ljaC4KYGBge3J9CnNldC5zZWVkKE5VTEwpCmBgYApXY3p5dGFuaWUgemJpb3J1IGRhbnljaC4KPGNlbnRlcj4hW10oZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFFQVNBQklBQUQvMndCREFBWUVCQVFGQkFZRkJRWUpCZ1VHQ1FzSUJnWUlDd3dLQ2dzS0Nnd1FEQXdNREF3TUVBd09EeEFQRGd3VEV4UVVFeE1jR3hzYkhDQWdJQ0FnSUNBZ0lDRC8yd0JEQVFjSEJ3ME1EUmdRRUJnYUZSRVZHaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNEL3dBQVJDQUJzQUtVREFSRUFBaEVCQXhFQi84UUFIQUFBQXdBREFRRUJBQUFBQUFBQUFBQUFCQVVHQWdNSEFRQUkvOFFBUUJBQUFnSUJBZ1VEQVFjQ0FnZ0ZCUUFBQVFJREJCRUZFZ0FHRXlFeEZDSkJVUWNWSXpKQ1lYRlNnVE9oQ0JZa1E0S1JzY0VYSlRSaThLS3l3dEhoLzhRQUdRRUFBd0VCQVFBQUFBQUFBQUFBQUFBQUFRSURCQUFGLzhRQUx4RUFBZ0lCQXdNREF3TUZBQU1BQUFBQUFBRUNFUU1TSVRFRVFWRVRJbUZ4Z1pFeVFyRVVJNkhCOEZKeTBmL2FBQXdEQVFBQ0VRTVJBRDhBak9WdE9lZlVvWUlYc1NXUzRXT09FakJ5ZnlsWDNBOS9yeDVrbVdPeFZmc3o1bmtVeWFsRFNxd29mYzl1dVAxZGgvNmRrL3lIRTNqOHFqckVldmN2MWRNa0N0YTBZZS9IYVMxRUNCNVgzeHVGUC9Gd3NvdytwMXM4MDZ6eWIyaW5xUWtuSU5xSzdHeWo1eVFTbkhhWUhYSVY2bGYwK09aNjhGaUJneFBSTWRrTW9IeHZNZTRaL3dDTGlYcFIrUmsyTWRJMDZHNUVIcjZLazdSRWVwc0w2bXl2ajVDZE1yOWZQREtNUTdpclhiRWRiVU50ZXpGRnNHMXFzZGFhTUEvVWl3eGZQOThjQnFQZzdjY2NzdHJ3MVZhbGN5eTNaZ0hqZzlQRXJEQXpsREtzb1VZL2Jqb3ZmWkhVVWRxNXErZ0FuV1UxdWwxL0VsU1dBUmtqK0lZOGZ3RHhWeWEyZHBzR2xQd0tkUG84dDJLdG04ZzFHV0l5RXpLc29VN20vVTY3c245enhsbGthWWFMdmtya1hsSFV0UE50YXU1TWxBdGhjdjM4K1dZSHZ4czZYSHI1RWxPalh6cHlwcG1sTEdhVk9tVE5uODhDRmwvei93QzNFK3BpNE90amxNUVcvc3A1bWZUeGVodEtGWk9xWUZicDdWeG40SGZpYXhTcTYySDFJa2RKNWN1WE5RV0V2MHczWjVkbS93RHlPMGNLM1FOUW8xN2s2UFQ5UmtUQW4ySDJ5aEd6L3dCVGpneG0ySFVNZVg5QnEyWXAzdVRTUU9pNFRhUXZrZHcyNE5rY0xLVEJZbWVoMDVtajNIYVA5NWhWSCtmRkVkcUtIUnRPNWVGU1JyOXBETC91OHpxbVA3S3dCNFZpYXZnbjdvMGhKQ1BYeE1CNHpPbkZJeCtvTEdlZzBkSU9MTW5UdFF1R0VaT0pVN0hCK283SGhxK29qa3dxZlJlV25rTWtvZUl0M0NvdUYvc093NHBTRjFzVzZHZEo5WlhOU2RCYzNZTzFoM1B4ajV6bmlja1ZMcmwzN1Y5Ym8yUStwUyt0cmdiSGpPQWMrTWo5K0h4VGFBYitlK1pOSjV0MDZDUVErbTJiOXBiQllzRGpIeHgyU2VwM1FDWjBIN1NEeWhWbDBzYVhXdHh1Qkp2bUh1SkkvdmtjZGpmM0hKRFc5ZWo1a3RHUnFNRlo4dEptQmNBQWtlMEQra1o0bTFUS2FpMnAvYVZ6Qnl0VHF3MEdpbXJ5cWN5U0xuZnN3b09mUGpnWXB5amRNUmlYVk9hNzNOV3JtVzZrUWRJODcwWGFmekR6My9mZ05iL1U0ZTI5ZXRhZkpXczBKOEdxQWtFdUFDQmpnOVBEY1dVcUFPWVB0QzVpMXFPS3Bjc0s4WWNZWFlua25IMDQxVHgzdTdKcVJSYU8rbjFkT3NVa2wyNmpMTUVFWVpRbTN4akg5V2VQTG41N1VXRVZEblRYOUpzM29hOTVnT3BJbXdZRzBqSy81WTdjZXJneFJwTmN0R1BMTjJiOU81cTEvWE9ZVWpzM1paRUNTT1k5eDI5bHo0OGNTNnJIRlJ1dDdHeFNkbHpxdk4rbGFqb3NsWFQrb051Mk16YnNybnpqSVkrUUR4NWtjYy9talhxT0c2blp1RFVyQjlSTGpxdjIzdC9VZjM0OWVPTmFWc1FjdHhOZE1qZ3N6c3h4NUp6dzZpanRSMHpUZGIwclJlZ0xjOEtGSW8xNlVqQWR3Z0h6MlBmakJWbEtFbk4xK2hlMGE3WnFTUnZGSktCaU01VWU0SGIvQUc0ckRsQU9kZUFRTzNiL0FMZi9BTTQyaUdtVlFmN25IL3ovQUo4RkhIUU5KdVVOTzBMVHZVVHBGK0FIYmNlMlpuWnhuK2VNci9VenFEMCswRFNraFdJWEszc0o5eFBuUDg4R01BT0RPVUpVcUp6Zll0UE1Lc05HZnBTdVBEUjJQYVNHWDVCYmlsdlRYazBsbkpicndUU3dRekswY1RtTkNHRGRnY0RqUFFsQ1huaTNYZmw2cmFTNStNa3NrZlNSeVBiamR1d0Qyem56amltR1B1R1J1ZXpBOUdoYmF4LzZxdkczNGg4RURidFhQeDI0RmJuTkFFVWlNdGpiUHMyd3lra05qdHR6MzREUXlSdjBPZk9qd0I3TzZReVBpRjN6dEJ4Z2pKL1ZuaFhIY01rTmpweG1xV3diQWdsRloyUmQrR2JJeHQ4anp3dGlwQS9KdFZwWWhYV3ppNDdsMWhsbEVTRkJIdURHU1FoTzRPRkJQZmkwRnVITWpHeHJkTnQvVjNLcVpMSHZrZ0hCeCs0NHNROU5pZHJ0T1RtMlFMTEs4S3o5RHJESmZLeEgzWUh6aENmUEVQVGxwTk9wVVVzT3FhWkdqV1F6bW5QTzBWZTI1OXNyOW03Zkp5c2dKK25HcUxyYnZSZ25qYk1xMnQ2TzVFc3J5d3FRREZLaUYvZGtiZnAyUEVzMXlWSXBqeHRNVThsNmpwOWlhelFldkhtT1MzdXN3eEk4MzRyb2ZQWXlBZEZzWThaUDE0bm1UVVNxanZZWnFPcWFmWHR0RXU1NUhrd2lqNTNFN01mVGRnNHp4cFhIMkplbTJMbjFLaGFhU0tGak0wYU5KS0VJOXNhREx1YzQ3S09BenREUE5iNW01YjA3VTcwTXFMZWxTamNwVjRqQWpCWjd1UkcrSEhzNll3d0k3OS9yeFBwOGNrVXliMTlScHpWcnZLazlkOVEweDRZS2xnUXBXcnBFc0l4QkNvY2pDcDNMcWM5dTU3L1BBM2VRNm5wRU1ZbGxweVhvYThqVVlKVmhtczl1a2p5ZDFWbThESVAvQU8rS2lxRFlBMXlyWmlrNmJiaEVBVzl3SFkrRCsvY2ZIREM2V05lYnFFV21VbzZxc0dMdEVUaFF2NUlGN0hHTWtidlBHRk8yYXNKQlhrektBbzNFRHZ4c3hCbU9LZW4xWnJNMVY5N2FlNENSNUIzN1drd3BHUUNlN2doY0Q0L3ZTVXZ5U1NObExTcGFPcFJRdGJFS1hBeWFmcWloMktPb0xMdlZEdlF0dVhkajQ5d3lPeDVTMUt6dURMVHVYNXRUT3Bla2lONk9ndnFiSXJSbHNRcUFOekYwQngzK09BMnhsSkdMVTRKWWZhb0VpT2hYM0ZsU1BEYjFYSTI0SVliY2ZQQ1dOWnFOS1dBcVlTSENzenF3L2xZOE92anRnYnNaOC9RY055Y1pTbXJCc1dNR05GWDNoMFlNK2R6YmprTUNWK0NmcDhmSkFIdzZucFZtZVNHN0sxZ1ZnOGpTQWU5Z3JaU1BjY0lNeHFvWDR6MjhjQlJCcVE2Z2VoTHFOZHFNRjJSZFNNc1FNenhMRTA4aWRLUmw2ZUloMHlXeG5BSGIrbnZIdnVVYjJCYkZXWDBpUTdiTkdXdldGVjdLd3NFbGpoRExLMHlxY2Q1QVZ6bjQ3NStBNWhvQnBWbXF3bWhGZFBSZVRxV2QwWHVMT29WOXhaTi95UU1uNThkK0dlUTdRSHdhVjFKWkZUTXZVS3VrcVJiblFMSWRtQVk5dTRuYXBQMXlCd05aMm40RUd0VGVrVmE4WlBYc1JoVVJOcWJUTkdJM1loUjNIa0w5UmppdVBmY25rVkRlV29LdnVqZXZWdEgwKzJLdVZVbzhhOUlicEdZRmNLTnpIeGsvenhQVmYwR1VkdDdNWWpZdHJIQzdRZWtyUnFWaWpXRVdKVEZMaUJjN2g3Z0N4M1p5QjU4OEc2T29BMVNlOCtrd1JiRmllQnIxU2JaQjB3WWdRMkdrR0dsWXZrSHFlNGZUSEZGVmlVQzZ4b2RuMWNNMnBWTms2MVY2c2E3bDN0SW1ZWlNjNFJJd3lnblB4NDc4TkZpdEJ6VjV4cGNrMWlXYWVHWUk5ZUdzcmtHT0xZemRUZDNFV0Y5aEh6NTRSVmJya1lQNVZqZ2FXbFExbS9Qb3VoMityYXNkTlZMcEtEK0V4Nm43U1pZREdSd2I3QnA4b1J6NnI2MmRhR1ZxeVZsUVN3b3FqMXRzUDBWa0JHUnVNYkR0NDdmMzRmZ2tlYTNyT3AzYlVzdHl5V2tpOVJMTEJKRUNFOHBFcEkvVWRvUENSeHg4REtUUXNvenBFemg5MjRxaExGeTJUZ255RmJocUtUMHJsRnNOSFdoQlBDTlhwMTBzcDA3RVl1ZFRlZ1lNRmJvUnlad1ZCODhlYjY4bjJmNEw2VWF0UTVmcHBCU210YWlra2QyTXpVekVzOHVValpveWZmMHR1R0J3T0dXU1hnR3ord0ZKcHVsdzZYOTRyTE04UHFmU0dNUnFoM2hPcGs1ZCsyT0RjbUh2UnNyalR0UHB3VHNrazBlcFZiSlJRNlI5TnVveWQvWTJmeTU0TWsyemliMGxJN3RpeENIZU1wRE5NUGNwejBrTGJlNi9PT05MMkp1UjRBSG94V1JOTmlXUm90bnRQZEFHK283WWJnNzJBTHI2WExMREFZM2VSYkllUllraGR6aUp0aExCR1BnOEpLWVN2NWI1YjEyN0lsQ3ZjNkx4UlRXWTYweXp3NGppVXlUTXZVUWpzb0pPT01zODNoZndWMHBjaDlMbERVNUl2UWFiZXJUbTZXNmRlT3hHclNNVk9RdldqVStNOWdlSi93QlcvbjhCbGpTUDBMby8yUzhqUmFQVnZham9zRXpHc2pYTEZxZVJnN0ZFWjVHd3pxeFlyNS9iaW1LZVJ1M3dZbklML3dEQy93Q3p5N1dqKzU2VUZhT0VxanpReXU1SU1obVJEMVdYL2V0dUdjOStOa3Nia3ZBaWxSaHIzMlAwTloxbXZxR3N3eDZqSFhqU3VzVHdpTXJDdmxSSkRNai9BUFB0KzNFWTlQT0hERHFFVmovUjc1QVFFU0hXZGpJNk5JeEVwL0VmcU0yOFJzUzJlMlc4RGllU2Nselg0WTZ5TTU3cnYyTFU5UDBIV3VhUnJFMHNGT0d4UEZITFJTdTBqV0FJNDFFekZGZU1aSDZGN2srTThMajZ0TjFRMXRuTVRRVk5IbDAyV3M4dGQ1L1VRWlVib3BINllsbDNySXhkM1dNcmc5aG50eGQ5U21XWFQwd0FWZE9xUnlwQWo0UmpJa1UwVWpkY21iS0pOa3N1STRoanNQY1QrM0ZmVlRKdkRYQmhyV3BSNnByTm5WVzI2WTFxVGMxV0Rja2FKdDJsVktxdm5HYzQvd0NaNDRaSjl3RTlPQ1dOcXVyL0FJcVNaU1VTdUFvVERLUUcybk9mSHh3eXNCblByZXN0WXRhMWF1L2VGK3hLWElhU05sWisyNldSZHdJSUM0WEMvVEI0ZXI1Snl0Y0NxUFU2d2pra01jM3FaazJUa3QyY2JneFR4bkRmUGZocWZ4UWxobERtQzBsaTFQRlRPNmRsNmloRWRSdEhnYmw3ZWVBNElLbS9rTU42R1NWWUNTREtDMFVpZ3R1eitWUW83bmNmbmpONkxvMGVxcm9kc2Z2VFF0RHJWOTNYMHNkU1pDRDc0TFV3bCtNNENaMmtuNVBIYUtZTmYrVFJxS3pHQ3pweTEvUTBiVnYxNmlSc3RBTm5UVlJ2SURqRXk1UG5oMUJBMWd0dlRMOGxXQ0J0OE1OTHF4SjJ6akxscGV6Ykh6OGdjRlVkdnlLNGRNMWpUSGl0SlRXeDE0M1FQRVNjcVYyazQrZHk1eGpoOVVaYkNPTWtEMFZYN25rRW1NMXBubDZMK1NwVlU3ZnZuanByYzZNaXMwaDRhcXVtNVMxR3JkNjZKa3FvTXNFZ0hnbnczMDg4WnNzSCtXdjlqcDJYZjJUV2JNNlVKcnZzTTBlczlFRTRCam0wMDdOcW51QVRFdy90eExKajB6K0tLS2RyNTIva1AwQ1dsQnpSeTFXNjhvc1EyRmo5TElxNFJqRTNVR1FBZTI0ZWVNVU5YYzBaOU5QeXp0L05FaXhjcmNpc1dHMGFwcEo3L1FSazQvNURqM08zazhnVTgyTnJ0bm1EN3NxMjVCQzgycHRQSStXaldKYXFza094ajNEcytNL0h4eExwNWYzWGZhWC9BTUhjYnF1NU02aFk1aTVXNUR1eXczSmF0K3VkeVBGS1cyNzJWUjV5UEh3ZU5QWDlRcDVFNGNHbkRoMFlaYXVSOXovcXRybHQ5Y3RhRFhxd1BwRkN2TWs0aEcrTzNjc0pEZ2pKRW0rT1JpY2p0MjR4VjcydXkvMlo2OXAwVG5mVDlQbTVMMWVDMVhqbnJyVGtib3lBTXBNYTcwQkh5TjZqaTArbWhwcmdXRXR6Zy9OMmpjdTF1YTlUMG12byttcldxRkZRTkd5SGQwVWQvY3NpZnFKNDhUTEhUbDBxVFMvSjYwRi9aMXUyeVIwYmx2bGpXdFYxZW5OcHlWb3ROb1dyM1ZxeXpkL1RESVgzdklBRyt2Rk1hay8zRThudFNma2w2L0thNm5RVzdTMExVT2c1S3JKQlpTUWJsL01BR1FNY0U4VWVaeDVhQTBoSHEzS0V0TkdlV3JxdFZCK1o1cSs1Qi9MZTBjYWNmVVgvQU9KTndFc21nQTZZK3BwYi93QmpTWG9GcEllL1UrbUJrbnp4cFdUZXEveVRGajFoK201QzM4cTYvd0Q0OFVUK0JHZVY5TXNUYnVrMEVtUEpWK0cxZlVVc0pxL0tjeGhsbll3MjRtYmY2R1JuUFdZbGtUcU5rK3p5bTBmVHZrbmhMbFd4MVJIdGpselY2ZW9VcjltejZXb0srSUZ0b0laVkczTFF5TWR2c2xmT3p0a01lRjFJSGN5c1FhcnA5bXlkWVNHUFUyenFGRFRwNmhrcnl4ZFQ4a3FLQTBlNFJMK0Z0N1l5Y0RnYlBqanlOcW9MMXpTNTQ5Rmdab1VxM2JVUzNHMGtHTnBGaWNLMGpkYVFnb2QwVVpqVDg2WjhIam9yeDJHY3Q5elpXb1NNbGZVdnU2eERwRFNMQ2J5Ylg2VW16QVNUZDdoOHMwdUF1NWpnWTdpSHJRYjAzdlJkWXBKY2JBODhzR24ydnU3VW9JbzlRZ2tFNHB0REdqRld6SElydU41V1F1bmFJZDh0NThuaXF4YmJFZlUvQXMwQjAxaTlxRTlLTmF5MHhzMUVXVk8vcHl6KzhET1ZWaTRBQ3YzTEhIQmxHa2psTk1jNmRyMmo4c1MyWXFjS1BmYXZQVTArWjRYV09iMVo2THBHR0JjTkcwaklwK25rY0ZKdmtua2ZnSjVmMGZteXZxV2xRYTFHYXZNT2wySUthVjc4Z1NOR21UcVZIbEtzM2RsNmtlVC9BRktEd3VWV3R1R1BpcWlwdWMzL0FHcTZ0VTB6VHJHbXhMVzBPYUN6WHNRZ3VETFVKVkZZanJ4cjdTd0pQSEtTVWVSWGhkMFB1YS90Q2FLU2pOWXVTMWRhU09aR3QwcElKOWpXWTFqeVZraXJCamhOeS9UUEVIMWNLVW83K2FOSDlCTlMweTl2MUpmV09kNHRSMCsvUXQ2eFBiZ3hVU3RGWmdqaGVSeGEvRlpXamttTHNkKzVpY2UxZTNGSU5aRnQyQmxpOGEzL0FIRC9BTzBEN1RPVU9ZMTF6U3RMU3lidXNXOUtoaG5VSHBTUlZyU3M3NElVb0FGd1Qzei9BQU04VjJVbjgxL2d5MDYrRHJIUFgyZzhvRGxiVkk0dFZyU1RHSUtZdXF1Y1NNeTk4a0R2MDIvK0VjTlBMdHQzRWp5Zm56bTdtcUxVdWUrWnA2aXcycWMwaXNrNUliRVVoV0tOb3g0SlpsQTQ4M05oYzNxM1ZucVljMVFpakhrZlVLamFWenhmQ3BWZWJsNVJYaHlNNXVNQW9YNmxzZnp3OGNUaTl5V1NXclQ5UlhOcjJuNkx5eFFTeENzOHhvMko0MGJ2N25zeWJjajQ3b001NFhDbTVQeGEvZ2oxS3VSUDZMZmtucjYvYzJQV1E2VytZRlpqRG16UEZGMkI3ZGd4QVBGZW9TMi85djRzWEQrbzFhNVRGVDdMOUdrK2RRdldwLzhBaGkzS1ArZzRySDlYMktmdVpJVDByRWFkTWlJdHMzN2dUa0EvSEZveUE0OXgvd0RaM3BrRTlXOVBLT3hsVkYvNFZ5Zi9BTHVGelRhSlNOMmdjeWFIVXA2aEphQ0hVRlVWVXFXa0RBUnlieEthem92c2ZPMzNlY1o3OFZsZCtWLzNJc1h0OGpYbG5VdGJ2ZWlzVm9ST21sV0lYKzcvQUZKbXk3eWIwbjJNUVhrYnB0R0FUakpVQmUvRTVQWU1JSzdHbHJWZGNrNXJnckFHWFNkTGphOFRJeldXVlpNU2ZqeFkyR2ZheHhFeUFrLzI0RU1Qc3NyTExjcWRGaG8xZlZKZWUwMCt2WG82eGJ2NmNadE8xRmJUUVZqS0xKSHFZM0NTeU5PcVpHTSszSkl6d1Ayc0YrNFovYXZ5ejlxRkxVZFAxdjBsQ3Z5OVhyUERxRldwTE5QQkdWeThjbHhXamlhUmM0K0NPMlBuaGwwcWZQSVA2aHJaY01rN0VTVFd0STEvU2JDWHI5VE51eHBOcGpzUm9rL0RuWkVEckxFcjc1QktwOEhQblBCcnlMWXVzNlBxbFBWTlFmN2s5UnBldlFSMmJ6VkdkNVk1WU4wMldjR0VsekluVk8zOHc3amczYTVwaGEzMkJlVXVWZEJmN3kxRFYrWTRHSVRGcVd6MUdhTVBzejJiM2xrYXdtVzhIeUR4ZFZvK2YrL2todnFHMHZNL1BFbG1ySnJlblZ0YkZjTEhRMUMzV0t1MFNQOEFoRkxVSnJzeS9JSlk4ZWY2a2xzZWdzZU43bXl0cDJtK3MyUHlucUZPN0xLNjVvWFhPNlNOZW8vc3RKUGs3ZmQrZnY4QUhFTWkxY28wNHBhVnRMOG02TFhkSnJPc3RYbURVTlBSc1NwRmRwSmFoYkhkT3AwWnZjcEl3ZncvSEU4Y0lyeWltU2NwTGRSWmcycVVSYmoxSDc4MHRyVlYzczJKYXRHekN4aW0yRHBZU3VyS21Td0EzYnNIenh0eHZUM1o1ODR5bDJYNUVWK0dsUXBXbzAxWmsxS2treFJxZWxsWkMyVU1pelN0TEZ0UWUxTXI4RWo1UEQydHRoV3BNSDBXM0RjZ3RYdGQ2ZWtRNnZIMGJsbDBMSGIrRTlhc0s2NzNGWXJFRjNZM0hkZ2VPMUpMc1MrU2RTYm1lZUhWTlJ0TU5KcFg3Q2hYZjJmNGZmWkRYeHVPT2tnTGZCSGZoOVVVRFEyRzA0WmFyWHJkTVQwTkZqQ2pRTE40a05ibmpjVjQzenRaU0ZEU3UzNlZQZzVBNFcxMzVaMm53TExEMjdkYS9CUjFFVDBZaEpXdGF2TU9najErcjFSR3ZjbHpOSXdiWUJrSEhmSEFpcTM4aGU0eDViUWFmcGx0MG5xM1dzTkFra01rZy9DaWhMT1dtak9lMjdIdDg5dUl5aXBTOEpmNUdqdHh5QTh4YXhQUEJwL0xOTjQ5UnFWVWtyNlplZHVtckwxQnZuMnRqcEYyak9OeC9LZUx4eHJkaTZuOTJJTDhOV3ZMR3M4NWpSVWpJWlJ2MzlXTGNYWDh1VjNuSERwSE5sVHl0NjJucFhScjBMRmc5YVJud0FqQU5qWVdWeXY1a3dSampQbFc1MU5tclNkWDVlMXV4RnAzTTFKZWxJdlRyNm5VR3l6Qy93Q251ZmE2N2ozRDU0SHVqd2M0Z24rcVBNZERyYWpwMGkyWUMwMWUzR2o5SmpCQ0VrM1lMS2UvNWx4M0JYOXVMNDVwb205aWp2OEEyZzEwMEdMVHRmMGg0ZFNpa2dqVzkyanRtdkhBUkVaSW1DKzVReXNrdTNKeDN6d1ZGcllOcmthNkx6SDkwMWpkM05OcGxrdnNOWTkxQ2ZsbUZjQlphOWhIY0VTd01SalB0K2VKM2ZISm9saWFTazA2ZkJmY3ZmNlJmTk5tckRwbnFORzFLV3hOSlZnMUM0OGxmc2NDRDFTamJIK0tyZDI3WXdjamlseSs1TDAxeWNtckVheHpKYjBxcGZrb2E0SjdXSU1SZmR2VjZtY3BKSDArbkNSMkxMR1BiZytPRFMvYzBsLzJ3RzMrMVgvM0lYcFBNWE9DbWJTOVkxbjdwZWxiamtpdVQ1dDlPN0RJeTc0dHh3a1liL0d4bnQzd2ZIRTIvRzQxZmtDdFdFMUdLbFUxT0wxbXNpeFBSQXJHR09CQ3o3bENGU3hramtWMllNUUFPd0hqZ2IvWU5oeTgxblR0Sys3NEk3RUdtbzVlclFzZGZaMG1CanMxWnl5cUQxMUl3NkVBYmZxZUdjMitUbzRseUQ2bnpMb0kxR0daWFU2ZllnaU0xU3JQSXJaakJHMlNTWXpPa3lFRGFlK1JueHV4d05Id2NrMTNzdzB1OXk0NkVYN3IzVW1pSUZoVTZUSlp3cW9wVjl3ZGM1eVJqSStuQ09DSFVwSUwwZFk2N1ZkSW1zd3JKSFlXU1hVUXRob3hMS0RISVRJR0FIUnJrTXJZSStBYzkrR2xqOXhUMVllbFNqNy9BRHYrQmVMOUN2cXhlbEVsdXFtNkNKcldJNHBGM3VkODBFWkcxZSs1UU1lNEQ1endMSmFEWEZHalMvZUJpYU9SWStuUVN0VWNOSHRrNmdabVpSN3lRTU1yOXMvdGpoSGtTN2pyRy9Cc2F4NmUzQnJITTA3M2RUc3c5YW5CS1E2L25ZZGFZbzRrM3JJaDlyZm16eDBWdHNHYzVQYndUYzltZXpNdG5VaE5OUjZuVDZTU0VON2p1YU5Td1lKa2ZtK2ZudnhXSktSdmhObldUYldxc09qYURXSllzLzhBaFJCWExvaXNSbHBUdXdwWWd0MnlmSEQxK1JMTkw2cFdnMFNXbnA3enJQWUVaMUNQYW9XUkl4M2RwbGJPM2UzNWR2ajU0RmJuVWU2VExTMEM3YXUzbzF1YXZEdUZOSTIvMmVPU05pbTZUR0F5OXZhUEJIMTRNcmFwY0hSNXMrMGU5cXQ3WFRyejBhdXFvSlF0MUx1RXFzYkdWRWJnTWhYZGoyaGUrQncxS0tGL1V6S2JuRzlHeHI2VzNUcFJNZWtYYzVJUDZSbjlLQVlYOXZQRS9TdmtiVU9ZZnNsMWJVSVpKZVU3eTY3TldWcEphSFRhdmIyanZ1ampZc3I0K2l0bjl1Qkdha2R2SGtTNm5xMnJNdmVSbzY4a0xwYWlLKzRNZmF3OGJneHlRZUV3N2Jkd3lWL1FNc2MrYWwvcmJXMWJWTlBxNnN3aGFBUlR4SzhOaU5rMkoxRlVaazZXY0R2dXdBTThhWXV5TTQ5ajZqck9vTHJMV3Q4dFdLeEozcnhmZ0pGR1dCOWtUbVVKNCtXUGJqTGttamZqeE9VZDJ4M2Y1WHFhQnpldXJ5Vm82MUN4UDFOUFFJczlhdXZZNXNSQnBmYXVjcmhpRDlQamlrSjNIZCs0elBaL0FYckd0OHVXZFkxUmRTcUxUQnNvMSs3WFdLT2NTWUNTd2hKay93QUZrWDJLTWhTZlB4eDBZMGtrRjd0M3lMTFZ1cWZVMEhGYTVOY2hRYVBJSWNTQUUrWDdiMXRleGN2NFA4SGgzR2diQ3I3bWxZU0N2NmllMVlMUTZsMFIxalY2TEF5TWVsdUlTVEdjNCtPQW1CN2x1ZnRINXlnNWZ0YUZpTDd3MGdza2pPa3ZyRWdoSTZqS1JzVFlnRzFzNWJ2eG1lQ0RkMXlhRktTMnNPSDJvNjlRMHFoYlhSdE42K3RkTmFjdStOMlhFaTVVcE4xaEh2WCt0UjJZSGpQajZLTVovcWJyc1d5WjVUandVZHovQUVoZE5pMWVCWmVWTkxoam85WmRZZ2pqU3duVUxiSXRsaU9KZ1FvOTJWR0RuejI3K2pkOGNHSFJRczVvMXZsVDdUTHRoOUJtZ3A2MkVtcWFkSEhEUEJISlUyZUFyRERUN054d283QUQrOTRKU1ZTNXZZak51RzY0QWViZnRPNW1vOHV5VHoxNnlTUlRIU3BKa3c3ZXNoUlg2dVFTcm82NVBaZk9SMjg4ZVovUVFjNzMraHZYV1NVSzQrUkJxSFArdm5VOVBrV0NuMVJBYk51a04vcG9pN0YwTW05dHltSlYvSnVQakhEUjZMSDQ3blBxcHZ2MkorVFd0YTFHYW0yb0pYUnJiQzFKTGZ3bGUydVdLeVlYYUFQSTZhK1dIMTdjYVk0b3hJZXEyQ1c5WkN1bnFOU2xtaWx5WEVKRWUyeE00YTB3UUxobGJKQy91T0cwZ3M5bXRIN3Vzdm85QnBhMElCczNXaUx0NllPcWJpR1BjUEtNTjhEeDI0Q2p2dURYUUpTMGlhelpsRjZhS2hPb2doaVd4SUlTRmtYMllQZEVDUmpMYmpueHdaUHdkRkx1QU5wOUhBcUl6MkpCYTIxM0xMQ3NrQS9OanlBU2YxRW50dzlpTTkxYTVadFR4ZWgwMFZxQXpCVldBTmg5NzVBa2NIRFBuR2NZL2pqb2dZdEVHMldWTGdsNnNaMkVSYlNBVjhqemp0KzNEQVl5MHZubm1IU3RTOVpRdHZCSU1qQ0VnWStSMitvNGo2S0hlU3ltNW8xaXBhdGFicmFNSVpaWVdlWnlQWTdqMnNISGZKUDc4Wm9SZTZMS3VTY3Nhank3ZWg2VWRWcTkzZUdWNFBaRWZoaHR5ZHUvOXVMcFRqeUw3Wk9rVU5EVHlaSW91a3pPNUFRRHVTZmhRQjlmSEdHVXR6MDQ4SHRTYlhxdXFIMFJscDZqMUQrQkdEdVdhUWtGZW0yUVBkMks0NHBydC9RelBHdFAxRE5RdWN3YVZjVFYrYmVYOHM1MitzcmROUUdJN0NTTDNwdTdaRy9IZnVQSEdsVjJaaEZaak91UXp6MUpXa1dJbDQ1N3cvRWovWlpOeTVDWjlvWHNQcHh6bHA1US9ZTzBKbDBQWFBWM3RHaTFsWnRxU3dqcUNGMVFaYVJKTis0UElSazVYSHg4NDQ1eVRRQ2FXMDloNzBNWk4yTkVaNGJVenNIZzk0ekp0STNFbFFGSzkrM0ZhT1REcSt0V1dzVlpWbUlTajA1YkZ1TE1yL2w2Y2pZYzdCMndxL2w0a29vMVN5dnpabWRRT3BhdFR2NnhZcnJRa1lQS2dXRUZVZy8zVWFiaWZjUGFtNGovQUM0WlJyWkVweWNuYjNDYUhNRmpSZGZpMTZyWXI2YkxVYjFtblVhNmJQZklDQXA2YmUxV1hHL0xaS25IQlRmM0p1S2V6V3gyWFZ0SDBMbW5UOUY1L3FwNmpSaElibXA2VEpYQlI1RnpCWll4RFBic2U2azloOVFPTms4Ym5EVkhuZ3c0c21tV2lSd0szV24wNnJMcVZxQlpFMVRyeDBaRll0SEF5U1lmY2RwM09GL0tEM3g3dnB4bTcxM1JzVENyZGVwVzVZamxocTdmWEJhOXVTMDhjdGpyd3NXWjZTWVdTT05oSWdZL0o3ZU9CZTRhWXgwNjNlMFJKcEx0Q0cvRlhwZEdnelNGbW95ZFhxSitJZ1pZcG1HNDRIa2NJL2R3ZFZjbU11bTZrMnFXWm90YXJ4VXFmU3BQY2prbGFIcFBobVZkM1RrZkRybkREdWVHWEFMdGkxYmk5Rm9wTlJsOVRabGFWN3NZellNWlhKamRlNzc1SEk3OVRBeDg4TllyUXFrbGhnMzE0d2p4dE9KVmVUdkw3TWhWR1F6NDhIR0J3UUJJMUxXcmNWbjAwczBzZG0yWm1wUk0zZWJia3NzZnVZbFYrY2Y5T09vNnduUWVUK2FkV0ZocUMxNi9RWUxNbG1hS0J0ekx1SCtNY3Q3U0R3SEtQY2IzZGlSUDVqeFFtVWV1d0JkQXBpTnlZNFpTR0JPZThpZzUrbjZlTTJHWHVab3pRcUlxMDdUYmpwNjRJVXFSTnRNNUh0TDR6c1UvTFk0dGtrdUNlRk95K2cxeXUraXgra2wzWElNQ1dTWUxHVUorVkc1dDR3TzM3K2VQTWxpcVcvQjY2bW5FeDB1OUhPN3oraDliMGxlV2VFNUpkVnp1N0FveHdEbjJuUDA0Q3hOTWhseUtnMk1jbWE5cDltbFZ1ejZTMXpwN3kyYmtJNmJibHlwS1RxTS9YZmpoOVdTRHVTTWRXZ1N2OWtXc1ZJMzFYVXJQcXRDcjQ2ZHpTUjY5VCs4cUREd0w5ZW9vNDB2UGE5cTNFU2Q3ZzFQVHBaZFgweXJ5cTl6V1BXcDA0NmlBQXE4WjkrOGZsd29JTzhnQUR6d3QybnFwVVVteTNwYUZ5ZEhQMCtiT1pLeDFPcXVldHBsTDFNS3k5eDBqTUQvdERENTZTYlI5ZUpTblRxTi82T1NaS3ljdmNrVG8ybjFOZE5DSHFkUVIycXpSNzN3UUNTVGtkajQ2bjl1S3JMTHVnYVFTZjdPZFk2Rml4V2VIVk5PZ3grRFFhTXp1UDY0NDhaL241NHFzcVlHcUo1OUh1elZiV3BYSzdyWHF1c1RJK3lHVHN1UW9qUHZJQ2R5Y2YzNHBkQzhuUXZzUSswT1RUOWJzYVJia1NMUTdjQmVaM0oyVnhVaWJhVjNNMkEyZS9meWVOSFQ1TkRicE5keUdmRnJTMzM3REg3UWVYRHFiYVBOQVV0Y3J5MkJiQ0szUjJyYU1mVk83eGdxTTV4a0VuaCtxd1ZjNDk0N0NZY243WDVPWTgxb21tYzFXZExyU05QRlFtRU5aMnl2Z0Q4eWo5UThOL0hHUEhMVkhWNU5NbFd4dXNSTlluajA3U1hKdWlMT296R3laSTUzT1Flbkgvd0N4RGpIYzR6L0hCVEJRdXA2WEpQYmxxK3RXQ3FqbmZKMkFQVE9DKzNQZ0J1eFBIUGc1Y21VT253clNiVTQ3djRrY3JDQmR4M3FVL3dBTmp0L1VXN3JqNEdUd2JPNVBiT3R5OVo1QkZHbHVhd3R1YTRDWTVPb0cza2J2ekRMZCszenh5UXJNTlExUzVLME4xQTlSVWtMcFpnRERkS1czN3QrRUc0ZlVIam94REtWbU1rV3NkT081TFVzdEhjekpGTzVjZFRCd3plekh6d2JRRUprVGZJZnBuZ3RuUlFWUGZhVmtqbnkwUWNOTWk5czdlM2IrM0N4aDNLWkozc2RHNWg1bTBLL3BGZlRkT2lqaDBTc3U2TkFNQlBxVDg3dnI4bmpBb1QxVytTa1drYzcxRFVvcDdJTmFFVjY2cUl3aTV5d1g5YjVKOXh6MzQzcUd4SjVYWSswaVNoUG90L3F4V1Vuckl0bWpaaWNJblVqUGNPTmpsaGc1QUJYK2VJNmFrVWNtME1wT1ZLYzkyYlZiazUwMmhaeEpTcjExNnMyMWxCTWdEdW15UFBqTFpQeDI3OFVVdGpQSjB3V256bHJmS091WW8zdlh4eFlPVzNJU1A2VCtwZjNHZjc4UnlkSkNhOGZRcXNyS2ZtUDdWcitzYVpJdW42Zkpwc2M4UFgxaEs4WVRycHVDSzhzMk9vMFdlMkdZZ25qTmo2TnAwM1pUVkhrazZQTkdvVmFUNmhXalVOMUZobGw4N0FmY2dHZXczWStQcHhwZlRManNEMUJicVdxMmRUdnBiM3lUWHAyL0YrV2RzLzU4VWhqMHFnTjJ6WjZxZXJPTjZ2Vzcvd0NJbVkyN2Q4Qng4OERSWTloMVhtM21XMERYdFdsdDE0bDNkSFVVNnk0SHhsaG45aG50eHp4cGJpcmM5YS91L3dES1k2a2RQcWxsNmxSbFRxQ1lZTVpkeElkaC9wM2djRk5yZXhaUlhCWjZCejdwNmFBdWs2NzYyOUhBcGpNcFZaOXNYZ0p1Uml3VlY3ZnR4cnhkUXRHaG1mSmhkMmllaHE2RFkxYTQ2MjQ3cVdxOGtjZlYvQ3NkWXR1UnQ3N2Z4UG8zejRQR2ZNOXJqNUt4WGttaG9OMks1QkhSbkQ2aEtRSzllTEcvY1R0MmtxVGhqbndlRHJFbytmUzdlbVhMbGJYa25xUFVkSTdOYUpVM0hmN3ZJSUcwZ2RpTS9IQnUrRGtlUHB1bVFQRDE3VHpReVRPcGFNN2Z3RkFLdGhnZTdaNy9BRTRXMlBSbFBwM0xFWWhJczJIZCtxOGtZVmNMdGxBaWpPN2EzdVR5MzErT0dUWXJRWGE1Z2pqU0dqcGtSKzdxcnd6MVZrUVNTZFZQYys1amxjR1RKN2ZIQ0tHOXZrTGZnU3RadE94NmhYT1RqcU51YkJPY2VmQXp4U2tMWnFpalhxZjM0REhnZTZqVmpodXZHcE9PeDcvKzRaLzc4TkVSOGcrenRqSndmSTRJRHpwTHh4eDEzN0w5T29DdlhsZUJKbW0veE9zQTRJUFlyZzlzRWNlYjFEOXhiVTlJbCswSmZSYTdxbFd1U2tLV3BJa0gwUU5nS1AyQTdEalhqUkFRMXRIcDJxTXMwMjVwdWpZbTZtZSs2SlNWSDhkdS9ETjB4a0tFbW5OR1NNeXZzd3E0eituUDVmNC9iaG10dzZ0akduSEd6WWRkNklHazJId1QyODR3ZUN3RGZUS2RjYW5QSXE3UkRXNjhVZjZWWmlCODVPTy8xNGxsZnRMOVArc3cxTFVMOVc1WXJ4V0pPZ0dEOUptTHJ1SGZkaHM5L3dDT0REZUltWGFRUERxZDU1SkEweFBYd2toN1pLbjR6OU9HMElFSkduclN2YWFabkpmZmpqdEtvWnUyZlVtWkhiSHlwSEFrZ1JZWld2MmV0UEF4RDlSU3ZVWUF1Qmduc2ZIZkhIT0NRYkZlbkx0dlFNckVNR0dDT0hmQkpjbGVkUXV5VnJGVjVtYUc2Vk5zTjdqSVkxd3U1amx1d1AxNHkzUmRKTUIwS3BYbXYzS0VzYXZFMFc3ZXdCa3l1QU1PZTQ4OGFleG5uc3dhYXRVVGxwWnhBdnE1TE1pbTFsZzRWUU1LQUNFLytuZ2d2Y1FNQzM1bVkveWVHRFo3SEV2QU9QL1opPC9jZW50ZXI+CldzenlzdGtpZSBrb2x1bW55IHByenlqbXVqxIUgd2FydG/Fm2NpIG5vbWluYWxuZS4gT3BpcyB6YmlvcnUgdyBwbGlrdSBgL3Vzci9taXN3ZG0vaG91c2Utdm90ZXMtODQubmFtZXNgIG9yYXogcG9kIGFkcmVzZW0gW0NvbmdyZXNzaW9uYWwgVm90aW5nIFJlY29yZHMgRGF0YSBTZXRdKGh0dHBzOi8vYXJjaGl2ZS5pY3MudWNpLmVkdS9tbC9kYXRhc2V0cy9jb25ncmVzc2lvbmFsK3ZvdGluZytyZWNvcmRzKS4KYGBge3J9CmRhdGE8LXJlYWQudGFibGUoJy91c3IvbWlzd2RtL2hvdXNlLXZvdGVzLTg0LmRhdGEnLCBzZXA9JywnLCBoZWFkZXI9RiwgbmEuc3RyaW5ncz0nPycpCmNvbG5hbWVzKGRhdGEpPC1jKAogICdDbGFzcycsCiAgJ2hhbmRpY2FwcGVkLmluZmFudHMnLAogICd3YXRlci5wcm9qZWN0LmNvc3Quc2hhcmluZycsCiAgJ2Fkb3B0aW9uLm9mLnRoZS5idWRnZXQucmVzb2x1dGlvbicsCiAgJ3BoeXNpY2lhbi5mZWUuZnJlZXplJywKICAnZWwuc2FsdmFkb3IuYWlkJywKICAncmVsaWdpb3VzLmdyb3Vwcy5pbi5zY2hvb2xzJywKICAnYW50aS5zYXRlbGxpdGUudGVzdC5iYW4nLAogICdhaWQudG8ubmljYXJhZ3Vhbi5jb250cmFzJywKICAnbXgubWlzc2lsZScsCiAgJ2ltbWlncmF0aW9uJywKICAnc3luZnVlbHMuY29ycG9yYXRpb24uY3V0YmFjaycsCiAgJ2VkdWNhdGlvbi5zcGVuZGluZycsCiAgJ3N1cGVyZnVuZC5yaWdodC50by5zdWUnLAogICdjcmltZScsCiAgJ2R1dHkuZnJlZS5leHBvcnRzJywKICAnZXhwb3J0LmFkbWluaXN0cmF0aW9uLmFjdC5zb3V0aC5hZnJpY2EnKQpgYGAKVXN1bmnEmWNpZSByZWtvcmTDs3cgbmllemF3aWVyYWrEhWN5Y2ggZGFueWNoIHcgcHJ6eW5ham1uaWVqIGplZG5laiBrb2x1bW5pZSAod2FydG/Fm8SHIGBOQWApLgpgYGB7cn0KZGF0YTwtZGF0YVtjb21wbGV0ZS5jYXNlcyhkYXRhKSxdCmBgYApQb2R6aWHFgiBuYSB6YmnDs3IgdWN6xIVjeSBpIHdhbGlkdWrEhWN5LgpgYGB7cn0KcGFydGl0aW9uPC1jcmVhdGVEYXRhUGFydGl0aW9uKGRhdGEkQ2xhc3MsIHA9Ljc1LCBsaXN0PUYpCmRhdGEudHJhaW48LWRhdGFbcGFydGl0aW9uLF0KZGF0YS50ZXN0PC1kYXRhWy1wYXJ0aXRpb24sXQpgYGAKIyMgU3R3b3J6ZW5pZSBtb2RlbHUgbmFpd25lZ28ga2xhc3lmaWthdG9yYSBCYXllc293c2tpZWdvCmBgYHtyfQptb2RlbDwtbmFpdmVCYXllcyhDbGFzc34uLCBkYXRhPWRhdGEudHJhaW4pCmBgYApUYWJlbGUgcHJhd2RvcG9kb2JpZcWEc3R3IHdhcnVua293eWNoIChhbmcuIF9Db25kaXRpb25hbCBQcm9iYWJpbGl0eSBUYWJsZXNfKS4KYGBge3J9CmhlYWQobW9kZWwkdGFibGVzLCAzKQpgYGAKIyMgV2FsaWRhY2phIG1vZGVsdQpNYWNpZXJ6IHBvbXnFgmVrLgpgYGB7ciB0aWR5PVRSVUV9CmRhdGEucHJlZDwtcHJlZGljdChtb2RlbCwgZGF0YS50ZXN0LCB0eXBlPSdjbGFzcycpCmNtPC10YWJsZShkYXRhLnByZWQsIGRhdGEudGVzdCRDbGFzcywgZG5uPWMoIlByZWRpY3RlZCIsIkFjdHVhbCIpKQpgYGAKYGBge3IgZWNobz1GQUxTRX0KcHJpbnQoY20pCmBgYAoqIFRyYWZub8WbxIcgKGFuZy4gX2FjY3VyYWN5Xyk6ICAgIAoqKmByIHNwcmludGYoJyUuMmYlJScsIDEwMCAqIHN1bShkaWFnKGNtKSkgLyBzdW0oY20pKWAqKgoqIFByZWN5emphIChhbmcuIF9wcmVjaXNpb25fKSwga2xhc2E9YGRlbW9jcmF0YDogICAgCioqYHIgc3ByaW50ZignJS4yZiUlJywgMTAwICogY21bJ2RlbW9jcmF0JywnZGVtb2NyYXQnXSAvIHN1bShjbVsnZGVtb2NyYXQnLF0pKWAqKgoqIFByZWN5emphIChhbmcuIF9wcmVjaXNpb25fKSwga2xhc2E9YHJlcHVibGljYW5gOiAgICAKKipgciBzcHJpbnRmKCclLjJmJSUnLCAxMDAgKiBjbVsncmVwdWJsaWNhbicsJ3JlcHVibGljYW4nXSAvIHN1bShjbVsncmVwdWJsaWNhbicsXSkpYCoqCiogQ3p1xYJvxZvEhyAoYW5nLiBfcmVjYWxsXyksIGtsYXNhPWBkZW1vY3JhdGA6ICAgIAoqKmByIHNwcmludGYoJyUuMmYlJScsIDEwMCAqIGNtWydkZW1vY3JhdCcsJ2RlbW9jcmF0J10gLyBzdW0oY21bLCdkZW1vY3JhdCddKSlgKioKKiBDenXFgm/Fm8SHIChhbmcuIF9yZWNhbGxfKSwga2xhc2E9YHJlcHVibGljYW5gOiAgICAKKipgciBzcHJpbnRmKCclLjJmJSUnLCAxMDAgKiBjbVsncmVwdWJsaWNhbicsJ3JlcHVibGljYW4nXSAvIHN1bShjbVssJ3JlcHVibGljYW4nXSkpYCoqCiogRi1taWFyYSAoYW5nLiBfRjEgc2NvcmVfKSwga2xhc2E9YGRlbW9jcmF0YDogICAgCioqYHIgc3ByaW50ZignJS4yZiUlJywgMjAwICogY21bJ2RlbW9jcmF0JywnZGVtb2NyYXQnXSAvIChjbVsxXStzdW0oY21bLTRdKSkpYCoqCiogRi1taWFyYSAoYW5nLiBfRjEgc2NvcmVfKSwga2xhc2E9YHJlcHVibGljYW5gOiAgICAKKipgciBzcHJpbnRmKCclLjJmJSUnLCAyMDAgKiBjbVsncmVwdWJsaWNhbicsJ3JlcHVibGljYW4nXSAvIChjbVs0XStzdW0oY21bLTFdKSkpYCoqCgojIEtsYXN5ZmlrYWNqYSB3aWVsb2tsYXNvd2EKIyMgWmHFgmFkb3dhbmllIGRhbnljaApEb2vFgmFkbnkgb3BpcyBkb3N0xJlwbnkgcG9kIGFkcmVzZW0gW1ZlcnRlYnJhbCBDb2x1bW4gRGF0YSBTZXRdKGh0dHA6Ly9hcmNoaXZlLmljcy51Y2kuZWR1L21sL2RhdGFzZXRzL3ZlcnRlYnJhbCtjb2x1bW4pLgpgYGB7cn0KdmVydGVicmFsPC1yZWFkLnRhYmxlKCcvdXNyL21pc3dkbS9jb2x1bW5fM0MuZGF0JykKY29sbmFtZXModmVydGVicmFsKTwtYygKICAncGVsdmljIGluY2lkZW5jZScsCiAgJ3BlbHZpYyB0aWx0JywKICAnbHVtYmFyIGxvcmRvc2lzIGFuZ2xlJywKICAnc2FjcmFsIHNsb3BlJywKICAncGVsdmljIHJhZGl1cycsCiAgJ2dyYWRlIG9mIHNwb25keWxvbGlzdGhlc2lzJywKICAnY2xhc3MnKQpgYGAKS2xhc3kgKGtvbHVtbmEgYGNsYXNzYCk6CgoqIF9fREhfXyAtIERpc2sgSGVybmlhOyA2MCBvYnNlcndhY2ppLgoqIF9fTk9fXyAtIE5vcm1hbDsgMTAwIG9ic2Vyd2FjamkuCiogX19TTF9fIC0gU3BvbmR5bG9saXN0aGVzaXM7IDE1MCBvYnNlcndhY2ppLgoKIyMgU3R3b3J6ZW5pZSBtb2RlbHUgbmFpd25lZ28ga2xhc3lmaWthdG9yYSBCYXllc293c2tpZWdvClBvZHppYcWCIG5hIHpiacOzciB0cmVudWrEhWN5IGkgd2FsaWR1asSFY3kuCmBgYHtyfQpwYXJ0aXRpb248LWNyZWF0ZURhdGFQYXJ0aXRpb24odmVydGVicmFsJGNsYXNzLCBwPS43NSwgbGlzdD1GQUxTRSkKdmVydGVicmFsLnRyYWluPC12ZXJ0ZWJyYWxbcGFydGl0aW9uLF0KdmVydGVicmFsLnRlc3Q8LXZlcnRlYnJhbFstcGFydGl0aW9uLF0KYGBgCld5dHJlbm93YW5pZSBtb2RlbHUuCmBgYHtyfQptb2RlbDwtbmFpdmVCYXllcyh2ZXJ0ZWJyYWwudHJhaW5bLC03XSwgdmVydGVicmFsLnRyYWluJGNsYXNzKQpgYGAKQWx0ZXJuYXR5d25pZS4KYGBge3IgZXZhbD1GQUxTRX0KbW9kZWw8LW5haXZlQmF5ZXMoY2xhc3N+LiwgZGF0YT12ZXJ0ZWJyYWwudHJhaW4pCmBgYApgYGB7ciBlY2hvPUZBTFNFLCB0aWR5PVRSVUV9CmhlYWQobW9kZWwkdGFibGVzLCAzKQpgYGAKIyMgV2FsaWRhY2phIG1vZGVsdQojIyMgTWFjaWVyeiBwb215xYJlawpgYGB7cn0KdmVydGVicmFsLnByZWQ8LXByZWRpY3QobW9kZWwsIHZlcnRlYnJhbC50ZXN0LCB0eXBlPSdjbGFzcycpCnR0PC10YWJsZShQcmVkaWN0ZWQ9dmVydGVicmFsLnByZWQsIEFjdHVhbD12ZXJ0ZWJyYWwudGVzdCRjbGFzcykKYGBgCmBgYHtyIGVjaG89RkFMU0V9CnByaW50KHR0KQpgYGAKIyMjIFdzcMOzxYJjenlubmlraSBrbGFzeWZpa2FjamkKT2JsaWN6ZW5pYSBwb21vY25pY3plLgpgYGB7cn0KZGlhZzwtZGlhZyh0dCkKcm93c3VtczwtYXBwbHkodHQsIDEsIHN1bSkKY29sc3VtczwtYXBwbHkodHQsIDIsIHN1bSkKYGBgCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnByZWNpc2lvbiA9IGRpYWcgLyByb3dzdW1zCnJlY2FsbCA9IGRpYWcgLyBjb2xzdW1zCmYxID0gMiAqIHByZWNpc2lvbiAqIHJlY2FsbCAvIChwcmVjaXNpb24gKyByZWNhbGwpCmBgYAoqIFRyYWZub8WbxIcgKGFuZy4gX2FjY3VyYWN5Xyk6ICAgIAoqKmByIHNwcmludGYoJyUuMmYlJScsIDEwMCAqIHN1bShkaWFnKSAvIHN1bSh0dCkpYCoqCiogxZpyZWRuaWEgcHJlY3l6amEgKGFuZy4gX21lYW4gcHJlY2lzaW9uXyk6ICAgIAoqKmByIHNwcmludGYoJyUuMmYlJScsIDEwMCAqIG1lYW4ocHJlY2lzaW9uKSlgKioKKiDFmnJlZG5pYSBjenXFgm/Fm8SHIChhbmcuIF9tZWFuIHJlY2FsbF8pOiAgICAKKipgciBzcHJpbnRmKCclLjJmJSUnLCAxMDAgKiBtZWFuKHJlY2FsbCkpYCoqCiogxZpyZWRuaWEgRi1taWFyYSAoYW5nLiBfbWVhbiBGMSBzY29yZV8pOiAgICAKKipgciBzcHJpbnRmKCclLjJmJSUnLCAxMDAgKiBtZWFuKGYxKSlgKio=