From 01c60172f524d3694258d0a3fce357803e54f705 Mon Sep 17 00:00:00 2001 From: FBerthelot Date: Sun, 26 May 2019 22:21:13 +0200 Subject: [PATCH] :pencil: philosophy documentation --- website/docs/concept.md | 18 +- website/docs/philosophy.md | 219 ++++++++++++++++++++- website/i18n/en.json | 3 + website/pages/en/index.js | 1 - website/static/img/component_draw.io.xml | 1 + website/static/img/component_event.png | Bin 0 -> 14679 bytes website/static/img/component_externals.png | Bin 0 -> 16166 bytes website/static/img/component_props.gif | Bin 0 -> 13244 bytes website/static/img/component_state.gif | Bin 0 -> 22298 bytes website/static/img/component_view.gif | Bin 0 -> 8753 bytes 10 files changed, 224 insertions(+), 18 deletions(-) create mode 100644 website/static/img/component_draw.io.xml create mode 100644 website/static/img/component_event.png create mode 100644 website/static/img/component_externals.png create mode 100644 website/static/img/component_props.gif create mode 100644 website/static/img/component_state.gif create mode 100644 website/static/img/component_view.gif diff --git a/website/docs/concept.md b/website/docs/concept.md index 1fc1c9f..341f511 100644 --- a/website/docs/concept.md +++ b/website/docs/concept.md @@ -2,14 +2,18 @@ title: Documentation --- -## Main concept of testing component +Component-test-utils is an opinionated test framework. -Unit testing component can be hard. +## Why should you use it ? -First thing to do is to understand what a component is. +It mocks your favorite framework in a way that allows to write sustainable and functional oriented tests of your components. -// TODO illustration of a component. +As component-test-utils consider component as a black box, you won't be able to directly access to the state of your components. +It will force you to make assertion on the generated view. -When testing a component consider to expect change when changing parameter. -Component internal state never have to be accessed directly, you must always do check on HTML. -When you want test internal state, you only want to test the behavior of the component, so let's trigger some events on the interface ! +## My Favorite framework is supported ? + +- _React_: Yes ! +- ... more is coming + +That's all at the moment. If you want your framework in this list consider contributing to this project [on github](https://github.com/FBerthelot/component-test-utils) :) diff --git a/website/docs/philosophy.md b/website/docs/philosophy.md index 22de9ca..b3f98a4 100644 --- a/website/docs/philosophy.md +++ b/website/docs/philosophy.md @@ -2,20 +2,219 @@ title: Philosophy about component testing --- -## How to test component ? +## Philosophy of testing -Before answer to this question, we need to answer to the question: "what is a component ?". +Before introducing the way you can test your front-end application, we need to share the same definitions. -A component is a Custom HTML Component that produce a view (aka. a piece of others HTML Component). -To produce the view Component take properties and his internal state. +## Types of tests -To sum up, a component is like a JavaScript function that take two arguments, the state and the props. +Component-test-utils assumes these approximative definitions well-fitted for component testing: -It's ineffective to try change the state of the component manually in test. - -## What is the kind of test I can do with component-test-utils ? +- _Unit Test_: Test that stay in memory. (No access to: HTTP, File System, ...) +- _Integration test_: Test that can access to other things than memory (Network, I/O). +- _End to End test_: It's basically an integration test with a special rule. No Mock or Stub allowed. You can do both unit and integration test with component test-utils. -The only test type you cannot do is end-to-end testing because component-test-util rely on some mocking solution. +The only test type you cannot do is end-to-end testing because component-test-utils is basically a mock of your favorite framework. + +### Component take props as input + +No matter the JavaScript framework (Vanilla, Vue.js, Angular, React, ...) you use, they share some common vision of what a component should be. + +A component is a Custom HTML element that produces a view (aka. a piece of others Component and HTML elements). + +![Component that generate view](/img/component_view.gif) + +This component can receive parameters just like a function. Usually those parameters are called properties or props. + +![Component that generate view according props](/img/component_props.gif) + +Those props can produce a different view according to the props value. + +As the render only depends on the props, no matter the framework you use, the easiest is to write tests to assert the view is rendered according to the props you give. + +This can easily be achieved with component-test-utils. For example, if you consider testing a like button: + +```js +describe('like button component', () => { + it('should render a button with "1 like" when props give 1 like', () => { + const component = shallow(Component, {props: {nbLikes: 1}}); + + expect(component.html()).toContain('1 like'); + }); + + it('should render a button with "2 likes" when props give 2 likes', () => { + const component = shallow(Component, {props: {nbLikes: 2}}); + + expect(component.html()).toContain('2 likes'); + }); +}); +``` + +### Statefull component + +Unfortunately, components can sometimes be a bit more complex. For example when they have their own state. +Considering the previous example, imagine the like button has different styles depending on whether or not the user have liked the content related. + +As component-test-utils consider component as a black box, you cannot modify or access its internal state. + +Instead, you have to trigger an event from the view itself ! + +![Statefull component](/img/component_state.gif) + +For example, if you want to test the different styles of your like button : + +```javascript +describe('like button style', () => { + it('should set button to notLiked by default', () => { + const component = shallow(Component, {props: {nbLikes: 1}}); + + component.querySelector('button').dispatchEvent('click'); + + expect(component.html().querySelector('button').props.class).not.toContain( + 'liked' + ); + }); + + it('should set button to liked when clicking on the button', () => { + const component = shallow(Component, {props: {nbLikes: 1}}); + + component.querySelector('button').dispatchEvent('click'); + + expect(component.html().querySelector('button').props.class).toContain( + 'liked' + ); + }); +}); +``` + +### Component, event output + +**Important: React being the only rendering library supported for now, these features are not implemented yet as they're not needed in react** + +Given the component sometimes need to talk with parent component, frameworks use event to achieved that. + +![Component that emit event](/img/component_event.png) + +To ensure your component emit the good event, you can give spies to components and ensure they are called. + +```javascript +describe('like button - onLike event', () => { + it('should emit onClick Event', () => { + const spy = createSpy(); + // const spy = jest.fn(); using jest + const component = shallow(Component, {events: {onLike}}); + + component.querySelector('button').dispatchEvent('click'); + + expect(spy).toHaveBeenCalled(); + }); +}); +``` + +### Component with multiple props + +**Important: React being the only rendering library supported for now, these features are not implemented yet as they're not needed in react** + +For example, Angular component can inject services in the constructor of the components. + +To inject services, mixins, etc, an external key to shallow configuration object is available. The content of externals object is specific to the framework you are testing. It give you the opportunity to provide some non-standardized data to a component. + +This part is the only framework specific thing you will have to learn for testing with component-test-utils ! + +![Component with externals](/img/component_externals.png) + +An example : + +```javascript +describe('user component', () => { + it('should display the user got from the service', () => { + const component = shallow(Component, { + externals: { + userService: { + getUser: () => Promise.resolve({name: 'component-test-utils'}) + } + } + }); + + expect(component).toContain('component-test-utils'); + }); +}); +``` + +### Mocking strategies + +Component doesn't only generate HTML element, they can have sub-components in their view. For this kind of "parent" component, this is the main question the developer should ask: "should I mock this child component ?". + +For this use case, Component-test-utils has two ways to create a component in a test environment: + +- _White list_: Every sub-component is mocked, you can give a list a component that won't be mocked and give their mock. +- _Black list_: No sub-component is mocked, you can specify which component should be mocked. + +Given these components: + +```javascript +const postListRender = (posts) => ` +
+ ${posts.map(postData => ``)} + +
+`; + +const postRender = (post) => ` +
+

