From 0554dd86f08f106fedfbbd2733655034e90ba71c Mon Sep 17 00:00:00 2001 From: Dmitriy Chubinidze Date: Fri, 16 May 2025 09:17:30 +0000 Subject: [PATCH] docs: scaling deployment with MariaDB and RabbitMQ An article based on Dmitriy's articles, covering three ways to scale OpenStack using MariaDB and RabbitMQ. Link to original articles: 1. https://superuser.openinfra.org/articles/scaling-openstack-ansible-deployment-rabbitmq-and-mariadb-option-one/ 2. https://superuser.openinfra.org/articles/scaling-openstack-ansible-deployment-rabbitmq-and-mariadb-option-two/ 3. https://superuser.openinfra.org/articles/scaling-openstack-ansible-deployment-rabbitmq-and-mariadb-option-three/ Co-authored-by: Dmitriy Rabotyagov Change-Id: I26faa7e1513ce81c17282c84c931f0ec619cabb3 --- doc/source/admin/scale-environment.rst | 1 + .../figures/common_deploy.png | Bin 0 -> 27913 bytes .../scale-environment/figures/deploy_one.png | Bin 0 -> 27258 bytes .../figures/deploy_three.png | Bin 0 -> 29968 bytes .../scale-environment/figures/deploy_two.png | Bin 0 -> 32251 bytes .../scaling-maria-rabbit.rst | 823 ++++++++++++++++++ 6 files changed, 824 insertions(+) create mode 100644 doc/source/admin/scale-environment/figures/common_deploy.png create mode 100644 doc/source/admin/scale-environment/figures/deploy_one.png create mode 100644 doc/source/admin/scale-environment/figures/deploy_three.png create mode 100644 doc/source/admin/scale-environment/figures/deploy_two.png create mode 100644 doc/source/admin/scale-environment/scaling-maria-rabbit.rst diff --git a/doc/source/admin/scale-environment.rst b/doc/source/admin/scale-environment.rst index 6aaaae8478..3ff8e7c6ad 100644 --- a/doc/source/admin/scale-environment.rst +++ b/doc/source/admin/scale-environment.rst @@ -8,6 +8,7 @@ using OpenStack-Ansible. .. toctree:: :maxdepth: 1 + scale-environment/scaling-maria-rabbit scale-environment/add-new-infrastructure-host scale-environment/add-compute-host scale-environment/remove-compute-host diff --git a/doc/source/admin/scale-environment/figures/common_deploy.png b/doc/source/admin/scale-environment/figures/common_deploy.png new file mode 100644 index 0000000000000000000000000000000000000000..9dca4c528dc38eb64cf78aed0b01bf327d38e5f3 GIT binary patch literal 27913 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 D?W^O- literal 0 HcmV?d00001 diff --git a/doc/source/admin/scale-environment/figures/deploy_one.png b/doc/source/admin/scale-environment/figures/deploy_one.png new file mode 100644 index 0000000000000000000000000000000000000000..c31b933579f8220e5ea676cb05a2b1b1398b1f35 GIT binary patch literal 27258 zcmb@tWmJ`2&;SZ}q@8?(RIqp%H1NySuwfloBPSn}c*q=Y7tr@Atjy z){na`Yq5BC%-*x7_RO9kTuDI^9hDFj4h{}oT1rd>4h{hq4i3Ht84>8geN6L*gF`K_ z78O;J78NB^a&fe|y{mXuhfK3)^7;L@+kn?Cx0{_@N8dAex_Njm z7hR8hJvT|=1}7K-$;rUnl`1|QQmg7r2i_#WQm_sP*k z7p5@VN!5^Cwg2ONcN$t)`e#HqR0;0D_|FQGS7__Zvk1mia3xQq41Cm!jNbEM6`_8D ze}0&~R=`7&y%wS^5j>Z6tmGL|3b!iFkn|P>?gjeLWZkT^6lolN@1`$CY-|mj@z&WH zE^&w=xn00dGM))JfA3yTNZi9T+q=d1KA9K47qu+GYZJFcZZRz z7ntQL(!4PL#J8uYzea80Ct@_l|C_u1ygq~BG(5%9x^0Gj|zrZb&`0#s3uc*b}!v*}4-|~d~$rjHWj_;1S z{rVaB5h8uRU9XoNp51zfk7i|^EO~j!oy>pVa3VdK(|!gFMTKU)9ABT~*25ePO+$9> zB%74)NG4;{(i@fkjkm>C*Zb9$?GvVpv3<=IhN@QA=ig}Lfm}5pj~>KX1niKHla?-; zmLtSpA)!XmACnU@q)o|~qhw7_=ZYe&k~Whx;J$avw2rRXKkoB|Y@9r6WzdBqUdJji z9AtcF63GUK6CIjyNCh_-4yPAo85yGO+B(-90xw4Pv_u%CDFbTt@uh+a8x`*7{=cuEkEJ}WyRWFY)lC2j##1*NZIY(I_dfg?a< z{tNLpHBa<1Lwusx{%hQm%TqPRBh_E;^L5iU1ce*(UB?NR~Ww|=r z_}dI_C~X+-qL?}FtkArlK;A3AMJejFsUfjLoHRzzb1cw`m48 z6Y@Z>`TD7okMn>tzOz7!@uFl0$l!@%_+{_F`t=pDFYN=t140*)P*66x6t)`*MhF=~ zSj~GSF>Wy{%0((P?4l2>Vvsy+mW&jUMLC8y)7aHmq}VGmQc_mZv$7#l#}u5>3DOw} zEmSNtC*c&btmLin>r&(s9uv=1h<4z27*pk@-?Yb>4yA4!Z0MYtpQ@fpN=FowQmDqg zX;rQhsgtggJWa%TC!-nhx>1f!w@huf;irA6vvp8IRzo|xtaq?m=$ZD;?L<5)&dX=1 zWT|ecBB`dVGv*TJ&UM~(S#`v7dUL^b$>w1+G!dMAnY~4Jxx{&TxoE1jY7n~kG!e#} ztQ-$z>J77B6~D-TX$-3mW+oGTlpNX{V*53@5xJo_bUEa&p`>a=oBahaLu8{6P%|^pJFG_<`1w+}Ou*2{=;1EfBS+x8LF2FuboX?(YL|AGau@&S06Pug2qAy;i|9x~W-AwV zM8;?hiM-Eo)cnT zWQu3oG+8mZpWYhnm3IC5wg@G=Su50C` z?&X4#9fDoce8YloV`Dw;{PaT1+|F#@g8KYYvFgs}Gm#q(pQz6Cdx=}ui)>=MSFEoT zc_u)dSbg*S` zeh^ccM7dA-$+*S%UcO^L&A_pVj)`;ar`j-6>SQp}T&EfL2o)1^m1F6{#FT6`v#LQ- z)Bc@HDIlH2P?i(rlY#Z_njkHXiXo7Nh1N6bAG-lowQcAM&G$QyE?1))%K(7HVwUrn4)ic z+8@OKxkn}}v0YOE`936!Ehnn*C1a|Z7{StummmDF&@Ff@)y*J!xUIWqHmOs0Q_a%^ zm2*uN6btmXTaDX|`;7;C>@)TTTrF9(UEWU`UK@+vN*qMD5`}SjIr6rpw(z+BcI4UQ z>Ek(S60^7dp+3Bnz;_mWiRtbY=hfSBtNW^1ZHGu;M%Bo8Ei$rXjUj_06o|r$FGy1q+9M0Yr^0#(0_g3cRsx-Rj{tAO+Km=~}FK0AM)p6Azf<1g= zh6nmfYWbR~-dH|w_f~(4ehTCDFM8DT(Yki}yjCrFC5agGp5&mUvAj~C$h)EhqY8T} z`c*8S-&V*#c#?Pg%`W2g`=I#Mg6)k+!*%~1zF(eY_w4s>_b->&5~CCP@2E=ee|YGe>kr^n=UZk#ni8b?PephhwyUlfHcO zfkX3RZTIASXUnZftn6rEJBerYvgvaB9MSB;68`v%ztG`>uu!r8*}M7R8O(YT1%df9 zg5TVa;b-v^#bt`Neq48*#yuXZcR2&Am6pb%BGv4-w?iO%umYS z>hI`3?9e(jxhh=!^%K0D&FZhw#R_)cWS;4EkQY-#>&ENK@>9Li*g5#*Iej!w9Za3w zrRXno{`xV0Vjw?zJDXQX5<-%ybN=+QaKC(QX4=tjg+#GfQSq6U$aDpc@M{ce@|)Ek z&&8;}lFhGSz0>ddu{dTo9FvjEvvK z%z{@%OyVy%&=MfGa&vRyWoGvD^knj6V{&w{WM<*v;bDHu%FN2j2+Uw~^>T1C1~WRi zzWKArzw3yZyPCRKJGogqI*`HEH8yc{cM~8dhi&vfKY#Ev2V4K|P7bbrj|Ci%88*Vq z!t|E;f7S*-`C+}hO4eX=J8dy*dw@K^9)j%b-2DH{|G$jgVZO3-(^tbRj+UOM;R91b56?n+fHS+EL*H0}Uj1C+QtP0>> zHcWgIspUW+KsaSP z1IJ3q?0N6#Ur|wkGZ0Ift^Y>g^%z_r5(zkm+ihE^wyljfxvBdqvYW6P1i zVQkQ0>sHqK>gQnBQkA^>7|#yVzx^Hu^XeJ=UM|69=$dpCwWb3x=s{}2Mya3#HFjmU zDf^W!NZ)d&Pr6bV2J&~Y)$Q?owsTqc`Bqm;=l$7QHEee*Ey6%X-6o2G^{faAJi6C^ zj)+wv8&HtP#Io^kTj~W_sgz0X3k0kH7*zt>KvHzOFGNZHZBxL<{r?VLOF5V=2x;SX z*^qLfXuM9u`9Md#6CuVE@`o?q#mTNy4qMqVD(YA6&S|!bB1m@1&B&%(eJ&53I|s(0 zKdJ8(BHcJ7JbXd+OA6GL09`4|mrmj@nkfl<1|brHqt{uRvnL&Kh{C^)Kl7 z6xm}8EJre4W=qa{W`vn)D{Q41-Yf+s*v-a5kUs>hOR~(GDHGEGiX``ewDV zmEvwy?kB%M5Zhj18W&;yDa(}jX)c1}?ZrW|;0|rQdQh%#RPgvaB7eG!FQ7Jz5aA9b zCY$*P<-ST2Zn*^9En|LN1tH{OGacq3`X*LO41XEr8nsLwZ zhDt+ftHCk9dIk08kJMF+k#1DwTDa$EbE7g!#Oav~1{vsEwKVK8FzlzQcrQ<;o4{x@ z#cn!9cDf$na=iKtN2?lRDr6tuzz58Q&=dkJb&-L9E)%4pXS=$JiS)AH@7KE7K7U- zO{dXIpe~mCst02>um=SRsa`E;4n_JR&qF?nuu3QF#mHzZp6Bu%+N_@F4 zA&(SGOu#D}Xl$80M1w_9ta&wLpn!2MU43r70#9)-gVF1ZtF~LciV|rinrWjdl*!%1 zmT=kS=EXmgXkY#<@w`|N6Cpw~qH{bosFLCuOm!x&5Ld@be7`;tZ_ z@qq}{bJ@Q5-7nm670{nI6_YN;a_!yb1Hmy51tYZ4)yex!3d5R9HXU_cHjzAPQ|bA7 z%yFnsBh#H|$CHezAL9^Y1UVXIWlRkJ>yt-)*t^6g@fel=-f1 zz_qH3wABMSp|5QBJdX60qH#v40drsBJhUasl=&`TbN1tdT15!-gA9Qt2{rMGN78e& z_$1cUnq_FI0`!U>!@R9!CDPyD>N%Zj$rIUU_S(*dJI>BRq_(!LHC2aQ!5sU=t66F) zO>%L?l?x!^u-X+|zJ~_0RJHwrT``L3Ez`X;3C0+G=4of4;nL2X^-!%QpNygbVZ+}b z9MjSkHU8Tl4f|hmeJeFP-t+m1+N!!6`y}3TSMmEz{iYx`jT5lJ#_lZ84WDE%4T1iu zS&1wVA%h0Ue$L!58d9`X++iq>bXTu+R1uc9u_d3QO-DLEc>cjuDye1UWEGl_m?Yge zRT(*uD(P84Z!RlCB}a27k+3VPZvdj|liA*qc1crS6g+Cfk72xzpSFs{UC8lcDt(CG z;OKfm(1|k|r!PkCaGTV4Ag}TXfr{GtwM*)T(J+GzA1#f&Ch^9kopZOfOM_>mu#Izs zVKV7e1zRJ`{0>EW#pzNZ#fG&1%7lolYsb{ixa3ydIldvW~S;3g|-&bXvZ< z+T90$Rh*e-HBP@6w!73@A9i>4k7*Y-Qb8!=nt7|N@WW2Wr%Z8)cfdyb1sNnuGWGCh zYfeg&!=cfg>A<{r@z1QZH2hs=47%>Vm+1D%F;0H&`x2av z2r=bX@-u?T=jNj)v0^ulUh^eQ2H~z}Q$NV!C ziI~%23{-sbA@HX<)g{dZ?T8@ZHXNl%w}fcsSGk$AeCu6=venl2Ds3gh=>d1UEh^-t zeQJ^Mrr!lMIG(sqxb`^|qAo@nz%3yKyhuC-*C5LaSs}5)OD3_4(gx zaeJM#GNwwKYDpe07*OB_*;!hzL{?uw$%}V5q^Zz?YPxR~$|Jis6XLQh@1!ALY8!-x zlC+YbzQ|zb6BC+Y9H`DmecuXkX&3KOg_H8i$P3DNy4;NU%9Us3^PSrR_fthzsMzjP zeb914{+Jk!B>Nc+_pIg{wea6`tP|qa$pKK2hcuk>Qn1U46JnWcBDV%*G52Ij4DM87 zCT4{GK>ZmX6T|>4xAS2D^)@Lpa+ma5=#AP+Sl#JqNeH&Kw)R>y4XD?T9(1ukr%KH0 zR-&b^pJ{s+jD(5D+;z2H$Ti%WF#ZyO?ZsI7_bE+7eHxN2T55$18Vq7?C1O4gI}(nw z(4Iw*+Z3$~X+N)zvtr+(o6=uzBmfwYqT7`Cfbfq41-Kw$0R=(a|F|N6OP2E-aL}TS z#8Cb?WN<+1>tEju4j~$gtkeqhM&_^c2DHc!|NXWKfs+=0L!gZCk6#D4HquX7{@qge z4X`EQ=MOLb-BOC~!@tu&gs%Y?5LqGt=FY*e5LS7I_V4!?GT;kIyv+ms^^M@;P)+_$ zgA0^E{;0+t^qlgK8wC%vu%7(;%`O7?T+e~);xF#N5efc39dS0}Sx~-YEFQCdi<0kY zAd(A<^|6QDQd8w@hqY?0=h3psK+LP)Ef)HK$zsLP`9weT7i90#1Eu-7zSN>H^7Omy zNrxi1T^=s=z4G(}f4`dB>RtfZy0Htd?zk%AC}#6h8@)N?#6<%nG`B2 zaYUm z4qT?h^)^}7U2!_tKABLYC~d#5$MmC{tMWdd3C>dKyQjqNqNwgN_f~By3H~G0XW_!- zia)uJibFmQZnzbI&zGfz6!)7hclP zT&afFN%dVdQ)!P{PFc1BK@cb0u!Aiqfq~|I&Bs*df%{oQ_Rw#f~F97%BWR(U;pKIS6K1l&L8x7j$<5s~1X)YZ(h(pKs z9Bvu8&w@OBfePAa`o|VOOcdVm9WqpvXcC!ogK+5SVq&$|wVjK#CS--a7S2w{@~Rip zdrVi?vKQgmC0^MW%yPwOHd-?*?1M?^3Gba(T9yy&!rmD{^mQMTGc5L7D%gDbvet*h zS+;olfKWVcl7OyE6UFo`Zgq_MKugRQK~u_nA(9!Fs-v4GPcEDJ*Qg-Iypv&g6COv^ z&$&&kUYF0BF?zVA)T$}OA15({IAj!FHXArhg5xxm$z=LD2PF=4!{&QE7G7LzWzz1QF#8d;sl%Lvj2L|i)6N^U67tlA z<$AyROa#q=Y4=vhy#(K0TucJGY3R$laiY_P)0N5!oE6f0;h9T`1+Qcp+D`4^yK1wsw$wWe>frV)oM5hZrdi1;1N~bGbRg zls}4R$mSFJ9`U5iNBhY6Oe^jz$ehk;Tz&L(Bgv6wf4zOUz1{j1m*mMg^wUumWIcS{ z=W#~}SLp7dInw`Tp*Ber6b_<-}Tr0k=C!NatBdTr+9nNOI3tYF|7n(=ezE0fS z{AfN5(Cq*Ai{3K+jQc(D=*dmV#j%71aQMB-{=^>>xwBKU?lM8@#RQjLMnn*%mL<+I zMZ4gIwypzvmDgc&xw-K;{NC{xkxvxdF(O(7rVCB|z2hquI?->7cY6in&89S6Pli^F z+)4MQi5nbm^&MOFnsm?}*Dw7XJDe2jb~Lkn>#hmxw~+(OI;OQ z)~?MVaorAkH{H@AM3r26AxlCDkq4<;SLct1E79%U>!gNse%$l%kBRJ@+7HF$Rdgd! zeqtwy#R@+PFEk}O4LNwZsOE}6mzAXV+j>xj{CeM4RkD;SjFwStusr}I&`fc{(z$5o~l+av#@m2QYk8WBGO-<@=^0xfo zW22J@A_tm>>*dZ#v4H~_?*=2qy3z3Q^v6}qh#7|kjqUhcKc)SJOVTR#eg=_K%Z?uH zQPt1gn0m!2>e7rArQoCoFpJt_9XIOUm*0|*-ny<;gVaGQ5aLA;x2O@`JN)VcwA9on$Ntqk-$Bd|x*~AC&*s*Kq7U zO-y1MjHC=9{hQ`!U&8)zN~ZjBt=vcTBMNP2?EZEjj&v_P8(>ZDkMdwwkePO01D8z> zyPtRwW#gN63 zWJdMF9M4Au(sh}OiQDb5U=O9D#5-lAWJW0E{uCNhuI58LoTR_;9j89VKGu}aF26~q z{#FMuTMax;=US6_6hIT7UMM)7S|`qmDr4TLKw`p^&G4W$KZ6Fw>yO-?43!;D^UNUI z13y36znUy=r|XL>+eg7hx{Ss*CT)j2Uzmw`&|m$!j+CFy?kb0e&vL}Hedb*}E8o|! z{>JZ(qlp1+W>X(awX+(v_FU16>b{*9NVXo96RY{SbRI&*jk7=%VOcwd>_ z2sH&waKV)>H*p837q9!F&d-t{m6~tW#&#`Ht#TdwWatIQn9@)hHjbR^r>G0<#M(Qz zn=CdJtk2#2#4~6uw;5${kzr7KxcDS#v7?av6#KZ1029hFT8rB}>XI>03iepvKi4qj z?N`@KqFF#3;yu)#X|`vMM|~QSndPFjc!0kesL4(ls>Tor_dM* znL8qZXLN`NtIHFov%_2&RE1Cw?MB@e-?TV%R>xK?_SfRa7!PqvYjkd`=Q*F**up

