From 6a68a329c28849e136098481a416934060f1217b Mon Sep 17 00:00:00 2001 From: florian Date: Thu, 5 Sep 2019 23:23:40 +0200 Subject: [PATCH] Add login component. --- src/main/ts/.editorconfig | 2 +- src/main/ts/package.json | 2 +- src/main/ts/proxy.conf.json | 6 ++ src/main/ts/src/app/app-routing.module.ts | 7 ++- src/main/ts/src/app/app.module.ts | 23 ++++++- src/main/ts/src/app/core/entities.ts | 46 ++++++++++++++ .../service-unavailable.interceptor.ts | 25 ++++++++ .../app/core/services/user.service.spec.ts | 16 +++++ .../ts/src/app/core/services/user.service.ts | 21 +++++++ .../ts/src/app/header/header.component.html | 3 +- .../ts/src/app/header/header.component.ts | 4 +- .../ts/src/app/login/login.component.html | 59 ++++++++++++++++++ .../ts/src/app/login/login.component.scss | 59 ++++++++++++++++++ .../ts/src/app/login/login.component.spec.ts | 28 +++++++++ src/main/ts/src/app/login/login.component.ts | 41 ++++++++++++ .../service-unavailable.component.html | 18 ++++++ .../service-unavailable.component.scss | 4 ++ .../service-unavailable.component.spec.ts | 28 +++++++++ .../service-unavailable.component.ts | 10 +++ src/main/ts/src/assets/images/icon-128.png | Bin 0 -> 10732 bytes src/main/ts/src/assets/images/icon-64.png | Bin 0 -> 7118 bytes .../src/assets/images/service-unavailable.jpg | Bin 0 -> 27764 bytes 22 files changed, 394 insertions(+), 8 deletions(-) create mode 100644 src/main/ts/proxy.conf.json create mode 100644 src/main/ts/src/app/core/entities.ts create mode 100644 src/main/ts/src/app/core/interceptors/service-unavailable.interceptor.ts create mode 100644 src/main/ts/src/app/core/services/user.service.spec.ts create mode 100644 src/main/ts/src/app/core/services/user.service.ts create mode 100644 src/main/ts/src/app/login/login.component.html create mode 100644 src/main/ts/src/app/login/login.component.scss create mode 100644 src/main/ts/src/app/login/login.component.spec.ts create mode 100644 src/main/ts/src/app/login/login.component.ts create mode 100644 src/main/ts/src/app/service-unavailable/service-unavailable.component.html create mode 100644 src/main/ts/src/app/service-unavailable/service-unavailable.component.scss create mode 100644 src/main/ts/src/app/service-unavailable/service-unavailable.component.spec.ts create mode 100644 src/main/ts/src/app/service-unavailable/service-unavailable.component.ts create mode 100644 src/main/ts/src/assets/images/icon-128.png create mode 100644 src/main/ts/src/assets/images/icon-64.png create mode 100644 src/main/ts/src/assets/images/service-unavailable.jpg diff --git a/src/main/ts/.editorconfig b/src/main/ts/.editorconfig index 4389119..e89330a 100644 --- a/src/main/ts/.editorconfig +++ b/src/main/ts/.editorconfig @@ -3,7 +3,7 @@ root = true [*] charset = utf-8 -indent_style = tab +indent_style = space indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true diff --git a/src/main/ts/package.json b/src/main/ts/package.json index 81de99e..6905e4e 100644 --- a/src/main/ts/package.json +++ b/src/main/ts/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng serve", + "start": "ng serve --proxy-config proxy.conf.json", "build": "ng build", "test": "ng test", "lint": "ng lint", diff --git a/src/main/ts/proxy.conf.json b/src/main/ts/proxy.conf.json new file mode 100644 index 0000000..7d4976b --- /dev/null +++ b/src/main/ts/proxy.conf.json @@ -0,0 +1,6 @@ +{ + "/api": { + "target": "http://localhost:8080", + "secure": false + } +} diff --git a/src/main/ts/src/app/app-routing.module.ts b/src/main/ts/src/app/app-routing.module.ts index d425c6f..f49aa1a 100644 --- a/src/main/ts/src/app/app-routing.module.ts +++ b/src/main/ts/src/app/app-routing.module.ts @@ -1,7 +1,12 @@ +import { AppComponent } from './app.component'; +import { ServiceUnavailableComponent } from './service-unavailable/service-unavailable.component'; import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; -const routes: Routes = []; +const routes: Routes = [ + { path: 'serviceUnavailable', component: ServiceUnavailableComponent }, + { path: '', component: AppComponent } +]; @NgModule({ imports: [RouterModule.forRoot(routes)], diff --git a/src/main/ts/src/app/app.module.ts b/src/main/ts/src/app/app.module.ts index 74af512..d2dd112 100644 --- a/src/main/ts/src/app/app.module.ts +++ b/src/main/ts/src/app/app.module.ts @@ -1,6 +1,10 @@ +import { ServiceUnavailableInterceptor } from './core/interceptors/service-unavailable.interceptor'; +import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { UserService } from './core/services/user.service'; import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; @@ -9,21 +13,34 @@ import { HeaderComponent } from './header/header.component'; import { FooterComponent } from './footer/footer.component'; import { NotificationElement } from './core/notifications/notification-element/notification-element.component'; import { NotificationsComponent } from './core/notifications/notifications.component'; +import { LoginComponent } from './login/login.component'; +import { ServiceUnavailableComponent } from './service-unavailable/service-unavailable.component'; @NgModule({ declarations: [ AppComponent, FooterComponent, HeaderComponent, + LoginComponent, NotificationElement, - NotificationsComponent + NotificationsComponent, + ServiceUnavailableComponent ], imports: [ - BrowserModule, AppRoutingModule, + BrowserModule, + FormsModule, + HttpClientModule, MDBBootstrapModule.forRoot() ], - providers: [], + providers: [ + UserService, + { + provide: HTTP_INTERCEPTORS, + useClass: ServiceUnavailableInterceptor, + multi: true + } + ], bootstrap: [ AppComponent ] diff --git a/src/main/ts/src/app/core/entities.ts b/src/main/ts/src/app/core/entities.ts new file mode 100644 index 0000000..9712033 --- /dev/null +++ b/src/main/ts/src/app/core/entities.ts @@ -0,0 +1,46 @@ +export class User { + constructor( + public id: string, + public name: string, + public email: string + ) {} + + public static new(): User { + return new User('', '', ''); + } +} + +export class SignUpDTO { + constructor( + public name: string, + public email: string, + public password: string, + public confirmPassword: string + ) {} + + public static new(): SignUpDTO { + return new SignUpDTO('', '', '', ''); + } +} + +export class ConfigurationFile { + constructor( + public id: string + ) {} + + public static new(): ConfigurationFile { + return new ConfigurationFile(''); + } +} + +export class Application { + constructor( + public id: string, + public name: string, + public configurationFileList: Array + ) {} + + public static new(): Application { + return new Application('', '', []); + } +} diff --git a/src/main/ts/src/app/core/interceptors/service-unavailable.interceptor.ts b/src/main/ts/src/app/core/interceptors/service-unavailable.interceptor.ts new file mode 100644 index 0000000..4e23192 --- /dev/null +++ b/src/main/ts/src/app/core/interceptors/service-unavailable.interceptor.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpEvent, HttpHandler, HttpRequest } from '@angular/common/http'; +import { Observable, throwError } from 'rxjs'; +import { Router } from '@angular/router'; +import { catchError } from 'rxjs/operators'; +import { NotificationsComponent } from '../notifications/notifications.component'; + +@Injectable({providedIn: 'root'}) +export class ServiceUnavailableInterceptor implements HttpInterceptor { + + constructor( + private router: Router + ) {} + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + return next.handle(req).pipe(catchError(ex => { + if (!!ex && ex.status === 504) { + NotificationsComponent.error('Le serveur est actuellement indisponible. Veuillez contacter l\'administrateur.'); + this.router.navigate(['/serviceUnavailable']); + } + + return throwError(ex); + })); + } +} diff --git a/src/main/ts/src/app/core/services/user.service.spec.ts b/src/main/ts/src/app/core/services/user.service.spec.ts new file mode 100644 index 0000000..79eb548 --- /dev/null +++ b/src/main/ts/src/app/core/services/user.service.spec.ts @@ -0,0 +1,16 @@ +/* tslint:disable:no-unused-variable */ + +import { TestBed, async, inject } from '@angular/core/testing'; +import { UserService } from './user.service'; + +describe('Service: User', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [UserService] + }); + }); + + it('should ...', inject([UserService], (service: UserService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/main/ts/src/app/core/services/user.service.ts b/src/main/ts/src/app/core/services/user.service.ts new file mode 100644 index 0000000..8afa7f1 --- /dev/null +++ b/src/main/ts/src/app/core/services/user.service.ts @@ -0,0 +1,21 @@ +import { Observable } from 'rxjs'; +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { User } from '../entities'; + +@Injectable({ + providedIn: 'root' +}) +export class UserService { + constructor( + private httpClient: HttpClient + ) {} + + login(user: User): Observable { + return this.httpClient.post(`/api/users/login`, user); + } + + disconnection(): Observable { + return this.httpClient.get(`/api/users/disconnection`); + } +} diff --git a/src/main/ts/src/app/header/header.component.html b/src/main/ts/src/app/header/header.component.html index a43c536..7b880c5 100644 --- a/src/main/ts/src/app/header/header.component.html +++ b/src/main/ts/src/app/header/header.component.html @@ -11,9 +11,10 @@ - + diff --git a/src/main/ts/src/app/header/header.component.ts b/src/main/ts/src/app/header/header.component.ts index d0d0ebc..620e720 100644 --- a/src/main/ts/src/app/header/header.component.ts +++ b/src/main/ts/src/app/header/header.component.ts @@ -1,5 +1,6 @@ import { NotificationsComponent } from './../core/notifications/notifications.component'; -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { LoginComponent } from '../login/login.component'; @Component({ selector: 'app-header', @@ -7,6 +8,7 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./header.component.scss'] }) export class HeaderComponent implements OnInit { + @ViewChild('loginForm', {static: true}) loginForm: LoginComponent; constructor() { } diff --git a/src/main/ts/src/app/login/login.component.html b/src/main/ts/src/app/login/login.component.html new file mode 100644 index 0000000..4e0610e --- /dev/null +++ b/src/main/ts/src/app/login/login.component.html @@ -0,0 +1,59 @@ + diff --git a/src/main/ts/src/app/login/login.component.scss b/src/main/ts/src/app/login/login.component.scss new file mode 100644 index 0000000..be3aabd --- /dev/null +++ b/src/main/ts/src/app/login/login.component.scss @@ -0,0 +1,59 @@ +// #form { +// width: 300px; +// margin: auto; +// margin-top: 50px; +// } + +// #logo { +// text-align: center; +// margin-bottom: 15px; +// } + +// #title { +// text-align: center; +// font-size: 1.5em; +// } + +// #buttons-area { +// button { +// width: 90%; +// margin: auto; +// } + +// a { +// margin: auto; +// margin-bottom: 20px; +// } +// } +// #signup { +// text-align: center; +// margin-top: 35px; +// } + +.modal-dialog { + margin-top: 50px; + width: 300px; + + .modal-content { + .modal-header { + img { + position: absolute; + top: -25px; + left: 0; + right: 0; + margin-left: auto; + margin-right: auto; + width: 64px; + } + .modal-title { + margin-top: 30px; + text-align: center; + font-weight: bolder; + } + } + + .modal-footer { + padding: 10px; + } + } +} diff --git a/src/main/ts/src/app/login/login.component.spec.ts b/src/main/ts/src/app/login/login.component.spec.ts new file mode 100644 index 0000000..556444c --- /dev/null +++ b/src/main/ts/src/app/login/login.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoginComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/main/ts/src/app/login/login.component.ts b/src/main/ts/src/app/login/login.component.ts new file mode 100644 index 0000000..f3d865c --- /dev/null +++ b/src/main/ts/src/app/login/login.component.ts @@ -0,0 +1,41 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { User } from './../core/entities'; +import { ModalDirective } from 'angular-bootstrap-md'; +import { UserService } from '../core/services/user.service'; +import { NotificationsComponent } from '../core/notifications/notifications.component'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) +export class LoginComponent implements OnInit { + model: User = User.new(); + @ViewChild('loginModal', {static: true}) loginModal: ModalDirective; + + constructor( + private userService: UserService + ) {} + + ngOnInit() { + + } + + onSubmit(): void { + this.userService.login(this.model).subscribe(() => { + NotificationsComponent.success('Connexion réussie.'); + this.loginModal.hide(); + }, ex => { + console.error('Error during login attempt: ', ex); + if (ex.error.status === 400) { + NotificationsComponent.error(`Login ou mot de passe incorrect.`); + } else { + NotificationsComponent.error(`Une erreur technique est survenue :\n${ex.error.message}`); + } + }); + } + + show(): void { + this.loginModal.show(); + } +} diff --git a/src/main/ts/src/app/service-unavailable/service-unavailable.component.html b/src/main/ts/src/app/service-unavailable/service-unavailable.component.html new file mode 100644 index 0000000..44277cf --- /dev/null +++ b/src/main/ts/src/app/service-unavailable/service-unavailable.component.html @@ -0,0 +1,18 @@ +
+ + + + + + + +

