From 059019f458fa0f97074441791d6ad34cee5403b5 Mon Sep 17 00:00:00 2001 From: StepanovPlaton Date: Sun, 15 Feb 2026 17:17:30 +0400 Subject: [PATCH] Add readme --- README.md | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ screenshot.png | Bin 0 -> 38804 bytes 2 files changed, 95 insertions(+) create mode 100644 README.md create mode 100644 screenshot.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..d6f9e57 --- /dev/null +++ b/README.md @@ -0,0 +1,95 @@ +# 🖥️ Операционная система в 1000 строках кода на С + +> Минимальная операционная система для архитектуры RISC-V 32-bit, реализованная по книге [Operating System in 1,000 Lines](https://operating-system-in-1000-lines.vercel.app/en/) + +![](./screenshot.png) + +--- + +## 📋 Стек + +- **Архитектура:** RISC-V 32-bit +- **Компилятор:** Clang с поддержкой RISC-V +- **Язык:** C11 (freestanding) +- **Виртуализация:** QEMU (для эмуляции) + +--- + +## 🚀 О проекте + +- **Минимальная операционная система** с полным набором базовых функций +- **Управление памятью** с поддержкой виртуальной адресации и страничной организации памяти (SV32) + - Выделение страниц памяти + - Маппинг виртуальных адресов на физические + - Изоляция адресных пространств процессов +- **Многозадачность** с поддержкой до 8 процессов одновременно + - Переключение контекста между процессами + - Планировщик задач с round-robin алгоритмом + - Изоляция процессов через отдельные page tables +- **Системные вызовы** для взаимодействия пользовательских программ с ядром + - `SYS_PUTCHAR` — вывод символа в консоль + - `SYS_GETCHAR` — чтение символа из консоли (с блокировкой) + - `SYS_EXIT` — завершение процесса + - `SYS_READFILE` — чтение файла + - `SYS_WRITEFILE` — запись в файл +- **Файловая система** на основе формата tar (ustar) + - Поддержка чтения и записи файлов + - Автоматическая загрузка файлов из образа диска при старте + - Сохранение изменений на диск через VirtIO +- **Работа с диском** через интерфейс VirtIO Block Device + - Чтение и запись секторов диска + - Поддержка виртуальных очередей VirtIO +- **Обработка исключений и прерываний** через trap handler + - Обработка системных вызовов через инструкцию `ecall` + - Переключение между режимами supervisor и user +- **Интерактивная оболочка (shell)** в пользовательском пространстве + - Команда `hello` — приветствие + - Команда `exit` — выход из shell + - Команда `readfile` — чтение файла + - Команда `writefile` — запись в файл +- **Разделение на kernel и user space** + - Ядро работает в режиме supervisor + - Пользовательские программы работают в режиме user с ограниченными правами + - Защита памяти через page tables + +--- + +## 📝 Структура проекта + +``` +OSIn1000Lines/ +├── src/ +│ ├── kernel.c # Основной код ядра (управление процессами, системные вызовы) +│ ├── kernel.h # Заголовочные файлы ядра +│ ├── kernel.ld # Скрипт линковки ядра +│ ├── user.c # Пользовательское пространство (системные вызовы) +│ ├── user.h # Заголовочные файлы пользовательского пространства +│ ├── user.ld # Скрипт линковки пользовательских программ +│ ├── shell.c # Код интерактивной оболочки +│ ├── common.c # Общие функции (printf, memset, memcpy, strcmp) +│ ├── common.h # Общие определения +│ ├── Makefile # Сборка проекта +│ ├── disk/ # Файлы для файловой системы +│ │ ├── hello.txt +│ │ └── meow.txt +│ └── run.sh # Скрипт запуска в QEMU для Linux +│ └── run.bat # Скрипт запуска в QEMU для Windows +└── README.md # Этот файл +``` + +--- + +## 🎯 Сборка и запуск + +### Требования + +- **Clang** с поддержкой RISC-V target +- **LLVM objcopy** (llvm-objcopy) +- **QEMU** с поддержкой RISC-V 32-bit + +### Запуск + +```bash +cd src +./run.sh +``` \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e27ffdffedba46f8be590cf6828c16ba8f84518c GIT binary patch literal 38804 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

