From 2aa149566e6b1c7840b581b537a5cf848cb9f810 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 11 Jan 2026 04:47:24 +0000 Subject: [PATCH] feat: enhance SPA solver to maximize scheduled courses and report conflicts - Update `dist/static/js/solver.js` to implement a Max-Subset DFS algorithm. - Add absolute conflict detection to fail fast on pairwise incompatibility. - Add logic to skip courses (pruning) to resolve complex conflicts while maximizing the total count. - Update `dist/index.html` to display a warning for missing courses in the schedule details. - Apply a score penalty for missing courses. --- dist/index.html | 4 + dist/static/js/solver.js | 267 +++++++++++++++++---------- server.log | 28 ++- verification/spa_failed.png | Bin 0 -> 29408 bytes verification/spa_missing_courses.png | Bin 0 -> 36025 bytes verification/test_solver_spa.js | 122 ++++++++++++ verification/verify_spa_frontend.py | 95 ++++++++++ 7 files changed, 409 insertions(+), 107 deletions(-) create mode 100644 verification/spa_failed.png create mode 100644 verification/spa_missing_courses.png create mode 100644 verification/test_solver_spa.js create mode 100644 verification/verify_spa_frontend.py diff --git a/dist/index.html b/dist/index.html index 16cbb35..906634f 100644 --- a/dist/index.html +++ b/dist/index.html @@ -283,6 +283,10 @@
TuVi#}zok6-4IoVVq(t#`}H>q90ZqfG=v;9bT3!?uu-f-fbXgHolQETqKUAPE3rd8If!*%-dO?FDOgJAtG)`ib7d0F08I(6v4@LzzV{8l<#*^@}%{ zv|Eh}*3_mp4l7kkcW*!bt*Seasr6eOQ6-cVC@<-M(0`a26Uzi2!^aI`kOoc4Yh$(K zMAFM&K!Uim*HCi30jH8ru3>|}hvD>eo~!BeCa9<9ixLkQ>QhsI_|91PpEz`D72> !OP+(y5 z{qS1E`mUkMz}@>ML1nX_mdIspXE8}(tkYggigU~K3tJJxuS*e0Z> Y*{o*5#_p;KU}Eao75A23f|4{( z`)=zvUnbh>PE&PKTVwr)AhWgJ^hHIXDC+pdcfzo8wkySTi@Gj$?wk0Brr4TPqIRlM z&+D%-{(US2)bw7>f#n^J`gdRUI>1OZY4DFpFI93--)G6GO}ilCwBolBZysqM`|s?2 z?#8J*>}DsN%M*r?U}q)cx|X_IUhkvU9hFL03RxUnxciuJx*Y{AK!B$g8RT z2_D(s5Gw<5b0{u#t&^!BH| 8LeS3t&XL 7JVhO1a;> zZRWi^U&bx5bVB3lI9|)D5}Rr~h;`9lanF;g-?DJUvm<<0#`iv@QTVV;@K1|nO%Df% z6|#}E#CNqL$xJm&1>N#p_e+XJKOm%}g$*+hW&bVl`4ur?(xIn)i-Z49Q0+6Z1H~zd zVD&mb#XG@|XzkNttUn?6_hSyW&PGR;+01FEavGQDC2MMGJaF?&8s#S%b=VxzYaT~3 zTK2S=+LDheU84=f6O_a+<$8Ic!n2+k*a%`X=Di)sQ7tHdsHd_Hp)wP_QS_3UQ8BOS zf=_Bi`$4=dq^VLz$sL||>KH7YlBZ?*+IH;|$K5i~eZ2Do+mvQL@z&jItSkG0lY%`F z0W@qTW!r LPl@N9 zg*5OxYJP2(q8?S6h~|L*jEv+A7S-(6MCu+s%}0EX8;e3OE)EJ6Ik&Axe#NATpLhar zmb$ubOz+D{=v2}#to0n}?wB|XXq>yF9NOm><`KBKSf9>Q+!X0Id{7|c97pX9`jcnS zZy}HOLzlO5gwS?uc!~qzpIx}^#FpCW%nHA~GE@U}_*N^Xca}IF9X8F?IWd0^T@GOr z^H3D`Z}3IurR}Dch)=bYc1(@CA~--0Du}V;3?5&3Po0#>ff)TT<8x;ryqNVhi~IO% zt=5pQJvgu}$%5>;!YXq=p4JggS(HJ#me-ak-nOtftZhG8UQAcxJu!-*7qMfNVM>ry zTE+YKTNDJsJ>X3z+&Y{?R Wm|h)Hp{Mb_EyDl)BnfLK~g)jrKRY z$J~A2^FCCUL3p`aFf#0A%2l AyXH^C+qcAByGmO>!zIL8%qaOiOHxnx?0K+@)uYd&~58KKgY0{JEMQe8jIL| zbMyVp>T08{+|`NQ`)Y~~B9Sqi)!JRGBaXjPW8Wh#O1~4^cM3N8AnaJ^7;xA|5l1g< z?~DJL>b_`jj&5v?D!_lWf7J755?fd^l~a6HEdPh4qB=uI_Om&@?UN@MJWrjP5sC2r zlYH96KJnM|E^!^k!&xOE*|PXYqQApn2schLu~q!Iy)+Tg SF4KobaPZ46jTzGF(W$iQ>ou#P(;EUZ7aVk;ptnvH)IYuUd(+L`~*ir|W zMjhh+tnMr%u}t_C@w7hln3QjSC5RF)`M_1J(sa>c*_X`1Lok8CEIi8sUqDjmYf(8C zTy|>s9p$gfP0WHl+o-l9gikCfvJ9qLX$w&L0X1r~M@vR(h-1k?O}n5=RHj2NWp7^_ z8jN2Je{Va%QfT@8EjAS!TZTO#pjQP|RPg)HY3S&g_QmbMLMk@3&CQthz2@)9F$)j) zc$@rs=($}?H~{LT?m6?aFiPyGy2GC)1 &^_hU+ZJg2ewf_N@IBiP?rQ-VL#gQj1TCEO=o+ECvsb2XR}s4^xn?aqD7 zL!6Ro*`P7OB0#)_5~8@mcOYhdE=^4XZzc CU^2=$+w#XmTfuDsRX( zhLsZTFXXwN1Sf}p*J4cRv@U 9AG z1X|+<)e^2DuWKr ^=9q?w6^Ms`*{qT?opH%z=PXlH3%{PTFu(8j;_T za#>+e5*%l4W;iVq0T4f)<&Q@~PfURBecEv^Qo>_ik7mp6jKvXQAjK&Y%94L7-S|S} zxD6+^_0!*1Q3HAY9Ru&~m#B1!2Fg_uR>G+veq`9@pkUE{-Sd@YL8bQ`M=%-0*ut&; zW#!pgzdY%AkSm_kv=o<6$Sd<>BII){+5|)g@(4DoXkI~jdDjAhw)zs~v~GY0MHLO@ z_Zwfe9)`Uo@Ga{EZF?p`^01=*Xxqk?xrbx&omQ>QUEkB7WV!{h@#VsJ2$&+$^BX04 zbU-8?W*j3P^Ax^+|LXGTY%LsSXd$2X+V!g*u#kq#(xb#at14f*>M>PjPRooe$D{x6 z!l^6)M#U8`aVJPU<4Hu SpQW z>uUcl5P+4m^tC?|a9qVTqi#cBgb#ZkIQvU+X(qNQsz$v>IV~uJg-KCY?%=KP#HHB- zg~vhU|DxQrW3;ikdD9#zGLVzBt?jY6-@lpe`;PbVVbY ieLqS17uZX7GjGmveZ|)se zE4FV8+z8KJ`>w v|9uQV$=o1LkXJ>Wm0_T(&R#Ep&y5GR`=BhReRZzX wL&VY@y4`376az zjz?PkehL5T(3h3Od%@tsjSOJQ_}4;)``PDj9vlM-eRc0Dlh7G;YtNEMC|Ab**yL_z z4)*xHn<5wq9hDP}fiof;931~Pj1QbC>e8>{+n=+A7Q$1;QU6kdpV${Xc>MZAfTK!S z>ZAI=d;h8(Ln~gM2q hR5*peQm9ekMPy-1bd_7>(Kibwx!!KLeP@& zmVe-%yO+GZCE9-c?El3o$^VIo{9n&i{@>U5tkXB%-&)G<#7W0NtZb@{%^p2p GH+Ld@qU{%dm}NElX@rn%NIS~4;X_M;*+11ZH8H&yEI==~rmU>nF^S25 z%Y#(?RHBwc)Z`LC7i?`l9(_8_2HE;i2;(q`_A_4`N~u=*r&p0eT^HI@R 38IFauFF%6+!rO7SUz%{&im{aHXQ6t&)^90(5PKEes3U1F87;vAR2K$ zB9$6w3)E}$KI8G7%Nui%TnBH?Cr~WK6O4a{JUrHi3xXFX7%Q%1M31Q@O=oLK!CvC4 z(NnEu?WN>5U4Fdl7i1?Ul$}!U-VgD6?_XS-QU1`s07(*5xNC0_Y_wE5`~eN_O6oBV zBWAy}Y-kb4Ex)}e5J9>9u%UXM6tIv|^|OJa0o$k~p(c|sR!u2z3tIdk+EmMz*pw`H ztefp#kKH*OHGi+s_>3n5!|m*xhjHnG<2hxm{2Y_?fTbxgrjy%858x)_(wk?OsOrbX z$Rg`uTV#(^GytE)w9x++RA*y^wOqxu6uo6de)Eu%hP0^-_6t=zpCx!6Srl@zUB7&l zlauq>{Q5e)KI>=iBrLrdfQILee{8Y=AHKCqT2CE}?9}F|9nJ|={ =faTcI zwO4(YZcpe4e(2*L;=<}6)ZllHzWSv=26@L^=PImj)U4HR_YZJfP6cRSz*%5Cfyu8I zSb@v0oge+&B47J3>C|zZvX#-BtBzf|DYfWE>7NPbnYkx=%0ULg!@Gi9rFM-SzOXN! zZ)y@W<{cKf|5a05P(5W8rE8ouHj-{E5MgLQt<7W+Ot8J{5xlS~)0a4082d67-8k6T zaJ9&k57vuW@_TuNg&|U~`H4JJZFOTK+{^Ek(FcDHmiEOge`1pZ KNpi;${nS>rd7>yQb|nFlR&u`s3Sf7LnZt zok a z=s)ZLe8c>%UJGvmiq@|FwBtsb+oR7kHa-RbBtc!xJn5MJrd0xmVI|9+)mZ1$m-U$O zflayje>G$sS47*7zCFX;2xwOcE>Xoo>w3Sn?>~161hDA+q4*5s!2Z;PIPc=vn^HMg zP`wGJ@R9g&(L^Z!%_C;u$*)ZLOfN)ETNan|$dAzWYs)?filMMcx#lG2bt9Gb<5l_K z{^d}fh;jLfb-%W}vc@u-_tH0h^{(8RU?Ts@+W)i!D-%P7jGBQqZ71GNhuO5M{TKh0 zC;YBYCrLalL-?#iQpz_a%P&+btyeBcbC5#jawxmgmunrcIb3W~Bh!}SX6d!GL6E#R z)^fN! B7-?~;QjebIeK*iKx4Yb`D-VpCGyWyDSQ_w37Q_dxq0kEhg!#q z{Z4qH=(U} 5n1L%#{AK(kD+mcKv$r*B5$Rn)Dz`)|JCCPJ&8p=sG|VIA33OV~rQ| zzYnX;Cm2Wg>r7M#z@|TKILXwWK`K53u0v-R2^PyihM4%YYDPtJ40JU-k>mB4hgkvF zVDTeU(r6bx-4XFp^6uMN*uQn+p>_9@+J(HLq9UKAKI8k>JUl$Sb}w|w?i!@JJLozw zcHG@7iD=q<84^<+71;GoIboQoBZhxh@M!aP(vG!ptG~9CwpDj#I?Vd1(yE5hzsdg) zR#qmQqQ0=Uwl+V1=S))g8LMOAgywUVG4$U1ecb>5xz)ZQ&0q>Q4F75+#l_9V^>5u< z%``POI!bZD4a;B4*{1sbOi3LemFgFpnVTyrC>*)v|20ZhRyJGSUn|xoUp3M1`-Qdp zH$Dt)ixgTq;XZ{NOXtYRy8Mdijoyv&@^ZF|KX09^>UT``YyKyc3vxmU>96k2hTf=Q zmcsq>y4o*!|JM2OzbdqgrF--N?S1RoS<9xyPwaVslCB+Ro7+DQgL84v&e+-L|NK}Y zq1f9&ov6*nexS}Yu*f5nBCmH_DR9ui{q1$XtbeXsdw+7}q0xoUC*Z;7`WgTIt|FmW zi4J(ve!+3!`G14yGI6 q5 zME*n%#l>sX-f<2#-+#`8r``3U6GpJjHGU7?;bo~Zzldx3(~oESrL#NrY*tXob!%Mx z{y&}zIdv7liYn$^Az50*tM(Q>{o1hLb;p77w6r>!E(Jx0c$ed1IY^lWmyZSd;1$cn zHLJAHckEaNxk5;d6mKwjY`$;FFi j`a<(0b@m5=Pv72c8Qd&b7Gl1FMAZq2uB3l=XOlmoDpVxvfAlwnj@kyF z;$=p+;`F+iezk8S&?aAv;uDQQcn=a(%)t3JFMu8|&8q4@tW$=a&NiRB2B8iFM&&@n z1Z4B2B&?os#0= !H?bUl(>qbkj|lz 9;uHb>8Bakm4P`V<7@jwd}=)lUwViflC>% zvV#L4fH1AulyxbT_DM-zR-+qz{*&N~#6 o=U9? zUs$dm;cnmf4hf|t7E1BU_RMo;Un do7#?0dR; 5;_7RAfh0>hHxkWMWkt@caS4Rkt)3- zgn;zktF#D+)DU{_Qj{uS;7t;}=iYnnJ->7AyYIcv=kXVr*)y~Ep0(HduJ2lV4PsgK zsBCF#Gl)o=gAzz4=jIRY(9?#Op2AH6V>D3ZqBZ*Y7Sk -VNgbrzA!bsR6 }#+QjeG zDyKL*%As%7ceLGL(C=gpRj*l6Yl#1P1s1((D&HB&DwGL6w&GA&CcAYUeM#8OFBB7o z-{?rG4J=91!Gt}Tdc=1RS=AL~3T 4xcS>RhQQ-xXyBcC{Ll9`htF z_I+e7uoMhY%&S%o5s2D8>L@0L6CxOR7N3;9zLAk0Jd$ lDB%od>nl*d(bjsKnQJl(aj0ymaUCKrV8LSIg${L~)mR8aptM95PE3eOy)x;|X zki!a)EZNC}i3K^r6YiU3K???FH(=NS__V}flw(7(jYyux`D6#_7$@n`$ohrB6$F`55<(8Ou*KI>j$3h#k%L!XFog5@QqKnXnnU)cCM45ot4L{bf4$8-wii)!?Gp zTW!1sM@A$0M& )#dHXk+H>?tobDR9Dt) z2+@zgZw;XRD(KPa>G!Tg@VSC4v>$Y2USgHHWDcHpZTn(r6v=riP*Ze2A8C6t{}`t- zSrU=!dG{nIR-SZVj3PVR3#l425R%FIl?cS zgP-w^ABhUe(qVcQk`%43VW~r|NQ*ZtsMPHqeQT
zx2LDRkLVQ<6(z^@rSWaVOl(3zg3WE9U77w AsILfaIxVX)?D{F(m3EZ znIJF}Q!Yx-=e%Sey>+F1fAFsV0s&-Ra+f}1heHHUOnIeZ!xO`!lblPp^@0^EEB8rN zUMp44)~8z(z%Z%mUYkc4A(f}y >H(AY4p+DI=7MIh8o~-{ zA-EDu%WAas@I`*}7`^9+LXOz^a;awmQ4Eh)VM%YCxBVt%ZszS>&{L|5h&i(Is+4E! z3^hw<&wSzu{v2!86{tv*t+rUsg57S%gmBayB={=31`}!2Z9GpITPd4qJ>)nyh!Y=5 zgXVJ5A@<7;T7^T^EK_)cPfmK=sOsDwZ$q( &7QMqVTErz`*^x%h z-D|+q9j2(g+SR6=!Oo#_w1(|QA|HLGCAq2Ecu*?CZoqMDRqS~YeBk+cax^kL3JRyW zqAa7=KMg^?IvC>UDuC5>^W@YF>)+V6=-35JL$uR9Zb;)CDS7;=T4zLBChz^BgT9Q? zbaNWVx=B1824#sl H0kvONU)vg6VX6SzXDd+a z%%Mfp5zo-nhHDFLlN*)k;`EFS<-aP#WG8V2H2O{i#?T^-KuQ=^yQo&y(rYR^E~f^8 zFCimq?(x4~DLwr=4AB&eR9E9$6)%Z=zQub*8Tmb@&q3IrhH5kMEbB#2=}so_g&K+) zE(UI+Z;!e%Er-zoM5RQyUN9z~YGe>(9XZOJvm3qE;44YPmnU25v8PSpTp?v2sDH3h zP;H?l8vQux_17)8s2jn^^6%~_-(PFB^yWpqYKM{?2V&EiXDGsPGGbzK)|+1^X=hrw z8{T1kwn-S?8hEB6*n3`dO)LdFD<;J^A#^Ib;~}q1bW(KU_uhzZU74+!W^KNX$Ue$> zdO=u!!guT5#rX>)G@O)A1R$=KI&DpMh -O_`JUZ`&O$6fR3lYtfv5e|G*2M9C+N-1h!id&Rq@2ZV{_Ez6EETZ{jwb9^1 z5&fGm3Vc+h`4rJm#=%rgsMIb@KDf}R!X1?+u8vLRt&u~5r^^6L`t0~kSGaRYP+i{O zJDK!nVa0IsR4rlYmQK6X*do-4C!G!P?V8m@-3{}oAlQ|<&yo21QorKsX&P)7mqZk% z?iX>n_gfDq=x0`{dOcptA+LsE9_4b~a?mh4^Co&TDDP6nV5Kh`#|Z~J3|lbVE)qJD zsx|w ^xWQ!@OaqC z4B+hxl!Mr&LCDNw+pujv6F$9_;<~V|nB=e2mELlq0HZ|>QMYEb%(*#R$7$RtFr2ye zPY8sOEHdFI7x2euga(~{IEbCChnp|E(pebI0G7HHS-axvoBoxnre7&@=;enM2UpW* z@G;+044->De?K$5XIsb}qnU9$Q`9&e{N-Yu8? dTzOHHVpo8XkUeeY<(Iq*<8L~c2?Y>=s?F^rp`xmSRyvDz0}!G5Yr%av4Rb45hY z8A1&_v+;eUzY!$nYZ4=)*8D^9nHzXgZ_0&OckCL$i2O7w9t#|IpSX3-`Y(B{=JP_> zA=e>15I+BFWbg5U{BjP+hg?p%UGSI7p1hDFGx-^hV7yAr)RE{%(q|!}s;Y{=vA|Ng z_`<>h03m>OdAbJ1#{6pzKnR8aGU&8UM7)TlLye7(`;pjv;OkLB+HEiOIyyR%`J|?% z$^t_Kfyj~r0|No?zEzMblKkY{J0BCpn$b=*{J9>Apnr}|5=Q)=P#+3Zjk-B#69LBH zwts*@Ou_OwXznQLIQENnNaVIVP^|?Dg`PPRnvual7>5fGAzb{F6frZj)Qh+%NFqsb zlC2D@v M1%>M#D^b)4?tr8^pN=Fm#f5Gjt#hD0=_IF zk%Ipr$nuuU{=WIyG)Lyf{CNP(rpa8FDuqv9nT3wc0x$VDyqYx@7w(SYw>pkP8!tnz z{w5QIT94w%edtSpM8a>Q&RnU!O#rl6-N*j~ahFla-9Cmm$UCZ+T@qfwX8vgL;!U^Q z4B1MT15%Y&O0gB!E%m(@!ntYav9ehibXgfqn`8`P22ugeV@V?SGHGz*^-dL0At{ue zA6A&SmECJOvZxlQ`7H6vQar$1Tr{s(>MwsX;+eZ+DW~fCpl!V=sC4zbHB9C7(o-i< z*741ehz%tAn`&}Q>Gfs4;CVe=ef^R3Jy>>cuBTv8$*CtF-S*l;d6kVlL`IY;*#o8b zk>=VQGWO)mcoZJ;c&HpybAm0`WucdA%?J5)DxsUh`DTfdFxS@*@2|F+5yZ7Y3jO6C z+Y2GJWLH!!jP@(hl5lKu(=na#JQ#7eY )B2=C{E zqUJ4}OUecelVYMdX%<>t%NO84A&bGtCN83Awa!@@4pNo-vAJ$w_8K>RVsae6VDsqT z0TknwwC?-u<(bAY?^@dHR%rqDqBY?XAc=Zl;Uy~ zRME>R<9cj;;c03gKY%3~l;V3jtsjCjm=HD;r@pN0h?b)LF1Vq;g~7m=TR-1{xXd6! zJ~%3hR4WoigNKoAmN1fieB4Vw=TxH+m%0IVPC1$( 1^tgB=12;D;!gqx$`bGcecdpZayRB8t4U oeHC8jKs&aJeQ_=0~6jrV6$?yLGviLkDc_MF!?gL-3RZ*Nvk^85(jC|@de;H zjRLKrjWo)x@|zh!c?mb8-P tLaeR*7Xv+wa$`6V${cN`TP{q0zcAi%|x=(Q?BlvD>g}MOufnoBXO9 zq7q6Nr^Pfi^Uv-zPaPj5-@~js0*?oR1y?}IBD1qIX+eHyEoO_VELp%wS|;YW%RX-F zJd>_$=^S b-mZCt9SBS)8dM!LcWm4 zxIM^6X4vc GQs)r{^;Mt|Z++j+514)J!a02Vmw0WDC>B*UUKa=axw2fBma8 z&j}OUrT@)ZbAP>@9Y7& aZNbkF}56w8U0%bqGtC?%G-YWaLMmiCf zL(f0yR@^U9Yu@m^J^SvP@88zcpFdr72oc {&PMIA$ zv~bdYY-g_}Z{rd5#_(3cB^|SRJNGf3q>qA+>+z!(r{j!hXCu?p*6y#eU*x3^tf;8K zpZK5-fkXk=*U8Dr&W^?h@ZIo-fBAoz@bW*-#m@$e)I=`L{!}|VJAQtCb%`=;Y%OT? z&L_zYI{YApZG_@f9-b8y6$K)8pB@&uxVr})T}B!M_&Gg2U0L7iaCfb&tn85qt~H|v z1OnlX>KGm#Zf{qlylOr@m0muntlB_hdCpQ654OXoUTzSNA0~HW%P!+CX*?%*3SZ^? z4-$!9ULw`^|EO?7I;_$JQk}YQX?9Q@)k)9UYHS`+%H7|CZHkH;oph~tJi?_3JZsMt z34}?!sTJZ{{<_AAH@V`M^}XHK?rzTR)rJ>b$bnSwh%l=$HYXo^3m%$TWGEObVER1n zl_rn~lzu&OEI?(*6g^rCC^9Wu%Z$rW)62*o`R1YFCWht+sk0FM$mvvIWX!Vr!Cr7A z+HF%?IIzp~YNp%bM)!HCtd6ltrwTzKulL0@D2t#f$wAM94wASy{^wr|XY?G;jK+%J zI9ex7kuHQkJs4Ot^(1tUp7;y9#>p 28;*~aUIGFq-E>2fPHX#hI01inAA z5J1b23&i(7?2=asxz6{;NkK>7REaw(XS{OZe*8pP9-?ko%;y@gJ=L;n7HA)M?@X;J z>+!deB55!MXPY{efonHK4Q8WW(yRThqdE_Q`n7s|C44O!%lR;(4PRy7<~oqJ!MiYn zmE1(1E4jum_B`8jq^|(GJQVv)AnF}=e(|=|vY? n{Sh3SyyI@Jo$K;_-rZUs3FLWULahz0mXO!hM1|&&SQq*CgVTrPG!x&l{ zG(9OSb%5(;m99`|!Oa#VJ7e icipkD30^mU+qe`PI!gXS^!dHp9bnmB4x4t$jJx{y5Q{ z>W~FFu~`AJ?c&6DD^I@-_=ESyQHpu?);=ThpR!e+FZzipa7gdI-=J5o9dI)Ad2jJX zHyy*pf}5m#O6p7Aa(C{um{qNkz6`%{{ewZ&^G#pbySpp#Mr%U>45189Ke#T&@HjI* zE~pOL=J^QWRF8)MVQ2yl^Y*d*23lQNsrEeF#jiUh{k!@a;w)>iu>m9C)_sWo-IVeZ zR@XnZ7Zk^;&)o+%M@J|K_511OU7!`TePVuLIIILdO!C>j?wJQK%uz_V1nFMdAt}K7 zAyX`F#O~^%ubGO++>jTOKVB`91va0YlH91Z2Q-5 6PoG+u|-fqRc8kL?<^udTjOmxlGVfB3YJojBkTc$Tx_2+Q9f zZJbL;W!s&ZX!8G#mGFQ2ZTNu*KH6d<(mc&%f(j~*Y3CHO+>JF}pGavid8o{9k@5}F zKAFEVKeO_-^>ZIXV5iv!MKv*bKDE;bEDl+DH&079hR8ElnP{q@ch&cxuiroBo4_u6 z*#fC=vV^3fke8Zo`G1}MFgR~t?!=2$2`<7GCXQjZyJ}L_#YJZX55wbt%@}% |Q+5Ka2Z4_3B4>>d%zAoq|aM zmR_o0&brMCy>`0GpSG fob rIPYZT^Cw9ZTq=`^Gz+7k3r7fqWX>yz0wE z@%DpY76+s$C1APYYb3RqcQbwwGQRFZy2HJK|$|ICsa4=7Oc tt>;5ghG)O* zcaR^-p<76SBfQ0)#Q7?)eTNLsc;{8q99{O1r(#_=`$ou#vvF|v0kdC}+ ryE#koEvVC&GS$ncpEU`Cr$iegOBA@)Wpq0eslA4n@conri%c zrOg27iFmQ&eq!E5Wl?R@^kZ<;p>dVedQ=E42?Mx@Kd$O1*>~q6r(1V|xxwb#dgikU ztOF|GTqr(d>+NIz=M(~NwqEy~KYtzoRF6yWn-&0uR6lQbdwY9lCu$}KAM^!SN`OZ_ zcTGNsRcb_b50?-F?6cqsybvtU6`~p|@cvv$tlY#&J-}D#D~O3 z3MpT)RA&= W jua)X4@mYTMII(WP4lnsO9?cRU3dhD5&L!%DrCbyBSM6F}Df8pv@StIry>aKx z&d$-8`|6X=k3FZq`8$H}`qJ>V%=hUt-M6+rs)~)LV?HM+r=RTWkK%#m8#lnj#R&}O z+tymwEn;Hg*RNkMd`dEab4rCJlbt--9Ve_HF8+fUFa5H$HCkp3)zS*5bEBoDMTP@^ zIr-IA0NvZiHa+!2KPN73Y&1L_EpKdWq><#p!YAvEGW*F<3O{;dGFEA;6;TlBOF~SX zzRe?bwwajl0Uppr#Z+iV<7vN#L+Qq{gw_t+0s AIUM5SR|T-=o_SMWkDKnD Am9eI<#XJ%Q5SZHxM;2!5wR2-5ZkPx^Na z9*Ccq0&LCz2E#y4ziW3C7Iqd2#Q>;E8$T_Nnt{zq0kQ)F0}ktB5`nEVYir;GpGYqt zQxXtTKFh4N(F)AqVEC`Ng=F#t@T~q0SS0%SM2vXxi(-}1@1>LC4e;$7EcFx)8}8D3 zm>2j5D70MG!~gSV?95)W#A1?r^qN5Ej;^tWzT+LKjik^G4E&dRf+KX1Lm%e_Rl1md z?Z9SJD>JDjGP)mES1>RRIvK6KpyeT0mQk;?VVfq#-2qfi8@%e{j;pjT53UclAD?QB zxy$T&oIMFXWfdb1a1y%pc1=ebqPFjWLxE3Hz&sI9=_JdPg^Pzn*^mI!QB~o^T!Z@Z zMJu#yNs61RS+05wJJoWIR~6#fXIwl3R4hkWaepQ8<~I C@lJ^tJm)70^#kj`atbgah z#x!YF0d)^&Vas|fl@ 7C9xjK_USs`Sq~H7|uXFLq znz*X4sQk8>C+=pqof1_zA{g%i0XRTKmFV$KOibWq__EADy4Js0!heG>|9c-e`0J$8 zPvs|W1(J5DwhFAzoeOFous9F$p0Ku}@urlJAP3z}sp5+K_1ZZ7()Y}uO?qnJO}u@c zoPV&^EB7*}?4ROp_$($lvZ?NE6kgU%@L5wp#1Yj!fQMd P3A?TSw<2)= zsh)ChSeK~@xm7grX!%L}@y9~UM!$}DBjq|1AZjDm05_+Hd>$gqdCPh79ffc@T@b~j z GL-yYN@9UmF{2E>l`RC`mEJn4N5#&e0SQc|Yf_jo8+8@#Qyvxd39;>pa4{RMB zH89Lif3|lT_&SH>-`-inh}XD-Z53dVbhx8RN=o{tyrlaHsm{M`F#T7fvHtcU8u-AV zEbg0vfSCVr @6wo z^C^GDw*Ki=HpNR86A_`kbqp+Pf?14v(_~^GK<8s!NMe)lGh!VUcZJeN?yPsxYOZb$ zt}nnoKRU7m?Nmkwxqf0`vw+9$>MwZJ6&3+7-&~YRZ!{?Vu2>UAvksuq1T6Z5k&>*J z?>u#JDtV*U81y=w*7~B73GQBD n*0S4efnO4)sFarZ@ z?9yCh)R3(L#%vI;KJ%{$mqc#d7{p+dYckpi?}Wv8tE~Q$Q`gf5xuNeo{sN%DLCP@? zDVxJ>Wiq@DQ^2q|jG9lSG96}jX^@%pR`bU@zx>-KPieBi)ZJrX=*P#+pL%i1k_;zI aBp|Fn!RSQ7=ObMI74NCt&A(&v;(r0!ntvq# literal 0 HcmV?d00001 diff --git a/verification/spa_missing_courses.png b/verification/spa_missing_courses.png new file mode 100644 index 0000000000000000000000000000000000000000..815928b452d5c78c1865619bf351b8269861195a GIT binary patch literal 36025 zcmdSBbyS i{s8}`dCjD92M_NN-a7?39nbV#B$08v`*Qz2(=dS`zu53U|GW(SO7k+ lL{6^iNn UNGV z9zVAI6&t6w`?5@3KX^uYI6hR%zS$YPY~aI*U%3c7_m#WRh@e@UjlM@;{?k8o$8G{t z58Vg4qnzU4%>ws6{yP!(f5!1@UgHtocKnvV!2kS1z{p1Ni5;rWTHSC z^G)*}&a{O@6S!w3Q0fxhO22NLs=zCYr1ion&jvE_@W{@1#+D>;6nTzBtjuoib*xmN zid0+!=5>=e*^TP=PCD9~E9uHt1H{*E-zL0qhWZwwqlvpi6+T{QjVSMBtze|v^ *Rew)r?`#pa5js!QR9DyWhDaX0rUj^Q%8OiE GN{jr@pvlsH(y=c3V!xD}7^sO`sf2#smE9x9 z`YbUWl6z_Lt>0+;a!G&Xax!e)ppz-Wi)qI$st))Sz3CfM84u;no4Nk iAuCHCJOXpmR$=(iAzHl(qV_|<5f}maSD-++Fy-s_!&PK4F z7+dCp0$;aowop{gRAyYSl&4{s_R|9YHj**qK6!d$@}~Uu-}u7Bk>;AQuyi}MwCe*I z_x`9oqkffWsn5M9`q-(dwkZXL)`R@^p#6+cJZ`%F-4pYFH_RdeZz1EI?l1f6S3GVz zJ9*c&wM{{1@#iFjWG#oOs)TUY%sGH}@N`GcEb0~R9Ix@P2a2z-h(cYv w>g?jq3KQMthLq;>$`e;7V`$0eVd2> #*i xgKmfB)-BXE*_2XSqm_o zE#y<|Io2i=O*R1Wa&jI *$ z_clLSPMy9*VlPHT?vQ9EcI?Lt1q_y+JS>f*x!gD75TqYE_uoe~%s>bf=f0RCAG4>c zp{>#qNq-Oyn+CM6N1dM*KJ)NW@fBQ~$&9kqLM-+w>v(KZi_{LG=eka)cg3$i;HS>F zxtdnJfdurU=WiF2e)Fb|(ucIu`fcd*j4bh9?sdQ{LY_CvV#B`ZR`gMO4o&rf0!^ zY6w |PMU#r>MHmT3kNqtoA4Af5y?|S8I5gICH&D$SuTg2<9NlyrEVz6 z(srPIVxl%-NYohuD7SRSe>4|(ZFG!Qay_=)(Y*&ue!8}BftF-Gi|#3^!nH({*xM&N z(L3 R_>ZVF%7s{Jg(%sdjHVt ^e-$uJy53hsShRNmRc3fjcjRMxyTB*!BhX_={y;>(QTfmkBQR-x_XZgS!hZ?gl#P z9L#$07 hvZ#oMq++Q_mZXuAvdjxYe-`Qdu>(j^9EXh10wooC9v_Uks*CC+ zOUnD$eR6m7{3jbnE+H9_Ec9ZBS=sUmL#iA_F)BJO%`#|c_!oCIsj>x(Aajt~rlFzE zcC^b^xpmX)7eZeXqsH6!-+b?xxC`l*I2Gue4mms= >hmdSG{P{Q z 4)-RBq}p8OZJLYu-^TmW-Z>abXy_fU=*hpR%uDyS&P#XirMPj1NAv#9-zw zj|&ON9>b@8XTF7TSq=WJTJwPg&K{7od1$G0!pQ}PhJ5}AKTv$_upC6e8KIX?!Ux%O zUxILmG67Qzf4q_XjECnbZoQOhU14 4f_$Zd{@gorQ6FIG_8NP2EwM-qfk7Hr$}28N**siP^~=| z>a@2*RD@m=WOBB(Gg(n2ueNM(Hk-u _2F#s7pP&=3Jgjq^Jx^p@FGg*YOeOC zGZ7z Eri1;J;7M8U8^pltSCQUvHCVv<(rx^-VztcEz3)IjEwv^m z<@TtGoU!pH_57%J?XzRbarfrnQ3OAs7hh)rv(2Kc%8s;Y{905_dx288?xkbV=cNgQ zU3Hh~rn~E{AP~Ugg7NXk^v@&ZNf}MeM(B;j w8*2Z}_t8mD!#U$U8|* zRu_B|Gn -)J1GC#3=~#P z=UF4rmumI$zFzmHQa9bdJQY4q%4*wN&$e2x+B-$ZIbrDL{qznx(p@H`u9HLdn)VC+ z_F+-tgIF9cBVldDF#sd)x3Y2A^nU|jzBcRw68;Oo{6ZSu0zWYltV6Sgo3&G TF^CI&zgcQXHeDp*t5p3<`^VU%23t>Z3toooXV9BLT`U>PN-r~LG^+{hfW zZ}I cx}CMH*l9=(WS`f{Gpkf3d``$=s3UFpKb0 z%VpTSM{+yMKP1SN<=dc(hlf`9pK&ezom=d4GxUE2eE**dd>i}uLV3Xvtj6>2T3(MW z15`PRFJ3@UEA{`eMmk8N{QP0r2lj1~AO8OeNskRY+$HLC-%9$=U1ihDSN(%X*#*np zf3Gm!PdKod^dDx{{y;Z iyic+yHhxUPure{^W{y8a9B|5pJ2-(LrNM0of;_&?m- zWkJQ1=7qLr-%p2ru-%gwG6hSs-T3Sa<~!}jTjzcGKin2>lznk%<~n!<^S}&nvDb6r zzj T=$2=yD%xl4}yf@AqR1aoQi9ce-=Umg8cV<%P=8-&$U}@3YxL*k*EOXuHf} zW8>}z)qT1TR3>K-+ZF0P5 Sw%1)7M{#vHw^#5?@qX0?pJA=Pq6g;W z^2L4RV0+F)lBv{H%nBh^x88Zao+JQXJHHz+@kdUuKPrpX`pCZ9WjcZ2{(-|++$i~M z!_M3L-i(br0UAc tAD)$MC9ZqG|pIFd%sxJkH7JYp;5T+3Dxn*@~S!+GfSwd3pVMk9C z=e3M^+1WYkNw$ooY^Iu^u1zh>_Q;y)dCd6f&y`pO|GpU>E)s72_gQ~H;=_rJwrhjK z#IVlCD^G-3d>SC-yj40HSz>SDAv56T{2oV}a)e7&^uzCmhK;$X tEz71~=fnTPlW0OXBE$gKBM+)tM^ikLLTd)beb}(z=DLwr%=nBO2lEQU1D;4w%q)f~<-e)Adc} ziaV7)Tcu`xpFeabK)J}Egt(m?Rnd;~J}v!^PS=DiD-{x2IqByYvPkXA(ZK7q`&$|p zg_}j3T;v(hOK6GDm{kVW6l%MOZb_&<4`vE1Z5^id?)`p!p=$%E_>lf{c@JgdNYmcV zbrjWXU7K+|$(!Lq-Fq+>wNgLgXx*F1N1fICTtHf2ua>U{359iVA<5ESoov%R;o(XJ zY#f!QbzIFc`^b5p%Y_v0jmy0_$`z9IvxW~|##Y1FW+4jTckAJnY2n8Ld3`LL5mIbf zW;?pG(GinG%3GOrWyEi$#wXr+LwKw=8jhwTA~*|7fZ%YCq+R1`H|?*lnEf}KUbeLe z@fFT3Khi9BjCvvK-dp1qVf*o*=_Pn^6qKe%IbW!*Rsk%`%gt`8GopA>z`?;z1=0iY zjq+7<;djeZDfXTyQGo7?R2a0)E{Qjj)o (S=Jp86*~`| m{T9IkU{k+8bVpU6~rN>@_NXOfnYm_fOwTPOxLREIN0FuNU{I)^=15h$vh zxf)R6m`Li2B+{;fk`PDfSkkjh>na_`gz<9&S~>V$3_X#Q>WT39@GPC**6!QuS@y-Y z-5~f80z95@4OK5emJbe|+bX7XP^w2yk1WY<%ElmFY^SdvT!}I#+J;^y>nyS{Z$n|> zWQD|uCBAGok*L+QD$8q(E<(mHuQQ|VqCYbHR}RmWzpUORk}mV8wDoe^=SrYyH)vMY z#Ad|Dd?d5D5%`ExB0`=nMauTTR<0Wu4|OQDe*NsJp#MQ&Q83MngV&Cpg*Ty4aG-!b zTb2j9g4uq$L~4ReE+ z_8ZFI_wY|P;ZVZf)lq}mV6AE4gLL1KvH;*hRnV86kTH~}VmckqUe`QmW1d=dh|W7P zBv69ec6qfY7=^;rWN^*s)isRP=0!dALzAALb2HLVSQ@o?x~qFz*)BY_-JvIt1XJs$ z#rDNuSK)IH)OvI4eI{Lkm0sSn?~1KReGYt81W+|bJ?dSy^nnS6Kk3SkkZ4E;0Z2;T zC (Ph~W #K3NlJ 7L zuY)nvW9(OWdk%{tbxw3>SW#O3lyXlXJ6Yl?C1T~fbRIp6AwU~eL!yG7w$pgC6ZrVW zPAa)7g&o~TngpW^`H3p^vm``|^L)vB<*BApsfpVNZVg{d{{}s=*zT-qTCL7oF(N@k zPkv{aCe}6%%yCo#8aO12NEZIn(FM|~t0Rfh&lgfS5)Q>L?Zy0!b`5QDxLA&9oB~$N z_FdKx)#;cN?=)D@Ox3qXgsQ!-xW==it0+g*6gsNdI2@chyX(v3_v{Z$J_MP`f4s`v zHQRC(?2Z0ekm2C1kN5*ZWVXU%rYN6L$+{`X=VPYo3TC!abZV@T@F@q4yZG8u*$+Z& zNVdRRlNwrz2Vo6E^*n9Zd+O=V?&<9bXg5l l)AG)C^$nL9JE9OD z4>`{G!t0_hR@ zP95%^dqF$V^q1ln*|=}xu0LRs87;Z_MO`^lA%R ?mnBgF &jlx=-XI@FwtD1q-~S)G3yZW z-qQDrelu7-9iHeRH{q!}?NJ)fB1G$C>rggDP8$FUMSdDE?%1NyumC5a4RP~u`o|KV zd*;~NblkJz;u7>9(>-AZD$mt=@5AXEtyS{-ViOXZJq+u0BAwlP4ba@be@8G0p7p(B zc7l~0@62qIvKbAm74ia7wxYu{)E~m25b~8jzqEXiYCxWHZHXs(Wk>+SV_Av$)zP8% zs(kLm-)$P#8?@p3x~2}C {R!vcVkX<%?r zW;0y >C2wb9Dl*vZLlcEIjGtqoE+|@S`DEZ%q$yTxb2c^Q;g=O#C01jHyhDt zf*G2+w4Up}4YA!Je+OY5&!-@ujzIFzHli95RZPv!AH=ymaRsPwlhrT&88&Hjv)22n zEAgWLWfWb;)0x32Wk*0zFR#$!V2T|*J5sHq(P{(fV(5y7t)p#P#^k{C=VdyDJaQ5p z>%>Gov3qx#R5j1>Ec%x|HwnX)*d(JCU#`ieY3IPixTCiTO=B8jTc12m xqw9;ilVH*f! zM|MdRr_mlBF@Ye~TeV1vjCA<%1?@#QTk*D0IjZACr`ADjHMzJ$ygoJgk@fzh^t@uj z6%WgwZ9D6Fwt7x=bbVb4@h7l%mxF4{_z#3;Y*Hdr2F8hhU+G!vnsS{M4fAvdRM?Al zLJSW U@JeA?2Vip`S#Y6Wr zDcu;*#&4rz=3!!I;@=y}zr_}T(9`*l^MFp8vl-K9YTWf#dv9h}f|N>pYu=-Kyf{v} z{7S(gzQX%w{E(!49D+jyi{UOJQ_B>qZpbiq2=v%uOWSs`bESkh4K)z<%_6PYcxWt3 zOj<>xYuPbVy);{Kl_D>J?g#4idYCfT`5|Cthn#nStY-BIa-%}Ev@LE1wtJSTsxe~C z$2SP9alw&iF8!Gs*JHLltaGO6VJ(x4)of+UGjsS>&1nvH1P!+RvAE<_4+!W2$TF58 zLzmuZZ ?K3_$$LLNw)|QwZ=3b{YAUww^ dxB z@q`xm^9;Xu+MpJji%BZmllGO$w@1eIr49P}S(%y(RN}TioJZAh_r2OD=*dd+;D%68 zMlYqL+pwqQL}uNvnko;Q(>f^e$iJRVeyi(XQrD*^dmzqSicO|555(g#s#6b;h~TXA zR#coRN!TH-d%+fSY;5BpDYaql#&UDA&+q3;hO|u(m@1=#K4ln5$lBoxliIZ`kd?Z5 zHCM{5RQw+0eI#JcHgiHM%>Euw?PguN2O%fYDck@7vW%pwoNNpXsxWme6=b^$i4Bd} z4LiRjw&CMmHAFj!mh;pt@j88(9@;g9v1D^&ss!F<*l+tJLHN4EiyW+*h-Ex=Zm>!!y0+3VBQ@pX`n<+hJeS`e;k8Y^y zGzHZRbclJ9E3UzNuR*PtS%#JSCHLwo6kt?11H%VWP-&VDRZImdJ*D(gpYT_6EJWyO zSrpIohfF)AYtc{_>rWAU1S|SyLg0^NH!Uo~WVrkC4fMyWbThTm?O5hm%fSjd^&2N_ zOwwnZ>?f19xY2eKVfI%`lYjPJ4HC~>84FK$IJj2mT$i=lY@W5HJt)zgm%VOU-jE}D z69q!^44`?zh#^I`DN8W3CJwUmWU@j+BENpGMS4seXSrSMzFT&f zI}j;X=Mji(k|=gocb8-!D{O(L946=4AWEXV;HLuvg~;@>sPYb=*N-ErhSS=k^s?Ce zs`DXF$HqK=5OI*wSw!V4jsuC(gyrGUwDPiAmg#A-!Z&E@zfW#bKs9*+$HF?hBc-7X z`NdT_JMu@gpN2FvB#U+>MW#|3-<6!b61sFOJJET@NmZXw4Hf gvTaFN;W{n51pp&=4oUBGfX|s>sh=`C(LS!!KZs zD=slNc;nj6K8TfBUNb%+k%7s%ru)fOQfD}oEd(C=HEdrqM@!hDH&boLHD9o{1ybo2 zB+rBXiUcD6G4 2NOV(8dq;1Ft7G&tuZOgB+0s89Vv~s(jN0U(Nes_7^-6T@nzKduEr+ z^zQ58qp1$?Ydl9QN$F!w;vhZ0WtC|8a@|>SJ)dp$Kw-aqz*b>7$2h!d>AQRmtO4h$ zx8*ZCv!1B0!!YZXBJ^Lm0E+YdMjU!`I;~Lp20*2z&v#%~^NBM1|EXsSwt2x9L+Wc@ zDr^qE`dRf2-8-46tPwq(71@;Y#u|4thN9lsGlW`g!E7%~y|61y{g{+zGhF~q+$F@X z=m{?lA}S3mJCMq<{e+f0dz=In&_5}NDe(1MUENvIm#vXvsp*!CR-zMA@u&c{^fO5A z!{cI%K5$Bz25Ob*D6x(;iOvgZPxRT1u>cjnGm;FRlmY5twBi_e+`hi1kH@4+5@uW3 z=HX*jkas5J }b)Ro63^yf`zlr&bdaiu+O)@3* nfY&UbeRXd^f)ZeiD~tjc6H&&LW$l3H;&uu!h|AApJfHIhRq`Il{wHzy|}md zLF7}RlW+y#C=@g(N1@RnQvQSYNJ6SuJ`cvhK-B p|gF#W{Q+GEK%hd zR0lNjx*`jzK8*EGTuR_5sWnRR`v->TCXd6n8>Xe%rMGZXKQ)0qq (!qvm8cOm;2V6 z9IS&TkZDAkIX`H7UPYR8k!onI8vm8`yU}Wr!7g*ziT#A8rkOiu9jip{jvX2&yuy9z zxYSh%URz&Jc-xVmYjuTdw$Gi$x9;(B)87t1Mxhrn&>V`Ox4Vk^W0&Z;=WWp3e=?LC z%8jc$dq-Pc9#aa7?Z*<$8VfMX%VZV3V)Y*ey&!xT5&D#Vm#>7=W5epoX{C{Auij1J zO|Ky0iT0Et`TJ*nYiBv$`n_LU@7in4w$`k?Ep$>EgFFml63sQ6E^!aeUoGuZoRJ|C z<#UCF^I+!o<7lPtzT4Vj7}RvA=2|%?i=2ac3>7>Cy2MM`Ya3MqA2SE#RJ9W-%Du~k zT;0R44{*72KGe*C_lZ7J?qefeh^sBn
@WS@}6(n zv9XQ>**uci^~m joW1a&=n@jo*y zr sJhs(@WTDEpJ7zLsAi) zb!}eaiTV5*8-6F>%9sn8U*@()5Zxwsr{|eHeDfN{ Xc|k*#Q>ag&?ig)NeIy1QX3%AP!aEUA;0;jc87=1N`Wc@@^n^87g*Hmkp^;`?W> zW3TqGmu+!$I><)DC$*`qhZ@(iarNlnm}0CF9CV~5Y@{W8vcFNV)9(1GKCIl0d{#Ib zW7I4*P3s_W*()+EIT zz7N3c52&pg0WgF5rod!6mx(}0-f(IH$$+`~77GWGJ53O<)4usRC> 7WEm>pTtLKAvHCm4*T Un3NVP5>sWcaHQ##C zu}Ip!701!WKvgJBps-RoOK<4hod$4O^;Qkn2@|!l3*9h*Q`ruwloOBL4JV9hZ>SJN z!EE0P XmK?)fy~iNK|I>)7+S6Kc~Q31=A5+E`+4vMAO9favpkLB^@tU zdmc?3=sB3yW3pK}MMUH)-3(3~q&KA|UKptE2t9ls39oguHZmD*x;nShc&vK;7cogv zSNN-)nU7BrMNPfM{(G(tovmGWMNmQ%p%M98MGcX{B*3a=J%mb0T#<5)w_%RG$?cT^ zJ3RM)$$d9_@vzI}M_h(AIi0ll*)EgXvni*`Jeo_l3yqoGtSiZ-!t2bZXw=L}x9+n> zS+8p}n<=5mX$PBil#{sEb{<>*IUjBS+V Qmeedt367Ps0WR zE97WOK)N9YRe1D5@)V%M1|U98-f;k(gZ1ucg3oL@+(LtY-ZlTQLc;85oS*Yci;+*q zUH3Qs*k#0|sWoO}Y*)rN_*lDSlPJLRw9%RL&DO-8iI*i9*%PYjkL}!h;v<}FgE%{h z*x6YW@i^aORJVOPoK9eG;@6UYJnfxl^2X5%!_=msb86zEX?9eqamjUjIAzakr|Rw< zK>)!di0zP*8&9_UQm~%c7~^yF)*X!n%C3gbrI26e@G``xJw|(DsbyI!Es&>Y_A46g zD##;Dv~3nL!FRqYRFsUK9pt`M(ke>bhTCf;{HisN#k5p}9X(_yWnbKH6isq)_>ni= zraaQo91v$esoY~qZ+whf#_qj8o;v4UU^kkbY-v$F@pazF%^)CURq8?U%NqX9&|*pu zd(K%sedeYa7Pd8{HH#+7NPiT|Z>uDqhmjR>Ua5EjpHkaOo3T=nMP9JpB;RyUzf~VU zeNx21KDv+$N-&Ff&TVz1`(kBBE4bo%Gb~ROQc!;NvK$VpoC=+&PAOJ1Rh|lDiBcT~ zq&E0#>-;`#`n?*qvXItL0Z8ZIp_vnPcJno{)9aoujezO#soL|))A>x3#^t(c=2bSy z*IEvZ^4MclR+yLjW7HYlmIpdU_P)&)@s1d`aM%8N;EviCtcZ5E=Dx7-`xVyEo|v#V zioFzOLGnwBE1bJiC3;Rrc22ni8p;>#vGJ~`(|jmzb^P xbBnF`=O#+T!aQ0c8Med4#cQhFhO z?~ii@YLZxo!FO1lc;%j+p8nvv9nq9QF?4}X4^5U#t$1a_p5=t-d2FGTvA7{$c&~VF zhmDQfUY3-G_>-LPeIYZ-= s%BKQer*l49ybd@`rAgl5rj^j0 zl|pR17cb4ZGSam>s!?h3>X{9BV|m?gW`geJqxvEBW6A8$r#^4ceo~YA)A?aDy7q#N zp69*#PtE$GD=X3UfCH8ETzE4WH`rFF2VQOg&IT;h>nBf6VhhR {~S{(OS$HG2 V=B$fi;uUMhaFPb! zYKcObd-K=|AZz*j54UbocZ9grq|HXj)UcX;P~p1w=IQ>vi3i9q@$^CK7wD|5aNG9c zcfN2v+z-I#DHeqdy?8r!Eg)thuR%S)+-a?-q~tSE6d*nAYCkQ&H0h{aC8{IqDC2#t zwNv)PXYo=(J0uzjhVql4`Au-L7zeT-jKXo=h7787rBA5Z;%_#Q_I=@6BcR1{K1yg9 z)veJ!uBZm}^Z3q@T6NASzb&e4v=ykW9Y@hWO}@2K(axnV)WY-&7srNmIv-R%Y 1xQOZtg)o|Y5VO;W2OCKHp5ooBtjAk z&ra~mAF5xDwDACK65ECPaRt{+rjbr(ZtGrFH#mmkJnKvVc_~`G!FB8~>T%vQz~fN7 zk>;tlqYs}b_9bYIMt?r}lvDzCs~l~|lwmT&o@=Hx9-w;>O$Z&^r U~G$l}ym|M58URi^Dt(Z_hk zhr7G(4lV5_m%w*#4|tN?yuoJ54Sucs^~RwG36<^ajQ(abVTmIRFSOk2IGH8CP?h~x zE`Ya-%P9x*+5fJI@9F5yH~SE-la76ia%G+O-OtKSa%KmsKBGw$0SZWu!}4Wh<8{NV zk&m3b?KUi+s>4!w@iA9(Dan*>R&-SYl^5evWAMcjJhyB+`%yT-;j9QFh?WHy O{saNEzl2B)&3!M>#F7ZC1o&`CLVGPw30a*emc&G)FrEnm%?<%%y1HDm1pa_{x3v z6{lBXu02BIy<#xNrwbj#eKOc1C-<7So&5)k2B(X(ejl%kt~iMHv2PzAeaD&<$7E;7 zAvbbm)o6?6JC=iWD-e$D>kVm6+-GAx*NO5?HCT6;li%yI=A|qYhH{fr1^79i*8uOe zGEAX L{(5C13H}ruUBZGCu&c}k9CmN-2e^)no zLsQi+CSLI7l=|5HgknQc(pUHQFH1>GeAhNDj>#J~OWAq`S+7O@a7+4T%Nx@_U9jt~ zVo;{a#m+Vj9oPfJ0f!Tg+n#!W)d#CD`KGq?c0k +yP|E?Hx{8n*87pk{L6R&%!oS)8QtiL+b>cn*Zu@`$q)Chc{TeE`Ti}`SUTgsN6 z;c@@t#>BTWV2cNOlv8ZmW!|;cLxnGY>HLBvrYzvRvEvNMg@`5=8cRGrI~?= 7-X6scw95hi^Lu%N7!_KvC9ZNbb>`a4%9vQ9c^Gk0BM@94XAaH{Y<3tl-^6)JNMxBVUx)m{^mbz3y{Sp<%}cfL7_%{tSEmR{*@ zOY%X8b7+10Wf?WLMpgjuJ};q*5aZ%|s{RIlC&>$y?D@{SQB3XmjhjNy&4HL}>E)fE z2>teh-}o)oB d^NYZGv9*)XV+jme_bnfdXx%Mb@?{ozN4;Rpm{b^a; zIgGbuf@0=qvd*@Cnf?7a>H-;Lm(G-y@_T>G$^g&sxP8xEr)zz;!Ga_8^vl;~E1 in|-ACY#E&v~2o)OUWdWOcNy9xCO<414>={p*gz|D{L~Nc#od z(s6oNZYsn`=QeLJ#st93j-k%nSHj>q-yzp6(FGlc{d6c>sp>H*{YEG}vk>y_$>@vX z%EhE}yOrYV#!z)nY@%!d $xdjbT2|xMj91I9e>(4c6?s5HV*klbQ}gHRLYx1Sx&~4!AX|JjflPbQ*+1_m3QUpU=1y^sv)%nZ_PiTWJSde$lDtuQ zBETT+MM9*G3@9beOsWumC1>otV`H?Dsr~70H{TVS{kC}0O;koCP3_$E@^pW2a1i<_ zJs-A}Z=}q`lqE8%A&~jP`dqGwp~C6 &KhozO{x0R!n_{N!}`C z$_lm}S##0V)or$)o|<}KcyN3yM5515spYpa?+#KF@CZE#coZ^8jyb*Te{o+$g^a$M zsh%XA2gC<@d%gHv;5m(n&yv@hi(67#w$DKh^vTTw-aq#jYHxe~N3z@g2N3A~KULxM zu(LmgiRRX8UogY{{mP!tDj#(A+Y{yT-S!=Ey9>+}CT`jR>A&pcR_Z*mtB23d>gRm$ zTvGhEvbNLk$FhmLyStiN)X-Y&6>3eOiR j#xl=2?yEnX5D=uTE+hs4ZpUUvUAth#Rse5 zC7$S&Tu|SN;idfS`lwIvr(%o12tEz1==`^{hWVz)4j)OtakN?+a9g*H_u9(W&u>R7 zXVXom``<-c Y_+*1vXuPR1b^q{D=Ja->)71-_r;G|20E9{zjlVs;eb7 zM73|!(9ZymExsbaH+Q4+smvknVd<@Z#=VN}$cU;mavS_uk0;EnNKaW%PFIbdtXqrF zE3~vk4-Jk8>J#UX@dqpSv%G}7Px~4BaWd4khhpC;Bk5W4!DRnfjBr@=l31(%K gTTPd~1?Hwk(FPOzY--0%lW&0;`+-{7JCiMVyvEq&k%%zX%N z_czexdbqj%>>z0wb8*^c=;yM5ItFl<3n^wC&2`NdJcDIsd0kI-v2O4eNMZL6DSEfX zXQiuiY6ir+3fr6i?&rUr*d?qmtXnj05!P1^Bi}6oMLWLY6epSGGp-V<{1vL=YO+qf z)v-3zD0RH3J;K6mZ)eXkZno$~SpfR&68`0MXjzS+(ZwEfPC$~FruaRBV|Xb33Q=`5 zR5!cmE7hC=;sl|)!$o~Y1Sp;+y<+j7Xnk+J7OZIRqHRU`&z;+1_KZBl3|@%o$wC^R zsJbSkSOayfhpUpX+qU16&0Jv5XS{M5-4#CW{<_~Nb-lhD2wMqx0batnzS`-37RTsw zP16iZ-9OlECY!*wpGg|p$<;F+EFx3|cZ!I<;lb}(p~%haz8loc&&9)2%KJTKmd`N2 zdT@Ai{fXWV%Q$z4I7l@(K0rB2jo*EDa9SP|sS--}h_S*Wl>`fctWBfeFQ&2ptXNFv z9o)Tlm=YW51yeWk lqxpG3J FM$=?j8M@=}MI$a$c%` zvmVJ4 G4bAQI% zFuo?z*UP%y#f8RgcDra*%_n&(+dNRs&24o;_I|;JgR|z!ir`VQVAGR7mm5}On{wDe zLfRcZ1~KxD)QsEs^qTD-Jg`{dibAGlsU**}T_h0<(`wl_MOmz_2bAnfZ}^iFVxqxA z#W0rI*bC!5OGhr1k!fUl4MjfF=2Z V3HakTbokloDAqG-gWON5RG~W$u z6a_W*#S4Kvv~X#b!yP*n1cvIGDJSO(EP0DN0_3DF20N8;Z -H31fEAdyM zUq3qTS)r?KS6m-i5&2S3ieZRklmCRbr=L;gqosFw%M#BQ?)O3R6=umd90!E3@q=2* z=;_BXoicaqZr`$OibppSv1V(yA>+PslDJAfuQYVUqPe8eAo?KN9c)JEVsx~l$gWuW z`qt`Dvd{_rs;RxB5@w6eVFX?ygPj`6bZIQ>PWNfT?DySST2ivRrHOn|m!sGuvkq4c z*XBbpE7mV?bKGG|N3h+I94>afjaN^T;whOn-f3yQ2G%|=t?_s9)Y9tj (e{1$;nrT>Qfhlf&FYzDk&oNMlQ;QPOflT zjVm?Uw2zbw8Whr?6Z7rkdP!~1+!%Iq9eH1u!C^qb%M@=FE$$Jc+TPt~58kGVBwpU$ z&D^N*|2B`ad95dC(owI44Nk2A$YP`m6FO66-sz93L$%z(CnJxaCCH-(IyNkl@bmiB z)1*C8H|JGgiL+~{zwyuV&VK~l?#ie 7SI(+w$#NO- z#-blbj6d(NkfbJeC%>w9>`WKILRHsA1e8y8CSIv!#m{R1@?gY46PtA^m6A4Tk~cx} zvjl8zL*FUDBt0#mQU4|eg6Rd-mH!ky6I@pCyiDMjFjl@*Eb%jD#EK&0CjYl0EG(>E z2(yu*5&iiuxM 5n?a-*J z*FvC9ll|cYw(S_b3l94=wLQGHwiXl=)E~`IT2VnQmLZ?>_wbN}oSdAP*v{QbrG~&- zC-!Dho#M;pwet#W68@K-H-HhgB}5yw>;U5C@^W*6zP2}cD(3e7^IH-@dTH;Y&aZdz z%ePP+0hK0gM#*1e9rE;4Z&AL>N0GE?yZXw?%9xm#O@;Pcx^sS6{cKVro}%1b=C2|) z_1WwLBDvW&qT@kOONz~f67}+WO#98ad4Dufom?q_;=6{&1UHfW3-1)q-KwYye?-Cb zw`Ip^5xf8G?`{&@Uc~-8 9y8lO8EjlJtKdb%Q;DP=g z3Ws`gT!|lRP9tOfO61Tg`nzHb^4fK2?rWv&M;pgXK{K_n=EG{O6^1t^nI*8$3is2Y zdBLoCEiZUe)5W3>9}6~zwSP>-rmi=-yI6J6s7{LKMQN25C{h*b056j)e3_EEz^9Cf z4Y3-LPCtOB#jvF*+^;H-mbE{jh50$Pi@3gS X$o=Je>Vo^>Zu` =Z 4&fmtcWLK35N ;(V*mH93Ly7VX z#Lefgwr(CbCf+a$B)V6$twx%ijO2mwuB#RPxV6Uig;@P(kA$}eB{vpC1&mhauvfqi zKk36MD87>P|5V#o2SgdB`vNMU2&kl_ih$AxNJ$71lG1{tG)Tu#!=Q*tt4McuN#`I) zNOuk0IRg$kFvI<3+&$;+p5487?>U!$6z2P$d7n3)_&xDf?PYVG{Zvn+uJN18kb9+> z!UVhfw2X0D|EuQyn_uB6N0W(>R}yL(r9kjuQhnR_Xt1Pzb1>ufA}iMIsf;g`R^TW! zJPnkcl{#5!*8Ej35NjoM#9ZP1;@~_s HMKpZ8aTIK278Z)s4if9tx7Am>nIdTUMswKmp{Ap!RngSF z_O; Jd%h3(5@Qy2I-}kgO)?&_l`>ti-(>YcB94+PMeg;za>Heh zS{4d#HscdUYy0ZyuRO4C_SY*OxvYewY~YYn*GNE(&&cTyOV30L@Ps F=bCuLJZJFtRF zD6h4Lg2(SC*Sg}Q+)nluV-1gc=^i%7XZO<5&yHqaR>I1|JOw<-kKbtK7>;|Zp01Jm zC%EsHTu=)qY!y;lm%xPImFOfqzDWN_?QM5YE5!%X{P>`UGR}P+Inbxb0p6}z?wGC0 zD;v^2ocfj}>+YNIeu|`~^wrUvTTR$kJ6B}P0N7jA(Y`_MIiRbg`-xi^Iqtk< Vd*~7L`;+rCZB(wJaJq35ueXe(y8*e(|j}d zP%HMi)+l%hb=fYgW7 F!ihl^%6HjB5#2$NiZ EW0Q4i!S^HIX#S1MH^vY zK36qg@2TpYJs75P)dmy)Tu6@SjhqaX_zYAwrEoO5$QGfzDO{|{ojrf*)^TL}_{kM{ zR#LueZo1=(Bb>CwXX9McFCK)M=SGlD5Nm06=Q(S{m;0%%HTMejjBv=E j?d0ZxRVEmRjlcX{=SGD;>Fhd-{0Q zx0Sa9yz+Jb>xOqEr!l(B^hg58DMhdCZ#3{~l2{9nzjW0_*Y>Yn7c$}>Rd;vGwpFIi z_I9-JT;m3B6l8m_wB T=h>9R<~Sg&wCS$b^#wIU;_4hCw~lPC v?linZ;ueSW@!11}hH#a`xS7^jnBfJodv#Us zi7B5kWyQ*NT#l8NeE7DolOeRaXsAB-1bL~s4NlBFHAar_DD}rCYYs=U^(6_}_090c zW~q8Vnfi8q5({H?va6n^ZlYMPv xIzWoi89WU)lz z?Qrpc;W 568^Bt6$UkLv=fd5er;~ z$X*@gR9g`acyoDQq!YR7LFMUoZg9oxzBtf!tv8U)66V9vK7v2GtgH#6ye*E8TWWVP zEFva0w7=YGZ)caJmOJEibX>ufTS8@%IJ&aWt)i-|OktClm6b)Eqxscg!WDNQ$$G6S z42q8q4-fbEZzg~Gd*u1Q^z!nP6VB5541;Bjz0-U^N#HPO_f+Gn!?UM=L7hedfF=yP zr4%-Sx+L8L1L|0l>VeYt@COfo^>9yjydB^a5=M>vl!I%BEA=Ipa4|I{>y$htCGdIu ziyA+&vXy_&M*M8Y)z;P)`0kxSa{SjfKW;~31+h =e|pIc{>VB=jEc&f*fxLt`W%f8 zswpTa_ p%vb{3oXDoKIyVxd*oTHf9u=~qIPGh9HKMDFaR zfN_e)c1B~2bx8ec)3G)CWdLTw^((6uv2U>);P&&*;0G-lP4xA=aZxh^?CgsaHL{&D z0xV+zj o6+(Q^Y0lRh?uY6j~`L9?2K)av+RPZg?C$&0cvlWM+ z@$)5ixB&|_>oUy|!}NF2@eQ21hG-F)xB@g-T_K6j%oNzoGC0qp4C z733{gT8(dgS}NB~62Jyy+M8RQsd Iht9{9pls2N`=_eNguCpVjsmzUf(Ea z$OLb_H$pxKVrzd|q5uH~ju3V-_2%s!fo4$IL>6S7Ny@)*uVOp%{IVFupB8?9?c@ <_4Ro@fPpcz;H^<$CFE0xp z&HF}PP4X3dD=82$4A%FK?w|fK!?m4%b-cB=va-8ndNE+{1RpGjRanyGp5sl@XQYk3 zW91E3#F+6KZqJ3_`N<1jvTA~Y z|8#hC7Y7P-fS>Oj?2{g-!Oh|po$SbC0IhXOOliSYhLtd0D88XJYgbt&E ztROV>bS)0*L8MkTo{9$Xqkev_p(4hTN;1dB`rI>?J0mAXM@5p=GKU`Y$F#rZr@e0d z{k@PdOV7?57ite_?HN3+^(PHoK3*oeW|lq3Q7M&4jfBMLiRm2r%%u#~1j2y_j{f6& zweKb08tdHwC`%7~x1T79i=%}=AVZAWIy$Q>E7xy7%GwQ0@_ry5{x^8Yuls*G 0Bf5;I2C1@-b zr`>d$f |qVgSlvMV+V^Tb3z ^^FFuKDciyRVe7 zS%dd2q^a>I7kmE%=d8N!3;xQu>h2M4gd>!2H)`;Hly89TDNZ(Wf0nb!ps~Sz^q*Vc zul*_iodDBf?-_iENH_Y*_E>I*PPC5vIVKwR5sn!Em(pCmd?p;%kiq43-pD>+f?kJ| zmW&dm8g%IBuQ8!E+8}hB^Qc#19Mx#2ees?n<_870>@JXm