From 1b1ddd9835ddf142a362870bce8daa50ffe58726 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Fri, 15 Nov 2019 10:25:24 +0100 Subject: [PATCH] gRPC info --- Architecture.md | 2 + gRPC.md | 140 ++++++++++++++++++++++++++++++++++++++++- images/grpc/grpc-1.png | Bin 0 -> 53317 bytes 3 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 images/grpc/grpc-1.png diff --git a/Architecture.md b/Architecture.md index 8e7c0c8..aee78a1 100644 --- a/Architecture.md +++ b/Architecture.md @@ -20,6 +20,8 @@ Most communications between microservices are decoupled using the EventBus and t For those explicit communications gRPC is used (instead of HTTP/JSON). gRPC is a RPC-based protocol that have great performance and low bandwidth usage, making it the best candidate for internal microservices communication. +More information about gRPC and eShopOnContainers can be found [here](./gRPC.md) + ## API Gateways The architecture also includes an implementation of the API Gateway pattern and Backend-For-Front-End (BFF), to publish simplified APIs and include additional security measures for hiding/securing the internal microservices from the client apps or outside consumers. diff --git a/gRPC.md b/gRPC.md index 0fa44b4..0ecc2f3 100644 --- a/gRPC.md +++ b/gRPC.md @@ -2,6 +2,16 @@ One of the big news on netcore 3.0 is the native support for gRPC. eShopOnContainers makes use of gRPC for internal microservice-to-microservice synchronous communication. Note that, in eShop most of the communication between microservices is decoupled and asynchronous using an Event Bus (we support RabbitMQ or Azure Service Bus). +gRPC is a high-perfomance communication protocol, based on HTTP/2 and protocol buffers. It should be the primary choice for direct communication between services (as oposed to other protocols like AMQP used for decoupled communication like queues or pub/sub). + +Its benefits over using directly HTTP with JSON are: + +* Protocol buffers are a binary, high-perfomance serialization mechanism. Depending on the language implementation protocol buffers can be up to 8x faster than JSON serialization while the messages can be around 60%-80% smaller. +* Supports streaming of data +* Contract between service and client is explicit (by using _proto_ files) + +## gRPC usage in eShopOnContainers + In current implementation use of gRPC is limited to the communication between aggregators and micro services. We have following synchronous communications between services in eShop: 1. External clients (i. e. Xamarin App or Browser) to Api Gateways (BFFs): Use HTTP/REST @@ -22,4 +32,132 @@ Following microservices expose gRPC endpoints: And following BFFs are gRPC clients: * Mobile Shopping -* Web Shopping \ No newline at end of file +* Web Shopping + +## gRPC implementation in eShopOnContainers + +gRPC is language agnostic: all services are defined using _proto_ files (usually with the `.proto` extension). These files are based on the [protobuffer language](https://developers.google.com/protocol-buffers/docs/proto), and define the interface of the service. Based on the _proto_ file, a code for creating the server and the client can be generated for every language. The canonical tool is _protoc_ which supports generate C# code. + +Starting from netcore3, gRPC is deeply integrated in both, the tooling and the framework, to make the experience of using gRPC as seamless as possible. + +### Generating server or client stubs from proto file in Net Core 3 + +The tooling, integrated in msbuild (so it can be used by Visual Studio but also by the `dotnet build` SDK command), allows the generation of the code needed to create a gRPC server or client based on a _proto_ file. The _proto_ file has to be referenced in the `csproj` using a `` tag (inside a ``): + +```xml + + + +``` + +The `GrpcServices` attributes is for specifying if a `Server` stub has to be generated, or a `Client` one. + +>**Note** You can include as many `` tags as you need. + +When you compile the code (either by running _Build_ from Visual Studio or `dotnet build`) all code will be generated and placed in the `obj` folder. This is intentionally: this code should never be in the source control repository. + +![obj output with auto-generated files](./images/grpc/grpc-1.png) + +### Creating the gRPC server + +The server stub generated code, defines an abstract base class with a set of abstract methods, that you have to implement. You will have one abstract method for every rpc method defined in the _proto_ file. + +So, given a _proto_ file that define the following methods: + +``` +service Catalog { + rpc GetItemById (CatalogItemRequest) returns (CatalogItemResponse) {} + rpc GetItemsByIds (CatalogItemsRequest) returns (PaginatedItemsResponse) {} +``` + +A `CatalogBase` abstract class will be generated: + +```cs +public class CatalogService : CatalogBase +{ + public CatalogService() + { + } + + public override async Task GetItemById(CatalogItemRequest request, ServerCallContext context) + { + // Code + } + + public override async Task GetItemsByIds(CatalogItemsRequest request, ServerCallContext context) + { + // Code + } +} +``` + +All needed C# types for parameters and return values will be generated automatically. + +### Adding the gRPC pipeline into ASP.NET Core + +ASP.NET Core supports direct integration of the gRPC pipeline. Only need to use the method `MapGrpcService` of the `IEndpointRouteBuilder` in your `Startup` class: + +```cs +app.UseEndpoints(endpoints => +{ + endpoints.MapDefaultControllerRoute(); + endpoints.MapControllers(); + endpoints.MapGrpcService(); +}); +``` + +### Creating the gRPC client + +If you are creating a gRPC client instead of a server, you need to create a `GrpChannel` and then a gRPC client using this channel: + +```cs +var channel = GrpcChannel.ForAddress(UrlOfService); +var client = new Basket.BasketClient(channel); +``` + +The class `Basket.BasketClient` is the stub generated from the _proto_ file. Then you can call the methods of the `BasketClient` class. + +### Using gRPC without TLS + +gRPC works with HTTP/2 only. Usually when a client connects to a server, the connection is done using HTTP1.1 and promoted to HTTP/2 only if both, server and client, support HTTP/2. This promotion is performed using a protocol negotiation, usually implemented using ALPN protocol which requires TLS. + +**That means, that by default, you need to have a TLS endpoint enabled to be able to use gRPC.** + +However in internal microservices, maybe you don't have a TLS enabled endpoints (because those endpoints are internal). In this case you have two options: + +* Open a single Kestrel endpoint, listening on HTTP/2 +* Open two Kestrel endpoints, one listening on HTTP1.1 the other listening on HTTP/2 + +The second option is the one needed if your server must support HTTP1.1 clients other than gRPC clients. Following C# code (in `Program.cs`) shows the second approach: + +```cs +WebHost.CreateDefaultBuilder(args) + .ConfigureKestrel(options => + { + options.Listen(IPAddress.Any, ports.httpPort, listenOptions => + { + listenOptions.Protocols = HttpProtocols.Http1AndHttp2; + }); + options.Listen(IPAddress.Any, ports.grpcPort, listenOptions => + { + listenOptions.Protocols = HttpProtocols.Http2; + }); + + }) +``` + +But, this is not enough. We need to tell the gRPC client, that can connect directly to a HTTP/2 endpoint, without the need to have TLS. By default netcore don't allow a gRPC client connect to a non-TLS endpoint. + +Following lines are needed on the client: + +```cs +AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); +AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true); +``` + +Those settings could be set only once at the beginning of the client. + +## More information + +* [gRPC](https://grpc.io/) +* [Introduction to gRPC services](https://docs.microsoft.com/en-us/aspnet/core/grpc/?view=aspnetcore-3.0) \ No newline at end of file diff --git a/images/grpc/grpc-1.png b/images/grpc/grpc-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8b45896480be8c12a91b431c35fe603057916c51 GIT binary patch literal 53317 zcmagF1z1#3*Zz%xAc9DDNOyOKba#VvcOxO9C@nFhw19LoFqD9FNq580Idpz!^r<)g z?{{4@!^AmIevr1rQJ(eMf!Z^0XJWkiPJ{M&(3npBW51@7i)PtC9#^mlSaT*?U2?tId$@%< z?m+`ziCF|OLPw1e3NgyCc{R3HgF=G)1@nbK# z4=-TO59iL8clSn9)Z^7U?nghOrktSXu8?iA&ht$-{zZS75^x_BAW+T_(rXwF*j6wx zv#_u*3H-|4A85>bE#kLZ3ii3)F4#@z5{wPWm>P6}L6ur=H&}D&PE zzAdTclzP!`ml=LH_F4IqKRc^B;=2~bd*mZD|L(B)y+AKn!0CvQj!k!|0oVtcVqNdH zA-_Q(;JW%WK0dzbsQm?6(8@f-Ga@z?qs*{D!o>$!b!VJjIbERB zS_DQgw_AY09S+3A+Inw1_d&1>sqaU!+hwHNPLtbDwvVpePqpy^Ad5m;lW!h&%I}K~ zn*2pnDs|UmWk?GPb4yF3E}Axlo35Z~AlSoP(2cXF6>~AHbe%iCU-tkAI-jlV&zEiJ zfnx98z1x`j_4B6~wF$pcx#e81?ZniEyU1Cg%F3DF)ksX>de1NG^><4*qz^~v4?m|` z@6Sk#JgjJ>aus=<=3N~896*L%?iFgH8A85s?wdmsJ@pk8Kh0x=yJ7-Qb5l*EwD&oR z&0BAN_RjMR^`;LPQEE?x9ZzpO1U!3Jjq z3x3vhiE|`lxjHtdP50NkLZ`naL5GLF!|#0dYo~}W3S+}_+<_?}a(^5H+bJ&3p+jM9 zI(pn|5vNh0e9ZcA!unmk5b|PWAG`#GznYnyr2xqvpN^^M;HCms8we0}c9nqh>daC_ z{5xMD6cv?~wWFIig%1mF-KJoN5BG;n$6Z7q80<VqP+=v6grK@P$0Kb%j<_qKN>ucoC9XB*d6T}{)G0v@bJSJCtIzGppc#Ip(m#Yy% zXX6^*_*`@1ymlv<$Gr3=Oeb{SO(4A$1!o5;w*axxnA+$CzZ!)a1=I8M9`m7sg?E;_ ziUtNmj*gDpw$gFERHQKlan7`Rbt-8MDuAXw+@q>d(vvYH<4Tc{(R>Gfo zuKs%70!u%vXlWUWR}s6m5kGwrZ$p zo^BGvGy@kFNJQ1jzi$p2V~|LFvfS>;?ncNS{cE_Z7^Yv}JE;xEMk|fxxvto;Ht}NN}EDDHb??=kPPoDWsZzn<{g`^8}jad~$!$ z+BzB(EBmy3YPTNETm8l)@X9jq1{{=zMXT%reC2j z_W~D7L9LE@+M8g)0GGYNG+u8U%HKcA#rF@vOMyghWe#HJz|OEi=fL=f%b16so3N3I ziH)tMg~`o?g+9v!HBqGW(={M)d`^04F#_EM?)(` z$JjTICiFE(p1Y*NFmW-)?`&rxT>I*L&ROSi#A(X~F#7O%b(}KnpYO&=m$oPZOBv>B z!bliK|J>mzat7Z&+faD~sT&IO)z;DR_Gr;EF*v>&4$833@C}_Z30hG5ll3LC-w$uD zT?9Q`H0+i&dQoK>1#BR87w(mQ?YDb*@SThd2sEH}`kqbbD3z*d@7rm12SzF7Htc&S z3-nrhr~gU)Yohm*OIJhQ2ooDsSg?Cnr&f{0wVjFLri&NXS}vOVuCF26-T`_S3*IJ1Eh>R0@gNS3!USVfYLL8E zG(ik+(G-xfM6Q3h0R>yeO)ua9IFym?0}x>#8L|M)M+q0L4|jc^MQ=?l0|J_%-_lQG zTFTFSPw$qGeG6!b~$%V*1oYtn-p(UrG|vBmXP&( zie7K!a&M+a#p*Q<>`Wh4R@yoHIvEVgNzGi%b5G{BDr4t)W!xT&58C#Tfw%1|6&u3d ztx)&`lqyW0vbwYMdZ;o0hSttwaC#7<+Pq7k1PTgd`c}rSy?1l40aV3haNsWZvWvIH z)nd_v0{H_!z)CSew`;d|OAmKtMyxU^f|Ymh?Yx67ysv<{;8`-~PaD0jTw&0UJ}1Cx zAcp**!oKBtqI|MxZA*Dg+2H}Wa1DnoH_-uUhrcR?%jN@qKL!xggHE*Tx{t9O0T?=X zdGk7}`K`9D>=XoGLkQU|IYN2M^-iTdEM2IsJ3YYL=s6r*$@lP9A((JNU77wDza}=8 zo3sZ0=Jl@bOI72e$<;`v>6D?ZAfI;mNEc$^SJ@Eos1bJ%_y&&QdOnF zgo`fA0Eg~r0&lV!g!Yv+yr5&etKXkREd2I>z2;3!;a?~F`LF*8>5U#nMr$*{tx(X? zEfuTOFyW{PRHv1A&D>g_B9k0h=J9?;mcmtSO!O=ChtXiU8h4Ki)|UPwJa_*Je^!IL zXDUKTAxI(vCbzE*C&}h)XWX1i)^5gfBkv>wu1C@&KTvPjBO{0=S&0rI)uB$!kdC~G zj7~GT88LzF?eJwDI;4wzASc$Ef5X6AVlO1f){B+aMJ6fzvhcABRPvX#==XqzuIk|p zpHugVcSdK)zfnY9k! z-)!xV(Wj0gNACVu?SJ1-2A#TJ;cf}~om2Caw{=I@hT!SSmnywg6EYX~psSk{^yA6^ zuCH7d4VYOJf7L2%J;0n8CL!?HAT#Kk@@mDNZsDEB5tb6A)8%vrSn0cw>5n#YGQ}i$82%X#3BDLv_Y^rCdbFO$z&o&rYttyfz-ErG53T0g7z7pCIe== z8|4DvumK0$Eo8#|NcCN#F(QgVmQf>7t*(legM8m_G0ASKT}A57j6z%a`l>TIV-D}` zPfa>D`znP>35F+|*eYP`6tH-q#_L`?eWjxj6`$kQ`wJsnmV6m;zBq?F&hnNOXm8cK z?&G`VA4V{m6Q{e&tdIQC-|`-ES>5^1unsmY126AYeuOKLh^|DDJwi`vC9A!1|Lh8t zG`zHl9=;!|^^>wbBZ@qhGcJ;I4iqvtB~3S3H4nNp4ZQqzaI7A1G%_g)+aYSCJ0D<$ zIk_3i-F@daL-|mlVz@TL8kpuCq}(XZ-%M6>ojTQLpg+;#9FWBLuv}2AA$Z;eP8o~7 zqdRjOTssz|Z&hB@PGCM_M88=fYweg9ZAT)TdlfJs2H^7j&MT7+Ij8hMm`d3ltIBiiU=; zDaK*l7mem%*d~ytn1oAWHotoB6HC8@-HF$|hpQSdX$_V(`hW;&ZA#F#c|6l>2+z3| zKMqIaTCyR8gCSoL+X&!wr48fr3>PzT;6D@mt~`AAkLD3{0{`zq@?07ho{WKlg!@mS z1gIbI?Ohx&q~PiO|L+L@Dn(q)@2*tbA6|s#yuZ%8cD|Yrg0$iw9ta$Zx}MC#2DRz` z9CrCjJ`RbLTK(aDOl}eXT# z=C9SkhQLud*^*_KX=ONg6zc9M77k{s-FxwEhv~vTuDmb%RvP^@3^|JxDdH4j*7Q+k z;#A%1!|@E$K3=1%eRoqQ*G$}!i*a=4IL-2cV*xSS1dq-()GX&+(#D4DP{}L&`P~L8 zVlVwuA7687>!lKYpt2!2L0D;I-v|)r8;lX4XejbtBQ7#Q-9VE%ujfM`EZ5u5J9Z#y zam4nWY){T+!^$q5AdC^kL@{7-Nc#7M*N@YRw>pn}6xaJoD=}S)R2S)ej;B%MU95jo zOo6bd3u3D@$QL)-H`GNXQ&1(#UX3wvjzZhH6CROsY7XY+r)+RS5+f~(H*BOPH(7se zGmtR>4^x|jIc_LoEq)~mo83i8BZkjlT-5@Dvo@|}wUquC3#ZGP0jWJdU@A(Cv z4qePM9;e(?-?ttSP}wdkUDNpS`XMPB0q?#3j2(kglQMf$V}nSdT2 zm+?TaVUViq3;%>|UnRkwfohD84TxHL^h^V7Gd$!Ss&mA5zNJH4ky_ZPmeO71g>-aR za`<7I*m-^ggR|DLR{GWk0Ypl}I3L%7MLE9Ea@$w^+>nhfI6|e7rNX3=?!dOD=}DaT z`24t}L@OzIeikKIb!K4=^@0FB4F@sj*Y!@mZx@InLrp7GTrdx{huWG>yW~yOSX4rl zt#(s-%@o%!6`8l6ib-)m_TPc+JnaEei2*z)DK-;a7kzWhBM7t%gwusiR0F$_CLzmI%4o_|m? zk)G50F!mZU1l6m0A<>Jvf}&(^@9h5PT!Q*qN^w8RuAcXo9VR=*Z~Z#R6h_s+=*BN$NF`(X*`>hqL5oU*y`hKPI2 zj~%k~{l9!rw4#vNbisU=VW?#o1_L7`Bbi{SScGghD{tOxvG7{VaG$}pJ;OvD#GBWNouT^pBDRh?xpPZbbvCDmh7lz4_%X@bg2~xI67cIx-hub6 z-OEN^iK$j(tE33*3<__ax8LWLLNk z1$tb7$Sx2CB34~s^j^3V)dYX8_{rP!CXl12%QM~@44cw@nUROar4aSx3OH?~0#BBL zzDL*BrYsy?(m`Y*{-^xe)m62Ba#d6i9W8Zzf z?x>Mv2zeKtn1*w5YE1>-ppu@lq%m!S5J)ymmiE&tAU&%^pTAO$y+>=H;_PG-?gEW3 ziNB>TZ4i>T7-M`Ya9hhR&>*Frq1v2d25MmhCW+8@EA`(qEtGf*u`+2$+v!5Eg|`Re z>vM{g$&A(tQ-iG}6O6=sg9aX1*>NFNMritVqwaR|!fK=8=tr(1gcRdYGpbbS6v)qY zT_VRa3}orBXZ^GngeTiC&e@w1psB@ZNzfMz2BQ7}cWfL5kV4f~=g5JP%nPl)^gfl* z32osd`77}uqljfUW}Uu0#I4$|BP9X2jy&aKzq?>CnoX2;_Kt-?F(1%zc;-(P3$B4* zK9TsUb^e-U7Ip>k*!08XjhrqCA-ZjSmf!m-I^WC$VBl*SX+y})@=7U6N?sK|^Ik@a z;dt*0seMuW=$^FQm~V`5a2r`I18MD7pF1U+Z2LL?$uoDEOlLMR2bwOFWwg)FD`vA6 zak&+yu?*!Yu@s&-`HTK4^uGALwclg#a2@0hEK975p!Prp@!+|7z44a8=XIe z+4Ru%zK~IBh4x_>%n+2cFBzWm1M<@5fx+RfzqtP3{!@N2_TOqPF;>P1FWav^cF0Hk z1sQ-^{QsA}%>Tp|V!XZV7KO&#Z^hJaX1u#>$i#9^fv?1o zZ#r6RNLX8MIZW<$bgpKG1EJ*J!9GbZk`!({I&BAA<_SU#jriuV{jI6d8(h#V6?evJ zbMp^?s`fh4nv2Cke02JP+D_t4moQ zb3W*7JSh?^zO_{h_ObZrZu_aw*r>`mdBwOt{^hs!cH&c$WeL#%W?g&gmKB9JNt+eD zRcjnE=;A|lBsHiK?)BR($>bQ@KjfH8%O&cOL=gi0+AAPVm3>L!4t~O#P7Mc6kh{;4 z($@P&YpngdA|c&1Bu+xc_Rke|i+|5ZsucK&`U=r(H*jk|4%Xk;|FLquY@|1)C+t>I z`gF@?`%*CbjTg@+Yc}yWCf>fN+>C=hcJZJT{K{i&#zI%Dh+*SlOHX`jAUo2cm1Q&y+OUaQaMO4O}Kgszf>?9IivI7bHJhIOdg0vKv=rzcYi`0jlLI# zZGP6Ze^(p_YHi^prIecLNxZ|yzCOkMN-B3ngXfyMKvBH*e_tLGSi;Qn=@NfToVlFD z%hC!CY(}oTN@x1tV@-cJMh6Z$=6^RW8GYU#87Z!=raG#YFUdkdRqL;oD8sV5YUkmr zwUn048h~mN&LM0fOvx##bQ+iP!Y(D&eiQ9%JbG!gqP%T-+ynbB;k~?;s?7n#-n@iT&sGhIU5R4kv_4Xp z?44bT!jNi-ZfGQJd9^(4zSH=pOs$0@CwE*bCtp~9$|(d2g+N} zcIoXCbDw@%s8u)6wwo8q*y9_mDkwux*o`u`w7w$rt%x4$0r(6w5ltT7IH*%U^h}Kf zgeShlmXt#|uz5x_%lS_)z@xHijBivk1|l9|TRq9P+(i-eg}uAEr zPv6to=DDJVJEk~VKUe;|C6G3i@OWShWoqVa%C`K1*r|W5Xk03B^JZ98+f3E@#JdbS zb3<0K^5L&KOETBerx~<_skEFE3akWBUYZ6r%gHM8csxJmoe}T%gVS3uJKUcDIzAo% z2A=O0L%IVivfJ!^l9(85E}=>>vOsm>6GBMXm%7X1gS-Rv#IR%h-nOS07r0V9dIT}C z3`s0-SM z2|P4fP)Qk%`HJzvywH7(=EzL!S=X2HnEPd9SPH%0VBjabRgX{PrF5t2T-!{ShKR+IkfDOq_`lwu!9d2qq1c`rnM9Xf)HHde))1mrWgfXYaczon?j+R8q(I?Qp za93B>O0A~?Hij)&1m3X)A4J>VlIJtO{mYO)>shwvs*-0d;$6+?1Fi`hzO>dY9C!(& zSPCN*153$wo)L4-r~5hakE&ZnyR>S*IqK8l3wVgP72#OaRiZ9p+c(H^FBbWIJ&1Td zTaCq((IESg3d=w^3a1Rx&@{!Rx_2n{QYBJ(1`V?)CMnGN{VjK5e_3h!WA}dCPQKpF zcVFEVHID1CS0k0|kHuS%_`yQ$8;V!IlZQO>-nBDw4tu!7HRZgMQ0(O-7zgcsNl)4) zGNuqEuvqhJ6H>BY(jAL&VAcuAb~O7juA9?uIB6D<+V13V8nCgOD{8YKT`hw7GTAUL z#Vnb$SkQ%~m~*B0;B|R-DdKsVZt5~)TSL?;qyFn$_81Xq+9b}WV}27zZf+6Zgzr#o~OhFnv99@UJZ?`9E2>5ka?e`G)>ak zzEZWirSYeTNt2al-|RTxtGxmIdHy`68N)nTAtyRVoMT=3Ml|S2DoX~9(Q`%*fH(43Q(8_QHz)bC#?M%Ru&34`Az*i^V- zZsxw0aAc9ru}z>a_UFc72W5^=>e|8NS9F6LWEkqjUG9wtyBqKi@=~d_fj) zCoT=;Y^&?gir4G`#8<%%-fQLm!xX|TsIEVC>{MjW%c3T^Nh zlKR3WKL#aktSl@{Sjpp>GMwO%2EsD=?6Zr@I$pRwRw7+kKKaQ=tL@0gky^5Qj{O0y=Sn`mz8UPv)T*`jT_ zT_x{G6xBPH&Z>P*JBSFuHlMJUsCBwxE&~b9wXCTVw#;{B0Is1Kr$^beAbHo-Utv~7 zb3uSWHCyIdID|&E)r;DYEXwLcVJg}i8<}@JFJAc!;MZ@7x*qCj?SeAET+v>aljYzHn0)5uP{ON>$6J2mv~!0ZiY=PCrTH?EMk>DxA6YA?kJD zNA=CkgZp!H^DO~s@TPY3`6Ir7Yp&MgqmHK2(c^&1tUqV^IVPW305o+(m-W`4I_CP$ z-sC1#e@6I%%OL&F=O4^d>$V)6i~AI%de!WNbo|#T$u@#+mPEUcj*$E6;=QqOzj!ye zG}Nf*e4E@8EuFi9bXtTO)`vzKBwFLUZO^J{c!$28dgYb&EiI`bbNVbPzQtj_%Wm@Z zXY=L|ju`BByu26bhH<(~a%C*c(oDGKIU~3|kS5O!;+jY_SVE8TF9zS!Mw87r_U?eM z3SD2QqnL+dBUAG1xvgoxkQ|fbYuVjYRB<-Fgx%YEv`oC5?=pgTZW4A?q_*-5zo~l) zh*#Y<;KMcP7fb?kTAf{4>-eqCjC1Foa8^BPqg+@@vre_gRtfOy=9xG;zS>7tUr~pm zo1uS@_*NN3r`Gia&kv2`hXEz(P1dW!9A?Y{=iW9i%sNX_UJlex`4j2g=>C$wpJXV= zq+-s5xvG$z*;2QQj5SHgjMNb1#%ZkejFyPh;if-6{!+9)&g9c#N<_W63}|8E z4~Q(M9rGW~RNR)1sB`+=r!8h&Q@THsTU$N#d?bn5u%HN(eunw^NE!lt@L z;LAb-hN|r|RXx%91wq}cb8R@f>wq{e2!!(YUDhf`WaR$`xj)<3?@^-=EM}m`xJxF2 zzW03K6EvykwAEv)QtKT_^JOp<@|v^5!A&-Zc3YG#>_y!+6qh6zH(7q2uV?kWbZ4h< z*jn4<8%w%Cmw$kxb+wfh z7{#nMf9ldTZl-D$fFm%s0OU7Q&*n12e+Zyne+5tvm+$nY)ewTL4sH6%Z8Dk7Lu#G_ zhOq|5J=#*BN@!I_7fo+1=z*H%&r(QO4a3&G(Cr!@g z>$MDw_OOlf$OIYNn-F#}q*n~|;8WosQj=H;tW!v+_v2amu2(s|p4b>vX_x)=J4qyz zRVpQ;JR>$Glg1BNXn+TLYGI*%cHPdl(^GF9z9npHdQsB2_trSuKa23uA#%UFf(Sv~ ze+#s_8WuTL67_e)+(dpJ>}xkP3-BDH0cXmZB@9itO8UQvUI!pO_c>v8L=qqCdDb#TX&#woY;(suh)8aOGf1yiCn;Ay$om4 zB%&n2IFoKPo5Y@{lR}(?XDYd{87gjLA``5L!3wjKZh87b=57u{?k^c}p5vFF4mE-o9$slh$ zECy-_Cpr_x*Uv_#&>fRFQFXLgCj{6YizU>I@`-fU4b)XXEs*p`AGDW$1hxIN>rgS^ zk>^D2*D^~crxd*ido#1_pm(z)tdhW9hL<&E-BWx>89?bbjD6czl{tl&GcCmHYPUs0Eq-r$oC!Zzpz4v-Zo*n70lPv&$X9|5j^%8ZWG# zW5Ji@07ie2I`R#!ZjGj_A;-gEU|E2 zb8tzq_hmM)TAbz9!!68j^<4V{)}zDP?!OsY9XCn|`z6I#dKK9fV*+lN&JMp&QJJq{&MvSEpS z^WlwILWRy|e$jHi;QDLs_zy$p=4M1LVFwkk^82bs?{$*}9(b*5QU!CMY# z4W(H_MIj;?-5(a|6K?e&vxfD3wrz4J3J7?~#P+#^+>hJnM&52v4arD;oHdMmGe)PO zePzdB#voc)EK}Qbni!LpTQ9+qAH2Lyr3T%R?-@|R+8ZV+!4tW@4v8GF_B#9F(ZP{2 z)gYPk9VfF*DkpDcY_^~pRceebpM_fR!?#Ak!ZYKw? z51_pw2_sUI9JL$>#2z~88-GtzUfj`rq@HSDW+z&#O;*fr16q;`!tXx$G41U}#pwF# z(KD=t$rsfRsGYizx>xVsetiQba={`%<76+p;U>c$C!IQ9r60nKuvIQ<`^6H-FBm%_ zPI`g6J&nqVgMsDIm|bK15rks~dHc$_e)1E@z@Tl8-;NGg2^S=d>qkRe$b!&KS--ii zi}F)kQc_6^1Aq>F&pWUs)k95m7PEBjzxm^scf;0-xWI_3&+H&Pz*^Lm9_@+sp6|ic z=G7jVf8vAxCJDE=b=wH6%zI(*mrhH2W@I#v#=^bEm$3=2C()zHx?GgQkgVGwn!Efu!R%X4Hz zxyaxXS5ZMPP|0-qH1J1IM~=4Xedm#J`-_%g3DozX35B+_0XA$A+)>+WiPwLeR)BSi zH+5;(&S2pO?EIVu?Ck7*bMEN0)G{bIi?j?_Yj3+c&|#wr^o==xPf}kV#)?|vu=D&Z zP4vf7>v?T?A!xx}rF!D8?~E^>JIyag!wr?lKM+7?sYeGbyDS+GFi~&SoRz^}@L(_X z;XGd44@w{y<*6x|*`n|G%J_Ybz#!mVg+3geg*IdE?)9oR$4O*ZMuRI-xpE8?BT3&P2^1EZ)F$;xzh}1g(lzqJC=#douG$x1Ne)!m$`iGR? zLGa1n%iW}ZTYBZ5SL>SL#6kl}*QVHG%mdPM9gb2OI|Dy=G}GXYd1Ik#f?HFB37oAVTWIuO!*b7LShHo?FO`_QRG%Wjr%v`(CnHg*) zWkl4ymD;GBZ^49+M$iAFk59@YZ(*%PohRK^y3Ok7FYs<_o2zbV=BhpYOQUC7k2JN6 zGqmvI@w8*HmhM|8{ytx#JQ~jR_Ki^yNrIw-Y)k3cK3l7+ft`r4jUs4qZ@%CpP7LSz z4uw-u7PfA3$h`Bz%r&1pM5`mAlNRO9^UrHOq+i4i5}b)UeIHv7wSfmcm|?# z^5fGez|+g)?Ha>skJtY`JO4+mj&c8VqN=8E?a3+jxl~>KKLL4mDtc&10l3Oo$;vaS zSE*FiaZ=L;`sO2#imXVqDn}Zt8GOM+^<^KdZL9g`1@jKxm(khgj1?8z$jf0-_gEMg z{^}Xu?&L2qg4E98kTZ?5)$ zt_~}yV7kf{h;4>z-WO|4km+w_`X_F^1mQT0YHJ>pc@C*K&b0g7Xvbq1y4j=iqXNbF zFk<#5(woXr@W_HPZLM}$=w`K?T~iTxaptT~+N_YayqqJyoWUTqjGI45*|Ci3*=t8m zosZ4gSNQ4sMN54HMY-N4-1Bq+f5c@|c=P|iiOc5y5SRalpghO$pMvs95soEXQ0^4> zk51Y9r=VF;djPN!i8W z2~tTubx4eBO&c{sQK1XIp__Zb6Or&!T~BR6`^l^;?|wR4OLA`GUa_4^i?2fzA)iBL zw;aE=gtMAOJg86iaqvq6`cIQ%AMl}6%&@56GiR;DkNXKzg4&~=Y}mE$|M+aVY-7V^GRA zVIMd7tVqJrKec}un}fOh`IT2xN=Z9O@SONje(Pr!zi$>!zfH4&E}5-WHTC>=`b0b_ zTF;3uUa@ZHh8$gG{tAE&GSDveA;O7vTbh_D|Gx;l#dGNM`yPH8B^wl%O0}xozx@C$ zn7iD340|qglZ*;2!QOP(Rz$jh@O^GWsU3(|s_+^091`UXehapxfF>C$)-b}AJyVjA z!6!s$;-G?S!te$8X0nwr-V_HH7Q$auVl;q`AP9Rz6{Qe2TRIpIpnR6{6H% zQ5V@L1T`zGZh+OiW8>}DZ;0N?FTY02u z;mBE}qggWQ{VDC>>*sMr6oI*z`Y17X;URoO@mURxf5B+hUl;`o;SqidQni6;&1)ek z*e~X4Y}S1cD1LeEL;Aw6K=s6W+s=K3p#YJ#m-Uh1Tep%Zo+;#~xo<*1@qA=x7!NBCv|cgP zHxdAnzws5$AuR`?m6?z*_16UgzSBcFc5i}04hMEMFPW#$w30wh z;>?aXrk0oFvCK#*R z^HT)2?q3a!G@_;v6V1`3MzQh?4{Q(akchupuw@DC*MeXCh7EZ)or zBDFM#(wJFX)PB&aQ>(+#!cec9S@b#@pUD1Mf%s{xAn)(y9)N`T$E+{TSHg8S{x41S zUq2}Q-;4_?Mn(;8QUO&(w>1-W=Lw+1x>CCNcdJi@g@wO~1VC^&{+cTIa;OhSd{3}4 zfB5S#JZPk(-8?%4e(9$xTd@7&)0>&U_QoZf!17{8&)lIoxPS`RQNaxXH#~VBaVHPR1%P5e@zN_+)aOgkVGlu9&@MdcDa+YC1;tJ3M8HS zbeIYiY8u@Oda{n->Uz`_hex^Mxp!PRTF$jpNPH`+!x+lLNm#Vg7kbi>NZ9s>RrwR2 zIgwgUBnIm#p~Vjd-cLSwj`}c0VUe6?)Svct&iG9!W6ePoIJg#kjlYPFs8D}is7ps`Uxa>`#)V<}v zn95_W>1Ic)mpakyr7;Z1v5=k#d};rV&o;5e1#mSJul_f>`wPT=|9?6u+)z*YabJ`B^B4SpsbKOvY(D&g-&?pQt?lQn?Bpqe&r2@ zh}n7iHldB~Q|-URm^PGR4ed6k&~b_az1R43Qt?NOCFDkN%4_{&+j@5P0-Sab%=R6( zHzh%L%o*OF#TnHr9ftSMvWrGXb0FTFELLlbHHnFcltdun=9B`=E^}}xT)2Q+DsXED zzQSEQsFpth=ed!NYAnTujxZ#c&eK=IKzTmVBLCMG)gt{CiK%PKyzK1Cnm*vn?D62ne1exje#RRHiO z_Z9c9G?asKbF|hLfr*pjnOrHBF;DhCy#Q#DZ#*20tkxVbrBZUH>Y90`qh)eA1}$Lh z{`7sP{#rP2{iFGN1597bM4->3N9yDER9+IewyXT8a+fzC!2NWy_Ii{J*O@cL+3G4f za^~RoU#wLx-(8nYG(rVr*%7wRl;>5{yg+x3(SCxO23#jWKHfv38u3TbmC%AKxMEcF4d0b5KcHw6m-r5wfJ*v|Me1V zmNh6TqAu3`J5lGRjdqkm*K*7swU#FFGkLsRsbT<8jrpBrXIS#r0btpz)){ea54r&=iJ;efke>YUi! z?8ATtKI9FOc@IjEGpYUVRQgh8ZPdqqa0kV{&$FH9M-ccbhLzdJblGbrF*kRoOue-T zCB~7h>fcU=dAv`2Mz3WVQJS&8cuNiRyQY@gau|~8S*7q8QeL0>a%eQqj%i-gmZplm zz}Gfn?|&2J%7lPj-}302b5)sqI$D>x%$DWuzXjJV6+09e#@)G62kD&eyBU$3?uscJ zSPrhnOKfMy|6z#@{{H_Y+(B)N;x!<&c!fVQ+>K`~-I6?|n`EG6E;dMN zU8$GNItmOHa-dW?%cH_&n<|F>lzLrDI|PI~a%O`U7@_ZY~^j`PW0! zHCD_=!aWTe7=58B68?(TIHR4_|3i3{(8-67V@=*}$6pt&bSGD(A=>-82-iycau8Eg zSFUNwWL4p@Vp2m%C$DXx(j*v*_%u!1M3OgQ%)gyQ^@&IXC#2hM0S>=taQI~wIyhI> zHL`G>ko+;DMFr5Wjf?AhD}H%#- zZ_|~1jj$!>? z1(!--&zXPzb>{XdOx*pkA#{Ivv|-XUfs``4O(oUG*>iwOe0>3Wim#a5fPMQ$8k~$D z6Z;q$wJ3&a7q@p*8$(VNa+x)Uot0qk*VF-{I6iV(gRreX82Vc3l5CDX&zkf5D}lA$ulyLs1% zrsV|Z-om3MW#>E-4mI|M0v=^y+Rek3tj5OEx^)9zBd%apEcMOOiy^@8N?mA2;tI;J zu@72qSk7Q&jlM~}NJY+SBJvh2F`7oE-LV5gV>b&e65rSZURA+c?|T@7tpvUXD-D~O zGBet1nss3CL=ea^!BI->evU;d}jRsg!EVki|SNsIa=Rn1K$ zm5q%Tf;yT>B}OMEI`<~>R0*p7v;#h>l+VO;{7AbM+-j7$OY2`;WOV{ow&>yK5Z5Fl z>i@G)%!4qL1Fa(Ke$#(wB*^ralKm+y$BsWjfz-^LHeEV;DmoU^VuP;!Ybimcs(=*U zV;zDy!@x(z(QajEOV^LYnWgsCZkjqR&P0g5HbawB&bgTOp!3^Nw1KDv#s z9cNmRC5Xboa`01*!`DA3ZU3YbjpzNtIrbja?k?rBKnQoh1xt5nr36!R4$gFDGwK(B zmIwtF)d_$DlXk2y`&p4rQ`S&mklmM3ph~9O$pwT(8`&((dtgX{k6W_3(MePJa5jDD zjL=a5yQ-z;ESPk;uYCn{$xlv~I>8RYE1H*2S$XzY()+BY=Js(0Zn;+EBX&$*J{JW5|(?t>2lH3gdz z;?FhP*=YS~ADGLQYE@qKNLF&4v58W@V>yW(I(J>hf9OQj4+0AUff3W_Vc{YpNIy17p8t0~1+cej-5)#&T!6Ke}%( z7gpiEy|JI)dSURSJ?-h>t~0ZI?g)ip{?O(mk?a&FF+2!gTFUkz*xCK?%n^Q8jNbH` zvF11WzE0E`$3~r(&8uC_{_=SFH3Sf_UIA-maRuToops}HQ>$x|4_Haalp~A9*P#v# z#nL>|@1!;Ps>z~y6G9!_IM|~5-Rd>{^4<00FF+lHq~I)`Q8W}l;uA>Itzu^Tu6%0# zD$r?cMiu$Xm4h7vVDbW8*T8nl!o%=~pRL2#G-vX(lARPt_(O;G{rzQZGF^rgUNgZ| zW>xc2n>`AbXwuNyazP~)@$b2-h}o>e?VaU?|Sq_A*Xg-5A}rkbA0T#7zzBrcTH+{(8mYAv+`?B=o+`X_&54)Oa{l zjYPmN13o*>?<^tKoyj`wtXx?+9w=we*DC=dT3L3bVOXd@%zY-$F<{{j)EH0$Uuz7b zi$b&YzKIcI#+(#Tb1MGERN^%30u?$K45>}S6e-n>(rDTW1+4qGd*HihhD+={uvOOn zK!q)_GVUWghz~GXxbgBb=eja0Jbu}B(zBFM(F69dnr>@`2yu+ZUVmv^fKuEHhHLSm;nm^nj z%xQ6IuKt8M4I0o3+^JlaR#Nuez2Lxl0{c-whWw^C3lqt^kh*C4 zIyh2hjFjkRf{MpD$(q4ED!Nc1X&s%=V7ahF-Z^we7N7o`%exdswQ;>xUJd-0${R?J8&ihya!9Y85j_kC_=;{!9Y3;245JvA1iAV_B;vRcx2xH%eNNu{a@)SX%Vs zJ=5%p4~Y3q(*)h$pPG@e$}aFx78Z0t@t~P}A}1&@2&S~Y&EF*cGn98C@H-S$!I1aR#Si4x%Ig3HeC5-bt4d6MUE7;q$fC$QaG_IMxZC1+0A zz}u0N95QW*rx^?nQ%&{a+LVAkc;n;0kZD!`Q*zUZJZIjWi%-T6`{)FU6`ZMQ;qn1i%DSx&P-Lb3N!tLBj zR1$-atYWS(V?YnRuFZbosjT8qWommb0!!`1VP4OMe!qSCQ&jHJ{C=|4q@6{VVtw!D z!HSUz_@as`%Pue>9-UI8hLClxbpbT-*A&krxGPK znL*k7gl#j21;E!v8G|C5w2OJkwweNL30l-blDdT8XNuU36dQ8&J6Bb2cFj!__~fD_ z%VnquE)>!}HWlHJu`#B#v25$*%Hj|613cCW1yTiOkqEk9?%#jS z5txKEflu3MZ&_?CZQQCX+-&2Sb1*kki~+=jd*B&|$-um*0@cV*>`(k_lnoA*4q=@T zcYRLBmVH$5LymUP_ttD6!o?iW>&|M*%biBN+Vq(CT6x5x)tYa(vZ|4YG0FHCBzfk_ zeoeR~+A;AFl<6GS$6)OTG&_9V?Wt~}T5vW=<>P4MiJ*$m_mVp=|U0B)P;Q)!fqCtVNjggi3x!;N5=2nG22J_~)aW60?+;7_Rd zV)?ECnMx9cSoI8#y}Marr_6;mZJ#uMK^EZeqNy9zNPW*+-DOp)zCc~Oo&J*aX?sK4 zWM|$}hU+T-B_kIYQA0En)q-S*?Mf3FR-?R^>%fwvWpZ7)_=u z`rUQVxg*B|%bwZ{s!86Q%%2r8dbK@1l7FE{;bWH?bhqC4VJWdueN*R(b5bE9_^$g` z8-``e!pgJKJ?1_$Yjk72#$?feXx#}4P?^z<~-QnNdUK57>2T#M~-fU^7KF|2!& z6k$Coro0fbog{A*Y2=q>SjPIviMCa=mg|~6eQtF{#~=3>?}qgHE|_MUb3Fz<&LKvY zYp@Xm1qmY;-!Zb=UoD06cJC%wBQRs+C-#Mm5Qj$F;$2Nr9^-~E$ zF@2RWIpJl{PCX+ zesN>05$b7~&M4bN7f7XSdA_ndEo!|!Ff&6YS=6wY$Y?^xhcEX)9awziF^eR(*iM~1 zclp+KzuP=vKMm5s=67FOh5Pd(tGr`B6~|!kMf@@elEq`{&)BRBytWyu{R75j$27)j zilB9?tZLPJD}urxZy6lw9BKKW#r~~f2^(X1WT8*e$U(R%Ch}brJ5&q!o@srM z;euozENt~MS%XT?7vbzMg|rW^hfd$AOu0WEUoBln#Pe{RKyECB#F4Yujbb7D&)1Kb zo}R{g3FWa$nF&WHkFB^0k2KOBsCctawJG6d#~hTexom6})6_K)q%d&CIiDX&9aDw( zYApveBX~(TM;g@*_6Ku1qzLNypmld!CGNx@Bl+C1TGDBzSvec0TwS&}>ozs5T_)}_ z1vO6cXR)$1<}@OZEOMt8%6D5Hrjpax?7;+qMHI;eWJt@y8V`nRViwAyOpc<)1Pz#H zy7bHn*sbD%O=xaCLM&X7;l?~$oA*T{PPLGqNsn2+^>(w|Z6n|c9YcHc*p(@Hh@^^Y zh+|7ck-}Yr&MXjpF{$DwZd_$tN^#;4P{i^4kw!givxjCFq1@p{)2-CsHrEv|?sZ|| z$6S`DO-Ib7=JUM+X}p<8Jm;%g3PBJ8Bztd8%7nBHBA_M6n?nbZ5CfgdwgcI@~hT8V*uy<_oSXDUFyr+ z?TFA8=OiDi*Hp|yAM0quVIp*(NrSaS-K&CLsXC>bm1<;kerhIVN#gY~SX4YaT|j^5 zcO%nE8*cq`KuqEi4So}5&}n2%I9Uk`W2T@!=;E+P87r( zXom1=%R#(9w?&fZeIh z&GnJ8c-^96FWS)$uX;F#j8>Rk#a#7Vb-Lu<7SeX#3iFLPB&SqOHy;6INKN0?4+_7E zp2{7kGI|nHc5MBkDqL=z8uP2X4vALAPX^2*9vpnJh4M6#Ri|oB<*uP{_#NF2sZSf9 zLhsLb?#vgsjmX=)-gs@~p}W^*{BRq~Xuj;YbaW2Wb@JfuemF1ayj7c?uPT9fc+czl z;sHOf4L${%qDx_RBbdXlPbqMd{zU*TN`%xX1rGP)ymPSNyu;1y$6K~v@|s?w^=yqc zG_(7N^9=gE&gA;v6u8qD>JY^x@PsV$t2?Z>{Xr3R3C1#c)t z8FObo%e>qconOW6l+h%OsGSNU%1MenXj+frTBz-S{~rK;{T~3{UHq5ZDC%#3U$>?D zXMk6Q(@G-BDV)k>^9x9*GclFd*udHAw-uAHVas{FN%-;fJnQv1VVywjIF6(`yp^{( zw3t1I<&45^xWHR)LHS|bXk5k&5N&p=X zu&ZmRGm;m0-oAK#US?JRQchu_Uir$8aF6J7i|qXc!W5L#uHtd;jT^1#ggB%()WCG0 zh+v1uD(Q7%U5&{P@@Oj-s8kaO8-w0`|4O9hCK_nREBvuGVs%x`U(Nv@O9xUk>*s*7 zTkz1D7Gj(o!iBcV!2nljc~>k$zCX;R66900Fqt}mQ`*r7MRhwXc?Ge$sl*t(KlcOV z3yRDcEw*N%!t&Cj(PtB3Nuy&kwN^_RJefD_xqKpl zW0?dBd*(*T!A8@*pDOngGj!~pl*S+ja)WSvLBU1SX!h4=zE5IkxcNGChfGRuJ9C5c z_7JHS)~1M8Pn)hszSFb!uSKAKkgdRic}(e!S!Zd{PmOWtjpY=aTdOR~h7e@Qk45c^ z<)pen>nwAtqS*n!?oj}`OUr@s(Xj4b0dQ!w>QruGOQvE=7lMI9OE0jhu zfi&GJ3R%?z|tE;9U zg(cDq-IAl-1+ZW5xpHynJ6xCCrURtU48>Kppv>ugAQE6$fLE19HFg|6*G4xV9mU_+ z0zV&8T%Ne-XeFPEey_;(zc!tH7u5o4x1j$$A-JFH{5iwQPuIT2zh5uGuXkszu`ZnClHJi2dQBW z7^2f9=@zJx$g#UGQQu1k~O>it)ISo)y z)R-oda{t{h;FcUA9fl~uHGvr3=z4&|@ql^RG$e4tntflQQmFX({eYB4*X%~(Ew-kf z&r$swV>xKWg9PKdityWqAC}JDTYldiG!FE6&FiPGs%}m&+L28Y7#$ug&*&>vF@hQ) zA+=O_K*18W17)*N`>h#4{Do`q>edb!81$XQ#~eNr+2jt0IHm8GHIABOfWO6G8$>l_ z%WG^bCxKTbMDpvY8cSZLuAqu3i72n-W9ytIF`9Y>`d*dy3E}<)DW-b5^dtAr2a zrJ?L(rmc{%`GR5nM;@G?2-91S5$Q-khn+3}INn}pJvaBb+`vnM@c!_5^XXo(=& zR8>`V!tUmJFIqXIMel*6^t-CQ!U|kr6)s!qse3}Bq&s)pne5#Y)++=V0a`%mp&JlNwL1-`O?JMoT+}p`tc6> zE6>^_i5)dW{XyUQqJRAQi_qs+G)L_75u)Ju1M;|3GGo8dUGQ8h;eK)oSisgKwYXAJ z^{QA_K|y7N?zRAqSI^iu@N+os5Wm46wnx+)TrH*a`M<;ICK}>@-A4>Y@A0C~woW2- z(|XeVTS|XIfuF8{t&O_y@w^71h+*KpZRZ79Jb9qty^?l{_F!RZfv`|j<5 zVa1>sjbcl4QsTkE+jj?9im@}waNry0`;EgcS}A>T$tyFedBka|0GG??A9fhkU9R!V zp?t{UP!Y*0M6Qp4N>AAwFC+`{&Ll(T=9nrBk{?#C{q$_bX|cyIZi|bYcfGXTD`<(V zzEw|aB!6?ZlwQ-mJcfmA$jn-0CTepacGAG$;?5~?_2VTq?T#}1>x=)&CMh2GcI(mt zUggl}TYg7ip73cH-u)jikK=@8$bEEy{#zG-h`eUVx>{7K zcUZ*u$CqP(D>J=qU?DX3EWSfH!o|psm$$r= zOlD}YbwYUp?5bK4IQ3o}mF?X)EyWf8z}_Zedb&w&7vSN9h<)57{|wqFc!zafRciNL z7<#b*Z{c;xK@8EdqKuLq8H=5{x4g+^Dn4muoPM{X{VHpWsAw3V^PL~o#(1Y15h4w8 zYe}$`%?IFX>pbVUFBbe(4(+|3m!DsdJoh@`?mAaq+*|I3ENvdaT1PaW_tJhZQ?u)T z=A>RU#lDuGuv6eKBddv~_UXW0%v2)LJrOw*s3nP9E?Rw#BuRBNi5w@2ngs_;ji^CiE5Gv%z#M2I=e3T&EO^VfBBdz<^rx`qKX;Z2P59;l_f|&MLgtEMNb@#}KlsyN@Qz0_SPG3| z-JZ^$p0WuHv1U%n*(9hTer)(6MC!>WeV~s=?HZs5*7QSaPGLMI%xB>8#wVUOMOy zhroeq_!q)Wd3K!@@$_Mc&&8F9ZwdcK+q04?`s($CMy>5F#Exf7^No<7HF*^5Qdkl5gUXO4!dGu>lE}T; z`ZnY=TZLcXk}#C)pxf}TbI@s@Z#{D_XkSn?pBz2IE?%Bq)+JxYHMinC@8a$zJdak^ z(=;DP7cxOc-M%gWtGQb!YmF~Mwq@G@UYbxToDj=w2k?Zd&V7g@u}8(`=QK-zB1REg zBJSv?Ku!(LB^Ve-28X8}%xIZylO6fJ_nN!Uj%101Sji&kmCfD;z>xcvn+@%Yni$Sl8iQ7J5NJrtL&U|8v$8bwVK zu%M~4LpU&3m!2*0Ee2Z*$QK1cOLI{9XeXX?T&mqrvRy(CTr3$YpS2lGr_sCY)8cn# zF$@(U#w9LR;DmY8w?wVNxs3;E^-QIqh<49imp7dOfr zs;n5kz$Ih2(Tze2vwYLM5BCW4eD=XR1(t07#)|i>@8N77`f{fE*h=+M;+Z16;duco z90o8Nm6h6x?i`RokXOZnPSGjl3OLgrEQYPv$ja_GXMFuZ=H(slA?9w0VGI6Mf;I` zN9a01vHUFb{Z~9kAA>Uhq;Fx zdAt%WHI(G$$L+)qW}RYrO&^tfzawe<(baxd{DVfaB9KS-{6-U1mVuiW!V!}ye#c&? z1~_hF;A8p|eC9CAxkIyIvJxZw!RDA_?pkhTq24~|@1AS+$Lc$zGsH1Te z+1ta7*1dq~5l=zRy=h;iF{7OV}PDBdjYJ0!?)@+-=r<*D3-76rEaDjPW{OY7` zZ`RFltcUa;te>Q{x=@3y+iE6t*RG)_2|ogC^lDot=AOz56#a1T(FmN+9yJGd=e^P@ z-C4b7()Nps#D=C@_e$8a{c~vRx#ji7|6K`<0(7HaB{Ywl%^>UZee4$=*7vf-`optF zty?|4uQr&1?3?)=I<{USsYIv>S&RaD_Xoa;sYst>lGq#i+q|QD<$F~WeyQhxuDuUz*MQ3eD+66 z`2swZN+5KCMW}^AFx4k-jF=@IA8JYoLnYk2`z#v|4+wN55W}Xs;~u<=Bh5P&-utug zq4&Cv54~?rT3>LxPTc%g=I0Z08|x&2sOOS+p&QrnHo6fYP%bT|!XS~}v6P({(#XMG z8A%YIo8^b~P2d?fA#Qc~ytJcYv0RcqfB36DNz8Lbeq{9zes0M9Gk#W`pYQ-+B@OvB zo61#4zg8XnTiHf&_Dz;j{=vei#{S8?(!Z4IF~xs@Wn@s;pKk^Wmb3fw_gqT<&KbvI zd4Ar(d!Bh2lEZn~d71O%kaz!U+h3cQgNIw|;<4{re{T!1&zx~8E^_91!&1G-ZPW6R z`OWjK@50mu-L?L@Uf^}GvRlGW0QCGxfiuM5Eo0Bs6>uvOl99x9Pz*NSakR1Bm0_>~ z=-VEym>a{dxR@#^TW@S)4o`FZEcQBMhM<^BL?QhrEca+WlGayK^m{oU$lY$ErbMP3qJuZfw_hS5=FybhV-oW z&$m~0b24v4`bPYa}$#V>;y186Id9TOb`H%ZYh@}7P0Sa0Tgxv8nC$-qJbnNZ z6y&Y*6hDnO!Oy4%0o)pNsY=EFk)O5D4tS+cdv;~~T(}d#i{qq7Dk4aQDGcbPf4869 zb~MBIJa|NGc>YyT+BDR`K`crSI-Z_RTY(`;`esGTqdW{H_6~_MQ|Lbt%kqzcjQLf= zTxE8vq>pyk2T1D04N7+(JuRW1*N0Y9rCv~R@bA9of4)9XJsOwkJ2?R?ewAVVra4;V z-<;@GzA-lgG)R{EI)gbSW2dux*mt%h1Yi$U^ozU?C@v3b?8=p0*5);ivCkQHxeSmW zSkligm-Pd(J6qqK$%3j>&>Fm|O*xIk5TctjrRkxPEa{~Zgns4Yv=ZngA3_*zAks>= z=W)6;-JwR@L!KG?=p8Pgc7+0-63mFEC{-ldYeT)&6wSa_ggbhq8c32Cp2;ewvc`5H z01{XcVKjzU>d}sorGJdEjt*Q{Flu$$QJ7Jti|q}KfStnbAp9!V79DsM$_2c2=DbYl z$7GCm=__NfAr?~DP&qeiNk7arKpAMz5FFC>E$D0q4Qn>h!=DJ;n2)_RYRNu|(bTM? zLNj*U>XfV>rldhA{u~KYdm*k-ThgQ#XgJ_7&Egzq0Vuhk96LdvbcB(_Fy5J0WhI&t( zdeg=9K?gkaBNdE*P0vo*)~qU_)#3Z8sEX@49&6q=oe6XWwrZI6o8)sj?6Z@v*w zz?Kvut?V$VY_oO`*C)M^|KBPBq8JF0DtE-;E+rF6Gt{(^i*LQjSt!X*7%GSv_G#p) zcdEwFMKNMJ{UqRHEZj<7R+DCDB8-w|yJ`wMLfu4xY{Qw*u@$gWsTpm@`fob-|^GA3~EsJHSbKfW^F7a z0!i`_*TdeKQ-TeSQERqwV=Zv})~86_$kLo6*dE%N-As^IRaq)K5#rI$P-$TqaBShU zQxGMe7XH?MEZ>oIgp*`sjAqdIlVa62j!6gf_46Z8*R9kBM2X!GAp?J*QpJJBSI|=+LEH!1!Zlw!~Wc<7(((Nw6B+iwtt%_{tC8ycZZ-vNh-wv*e)2s?0U=r}8htcPX5 zgOlZ)DZWjh%Qz+o(lNmcR1+${1U}~oL^TOnMbK1V0@Zwr^@SGYP2eRWc3o+7sfb|N zX65sVZRGq|X1)V^YUe$)?&REN_{b0nJa7RWi!&3wi2z`r>0=WQrgJb}bTk(@(Dbcm z4eE~u9Gek|Xlh>jAKX|JH^2>Xd%>vp_6Fc3n3C+z%T4AMhksXP2Te5#1H^x{*fPui zLNB>I_E&p(Y2%F0AsTR}t*z@v z2n+MH2mYc=GWjzP(UX5tX&B8$E+lMyIr7rLB1h6>E_Og3T$Eg8=JUAbusH6UxXnc- zanv{z8MsW=&~M8-YK-h#u~63z^(xgGXB-yHF9T1KUqp)o9ytEwRh?Q z`g@tL0z=wH*z*K~`=tA|B=KQe4n)^ELZP(N?;tc0z&lPZ<5sN=^~H%%@+#W|(h=CL z;qw6K?UG$A1lg~F1_Q-S@pdVKQJXoks`ja9iQhKt4;iBzMF_E)=vXY2ob_<>Ohh+H zOjikj=V7qdIpU@WTgR!8edROaE~4?*2RUOk#Y~Ul6F-&$Y-WYtns$$bG5B!RpFLZg{pdjGJRoK{Mo(pK zAlHXsqo=HZCm9To*|eO^wO|fOz7KV#y|&62Eeb!2@>t7rGG z-S0Wvx!7EZYJ!VAC~gq_~9rPQ#f z#=w>|TF>%XBq_r_i*;=03P)J=R)dB@{kaS8h%yV9G0sik-17Z>W(+IEjQI9+L6|6~ zz((~_(#A!rMxA;Bjjn~HN)e|R5D&_2j1FCwv66+=qlv|JMHGE1;%MN>73R!C*|*`? z$F)9^%yUIqKa1DcjO9rfl}VI3lC!GcW16H%Abx?|O5tx^J)~&&&XdWswFW)A!*9Q1 zOIC;8o>zQY_|>V-T&+o3Z%JI&Zbrq?)>f=b!IH^Yq*=?_ZXe^uKl#zsd8CaF8d`w3 z)v^KX8ajsStB5&BC&P!(I4tvm;f5nZ;4Jj2%h z;vVP^7|_n1%bu&9i^zE|PPfU25fxcr02@2caX}Mv8wiaY^36{P+uSYNBW$V%lg&m_w6n*r<;%3UsL^kTi`DVCM{FFb zjM=kECnM`8P-k6{AzTU{3!oXC4NGGE6%B(+%+ZvNM+wIkRObeXm>c+7o?73x=vLIrdZ9VnC53)en1Ve*cBD z5aJ2V2^5qpKnf}nS;hbsu-tIL<~`^!#f75m+8Ol!V)}GJ!B_(k$pZFzCU0Wt{prBJ zH?u^dDD>IL_-73uPBo9c8{ncmilBB3sO;P_vG+#Y`m7NNTSnuRr;CAfPI5Xu-P5fP zV?p7MLS)_$nz$+N)4T;?d!W=qKn)r3nfY3HS~pQvO}2Q-9PtvN2}6}I>sV&Wh6gLO zB3hc=Z1=tNUiZx4e~PxjgJAvvY9GqR&HpRgrhxr>w#^9uZh(043(eOETlqvH%U2=h z^9FmsoVj=t-CMqg6MfF6C;PuQSB<+RUz@804SxNHhpMPPzq9RG+KrU+u+v)FU!jxX zbCR(}H$7%r=;k6{Gt@PI;(!5Kk^3`&Iy}{fkHiWJYe0A%z6~1tqZhKM&%J$1+i~Ob z@-}{e1C>EP<%l$!A^T(Lh7@qz*~?lG`jd@!L(S(9#g%ci+;m9c)JY)FHVar znp$|ah`#??qQ8p^e(bxd%O60K1ZrZcwMPH9jGKpp5u>Ev%NzwUkUGMsAXZg8FQfJg z)h|C?yJ}gJjLV;y>#-gmy|c#&Ou(4i$E`Ih)WX3&mf{~wBLA_C1g3+i3FXabB$J+s zN)Pf4Ma$F^s&+1Zoq?3-Rr~ne7eC9J{Kq^xbeQqhOK$@p_&(1Mi~5b8cAn;{EvBYcIV5!PKk@)cu|ZBE^M|kYB#X zOcD8RaOi52uxj67+33qiumvCgASQ6&k=S z(aylcg68q_SY=7uoBXvLeZ8`-t5?SWct+&5S~qA|h9RUpVe04&15nsd6JCptpGwy^ zVS^%rp8LJbI%IJZvx%)8{GU~mEw#3 zW@@`5?=yOqVK>R83-`r~FkF^ld{D$#*35_r|CM>1Ma@b|@OT?|$Aa(CAjMy3Bk)n4}9 zwCr{JAvOBrnQs%n` zoHV8c$60-@FXjvltxY#~0$RC2!{eSeH}||*ZZ8ijX>K0`0cn8WKVW{*0NzPQS7^0< zx9HUKQttS#w({V!v1pW?S<&!Cdoyw!(Mhx*i<9=^<@!jZeR3gnWKyx0znaG4_TsX0 zF<2)%k=vgFY1`2pJ*V2{I2JM-z9P_g-vr8W>M`id)j~Nk88UNvhu)^m?FYU=F|^ei zu{^@@gR#mMlpr+%XP>Z07Ugk%mqsn<&`wfcGq2;*Z$Ohf&=>u^tQp79nRx~)8AYSr z#5IR}esR066X#PG1{bXNGbTT*H_TBMWK0Qs*-2Qg&(BthnEq(i>J@i`!rkO&(wFKN zkX+7z=LE4o%CnqQ0||FdYXepjYnh$hd&-bY)i(?2CQtQmnYR1(Hun6hd>HxRDSFN$ zSXu?jx^}@;2TxR^oDrpdns6+^m6A~u*7Ruv+pr!Gn!QvAAo$%fpu;r6#A9qH21*w$ zY(Ujg$ESsV4Ps9tDtDZybQr!1+!q_$i6iW9U4YH;VPj%M9+ZAgVLHK|_B2Y|Ov9=W zs5-dz79Uc&wL_&!`4tWqG*|~js#F^@?bFi_r;Vl@aHx3HOFIa>v#y9wzN=R4Iw?D1 z?*Wq%gBOzm1qEeL76Dfr+Y1hV!tc2Dzrt^e(7(d(GvSrBO>hN8Lc!PTiynzZE$K*Y z0wouknkr5|XIykDH_l@V8=O zA46GobCIlX8!>I27JpPyMyukSWwWFQFwW0vMka}cW_F&J1N()TJ%;V;?3#wozq+S` zdqB3X<-q#)Y`q7MuZr(41fRD0HwZ2TZHH+RHyGvVdoFnKyiP%{JqItQ{|u%mk3EEip+8wgt|N=%IrOH~!L}_sECc`Pb~6dN3Q-`8-;uGd%Oh? zjw$7}WqJfdIDK^Rx#+0nq0EvXiOljx2drEPdqxDx_Aup$^)G-Z)qCCo4XeKE^MZuD zZDUySKySg1rmHQIiE2Cru;+sH`y=Fo1v5#ic^qL!lgi<^6(;rb(Epy+8|v+u3LCev z>h=(ON4d$yM}4x#Ayjs}#aEkz2)WPSB=VhF2Nbou%doZHUWYWXhfvOaNsf~NHJSox zaHkyGyp+E56QRU5^tk=n&(ALf4OD>9scq8$mkBrFZa%ELV$K}&nnWHns#Wq76IC3x z$;TV9*FOrwQ`3j-+Bu8Cr_B6}35_f1{sMYmO z@#jl?dqY*Azs-)fb>*c@gR9FHG@8EO*|2i(3L8GKn5Dn$va`lfqjjpqLw4gEki07@ z4MrKQO~)QJ!AU1;oK#_UP)GSNz}*m&;i?sLHs6W_fmFw=Ja8V3yTp5M+K`E8JBk_X zUb%p%YxhVNa+8pNLkm`F*o;B^AFXpJ2KFM6NIHHlp6rThH#UEi%!A+Cn*T4H|M_)X z!EcMjBuWwHI+k>>L>I@unv4&3Y8Fd5+*ra|yh5SwE8Xj~fI3O7pzu;o;g%Zp;Hz?gYS&G0Pbk zu2iB6zRs_;d0?DGJASWoC$Pu{274+67kF@h?)zVw+ak{exV0aV{(|;iwEat9j69pm z@I_X=*A@}*i?GqOa-LnfjjUq_&%_B%IPbSb9#)2JJz$%R?QvO(PU!KVLA*&^NIOCNBx8!v0M?P@^jFzc9$baFCM@1=jA8R4)HLfi><4ZNH4ByL0;r;=r~2x zt?S+W;>KIgiHh@Wi#y~R2{r5O{fd;tf4gO<)C|nKW7;$N#t#%#Z7EqN5nPX=M#Jx> zTg`R~oZs!edEl#*BODo1f&%17RM8Q_2cnLClc)~slnS~ZN#&0rGKf4jj1WQ!N;!Pm z68c)Ff#qlXTl!jB>b*svlJ0#;ddK>)eCcy#tmuAOC2Or%Gj5>l8go z?b`LJxWHI!p(XBAfRtt$U0uiwaO03F{0lQr3j;F=idW6Ch%Aabc+YEfS5 z&B8f7TQ8GjGG>ibSP}*sQ=vQBXK%HxJ{;tajaP~5rTj4Xky(f!W2CvQ$NWXUgj@w3 z3Dnb860K)v%YS+c_&q*87uFrjpfrinuZcFdGlUIFmD-=VG|9Iz33a z^74F>aEq`FxP89pxCKx@?I*dl>|^-?;FlC>V;DQG;qzKn=DHie0mA^sZ?@UyiOKW^ znkeasqZWknq~)ZBG3u@7sFymr`^*xyY8j+B&C;Qq*Gl)LUWK^5PyJ6yr_j3=I&`1iJIXqassU5`*J z>n^HO-~UQ<6Q~trm*1UHRnS@8Kn59frP~sph?u(M=8PK{}n@^Lt zq4>2y-`q>>&XAGAlrdj$nm%rvug)O)jMD$$1Kd2yl%PsS7qT1laBC54qF})kii}ly zgw|!rgPB89VH?!@u^8nQCRlvRSt%V+NBKj}tlUJ7_DW;uQ41EDNSltgOZLSx(Fb0P zF_{%@oD;W4)6kg!P`kDlIH`H^!A>!}cHaGw!8~!p!lYyP|@aOl;T^aW8 zU@$I5Ou_>D*y?=Y$NNylt7~ZJkN14)|Hf@kRC68g>6mxj2hL;NAe2RO9Q3AbCXh57|MIZI#n7uC(U%(SGYPMvZsgOCHt2k;+Xe%{6+?s=$5m=UzM*TWW2 z#bo%|V|J+zuV;CsS?m!iPCB5NxF__W)XvI)UX^>{ie{uugXd7bKdE8tFdfuhubtkg z0do>(P1dG1FwFTnDVG74frAdo~F8T@$k7*{kiDn91pr{@0Rd? z;!J@I)99o`ju9yFL_rATUzfW3t^?D?6ld8};=8B&h)(ylz-P-6_-y^B@+jN?SRU=_ zDaZmE$guUJtHnv$N43uduBJ^}KNR>^od-4I5^k)4MH~X`;KkB%e`InOChr3)BGm2q zB5&PeTj|ckXrl{=gbl%Y-U=*xzBFU~+83Oi9j;2l4UZ$A@wygGtTipN?U0_RN738@ z3JyIyJr2CUY`}wpo7C@aXzI*SF;2VCzpFcB<#i|eq#Mv%^vTkMyCC*86Mr$G7P#SK z!^CnE3s{Q>tBKKS_b5sMCNRnK3<<_3c<5_>uT_w>oi^*ex;<)~|BrQt=TQgIRs`S! z24CZY`D>?aE3BtMv!HUch%$%b3jyt=rYQc8-5^Aw2nzhG)S~)0`xNd*+c?kdo-yd;ixlcMX<*bZH4D_!BD2Zn7x zVZqY|jjhEC`smf$d?)sB( zB~D3WFf$(G)es({V8MPFy^3rj9?x6D^*)Q#*HAtSD{Ef~hwdFX;pS-N$)eAk02pcU zJ#W^Ai9J+b7U}C&aZmLhnK`Xh%qv)##xvh6==SyZXr2JHzvioV)AK?j;?(uMXgOx<1wbu?a*?;IC>`L60 zs4>2W`F`bYoAtgO`|&vu2lo+A_vtKwU0zuQY*u*qk8*P{2i89^xN^T)zHn`EnE<*4 zu(klBF}^168{ly3#k#k!K<~1yn_ro)iHYd@j!Cq%CsSv5I*do+h}(P840i*^s}AT1 z$A8K3dP*TRM{9cF&_x`MVZU9^O#9PE&&wIlw6HJ;k1 z*01i4lQZuir$x)D%B%4{_0mr|rCt8v*hol?n8s`zctrbMj(BbQOtsuAbQ`r*2YpEG z-G_Ht?X@^PRk(W>dVP({|8J;*Qu?JuKunnc8YsN>yv#UNO$5+fcg97@YRaeF&>G78 zh2h~^IYn%Fn%u0xWQgnedu!~6EAMGnxp-sto0qz|T{Y|FoQys~Zv_sbU^lspPQGio zyw9S07b0VoIU7pGp3{E)@1mq}2)iQhN-i#FA+!+_w5cFW06HE-ZzgOGidHAC)?%yWWWlv&M!^kZg z+s)N7au9>+DGhnv05Z1llVDB}4mfeezKz}Gcgd}rpzrLEC0VL~i0;OiOKMpnYZ4H- zY*wz3h);aYur}qnp5gpnf(&|YZ@ose+-ySR;{Aw3Y$}rKrR9W?>5fWDLW;%+A-Eo0 z%YVOKWmQT1-j<9KbEQcOdLoN|Fr2?%IVP`bZb2i^UQaeoN+29Zp=E2mNT!aoio25T zi+|i!sv)>;1g?4n+*HWtC$gVctChTu-mfi$xT8oX`D`mZRe)M!- zIbd~PdGc&8$2VgLt|yFumhGU>HleRYI2<@#a6*b=wJylPi1?*+BYHeGe-?ft1)Nz3Z8(Wp-pWgJd*QUOM< z;(=P}11b%*C`L)vWNf3l2-;Z5JAM;&l4*5YH>I8G?^ek?oaj-&ihv9Ij|sx*lnJYg za|j$G>AsSxSJNLWt&`NB*+=%LKNfp#72JcCWJE-N+!r+JiHO`qes54O=^M-bQCdk6 zqwfcma8(t5+;u`EinbICjptA)AYeU-ZX=u;P>JX7qFHt6+jSF64 z70anP*@3_YnH9;t%a-V6$2$F`DpLo?i0d-c$%~e-N%r1yUWkEM#&L^H5$VYi;$f#| zzaP?a1DZj$$FNs1t-ua%U#r9OXA_syds-G8v{avHzH@IP4E_FH6kL=aH1wS&9FtiZ zl2_53qR0}qXhc-F{r1X83qP$S~p%df72I3SB-T5x~540o4*BqVfI?6 z{2bOl`;E6oEs1PA4i9NOIw!#reRV%S0cT1CmzKMYin2;LsVjUg z*;Kgov`{tOK_O=AlzDs?M}2|IQ9|5>yKYT@@2HV-miFpTw&Iy)964J6*zivKI`d)+ z*u$^M64F|N-)$==%Ki30tH+3YA7e|vD9POXj`{@6xW&LR#Oe~6pAgZa9V8| zSiZIoQkdx98wn1U%h&mA%-B1jir?gmJX;;IF4JvfLD-Fxjqh?nby*qS#}+py^a`SE zUkD4$W$Ni@ZC90`hxT*|ek04Iwk~_azrq2Pr}9`&U`XWBqK{wSVb>8Pf{TdCTBOk}*e=!S=-<)e!t{Jd&c`=@FP- z!nP>luYLMk>g2gLT{t30@dStlr@{0veLwrSso$mDd67Y*U2;D33xpbcryMat zgTM}OJ~&tL*9%k9wC5$DNJ>8p4z+qW(}t$K%UrdnE|!iRhu#9q+vcFDMbtym=K9@O z2y6R#<;Lio?I2j+;lzpdu*RZsaAW5q#e&zZz`+ydKQ2UauJG-LETlL}64V&hRKg%Uy1758t zu}$bUSeHg6Lx$nwQN}U*U#p`pR~_G;5t2JqT*=_M_?M7&J15oZr$+W|=2NT_ezK2A zmQ13;3B*PB&Wt$J@~0GAVOI8X-;ZtAoJ?)@c{I32OS70V=tEUfccAM#pQWSoZJHL= zE$}nSy)97FgkT$;6e3MifPeT*_+&uvo`~Nk4XIKL%b}M>S6y(ZL^^4HoQn2cZ>>Ef zIT=0NO+o%I>%yV{|H0~;(Nblu0VnIL)Qs6Jf9`pf5_N2f{Fn$s>stNh5F9HQNs*N{I3axI-Z*b=+MzrUdU+n3a#qVBfIY zQHK&!A1MEx-k7Eb`7=hFh%eN#7ficTna7R;J1pla;4{Oi=3F0Geu<&#<-fs@nY6BU zmX-e{5`@+6(M1eF^GDd3OUNC3!E}N>U2pDYjlLZuGIP1vjgX#-9aZVgRrV1)&b}Q? zNb;e9Po0{NMRF1aejO&RxneVpDt-Ahm_ytC+EuKyf9m+N6)yo|YEdiVo%Pzs7z`)m z45s0?vcFF0BV#Um`!uWFH@;bt7$z$(7vS21OpamiM?47&9p0HT9aeEaZPA|hlj7;y znGg1V%eweEF(>r^(9V_ch!dshWoZL$T zTyO_;l{Y=2>Yg)(EsxXG2nn0_zFC`M(cSAk7=ur=Q;Y0QM*XskHV(m?7Mh`u5Z-(h z8EP8#p=vN=b$*i1`?^QXdOlsk=jWsE@OMCUCd1?!F5x)yXeYC0G!Vm3ZhjTJA0U11 zl*l;(qN{;k!&h}C-exfV$MNnyf}O)k!TI?l$;rte9X+y7A0Qz*mbx8h;<7e>SXv$z zaQO&=wzo;@Etd@3+?t>6qhHScWtOzaz#iT_90aM9 zh)6~gALHXv>v)|Hvxdy1%9u{!dL6 zH<)$B9XYT|e!C6npSLRJ?4MFeKeb&pWmuslv029cFuA{!d-P<}(*&}C`;dKPaWp~Wyfj;8q?Ewy zex%F<7Z|~(l==EP26S7C9+-gl!%}nH?EClZ#>PgBV#C8f-z^<&ue=aZ&b4o2q>`9- zPo9oXoG->jZ8*}d;+`*To(i1Y16Ev2Vuqg-<~LSs&cZ#L1wy#iAGox6Z}Bq93jZ*z z@c}F8bK^hwe1{JS&pO1=>>vJ6zu6kzM%UnRgC$YlKC;$Ua>PumEEmBVxp6sSqRr!qWXbJDUpeet?UM$jMnHNJci@1CG}P4muRYV&q#; zw~Wvf4}O{!_}b3=y}C)%l>d2#yyU^HZ|#C933&*2!YmPRV+4C`?c-M;8y`iG`K+R1 zXHD@21nh}adO$Xkqu_GVF=k((I1)kOfSLw^8k$wGq;d>MDK0Dw>gjg^oq3*PuTXe; z-9+$wYvhaXXMC(2{re}*;%VL;>tYY1a-x>lew9zamPudp(qao)33#-MiqK9noJ)UZ zVxfCiLcTSMo{M`AKHB>j(4WUhrZa(jk#0zxP?hXE7WuS!l*b!u;;Bp^S4Y@if+7I# zZ!We2n~3%q-BLE~LL>UU&y9kaN}PgvJ+^I}?Es|_us!vhz@r2r77c6qA*}6eaYXBo z#I&fab32rL|B$(aOj5SRVm$+;v{HR=ZvQp~H4oG@_c8dS>YirS%F?ZtA;VDV7Blfa zgPM069d6#!GkM!8o(TT^(K(f8_Qf$?A1PW?t}xFU+aT2-m+QP(HHcJs@b3iV2}>*7 zE^4x4KFw!pon`Eu2S+8I~greZ-Tn;&y(yzhYYz%d5e{PbH@^P

xS>58? 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 Tnd(R006*fwGD2kndOrUHYmbv< literal 0 HcmV?d00001