fy?t8DJ{4poX&0SXH=AbBN!sG%J)O`zm=ylYj4*m_QPJy*$gI;2Jo>{5*U# zUa1K4wo{hwW;KD=Rq1$_A}#61%y_t+0jP*k#Mq}r$QmzKuSKXdb{@ypJ26qZ?c2P{ zxsLC-j)zLFf8h2C=?y2cISZ($PidCqP_d3GDz^+$!MwlM=A=6s=!7A5Al=_kO0FDl5-{47B} zkyP_4GYxeYE3n518E|CnNbaeg6zYN!K!@|K^|}(Kj36qkS+!GF#%hA4(&|&pXAik8 zC`FCS4G*6k2`=FqFxn*%8!kq=JkNB|Fryuea^1puRP%kfnmjk~v6AK8fyksUUXkG< zStePaxGQ#xXltXrj&sXOihMe%jNDGsLHwvW|rMiN2fkQzV_sPYp3Y_Y+TVYs5#y9<3Pq z9t^os;H65ozd+Sj=k>b-ZzeU_W<3;AD?ES}t2m+r!vlN^s;>`Lnyc09wlCGUpM2dM ze+;`?)g&a><``7GrTY52F3SFXfzlU> zI&MvGshK*?*)I&|sT*HJ5;-htbQ~Obhg{sq``>3nmf6ta%_wm$)R#4y9W#Zl?jMdi z+rc{sq<8a|gKbYAE()q*HgQI^DR4zL6wzef(qL_~!gp%#6pCGc-=+_by&JM@8wvgw`#`L55G^)Whv1?ehHJUv-Q1Xd#jsjO(`7;4ByRdM0oq;d8 z1DwS(x;y6B*DDn-O}2s!rGoES5h|BUv@LMXVIhbMd5>s~%PC^hhFm}ax#f`&5r}Mz z4*s!a_9JP~RM``P4p$&1=iOpOd;cez*pLS1DRvv-{t5hZ{xh5;F1!M#yhcPeOg_S` zPYs0Y?wBS*AhMdb2)<9ujIERxRe@&$0e6PUpg(Idq{B(~)rGT>0DICRh(4l!RN#4L zstbc`d-fIx;0IF!{GNz~Rwr)mQ`!xO0zNxaRu9IX*8$-H6tl||herdEf!2%uy90dx z%<a1Rh4yVDk zSOI@j@NtQ}*3^I(5lii!_@0Z`YwNj>$J=JcI>|Dt7we+X zlPnU(Z>P$M*-<2?GcxWYkJIS7+Ud!Jg_B6npjWQhUQTE6XZZcnr)OD_$yWDSsQS6w zwH{^Qt7nFKcXlt0EfAVlu5(Y;^FSX}6naql-o*NqVzJ3&fvOg~p;yr=nv%cRzDXc7 zFM97?Wl+a()eRL&I9FVbWOtrLk|+DuH)W}97fd6_4P^)5C1(V2Nt*E1;*Rpp(OzSZ zO%=o!E68)WSsBu+=bisH)FWfbB7EtE-0}FtGscm0@N=35aLH92=H|GC!CfNCT_iGz zsT-g(s;x0iE#u|V*Ndj+YJVht`XeJb+Q2=D zl{v%m{qunRv7<3UhUL;wKv#_uC{9*E!oq+!2YiO*6$7O~ zey5AB@oCnB<<5!?SO+I@U5O7!r#{r(T+^Ht zUm5`^j4Bd7T@Em1F=(UGvE^cd{z0vzsYT&l?Wkw6D+15|s66)8rabxAUX-oC^z(&@ z?6>ArvrZzG57=S#LNz{192Vk&h`RXrdp>lYutF{U+eo54PvYBl|1bf7Y2m% zSG#2vvUG`{^f8TseEmgpA0x1$#Ko^d7^NfR*^h^X zziCJ`Sz{~*8g8p>Z62#h1E#tt@9Tw6a$gLH^Q#Wjt}{i&Ti=@qcrzcT%zGQUMDX?H z?Xtg@nQJkgV8J84uVwr_YpJil=-}{eo4Eo~)l_DvI<#piT>aLWtc#(Bpj)jq; zm5XoH?6anpL%T}i)o{bC)K=Y(eCf`hi?hfyaS$)=p2SSV)o|1{o>$>z?d&16XYYO6 zpP0Blr|6q!-8i>>n_lhLm_nJgkP@&yaPqpl*!SouOBC0z4SWSQ+pg#R^eMNiTtsNU zyT}^%%vJG(a)2A zwxBLnB{lnQyqQaTXggSloFRG0pIg8FzO&9TV^DwA%7cf~94|vWnPg8_q*`0fvd)D} zIsk23_9z^|Y_65Z2JcA<>D*1)FWvpJyfzfnBp#^EoogF$oZ$6XA~!9xLyJx&+yWEv`p zK#x0`P$EW%0T6nkR0bk%HdF%0~x&q&Ebh+ zbj7I>Ed9Ab88o&mUC@!U4&2fDuS!fqcHSDpl~Ye@&W>V90jodrh@oBe^qxfiD&n60Ik0I?(}Htc{z3IZ)$Z-aYsXQ!s|;({55WHqfviq(fm5^59MqGD1}&de{b9_ zev{%t?74PU4+lzUws|4`<6`Ko@CBT^1uyojlLG+@YRPy3A^xq+3+6R7(e0 zYZ2t)H_(2}oxVRkMh39IJZXYEbDjXuX5w*673XSG4%3M6G5iWuYQp! ziH4za2AvyL@?FT9?~%xYQomtmpY^)pWJAxDx^e!J=r} zYjb-@-gNY*wu=Mct>bT1i%#<%?kN%`34?*}NuSBla;N4`Mcx#SEX8a={Y9V0we>Y- zU+1`+>4mh2DLU`oq3J}-TPBys`y+^_^X0$=KA*>a3h#GJ3B$sN1xXTGzk{ZQh?(gY z?Q5W>rSJbfp`?22FjrT2Ms-n|nM{!bR!MD;(D+np>rmxceDuxsnrI<130+Bq^` zOb|X1R@)}gegB+jHW@1YZjXnPQdKhBd`=_>Be2M%F(PZMs_oQxMepJqj)4-FU%eg@ zs}^2N$Lelbhn(qdKd9|@{P-|9$1{ugCrPyZ0(d-U@_MHG8ZJ-+<;u38RY<*FT?$Rm z3UE7vJ%r-J{RssFmh{_K_@ zAsUoGA$0xq)PK|>pYrF=*EOY^j+Q&6X%J@Kf%_lfU89Z6zkO`Z>{AY2R{W@>!bLd# zu36bs5sO~^+o*x6{~!pXljmT*HJJM_p#E%mr;!KARacSDO(b4x z0}J&RCymwl&(Bl(eA)rSEc!NHceMi%)dF4)9c1wghP`o9G1w8%f!KJ8Wbh{R_7cDP z?$-~fYc@Ai;7^yvbuE<8Wl>k@n0jztk6Gl_m&ff>GUXN2PU}*v(epXRGNco|YzA9b zh{f>sCtC)~c(o9PL0k>1H@8?NG6CQ!nKB|5QNJ>(+Qn!B`^j(9N2OM-r%~vC^N+%? zI48|CoC;ak$Or^3+w378aVrKYv{E9F|Cyrsf}mHGqdJ2{601Z4NGcLi7r;`Uc4Wtx zmR=0Eh%{HXfga zW@kwNmAIH?WBnVgX#$hHe<@Hsfky^{FU2W6PUrq%*cKzppE;3*$#fC;)!B4sjI<(w zi8>*pV^{&gmng?-KMrp{zGRmKcH~L20#HK~3n;e17@U)9WCb?(R)Y1nKup*Ori0RM zR)2F(!a4sLcS;3z?D!refSdv+9V%V(Z?T^d6QG~2Yx!&-vbSmg0neT z6bMKEWQP+`>=dL)1iabR^>r@GY^!NUvUqff@BKRc3Q?_LDciBv2;OBy)p~A&c5pnmP-dry&&bT1jFx^T^i{sQc5I)+>KF+nH?KkdCum zBWyTsUpXsUrydp1+zy^CC=g)*|NgBO*k1vGMONBDYYG@E(DRzY{er?(NnTKrGKB6Xj+NQhJ?5W+b<74DI&FmYs z6WwaC_{jlRck7kE=V1o&YEim_4TW+RWf3)@#2XOPi<0(>CD%~_qFMVEmD+bfsK{<9 z0aYG9JJ;7Jc-(v42%Z)(2lRMy+S7GC7W?ba7+)DmXnG|pTZHeJ&-M{4QICC{ABav{ zihW}7hk96pK>(BS9D0!dO3Nh>;JB@XeFuVUtMHz3&jZ5PyZrGV@i;(gp9V;~|4-Kc zKWTSSisQ6#^fWsE$7n}1=bP^@5r_aL*$In0{g+AgK&n3_ln?^rnI6S)*~(S)$ug#` zAm-BmtnD{|WC(gE^1S<#nb!d__~Qs}?*YlV5na_}7L@*dWb@GR&L8>Ow5$h;V^s3qN6Yb0HATxEmn>{XY64G&d3nY zX$oxE`KISdjrW!c6+03D$g?_*`)?KHFd*nm^+uRLyGIWMhMU&A+FpDDd#7+BR|Vv1 zo^rL=rpfkczGw~v=smcFdj_at7S<}fmVh(GWD1}>ec!jYVMf3xGa$PR1rr%96X+Xz z6L2m1=cI(>0A5&9KVj7hSL3Cs!T~)wu=sNRUJfYcvC=0cd~&jA~J zABo9=5s>NmaXlSyGD?blw2uI4aG4_se~U~b0VdQUmu>%5-~S8;ZlYXij(HwZ7w7LcltAkdRQosth0>S470{pt%ykN_z=pZ~!ieQm-Nzp=Un%P09pJT)W9i z{g;B2z#JNd1lSy^o_f0X`;bkT(fA7gujKu=!J}%vC>?R73 zh!7#1@UMK1!Gu5nAq99M8{>w};a0)%fR)Ec5{IS&B=ST)Zk<Jsoy@2E~TInu7>f zev_Ii%k{r_Tfp!h#np?gLP7`**vifRby$si}$l zk?#Kt_w=Fw7>B;G2tWf+GTX+H1FniT#enKW55Uyq2m(yK`MwSR@0AKONeHO_kUNd6 zXGSJH=R*t=tR5n+xdzbBZ5;S6jd@y6W4k9Xx&?ed{X;i6P()Bc5DjoxvKlhj%i=pD z<#a}1Z9Dy7V}NWkD97j@t9-C-_kgRkL>A5KU$8h}nK-R~csGUy-vvK`CfVQ?3?RXE z7m^47O2PnRcrofN0flA3=H&fLC*Zk+tn@>;6WU+Id*pzHEP5rVVGB>em}HajaTjJ- z{H{J}1AVD4R&5JYc@gXJfbt@f*ILS`FzfIpkTi?GwKk3r`RoI*X>7)j8emEI0Y|ma zzqu)?I8f_p;CooD66gg7jMU$dff4fq;6;fU*zaatdh;*ktY8=RFoqEr;M*hU3Q_72 z@*Qmkpg0x^3=U5&z%hV<;O%ZbP%-r>n*J?N6}8O8A)4;93S)=fOVTuOSYC?$(>o3>} z?0^S`7Jxx969cd}+dz}khShY18i~^aa{{Abi%C%Z{4ZkPVTf&F^meoYMEf2Z`;UC? zK3}!?;ob4^5D$QMxPE5)S8?Y6Ss0w=AOJ#zvrlkbwin~&--m!*<$@St>r-L@V3fiZ zAEtq|8s29G0zO(U_SM=@yr^W)oexY=EHTV^0U>z+J*4~JR}V-$EY0gY^qaf}*#P=b z0{=|;Uoraz&?%ul_bKc~5kYpU-xR6IV~5=+FS+5dfxV1jC>me;NYzu862vv9(u2r8 zqQhrZqynrecn8cw?-hf+t_PNZz;zbtDueFf05_65LM#6&U=&Qb_KD?y%kM_Ehs)OQ zQSq^%JKoG97^d{x$!x}eCx?X4rOk$Nob6y7k6{zX8k&3?6Ktj{jmWQ|-?cVNzt?Yz=sWB1LsmMVp8 zbeWO>;h>(~U7NfngQ?{1yI<>@>5f&4I~>*BMc^+@hV&YTTBVCf?~v7AJBal}9!kV5ps=v}h^b#h-vc;CEL?Q*lDA*?=62I~Ji)G|VH zMo{zamuPl1MJyJm42#?Q%nG+whE*p!_7$IoG~R1uHA*GVgM~WtVZ^DS0udE=gz5K- zmx6d}=pm&ksXbW&J{E_vlEAeXa9BQ;h}!8JE3Robpn&`p)KW}N)yo3oYZ9`Pp}6eo z%O)0p+0nUT&taW&$lG10xJ#Pv0)>+Swz$pt%wqhpH-j*1Au-YexMoHvAYbOELQI@; zkC)cd6u3aWn=4Sd$g3D|OUHZE`%V!sH)DsEr+}O?fm*7`@fD2*_yK-y=1Kw=!5@1K zv#>28L9bx#gXiG$?VS+1Ma}UnOad=I0H5D%VozZBw4$haiCr!R=fEL61N^F5qn;92 z_^gx|a8!OZ(s`+I5JU{B0}SP-M83C(f4r$NePDs5^H)j0wJq?b=Qo}A<`}#}@flJd z;$RRh(24$n8*<|Y`2ULNe5V^u2e!q#L6-$dDQ$-W`8Y}B= z(q!bom{eC?W6Rr-@(5!81+sU_Y3G^QY}_sFlB8(=#c!?49LoEuJVf_s0J84g=mU?z z{M`1r!jO(3lkVd%^r-tJT2D@9{&mvk4urIrSBuIaU5$B8$Z&C8RlyfL_uj6vqOcaPdM|n%%GKey@|HN);S44K!$y}(EgnVfO z>ot}#Rbk$G8M00nw$;5DzS7d|T(4CtHk!(NIouYz$5FKRZC|7F1uA35nuwkS^Z7Z- zcJxTb7ul5D?1Cx#xEa6wTeVEHbCvPwha|ustQ@^jXI^TH+HJdvE4%UH2Nt}i#vSr< zAQ8&&=T2HE9CbaJU27?OwkJTnqtY2EIOH|%u0MO&rq}#{FEwJw*hngpU1X9k6EzfT zTGr$jpZ{$6y>$?(Q5Z1+po@{C4P>(WKL!M%O`u3dUl zu7Gj68*LKqr11&2u|CG_92Ktf*laEWY0}ucxbRG40b|mGg&~{E!iTr{YVC#?pi9+G zGj(PkVgj3H^sprp4@Hf7yGs5I=J#&ElkLQybYu^jI_-k`HLRO;bkcA`A5_TW}JSdF_tKM+l6*Hwcpa6ESNVZe%Y+{i-kBr>h^%}4z9#t?>v7^cQq3@SQ z>4!sfk$w|4l;_50fb&Fsl=QM*KCN?i7jK~GY!KsBdx-+)kjGK^4}J>AbbU*opOWsm zf_vxF_OCIU8(V*HmLliQ8oLBV7~A;cS(ao+W>%T_jzK!LDje<86`co^yYXRC)moeW_)aH<7pDM7{k|k?HJapYzBHgZH`a>ld zqVk-NOmMmY>K|UhL|J?zo?vZSy7Wx9WpFO3EK;A~>QLAH|7hkrqng^{FIY=TrL4LD%N5 zQXqW~X`U*SH{G3pDtVf~0}2;gv<_NibDvLu<&;6-A>z6x9Z;Y0?Ub~`38*v|KgsS{oAN!Qbp1n(^=>Gz zza)c#njDy8CY+K*y6U$0i(F#t<{kk((c+5o=Mc;23lN?_gmdbCA5yl8#8^t#1hUIM3_VecUo+AkjO+w-nU zlpQos;^r0#t1Ht*Yau@`YAftb=T}(9tDvl-qoz0J4c-KwKDXp*x%?4}cE~b0G*51o zar8Y+k8-1D@c?w=+}pSOU+(1SoRL(@83ZUdQ(12aMJxC<6DOml{h{Z1>|vHpDi+vO z@Aj1b`CW%*Im+nf2HwKuyy|bhp3U+5cy@$z(=2L)iw*F@;DaLY?7~UuIpV-3}?G?4k2j?7Rqa=!W?T;HXN26p`HgJ}bO!EYEsQg^El;>Be*FTiV zhF%$$j}h$#l)h*M3&SY=55Vl*=N5aI`*EX=U^1V-#OF-mG(EF?JbWQs=;kkk zl2-_@h8k^mZK?P8N=&YD){&{SQ%+dh1?6z1O#rWX9ncW~^7)pVE+nh2Y@YIV-T6xr zfeF#!(wXbPv9tGogogXY1w3pH@~%s;njDa8STGZq%XOU8I`>O-r$p}H@IQ?A^qrvw20<&Sh^C(Mup#R=1g zUKYfD1zg)Em^umg30_r|e{o?j^;*5sp7$Ex8P3pn#qL&$(p{h?a--dv8Nh%_1605e z1NDE2iOz+Gg?UUKJD#l|s9+n)cR2uvcyvgqNxobyt{*HCp}(SZwUSlOQTCBxrrTmH zKmwJluTi$y?0RqnzPcvp6VYx9T(rP@{+DDjC-ANvt)?h&0?Rq|DbFZlyz(S=M4HS1 zDIk?(f;4^i*Lco}o7{%(V3w<0K-W8^hrpe^5ECQMMR#KR*$JT@LQCrL9%MAH=pI#5 zfko%rk}J-@O~opzEA+i(<(hBS4zp# z?s7rW4ZcFrMGHXvcVd%dWIgnV(!65rb7zqI=FjXw$oi8nzLZ6}IYI-k?_1zP$Vg%G zJ)5jwoxA4f#Wj}*_sOyG%RINWAvdtH07==g?N~Z@j_t|6SpeN3np9q~>l+D|nSP{v zt$j7g`WF6eth|&F#iN_Wr*PDM9!V?d&Ob*WRG3alKD9f=gAbT9jEtgra-_`MSh#Kh zZ7Y6af;I0ay%!5={=%G4Jx-`Z^m=U`)zNi@V>P6(P>b9*kzSX9gSpTEhEY{dcb~jX z029}KSakzbBO9OYtC@t=UY`2;ddPjQ&Y86?EiJV`T7%bbYtCZEb2Tys5LdXTNL(8( z#>8B=NGCXQ9Pdr4k)B17jq}3e{(&fCex~iDe$q7#p%B7|a5U!h*IT5@*}|}p9ku|k zoAc)DM~IO>-bFqekXKRJ;m4ere#CZK#QaJTG>hI{9dvZFClyA}Ao2c|A@r{Eq5{-3 z-I9Qx=p~@ImCzL)AdQ84kvK+BJs*t65?GtzB~i2Q|w&N@I)WyKDWBNpU)8vImM@E|8^~w#+lr=GzmO-HhJS zsqTGo!tv5SOkd*WUG=%{cjT2$3PyXfr56f1Kj9F8WdG!?)ypOHrv_`Iqla#u8% z=H1!Fz*DQ!zF=Bp&D;$q@sc$*ZEh;yIlW6yc`Eq`pNxe{=%Bd@O>CbG*#mG1~(JC70pFsK`pyR%%H+yiE>pNV?uOW;ND_z-J#2k z!mAnQJVo5jP_?>TOcu>9xxN+GJ-Wc)=j`gLJ`?*7-z=*KeDap{l3E`<%!kX2YObpT z+7I$OWV(t^xRI|WC^NK$&KS>vkyy6lVmdW?-fi=ju^{)6-wQJ*3?~5>&(?=R<;EFK zGxXI%LU?$E5{X?k((L{cB_aW!R*v&R0P_NG;PqDrEJoI4JmlZUFUi0fE6Zn3S_KpR zTUT0Oa}BeoxvrQhV(LE39ge>-R3zLwM||%Z6Zs55T?RUI)*{)1u#O1ViwTBV(LN<6 z&&&|{x~gEq)H{+%<88!uc5#eUp>Fl?O;?PCG4paZF_h+^ia2sB(9rX_oz9{1MgSEw+t3=+G}QI_MY z3GsOY-0SkIR1_`B;P|}+3anyEki0o0spMn-wfwLY=}}pp6s1*>dbVM8Bo)hFFD>-I zn5%NH$FeP@MR6sv$zZji#{Kpkte<&L;bi4l{sWG#V%x#p%S$?|39rOAAIt*sZmacJ zQsG8VtGoB+MV(sR0sT*TD|*sX*Sv-R_@f{+`cPW916rP0aT7NIr8EK?vQ}?$Op7yp zIF+&{xMA+!MPO2=gYI1gmxGyMiaSmx z9KznQvOnwg8%FR@{iborx;}V=RltS}(%wXlBd2*GQ&}2Ml8eTH*|o4N2MZ0iLbJql zxI1@?JRZi}s{7rU?=hrue*B(=+s#`nGGCeQ8hNKh&6#kvm=Y=LZNtX_f-vxJy9 z_!>yX`$STdS^wh1K|9X|j#;pqup;}&z zWN#U%JnSd-PPnMG-MOiu>0!drWy4!^%STS5OZ~Y32Zxzj=EvqaOihSO&IDR!(vtg2 z8NCM6-Uvc*nlJu#l?`0w)Gq^vb)Qv?&3YZ0ps-I1@)}_|NXsAWiFt+1%wadfG=c3% z(+Zo~FCO&+8_Tl5B@4D+o^(jm$ci=ZDDI0VY2OU}mZzXkblZpmSCf5@zN}}6^w_C9tm)b@^b=DKR*j?306O%&Bf^0l$NRQaMBT-{$Q1po zlVE9w!MLS>Fqs`btiCiZwg3)Hq9XMp7=G zRLM~_kGRomYCM2RPF3TQcx~^4+B(`@UBZqm{i{}7n_i73E3RIo8Fc*OONQ|SvYwD_5Evq_vGD=cv_!li z|8;gbla|B97%~*%_f7lXYAxu96!prJAOEe;GAVvSwvbh}5wXhKQo7Qfi%&g&w1+QF zLhW{oOU4dT%sd3$NuAf-1H3E7Zs!_NJH>@8>niAzeb+ElRWktu2(~`xe;BYVp`LG0 z)tNH?JiOk&L%5lrI9-kcFL~zIlp}~l2l4Cj>)IGQQ;Bg!Rz>kjV)3`7Z%s>Wo2$^N zKb^pzTtj_t_X>4CP2!BUW;n^=FJ>j5HN?{iEIPTAgz9m>hEuyXCISu z$k0~&%0O1a%@wk+%H-81Z>u_A_DUIW0{eJpw>i|omT=`<@VFGzI%@!J7c_H>t<0+6 z>8VgG#N^!c`5X6XOin=t@nu|jr*Tm3vugWKHOD+v9f3{R;DF=%R+2Lf6#*EG+xKtV7C%gq9C^q{R9#<8~xn{I2&?6?Q7tzPX<^j7H1KcQf)isg$eV|0YhrV)1#agp+jfJ5O))XDQwl zA$J(Xl;I_t#^VRQ#Qj zwT$c^eY>x*&EIq*Eo6O5LmYzu+FF>Lyq&1y9kp7Xa9OxLC-_HrM7x?Zm@??8zxxxj zP^P}EToVN#dCL=(#le0(1j7;X`skU6Z9@C#>HuT2{}%h%XPaw?JzeB!i#_YZM8mQ`tr&bL~~Pok$rJ9?4}hL0+&<_s6n1dnils?b#*U2t;x^tbN` z%=Z}g&Sh!T;`v%H7`Yn-gORnP+r1a#YwmxsQk@u7^_cTX`keiPt@W?<^Bgots^_=G zrWA=b0}}Kr6CPu7!P_^X;jezMXg#OXv)v|fw0H-rD-LUot5Qa<9)$kT3GjIr7Ls6j zR`@lahF5)}agdn#GtsQ#xXur|S74O@>TH`xygb|ftR22UB-*)n4)ZWs%oPF0W+S6U zXerC(6HoGUBoWyG*;gOd8gcc4P6faKSE~K-J@{{Fed@KdAwbK?Flbf}!b~b@Pf+>n z<_4=xJy)9FX>i9)#LZI^TS0!Esp+Pt*k*G_?j-@o;h ztgwkS2}H-7%L}N_^wri_c3fji33;qs_~b?i=H7wF(@z8 z+6_#|9goyO%tWYOIpm*DOPTJ7L;9H-ZHhAbT>>jDTe0>63*tZ}XUd~Q0*$aePM^HZFs@|0fv1C-!}-s=f)n z8TFoLzRssY8DVz0-|Kf$F|RU~l=p*H`YoYZebK7=o3C2(%wB~?aGst46 z7s1|V)`y)uQ90Sfd-hJxpoufOX8Wy4QgH*ABrVH75(3>f07xN?Kr-E|W}98m#6mAA`ubZkmzNuTFM6`8K;c!dsYCQKc9d z?dpmhrbGf#0k45_Ed`ob+9l|Hcu7)K_@ua;H&hS*?zte*GX>dnH3g|yMJm9{F* z)5d>g*ct7}O!V1Bu8ssj`a-#?KKsa(Ay;E61&W`iE}NIngV<%={H@~fZBX`}NN?Y> znfk2O7f^OqW*s6w@8SK!KZ{^gx<&rCdj4}vC|2lz5o+|Waivnu8` z%i|c5M{(Q&VABYxt-_d|{whkq2?;rjRV8cSfQTf=;9<&XjJ90S+nhs7oVZ^Z;MjH`aE12q5 zY}=x&Ks=;+fE3Tq#(&S#trWtH7pbhPI;<}zEG>qVrV1{|sbG{_q1WPfd92T*FEYq# z(4`AZuyrNvH~0HB%$cEzA#87=LCgoV_63qjGzWrPr_+Vl4gxpf47V7{OE@b7!wkVV zK-%B|UQL@m>9`ih#aJuQL4KdyxYl1%&mqI(lmE7;B#ajIDPjRi=v=C~-Ob%f(;#KN z)FwmtiVb`xy3ppcZsJvWUAHhGoG|IutlCcV#ja2tm&KsfwDV(9BM!G)sr4+TYS9vo z^PQa#jyvq-PCx@k^5wUDHCi(TbU#FWgM|H^VLUXPMjuSDQowD+XO^ zPp-?avG3Q*ga%)m*s_>g+G-=!E(#(PIx}#+8Vc&FM|;!GrdI8h$M1wRUp#?XN}4HI zO-Q#Qn639qZdShx>x?xyS>(j1w8{{AKBc?P^vov*)1Ryz$ULsu ztcEZ(iWGLhUn^=^cM@M)HHp2qxA!-<#q@Rg$)#q=LM`KWAJBDG9JCG~jSa=$8hlUc z|4!`qTsmz9o<(RO_K7agOZv79hs#% zhfEtR67lQgcS*FB$gJNGmPMC0m$ybW3Mi`qsRWk{d!b%mEpa)=mB;Atb7lP$SzbRM z%{qV%Jc^_(Vjp9glFYnntXBqgYho&6s%h<;i zJ6a9FSn!-QQ3$X*=56+Ei}edZ7Vu4=R1yT#{8`V*ob3%e_I@B5NXIFafSl|#?w>iM znp8}|*3|o@iUk&wxuLJ3PD;Q>Ga*)~&Bw79kx?hkIV5d!Fk4mpQUL3^ull+lLXW%B z+swSm4&x`?V{uj!Mhu9zf5eX|P}$v{kxLCn?)bBmzk z{^5Q$NF}(E08D4mq9A%!gtB3K)MwqAnPqusa=|kz-q2QhyiuFPmm7;QV8)rJw$+5r zNGindn?=GOp0LlKDBs>P<7U@HDNuC61Ii6Td$jnmMX&O8g0)6XC)ykbvloYeAR0jD zl=i%U_$QLh_FtvZPHk7M$5=36(k&OerW{BYaQ0^2V&(*Tf{bUAWpWuB&Qpsit7>b~ z19D|_GNt}vm3j?$LN_MmT=@1|$thjrYPfMZBw2=Y><&f6Fxej-jpBGy4yW}+w*kqr z44#*Vr}!DSSqj&XzT2M98(hrN%*TnM(wGDn2(H6!>y4}YbW^23pYI!97NGe4n|_I0 z4I`Y0}M$11{vc1e0&1*fo|nv(!_ucfSOL>_pW@F_n68-_3zC70B0tNQ7bZ zT%ew1x=uDMXkg?NydQdyS26`Sahz@%gI+qj2(6jk4A;(E{S2@;1uwKk-s(H^)40?+ z23RBAkUvp9p|2GhsE_lwvC=i1@L-5QoWXkY?TK*8%PpO7G(4t>>^-LDz0$V2#L+ic zttBwRsr5B8>M`HvCvv*)m&J)q-{`G)4)S5NltiVx!F7;jpsPIXN}>fzt|aC&(V)mU zgF-fAr4Lu2dYImC>~>^Vzfx_R7LXnLdVcLiQ})*~@0-jC^3u5fteRn9)i7z_I{AMz+>MoHJa01~X2$s?vdr+|eDFdV z)Wqy?$iqFe!~qcF3ptE;E)`ZoFu%m1%2#BvvX z1}?cuOZPdV{hzm&9M>g`bE@JNkLJ%-2N|x{C=1L5&i?l|8IsLgp%w; zY8}7Q@!tEjVI^;^LDmQeuktL!#Xrl6i&K4eur;-?1|cBGgv2MJeU6_5KF4+=;a*M=#$V^F=j z827-Bk48a%*C+b9nl_B7DknJj8x5=^*soOCggN+qy`-2}8Ac8I`+cLXz@htZ)Q$Js zZ9K=n()c>~_^y{6k3C(tDG>%HKloB%C7@EJXEI=3y5vgs_e|Q+B4DT@B90?Q_KxDR z`T0L08l9gWU$x_ia-LQU%2)b4KX#;G2BmhPBD|8~^^NUPl)k}SXPrYbq(dk|meKQ2 zD=-KYz%6(cgNS#Oxt7OAk+~M2CFMV#a`M?Vpcr9Q_Co^OON7^0gHttgvNDuEn0{`1 zVn;<)AsFslTo3>PlxVEKO;hnr%KNzgboKi2G|MTr6x;jh_4$&PDb{h_g`7 z(+*}K1+I=DiuF8`Y^C?FK`{dRO1f+GrrsY7#s$xLYcFflKAeRlnYjdd90)pUQh2Y| zS@=GkrwyDNh2EQRbnhgmu8{!8eiCG_x4r&;6b>%l*qXyH7WbDD-3Rx#R608;pDRkg<%6(`5)m{&eBjrXA(!ycPz$EBt!~$;A3R zuMW=G_Y`#dHmWIw)aHrDKiHRvr#~g*LQ=6=)|}*Sz{{Ja5>|%`GPR>gzW@%gkP<{o5t3_&j$hlo2M8} zAG8qw>$pYw1I%JZVVnqWBEF{`(IE_kAn1gfg#~CiHqAE#AWBfZC=z{HgbX%d6G&#Z zL#gP*zwx8O#Ww2X=tLc)B1i9HtirZNg=8TdAhd|_6(ON@eX&DILmF8HG@?}arLJPb zUPN^w5Tmkop}64`P@(@6GYLjw5F?FdF~QXO=rllb7Vwb$`8{fA&<`r%w|=u?+F3|N z#Ed~D*7}mEcj_zMPZFPWr%u!7St`b_SWrP8rIIw z#WjvbRAFqMuEf<;J61u2jsW^E2=9DVf`y}!53)$z}B4t&q5{jA7 zJ&9#WtgOB-nd6#VFBHU6v&bieVdz|BZLix9b%R-?DJ6Nb1;$+`{9!LIcrZzFL)rUy z4U&?~siVc&00WG~ccxFp?*qK9l7a{aS^{q_dn$?!z{gw&2E;+IJy zgYWbbJAeu)s4DQY1h0hoyCphI{DNQ(39lS{_OzsrOY$FRXYng>De+f6$;gu9|HPW%aKMi>+$3fE+yDmdB=`x9@Oty=-%bYAfOWX3pcrbbMaP#XK=uG8I zS~fJV_^rwh+NLixA8TZ5q|f5th<(xsrLL1_)GkrogHD5s?JfME8PFCkId^}j?-yFT z_mi<4Z%8nbsgj+NKPDS<{02#Z>}%X>GHL+xI`jTDiJ+kO??ZvT=|2msvjI6e*_bNT zs$Pt-DIb}$GO}F0&~KV-m2J^%sSm3Sq$iR^OAqc3a&Ap+hHWYhUJv@He^xPgZ%0ti zFwJ!F-t)8S7bmq%#%(6x`zuCo^&AEWV?N`ds-?PnPPjTy8T*S~eyjd%=vm_{wcan^ z%YRfleA>!pEVIlbEooN2%-Um~k>z&gw&nI+(5oA^+}JzYtJq`Md$&h4-Ou%&bd*#u z;&ntADXX~y7bGMg=U!J*X=HZEWBGdT)^ii z2t0aB4Q5|?omu{W9p zbLWv2kREZi8l#ZS6Tc%gD!-CSFX_|^NipZl}J8nD3qsS~NEFTg{6U{0X zDgeK`D`+vrrCx3DZp5cHrH+?R9QwET-@9J}apHm+q}!zv3(L#`%$jyoSeYx|R`OTA zv?V*P`vVpxrWDCc7rsumln2%(@U2Qz`b_GF^%A=n9YSG=*USRt41ZlOc%V6VZ`W{=b0Uq0ikB07 zB~v`mIIu8)^M&F|?-%3=(~13D+rIbxCq`e5?5ks{gN*4D-B{+^On67>SXe7;i=QTE zWzVQPNS=O@_J`6(#AMMDw&F(8ODD?FcsIayVLc=eu}v^{tYYzdo*|r?`*ET zXJdWOe4{+T(s~-(s{|5JuvJ?6qh_KF^+9t%^O0UrOiY&!1BKRx1-ZO9uw=}R-%M;> zZ1cRnRNkK~5$X}j5kdw%ftWpXm161rFjY6>t6rXC{`m- z^%CwB7}r14T~^K2P;tlgVB23k7mo?z_bGVR@zA`r>sqUnzL7?a45T@ZJgN4@q#3z1u^*4fKm$&4X=*>970j3T(NSJaRocJ(4VQ#z(~UJI-HBj$;(}9t<)ZtN0vu)q&&HArfoNco;&P>vEZ_9>Ls-&dD+(}j03$Hb|*jI zpIu2O=CZErqwm6+*Il<3)GA981xV6~D*1E;T$k7G=E*L|MtH!sz~!2znVZxR+X&ry zU4@22n}((8j;V#V#`}*^a%1@|6t0zjjQ_OElg%wI6HWZ~5jlDi6)E(&5L@v7jZ;gZ zD70`ve9rqEauGXOSfXU*&GXP^*y*zRkk!9hZe}<}fmI!(_Y`y5pSZTPv$>N`OG;ap zn~=NH*V=c~s(EH~lfSw(?e-^=!$-ZH!_9e{^>>Gjf`k%g2Vr}Lx5|zB?qQ7U?C}D< zKYeDql8?wG^>glIe{Lo$lV3#Iiz4~!<%{e5gVMF%v$ozV6iS6kN*J0SXUpD*Qe)H8 z+^vq_NznIDEv#W9^t^L)cc0B_dPb;4dBPvFIMNb#k_D3?tOXyPIKRjuH57XL0}n?^ zaEYK(UEL`2cY7_rSDz6c7U1aHd$jL`VCvOOVBuOv>U}0&aLW_(6GnI{qQvRvaXvU~ zRR?LxnkpzDFv8pD2#7%z2q^FtB77r-ZwLs;KLQcZ;NP#|n?x4Uzj~3tS;+rtBl7<> z6jKqGm4$z+7(0MKHjd`DPI%e8@8CntTBvF|X)4I`8{2|e3{7l}KrC)xyT2|7f^Piq zCK%*oNaY5$wsGWl6QcRYf*;=gyPK7U>K_v)D^L z2NP3%WeKVOb%*~FqA_=Jvg2oEb#--Raph#ObueRP=i}pJW#eGw;9!PZFgrqQoDAKV zZ5(O;XOMr5BLQ+WcCfH>vaq$G`a7-D9AAlN}ThZCyUCJRH^MYccq7xCc`+3ccG%>k7#~-@D}U>mV^1 zGfrhy5V`>-2eEO4^xmI4)yszahqJ_nJ@uLL`=UG3p7PdY$mrm&W4?F@$FWuSgxGsP z_%}Q@B&kkxVnkX46#j_LKE;O72+n`+fp-(r7!-~K8le2!(wBnDps*b6lLLOle>oS9 z0RO*cV>ii*PT_gdW#7xfi6o8^Ng?#L^{TFtoAh7t2=7F~n`29|i%J+=Y4`G|1`Q|F z810bxQX>UnlQUi&Eeqh2;s~CIuJv}wkCy|cE`RImThCP)7I^EsE<1CcCR^0u&eemp zPiaNYXiH}-uIn|>!%uGp4b-Yoq zDFk_Sh!5tfjSEI=*xasLR)p{?lhx6DuRER}>v+L>!4;7szow?N`f5WI7X`66D)EZ^ z5U>|#%e70RQ%oiC40v4s7?7nBb#3i*T+V9m9KFRqjiHs^PB2Csj_7=Pyboh1;+GS! zEi8XSO7zdwhhN|%3SXwm)=7+sT|;e#NDP)ngMz2K-HBua&e;D-lN8BLMeSO*79c!j z{*@KK0y;GdM}BXa{hXGEhi^K(^TV}w51reGF!P%wbYkCj8n#)B#YTH;d;R+Z7cxZJ zaZVIdubH6c-D-ImULcZG))@L6(|+yMlFPqGH2~pOP1SRhxJdsy(R_tz4GO`2SJ(hv zHeVwLc8*bz=Ledhb)8$D6;H=5c9zcL{~S{p3zEx1AB;k}gvE@3-&&O+NMUBhVVKz} zjeiTj5L^GlIpi5H8d=0vsVa6_FW&WRklyT2#zm$nQWhf^vS{(-f?FhBIfvo$u`GJw zb47-Xzrwcp+p%hRD7Mh&ESUOD4c}pE@>+}up3B>>cwG}{=zCqBNQQ6rW+8HH-+JES z8oUmRHP9968I2w$qQ3!<+m9CK3LiuxH``+bH!qm-jnHJVo8i?B734fh6oxyRS26bq z9*hI)(G`BN#-7sbRfI~ojk8LVZzL^z&L^*FV?5L$Owkhna}dU*s<1&g3ZOcIKM-~E z*3yp2Uz>#Is9|F5plr!To&|j$#BrFiZT=BRe?}el5C_ED$-^6<>FfzUta?9=m~Ab8 zHEJ?UpTV0&n}-o>Sl|;b>L+R`K8FJ&I+Wf>7p6tU+KHjV+c%Lz&%z(^P)m&-)mFQ8 zaGJwErvPU$?^f7sPP78f)z?}Z6jS4v-entLQEg^hpJ~omfP#J)XX!u~B2bB83@W6^ z1UL_y{q+)jDFEa2sWi@H%h&0FW6(=#s%0Z3n9u@oU37uG^jAgixNPWGnG{^`mrGm~ z7J(m!F^NMlg1zgqhxCdGafZfC-^c~H{6!TjCn=eeR9WsnfxmDJ^tYqe&<~l2*A!BB ztxCHTdfp8C0ctcU`ahjHZV+EC_R&}_^Ga)gj6Z5&R5JsdZ}RRr7VK|pRO)hc1s+FN-$&;?Msu18$r0h zVH_I{#oF8n7fPfji6n~pc7Q1$TG&&=ZmGd{CEDadY~o`{EqG#Nl@o&%Elrgvj!1z7 zsnMoW`52emYAALS^AH^`qyYW^_DC2^uA`wMxBM{4f*haKugOC8C4&@+-1CR89!NY~ zc9L_8KZuCbw_-r}YkZ{07fC!pS=Ln<6@6V#H_c$^*tpOcGQP z`vg02$eXn%I`%B(Cnp&t- z#yI}q(^k(9?$Lzz_^cOc`yILb>hF%W6jL#atu1T!6#m;4HeU`t&Ln=WAW?qoUtiC;?joJ# zyAyLqwk$q`UFPk~kvgfFtLPOjiX(VA%1@>Oyz1WcD`@;2@b~#+FIS_%4A0_(`)2-tRXDlFz#t`T%Z3PnvCfPi^o31V)G&@nkk*X#zv?sGj@4jh2>L&{M5mOL<+~|QG zH{T0o?k%W(L19O&cxal|+PuJ45!oJhIcXv83wW;=*lF_iST8mzBl1VKya4;)=XHb> zMnclf66U6>O}Bxt!>~i8-EniRGRs0x4qyx+^+UFPAmdy!uAzj z3_^$T%ex}@pc~IqbOR=sSaY`2=mZA;hpBt0qSC0;q~-d>C?V`-M3a=PFWEzfl8V}IoGUgn6K@p_YaK${Ix1TE0q}!|j%1uLA zrKFngBd1CiK6;pwIpZbH#MkQs3HAr(sShK#)D~@_5!IY(Mn>?Zi5kG6 z8gGn_N4?km)p~>Xe#5LOKM3VD3QOzBPov{MZL&6XoBv>s1*k=Yzjj0|ALF4Qo7*O8 zwEb4fg^?9^wWQWS^n*^*4MP}5Za9bVpp;akUdL*H~Vcm@3&=Q$Jf!H=+jkRMi9OMVW+|z1sp9r5}Cn;;CZgSr+>pAL|>TZhQt=2N=BT3SDii2 zV(6{a>q=NoYt6ZZ`LM|adq*M;%>|x$!~FjM=6}%7IUEjyDK36l{TmDs`v$_1%Pj7A zMc@B#_x~a;c9Vj?oKOD1p;@n^bmSY#xw=wp`viMT-x2NlH)K54?<<<__Kfyt%lo#7 zki zU7gsvn`5-tq>VvX2o9P(vhc855f-q$5UnCxgi3p;zj99D)qBQf|7r=Utp`>i3EUKj+xX% z60JME;*pTQ>M)lpuPnm$w=`Ofx9C)#R4_piVkf2i!f$f)v|81|wh~ zI7mGWSka+>G@KK$_jKF!%fZf0>37MCO3~CQUVO%DtctIzlX2pX=xLCvd8P)0k?ei) zegI?G$o|ip+0dzaO-<%y^l;o0Q=9XI@$X{ggL<_H&gO)^YP#PF-ct%Y4J1mcd?rj2 zK0jc_s4%Q?69C7ubA10Vdh%5oPEYn3?U4V)P2hiTHWI}D2fM7gYv|0(`J#)D`TM<^ zu2?GzVhxv5GM^k?az8uTOI3Up6d>+S;bCu?|eqep83s;31 zOjwsKG~+=h`G8dewbGiYZ`=|y&a=PtyC@VbeVC_LYQ0@$O3ZY*TqwNPAp7lH}D*>}2ap}*Q3Xe0DHOB!P#Lq#}FcfFSktX*xl6r6hn zR5j&{>(y8>2pcEt4SIArSK~||xi38pYy8ktE$>7ta6aSD@k^arWZ}gl*y_R1Si-S< zAzE*SCR5xg_JWq)hO0et+ud!T&_*H?=-M4LL{sPd47X;)4Y(7G$yjO@gzT-FZMYg zt#K6n zG0RYf*pvs;rU~P5k{>wIb%qS?eXeLbs|Fgl#DhFB&Yeu8GI##oWJIq2-eR2*0lyxr`%^4dRc7e44u5PGiWy`;1yrnlLvnWh^;=^1=Qy30L6KN8A; zHQq1!)ddYl`d4>g6~SO)IwQ{4d6Jz6R*BMQ-y!3++O+4zSS8Z+%(L~+V@BFP{4t&m z5>Z`T78Qn482hAf9;Ty|Hu)|mU0Hh8GBr=xkuH?E%`tt2_XHIS;_^4LU@GbTTs80T z?+oXwdl4=CtYxqALJ~OKVzTQu`=nri1#tvzV;f~rvt0YFo-}a^{Ht?vbecUI; zdo`@kUi>;2Pm#7Gygt-EG_c+dH%^1DVf5j+<>t&NfjmZ=wY92o_h==#nBlj+k5{$D zRKec|HvVn$O~ccWt;ud9N{|ZC{mHZsx#wU@Uv%xui#KS(CB|&jd9fgX-FxYV0r_rT z_^odpg-L6!&ShM4rsPQ`%sO%|L5FM-sHPxtIkFSPf3vqidoM}P{%h~e;X+-h+w#7i z23#bg4K4L-cZ7rEq1THs(JVTBl05c7AHlIK@v{=&N9P}v$LH|C@68&jbz0e_6fKEp zGcLpY0nDw{BjcNQ1p60|TJ$X12&_4L)6t|i9EB|HIARM~6HJ=3NL!$a%&RmE516tqnpcuQp~ z74rwVX2|cRzv1UgF84pwoa1?Ue-1^)JB&WW>vuO#MKye+AKFU=J{OxsRZJnbG%77W zb!DrRFE44OH&`szmR-QG(xuX;G@R1+$eN3u8IwfyfeHCF4$w{eBB9;q>`!F!Qvf7~ zKPDQJ)!R%LJd?X2a&Vq3z7vbYReY$pPBK3ga=+{FVCi~C8EqXgmZS2-b&BJCU0^W~ z1my)ge~-6c$ooKIhVnU9GdYL$u+ecan`KW-kDq}tVj`FVO;IXO&~0NY(EhTy%>43) zdZ-A${2`{-8DkU#EbpA}Ak!};pz>b`Tgtg>2&(ytg z;7Twwo6NrxT7qB*R1E1$$O}{nSceTikY1}2T?LcB&Ho5V(yv`-aP`dar&9#b81>z#WwTERBkLn!s!;wL}&aL zel%^j0d8#e!0Hs&Eyu?hxvvg!JB=c6ZX12^Rb8(xs0PbgHkNK@b9i*1A6s^~FDnGm z9hDQ7@=AOMY!~w59;>P2FzRSY#cAz_iOOSTEycVFBfeLTMkK^<(?AX|rvwlm46`82 z$TM!MVLvlTJ%%6g&OmqOPtNu11hV61yc?agDkTBF2z`z(xj7KFUcaYKWZ5_;Mn|mEMK`RuUSt% zw_R$gy?N5G{fhSV3n?)G&;Q34HG4qe?iJWyWLQq`;^$v5KUA~Jja4fcY`3;57SQH# zZMvm6ly)T+fI)FT`8KA1`1!Jfud;EY!XvWK%K-@y)#&3gGEwQGSq5ZVLK1&;&Z67i zcn6%e0X+6cSL@?g_}LaS)ymRmJn#0x7-yo1Oi8!gX;M>N;ZuesocX?nXm0BsyKCeJ zmG*GTdBSDm%BDj@LXy&p~m(&&n8$Z_T41)JA~QbuFLp&tgz z`>VsnhQNwX@cLeqI$|!Ev_4vkpi0@E4Jl0YTi2_ga;C&rns4oF$&`}sly_;k{zS@K zho6?&1eK@%X`BU#8xX=xh%cVb%r(B1<&rxeSIkV%4QmRcK-pkJo%zeUE=%a2SSim+ zr)YJ5lz7m)I^#MiMTk#Ry2F7if#9y(TNB#`QqPl6^?sXn;J4Kzt*^_hS7r7;xqr}Bl z(C{yzO+LM`hwZVR49~f5m>9QdopFA*Kha(ymKy zG7QU(6L=9Bb-=Q%8#k(XNm@TkAz_dou+irciLlW`D~-lFFL3(0jl0~*$P%UT;g=0v zi$Z3T&)xNqysjY{NmaGgilc)4ZYnDy3uKXivn{dEe|b+QHc2K~@J8f!9r90*avBgW zFVR;xl8ekzp`KkYyG@PTFLJpJnrmbX9Wv_GLNWR`L!>EKo^~;m7`=XPesH)S?e;l( zI3Lr${p=-i)E zn{g{uv(u?DW20Ij2a)2fQsA&vOc~}v9H#GT7G0J-R#eym=SMBMDvWa)0YmHOy{r$? zE_1KlE>{*I=Of)CIH5v)@2Ey%;trjA4Re{w`N4Q{;ZfaP=+hAhF8RG;%Qeil_UI?h ze(k*AECT`UG-gc)KBT#2#y?NWkpm8iP#2{|hwi;UByj%5isYX1rvDJfw#8Y`ew*iS zf%4*SO1Eib3mBjz5FzT)Jys`r-JiKk3jI^QRF#0UK*=n5QlWPnXug@k^BQY-F-?sU2~pvVjMUY7QfqLaM?>JvpMf}N~U zN@z|7I|P)|zQ)fvNf~^{HF#QT@$otJ)olsQ^y-J*w=qpWes{i%38EnNlr?{w@mtCn z!~&kN=$><9rwY7!Sl!}iO`6Q6KzZ6DTLHA=;^yxE=$e^o+09>qizWUwz+o+U0fu}9tOH@3IQ4M3IM(CMET^8_rADM@59K-;+r1l(KB2X>e{YQ5L%5c3pU z*cmx!9UYqlgWws=fwx|umB@;dSQ|%Q!wipNA=`e(= z-k#}P_`(chQhb#%M- z2^vEBynfP7S5mCn?|**<5&QhI_%`H5WJU1CB(~dpXM&e2458uoKUxaxV(ZVPx$1Q# zpOvFAzGW^snF>iPLl|<9DK78huiC(CES4JJ@^FF2BB7QB!Tbl&%=3PVQc*QBtZPyK z`;wsUAZ&=I)g1b$pod&HcSU6dL16^F?%%4tCJTyPG{g@);VYMiqW3)E!po}(@jzTC zBXl#zS|ShcWTY8~t0|$PEn_3Jt60(7?6x_5EQj@{5;gvR#gZ%rlmjUDcj!JlybVNY zhAygW7k(J{D|4_R!v9$K2o8S>oy+2)E#PIVWNnkb+J`0psm*c0%}nVi=><*Ob76SH zr(0gqI>)pJ$j$I3{|b5;5|aC4KjX!W7Z*~P#423IVpR0l8V(Cvxxt^eR8}5nd^VGwUBj2EG}T!uJJV!6lfi$Rd7g$DFYRsqGOm}mU*s+9MoGUznsGVrWZNlzGH=)EKz2Ca zYF?oNkitPW{+wN=<24ws0wk5=QF?rqUEIAe!i!GNt799R!7K1GNAnqS-?=TGS!b_7h+Ez1|Fq%T0@@{B~fn}xz8 zkw%*mq*$iKYoeJ?c&iHMCYn>EB{u+g>@V;y2l;?KzDK!FYAxob3_)n#*wz8jvoT~n zSuu~jE(2GS9CR~jfKwOtSsQJlMW9lu@-mgx4=geNQBY9c6fUTT;|!z{I=Jz<^UC<^ zE$Mw6T_Co*H6s>pVevs+->wVpz%Fm0zIA}7(;$sF#&BH1>8G$5sPr7edEHGh*;86X ze(QLFm?JBAL)1GNtDseFs&b(!`({|%c7(!bWxNI1thw;8!mEME=VYtD^vaQZxe(_; z&;GEKr+he*P8=CSFlB%k#w8<>JBbkdn*G&8k#Kk*6$PwUTv)1*s}$)YBQog_+v^GJ zmuMn+(x~3+e;U#z49g~V-*jvoQDq@Y@<#$`m$R*gB$3B@Z2<~K7jK#AaTebQZK2F- zLdnk@UHpVXa7bS){nuC41ps>D-% zAA9t0C&7iL9i2N+tJ_5qma>4wL<#q{?@kx-$Fe9cP!u`Ea?o3fJp-}V zXxbC6cl_KOL274uO766!N5%4VIU-w6&J@vb+wN|*-+_@C4x zeO3u78Eqa0qtpuY)jsaJrFnNr0pF9QtM4%QsI@v?O5P^|HaVYmJ8~biHt3@$m@7tj z!7Id`%4NTjQ|l@?+Kbcc-X_80JCla!e)E>7_1s#&3a;H8ss{I97rLx3fr(rwZ{C_Da3!W znXTc(NJd-1f!alMnY7UT!I*@DYhto~V$<6QPh2maO>X(i(eL&%oZbY-f@kcvE`5F7 zIPL4)U(&{qk-qeU?jkgZvsR$Df7X&zdRf#6Tmm8@4;-Mhg-lvG$vl0dlhrPI$xZ28 zY4rs^briK#BGOcG@ac#8(78f}ie!vGqnvS_#1G~PV&@PWwwiqI<6+RpXB2oxOFQD2 zciAhJcy8Yc2^mc%@SQN=T3Gl!DhXxZ92y;GMa&Rt2`cROQFReC7NgH?K3B{wi6duB z@4E=XO&^Fe)w$ah_fc7Ld%h4LsXZDkW`@JEhGpPIjM2zjac?Nufub?u20q#@F^$)+ z%5$B=Q0G{pscGpy=0C^upG?xiHV&ZR2YtQUg!PilR!heEma7%LRVZJ$v?%|qrYJua zEXs4F!QwU#dhqV7w4JeaZnk9fyWBYy(ojEc&N|3*Bb>^8Ev6wH?M@4o3^V-7@Bk#n zRZV^}K%FnLi=a<8e0xb7UCWL|5oe!8izQ>(mB-~2L${~TQPNXFrUhj(V;aXbB2Vjw znwLz^6Ql?qRc%#?o2^F07JRcAXV7?ERh_0MNw#6GvRP=XloHt*J6g@UnW&J)SEvju zc#<#a-a4eos%HKj%Bx|BHpg@ox1bZ5C>X(B^Wvt6l_+a13!8j8^9iR&ADTn?J4i>@ zYd{-*L#JIGH~7gHNcC>0=<_E_&0;?lubWa7eTQB8RI1EX#RmLrA%#RSprDA zO99_?;tO5aKk)VqBcL&ZWxI=ntXNa?xk^%jB?{x?6?HC&4p+3x4RU!5B``#xA%>6o zuvh7F(s4U*03O8avF|a5hzp$WkD8Urc6{%URNzR%cYh~ z(P?+f3fpPodf+1&-yVui9157t)Wk4t7S}w_4gK+P0IrM_c`Fj zKt-x5u4`yI?8n$&Xsm{ku;m+|Hj{Y|MhWk9gQM$+{{H;GJQWl1u>P`a-lpO&?lz!7 zf>Wv}ESs{wMNLP-2S|je$Hu~6k4A|-IF%*vb=8GzrQBmD)@ADM{qDm$Y$zZoJj{zI zS6vidV6I<14bm8s_1?_h{-eB{V=16^xy?M)k>7rV4SUU?FQe&X@ZlWEY2tll{4;D7 z@g=Kh*w6ZgSr)?d$!@N&3bP*%>aB&P70s3>=r?z+$qJTb!)DUo2!6sBj+zmTiz}+< zV2@CDX4Tt^qb20{vp9ytRl$~lX+cCzhPOfohn5cp#-+f7Ev`}slxb9=B4RkswO`tW z=(ue=WwvEHbV{nSvi)wa%jyMT$7>t%HEgccNgjRGgSq;0WM+%{mt_*SxqMvy2%7qw zH~OyBTy=|q=O=QMcLqewt*^nv%$VvqrSbd__-ab5l{T~f^4B_?c)o}4Y@5wtRnCUh z;|ok8n(zLS-xt`u?`&I)&`s|&Z{*QaErJmO`#`Dm6nuhCbDbVDNM7ysJELpst2JF= z66AzI2pDXHsJg_{({e)5e@}=`v9B7=0;5V?S`ko)r!)iSu*M-Nc}6!nDy1e<&rl&c_kkBNje}WT~)o6g`UjYcdYJfLpXNUW>)qm zO9osU%qQ5FR9PNPjWfRK=M~JD7d6WrZf-t8n}PLYUwkN;%6w`= z3p@s{V+gd0Th65OSc8wB9($=f&T`db7hR5;x_^6LbhX<}H%bguzb}mF-GMJNnH#mN ztAW3p5+OWCy!;2~Hh58?+Y%@}!ltPsjdw$YBch`Nmv+U|MIcU(ixC}9y85K`4}Ko3 zynp;3{cp_^##5&H-nu{C?hv{D@v>cGrT&%EY$@0(2}sL?Y$sb{%E>tYTO7$ago`7I zRY8YNFBfT+?50N7!jz7mrwbP>2Hwl&Dv0W5M}LHC-*%sjBU`>*EQFMT@1eeLikJzk0gv@X>MAsSiMZn8)IIw{Un6K} zgCsTF*F;q^r2=#7JQfbB6iQ3xVfMkvGB@izjDeIw$F14jeP(4345jYO2#f1~b@4#r z>#n}dqUuF;jZVY+gFjxqI~h+y<9)5@ya1lZm_=tD^ zLPJD5thUDX+1DHB9jVUQnCZQ3Dq!Vkpczj<=5f`ub8D1ZaUd;={yieHpX4c$tG5K{nx4fad;-Y( zIG8q_N8-VWvK@D@gO%JZvRu7yz*74@4xhz3tzWv@uDEcuXJ7Gp`3FeKK=N@Kq;65} zCE%TWafLJbA(3A4?~{TJNr8HNVJcU_dHnL91t1RSJYX*^My{NzmlJUterZi8`o}Xx&+4PUd$xt%7G5%AJ=G{msaI=9ct2k1CU_B$O1!rYq3M6 zP*pf-CO(s(1SQrT!&RA3ll(_bap=d8@{TjIUSGIA$DP?!a{r=LZ8a`q$l5>|GQ&S~ z@D_fkYU+Ig5kj95jN!*pAf9!txR`gu5j~A(hhB&^5iU36K3mSf(v38C9dd5+|O&3kupPJ``i(N0-5G5VgU8F}Gw97to(UH>*bVGhnu+kd$eG4D1B=&hBnln?tSnsa`lVtLETYjqG zKn{P2fQ<}EZVSq8o)=qy+Vm!4;u}W_Y!Xo!Im(<1ogv{ve5~TIM6RauU){*gEV{vC z=VP9~OGXzT{R*U(_M1)4=(~_s`0D4`F|YYJlLS50cBvS*W(h9Ra_bR(P7E zg%M)!baySZpToN_)a}2$SvTQMvDSiQG+uu# z^U#N%xG;H^RIrS_EQa8fWwoozOv`+)LQ!pAEwsy_Xg6mFrA(J59gJSmENJEG!&ZVT zYe7H(n;ePRfmxN8rRj>4iU?RouHBFgZfZvTH=p3z3X7AZ7GQXQ(u_7PB#=0L_^65} zKEx);K3s99iJ0$%6Z^HCdL)qC$B}CkE}LhOB4KzaE$aVqw>rHb`x7nnWO{vMS)S@w zV!dh*E$5FaLdON*Sa&)z!c~C`jb-(VzSS$&net`bqD?1TS~WfiLxZZ(nZp1n;s}rV z^*;(Muz-HTx!tJg)&WTz6P@CEagti{j*5Em(Y3X4QNY(F;{~n58GY=FH9I2Mu5(8E z^S<|+1;-5A5Ng{v4VOsf0rjky-1y1ZDBXb=IdA}UDCA|&5Awq}j?Es2v+b8P7R+C_ zV?cWFrWN72kx*#>uCqBg_+RvivG>d^{~Q>uR~AiMEW`puE*Z4 z7LdeOZlM=(UHQr`^OIR}1wN0ze3(KtY(ItVe9AS8Ky~?XCQXqp=bg8eru&CDOXc3^NpNT9d9RXC9{^|?e?hhge=EuUqDaIx zVQP$H`_Y!wP3%+zi~kCv;{>BOmZZ(+v8A2s;Ho~#R(tC4(Z5n$!HOQkeqp+#Mr6$P zXi3YnBiJ&W1V9WU=H-fx?uTIJNlLe)X3B8xdUAPD%SrnuyO8! zE2;sgVO?LcvB}HL9}l6gZ0`1h#8SQ+8y2a7*LO!WRN^wTv>6V^t9FSEA%di z)zh#sX+LbLZz}in50JmN4eV~<>)PzKxZj!#W86!11RTKTRD#mjcRA0Bu=vcB zKp+?XNa@xlV#w*UXp6bZGR8Q4`|Zejn!E|a2uy)W}&E@f87ZSA|&q}po?=YAQYwdUPM892kE^_51}{d;m~{Np;rk~q~F1FeD8aIem_5cl9}Y0 z%%1)1wf9;p#SYKoJiCD$ZEag5gE?ajd8YNsX9^8>k6q>#Ghr-yPny2*ibKh+{+t!1 zwS4_kXMtVpSCEp)be-PESJm5oa_LIMVpg9WxqL$Qc+(4upfJzZhslC} z^?zXgIaO$>g2-|1OiC}!L64M{)yN#=DOB))4WDFC@G}-fsU+~uUPSdz- zvI;5CdKR(Mo&qyczjWsH2QrC6Uj)|H2Ue-Oupa|Lj5RWello86yHL7JvmHrcrXf*n zj5nY8Gn#I_$J4m0G0)Y6v%>_fL9C>$k~1hjsvRSZ%53ryVY~RMs9{ZK^pndwTNjCx zmM9$z{}73<&KJA-^X89Sl%FG%kJ35-;wiwbg($N*a=PGr=YfVyBo(y z>zdtOQ0bTtI;$K%QqJ(vmcpV#;&pAZp>Cb6_?Eq<9xm~!K|Rok3k%z^-o13J6MD88 zu`Lxo=+@8Zt3UKm)*3shifme9oHFnDi^5A8NMDu+5^6sAV1|tD!a`3aZxE;i3j$i- z2wD+AXi2{q(^B`SLM`UN-yg7PL+xU#&Pg|W$?4X=y?#N$1;ZtFPT`1f_&8Fi`wMDB zJ)E+k3dp`(NF^3VKA_kS>^icaD$YOXma{iuoptD{+q%D|3|+4Sw=53?nRFr8BKUJd z2;!jDRDMzOvNiTA+Rve~@0p>fN|7%5lrr;#%95TK6o?Nxlh{R{?U@d2Ny@~2^TJlN zwMH(Zuh;|#B*`_Rqgd1AtdkP*GF3(E_+Kf~uCL_qDb_?_k-sGpd@<~n720TiixZT= z1Q{gR9IN1>N|n=$u8g4&u06RLu!cgW{*X=A(uo|m zZ42Ry&GN)}1#^2m@?jIL-wG?fLq4tTN15vsoqj9-C^`rM>jqkWY3 z;g`2c?(_`E=4XU_ot^PS}2!?wj-Lsqr z;3kIvd76%O9qgsg_~ND8=>8hJWE#ruXk4R=IcW9Xn)w7T*DDzgVJlWE%Usk$m1)a4 z*Ndfb52{IK61pT}PKW-`)-^62)3se@W@8#c<-j#kSI2$E0IH0TcJR6!NOfHMMjTj_ zL%tc=X=l3+l}AM*n*nxoL_)~gN{mukeLp#PMCGG;BdZ8T&G9}8?iU6QuG0{=Liohj z*SMP5QBIkzEd{lQf$;(m&#~8+ZeP?vXr-{g$u6w<6WS?7BVHhHNWSA_cm*M zh|G$u$j`r@O5yfuv_`cDzO;akvev`GbnH-AKLcxQz>VAA&XOAv)UXu}x1$C0Zcy>D zRJFp`j5FQLfaoOuM8;p%*PU~n&l2Tmi1{-yMPD;+C=Zs6^J*ow@W-0t^8%wk4o9*f zEC)~x?UEpiRC2j+pr~8Tf!X)G>5ia#hSO+4bGo8}xSI)7{`;{iL%BB11+^80vyuwL>J&R56{lpe(9oC2J8aUksQAO`6Hm;05%nZyW(J52uxy&4BVX7Y21F!&P zjeIj1(cUHJ-8S>ij^Hs*)dv>Ym%^GIyb*ejArGN%gDq&_IoZs&c@l(zDBjZlconib z#2dc-*CUt(l&`0ERTW{G`7EE9Q3bE7!sYr3eM61_F&v1#bfTe7z=M{04L;*A{u{b8 z@6rEEs#^gd<%Rt;mGwQZ)1+Q3_d8<8V+0St=LStIKh{KD)zBM_$RTv>9TXm-1MlnQrgwwO&JhK-w}mGeLEYm-J`}W*? z+~SsDEHy>b-He8a{`mj+b38(oKzGtbeteb{aOvf#JFYfzjGzM`EW;FIKP`83MhcnkXKRG@2Qv@mI6(MQ z#I|0qDxr5jxNR%y82C9foPYMkOF9=nD)fFfTe3@mGesjS^zNvL-1-}tCMk}f)+S6< zEtgk&lTWcvWBA>z7=SwRk^&6}vhF`mPI(H!#v3+5TJ9+OO*j(GQgf@O2n3E_N=2+* z_|$6rc`Akcu?DCVwd;*3!7mf(UB8?T*Tu9WicSPj79sIV4mW_}w`e=V8P~Q4ovV@} z2!T`E4opS0^Tyo5Po*~}C4r?lbd=vcsXje0AFI7dw!fF~?J>@#>Q}*+7B7FY5v>)mNl-()VwsXpIF>6FcMq^p%Rd zrxpHb%*fD7_1H2`quWST+PGH%BgND%-!0mUz4v;e&_fk9^krH1xAv;&V+Jpmwo3aB z{#o)3Z=;iWsAx2xs;hdtugtZ(JfEuNXgA~s=I;1@GuVb*k+v~5`Xsib{%2PL837<8 z`S6+35Tmzx3xg;l8?eJ{-Zu9_1cqUnRK%hXTg#eW1=?>6$jtjKjD7!L-q!{d+nx^Ix6&=n#}k4;TMPCJ?!+^nO;xhNn`LN zdpB6NFvm)9oK-^G{VTxUGrF8A%!N5jB8&jO1{bZhNpBg~$i6@1-mr;<#X5Q81<)sL zh4MTu|H6a)4HW`gEuV8cX}UsKCHnoH7~y62xUe)U44Z*)$i{QKZYj%9QLtbCqwh}W zAl=6rx|+W-Qko74;0K3nF^?8D9L({s@ftPKtKH_7hx^Co^|=Je0EI>y16X)Bv}!{1 z`-1%L?!U90q&XlF5X3xKS}!y0fDXz zjRV*Eq^FZWb_1}VFj~(XFfMZJ_hrkSbo>($7j3RH|K%Nk>+a|4f^yGfx#vT$6)p7_)WLp7-(e0FU-!_KYx-+QpWrl+lEl}S?2A&P&Jwa|P`BBm=n;X%H zR49&sc9|ac4p0tP%91c}4@@<>k!5jJWfLq)@PdA=4$-MaCc|*G0gXut;uX1tuH+L^ zw57#kljkdo!l`$M*uH4QtN{v>)5rw-18I(YC4a6>ICpNL(uMuS%GW}keP*EV{^Ts5 z0yhUd-}lg~GeDW%iG%iVAQSFdPGOR{{Y3wulO)}wC%&g$F;$(U zf|8Ul{?b)26h@=!*bbQ~U%#t?kxRK31PP4_8qeLq;D_EI5+kx@9LKIlPgwjAESs8p(4e(_ClKTiBV?Tus>VYFi_ z&Rsk%JSIHq+jzX@cW5)%)>Hgg)*J@*lJK4qYf5FU1lDJS_`&gvR%L0j4^(Exy5LQ( zi%X(a%`R^GIErrlL2b>7(@sdCeN}ONt=YnBS1B0E?o%a&`49$n2V;If3!T|`8F*Og z_&&XoV!B|1|F+Jf+Q@oQCJxpA4S+J>?ixXEL#rFHmwc~al1DQamA<-CIWE4=P&?U1Co#VXr~uV`Nw(#E~lVcwd>2{J(kVG2rE)$`f? zl`fU%i@Net>=c*vy2bdQcHvidkQ^UK;UmdLj*o;%#bLV5-Rk8G$RJhWoV2JEmCK6x zu~#9mO}Bxx#dH}Nb_cByLCevpsq6FfV~Pa>)%9GP9h}RAu%{LEZ*6iqWkZSC84Z@n zVC)HW!Qs^4M^*Ti%KQ*Fv|D0o*R^!c$*Cv7VgZJ3mShK|mg44o^rG9dx)krE%b3dY zrfzyc1*ruf$FL zGWQjx>r9YW50!S=mL0qu2n-oughO`jF=4sJkor|p9^Qk|7kTbqQs9=9=Mv#N#M4zh z%E^#*vetJEOL?iCxi&3E{Y^7&@7D)DVmW&(52SX6Tg?RDOrj{ssxh479w>0o;|J2boKsN z?lMZlc|{uv$9_!`WfEeQSp!-kwjGQ!edD)%VrfoC9IBZS>Gc&)k&rD(tUzKjba=xa zZ|RXlQryS>`74Y^aI#G^RA=7A)W!vc71jHcs%LUh3QBGQVMEvbdcnY|iiz&_eTvrc z=;g3#N7XA1-RGEG<0HA!WKg0KawNfK;bCFi!SRYR{TTf-W-E?9vO7vKcAx4NRB-FA zo&6{JX%FWrHk#=s7KvVkU1fWFUMppfC=Qx-=N0Od$-6ikx7G=hpSP$TvCPQthI+2- zLQTzjV&-fIcuTo|xQ`_|8|ob^)b)k(=kQ&78?3!{uhUV6}^`dy7)vC>g~A zoPuCXTympOF}&PLWq!@om9>Kh0vhps9K}lZ5CMN*mTEY^Bc%bely(AK74_BBE)vim zW!r#|svgQ(u`zwBZl(Pe^Mc;JcC$n{go)id3SyS@Zg^y!XaY*j+cf6_vO~=2({e(qsF>S(5iynIy z0uvL!StgD2%1w~z#?<}|rNBW>;m~M0FqF z2wHJUe(UDLIDl+rk zO#rM4bO`Z_dAJQ`$RqJNU|CJ-rcA22`-4UVYjKDOXLdWQ zMo2)_Sm3?eWSjs#;Luh0m@?)xg7rhKstWg`cJ!=S zvaqY5O%kcWcJ#8b?vQ9xo&5n@pdwS6oVQj35~;>hc{D%zgr=y5#EwG|+^Xw!G!6_$ z>kCMzkLtso%l&-p%&gp$z_NyOMq)5*v^Ei(Z`JBQx;p7j^Li!Q}RZuF~ z2}sq5s33nz10%)Mm2N$L6WdrQY-kyN^bEcQzr%;u1fai159z>u+GJlsZs9VBxR$G* z7IP9=+SDGeYtVdrw?NarqFhc;9X4+E*Q|g!xR_*+?an$2F{&Y*7C>lcyS?9tCe z5LT#uig?nFX`u-63yAs&{3(m}ff0B$vd}6vpJ^l?#!EaW2#w+wy}n3bFo-$Q@HuwH zkSut^f6Yi>{T-Z`z8 z&(||sqp6_a0itz54P<-8_rlky^ccw+i$&7h1})vv&?mp}tl5oq(*y1CD~&TQ8*h>0 z^Wu$@|8y*^wAiBL!MNB!>wbMUXb>@_==2ePc{L>$jNUW=(|wTppfGJwOrc2l$7*bd z1Q+fh^P$>b{oaQk*PXp>ZBgW1P;6FCJg5|}5`4viiYs2pBiy(^E~lO^37J91Y{th` z$a-1LBd*hUE!xs3Gqu1V^49aHoq=bqgeM;4aWf1b?@+?4d{=>vd2zMN>5(+Tmx@D3G?jaI=tVahf1Eus5}W5}1;TppR@{zuQHs(|tM&9jkBX|O z{fhm7e&V;%)$=q&sYS=`?+HJ!nsP(jm7bjO$Ox%V#+|or3rYy;2)<@tZWe$_WH(0L zTWw>YW5%e2&&~>uje&+i+v12SgvC#kT;@4(_PbjlCw zUOw3a+!JUU1N=_F(6K-)1Kh(enIwLcnk)zzaj|P&%8GO4a!uW{k{VPUB*(w`z0HyP` zdM)b=5{t|qY>#-|s`{|o$p-z!^1!tW4c^{7F+17g;PyJFXwOfp&&!6HM^NFvu=_LP z*Z1Te$~X0>0e>$?*XXItHhxUMv-}r@vvarJ$)U5_ zcx2GuYQ%*8H)@2}DC*YUcK~sR`)N`SQL|tdX9py-wdjV!-(|8TN6?=%JJ`IO+HTXx zuk)dy8Y8L$Q3pf>wVt-=1PRL;j~>U{@s!dbOyQt`;#w>#JiW;g{NHjc?uFWJr*kab z1yqlhfAO)XG|Oo7e9e%+c~+Brfrv8v{nFvn$z~ew@v{X-9}PQf?Ep*{u|HUjPW`SQ zVB}zZ*98!!$+VvM^Uy9G9cc7hEcc!$^sakOWTR7r$TT}|o6~sf0Je4eLgC~KAg*i& zZ&3ot>jwWz~wF}i5=WiM5KH5 zQIAw$Fux(9u0_h|5}al+X^mfq>hmuYS#hQykrY zY`dAt54BA9IOFJ!g84G1lPt3Pqy-(;8m52a#HoCm@`&XPix>_AOMKWkHYnyAO~f5j zV(+k-89RQl!%bd}BtAxDTi;N6atSz(MziJfK2=JFdMcC>x!dQgSoUUqUqb61MD}78 z+2;mPWPA=_^v><|7swk2At7gh5-IY=+jbLh^VZTSH`PU5=kIkR?5yFd!&lP&@;hwZ zWoL_hz41idbFx@^_A6aa4$yHpJCca|=TXEfJB%pO#+=belxB{KS5^?L5RwnvudgJ2 zxeFG__-TTqmB!!grX?6}G2T*b+yO@0-)xa+>48?H@0~CRA6m0p#H!@``G2(%p5De8 zaiR%1Oyvlq0#5qpWAMiy$b1xXfx$4xz zM@w8Q$ObANSw1%=8KAtV5Sj4PBV$X@`%d01ZenCSwN{Iet`jpL!to}})Yolrj>t$w z1fRhk8)a}15@}Mk*ukHVGu|n|6TztDNh-vYAt~v^k9MNa3)ZMN+Wn8rQdG4kK7UMT z+EVLe74TA8%}Y5uU?`BEp?v3nUbnr`E~upf#f z>*ftps(_qUN_FkP2J8Q3 z(u4?%98uf%dIV-F;k#?eYXEHKI-_L#XE!R%tXqwTmcEedQuIIFSY1&-huvCufO-*o zUFD}b;nZ!Z+j1lQ59QF;I3D(Kn6GbahUGX@j!rQhhs5x6OQ+d6I>mbJ_6<@BT&;9h zW~E*A3*5Wj|IBkwyxh#|G{VU+TJ-3^g$gqIX^><-Y+PC*&^~9aga`0}Ip%#GK}j-2 zg{|YkSMd~;?ZKCFz1DED^UiYIqwpNx4j3&4hTIEYyYP|DgF_Bb{&4 zmpdLU^<&;w_>K5Bz$T*A@S(DVV-X%kPyG^~Mep_Zs3iW@7{yrH*(}bj(4*(%qfry< zmoKnVpA_0{iV#oHz^bOS*f|pN_Ktw9W;4Zd-HF7nlJ}DikK?I*lDaX#NHm@{Z$ygz z4Fdy(DRWpmzh~i|-U(dg5;@j;?dyL%4fX%ggs59ajFH?oR3S3?M&Lx_D}wj%K>0ho z!E&GDW!}mogS+7z#^$QBN{8X+VOWaf{G_bHM=$w(739H-WG$`^PCfHq`cO>X-Ivl5 zLW;Y7^Bs2PsQF&!;{8J6$|`{1r^SgQY|~tKGXmm7{3RzI-n#0qqYOyhOf|Ps`F&x& z?+lGz)R`?lr#)FMs7)KpW%&s*Hm#Cxh&Z{%yd_)5xgG2rl48g&-Y zK~&qQD(rx5@{%5!q-pT2d;L*&U_=f_jQ` z{6CfFW1N0~I9a0AsF(bo36CM*+}^4 zDueJ->a`trheq29vUm*xKj3?J__)8R9lz!fSJbK(n$WZMj@!uG4MoFho%ozXDFQ8$ z;&XM{xoMVGz4j;%hJ%pvdUQ_iTo@K&-Un#AD-Yv1Lkb3;gs3kVjNx5*zTPz8XJHzi`TGHArcPw%5{9$S$l((!f}Ajour8nS3YvVT3rGgo9~QQ~7~R+3zn ziB;*8>`=*0b+^e_DS1AN1i*IXo9}kZ4Hoj>Ja;C5W@D{cWFG-ANv)3tfnRRBuM3qZ#NFrJq#&-w_3cKatphirZK10ceR;0< zV260_R$H{pk4TXU!M3_LV#XXG>P?mTpc5>#X6}#ld&seDxulg>rn92tRL@HnMY^Vt7(i2?ll&c*0)Sy zw%RCCTAF_j6e$#?ma63|G!1X*RvZ9uScr58jisf{IL0*jM23)O`SEkC?l?m*cu8fl zZ2fb6v+^mNj{B4x$t z>2@~ac8?X98Bo{jz&KHsJb$;C;Y=Ar0zL>WsEO(h~n)V&UdTd zVfQw9J7*EouDLp5Mv(-!(o^)vFX=`y&zBaN#f7|wLiky0BHRG{9uE+*^-27QaVp!NBG(nju&rD?U2@|8m(cIya%upmNu@%vK)z@H) zGiU4k5*u0vk3Ti@Sg3^K0BKlu`)DTb;@eIv5}xufrh^U#^EZh_Pl0BHx}x_tjyRVxt& zl>7hA`#8yQj2WZ>r$~c}50jpD3>-zgfJqygBk=mzRh!i_dE1Bj0f=7c?ZvC_ zJha{a`w2S)mXN=zLB*c|f9hR7e0t5mE^-6+U#|0n`uiWzPS-!T!}FaEs{N{D1%nPI zOL(YKmsceg^OCKTikUsDhTol%{mT9ED;#}jbB;g*v=RNuX}TX*RGpdrfx$5g_094f zKSLjKN;n+7MgS*bftgd%Dk?Or-Lx=Bhvur<#fwQQgY$!`X^;)ra{;dOu5YpbqK0_h z%2}(oVeD)yK@1)@83n)WjHytZ38xdDSo#&M;i-e^&6i=2n``!xjmkbnwVq$2d9Lj% zZtOoBo<5nlPoVOT2=sfXQh|8J|&heHz5$K=>u{6r@ z=z(#q5JSSvdpJ|nOB+8f2I`$Jw|-n1VHmtmvOCSh&n4{6POSAc=DR~r^c@s1+3Ts3 z-FYXK{l9$+*R1dsMkiR#N@xD`Bp?Kf(z<7BArp}LinK8Ms<7j+m1q^)y4eQREm5ml3>O$c_{X8uns8!lA$A28*8U-GQ$KeycG7m52H<1u~FTUk<0?}pBPej z;vP*5(1O5jkmwgQ7B>@1-~j=K?>lg=bj7)B5TmaY1)V?&``l#ST2vsp27-fSJya84 z*dCfsq_xu+*ZU^*U-X;NLXa}Hkk_y(lQBcEXuc$G#}=9I>;G);=W9VTj4z3nij108 zmV+h0Z+}XlYuk3a|Luylw(MfopqKS8y;Z#iX9^`#vC)&GA7^hcBMH|r_p5_0&rg)* zoQ17arA+Z|{1#KV_IQj>IQDAW3eSf!qNMPNH^-R#)lW(#vr`eV+{i3Y?|o;0T9ToK z+qgW(Id3)Tj8qUHZYjQK2i)>IBWz|6rO@k1RR#{Rlicp$8{hj6NK=~hU3iJ#&>d!= zfpft${VD{cei4HnE9BhEc#*{B?-2LGT^jUl}gK z$()I-4csi&umKV1yHi8UG=V9LWGcy@V81&Aq2N|yt!XIQII&3Xr;$)v$o!1~0uXA4 zV85_S>t-FB|0E=8zi|nmRC~WM-Snp&VTkJ<4g^*j$58)ocaq@3*b9_h-+{B{W!2${~n2`^2M|d##QBxG z;ETjS*VVMIi@BN4g(hab)0pC6;@T+4Ijia$B1Zf@zZ(5h zuTG1FszTR37=ytGeZ7tq^L}y5c}S}A*lMLBoG~uDa=xvAZ&V0Ay{ln=h0Bk5q^MkK$rBmK zGpJSJ#dc|f^+xCm{gf(d+r^CRk{+o0p}8NVHxv%c&~9?2-yW0go0Fs!N*X_J=18G; zb~PbsOMH(CLcd%0Fdy0TRK@ zMa@aJ3R}$$f7TgM#kDQ9^>i%v`21A5RV!H74hg0NdB3Hk<3z>|T7OLuz$|*&wMxk= zLsFruDy7c0^#11e4LDEg{&}Jt@qzsM=Z(??ZQ(1BUYh%BhOC77+)m-}_S*`a%q66Q zaS0*W%YoTcr-Dj6g)%fz{A=g``momfw|4FEb#n3I0FXQ%A3szs#m+2L1gdOjW|@>G zV^(^X!RgIpEo0)4&_6j{Lj1;&nMAZMPE- zI!(U1KteWS*2uHB`DqWrj@DL${+$-o-)P{hH`+=x@8hoABkS{99$^!L%4b(6>_A^vn8Es6R81-EQI6NYRdhGgM!~|6F#F_C2?Nqd=2(P) zkhc9m*KkK=5BR6CUJ3`@sssI~NDryMs}Vg&XC>%n0{YM0V_Zx{>}`ApF1LiyFtCJT zO0V$di!^)>M4CT^5^$|UBETk;)IIy`pAY>Vi~kSD@e`$S>zunz%^t;tFtPFhRFlXRxW6v5B* z?Pih*pBe2@YW`cn{k{qD)Yz0c4Ls++W<^taEwU$AuMYQT<8=PdA#{GDEiMjRdMUto zDA$?r&-CK=R#))JmqEG!Hzw%6FZbp*K2V(t)qiS-n@8_2;D79GCinl@A%Exa|2#-H zUnurJF97eCig^7v@we&C?@xG)vwH)}^)B=p{t49Ihq41jYRO;nEdQOn8g7yomCvO0 ff9(mc2`;WrIfQmua*pP(fWKES6s1d_8-DyBhmUr+ literal 0 HcmV?d00001 diff --git a/doc/source/admin/scale-environment/figures/deploy_two.png b/doc/source/admin/scale-environment/figures/deploy_two.png new file mode 100644 index 0000000000000000000000000000000000000000..4cdc3349d94a2e0b6f6aac13803a64ef5ae664c2 GIT binary patch literal 32251 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 V8F@TtkcI^O$Vw@`Dw5Fk`5zbUrT_o{ literal 0 HcmV?d00001 diff --git a/doc/source/admin/scale-environment/scaling-maria-rabbit.rst b/doc/source/admin/scale-environment/scaling-maria-rabbit.rst new file mode 100644 index 0000000000..9df17d519f --- /dev/null +++ b/doc/source/admin/scale-environment/scaling-maria-rabbit.rst @@ -0,0 +1,823 @@ +============================ +Scaling MariaDB and RabbitMQ +============================ + +.. contents:: :backlinks: none + +OpenStack is a cloud computing platform that is designed to be highly scalable. +However, even though OpenStack is designed to be scalable, there are a few +potential bottlenecks that can occur in large deployments. These bottlenecks +typically involve the performance and throughput of RabbitMQ and MariaDB +clusters. + +RabbitMQ is a message broker that is used to decouple different components of +OpenStack. MariaDB is a database that is used to store data for OpenStack. +If these two components are not performing well, it can have a negative impact +on the performance of the entire OpenStack deployment. + +There are a number of different methodologies that can be used to improve the +performance of RabbitMQ and MariaDB clusters. These methodologies include +scaling up the clusters, using a different message broker or database, or +optimizing the configuration of the clusters. + +In this series of articles, will be discussed the potential bottlenecks that +can occur in large OpenStack deployments and ways to scale up deployments to +improve the performance of RabbitMQ and MariaDB clusters. + +.. note:: + + Examples provided in this documentation were made on OpenStack 2023.1 + (Antelope). It is possible to achieve the same flows in earlier releases, + but some extra steps or slightly different configurations might be required. + +.. _scaling-osa-common: + +Most Common Deployment +~~~~~~~~~~~~~~~~~~~~~~ + +Before talking about ways on how to improve things, let’s quickly describe +“starting point”, to understand what we’re dealing with at the starting point. + +The most common OpenStack-Ansible deployment design is three control nodes, +each one is running all OpenStack API services along with supporting +infrastructure, like MariaDB and RabbitMQ clusters. This is a good starting +point for small to medium-sized deployments. However, as the deployment grows, +you may start to experience performance problems. Typically communication +between services and MySQL/RabbitMQ looks like this: + +.. figure:: figures/common_deploy.png + +**MariaDB** + +As you might see on the diagram, all connections to MariaDB come through +the HAProxy which has Internal Virtual IP (VIP). OpenStack-Ansible does +configure the Galera cluster for MariaDB, which is a multi-master replication +system. Although you can issue any request to any member of the cluster, all +write requests will be passed to the current “primary” instance creating more +internal traffic and raising the amount of work each instance should do. So +it is recommended to pass write requests only to the “primary” instance. + +However HAProxy is not capable of balancing MySQL queries at an application +level (L7 of OSI model), to separate read and write requests, so we have to +balance TCP streams (L3) and pass all traffic without any separation to the +current “primary” node in the Galera cluster, which creates a potential +bottleneck. + +**RabbitMQ** + +RabbitMQ is clustered differently. We supply IP addresses of all cluster +members to clients and it’s up to the client to decide which backend it +will use for interaction. Only RabbitMQ management UI is balanced through +haproxy, so the connection of clients to queues does not depend on HAProxy +in any way. + +Though usage of HA queues and even quorum queues makes all messages and +queues to be mirrored to all or several cluster members. While quorum queues +show way better performance, they still suffer from clustering traffic which +still becomes a problem at a certain scale. + +.. _scaling-osa-one: + +Option 1: Independent clusters per service +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +With this approach, you might provide the most loaded services, like Nova +or Neutron, their standalone MariaDB and RabbitMQ clusters. These new +clusters might reside on a separate hardware. + +In the example below we assume that only Neutron is being reconfigured to +use the new standalone cluster, while other services remain sharing the +already existing one. So Neutron connectivity will look like this: + +.. figure:: figures/deploy_one.png + +As you might have noticed, we still consume the same HAProxy instance for +MariaDB balancing to the new infra cluster. + +Next, we will describe how to configure such a stack and execute the service +transition to this new layout. + +Setup of new MariaDB and RabbitMQ clusters +------------------------------------------ + +To configure such a layout and migrate Neutron using it with OpenStack-Ansible +you need to follow these steps: + +.. note:: + + You can reference the following documentation for a deeper understanding of + how env.d and conf.d files should be constructed: :ref:`inventory-in-depth` + +* Define new groups for RabbitMQ and MariaDB. For that, you can create files + with the following content: ``/etc/openstack_deploy/env.d/galera-neutron.yml``: + +.. code-block:: yaml + + # env.d file are more clear if you read them bottom-up + # At component skeleton you map component to ansible groups + component_skel: + # Component itself is an ansible group as well + neutron_galera: + # You tell in which ansible groups component will appear + belongs_to: + - neutron_galera_all + - galera_all + + # At container skeleton you link components to physical layer + container_skel: + neutron_galera_container: + # Here you define on which physical hosts container will reside + belongs_to: + - neutron-database_containers + # Here you define which components will reside on container + contains: + - neutron_galera + + # At physical skeleton level you map containers to hosts + physical_skel: + # Here you tell to which global group containers will be added + # from the host in question. + # Please note, that _hosts and _containers are + # interconnected, and can not contain underscores. + neutron-database_containers: + belongs_to: + - all_containers + + # You define `_hosts` in your openstack_user_config or conf.d + # files to tell on which physical hosts containers should be spawned + neutron-database_hosts: + belongs_to: + - hosts + +``/etc/openstack_deploy/env.d/rabbit-neutron.yml``: + +.. code-block:: yaml + + # env.d file are more clear if you read them bottom-up + # At component skeleton you map component to ansible groups + component_skel: + # Component itself is an ansible group as well + neutron_galera: + # You tell in which ansible groups component will appear + belongs_to: + - neutron_galera_all + - galera_all + + # At container skeleton you link components to physical layer + container_skel: + neutron_galera_container: + # Here you define on which physical hosts container will reside + belongs_to: + - neutron-database_containers + # Here you define which components will reside on container + contains: + - neutron_galera + # At physical skeleton level you map containers to hosts + physical_skel: + # Here you tell to which global group containers will be added + # from the host in question. + # Please note, that _hosts and _containers are + # interconnected, and can not contain underscores. + neutron-database_containers: + belongs_to: + - all_containers + + # You define `_hosts` in your openstack_user_config or conf.d + # files to tell on which physical hosts containers should be spawned + neutron-database_hosts: + belongs_to: + - hosts + +``/etc/openstack_deploy/env.d/rabbit-neutron.yml``: + +.. code-block:: yaml + + # On the component level we are creating group `neutron_rabbitmq` + # that is also part of `rabbitmq_all` and `neutron_rabbitmq_all` + + component_skel: + neutron_rabbitmq: + belongs_to: + - rabbitmq_all + - neutron_rabbitmq_all + + # On the container level we tell to create neutron_rabbitmq on + # neutron-mq_hosts + container_skel: + neutron_rabbit_mq_container: + belongs_to: + - neutron-mq_containers + contains: + - neutron_rabbitmq + + # We define the physical level as a base level which can be consumed + # by container and component skeleton. + physical_skel: + neutron-mq_containers: + belongs_to: + - all_containers + neutron-mq_hosts: + belongs_to: + - hosts + +Map your new neutron-infra hosts to these new groups. To add to your +``openstack_user_config.yml`` the following content: + +.. code-block:: yaml + + neutron-mq_hosts: &neutron_infra + neutron-infra1: + ip: 172.29.236.200 + neutron-infra2: + ip: 172.29.236.201 + neutron-infra3: + ip: 172.29.236.202 + neutron-database_hosts: *neutron_infra + +* Define some specific configurations for newly created groups and + balance them: + +* MariaDB + + * In file ``/etc/openstack_deploy/group_vars/neutron_galera.yml``: + + .. code-block:: yaml + + galera_cluster_members: "{{ groups['neutron_galera'] }}" + galera_cluster_name: neutron_galera_cluster + galera_root_password: mysecret + +In file ``/etc/openstack_deploy/group_vars/galera.yml``: + +.. code-block:: yaml + + galera_cluster_members: "{{ groups['galera'] }}" + +* Move `galera_root_password` from ``/etc/openstack_deploy/user_secrets.yml`` + to ``/etc/openstack_deploy/group_vars/galera.yml`` + +* RabbitMQ + + * In file ``/etc/openstack_deploy/group_vars/neutron_rabbitmq.yml``: + + .. code-block:: yaml + + rabbitmq_host_group: neutron_rabbitmq + rabbitmq_cluster_name: neutron_cluster + +In file ``/etc/openstack_deploy/group_vars/rabbitmq.yml`` + +.. code-block:: yaml + + rabbitmq_host_group: rabbitmq + +* HAProxy + In ``/etc/openstack_deploy/user_variables.yml`` define extra service for MariaDB: + + .. code-block:: yaml + + haproxy_extra_services: + + - haproxy_service_name: galera_neutron + haproxy_backend_nodes: "{{ (groups['neutron_galera'] | default([]))[:1] }}" + haproxy_backup_nodes: "{{ (groups['neutron_galera'] | default([]))[1:] }}" + haproxy_bind: "{{ [haproxy_bind_internal_lb_vip_address | default(internal_lb_vip_address)] }}" + haproxy_port: 3307 + haproxy_backend_port: 3306 + haproxy_check_port: 9200 + haproxy_balance_type: tcp + haproxy_stick_table_enabled: False + haproxy_timeout_client: 5000s + haproxy_timeout_server: 5000s + haproxy_backend_options: + - "httpchk HEAD / HTTP/1.0\\r\\nUser-agent:\\ osa-haproxy-healthcheck" + haproxy_backend_server_options: + - "send-proxy-v2" + haproxy_allowlist_networks: "{{ haproxy_galera_allowlist_networks }}" + haproxy_service_enabled: "{{ groups['neutron_galera'] is defined and groups['neutron_galera'] | length > 0 }}" + + haproxy_galera_service_overrides: + haproxy_backend_nodes: "{{ groups['galera'][:1] }}" + haproxy_backup_nodes: "{{ groups['galera'][1:] }}" + +* Prepare new infra hosts and create containers on them. For that, + run the command: + + .. code-block:: console + + # openstack-ansible playbooks/setup-hosts.yml --limit neutron-mq_hosts,neutron-database_hosts,neutron_rabbitmq,neutron_galera + +* Deploy clusters: + + * MariaDB: + + .. code-block:: console + + openstack-ansible playbooks/galera-install.yml --limit neutron_galera + + * RabbitMQ: + + .. code-block:: console + + openstack-ansible playbooks/rabbitmq-install.yml --limit neutron_rabbitmq + +Migrating the service to use new clusters +----------------------------------------- + +While it’s relatively easy to start using the new RabbitMQ cluster for the +service, migration of the database is slightly tricky and will include some +downtime. + +First, we need to tell Neutron that from now on, the MySQL database for the +service is listening on a different port. So you should add the following +override to your ``user_variables.yml``: + +.. code-block:: yaml + + neutron_galera_port: 3307 + +Now let’s prepare the destination database: create the database itself along +with required users and provide them permissions to interact with the database. +For that, we will run the neutron role with a common-db tag and limit execution +to the neutron_server group only. You can use the following command for that: + +.. code-block:: console + + # openstack-ansible playbooks/os-neutron-install.yml --limit neutron_server --tags common-db + +Once we have a database prepared, we need to disable HAProxy backends that +proxy traffic to the API of the service in order to prevent any user or +service actions with it. + +For that, we use a small custom playbook. Let’s name it ``haproxy_backends.yml``: + +.. code-block:: yaml + + - hosts: haproxy_all + tasks: + - name: Manage backends + community.general.haproxy: + socket: /run/haproxy.stat + backend: "{{ backend_group }}-back" + drain: "{{ haproxy_drain | default(False) }}" + host: "{{ item }}" + state: "{{ haproxy_state | default('disabled') }}" + shutdown_sessions: "{{ haproxy_shutdown_sessions | default(False) | bool }}" + wait: "{{ haproxy_wait | default(False) | bool }}" + wait_interval: "{{ haproxy_wait_interval | default(5) }}" + wait_retries: "{{ haproxy_wait_retries | default(24) }}" + with_items: "{{ groups[backend_group] }}" + +We run it as follows: + +.. code-block:: console + + # openstack-ansible haproxy_backends.yml -e backend_group=neutron_server + +No, we can stop the API service for Neutron: + +.. code-block:: console + + # ansible -m service -a "state=stopped name=neutron-server" neutron_server + +And run a backup/restore of the MySQL database for the service. For this +purpose, we will use another small playbook, that we name as +``mysql_backup_restore.yml`` with the following content: + +.. code-block:: yaml + + - hosts: "{{ groups['galera'][0] }}" + vars: + _db: "{{ neutron_galera_database | default('neutron') }}" + tasks: + - name: Dump the db + shell: "mysqldump --single-transaction {{ _db }} > /tmp/{{ _db }}" + - name: Fetch the backup + fetch: + src: "/tmp/{{ _db }}" + dest: "/tmp/db-backup/" + flat: yes + - hosts: "{{ groups['neutron_galera'][0] }}" + vars: + _db: "{{ neutron_galera_database | default('neutron') }}" + tasks: + - name: Copy backups to destination + copy: + src: "/tmp/db-backup/" + dest: "/tmp/db-backup/" + - name: Restore the DB backup + shell: "mysql {{ _db }} < /tmp/db-backup/{{ _db }}" + +Now let’s run the playbook we’ve just created: + +.. code-block:: console + + # openstack-ansible mysql_backup_restore.yml + +.. note:: + + The playbook above is not idempotent as it will override database + content on the destination hosts. + +Once the database content is in place, we can now re-configure the service +using the playbook. + +It will not only tell Neutron to use the new database but also will switch +it to using the new RabbitMQ cluster as well and re-enable the service in +HAProxy. + +For that to happen we should run the following command: + +.. code-block:: console + + # openstack-ansible playbooks/os-neutron-install.yml --tags neutron-config,common-mq + +After the playbook has finished, neutron services will be started and +configured to use new clusters. + +.. _scaling-osa-two: + +Option 2: Dedicated hardware for clusters +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This option will describe how to move current MariaDB and RabbitMQ clusters +to standalone nodes. This approach can be used to offload control-planes and +provide dedicated resources for clusters. + +.. figure:: figures/deploy_two.png + +While it’s quite straightforward to establish the architecture above from +the very beginning of the deployment, flawless migration of the existing +deployment to such a setup is more tricky, as you need to migrate running +clusters to the new hardware. Since we will be performing moves one-by-one, +to preserve at least two active cluster members, the steps below should be +repeated for the other two members. + +Migrating MariaDB to the new hardware +------------------------------------- + +The first thing to do is to list current members of the MariaDB cluster. +For that, you can issue the following ad-hoc command: + +.. code-block:: console + + # cd /opt/openstack-ansible/ + # ansible -m debug -a "var=groups['galera']" localhost + localhost | SUCCESS => { + + "groups['galera']": [ + "control01_galera_container-68e1fc47", + "control02_galera_container-59576533", + "control03_galera_container-f7d1b72b" + ] + } + +Unless overridden, the first host in the group is considered as a “bootstrap” +one. This bootstrap host should be migrated last to avoid unnecessary +failovers, so it is recommended to start the migration of hosts to the new +hardware from the last one to the first one in the output. + +Once we’ve figured out the execution order, it’s time for a step-by-step guide. + +* Remove the last container in the group using the following playbook: + + .. code-block:: console + + # openstack-ansible playbooks/lxc-containers-destroy.yml --limit control03_galera_container-f7d1b72b + +* Clean up the removed container from the inventory: + + .. code-block:: console + + # ./scripts/inventory-manage.py -r control03_galera_container-f7d1b72b + +Re-configure ``openstack_user_config`` to create a new container. + +Assuming, you currently have a config like the one below in your +``openstack_user_config.yml``: + + .. code-block:: yaml + + _control_hosts: &control_hosts + control01: + ip: 172.29.236.11 + control02: + ip: 172.29.236.12 + control03: + ip: 172.29.236.13 + + shared-infra_hosts: *control_hosts + +Convert it to something like this: + + .. code-block:: yaml + + _control_hosts: &control_hosts + control01: + ip: 172.29.236.11 + control02: + ip: 172.29.236.12 + control03: + ip: 172.29.236.13 + + memcaching_hosts: *control_hosts + mq_hosts: *control_hosts + operator_hosts: *control_hosts + + database_hosts: + control01: + ip: 172.29.236.11 + control02: + ip: 172.29.236.12 + infra03: + ip: 172.29.236.23 + +In the example above we de-couple each service that is part of the +`shared-infra_hosts` and define them separately, along with providing MariaDB +its new destination host. + +* Create the container on the new infra node: + + .. code-block:: console + + # openstack-ansible playbooks/lxc-containers-create.yml --limit infra03,galera + + .. note:: + + new infra hosts should be prepared before this step (i.e., by running + ``setup-hosts.yml`` playbook against them). + +* Install MariaDB to this new container and add it to the cluster: + + .. code-block:: console + + # openstack-ansible playbooks/galera-install.yml + +* Once the playbook is finished, you can ensure that the cluster is in the + **Synced** state and has proper cluster_size with the following ad-hoc: + + .. code-block:: console + + # ansible -m command -a "mysql -e \"SHOW STATUS WHERE Variable_name IN ('wsrep_local_state_comment', 'wsrep_cluster_size', 'wsrep_incoming_addresses')\"" neutron_galera + +* If the cluster is healthy, repeat steps 1-6 for the rest instances, + including the “bootstrap” one. + +Migrating RabbitMQ to the new hardware +-------------------------------------- + +The process of RabbitMQ migration will be pretty much the same as MariaDB with +one exception – we need to preserve the same IP addresses for containers when +moving them to the new hardware. Otherwise, we would need to re-configure all +services (like cinder, nova, neutron, etc.) that rely on RabbitMQ as well, as +contrary to MariaDB which is balanced through HAProxy, it’s a client who +decides to which RabbitMQ backend it will connect. + +Thus, we also don’t care about the order of migration. + +Since we need to preserve an IP address, let’s collect this data before +taking any actions against the current setup: + +.. code-block:: console + + # ./scripts/inventory-manage.py -l | grep rabbitmq + | control01_rabbit_mq_container-a3a802ac | None | rabbitmq | control01 | None | 172.29.239.49 | None | + | control02_rabbit_mq_container-51f6cf7c | None | rabbitmq | control02 | None | 172.29.236.82 | None | + | control03_rabbit_mq_container-b30645d9 | None | rabbitmq | control03 | None | 172.29.238.23 | None | + +Before dropping the RabbitMQ container, it’s worth transitioning the RabbitMQ +instance to the Maintenance mode, so it could offload its responsibilities to +other cluster members and close connections to clients properly. You can use +the following ad-hoc for that: + +.. code-block:: console + + root@deploy:/opt/openstack-ansible# ansible -m command -a "rabbitmq-upgrade drain" control01_rabbit_mq_container-a3a802ac + + control01_rabbit_mq_container-a3a802ac | CHANGED | rc=0 >> + Will put node rabbit@control01-rabbit-mq-container-a3a802ac into maintenance mode. The node will no longer serve any client traffic! + +* Now we can proceed with container removal: + + .. code-block:: console + + # openstack-ansible playbooks/lxc-containers-destroy.yml --limit control01_rabbit_mq_container-a3a802ac + +* And remove it from the inventory: + + .. code-block:: console + + # ./scripts/inventory-manage.py -r control01_rabbit_mq_container-a3a802ac + +Now you need to re-configure ``openstack_user_config`` similar to how it was done +for MariaDB. The resulting record at this stage for RabbitMQ should look like +this: + + .. code-block:: yaml + + mq_hosts: + infra01: + ip: 172.29.236.21 + control02: + ip: 172.29.236.12 + control03: + ip: 172.29.236.13 + +.. note:: + + Ensure that you don’t have more generic shared-infra_hosts defined. + +Now we need to manually re-generate the inventory and ensure that a new +record was mapped to our infra01: + +.. code-block:: console + + # ./inventory/dynamic_inventory.py + + ... + + # ./scripts/inventory-manage.py -l | grep rabbitmq + + | control02_rabbit_mq_container-51f6cf7c | None | rabbitmq | control02 | None | 172.29.236.82 | None | + | control03_rabbit_mq_container-b30645d9 | None | rabbitmq | control03 | None | 172.29.238.23 | None | + | infra01_rabbit_mq_container-10ec4732 | None | rabbitmq | infra01 | None | 172.29.238.248 | None | + +As you might see from the output above, a record for the new container has +been generated and assigned correctly to the infra01 host. Though this +container has a new IP address, we need to preserve it. So we manually replaced +the new IP with the old one in the inventory file and ensured it’s the proper +one now: + +.. code-block:: console + + # sed -i 's/172.29.238.248/172.29.239.49/g' /etc/openstack_deploy/openstack_inventory.json + #./scripts/inventory-manage.py -l | grep rabbitmq + | control02_rabbit_mq_container-51f6cf7c | None | rabbitmq | control02 | None | 172.29.236.82 | None | + | control03_rabbit_mq_container-b30645d9 | None | rabbitmq | control03 | None | 172.29.238.23 | None | + | infra01_rabbit_mq_container-10ec4732 | None | rabbitmq | infra01 | None | 172.29.239.49 | None | + +* Now you can proceed with container creation: + + .. code-block:: console + + # openstack-ansible playbooks/lxc-containers-create.yml --limit infra01,rabbitmq + +* And install RabbitMQ to the new container and ensure it’s part of the cluster: + + .. code-block:: console + + # openstack-ansible playbooks/rabbitmq-install.yml + +* Once the cluster is re-established, it’s worth to clean-up cluster status + with regards to the old container name still being considered as “Disk Node”, + since the container name has changed: + + .. code-block:: console + + # ansible -m command -a "rabbitmqctl forget_cluster_node rabbit@control01-rabbit-mq-container-a3a802ac" rabbitmq[0] + + .. note:: + + You can take the cluster node name to remove from the output at step two. + +* Repeat the steps above for the rest of the instances. + +.. _scaling-osa-three: + +Option 3: Growing Clusters Horizontally +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This option is by far the least popular despite being very straightforward, as +it has a pretty narrowed use case when it makes sense to scale this way. + + +Though, to preserve quorum you should always have an odd number of cluster +members or be prepared to provide extra configuration if using an even number +of members. + +.. figure:: figures/deploy_three.png + +Adding new members to the MariaDB Galera cluster +------------------------------------------------ + +Horizontal scaling of the MariaDB cluster makes sense only when you’re using +an L7 balancer which can work properly with Galera clusters (like ProxySQL +or MaxScale) instead of default HAProxy and the weak point of the current +cluster is read performance rather than writes. + +Extending the cluster is quite trivial. For that, you need to: + +#. Add another destination host in ``openstack_user_config`` for database_hosts: + + .. code-block:: yaml + + database_hosts: + control01: + ip: 172.29.236.11 + control02: + ip: 172.29.236.12 + control03: + ip: 172.29.236.13 + infra01: + ip: 172.29.236.21 + infra02: + ip: 172.29.236.22 + +#. Create new containers on the destination host: + + .. code-block:: console + + # openstack-ansible playbooks/lxc-containers-create.yml --limit infra01,infra02,galera + +#. Deploy MariaDB there and add it to the cluster: + + .. code-block:: console + + # openstack-ansible playbooks/galera-install.yml + +#. Ensure the cluster is healthy with the following ad-hoc: + + .. code-block:: console + + # ansible -m command -a "mysql -e \"SHOW STATUS WHERE Variable_name IN ('wsrep_local_state_comment', 'wsrep_cluster_size', 'wsrep_incoming_addresses')\"" neutron_galera + +Adding new members to the RabbitMQ cluster +------------------------------------------ + +Growing the RabbitMQ cluster vertically makes sense mostly when you don’t +have HA queues or Quorum queues enabled. + +To add more members to the RabbitMQ cluster execute the following steps: + +#. Add another destination host in ``openstack_user_config`` for mq_hosts: + + .. code-block:: yaml + + mq_hosts: + control01: + ip: 172.29.236.11 + control02: + ip: 172.29.236.12 + control03: + ip: 172.29.236.13 + infra01: + ip: 172.29.236.21 + infra02: + ip: 172.29.236.22 + +#. Create new containers on the destination host: + + .. code-block:: console + + # openstack-ansible playbooks/lxc-containers-create.yml --limit infra01,infra02,rabbitmq + +#. Deploy RabbitMQ on the new host and enroll it to the cluster: + + .. code-block:: console + + # openstack-ansible playbooks/rabbitmq-install.yml + +#. Once a new RabbitMQ container is deployed, you need to make all services aware + of its existence by re-configuring them. For that, you can either run individual + service playbooks, like this: + + .. code-block:: console + + # openstack-ansible playbooks/os--install.yml –tags -config + +Where is a service name, like neutron, nova, cinder, etc. Another +way around would be to fire up setup-openstack.yml but it will take quite some +time to execute. + +.. _scaling-osa-conclusion: + +Conclusion +~~~~~~~~~~ + +As you might see, OpenStack-Ansible is flexible enough to let you scale +a deployment in many different ways. + +But which one is right for you? Well, it all depends on the situation you +find yourself in. + +In case your deployment has grown to a point where RabbitMQ/MariaDB clusters +can’t simply deal with the load these clusters create regardless of the hardware +beneath them – you should use option one (:ref:`scaling-osa-one`) and make +independent clusters per service. + +This option can be also recommended to improve deployment resilience – in case +of cluster failure this will affect just one service rather than each and +everyone in a common deployment use case. Another quite popular variation of +this option can be having just standalone MariaDB/RabbitMQ instances per +service, without any clusterization. The benefit of such a setup is very fast +recovery, especially when talking about RabbitMQ. + +In case you are the owner of quite modest hardware specs for controllers, +you might pay more attention to option two (:ref:`scaling-osa-one`). This way you +can offload your controllers by moving heavy applications, like MariaDB/RabbitMQ, +to some other hardware that can also have relatively modest specs. + +Option three (:ref:`scaling-osa-three`) can be used if your deployment meets the +requirements that were written above (ie. not using HA queues or using ProxySQL +for balancing) and usually should be considered when you’ve outgrown option +one as well.