From 26060a363fcc097734a436cea2adefbf26a04f1c Mon Sep 17 00:00:00 2001 From: Clovis Date: Fri, 11 Nov 2022 16:40:51 +0100 Subject: [PATCH] Release Hot Snowleopard (#58) * Add Akkoma feature detection (#49) Co-authored-by: clovis * [CH] Translation email validation in french (#50) * Add Akkoma feature detection * Change translations in french Co-authored-by: clovis * [FIX] fix hashtag column layout (#51) * Add Akkoma feature detection * Change translations in french * [FIX] fix hashtag column layout Co-authored-by: clovis * [CH] Update the installation instructions (#57) * [CH] Update the installation instructions * Remove falsy instructions * Fix instructions * [CH] Now mention people when repyling (#52) * [CH] Now mention people when repyling * Choose a better approach * Maj version * Fix some translations Co-authored-by: clovis --- README.md | 56 +++++++-- admin-fe.png | Bin 0 -> 47680 bytes admin-fe2.png | Bin 0 -> 24838 bytes app/soapbox/actions/notifications.ts | 4 +- .../features/hashtag_timeline/index.js | 4 +- app/soapbox/locales/fr.json | 78 ++++++------- app/soapbox/normalizers/instance.ts | 4 +- app/soapbox/reducers/compose.ts | 4 +- app/soapbox/utils/features.ts | 106 ++++++++++-------- app/soapbox/utils/quirks.ts | 4 +- package.json | 2 +- 11 files changed, 155 insertions(+), 107 deletions(-) create mode 100644 admin-fe.png create mode 100644 admin-fe2.png diff --git a/README.md b/README.md index 1e7924697..f74cbf972 100644 --- a/README.md +++ b/README.md @@ -6,23 +6,61 @@ **Mangane FE** is a frontend for Pleroma with a focus on custom branding and ease of use. -## :rocket: Deploy on Pleroma +## :rocket: Deploy on Pleroma/Akkoma -Installing Mangane FE on an existing Pleroma server is extremely easy. -Just ssh into the server and download a .zip of the latest build. +Installing Mangane FE on an existing Pleroma server is easy. +Log in your server and follow those instructions depending on your configuration. -Then unpack it into Pleroma's `instance` directory: +### Download -```sh -busybox unzip static.zip -o -d /opt/pleroma/instance +First you need to download mangane on your server. + +#### OTP + +``` +/opt/pleroma/bin/pleroma_ctl frontend install mangane --ref dist --build-url https://github.com/Cl0v1s/mangane-ui/releases/latest/download/static.zip +``` +*Note: The pleroma_ctl path may vary on your system* + +#### Mix / Source + +``` +mix pleroma.frontend install mangane --ref dist --build-url https://github.com/Cl0v1s/mangane-ui/releases/latest/download/static.zip ``` +#### Admin-fe with database configuration enabled + +Just fill the form at Frontend/Available like this. + +![admin-fe](./admin-fe.png) + +### Activation + +Then you need to activate the frontend the it will be available to your users. + +#### Config.exs + +Edit your configuration files to add/edit the `config :pleroma, :frontends` section like this + +``` +config :pleroma, :frontends, + primary: %{ + "name" => "mangane", + "ref" => "dist" + } +``` + +##### Admin-fe with database configuration enabled + +Just fill the form at Frontend/frontends/Primary like this. + +![admin-fe](./admin-fe2.png) + + **That's it!** :tada: **Mangane FE is installed.** The change will take effect immediately, just refresh your browser tab. -It's not necessary to restart the Pleroma service. - -To remove Mangane FE and revert to the default pleroma-fe, simply `rm /opt/pleroma/instance/static/index.html` (you can delete other stuff in there too, but be careful not to delete your own HTML files). +You may need to restart pleroma/akkoma for the change to take effect. ## :elephant: Deploy on Mastodon diff --git a/admin-fe.png b/admin-fe.png new file mode 100644 index 0000000000000000000000000000000000000000..fd87b228566b277bbe00e30f51783d9257c9bdb0 GIT binary patch literal 47680 zcmdSBcT|+y*5-=|QIxPn5D?e}3JL;Blq@AdiIOFQNS2&KfeMI#fP#SJoGDOpMkMD< zk&&DW2}KS)+2{MZ`;YE1?(H7m8TZyWXQM#9^{(~KHP@WK=UMu_kdwTAmFg-U9^Uom z&%_k*@Gi39;hnc4I1k?uh`fCE<%;z)bvryfqWZJ{p9^ClqQ=Af8}GT8sIqg+>bQ%R zGVY{lWBpnkQQddukLT$>5}dcpC`&3$FALX*%8V>a2{&}KQdR39FOWf78kV>zJ(p47 zR4O3b6;mMRwHDC_*-HkdX0DZs`+;u1doqJ25VLc5crjc%i<@voB@|oG(Ft$Q`LI_#UU5n7RY)En zC%-vvZv8YYalt@nz9SO%YpXB$@-_u>tht@b>bfc2QDX>ZLgyf2z9V{WcAoL{G<}Ge z#vfx+^c0^sW@qdxhJxMJQFU#6w{2~-LDrTWZi~wMipG-*bMq7Joh>%j)+RHP8jPWr zN(iN-54R!2r1v?9i0Pk)Z$*&h{gOXy--$;J_`jzz5q`4#7B{EX|oW)Ux zW`Uip4~dO{W5e2z3i`K}v9ZcbJS?%d_y~Wz>tC%8K9Nj!#tL-Fde&BMZZFjfSGl>k z@>osHg@uQEocwC=_xERu6}XC!l9rzIaC7m|nao}=xR7*UG5Ld&iK!%LqoiqV3^yY$ zEQ~(bSyE9*oII%8(THw&&9QYF6-j&F#eMIEh_3FI6gzttKHURY%gF}s$-AGV4XeXj z&YvIocJifdZh>8^f5{&CkxiRlMOD=@c=Y~>RkfR#c!$aJQQmoLwaw`aQ@ z6)c2!lPJZ<-WEzYjTLY*dm|L_^?~=pTi04zGLav{S*xn!jnWilNF}mE+X(bVy_*ZU8fx5fjs?TYAqsBP)l) z3ht(Ivx?Zk&=6LxFk0h7Au$^Z3#ZlE_{tADr}bgll7ftk#XjrjcVftq_KPI1IuQ`U--(bP`_gatkg!%(RtgG1&rI*K{O&Z44f%YZkgtg(oNj&n#qcO85wOuFZB{ATr~MOR!J|QX>JSG*t@}^U|v{m+hxQi%O%_e zYbtRdEc7WJ-p}~x(BA6j3rRQrk9IOzM?b%XG`VO#RAWwMrF$P$k%kcLGO!~_Y2JdF z!d_Om82o|RYs%NcMo|rJ@~y;EvRZ~2uC?;0YwD||Jz z2uRMp)5J{aDF=mSraGRS>{jE(y7$QZi4qaw;^OIDcc`v?aIw?nvJkS_bYhp6cXK;r zQOm2|pBGRaRE_J1)~#|p)}`k4^>MJau{n9&Q7#?P2b;`;2M;>$#IdrmdB9L^`ZMnD zPJ0onm6#2{=CQo^8iP!)`r=}aE!^6WxMc>_sr&?cK9V1JJ$905x^`4xTQvTCz zOG86S>WU7%hu_q~v!pAW0%A7XQ-;|)V>tFr5%q!8k@IMaBTaVQoxy1}imQmMYaeQ= zHx6`9H(j4ldnWfdZ_RgXv#7Ca%MqGUKeoaK6zIkbm)SMJ_io6=o0dQQDB|AV*f@{F z=(xBKeGZJSKAr8uF^BbqGz1*r){cX%YFHjHb8su&BZC^C^vKFeMC7=vEu!yLi6w8a z^^Am(#|ipo+l1?B)!Zc?pV5+aF7)JIhjsf~6!RUZjljEk;o%c}Zfq@MsYyw%hPrF5 zs`eYR^Bxoy79QEJ8A~MhR649zAG5Q6D{<^tRz+)|Hs&yCVP-`K9XretxO0h5dBWJCYF>ef{Mk{7|ll1f`TqbVF9xzK)+#jvoGor=bh`X&;g&8o%jP8|K zmWN)z!#f!z5&v_KlE=O~ac_^#bId>|)b-?7RW~d}bP0A`NV07P9`T6;?r2CN{H7{KX3ky3zAIq%F*}7z_o=zw@ z%5@H+NAt9*92Yui`i?*U`bBR?w((|StT4geo(%alV?ZjEgJDMEAS|0(C&HcOl>Dr4 z=b}#{puG#bZ!j@+`TpU{tth*NkU)u<&!RmSE)zXgvrtt;IlH)CMQppG#KgXlOz$dP z!Q>i#!$xwE+WC_pn@>(95jP}~MG0)Sj3!1L;^m|MyoMW~xqZ90w|5e?UYC`{ti-Z^ zO00b9M%a80+hD?#t8;96`1v>Q>1KIBffQRr*Ehb3{H)%wgvPfLUOilI7UXD*Yns_h zAdfPNK^|pf&RVb5^svhb)}j5{R+wCEHD(%F_PxK5ua(`l=XA!#$H}fXgk@vk58fpBUQ_V+ z6A^1ZBn=G>KH}naAFkQj+1*6GHZqJbdVki2=H9 z4Yjq^rdRXWVL8CB;Z`V-A9He6tK4=^^(k0bvZ3g+94}w{D6h!c=fBV)1#p1{x-#Jl{Q)b^G#*iX3pHMqLL^ zZf*h`9|74I_t~R zz11iI7U{M_;m7c#JwsJI(M)e$%WZ`)lNhCCW;0_hDhl@fmA5CyNtd@H%At7wV`AQG zP76hlCq9&nF1%aE$H%R0EIZgyUBx79Z&_%+IBdTCKKITaQQo@V7%PJ9Y->}yM+T)| zb+z-CB@7a#gjPeQ`#jaOep~|N`ROH_w=t*1va*{v_Qjj(3+K%_5S_)!`p)c14Rc^$vq|yZ!L@bI>x~JPR7W9SP1^Y zC#J1*TpQWj+Y?3|DC@>YM^oRpVRwAs0Hsk7jeuOtV+FPdtFclA#?V+1PaU*siN&bn z-k+&Qj~?ys?;{Whd68qNB2wkjNAnG(6%|9IQvE-Dy8YN%FK~Rk8s!F?wyCM<&dv_3 z%AlYiIceztKflb3jF&}bVJ>W;s@cbX>WI0iI;I-}CS4Y25Mqvwj&I()v9!z$4({6O z5?TNKTaSy%^JISkCPrCB#plC^AUcr=$cUB6LT)=pCx`2{Wm?$-P{UcxwT8_!1qb{2 zMT&S-MncrQOU=^kZjl%4hj0& z_3Jm0546h*Jx@>Ec2;{#xT>qGIgQ$_q0BTZisrG9l9g4-REA+#j;upb_^fprT{00; zj{m#IfQ!m$eL~3k_fOdM8|v!?cZLigb2SCi?e6SY4rC1+;8v_hZK^_z-h#ryYlMUX z4$J+Q>D=}7^=yMFfDzU}C8DCD^5n_S#HYSNxA{2C2Xju2599gl81LWD zG-wK%Cp~}u{8d82y1F`FVmcjF)ncc09muKb1x97%2Ins@`XO{CKFPW$AaV7bPVnAqCqf=)i-6+1c5x zMvK=zT&FJ7ScAs`eSWd!cot^m@^z~1-_>f6sPG<%5|*;l@Y@p*5DXPtXyU@Ugmz&8 z%zTwf4Gav7jg6H^euQ4{O%3q%^$iG+e)8lAd@#Jm$HyV56=|SVvt?yuZVR~UAe(nT3YJt;&Ppu zCnxSQv|qI1kXf;qP%>Tq8rBNNj?8+#4#1PBaxbn`eOBBHcQ0JxZ#n6~ms zer>;OfZWp_*l}IPa5QswXsz8 zz{t>0|A;nYXr^*jxw*+emI|&eGdCgO30f6mWM!UvUf|*UsBoIj-Me>@1jNL|eSkdj zTxtIXBuI9K1m~8Q`Cm7GmW}3#WSfJ9yb$jx3_%Pz2)9uzY1Wwm?RQj!*0 z6;oRBdv!HOH5=zzwUihHPn=3UmB`km<1k(-)wcEPeT$JoQsg4;0D=`}Wh}cwhB36| zwF5@a%sTJs*6uE^Jff|wjng-hO6J|dAX+nxOHo-_x$6RyV8Qf^Cg%e6e*b*uS~an~ zMFVRA%JRm>M!knI0#0l~LRCpg)5MZ5GL=0%JfeB6*jQORT3XbrTpggy#^J-nvT76# z|+1m7wuE-5Tr?ax$_k&&^nvGMSzF3W<^_NB{X(qZ@fLja^I z@JZqenQsqkw^emvnLtl0rxf{WzP4(!Nn3k57r6rb*h{K@qTA;+%e6&@rP8B~F z7Z*Q&`GIPr%+4=Db}|YIcJ=((vs8)6(|!GVw(0|vTw9x)8l~1#Rf^rP;x1gc0GPAN zeyJBWgiNLM!G(v^s$Qw7b1{5&kW5cT%<~{?$wYBwI;;%tE_0jq-hrqs0WdaR?(p=( zwMXbm_x(-YNq43AtAIxt#2DA)|DoG^>-F0IZh{Sa*MA*O`A=H^56jNlyo%~sQ$*)# zEuU38RPnLsqJV(xs9rQ7K1@S!7qX$!C6MU4~$;}!vJ_6Eg@%+F6iGegVo{GuyP$eTph zYHz2x$Dpgr8LOq3uf^u+abO38g16yKnJX>|>UCfuGmSyvZF7>rG^fiep4)4Env4;5 z@5CtFd+>pXQZT_&1R_O@rf(RgZ`De06xIXSuUUtQ!B6g4}`Z8zemPRAQNhKKp!b1f;z z?14bb59Zi8s^S)DBSUOG>O@XVt*q!sNsXu;S~dkkWd(Vl+D@{-y}>O^MFlu|xy#mk zm)kCNU}JjRZDTXX*~LfDTo@Y<05^%|@ua(bdvEkm9J#^Z34pHxKXypb3-5)Xl9_^hZ0xI>@L5m-nC6VECw)>x!lr&3rq-$(( zy>o>L#qYM}tM7U5tp>1ro(dtRwj(XSXhR?CO(JS>L0c=PX1__qhlJBu#(b3LArtRz zU`-_swW?}IX7jy7vvk_3Bg$oUqDnG(K={$-#utVU)Ym?!>7Y>1x#C~{#KUc8=b&A^ z%37vX4MZAnP+N29RE{DD3RcF(yYsrbCB?-j`kG@Wx*oD}a;C#sb5&Vp{+tCk-?irp zA;vY2`#J_37IMdpyY4!y^=3*$Z&9!Tn&(^bp@i-x9Dwq^Z4}9?gF@r=v9h|0tdOdi zp2B)LoNO8lY+Q|jJ_T#zr}fQ1tI2s^yNT#;2tycb`8y^cn%lEXNP)-`hMg1=j!$+SR+7j zL_0gcWgf7ysxYg7NR@UE|7?vvfqUi@DTW$S*y@BObAf$!Zb9?j18))T@DF;qB|R>Y2)_Ry%ut5%0hakY7{A^4vRC0ufVvET~ZrJyr0OE48 zNbi%8&l?7qwHZN`)OK2IKhl36B3sjQ=me9x4#HttHsH4>$g!KEH$qx~382KqM}NMB z&_9zz20itSjor3~u1H??)qi>!V_2*+cMHz3I%yn9UAJ3FtKQ9CFs-; z?5bC7H<=Htz-K-c^d?AJEEf53wtoxxvCK|)wWmr`!}VaP&rhEQ32CQwd@51<#VB8a zF0?RvYkHMBdGTBunHrv%!TsBF=6#Crbfv;LggZ z@nMj*6L#zoRiNAM8vDI_l@-J5>3RToQkz7`TG6Yle^RBp&qWABA zK?(gC6yl%pUO5NU;^+GN!dA*os!xZlI8>Dvfz9(xZBq(pj&^tNPz6HQl-8JsPESd} z4i$msTavFh32i}>@Ab8@vSgB^@8AEd>!R$AT_wcDFR^by1}2udkn6G>eD6G$Sm=rQ z6+AqS`{?2S^aA|(Yyy-6YC_nj{x8*a69NIvmA{H4mYLyNQ7`;742;dk?PqR?zx`ls zx;V%3aTDuB01E8wQ%Ll#&ARWVk$S@pKL*HDsFAoU` zX{0I6&)*cG0yvTprhy(@vJVsnbvAZP_S$X;3z`%}<4&0wVx46xe z4|mqgl}*gTLqhUVhmKV`r%UPaa*-V31YbUX{%*I>33mxYKEp7Kp#xQU%XO|UF3@9? zmzT#0y4W`O-*m$K?G1Fv^z`HyMgfe+9fdM(|Mum}7yVp)>{uDE)dT{|ks;yBY7NXj4qoXm3Qdt!dR zZD$N0FezxaY|Gq#zC8z<VbFW40w!GME;KK#Aq}NU~&bYilb29SwDL zc))D~12`gZNq%T(pPDXepvWBa{rf{ZpZRcTD*U%eM> z1iTg_WMpKs)6)O0_zhdhpw4i*4)457Oxxbv{Ib+qANpLlKNlAl z=;qqFp+|;QRsy;x5RsVd>=o$HZrr}TIy-Ccln2iUrbIM*pfj46{lSAXpyXQR(VZYV z{|k^Hw7ag`i=;F(u@HAqSuVu6Swfhf%}SBETD&moHAiHbjl261toL-eSpGLd-?z87 zVSqc!11yj$urexF#>NykZyK7Ks!LuMa^1FebX3h$hM=Pg zOmp4+Us9mKk?f=-dI+aq-dETltLW&|eYl>ToCRredu^2W;lpm&pW$gx1BnXdPP>;=oY60`fVq_tJbtM-MK*6Q!ye|n|a18D?Q32cDNihAKgd;q-Km}z3V zbLVSVSnOk)SBu?=a1l@sZ!pU2)qOdK=R6C1+@$n*C}X722?P=>5v!r^hhqXYn#4UK!>(B2}FO1)nsnhM(f-r)uny~Gc-_*lkfOjvNyLLMcpJL z%NSV3=z5M}&@(k1hPwmK1XU*m1%(gthx@*5ANLOpG|zbTLtyp(K|!?q_8ChvxD^Z} z9{{01qhvzgf0df6lE@G?Zx%~cym|9xWH{9BopD0cl$7dD=a|E?4kjll$jH83Xr#+h zctVpp2;$tN{B^0+-pNVN+V_{zg5fEtLTOygum97*rJPd1+YSBI1wA3q7! zFR0^T%&K`hu`w}PRfe$JdLH92u%JzgMqmTZQ!i+Ae`mSr%b-j_Nm&LQIVUG)w8YA4 zIR7sA>4+-;!5SMG(F!=i_g8^!XJ%%mEl^@pg93h^X7nHCCBiKa4-W%ThMgIH*cQQF zgE_t}E!_r529`Cztc8Vz^@*yAApHu56-Qv!ENZz>u0yIH0%>}Gf54>7YO=b$T_#YX z02B`q5fPXgkt5o*wKaC#>X`U=T^*fj&r^@SR)EYox;4TgB9nR#Zv{4jc#05%-5!V` zJSqszn&TZ!r6M3)qXouYfz-TQRDg*;-M^@+tbFIro&Ikn_<*|n!M>Di3LF!5amZnx zC^OtwR^+#CJ$76jg5ZNdaB*|%istQt<(WO8YNfPGFyH`yJ|*S# z@c|A}0*pT`em$e2LNODFBo@jL$d90%8h6IH>=Guo!ye#qu#`TKttKDMgC4}kvExq6 zUw+rC1yl#+*I(4sE3>oUO}W!2P;UmHE(Jcd>Ud{VDs|J3DQ*v2v2MmiaQ*r*$Raq` z<3Ce%l0mokgFTO)qE!#~_d6mv7qDgepqq?+*M}fe(9`=3L#h|5Zd%p`Hp!-4zFm8n zZmi6XiJ7@|Tg)w(Rw!4urrLH6HcBbT%>WOtB0w_IQc(EeiZhFqqqu$hjmB_=lU0#M zmE|~pa?ennu1MdtLeOWzL< zxh3`v)u@3PtD^#?QmIG=oM6)+PVk78+ntWt2la^#RSL@W!&}}Ywk|W0lVBotWZYQ& z+7b%FwuQ#lMwG)s=iSJ`dOG2Q4v`b}s;byn?UyeXzZx^b=SCNQ_)w@@s;84o0R-c1 zIjK0U1O=PUf&H3mY;HS%gJJcsXtyn}hCOe&pI4m^@O)@=^wPyb(}|o&l4&r=#-lb2 zL5WM3b4eRa)B+JmE5?T;N+1gClIYQCjglR63|mGfu_#-_<%@+1{QOrD{bo36LUI>p z=gM8|WRz=7QGP*zdCxCt0tI#T$S*cCdmEw9Wy^nZ*9v(BVXKEEb6HeYRXv#*^<1(y z1as_d0i&;4Y*1nyf!oN`bg3yQc5%GISWoXK_>PwOG{DmE)b|<(E4%0J@%A=L1Y5e$ z+k3ApEVNJQqoX{{MYd4Ebj1zFrEXmf0TCC^j3iGK#lHB;{aUI&I?`m-a1Nvv7~xuL z9T;#Ju>-#8)(OrU<>-WgRHgK;>ODmQQaaC+6fq&siPdsR%e95*IFAOdHtF=f26wvX zm=Fye9nvv2lirkcWjQ$vC&z?`vG|iG(cPbSE_)nzbav)i#ZO#FK8!90QyX?{-$2zd zNHOyoF(HkRS&C`K85$ccW?&H*9c)YkHVj1t*h1TH6o#K#EWx~8L2Pbq={nm?EUaK4 z$D$62ZwuQNCM0y%)l~sqJU-a@((?L0DQocZ!fcA5&GarfBC3x|Zh{;fpL6nrG4v)m zdG+S${N=s;;vD2o9~sg znAl5PI9l`YIxQKiHvy65?%p2}=ksF!L1Rs*Z~g7P2NpZPFDR7z`_W6W&jl+i#~02t zuyEMfCQD8!bm`(D?R7lTB%W8jsp2+w3=c5@MQ;$tn*9X(UO2u z-1vO_&MJ3_yxjBgVpJ1NU?T?81hWH9Z?NKmb$i(bAr{dYOXa94%gn+O8lvP)VsYWZ zy76s@wlNW`zo0#ouHGbR)PEyCE)(m3buhzYrLN`q(!vUhx3!%e&T71Tum?PB0psNz zg%2XyjAi0S%8PWtoCL9UspxtP@2)ta-dNXtAE@t@^e!%|37NC#-rxMC1``uRE3g4> z-`j#@lO^(bGyTndsuk89e(}s73kr>kPN2q((+OQL}#3UnqrdWPq6CXnTUo>BLYMvh|8T(li3`R(EU~w9LT6?Dg>0TZrM~mv z!7N9l3>2C)tXx!RlBCubh87l8uZBmNSjt(Z*I7T2MXTa_evDa&T}(k;@7N|%D^>FMi}M@o4Z!m}*lIYh1| zNzs?**x&I#5b)0CHrbih`;V#pAu9F6R-;_!w5H2{tXkWBMk0-5T1(NtR?lQ<97!-W z{;SP|D^4Kd&GNUH5N7W`JC^H zf2JhkFBWdd3wes3NoIc|>OVI5qBW}K!7ZE`SMxbCQbj{!1e{@>D}$gbVGlOay?lv$ zeH}6~GMd}EoZ$Gy)SS8y&G5*GhNdPoq!yrPEc=mq;S&uV_jRpT?~1;7G1`BIiUFpU zVe;r4*Lqz>cWB_$ji8{QS#0b;o>lyXnv?Lzu%h2{m>89;Xcrf7R@_NJnTt%8%e~jJ z(y_xqn>C?pcyf!JoF9mIdDk775-gn)?9(u|v*RPp&1_PsirE7nd>x!o8%f})1JB=p z$#7br=W7fbzjowOCbrzAw1N;3qSQr*nD0dWkleL2U0O<)XZqkkpnWvL0%r%(jL^sK z$p^USHMRrlsZl%*QfG%i=`$*gEiH%W5egu(0iBSY?YkP34 zj8wFhf{{j0baGbBV%mFqZR=<1ZilrdH^~to8b5hVw`>@^v9OSjmxDgGOHfFEvAcFR zt4y7fxX+7a*VQRJG;|Z4>gkdr$*V~nU3ugVyOM(Zr*8sogH`hH!3TZ!?m#7|W?Gf@ z!$8^x3a!+ z|6f+O?B{td-x7R$)pT@D*e`p)@rtn|AI#G*aMMFzb^Xss5<<^dNs5^sT+u)x1oVQHj*GuTairi71C|`fa1J zvH9Bcs)>c+uzkgU9%s8z2siX^IqXJd(vu_(peDO|eywCu*yE^_gr1Mj#fTfMP%mpd zP|*F8Oas~i1ZegX3v8^|dJ6JbuSSXGSm{Q3yocG(?@j^0J68+3s0=ecr~}^y(CIa- zhD81{&#O|Mam%U3%>;{B{`~IXsZQJogwNs6Z_z6t`2Qvb8w}&r;^JP9BpqtIM=~2+ zU;yj%^`~|xJtu$nK<`9!`|)@CB}IT*%PW&^>s7!`57~B3O-G9@l$F2!gHy(xCN0Kl zS7ut6;z7(NMZOu%p95SeTb>7vcQ7?C+k*!=2d#%=>s8e`r_Yq!3!saCbB5lJ_`vb( z=H}Ly@8$IrjAU@^iCPelW~2-w^zvChssR>&U1>^XFb&LG06K3V!AA$+Wh^@qTy9i> zP^q6fNWkpL5}Flhr1u@`A0B3kWe)&j9(<|Zbvz-B)>Sn$OhsO4D{n*$?XG_3ofl&V4?b#+ear)x6*lo+Nx6jq+$me+KBLQaId%mopPDRtr*%t8C!12Soch`n~%mBA}_wF5V91g>41u%E4n#ItMKNb*hTJB%^ zB2v0U{3w?Q_fP01EavV8Kg$=}?nLM@3}~m;uRjb(&lblZh8ThEO^A z?L{oJVFhdtAfLS8h8WJP%FP=bHZb)$nkCps zDg2;y+0Fyj-0#K3QoY*u2??;10rG8TJ1rju!`i2H@kN2^t=9s|hf_wmy zLpACUX7ls_Q&YX!%96IKKhXyMK$s99Cw%sc-5Q6gd3S)xVlbHPW?vAuoUmF@4`*Yv zRtNwbIojDp3%NPsu4oMGvUoofueiygdJWVAMn*85L1hDR@c8j#XAo+<@UI^LIO5>s z>=<7^$=_L@q@$q`0=JtRjrglqNdVw{={z0-Y5(@^8-)GxqCNts2duZ?0|TOb1p%Hm zt*W*k22Bz{w=)$pL1U8joYbWQ;05Fu1Uigak)NL*C@QMVVF0wjG{$E;`!Q42-X8pr zXaJM-emB5H{3Sl#6F4@^IX*uA$mnP=6}J@Zr4^27$WWm96c+aP^=%#RPUda2OW^Em z&z2Jbg5Pn~M2Z9A8YCCEIF53Pcz9?CqFpla#rEnjRG3g8r>CU>VSabv^2qS84>&Y^ zeKE&+&%rmXr&5%xB(V`Df1_&b3sy z#R|G`(9 zwp;Jv*YNQ2ii&7qNF4wQz)q4b+^~0W5Je6Ls$>X(=}O7VLuUL@CX0J6fbW$EVY&Ub zl;l@O2P+s9g$2Nl0LDxLebQAbg8-zZ1+t`DpH!I^c6r(L zaL1xA))!KuVsekSk53>aXWF1-mHFDr^0Ha37y&7~C@7%Fi2MBc#Y}iJAnUH$V!-y> zWd8d(JCOP;avN+t`#Z%uRN{! zrhV{UP7aQLv29qVzP^(1sYJAb&U39dW93Q=nuuWC!(Inq8u&Yu1CcVSu#>}UrDtGd z7wbw-Pw%lerbpP(^aZq-ao8 zb469`h3Hr|z2zm!_p7P-PJh4q{Q2mllt(s{grs(8XUk*X)#VN-omCYJjl0;gHrUYM zh{TYh3p`3#@9FaKa4d2HEI8l4e`i$yaCDCpME}Cjygc?m2{?4XXE%Q>v}Ls?xhdqX zw1%sGc4Xvmwpt#X0KbAjCR#7`rcUPx3JF2xWIy42`0&r_@R|B`^Quojbs<@OH>lVk zxv;+c{sdbBB4keCf$%$Tie<|!GO<}hjgf|?e+dWn9kdc3M?!vDA;v! zl9D)}P=)Bu)hL2~7|st>?@qXdgn`}`%kSXdwGa&YpQF~W9tvt_{J8uJXQNnj z)`(ihKj2?B%ZlZ_67}rPa^=Xm6STAJk(&5T3H%4z)Oe=iga4NbHzr4I0PCj2-E1JvJd9~5Z#AMHTLlK2KUUzb5;d`L6y65*j zx@Iy;z<3^xwA~RowdtBjzv9O!9K%1<6>;zygN+BJha=!a;2yYbp12TZDP^B#AX=Id?3N(3rEyr(jadU%v-gD?!Nx|mF`%QcP zDox(Y0-DjCgwNsZ($yAlsQvh{QR^ick*Bp%*;4fSFesK3Nc{0q@hDbEgigdp5vvCO ztVO|m`@+_Kp32ldVFZt5xE#l%`c)%3{;{Tjh{gsXR4A2Br8A#-=MkJd3A(z}QRRgI zoY)b?SpzF{i_vE7pd)Ya&0@yLD}!~9>gDX9EZHBtR^BPe#&o}HAf)Xdf?hJ9o1=By z&>A~w;jliS^f$>JCK06CUrC+BBU z2)=b34#y-f?hbe4vPHpqy1KRQh$UyIe~wIiIK4eAAAydkvEG1n2}DdIwsos;TU%sR zz1)2+hi{8c(7C^Hh*roW-?AhEx6dm- z+2HBjiA{g=d{|T4sueq|QIH@wvC!f!?W#mswcW_dcNRGtIx znJDvlnw-CD^j3=32@r7XBuqu+_`qd%X>B;jwUvdrcx`BSY;1L`?mm-1Nfv`E8NtQ( zv&Q$mKVyS}taLO52z-)0_8D6>O{gd+P;y!S+_MqoqFO6BMbB?Ii(rSP3G{!wyuoxa z{;J4Rf=F&-VZ?0Rl9KPWomft*sae07nK(u=iU<>vj9@~d<%Jp90Td8#fvlhwoJ!dh@OUFb=kGxPizQ8%T`z2{u~P?SEpj4yL+f0J-aG)4gGBhJ^6;- zdv#)~;9d1eVJ6*?<8N!lO-^Jpj+*xhLX+pX=lJiM-{OlcO7PDpsD_6Z7eBM+AOUkz=yiJHL3J^#rRaB_Z6_}B0ck}=QayU4Ek zgol%Jio^`22HZrzx-5lw75C+oS*!(Cf?OyjeS^D z*cufb9U7ndiHbXE&8~iCBZ!u;qq+GtW`L54>KYx7Sfxzy`VcVemW8dEc*brME*m!n zZ%9fs0ydj1q0VqDq1M9-4&)E?D;swleJ1$}buyhSDbLKzQdm?ZG&as8N07z={mm-t zq^0i85)-L$CoG1j=tw`zW5gXkzPp=R_WJsy0S%kWqXK)!PoUBprqr$QFgW#?V354{ z!V`OJSo5KrpL;x*f<0Dft4DkQs`qyj`pyvqG zTXlbXluUrQem&5Z38UyjUw~H7&``>!jwmZrx3Ou-{KyH}3Wx>heh4MTrInQ%$hg#$ zI6i9VLfZ8*G+usV-!qZZaQ(1~MKXU_FkNCo)5cE#oPH!wVEu}BG&ev0+RPE@dKD&~_y(J2uVFmD*?5H*l#bHBtKa*}Z$zPMAe;B%`PydElTaqv-`0=gJvVOp zwpr*t>rzzAoVjke__>xra<3#Wii#0!PQ+dHGtrDc@OID>E1kzeLBr zZ!+;l9suSFfQ(7cKZ`3k^E*vd&il)ohSE6|j?bl}PBzj}^F~Gx`CWaz49Q6pY~PH> zi=?$tC?g|sl|9(WXpVDQ!;g};fRLc+pi3HT_(&DfSH-(8}NgyMF>Q^fE~Z!a^0cS@?UiK&@}(^~HipP8j44}8)tT~I?`1hAN22Jw*m_68B<9Ck_YQOpk#l)DI zn+L}}hEiUvDAzIcO|JK6bBq<6?tvfp{+@In9p{c`U26=H7ar^x^b7DTpQ+G}=FR2g zI?}A6x`g27<_@G30&o=5WX|t7)f?=#WBGFTW}rlc^@gpSBQ`%Zz(Ktn>Jt?ePp!kf zsiyc@x!lyv{92`dmMled$BEHOkjHT)lk6=?0zY9-8z{jB(dr!wTf0Yvy!ZYH(OKm& zdMH_1(gsS&>11J*6c9F7e`TiprTV_}u7jO}%ZVU*ZH8!vS}ZmNytaLHRhXg`*dk%> zM`Y6Mh?xKpv8k#~vjp+;kHCQz$gutKZ+Ha2R$QefzuaYfKhwx4t+7!8oW0>9 zDk>MaL?8cM2XXD2$SYfB*)L|Mq2#F}KDGJ+%3VBCD6MDwX)SMCS{fORwiYxtF}Q)F zM&AB&vL_)XKmdqFUe>(_c1c~@Dk?vwI!cbRJhPu3FuG&*cVK}`UjEP=E73TquebU0 z=PYOYTA8D@fK)ViR(y`uqB3nBvn6cB4f44Sd`uds^8C9>%5(nwbX&u%@x39pXL`*0 zca!+4K4A8^ev;n8#6&vz$NZmp^jN5HjrzWQL*lUTmOP)o4Y){H>Xj?f8!n|H!cGw{ zU)qit^4Wj;3Qq<&2Z>7?8;2%^KJ|b9zP$XkyL(xtJz~U=Ca?@ zUuviv1p!_$FY8=E*0~s=yLXh7?px`JM(MVR@d-!bc|hzWT7*e&hAxie?f z)Wi8K$B(I~96cPMx4BtWUE@|^2gkZ^k>`6qe(Y&zWj6Yf*deq$K5+^4Ra=|xj~_h5 zk|3hW>kzyuQd80`&CGy9*au%62ngJ(F^oh0wvxzjcnK(%1|fRCTw=7C+@w6|>hk1_1qc;RO6Jxsr0@TGdXceux* zz&>lHztKxFAtEyJ86Dr?`1^@;1=^n#d+e{p=8leyt&*OgM(W_G^|wQ;ge#CgCU(|A zSe#^|(YX_P2^+tZ)RZIQ@+3;34*Au6-_+KN`>YFG!-Ik%UaVVW^~bhH zL_NR7*(@)uuOA~=Ysr}EbtDP2uemwJeGGKdWn4O?e>%6+mTezE{kpVpPhCZY*#m$I z{(0BKWU{-n+lQM=_F+Ci^5eW&6@`iE>GEz@uFzbK=h-Fh{kWWtAu+7sPWG|rr$@!F zKl87-)zR7YwrT7d$jWcd1RL+)uV?$C32Bbl7q z99!8*f(Oiu2AS?sBb%csaVbQV&K9FHEoopM5Jzl^?q zMb_KVg|W}CdP@KPbz-}OwUm>WH#<*TIPWE*@Akg0wIL}yDlPZH;hKLfaKrs=FA|?T zq3XO;6f9t~k73w&cZ9P*xuNX)rU?A|k^0;Ok4J;}H>9_SnUK{J3Cen+LiQQ~yKO0ugD+ z_sf0o)-&b7?Z=qx zvV%LU?Z=dLb$>K9u|}-#B&KH)Pc4#M0w1%7u;URiGox+pm8@qu8|t}FdAy8@s^hday#p~t?EJi&2_emD>;B9;FSsApvWnt+u0Dtg5^LHp%JdVkt{B z{j9euRjx0x+)S31*c6??Cc$Rw1S0R`qQY5#4jyC=IiqCvkuXda3(EP4DX6%(lp^g) zFD^bKz^!SZ(7vl zps2`tY_oJ(9ozO8r@hpRlKws0WJY6m(>`;ua7A6OmagZ#`H@-NyTD%m&j?@dtoMcP zd_u*;-cM@uJqdL6n$xVYvt^+p;2!pP>v@x;GQ&s%(?so3R+J_I~p2ks$q!X!q8AlT83YMj{W zK*{kMCRLgF%0n4BK&;A~WGjl&ZsJU=G5`&Vyq$OlX^Ms2vD>#9_qYemkH}K(e~RzK zdV=Dw$q~(PbsY^z6JD(=G-iw*9UAtbYu`2SaSt9`7^e@Vo5<1#7C0v-m$>$uJmNQ7 zO;@qGt83X%{;U=QRr^RG}I5bwVWiKB;SOTic0U#%WGgWF$Eq< zIJ^?-pz)B#)XtRkWnfP)2M(A$N>^P&Bhg`6!Sg8y7Mz<7kB!Qio)*(B*G}FY!KOM8 zM)K%b;_0T!x3z6QF7U9YrG9N_5Pd~C*jjLyp_;IA1HtZ~r>ybK#k>?14T7G5l~0Lt zqp3>r4XGR?nw*Q%O|8c1`pd14Hbo;(oJcY@MrXTnX0Kb0$t}6oNNO5#ab;!Yt^F^n z;&!~*q+tKG5heLavN0yPwJqn;Nm7RDj*hqS@i{+h>ajV@9bW}RvOF!u%AHw=(!$9} z^3m2g@z1|l?w>EXeZbE*HO-t()QRKoJin6c_&jI7g}I4ItS4-Ku3z6A-4z-b$hvwb z`O!etbf5FRk?FEOzP?cvwTW*;!<{L9eExh+fIAbPRbH-lUttii7-E$y`t7;X{RGz4 zbYI^uoBgEN1kjA56}5S%t|*Xd-xgi6T;5+4#dg6Vi#w)q%XB6atJ&CiIDo#E;#lb^ z4`QN%mQlNP4{oJjk?Y9A$zCN!DJ0Wjk;^Fzhzisww2En+Sp>MnKzJQYV%N{m{WBY5%edeTbrzTLaI-FgXuHHMB`s}|cBs%yI^@IHw{cY|r=9EAI@YouKG_9ZnH zy&h#n{(`(OM~-YQ#Y)peL=oMXl`4Y%FmZ{>3|Oz+XlZF#ciH<|)Rmu;6C~ov(d;JT zmabJ;RCGK_H#|oFGKu42>g;$c|DyTfgD2O7IX7S!iXIf(Sx$dH0^6!Z9uw8wWS0AL z77wGPnTp+hEytg}l;%$K|K$tE*9PyeL>LFqmanhhbYGbwNlHdW zx$RhHZ5rMuEiF^bX2C(}{(V_lGZT%%nb_?u2g*}wuh9v+NQn4O8CZjl9ExDYG*f4> zTdV61MPA;cM+4dR(@Ie;l6TrdSmp*ZnF@mVxeo0<8e9^UbkWX!^0z_7$cSrQqcWgW z)Zu=FzqRuQ+U1=~OkA(YY-TpAy0h)6xLzfvq*MaPcPa0oy?yPPu|stPs`A2>WMGjr zJ!SRfD%q`14zglGSlh zJ{b8LteqS8_==o9(!8HSCXa?#wr{W6x#{xQXR_c6&;5^uppJg(E2=f(A#@a#B}b)s zIcH9FSB%^%8Z3CAK)sBf?%~7qmon-N8=^1#XlwH%i%&{%-1sy@p3Jy=M>+bMA6Mt! zzBaX+EJnN^_nrBX>_azA(0wB>ef{;N+mS1cqOQXA>}(1#K4umcFqdlWCs5nPh64XK z(Q~T|H*XW*Y!)&gSvO{8=!S+6suQ@PbVy<$4^H=N;yku?15IAm=iy*kh(Kb-p>sxol*-~!qR zk*7Kjm2oEi?)`9?u+hcMtyAiPpN@~8K-Y63LznVv47;U;l2cw^})y&a%Sm^Xk8j0t&=*kH#e%Dt~vA*#E0JE>3 zT)9rJ9(2^*X_;Q7`cFd4GL%htyS^(@#rO-`pI$f?g#tpO_v9qA{Tbh@%1TPB4g*pw z3a^W8S0lsT+%fq1vPaB%Cy(mQl;zzj0arQJ7LKyXnVSB04;O-Xxz3_vbwsY%%>KB$ zXlsXar^-~J^m}jE8LTpp+@9W_7#BA%)q3}P^}a#!=vT!fzlVkFW)w)2Zr*%fPypvG z>oKbba{oMIyo!gHbFznp2rEI73EEmO14yVhXPa+}d$;g^|CDszD9c*zpQo+KB+pn* zY+t~|`R>P6hYlS==6U7u?Uc-%oCkjw#^gz4=Ikl=OD!oL4=<hN7qq)C?;UMMFdz0}<^})tnN2(_TD#KAGYe$;xj|%prkbI~(?w2&**U>yEHf3RHRH7m5 z8cBAXqPK_R93Nk_fb~PU3i3@w7W=+_@|Jm3Ykz50-|~Ced3nz&4K(bha>o5aot&Jk zFFXp9=4&T}*)y!zGk7Ze2`eDq=3s6TFR;SE_Gs(ft93)?s5SyE(GmS8eY#4c_4$OQTOAx$I0mI-#nX9psOne5km|8Kt6B z!{5|CRx0z8g>-wDPkVJ{YQ``A*%!3L{`}?IAKz64n%b4rRi;X1{#zG*@Bitc;XVJ; zJ^OPnXo-LIp(H-CclJ!eL@uuoTd;j44VQoWBDc0v6D3;3#9#PdkOCe(1fRHfy`uX) zbRa|EAeK1JzcH#SEW9|LX5R$${6kQK_>-w=Xh0_E%YOlSl+eS;*pJ%ThS$*XLDm5g zuh69r{7S-9mNB(zV8wDlY;RY4gk%@Wcp`gHkjZoDEGMUKw&BwwJ536}@FdbD8_s%q zdBq6XXZSw_j=Tzu{&(?LM13m+twSuJ3&HxqJS86t$f@pv3bj06_DQlqN0+NJ-^!Q2 zC&|qlb7FbNCy0HE#e);67cubwOk{-Hepx%?N` z6%^hyo2X8ohra>jd8A%Hjx*GyzJ1$KLD+(Op%z=L16P-5z*Lk|8p?RE*q}vDucq#M z!lL*ZWUcEFJj0d>c~ja_EKda-{}}Du>7GxlK@RQP$3R=4P($&Mqi$Buo-V1h!PWYX zq*irG$lpDC=(+V$V_!n@9}`2*z$7ZV3BsAa%iQio#|IA{NL~B>{VxT5aNiA0O;g*J zh{5=ez;Q%e-GdT76&5Zrc?=C1Mei4}GP}cnS8rmZ@O04VY^A<_nae;+6(6HWYxmtp zTi!}jBySS#jEjk%E%}mvm2F3p8#b%!XH>?kU_h+2(}KSwE^cFn4#DZ5ng$ zN35xf3{lHl3d@h&y9gEl$hKtP;e0S2qTnklizB;s?dg*pz9aEd^Bv_W1-?}SqvPYs zMdz=f0+u*!cB?#^x@*9$+vV!jtJp6`Y8chK3!W?N&x9Rk=1sk;SKYf@1kIvxt65cl zy*M~yH=-n)JYAWXD57Y0-_DuPBT-WW9ynh67=Q=b3hKK2G|26wrSR!lWG5r3_DU46 z6#AUc!2pOFJI`>=Uvhl$38$QjWv5VzT2rILF{z zrKO~xgqE!#O!r*6KLnQ5bANxZj3g~B)8Qg3E$t0ztLiGW>iuQTFc)iUX|V-o9VD>e zez*As0Z`pq&IQyGpJEW-pfv+Y9sFUO5*n{EGCs)1K>K12-~wj~pJr`k)d$akC%X@* zz0;Vh*xFG1BYboEd&n{P?#};~C-s82&50vN;^X3wcQP_E{`&O`B{WFDmmvE_yA);x zD=Q8Z6rnF(978u4tTQ}aGacFPRRb<_uoxk1puTNO8;8rc1!FbAdA^ZWUOK+QqghZ{GZ_3t_>8 zotM|&WM*boREYUYhD7g1JFb&C@YSn#$;l&AQ?z7cmq~(ze(7)tz}u3K? z2^=jbk1rx4i4>sG<^-_d^Rn%dAa|9N{Ij}FPgtLWMQTtt9q7v=XcyDaupisMvAzxy z!4xHMl%@Pn5Uqc+!1PpPJ`(WT zDI;u^7Z?8xWVq^in4Y+TaZ};Tp_Bkaj$0skB9a7Cz@{Xm;SLzo=TDvb3F10>RbXs_ z`^V-lDJLt72jkt_w@4BY2(t?cSUf&+rA0=bxc^HB)&aQlH3R7&FMb92FTZ2Iwo296C551Ez?GT+aHQqV77yma<)r9qZ?r(YO{^J@H07h9(ADh7{d z)O?@Plh@Mwt(neL|1in>^9SZJRCVczoOl}J6B5kL&C5zlVU+;L1p#PMl10Xh0jotW zqaOwfz5$Fd2f=!RB*J{mfgJ07ar`FgBAcPl@IHYJHn)xYyYv(=G1>Vn%h@)2&aRzP676hCG7K zOBSZ4De37`aN|H^RZrJ?4@)Pu8WD%t*vF46;V-2~5!OT1@bbKSURs%5D&cDW-dGNx z{b7?U@C`Y;$;Qh1xwlt@mDL0tbdSJi&kn-H7;F9+oroZ~lAQ<^##W|#4}LRe2o@bjpowBr!l*S~6FZ*-eC1RBYinTw9zdz^W#qJ?fAe%##7&01hZ z3{*9MLJAB}|L4!oct}V|jSLOFgC*JGcq_V`V5ts%M6f|(M1A4TbxdlAjO@A_n zhnUdt@eygIVJ}_~Zyl)ME%71yCFj@zQ*};}-MjcIhOp`Q_2qfQK)z^&#)gJaj?APa z=1X?s($E6o82Dk)jwg?XMvkNicNN+NDmeZ+EskUVg%O%`8+0odjlaCW};lML#9&#ch|i^pVt zMgNyCW;hraFkxAR?jMt1DpRIrdsf?=EeB!ji> zd62d*H(Y9_yw5t=i{$A?q=%X1f6Z3^4C8H*ULP_yO-T66Wz@OIzI^d?NyD3@Bwgr} zpqU}+m$1nntM07ty&ybUoqJd2$sIVHe*E~Sk^R)^xxphOD-BP6XSP|k+{(7${$)=`4}19$&|IUzKqPL+|63E>Uv@#Q(eZd;I-4=GnU#qK~~P|htp4a_&FG_hXE2Zfsh`MK5q4& zRTsK|@W@En!&5WP=bqOieWy@pv7gxnpI;CAwxB`XouJ2)7238~hy}83bj8 zUTepd*;}ycLW+eL>9Ox9Hhd(wBn-$XAiRN<2nZ}Y9;4|bqs9lHacr+Ri??ZM*lQjX z>7*DO%iPiV<>-+k7#aZbI}QwHUD{K@L%)6{Bq!GzX2V=3cH{hCs zlB_Po;4F4g=w6I@B2Xe>^~0gPt+_cH^xoxV0@R&pxgUmY@YV>Xcq0S>N&gefqN^b% zu(HoWZ|8nk^xU~~$U*~4F6HF`sL%5xrDbas?&>J^{QH#POAKL3Oali1D*ltSD9W1fR2 zc%|j!(vaQbZxmk(2eJM7{kskIf|+(!UY^C-gg|)9GeQdn3;uHvUzHLh>-q{TC_?H^ z3Rt~DK!wI6Gjj%~Sd4qn(IFijkK|6~b(=J}sF1xNSb)if7dF0@s>8UBwt^xTFTQlL zjY~3Swt8imSpiPraD6zmnb*(!sIT`c9*+NDKINR$>>Wn=Bis2fI1GOuAhjrXJq>p5 z)hfDg8FfDU(m6W$F~a~+JQDBu{ym>pl~Pu-(h!%?S(^aH9PPg-i=l?ac#QbW%&k7> znX@D|EiaeXcS=%FQHVM&+^cPCP^1%M^5C6wsJV8{sYPV_2^{hC>#`J|PqiXTOJkYf zbdwyv_?erJS#!LS8u$`632c6!qhCP~ix*03HMKC*sFzQ%va{EJ{W{r}PIL3F_UHVm z{CBSRb5*lWuWxKjO-^cXsKMh2U_5w))d}??MxW_|ht&GQ%2@gAKy))32RRkh$zc6n zXwhJ(sH*NAR%+!uVS$ETlbcNpMNk^V9W9O(g==o`CyiMQ&e`}k`0dJAO=^9$iV3;F7B3{-Fwvt*jFVcC84T95&R`R z5f>j$?!-)dh||IsYt*3wvJH?dIF-ns$^|Ijyvdx=1NY3&pQTxkVcv(281MP>s5e_G zJHCAJ)e^FKaDgkFhMfG0ovFz`B()Hf+7zGF^lsiX29@OyF<6g|vcA@wOJ_nwH9q$m zwj+46@!}H<67a07AI`V!jg(AK>fMQjtjQ6!5}b>pSovP^L^C#{->+mJxp+0ZmKjGX zcg~8c#*)Tc1B$$sQ`(lggQv934i9pw;^OJ}IPl~C)Kq~sqHOT$Sh0SB<$J5EB_0X|UuVEfiLSnEkQyX&ZodQzj7I9%1zz4`0t#jfO=AlX6NBr8 zJ`3uY{1$=_Om*ZB-H-#(h$weKjuY_wIX_Zj5|UAPl*!f0_FU}NBcM@0q~txOvXUG$<51 z6>9eXcZ;-|hQlsS;?Ga!N{WpCFyuWH6g9u*j_C`XnliJF zJ_J0m`;_zZdc*9=si~ToYJm0>F^pd*f8V=^gjO5!T~Mb;7=o=2z9=4Lmg`9Z4)Ylj zyd;^=@cd($mN|WFKh8Mu8x3kDeF!A(G@Ou^Z@|z-2FB2EcmrgX0>RjcC&JGCzFQc_%KH+SesIOwhTs@7S!@3;cb)z}xTw{0l8gM@pYG{#=9zL8* z7mZ0eKEA%Gc+^r-P}|Hx1soVWx9T!35m-EMIiVQ=W)VS`pUZJKJW_DMkQC9JIDtYJ zIj?c!;cAuedb}%=X{>c(QT_a6k;9y!_8W5?w5jQFI=XMeHu~i*jwrv}HvXPvRji3c z;%sj24EP9l6l_4q=|!EFu3I^x=*Qmg_4Fws1r}AE|M+{g$AfLx;!cd4TgnGtJgH!0 z1haUIC3)uK6XddyhV>EoHaxt2ref=LP*CNtO(u-`Fr28;gWF?|F(861qEc}H6KJ}>X>^P}Q%v+#c8kk562N75Air@CbRk+v$Miy z5#(VN6LSfX9$Q=FiPc*as?s~#&dPg)x|$GqeF>ee-m%2sp3yGwI1H$iO?<92oICh zk7e*ET$)_`xk-!gKvE}7aAVN=d#Tvd6IzD+AzF&FfO4?ZAiDu$&3Snmu?gha%tae< zv?;aB^(%b~-8P)AT-okbweP?IAXdR&y@u&{j1J4#uv^#by&$u}T|`=8bMaME(+!Ab z0nLefqqK#I0>*E#Eq{6Ogfo6hXjK6tZ?{cRq1F+3A%m_N>alL>(YL|_; z{u@9)AVS8|r{Qf1JtW)WA9fiW>Xj>30QBLH79mVIco0s*!A|O-I>_3}9p(n1Do#yE z__0(l>BmSf^w0u`=|GiNr$s(62fSgD;4G{leq+VPxGq5;tZ86iAR|);9RJR@S2C_R zFSlrL@T@--&G~F>_3(p%Qo_CClB+AYu`;+GvFCe^wsD*)BcY#C>4)UN*5SNBe zBv1h~H`tEtPiYr;uPWBs{t%TG{7Vk(+jq(F&k&T#Cr_S)wJ^*9iK0&aPiLw8YP7Np zu9%pxdQ~0gGkbw;x255DT}plWEf`#2O`;G5jTYW2>=d@YWAY9IFE5fP5rN#NpHs)8JlQX&+(xlRTY(a*j?~Me8r@v8;!dzP#?r{zy@Eme1U@4 z**kaZBMOAK-yDESp&9|QoKr75o}H!^CGu1Q~)8MaKQc^Nm)}zUb z^7WO-%*WNY4}$KJ_=5qWt)Y>xdXaWma(E{*(oI&VCjgp&8&*JqViJyq;4AP<#hb@hKlHYnhrar^eKjG2NX z;(71wcDR3%p#W^@YwZV9k}>on+AGkCMiW6l&7RUU&a$Gd%i8oBYL!vgA+$6AK^l?! z_O$1!BrcTkKaY|fw=A;tdswA=kzAalr5$OAl5)kKdz^xTdHFH@T)FggiP^EQzq_x5 zlzrZ{ZI%*N4){&LZ|p*W1)w7e0-qi4hPD7xl8Pa%<`=cyMaz2j>=-QNV+eg`b*(mc z!#5)iX=C(-G9eG~0bthHN#0tR0ZzrLnV;j+^ZR!$!0hbk2N~7e{!sy$1|q9wLiW6<3Nk`rqfhddcU08 zN`QtF5SZXKS*u~7Tj)72ip`lkf$DjiHKY`9#y;12WdhGB7R**5xz%-S0jNdk z>FJGYPx~t*Z^5?}9lQaXA{iMOY*jXJlYV$(%K#Uc=v%|Z1r!rMSDM`=mX!A1--u3} zq!}UJ43gTobXpk z2ktxw`v>rhpWq4tKj)KACqM#r)re$J$NlN^ADd=<;?W!60^EA05HSbK)1!bwevoeEo;wZFp6!a68S1$Nv;z!SBp^ z-c$eI%DKPXhY=FmMR$yi;fJse-q$&t2Pb(fxB-33+}A+$Lyu5CK zRW$q!U?GJ}s6Aa<0N%^^oZ3&Hj)=oZQVr<=T(W?~p3RVd8W$WMJ`cu-%|s_VH}|r* zZHrg#?~L`qw92a+hbQ~ndwPUjKb_pUvue3kQQ{x9JS_>4`ylML-T^2Hxfcf|J7E3B zMi7BT5dy$)h3^QUT=bDpexa2MHo1HQnm?GDsIRa8_%iCMp*BavOPD9YONE9e3gr?T zX>3Z0>10PXYNQ4Q^#Z+v zo@@+5raiasQmHdCf}NA5t#~3jEGE4Bn=$cGh$SQD>{6(Uv$N0hy~D)ui3zmP06SFE zN4|UsQ8BQ5(72FVU-Ww7CFmi33ysmokGC%-2L&mCGp%}@EjtdlA`Vtu8n_3;P{~aB zQ9@E$8d46qn#-<+u!eDX`0~1?S!~?nsOZp$sQKE&Rr&S5#ey}zh=hu~!$i*k^r3L6 zVm){7sC;^W3QpMI?jl8d>(vZzD(ZuKLh3ATKSiHfTe~DR)mQc$z>jMEeW=1>-@cVz zXMjgBQ5R0>S7UGvCf)GN5GT2n+X*~Nl^MmUD*tKCD3?63P0$7AC#NV@U@hW#2p`^L zMTBqY(67Vdke8Jmymt{fs{`PDWT*iFityZl0|kC0A>o01+q|qh6~^cI6+n5;$bpEE z|8@5|42rlD78*L|Pzs>D{y8e>|0vN1i3;!=yx~wT;9bF@w77lHN~AZ2nMF-qom@OM zl`Vi?q@_jNJ_kt&p7s1jA|>U~F;J0A4r5p;Hq;mq=ls&r9#|U=e0<7#g7bgyD$z^( z_CGk0%z`H35r}HW*vQDDzr3ux+zkT(4tl<_eE2`-S7HoC<1Hz`g@M``WNV1`wZ}E=j+ewg))Jby_Olt%ii%>e3_>RfhGMv$_p698 zezO;``ll{R8^vfrw1$$>(?twEY=c?Nw1ZV-r92lV#)QopFuAOD zHuki{hK$z|Lvy9&Plm(z!$$-GUCLaQwRpz=OQRI(FQnW0QXAFN&$6>8c$)G?zJC20 zJXfEiPmtRmduGSOvEH>91tWk_B11MyH9ND-ij{+-E8Ef!5UJcvS~2p6^UK;`)1GXq zhl-Tn z0lm7Wh8e2j1gYoL7qi6p+Nz`!Gjxiyl(p^{#M1v1bAe9I!y~b*Vv@z9`cq$ex-qwI z&fB=S^MhYIU))VuJo!8{bhz;6DbT?^0(b5W=qa<`N^r~#365zVTgcFTr|>jp>__c` z=8vl$fzHcBJBKWAvT?II2K=^4Om>2i}CWz1u3VAGxp8 zy0-P9KbNQK+yTE>@5%Ta-<-nX6K@O23PbZFBGkGR*{#1cl!n^0@|5)z4=absoQ{mu zJZr`l>GOE<=Z=hbIftsgZp)4Cryp61uBRdk{b1@SLcbhv;jU;*qa%T|hi+te^;Ok6 zm!6}(^p@Rn`@YjbpKEK^Mze`yhJazTw^*#-%WXDUpykayR;^MRBWYXa&)b(hF>ajl(1c|mO1UKzh)I9TIT##8n@w*)E=dw z%+aL=a-GoyYFOGU8)OwqY1&6OW zI}Z<2x%`Q-JRZ*V)Z^gXJ$shZd-pnH{^!T|`gUJAr$rl$d4-b!wL-4HC)G=qUF?U} zhPSNGIv=C)S)7=g5xR8gNKire2(BKw#q=?oyPsY=;#1vjf1~}|Cs*1P{!0QZGp*{B zmpZ!XH>cMoU-e`)>)kxy+_y2+)O#q&0FF+LP~y! z?xchS4xzDec`)<%@`(#PhEM$cJ-okssrND2_$2>36Ot7SY;knl9n*Ms#(LMvn(If zDG^k`g+!eC=L`n!{rc2^G3X@e9ug8?Md(&cq%zy1uAjj}Av*Kz+_SotEBX&xDVGT` zJ_0BFqo17(sp~kzf339CB<}L5bA)>QhEeerjq`C&@2~QCCpgKEYxl06r+?}#e$~@0 zSKus*K%*ANnRwJO-y}B=rJAQ=f^$JQ)tb^NGKa#F_tuoc7e_xYOZBg7>li!&*K#KC zXQg;ttm_5hk&10E{kqI8pVk@{u1*%D!9h8@TS8SyvqrQELyW#V>St?kgv#0p>fUNL zK3(jTu7N@G*1v~FrJ=Vhl4$wq~P*BChk_d!z{K`=S^E>Ms!E zMWr2eKaI?P?Jia8hVupgM4x`H!RCXuw!xkKXEOEX^#ElDgb}wygR`(USFaY$w=#SQ z5PRI#i7FgTdO@0llGz#BkCBX|!~1*DK-EX(fS7fQ?&nu_?giOkkb`t*`w~h zcQ4>c6?OVCVt%mV`cXHiB3`>-MyK2c)Ex8EK_;VtKik7fKMvbG6|amBr@VOS5i`3^(7!vfWVz=ssf$xz$hU8<8M^G#BZE9P)meK} z?lpbbE~lr<5!&@iF#1jV#7KiHCV$sS@VYpxJXvk58_to_?6irPOnS<_Yxf?qAPfL> z&@e$?&&`d&t4g!nVyxqQLhA`jc&;aVt@#Rs=MtonuEJ(^t5JnnWNDh?^pX9$F=|&v zbRk+R{SNhSjqy3qh?W|-HY4x!sd|BCE$zQDt+=~uIT zyW0tWH4e&bLRIxTPyhP*ldJu%`g(e|&W!?S7O|97mHte28kkUT`GfX`r~+F-TD{+J zj@}k?PiQ-==FJbq;r@jP!?|-Gf2HXF$U+CWA%s0DX%Axzu zoSwt@@?DLZh=6E3$z}D9PFeGDRcS`zVcl(w{oc}&GHH<{Vo$RE-tG~XS@YP$IL&)` z&M+?GBNMx(>6eZltBGG}q}@RrZGsoawgdmzf^YkRd>G#1FasA@Q=pMc_2C9!&fZE#$%EqcyGp3&hB z2M}q%3l@mD4kR4IvlxNq6=HDx`VtRL^}{pku^rns11VAE@t*K80nHXxi5Mm&0pBMS zvI2C*m{*AD5W3Ulx2il*+6f5?ZZ64wdUhOkpz}9$-EPkT2LwY5*o!V*+@T^JQH(U( zYpSWQkEUo1SbsJ}J@7iM8~!t$N_=Xyt{&Syx<5#|+KOb?4z6(aAnA^PUYcuQWNHzN zs6B5{b1h%7z5@a?^+C@ye(ZZLo35KGO(5Uz6@IH3HAo*On*=7pUrxq6h9f>Oi>6OZ zl1#|X&%Z;c20yD;V<$c&&y#gW(*_R@4ADe;nwrQcDfxjdk$S1XZ4JdO5HZY3(tpU9@bW^<- zoHhV_fL{Dmd;pHju(bqv_IpQ1A)uMv2PhpJ9hq5JFm3FF|0mSDXixY_!~?U1&#bfa z8ot2TNON!%0f}snN&z$X0J@AUuN^+>^ik=%U_34Vt&d>V?25P!Y6z?pOfftf?(e|2 zfLG0Q<|fC+!VUnxA-ve4a+1`Gvk#rjsua}i?_-{J0U3 z`i!8U6HJyRT2{}31-FI6>a>hj5U?9>0ho+>9vms~9bbvMc76GhidlOYhAAQOj8>?v zM=43!vNH$6!~taSh>E%atA;i42@$8fqAMezxbPp`i6B|;S0f%MSj#c=E3;zrFVXu_ zRu9YCt})J z_HIMudzh#bwK2NIEx;}tY{4}Ldk5bl4o7_P;sut#ygE+=9#&(F0fo~lZQrBuQX4E? zhkFQyz1G0qAXoD|f6$$P=~_3)5p3I=nwfKcqd zVejfA5#MTt)*uvtXw&58&V%+1I;fNc(O?}wBnC^MsjBZZ#vF0It#}P678=25ap36C zf{S?l`rEmK$>rJGEZeoz3Id3G8Rp3e4&ZT8#+RJY-N}=$f`fsZ2VCbuB{cUegV)dtcqSDI@^79&Dzc#Ul8MB{q-;KJg|A-zGLUr ztDdKQx7mt8Mf4Z*$)Ne?sgTJ}O_gOmmT!f*oc7Dpy7RSYv@h+M7aUA!e( ztt90X_*t8qKfZiJU!R-O&*v>>BqSx(xR|10pQLOmFYjMgCPI!@{OqdBQbb_efk04b zz*)t;hgUdAmvcXJ8RG$=gnjG!He3zK?RF%%r6KXho2y&{s~3An_~9e~K?6HAAid$v(~>w(Ot?pwlVnvj6nOiz~2~hZw}QBYYOfC-e_yyeCM#Zu6e# zY(Htw^Pco>vztc#3Tf~1i%pD609(~z;3-wtUY66}!6~h)(@KY7RT@a0ZnNrp#0-Y9 z((ZBZaj!Ju$>v_I)+K*L#}XtR#-RyXaUP6+v6or*2}9}8cIZ`fv_9Soy=daJNstlK z^+#L!prS#gy!K6KW_A^RP+n3J5@gNqG$HK??sHw%_bT z4wun;=<%Hi@o{xm^I|-FoCk9yjKT6hEL7Ri(ScTACOniIN7k^!=mzvuChk$D@7}d* zvK!N{+VO!U8{{+2vOpYf>g!wURZ@_VH5Idg+#FH|p12uU&G?K0LYyYcwDu*OqVOrw zwFS0qm%%fHGdq}~4TLkpif19)125dVY%wh902b{EyViW)+T^E_nRmpJ^wepL$U%IE zXZhNL5m>2jTiN*V&-edg3xeafA9uOQn7ES;T7ZItYs6Ad_yi)?Wr+m@Os!%Msp`(o zqL7M6BIFlv5Q_%?Z+o=+UxQcvKmKBtQx`44n|=!V>iusm&9ZG7h$r6LsAXY%m;L>b z{Z7+lxJ zM2eOnXb5RZ?0^t+7m>=Dw($Z#mS-cSzxb8jAm)H8_`Q_}v|4EF!*3xZ`?a!=v? z`C0q^{$kf|BOb@X5-DNPJ|eu~X-Le@NWH2C?iFW$Ec1~`sZ~^nq`q`_>EOf0x)_BS znGPW)hgrV^uL;I=Ii$`Fgy}I|{VCIm{>sWt_d|1;T)G*pW}PDFGgel*eI2bmqv&g) zvKndM-dFB=w@R#CP;hDd)A6#6ZzZSz>8+l@3x4L)E#kU~WjW=$;EkYKV7b*}!YlhO zy+~N^p#qfEn?D}JfIWPjN^;GqQ6O0%xh!w?DXQC&vKCTUb8l{xbxr}N@x0a3+p|l2 zJGo2}&r;g&H@}6Fl3YaltE!^ChioE>N}{6DZm@!41@WBI)?;@B%iFcWOD1evApjGT zhV6TG)@BO}9}`O*V%5^CnEb;vSD?;>S5h(NgorC!)j4$Nddo(lsuMQ`2IBDdVO+Ds z$+LrM83qOVTBQ=1?G>dCajT?~_wJFAgP8tn!)^jGz9^}4FkEl4x7+8|OObs(V$p)p zK|wyO;t~kAdMV#cq5!>xH&V!B5gpH$k+`B-k0mr@lcHhN`ar7Gv7|KIJ-u41=K;~` zdfOw8QQxn9|y1M&+su8%Vmd~8Q5lKpP+q*P3#YXa;kIzXp>o4EQ z+-^NvsKd?O$TITP=3W*{eA3p;q4!#}G)JSI)^`Qe(g@wLHF&f&oq3ckZQ9AviNoc7 zxp4w11oE*o3`V&?y{}7+_ej=3Hh#f;a;;XW|N!Cq3_ctPw$)uHiv0NVL5<& zmxj-D@U0SK$0w=st@E5yI%UddLuIk4etpg7Ui*u@Ipv3Gt#UvCZvpbt$d_BBdVrec z4Zkl=2!K#BD0Y9Q_4XHOqTTG{5i5`jw=VfNy5;Y5+^8i6F+>V)D zSQw2vYEw|GkSWm7T?dt1)3g&;UQO&q2W6%tb5IzqKyyJoajGE`ml_Xw4Ql~R?{gJbxYUaFx)((C)^y$DILYFPDZ(?!I+z#vcKL_B4!X8rRJsP4|0Lhb(!#%Q?#)=oA8_mDdY53oT zEPRM&_q-JuseN*CYnkrpBZ;kLH)(g-bTd_8Q;#2Uhj&U_GEMDmo;dV=@etDQlcZ8i zIXML(^Nyuzy?lGzAJ_isl72U3F%!L{V& zKle=e@du) zWmx=gQy>F3w-(f?3zcs;(Y>Wr*H+h8SMP5vdT3GmjT=2^J9$e>OHT5L8H>F0cbC4_ zvOK$8U*fvPPrkA8>-=f0ynB_8wu=r^P!I@f^lMA>B&4J~$K?|wpT9ik_O7Hvdwed$ z`Dln$f6-M5tp3N|loffWSXps5L;dMps-L_3z8)!==6c#mYheM|*;qqGx?q@-p`p>P zwRG7eK*<8u+=}j%_tutZA74IaXZ8X()Yyf)XjJo>$ty~bBa#o>L`6nfG7T4I0 zP2tmW7J7Q)gLU&*n)x^eZ$~}7DVdN`n$sm|XxT0$DIsfo`{vE`2lP^;UgM#udqTVV z6u6FP9``>Jtso_l!Bv)h8HmwO?u^Xb+s&;s0@mRrC4vQgg!zY#ehMRFeeKFmv&pU% z$E1s2kuZDz_mA2JmUI6yTnDBJcSsUH8cBDTk&80Z3=}W*u&_KkHR~;V_KKE3E*bFD@^gJ}nwEGa|$atbXJD zmMZHpV3q%+xhoBadj0#=>0j5e)IlK%O>&BoRD_8ZqzR#vy%NbX*<*&N(?U6tgCuE+ zgD88HWvHfYGIE?`Uy`gt_GJv_`TRO>&U3Ek#q&J>H~+bM;VRQLzq#-Gd*Ao>vqeS8 z*E6?FxMjs(qWYW6RW)}VJ-Qe0o<6BaTqr#Jq;x8!wKRTBkb6XR57&uqnUZF5*=$GV zzkjk?eIy~EsdAg0I#^H18RN_R@!E8D3cH?2Cpg_7^+3o10 zm>Akdl`)ID7~j(-Sm%Q6j^W{)3eAB;Ux=Q0{JIJYJ7MOzJ_fgq+sdEUIu`qx;oBRPjb8?*0?m)Zde`= zFs6WxYQxGiS)NwRqVc$2IR`=aM03#9wI@V3Kv(tK=0j0}$$rB+$LL1~8InoasRrp( zx1*UdgVZjcgh*4*6UN2{mQ?PWMGJFGrX-Wfiwy$iPFr)6Pz_ieY9i|-uhElv=awToqZhDdqsK9j|rIn(Ft27JGHR zF^M!B{IlL#;j@G}fDz24G{6$MRFNgD7hm_G7BYg)wRM}wqV4-zxR7uJhm~L7_`O%J zqLSE3>$51L^)N0J_{x*8{ViX%Y;@Hh0vm5{SL;=b>go^d^~t@OmFj5p+whVuia~?jUXWg!rdZK0L?EEQUe~7}>TV*BF?SiHia*}S_6A)_kr?13U zFC(Y*v6UV(JGC}AY4}fwas+LUefqe)SX8qWA?Jgh4yi_m+dduf8**RA`=RV6K^oZ< zQQ0*kI+~rCUFtJ<+TVoPuHdO!KdN=v>)7u|V;rfSGOs{NYM`{CgY!rycPD8fP!Guk>*_T|Rnsz$3>iGfz zW+*`Y=L;AF8YnA`u7cyKnU6 zW`oa?uTI{+!8pC-f@y5a<6)oBXZ4+RDwa)Yr0mszG5etKBP z6@^jMh839lj(HEOj@#DDiug}trlp;}dU86r+{(k*Q^iG!t}H7f`$^`~3z(yOC_3uc zYKfr_T3fpj{hs)UcpffLyN~&G+)4L!Zwq3y22Le?0$wp3-k|JMbUmp2i?veRyWgqt zH-EhHOPyyUY`jgG1KI=GHxI7#aZOBe%(JX0zZGmvBqHzrIhWYz@Y=NC|98#$pWby} z1rUa)a%Acw;(zYlgC7eUGJD?aC)(vYwyq{gLaqcnG5=WR$eladaYq*3dyv3WL_2fOa?++{!{D%L>A|0$oX{KsZ6-;^L5V zhKsF(G`<1&gk1|nGA2rg6X&322b;IOh$_pEuI$p@xfA9)&akA&N(2yc7uYG^yJMx+(`G$k5<9e#m7032TSO{hzYz^=m^CP1+HDLL12HqY_( zb;wDfcD2o2LUc%WV=S&i-YXkvNNRfODIZ_yyv2$}z6V*=_-piV01jLU3!7?L3w!_? z`E?{j_Cc%OrZ+#bJi*vd-!X5RwOr4s`PJLEhwf~5eRp%MzTyfYGzGu<@X+24H%k9# z|IDica1S!u@aikpF0Dk17R9FY<~|LmbwlTa_wRq3y=Dsfdo(ohJNDeR%{wqAWObsg z07#@k6eNl+pY`HD@@q)u`l%Mc115Uca(rvK6Z(qLMx4VMo?gXvc~&0t4JGmVq=cQ` zU(owQAIEKE19WQBv;5g~5P-<pd5)D)EO_SwvCO$0P_^hy< zKwF-#L#X5b9&Lf(31$ESw6UPJfT*6^S~`XPACt*MyXl}l81vc?Yg}Kcf)tV|L?@b= zJ@4?sINhW7XQ2OvG(}vjrov$?*NWJPlef`{M-JsS5s5WxcDdDVAoUOX0l1LUCg3xQ zQjCG2VZKWmdYCYm09yjP4@589qiFEH0Pwad^38<{7XY6KFaG84s16{MyLazGt`2(> zLuUU99g4yGN9&7F=;sn*w z(gGI+J`5=EJ9e-Ya>!}VcZR0hGdOq_>6!t9P5z*+*V)HXx*$=3Zs!#dKU`Hs#mG;| zkYTHnaRlm`nJUe8=xRA1K41jp&@2VZ78F-R6;degQ6SdH%eSN9j@;7Q%<(N7Hr$3d zWvP6yLVTrwR~?E>R6+-(o%9XR$KY~r43~KV_V`V?PvnS?;kcE8xN;F21HO@J%p*`YX2ub8k*WD zen4No`BQetnC#i}0wusk&n)lnFjl@Ze1x(gn>$_+0xK0#GP>?yl*2&e6rK@Gd7@(Z z`W6(ILMa8KA*~b7FKD&}UTXD4hAApl6x3F5Gr-V#mW>!fLAx%nY>Lz$&-NDw!Wb=-9n*7y*&|FU%~rnum&n%s)8WnBEhssNeXh&kw>nDpMwF7l6V; zhYq1d4=~+zy9{Xt&?m+fe0Fy#l`y;@Ii`DU!6(3+2dIT!6`Z}i{rsMM_sBX;r)#s+ z^c5u|-oo#pXAFy+s)i$%4d*;+3II_LkH<(-gj$VE8%5n|$U&-cZ&%lP@oR8&Njv(e z(bdqvpt!WOvTHQ`9z8SWH>}?hvA<(&1rhU5LL5=Hx8rqcp{b(&lbnvo*oxfR$CiDpnEpEKD>ZHz=y_dYLXDTl9iK-Lc{c_ zIp5gSL`>x|4HW)?0?BT=HrXD?rj8CD_Yfq0!8HOXc6cns8Jkf9mDCR@=z#-2>gjy0-HPK9;}?V|@~e!4q=@t$Lm z3t=1q^Cu`~?lk+&dx_cRvYlWmyIpVz8b#NzaqgW0X#E~BhuL30gQd0BzE)D0Kj_(Ty zEJ0!|>@(m2gS4GssQ$pLa<{d&uTm2UdfC|W`o?gJZ#69_NFv%H2dStU&6UBM&?lCR zI36^(po{01ufsVY;|Q_0 zdwL$y$2lQbw_;3Iec%ANSHQ1Nja{XrI(`%`O+GDhDr$MfIpNK#4Ehygq7mr7G`EQ;n7lahA7D+UkoNK5qZ@p6PZ?2G#P(9 z+|Q_Gd0Nsk>S{}slnzcR8-g=U|WHV4xEK;GLeMwi@bSwWMnI_Q=Cb0 z*@1x-th>TDC@7o&RR?!W2q8d4I3B`FrKFAy4_oCsv6)9t&fW75EP=!m?2on(J{3SF zm?S7UbNqI}ji@N3+Ph*RLbHV(Aq{XSSPUc_NZ}9Aj68SPmBEJv$EfDjFWGF@ZcYNM zJsqWVnedLADq(*f8WNbLBX|4(>Z)~Fpm$h1$~ot*))@A-j7N`ry}fCJh4oD>@}=?r zKs)O$)#iG2yu{;_qtFKHhE5L?iLX=r>h$q5ag+)6&kQw@ZOD)Ci#BxrTxV;*(Nh<{x8oOBElB=LU-zH;!*jt>rqd4|G47=A_pJj4rux}?PyF&< D0^iiB literal 0 HcmV?d00001 diff --git a/admin-fe2.png b/admin-fe2.png new file mode 100644 index 0000000000000000000000000000000000000000..88041ac2fdaa80b31161d39be988f1cdfc1406c0 GIT binary patch literal 24838 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 literal 0 HcmV?d00001 diff --git a/app/soapbox/actions/notifications.ts b/app/soapbox/actions/notifications.ts index 79994bde5..3a554e38a 100644 --- a/app/soapbox/actions/notifications.ts +++ b/app/soapbox/actions/notifications.ts @@ -10,7 +10,7 @@ import api, { getLinks } from 'soapbox/api'; import compareId from 'soapbox/compare_id'; import { getFilters, regexFromFilters } from 'soapbox/selectors'; import { isLoggedIn } from 'soapbox/utils/auth'; -import { getFeatures, parseVersion, PLEROMA } from 'soapbox/utils/features'; +import { getFeatures, parseVersion, PLEROMA, AKKOMA } from 'soapbox/utils/features'; import { unescapeHTML } from 'soapbox/utils/html'; import { joinPublicPath } from 'soapbox/utils/static'; @@ -318,7 +318,7 @@ const markReadNotifications = () => dispatch(saveMarker(marker)); - if (v.software === PLEROMA) { + if (v.software === PLEROMA || v.software === AKKOMA) { dispatch(markReadPleroma(topNotificationId)); } } diff --git a/app/soapbox/features/hashtag_timeline/index.js b/app/soapbox/features/hashtag_timeline/index.js index 888573579..d1611a8c8 100644 --- a/app/soapbox/features/hashtag_timeline/index.js +++ b/app/soapbox/features/hashtag_timeline/index.js @@ -113,7 +113,9 @@ class HashtagTimeline extends React.PureComponent { return ( - +
+ +
) => { }; // Get the software's default attachment limit -const getAttachmentLimit = (software: string | null) => software === PLEROMA ? Infinity : 4; +const getAttachmentLimit = (software: string | null) => (software === PLEROMA || software === AKKOMA) ? Infinity : 4; // Normalize version const normalizeVersion = (instance: ImmutableMap) => { diff --git a/app/soapbox/reducers/compose.ts b/app/soapbox/reducers/compose.ts index d8fd41c3b..7d4b7fa09 100644 --- a/app/soapbox/reducers/compose.ts +++ b/app/soapbox/reducers/compose.ts @@ -2,7 +2,7 @@ import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrde import { v4 as uuid } from 'uuid'; import { tagHistory } from 'soapbox/settings'; -import { PLEROMA } from 'soapbox/utils/features'; +import { PLEROMA, AKKOMA } from 'soapbox/utils/features'; import { hasIntegerMediaIds } from 'soapbox/utils/status'; import { @@ -445,7 +445,7 @@ export default function compose(state = ReducerRecord({ idempotencyKey: uuid(), map.set('content_type', action.contentType || 'text/plain'); map.set('quote', action.status.get('quote')); - if (action.v?.software === PLEROMA && action.withRedraft && hasIntegerMediaIds(action.status)) { + if ((action.v?.software === PLEROMA || action.v?.software === AKKOMA) && action.withRedraft && hasIntegerMediaIds(action.status)) { map.set('media_attachments', ImmutableList()); } else { map.set('media_attachments', action.status.media_attachments); diff --git a/app/soapbox/utils/features.ts b/app/soapbox/utils/features.ts index 02d98010e..6a986c490 100644 --- a/app/soapbox/utils/features.ts +++ b/app/soapbox/utils/features.ts @@ -27,6 +27,12 @@ export const MASTODON = 'Mastodon'; */ export const PLEROMA = 'Pleroma'; +/** + * Akkoma, a cooler fork of Pleroma + * @see {@link https://docs.akkoma.dev/stable/} + */ +export const AKKOMA = 'Akkoma'; + /** * Mitra, a Rust backend with deep Ethereum integrations. * @see {@link https://codeberg.org/silverpill/mitra} @@ -69,13 +75,13 @@ const getInstanceFeatures = (instance: Instance) => { * @see GET /api/pleroma/aliases * @see PATCH /api/v1/accounts/update_credentials */ - accountAliases: v.software === PLEROMA, + accountAliases: (v.software === PLEROMA || v.software === AKKOMA), /** * The accounts API allows an acct instead of an ID. * @see GET /api/v1/accounts/:acct_or_id */ - accountByUsername: v.software === PLEROMA, + accountByUsername: (v.software === PLEROMA || v.software === AKKOMA), /** * Ability to create accounts. @@ -83,7 +89,7 @@ const getInstanceFeatures = (instance: Instance) => { */ accountCreation: any([ v.software === MASTODON, - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), ]), /** @@ -92,14 +98,14 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/v1/accounts/:id/unpin * @see GET /api/v1/pleroma/accounts/:id/endorsements */ - accountEndorsements: v.software === PLEROMA && gte(v.version, '2.4.50'), + accountEndorsements: (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.4.50'), /** * Ability to set one's location on their profile. * @see PATCH /api/v1/accounts/update_credentials */ accountLocation: any([ - v.software === PLEROMA && v.build === SOAPBOX && gte(v.version, '2.4.50'), + (v.software === PLEROMA || v.software === AKKOMA) && v.build === SOAPBOX && gte(v.version, '2.4.50'), v.software === TRUTHSOCIAL, ]), @@ -109,7 +115,7 @@ const getInstanceFeatures = (instance: Instance) => { */ accountLookup: any([ v.software === MASTODON && gte(v.compatVersion, '3.4.0'), - v.software === PLEROMA && gte(v.version, '2.4.50'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.4.50'), v.software === TRUTHSOCIAL, ]), @@ -117,7 +123,7 @@ const getInstanceFeatures = (instance: Instance) => { * Move followers to a different ActivityPub account. * @see POST /api/pleroma/move_account */ - accountMoving: v.software === PLEROMA && gte(v.version, '2.4.50'), + accountMoving: (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.4.50'), /** * Ability to subscribe to notifications every time an account posts. @@ -125,7 +131,7 @@ const getInstanceFeatures = (instance: Instance) => { */ accountNotifies: any([ v.software === MASTODON && gte(v.compatVersion, '3.3.0'), - v.software === PLEROMA && gte(v.version, '2.4.50'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.4.50'), v.software === TRUTHSOCIAL, ]), @@ -134,7 +140,7 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/v1/pleroma/accounts/:id/subscribe * @see POST /api/v1/pleroma/accounts/:id/unsubscribe */ - accountSubscriptions: v.software === PLEROMA && gte(v.version, '1.0.0'), + accountSubscriptions: (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '1.0.0'), /** * Ability to set one's website on their profile. @@ -150,7 +156,7 @@ const getInstanceFeatures = (instance: Instance) => { */ announcements: any([ v.software === MASTODON && gte(v.compatVersion, '3.1.0'), - v.software === PLEROMA && gte(v.version, '2.2.49'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.2.49'), ]), /** @@ -167,7 +173,7 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/v1/accounts * @see PATCH /api/v1/accounts/update_credentials */ - birthdays: v.software === PLEROMA && v.build === SOAPBOX && gte(v.version, '2.4.50'), + birthdays: (v.software === PLEROMA || v.software === AKKOMA) && v.build === SOAPBOX && gte(v.version, '2.4.50'), /** Whether people who blocked you are visible through the API. */ blockersVisible: features.includes('blockers_visible'), @@ -179,7 +185,7 @@ const getInstanceFeatures = (instance: Instance) => { */ bookmarks: any([ v.software === MASTODON && gte(v.compatVersion, '3.1.0'), - v.software === PLEROMA && gte(v.version, '0.9.9'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '0.9.9'), v.software === PIXELFED, ]), @@ -189,20 +195,20 @@ const getInstanceFeatures = (instance: Instance) => { */ bots: any([ v.software === MASTODON, - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), ]), /** * Pleroma chats API. * @see {@link https://docs.pleroma.social/backend/development/API/chats/} */ - chats: v.software === PLEROMA && gte(v.version, '2.1.0'), + chats: (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.1.0'), /** * Paginated chats API. * @see GET /api/v2/chats */ - chatsV2: v.software === PLEROMA && gte(v.version, '2.3.0'), + chatsV2: (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.3.0'), /** * Mastodon's newer solution for direct messaging. @@ -210,7 +216,7 @@ const getInstanceFeatures = (instance: Instance) => { */ conversations: any([ v.software === MASTODON && gte(v.compatVersion, '2.6.0'), - v.software === PLEROMA && gte(v.version, '0.9.9'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '0.9.9'), v.software === PIXELFED, ]), @@ -220,7 +226,7 @@ const getInstanceFeatures = (instance: Instance) => { */ directTimeline: any([ v.software === MASTODON && lt(v.compatVersion, '3.0.0'), - v.software === PLEROMA && gte(v.version, '0.9.9'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '0.9.9'), ]), editStatuses: any([ @@ -250,13 +256,13 @@ const getInstanceFeatures = (instance: Instance) => { * @see GET /api/v1/pleroma/statuses/:id/reactions/:emoji? * @see DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji */ - emojiReacts: v.software === PLEROMA && gte(v.version, '2.0.0'), + emojiReacts: (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.0.0'), /** * The backend allows only RGI ("Recommended for General Interchange") emoji reactions. * @see PUT /api/v1/pleroma/statuses/:id/reactions/:emoji */ - emojiReactsRGI: v.software === PLEROMA && gte(v.version, '2.2.49'), + emojiReactsRGI: (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.2.49'), /** * Sign in with an Ethereum wallet. @@ -269,7 +275,9 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/v1/statuses */ explicitAddressing: any([ - v.software === PLEROMA && gte(v.version, '1.0.0'), + // Keep as comment for the day mastodon will show things correctly + // https://github.com/Cl0v1s/mangane/issues/27 + // v.software === PLEROMA && gte(v.version, '1.0.0'), v.software === TRUTHSOCIAL, ]), @@ -298,7 +306,7 @@ const getInstanceFeatures = (instance: Instance) => { */ filters: any([ v.software === MASTODON && lt(v.compatVersion, '3.6.0'), - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), ]), /** @@ -313,20 +321,20 @@ const getInstanceFeatures = (instance: Instance) => { */ followRequests: any([ v.software === MASTODON, - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), ]), /** * Whether client settings can be retrieved from the API. * @see GET /api/pleroma/frontend_configurations */ - frontendConfigurations: v.software === PLEROMA, + frontendConfigurations: (v.software === PLEROMA || v.software === AKKOMA), /** * Can hide follows/followers lists and counts. * @see PATCH /api/v1/accounts/update_credentials */ - hideNetwork: v.software === PLEROMA, + hideNetwork: (v.software === PLEROMA || v.software === AKKOMA), /** * Pleroma import API. @@ -334,7 +342,7 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/pleroma/blocks_import * @see POST /api/pleroma/mutes_import */ - import: v.software === PLEROMA, + import: (v.software === PLEROMA || v.software === AKKOMA), /** * Pleroma import endpoints. @@ -342,7 +350,7 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/pleroma/blocks_import * @see POST /api/pleroma/mutes_import */ - importData: v.software === PLEROMA && gte(v.version, '2.2.0'), + importData: (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.2.0'), /** * Can create, view, and manage lists. @@ -351,7 +359,7 @@ const getInstanceFeatures = (instance: Instance) => { */ lists: any([ v.software === MASTODON && gte(v.compatVersion, '2.1.0'), - v.software === PLEROMA && gte(v.version, '0.9.9'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '0.9.9'), ]), /** @@ -365,7 +373,7 @@ const getInstanceFeatures = (instance: Instance) => { */ mastodonAdmin: any([ v.software === MASTODON && gte(v.compatVersion, '2.9.1'), - v.software === PLEROMA && v.build === SOAPBOX && gte(v.version, '2.4.50'), + (v.software === PLEROMA || v.software === AKKOMA) && v.build === SOAPBOX && gte(v.version, '2.4.50'), ]), /** @@ -382,14 +390,14 @@ const getInstanceFeatures = (instance: Instance) => { mediaV2: any([ v.software === MASTODON && gte(v.compatVersion, '3.1.3'), // Even though Pleroma supports these endpoints, it has disadvantages - // v.software === PLEROMA && gte(v.version, '2.1.0'), + // (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.1.0'), ]), /** * Ability to hide notifications from people you don't follow. * @see PUT /api/pleroma/notification_settings */ - muteStrangers: v.software === PLEROMA, + muteStrangers: (v.software === PLEROMA || v.software === AKKOMA), /** * Add private notes to accounts. @@ -398,7 +406,7 @@ const getInstanceFeatures = (instance: Instance) => { */ notes: any([ v.software === MASTODON && gte(v.compatVersion, '3.2.0'), - v.software === PLEROMA && gte(v.version, '2.4.50'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.4.50'), ]), /** @@ -407,7 +415,7 @@ const getInstanceFeatures = (instance: Instance) => { */ notificationsIncludeTypes: any([ v.software === MASTODON && gte(v.compatVersion, '3.5.0'), - v.software === PLEROMA && gte(v.version, '2.4.50'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.4.50'), ]), /** @@ -429,7 +437,7 @@ const getInstanceFeatures = (instance: Instance) => { * Displays a form to follow a user when logged out. * @see POST /main/ostatus */ - pleromaRemoteFollow: v.software === PLEROMA, + pleromaRemoteFollow: (v.software === PLEROMA || v.software === AKKOMA), /** * Can add polls to statuses. @@ -437,7 +445,7 @@ const getInstanceFeatures = (instance: Instance) => { */ polls: any([ v.software === MASTODON && gte(v.version, '2.8.0'), - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), v.software === TRUTHSOCIAL, ]), @@ -462,7 +470,7 @@ const getInstanceFeatures = (instance: Instance) => { */ profileFields: any([ v.software === MASTODON, - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), ]), /** @@ -472,7 +480,7 @@ const getInstanceFeatures = (instance: Instance) => { */ publicTimeline: any([ v.software === MASTODON, - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), ]), /** @@ -480,7 +488,7 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/v1/statuses */ quotePosts: any([ - v.software === PLEROMA && v.build === SOAPBOX && gte(v.version, '2.4.50'), + (v.software === PLEROMA || v.software === AKKOMA) && v.build === SOAPBOX && gte(v.version, '2.4.50'), instance.feature_quote === true, ]), @@ -488,7 +496,7 @@ const getInstanceFeatures = (instance: Instance) => { * Interact with statuses from another instance while logged-out. * @see POST /api/v1/pleroma/remote_interaction */ - remoteInteractions: v.software === PLEROMA && gte(v.version, '2.4.50'), + remoteInteractions: (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '2.4.50'), /** * Ability to remove an account from your followers. @@ -496,19 +504,19 @@ const getInstanceFeatures = (instance: Instance) => { */ removeFromFollowers: any([ v.software === MASTODON && gte(v.compatVersion, '3.5.0'), - v.software === PLEROMA && v.build === SOAPBOX && gte(v.version, '2.4.50'), + (v.software === PLEROMA || v.software === AKKOMA) && v.build === SOAPBOX && gte(v.version, '2.4.50'), ]), reportMultipleStatuses: any([ v.software === MASTODON, - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), ]), /** * Can request a password reset email through the API. * @see POST /auth/password */ - resetPassword: v.software === PLEROMA, + resetPassword: (v.software === PLEROMA || v.software === AKKOMA), /** * Ability to post statuses in Markdown, BBCode, and HTML. @@ -516,7 +524,7 @@ const getInstanceFeatures = (instance: Instance) => { */ richText: any([ v.software === MASTODON && v.build === GLITCH, - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), ]), /** @@ -526,7 +534,7 @@ const getInstanceFeatures = (instance: Instance) => { */ scheduledStatuses: any([ v.software === MASTODON && gte(v.version, '2.7.0'), - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), ]), /** @@ -534,7 +542,7 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/v1/apps * @see POST /oauth/token */ - scopes: v.software === PLEROMA ? 'read write follow push admin' : 'read write follow push admin:read admin:write', + scopes: (v.software === PLEROMA || v.software === AKKOMA) ? 'read write follow push admin' : 'read write follow push admin:read admin:write', /** * Ability to search statuses from the given account. @@ -543,7 +551,7 @@ const getInstanceFeatures = (instance: Instance) => { */ searchFromAccount: any([ v.software === MASTODON && gte(v.version, '2.8.0'), - v.software === PLEROMA && gte(v.version, '1.0.0'), + (v.software === PLEROMA || v.software === AKKOMA) && gte(v.version, '1.0.0'), ]), /** @@ -553,7 +561,7 @@ const getInstanceFeatures = (instance: Instance) => { * @see POST /api/pleroma/delete_account */ security: any([ - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), v.software === TRUTHSOCIAL, ]), @@ -562,14 +570,14 @@ const getInstanceFeatures = (instance: Instance) => { * @see GET /api/oauth_tokens.json * @see DELETE /api/oauth_tokens/:id */ - sessions: v.software === PLEROMA, + sessions: (v.software === PLEROMA || v.software === AKKOMA), /** * Can store client settings in the database. * @see PATCH /api/v1/accounts/update_credentials */ settingsStore: any([ - v.software === PLEROMA, + (v.software === PLEROMA || v.software === AKKOMA), v.software === TRUTHSOCIAL, ]), @@ -629,7 +637,7 @@ const getInstanceFeatures = (instance: Instance) => { * Whether the backend allows adding users you don't follow to lists. * @see POST /api/v1/lists/:id/accounts */ - unrestrictedLists: v.software === PLEROMA, + unrestrictedLists: (v.software === PLEROMA || v.software === AKKOMA), }; }; diff --git a/app/soapbox/utils/quirks.ts b/app/soapbox/utils/quirks.ts index 6abfec205..aec44f38d 100644 --- a/app/soapbox/utils/quirks.ts +++ b/app/soapbox/utils/quirks.ts @@ -1,7 +1,7 @@ /* eslint sort-keys: "error" */ import { createSelector } from 'reselect'; -import { parseVersion, PLEROMA, MITRA } from './features'; +import { parseVersion, PLEROMA, MITRA, AKKOMA } from './features'; import type { RootState } from 'soapbox/store'; import type { Instance } from 'soapbox/types/entities'; @@ -16,7 +16,7 @@ export const getQuirks = createSelector([ * @see GET /api/v1/blocks * @see GET /api/v1/mutes */ - invertedPagination: v.software === PLEROMA, + invertedPagination: v.software === PLEROMA || v.software === AKKOMA, /** * Apps are not supported by the API, and should not be created during login or registration. diff --git a/package.json b/package.json index 3362bbea0..3cd225d01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mangane-fe", - "version": "dry-axolotl-test", + "version": "hot-snowleopard", "displayName": "Mangane", "description": "Devanture pour https://bdx.town", "homepage": "https://bdx.town",