From c4a4b5628a07c017bece48d8f691f4c8b5041dd5 Mon Sep 17 00:00:00 2001 From: Bryann Valderrama Date: Thu, 2 Nov 2023 17:04:52 -0500 Subject: [PATCH] feat: add grading strategy support refactor: add grading strategy handler class feat: show grading strategy in student view fix: reset score history when reset student attempts fix: add missing argument in handle_average_attempt and fix typing hint chore: remove inline comments and print statements docs: add class and method docstring feat: add ListScoreField refactor: update grading strategy handler feat: consider grading strategy in rescore functionality feat: reset score history when reset student attempts feat: add correct_map_history and student_answers_history for rescore functionality fix: reset correct_map_history and student_answers_history when reset attempts test: fix unit tests refactor: address PR review fix: update correct_map_history from lcp instance for each attempt refactor: add _set_score and get_rescore methods chore: rename grading strategies (attempt -> score) refactor: address PR review fix: show grading strategy with unlimited attempts chore: add es_419 translations --- conf/locale/es_419/LC_MESSAGES/django.mo | Bin 681630 -> 682615 bytes conf/locale/es_419/LC_MESSAGES/django.po | 44 ++++ lms/djangoapps/instructor/enrollment.py | 3 + .../instructor/tests/test_enrollment.py | 5 +- .../instructor_task/tests/test_integration.py | 4 +- lms/templates/problem.html | 3 +- xmodule/capa/capa_problem.py | 35 +++ xmodule/capa_block.py | 214 +++++++++++++++++- xmodule/fields.py | 25 +- xmodule/tests/test_capa_block.py | 9 +- 10 files changed, 329 insertions(+), 13 deletions(-) diff --git a/conf/locale/es_419/LC_MESSAGES/django.mo b/conf/locale/es_419/LC_MESSAGES/django.mo index bcc8e466adce89856f2a885741b79d077af5d6ec..902b68528ad46b37a888f0ec2e828a89fb9c228e 100644 GIT binary patch delta 97894 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 delta 97012 zcmXWkWq=gN7KY*8of+IAK(Jlh-QC?GxVyXS;O_3u;t(LXOK=Gg2zDVj1PPu10q*HFuYs%a@Xr@Ci%$^GZ|j7!dE4Bm<7pY8C!MR6S`8U8oPaRw!FoZCN!sM$HyFT|;Y zr?Cts=pW+fga+6I|He*ObwG%7kW==c+WQX*aU$><7Q!KeL!7^GH`c_JLqeRLr_z))>X2y)z5Osl3m<1Q2E_4bL z;A7N`e8D7`W`bE9HIRn*Blbcq!DP&YXHc>90f%FWi6KF!3x%T-L!9!MW0G~GKk7nj zFd804&B$5QQvHQd@inH#&lm?&Ob&4(VRlr9^Lh23P#tcB?!ZvjUpSfIQsEaGH1hMP zHU0-<2Vl9k3-GaPf zkU}^Oo3T4y#Ccd^Mu-y+Z(vt^;nf?>3~@43?~0n@1*oY01;gwB9yqII2rEgo* z4R@lZ`VMNwBF_(T_F^*B=YL>d{Ep0c(CNFtPFRL1`QSA6z~{ISn=G`o|Ab1X#EU|l z_Sh7c;7PoXZ5La6#U&xm8S2|mu`^_;ISw_WGf^`afiac;hbd@-xPa>MpI8z8K~cFf55mvlgfk3`XsUQ?V6Z!%|p??XM{g!8~{yb;G!;Y+!jYGWANR`_;mrM$(Cb zE<6&IMsvLS8dMtXMJ>&B@AJ>7G>g94cDi_|3s*+XL~YavJD`GY4(j@wFeV;GrSFB+ z!VzA59xBMzU^s3=UHFRUThu-hcWsC> z6jPv?Dj1`!x8qWvrZkgh9*m$~ z3^ikqP$U07V_^*6VrkeI6&o#4BN~G> za29Im9-&733U%Xes1C>fImGz|)1sE_CPr45A5lTMy;#}IZj^ijX?i{1D#YR&JXg7Ru9ZG`wJUbT9log?%;OOIh@E%Wd#gLu0 zp`6`g7kGn;`oLbBiEs?3o({Ey<*^C&K#lMsYNl?Y^8K6Fo@k$K?Wr($kq^31sDMTH z(?doy2Cq|Jc)%{)`(TLEn)(vdRQe9t4E%tNsFz1&%Su#qpTKn(^RT_p>_TJ&)Q$;}^_LJ@c^;rvx^`e7FqLX(>>#^X<58 zKRlLezPg8gPNJ#b9d+FQQ16bIG!vWqSn+yAtBur9K67VAtPmhg^!f@n+PGc6;^XsBF04)ql8ZOB#lZ z+{ua2mH#EY52|=J_3Vy1a0IHy(@|3zff~s%)Y_j$#maruQoTnliT|3-SQus^J91!l zZ1hKnQ<2XnUMK(eQMgK>3QoVlcR0L*k8$x$%Z5?6Y=*X=g6T3UHr}A#AHJh@v_!W< zoI{uf!|@@iqk;d~@zJq5^&e4L*5QBTzb-I~20v~@1<6)aaQ%vk((9-lE&3gs>V)`& zdN^u^qTIEhN`%9x=f(246SXAYus$P?_9q(~wz_ArQRG3;E?D+~-MBjHgjTo*yP>8w z<3rm}3S&$z&>r<}*!PjW<84O;+eNH}*HHt={Mep?#ZWQQ6g80csQsf?kbCaYQhbgDF!GZS=O-+I+BjyTmSPd=!uwD&`736{|Die<{i$820xEV|V@({6+Bt() zC={mU2;ATwr&VuADDvz&WS$u8PpGIJh?? z-wB4g?|2VrD9i_WLPFg)neLc}`b^A42Tx&U{1O`K?r7=#p>8Z>#ZEd8HABl#Gqf6& z=UY)rv>&x0JwU}!=0K>srRNG#P*2OFHjo*pAX$i-(v_&R`PuUX>IS#5F+N4bPT5GI zZd%So?H8A@21bi)*KdTnZUiceHlt=Xc#DE=^cI^j!tba9n?`$AHG73^jvgX zn(L@~f*97JaMXqJp`yM5>c;g^+0Ypkyjw6I13Qfas5`Mj-5+=i#Nx{T=&?iHpGZ_j zjr1sL2Ckz<{3q)1`wF!M`{IPU@Bj5tFC-H%KQ6@Ccm-Erhq$56c8n2^*ule?6JMaR zEJgfKCyDYuCk0Jm71WLEqGqHimctIHeEu23@D%E}r>G0PMs3x;1U3`#Q1w)(4(3G7 zOes_c>SA6The1XCK?)i0Giq&9{}Af_tS1XdF9oeB=&g%)QqGGQqUAPKwYpqYHOU}wXep4)c2#- z`Xg#>qb9W*Bt}Jl7Swf$pgK_7Yj1&?$sS&Pg!lOjR8R+(QP7(0@I2%laN0ZI57Z32 zK#k;IR7ayFvm2#Bbs!fiHcEN*rl=|IiaLK9YM)tzy3RT?=LppM_^)sLf=>UVVC|6fwj)P8px_*R<2 zrYsHW0(ntuSr*mv2B;f!LQQQyRIH3cEx{VpaR*UT{2QvHk5B`9i#jhPjQvLWACH1Y zo&j~?vX~KTdhLTy9hv8Sz7}gy|Hb<}a(Jk-ih3H_6T+UH`IA?GTBlj4N}m^GoyN15OqRzRGPKNqBz2^H)Rd5OpL!j*8kS+3m*Z zQ9EJ<)ReaJ9E9r7Ow?K*_1gbIO?B)XmJKPfHuY@S0!Lsme2DS%{7;?JdYli{k#3k9 zhoN@HUrJl9fsp@)Wd282Ji&t#B*2{zoCvVlh$K`#YVCg)N1Nc79KjrT6Z>HFVxi7(9FDorSKKzLd_f9@XlQ_1`&p>H|0pV|U!Z~}WeJ;s zoT!mhKy|nqD*Z;G`znW8s?Vrk_La07CP2+hc~pBN)UzVknS!Qp0BQ|KVFlJ~4r-)# zOIbR8@=RRXrZzuTi+U+2kJ%%%36mrcoz4pi<;Rk$bJxX22jux&PMfU zF;>F$SPnm6aV%2KqIxiDZTF%&{F_(5kLt+3UOjGk%c}I4lJ-WZH6MbCiLvN@|DR1k z!LbH)@Kfpmw~as3qNpdd56L zZDi3ak-p0R)D-j>u7d?|2$sN|sHyzNGkRrUsfJy60_vHt7&WrJxC2k&1sqz_w%V$- zEEZ~^I@B7~p?;|I$9e6mF^u|dY>n4z1w)->6pGfi?|^quQ(osMyHE#I&j+LS?2)L4 z(@C%WF=`|)F@TZlSUn~xM$%(;%!AsvTBBZgdZ9WxCrF_`g>_gEQ`NORZj9>4JXDW2 z;wwCdxp7}T8`$?ZPn=^`@wfj>mj>3@hSi)J&9VXu;VOmDU4MOE&^H;WR9d#TvQS4?1HgXaw^y z9j--<{37ba2N;fTumr|yY$K_S+PXWTIzAUQ;sdCC;S_2Iy@`s2*iEb+j_!oO);rdjoof`l(r| zmR?q2@C*%mDJXA8x3aZeg4$rNV;OvpiiLu$?FFI=)}uZZ>67yWD^M@r&X#f-Y5+^I z2427t92eH!(zkiXP-h(Jp0E@7Ka|4K&P+X~=xT2?8N1oTq!GU40(&tApRet1!Ly@B zsPmNeulNEV_q3U~(#vM%E9RsRu?_X<_!a-bdH8{WXk=4{+3S0W;i3BTI_Dye z!#X2Eo%?tPTj7zB_MI`9c9gxDoI&MrmC^PS%{i!tN9dSPXChX_s(2NPVCu243$lfQ8D%rl_jw!xWOHC(pteOgnG}fjyj;D*FFrDzq3)% zAA#ChkE7D|66(CWsPjI1#+hj6r9*9K`LQt8!vN024a)!d6m-F|lk7#I7HVVZjoLt# zVM)A-WiioYJFW?8D-NPIuI<tQbHOHl*3j0(=z7)kk`YN{QO5u;FV zj2dwpRQ~owKen7^TWUMhzR(R*;waR45vUt)L8a?4uYS#||AmWb|BBi#7EUMsOHnvW zL3??u8MXtKMNL@^)Y^4N?d8KzJJ~plj?28yH==I5-}5)rl05W2|BiZ!#-3?Qln^z5 zEHlY}tyxJLw3hWyTW%Xvuna~$RA!@QWDDxJ!x$AWU|hV8+PeQjJ)S?HI+S3R4Il&R zJ_S(6SMzK>i?s34(31wuL|<%zdr&=2G}~^R0y9z1j_OcDR7ZNFrg{V_24v&n zc~rDFM$P0rRE%sz&D360Fb036puPS9>cZc#GDe;k>i)S*ZCpt`%6yCdjaZ-hThs+A zFR<+B;JE>}(EbuN)r%L}GhqwXq<#?lvtPtn#LKS!WN7^2P^T9k99?2NQ@*8EUw{Q@ zkF_k+{maPms0;7LKG=S_?SywwGgxMY#Y6|xNPD4XXfT$*>8L5cj8*U{MpgdjU1@7o z92K=?P)pDZ6=ZEt(cTS}C4*2G+J>6)Q>ZL?hnhj(D$)w0V>nJkE#*ek=i5=ixevp1 z;6)YiZ`6fjuePa8i>jAKtziSyQuXvcpMnayjTnwsFeSc6WkJFS8$e!6OT9R1?c1O} z?~cI|6sA(BiocuPm^?ze}{D4ZMIisZi;c3H8oc29d%_9mDGAY_RLq*g*bkitE#$3wA|K^$=7K=XmXFFa!0Sm<;ctX6ipIg9A2N zM-C!?80%a@t#OCV7KB4k^%AAOUL1)1#t33o3XDU;}K5 zn#$c+9zS4vEV|Y9hX^cA{RKA1EZgk3$*3D%MFrs_^l^XZH3i-9J*p$0P-_}(yNxV4 zYG(4HcEa+g3)I0h*c>$jqrLiK&!bqI_9u7&3;$wS5^aY)Z8M`^iQ1HcF4PJYeB)44 zI0bd1Ij9aU_dbvC+Bc$NWfv+YenWNeCFa5}m>IL}wDfL>3i5%TV==Dse-;Iu5P>c6 z1}d71?6M_jjhgcAm>oA^Ui=?+!1%i@s)t}U>gQ22`5$VDV(zim`Z}olOhxS@M=_Y2 z!W{|jE8Me9UXw0+Nszd_o+RUui1xe$toSO zm)Sa~0W3v*f4Gg?s6RVu*I9Io{8x{+9kb~Eh-o;m#&Nb*?DH!zfs0O9RIfN0>OM^F zV|~s`eJa!$i-S>9?LTc+L1oJ<9Eh*56LvUb54EfKk$SA)*-+;Jg}}K`XE#2>Q@G;1 z{Sd0t1zVCR7ek%tv^T_5bm#^4qaOQGs51h`VqJ`O*_NUODh(r0G4>e$z_wTHb-&o} z_WdAum_lMMSnjHQvuSoM)cu3wCHRmN0)N=Af{H zy8mF|32LhA-m;mBdOOtp`=FMnk$=KwZvOwzMpEMrKLMp9r?4Iee7tKvX0P_A{fOoj zDh8(Bv;ANNDocJr#n5fk&iDbf(R@Sgtg-Ifv)~6*Jq&exI=9Z;6sMp(FNeB7P1IJ| z5VZq#!}B-@H3JnNggRqz4=SHaJS6SdAgbbP>Vu!!Q?AQ1>&R5po6=I$eGZ@=PN%St z*5)z=jU?t@_G7rbr~|v8qP#!$$5p7kJo$4=qnwz9dJR;14ncjs0?Xn~)QJB>ZBV`! zRu4yIReB6+qbNl|8$xYNh}}?AI0iMsIj9b;M9s`*)Op8n5&n*vsU9zFYKNd^at^k` zrPvW8zp}LJi8_DWEAn6YJf8+#cnfO8$5C7HYt-KU5tT-<{h4X7Y$KdFP-a9W|(ehBKBGUqkHJnFH;awbw?{FCQdt(>)7d0dC-r9x2 zFc1Hs zTcc*IH)E#|k)#Pa11V&pA&8;4 z-aB9uYU*~O*6@gfDK z$#c|=-eP2Q{ltNNV# zJ9jDM$FHd1$@|qV{1fUOuqA4(d!X`o45q}Ds0;q;`5T5&zlFN-7fg#kezOh~N9`9a zF*Q!bprU^}g$#Jz`yk}IWkp)lMo|fMLK{>E#$z}}c%Pp{&Ded^)c=JFvM;EPMrQ$Z zovf&IuHe<1JHDX%Ba}fjd~_aTCVYoaZew3e6wPih1$D!Du(KLdDO$D3o5Dypk`_=DyUYWMsmpWg!lP*)OBxq?e|f^`wSKIkz!~G$iK`K zLTM<38evh-s;C<^!HU=s)sbIN`F_~@{2Df-{s32Dv6w#hVf6qtqfKMklC(md-vf32 z5Vb4+XHrmFEcXuBgPOWuQ9*SFf5ySFeeNq();Koh?@?==J+1|BQLIM2F{YWl%S$gY~c#X2X4`9qcdElD$W5L{a10`3W#L z_0*`Ws)x#|zE}dsV*xx9pZr(w_!4+)jykYBY6cpjF3=0rkr`h5GSrCnpkm@0Dpua3 zW-`eSHubqs9nFtAza(laua3%|wm*>nnyPs;q{G#y`Z?5vZeVGAgIdeH2`xqnp&m|^ zP$M7ZIn{Fk9-@6UDmdFDvhzEmvaN?#?-!(?C?1U3aOR?xW@BmD~^roa8A@x28(zNoiINQeNiWDM&;`--sh)K z(R&3IM0dUVQ&flFqxJ)T5}Uzr)Nxr+H_V6HcuJxM)(Dwl{{1%v-Dos+!1-7KeMv32 zs-V`e1uAVip@MWcYDuP{VrDk#xV5MoZu9B~Q0aXVb>11&{cd0a<^M|xDQO5zW*16> zIv_u)y)tINF6ay4r4chzUy$5Jaso9o*HKIP5H%y;Q85)eg>6LnFctM;sOz^t_wWDu zPza}CB5H~@dIy|9rQuCf2cBbDOc3UCe>Kw(!>KPvb@V9exQAF0V}{%L)lpB^=9nGl zpz{9&y7~W@f_n53m6y>{T5yy`ji@KK!^x8_i zTI*A|8L#7P9Gk)CtiFv)z)l1yD0nWS*6f%C`P_deFbF$QzmCJOOm?69PrZV_QkX!) zs2sLu$IfYMQyR6k_Qij37An6d=duy6LrwV})K+~GHGn@+9ShBE9gmBep(LoK%Y@p} z3nSMHIt?kfH$vs_EL3nT!P;}^6wZjQaEU%*Tud~Gk}bN`I4 zOJScggZ8hekxnaOH=Kt`>&>VsKZ;tad#H|n#-Mr_wWv*fY}AN;MCEOI)Kq0bolp?9 zL>0VxE!6ofP&3sIm*4>0iiwNa7JdeG-Mgp`yu@&fRGj?RRHQF%7s!v5s8__|I13dE zzhe}PT*9U<4yr@psF})++G@*t?Oib|^&zP50UJn{ z_FmQOylb9?s{5SIv@b!eee@dkI-eGs>-pb}f~M>@%!lb}TD=LDqrM$ABcD+-6seZQ zN+DE7OQWW`C2EcPqn2_EYK@PhmiVgYGt_Zk(f#><^xC#FB}WBW6;$xGM@8*G)KhFa zmcosw8~%;OFz}N-#L8ew>a9^P8e>rDx(>C&Zbx4_FsKW>qoAP6RmY;W6oyf+ zgv!^Bs1rtd?bA^=+KTGP70igwP{+rwYd6Y*%7zlC^Xs7Yi&m%^?NFEe*9m=S(1@pC zI4(n_%@I_dpGH0Xu6ymzQ5}AVN;6+Qo9Z~IdP>xJ*-%SS6!YRB)OEI^yEOI4|NJyu zr9sB5Z+Tr7vr_Mhn)*ek3+zJ0$V)7MX&U(4U(Yo`Z8TF*H{OQYkdB~&`l+YW(B~Yd zo*1Ly|AG{>CQnf}`VTW>qDEeDVH)Z!Q74Q=jc^8P29{z~+=801uc)0e(AYkYgm}xL{|m&-Q8Vxg6$6o)*?R!rJD>Y|!%C=Z7=xO@^{DjTjvDB%Uj0rx@?XL7ng&I0 z^7gjoX;B?2g35}jI0@V1Qv84`aCQfu`}e>FI@(+BE7W;4I@t`hKrLB&)J*k8W!rdE z7A)=*v?*IpgHAk*iq=c0o<2i$EVQ$&X*A40Juzm)l6VC>;i(XQm(<0MkJ8OzC=O~y zv!iZY3N^EJQ4hT~K?;i2iKrePM0MZ_ro`u{9V}*do65?l<9-ffC-T@O(JzV6~*Wm%``%oPk(APRL z1=ZmVsC3(o3bG@p{oo2}%H#C28BT+m@_MN38G=#t{2xU@7nqFd@j_IGwxQPUJgP%~ zqAvIn6&oS_ZG%aIIgT#=!OqaBlw1Xj5EM) z_yg(&8BrG~f$C5-RBSXt-Ecm->4xg~cGS|IK;7^@YA1Y)+F#-fB>y#qNhoM!sZbkE zKGarO1l?#wjjRpk!_HoPCF;EOo(ECqUH0lPJe@%{umq@%r1R?e29f{jNd+1dRJBkW zM-NmM%tmF$CTx#?qIS57gY6Zq8EODKP*1l5s2TVZ!|@qvW}*$Tfh5I-)HC5596f~m zze%CrQ2XLhi+T>~i&5!y0ng!Q%!4O~+0*VnR5s)qZX>IXEvdIaE#-04%-qE@_zw5t z!4cM>0VD1F2|)@vVGSEcTSO{;U`}hBeCfNu1Q76s@QODK5ILiO_6m;VOs1c7xrQHTp2lk>)IDyKR zJE%2(idxGr*c2m8@wtDL(gsUWKZv?c$W${9cBCGLc|v%RK{x*oO|z*#iAty6P-%A^ zHL~c_EuGS%KCggUk{YOyw)Wb4qOxKjs$+9eGq(a;;89c%ru6V{fpx|uVAF81~&p5~D{+7Ef`kBJxsJGwKbL~s#cT~q(&9lexa8xkw z@anfwJ8Yc!78?nJ6spjW0n1P1lP6Hzla8&6{dR>$rO zeNJ;cj6E>rBKra4Ow{$uEw*pX!Qm8Y(y(!fy{~`6rPNa|wI8b;!|c>!EMqAcaS`lE zz07ipkzF{R`d@e)d#|vcgce+B-xr=@aoRJjvW|B|9k&OW3I6@ZY8$~Q&)KLni9oH{ zcD#t^P;0p;!am=C3bNg(_G6xxQQ2`1l{N3NAjVi@&;N3$8S9LZ^!y(}LFqRNb>ms6 z3oiHk8MV_LLTxlxQBT1qsHb9zwU)MNQNdas_3WsQX>br~MwfY?msn>%SEzvQ@BgM! z&|bY5)#F{L4qWu=cTiFP5p|q@y^SCRD%i5422jqJ`miJY$HT4##8=Sz#_y&h!wawOn^Qf77 zh8oy+)P|O5i(NPM7V=+fSc(Q&6}2|?QES)%b;4j&w2wm_Hv`=nLmjsZwG?Nt30^`S zm;Gm(p+cy7ebf@QLY?2~XYyZpJ(>n>JV#NF%STuqqi(fysfjvq5^6?fp>Dh#yWt7U zj`_CPW4kS8&~aD+51=0Nk+$1oIwk61S0G41TWLwuh3num?2U^4roZrWJJPNnY9>dhRZP{9zosUIqJCAs2hjuw;RMjbub*Y1es6+>4kN0D&|)HKcbM8 zh93{uZ@J53TIx%22mXq>@t}itgN3LON1&GM3@Ub>q1HIYA&ZstsI172YM+Gaz#7bi z$M9*8wR}aP5e& zb_nm|E!>3%FIx=sy<$_j3^g-n@c=r%+Y%nc^i&_>LX2_MHoCP~jC$T{LAyZjYc^#| zu^=Dpz*6`(D%f)UVQ)Zrjciihc;!|J?o-IFa&jhLrC^I zMIKo+@5gM^U!l7LKK8kPXj}s|W96UN+wl@qw)}(fL%2fTr|eKfZN+D{)=mGiKeHK! z+83%nw=HuB>crWY46mTp_BCqf%lE>vr5R4sakvN5y|g9x6SXwCU)eLI6_(NnmQYAS z2kv2M>i_+1YgFR3{eEvS-lILn8%vv4sEw!HTU)X**q-_oT#ZHES$f{bQ`FPHw~oI? zEort7mbSAon39Hj6f^?gM~nU}*o=Bx)NAz#Y=Qq`Yi#(By$Kz{AE;kK?eR}g8`giQ zrOf-UrC)ulPkk6Ft8RGh$v%<)eP}52$$GXIM^jJv*_L7rYE3VpqSpChOHu^2rX5ki zdjypYY5%kHDxs#jH}=L=*b{&JYS}gk_0s$BEBUWNzHj#CG7eKykNn-Xg`z&IufeX`}evELn#osHcnSci$)4 zc@9GzADmC24TXPk1vZW5cfW*&MEAQtP)LnsX)lEC!vyv8+K6fK4^+^8^(+~~Mm`$# zOgV(wnm?lUhs-hk?&G%^va<%A9TY0?!Cll2m?4(mO`pD~8HpU*?*>x@j-q}Vn`5;& ze)plW1=X=nSP0X`wHa!Tm8fq*ZQ=i-cEnWiY(Uj9m3ENX6qMJyQ3rfPjVyJ1o4Sga zjr5#=_i#@Fzr%lf)LEF&@9-bUb;c$3yMKbwDv95H*jz$AhCiXQ>ZhbuAA(`juVW(o z7k^a#$4O>Wo(Z+KRZu}RAGO9Oz4lM23zSQ47jBEX&{V9AYfx$T1r_}%Quy61xEd;Z z#-JXLQ#waOQ6G0+jUmcy|g?nY%poRog|#Uei{+Lxj_ zeghTdkyBZaRmU0BH=~xSWNN?r--76p+Hc?glcuqrmPPe&2)4$Ps1vfJwF}ip?FYMX z4n9V$@sM=Zfm5jSL(|(DS3xc14AczlM!kx?N4Mv0{VC2j;W63;oqc*ro*clJwQp}pgu6I62p*Ricvs(1F z!|T*nU<3~0UzSY4RN4LR#?i*Bn)Drc^ zg3{y>>VsH?Y>lg-rhW)&uRn`gyHtfO zCW@lkJD`p`jPChGEC{P%U)l#_LVSlQFzx%DYIOd{W85Pw-F)hwUJqz}EpI^Zu z)FZXDnJbMQs1HFM{{(gYV9Zwbd@hLUNLN%o4?{g9mSRSH>zS;z_Yguwaa&Xtbi%1P z9HU{}Hg>&aIFNcaT#f5c>0Z4p1Jb|$?@u8L4WrswnoUOjOWV#|)Y6RWVEKF(i&2l+ z(JoL0)v-RPy?rS*#9NpT^L4WH?Sf&{r=qfC3+njWSWWq#xU;QIJJgh}MP29+YR5{_ z#cos|wPqtwX*v_t@hzANccYf-7V0Vb0movQt~OKWFedd&s2RG8sg?hKQHYGOx>*b) zM6FR~)ILxXV_|*Ib{LgphnWRw;kUPHNugo_L-=eS%sR(U6>vZ zqptrHwS@136l$%ihJ6w*ta3wYvU|Z)`%pby(5A-_|G16e$sAdeY zta*$1Ilkgho2lXWC-sYX8GmNrdUgay4zr%@LG}C?DzAUX=6D0u<3hvjxN@jqtAUF4 zPN=mUjXG{JY9pJE?QpYa!VwmPLs2m`2eaz^eg-2SH_CfV@78b%Y zs2c=E**=g2^H491rLaG0%J+F5N6qAUR9Yt=Z98Ls{6YD@gMw~&7PV%9F&0FLQEOBH zn`0>~k1H`9KF4s3H`Zn@H!7{lpgwPf+OQ^|I&d2GM)c!2%aXq6{`DdzXqA>t9(z&SPmZ5@pCu$%UQPF=NHINh&?Dz~Apq>+hO0)bF zbm7{lDDH^5@IcgsN20P}zE@w1ij{+?<1c#ccTpYqfZFL|O|)1^hB`h!Dz+-1VyEgv z@?UG&&O2Z*>H?EdK@x!qs_m$b9P-+)dhPeU`YY4`zMwi9Z<5thqOMZ_H3MZ)`#^P6 z$6HJy4Rk;c8Z>1?Q8%29>eyn>ZJ3$*NhE5Wcc>AioNOJ-g}QMCOo{bSK|KIvs`vTBAO+np>J+=+52ypup{6LWSFeuws5eEe{cO~Twxc?F0JXTkI7T8R^TxeglqA#+y<2Klf=S47xSKE$cq-$}a0f@%X+q<#anQ>9*OFAzhqEA>e0Y~+2g1NA$&5i6{> zp8N-O<*%H6Npw{{w1+DdGOpl?PEqF3vYU*WCPr(kD z1IKuu@4^LK;4&(0yX>$m8iNYf`KYb=H&ogMc3KA$p|T>|PV!$HP%#=5?F~J9qoRBY z>V_M!75)zuY$bQu-rp4!^>gtFZb4md?ry(x47a1wvELrQ`_FIY<4o#R_WIqwg!pqW z`LDOq%KQAz9ejgD@VEUIj4=<`4U1!L+B>6OK$fA7JBu1=l!In*Ohgd&MXmLeL-q{# z4NFsxec12*8GdaHr~W!fAsvOdM{I*BfXe6AsC*sZ)u(#(Rj3VUFKXj@ihlfnn$pi+ zd$gl=ej?OHmDRHtYQL$D+VFynC}<<;ihA4ak1KE|hGBzaHpK%_`9B>y;!@O-MLTXI zNrPJJvZxyl#G^P7wV_q})t06SDpm#{F&A`ZP|$@Jc&(ITHF1o zseO%YF~uMDN;MjlMvpuzUAGHu!RxeNL_HhU-mtCrchu{<@1_N5Modk;7WT!y*c)GB zV !TXum#sFAI~aD0Z@G1_elqC(h=`T!h_H*hmH`=2dQtUET4bhv=_hN!Lj13tyD zyB4%j{yU*9PVXCip8I6Ug zuSMPH0czwiAKSAaH&&$H1vP`aP}!60iQoN?*_3}m{%fbZK|@W<^VFt(3|6835?f%Q zXZBO=MOdGD_+PeB4Z!8pm!lq1rJvgk2BDTD0yR^YQTs^!7q%aaN9_X}UXcHqs^Ty0 zCG#dK2I9Q3krcxM)LWx2uoyLh3wR1Y;Tk;px6MGu*M9du$2ki#(4O^;onIHbQJ;!h z!ta^{*{SKh%tDMeQ@e{GaScDOFH!tIIG9@1pYiJC?v7KidmKLu^ic8ES+f zUo5CHVK(aRP+RaEERNeyOZ*lKW7Yr6@i<=j|0{)3d{F(X-~B(Gn}G_x0pIM0MSZ^e z-G2q&hj-R>w8sw#xIuORwKNY<`J5~?;C>CShy|&4#ts;P>S!Eaz|F3Ls4aUCCQ<%x zqfn2A^QaTk`UCDx)(mq}pM{O^1TMo=fq=VH9>X%!Lm~y-G%bg^a9?bNo3J^?jT~^= zU{6#wT*um&DoViq`#*gtXzjP6Hlh?!&0469VhpCmFE|ZTMzaoX!*bN0pw>8B^ne?D zbFnG)95Dj!e?4O=)}`Jhrgh{v>P;zAtbh|#n&pcfaD!naUZXw_)sb#-?8YlmQ+OH` z#c#0}wu~Eae;9QQwFFV)*^K1Ft=wP`DlM}n2)NJxHW-b1KU8duNWjlOlTcXXHS9t? z&o7~#3C~aum4C1#X8FPDT~RyZO3a8?Fcp49ZMESE18xwP!T8i$d-eX9kor7S^lwSX zzklpR;W!QNF-Ib%1k)xCxEs=H)QiYJSOI_dG2s4zQBzb*>_eFzX+SA)i%|p#h+zbKt@fv~pJbA`|GYTWH4rb02aJTT`n2h>1 zoTA0PNTCo7O*30Z=A)+SAeP3+S?mIpaU}KS*ay>Q4Y)hnLTpa`53GR&vIU&|I3B-Z zx$L%NWpV`EjqWJy&=h@Vs8g%l~&?L#)Dfp^TnoP;1r9bFk-p z&z+uEJYRdpEMh^L3H5Agfl9+wI29jaJnUVR{8wRY(SZBXxd4^VOHga{3-Xrg+`>5c z0JSl__v)d=Y{!d_+S%%(Hk?+d8S979aT033n1`YG9(BEcf)sSYD8;QK2{9`5j7a7> zxlw6X5VdpF^xE5FTHyDOda1!cqI~&#U*Qk#Di`p@LC2U{Fjru%Tf`V>X0mHBs zYE6532TVrwbhc*%>PEY~&ktiH>Zed6zlbsL0S?F4s1EcjX%0bsKF;bvXEp_mU>Pd- zHlj9+vzQX!c*ZYfH^__XXhqb{*#R{ZBfQUNVF&7Kz0c#7wvlE=WkYV%c`Y%T@_!Ho zP4yVmhBL|YFvh0-9(4nM8JmfOsCs%-a27;A)A_df4~v8WG1b#wx1DHfnQvK+OPTTn}I2GxP9 zs3o|I?)U!}6m;S{&(El!3n^z8`VqC}=~1ze1J$vTs5P(c*$&mwL8uN*@mzvBZ!@aH zhfwETD98A9!hIT)E+0@+8m+voeR@nyy&`JlT~HV9iMr4TuYEddWOKasWvCh0;_c?xk{mq zKZAOvT*7>K6?0*XDmLQcn1^~zPt}r+ksl*GpG*V!^qs0^z~h(>KX@jq zV>?-COiOzc)P^z=6+}xscVR~AzhQd(j5#q?U7MMoP{+4NjeI!v#L0EZf91DRFW~;S zU(?`Xsl<3&qBq{6V%B6MGYvtxxG=9L3N~! z=M>ZccA?I@6Qod=!r!R1D%Zl^SXSdP-u0g1Pq?vFz~TQ{+X-pIi19_+fYTb|wGTKU zY;FBI*vJQTVkWuHBFuzmP{H>Bwbao%+qdR4ScrPC2?b5vJXE^;jA`&UR2F=|shFjU zeFfW(N~3RB1e12PwXToh)F+^pU;`G#3#fF9(ao|a3>ADuv77S$0ENpmWbJOj<@B&6 zNQ$j!&yPECAtuLKJ#9+6qo#5`X2HX#t@tIX1K%+>rs`$y6?IV^?}Lh&8Q5E0*-c>` z4Ox5Jce_7u8uh$=0`6}tPGC6oZG8jo-)>#OxCeE3Z)L{li>)1Ijs{!DRzuWAv>o;N zQ&d#vUu04J6DFiS5S1;{QJ-(|>gUki;Jo%=q{Vi_)TkR(_v*v30`*N8h96N+w}eY< zgUN!LsfMVa8jQN|Levd+VLALAwF4$yY8@_v%C?!)wK)&#QjZj2Ur?H0ChqT? zq%axZ;$9rK#@4RzTKhpm1JsUo5jC>6sHsl8&Xyn#7NA}i^%$Ru3a-Q0gXsJRwS*lu z*iwy0#oAg7j-c>>g3_byMth1)#)i~);8KjU$#$-vQEB)V744-q+m1OF^HP6=`7!Ah z3+meVf_hif4IBL&aE9R=)V`BwEBUXfFS6CvxFb%WJ`>kqif#5{aRL>LuW<|(+#YcM z#PTqPFv1DH1l&J1nY1I|{=wmU)Y2W@X>Y~nQ9=1X)Z_UxYF|jPi~Lu*4lD={Ny( z!(+G`uVQ1Ia@3aQIlBM-uY|{JjWZxq;#5J6q#Y_42cpvJ9x5gh9k&q|LfxPts)LtF{|OpM2pxC9lPf1<9R=nVOuZ`MZW?}=pjxjOU zS&NMlsCq{ni2YGP_ztyX|Dl38#yRUy2K-9B1S*}2oi{6-58B$*qCr8|!*e0FqW&um zz>F6H?yu!mVj=2%F7lcl%G)vqsK2{pGxNza_GR19(xM*2)lf0g8MRasu@Wv1QkYNS zh4;ajD@>W6_jlA(ZT-Vee2VF)N4{<&&4z`k=SLma3&-GkR7~W&Vebj0QA^by6&nk& zk&eTJ#6U38O?xUOzr{-^4ZZO@2duqqFQse$7jQ;Xzl~bkmUnCe8i<{#A4KgBneW=O zp(dWBz8n=Z9sacQmV53&ZCIBuvhqL4J@2IubMwJKe2AN|9L~INkJX!~sjv6IMm_@- zBNuQ99gqLeo_^aNS$aJ{rCY4Wc77*RT0cd-K_z~opbYZvMxhA}Q&Cg;5|zIhpV}I= zL`~@?)KnhAFuaf2ibJ0T+<%Nx4lhvuAL{*K<6rg=+Kt*Tj-h7iHYx~1pOfa?--$s% z!55|mtmxSo^%U!d+E@mn)-VF2FybAk4jp{Kmr3gPa5nX~FYSioURg(%qq5@&Y9ME@ z1m4D=rX=~_wsuufORyM~Mwd`0-1B^gir&C$%j=|=l6nr*2y0Ifmm2)Ok-( zS@0Eg-DGdb|7{eqy|LeP-oql)>%O%mnTblTH>eK%gW6F3Pu5+4Sylbv9zWE~IYV~| zGt|)CJ#=@2bhpw-9C9cL>FzF(5D}Dal#mjTMnVyklD^+}|CaapKlh&JfzMiN@4b4h zz0a8neP%8C1l2QHT)ZA?KWXmby--6j5cA_`)N-Z>6gGl9tlNC()ZDudJZ#|JqoV#zdT7#l@RqQ{wGVL%17N@gt}qzKW{YUqJ#| zR&P*ybCTEAMY&NK)h%&evF6BP!;Ng8v9YG zA7WjA#fg6#Bg8(YL$&w=w!p+OL%fgSdm;@8`W6yk!}IM%wR9h93~yo{e2$ttnPP=_ zU0EFU%vTYWapl-{T{E0Zd@yR?ND?Q+>zQV#AK&YRM{!YzHK3zEgk{M3>q8&|7Ys#> z$znW$>rq|!c_765BGLrROa`Y=1^gXmJyI;LUDpO%limZ>Bd1WS>mF+PC68z4rAG~2 z4opG$zG?&_u??#0#-X}?Ki0w**aa)Zw~RKTHj*8vjpQmS!+WTT#ZD07J*L+{4cP+J zvOI|W@HIBaUJ3dAC)&Y|6HpD~CkpXCYDs~bd_Os_qbBDQ)Rr5T*oLAGD#PYD8Bb#h zY?;I=)DN=}pMhF-dr&=e1+{UNNXp+oRiI^38}kvUNi`Ey^DUSIFJl3Wl`O>jIsPJ8 zhxj?%iW!sJ5MDs_%q#4K=~CFF8-tUG-^A3|Bc;uO=#+f@Lp#+B60~f-L*2FRp}H(x zst{j3#=HS)*^NnUE%_2v!S$#Xouvpo=DU6}#ZGZiodyPyi_jhY*yP^)GJYPs$}{T;F6sPBNh zogu`#&%ep&{gNGDg-jvdHzXazLY$u^bBM2ue*UMq1$^_egm_;TyBujJX31(T8HWS7 zV1qMbHtVr@IFaxI~Xc%vL4-h09C@jK!fb6O8x#gW7dUH}R~fXURsW zIj{>g#QU*}*8f!kT7DG^nzc|*w~bMc*BwwpGt#Bc!y&}iU=7SvD8&0bueWn2HX;2Z zYVI^CY|C{smM6XoHFw@&P|GhXN zyMQ|HEo!-@EN&ZEbqpsy7qyjthsx*Y;;erygG(f+B6l%_iiDQ1<&mIdh%butw5YB5 zQ`FtAi*p!iGEPVJ&hK6R&Uv<}MfFeL}h)_Ym)0-u8oB6+*lZ zp<19;(LBtA8-oPYg=bJ*auwA@cd-q=LA9hsMH{n$s0uDd-DK9HmfwC<4_t8Z$EdA1 zMkTvG6&4|02&-auY>2__1acAxRJMu~Ms2N8s6Brgs=y7XitIoQ!CBP4@H?uY$LP)e zDk0v}a|%?0>R=;mifZ|0RK@or`38Mg2&k*?Vg$ylYRe-N79(ETIRM)b{~EPnC8}mS zSb0=e23>pwYI5GhwisUBcFvKQf%q*{gJadu(6avW5>QQ>VH|9Ss!$hHi=tinT+B** zF_y$5sDfkGw7owPb$%t(P&7f!`rfD>nu>aeU5#3X-(rN;|7!wTK51&%WQ#&w*bSTF zL{tWMP+j;2Rl)eRZR~TRT2>ad8rot6_HpSmQ2FgZ<#Pd5@jub~`M*SUY0|GAFAL7F8w{K3lr9}jKi@y@qDO)hoCZ^g1T-wYA4-^nskRzJL+}R7W}qe z&}Mn^`gTG-)P>cYtxy;AMQ=5rTD-x<_n;=zCDh$ARs&n6*-$-L2i3s7r~=2LD!2r- znzjWAsOwInmf0IDh_M@5fyGcm&;a$`uN!v4!5D!zaRbI^WEIWLpwV}2Gj8UJ?a zfyVY+@d>KjU^N0NupeqxuSIV;x)WkHv3PFOB&&g{P*2no(-;^32Ky5~hU%d*P3?AG z2Q@?sQPgIlAm|HkW*1aPRip)ui@{uQrfd=7{Ti+%pN9Cxklv`JO|C1g?8zrq zYwPmrs1|>Y_3{m~CuGvZ6Mw8W>OOzdnIdB(%l?xDa*1Y19~AL`}LksICob zYdd8+)P9i-brZ{jI8y=90xJ_U>5T8zLO*b9B_L%eS^?v1L@E>zbaM>Xgssv@yFu>MtGA_8i8B>sTS zP`Bfh9qob=sG(_vd2u?H#RI6VHfATY9M&d20@Wj@Q9W=CwIBS8>e&pPZCPgP%=*`4 zDMEs3Rt41)-BDvU0o9e8QOoZqRLdWrS8$gQ?<1IUsO!g~&Rd6?^@ngIUc(XCs;lj& zH&8uNtXt6T%XPY0*H6Zx99V&>*j3btf1<`LR`(F^bHL;{k@$Vghkbfj53NAWiA$*E z`Wx!HKT(tO1NOu8J*~%Q1PRn2;Rq_DB)#lF1=IxtP|IvK>i9ua7e2>A_!jG8zTUPG zjYK^GZ9<*@0!v`zXZ94`7S*83sG$!&A)p$@`P{lbCF($7)EL%4&HARO^SYxZ;V_KE z>8P!B7itxq!$vIAgnf9#!j66It=EQr_JmZlzrBS!iDR|?I}Zr)enaVFRLfcqw65=j zNr?|cZNZaV`dX|;d>3jK#~Nh!iiD^!FN$hm9n|daH*@Rjv#mEfDuWuRg2rKgT#4;5&2YPi3`Y&oc+?ZrB2>>@ zbm@PgdL|Z=Kd6=@C7`iPkNX(2N~i~tkdc<23o{UJfZ7-O<5td_>*6&=+ndW?sJUAqc7gU8pC)n!AfSO!oQ9EA)R7HAYVcd#(uz7&maT5h6S`8~;ITCuHF4&C9;BVB9 z7JrhhifpL#;?71mi}>fL9t{1`u1|w4h_^&la2Kipzo3TbH`M+Rd`X}cfvl6QfM`_B z=AdTv3CxK%QSWBsO|e;D0##rIOoWY58Fxk%Gy;#|L{yJ7m}>cSMh(df?4b3(hd?hT zQ-*2wu6Ej2R&c!Oc2~=Y>VXRQ5L@9DtUAN?i%c_ZOmm=Sb#YWhs-arg4mFu)ICtSl z;y3V&)_>bswlfu&Z5JLv&E6ZR4e2?y#J8v|x!D}+fx)PjjdIRLZMExBH?ezI31iK* zIaUp|mA6Hne0)=ImDc|*0;RC^JevaxQA2PY^I+on^awo^g}PTXUSKz^<*4O#6IIdo zs7V=np-s|a7(u);YPEDmVitBNz@rNmNT(99zUdF^&#HZ0d`3|F#g{L4E#LVh3YG!iR5d%qo0mTkl9rLiz)Y!neEZ zjYO&4_I_X-9;blPd#vX|f3V3~1~pfPqk7^n*2GtM9xMK6A8@4JtGUDa>qjYcl>7hmv0WVu<(i!QWy7;;Ap$vh0bPoIw}=8nqhs zUvlgJx=Z*6wfquZwtXNgYF(E@J(@K@KMq3e8zWK6bQY$=?@-I{B5EIbiP8 zz&OMw;{lxUE9*ZYfyP&CIdwuU!&z7sPhmNXchx>pt&OV4YSi(QSP0ai?d@fy0#?h#C|vIquC*-9vY3R$O2T4 z>_hDr$KCPksEWKq^;FWEEH})Gh42sTfWe4c_BcHj^=x(;wTE9tWf=Rm6`UHCVFuLu zf-ceNaO%$sON-s^D&yeh9Ur-Zg{1Hw2VHqC0kBR?I-W3hJiP6?J?n zCcxDghC5Kt1^ZAHzlz#w@1q_}Lhf42Q={_BjjCWBRK>fX_xC>s5vV}IWbB4#QC(i@ zo_oSU&56dS$ut=?xptx^-C5M#^9ib@*?zYk%a3Ylaa2#%advR&gE4QA15*j;cDfgp zL6ZBHL0XJYJQLQ#{HWujQ5k=Un*GaBTlQg8OW$Kd41Zuf&=1vP<5Bs|Kuy|Z=)M2H zKtPl457Y+q0)N074@11aZWVZBv;Q~jLVDppY|<{q>clUj9!xU*XkXWP%b$gKKek)q zxos?~QFG%W>S6RAs)t@;HH`PdCU0ZZ5cfs($n_UN8|#N8XpEj>ER6HgCP@I*lGLa< zk`r||?2VcelTgd?04l>PxCZZ`hGOz78_KVpJ5kr~MNP)5K>|4mJV#X^;$K?@g;8VM z2sOzDp=S4N)K8?~JJhW0j#_?8P+hqTqwoUii73TK8A!&)a|98Ow zxC1p;a`{4i5xW1EB%q8wMRnyM?*Mx=YK(qFweS+E2a?1HwJ$=WGCqeIs_>YhzFaZ+ zu2|HZ=pEaxABQQ3FGX#|J5h7vBr^Yb+9jY#_8fI$NF2)`9Yzr^j2hDcs5!C>RpD=) z=TJM|U#Omp5fbXPJU%Kt6{_HzsO!t3dY~Z&6=+XD73hPyJ&r+5mWik?osS*xIBI{$ z6B_D$fpHABC4LPXVi|v^_hHlw>`nYGHpPYk%YPH<-mw=|&Z$6XkWQrwNl*>1pl11B zs97IBEYut8oTznO3AKYY#xmFe)s-tyLvYyn02>pJ8#mNr6?NsGE0=E7`P4b_ufQHypytjpEP}xw2xyW#$Ep~b#4fChT5i)&U3&=k;C(EKE0czLd;d*r zPCRF_P;ZZq#!kd={R0Vb*JsjG^AmqzCpO{w*%UOqoKxZ_PN2ZFOE|+aJc^ zR2|O}>V3eu4QuImBt1^PeKA}GMQ085-Qd9LY@yy?xrojl>f1}aYmQLwE|)!LsCUH@AsP_vD2IjX4zQtfJ zGMrN&)O)*ps9>n~b9pffg?isE+aKR>Vc)_w*?JWT^=`|Tu_fs_i`o!OKrOR$#X`O3 zgE+-Qy-&$|p(bfmiBRvW;_Fc#WHc>l74B7v^*^5zZkG!64d=kH(l&YCl?nBJO;-D| zq244Ck;Dp#T0M)V{Rc)&tRn7K^O&HE~KcXsf z-T4q(5Pu#dkexu?>NW&lpbGvDwPPK^g*p*+Z}_T)oxc{Nh@ZnqOj^?_UIJSYuY+pg zW{kj{E`AwxFS&)f4F}`ZvJEFAYRj#I>Vcl9o*9Lz`7~5Z7P#ZPQIqxzYER!%+bZ}2 zYKJ_J>aly+59`*kp*xJ)Z*E#V=zB&$x7h@Bt)^K~1y@D2xG_%0o~Ro8>e)`10(B3l zg4$}MQTxXp)P8aX6JqT8R-t5=g?JX!9H@c$wf=h%P|KI1CfARsN%<>&h5Z_Y`m$n3 zL(3=+YVR+L+6g~JZOwC08`W{t5In&0Sf!CU5!Ha7umIjc@B9B!G`0eAV{HyJLUr{@ z)RuV&)e|wASO%$3Pe6H46|Rcv^7g2kN{fgPBq zX{h(Bm+s7^ zgt4%nOCN-qd{a?#VR`GIZ4}2y&;_S46n{fi>>euPm#F2GqK%y&j;d%Rs=#8X7S=&k zxHA^PVW_#Y9W`XvQ2D$>-Nru#2{a&3w5_#p5-Nl3sEkjby6hIJ#xGF&McQ^&;Y!X1 zs2*zToQQfJ*oMXMHfl1aZLe9+r|76v5}ZarPb`Prfv^r%vr?#yr5~!x7oe8S5mb*n zM6H5AN82AFQTs-IRL@k#ir5sjx)xz(+>OfbCRWq^KW-;`@Mwf2_!eVZe1NgpQmc2i z*;}VesP`dLU)1D#idt?1yIR-IMisCHRly6WA$j49-_1604W+s!5s&Lv(019%rzfxmD!#_wTs=Qyh1v#1_?h?;bXdRjaaDqbBkQNFJw zfe;*tBXK-tz_4DS-Y1;7P;=rXYV70nwvDF2Nc`dLqf_GA641qn&eBuRzp@*=1$vK(sm_e1Sq<54}a5jBYppepv*`Q9Cm z-`}2sGog+bzz8hwY>!&rWBLbeoY zyEqvq4YV#!J;?IOglb3;)FiErYDn)O0Zo#zE@2~T><^$O+g;p%!v@z?a)bT9<`mC(=uyR>uldM(eOF?nV{x7QKC9l*JR_a?;bFCif4h3LQb^a}q=F zET-4`zf7PRzCv|*z0tOTbaW0wZMCy7FK$ImqT3jSp<`?atD@pPP(8T`RnR`nheuud zzgU=f+_9{GwWu6{rq}>g!;PqlY(+gN96>FkbEs8t8x!DD)VltNy33`Cwl0oBJrg!Y zO~&@91`I-NK(m}%qFMh+I7vbq{2iNPm2tKlm!k^Yhnj3Zqq_P5s%xL2=E^(Na!fkj zDw-M9utFFUE2An@4I{9zbKrP4dFGO!^?%SExP_{5%n7y;g=6g)+%&KP>B}ZsOYWgs z=$mAdDmiL3)kaO$KByjCf*P_7sD_+D?Uav#1T?0BFKt#AM-|)#HHO2m08T@_VK|62 zF?_Pk`W~pUor8K9J%$>}*i-B-*b+Y_J`A;dub@^<@~M`8unYlpVLi-`U9d9FM^)?= zj>g2(tP5wMo{*Ni_ z+v)G(2;!Y*Sl2y3W$+x;GjCAqIOR;c3FSsj#=1BSTcf)ADQ3asv#f_oqUJ;o)DR8F ztXlue3Ft0$0vlssw%vx?U@PLcQ3aNp6YBjeXcN@rJB!Nj3jT_J;xarkH`MnSyUeq< z@r~z)dS7l!u^`m@TkywF`^JogR9x$S5dm$L8&Ng8h#K=Zs1tK9vgK72XAp0Vnmo^N z6DC<4>iu-fKKzV$%_a7>`v+`9JnK@{IS#}A_#Pi&-({rFCD3ZQ?b)v|H}U){tbo>- zj#)n(GmyS;rM37+=Na@iB29b-?QT{R3lZOqn$=HHJ7u*s7GHr)h`&P>*l?{4RZEN@-WQcV6Ll|Hgz@n_ssgvy zvi|cBh_TKlS3cD2t%a&_Tg-_=QTxMM9EnFzldkG|d&koRwF;JFDcp*&@d<|GbJY3C zHrRQYFateXFi1c(X|&N!?1$=+nb;N&-~i0L$;NO2Hs`{$o9&Tnz}GhG<884XT!d=C zT2#J!Faoclmh(H*WX|=Ct*&5s0-9vCQTsqs)cWp?%4i_!f=SM0&Yh^P{RuV37jYjx z#M`)jtL==Fw^^4jM?GI`!EAWS(u2Mi1XMt*?e=`18fz1ujTP`7Y75Q2!&+1r^?2P7 zH8ed?JvJA0GdhB0@dj${gnw&WaYIx&BT?7QL9b5_5>QJ{qHZGRQ3c$?diWl7L7koU z^g9I05Wk7-F#J2qcogbhFc;O6n@~M_2(?fAjG6;CQTacST9=`_tfk?o+1VadkZ5Qy*}c5tN5pwpLj>qoSB2_iPv}wlkB!<$mh6>_|iQ#SIYlD`&Cda0;RDP zD!veB;wD^=<$nzIzLDTD>Sprg-ca9ue25XaVV`ZWr*H%D_oyCPx8EA}0Q(Tnb-*^d zC0LC3@dK>?ssv&lw2h$#YI5|!!MFfbk>rQ$z2SP)SU*R#Fymo9QjNiva4?$qgd;YG z5*@YcC*u^-Lyy_&nvL~|e~Xhh}?7gL_J zF3*G+i8n%x{UEG`lTnlHDrUgHQOhyuDO)WCQ2R@zAb}_XZBX}sWvG^&MBTmaqPEzu zpRB;VsN-!>bKwhA0eeve-g3S|?Wpm8c8_MLBBJL+~k-^F)g1o7WpdgvLuE;FhJ%VP*OK$X+nj`RJ$1XO{ssIHuk zs`(G7WpWI)!Q4bGr)Q|;^&ZutWM}P>DjRwQq0VoB8j4P+{a`z)%bz}5KhJ%xD#{XZPZ*#c!Tw?6AIk0F8UNBh|fgz%nsC~`VqD6 zPoswFDt5%!H|^oH8%7fU4Ap~kFgEVM`1n2c#$%}birumvt`;Pq_1qg(k@2X>u@&Rs zUQ~}9MrC{z)l;ugtHXEOu1|%Uy!llq8Bz+bZ!4h{uz2BJfIcl;7|0JLqeMEI} zqPsRpvS3!?MN!MGHEP2dfGu#hGvz(IEB19>Ms;=R->t{Gpe9{E4993x*RMtm@ZZ#^SZ&1te0BV{3ga2aWpP{~wtn2W{ zR&e+edyLP9%C9DB2s@$58H!q6Q?ahr{|*A0l_5{91qD%ESRb{~3`6zMUR2K<$9#Ab z3uEHH?Y&(U)H)x9J@9+%idp}$FXMfMYWbJXEdK=<)R-J0pql-T%J?;EvgLSg%cv@9 z9~g(K&<<1uU*Q_e_`<$YaspM+PhVO^JE2-S47K&HK=s6rsQuymOZWUA>y@35AJz3W zQ75*+yEp(O3%!c$>&{vW`VUAbA5;z348otFkcn2qA!H-ta{n(cHB~(j_^S_p3dDIXLKwUoq zHHkN&X8lR*idRtI8C@}kpTCO3`WqP2?|lH#CYIm(63Ne4h!YdX_IrO5qB2$?UNVl~ z`;Ldvs3H3q)$$iO5EF#>y)KW&w8S^#M?8V=WT@Zkk)wXU_sDh~y}$qG3;4Z1K9wGK zaN>K^R=X|C?>&h8i&}QYb`6eBQhJioVLHUS zj+#q@F_?|6m_R@mZjJBv#`q`Hikuiz2tRA)^-VIgIaa7AMJO6UV zPU`n2TN>2l%Yyt8DSGP{KO;UF+u{eTgl$qb%0JeWVhO#a^hce~#TT*C&2G@C1Ex z321{jfCcapMqyYwE1(8yNSdQs(hfCLLr^_8549CgxjpXf$8b0r>GuDn8EKo^VLTEPMGajn)G`a{oZ@XOqpyh zOh+|jFJ{JnP!&p<+0WL)yKU4QX^fpT`@0cnj%Tqf=E~yt-X8ZrExT2y3%$rr3PLn-VQ&-a#{V}m){rTSHv@A^Lsz*u>)0+ud}m}(SUmxY(_%9oVLy<;tt{) zQ0Z-R`MpoGc4K2M_!p;=UMG)L@CME!o+_{3`!zgU@iOs_`TX8(xJ-WAxW=I>b{rpJ zWC6c-4@q2*^&de(s)E*K#Zi;42de8PVMz+!f|?_L7P46%qp;15gqWQ4^r+=k2sKBl zpjJ^EY=a|E%k&m%P9!K|b1I?;>tC}q8wr}t#hg`8J6mH^hMh43j=;LO97FIKYAb$& znxv6Mt)M)Zk9Z6G8o$IaELF^UwhC$$EejIR?EMj04!#$t*&SZohNLvA0cSSK ztqY@3_w)OB6hB~IJW|GH|4Y83JVeb2e>oe9boe>(%&28H8&$z2s152gYRImlw%*(5{rvBH z0=k<;mAA3$g)NCMKy~qJR0YaZupO;3sw;crFdTMqT$w zCCjf6X4LvGML=WQ8ud+Nqfui%ud?5Fh4@xfizZhkgP3H9nw*=fTZVg4$1kBOd=ocd zmKxUOXHhquJE$QH)U-((f!@#m)+Df>15HrND0MA+63T^|jJ>fmPDXXzNz|(O9o5p8 zs7ai;wsmz2R9AOKUEd4UgI}WN#7tBJH`iwU>!xtjC45BfY^my4O|zgTVJT;4)cMmf z4xT`D=^0dyJV4Ej*Qg4ns%wvI*-(3aUu=R?QFqDvby@$~7;@LMS>7C#!EQW-S5P%w zQ{TFHAL{sV)R;bS@wg4FXL6v1q7wGS+Nd5lfU3YvRFA#G#|&+bU_-kvr)q2$Ohs)R zv6|TWErb<__eTxEE*F1=C5e}8>i0gB8i+%P|A<+!L^FGcZHI%2&p}l@adUfG&WE}_ z*nvPz0!y)2Y`&b1i-||J_IqE)Ka6@B{)jiJaiKPT?~6*w+xfk3*XfS>_SzlJx9zQf zavkl#q(8Rc`rlFcl<(yCzKv%fR?+%@P9P&0le1xGP8$DiT@;$hwF z+3*==AfB8wGmrb_ZSd9}Zq9(@_ z)L5Oz%oww`JwRkdjeTv@r28Dt;V8_4jXtw|U0+qurmo;33SCY1MS2ys7Z4kqpVgFxu8_ zThwwHhG}pYGJAdJQCU-IC<@txS6_<_mR^?9b)gG4P<`Wl>uNvGc`@P@I_8DpiOfbi~yew8EKE%cMq2|mx z9ELsT+7|l<>Io_^&t`W)96`J@j==}m9(&IBd*8%%7Heqz7g^x<{s8$X)L6D&==Z*J z`72b5-l5ieM5#j|G+s5<8Szw9vST`)s@g>*|Z==qywbXXbWXr6Fy5S|Q z|1Sxw!Vb&*-ltt*EBxMv#ZRy&>8)4VI{(R;c9qTIuBbV(0ySh+SNnbYa5oOcp=<2k z@EY~78MW4IiEW90fx#XGt`X3(s{6Z6ymS9oiH=%QK}ne#`&nR-HW<8-9z10 zvv083Jrau&KZqLhx2XN0_(q!xgHYF>-N^c{OW+j=S`Jk=`Ms}D&cUO)V6%;FjIS*o zj;io|)J>(~7F)JkQ2G3dZ7|0-HrpqmCh;Rwg~GR5&o)6dh=y{C5ci0Tm?X_7y5X%wYfYtFa z>h@l2pFPx$#V*9}pvnu@+;1Ds3e;Bl2dV;94_FPypvG`H4#JzLu4{JCmf>*J7W@PY zVwOXePcu|ce2d>;A2FJEyq|43%|P7~wz&97%s~7BeuZJDZ4NBNZ;7WpV?%Zhn^L|n*I8R; zWAQEVlXw`9p7VP@_cQqy+cLA9w~E%oxlFzls6D*YMVsZlaUJoMs2#NSC96mf)dR~= zLw6n3pjek#|N6xM-3S~dq2I55?+*r-x?=bBG*|uJm({N0L5^R%=J#F2`M>#nw{XC9 z+ZmhQum_hRsL8bewe!WkX>*`AYWdy3Dwy(?&8612SpRClWfIC`+}qZY+NitOXl#p@ zFf|sxV=ZogN{>d}3m%}(Z+6!nxi(=};@41*@0IUakF>^-#HXQVf0EyWe(#G(U4OTC zK)LSweTO*k7pkkaJ+NoI%cxoY5JNEhp;agnl~ELGvdzH{co?7Jp-1+ncE=xf{&Dn^ zeg{MG&me&a0?#oMCjZku^C^y+WEJoqHk=cv{oscuHrroeIpUR{T91rJ-2--`es4gY zzwJZk&i~lcZ-;00?)W2q!FiuQ_j|vHB={$R-6X7jVRyfFFa6$++ss6*=d7>%-fy>P zfd_~u{nvWpB5FT~_u7`_SZquD5cZ$~k#FonsTptm-VdMkdB@n3-t4{K`~IM1AG~Kw ze*XKTjrj+hO$G(|%xeWFopxaJ%U~kvz+u$#C>cNCeXh40QxH#_z$%ap z;}IW%d2l=?#+?`kk2_Cedg2#QTkvyCiRBUoypQvmVJfZvo&+?zqcIsSMcuV_pf;9A zm=NP63V84JlB3c;MO9!R>iX5FIkFF{;v1}l6%q%$C!h(aeIY@TfVah$#h|)$2mw7H z{EXS~51fn1l3GPJp)S0QSuts{fH#XvqI#wxF2@!a7e8Pk3`=hLq{VH-w_`Evk|N-X zV2GEc2-x@kA4nPSKIuG(i5a^KsIB*Y>VUUlR7n%?o)4y?CgpY1a!Zod#x@EyS0l=Ey|UgUDfQkFnG7^AEa-bV(QR-gX~}!1Ku;?N>mSB zL_G;TLv1XX!UNvTs}!asJ`@|_TwIBNq4tXz5jOVoQA4>E)sO>00_w7ts4fO` zbg1-Js5#LMHOYdg48B5j{W8pm-=QjW74zeBjE|8SZEh680>o=$IF3Y3;@~m@5d=1) zCedls*gZrQ^alMHmdVnSqAHXb)#BnV-Uu}}x}mO{j+%_iF*#mCRrntaU?8*CV1EA- zfpR3|L1p+ER>Ut+Ejo)@4Uf=!hRYK0o{F2G(hob|U|!;RBLm*Opf%PZz6~|0V`a61 zbD>s65lpA`Ka_yFem<(pcA(zT9K=XGhnoGbaW>}2W-Z*0I{z%HM{ZzJeD03>v)kCG zLe2Vc48x|V9&L{w_4l`X5Ku-va@&}Efx3N;Lv79f;C|ekhnBHyKFb^MO~pg`0={9` zut30j)H+u%;5}@XFJv3ee*Bc{5)=;j?qPSli1mtC4`(aN`qxy0^9jf5EWoK|Mn)vqTjF z-e*c#QTxbHRD;H&Zc<;NDiWMSKo{=DRCpP+G5n2M6(3wYbw#USBr3fUs^B&lfx}Tl zwgk0$_F@+N8MQi|V=N3*vX;k3=1kC+kAOCeil_~!A*xGzp*D&Us1{8`WxNbk!7a`o zP!&3Xnw0l20%KIRxsVan0|im}mqq2@486bq-JO8$%L7maPC=bG7uCY8sIfhR#V~Fa zYf(kikTrAhL8zXbjCpW9s=~jbX8QwF1tY5lyid!^qxbiJ1`|*Ze2H343sFO{9+kmC z?1|?v0;8%~McbmfwmYie5m*oxp(g2Btc@Yntp^*ShNK5p$LZ+({jc8$R3ag14coDr zIon`K(mSInxB`{IHdL4Xit3SjSO(MAv`N+yyA$t(>e+Ls?|giOXNfr?_!)73mw@*Lg~6y6JjUJFy(>@4n6;bDfs=TE_ycT@8@e-R zs93@t0q_%)4Q6oQB$Kj9<% z6SbjT8gCW2hng!fC)fs-ZUXCH8D}LymcW=;%f;)W_UiUnpQiT5M#PUz4){*RV#Apd z@J-@^KfYot8S{ZN1HPxESDMWO2=OBGtzoMc1iX)A9$^u#kGC-3{a{0dg|uH?`WFe6 zF!v&Rkm!q_6F-fbeB~C~#`8UD7AIR`k5t7_J(Yf`jcGO1Q}7tnWZsCHlowD#{T9`O zLzY?3J`57bO+uXI_5@TAHT#F4w%#?U3f{rqm~lnGw+^S{S}e8Fy8Iq$2xG6Z*qVFcF z`JY&exPP-fmN!OC-YKXG@5P$<0lQ+2uWcvYfg6ZFKzbtRo4F<6eRv%6n}GM#uI8vm zt<$KTFVoh5_u=$R>_fcJHrtri;CtdfV^uu0-Fhtf4%;W{;SACzVO|XX)`qSQs^|LR z3JuC9J8kUup;{2~oh`SbsFpNGZ{4HD`WT+XXSfUZ?y}`J`1^qO!zznWbEM$zfcLRm z6YN5KCbq!$sC}c^o`A2hCdDKIL-98Lj;(*Nxls8>Yv~kRNcs-cdG+@Oyl=HQjpvBB z+-H+2-+tS`7Gp=!Z($Fta=5~E9Y0^iXvh`d4CwpF)fEu#%7>;p%wppG9hY;_C8oJw90TZ9L zW!ebS5}$TD81TN=V##GnY^tGpWH^q(J-7hNp0)I=Setn2bN0y91=Ujvu{~bH zmKgPmy(L?Wb&01tZ>y#k>d9$Okbsue3oMDfE?7qEaU$_Ym>K(D40wOdYCaYv-r!Qe z`?A_3)EM8z<5=&q6`1x{wpe;_K8_%L6&69?2CnQ3~KDYN45L|YD|mVwdL3mwPQ|0Rb&rp%YBF{DB(SuGlfvI zzPoc2cG3EuM_@2r67zTam~7~MYe|d;whwf{`dl~(`{8wLg$*8Bg}0*a_dj6<%=pMA zV?|U?cEAp}8dcG_f7nnL#c;~^^(CNtzzm#?`%xQ2(?4xYC*o$}4IkUGiS?IF(xs># zyMSl$DNexyPwe(u@2Rb-7O1fv^tUzW6l(TA!C-a*asRPpR2W+j?}XX#01m)EFeA2m zW|MO)YW5z+DExp0vFvl(C;Fns{yQvy&+to(d|^+)+fYOK<^}6Nl0bo%_Bh-O)kPmr z%O%GvTjxV?FYzOI9;5#ac)y^u#p{6g{vq|7fcL#0fwuwg7nUBw6P&m3o!whHzqcOU zixH&%jngs72iAW*0;@jQXE=M?93=WOSE=VFYl^}pOD ztZ{B|e(l`m+=*P^+wJ1}oQIspoTpHe>kMk&@FxoM9z<&5x5VdROstz&vi=$nP|r3- zwX`W}_V&R5Zo*W!6O-c^OoqQ>XMBsi5%RT9V#m9qHky&>$GLbAmtidIm^94$w5%(p z(fS`oKo`tK?R;Nj9NdTDc*Gt59aYeKR7K+?3$rgqp(+}Q-7p`9;R5GstU>%6OpNbQ z6-$_$&p*_%R0LE|erG)lA^th)fJ6!rtn2Gou?1-VM z!n}Q@C#EMp6RYDkR6{?Y8j?OW-~Xtt&Y3#QyZz=zO`e{Z5LcnPdIze&)0hoOJ9N- znpLPS--xQ%LDcnEQ3c*Z_26q%SEv2NjKl=Q^P?&dj3S^6Yok{I)P=24Eg6Z*U?Hkv zYf$HJLY==I)dN4e<42sQoadaEQOox_>bg6~bwS@_0xIAIs!M(8Y=cRMkwhz_3haqV zupeqtjzeWM4>dVgpn7aOs)c7zExdtR?~hUEJw@G&Vx-ryXZ=kfpj9vpRlqt_%l9}h zp(^$dYEC2!x7i$ynv^+FbEF)qLM>2Z-4RuhUZ_bs43+PC)X*J9=06XM1k~mCQ5Oax ztVfbyT;l0aEy?cEi#p3=M$&7cHl)v7`dA!Dd>X1@{tT8+2GlCajoGmt2Gyb=1T;32 z(CZ0Qm#=efLA7)zeuh7x#=J~MTj!Ng6~FGhk0ppd#Zs6vlXZO;)IDV|YDjiwqWvo9 zdlFQ@epE#+VR5{MYI%yx*0q^Y1?54l-=e7F6`l1_6>Ec;u?t4vWYj9!>^y~P_@m50 ztJxb8G^yfdvHN;D)MRRdgK;RTMKAF%=8v?3UZGaSM;DKi)zagm8kXGo32KsOLKU3H z#mfW8Dw}x`2N18FJVnoYWl%d{H&g{jVK!Wai|}WBfjtU^c~8OZ3Ws@*^WWlDt^Ys~yZP)v zEyG8sZ^MsQl!_70Sj=vp(U_0;Ic$Kjid(@=Fp79@=N8OQ{BP83&s4&Ww?!?x<*1G5 z6gJoT|BXNwELPGc-!e?dq_~R%smSxv%wpm_$}$whCzoT)aa(yNCFwaTTE#k6wn;i0 z^=9@gYGX=N#Tu3aYZI@Dm2m+E)pfTCXiVRrYM8#NO}?tAA(?_&jwPzuGU|sFh)+kg z@FIp|vg$Sjg;42DQ2Eco2;78I@Mnz1mNi)a`gH1U4Ljj|P1|bI*Rm&>l6ZgzZIo%K3m1 z`01y1d{~e`F%nK-MvT?cPKd;I#H(OKGF*@P5v-4`!hEx_ahovj^MJ=~?fHInyD(oh z(xckj&1PZ;d!MiqwGZ4z^+e5%Vcu88yQ6v{xSK#a0=IB6enj%|o#EEiTnm<0LiX5} zY+Iw*!t{mbFW6)I;XKT)sm$vv6LCEMY7)Q0*0)64AFooRO(*RXd3nEV&XT?VKPF)P z)nLOPPGMgLc)--=&g(KKFOS30(I(HUBZWocbP8O|d0RNvAQly)LX%x3Kae(=itgat zRunpid{=U=UV}I{C+Cgl9KDirT(2J9-`^y#fr56r8n30c13AIZ1$>6!y^az;N$46C zI7m1nW+qd;=1}M<8t^YZ4#~N_#F8>aZ*RM3<0^y9D`~a*S*Aepgg9hjo&hfFFr`KtEXQJ!bshnF& z_j~RCi^!lF2b%m(xAR?d-fI|zmZi{-T-=G?&}$-@CL%nAa8fEC!m)(pv5tcOdqq&_ zTJq~fKEIM4MfjuZjsMPBL*CIrGOt8yPxJ4stLc5hdr42tMWra9B;m}|cpvfBIM4MM zw+CMq3g5%=@hX$#uU#Lch8K$CKH63eoR{yufvQ z2JKr(obS#&Oc7&C-CnOWzN(1Kcx10-KT3ZbHN%4nN8P>q7c1O(5*u` zwu%A|kO5C?z6l)Hi|-@$@v*Lc%dRg6$3G!G7d^C%d~)L}{DkyxX~+Ze&?_lqg=i_IDe$x=SPt72TthD z#aYQzuct1fWb|59;>l>qD>5sJP4OfZEl&>&rA6mCXAx;xI5yAq##UF^-#Pw(^Zxgh zfJ*4q&+85PKN&Uo?{$j|GV*T}Cmm*(lT(p;E`yA&H5<9`8Wny;FAV1#y~=RSa{g`O z*a2GjgljU89!;hG_mz#vQ7Zq1%X1dr=k8lVW)Jx{f&(pSO=efad-Mi>ddxS7)|}_U zNB`53F`TE@b=RHiIkyCrxj{bqE{o;ltJhkumE8IXH{$ppH^0hK#$M8b`$))4E%jym zPzpQYPIyU1dOf0mb!67tRZ3|+$g~fwy{CwKwW5+exHio7QfH3qb&x!tkQR$FLdm0w zOaGcm&eP|-`CLJKal}{H9bDqN)v{nWCBV-#c(2}^Q=itS=A0Vt+SsIJqXL;3E`Cjw zuRfLLF93S4Rm2xkcw1sQ@h6V;=hy;b@mOc3 zVf<&180}_%lm8iS)v*cbp{{$IlKEQV0V=(fYYI^@y?%7#J%ORmwDI<7#awEHeTxT*Y?%PXX!4Os|q^6|Wu? z!dHuY9jV|yRQekE>s7}M**eNf5{LGu=D=nC@w=_OS7*lPzn9-lM#Y!9a4j;O_dn^y zT*k+#^g=3sm3TLI{2R`#Mp{=2y-xncsjz+sLa*M$fARKTi~G)VQYKe;7cyAy(nT&; zNF7?!gL8Tik8)`pXk8%+`iBhr64v*dJ)$zD`FD_3E~NsSICq0<;6R+|uH6=-(D@W_ zos;#dM8TsN5J;3SvgVT>B(Gq9F0Rga7Dv6Bx-tElOui@mM>3k^#=ALb_sFO#nWW|X z^t5g)nPewTuN$;{BjLETuoB^MT({C4tH3qmX>1S9n@Qon5#|;2MY$QR*d;D(LG7M# zLKkYwmkWLSDCB=%{Lq#6>Po>CIlmv3@^hY_@MokI=bv7DT;h6F%)4 z7fv`1=f>tbJ|*&AztFJd`abif))kh@|9PlPGScc$U<|sk5*PhLkLbnkEAw7E+%@}1 z=NE4Mf3MtJbC+ueP=V&;Q^gHK26t{Aj?bYNy#4PQC+Zc0lc&;^W67KkP`p=ZYMp?z zgtVvw7wHv7r8^UjtJacXZr7dFD5N#<=j4-wv@S0F3Fp@(kM*t+*QoSb%4`|i%J>H1w_dL1Qg zkQ*Mwo2o&$g-U(p{hn_k6G)6tt@*Jq@6*<16xxxnK7rx40RG?Cd3xnvVr!^OCYNa! zGP*;{w)5|VOMBre)`>jz>Q5d~UWhH8v~e8&O!=z+*O0*?E{?&)9cXcF!vDQi(2AU- zRZ`Coj^f<*9Bjt~y~X*fs89tmdqX;ZPS{t8ip|CUUi&F*1OEoom{+dXYLd@yZh{Bv zaq(U%F=$Oq2QdFNN#1lwN;yG=^K;H#uFb^41Sc|Mwb5z+3-)$S8u7^qS~0IM0cPiFd^lRN}waA7pfoR^)Z9 zxXAfCIUa`!=riT*G-ie?WF=PQ_yAhY?@RVxn@CGc9)D6^(fEA4-Jd{aGURtu`o5&Q zL#S~EF5p{8e8tK5Wqj}5k}4X(waqCvCWl{fYEcd!rS7R*j}K+&%exUvLV6@w58|98 zj8r$W?ch3E-_Q|8S}o2U>C(~=-bY<8xfyVqb8>L)d)FUcNAWSZuNH-8qHa4VfNu!$ z6`|0qq>tmm&oRIS2g&ST*P)9j_#J5ta4-$mYZb>gaP9Zx6-EUXaa{}Id$9oV!KC-0 zaJ}vl{yLu9D9^cGJm~D|YPW>ie#3=1NRLCo2g&UJecj>MKK@0KaWCxWM(}^n+epRU zlTSI$`G*RBAg^iU?M;+8BzC4i{qCcl6fmCTQ=E{D8a^icfQtvZ3jOX{uS+ixZs6i= z$h-(?-8ql1WclK9?OQ7H2>*NaA$<(zwTlH00!l z9Me|_K6i71zhLYeLjmom+_zMEK11+;jH9p_LpXy9jppAh@`_?8k8@rI@(CwTzOLiT zN_q{B2RG4WdetH_kpqie;XiTmW;^7oNT#=4xB5BH?{%FW%tttjtGH4&QnAkNy31U% zj(Bmdk4q&t5MDy%^s2%zJkt-vY^H^YsbNDh)@!vJ<5XPqm|E-A65~&8fGSBjIbbD%E;Rp6ZCR7&5X`htxA;lfNDD}t#hU;vd)>w03an@h@b7{_jr zXC&w4;o6m)a~v0tM`%7kSe7fWgr`rz@RNPtxf4O^GxhL5(b{gSRTxQ5? z#D4{z^v@M1n;v3)-~WI0v%XMdbp*y!*c)L(`%u0giP@c(n>Aa94yk0-OVIfle~^0mbL)?oH&$KF;@;-cali z@uzju+|>FL`5a$;osNS$4^R5i_GBaB3WU(b3Kt;!0={IM)I2XcMsmL7#gZH3#j<=N zFxMWp-!EyFpuiFx{>_(coBI~T={Md3L_LUihX!g9_GuJ+9KNsI4sx~= z^=`ti1$x3dg5wcMhY?Xh2a{qNpCFv&JQAj8_=*rS3dya=H^L7g{wnc${Qe2_tSN~j zCh(Y||HPw6LT73w*#x}hO6zBxq)FlYhk$L?RQFTt8^V9R0{=wuTi~}L=uAKxqB{in z<$N88Xktwz;tjZA_V+!W4~bdioa|AnUraZ5p5x-uQsOW1tlApkgz&$?R})#XTKvgg zMVf3V(%<2ZwMK-Hp9%XQa!=J|vUeiCh`i6muflmT28H&8fJ{zTg|3gwRI%C7NE7F7^47;BKZPk0=OUWPZl~*MM!SuO zY1T69EJbGXCtGa4fS?{aT^XbekUjN(tGf5v(a`IdOez5ptrXi2M- zmFzUWYdnfyP3JM|ap$k#?z*r7P(m+BL&*?!0Dw@Wx?n&&^VxRE!4go21Bfzl?8zoT2!9S3=fj z3UzZ&RzUnCdnedreNv6wv*+KBvd0w4{8oImLdm}8+ig8UL1`oYG9JtEh{qGO(|)YS zk^405RF$y;T4vx3{I`?GFtxAZK zy(8ueMY6^!GR8|c2WGX29Exx*jBf9|3=|cwa^OYHGcEf1>uLrieWb z?p7Q}iZzb+YEk-xTrywqpLIL3Y64rVYZM*^_@Q;44xWe!gubjgh@Q6QA$=bv*}2wN z&fWOlf$tcT>|$D@_$Lt35vDF-89Oxn`R^*=nTp>^eYY6bm+t52^elU8lj)7Lzb>yv zv{N@5oe!0FEB~m-`I(>>qqACy?iasH{@bw09(PYx3~y7la>O=eBTv>if_XRNMEa6g zMSG`sfikh@VNXllA!;NxN`V!G)KYwxoI*sl5o;B~e4|LNJ;YZJX16uo6k2H{yM@d7 z)OJL)0IUo0kx0&?u$XmAUT)Uml9P>4cvn6_N6JlBD;nrPi0{A1dQtJ()}rXXAyLoc z7^3Ka5Vom+?`-MIQQ1niUE!$;{D~ylMMyUgn5?$dS-dlnz5IWLi1c&P78qs5UV-1` zQM`cjn&~}T7ATYb3k|Jkx->A~s{aSbpnQF#&{n?Ud}ru;t}>(SXQR7P>`gh>C|fW} zb%0HFLiGPa+?Vp*u5>lns-&H8xOe<+&Q6@w^>wU3C4z?NCD~<&?~frJ8f1A9za_d{%WStdy-P23vrz>T>5^uus@f4H)9{y#TScP+*y{O{##b*%nN%~|!AM2oC z>3EuT5mrF_l6z}~9(DdbF|nWc688gs8AVVRj{Wt?&(^-alXZkbFYQRb^JrVsK#S+Owz)f^@KH?ho zVphh^Hkrav;4>pFBsNa)ALpJi;)MNI@$3+lesb==@{;*iSF$!HzVtDE1?O)u&Ori~ zTFDL))rO#R#g3r(T*~(l^GZDP1Uud{^+mE-w-Wyx+-^Df?N|B!)t#)D4c#5_5w>%VLVp z!Tw9o8vK)^MsxVDt#|R3PtSjl#E&?9M_txU5>9s>ELhMz+0*WC#n|ppUpJw(Af?xR(Y&r7kV#)5ezslJ!@0xWDu?29Rr)d3{S_;j=(K5Xp zmkTbHa3iwqh<-E$KRYg~f&DoNlYp1%;$*R8b@|p1k?afkdlc-%H(ep$Tbi{Fak7^P z?4js5*p*^soNo+~b%HCm|HjCNdBKwP2izpFu$AmN>lB1nA}$ofr^QQFHMP#pSA4X1 zeg2K^%i{&k4fxGqW(1r?@g~4pNb1;6 z7fV(q3a9f3gw4W#MF@MuB=5%8Uwpg?-Dv{VBWE?vUUKqG{{toOG>%0IB%1-)*twzc z7ciCa?lqAl+ktpmzT(LTmbH)A6U2(cA4B{JAtc3~hLWeNMm-iX4L|G^6Uof2Yf`;ojAW1g1g%gXDt6U^nhYKiz^ z*zzH22$2sUu0qHl`%7Zku)m474-qBOG~iB;DZiuXEhT(j>aHm8m*meR)r#li-xABU z`Np>*k|v2?iEwt_Cn(Bm=u+WM5zb5SPI?XY(QrWh3(%~!ccE*I{XO_(J>BclbUs`S z{uS<%3?u!1zSWtp*gThrGLn4uuUtjmp zUK!?R1(SUMR~hMe1v=!pvW6La&G=}robM$3E3EObO%>l3wW<{8ZPJpWWV!PL{B-lk@&9jeK0L!hz0fXHcYa@G5D(qT7+w& z*!O%3G*txuM*C_!GsGIgOvn`$ze}}8Fa+oYh1)4I*L|gg1qkL#N>)mIwB+j)FJ&Tw zoTtG46oqdLQ3?BjSh8brTo41#^SCSiuHxsU38(s7z4~JjzQlQvbMOCe+%@^$L--@2 zq69vq)GK}^jgk)@j0(U7~A$V?dPS!>v!*Qg6{SX54ewU*B8{KU}64=~?9~I76 zcZI*S-VM^yUcpP`y`)$r`%sA$?Uk^%z;!IH>+SP2^_aa5+)ZK!iMYc(hL)YRm1C0I z)d zVijTkuvWm-v;L=eva6gwR;Me@UFolXCLy>a-}6hLeG0Fo@Li-|iPd!OuIq8cR!KN;b`N$iKSHX2Ee0RA=#@Juf$P7Xz198zr;5;p6hQ2hamehZ;ZL(j*02ruZicxw!$ z>PW5wd$IjwqTVN{IRA}us+hnA`=9(BolnV2&Hc3_+;?g{f`29Mez}dL=TA|xzl^sJ zz*@o2_;O;j=NSJ;v4t=fA$?teNjkYHCa@K@y7R5_ULbap`+ny$t@mPDCFFfgRI55z+|kk*k%RR64hVfQ;`jK&)AAMyq3>bkKjFo?@o^d?+tQO|5^PVUQ)CZ(i7~- z9wgv3#6=Y?M0rgel$SIzI>n8{sZY zpE(_)z;C%~fF)H@_Ep*#*q0R;55JXv9I@S< z2jNY2VKlWQL<|<6twyr!BF3^;fn?hQ*o25=SGw1hv)KJ@Wb>U1$r&4k8|&6LF=q{hJu$f3IDAFtpPE*CV?7`>_gble55AIt%q8Qb9S3w*is@&9w<`XY6w!0W)tewDmW(h_7R#yAV|Ek#(AZ;seB z_e${RSYwcV5e<9?lk7^kc^=1j@rM+D*+iFmY~$2=P=21p^KTVN8FwwoonrzSUr$5@ z^L;?sVtg4Jig=5hXM*^!Gy%nvU8{Iu>!<&Z?;H6)rO&jV5lL6Xh-#!UT6Gm1VDF6V z0?+JH@h$P9-LL!G6#X!-M(z)odlddYt3AvHu@mrqFR!7(gNRFZht*nc#0C|pOR9Zo z)#Lv`oiaFQ<;AnJX2;w3e026c(#1f@{-Js)@O6r2>?83H6#6qd%J|1Ryd!pa5-L7j z-eob-(ZQXtHTkCyc@Hs@(^t=SA)uZDtE}?@9*XBQ8|V*&8N1$nA>xS$CQt9!+^2X# zX4Xes8Efc#l*=H{jt2FqeNzORqh63t%QS=TrjPF4{jo|NDb|#(+WB6UUi$gneF*GS zD_J?%tJ80u^<#LwV%jNq0O2kqcgN74BdDGGXRw_q?hpcQCM?-AG00zWd~RR`6in8h zKgZt2{!(x?l~W(?$6SohZ2gSzNx}63CsX&YLiK`R2h}BGGDnNGGQd)lXA@E^2vecU z2|5byDuvb;|L+S_N1`5#_IX46&Uq1SbI`vgWj9|1DLb48qWdETlju6jnXYsTQnz`=+nwxs%`xe=) zdOllEE%G2)fANh?4+lrah8x_SL}ly+JmcXqwgCQFe4W!z3>e{3Me=IvQz9xG-0#2z z`OoCrta$p;`+4?l#9Rh*n)6$PJSmjIA3E=pw>^aaY=Ykt@DHKYiK)TgUA#qnY)?Wi zk+UWJ#GauphatT;6u$?2rQi<|23jYo@G~*fjCwZ#lMo*1JW^h5vDwba=JW53^P_Md z2j68|hNk_Wo#kr z(K@=9qn&uh{zrVWdvssNdd)QMbl>AV$T`^}tH0dr?;>%&q!BT`1bEkKNyrc4tHj(Ye(?e?u*^8lv7tH6GPYt@vdS!O<;8{nrIx~#$=M~diV8tv1~s)&!>`HUPe;J z`de3*nZ#6tm&6DUqr5l~PZHEH3N1;vIG>?l#!7_mI{0K~DRv*;k%U&2b29EGgkOj& z_x&G3Kym92i5DwaT%c`=v5GN~j>fj1h-SLl9L285H?4AFRgLpZU7q5cvC__Ka4%D| zKJL1adk9hU-J7RB7WJYk+3OJ;6!ie5b<6R>RLpoh$Y@!CU!G$tUDk*o@tT z=V_N$LeN1I85>iXVeg<`_L&NljAv5;@h#MzAUIpnI)Gt{{LDYj1ga`@Hqu|kN)VE4 zT|Tj`qEKJrUY9dn>|h8QrcSb#VT$3e1@mJ1`{z*rTO)BZKuMjpR`f3Za}>-`xQAko zr9vU}E%CqLE{Lhzt=PqhogE^Uv7-Dn6nYTPNPMf|oAT8RQ9l%mKNdY6U5ujaU%{th zqz^bBZ5?G2PfN_$EcfH(TpEHh{tsXuB;c(0&#ayJ4tdQrcoQLo-QNuGRQEU2Ctr$t z8TKf+*<0C#Gg-MHDC>NkwH@gwxGiv#jj|k}g-zv7gp~)V+2{Os@TUAWME*hC*UnvYe`1@%_@r1uY2Xo2 zcvV8PvcSpCv7bf6K1B;FGBf-Wc5y*@S4O zSLTQ46aae0Dnwns822%{?(04o;XwqQ5UjHAi5GD!5y_r_*$unZem&y8&P_vH9wP78 z9Q@00--b^QSyy^=x$pmv#xzz3+Z0$S*epfES|LmJlf(`ZCRvrDa9jJw(NS~xvlaao zSBJ=%BkyCPlD%iYi||t7$+|h;oW7Iy{UAurV{|vy{b*g(CZZ(L_hM8tB;1wnIrc}i znQtE4ZPqgiycv^Qi6>c2%{)rf74~jv{L$EQzH^-`r0?Wjq>GE9qmplHCyn^KM=$MY`jf3v)$2v41%C32cqv9Y92d^zr}Z7)c@-PSxiD zyg{*+p*T}uyv~l2^OSud+-aU^H~EJL=?~FJqY#+MYpd8bMC}OfB@xelR6;AOkx{Nd zyi>*;WJM%YqWXN~H`?cVyOaIq+>ogA6iznKUfsl6ATJAZ3EzWwlC8#hna9!s->>e~ z__xD686uWuKL0pZv5c(|oGam9$qx`V9l>&HkBBK%<3G$Aq41Xohgr+v44k{7$j`G=_UL#E;M-{03d{LA=~Z6M}?I5$Psh=3~8wu$Z+ z60j{qCH%jNeZ+UIoYUbBSjR=tx?;)B5pSp96DE?eF9Y)H?d^BormHnCFdi;GWNcXo2l^tM`ionVoRL&;mTfx{9CH;r)G1SJ1b?}hlI+- z?zf3`1^&XMii+KmkNmhKM$x*62NQib5y>utO}5njEv}bwypF$=J)ilBL2hd!X+a2R zA7ebx{Q?3H&-dI@@(U6FNbKKWyN|$R-^65|aBmUs#Nj5;oanuH8d($ZPA9lp`u+c8 zz`=-Kiz5GXzc0?W={6hq2?8&+-U;;s#CH+#oY5C{E^h**6?-;{SI}{J`0s<~BAlP$ zS|z7Dkz-;y)6)O{t+PG@I76Ys5gxQkJD-4T4Wh~7ZDZt@<{SNW;up$0RgpUUO%cBm zldNu^7w<($MK?sjD)7m!7Hh2O>~1>hr^p9JbgGeL>?K7n;BTn2jE#i3!@Y8l^iX)X zbwvQCE7VQlcjet4o&V|nKj$&HAC$jAtQ-98u=i)aK>bmmnL5s*vV_1@F~;lpcSgrO zB`5nJyA-qLTT#> z@5fIH*9gp&CikaKTM$&n1dlT1fw+bewHJOpTm$%WneXK9U~HujwkBjG@QXy%r@TOP zUNcl(fuIS}WCIWtMD&)<`tVJ&Zg$`8{*?Gz@`vGiFcH`;x= z^?~9`@U3yqUKitAYFx)!8QV!vf5bHv|3~tiDEL`)UsF84ZC3ni0w=*gY_wAe>1|X&kij8#reZ(Aooio~#?2mdFN*t^ToLB~BF77Pv8?5s_c>2MIz>WZz?mWL z_aOaBHx*#E>*hR#`xx~f?r#&`)O|(Z6Xh;^PZ3=ux0nw`#2>)Z1^@ZZxzGPgNmn_y z0(=bcmz0^$9?(^?A9Z*sQFlk@a|pQ0n!^8kJnu$gQ{Zof9|ilQ`+VJZ4DnN8%M*HX zOe1>&Ko1FHINK4h(YoCIkWjpWxMc0cuTZ3rdpA?bq5do9`}iJkZx96<^B<|;wWc)4 zN_IM~e-u0ice0PIl6ivD`|l46`9?O;`Bmddc8~qm=xklWAi09z&z-+;-ltfn5ZK!O zHvD|?^L3f*JB16G(1!#idzQ#KM3t304Sq`c`=5b2`_1|UpbWqbk`5|*Vs45LFs3nA z!4~!fa1X^~iXl0fZ;b-U4uyG4-m!?=@SiE3>_cK!yPqMxB7|&(If2kh>Hq(RAkEmY z7||TS+5tXCaQddVXJ~0`AoP?arH#O+dT> zc3wQHGu^*;el@0bj434R7s6kFy*A#NKrDeP(CsH>7@x#t7k=!ilBt&2GK1b@w_&x8l5}zqq@1BhHz@uZ zfn|emiSEn8zZpV*({*w8ej&J`oNlShm|p*QOr7xEhWj`BnS2ASsp*Sfo}lV@q?L3u z(%wB@$i)g&SA0-X!k*3BvR+hRjPo|}r#zYg&i5)b6JQsaB@ zca(F`d55~Ur~ifQr%19n1PqnD*!~8BpYq&U|MR>m2YF@K26B!^lCeLL){~Rp>ctdm z#mmu@O&EH5!+9c;6w}ozBl0;~mJ3;(I_>$ZdHDEMu$oG~vK ztk8Bkcln$(2MfMia{BTTh5j8|uv8(da8AKeMXK$|X}rHk^`SYtZZ10I)||V4C|d65 z>1PxwR%-gXLd9C=G%Z|gYw_tnl`3{ZPV2*p9q5#E$<@Vrm(Kb6mSU|7jJ@x+V%8x! L_uW?f$6x*rm!FE? diff --git a/conf/locale/es_419/LC_MESSAGES/django.po b/conf/locale/es_419/LC_MESSAGES/django.po index 73109db5ae40..4cb24c86dfc9 100644 --- a/conf/locale/es_419/LC_MESSAGES/django.po +++ b/conf/locale/es_419/LC_MESSAGES/django.po @@ -10344,6 +10344,46 @@ msgstr "" "Defina el número de veces que un estudiante puede intentar responder este " "problema. Si el valor no es definido, se permitirán intentos infinitos." +#: xmodule/capa_block.py +msgid "Grading Strategy" +msgstr "Estrategia de calificación" + +#: xmodule/capa_block.py +msgid "" +"Define the grading strategy for this problem. By default, it's the score of" +" the last submission made by the student." +msgstr "" +"Defina la estrategia de calificación para este problema. Por defecto, es el " +"puntaje del último envío realizado por el estudiante." + +#: xmodule/capa_block.py +msgid "Last Score" +msgstr "Último puntaje" + +#: xmodule/capa_block.py +msgid "First Score" +msgstr "Primer puntaje" + +#: xmodule/capa_block.py +msgid "Highest Score" +msgstr "Puntaje más alto" + +#: xmodule/capa_block.py +msgid "Average Score" +msgstr "Puntaje promedio" + +#: xmodule/capa_block.py +msgid "List of correctness maps for each attempt" +msgstr "Lista de mapas de corrección para cada intento" + +#: xmodule/capa_block.py +msgid "List of student answers for each attempt" +msgstr "Lista de respuestas de los estudiantes para cada intento" + +#: xmodule/capa_block.py +msgid "List of scores for each attempt" +msgstr "Lista de puntajes para cada intento" + #: xmodule/capa_block.py msgid "Date that this problem is due by" msgstr "Fecha en que se debe entregar esta actividad" @@ -15102,6 +15142,10 @@ msgstr[0] "Ha realizado {num_used} de {num_total} intento" msgstr[1] "Ha realizado {num_used} de {num_total} intentos" msgstr[2] "Ha realizado {num_used} de {num_total} intentos" +#: lms/templates/problem.html +msgid "Grading strategy: {grading_strategy}" +msgstr "Estrategia de calificación: {grading_strategy}" + #: lms/templates/problem.html msgid "" "Some problems have options such as save, reset, hints, or show answer. These" diff --git a/lms/djangoapps/instructor/enrollment.py b/lms/djangoapps/instructor/enrollment.py index f8bf1dd8667e..fe3b19934eca 100644 --- a/lms/djangoapps/instructor/enrollment.py +++ b/lms/djangoapps/instructor/enrollment.py @@ -361,6 +361,9 @@ def _reset_module_attempts(studentmodule): problem_state = json.loads(studentmodule.state) # old_number_of_attempts = problem_state["attempts"] problem_state["attempts"] = 0 + problem_state["score_history"] = [] + problem_state["correct_map_history"] = [] + problem_state["student_answers_history"] = [] # save studentmodule.state = json.dumps(problem_state) diff --git a/lms/djangoapps/instructor/tests/test_enrollment.py b/lms/djangoapps/instructor/tests/test_enrollment.py index 4aa14e32256b..59ccfac6caa1 100644 --- a/lms/djangoapps/instructor/tests/test_enrollment.py +++ b/lms/djangoapps/instructor/tests/test_enrollment.py @@ -543,7 +543,10 @@ def setup_team(self): 'attempts': 1, 'saved_files_descriptions': ['summary', 'proposal', 'diagrams'], 'saved_files_sizes': [1364677, 958418], - 'saved_files_names': ['case_study_abstract.txt', 'design_prop.pdf', 'diagram1.png'] + 'saved_files_names': ['case_study_abstract.txt', 'design_prop.pdf', 'diagram1.png'], + 'score_history': [], + 'correct_map_history': [], + 'student_answers_history': [], } team_state = json.dumps(self.team_state_dict) diff --git a/lms/djangoapps/instructor_task/tests/test_integration.py b/lms/djangoapps/instructor_task/tests/test_integration.py index 004cba1cdacc..f9ff717ec14b 100644 --- a/lms/djangoapps/instructor_task/tests/test_integration.py +++ b/lms/djangoapps/instructor_task/tests/test_integration.py @@ -273,7 +273,7 @@ def test_rescoring_failure(self): self.submit_student_answer('u1', problem_url_name, [OPTION_1, OPTION_1]) expected_message = "bad things happened" - with patch('xmodule.capa.capa_problem.LoncapaProblem.get_grade_from_current_answers') as mock_rescore: + with patch('xmodule.capa.capa_problem.LoncapaProblem.get_grade_from_answers') as mock_rescore: mock_rescore.side_effect = ZeroDivisionError(expected_message) instructor_task = self.submit_rescore_all_student_answers('instructor', problem_url_name) self._assert_task_failure( @@ -293,7 +293,7 @@ def test_rescoring_bad_unicode_input(self): # return an input error as if it were a numerical response, with an embedded unicode character: expected_message = "Could not interpret '2/3\u03a9' as a number" - with patch('xmodule.capa.capa_problem.LoncapaProblem.get_grade_from_current_answers') as mock_rescore: + with patch('xmodule.capa.capa_problem.LoncapaProblem.get_grade_from_answers') as mock_rescore: mock_rescore.side_effect = StudentInputError(expected_message) instructor_task = self.submit_rescore_all_student_answers('instructor', problem_url_name) diff --git a/lms/templates/problem.html b/lms/templates/problem.html index 3bf90b5daf44..fa674077e7f4 100644 --- a/lms/templates/problem.html +++ b/lms/templates/problem.html @@ -1,7 +1,7 @@ <%page expression_filter="h"/> <%! from django.utils.translation import ngettext, gettext as _ -from openedx.core.djangolib.markup import HTML +from openedx.core.djangolib.markup import HTML, Text %> <%namespace name='static' file='static_content.html'/> @@ -90,6 +90,7 @@

${Text(_("Grading strategy: {grading_strategy}")).format(grading_strategy=grading_strategy)} ${_("Some problems have options such as save, reset, hints, or show answer. These options follow the Submit button.")} diff --git a/xmodule/capa/capa_problem.py b/xmodule/capa/capa_problem.py index 797e95e1d5bb..f9730c90841a 100644 --- a/xmodule/capa/capa_problem.py +++ b/xmodule/capa/capa_problem.py @@ -172,6 +172,12 @@ def __init__(self, problem_text, id, capa_system, capa_block, # pylint: disable self.has_saved_answers = state.get('has_saved_answers', False) if 'correct_map' in state: self.correct_map.set_dict(state['correct_map']) + self.correct_map_history = [] + for cmap in state.get('correct_map_history', []): + correct_map = CorrectMap() + correct_map.set_dict(cmap) + self.correct_map_history.append(correct_map) + self.done = state.get('done', False) self.input_state = state.get('input_state', {}) @@ -299,8 +305,10 @@ def do_reset(self): Reset internal state to unfinished, with no answers """ self.student_answers = {} + self.student_answers_history = [] self.has_saved_answers = False self.correct_map = CorrectMap() + self.correct_map_history = [] self.done = False def set_initial_display(self): @@ -328,6 +336,7 @@ def get_state(self): 'student_answers': self.student_answers, 'has_saved_answers': self.has_saved_answers, 'correct_map': self.correct_map.get_dict(), + 'correct_map_history': [cmap.get_dict() for cmap in self.correct_map_history], 'input_state': self.input_state, 'done': self.done} @@ -434,6 +443,7 @@ def grade_answers(self, answers): self.student_answers = convert_files_to_filenames(answers) new_cmap = self.get_grade_from_current_answers(answers) self.correct_map = new_cmap # lint-amnesty, pylint: disable=attribute-defined-outside-init + self.correct_map_history.append(deepcopy(new_cmap)) return self.correct_map def supports_rescoring(self): @@ -495,6 +505,31 @@ def get_grade_from_current_answers(self, student_answers): return newcmap + def get_grade_from_answers( + self, student_answers: dict, correct_map: dict + ) -> CorrectMap: + """ + This method is based on `get_grade_from_current_answers` method but it + takes `student_answers` and `correct_map` as arguments instead of using + the ones stored in the problem. + """ + newcmap = CorrectMap() + # Call each responsetype instance to do actual grading + for responder in self.responders.values(): + # File objects are passed only if responsetype explicitly allows + # for file submissions. But we have no way of knowing if + # student_answers contains a proper answer or the filename of + # an earlier submission, so for now skip these entirely. + # TODO: figure out where to get file submissions when rescoring. + if 'filesubmission' in responder.allowed_inputfields and student_answers is None: + _ = self.capa_system.i18n.gettext + raise Exception(_("Cannot rescore problems with possible file submissions")) + + results = responder.evaluate_answers(student_answers, correct_map) + newcmap.update(results) + + return newcmap + def get_question_answers(self): """ Returns a dict of answer_ids to answer values. If we cannot generate diff --git a/xmodule/capa_block.py b/xmodule/capa_block.py index 7b58b5aa9ab8..77d8f60ba313 100644 --- a/xmodule/capa_block.py +++ b/xmodule/capa_block.py @@ -1,6 +1,7 @@ """ Implements the Problem XBlock, which is built on top of the CAPA subsystem. """ +from __future__ import annotations import copy import datetime @@ -22,7 +23,7 @@ from pytz import utc from web_fragments.fragment import Fragment from xblock.core import XBlock -from xblock.fields import Boolean, Dict, Float, Integer, Scope, String, XMLString +from xblock.fields import Boolean, Dict, Float, Integer, Scope, String, XMLString, List from xblock.scorable import ScorableXBlockMixin, Score from xmodule.capa import responsetypes @@ -52,7 +53,7 @@ from openedx.core.djangolib.markup import HTML, Text from .capa.xqueue_interface import XQueueService -from .fields import Date, ScoreField, Timedelta +from .fields import Date, ListScoreField, ScoreField, Timedelta from .progress import Progress log = logging.getLogger("edx.courseware") @@ -92,6 +93,16 @@ class SHOWANSWER: ATTEMPTED_NO_PAST_DUE = "attempted_no_past_due" +class GRADING_STRATEGY: + """ + Constants for grading strategy options. + """ + LAST_SCORE = "last_score" + FIRST_SCORE = "first_score" + HIGHEST_SCORE = "highest_score" + AVERAGE_SCORE = "average_score" + + class RANDOMIZATION: """ Constants for problem randomization @@ -181,6 +192,21 @@ class ProblemBlock( "If the value is not set, infinite attempts are allowed."), values={"min": 0}, scope=Scope.settings ) + grading_strategy = String( + display_name=_("Grading Strategy"), + help=_( + "Define the grading strategy for this problem. By default, " + "it's the score of the last submission made by the student." + ), + scope=Scope.settings, + default=GRADING_STRATEGY.LAST_SCORE, + values=[ + {"display_name": _("Last Score"), "value": GRADING_STRATEGY.LAST_SCORE}, + {"display_name": _("First Score"), "value": GRADING_STRATEGY.FIRST_SCORE}, + {"display_name": _("Highest Score"), "value": GRADING_STRATEGY.HIGHEST_SCORE}, + {"display_name": _("Average Score"), "value": GRADING_STRATEGY.AVERAGE_SCORE}, + ], + ) due = Date(help=_("Date that this problem is due by"), scope=Scope.settings) graceperiod = Timedelta( help=_("Amount of time after the due date that submissions will be accepted"), @@ -263,11 +289,20 @@ class ProblemBlock( ) correct_map = Dict(help=_("Dictionary with the correctness of current student answers"), scope=Scope.user_state, default={}) + correct_map_history = List( + help=_("List of correctness maps for each attempt"), scope=Scope.user_state, default=[] + ) input_state = Dict(help=_("Dictionary for maintaining the state of inputtypes"), scope=Scope.user_state) student_answers = Dict(help=_("Dictionary with the current student responses"), scope=Scope.user_state) + student_answers_history = List( + help=_("List of student answers for each attempt"), scope=Scope.user_state, default=[] + ) # enforce_type is set to False here because this field is saved as a dict in the database. score = ScoreField(help=_("Dictionary with the current student score"), scope=Scope.user_state, enforce_type=False) + score_history = ListScoreField( + help=_("List of scores for each attempt"), scope=Scope.user_state, default=[], enforce_type=False + ) has_saved_answers = Boolean(help=_("Whether or not the answers have been saved since last submit"), scope=Scope.user_state, default=False) done = Boolean(help=_("Whether the student has answered the problem"), scope=Scope.user_state, default=False) @@ -832,6 +867,7 @@ def get_state_for_lcp(self): return { 'done': self.done, 'correct_map': self.correct_map, + 'correct_map_history': self.correct_map_history, 'student_answers': self.student_answers, 'has_saved_answers': self.has_saved_answers, 'input_state': self.input_state, @@ -845,6 +881,7 @@ def set_state_from_lcp(self): lcp_state = self.lcp.get_state() self.done = lcp_state['done'] self.correct_map = lcp_state['correct_map'] + self.correct_map_history = lcp_state['correct_map_history'] self.input_state = lcp_state['input_state'] self.student_answers = lcp_state['student_answers'] self.has_saved_answers = lcp_state['has_saved_answers'] @@ -1230,7 +1267,6 @@ def get_problem_html(self, encapsulate=True, submit_notification=False): save_message = _( "Your answers were previously saved. Click '{button_name}' to grade them." ).format(button_name=self.submit_button_name()) - context = { 'problem': content, 'id': str(self.location), @@ -1241,6 +1277,7 @@ def get_problem_html(self, encapsulate=True, submit_notification=False): 'reset_button': self.should_show_reset_button(), 'save_button': self.should_show_save_button(), 'answer_available': self.answer_available(), + 'grading_strategy': _(" ".join(self.grading_strategy.split("_")).title()), 'attempts_used': self.attempts, 'attempts_allowed': self.max_attempts, 'demand_hint_possible': demand_hint_possible, @@ -1687,6 +1724,7 @@ def submit_problem(self, data, override_time=False): self.lcp.has_saved_answers = False answers = self.make_dict_of_responses(data) answers_without_files = convert_files_to_filenames(answers) + self.student_answers_history.append(answers_without_files) event_info['answers'] = answers_without_files metric_name = 'xmodule.capa.check_problem.{}'.format # lint-amnesty, pylint: disable=unused-variable @@ -1753,7 +1791,7 @@ def submit_problem(self, data, override_time=False): self.attempts = self.attempts + 1 self.lcp.done = True self.set_state_from_lcp() - self.set_score(self.score_from_lcp(self.lcp)) + self._set_score() self.set_last_submission_time() except (StudentInputError, ResponseError, LoncapaProblemError) as inst: @@ -1827,6 +1865,27 @@ def submit_problem(self, data, override_time=False): } # pylint: enable=too-many-statements + def _set_score(self) -> None: + """ + Calculate and set the current score based on the grading strategy. + + In this method: + - The current score is obtained from the LON-CAPA problem. + - The score history is updated adding the current score. + - The calculated score is obtained based on the grading strategy. + - The calculated score is set as the current score. + """ + new_score = self.score_from_lcp(self.lcp) + self.score_history.append(new_score) + grading_strategy_handler = GradingStrategyHandler( + self.score, + self.grading_strategy, + self.score_history, + self.max_score(), + ) + calculated_score = grading_strategy_handler.get_score() + self.set_score(calculated_score) + def publish_unmasked(self, title, event_info): """ All calls to runtime.publish route through here so that the @@ -2144,8 +2203,7 @@ def rescore(self, only_if_higher=False): event_info['orig_score'] = orig_score.raw_earned event_info['orig_total'] = orig_score.raw_possible try: - self.update_correctness() - calculated_score = self.calculate_score() + calculated_score = self.get_rescore() except (StudentInputError, ResponseError, LoncapaProblemError) as inst: # lint-amnesty, pylint: disable=unused-variable log.warning("Input error in capa_block:problem_rescore", exc_info=True) event_info['failure'] = 'input_error' @@ -2178,6 +2236,28 @@ def rescore(self, only_if_higher=False): event_info['attempts'] = self.attempts self.publish_unmasked('problem_rescore', event_info) + def get_rescore(self) -> Score: + """ + Calculate and return the rescored score based on the grading strategy. + + In this method: + - The list with the correctness maps is updated. + - The list with the score history is updated based on the correctness maps. + - The final score is calculated based on the grading strategy. + + Returns: + Score: The score calculated based on the grading strategy. + """ + self.update_correctness_list() + self.score_history = self.calculate_score_list() + grading_strategy_handler = GradingStrategyHandler( + self.score, + self.grading_strategy, + self.score_history, + self.max_score(), + ) + return grading_strategy_handler.get_score() + def has_submitted_answer(self): return self.done @@ -2206,6 +2286,22 @@ def update_correctness(self): new_correct_map = self.lcp.get_grade_from_current_answers(None) self.lcp.correct_map.update(new_correct_map) + def update_correctness_list(self): + """ + Updates the correct map history of the LCP. + + Similar to `update_correctness` method, but operates on each one of the + correctness maps in the history of the LCP. + """ + self.lcp.context['attempt'] = max(self.attempts, 1) + new_correct_map_list = [] + for student_answers, correct_map in zip(self.student_answers_history, self.correct_map_history): + new_correct_map = self.lcp.get_grade_from_answers(student_answers, correct_map) + new_correct_map_list.append(new_correct_map) + self.lcp.correct_map_history = new_correct_map_list + if new_correct_map_list: + self.lcp.correct_map.update(new_correct_map_list[-1]) + def calculate_score(self): """ Returns the score calculated from the current problem state. @@ -2213,6 +2309,17 @@ def calculate_score(self): new_score = self.lcp.calculate_score() return Score(raw_earned=new_score['score'], raw_possible=new_score['total']) + def calculate_score_list(self): + """ + Returns the score calculated from the current problem state. + """ + new_score_list = [] + + for correct_map in self.lcp.correct_map_history: + new_score = self.lcp.calculate_score(correct_map) + new_score_list.append(Score(raw_earned=new_score['score'], raw_possible=new_score['total'])) + return new_score_list + def score_from_lcp(self, lcp): """ Returns the score associated with the correctness map @@ -2222,6 +2329,101 @@ def score_from_lcp(self, lcp): return Score(raw_earned=lcp_score['score'], raw_possible=lcp_score['total']) +class GradingStrategyHandler: + """ + A class for handling grading strategies and calculating scores. + + This class allows for flexible handling of grading strategies, including options + such as considering the last score, the first score, the highest score, + or the average score. + + Attributes: + - grading_strategy (str): The chosen grading strategy. + - score_history (list[Score]): A list to store the history of scores. + - max_score (int): The maximum possible score. + - mapping_strategy (dict): A dictionary mapping the grading + strategy to the corresponding handler. + + Methods: + - get_score(): Retrieves the updated score based on the grading strategy. + - handle_last_score(): Handles the last score strategy. + - handle_first_score(): Handles the first score strategy. + - handle_highest_score(): Handles the highest score strategy. + - handle_average_score(): Handles the average score strategy. + """ + + def __init__( + self, + score: Score, + grading_strategy: str, + score_history: list[Score], + max_score: int, + ): + self.score = score + self.grading_strategy = grading_strategy + self.score_history = score_history + self.max_score = max_score + self.mapping_strategy = { + GRADING_STRATEGY.LAST_SCORE: self.handle_last_score, + GRADING_STRATEGY.FIRST_SCORE: self.handle_first_score, + GRADING_STRATEGY.HIGHEST_SCORE: self.handle_highest_score, + GRADING_STRATEGY.AVERAGE_SCORE: self.handle_average_score, + } + + def get_score(self) -> Score: + """ + Retrieves the updated score based on the grading strategy. + + Returns: + - Score: The updated score based on the chosen grading strategy. + """ + return self.mapping_strategy[self.grading_strategy]() + + def handle_last_score(self) -> Score: + """ + Retrieves the score based on the last score. + It is the last score in the score history. + + Returns: + - Score: The score based on the last score. + """ + return self.score_history[-1] if self.score_history else self.score + + def handle_first_score(self) -> Score: + """ + Retrieves the score based on the first score. + It is the first score in the score history. + + Returns: + - Score: The score based on the first score. + """ + return self.score_history[0] if self.score_history else self.score + + def handle_highest_score(self) -> Score: + """ + Retrieves the score based on the highest score. + It is the highest score in the score history. + + Returns: + - Score: The score based on the highest score. + """ + return max(self.score_history) if self.score_history else self.score + + def handle_average_score(self) -> Score: + """ + Calculates the average score based on all attempts. The average score is + the sum of all scores divided by the number of scores. + + Returns: + - Score: The average score based on all attempts. + """ + if not self.score_history: + return self.score + total = sum(score.raw_earned for score in self.score_history) + average_score = round(total / len(self.score_history), 2) + return Score(raw_earned=average_score, raw_possible=self.max_score) + + class ComplexEncoder(json.JSONEncoder): """ Extend the JSON encoder to correctly handle complex numbers diff --git a/xmodule/fields.py b/xmodule/fields.py index 7837074f9d1f..2e65304d4422 100644 --- a/xmodule/fields.py +++ b/xmodule/fields.py @@ -7,7 +7,7 @@ import dateutil.parser from pytz import UTC -from xblock.fields import JSONField +from xblock.fields import JSONField, List from xblock.scorable import Score log = logging.getLogger(__name__) @@ -300,3 +300,26 @@ def from_json(self, value): return Score(raw_earned, raw_possible) enforce_type = from_json + + +class ListScoreField(ScoreField, List): + """ + Field for blocks that need to store a list of Scores. + """ + + MUTABLE = True + _default = [] + + def from_json(self, value): + if value is None: + return value + if isinstance(value, list): + scores = [] + for score_json in value: + score = super().from_json(score_json) + scores.append(score) + return scores + + raise TypeError("Value must be a list of Scores. Got {}".format(type(value))) + + enforce_type = from_json diff --git a/xmodule/tests/test_capa_block.py b/xmodule/tests/test_capa_block.py index ab94028fc955..32df07803cfb 100644 --- a/xmodule/tests/test_capa_block.py +++ b/xmodule/tests/test_capa_block.py @@ -1263,10 +1263,15 @@ def test_codejail_error_upon_problem_creation(self): def _rescore_problem_error_helper(self, exception_class): """Helper to allow testing all errors that rescoring might return.""" # Create the block - block = CapaFactory.create(attempts=1, done=True) + block = CapaFactory.create(attempts=0) + CapaFactory.answer_key() + + # Check the problem + get_request_dict = {CapaFactory.input_key(): '1'} + block.submit_problem(get_request_dict) # Simulate answering a problem that raises the exception - with patch('xmodule.capa.capa_problem.LoncapaProblem.get_grade_from_current_answers') as mock_rescore: + with patch('xmodule.capa.capa_problem.LoncapaProblem.get_grade_from_answers') as mock_rescore: mock_rescore.side_effect = exception_class('test error \u03a9') with pytest.raises(exception_class): block.rescore(only_if_higher=False)