${post.title}

+

${post.content}

+
+`; +``` + +#### white list (default) + +```javascript +const cmp = shallow(postListRender, { + props: [ + {title: 'post1', content: 'content1'}, + {title: 'post2', content: 'content2'}, + ], + mocks: { + OtherComponent: `
OtherComponent
` + } +}); + +cmp.html() === ` +
+ + +
OtherComponent
+
+` +``` + +#### black list + +```javascript +const cmp = shallow(postListRender, { + props: [ + {title: 'post1', content: 'content1'}, + {title: 'post2', content: 'content2'}, + ], + mocks: { + OtherComponent: false + } +}); -To have more information on testing, you can check these slides (in french) : https://slides.com/florentberthelot/test-composants-web#/ +cmp.html() === ` +
+
+

post1

+

content1

+
+
+

post2

+

content2

+
+ +
+` +``` diff --git a/website/i18n/en.json b/website/i18n/en.json index 97c4a66..0017862 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -40,6 +40,9 @@ }, "shallow/setProps": { "title": "shallow/setProps" + }, + "shallow/unmount": { + "title": "shallow/unmount" } }, "links": { diff --git a/website/pages/en/index.js b/website/pages/en/index.js index cbfb7cd..143d1e4 100755 --- a/website/pages/en/index.js +++ b/website/pages/en/index.js @@ -61,7 +61,6 @@ class HomeSplash extends React.Component { - diff --git a/website/static/img/component_draw.io.xml b/website/static/img/component_draw.io.xml new file mode 100644 index 0000000..c85801c --- /dev/null +++ b/website/static/img/component_draw.io.xml @@ -0,0 +1 @@ +7VnbctowEP0aHjsDlm3MI1CSTqftpJOZdpI3YS+2GmE5srj16ytjyTfZCSFA2kl5AR/JK2v37NmV6aHpcnvNcRJ9ZQHQntUPtj30sWdZg4Hjya8M2eXIcOjkQMhJoCaVwC35DQrsK3RFAkhrEwVjVJCkDvosjsEXNQxzzjb1aQtG66smOAQDuPUxNdGfJBBRjnr9fol/AhJGamWkB+bYfwg5W8VquZ6FFvtPPrzE2pSan0Y4YJsKhGY9NOWMifzXcjsFmrlWey2/76pj9PFO3CfJ1b1Frc/fd3fzlTP+9kHHYo3pSm1vzngAXD2C2OldU+Y/QGZq0EMTvVMOsTh+7ZGxtrHq3l3FspuICLhNsJ+NbiS7JBaJJVXDhcP68iKkOE3Vb58tia9xjgMiH3vKKOMSi1kMxY7WwAVsG2EuN/mEC9W+r4EtQfCdvFGbQSqciu2OutyU1HE1Q6IKbayhArGia1iYLh0tfyhft/t9YEYXp3Da2FrGGlO2TKRX5e2WS6WNyVzSyQ3F3vhxSCct+s/TguI50EmRfI3Ap4KzB9CgzEnX92C+KEZ0issQTxaE0srMAIO38DOcxULp1MBS1638qnp10EG5TiYhq86kgWtSqcCqVBpYJ6BSO/dtI/hrAptLiIdjLAKBlGl1ybiIWMhiTGclOqnTppzzhbFEPdwvEGKnYolXgtWplK+ZLfRCjbDbI8uBYkHWdWttUVK33jCSZZVmhO3VGWH1G4FO2Yr7oO6qurhhyNFa3GVIYB6CMAyNOce7yrQkm5AatCp2/Aqmuf9l5mCZOaqMdVD0LxafoUGJH23ic84oetYcue5BUXTAC+yWKHY0JLVmptrAnC3EjtsIsdcSYrslxN65IozM3mJDRHTDWZJeoMYg+1+qMdpZueY/NRGdpRg1FeLQGnKqCpFvq0aWjCgyTwiYbJHJIxqnh1puqyysJrGCMCVhLC99GQ55TkKTLBWJPB6O1cCSBMGeCm1SU6fHQSeW4xM+p0T30aSZ8CMz4YdtR5Oz5btjhDAVWMBiRS+R7maLoXuETLP3bxS0nLuPK5a3DPIM78pPFcq7idvsybUB+Si5jY5O433Q0Xm6xWh2s8ikY1v5ORsdbbP8mAUhDsbZO6UsApnDMjedRM07fFXxhdPiC429UsubrUDh95ceLIwTStPQmYuCbRYFWIM+o5xXT2zzcHwx+tgdNf4y9DFagWPpY6E3po9ZkGaKPs8eHt+FpHfxTJtxnpf00UUl3XznLMMEXDbol5AE7Y43kYTRW0qC3a8zYXRsQWnYKXrYCymCY75Sn3US6H1IQAevdC1otBIt74280yiAvCz/HMvjXf4BiWZ/AA== \ No newline at end of file diff --git a/website/static/img/component_event.png b/website/static/img/component_event.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb37b92dc6247413d03be2765d7abb004ffd1d0 GIT binary patch literal 14679 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 T2?1Z2#CR<(_p(@2&+q>L0zWK3 literal 0 HcmV?d00001 diff --git a/website/static/img/component_externals.png b/website/static/img/component_externals.png new file mode 100644 index 0000000000000000000000000000000000000000..eff374759357238ed61b35046f421002411d7d73 GIT binary patch literal 16166 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 CV91LA literal 0 HcmV?d00001 diff --git a/website/static/img/component_state.gif b/website/static/img/component_state.gif new file mode 100644 index 0000000000000000000000000000000000000000..bde068f853a7125e8d8e85dc2f53607300b8075e GIT binary patch literal 22298 zcmeI(cTf}U;^^^BPpF}H2&i-r=}inBDH5fMihxK5Ly-=K-Z3=k5D=6q0qLNG-VsEQ zsvw9o5yf8c#`B)@p7(d|`JFp==FXivbKO7kM`mYto=tXl=JR|X{nL8ND)#5WjG#}z zuZ@ls{>FQd94gwt=F)owl~Nu92>mp0SR>8DnGPGnQv`4RNPU%#CnXCg;wZnVVT$ zG{;$9x^Urwjf2f)m&+D54(BgBU$l2~aB#Td?%?U^>Ei9|=I7?<=I87c=;0gYN8Q4G zLqb9VA_Ib=gCg%c`Gv*?geL^vNDPil36D$nNbQP=iHS&wNKQ_UCPu|)#--#YM<(8i zPRWfU7R09&rl+S93yFn=g}2JGa>}#wEAx}HN^jX?+CJM=vx~Bfd&an>4d;?{wE3SMZv3!hJ`RHy# zcV%Pmy|&?ohZDCumYaJXxAo6<49-0mS$sIL*4x`VGBVQpq-SVhaO~MAW$fAX^z`E5 z;-l4x$rq2NHy+PyK3UnF>zP>Tf4n~Q(vf;t!Jo8ebj{7QHF3JK(lQVb^()C=XZv-V z0LVjt3&m?dCUr+aIlN22(Yi<^3=HHL)R*=ramu+Z4b|Tsyou3HIa4aky5#n>otKV)5tfIjMosb@x*nwH>h8x|TiRn1ge-*;Oc zX{vr&XV;s^XLM^yNZq>zlcp)8L!ia(XEt%`!z016tz*lhEp^Yk2oPF+<5v7-X;~T! ziD{6GJ;sCi+`87<@NzUq&i&a~n_Q2Y2F3%YHD?H7OH{A69dB>ic}nJ!ICqvpV<%0g zHIy>m(emawCF=eFOJu~e2LaL-iAOry4qi>(Ho7a00K-Qdvxv$X4>~@*S?N6tc%~IO zV$CJqSAF@>!v`UCr+a(COuHWb__i0}v0r5X1bheJqALWl=LxKv&9Wd6302%&i9*xd ziU&F_WnGNsbgEd5y>JO9Xz{~a^hNy9TcS9C?u-IfNVs|PMG_z^i?!hRj#x`k-cVj< z|91Kq1g#1eTPJpX!DyQ=FjcOn8~a!m;R1-0>zU@3T%4%6ALh5SF8Xg>wNeN7_rosV za^1+)(wxjOrIU%<$j29PA)p%PnY0Q5H-@hwoB7Nsalvr$iqrrMp2)mKU$t2(Q-!tB zOFMym5R@>=9zK^gOpM58F+?D;N3{D05JvOFo^_#{me)4-_-lBAU#yT$G`s_v1 zmg`UL)IMFGbNs33Kkw4(@4w(t*X+NDzxL68$?t+vzwOr}g3+Twf2m zZv6Zzr_J>pK>?WeZ-8~|Kr9s$h%7z=>_>t?T(EEkV&wOO=P=BPPjv>^A>&AX0ws?M(t*8Rsj5{;Djpt~G0!5XbP4o@#nhbj=#uo6kdr zHt*7No;Vz>cF|XNdY3_>E9X{nHIQ(VNGmli7dJa?xSiWzQ*p6e()r7frQU0zaN;qk zfZ@@T3-5yK%5F)AoE~#XeVc94do>}}b<9bTC3k^#qcLY|%-f1)8gbLSjuY1h- z%Ncj>w{DI5L^2oXPH)5yxlZ`oFc+?{INzV!nh2I_}Sb#8woiuR`Y`TD`6ZO-kyIyhTK|F3Yeie?TufoL{J}Kq?P+?$FbuN44$sN_} z6%OP|?9Hs{LK`-wlb1|5y(VGD13y&T(N|j!8qPN4eW-CUskV7KVtL$e6@K>hh>3#v zO!c;Wb=8+jj?WY;jm?re0<4DrBYKW<*hG#zCh72{YOeoXNqy3I)Rix)bHiHf^;y?< z?fE(o$0-(7g^krN!|_&+Hm^6tKag}Y>sXlev241Rawz3-b!Wa++^cG!YR84vW?`a0 zv6(`D4SWGa&cd^0>$Kx|b<+p|5!64i@|+e8hB1%HAeK9X#XZneSE`FuW=FeogOdH+>9HCh+va zmC>coL)Oh+>3oP6whHId&JvLT7zb54!^IR<<9Nurgc}pL+88;Xdf&UnBWv8dMCj>P z8h(#n7>F+3`ZB{hD}aY;)4f0fIpDk|<(C>?PmCv@ImrDGxS`Fvg7V~VaF6dtDvy4d z?k@MW*rg-rh=Li#IVonX4Ke4%dQ3nxSU^XCh=rU3ADMe0=nuej$eLgfj>3i3jOHNN z0mlhiAQ}uzXA?khp(!Z1H&T;;0idG3g6#Nch$GLqJ{ADE*&%f@2?!=MmWGZA0-&)| z5Bv@;JDTi71ad$5Y+GAVskI%k1Ofs`V0v>RzW^N;khG2#!VsdbUemtw zDS85w*=GdZ2VXo2JBNiLR`eOjkP`sdWj!>G1V0xChQ}ja0Dx85KOPO?p7isGMRLb` z7jpnZuYBThAaw$ghT!V>6v7S=WaF8{@nQ3EVT&AWWwD4riV%1eGS3V!4k82Kfyf4s z1_jIx;+}u(rnBjM^m9-$0A;BM{dmPUt$$6TMV}21v?~IpBp8UGSE=ON7l(wRVe#0A z7(Ce78Va8DbEA%*05SOlw<(LD1t8H_B%T5vdIhy9i;Q0h&9yW*tWS%XagI_N@>fB! z{jfx1MbUJhIC+4;4ko|=3!%dVBu#Q=DBmz0LZUGcpKPQL-mRDuG%v*Oob8iLjtSO@ zIDtk+5WyfUG8PT!;F0HKVo%_~VVQpJqSsqL!*8qr7y^)O0r3ysCMpsA-Jiy9&e=14v=8-mhBGA^P=GVtctV`GIe-sfM+7(r zl(fS9MS|oBKp+WeAcz2AIOGXptD4uUg_DBUp$>Y03oi5u9JtD!?BWl&4aJIK0hSWr z1|h;hI2n@@=Y~cy%P`Rr;ut1Vp2s6)fI~n!&}3?mn|T#-%*t`AH6!dpycSaelqoTR z0JqVObSO%9dh@1k&#!#hC&nnZar;;X5D~$dFOk6L>h@DUt-o%j<~& zkQhST1#_eaCF06^xW}Z6Eh{oZ(dg<^4sC06@=%8NMuw)ny1FP@F9&(-E;0b;0}%{> zG37wgkXA$d47vK(bM-|42&;c~bbWSc!qsqBmE}(ygt#1K=G>~IFdKZX!aPr2Tdv-0 z?kT~ONdUAo=tvpLu{1h2sy?qK;mW-&7Nd`tCfEE|nR%Th`5l!G4-(K_TbORKg52o* zNc)1pHv8cq^yoZhe5)Y)5Ly@^SUA09_c80@-6vTKTc%4W&Szf=A?!t43idCDFZ6No zY*iM4EerDwa+}f%-)tGY`of`ly7-GzG0eLVT3Y-q$n-6W=Kw`II7WhMk{}KwM3uph zEe_fd(%Y9L2&e=sRKmh-z_!4_A#Upc07jEm=K;WK640XLaf_pQxiS1-OKz~1hQ2L6 ze+NNN0VTf#L&%8pXt;EHs&s5|qwH<@Dt*Ovjw9l>N@yUx9|2hbhvL8@i7*i0|#(m3p9wH zjDW~M4?{6bL3kL5jJTRupfhsCbwS*HYz#<{f{?ZYLbCu(90WqKvIBrC zIPft54#oi1G7w&JMRM?E-C(L5Y9I0zE} zCHdbuL4!$Ct!9jg@3ya;u|NQJ5CBsa#0`}q0zo*0A08HjMF0elA{xqstr}gZF#K3i z^R8wx*w|~E`-$PD5DEyG1j1fcngDOE zZWamekPjBPgUc&8zq*cX-zx{#Dbb!**)enbWPMV?`P3*`yTgc4jh!jKvA?NNaj{W8 zp`nYZ>73d{bE5{!kcLMkO&56Fc1Nxne`|Vf-e_~Z@yclK)eFv8BXKSFCQ}J^hsEZ5 zGfiZjA{Pmx>pbiMNiAPLHs5A%xh>mb@~y>=sWmd>V)W>>*hR5;wZ_D6Y{`qQN#!j) zeJx?thFLpo*-33N zFWU0(I`Hjw|LmjWr*)@X=&|+h5#2Qs|9+W4z2_)z_bHX`%yZpuX?m=>dm?vwI(vF2 zw|gx?eSs2v&02l;-TEvd`aG-qzMy(f6zHEZX2YpBp9?KBzu52P*Kd~Af1#t_ZK2;* z-B7O6PQjyhO?QCkHsH)#Yu_>8QFB%Kd$y{&n6YG~og~|-8H+4#5 zbSfPG;2L&jio!{F(!BdNTmxl1E%j-%;)Bkgnsv33qE1*Q$1qKyS*VKp-SHKK#Y zw}&rEjVB6>e=m7tEHxD>Fs)uPqb~K-Lts9Xw74s|d{N+eXYuN;%&5BP%kM?6#w6E_ z1$HhLy$+Rp^PT@~P2quuiz(9vVllRK;0MtyJ-$H)57hmYM!kB`yoNEYfGfBhI2 zts}}et?f9iBsHz81IL)iUQx`SP14pn`9$Z^6TPq}a`Iy*kI39;kow%KiQ}6&cXGxF z3wOlMSQpN)`puY)&)EE!u`4`fdvfN8xk3XNbOn2=QcifMboTZYk(V!KNw+1Q3q377 zI1=yhw9t(IB1S4WMTJKO4nBCAyLKE+agDyDd;u$*On^!f=h9f724Vpsy-KSPy6W6~ z0z?Ax_DEie@?9;o4+SW`q+G0pPCK_i$UxG3;Y=u92)Yg4ut%HFFJAARhue!ZUsB?k z6hW*49ymQ5s2jRXPRq*=SwgzrJgHHBM@zDi84S?!gHDX zFevcEG9nsakkgo4xY*5(D3TQ-RwO3><0Mf1tsY7{9q0=lbrR2Q}~8U(Z=z! zS#HlZybd?;wi^l{(AhJvucGWA5bzHV`xC$7s1MR#Ld^P4A^wAhsZRVKgjmx?PC;G& zuR{EX4Qm@1P;DYHR28P$Fja-AHvCr@rm8U2hJQLa9lE*wxQ74kZa{`ZLjavZ`D8ew|<;dK1L zn|ofh5B{OZR6?dg@?RC1O2|}5{!@|H`=-~1p0189z3hJUZ$6Pf z{5vf#J$t({wMqr%#XpRB zvf^81T#=90u)gQ2w(g*tPowEH@Z#GQpT7VQO@!m=?W&qst4-`-H0$JcO{0HHDHh9n ze&=2%IIf2YeA@0xT_1b(LQW}xneYexmW+Adz5m4Wf;F7>wCn5UrFRxZY0I$^($=RA zRrlI9ZL=hbx0-jnaAwh@jgI%TYD9MQRfjhZ_XcRBx`1MyL>&-^KxA0>ZnE%*c+2jwQRzYBV`H*UYmSa9 zzN$Ggq5A2&&?60miO{4LN3GzLp2!c(V?!k=%=8(3Pk|@rtd{v_ES>rIXKeyb@;$YU zd(AuNko|*a-svtq&w^Xa1MWqy!3SJRK2JTlmi=Fua2`Gj{`7<6c{oCYVE2)rpL}uix$l>aSIOaD73v;^kL`6m_xb+ruJO;LP)bSHq1W#7Q@mcE z1%OWoEQp;*fE-=nLAqcMzr2ZHcz+o}&xwU9%0w_XlHhXjSXxVB1kd_&*eV54yZlHO zzZvmw@K6SOmn_7zJPF}9d=$52XwRqK-7g*dHmQiBBQk&- zkj;CW?DAenL^W+d@s@XrSMn8(e$he2*^dwJh-Le` zEV9lO5sNRUEeGD+Y8`ti=sa&A=|!8~PIpHp4y9*n`6zo9EPNt+c+8sH%q>+uO*a4Z zxZ9a`xpUf1O?RmH8$6v_x%*PQ>-2<=xNN~7?_HIr=g)YkO647UA*}Xl-Z;R^H2=wA zy2!~-V#Xoj^hHM>i=09P8{G(IES_K%)#O+(jN+yz9XTheEs|)ccjx{s)^Qi@DXs!N z^6G7YOArHn)pPPh^RgqlVyBJTA7?aYmWv&$Jbjt_Twb`}9gKymiD%+;c2y&jZA3-< z(Wvc`eFhGTe}ySy}lDgJ7-5c8<@fOKg+ z(WFmEnD%_1baO+3McH-+{T^@C?b$PjTd@igAS39r;seSH#dyH&JS0e}&2`mW+?e*oRTV)8DYh#|EiIH<$ zrDgQ%E?C`Zxvnq>w)u&$g{$lWIi?!UHx9Vp*b9t$g3VeI@ z77n~67}}shomsjYKa$qPZ&(jo*vm#2>>BFtYO?ICLsf1Ua2>huW$azQ?4d>DcZ_t> zI}|er3nbf3h-|LrI}Rl0PK`N#ZD^*P+Dl{?kF2dj_bA$+DTLT#G)m60G=L0PM93Zr z=ybEh)~pLipax|dyfZGd-WSms*F7UjLIpnbcIT8zJo)L%%p;2fb7iGXQ$i$Kxc+} zA^|i3Sv1)Pj<+NDUTH@nFa+8@NiaVS3ka`7(*iOCqX4-_k!eUG@`al<&r(Z6(M3|5 z>}CWV7>L4x>CXH?!lFo+D3uO8oHa4w1OjlVMdVH>ra)i-0r6c%>L@P>xJ%Q|n#>$| zDNdgTgl@(ro*V{PLCJZXSlEk|NWj41x%3K^geg#FG>PRHm4wMu5)Ledzyh^cB*Rbu zD~9GMKoBNjK8Vs$U`13C&Y_a9oggD*2z0a)wNF{OIMK`ApUF58uqCW6-U!EvYQ06V ziY_1k3Oh3xAFV+Lz>5I@vfUtw0{~c9e6lFII6{(2!r=yuq74Ayh>Ja-Tmc2{5b`6c z^#PXQHpU8>InpZFNLzMIIsw#QAWP?kYk&w?CSO? zUYs zSkfUV0`_{PSR}BI`k)ltAQa3+6g9vBX#vm@B8nh{j#pw~4P<5k3}$EThHC|ChDH&Cn;h;WV@J1#;e zo=J!lzMCC=1Hl%dkBp`WF;_@|_PtAS?f?P9u>ujbVPjE$-np~1>9@t`A~ zdx!hLq3YQNY(QkWB49#*f%aWN7=$!2tOy5)fu$WP1g8t-s02aQ2abeQv{y*S&DDLiZyvfu-v2+`;hL1~DXWCVmx zCa`1@QDT<}ej8JY03DYJEM7shSjM19QZKv%Kr$Ylfd-n^ZeFK&YOB4>4!2{6%jlt?K8kWI} zt(N%q#YW8bLA~{WsST8&2-BuhN+BU-!5XYwaR{VNqI}TKM=7XR@$r5DiiK*!cxMLm z&5TWy6h34t}&+Kq-Po zTrf!T1<1$>aA)RE_D@deLxsp>*s`Jm@hH!-$dpapJOaWuPA`~lLxftiFSdqlXoR1%j zgmR0xnu;Q(iuShb_rHXH(k=dwkkA=X{3X}11nIK%vY75_F`+vX(jLCvrc!raVl#nM zS4O%aNTT1iW3)kUs9;zOOL$^3yCO=sxb1ih(R|_<0h-cM$C7Z(()}hlK!zqHe1vQjP=AD*a;GkP@rYD2qn~>r%K$0EIoqQX{or~ZudoN!W3c9@?1K~-q zhLFI?7_hv}FAL^DBX1A^Q&q4K8JR%1^CZSmT^y}JgTWe>CpeaeM3k@3Amm1nt^nXl zL88#mLr(w@!orv)fg~9!)FPRw0*?lIVw}9csxTQ!Tz9)09evlge;feTTl=Y3ByCmxuHUK zOs+&I5)I`cgOt!9tQ|f}_3r2T>P~U}hlcD$s;uV@?Fp7vwKqJkG_W%-g zXDAc7>Pc|5%&qF$$lCdBy+u{_WpUdi@-GNZ$hvI^06SG+@V+$)sHifmI-tpIRW1J# ze3NJPa;OzqHMk~O27I{^8ea}hZ%2ZOV0cS$sc3PNQa$SquaoZKRkFWL(G1*`h%|9+ zfG-q_t2qJOJh2Lu#}=Gt-0Er~>r|>Qs^y!rU#LFiUX8v`$9$pjNn@SERGkrzt>(8z z+^F$69(MB!O;gvKl=GY7f*R|lnrwO8-)~>BmS}!_y7?Zc#@YR)> zf=x!gX_gT#00)u9KosoYg=CZi0d=*kJs)j7*XI_w(@@xPr8pl~GHRNSf!GpIxsxzi ze4DHcD%%{@o8)SL)j0mH%L7nL)2KtsH;c9o(>M$y;E275WK^z9XAA}+G1ldXJsZGUr#sinCJ1UA?Y7$Jz7Ovy73v{0qH1Okz5TY-7#wC4g357i*5E2uIxl=a1S+x=n# zv5qmep%Oa#sc$yZqoz4HWM5LJ=$LNqe*5(?-5egh*vYYiUETwpk*=Cc-QQcbxmr8a z2OfBo-lhxG8xu1qXv*7Ro0c4!p>uqiJPs=#f8Ia3ENQo8EV)M4^m2)f#QW$#;n9P0 zk90#GUG$!C9DCIH;*kpNM-myvM_K96OBXl7fvq=|gN+o;P z)V<6p>-woji&O1ir!XfE4TZwkj$Y~z4yzL_d|cA_*mCM|;kU=yJkzq5&a#b;e=Tr& zJ{G;&DaLTJUj7oBB43+wVXNwc>45Etz3Y~N3Nz-HW-P;IENZQyL%Yg%pUBbA6qT6U zD9k!unso}Bb$Ku&ury;kK0UE|R&nN>D%(@POHcj7o(7tj`4&Ds3N!zHy2UfaNS{x7 zHdsKnur6v@D#lYFuCO*?Tq^03K+1Ua%?C2twPG2ym06xrX(j@>o_F&vNfrL!FE%MJ zF_F6cn!lW{jBDdGfp2aCI{VspKC@v#((OvXH`B(GV$JlWcVA0ZO65^SctLzomSt&o zYLWHpBIEtV^wK5d$kNzhudJu1n%p+UDi2xt@FV|=R??Y{mkd*GIb7WpBwZ&*MhDXyoV3apZY0OtlGFj z_iTmXa0P9vy?aR>av-vleu^)1mHXi;@3U3@!&O>VO&4)I;jJ2;LejT%cU zpT`PURY;uOQ&u^HgyLVO`AUEzfU2ICkq6=skhnvU@*OR7_zK|crCg+iCO+PXI6(1> zp*5vnh53TZ?9qoX^hV&GqN5ku|J^J9=^zadh@!XYmLaAQaXfKP@!%Z`H!0_)w4yzj z_3XJVr!`P`IQkqWIq#lAsu1fb=53pdjdLfq?$|11-xI>MZW~S`?bX=?!8?W-D;Ana zbFUq(zhQaZ#ExPHil>c@Bm-nh?@C|6!~X5oaQJI> zZT`1v>``bg&#l)Caw1%lTlObJ3cU8{<@VC{ILz=s#p)jD03}EOmiIV_-GByh^JA)X z_zHxM2wJt}49BHG2w)ul{#YqYl={8|?PtA3>El5l;x8<(dBw_bO2T>S7nXDFOR?*t zcd1%_i^{Z|Z+ zj*h0b(*Kf3Qw{vTqwhbt`%`2bRlGkWq*BG3%H34-ep7V!PxPj8_aE*}MQ66;GH3@V)2J2|q4dee-%N5Zixhv7@ zn0i5N0#be=vq|+%bOiY5z<<^9=R!wmctuN|;xT-z++#9-O{KNujXjLza28qhtc(>h#}I z>8EA(tL??VQt6NKqJck-*nRu)lbTA~dFap)^DLc^_!R=(uT(nniy+0z>KI}*=2t3h z$%HdtyTKFtE0v~Ur9_(1ujnU8Qd8+0;dD3)=-~qwYAWrcA02)!4Xd4srKZx?BZaFrlg_Z~fD)7R#KmH7>?;!sGMuWm zqCA+*d+73G#ka%cGO?2&>(r|4sud>HNv=Z}S$wBvsZtb8ulKlW=N=`37=^WYC%#Lr zO>ngY`h=?`ok4(Bbm6F;gr_~LWb|g^oKpu!kgnU#>lV8&n-Z<-w?f$Nh2&N5wQHj4 zHS=}{B;H_kvF~4XevYJdzyIZeZ&1b@^TpCij|G(5oUNs+OnTJk$Q-PO%qN%W0`v9^S>!@vPyI7gftg zsao#!W};)^;ZHBBmM2lQ+*aUb=j_PwYg8>aqH6gWQ_}~JXD?r)YB?=c%QbE=KAd=Q z^BPslN2yvaUH9nW$lkRtPizm=EN{Gh+Yyi8{Ql{A7yBVC=_epc0kQ8Bkj5nN7kvs$ zb&|li`<#P25PMu1&1f}xIf;UaVhG-k!qAl<^$mKM^Y)|vo=P)C3Pu5w?1)NI%&$~h zd8~vXV5pb>>wernQfVGbP5ALpTe|!Gno{pq6L86;tlubcVm5CRt;b5)4#)_p;Hkur ziWeM%pLI0i(~{3W0W;f+YI7;4B|GWd=I!DfRB@|M_3snnKj73=5cYQCc09}S#lS$L zsGfLE{isk$#gNw5v=n2%H6fAH!-h8L#GB?0JkJA%&ji2AxHWbZlO12H8Tl@=!uTbp zuGq!d##|edlkfbP;pmGnTszzfx&i=Au)F zX3l?0rKOpRS2LU&ex=e2X^g;fu7;8hE=n~s8Fj1}n=msOXCt5D{>1U9O3+m5$ca*= z3l-EmX)66AsO(k#CfUI4acZfblh8QY=z`l+c9m&)Po9_wed1(ts!xU*{Wh!T*M=Mi zgS%Qy&Za--3`xQYl{%gRXM$p$+-;Yul91busdBUMbzloOTV}KB*dDJdGOk8*OPsHD zwah5_py_tWT`rqu_?%%wt_M<^e?4!oId!*|A<6W zriVW8MOIA!EEK5;9UT+|07M9>mmUD1;x_fEfpoXI*yasn_f~(?lD4E1a3s4yBsCjLu=0mT~Zw@^?xh!jS*wKW22vSB30+{dgt8n%LhARj_lq5a= z6#`&oVuzrm6RemXIw&@F6ds8LhBTQzO1cQLt^%jd-J~vrS>hVAP7MLD9_6i9RdY@N z>YO0Rm?*%$526L;v=JDbF26E?p)5=Yu8O_-^Th%!^9qIK8Wxbbzml-?ItrwB$ruPR zrm(6IoH(S=umWp@I2e0{Mh4D3B#L$h2m%#9Hmz0i!10eYL0=1^l<&G>t`{YAnlJ;% zrRzCRq$cZ){U~luAd!~Pjm)gx<=+>iJ-Q7_h3M8KUOIa0|X6e18(Fv0i7_Y}DQgp!06oq60D>N)Jg&K|vf z7K$+bY~t=8k>$+$ zwREmHF$qD+lVhZNVnfRf{rW@eqJx4qaUq}0cs|7OvBfuDwK`NZh=;SqaX_r;BjXa0 zhRH4`Qim`^&V(ZQ1QxRdh)+UJpy}CoV^2MaqR$BrSQDq#&F^fQ=82vt5XF?YCjN|0 zoR?3$&z#h-Y0$`drYa}Nswrv9F{vRk>EWCeh12wbb@Iz6iHrw{Ag$z)&u0g7OnZjJ zCplBl#~}8&fbR9Uxj>U?PTcV4logkVQsvZj>xd;~lV>@peSOIcYsr95%3i$geyhy8 z&jRnQZ(91@q{+DXss847QQgBp8NgKltU|<@6XCwZ4{1c2pmVDgxS3XQbS05aMTX(D z0EY^ZOH77GMSw2|cjI%~A#?iPiFAA)!dC`yOeKvu<}md`A57d1EKCHOO(KH#q5gKd zYL$p%FOB34Qe@}P1lxg)><|G&sPJUEFa}}PmoAJ(XsTSe9(%sYI`d^8!rcyhabG8x z1P#Dth+q(|WUw#^d}$IPW(U41hLFI6#ffl+a=ptW9~n#j^D6P`*TEuq=(&~jP%=yy z0}IB3^@#A(cyQGDoL~Z2j0`h&Mby5ukX?bv;jFd%Q$t;GK4hqfU4{WAT?CH^L&N-K z5I8$Q<*{$ zGSu|REpJ?gFaavE5BA_HoOUgtcSCE7r7~@s`jg;yxO9DSx&c6D?H3*Cd4$+P>2*|w zpha30bHSEN`j2<{4s)qYTt*ss$Fc4F>V~PhiO2P;_)mXLF;YEllE-hFm~vM9xEVLU z1$T-S_wn;I{1>W{FO5iF{>o=>lYFIJ`sy~H^LCPJm9+Z;pJ!guH8*MR5k6n>r0X`) z0jhjK?TK!UDWP*IhY8AMucB{@m1o6%Jrhr3rm8A_!!0qyP&!PUFYRkW290zUH(z#Q zLaw3AO>yx;>ZIbfR6Y&g?W*|lDyh3)c`FU$tMjC4w|VQnrf(oimf9*hSgVmNRVC-D zgNCZ7Wvj>%CT?EbVm7#z z6j;4D9~UEjFa2}v`KH>u$F-MU){KIwW%E5tSRGyOy)2KPR>T3O(9z-nZ5 zC|t{t49zE>j3(>&=^W;r`R-sPC11~ap`JaYo-;{{@tYj5CNke}iU|t8O2!@;J$1~e zL6oOKyrbcV?_mRMy+JYr%PFrw1|NUptLl(0tz@KnT~=C+N3}Il;uMdn1~W86sWDrd zUl))v2vK1rhYdY$%6lK`U|Ln{u-dy5e0^;+i<*t(aqoa=8}T zkp#H9D;H{^Z@z23v4+?cLC0yeginjYR_lY^m7Lts*Wb1HXSirEwM2I)=Dc9}klyNb z<-Ue}YpT1V9hem-+vb!3dJ~J*OKQ8^+oHL8q^MfKU4kuLt=-hDO)TA~qFUa0-&3Hp zu-09k=>nUxjPQLmdA@WuR8M=GyIeRi{K8uV1ZUqRAqR7avpC^9_)S(0-$Es-@oHHf zyn}t7edB=I18zC~k7DdjXfC(X2aHEVSjlY;f+Bem4`~k`5EnVL@BsInhu}2?55_Z^ z3Cc>7e=)Ujc{-&D4?GBi`8~xzuxfDpH!aS601OzMw~83Si@fE{goFIseN_|KBy| z|9uSlfAEaIYtG*_=kJ>Hcg^|NrTo8Z&fhiX@0#;>&H20L{9SYYt~r0#oWE<%-!Cy&@bTcP$H3+ zY0=CqELT|BIXJmEx%v481OUS3@7%t9`4sO$XL z*fU-G;Y)MxOzXhsuCA_ufdS&s;>5(n+}vE}$WqV8wZ6%3{nMMnbAOF4?2Iq&&8_~N zTt1v$JD&Y^Hn(xUy1KfxwRLcC@aNB;|8YY97Yo}76!H9Gf3`oAh8iX})l`f%#Dzs6 zpo=BJzuW$OO#m5*U>y`35*ijBa#u-02+KqP2LUgVQ&Q8?UuI;!di^FVJ0~|Uzu;|Q z8ck72X<2ziWmR6_ilA8`0KI>>wHmQGuA4xy0r5j9NR##y?I>PECKBnVtJQ zzp(gaX?bOJ&HAp9p1e30GZTnL-017H9v2ymQ*Zz5{5RY~$qwXfFbet%@ zGdTSjewnn)UgM}&U%t@na@%-kT7zKPLV!?SWqIFANS=Fz!09(st@b9s9@A9rV?Oq! zOE@pK2&vw4dM+D%)u5>+yJs5iCN|tu>rAwQn?&y%)&BLlq5jv5Ky3H?JTaK^s2?m` z!{iVyU_J6|)!fEVN;1o^)t5+R8Zcfr(%O9F+8lTivD4aevfs%rsh*GLJ3ZPN6}i6T ztQB^Ay#Hhrzi%8kdJ5ykyBe~%As$1xi?ScGCYT^#F+#k{AsJ6QK4bT<7cGY+)M{yy z3%c>HM0i&jgW1UJwN|18{ckN{jnHE&F_NwY8CW4kv(-2S5;O=IWgZlymwP{W z`^vT9L1DJ=@q?m#xQx@gqE0WT;?mT5r;Y>YZF7L-y4qa*{>#jYloymRrux|cw?Zf&drNf5}Yw&BXjT?I&u1#BY zHLlG&o(HZi2ey)rT8}XvkJ`@RHILeX{ryKoXuO152g2`(TPM=ty;~RR=Du4unnWq# z-owc8*!=^`rE2$HmH?#q2ljY<_kM1*n8yRiiXrh%;dXtuA#sTQli~Bl7>PEypZbqR zmAWWB#bn63E;F_eJg$;mfI3ahC)cyT8orgE zZMPh4pZz3~iJb4$L8>}`%+4)fzG=8DpYM-pwQJCSG<)>>aKp8_<#e;?0AK#jN4x*GV0sGm>mKl*&6)% zoARMe$JpxUA)|R!K}p83ZfjVkj&%+09I-fWC>yhxc`w(3 zSUe%b`p+-zE)Mu!g6}yiD^+Bl=7&ddJ>sj5q>Vn^w+RV~TX{*mqzCj^^$U#xcHbK=)Mn4(k{08%65BJz~nJ^YBiKoXyVrZ+p>6?_x!zbm&TXYVA{A& z``aRZ_Ct1WX`XAjWm8FS=v#2VH|?I(mneDHRf4FxXWjQ#>4AlyCjf!bK8HdKz){zs zjK77(`+=TjX{;71ldfdLVXY2y3l8e1rUf%dMgwdiNr#scyS=N zN*FpF2L_Mf=<0AVB$NRB=~e~b#RK_rKVb+g5z*O80@2CffU9Gj2tX9LiWtv+%E1?_ z-_#CtFZn?TIFu%ez?%*L+{PdPY7C)9;VG{G1d7Kv0@`sI3~NxK;&g%mj94-j0HAlv z{=|YLLT{S`fMWs}*jYkAMFY`o{2ztaX~Qf4KrgR%hCf6EkYwxtzv2OC9c>UmpDG!4 zsRbjGO>z0@B23QMykcbYv7iHy@pXgW8U~;q+`3MA{p)igF)al{NegulTo$&I7G$ zEv)88iy$%^u7CgzYfuDIErk~)48Q4JH5N$Li~~Zsg7yXR;CX(wHg$6xq7)y>i?pFc zMyU87eYPGUNx#Sn&7oPsgz|c00n1#2BM3Xmnj&p8SD^;k2VbK1V8)Wp-%!r2{$?rrW<$3)Qv;A zahE7H%_|Oz3PU(>6}jpK4%8hP{2`i}O)~S6(!GMiJU1p1Wp?^ltQO#qvvEZ@k>LyIE>?^oM%BV(RZdj^S4}@?|*USQE#5{o?q^{ znIP+vu^&1IciCD842*aty)+KF9DcvD8l{`@v-=O5;yvEtyIw`H?3wo#i_W50Q<(or~ zTn_{&&NyuU)GuUl9a3tLW;CrY^KNTJ`zd{nme$|lVLxVgco5F@ivbO5a3Pc7B1fPp z9bKq+xh@^k(lENvZtz0-*ci->nEE*BHfXOD8L~ETvdz$P$QW`Jaq{%h@-;Yviu7Yi zM**}oK^h-}#CC(G?1Pi41DSJ!N4kU6f`UasA-$X-imD+ZHX+225QW?j;f|2TwGer5 zs1RG|G&*=@Ef^CNTB07B+8K&o3C)LwN!o@As)W7C5B(w;EP4FM#nI4KhRw-Q=e`Vw zW5eZF67t;>;r>PP+9-v<kQT$Qqkh`8g31jfju2)Rf`!Jr@>iy-M2 zdC~?uGOyF6vo<1g8zS?~qrzyT0)wMM^P--0MQIacXZE0V#>^fP;(B8M^B8Nbqqtlp zNVz(i?*+#la0~|rx4B9ThXlP6z}43$c8i^Nct*^hopW4UOluDoYaC0rA5F4Gam;Cp zNwXvP_F}2_*@FT0wLZ}%gOKCb6E}mdbdE)1bcD}%k+yq@3)OLB zqKTZ5LJYE0%jrqOd(i6ZR5{B@!_^T}JJ2pmob3FMF&Q5A;bVm zP&)lCR2&8B-Jut%geWZ`V|6&bEkWcHIR4t97Twsp@yEuzdAHDHT>UzXmazGmB~Lww6wLfcC`NQQnYin zy}+WQyMvR5(|;$UhyRlcHF^bk`Goicy}$n-`4|`*cp=D;gy4we@Yt6z{|6-#UME~= zGBrOXy&x^~UFLseWllx*g)H;m=NHu%mbH}rOUyK4VCl%~N@7KAPfg2EGjX<>INtt` zI}_fG{zrQLA!a85-pn=jp!Itu3A^F@Nv$4|DNdQCIXl6LaO= zidiDX!0G^{@^*491rIz3ELJzPFj!ylrTuT^>NmK35fY=orh|GbiJTbhLFH;g_1D3_ zl{?fZp(?M4b<|dE&<#XKDwN#4Q0|XUl~;IluV+&%2_bQPvBS;vKfe%z-?u@60vB67 z1&yHFg4$imsNUDc!l6^&8a2S16+hUz;VbC{T&&SCzcovt=HB%S>j4Iq&q_&+2b901=TK=iXgWZp!0YGB|c$?QMq zK4pZeaS&)L3&s%9A&oEd7vhIp($wz!Te-aYITU7no%Br?%8kiE-ZT%p1SZ^OX9>o5 z_H|u7-3ce*E|?px-OY~Ky=E|ejm8hz zvNbS%5WnvpeP2J1ZoKG&XmLlRR5#nDqM{FCb-Qs7I61B!^=S!URO6r5tT1P3Uqe+p zMg{8UvorMfX$H9`xF@f$T+!**wcJa(6T*r9s;#B(yZ0iyC6AkuN#h}#cyf_`0e^|i zz-CIdWuaAppo31osp@b7cNCY9SHGSDrZaWgkE_;WcF-2HA5FB!2>qj~ zS~xZ2VEH0#TzyVl$7I;q_esj^+M?v^so_T%w8_hyb5dF+BTt$pk~Ys5WiqEmyyjjc z?vkK$avCP1ey8u_Ptac!UQUe$U}|DPUuTtMO~!)dCS%<^s98I4*Q0`Rav6IZ8N_|B z$9PKSVPJe(8kieNmXrBB8k?GmayL?PC6TN>x6J69a>A4j-dgDMI(OoO-<%#4;;4#^ z!*wTfF^5Ik2E{khC?-X{L*HVm`3wtv5wFYNQc5kUGSm%BmHQr+;HgT?dv&L)GY(4~ z4V)Po@Q}h0kL=zg{#%cnZcXjfQ2O=#xVo49sqNRTOa4@XSHVBb+Af<`geh*_rOW)( zeO2lb;g*X%9i_zwxztKuV)1QSGBdmWr{&aTB@WxCW*;)7Dtyzo9*C99O`Tq=EsrHV z#NQV9tY}|XX7ra!l@g_8a8#W{ep#7YxZeB<#;l=!Vaqf-gKhEGbXNOUeYbeMh3}R} zO)*n0uCgcd+jqs9GG7XN_UbL}eUNJWoMO+@dS5{OMJfReL0;oZGQAs*suA= z;!wn=Hh{X)eRt5}_jY~#@1CIm*w7L@E0s7nRaWuJ5C4cHo;z$&87w`t+@fkOFw}zz z6>u?7D+P6Rj=P1M2`*i7;Oa(U#3JKQdZE^uJ%S@*&+o+0F)C|+kPyBfd!2>lc)+Yz zyG|sYnP>Sf=w;$_M+loPvhU8^jJS+pb!thoeaZ2Rijg5FniEU_P#w_$$y_A#9DYc^ zjC=5QoP>L`Rf>o-@6hvPFc4#mP+bXROw`ykO7RFWxJn}fs!(~&S zPF?~r`Yf4%I4^=|RH%SK#sns6F(|_`JRt0?3Zg)Ts;w=-8BqiT)FuM=3=2SIB-rS2 zA&|AED0O217iw1d*H@OJp+y2v_U_0eR67GKw8258#UecnN5I08mxWS-gQFQc*7h zfTRi;AlijNxIu8}n{)m;;Mx*J6o>QKYG=WL2}w{9tN)V*i2AV7@!(+uAOnI^7v*+R z1;PRJ3KU(GOUsEx;LLU*Jb*Vn_4xiZJP~?pKCtBq5X>)({X(YgQ^WKZ2BaS{m(wZL zS0A_Nn)x`Xg_A&8&Ui7OSO)Ap2-NtUK>ocm)B}KsH5C1&_6h{J*B`Ut2_VAz6O^|I zpiy)OK^Ag`qMhkrLoJ19nBln-z9GnK+MXsvD?Bz>PwC&)4ul-L1BMr4jXp-;3CC{~ zi~yde^beY#RRI7aH9C1W2%$MA%G--T2^WiyF3s67C}M}9vovW2C1qyNtW@Q=kq)x}8o+AK^OZ?e2 zVm9#bSPee6O<3Z%yKCg|tTo4d@;(GI{%nNj!5A6cM+WSqmzDwUK2+2xyb^K`4me2p zyB7Mod-+2}X(*P+!trqX``|EK03jS6hy~GB0rj5(ZY6t%kGb4%xM$LfxjYUrVnba` zBPeZ{QSzdx5ZFsIngQML=YV!#B|OMjlV=AUY)odRj&R1i-!jz*ScAK`X*}@M2y_dr z4sm~;10xG0C^y_wVMMDPvudR48fn|wYBS#V4%0~uOL^f_`!TEt4O26-ahG9yq8%=G zKU}#g>?kLkq(ZM7z{?oO8zHC}p=1;BD=;GRSSOm1F?J*33Oo|Q7I~-=nG&IshG2YI z6v_M{l59Eh02GyjFp{2OE^v%OPCtdMKP+RktmtE|;*ADrM$_EK*B=|@9WyldMFU|` zFN4EtI-@#fw7WJK6dhwmdmq*wKm9Qk^Xnky`SqBO4R({q(RC5ANBObOI${?b@AjFa zie*@bc;h0~^`HcZMEF8dr^-&WiiE z#=}6sZAY0z5!1x7>K6*{G%*(RxCeLWQ7?q>fKLj5GloDC%&Y;x76<0sfq}7r84kj1 z{6eZfMR7f)6r5`FK+{f#o~-enDhlv11|$>AbalY=%P?&`pi&89#zAOyAc>wYz=vzAAOh3odI&FZ$Yw%EDac! z>^BCsct-}#1}CmZe`1Q8B{xty!I(d_C+8)*D{4OS?aiIY*SoS$^T=7e3R1o?I=q^d zB{cG9pJbWWytYxXd}fgy-F6FsF9AIK}em50OR%V4tG zujgx?;?b54g8cl#1KDcd=?qWvlS1>Si}GiZ^GXs6EPc(bDD?2(3f_AZ++llbhcUk= zr|%H;b_x2nxGL}A9R886fjfWUyZpCS9dEsg&3tqXNqz%`QQC!hbk>1Qk=HFB+#KM$ zb(-bhL`P^U3f46Wbt+1YC?XaVMf*m@$~}&6;!DJ2y(p$j!4#$G8ow-lm)rO5l}%w* zv3*XIkJR_#^1l4G#A2_eV)v=y21}j747!%Nw{71oh?vqi$x`#{rFOoh%_*e=QAU-R zyKm%5knl2E?y`wu?IB;fk>Y~6@AmU^Wq}7}rfelMa@MQGK3|>6pM{j)qA53;EB84r z--*)N)1^Cb%Kz0AbDU9uxK)-hUZHSWLC;hP&eS}Uql3%mAf==gOA6|I+hbI`x)QN{w!FjsE8vy+Ko@)3kcs8rugo<{wPVGixoIYpp)l zat;!>_4s(tG9?7iw1+pahu0mO>s&t9xt`St!sZcaJA{iI#%VqxnCNAfGw`sJAY#hmL-0Wyn z*leUyYm8=ZV$^9G0yixOHbLGs^>#KbEjMi=nm@2Ne^F^(acu4hYF^A~p6P3*v1^I~ zw+!>Pw5~KS*tB#+w6x^5%y+cZZ?x2cTPH}M)H{wLPm^2C`&x_a5k1oyp{Tat_0~x} zfoXv&?CNmM8o2gan<}*33ETcxv)X~4`jK-Ui@BNu$!D3 zMGFx*PozF43UfB%Xhr?2g^q$%7+-Z@VpQxz;mqe9SQp&Y(hd%mPVQ%&$2U7MTPh~B z0(;`h1svQzz+JgFVH|*Bl|m-OAjgA zUyY#J?M?{pibe^ToXhZwquwR;MC|iJK>T-~$-GrXxf209eVI3^sDz{s0d{a zX+Gnt@ar8<^ri7GsHaK29(f>=eFTbnjN89O>g5XUZ4@YUNJ?ajmI2iltssR5qm3{3 z+e5&`E3`P5eydeZV;acxhklcrA8vs9auu$