Service indisponible

+
+ + + Le serveur est actuellement indisponible.
+ Veuillez contacter l'administrateur. +
+
+
+
diff --git a/src/main/ts/src/app/service-unavailable/service-unavailable.component.scss b/src/main/ts/src/app/service-unavailable/service-unavailable.component.scss new file mode 100644 index 0000000..8bfdb4e --- /dev/null +++ b/src/main/ts/src/app/service-unavailable/service-unavailable.component.scss @@ -0,0 +1,4 @@ +#content { + width: 450px; + margin: auto; +} diff --git a/src/main/ts/src/app/service-unavailable/service-unavailable.component.spec.ts b/src/main/ts/src/app/service-unavailable/service-unavailable.component.spec.ts new file mode 100644 index 0000000..af01ef0 --- /dev/null +++ b/src/main/ts/src/app/service-unavailable/service-unavailable.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { ServiceUnavailableComponent } from './service-unavailable.component'; + +describe('ServiceUnavailableComponent', () => { + let component: ServiceUnavailableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ServiceUnavailableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ServiceUnavailableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/main/ts/src/app/service-unavailable/service-unavailable.component.ts b/src/main/ts/src/app/service-unavailable/service-unavailable.component.ts new file mode 100644 index 0000000..ee0efba --- /dev/null +++ b/src/main/ts/src/app/service-unavailable/service-unavailable.component.ts @@ -0,0 +1,10 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-service-unavailable', + templateUrl: './service-unavailable.component.html', + styleUrls: ['./service-unavailable.component.scss'] +}) +export class ServiceUnavailableComponent { + constructor() {} +} diff --git a/src/main/ts/src/assets/images/icon-128.png b/src/main/ts/src/assets/images/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..97ef7f927755bcb3a284f6506286286b22653989 GIT binary patch literal 10732 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 eB|6{?=Kljc-t^gm)I6#H0000 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 Ef-GM1UjP6A literal 0 HcmV?d00001 diff --git a/src/main/ts/src/assets/images/service-unavailable.jpg b/src/main/ts/src/assets/images/service-unavailable.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d58efad1c82c97a97fcb5ee2da7b0c31dc6b6034 GIT binary patch literal 27764 zcmd?R1z23kwkX_q<23HtxVyW%ySo!C2@nYG?i!rn?hz6+xI=;@!7V_5Ai@78GnvWg znRC8#@B6>^s;X;*gHuto)B7bP_ zX-6(AudH^v0FVU0Ktta-h=GMTI3OGxEG!%n0s=e`1qlTO83`E~6%7*u6%B-jjEsSc z0m8z@!NEa6$HT|P#>d3Q!M=+G3I-wr3x@~?hlq`ejEenlo7*k`2ndx51Au`70iZ!p zFd(Sg9sn@_3IITW{C+i1&@gcD2tZf}l?YNc05r^xWGHBOND&Zj=K&}XJTwLj1^@sx z(t;iv@M{eJ3W8NK4W9k7I`~IExKHT?_t&<67Z)(6sP;N8>pK>jwmCjD;kz(=-@c<@ z?ew_Vcf`-nb!Puv&*|?-5DSxYRlxTU537g%``o8N-@`vY5$GLn0hUjjv1Z(UM*%=F zb?``9oN+&y+p#169nn4Q)v17^KFh=3;Q;_l+|2%ekyg^C>+i*&DC~2B|DR54r#)2- zYLFLE%PF~lM)&^gz{nXHIl~j^=O)(dl~cJcB4!Ys{bMyDH0^KaF)fM_R+C$o+A5v9 ztVWc|4OhQmG?JBUn8W-6*Ckm><5lQ^+Vk(k3a@hi#aM(303hIQO)>ly!%wDB+6=xl@0K7Qy#&^|i76{1L;ZKFha3P0qA|flT5#hC0?T=}S-%0*pU{acI0rgV`10HR6 zSf2S4sUfAOAe-@YRukGbueeW{M^Cx|fL;5v+(u>cHj*OF_B7blPq9^Z+;RrC$!iD_Dk&5CQ!z+T!?w6az*sQNb{G%U9cnI_naZX>oZUzG z=~1TbP_HhM8HD$rcL5V9Tfoi(y?Kw72Pi|@bHxc#pXu|c7TGjz(x?-#NX|J|9mBBi zQvavj1OCXkm1ET~B)o2KAdhSDzQaAZMUKPRK1o|v_2D*^Wx4&iJPxD#4k-D1+XG!^ zab5pTb>fVRLuO$-pFVK z;^@Zbl?^ooWoZ%0e;BM$m^_aZv(xlAfShjg3_K!QM(g{GY4fyT*Th{^MHzQSP6r`$riF{QqoPnT%jy0<0W} z9GE~U1|pXVpcIP)NCjd7BB8-hn6Prt-^k2xe?MTV{Z5^b;9pGKl6n*!7ln$n9$DL1+Y$q9@c&d_=W~B7*YNN{K3zw-PJg} zx$B02yyS9pk3UKEM;VxjsX5!Dv%A3p_D%A~bJ*4&segn~f=A!8zDNBwSFpWuT>oHl zkMECMKVV?!j~<8K-`TxGK}BAC6l^(t@%s_&2X+7ehvspI$kw25UV%^B%WstWhbKg; z9)_v$@##gsVf`ThtsxcEpFl1b1gq=zHBaZv?d)e_m*7Ph+?Kr?4eSsmxMzq%rTz!0 zpFz0x_^{PYdiDTFSQzV@?jV_EB;>uL(;9r*N!u7~xFi0?K!Xu6H6RAI92ypgK^_Ev z1^|Eoz#!`g8cL~53nhqY4El}4e?0(Ay;)wTf4J)tPxuH|bJS-H^O253kWYF~?#xpS zVcM8eQp)zN%_Cpp4|V_m+*t7Jsq2LroZuVVy-y8`VtbZlFq|d z*OLOAM;+D!%B0z|FLxJvm~{^~WUn^gn4zFcWVU$AsdG z98^U1liT*r(+V1$YHF1-a=J4D000;J+{`u?9Utegacf6Kw}(ckar-%0uULdjI7grR zd?4H23IGo6uI^v9y+l0R6$?S;^)O0W`ned8Hyln#if}N{aIjFY&`@yS@X(O=8z^{e z5EcRkE~gqM8wWQI9yx^>yBH58H4Se7QTuFuSe-MqYz>~}xt=WF_<{X(*0DKFud2`8%`*`ybyC&6mJ6-iUn{4-m z{$)Vu2@z@V|CkNvw^z{-o%3ougBBhm_77+LmS`a9W}IkuYW%4Q)Aj3kk2hq?gWoc@ zB-_3kf3R+OogOXfO0{_S=Bs=C%}{S%8))Ba^@?Bb7GS+Hwg@~Eo^G=QX}waS2;UB2 zyJia`dy3KZYBROks=Y0kh!7`ItA$dV=_86kRrb@0dba_t(S`&ewi3AylVQ%%dwdV! za+ZB$sKR!d3>SaM#iCW(<(p3{Y^7KI6%jHFhW+w_6^Myx^9@(|=Dr@x$Btu1hFq*cUzTRz_(<;57 zF*$dJ{;N*Tn82+y&#zUb%aOZvk6=rY@V6gJ-##A_Em z&wiuEpf=)#8tQuk@(+y4jTvo*30+{KlMZLxTQ$WQNE0LL}=p6%xn+Uo2)s_=k=Lk zcBP1+gmFk=TC(xVSNY&G$2N&59g0E1Vwq2=j>1g0-~=Is=cVnhZRk-BVapkOH=+uiJa)M`3cR|a@3$IeV)Xig`Gv#2yN|9QO--yHSBLbb zH6<#2-KCS+RbF#4NOKZ9HS=`rhl(K-)Q--!*mHDi&1zhwRaU`~^;xcN`-=HNw?SBBk)&a^Wd6g7Grx7;7~RLv`f|D`W{NpeyoYM6gM-g6ye%@T8hKxEM7rBtF~uki zTh2>zzx-S%r1+zH-%|`HzB@#+Pju{+7Y5&pjO4iKndYE1@6k__){N44%GBIV!D~84 z#CA%)H4H&JvvGs zX~xj4DUt>Gk-@^D&dQ{-b@fbPb}dFz^%HuhYT{AH8|=wxZ5Z%@)qqt`Q6q9X=QulU4ng{X`Qcb()hw9M@zwnW?Ed&Arrf znDW8V5UrM%H>1HZ5yL0*S{wq*zO8rFr8>fznirpmx_A=6xly-(d7iT?za~ZagnO=^ z%$4>%Nt$=I%c})gz6h~f*C5J_S%`Z7s;As;!Fqf~ywUCHarUgPeCY}r`ugUi z=X!4&jw+Q!?=w~Qud&i%-=k;SG5&1GlJ9%&O>509=kQ^Wk7@Wz`HYcb)doGiwtA%V zgPLS|$JoUwz2~uulDMooaSt5ldU5Z$@i_~PTH7eCy4-)qp74xhK(_gLF1I`DK%5m?CWdwG#`r;Jxo|Hmv+mBZ9e6U7+q-MrwLxX?cB zz)ct{Q>0$@?*h0Sw3TCc8ra=-!T-_*lqDM%pUf#aJ>}6PqK{4K8?>}$Z^-xw0Vgf| zAcE%~Sb7D#v8ng8Ll;T%nF{7iY-#w4DAZw?-H7HPbzOSj5rO*Ek~&$s7cs`7@%KlB zSwzd;Xv*B|hH`ma^M!DvcDk||!B>xF`!&Y?g^h%dD)Yqy48LU-E%4dmmE%n&ppPjI zGmvCw&&n84!dX_aaoU<7VG!mf)Up#zyozNIO)QZ;;wrn5NhQ>>SI?g;QixZU?g~^> z=FlWSj9o$PioJj2UfD{ud^Opz$ z&D`Ag+;AUY2M{lgk4%DM3sFP*I4p4}A`-fl%xTyn*yJEqfsO8)g$KOGhXI(OKn1Yf zf!IG=YJ4!n%Ey5F2rWSrQ3-GE>Z4zntMnGKipQ=Ww9ZJFRz_;=HzT15rfOk)7?o)Q zX4eqgYrsdKCm*binp-K=PO@c?BWaNYtb_H#j-B?jv27CjlaLBJdidnwQ~J$7m9j{D zR+Xmq_?yU+bvr4Ksl~shLan4SGb*HYm^X5hXdBtlc%*xmOcq9tlc!oIiGO;qUl+9= zP2j^u6_J83M$h_^h#&g{4uZROUSi^WW2yPLjD?B#$EDt8!dd&>oKzi!4;IO5U@N5a zHF=<%PgyL=9tYu~v`(*v3QOz|y6-AYvAc@~KT75+Pfh{){@xSKoMhvkt9nIE?P9si zJQ?otN?MlfVUG?0nCV-F?Jh3b4kqjKAXte^f| zKJr{{PU;>%82h;eD3Swx+Ntqewx(L8Iu+M>ctgJ@#OINJQ#_s$uK9qp4NkQ`Q~p&$ z@X;U)(e%9&QOH_d5CnOvg+@Stfrdf&X{io?f(F5Az`$W(;;0p1k+XBDyLD2qiBV37 zn+3viXqqS1A7Fze0}j8f*mFr^8T*Sc=)~=I&Dj%M6vH z5b_wynN2k8NW#aaYv6M^J%g+i{;y!dLR1D?X${y8A%_q8r0T0V;C(Domq zeHA=}99l!n=epb-j`lAf3*V*9H?$$!Ah|c_Of0yh*8dUqau}b@Y@rID=My{%(bC(i zhDTq8>e}=kUxuTR-QRV6kRT{W_PX}m>g>SV+_mm{^&|PC&uymguhx@4cCLqZb)UsR z#6!?s13zPk2L6(R%M#0Q^ftp{bhi$Y@5KxMEV2w!*D6Q)C7AVB&MQg;bC~ngUy4EY zOzcdh3&Gwu>lTov>W`3yhm8KgwX=$I(X}%i^-X=Sp6vnSjlS>|sh$y&s9$&Z2iMDe zvSr=x8TU^8CB4i)Lmotv|5BPS48Nwq@!!KX2g9R4l-l_(AC8Vc7lc#c=ZvT`bCpr& zFE*;qBT4N-CZXCi%$PRhogLQ7vW}XcHj<$n1Y<}q9%^u!+3qa{LmGZ7=H$C z>t4A9gqbZ-M&EGWtNcRx$=kr~d z_K7$3aA*&k@j$KEAkrS@smyTJWt*=tZ#L@w*JxA+U92-d*&3(LUSu@Tz$n_*8SyrwUu2$)il1U$_N zgHh&3f&LxY-j*Uj^S5MFh%^#Jn(HTN9NnqTi%GmvQwP$@sE8AAy}#&TAC&4ZQPDHd zr6d>kcO}^gR;=c9iD}A^jhj62heFUD?@TV8G4>yYy5TKI#*Z!6cvV9*e({(rzqrsC zDHc2A%_|LYYX5!RudbKZt(6hjQ|crF{@wy@JNX3-az5ZfS@-(W05ut@q z%JUkaRB0~W>G*QN8UDmhs*{_`J}Ij{`m$54sG=?Btj_LRKt-uCa$|&^0KQZ+!Q)r4 z@%DORBcaP)CV1bx;9$H!1Xvf8cP0p1tomM{wkn5bI0af;7fO+kM!rqtlOW}(OtwFX zFZ~cVjz;#vFT?T>GwqdIe2;>`b)P7R-ti3oN~)xGk=a(R(V#7_7c%WIfB=v`-=P6; zu)q8f4h2$&>=I#fm|>Dru(4xciK$U?ivP4T1bsKl><>K-(ebcY%*I`N*Gkjd&ci%V z@1h*-?qrz!zm25EqpyuO>)m|E?tO}4;unmU_dgrB=#|kiowq3bn(A-R&w&z5{s#}| zLZfp3-AxYxym*4uAHC#!Q=OKMy=I50@^!bfMANtB)~pq@FYQf2cJvueF5eBFUiehd z4xHH~?@v(A9O_hlwwz5VEX;clDYA|=hFqJSM z>mL|sL?9d@Jfv|#HZLJT04xZT9S#GFf`ij7F^N)KP2Jq1pc9)-BXF6VNJojcm--`qMx4AHc zUtU|9c%e9sLH+-Z)D`o*W%mOMRS{m(EkN6D@=4x|=zH&DiL)*ogd8HcOKg4VjOMQ|uTKgR4jH{#8 z`9?j85kXP&IYud)Ma=WX5vCc0ryql;z~k8XKF|FLXGT!kmsRB-2B%hMGvMf zWT_C?o8_B)EuuRcZUO7kqI8-W%w6Fk1yfp2!f=O1%I{%kJHj zu06XmzKlidgklpfz9tqT>Szmtz55%zV39$8?=&23kt7lP_g!&MD{7RpzTD4{Zy?Qj zsPo=e)e47SWCx*cqAm}JU*a=Xm73_Qf-`|Tm5U*&JOrx zLsm)hk*`^eQ|_sSJm;#XoNEVbKWZ-$+8q#Gzb3Cx@Z_sCUz_R?PtUeidd43wGVH}K z>}>ckZxlPe!k+%imvemnUehF)2X^<3MtMTdy?ql>f=Y-2UUVlnM%Hs|HKdJ=tKM@$ zA)K$cJZ90{Dq8)qW=i~Zy5b`+ILZ~0g72jc%L>s~k&cy=*$kFVknXpYr>9a?48GD+ zYV1GeFR=@9NZn;Ce;A7M$Yn|ZMVRTJ;gdo`m7d@&ATEB8_O$f6XieTf`?`;M%&6`b z;9fsiB2lhc21` zSWxLzc_1se$uW^mz~~M`EpGYO^SkMQ6n=;En7$ zmcJc^={6aqWHaQCiLx%N-JxQy9J62v&LFC<=e2!W&@oi(*_nz>LgtuyQq<_R9Hc5{ zMblFB&4A31P5X~lHwnc|`Uc9t9g(^pnu9@!g2Hn)tcEOan(^;{|+sLx^s#jkn zvh8%ti&C8KpNcC4Duh{}^MKh|=I*a&QBzW{_1!0TpP8-kV$Pqz92oG=&btLXViygb zwIf?^Jqx`dOJRQ6Yh!rc*K#7Rkff1sC%(}W8CrBEZ|N+xSmFW9$adeDQWF?s3vFxE zu1cjlT}jE3of510;E(^no}Na-S|{itb(Fo8WnM+4`M&Rf(jz*tMM`%&yS8QeIoE@e za2wvAM!^W5*{As0;fC798Q2u%ulb#@Rs?zs{j$;h9AySO*fn{%G-tGK5~PZ7b?&+8 zPx~FLRb_Q2Z}K=T*Gw(ICTn;kxlzofsI8zDmwDhT$fJ&deOE;+8#rotp5|T5DkCo7 zK6z|@d2u1NZY=stt)?~Lqg#(u zb{O^SYN&gzOzx_PnrV_cQ^iAdxa;6Cs<8q86JI~p22oRk2bTWNzHIe6^M%(SOGM%3 zEX#9ILMv`(%3T~!e~w=+k!?4v!e(&<&s{Jflk#4rR3p(Dc!Yw-BM>!XN5FpW9-l!{ z^$fvptxc;QpK+984Zj;s+&||j-Y~MP0&j?H6;3goIV8xgSwz}sH@>yHslQyDoQ5Fi;a& z!%!nBmJ%yd(5=A1Szh8;3qtNm$DU7`Z_?4sxG4Iy6{(=80L3hfH(=sM3ZSGNg>9g1 z4Vpt1OeyV~0_{l@g8A0EF*#BjNHevWN&D?*nA;<5?|YyylxuN(`O=V-wBM4B`DrMh z`$Ev1Pl|6L22YV@WLvnNUkEpZlUb}%w=CBjpWXwDVu0Haaw1V071cbQmbUo7Jr_6I z!P--u#4mBHwrCTT>D?$U>U0R#DMn)26TK0J)fX=l)?RcW-{Y|>&PagOGT^X~y%)#r6GZogJ zt#wijByJ^~>=l{LI@xNU!mY^)+&VlLEfkFA9@y9;8W^}78V1J8;wwl_z1nuqsW@>C z8Ipen-fXw84BA0i?GklBiq%e1R)q|i4&IskTtw98p=!EilA077w$#Kt8duLM7^f|v zV3}JC?lF{-`RS+yI$-fdhS3%eG^V9%OQ@>H&)ot#&Nfk%MpP7*W%;`P2&5H z?+0XEGoCNIb7(XM7JhXVWD}RuHRVIbQzyT9n;3)}iq!sj0+i}m@A5eVsjbZPuE)t~+6^SqCjl4M zAJX~3#UWZe4Ik8X?)TY~^n2S#{UYo=$R4b-FH)mz2D1JPq{L%5uzUYi|`m#X0l!IauC~=(v zejG$?kbVz1Jd79sQ(+*+(CkNP`SQ{AQ&9)O;>R}Bn+HWx3{qXw1nFs|y!{8q@FPj+azZnIi!#DlZLbq*?s0E!kRd2y z7(k*<3vMc+W_0Mp%gWje%gRnp>7q`QS1^QqOv|G`doJrlp$SLtTrV@{qz)trqGt06g5em{ zND>=$e2axI1iNP9%2za|j;g4nprBfkGs0l~TpF7CU1psm1A{^my+2QXcB;jwip5dE z6aI2_RHdO>nlCox>}eJ<3OW|eh9lh4j5p?b`gBgi^a|QZs5vW%!b~Cgg>Dp#357}{%lnIm&^>u$v-Wnw`K1pr2DN{=Jx7k!t`u=$;tILZ@C>O zGAGfWabf+3jxkyK@m8z>pOnKyH(`@t2bx83qzAWWYVBEJ9696_jn@9xc#np~5m z&YxQ|-?<>srZhi~Z2zW~Jflbcjavy?J|Pae&$t=i1L0sv67wy^`T}EN2;sRgFFPRkkh$)q?lSCJq+`<#Ni?+?5xT9BMExs1% zb_J=VZZ-h)NPGk~esR(7b zid4I}uBiUrQ{Woinq>DWJdqXh=zZgB_q8v^4meI!B;^tvehUy|W{8bGR}=5jXeM(J zrkb)o!f8xt&U&eSHL4p2Z9{84r;gK5VjGi z^_wsJCVX;_?}sUbifPmaEMQIUw>^&1&c#kOr&lZ9pqv?R4;dXw!>}u5wgKJ63QEs0 zue2y{s_cQE%S(6bcGsxdzz$s|uqx+|V0eamVQW1-$d!hZ$qr$TB4Sk;YE8kB)-I+x z&#A?R4jfFKykR>dwrQIerq`~`znGb{3N6^~)9OQ_REM)S~JV#U`&FfGa?SY3j;tfQDP&V}GtS_D?q))XW^`_t08!Py6UoF!s22F60iR8^< z?Biq~(@YF1DrBs)b&)T7!+ z+fp>?qzXo+g975KgD*+R+xNp!3#>1B9w&v*rdT z&?GnQcVFbqGB+)RS0lU9)AkW@Dp{FO2{7vnEZ~sw#nm4r=85=^5xh~cqpB>?h?=aI zLb;jfAWF8@=UH@_jPi{0(Woz4MeK4WuKLuZV5Bw^ynA}usS&E>k)(XEkNI#DnVY#u z#^EHl&E5RQu<}Kh{zFcAI0w?VR!Uq2U)*;FC@7a;?I0ceSBIKw(u}CuQJAYxLLtg($TvdF1U6-+4 z+M@EH{3t~X)8b&s6S?(*=jpkLSB{HnYgHq}bkcR7h0i43t5V40jJTZ}rE3WvJ`p#R z(ix=N(GWL& z1xOwgkYywh4A9@_%RtYYCxU8>^kO5077@|{4O5(V_RqJ+dul$cQW9Tb7r|ba0|cMa zBiJ-gF{-1jDZLwB5_+c=z4g_??&t;!9LS_{?|TXjaF^o1y$7hop_uUgSjr^Gkv(ri zkO?C;a}ZM0q!Un}NW0IZC;8o|1ZnHeQIOzhCIA zfExx1!qVFBVS|$e-wccwSB*>%ZP0=%(54Ze z_;am{Jqr0qPY?>Qqhym-C^dN~b@L&DSvgUID!@%EkciCAG6;xPOGbsg{16w79hXx^ z8UTbRLnY{gy5huRGc*n3#=Dg$Q29Ud|dk*yI zjL28JKr}W>K@*Y#Fu`@=<6uP91l>rI(I*8KmS=vkT4Lkt-vb^Oxr?AL$$E^wlOW*K zejHeysC>Tzp?66OvIlZlm{u)FX&Sd+j+JHOU9;JtVr3{QznZd zp2T@$40?TpVwdLN;E#wW+T+Su-BW^)f{&qOB=cCjPcA%%BoZD9@caTHhVsT{Pc}-Y&ml=e2yD z%oGIGUZ1%B=;vWaGa$=>FG(U14i;4%5jYghej+ao&Di})8J@A@k09tr=7zH3CRd%3O9G5 zzpHd%gl6oUk5~hsEPS@B7MC6tCtT1no8?x_ID5a1WhxQ+z-6f4{arM&Vo6epK$xs# za%hj^*%bn2_hwvgxBz&PS!*mme$t;iQCjzOxO$%*5%&1#UIe_un-l!T%`d|bg{65C$5@KK+jMp_2{ksH`D<-dZN#Ss%do~4ES@0I{ z+ya!CC7Ik4d~ZBWh`=216g0(RHW8YH<^9JQMKLHu#0GFcDCkE}0$*gBxu?G$PO6p;Nz~U9KGPw-? zLpYe>Dvbk=AWpcOh{4rO37GH+wnoY4rS{Y^bO7ZDlJ;K;_$Ho)OI15tTqIV(Qcbtc zi;0!=Yc#v?j=Fmc7dl;AMxhA6%hJ*k+>>9=i4Q2m36R1PP|64NwLllVmzENX!$3oM zf}Z>o5wkZEIA)5FPX`+yJ4v35Ar&E|R!M{mqCS)8a(D>de#<-Y_I#0Aa$r3x4vO0@igp%6B zzOt+`aR7KFlL700!D0h4ji6jI-1?1qx)zX~nCn{p;sFf2hTDMYQJW{h z0j(%VqZUkPveUw9#UP5qL11-KaPb|96Vp{%?sWXH>qe%@VvECiPZ78O{L-R1^e1_bi}-J!QxJ2soiWgL&|YvJ#t^m0Xs~D?!=V{xTM!$@)N!`zgKh}L65LP zjS1eQQn%x-878_&|J}m|EIE7&0Aa)9JW)s4)4d^)6XQgSoTR+~KEYMgO5|amLlqj5 zsy=b)4%t(*(e-8wv6ky$Cp@cuH2drUd^s32 z+c2&K?64p?kdC7h+-U-hpbZ=#!M^b_MEO7#-+*>q0pL(g6O47Y2>T&9>Y8&gAu{aed;@ z==v6|^a-lvbD9?^kORNTDsu7FQ0(IWYzhG&pK;cZbUK&wmIj1_4~ z5C}bm^eBu9D?PIN85DXv#)b_Lpf+IoI3FK>r?90M01XQY9DuKhH7Bt2!WU96@D;aU zfr~=H3{<8wtD=k|p-(b|mMhh`z{G=x7N`eBMO=pW8C$f2fR&&pds033^1~_%KEWXt z(Z5F^N`#`yKp)A3;wAksJs4u0l>%1lG+)Jr&p`7upLsnB4$zR;Q<1<8!o=wj!S>`? z!<{+>F=3@$>pjDsw#w`JIi2QgHz%LO5VO8pq2s5qxR2txWxkq%%P6&_;g3LB5la!vhN4+sQovF1fC49>gs?(*k*M0PV({Vd5TX=Z zXSdA!#U-|^djgUy)ELepcG}*}%@On$u@x=a*do`3Ax=ZSh5^vnjYB_(s+(M=*3je# z2NWWb!X__beD=Xc?CBwe(m~gP34F^9U`A^a82=<${nMlH7I2(nCDf%Sd%!4JkSg9g z5U;f?p-F{EX-8*nO@Ja}mtSVaXAb|Wgtf}N4;vd-i2&M`GBgu(|G5R)JpeoYdrO33 zs}_VwQWky~6trN15eqATFuv*`Y$UESN;jfznJ|X3jO?EC=APr&{K6o3jsJ!f^5*#M z%Nc;X0~;7g^5B2!PJJzl}T!fP+clk*PbxufkZbNte>v--+zqmhdKSRzfhIc#-hRlB%&s3UQPpop!xl85!xNB<7UshgY2 z>$A(xXCFVmn*U>m{{!Zi@!~rmC;Ur={{l4sek9`hDV{v07Ja9fpWuXn?=k$AIpU6N z_4nzf+>t&10guAp^L)#S^560Rk?u;hjq(?{O;VGPY;tZ&R_0nz<~e?culOf9_Y{Tf zM?&o0Px^s;(&Z;Ra|$WNZ(RbkOz;xmNv6jC*$9|^Dkzhn6?2PK-0>}Tz_g76W+ zNpesO1HaGFU2@JUa|OBf+y{!e#Yr+vfIs62!E2pkY8ZI=ag3BJNj4=w|4-t{>!aXw zZkcl?@hPTAQfeY1_?hQ!uNLwVE68T;x4l}(b?iF>1!6bHph!GmgB*HvDm5UBmn??6?f=KY2WIFrd3zqMN(JX!n5|@~J3i); zZ`LI?k6x-O(Rp>YNev{^C}nb3{i{btqvf4wAGYU-k>8zYR~+P`ZTWU6I==eUjN6GY zTfr)lfKQD`=~HYWb6HjGH`B*m;W2dEJ8c)a8ES{2#8x4YFCWk{xGBhC?23#e4?uWP^#*^KfagkMYJiX4mjo=C5Pf{5d=i(XY!JRDSeU%}L` z6m7bGr32AmN`|j$+D9su?kg3mKjqcUAuzrvp+vpBFGS!~D5Y%_IXGc6;cLbBENLyd zf8{Eyq9Y8uK?Evou04nhg2$T zY@Jf7^)O8?Ve#<068=PeOA}VAZj`{!Aq0sj4Zu#V`}`PO;!5PfA`;}m2^0Maa&ge# z8*NI5VuBSzyI=*Ao+m~4DR1T^D5O$? z3H#opvWaWnci`tp6i`-9@;?PsxN90VG^pcE?T>#4Tn zwdDFO8yJot@5nPH>4U46hR1RdCDUwrig@@f2By8EX@q){6E~Q`voWJ$RXMr1Sqf9Q z=(UJ>=@WXgaMpXtxP^14Lg}+csI!h52X}Pz`%J;mo+IVA08<*Uf^V2mWfR{{nYnt7 zGS-7VIO+B##i7s=CfL|?8$gHdqTcN2?e<}aQ7bi)9k5cj^TCyxzQpfu5K1Mkyub4 z(D~EV$-7G}7?*Q%&l6wA!Maif5(AfHq4_}nl>h~@GdtwGY|(sqbN$=-Jcp;VZ;Z`? zApbW0z2m-Pmv;XL{syE|=VsoyBtODzLlRFDFY+J(OPSD0%$Wio9G(_|trtVp(KQ12 zFOj~Ht>nSS?4IoR*?%V1%29yEFZ9Z%izdD$w-Fb{Os0q>>0;wv1pMr!L?h?}dgKwg}c7E#M z>~w#^sN&!9XTJ|!KMi1i=F=KL(sW7XY2oh=_jEwFYvFpL9`M?X4Ic#_2I>bu+P2H; zyF8Ut&h8&MAQ&XmOUWS$Q|;4iiQ3996qvr(C09cuoNvw-_E@@)6-NLau{XDX&%4JQ z<1w5l27}&tDEJosZ_Y0Xfr1I*FuNu3{^vfiob9Ht96<8@hm@b+?XCA%u;a(bP=O+T z1B67evRXEOke`$Xrz!q!iAW8}=aT_i$R{jb!`JQG5Wt&5Zuo?WXFzThnI}MkchFss zr2O()$hf)PYwhk%5LbwugfCty$@`l;DmlOOsZ{cK-DmFcDR^(!^qgv5beg`^oPvy3 zt)3hbgq!E^3yMd&1~{`%?penTyt_yfML3_%;g=$tt!X&Oz#qC1;ff{qi;5LX`5J&M zxl2u@Mh!+(6`LkG!1B*cOWqx4Pcb|UrqaZK%}V+wic9mtCQ?!*D) zOG1z%2MCZQ>`!M7ARlL?U>8?Ez%cJTygP9K>4g*Izd3P$aSM31Dq8~_HG-wjFb{R< zNUgun`Lu0VTjKOM_1QO&tOSCEfN$=w|BDRD*>J;bYWVlia6N=-k*pXh8J~PSQYyiK zcjm1UlWR46>^~?!VxqS{|7xwmwcjcxR)HVck$%#D-7h>%u%!le9-ppDQnI?EHxFjIj~|PeKC^$bD^&l!+4Y(% zK7BvS?Gl~op|g>w?CSdE)4vcBJ%Y9QYPkdq;^6=KBh%Nikmuk}Dku@q7Ts_gGxNuL zJ`Y|BnuHJs6fo8I7G3v)8LdEg=5-V>Qm;dweW8Upsu$Rt2+Z?wVo>R{q-rzbw^c37 zn`euNw31R^i9yQ-V(zr7ofPxDAkd+dlU}xzFqDMOZ4lYU(1^5*krL{&dpzhYw}{yi z8Ru1=LxAW_`)(;BNrdIc^3l~Z;TGY$8w@qgVXD$2`57Slv+hT84!`ogeqiv>9C*GNeTaCfP&x}XottRyz?^&G{Jbp)0x<(+oV{;qiTsaQww#KW>#Nh(@ z<0Uz|XLwi`GS~&o87-+Nu_O5&1sF22A^@%|FhxMG#F|#!A~HsnQ3A7PAf9wsRDw~2 z4!7bHB?J|vx6w&LgSd5?iI|_k(#9aVs4al2B-RMDKv?c?a!wB$ipZhz@iUT=wK>M? z%Uggs{iC5Y=1&LM;U!%-Ye$l?BP0r_ZUnS1)eah=Jq|N!pGn3XugPDwe(v%$7FVT_ z)|K}t!_6*_l!~;@rQ9+Nq{w@9UG}88qe^6A<;R*{Suoev2j%IjKcFWNdu^f%+!R|3 zL*3|Snh}Vi9FEH!ye>*e-nHu&X>LZvu*%oh;KlkFQ|pr|)o}A@HRN^Z$OALGl8FJKVbcYa)0Cy==EcruTWxnfg?VhaY z@X)9V)C`r_Tu+EmnMvth@OpBKi3d1pMV#_d6*dz3OZ?JIi`mzlD3Ybf0iA-WE^?=@ z-B4g;yF@jIx@$z$fYA+3QB8mQUx#X|IL-+w+( zqD1f|icZq zW2Le=Fz_);CzDy#Iq-^42ymy6bP9D-H)-!gp%^8>E=LKocC7%wsW({oKxZq-tK6Q<5D1;g1 z@@1{iXy>^cm)uFv-6S)3De>j7^@px-bp2yCi1(f(9K#K!m`jvR5XIMCfSXRihMNnvD6~xwpIFT{F8vZb`d_@#Xpi^I~ zu)ydtMxcSGP%bW_gZ4^!K?yd9M2`#UDJ)s<+BJ_1twN!Z1I-j6qbT=ZN(5LE1JWJ- zzt+w)nhkV~M`7kIi{joz$Joa<$@FD1O-=@ikO>C4R$D{W(RL!sh0ej zwE&v8{GDfc^8JNrQ~9=-6MVLyC^u8f_QPeGx$XecRutl2$+5MLOj`P5!viMY5V)#; z-=hKp#t82j1YcNCZ9G?)?x=}%_@?>I0PmWOWN(mzF9#)q)O%XdtGEIWFh*_Cr(On2 z_CQXAew?JYD3Ui8#52Gjt0iPwbi9_mU&Gf?hd`Nf#j22 zxwpe5!;3jW#b(1!RU~K{S#52w24jV8qNLE54i3%gm`~kgYRu{dQUb_!G&gDcf%YXV zqCed)S0()BqY$1dt51q{Hq{XgnWB>r^w?%AA;ZKMg%Vpl!lkdWU9u9M5`tnMQ zrvoy}sTAlXvkEU}gF-(x1aMO1k9Qg2aKStbS_;E+fZo|48LMTZ?f7u;5@EkfOZ~Sx zY71{&OL(kW$hnQB_E|hcs(ofB%oL%~O&P0-s%4NevxV7s_nBiYLE}SYv7DHw+WY;K zIAVC3U}trdl=RAFehRbuZi5B~ic$!EPEA@Z5_0f20e>2Ob7M>n1H%wM2Rpg zGlc*(cZrb4*<#;{?D*NZoHofd=h!rZfJ7a>#T3NMM)a;nF(6_%sRK>8_|DAaZ;AXopklz6`5NzI9tUZZT5~~7{J6X z&?zzc=eb4fFre}lb*a3-0^APt1`*ws_%~qIE^%NMl#(p}FYGYo@ns4}~PMq5Xjlr{5IzI8~VRGImMPgRrt@gyXVmM zu|pBA%!~$mihMvJA7NTIJ$XI#f3^Ab%A#twYxMuU{K5AfMN?8=&<|#>R1B8DS^LeZ z`b4*+^X^F6yzu-tWzO*Zfy2hYoUO?KLfnin>TH`wX7f@ z$dSJ*yO36O77aSzUz}2b4l8wsg?N2#K;y@~yR>9p6?fsg4=pT)kwLs!`63MIn7%^6 zu2U0hIIufBWa&$lvskV}^gRE;J37(2_)(;<(L*(LOIZRXc{q*Hzv&LE4^_X?*8T6x z*lo?U1KGrhiN`ZB9|8hVUUf+`b2bPhRxq)4si*o|>)WJ|Zn^niGd}-$Q8TLY`YEfC zJLWn1JD~B0+uG+@HyxxXSisut=ilpW&sl7d2JRLA$!thv>M|D>2CvxN3$FSZ5^)WMa<=2}Za)7R3U z1QK%JWf-IT9xHwB>iHJrkIp+UEq$1JNK9CtR6X`3wH|JNEuQ{6VEkKk{W0vR1O>hP zGUeAwq5YYCXDd#BTuF!*|DgXf4U0KV|aq8MRcoytx@{1eEUU28}dX5&I_I!>+B)If~(8`3%@?)_AYh<4aP9kIC+Hew*=W z?von5bidyLuP9{HJwXT9NE8ylk{;6RgqK=Xa3;Q9zwR5FfvErLT8*1pXBQ{duBWJB zM)9r!88SZEozOhGjjpvGXc|90vlgN@J!Y^c;TM^fV_q)AI>;|q;ya%NA&WNby!z3C z=4kkWN_19;g0>|NvmXS3ejrLI5HqNva9na#!hu|N4?__qv%;0xY+G|Tqx<^qdMRH> zG}bW!XDrv@+qUM8t4CG_ofe>5d-?4iIw5=w!Ajr)s7@yoaXaJIOhQpq<*p@=%m@uU z4Yu->Hp*{^wUo=954KmTn?4%k@ovG)W)`Qmmp-~D#LXRMo0l3`sj`DS7 zAZ%3Rrtb7Xy51`cxPxmY)nL89Nt*H^3X$=h21TRG#ZKo3ZArB8xuLbXrZkq_3X=hS z-JjiRCNF-5*}d23+6PBznukDA%E?-loC+F2HIfK<{e~?B!hJzqQ;{UE%7MI@nRKnt z3MVme0iLVaYbnm%b~K&;dM*Uq)maTPy5(D`{9qN+E7k71e2q!(#EA=Rk=f42TvtD*$6}qXRw9$;?rl)x2Li zUsrc5K8}S8?hN~2dTa_2&=Mp9&&}0>EKasUpZFQ{jGDdm00@Rc1`%`a);^0(ik~R= z7+))Ys3^b_taZbo0}@W`vy!(XZ9-cWmT`}sY#g{wB~yCf5f3f9GAB!oHYdMSn<20Y zDtc-?g;!UnLP{Huv$-45D zGDe)%dewbkZtZ;a#MKl;L)8(;YDe&KFLZ)P909h$T!~RrP>FFut8FF^V(GM)TU3z9 zYj03w4pngjYcJV@2LY^Z#Gq}cEgZ~*i1J!|c7BzNG4%#W-`c?`iHI Dp=8*L literal 0 HcmV?d00001