From a7b5f4fbd15682362cf78d3fe11b871845363171 Mon Sep 17 00:00:00 2001 From: dener8 <84485400+dener8@users.noreply.github.com> Date: Fri, 2 Feb 2024 14:16:19 +0900 Subject: [PATCH] =?UTF-8?q?[240130]=20WEEK7=2033.=20=EB=8D=B0=EB=93=9C?= =?UTF-8?q?=EB=9D=BD=20(#34)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 57 ++++++++++++++++++ .../deadlockimg.png" | Bin 0 -> 22157 bytes 2 files changed, 57 insertions(+) create mode 100644 "WEEK7/33. \353\215\260\353\223\234\353\235\275/README.md" create mode 100644 "WEEK7/33. \353\215\260\353\223\234\353\235\275/deadlockimg.png" diff --git "a/WEEK7/33. \353\215\260\353\223\234\353\235\275/README.md" "b/WEEK7/33. \353\215\260\353\223\234\353\235\275/README.md" new file mode 100644 index 0000000..f9ccbee --- /dev/null +++ "b/WEEK7/33. \353\215\260\353\223\234\353\235\275/README.md" @@ -0,0 +1,57 @@ +## 1. 데드락(=교착상태)이란? + +**둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황** + +![deadlockimg.png](deadlockimg.png) + +cf. 싱글스레드에서 비동기 처리를 하면 데드락과 비슷한 프로그램 무한 대기 상태에 빠질 수는 있음 (종속성이 있는 경우, 서로의 작업 완료를 대기하는 상황). 하지만 `데드락`이라는 것이 `둘 이상의 프로세스`를 가정하기 때문에 전통적인 데드락이라고는 할 수 없음. + +## **2. 데드락 발생의 네 가지 필수 조건** + +1. **상호 배제** + + : 한 번에 하나의 프로세스만 자원을 사용할 수 있음 + +2. **점유 & 대기** + + : 프로세스가 최소한 하나의 자원을 보유한 상태에서, 다른 프로세스가 사용중인 추가 자원을 기다림 + +3. **비선점** + + : 프로세스가 이미 자원을 할당받았으면, 그 자원을 강제로 빼앗을 수 없음 + +4. **순환 대기** + + : 대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 함 + + `P1 → P2 → … → Pn → P1` 이처럼 대기 사슬이 형성되어야 함 + + +## 3. 데드락 해결 방법 + +1. **예방** + + : 데드락의 네 가지 필수 조건 중 적어도 하나를 깨뜨려 데드락이 발생하지 않도록 하는 방식 + + - 상호 배제 부정: 가능하면 자원을 공유하도록 함 + - 점유 & 대기 부정: 프로세스가 실행되기 전에 모든 자원을 한 번에 요청하도록 함. 프로세스가 실행 중에 추가 자원을 요청하지 못하게 하는 방식 + - 비선점 부정: 프로세스가 요청하는 자원이 다른 프로세스에 의해 이미 보유 중이라면, 초기 프로세스는 자신의 모든 자원을 방출하고, 필요한 자원을 다시 요청해야 함 + - 순환 대기 부정: 모든 자원에 고유한 숫자를 할당하여, 프로세스가 반드시 증가하는 순서로만 자원을 요청하게 함 +2. **회피** + + : 시스템이 데드락 가능성을 허용하지만, 특정 알고리즘을 사용하여 데드락이 발생할 가능성이 있는 자원 할당을 피하는 방식 + + - 뱅커스 알고리즘: 각 프로세스에 최대 자원 요구량을 미리 선언하게 하고, 시스템이 안전 상태(Safe State)에 있을 때만 자원을 할당하는 알고리즘 +3. **탐지 및 복구** + + : 시스템이 데드락을 허용하되, 데드락 발생을 탐지하고 복구하기 위한 메커니즘을 구현하는 방식 + + - 탐지: 시스템은 주기적으로 또는 특정 이벤트가 발생했을 때 자원 할당 그래프를 검사하여 데드락의 존재를 탐지함 + - 복구: 데드락이 탐지되면, 시스템은 하나 이상의 프로세스를 종료하거나 할당된 자원을 선점하여 데드락을 해결함 +4. **무시** + + : 말 그대로 데드락 문제를 무시하는 방식 + + 데드락이 자주 발생하지 않거나, 데드락을 처리하는 비용이 높을 때 사용하는 방식 + + 데드락이 발생할 경우 사용자가 수동으로 해결하도록 하며, 실제로 많은 운영체제가 사용하는 전략임. \ No newline at end of file diff --git "a/WEEK7/33. \353\215\260\353\223\234\353\235\275/deadlockimg.png" "b/WEEK7/33. \353\215\260\353\223\234\353\235\275/deadlockimg.png" new file mode 100644 index 0000000000000000000000000000000000000000..e1e8234d666d2aca1d605c2b5ff3a1f9bfcfc11a GIT binary patch literal 22157 zcmafZQ;;Y+u7giAC)5BUr|MM#D-5&RJDO@0uH zl4&IEySMRK_fMM)X8hrXV|ilzD2Blhz@eOo2T{B|LkZ$x8FdKHSp)&O;f!>{(I1|G zjZpcthm(v^8s7^5oo=NyI`+ZQ$9NjM*5LVm7j__Pb+D$q4SZ-X#r%oemzpfsdWWJl_W2G(u*<6$A96y=mkSPsAv{ z9F%=+smhBf7g-Iq$dlvjyYZjt#}% zNQ_AuNAQ_gK8?`0HKAGEG{P2!5j z9mxv7wHnB3bhFM#iKnM4Z&LM#LMxgk52u{?O}x8+o4UrN*Eq(w?g-sOAJ8xJ85dR~ zNpxu>aJm|Z3)vU(&AB!HiXrm$`1}~g|M`>1&!;CM)rTD+=kMM27eBzg6($Z2&tnd> zC7?kcw)a<7uhS~b+l2zyz7DcF5nZxV`?G+*9VF{p@dY5U0a*2cceX$EJxDJBK(N0A z0(jzpNV*T2&Y2Md>NLoc03-$Q)BsjJpf%W5KV3aK4gl;v1qbA;f7CuxJKXKy$`Y)e zzwbSqw-`cjumU1hVHgH6S~%`uFav@e2>_(9QM?HW?1V^gI7mjswD@Fv$~c$_wNlKr zcxHUkxJNN^M+}dMXTsVzIf}5V0_`$Fi->p;OmakMp~E={3vx~%S^@NY$vIau)K1W9 z5&1&Yxl1#&PXL?&fbys_1M)PUu>lPYlJo!*10x$Y^~hucRW;h5(ARgW)sPoMdy|}gm^@lKb{+}2DQVfJ^2s{ur!iadubSVnLWMo$a zIApmY^NOtdSP7C#gqm>MdrcWKGh}mwGz4~}t8nu0oZ+!yK%|Ib@kU~g1R_ZsCBTZ{ z=G^A6WuZ=?OEMn?B{e2BM0{eR^GL9f$V1VHA`|6P#Z^Ts$}-AV3cKW#6xo!Wl%f>SNvD)G$~$GgvM+`A zqR7(78YpQ}Rnfvm71Odw$doNAyKex#4zFv;`ib-c#7PIli{zO#4bKA z@0}%`E}d&G{1*!^K+lfPYUixyJ8NSvHZMglWtVn~{55;*N`H#aByPtS6TroG83kai zVU1wSFszv^*fAJbm|&PtFl*U)OxMkejgS8%+ca;Uw=32$&a7`~7<6y8kGyf}X3Z9# zEv_wWoqv;okqwX`CDoAOlI6+P$Q;Q=$zI9aWhqW$m|>b#&1lVh%*4zL&6sDdrSCNm zXfx0>(yVG_x47F`nr2vZ%r_1+j!CUW+NheS8oSJ8THP4)j&x3bWWp|l8YUSxEu1#e zT3s1snQ9w)O~AD{wIHwCG+*I}Vw~_vaa39@%X*=DmHHI;#C!{b_!@^-iwBAa z&hzuw{5t)xeY3$lYlY*t{nsI`N2Z5EPrIkH`(oE}SG&8*TgID%Pn9pud&b+Nm)kp! z(I$Okns++QH`dpvZ^-vf6R%pc8u=&PFW#@hPu$;3z`H-xA3UHmAR~Y^;9HPRkU3Be z1UXPRNF8L)1iP{0+RD{0TzkAazEvS*etjOcAa2llXxMP(z`|YPt@7Rr5e;!LJX8W< zB31|0gMX6BN@_X5!pK?0S@d}+osp5*cy@Hrh%gbb?{IRsws=9ZDUpusiX1u-TUmk_ZW*_?r$v5iiilAg9svYc`nu~n8WlgGxf zY+O!-=rZ$=(R3!+*P+~9oG+1|u&+S?`e(dNx|+040uRj-T@A%IJ(J;OpC!g}(DG)< zri?!Kr<$VvybbdW<~DjYgN*rX#+xIG^UsyFiR;JpDyNwf+Vn*(HjCRD&t!MDM;|&j zS{;oqH@}1L6VMQ-6FSci>3Lcv(h8Ep#7syoG&}tuIwYD44PKY~_n}=$_ad}utm%oV zeyV+%&YR10-IXt{PG&>1amH1n>{P^5$dq06y=KFolF`Y+lsNT}x=MXnecjHFn@q_+ zvuWIEc6!p9)S6o@bk@2@o=-1RYknK?EeD<<`l7lef+vTQuh<^gb=HqNDqS1)P8+B4 z+92AtHn5vo`lgzyy)o@I_FGFgkXv&ag$#3}`37iM421N(8gwepM;+5jk)ren~ zt-Z3FusXAnvAeQ`u(YswvElO_+MApyCKaKMHOJ9%%W?MZzZpm?PW3}BMD!+QkmI+> zS@n2PT`ae>p0~y>6_m~8K=L?U(mYvDan?DB&v|9rb@sQ<+b_Hr`E*Ht9_;D*@^2q( zD*8>_C>@!;PR-;TamDFBbT~d%{;n{ut*_DP#kKEx5dVzUWL2~CuUpd}z{hj|c{481*cf)tW?{iQ5J(hkAEL$!+nTyU- zedTz;xq-dz`SSjHx;2g@udcFp9la2MB_l z83)*Zkpn270GQwZiDuI4{Y}Co+H0Cbc$3%Y6;IBf257necm>o3>MK1f3Gy?3JSde@KN^%j{v zrC9v;q2MspkTjE(1)%z8LjVAVSptCkvjG1!tbYvv04N{me`f%7@`3-?1_=Mpxo{S& z3jiPhASoiK;tqI|1MaV#S(qKDFufdPhaoSzFuL zx`PTGPH|4Ph#HUKDJdZ#ge55v^30TUq3?0>%Y8Td`Y1bLLZ+Plh10X=^WE3G02*P6cT1$3g2Y0mfKDX@ny`Ic6}?K&gxrDbT5s55VV>EG4Gpv5VR zd`!u!n@f(@Z(8R6o&sDKqO>1jO0Q!s0{WuTIP8tL&-HrVGTu3}-Y z7Ic{z^3sC9o4U$vrWRhvrpp7kAV9Lx-2Kd@?^Hqbl=;-AD^0e4JT(;01O+$(g+K*& z+H1slh;7$n`KxUzOK-xLOAj59TofnZXy#Z9VO310@|w>$%klx+hEaHe<4shiENrD- znH1@RMiMlUJBn3JY08#(Io6ZEKaYYajx!MRV2`8K%Xy#o9jv97oOLyWu}HvXSnG+h zY&&T^yo|AmgQIW#TZPKadd$dpiNW)>woA~`fkq76gM>s1R$0g5E0&YelGNwZV^usw zLxY0=YLpFu$myGAd@PlPEXAL=T;^76#_D;2FZ{~{YsM|jv!LLSUq~SO5kY3&@;G6U zi)NoIHg0SRge(z=1U8V<1QK<&Cw){qR@S!PkkMBM)3$}QzOFU3Lf>VtDRJ#pZ38IV zI}_LnEr|=C;1$AY1<{3z!k0RH_;zWK?h|#dksn6LdHf(DR)qBq7(q-Tmi!#2ED4m9 zKu$i5=i}8Hlg8!_;-()=U_&PG6@gVIX^gGhXC#*pRF=eTyPIbv{)lZB74i5+J=>oU zqKoy=W{*e)3(P(1{9x)~$xNPGY}64F#H}sH`U8zq+ifI%Lt$IF$d0X8vh{-44nG-XuHkIN zmGLWHUi zM&L5=Ov%8r5P9LyA9#Rf=At;k{~1?ml{_n^;Ck2C@ZxcJD?Hq!`=75;{LB@w90%#jR$YCZavf z1g;`ZXm?R@qZtdiPd|*G%}AhBZre^aQ(f^AX3j?h*%vGNARMB*SFGO^5pp1oMQeGl zEHjqlL+ffzDRc;>odv;U21XQTuxw zF`mh!&FpnYr~Fx|mbZzrNT6g81(K8qG}R-7iDWYHVtSF{cr8eIUbGAPv;I;9h7N*RjVO$^pT=?$r}~iYDocAM8BJTyLh-bu!RZ0a2K`Y0p@oEkH@e3Yi2Z zb$l2GZzRRK54*_INiPYZ9C%vnT;@7m-&oYLoAALk72HSiAet!GeDIJFE5TUV#OG&f zf~k9JdI|EjEwosN$q5mDi7X`8DZB6@HLi$(;y=~-*2!Xd|VC>)q<-T#Io_e#SIM-K+Mbtf9|TeuK! zdt?;{qZn`;RYF0MX`++z2)b66!Th*9ac}qa@kiDx<_qYUJV7*=k|jj9iwlG7HV*;7 zqk25xPo1WQc5dY|RGE(R>X3Z*<8oC?XhNBG>y_bh(5#QGL075ehFR_{s;DmaT*cEy z$c-q`JU0r=0r#|Au4n>8;eKC?a6V`NG&iFmrY(r&-ogxuiu_3I_h0JSOpfaIABmAS z(xu-{?<-~c>)|Z9wId?oCLD`W@9f*ki^?LI0dh_@+!Ba+ktK%+9bN_s$G2zgOMj_>Z&VcS0*fa5CPl9LXrb4H9S6zSmiX=%SdRb z9GTAAPCm3Yri@K@-{tyg6DU0c&x_8)!ocRLm1W`@!^ilLv~bhH*zV51F5H|*Vn&e~ zh=u@fSdPIzl8d-^tSacDkmaj*J_bvpLAxvHaGeIbnp0~vGfoP$Q%_LF6DCwivnZ%2 z7@>N~${CDOFz!Lhw#8IXPfyJ}Pa0q=onm!$bTpCq5X-BkL<@n=vM!PhiYiD|6;(~R zTT>)aQAiUqOhIO_U5Ga;EkqA4S#UI7My8F2_t_iD=sG-CA!lqGdJ*QM3Y09wA-Dd% zG>$fFJh6p7#lT-#438XR=v5aHAiOkGRx&db~cD?NM|Y zpr78BH>v1)8g3^gPi3+=iZ@!XKQ=2rLoEps$(^vgt$*BJYGJv_qw(+<4@*<~O))P< z=I05#Q#V=bp`~xC5D-YwyB%r0)frB?Gmf*oUh`Z}8McY(b=`OS0ga!YieCA@rY)7p zb6rkZ>|6LWzdyy*a5+7vnf~m#es41tg_7d>Y*2Ttb~oOZPMOEyan3V7`|-SNcDit< zP3N(Bt!m7K)A`sgmCkJKy3TAz5Km41+3v#ER902SMODs7`Ac-=wmM2|`l9HhE_*!9 z1tA6kfqsY-d`qQ=5N$S=0o24O6Xh35H+y>9t{6m9WN`4M`T6&zjzf#t(ZWPR@^H56 zM^PoyZHF}q&+qzVO@Gg6Akb;|snvu3{erj2T%PxJy1}pauH(aMsO5&UsWgYt^q9A= z%S&J*|Ejjb`twg!st$+C*6Pe$&zlvEB8R8@#vmuMZQl_+t8Mr0Y}5KZAy+zsJgpXr ztO*Mn+Rlnc6A@$yyZo#3j@1GxYoheQ=-^z0_vr`${!G`VHeRJ7pf-x6pb zW-@r}PP1<_C*VI{!=cVB3ClOARex=_kg$0@KSFQ9(t4YFh%EV@*DoV0m&X->%VaU% z=a1-nx?j#`AE#TtS%bu4S!j%R13Sv*(gS-{H8R^gwrVSu$YrwG9t=DlHEMjHB~DDC zXXQj*HZ!@Vp`fVl13ZzpV!}kxvEjtDcFK?P$iX7-AqnlR5d1HVG@$1AyskN!$*VPe z&L_rVM`J2pUKUE``dVKlJfDjv=DM3-QeeH{)HYwgU0k*o%3$z#jNb0~d76EPZl`O3 zD~7_ZBaXz9(N1;U2f7!E!o-gdW#Yi$aMImQn+t%!)l$qWV>@koTo=APDzLhG!NR5r zlQ9Qo{aFxX*G|c)`Fw`1-B%7w=WJIFOIqCtmOaFfgewk4N? za;z|td&*W94uZ z8B8pkw`zNYLt#19k~ZC{S1D-Z#AXbW#%f4i_jVbHp(4SLQQ;>2K2B2JFkx|wG+cFw zY=)U$L>rd9cAM($?FYW4^Cqx0l(-;pJ4WqsapS$^i0oiZ$`>aC9}JMST+QFMCwS-S(@E3ZE{9^6Pi_YtaVI(&DP zSLhqHPs7q)d7hpl>4#3cK1ZN0ogLmcwYu7W=`wvj$`=<}B<~8w*iX`6+Yc|7h;})( zTh*+0e8*$7GE=0?FDIptMS-FIR9V$^8Af0>=+Vpb-S1;P=pw08mN2@Zaw{CghAyhu zZ??8w0_*qC`VFh_DuRuO+QSZhqC?pkl*Ay4{gotSalnJz1yx0hq7Rn?gVW}4EGE`N zf&=fGfA>!kY-BUCNU&gupbL;BKpL^3PO7C3|4dbN=(=ZWMUJs|1>QnSD0=2eYGSln z((|#Ij5&dQ%9fzHOE>nRUwT9YFoTK*tJkzC0)964v5oPOMk$Rqcr=D~(@0Oo&W0IHAa)-jVpL$!S;_Q(kv;HEfqN>Na~4glX3P*WMa)DD z=UVe4^Ex?5hH6o2w{KTPDQN6`DP0S#qId?-D9?rpEizLw z46Tt@fZ9p1a4^DjSm#87EthQuPopcv72O*r>-2u&(&2Ws){686%T=_{*;}M2E4zH$ zAwy(V8_x6LL@J00#B4SaxuO^V#YY#j0Rq}4)R%H$1d50J-~qDGz6v1#9%I}466!AS zk5nox8jZwgUL?#H%7VV8U^22efyTV7w>@k*)~jB|@`4RBqT0YQAaTUlt=MUK5_uM0 zGmKN=C?#HC!#*vk=*CgLS3Ti;8q&MW#wE6)6w>wIDdm!nf!Uu63g!DXX+kj(){R60 z8X>OWL4XS+7&0e~fJ^gMW|MvXhKELrKhj)m+}5#}tIft+rcp*OVY41~!MiB9v>4*{RoXkqcP?TuM>4gw^!^I@W zaFSHAC{#v)A()7yK#eGpfUt4RRM@lM)L&zM%lN+7yH3bCEZacJ0Iu^&I+@p{rgLOo zaZIV!(}QtREnICH3I5(ng}gtjVhthl=nev<)JSTu#C5-9_}_kyp!@H+@rl!Z2o3A= z{hM{QC!g<Cvg&YysKyp$F z`GEpOM44=|KGPATaos1wAn)%e_B@bXMguPv0mDE^1aXz@?yykzz`k4o`FT{@1oX6} z?gs@oj`f-2t(W;T8+ zxV#mOFZkH5^tKPIx@mx%ljMLF>TX2ST^nk!6j6yISZeuBKVHV+xci_^=LWIkD8qQ| zJSlW#-XMnEID>hz78b4F{t99m{=zB}q2Ry>!}u9!~E{GgH%utA$o zhXV>vMruHbAsCASN6@MeYy!>WrHeJ|n=#GEmA2S$!!I9T6@?;4-;Ro(qRCH1{qg%6 z3aab-`JmPRMUsQ;^`A#=CV`+;#)>;b8$Dtkg-6fn%8~y^W)DBgfWIgq>9 zNsHiFva4GJP`)97+w$}Dddg)C`eXgPJ?K6WH|kA0IiOS}K@E3RQRkw$01cx=LwFAc zfv_W~>Fu9RaxK&#ORGD#@1;|$RX4CU?l^Cb zk~Q_xchCEM@gJ%#+?Iv#tixG%Sf&j6FoLH;bySi=m=JT_(Tf_l%3eJr=ZaTUgF5SN zbda{pgH~YaAl6dpi(;mjl8dhv50$wI3B+W(&%OmwP13W8w~&@$dlhE_vX;cSZ@wx! z!pL#jYG|BqhbmOl%u<$~Dbt_i0fDvkqfkiDo}4`56r|1G2sSM??hi>(Cpjs2H3jP; z7hvo?$Ss2T6VpQG=|KWwN;QL*riOCD7IoVx^YM-DEY#6Ne6VqbtY5bMp(=CQ_)&bS zD6oT;2?&&{sg}Da;o$gi^m1z>gqFGp34Z5iVRD^}?+poI2=B$01up5wbqwp^#!A&y z6KB1#9p*EI;yQ`m0i3UoMF1iM>BRr1&7AwDhp~ntoG&0iWC+FK<<>j=Uk(d@&a9sG zo!ms}9{ZS-stYD}y8Yha!Psl2hr~zK+L~m)ZS~0s#p{Bh_G!VcZK70NyxSi_m_IOt z^Bo8lhLVj=)aSG%f_s=bSwYMmE^^x~R#2R-xl{Z-o8{Mm;SD1xQvj?(v+bC+D5DpR z-E2tG?b)MYLC9sU69?`(D4RRfdOe`shTL9=AVQJ@_%y9~P7*ZW&Q=Ywb9{aV->1RZ zFqBc-E}eSP<1SB2T09pVkVQO`Hifr~T|e>LPU*Nh6ATpklLeQPG#Uot$`)bx+sl&aRgW~vhtu^2q= z3tjbUzn>7|xt>h?IqGgt2Oh+;^d0ltpYMA}WN;W96;nqQW&JL1GPk)tt~fI2YP6qI zve|F%#psTRA$xg$fpHWpv4N98eYnCf=6tX>ayxu#{?6N#GarOgs2eL%#pA9u_z7-=5z0@2dd6 z#cDIv(j&*S;Tp+RwU?Jfq>!=W6q9q(cw8D5+^hRcU+22u%z+20Ws_jAC(FKaal%dU z!u9_Ngm+;A{N_+r&{;6VUYf9I#In3|4{ZFOgT8Iv3Jd)c!eX^ON59(zC8n|LmxZE# ze!lu6xo@d3xQwk5 zE;`l2XIYqbq&j^B-agKD*7V^kx`Iwo!Gzgo(fVTyl}~el3dX5qX}*tl4?_ zh8%3F^|D`8LPLkbWpMeP|DDn1_~xWDnZF_dJ&3SkXYAWRo{z&HfuyfzEMHwChk{P( z#CuIdWY1thZZN6NbwwR(xq zx33a}Ck?IFgaZ1GrJT1JPm`Q82k&-pVoej9BrTMQ*j`oS`L6a@nnOC@&o<#kPSXK9 z+ee@nYcPHnU83uXq?g>n(_-RCl5_e!JANl-V*B^MeS z4~YGROJa`x{(SX&%G&$-f%jElvL}eh+4PK>5_$p~k>%A=oxm+{?X6uav07SrXf%?k z!_gcWI1y*RTb3#$9RhRkbj&#=(}{gsI)RGa1?c9K_vFoR1;}Z2>D~ z(R+a|HmyA)u<=7Ba7&1OyXMFj*q@)qZc58=ZP^Kf!>_80nxf<-Iy}6iIe81SKdS0? zF=%8M_*SeP@<|y7?&a`*-j}cGPSBzIQYiC%H%YCjIIxRaMqnYA*yhoEVo~}NKLF1n zzeEC9p(Qh<>g{-n!+tj|`HyQpTnC<#3WcY7se868Cq+6)ye|)j%T=qo03{YTcipp7 zzpYzKy2!Chg~w*GUjP+nv!%e%(eOF9e}9}YMIIe4i^Fprwb*IYYyXz>ksmpZ>nXE- zd?OCkF2@9o+1gED2TKbxR3(lLuNCp+U?3dq>=!y+Bp5x9)Uq-q$@QlUx!_)Paj3m3G93 zYOH{O9EjeDIGBKaMKT`uD^99%F<(X6`^v+}j*RH!zsJ5*T~|R(N%?+AUWYwRS;p71 zfC>a_C|$MCy%-=29ST#u+1j#Lg~@T2P2A#QI}(ry3@+ETpZJ{hIZcduwOW^lq}zCj zFCWY66`3ICmD1v>O1qYXa$(#3WH97k=>Q+fnvz%)dH@87g+LG^1nHZ_9KOq}u(Pwc zJBfmEy3^%GjuZh140gTIbk_TM`}sD;Uu$pla=9X%MkjhsOG~TUZhsI63XKJfx?Q~X z6?v(m=|V%F`da}1tL%`gLt2}At*?l)+~6w+d6_gv{KfGC7iD39Cb&u@sTLy74&NfteW zQ&WMjuHI((^3!q!ZS8b_KX5vjahv{#cs5(>vb4}VqFR}`O}fqrPXtr_Tau>7<^6V_ zVV=urHl4n?sWsI|MNLgjMU_gc-Rk~uXgCyVv(acelgWzz)(@^y6DjU22mN77*^@%a zKm^bGJU<+PT-SaGMHY<9?MgtvP=?Fpe6HU2v9i|twnrnJ9PVc8Db1XW zUQ?&=Y$VZ=jwY$5nDs&fm7&1X7I(R+j1*~M0esUe|E~KdwhelV7N0fsB5fvpGw!*j81agWiUw;6DArew11e0ZyhZ6U-l zjcz%MZ+4_DqNU0y8vluyt6C#lT9Cp%6p#T+0`@{qw~1N2A$tl+;07z;K0{+PZqqaUr$G8n_<`pf1kf&0Z&EJsV`s8dJ^{)ZH<=zuPqu`TBLo10j)!Oc>*2Iz$n=+e)>29?S6&2kf%(A=qcoW|j9hOc> zh378xsxlUbme)KLRUSsFBf^44O^M~T)D7S~{Kyqg*utOTxzBJ2%$uSfhY-adGCa~- zI7=Wfo!xHt-(9s?!u`J2{CrMQ)Uh6e{Wie@^hQz6QHJK6#&F%H^Z5HJD=#O=^Rk&t zp-lX4TGog}2#EVx`_py1Tv1U`2N2u)?@qJqMuWv_k^7HD9>^tj-HLoL&x3c6Z6h-c zxrs;PkjxG_tbwq(Oe>QPa>d%*r^^o;ibN3|cG`^%AVn-Om_2|D+H`MEt!>LW3`K3; z>n#?DV4%(;h{dAa-%rx`A0p%#F#Q4Kc^-zJFP7@MA1C#HKi1;-KF&4Gb67o}EjHs% zY;7pJ`pPa$Wdan%V?ZDcz}a`4m34J-k%2Nv0s%_Nnj^IBdQfW|mr7*`03#9@5Xt^w zld%rw4|qeT3OqK9tyETB%@)?0=C{x&&QUaW2Nif*c7gN5K{w(fuFf07A!m)%7oMsJ zgv9_d#>Vns88G26I8kncivUZ2N%11@Gw!_(m#ft~zu!+8V3AtwHn|FT-13?|(;HJ6 zKo$SZInFbjW8qOKz55G!KP*iEVV3Yf(U0*2;vE%e^|5Qn2t!`PqIwq91NWs1_+ z?2f`BM?levMMrY{H^gnJk$YD3xNwyVRgxPLF;TFIz%_z?^1-jlMHO#^A|OH6$>V_6 z3X^#-|3gS5XDNT%eBSlg9Ea<`cAc9v!?1M2$PKkxbK%7OODD}xLwL>~_-h}3;(NKS zuTmDk=?WGpLC2HHl-F%1_*SvvAaOholdV=88Q|zgasCfQg}@f_)WW^j-d9E<8etm! z-mk+bdbJc6A?VGGOEO|nTUM@_qb*H)bh0~B8NmQ1jT|+9!Hi&B0aR~O-?!y5zJHZ# zbKkdaeZpn#YhAmbZUO}W{9MqHQ1lDB|Dm6I>6?9=#cCpHD@(rJ;c}f~NQ)LprkBb@ zMF_wb1T{?+a7gwE2_D>F;(mmMJaAYnkR=t5tm1155RRC|dC=8_@tnS2T^=;AGya|Z zPg{s5q{dgyKn92d@W*_Ud)SA-xF0C7uuOq66a)>qz&qyBZX`*sbX0$Ua6pRP&)wHS z%HF4(JCY9(%B8RXpogILtJ<#g*mCr*pzorxd+c&5K`)ixl`?-~gbflwWQGd1 zB(ia#iFtt}lkP;MN{v3>Z@0eBoi#nL8{9khvFQwE)q@#iHxe*;i=k!xo%)}%zPFKr z@6W!U7VW^+_YtU*Dscxues3P8&xhsTMP*guLx8ymsKI~7`Td%c?WJ;Oi@2Uu55}_h z$FiKz-c4WS-aSee@@l|*Gx9ry{E&ncp(<7^UN4u~Xbn!^vUkJ+RJMV(ZO%nNSrrmE zAbpPs-XUT<)hr`2o(=@g9^@i_f@np58f+B@P?t>+r&itp0 z(8sCs&?wmN>$9@5R+r_IA0>kVJw!=G%bM)<`izfG|CZ&rVhziC7N2Z1nIC0}VyhTa zV2a~Dm*Rh)i(6%+V&tM}`AsUebFM9W-+k_V56JtfFxmHa*}9+cy6rh_+3=fZAs0r~ z(LV^sJWesHJf?+tC@n*I*e5GF{A^YH&Yu`)05TN(9(E zA33azy3;*Cc?3<9L-=b%GxibSjEiG5svr4$-n1PliBA8^JnF;X_xoFWKWxcy#wTgL z&!iSVQTks*ql%fqnNLCZUjTad6Y{=~W&GciAaNcr9%mJ0xt;&&HxGaS0C&LAp8hQc z`YZT>|NAzkGE9Fm^jKdqK$%P%G>TB#6N&NF+g!s;er}v(VRek-wPjxv(fuXzb1x`N zCZ7p%7MSoLX|Z?)>Pu$`C3~edoo{KKB*k@>@)saxma=N71cWvq%NWbtnM=pS4Q2i) z9S9@zCf)G^c$szuo9AxcDJ;Al2b0hTUjyZ~$#36jF!v)NAh(&lfrGbNkHw`!TI=+L4PV zu)fiaA*e!Z@K3(S5?VMdI8GCGFrJUtSGgDWPl z0*7?>8w6p-&@7(!yKwbb?;w}QUP*7?r9)h zl2eDvfU+&cupaqNn-aF$a^1F0q7)f45#*ad`lsLZ24g~`ao{*gi_j3I>{7me5M;?Q z*xMrgq@m9Dr3(LJJ}iIt;b^Q$9GJMgG9<)#9PcBHI6h5cI1E4$0VjMQGBy-Q++YHB zprE@OXCMH}P#7E@ulu@jN=0#+|5!BygtS~f=LH&RiBe1Yor3!9Am3xum` zmrp?s0C{y#r9I3E#Ngl414qn%B36l_UAk}-6Iv6IPJMa}2 zsA(n0+K+k|!vBf)j1YOrCvpeuGf{*PM-6yH6-jJAfN z1`v6MMtC?5^>Q@#!chj$kQvkkXNm@=$sid$OV|nX-HAsbCet)_VM%Dmj@sXqrn1?!(qRos$O8~Z$3}exBPP5G)I(= z6v|t$W?-ryTT&j&k5ZBjBnmnL77&}ZcP4G1gVOHFH@_(eWh~w&dd%Zzo z>_y+(*?dqKMW+;qR1GrfFp6oue=JXH4bgp)S~uXZjvZSs0Gu4%Pwx&!P3XJ1Y?(wZ zuh(D%TE~n3z6p2FVA>`G@O7&QpZs^-IL<{k$-bk7cWek-KiKy3{iUnd`$`y<^`)Bv z>yPw`HLTi%hTpioP*LA)NadY^^@?oj>D9-BYYBoHqH4CgZdu z?A4Bl!c6b{TeKp;)Vj*rW#2i)ly zjLhw50?n{IAK$%t$eH!Wk~)iQ&92R*4-;7Mh-`Q`M~Xabr?RP zE*@uxg=SLtvxyBumJjj2J77toysg#gRr4~Q3qGWxJEhSpp9nNFs#g*_f zTc)Sv4os}vXopYGGQ+$A{&yUNXsy&}ta6Sa#ZsA6Z`-$h`K=!hQ^C|!Am2-WvLGRC ziOg>_54`yWxo?BZPCys_@2a`SDCX*v1GpUXQz|nnD7xq!tbFx9jy->mRu2Y2bH5tLy zCqirtF%~pbRjx{nLCMnfQ-SLe#%!Is5u#`9V&WO*j;RqIYYdvGNPLmEXKje*KcxWT z{mWrp10OM2(8iz`J0eO5HG*$IzeS&)YJI&Cc$hmAZ8OmYYgoGg^x|w|G zQs}VQu3|E=ibj?tec{qJ`3b&h#rRC1^SV1&c866Aw(bMw{GPCUfUSgU_!KT$nr{Q3 z`Z?!K#|P(n%SVSi9WZPGuc6s3XmO&-)fsFBz^l_)!@+ev82@o?7#8z<+Wo=(rGwr} zQ}O`8zTjbI96RU}gGK=lcrEH@I4ok!ijX)tAr_KdU9U$6iFygcTAyu6uz*h&j9 zkcK}tX23?y0e^ZJDT+57(!`JA@5!4ycO`TZ6-4l*a5y9{3ebFupG;~s!IY#X0uQ;N ziIUdvq=-!HdE5t|n!9#-Bch(?KnDWJ0C5UNPS+KOrB;XGJ5ONX+m`u`9G4x2aOu29 zJ&g1v7X-uakv1A5%}zDDv)mxUnewkAWLB2#H#6G_h2CL%d2AFRi*{`-BwKP+NpfB9 zr{@}LV_h;%CA^O*$)^SX7bjjOTI61fukc9&lx@8!r^p%AAI@s3BCm|%+w)pu4o9PC zUG2W>gRrZ_mBZ>;PRyU8*p15~gv&465SfA}L#)*G2m}O6eaPR^pUFmZs=amO6FG*h zSWXGp&Jd&o2V>hsB&Q$=Fx$nAr$?)%RxKTMT)FW0qEn78F}W4O2&zittu^#0sFkob zUlmiV=RD+^uNGdwk?ivLw%$BkTfqjzh>hHBFFOs?tzGYf5^@)EX1BlFfJ>`HpvbYq<0-RYgm&I>FJD*m zICUCCztz{nD8_#BZml)r%BKda34Gd^Q(CI(xNt|IG-7opVQ z|G)**(-4KIEGNzSDMZ&6@t`4vUqJBEholAt2&@L^0ntNyHgP!2i1spja#*XQrAhlm>zvIV*sKs&^iP{rqDWky6h`R?$fTn zvW{t8&^CjZ>(!f{U1t??m~1|0uX6~DSrCH@cn1GrX|LCuglAfrOm)npfP5xTiV{1# zpuS4RoEPHOqmi1=BbliwNZorrslUDrg@28!2QDSHrS6~Aec8CKEPPGjE_a5cF#$V{#nGy!&H-r&+hy%taN3F_HHWj}d5dB| zvt164_az097M^|XCDNTYXP)lag8x#wlx=f6eD`;+12szH{YRS3|6&r*2TYv2^695n ztz14~#%Z%JTfFMYr=qSo^P-E3ri`z4^Oi1sZa`VtybCXg%$zmhqKmh$*|>4t+POm) zb4)%5Rs%c#v~J)L8rM%UFd?;R}T@rUl$tjvY; z&(pYJ0{KBUF9>y+a-Mx}Vhg&Qa3L)h@c1DDbFaE$?xh#o{%KfN#JY6qRR8`C3-6_g zv(6bm^GvpN0?7-ny~=f*Dd(N5Wni5e?o1p|ZLkF4rhV=i@6s{t1BHi7;jJ7*e+p#9 z-4*Kf+|>{KdHndXiHVb6d*IKp;^H}{fAQ$D5xx@O6KTLlKJl=Fm{&e^h3U?+BH(!bfRah$##Lu;cYSz2MN&l`EG$k#uTLyZ(v{yg<1Nt0gf>*KTl@`R!q?92V^DH?isfXuMxu=p7EF8>9rPu+CPzKO19UyD z$FfR+KeGN$OvfUVw!NrfnA66OT{8c)d>CbR=vxFr7^xu8ADKch_T1VEQ{d`XZh}>j z#J~<<3OuP)ii4iHCzdq3ckkwWS9KY5kiF9bgHJ#G$c`Pll|O9SY1K6~)tfdQdVSl( zIWvmJ4xD@W#d{w9$Bw@(E!5%%;?|Ih&KXmCaNK#bGafu47QxKOY-llCLLDMFY~OQe z`I=1^E<6{30lwhyP47(?I$%rjrGdsUmSZHvOR4dLkw9#&#~SXbJNHyQ z{rsx)=S+>7;_uYNczHZm7|KGRUo!=G0hE8=efRC$xicD#a$hr7!V}5Ou0(RzGdDyp zSg_!xn{ImMnP7%DU>dGzV`h`bQ zSTJegz|*Jge(r^cquUvG`(w`zJL5F_%(0b*>)4*2akawOp=5RPXa#&g?!)AtKLeuQ zSX_R`!^Qv>GQ__Z(Fd!e1l#-%$)fqcwrB5zl+Z4cev^N)l>xh^Ij*X>6%PYDm{P84W*Z7-xg`N1KL35;4}zhg-!oiEr}S<{Elp!u}{JK=Wz{xe0#j z)~#Ru@|R0WN*J7LuDRy-zyCb}goVp4yKL{?y=V>Ro_p?!6)O%OJ{+hRWbcHL^vh@{ zh(CBL7;-)J$OVgQ_mta~6EDgeanY6WDdVF<22P$obN%B_j~Fo`QCezaTCm*0p~Hqu zoU&@^3+G*T6>E@=B@(l!2X5RJ6PuPc@~d^}l&)uNJ&N+sI{R;o(=Bwcb9&t_z-3zz zw9P+yU-}`v^*cloEDXw|+NA7^8IyHcU8^_s+Q=}R8etb)?U60DN%9t6u_aNp8g~LP z*Yfgm<_YE!pn+0ZS69bGLI4?4S)E!ar58r^N2U-A6O;e^`SXADqaV$gGY1TK>7|#h zzWQp0pF_=Wzx{Ts3E%j}H-7uu-+uh#9|sAD3^I0lfJssC+jb^ice(sc*O``e_NQ;g zZ(q|g6E44G{G}I)@mzeF^g7M1(wzA>{F9cpxv8F&fn^b!LXfZ$OrnI6Cscmc@pwzs`)?AWp3!}8_JpL^~(umZ*Ni6@@8{`%`D zOqf6}@aHXHpe^^{6l41@Q&58k7kKs6R}loTBQUy*J%A*P`C!zjQA?LDWz>KE^PlJE z=g*xx_Y`5=YBrjoS^_4SUZhUfQo3GZBy?LVk2|KT6*}9lQMU%OU=C>()K}^wUFz z3}JN7JoC&ieBlcW`9&99#Efy*U3Y;TLx&C}Oh$zk1Ult8jz;+HdAjNQE2H8>H5?j6 zS4qGwY>o^dsB0NLAlDjXJAKUEN9Q2y=~hzaBj+! zDd55Q@#A;w*im0!uhu4&-GPieojBNyN;7oaA>!x*NV|q!!1RV*;d>+Exrinq70a9_ znuM#vGUN^Wr_5Z0_V@UC6Ez=1d3cmrqvmjC*%|N7RqzExda z&B_#l1L7oxYVhRAC!a*$oHc6}&FMy>=N^QDuYBbzzxvg$ zKK8MX!Ii%L^{-ExHVtb6U|G0u;R`Rk0Na{5b0*wMwOMuHMDXc~rgnOn{g){)gi0b+ zSjZ?UOjQAXNpOz;0CYYn$*|K0pmBk2T6bAI$n%AQq%SdW#83==0Kp3bkmNL24kaY4 z*g=*f$ft(?CE2Mx6%`e51eRu*6(NJ){qA=k`p}1RivkY07!M3{Cq@N5X`#;of{cnO zsEm9KvZ(YVRw;SS9S*_>=O6gM2hKX{EL=ryz4cb;5D`WtQ>6t}v>M2PQLE{4KT}tb013KDL_t)ypZ@fxNYT(I zD>d*7Ol!y#nBuY2lHmXT@Bf(6A((f(;~fypzJ2>xzWMBDKTA<7SFU{i`R70Lna^`%4kmoHfK^4^z?DJAeF>XQ8;zBuqaqwws2Z><3-lw8JVM)4y~qe8fGP0xvBw_U zxN#%k0(xKw30ka1MN(jZX{~qRt@_#%nSz2vHvmqJAJwUeD|mgY1_QMLr9cb>{>0hf zER`cBTV@2rqMd7BS^Mw*{_mgv{O2#c@IsQO*%gJkk#z}BzGI95P@qLW_~3((ADT15 z!l6Tls0$|!XyCTnZUgo2xZ@5Cw4eCIC%|vg^9r@_%GAnaj@FHK%|!aCPkoBEp?kA> zN1GA3nNdIb(T}2>qmE(CrSQtiO7w#N_>cb>GiD6@<$wS8fAJQ>s!ulqzJM@77#lG1 z0=8bt#G%dZ;L<3l;{OQ`x@w#V^vYzyJO3aOcH~ z7vs-De2}tv(Etj$qj`J}jOlSq0Ywhh3$`ij?|~qD3!4N?l*%(>#*8IPmaskoI)3hR zpMz8Y8VwVMpd{r}Z6zp5WhDek`eZmj+7WZXXe0~FoJWNapA$76M%HJqp3+^T~%5Fj40 zgmfS&+rk^iVPur@xa=H)h0mBuF!8=jb3V2=&A2B5d3(b)X|^FRL+bOi2iNdtOv zrA$N$EFjsSL4z=T|KJBd_~Re{2$?~&v>a_hx%!=QFF;%jDaiKFHl&WF4I4Z4^2;aW z1vmmLxZph+!FAVN$MlXifoPy=M8Ze+<|~hifuvO!^1ySPNF;594g$~#q=lOx0m{dW z50AUxf(uke*dJNQ{>m$_{P2fA{D1%N|6%J@ypIHa4Q-n9VM=RPzVg2J++AX5Dd3mG zZd650eia$3DuPczcYuE&4v;bkD`p*}ZxSFGEES$Y7M>Mp+cV$=khg!lmQV4}n1F>c&A5)2$TkhYOsaWuyF-S2)kC1bOoK!hC< zV_$$^;0u&SdQw6>a36N2z=>!H1`B$MqcPS>IvY&gC+)RuJHEiI5{-IW_=DawL%!Z#Y~9U^W71E{{-vCWb&UvubgXBL~QGVvB}q zz~1DHlZO7ai5dYGq=lUiL+szmegI_BuLWJXSE>eb?4a=}STbUloo?kGU0$E=m zEKO#q*Yk!AAI3i{f3N`CwTBNMhP8stqNHSd2W^21P%I*M?%>)^hBVks_@#q7cdhNLuV*oZb~Zjt-V_2*zT+P_ z#<69V=WzC;?3{2TOsywH#Q;^sZ`z-Po0i@X8zgL$OvU2p!jT8A_hlOxBRno3fYIk?IE z+IkP$mALhy+VwS;5uB(ExoKJ}Tuxr03>`T5z4!B-sL<95>VMxtrqEl*yhSM#^7pL? zLJ$@rgXrFPL*oFA5DrD;5=C?B%6>im<#;FuOxa`&QO(mdNkF>hX^3n!SwoKIX_}YT zVjBFEbj!CXh#rE83gaabgApQp!?3mTCxlTe!0COT;1oDL(r$k_UY)%XL2SU-)*|Wj zz8aOFc>i=$4RJ-letkfC^c`s+2lzF*zYfsiS51CYD33XXP{ z>2P#eY|P?m-C1!DuZty5&*L