T_si*6iyDWmgQ5=h1RH24e=a0xM zWU5_gW%Z2Cmp7K(`^B6*&hbBXn^9`58t#OWFZawc#rvmDlsPf$KJQfRFJo8xXE0;K zw0iPOfm&w;Y8~wA9Z{Xf3B$O>oPEaM zt>t`UXCbeMiAs^L*dDzYS)Jatar^H4=fmy$QZrJ|pY2{{Q!Bq-lyIkruXT+nD&X&a zWBOriMkh0j@!Le_+kH;N*Nc5m&1W1$50F~&=6%`Q!6vq~-YN6_O+3(3 zvlC~bD?7u!6E9^1-{Rl0v#6l}A-0$2UQ+t?M50f&a+f0~unE=TL&O(mw%=#0$LcLK z0X1p&bCdujXIr!I{T$_uE{JUY`%8@f@X|lbP3E7H2F=Y*RzsLtHhse}!a(Ji)u}@~$bQP2^E{wG#q% zh|m4}3CSZpUMY07OW(a76&b-pNX+r(`UWCZQpCh?GY(1dUN`AXbhI zasASxeJMvMak44Mxv^D}TKU-{USX@xpoPUTZb`_66pZsKviilvc|X;5G`u@=CJ0e$ z%TCgo$0&RRE`4N`Q(57@1zoj81WCRWgsTQaV1L51LA|4tjXx%&jbzX6_SOVcUW(yw zmQpSbCa}%lPwQ;#PxNDzpTrc-b`14nh_K5l3(=epX-GG;CsIwJJuFk| zsXv_mAshq32vKQmtUA&5CN0m))R2 zK2P|q#qrAGfKR?En}AhF+O;m2ok+-MiS2SDbEL|?Aeg03ZrFAms0B&e~{FuN|nF)>9Nv#5Q&tNtFiQB@={Mfq#M)WN|{zkAlop#+wn zq1jG_9aV%*ccHRo)T5K=gLCJm;s_XoLWJRW1`2Uc4u|BqekH!P7JXY7D`_ZpKhs)n z_dMvYqyp$*U*1&U`SpZ#k)UZF{KMh z;_>JAi1y%}fn_+rX)v{%6C=HJqn43Mq(EF0xLVw88HHx+oh+)~LAcCTqB_p!pK_)el_T4+K^Q69k&4=qU#9GLzh@hwlg_{*pX3F^l`mv+? zdk?zSmFoU5o^_FVOC3cLE^5DHQlU1gipQcB{A2PYS-bNYJjTGQS(+zZjsDDzoev5hU3HES=cSAL1R#hJ!#`&@y$CH86+ zKcY*}yn<&o@9VrV+Z|~nD28jSZ5w9O2Mz;lNt zWZc=o;K|nPpT^~IdYt>2ylo}Ut-4~hdUaXe`A{EW=~m-amY@#lR#5AO3$@vOga}@L z_Aaz!IGCUwSF(+y#xyw};dHyEg~Y{C=jR*v%&&*H*#Vhc-?;CiVd)R*Q*A{VgB{NF zL}-fs^YGU<(_>U-%JHcwPSo!j+MR>6g#M+FYRgQ7Y}U3@MEf&YE{oY9^cIAoJPxT{ zGnk-m2ar$TCL~Hw$mK>xN=)D~JL5vY0ITn~C_GM!8=9H}Lo3{>N_EeTucg=z^)3s}k*d zYMS=0OR|x`LHCYHf6(IraoJdkL~hmQtQF#ST2?)B2EFk%0nz@K8cohI2qSNT%%wo- z`!Ll8`si=4@UgC=)$b7S*xjkQe(F07b4me{L9S2;_eM4{aB@-1x&?`Ge#{X#kwzB}%@9nfe_4GZB8apz)s zDaPfR932|gVr25yeipt4rLD}m!&-mPaGGeeh!kiuvVF}KAH7u2@}3f7M(+5xGxSU` zGzs@@eCR`0V!)LNHpPV5+@BAK)XQ^V77is^60mjqGGyBUKw^IjZYw82#TTGr^{04b zB6={Z#1>B1Cca#1@ReZYmVfB{k)R}<79kPHqxWc!fuVQ9UBe$R#uY}1*fr+I%*-qD z()Ap@E?QcCl}MnXhS<8xt@T-qZez$WF-0NcE-KMtvRcVisZ^fuU{k=8oD=*Qt1;OJ zT#(R3IzwPC{@3;}+($qKS2owXUll#4*Q^OnPoM~~OwO2-VONWh%Wb)oXHcsNUANt) zTbJxkmYq?1u`w_QwKrWL_*hBD|D04l6AI}oN_+u89=?*~^7>wr%@K}FS*S?q3%90j zXeLKL>g>mpY%Pc=<-Bvov=i}QNX`Y19z%N5v&gu(hxk50e1e9wOs(&J2)<$8`%#f3n7ji}%NNqlh>{|?#;((~u0DlQ0}%qN ziJXV}GM{n(yAK)}`5)65iTXK8IUlol0s3})AqEH3x{b)d=CW+UjqySjqq;|8%Tesh zUt8<>fmEwZ>yo%FshXd5=h(0pY+yg`mOX~|(E7MhYWXlJR7RY_9QgzHzWS&x!9`t=X(?X*-9 zE~XozOg47J?mPJ!2`Go;-A+1snPE%AtOb-%;jwHXSyAY<6A;JlaxuICT0c6 zQ*9J|?EpFIvI|bGPg%j+w!c=LnWCuYkcTg$nBN+jd=gIJWxg7*rj|Gd#D@CfmS`al?s@?A!{#2GI)@EFqFIMvU52ge3QqIkc&Gstx~ zHys6xX5lNt2@5IIOWib!-_rfo?y&vl{n>0u_xY=aC$E&WJ)F0#nC|$(mCfg(Z_KZL z_+983U2^Zi0QJ0~-dHV}a`7mdNy3m;<-IK~z(F&e{RG=KOLF@>NYiHkC!P_AX5=N1 za*y{nySj*$AWwr5C;ruqK}d}3c}!gTcn%E5<&2P8)dyl|&(wJy^8SYK?vgxE-(DpI z=fgzHllAXQ$mU8k<=>3oydlkg&ti)wte3sSlCMlUQIya^g8E$GjWTf`R6VijL(&u<>{K~#tRVaSxlg&l2Uuao`sN=(Y(MK6ZnozsdQO3iq0@ zs6B|b(!1&L2LLiu(=}wcSPP}W;eoQb(OSz8fEC>z!*4a3E|pVvdP{6(imq{1g{q_r z9;5pIILe$!*e8%P}WbX5UKRwk(o*nIigQrMz8GHF3sVZQ6Z(GY9e1X`p2e` z;o#&?^4~`jc|D`#OK7S+cIZ7mC5Up_$yz0~l)L{1YE(&M)NPlBQR>}2Dc?cClA3?` zo9Ft6(<%nYvkK^z2`!!m?iY=BT!cU`En$|vtk>NK(BSZU{2KF@N@DkB-@_Z-ccfs? zu8JX>dr$Zd<}2Pg+z$XPG}3*TFYis-H~uf+{>2$^ban3E`}ddXzy9XYo}@{2zW{$- z@B9yJ;Xgdta@AOv*}s^w+x@Rm7MW`qfY!?Nu(+XE*5WIP7OZ=~39MEimBM)wOkDqg zF1#zGz-pp2YP!Z_OaanJr9qzuw9bd$>Rf5=SwTMzuZuT)_t6XC-Z+w`Gv1T)J zsNyHRyO;7;Q(3?nSsf-BJbtt%Ayi^NPYEX4<<+8Il~?YuS`8`ZHZNUz2|_w)-$xHV z@9RTkGx!1|>bq;(q>}EqnVd0-WPN>VT&Cs%6>8J@j0@ts{XY-`dq3gHVV2;aKTD2! zgqG$sr1;)@o#Vk>$85`_sRFE_ZKyv2ICa81a(`zGWijeBtFtw(Dbjmo8;+(k$FNLH zinVAp*FBgO?nT^sH~H@8N6rIuj~KEU){JIHquf^60@(KTfZanhP{8-Fxli(Q@EhTj z7tAIz2FSo3ZXe5CC8PkoY(lCrCT&!2gN5ghEPyErg@?qCfpOugzFbApG`33{>y0<# zvzFpV(f?3D2R_{skV7TnH@ClNGRsNNu%uZe-Pcw;;pW<>#|Go9459| z{lIjl*n?fuNbqmi5cP3a?3JD_hRwmx&*a3T>ux;`$voY!Z+B^BJ=TI4NBMj-IufY_ zIm&6C9LTy$h6q`lrMo9|m|xl;cIrj{%uXnyKNDzmnyeo7(@Zcd;nZgWx-CD@eKa3t zX5s?9Vk#62&)bdaV;QkjTDwMjGc4rfvni_=Pc#zaHw(=28E|_uJwwk3f>FnlG@091 zC~zTN`dB>uU90DIxv$Syo=JF4ci+H=emG`{80n75RXQzrP@xHi5lW9szHfu#FIqDT zU{e#)KJ7X?0+A<~l3FI(a7IDexZ9U_;P>-9ZwgND1lx}hPznIMmd88cGvyR%|4Sy- zw+E{`osR!YDqS#4YtTA8P@vTI9dzNqhza9$iinCzJi)g5SuU#ycedB;TL3klu0{or zqBObRJW07Gt=y{c;N5NGIhwR)$8dH6263aZgz~^UWSzF=0c3o9(SrCW)n)zwsTofp z`YQeX(V~mx9nRSrC|Zi6ZJU#ZXXAw-(O=!lUq;Dn&zRc-Z_F2dkev}ql8{+T7CHo< zzSOIkt&I>qzEnt#eY}NBC<-0rDX2WO$P|hHkg`uy6o1U#&?UdjTkj!KPree|}duTmEq;=kDvjbE6g?w&{_zP0as34l&NZM$u4$!$)v5Vj`u zU|>A0k0-H2=yseLY2D;g2CbFy)8{t3FWvH^nJl>TfIhn}gYUahyx*r?DufLzsy{_i z6iL^}hvBxt+2{(ZhV z3)p7%`;(ssYq>FM8S#RJ6U?BG!tG?b0`v3r^$n>J7M#DV+T{Y>z{ISmLbIBY%|B3; z_`-KuxkyP-I;G)_urE49;=~gzH8r-7aBzSmw{*1DRi*FWe%e}`3{Z-$sAR)q{o#Z= zhKszsZ`ohJdd5uF+;z@Pfy6XgeFq{W#dHRA|MV%qJql9GZT1 zncxH``VLK+aG>mrb)D{H6@P&h4f{FPU!tmD!5Ch4P%cTWHVVo|a_pU)i^hL~(NDs<7{j{XLIY~d> z1S^$c05()Ljud~pe6%W*L7@$(zT1xb~l z^PKsMkUN4*x%NuUBic(Fcu0bv8zsok)XaWGim_bWgL)O_r^ddxJS`)@ue#|870|NZ z84Un}wP7V*Tbn6bA}YWD@GqcIf+)ymjr2@Rex!CmfQy&R)34Jz2(MaazySGg>4N0u zD1E>Fwf;kn+_RnEf?vzstzeyiR2acOD~bD6^grs2Lt+z^DmWVKkoSN)N75UdYGJo_Mo+%{O-pjQdLXn|%S(7>J?p!v(h&O6Kb38qXd3g9j5^ z-&kjc6g_w+eO?QO0uTOYX;mSEn~i|JL|;|p?a(y=m&4ETku3{XtPis8{n*(%u0;HFG)L$-gzG=wNddNDRD`gO<7bIZ1{CbS`bww~}J+6%3GdOk-aDsd- zrewS^YP`8D#u9EUYw&UWA-?F?xXqK{ypq)LQxROgaG@(;ct_pW5M_lTb|5wU=!q#a z=*VCYQ=6FpD>E zRwpO5TcElY11Tdu6?^tgL~soe!wi^HO~i;pH{AG50l+64i#mvli9`!fege$jd!R0{MD|(9Mi zxb9sowTcJ65ea+WYEjdz0Cm5+tsRi^CMr$jym0-Cq*b!OLA5$|#O}ix$oJWq!nAv~ zSB5J>M@OepV~s3-Gw~CA(Egl^(Qa3=aFtPx#(O=`bv_i0J(=UbTkIzgqF({3jMu4C>6xt8MtBxj$~;(Gcd! z;epHHTzDdLMH)gN)6pn?$+MCL5cz*wH@0z^M=gV({7;pVhE$m;P*++s<^aR#zbqOp zD?*TX;k3OrFI1gCA)NV|_J=rn$-KUlo^8L$`Droiiw0v{-&d`aN&_G)h2c9Gw%6z5 zBWbE8v7AM%oD-rC!fn^c#f<264ao&E6;Awn?_dr=`Ytg*GnJd0v)Brr%}-L8nw43l zu()JHHC6(bt2vlBB|#tS_&~zPKUYCjpIQ-wp5VSo;^G%-K;?@xK#M;A_2kN>ymMOI z@&g6Z=fjSkzd))oikm#S5?Z?~WW%xp0r*%Y2OJ@K#`C8I9B!wbhzhC#VF`{rI-KtHeUzd;gJ4vAOf*Ag=Wus-hV! zqYpfrVLOrgcj&8)m|vnPc@G9>b|Dx%Dn82@Z&_^zQXn?x-rGT1JB!F_94LZ;m&C*R zJ~@W~*v=a@_0n{%3O%%+4L$n@P?%M#+(;Z23QULDlGGXpk1|ebqLmAdv2rJFGvpp| zv*pLWZAUbq)SSkXkU*l>s`1zUDZDOq7vN;7VA%ChI_OL_03_6YyQL0$t6eon6V)Hq z$aSh2Fxj#c3>Zz9(Ul%Km)PAP@6tr;P04WE?WK>Jc^)4Q>D>;dHi|*jKtYsAj?n4w zhRWx@Q7xRWZUvtKF`lZ2LFkMSb3daql~O@o2tI7qpk~GC-N8@D{g*cdAv3(vD@GmY z$KmvN`tJ;u&Y0Z-rITNOmTjhOAHsAS;8<@qAX72Hf0t#${pc2ygNfZlf2z0m^8S13 zl*`>3W`9LOT-Bdk0_}8=y{@JY0A)5J*8UU9%-K#)eg4Y%_bK8Sh1JHe^nZI)z>d3z z7{H^F-e`;nj;7Ndi0;kxTvsa`6E}XB&9#*0u6njIXg*n)aw6g}+zx_YnZWNsKuZcZ z|3zHwK+$hp)6!uZ8z+Wyo5>wvc$=ec2udLv+|)T#qrt{cPs|g{9T;F{T3K8gso&Jy zw&;mr-pfyT{@5z{f0T11;n%KreoA>lNtpuaV>m&)2bT_#Hm{bDTN@sH+C}pMfni9_ zpHV0XEp0|3XTo>(;;l(D^d#=e#j^bYZ_6Oz^dYRA{S8&sZh)!L8&95eZ^!}Ot8e(d zSg8wT9pP@iOyQ>mR`gkoVf?hAd}zvHQPT*~w=q)(ufR#c?2Gx{a*2G;1=rUFRWuuF z9vcI^^SP>Vx2@~eXDy1L>b#!5@dFOkbLb6ejOz2K_^th3MkTOK2>_!!+8i1oNjYWd zXtZ^1++7h*pil4adS`QVEJYr)9kJ1zbvC0|4L$dYi4T4LxTxq)cBSvB$NxLL(mwAE z`*Ab-h1U%+SlH}U^orKBAVC5 zS4E1)x)v`*a^=Du`IA~Z2OosR<+k+H9vUfYb+94zMy@EMm;X+fFfa3QnxpbONmyfs zL1Ge8UGDJwX!KD;PX`g7R9VNVEggTDHJn2UMqNY;U%uu0+Re6B1mz8OtO zQlC4O%#(*O$2HF||0Da;+)l$DM_3)sD$#MTkG9HU;+C;ZS)yARtVzo#(B5SB=xS@A zH{O~dCY9&e$v=qp+0mi_n1?5+rPBf*1Iy;M)f})Hn0k$#hYum-lp;E*wu`?2My|F} zu7a+G;sx}5Kxsc1bf4Kuh{sft1JUtCdpQo9KxtD$lGEd*z+W}mypi2+rrSQJ|J3#% zV08BT?2iNK|4JGe`>vOo}Y}~k@`0Cgi z`KFd>@eaVrAJPu)Z=eQmztYt)nuSWQ1AFK4{T>5t5_W!Y$7;(dUxtI$MJIM&b4amWTH z?-k|ecO?Ig%258Vgy(?zS}zz1Z;D1ftoX0o|KkrXu=v1B)+AH z!D8U-o%k-?YyIbH`!zNo;(&Vl>c~H5tO@-6pVRIv zn(&fqd)ra59N(QvsVKq833(mw`gRhu0Bh2tk3z37!2%YaB%#r?{wH6S9CyZPs93!bB z{Pw%P%F<9B8PEaj7=-g8zy%zwnviElFvu5ds|)wy?wnX%+1wl8amR#{DpdNQo-H<) zO*!N#(Do)$dEqkhePK)L46|m5<6J;v!~=nNWMHY3j+)M1T`Vpy^_M&E1SD3Qal@yb zzx)as>e{Zje1-Tv8Ua|XYGA(JWyV;jcEJ89j@d&Jqt4{Ct?af@<}Gt|Q49d}1>gCL ztiPLK@d}+93#kB;HRtxKykUQ_>O_h=#cd6e@&p z3M5Pd9kEGpOcK6&4gY8I8v}x5M>V~XbptxxQG+%mUT`$9w6?~^x;M{yW6Co3M2LUR zp5lXh9jU6?9u57M)5d$l$c$}CDM#-M;80+y1~>__%xwutSSaWitV6Tgkyd-Eo@4=% z>8V$r-;%r^hO*vnoo4&Udia0}|CXJG@VG6$0KK z9|T9J6<~o57ObTA>a2cag0cM%ICS@+b6*AW8l(z(-x?q)y_~NB5mnjJ569v<<0Y%l z6i2Eu>HP?J5Yt~Y7N;1&UEj znHD)90S1ITP31KTXNqmo`S!%9y5aq$%AZSUJ+sC2%$U{LPwRi%Nj{u!b2R&5{tq_v z#?UtIpaJe(Y9e7W23ER~SrGOI>Gx1KF@99gY8d2`W70qw01^2NjoN|O?q0~fTrY!V zFE#A`0PYuF&L{cuJ*4I67F0Hs{%9zE+{RNjmW!yNuk+($erzHFn& zmfG>rgwN_tMv4j(U`8Ph|#@)Bg$$w+}ah^E|*9lX`}TDt7aD1!n6~LgaFFWp>4Y7fH&@3>`WLS(RcMJ+JL4(!B|b zsosFGI*1B~9!K_ohOU%~WT6{!6b*=@b?aRXr|VlSR1kiB%wpi{V;V_!_8Y)DL@~? z$o_%(X;T|E6*<`c-+LT7gmV>!Kqn~RJ0c^M?*@k!+vQ|W$lLEY9RII{lHlN3A>)Xg zPW$uO^3Ziixy2<6ZX9)AU+Kn)%{Etb`1}u$(3JwoUs{z~MddS{7F@Nu(5#)0x%HY2 z=oliW<1=T6C7(dD=Tgs^t?GmlQY?mC|+sWlWM(U-C{I`0|&B(@e`l1 z{eIzp=6I*3H={W#Oy7=@^8>)w6>or%qgC;FD0YIq0pvtGHK<>jj?e-W6vtKQ8IED~ zE*lPnd&q#lqA|m{S~I}E70O}DgA1iz3si`SiVBLId^^is{;eCn;=W{2$S{TVN+#IB zFM^C-AL8Wel>LEP7+IU0pM_L1$%e(CX53f6+#ZtsuDBSviJhE3G|AL(hcX;!qM?yA z>|$JYPl0Zu&WxAQxJCQuv{1RBu!{%|KA<)?Hxf<~FyZEo_UY8b0C>Mi1=3^BImk$q z@%5P`T->LlZRC~L@tU!JyKd^hF&h<|_OM zL7^d+EqQ|rMydNyPoT2pGIn{m^GMTj5?&N8I1QNY9-XFSh8*pR%h;8SLCxS`I+ZSG z_>=`|=4ct)4R(I+y|`-!)kMpn297N{8VhJuJNrRh@hCa#{WoU~G~g8C^Q8|=fbBfg z0aOK*c>KpbRiO!Bqg$W=!vmP*NXDfn0v)U^h3$6{z*#d!cEe&a%(iltve2M-rle1Eo~NS)2i{CT!Vlfq)+F|`v2(AwK~H=-GXqkxeN zM!oZgHIL>i!}bP}TZh(m1WY8q;8kVb#*Ij$AAN6 zD(VIcdKiGHys;G98Xmt7(jH0hoP2JDSleEI1jq4t+^!=*{M|c0cz8xybPQo0CJkzZ_T647pFd z<@g82ai7xU7w7}JFVcLx>#^}O2NfK(?PxgA2mK&{c>K0y*g1WZ(K`MI*bi{lzhjlE z|8uPJ0^$>b0Qi5;|1(+Uf2ooN_+L{~(_z(CR8_b2el<0mMt7p^X4~T6cxiDLW`R0i zxIp?kzWYNrR6roA>ngigGh18>d^g9BK!o|n&D=#sDB6Zx;a0RZaJJMv=UZDe#IH;A z$p#8$fOXsRu;)1O?M{tzD^TqXi1e_<^_2(5^46wN7cXc8n9vS1e zzGjZ2#V~6_e@c=wSwX32_Kt-}?fc7McWpE6H#y%*RlZJ2q)Ukz3_TA0@J0`zq&ze2 znpWs(#@j$SiL=X_aJ&vlLvnuyw}qmZ&Is3i&JEXtxOl65-t**NzmUC7ArCfCH#UzJ zRPiy3FhWyZ&N9Vc>3yb|xmmU)E%C?ohLX@h_9a9vOlORSvziGMOtBBRQI_K19Uj4;FV0Du-s>X3=IoFeS zf1EunRC6R6^m8|qZLi@O>G(Bj%3b8rv6*L-t5E7OW-nKGD+Jw_H@==19Tz!Zs*y_V zpPmjF`-BmTSsbmTNp8I|PDmbdo$>Be(!}nYk;wkMOuFL6QTaC0r(UWFB!XVS6y*54 z%X)rEQ{;-RWsPK94A&7S1;~LzN!a^_WpfNv#Y`$(ah>y73m4 zbn_(iEujtS55Q4Mi88j3)Kal@*C)h;A2a2|G}?HU(_v#-YYqdq#vBX!3TEz};2psd zPO}Zy4K6tCAFrfha41sB=QIX9D|x}U^eTy)4V;tPPULfqgPxDPn^H-b?U-{#i^VP{ z3Jsk$e)(2LzO&NG?oI$NP|0nu0crx$5#3)AL$_{hxILyDBZtpk1|1-myHwE|F=T|< zUlU+qAu=(SUdlk7ARp2LFhnqvWbrF1Ygu!Dk(j`D?3n+9yKUd;dRPrEf(R|1ilBql^{i_f1YKl9^pk>V5E_* zeA~G1Spj~@Ml<7crzFC=I4>MV1IB_{$;Cw(io-j%;-ONX-ZbL{cWTwCscP2`BaKi6 zLx#sR_KV<7=t2it$q2bcw&Y&ssHEl(@MVf)t;~@-TwHcp`E2KjKE(vbl2gAFpn#vb zl+%)b3pef=ooPamW8w7?1qA%g6Kv|_`cYel^>;5q#}aSCT_P~R0rzHahcpPa5@m0@ z!~~^w;javnjo1izQ!_($r9eM;J0qp90Ku=fKa?=bN)6bEll98B*;c_59^)5O^0UU?Ge6|v%cg5x`c63E_*Eb4YzjUT=w8`W`#;} z+7QYlA3sYx!fB_k)Jf@vGNs;;0Hm+i&}-_`qQ~ zDo&5%G$q{=kI*f9=O(HYk5S*BhkL85IVWT1EBD)vm)C2P4$5J(O~T1(Iy}NmWtum< z%j~B6O62aq$!l*kN6Eju99izJKB~y&YBSI2#Um;Rfq0C*$ggX+DmvTD ztod)>14$eFF71vbnFcU>ZBEAd;}H%KeI7&wV~S@!GOd`-aOs$)6{Texk6z8OV@Wyc z2sX7{KkwzT&=76x3E>qnR%ogf>%=almoCF|Ur64|UEY0n5kc+!WKbo!D(x8}C=6ed zB3#?ox{5Z8r^<<>LuyVG;ZAKSmYQX4ZAamHiE3?5h{4&D6NS$nO?xxm-Z!CDv%W{s zGq3QfQL?4`dnRLslewQ(n4lp(bK9J+e|LjPmqtR$906{;_2N%4$o=)pjdqCkizE{C z9{QX^8W9$R9UViC5FZt<`FV{NYWXM6%@&s`=!Orz9iFYQnEGfHEje5}Y}l3T)d`-* zk703tAD_>%u>53(J04P(VSGuHYHiUnetoSIu3?5+ajEzBz?c@TM#)Y$%t)j$_@{e( zA!t~&wd{JG$=Z^Z@~Q8Bril^y{@RKx>fQtEAZ@b&GYSXaTP}BX_aG+jmEKFp27SgN zKEc5BntX9(|rN#8FdR<*M*ZEKE3X1K3$aqR!V%lHi`iPtF1_LQMf?VMkU7N@ln)(}76C@2402`Kt@$M#I1nA=>2@*g3EJm0$D zl$x7Mz)Dk4vp(0tOMN;sReB>5p*w}O7TVJhurQ#RdbjyVqs{{f^sp(a%J#bN{9DOa zX)90OJbvL#8HqB4dc6Mrh4+&;v1nrE;LGFpY-A-*@BeZttW6kvd15Gtj{n;mQ2zfn z{O5f*PMVCQ)ANhUJkEtXqMd$r#d}~!r$^)cWZAjLNf)EUg$o?1?spP-uPxm=J-wY< znJaUoTY0_E_@u#Lq|>?7b>z*!T`6j&-1*N?^87T(t*&*?JSIgl7&1U$!6J$ ztxF#aPNg)pcb5bysWwb2URX^MpzC?5l;|M02TqyxT)EimK;b-5+Zl|K&tKEhK2vju z5=UYyN@$JyKbm{%uqd~$4HyGa1W`~rEI>-SQxK3wx{(|j=?0Z zhR$z~dd~Ts^E>bRz2AS|xx9{-%FH~opS9Pz*L~k>KZyboW{k96Jnk9x*b9$6?&tYC zle28{#MCdBUz}`x6=}eis_r`9L)Vas%?(A8PNFL;b6~K}MGx#NTA{7=!zm)Qy}(hc zy)2W|HZnDBTKjRQ6IDqp`z2Pn#ri!gVb|*)z&_V5WwA%Q{4`7=o&?^|`n{8C_T>+a z?NDdZp+%O&bO`-Duz|n#p4zTVq;k)^OiVc$tI%e5ohrf)Z}+o>;se0+!}sDzv7PbP z0co`~l1&xncMUPognpVq!euN-;`meUpm*wtg>A>;tJx*hM=hJjhG#OO6OnWj z_dbM>`W3!Eq&qZ4U*?;{bhI(gq$rXfo8`5lJ1f0aq_g1cOm=k5vi8T3*_|{9E32)! zO6!rPTaZf@rqDXxT2F5U3zJX+Ny$>B`~dTrLhd48{}%1rEHurxbS$O7h)Jdo#jyC| z`n>tp+l4?sp`ImPJCfdAEZPV!lYR>012gq*jW&Nc({%9IW$$jiB+}S z=IrGWNt)G0qXVTpb#~UeS^*)k`qYjlp_XNA^Wp&>lQj=|;0?YD4*5Hpn_a^`4zImB zlSK7e_~WIXc+d%}_;xLuq8OYjptpw?+(^oHvbwCiKr%Fp-k6Mi4S+Jc{fcfvU?6U< z=UgZbqtO~B0LQo={tczwpc~akMsYfa+|zChYeE2Kci#9PSMWMAqA+Ott;!HVi?esv zAJA9s9jKOu%d}zE_NkSJ`SqNasOY(+O)oaC`g7TTHnVin6es!NzHdFr6ZHlzsdF;Z zoye>Qck%ih@#W(L3f3L<+V~VflBwmd(luy9*=&7t3t1cEc474Hyi8dd8W(sRBVNrf zmfg;>WK$Vlb}wC9nNCNJU9jZE^1?l=aRA;Sk zzIRE!?(}z%CzZ;oULdzD`I=~U?29bQu)!q&mP|GSzhDxmO|BfyD%;`2g2a&~%MKW` zpp00D;D1o}6+t7c^f@CVV*wCiyTpjEw>?l-50a{oU2$;4%eSTWplsP3GoLLaXTyY{ zu&{VdUssob)_^-&dF(v@45texIoZ+clTPbaNy^)-- z4q{2-b+j%HZuX#&P4c*G_M<^t8?sYXl2Q}SR)|K2b#6PwLsSq5`Yj312zec@eIQm> z4RyT0zH=6Y{k5wKL?!jgNsejjXjuKtOO0P27{)Ufw+kDJkrV9_~Am#N=7QN78 zkLXO#GYL5?z4rI1yKsIi?1`c>Fj&>EKovsc!v%skP(GLs zo5NxcCJsu&Q@fv#gDKI&-2rfZmV^1wpR#z47DO!vrPa+p2 z0$WrjcRI=GYRvJ>X&fed`-z4;N2oUjA;+t>c|knZ9D*;gHg2I@Kv%Odu2`&0C1AZu zb_nHg?AR}HSRAn`Hc^p+FLoqpY&|Dr`*u=D=V{DLe#^mjal*$Qx``8#Co?gmY#x8i zEv!UP;@+z#Yn|}HaH8 zwD(nR7?ie_eAoDcQmyR5T!lMhn!`(Aht0;$?H$VyKzE;o~Dhw>lbl z0Ld<#D=Sirs(l`^dB@vuGU+{*{t+RUq^-ie2nA7)>H_eOpU|t4kd7outqD~0r{k`d z1Z->&b{*C&TsK_i@dEV1!n74W=oO1MxDpbB&-IHXWLM76@HrDto970{#N=L>OI0eM zGfl`*8h2f}{jqGm5|TkN+hrR|pnDuWuf4(XsGfBz!(CMe6v~ypl9D!}6J+lNPMyb~ ztvVJTN(jr&>q2yb==UI-dlZNyJy3$lc)=fd82Tl;t8Ji-P(rCGrQ+GnFMtJg`J~vC z&+(q?PAtybHjyKip_qKOAVS^_P!Uz&6n{WFutSkTofTwjCFKvV%;|kq-5qL8w+7e% z^@3GG@iEFA0zU{5F&T4}&Q5@~$AB{BTxNt{mz~0_*c~v`k&Rf`#AN#M!i&eHl*TMA ztFB~dZP~T0_sua`Xy;ot#Vl+oTgH7z#ErHi)v1_+Wm?=wenf09U#}>${|zR`;4=sa zaMJ}3osTrra{sFM1~hgAHaa~N$C2;VIQlr%1UzATTsS9fNOMY#)%IJG*0UTd)h zEJA_Rf-`6(Mg}QXP9E~#wn`nv-u`x(=JaisyU9wnDvAcBj3(Xe?f{t>FF3UbTW3?0 z_GyY8Tz$VAhp3xMsyp*OKNkT(3XwHz^!9GK!}JZqsT`j5RJ*pw9ofe)_-bpYIvw`MOd&P>J%J!hN5aCyxL)xTRe53|_0s_kM{m}5pR3i*sQ zcp0E5-;}+*yXFuz`Qjn!#^$DPK!EO0B-I@ZO{pxIbSB>buEUp&>%su3Hd2W}72roR zZUgyR0@KcLiD}m})62^3^T7`Q%qMe~_9ibDX6%XbQQdkQp07=)I9?A~z31Ey$G_-Mk zp~InZw^KGL1iU!W98Q+2Q5&!&3*4&vToeCc@~DB!xkA+ym!k&aumLb6qhVcBrhHz~ zz6)7GcnvYpXiZ(Bz-~u0jQjpw|4CYCDGkAn+ZjKTo8;D24Co1XBBL7NkoHZ|3S`p8 zb&+l8*N+KA6;8Z?3h^zW;qg%U;jL5(j)bD$t6h!ZR6B zhk}w9oFZDL)3oX|{55+Wk<+&scd3<>UcAsZc5j)bebdvbYc)#9QC{6us_s1+9+h^$ z-{4A2lyxH11jCHH&+ilIJuQYN8Kif-+baT1%TUk0)hLYeUfb>V<`n+&SW=DV=e3b6 z(PJa?QlZXg47#^Kf;I|2x-2IGjh3k48749p+69N5y?3K~%gI@{dRJ*&9AWdl_2xQL zG2h^ONikx`p$i^dBi)@vozN!LM#19(JF&;cijJ%5hUX%oLPw8zIFQ8BL&|*|z~|B# zTbd(Hf1Pja^N=6>mQXo7gwzuR;1gd~F`ZH#T?})sM5hV~U`9daPHC>a<6h9y2sRid z2@#*OHB#oi9IcJsU?#ncxOMWS#jnb{UD#$*H60fytAv~u38IfW);1t|S-NjX?1r7o zp!bDoKqDZZX49lEZEnZ)y<$$f^dZf3mRPM6=jV9n@&&O5fMku`)gm4@rCJqHD8rfI z5cKq!7j80F=dro*F$;_ptQSJGy&G`hH3`YMnpSs|RVmol%b_x1rwq5p23>^)m>s9_(;q{h^zej{1&(6$6Q{W3-js50V^}eS3M{T?1LlkssYYZDyQ~i z{r~SIHtJ=sf$Yv*j4GC<%vH|yD}*(vO*iCLdz>4rdGl0O1P-K9=uGA zdnRtZ%8d2F%Ul7nTlFPpBL4>6dGuHLsc6#6)Z+1zi+Xu4Db(Tdj9>7|V@(-rwL!9r z-DVjRH0uwyet6#Jud*!0j0Hpyn4o+1e(U``@^~#kES;F`v^kA~DmS~R6!YkA^Yw~a z3EmSwUjThJM8(_fG`*?-3km4IIIhr~l8aX=9R7+;NbmQLx2s0Je{8e(H0SFh6;VBr z#)5(oKMTGxQcj>BWYT9#i87p{?0D}P1KGz2iS-9W9R68WHS@uPvB+i}4|nef??g{} zx3W_1&X}U?4QXbDG~K?`zKNyp+Sa9NhtvQ&1r-NyPebowL45?==2!vDN8h5?8)R6t z?V0FR&78KD2dDrN;vhRtPRx2#k+)ORgr%ufzdE`sy4x@R@nCZ-!TjKy<;uP=Bow}a z61vdYQa}|h3bjiAle#L$fRfpq$-a2_)g(unl4j5OfwG2f5PEwpkeVcjxoR|u#!D&KUTjo*-Cw)grNiGmQk`f>B)=Bz#|QZ z#~EJamlo)6rO0y}aF!Z&PE}$cs8tR<(A;-w){rc)|H2k4G?ky7!vWW)G9ejX{n~Ty zu-JHruSg=jaCkh^wBwd@kuIj7iRs>>j@E1HZ$_(bpUI3{S%E%kcC$?FMC*u_tV~Zd z?lh=JdhCm4PhX)SH(-vC=)OjB-a!d6B9(I>y7410_Nuo^geZPf;M6+B;DIU+5d((i z_A3s!?cO&OI+hbbk`BRUn=FTr`EI?`D=Xv0n`y^ASv z0m6ydi`X8{)b&jlW38-;0~?&lGJmw@uRsa3z%6Fjux6Bo|v6}r8Lhf7R3P-wvRaoF0U zuo?@uh_FBTnncya`JtU1B4%uCY!$bMsCT(17F}5QtIYPN{qR@DzEmC!7z{a7bx$}= zxG)Jq+-7DEj&J3`&S}>zY46lN2XDKwHXYEN*lpjJyqE>}m}WaizXMd!nQ~sS8&1_y zd*O0ML%p>gAQj(E4xa9y`rj&Z(EnDMou&>#P*bhE?cQ+N$JK66BEPe*?e2^ljpe>l z_kanTo?Nc?C~t7Kr?E|`R0*nikT{jyEVNCJ)OX1Mba9H_fTPMqt{Pp$JyU$V0EFrU z$}{McFmdRE0o|i7v4#GFKt7HwCf`qG$f|Y_#oqQgKnJ4fo^_6%eK{7U+QX;!aaM(a z2E#o4^)@ca5zR~&DG$d7@M1|KrH0XD62ta@K&SZiOs_w@02*;r5e=!?1egBLP+inO zZqT4rQ8c-AVA}$E;(K~xee?0(_s@!NjExyhZ_hP>!i=Cy-t2fd+a$>-GrA2+p9b!c zAN16&j%Ts+ggOnF?_clY`HShev<_O+ba5(%oZ@I2n;Q4$-%6BFl{{Wswcd?uE9=NS zuj~$a+QUZ0HoCxTb)Q&Z*cP&@a=U-lZLY17Z=6MqZea?XwVLJaJ0f*Rop9pT$sY$mLB5n_X8}BC9tN~g zUqXq{xPJb29A{jE2t=vYLa~OxdC%2$O64URdxU<|rvjj_P&(|1bpCs-<~D;p>F@9V zi2*|MLc+rXp@HZ_-xOLIyX|5JmuHi))T*q}Ka{-P4It}Px`5!MWnW*PDB_;sDL`fBleF!wbu)%2ddP~RPnx>?kUUGvUIB4pnDZPTxx}L z`L6YtkE5J9#TFe0)EVg)4*{|P9UJ{Foc07!(oOGx8y4Jg^h_Kao|j=pgHx^dlL3%- zDuiVfMShi@P5@M^L1~uUu*w-C>m&A{4^*N?8;?EdE~q$Knxal-k^pa4T|`jvZd^7k zmZCNNrWr8ETNseg)|MpeKc)iJOr$1`vu>z=+|T^k0^aNiPo&Hx6NTi5-}D5>g!lgH z>%OO@&K$bLHPh})R*nHfH*i_cpMfly@p|_u8A&a)-D{>>L+di+O({8HhQ*D|wl;^r zGoTaY%cA(?b`XLhTVAj&j4aLXB;9Y^{M6t0E$%vJRV}c zO!v2t1K(Cls#@o^UTMV>4X5@>b+2w~A;FuMs9zR5FL$BnmRwRgYaDv%vS4Pa*Ou0o zD4qJ9u~Hj5AIJpG5Hu!7z@zc|Km-eDrsXe0j_SKm9HK!SYy?F22wy;~7M9~dAAYy5 zRPTnq)TUUaStyvfbL^W#NH{%Bpo501$|RethEShSE|*9c389~U<|t8HVKu7xxsV#1 z`gTn}^`5*;APNFSVgU9Py6)B=L=uqcJyBA`LMp>He}FUBGEMU_M}0NDC?W)LNgBKy zz7n0oF7{pMbJ;)cfN7w#T@t`UhgnQ_oCJHb&Joyw zcFQjLQ||1$;H%D80a1lf2=mBJCf2bVPr0-yfcf|5hcfL%JOM4`1*78~hDP}bD02d$ ziDkSO$a&a#e%EG!XU8GW#!N=8EaI+YP`Yx#J8C3_2+={KsZ-P&ktPY$zd7M#WfMzN zIj#jE>lT@;&XM}apKDC(ko#z;bV+qmN({1Hw?M|c|GRGxyGu%;Xx>|WWzvAYxS$ax zlQk%63oHR+%IrW!7Wb1!Eab8XOd%{h9dicnhJ~?0VuE|kLh_f`-IfyT5U$UCBWvZ3@nTq7+AD33tr&L4m5rI(kZ85y&=R*9C!RGbP zXfz;YiRWZm>hN4(;*F$G54oDa(Jub7y1+G7ZTJMiXvi39S&nr)=e0Oo8IM8c0g6~9 zD6ssIk_g%7(Cp5j!<{*Qg{mm1$ijJAeUOtkOW-I;Svem)&`a;1a)paG0BQszqU(Gg z>lX_n+lm7I+eDOTbVe(x)xypF%s;0y2SSjBSU%AN|95K$E-)kTA`Fw%@BPu%jjH9` zIsQF)sLNhK1St|Q5NWTiBmhrKLlf0VH2t>mOLhA5rmLmJjmDswZEq?#kp&z1!Gd5?U}AE@uhlUH{nL z?4>Ozk49YP19anSkIBis3mU%9^+9Ruwx=M+jZNpSyBM=$0i1mLLS&#F7h1puw@X}a z?-4$rLE()v1JA_$<7&g|i+ zLFouiESRGV=|^83k6q;*)1beJQln`~ursu|S1R~sB;wBvnvTeZ@c!MQgUjhfhHktw zR=i{{wXfU0k!PTEg)T=)mAY&HPjx7Tf=Xc!`-A?L4%_>c=Pr&_C|t1?ZZBw_g?8qc zEN~)rIaz;&_Q2YdBdD*}lJf1tjs~GipF(vEff9drG531zaM9_f`X6~)|0Cm|$VzNC zw`UVaC^k^gHPIP2=wD9c{r&|6fxa&XE{Rf2Pj7jGbWOB1S)4)pW!#*7UWcc;_W$^okhO2QLR=)5y#kThL z=HX_qVx|T~-oJyP9l#n%jQu?`Z5eI!Xit&=tI$&c1PAM3?`Mq}Ta6OT=qy9``OGsR z-{I|6(4WeLmuhDV_Z=X}9HeLdNm%6jFH&U!#i5HZz1 z=gfP?NEO>Z znq4$~dfFaz?id6}p1DP(TOUAD5@CBkxWXUT7Ac!0-+(7(OjQ#Y0QmqrQxiQYk~YQn zV`N{F0`_embzkjr;6qtV!jLe^PC|7;b10A>+nE@n>eR$+JM?H^GLvpFh=z*4nDOFnmF+S)^Pfwet;E0VN1_>27@*fY$4H zDy%v77gYe-G&b8kE`;FFY)QJrkt6HE_bOJVCCF17CE zFL=Qx36FXa$yvNKw~RfJAJu6U155#_AC6#p;d1A;V$>QuypIEMYriRGqgFdswXE5w zwso^Ohf9K+Oy{YsT9thox|K!CaSxGcefY=jZ$36BMr>b?lmD~Lqrn6#woq>acz7`GtQ}=D)Wc@%xSl^ zD>&} zF^o40oI+ts>Nls-<@?2*r&F=^?=8^K*diN(?$|Zz6)_RQSZ%)mj}jv$X$9t5)Tz3E zBmX#&{#&t=-L`DEsjr!Nr4~jacFyz6q#?-pfS|^Lm1q(_6kr^%2TI!iQV9)-AFw_I zdKdts=zgZVxocA2GmTh)ZqnNJrHvG^>+DNRd~AEGwV#RngwY!Ed#CC@_r(9jWYsA> z#$XE?Z%u1lL`Ya=hL2ir^@h>n1Pz?4fm(8DuIbY!lo1TqJ<9NmyV4^9yh)p$r+j-Z zTe29r)nl_efQ>QIC_Q@W;lhq?Y@7`nPE6JbR^pDA+>ABayrOPNPD*HEU+>L$aJGQW zJH&#Z?m6~qkwS@U>ehGBHF^+Y6`z)+vKIROM(fm>VeuMQLe9oU=D4jZv!T*L#UW&6 z^e07i1!2F3d_di;>?nk-9If1J2ZC5DVlR9YOf`iY>hPw&_I)~8eTI}*VO;*%S>8C& zIfwJk2UY*FD30&sg8t*+l?IoCg^wmArNPcAV1 zH@s8_Pc1#q)RA>Wha)FhlA^FcU9AV;3{i-;vnx;hH>WdvG|rmZQotgNrzwFn|hsAu9q6$n|&_TfuWi%LBIul z7&w)Qg3Zj>!e|8j?biCY2kz-YvK?x@BlQyzG_#2|-H;lgGBKT(Pt=sq*?%)pfX)J! zb%e82ulJT(4Z8_A#Vn3?$QFEQhfa6|5biDjxe!hf^I>R)d@gPGC*rd|>9Cvbrd(~K zqmF?G@A}#e4mYkI*%uo*c3vGa>WNFK#dTN#R_nW+Vcl~1jTm^iBDVmnQ;E8{`4`5* zaXJ7MsnI_*bQE~if7_giyPCfK=^X(sbYwLsi~A@qm{Q6 z+bY^R>sJ3*3+szG0@m&K;FOq}+iK>;ydTQrz2At5!NBv!;-qRs6%<%XSy*mi5eT&Z zBNMJpKkdWGe3C&}NiP-TUQiGy#rCOZk>_>ITVLRt{sCOh*X%z>NOlgt20Gq@{O2LS zKSQVMoYd#&h3nrmimRuqyZRi_#A%Rl_;yXZx8U(m;I>|9OO95(uoM2Pd!t$Y)xDjD z$p672(KBCi>78@-JpBcmB-Uuj&*o;3RcY7TJd*WG{LUTcxiI?st<&7|@ish(xy={%MB;gxept=aVQ{#Xau5a4-r3UCQhfwaxQpc@1-PF1eB zE7$V>H$1f;P1ATneOCF)V4PY)10d8lxtGDBdJ-TVp{8Unm@i?;_#(pBBEDyvBxLX0jQVc!9 zK}Z(jk|uuutpBmyOoOkK)coW^|7qp8>n7)5A93-YzK_kjKLDb7Z7TYBd1B1DS{GBb zl*F0R1rO^VX?#Br5dmnsWLog2u9GznA(@srfyb}1yJ#jbw6hEKttPKQH=Ea1IUyO& z-Dp|A0M}7JSN}^u5uC`F_}j_5^>ZHxwmi{z`%j-l5TZ34^)m3zgcB3&I>x}bKM!}U z74bMm{vu&eLq>hB!xN4U{O`R2RigJP)&m64`v12lH!$*P0flPwJu0#Eu|skMR)8&} zzcG2LAO+@{GaNhWYvR00O5|%MsQ+ey$Xb-^e&_Z#V3^KEgD8%z%rB94dssUAGOdr>C-~kEnXKn8wTS^J1UlK}fn6-(&JYoDQGxj#S=1=rU zKRC1S&~Xo6=K{gV&NmHIXk!)GkWeUIEdna)xKpzwxAA#u;B!sM^iMj5KtIZq@Mj&v zt;7KGUkGic(ILYA-9UCrwyWvO(ls3)pRumL5^p>U&VLC348J<>eschX+%6?XB)b6K zjCD=Lq5E3KNjx?A{)MU^_V!@X3!I5T~yN#p-0>9Q| zDVeq4n!&^#%~oc5(b230Vl_n4HE3|whTm&VbPJT%jzs0;Q1|x}tLp&<^ZMgoiP2`< zo*|k}PTw&3`O+Ht_oGBpCKlNV=aikSqn{xMk%9yT{ulivL;&b&Q7C@5l8WlCsV>(I zt{Iq2dm*Wg2RxrAO=-WvBapr*kfDGlqKXS_7>EYSKc&C6vm1d7G zBmg`%b_c@o20JdY_Hq7Gn6}sY<70pMu+CB|=)h2yrKRq5-=D~m2H~~J8+{{#AY^?M z!>hCv5uyKovg_}PhyOCJ3wk5slzDd&Gd7<#Q_Ix!U~qhWz3<~D!8!ZG+Bo3iD#*7l zM&k$0Y{clpWqH#^uxif1vi9A($j?sgw16NDi2Y;$Tw)3xOR{%n^4SqqGVMBCKngSC z3;*)Ff4)xAGQdMiTUZMS`l26@ufwIkIzz*nadx2bF{F#}boC-al59_nYRwQpmS$Pw zj(YxA^r{40x7=Pi3X#P&Ece!Jnu13gr;WivUs+XHFMXGsqDVYQ)AlTM=6e5<)qJYY zq^z`5+h+ErkfcUu-_=<>`@ku^#UeS_cxQw2!!W~y$jE|PaA1N%E+QE1s}0o)PW0QJ z17Rt%q@f*IXB9x+&rYOi0Qs3HF@^$n)$Yo$P*EZPq(1&TIzZ(e&fTxC(B87V`ETYT ziRx3EZq(om%hyVDa-Fb$QTFa0_COPAYttxmB-t2(3A-)8cz{{T1>7ze-W*S3cfz8SwD zr3{x(?iMR*F7Z`f7XbGOp;p+Zru5+k9z>2D;{iWKo!jy|;B?nt!^P-2{JZB~wkJ#n zJU?x5LN9bTx_=~13EYI+P%0J#aWbnE1LoNb2j(SMnztJI>Jk<^f+N&$|CymA{wJWS z44g*5aKr|;da*@3t*gtWva9;bSiMiMB(;|4Hc%pK1&G3onH6L*k`JPKO`L&75Ab*0 z^(U%-jo2wDU~^)HB5au4+&4yyB!O4HVASqm(9&iFur6BRO-O?O;&T+l-F+o$x^I6+@hf8uHKeX?m~C1CwPJZgaTUPL-BtFtDr%}UPJiF|A4i0 zg)%3#Xa^93^ML4WMvq#v^FUx%-(6X5j474gDOI_AyjDn&mNu>%-aEKL|d`2yseJvKfTzmiY^weS=k?5^sI0i@yM%F(pkR4 zLGr^XA$`VpH}Qk?cl+*l9f$7Jag2mWB`U7~@1Ih8pw&_8?z~)rhP8)`^m|V4w*lR% zWC8fA=v5Kl(~CbjNi`Gub>jxhctQajGx7aRz?dL7if3^(+&cgR~NkkS;6E_2+cod<~WetrmDcfNz1_7h4dWQ4q%~{ z<}GP|AIQ^T{E>)+ghM6r`jy$o;r|GC*qvG_&)yZ@4 zmR;cNLz^|&Q57}%SR;nhJ$SN{6^nP5-dfy!TT(K-K*l_9l3OkLP>#YE9dg>w5fRru zl%!u$sGjD&z~l4+-fP_HTE?aJQHzVbS_z(?sygfM&Gk=Ka=_r3uq(GPfGF=Rsc-!F z?dvW{S_alB1Mc{n@7Fd+DZ|P#L1v0Er3^0-`RK-zg|Q?Wshu;zP*`-}b}h1yN>cGi ze`6GW7YV4p$;ER0J6)5nGhNn&2zeZDec(n32Bv!V^l(g&yHjtuzUdskAZyzD{FiUM zt8|9;vToHXa`%9k@3r_R$@oukIRAw38B({0M-nL(GNk|?17;&1RAM&0hb}j^z9L!M zu=-tA$ILcx=Z^@rOb74rM@rDIt}=l#b3LJ4+v?x=&Z<74za*n~VAQA}6c)XT^Q|QK z&v8D^?I!YfG-cb9I>jRl89}SQJz+Jvy1IoH>#h-bVQZXL+Zxu#JxXZDm+AVd`(M~tHuM8X`|+w3`x1xN%=Y7# z?ZFdvTMtULP~_t}j5iTIhcUKP3fNvCv|bNpaFdZV09QHar+R>^e4l`OCM_F+XeiD9 z;E(WUWFNi(9z~_fet(~pDQBE&xS%(p^hZH~UfTnXsLxCN%XBUB6BTfwgp6_tOv7tj z`<@`MLEa-}D$)NPB-m46{vvsq&QD#zOZac=X!tdfX&+c~l$d`jqu%H+R8m#thWQ}= zX_vC!VX{)e1|oBH8Ve>!xyl}cgONyk3dztVG+*-l{7BY#Di&t-cwh*M9{j37uZcbc zn4g`YX_LSxVck}=Z*sObX9FoEf#qHhy4H<^wzKgD{59}Ije}ViV7nzh^zNO8CM!7o zOTpd#MEr|oyWtoqX8;^GcOe)JkV}qGg+PU@oUvltdly0{p{KAJ>&?M9v-p@kVA(-( zw6#i=3O>RGz8M=$M}%)C=27W2{!ip!sPp5o$1@Jo#1r5Jq!5+m$z^_3 z(r-jTD(8VIYL&(9XG`r%8u2-!Jy7AThnIAW0rgu|Rk1K*N2bJzzT#mNt?lfk}m3|>z`8`RFL(4vY-ob!KET;)^|DJ479R>vY z7lpKnY|qaW(pTS-gaQ1@LckuKATmVxXr;F_%OY9@%5cfa#P+#AeR72e|J7pSN3iY3 zbkAg0aSW7dBgRVeATt^AaM&g{F(P2Nn!;SpNNzR^!F#F4%Dvn$Cn`-V{G$4at*N@n4mvLI>i1J;KCeAhJ>SbmeEr76SExT{TiMVkeh$CR(WT}8 z9DZ&1T>sMyaZdm>_Ua>qGQ6Ql`6O)s@gl-$S;f))yK9ZZHjM0_F~u4i?JO)$*E5Zk ziWUW~Yno}XlO`m==*Tqc)1ud*?k^4e;aWU=3R9AS?tAUD4ns*EB zS=M`QzKcXCm;D#E_Qr8dN^qR@i}W*uHj_X`<{9W+Nua7AeE;l(Z2GQ4{Q4L>8ZnW? zVIUz=$UKCO+?HnBvq}<*FCTTbI+8Oc%>*xVTPF*^SQlLF&yDN(UZ3XE)7JU@I^P&W zdNkK}S{jXS!J(m81r`J+lv`>A5^+>5FFPJ{TqiY$9-EhW>Ou6*%P z{VJYBG+7!Kf>MTEY9k7<2b%Or77^8v8OgSCDf|9anZHHCNU# z*1WlpBK#mR%1CB(@~A_q!(f!-;pPpv<=D7pXD3~*daX!f)zD2FILy{b0fR=vnImxEOMRNvPZ>Z1#y{~Y$X4k<6AsAVS<}rVSbY(F8;Q}SdiU)3o z6p<$}=bk)ep+HIhE=gx1qu9~(`S*H$Bw+GI=W94E**W~yn)&wGhm`0hk{k&c8H`js z0`c>rp|P;4o;0O=>>|NrX*#RD$Dpw?Df(JK-gAteRczSj58I}CHF|Ol&3e{(ykmX3(w?F=G$ERB(ti!`>oIYLWfG<)UD@4ZehjO zY7u69O`4roK3D{?;T4q66~aI`eNIyBoaS*DolETL%@BN6RZV$~ZYRDwZHx1hhB=>V z(n4ziqsJ|j6p$OinH{vSYd=8zf@tOQE|my0%^IQ%C6vsB&^u{ysmfyX=NNKVY7aXz zkwvvX>R^0&j)i*nz}8fUs;76BPc+gp)z0AN7c3N+R299@O{sLvB&`b-{fU|cmso|a z#4;y0Je)k4o=p6u_VR`Gg|7UM=HoVKhzvB4G|I>#EQ1s3ddRx93{GLJ_H#F^#Z{E_ zORQ7s!n|}TJl>4mQXi)?;lq)m#0g4Z>kwwFU39eV6KG-1c4A=W^7wA^EtwV9Cs0iH z;55ZMXrk1l^LVcM#exPZ2&4nmL(EF+XVUwG5_rM=Uxz4NPni98W85rOMN7M)NQbJa zii`);ijg_cPE%5rRc!B>YLFNfrBW}gjx4t716TXZ_67VV&P^_GE6OoFa1hT)8-E?1bIk zqR~%@?9#mL(f@0%CfF_87f-h=XQN8A#&_fFrv=<;yoi=;O%7)*v08U`BRk<6-=&UG zi@}^N!@|18FD`6O2FM5N!*nn28ccZRveAap&0(k82ncppvG% zVrABqIY)Dy#BZ2RL*9^3dAFC{JghA#iRyK@T_1%0c0)|%&Bzaht59be<$qKU+p;Ba z6}3l=+_sY7Aj)T=jH6ozVlkQAIR_ms7|SQmo0CAT711ZJLtEjvrKtF5uEB``>|;la zAi8GF!y_HI9d9qiEU9D$1V3`7y-iR0{bMIr4h<9XOY@-SJYU)YaPXtT*zb;A6}hE zy}@f1n5^x|U|Z&t*xnRP%Zul)ug1Gj*xWOsbr9lfqKx&*dGfi@$UZ|esENJFrn18{ zz=jZ}^yxb?l3?PoooP&m&y%Uq$l}kN>k!$ppfYvSX^7rE@uKz!iZ1ZDw$UQe7#ESd z4w+6Up~nmR9Sv&g^7|X(K?NkV1xkZl?UyPn#y`B4@WH$1JHegTxK+_V&|(KAOZW?s zt-ticf0c>E%Ta79Dq2q+v>mvhcZDM{jE6NG8s?$QMiu@X>id{f3!5Z((>OqNov~V@ z2XQfpgaY8losHy~n{(oMSxcxG$uYEhA`F@_FbdbpO_x?@zTXis*5A2cg)7y(s2ZKr zURGMiae_0k-rB^g#DKrITR1ac?#qtl<-~&R9KcB4CZCfm)c3Eq4i~6$x()9YGj*E) zkQdZ8KiC^i6`pDrjAXmbtFJbkRZXH=M)G`f1&=aNcI9nU5Cqr%5$QJBQ_ zoaT0XjK&q}raXSDB==@PX+EF9mH1VfZ4bn@rnu%8$WjL$b#XI4b3{MdGK4leyHrv1 zt|{F=;n9$%d{0FlX=tVJ{!~1o>p~fe=c!MHKjvu35o9)4xs&mwTE;g;!S+b_=0t|~&XBwvFPWZR=?Cqq^waOPN$ zzBBJ9C)?MI6Ne|U&^t@x2eHSs^f5_hmsP#JEz1_F9Yx%?KUpsavn>w#vOy^e2csExM*n`9IrvF@mx`k z;cAw+qHwZyYwbqHZjM)E`=eG*zq5%asvH9Ragl!ebMYopLO2xw`W3G?d0Q0{ zmzHL9>gLgr2-y#_)nR!cvlbhVMJ>nI_ddc-8B%`vWAh+*8GY1kmJKXB%Da>Chdj9B zM3D6UC_9m{SXhHj?{tB2kb){-YyB=%4_aTa0r!@*g~g* z`0cr{fKdaW^z!~&|_C#!`!!GK9i!o@T z-YR`{YZRcP)f>^8Uccf1yKAAnBo>K{lcK_Ym1F8ms-S%8B3l^wJ3kBACi6?T9gJ1? zrYLUH>!jat(ycA)$HwrcbgI52bd)!OvDsZ?wGsUdl|vddfTV(5*AkvNGi8_;Y>HC; z8!p1fQ;sy0tHlNnlzZxMc8$Z%#7i=hvD?cvu|#`kE(*%y6b3(vlVS!yLD$6dfufwg&kLlcf6h(XZn397Kf>D&JXY+8l!P*)1gZui`H)k4#e zC$R-qc(tk43VZW+1wFevHqY7Y7b7t@dk8^#%^WC-s-{bTW}z4k7q4iI2i%R!(#*Tn zO^H(zAf?5ZsMuCzKcqYHM^9@DdRmqfA)L_>$g&dWzo0jljfg$2b2#33v4KaKA}P|X znt|v+7hw~PimD#9+R@O=3i@M674hU?uE))4e$h3p*mV_7TVq&{LPA7yG&JgdJ^k3l zgJRhqV$G`f()&V|#|9ik6U<9%C92I!(aMU)yE_!;_}s>7rJ&+W4pO#E`B*o#gqpru-3>nC%%GOJyf^9M{z!E&@)a^CX1} zJ-}p%Rb{X6@N}yO*swQX-CIHR$0?1Iulo0b*PA@82`s5N=I`37zD#yi3h(4AtCb(O zl!eIUzAVp@Z>sU*6e{w_ntQTwVSCNd{o`o)YlXZS!vNK_$ar5XY0CKW(Ab_rX4Mn@ zbqp3A5cWb6Dz6(o?A~%vmA~JmoRbx=CBAq8d%|P(RF6v(oLq9eG(z2Me2L6A+(dOe zoYh?HplJbG%67-F`4x)+sq^fSZQa#R^wxJxB*fL88e`ev=`f}!VzIBPqoVpHJnHXM zF;h&8*4aE)FSqv$*ED}-xQS-Av{-04#bPw_RlB4bCAtINS>gX$C{N#EgY7qNUc~Fz zFdO*e=CI|Vu$K5OmM~VtMoQ`KQv&-X#EL+*#ccI_tbL%Lt>_UJKO32#rC;9M=2q~f ziTnNe)p>x(E*Ej}ONsZ>WC2frwT{WP6zPrV-R9U3%t2V|CZ~gCiO}ucGE&cs