From a8eddd492e08849b4f6cbb2bf0a87eb67acb1438 Mon Sep 17 00:00:00 2001 From: "russell@unturf.com" Date: Sat, 18 Apr 2026 10:01:28 -0400 Subject: [PATCH] =?UTF-8?q?asm-gc:=20meta-GC=20layer=20=E2=80=94=20arena?= =?UTF-8?q?=20fast=20path=20with=20mark-phase=20verifier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds (with-arena thunk) as the O(1) bulk-reclaim fast path on top of the existing naive mark-sweep. The meta-GC: 1. Snapshots %r15 at arena entry. 2. Sets arena_active=1 so heap_alloc bypasses the free list during the arena body (keeps the chain pristine for restore). 3. Invokes the thunk via apply_proc_raw. 4. Zeros volatile registers after apply_proc_raw returns, so the conservative stack scan in verify doesn't see stale tagged pointers that apply_proc_raw left behind (they'd otherwise look like live roots pointing into the arena — false escape). 5. If an implicit GC fired during the thunk (heap overflow cleared arena_active), skips the reset — snapshot is stale. 6. Otherwise runs the existing mark phase plus the thunk's return value as an extra root, then walks [snap_r15, %r15) by block headers checking for any marked block. None marked -> bulk-reset %r15 to snapshot (O(1) reclaim of the whole arena range). Any marked -> escape, fall through to naive sweep on the full range. Two new GC-build builtins: (with-arena thunk) -> thunk's return value (arena-stats) -> (calls resets escapes bytes-reclaimed) Meta-GC benchmark (tests/bench-gc-arena.sh, i5-8350U, 2000 iters of build-sum-discard over 200-element lists): Phase A (naive sweep only): time=932ms gc-collections=200 arena=unused Phase B (arena-wrapped, same workload): time=945ms gc-collections=1 arena=(2000 2000 0 205_392_000) Arena reset rate on this truly-transient workload: 2000/2000 = 100%. Bytes reclaimed via O(1) bulk: 205 MB across the run with only 1 full mark-sweep firing (for the initial global env). Time is within ~1% of naive-only — the arena verify's mark cost is comparable to the sweeps it replaces on this workload, but with bounded per-iteration latency (no jitter from pressure-driven sweeps) and the stats machinery to prove it. Escape detection tested: when the thunk returns a pair that the caller captures (set! escaped (with-arena ...)), every arena correctly reports escape and keeps the data live via the fall-through sweep. 137 asm (no-GC) + 137 asm (GC) + 189 shared functional tests still pass. --- Makefile | 3 + asm/uncommonlisp-gc | Bin 57400 -> 58432 bytes asm/uncommonlisp-gc.o | Bin 57720 -> 60032 bytes asm/uncommonlisp.s | 274 +++++++++++++++++++++++++++++++++++- examples/bench-gc-arena.lsp | 55 ++++++++ tests/bench-gc-arena.sh | 30 ++++ 6 files changed, 360 insertions(+), 2 deletions(-) create mode 100644 examples/bench-gc-arena.lsp create mode 100755 tests/bench-gc-arena.sh diff --git a/Makefile b/Makefile index 9625e89..ddd14c5 100644 --- a/Makefile +++ b/Makefile @@ -129,6 +129,9 @@ bench-hashset: asm-build bench-gc: asm-build @bash tests/bench-gc-memory.sh +bench-gc-arena: asm-build + @bash tests/bench-gc-arena.sh + bench-all: bench c-bench bench-3way bench-portal bench-portal-cross bench-web bench-rpc-chain bench-proof @echo "═══════════════════════════════════════════════════════════" @echo "All benchmarks complete. Numbers in the whitepaper §6.4," diff --git a/asm/uncommonlisp-gc b/asm/uncommonlisp-gc index 69aa4de4a2bf27a2d14c97f7186355fe8b62bab0..d3170876c1355e4bcd7557231280ca6cb4c3f731 100755 GIT binary patch literal 58432 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 F{|{u({o{rD|>MhD&WFL-Bs6 znAaS?*b%bMDQZYYN;8`z0m0%%`7go=f@Ca}?6wF4u;)jE2jV{0Q+LYT}+i3$`*tLCva<=v2Q#5^-m0B3?vcstt-I3%fYX5~&4X4he zB-%G?-;gO!P=cxBewU<<2a2YD4&Mzc^dSSpkP+KcTUQ{{aO%|{2>6Bx=t|uHks_dA zw1d|LOR9i$-G>xlhYwh(_H|DydHODU(>CkY4m&)=jd;;z3tX<~UUW%+0coZPI`6P-Vl6iKC zN`?}(QoC7GgqLYd8(z0bsb4zkdbIWqeb1UrdKkV?n z=*ftV+*>EO+pE*u;iK-Px7}F>*H5&=uh}mhC=8EuhkNX{ZE1z!-MN?LuFSnOw=#Fd zqTMcTf|u-Y~t$Zj9f z?@@qo%1aQBKy-)Cd&%zIZih!4d@RXz@YAn)d+kW-Um@G7d4qL!B;9`L13T*re}x@s zNwYWYY8_~YXKaT`cZwZei|To?@a&$#ww_V`On19`R$5_OG_5GSz3`<2Md4xY$hg~} zS`@Ctbq)CzB^>?&)oX{-sct*%aEBeqN$dWOJ$+ke2{qL6#Fpwxz5FqKq~s1CiT;&p zJ2Lm@OVQCZMm`IY-H)-~DDZ2c?Xj+Yd$UP5t4c$*zQs;GAL$x^v|8=uQ4A{7TZe}(G0ToD>akynqQytGo@XCf)Pp=+trJwt<#uF# z6xD;O$(}@IkJ|9iRit-6*ope0_Ai>g&D}nv=Qn8n_7R71C52f#17|FboYG-uz2YAR zVLOCC8V|e9!rpD&Z&3T#G$8h4c=aR&N8`I+@ML@^2Z!Lhe~|cqAPOJ;%5HnFXSt0Q z+k*Ma6nrKJ*hd!XB2PwnuHTxB$>pdk$K?u)KtuYsqGH3@FW9{_uhbxvN_`n=ZQ5mp z_R*#F?m|!@q4pUINIx?61v~r}Wg1KSS-WjXPm&!*!*PL!s-mKrP{_jW2dUZ4Q>D`p zBUh(I$HL!zGldKnA^jZw^yo?ql!Mg-Bd6M%_FQ?E9a)l&dPPlIZHvK6b4!+864|(8 zRJ04KSLCj!q*~msR9>{&ra+~PRnnsOXq8KqN++h|RcI9YKy3W2?*FKTg`m3avVX1G zZU&l=+OBGGWGt%dS-bby!mJmA{TD~Fw|6JI!@YLaKLR;+A6 zQ(xKP3*AZMPDbjNv|n~wTKAvPt3N_|cDNj~(zpWDh4R;wtbYui2oKFruWdv~ct0)F(e zj{V7<%a>vLre!EP zizvV;gURjf=ziCp+>8EVho7=MUk{3YwNJ0tOKoQ6}6Wp6-|G= zDC?c8tOZ+APRpB}GNyG{VQ**mhwkuBR9U~vb1z%jSws`__QLj!laiwM_Vo7VZ_YsX zE6Un`)zAf7PD);|+3iZA&hb$RGW&K34a6Z^Zl*4jvRjYejpXA-tVRlzb~p{Xt%M_| z9J0eD=xZr(zRx?c%B#b;|aG@`!mQl!@ z)N(i~+e!$o)_iBSna5^30ok5Tal29nQ>i#eyGKR8#Kh3OH~JYIrPn`uQ0w9Du9eg+qE8}rwA3V#l|97@U5<{L zeRlAo?6ZQivnN=gU!nxr6N8s$XIi1nC`$G;>su3vWmz}Ut)+vf!h@NeT043Za)HqO zljtT$(K{$*jB6O4T|4NeQFIN>0O1`N>2F}rM=yg{MO;SerTEGY2CeMc;HjubJxySi z=-M^}aY+v%4R{r0B1QQwzSL!`*4nBo1d;06qI-@)W z%BN;$T{ArT);}qJbeg^9^+9%0XZP#&k=JS7`Q1ObV81sC;m+ukW8>dtf@AR!`D%`A zEM8>&kgl3wCW;zeeG$ngVa1!b}BYQ${EShXobTL#nr;N3GJMHWK@db*0 zRZ90$-M_aty^dN5zmHWadJfg1HlbCmur(d8vS@$Gj}2~Qe}p1XFDXSfMcJ1H({v8q ze~rF@pzNmBfjd&h4nm&Yf65Lj&p`6*$o4DG5b`{pJxzJg-8;K~#tGb0Znu9UExPOP zy}c{#@F+6*vR=LFq%EhMw7DV;R#Qj!A!F>f?d-1_?rX>~3NuPIBlW_WC~WjOE}|8B z0YTYkTcHkerv}GH%jjZI|1YZUq}GLrn6Xu2<0!G4=o&JDYf-O_sMmVbr%zq3C*B*T za&L%MaYn(>h%y4I!_WjnqJKuC@io1{)!d0pOyQBe8Yk$xXyJRX1gPvErNj^xpkky^ zG0tvHjc!I-up5-dMv^h_#;;fH9gG#^3NA!RQ-dY=?q`LbgBqkHD^y3r3YL)-dQGzw zE3{ur{jJb@S{h)5k}+N>BfH}t$yBtz7(eWmjwlwd9#`-pN-{VP-~EENJvWN!{VFUt zGtRvPd30?j6R|r7{#gnBY48u!epC=WOK1*Ng;K`T zG3#4o?y|T_`;3QlGT5cLx*tcf_iO(k@;{*MuO4><1z2J1Nz5OoAO+~A<9|d_K#HT zY~sdY>x_5>Y|yEE>R7E4QaOSSty1ZJEFLLONBV<~L>3z^2o3ry_5N4^$7!waB_^F% z)8S5cWMX04m%Tx3qQ3kpIH@~79(lj5u775}x_+8extU_g|3Pbv*BXQS(701;oTdvv zT>-_^21PdQEiy{u`L$@>4;CfVcV#JUpCcQeON)Mj@q)5f(k$^*Jl1R->(_~~=n~7x zTH3Vj%84a$-Jx3dTZy_W>?3>a_HoG+)YdtF2ig7GS}_+rw`DJ7(uWNI?I>R0l;VRt&GbG9iXJJ zg|R|=wUnwSGB6C>r!~W1enLwa>W^tD$=Y-uNo)y5M!6%aV9}UOM?Y)RO_)3EIpZE$ zh^h`fL%MUu-KRWV+Vf-OQS0!Wad#@u%QSn;8F!oVOh+rhbBpp6YEQfJv}(_0<+%`Z zGSu3X=Q{1VT6vy<=U^HYBiy46_wdJ2J)^;jhmoz#-@#;gj@IU{TchEL#wcvTD?FW7 zcnucW?tR`gv;5 ziYIWen$~Hv7$&AI>NY8uqvD<#kBdI`ada%=uk6Ojk1|1!4J;OS_|s_5-;fy=fP|!Z zcCsUBcBCY&w9FlTKYEsG&K({*{6X|KL_us1MSr}n=-U2|*tq1QsjY)!-N1#tLuBs0 zeAId5qDj#UDV?^b)8h3sDqc^sRHtIXb_ad5kz?0F8-{}g$SqbU zxUvmtrDpY0SJm+;H3n){Ro_`L)mhYc6&tEsZI2q^-ESRy5kg{VVo^ks^b6M5;e%>& zwPSUQE`bSG4-j_*6=FKbta9v;sl~{o!2Wn;ISyUa^*9{S#G9Y z5$-xz0Nq&jX;fl#u|mB<7j|_}x2CoTR;w)qHfIs!kM=PG6h4#xG-RJ!N~aW5h`(Z` z_s{`fWl3pnsXM$Qdevd-Fxzq~D_5w3;%xGTXq|!`Q0u;p)ViY6GU>=|n8dw_`;mTAMrQ1|+~5c3SsinEp_@gGXT@ zsrD|6)o4P4#;R`4+<6OdXfU=^_lhT#@rGkHjAfJ-WBGU8sDS4WKCG9z*!h4;`odV! z@$NN7ClpW#sdVTpDK&U<_nw13vf9j+0euv*-ZPl~Iq}5Op5q^enSrVwvPl<){8oV zHisDKme{v{rkV^}QEmvX-+h!@0J)cN&M#==*b_}V)Z44}-pGwQvzBAlhw96bmUNg# zD&>5f?WP9jEyuBGERR`s_{Df{NJ4@bR4XnO-GNm~(z>^*)o}O053oO{OJ}>&3N4{k zM47W|wS;x=7h1wvct}gAqA|3#paHE=ftJ#(P*6+5tk6%igtc{#mSFaNtfe$7^p%zd zS|O{yN@b80I$KMFtv%WmQJ=p-_p`ZEA*0< zPJy|drs9sULgTe`sui-eG|CDM9H>G^TcI=M*Qh80?_rSYf@En!1G4OSUKCt9H@ElsjQ*K29A6}nqXXIi05y6e%_ zbCwmFqa|$af378LuFiw?htPAZ&;wdJ*9!H+Jr%I?P=8v&mj7xkO@&>frSq-ONtV)^ zW`!ncX}T5iYUu(i^p=(`v_j|TyD%47p(nL81J^c8#hr;#Y3X9b)zU00bfcDLBj1yi z-W*(!ma?tT>sp#?g+9?z7D_){>CLl3|J2faE7boK#d56B0xjiQA&*XZffc$zOLMYcO7FpjQ%kF?(2q`6%xi_t)lwBw)>5?<%05Gd)>xsRYRPAXMr0^fi|xCXR%3)} zsSf>Wyb7(yZ6+;!%?drMr8U^zYN-L^{2(Thww^{S^eRb-2G{gmYE{6Uwf!_jDQg)v zK}Qel{f_Q;?C|dBSBR5nR3_?#J5=;>>U&HdiJVP|9C?+}*=o|kRw2oSiJc71QGLX* zezCI~x1)APL-81VW+fINN8~iS<0y{UkGYPlj^I;?tCmCM_>nel`7a__H>)+`0U=cWlbX2N?gtqD|)A?esKTw@enNW0-E4B4hvZrXFRL3zJ2iTc(EJM}` zbv0w>>#jR0`g5x5$dEI#l3XzRQb)p#+Zg?WgJ6(EfBX?ndQT^#knUYaM%wM`6V6NC zokg2h*oUdFK|(e$D@&X9ks;f`De)(CI28k1ke`vSeZ~*YhtJ%3pj2)Zso+YFt?^lO z9!Mr9jM2CuiS7OeG+LIu*H_c(v5dz8Lh5ksf3au6j;4yeqwq+N9e#!Gj1EQC?&;g; zN+&aiSO7rm#?xTepztWb*H=k(pRaZA`S*0VaS(4X}2VBZnsSb(LY zcguFxSHVkll@74Ohhgy#u(LW^i_x?C2TSpt)S5@za;|gObDyw17ww>)1k3vhPcS2< zK-N8Lw4`?4;H| z;$}`E?uPU}+Z`2GOEWaJ0iDiZ(^L6wU(KK!pC{?DeWZ}paW&@nj_$Xp1C97^)3_?0 z#!K(?U5>UMSc)^q?nh-|{S!L?Q8Ybiz`9NTPxN5Pz7EsTWP8#p@%n3O(i{|h^#L>_!b4P77%87GV zoNuDfggd)2-C^r`0JGl$piYk&yEw$@eu67~B0NqT&ku#k=3?~&;jz22}S&oN1(eJ`|{&$t&oYr-fgio5J zTC6Z$qFHztK;Hzd)y2Uf_@wk`WkT7uV)eig=hJ97S(aa}_;}>z~*B1z+nQWSUmS* zx(oW}OYo>9k2|XRN`7W6iF7)unLg5C;`|qV0M3N)4LSZ+hzCepoi-Y zI8xQKXZzfFQ&H7zUGsMgK!tvVM@Ptn7=+VWWu3y3IOaai?#&~i)A}AgvC`k}-MwQ# zCRs>lA6>3y1ge&?e^K2J&yk=8+wuGeE_qn~mI3*j`>FD5r}Dr;-P`vSqd;^}ic3Og zLy4yExpsbL>kzh%RSI~lbysjK9z)5w_Ty94US(-*-H;ZYV04eIEo|*a$D#cO_Z^{+OR%=)q-A?Ire%NKy3vgj-|SrL zTP5UPYTcL(_h25rjuQ#34_}VN z)%=BH4N_Hef_g~M+Vp!Bmv%JQq;}=m(?C-^&G%_T zL|2CaoUR@l+O8Js$bz))4`}3vt)ljgyU{bhP~D5pW--uTQfK-ROr#gnz_uf$G|=02 z4k+w;I<_frlur+!@OB4Ob4z$6a(G4e-tb@SO`iu(vhnaRCENP~p4LFB$4={LocDX2 zY0=?@9m(I_$42`&+K%|x5mw+j|IIWyD>{8|-whJ$UIVO6-~X7q7p7fo95-))|KOGQ za^x5vw;OjNW3?7ji;c3|4yEBP4jy}bUQL)gJh&yji)PZk3?q63^*?MxnjpfTssr|a z)riMdw=OC@%bw74xk>w2H|(=_y2D=-h6fbVmcMd!>D)x}(3V5)Fxa$(W?yN6qHaZRM`*_h6F7 zZ4G`pNi~d8!Ls!sJzjE<&MhPT@%SE|Gfw?M9X(5a)IJ+#ta}o!Ab%3J1i?wLI5$qp zu)FdnO+jp0c-7obH#*-#Cey%>N!!!Y5<(&~id1S}*k^yLZmi&Fg_dw7#|}Oa;W+zl zUJw79Ygc8QzQ=jpFRASHb$4x3Dzf}N)6kDet$prG6R2KLDRa=bzey}Y6|!m9)f??d z#iVpvJN#}KuDBOORfB6UrKbvU0|6KL3L3!qk02L-W6A8rNBtuROqi*wlU%TZ<7J7= zI1LC703TCbbP}KqCSAvgRr!CY`ts4@v{rX*!<`mtN1OgLWjl2^6qh;{J^WBYQs_g{ z5Q;#g82?uY+*0Qi0RJaL$rOh7>Z(!y1MxJa5hklRezB3%TP7zVk4Wm*g?qj7hco?f z@yzCOIP}5Xh_(r*mTSBM4h2L*us%>yvV7J5s{9;AV)sF^E3=?N?s#^Gu{#>>6(|gD z?VwnP)Rn|LF>MzT3z{&as;z`GEY@Pj8OY9q$G#_lD0L;|Nfq}m2mFSU?NmC|q-U`) z%ixi)e{~#=w9KhTYU}9TCn0XUEB~*J{OE3dxcl!f zI0xO-Q68>A$6+kbL-D@#zfrOovSerzJnSmwpX*gi9d7`kr*GP}VJRxeF}x@x)N~jo z0gUGNpH-X4!ti;M3fr-F$MFjykdB#GW7nf9fY%gmF{2afez0|px9rVHy}1gHOsBcC zde$e?KdmM7=)UR}+m=NziBdluugB+W!aYEKcQ|zqT#V00;pk!yc}$bv!%;)?;2yF) zJ829)3`XvE+1#I3%>AhonuTdB}V>Y)(5RolD^ zX3h%raC^e0q+m;0{^mhAQ>A~flADsamF&U|06O`FA=lGM7}hG>quOd5X1A}UDMCH^ zkELTYjkAuo@!bDTJWY-#=ys|t*t6XSu))OkUY+96qwB3m_0qSRDm1?nT6oyUor#orNaM2oMcjZt&LtEse=aAcOkHT!M z#I7WLlGFiX^x0M%`SoRtCQKAqApZxua$N!!N`(JlyB6T!4ft|&76j6++c`R?B&g66 zrr|@;`)EM5?VoSAS9Fdd%R4d~$BL!Vx54R>Q(Lj0JcLRpjo$S~LS&V9l}5jb%DAy+yn=&N8iMX{@s7H*vp8{RgM&`mHDNF+@@L`R*t2kD(>%1p0;O4bRa~&c#^npr9Xn z=qLiWX)L>U@xSi|yrZ+bp2?wBYhOGHHup!tx#(y~c3TI|HEHj7w)*E!obsY~V((aj z2Zg@S8_C%;K2uPH%W>ql0!M1Sf9(DP83O;ZX^xZYJZG-w95>gmBl-8D?N}ppw%Abr z5&yIBUuJuuGuty{wv^ZSSYEGFUYMTZm*||va3_JMD9p?6MYpN>LQY*TV-S&fz|$Aa z>xt9X!A|s^E*Hk%|KHQsTl-YML`%~2^%b6*064f4Uww4^zQ)jJI843#o6HyDG2b(cG~8(^E6j%IzA#!*)nzOit;hY69kR%%Dp_H?>kzl|(ZzR#;p6LS_= z^i;SzX&c$Cs?@ZmIxJbW%Id=>bt@lBZeO?Zd+~9uIJ}9cy~WwOT*|2IQvX(|?Kaxa zJfaFq8^(0pUD31qwwVg>4%Gr)`mN3J37*8v7zpV z4K!(?D)J}s`nzp9r>J()ct*>l0dsINN=O?=+HH01xK@XOW81PX`k`rVD8rYBo&fqmTFfQQu&A4HWzS_Rq1KY!NoN=Tiw#PYCUUM>#&>ooExJvd# zTd+jxPMJ{m_&<8mIerVc^}_1f=#e&%?vZopA0MwKla>T^(?Hw(hyI}Keifh!XRLp; z6j~{rW)#%~afAOj4Hey~mf#-OM%=M+j*8>%l90o|_$W-cyx8qgy6H7eo5E;jJf{s4 zmHtOA>1j-hxc}MxCZ>P-=aKfguj1*)=)Px&r(TXi0zFUYd5y|6dXmuN8ZFZ35kmKA zl&#U-gubKEbdA18=vs}=)F@1-QKQo|`Z}RYHA>g0fzTq2l#$*(_i{oPY4im>e%L;@ zh|qYA4gsnE;KcvAJcNEyH2qx|F-=#Uc}XPuo#>aibZmIukItc0i~sw8Wc>3&Veix3 zc&K@0Cwkh6&xsm1Q3EGx;6x3asDTqTaH0lI)WC@vI8g)tm()OOQ+0D=V{=nOeV}Dt z#-ItQYg?OxzJB$!{cC)+^-aE%fG;?{e}lKNs>YjIRab)n&02s(&B5X8Q_P{ zAMhcAmj1Q%4MCrOU~O|lO=g3yHkel1?9cRhtLsvs+;C<8MjsV5)f)&jSEsJ`*9Uz= zbP=FUmp6!geqXH#(7B}PfVuOB>Z{G1r@>H;Fi+zl)pcHf=Dhl*pl`L$KZM=Pd4$td zn75&&&RgXR)>qHh%82Om!`FYEuR7T5AEcd3lwdH6)VxDj*2Ns4ee(x5de`_ewdW+( zm`AO35`AUP(VcG8s zpnNF}&EA^yW>j}(b8E1rHJFKt_6@3TXb$)?Ni&tc<_}Ues=`hp1yf0bg4HdVl)bM> ziQejJUrTT>QS`$mTz4ADeqZ%EB?Qo{163$xFr?1sZOIHYd0PT?&B2qD55+=V`K;4=dy0@9qSgO+Myn(vRptq{QH#jcNx8iap zRr}BcKU(Ber}un}KW}S8aCic)@nP)w#wQ}*23&f;nRflxeTjLk@m(1hmXHcc-Rg6Y zd0wi(A@Q=Kcmq`o2=j*+Dbrh1!+<(jhB)g}xdnUW*usfaIIqc@MdkMRx z>@H{ba(36SyN=xuyY1}W$?ik!KF)3zyL;JvkKK>h?O`{iN?+G-cE_-LCc781o5Sux zcHQhQV|OLH9(L>44YGSZyEm|VJG(z&_W^c)!)^z=&$IgqyYI03A-kWk+sp2d>Kqq+ z#;|)1yK~shVYirF54&sF{RX>R*!?lPzhSqF-B;LspWUPE4zAJpk7jowyVKdtXSa-9 zFS`xw^3ZH;s%ma+s>xXA_1Dw0VFb=X=U? zxR-7^C4TNzp2NM_i4gM7nZGOeHs%7mb~Bgt`3iGc|L+`!e|(&D{=r;1312BH;bZ&5 z5au}vx+IQZ?h*wZXSmQmletiLoqrttiIe{jGwzy2qE0&MM}q35>)B z=KTd<&m3>OaD1+1?tt)oi@9*0Rpvix{iEIx;OWjUW@PPeNQKhH47EfmLR zH*ZdOB*!f`~bCIpfVlLZj1anyr zr!kl9HIcb&uXC8o`G;NxM)fS`pV`duo)O0%ne&)_r!SC5IA13s#WZU#FAMXWme0H%u9^G<$USy7cM09*!WvC(yx^xZpCI^T<`V_aWIjponan2(p2Pf1!51?>OYk!0(h#|fxm-_u z%;kF8!d$MWS290Op{apD~x~_~XpwI^N0rLXpmH z<`)V6I`bKV>v{87d*CzHzgXxetBLJ!ueOikffnzL;Wel7ES!8bE65d0?Q3kClH^F@L` zz}y!6apr}BcQC(1@aLH?7W`G_+MbOE9$;P+M@piXebKtJMDQ<}7Yja6Er5r6O9Vfa zd8y#)U(k_$nc(NMe!1YYnO6wDkh!+UzdzoJ$_%E1y1b>40D#6wN8>0MP!CzwiD#71iUM=|h%xeVy zl(|oEdd(ZvTdm*&l|gj4ceUWdnAZt@8uNO=Co}(=;M16|5qu8w2EhxNHwwO#d6VE* zD2_#VRgNR1p7o`@6lDFOLjM}(mf&IL>4M+F{8YhjXFgi+yP0PQ{xI{&fk7vG0=%2&foR1p)3z;_v{n^aT z`Ki&T7b8+RHwgU_=GO|og1I?wHR)6_|CZ3NV{Xo4jeZmJTZI04=C=!e9dmPjYto^Y zI8yn|d9LBNGXI%K=Pu^vyw~VI#N3?!8vZNh<~-Q&$C;b+VZ*mEH|NEM?_$13l;_XP z&3UrX-^bjXFB=|ZZqAzx|2y-~Mfyo`xjFAPd;xQF{%yFMxj7Fvd?|BtK5qCb=H|TI@OtLv{M_&Wb90_< z_(taDeBJO(%*}bb;kPh1=kJE!$=saB8~y-ub3SkQubG?kdc&V$ZqDxwe~!61&o_K8 zb926L_+Ocu^M1qs#@w9$8{W&@+z&9EUWH2I&fFg`{AA|leu3fRn5R_b7^K{@m=72H zeCFoPHz!(3V!TiIjoH&GZ4)f0hpUJ#e@CD4x{T-9o66WT9kKvWf&HW$4YnYq+L54Rl zH}{7O-@x45FEadk=H~v9;bG?Hev;w0FgN#?4F3UhbHB;(dzqX2Plo@Txw#)@_!G>{ z{VBtrW^V3R8U6xubN|Zlz0A%1EW_VnZtiax{tqRssqp7V%;ovgBb?4-BAv&XPpQi>NhtRjPDh?+ zzRdc$LjP^nAL&R1J3H22A@q;3zC4djRR_=gT#Z8iB<9V6pTc~t;A5Bv1Ru}*>w-^V z{!PK@b=y?`Hw%6d^VILDXyspS8^C2Tv0}*Kj%;L^?OKenz4)}1!?&pA(Oho}RXWY_J2k7fQN!Ou}V$#s6Y^MdCxPp)wC z#mwJIck&A6{f9Yu4fEVFPTs=2Sm=MEZX6}KzA@gZ|8>@Xbexmlzeeio8XBKXbB zejm_H--nXeQ4@62x!{43_a7QBDD zZr`5^p3eMD!N)K^Ph6M!KW6k3dA*seKUQ4t#mw78I=RgMNAM-gpA~!s^P_^-Gk;a^ zbh>xcYT?)Z49sKg;^R7W_@-PYZsK`M8nJ z{`M*J$%22$JXi36!*qYB7W`D^&4Q0--Y)og%x@Mvi}}5RFJ%5B!7G>#ALYER%b1T4 z{AOBPDf3jZj#o18 zFL)L6`GT)uewN??=2Hc~hIzZ-H!y#Eth3&3W`3*C{{i#61izR0IFZgH%>O9#A7}15 z&6#f(^PdR5hk32wZ!-Ttr2iiC&jkO3`6!XjSIo~Be9*}lE*LK#3qF$h1%jW+e7WEk zGWQFf!~8bEi4^~^U5ek1cmf`6a+9fIG_{6WEg!@NuI zXPEy?*q<*jzhCfInfDhw%6yaHhnde3Joyyej+Y5Og87dGpTIo*bZ7rOhk1tJGnwBj z_&nzBGo0xxV!l)8mowihxQBUE@UJnqGMwqRGXGTY>zI2*I`pGh)X&!nehc&K1izDc zso?iA|F+=2V1A9Lhu<^*Nbu*GcM1L~^K-;?eZ<@?crWuN!A}~YulFXwM>Bs>@Uxgd zF8D>vPZ#?vdS3|DXO`gfY7yc~1utfPz2KG1TPNgD#Mq~b`Bf8gVvK~Z8Ge?N` z;N%;b?-sm``MDFF`ZqE^BKY^2ubSl4znA$Y!GFR04}w3+Jbb1z9rcbO)Z4p)?_~WM z;(B*8-y*JSAM=|8|A6@q1^=A+uLMsz)rC)z>u$k^Gk;w0vCIdFdYi)h48bpA{!PL2 znO6zEoO!+AtC>F|xS#pkf^TF#O|(mx`Gtbt$~;f-A2DAh_(RMW3jQSXm4feJ{wu*> zW*!mzUFHu9{x{}xC+DEu;-93EBqzDv5c(GLbA7GT$rouVMb8;O)oZKVUvijH3sbe<0G?%6yd2?__?q;4d*>EBIT? z=Lr4*^9I2`XMR9%*C?vqB-iaza!81MhA^Kh_!#CB1fRe>Pw;b@w+ns&^B)RsGe2@( zPOK~>6f>Wc>Ez3pHwbo_WSpXZp>|D+O<5ev9DWVE&xoZOjh~zJ>YV z^PTyAoB5f7f1mj!g8ziMU+@Q+?-TsDCY@={e77;bS@50AZx?(I^XCPBo%!Dc|10wa z)1CQ#%KU1<|H=G5!Ba=O@JVvLBDlr;?hBmhpUQlf;NzGNxzMRUiFv8unar;dd=~Tj z1D3LBaPkFUoSJbC7vN@Xwh)EVyfo z3!fy{-vuAS{2Q~K>5pXolHe1WH_mbDpU-^1;MvSw*-rgJ=Fk_B_*O(7n?Bv%lzf0)f%KV_<_cQMl={&(a%k4~mH}gjXe~)=>kyHN&^M?gb9p}O) z$#p>R5zLn@ai(()^VzU6N+|S%2_&1mb1P?L) zw&3l|?-Kkr<_`*fH}f9}d+ayNUlCmW?l9_kl(3_Avi?lL|IGXW!QW*5l;H0%pC#<5 z!_5CF_?OHt6LwVp({+ES5quc)2EoTM-y%5ua60v?w*;Tb+$HR&T;>x5cQelyd^z(Q zg&kGP{87OJ%(n@CE%WihUivokmxcZhm=6>B4>G?**h`NyKP2>@WHD& z-zWGo=5GpK#r$Q#o0z9&<;3zN;Tz0z1rIaN68tviUkZLN^U=aSe8i+9_*2ZA1mDGc zh2VRc|61^OnD-ZU=3(aN3jQVY#exscpxQ`sc?Ca}`CWpKXa1Dn=Q01Y;1@IR5jnRi`R#)DFn>_+;84TAfaU%wy+*Af3TG50UXi9<*mng2@g zP0V)){vGBQ348ud=2HZJhjDs@z3+jcMJX+^Bj@R$H(D4%qxU` zzX_CAlIwB7Ph$R+;HNU5EA}JfnZF|Vxy*kp?ED$b?-#s)`3Hh8VZKG!|CP-53+`k7 zx!`LR$IrL&$JF#y%ySH2H_Uv#;I}g$CHPMb@8=A7RPiKNKd~R#&V01s&oUn`_#Wmn z1>eWKLhuinFBSX?=2r-wI+4nqBH?+Lz? z`C_p@TE+Z9!PhXqN$_>d9~FEP^KQX!VV)`WSwCccROmm%e2UQD%G@h>C-Zv*f022! z;BPShq2TW`-z)gvnWq=!I67j|B;CI63H>3=2MhgCiXZO950j{mNo*49j}`hCFrO^= zT;?kUcQY>$dXm}d*V5j-8&>q>X( zuUGuo|C?x2yx%eZPjSeibdp^^70=1L5?^4Pxw?94vujbFXGw11vI19mWx1!UAU9tL z%gYKYG%7ABSfWs#ySQ8gk^0UnUQ$lJyxcP7pw{49vefM^A%SW@2}_EVdVXPfi95Ga z=@cw?qa{eBHdSuHl0_A^mgswt3ca+TtXQQ{RGh!mT}%N>mKH52&nR8rAu>l zo@E6^x#%qgswBA!RPl;X(TG=+yMmkr#l>0`?Xtj#s@ip-%Zl@qP`b3ZqObssNm&*w z%B?`3*BZs;g)vWl;WAPv&d=8cSyr$_3ArU02C5Rv3YHa=p@LNjRMorv6>3GDMA46vN9Z z6~zD~=h?Ys6~)wH;ek_8OvHqsMs18%);W_fH#W2wk1cDrdt$Hl-`UV$HdBss5mDS92=P}|rN^x%EpM#MYPUHs~LPj#KE zM!hbdq(H4l$t2X*(zkwrK1q1Db(ObiHHrF7`Xs5B=_}+5l0&c5Cl_zkC#Ts@-}G*M zS5=b-Z{8*cFIXq1v9*C5-&*=^2-5dz^-XWyCm&wEubdj?&@1>`$WL$KR|4MFOMZSA zKZ$%zB+|RUm8;%buO<3ktx7^~=T~Xy7xYtrem%W{cuhaMcvHWUVlV3_O}ww49K5n$ zIo=KA(2M((s(zKa7S+4^l}K+1R)TqXKgBWc@7Egq3V-FPsb5D5c$L5M(%bx%pkK95 zLHtgC67gDpa`c=1m4ui3tGdOz{pr>I#MImUm9~1pze4nme-hM7=}ABr(XY>E4_;i( zQaoem_|~cnQDebo>Qy>suo-}4dYOK(8Sl&|51e2#5fh?b@2}z$MHD6L_wbVrB+eER z`W!RrvN}}h(_7vV&M4R%Yi=}qu$edeJ|*^saxr7@9=&mVeSS`YIV!tMrn8qU6RZ3oq`c66q^~N5Ac#)ZpRw z{j-nW_|GD}^WW&uTmMO>SN+p_|BXy<{U;f3{ihfHlSnW8=SK43rTK)=MPp^D3sP08 z__~Vff?Vl!XlT{^N>EwX1@ZEJt*c+zuVs2+zLw}M{aQj+EUDM>D;S7n70@LP@QhFw zz}xb*N-V8_Y0}lz{N{a9SY55&z3&Qm=>7WY*9j734|NkAMpqG&6!-c4p1L5$Z6M%E zkX4v&Wela&_0=xD#9>BWRG8AxpK=2zOfUZO_ zYnp?o;Q&ohtpT`HSFCeoqn_bC)ECeZFwMtAJ=e#)JmJUude)D5)zlyJp?k+WO;DctCj454r>eEqr6v572}{)9W1*fFOf=e8k1C>J1vePH(uFBRMW>75 z4gskeZ+H*7Xnc68yr@pB@wAHCo&|+i8)H7TL{m(vA|zA2#up6G<_l&l47a6A7ME*Z z8SP|pv7gCtBNj7YUK3 z^3~usKk8IG{ZkY5v=Ab&0l)F$sk$+GVAiau_j#z-PhDN>^#rQDOCBHA& z>c`Slhu_1Y#8n0Pn%0rr(u%f1zopiNc6GJKPjgy=s7q?1p(l7(ulCg#g{n1_iHZi1 zuS)x|WMElO2;>s!Jc4UXP$0O*nMaMEA|l7YdY_L<)!6FcUVxs9^+op+3h=3bsjFMi zvd!p2N@{9mSJyyGeI2F)suhwbAw;av4NHP<36jVh(t)%L;Rk}W2TS0^F$uo}0|TXo zl0yv4ft)Wq&@;Zk`dAquat@GMF;e~0XCN{>>%9$B36Q8}91*b4xG*!K4tT<*m{|7} z($h9A0JPS+l%R^PBvW+d;lAubYa8>EM3i|=D{4#0Yq-$tsr6#6G$FP0;|?k|tpSQc zNQgi_twhT{dKo$oer(A#wLUfz=n9Jab!{lW>LOeZ3c%{*s5(e@nFQTx8Y~HZoi~%_ z7Bq_vY;LJXCpBflZ_HpVqU9U44Et%SzZ$a?j1m%j&9$x;pKlEZp)2Vi2ow}pQ{UoQ zA8<`YJLyY-psxXf&x>k-OFx>0-v)y0SFy-dt1bz=sF0|)1SG+bz;D>72sB|Tq0xI~ zm5*#$z3wT&dTHtAtYy1vzTU$O~Q*9lL| zP{T@u+*BUKXcWc?%|obBU4;0gg!tr%Crv)8Z`ah8dXx**4%c)Lh-8vaB|}%wmA-Y@ zw>H!g(tQms_A<)P-5La2T~gq^uF~brF3G&xB~fp86;xBpI&=)0n-N4iUUE^h@!1Nq zE>`rZzJ@Baay4BYiK`o$tBlNZK^${;Ai%R4l~3=XDSfin$Rs404YpbwA1C^;++ur! zkr!8~!cWb)*89mCqMyHWO zilSE}CGr_dy;`s62NEex!WoO2FVxQ@Ds^?nf(b*Nu^?}K#)7QXk0w%F)2mboR2*~0 zQjgJ~&R9smw8eE#zo4kf%V#V|OrNpTn==-aJ$}ZbJZh7zqel@XdfzC6&_P3X9kH(BU~3Gb+V!)qeZKOx@JCOQGw=+MK?8{ zvFHp`Jn8^SFlQ{NQgy~c=ASYQQB3;HN2SF3ZGFf>4MV@HNb3oHOOf){rz~h4oU+iI zPJ2XsmVzwl^h2*n(4?p;Nwqe`lt>v%fU#Jhh_e;dOX=7}`^>qE_F)*%4=tKNee$A% z^wCSb+HiQx?<|s{+Fz2bf=)nw{Q@>aN{%v-7IM{Cv>!Na|3qarYmA`@i*g4JXoU)j;b1JT_j&aeOUE| zsZ|XotAg0d&;~A)Gq`=%gkV zfOh2AO&0`cSxfM7y-@&(2_Yu23*vc0OrYA}stSNABe<&C>uJTpMSW1s#3omogB>y_ zf;rh>5}A^9t&gjwR*}p{KT1Yhz-&_@Xl8DLEz>X8$AS@s6(J>-tPWSJ2ZKMJtS7*|3w5bvl{DR)ELeg^BXHvq z@{$Eh>EV!alC_BQPdpa^FYcn^Hos>y5;O zdLwVV-qc|^4beJGP2L7FM{wW-UqeDk;E5L)mBtCINe3+pv(bk+Fc^3)nSUq^X@ zNI?xQ2#K9Ch-=gw=eAz_3OQ79NUE1eNa~aTE-57_#Ns&8Vzs7bl@i@En2PpiUB9Op zV+)-_`y0%H2|>4fJ#B62ycL2X9#2&ufU>}pc6og0QC=5LCvbDjTLm`=la$;#BL&q8 zrqnPm1@Hvi|L*5BB!H*NT>VW#=J~R84RZ2LfObhY@iQJCV#x-s%F)s)?ewH+*L(}F z>nsEiGx5#)e|ze5j7O?Wi1y3)ly^TJ2qC{`h3}OkIZ7WZ=f&D=fuX5%W2;_kS>$E zoc0|)-!On}eF5^?x1Gk9tzG!!Pu}HE&5N}=u~a}`e(Ud9)wrD2&Bir^{G4`Hp`_$b z{#aZd4;EWlM?&kaLpLK~!|1{ZODTnP-Mf@QC$`_8>Rk6I%aeCGo3{FIYI9;7cYN<0 zpD+H?Txd04L=pKSCnFpaTsvP{&nJvb4#mZv8lR8cBaBFv)7*JdWTz8r55zu>*CA>K z_XEUl9ZYxh91I2OPwlt?{+Sf;564bmv4_3)4d4eDM|pscr7`MV|xgr<1c|&JTL)4b`EP8 z=ft)-&F`c+v8SD<-^h#kofa<6yjTH}!UdU^(vBSdr!57ccKM?}?uTZC@@)MjH;@r|JIYW_UTRroF`aJuPA&cJ|Xw*ET1{ng>7pqN~ekF)f8FI#T7d40E1-$C>tN zL#fkJpXO}Z)iltFag}!Tb7EJZc=qH?=*(;G9MzB!XbntF%WICO<;S+=J-t6aHayUB z5~U$OwiNl2*gr+_IpB;m#r{z zHp`^n@oGF9sf?f12TASX0`|12AT_Eb+bOMnj*Gen+H^r@3d17jNc#YU)#NOW&&Cyn z7DPovra3M1I-RHEsQgh)XFEscbs`R5(`kI?Vy7i5zL2zAGRIQd;|?5@i(wtV+Aigl zKY44wG>SkgH-WrqI~z}#-*QZwGwu0?;Sjb#XiSs7xIM3HYsV{GRn#~3q0e=uM2^S* zK9QsGzi(s+{`Zd%9}q#}V_!JU2Rau!sIe^=)NH~p5D(|bT$AK+w*IdB#Fy>!H6Cj# zGM2g9>9T{3O*QiFkG@V>>)IvbkkxM)z1xYsMv*4Me%xtZ(3#@IP;rvrp`26{6B3!% z@hhsfvpIF<#+GZ-;-lg2xRHEDD4#w_?qTue=rae)3AP;PY}&i-45wwmFqA7w(%(EE zyeOw|(Zwz6cZ`a+Lv=;YlBHCN`&ea~XaTZs!0 z!cr%eme4)s11DC9w$=|5&nc10zE-2So;D4vF;7oDmt=F)IE!28NCo;{U>h_4;QHYC7D}zMPsx{2|;O zFS0>Q%N*~IUW$gAIU#ah<{6RcnWy=qe?Vi)922=TGs7Q+@#xE(dh9sd$I`Nl=0UW9*{k%&LD zGIAVpXod-l675^b03bbx)ZzJ-F?7p!@sG2WmN{vCzszaZjuhK-N58QdPWyJG&3Et- z{BtJ19IvvnOVeOAwRL=8R{+gB`*X!zju_)GqqrKW z6<&bE#-ETR`lGwyl{vv5ZKLbN$mn=6Wd`NHhno}63u7>xb6_V?U^h@6(j!-(Tvwx9 zt5Kd|&Ti0c4HKm`#LFb2$nm)4Sf~z16%2|09hD||dPRzPJ0h`(NA%oJ&~{P7cVG(O z=LSYtiO7nS$&sZBi5z$`LeZ4yEIP-flt_QHD^Vk5lXa(xAO1 z9orsg8I#xic~=DMsn5TNjP01y+s!nnN;UNo{83-2K~;}r8iOK}))whSy~StBdub7^ zsaw`RkrqFM{(`hGrBULMFTabjSVFyK)7Euk3cp-;iF4!yr_PNN4h1Eas?%IY$m}+%^fGn~#R+BfA~VTeF-AFOYqNH9=D0z&6-kvXFKK z{^jY!{^)*=trK1I1tX=Jfed{P9rsbg(3$^YBy{x$jFjTv^b3;25^Nb2Xt@j)ja_u~ z@o%~TV}~`M!MF~?sf1yY<-?ZVJFlkqm~kmJg=k4>zG1ITN}W2UdLl_989BR z#5#@P9(zA-Ml@LQFtUyLdlXro#~brEV9*G!F$!C7MR5Cy;K8>rTLfbJ*z|3|=!HNM z&Z%TL8y_wTYAuLuGddm`0gCh32ra`>BPgWT53U79J5P=H-2e`j(>!e_LvPrsY*QlH zeD87Yy=Y_a$4BG-z+wr+K8$z%6Omy8@C2P08`7MX!nC5|KQkd2n?SWs4?(0oQbpKnn&~+d!t4V2w;Q zMkWQ;$IDBw>B9McJU$<3#J0imjz2oFzfrZ^NUb8)elQohiRjZP#b{!AW`@pdZ=+^S zbrC7&B?T5|Er=iWV>>8ZHvUP7KBtIwDJT(dVWtn#Uf!_;85<}6*h zgcFJl%iZxRhHX&mxS7=2<2Ro}yKh^A@o%!whIU>;0aL19V%uj&&e9-Q5moFQ+@G^_ zIsDzqUIB&$Th7uYv@h2DMyC_29%jXsX@Qmy(*J%Sw##YmN{!6o{ADi2Mwgo@T0c={ zCoLGR#{%`QFr{t z;QtP{DC}`vg`}{BpmzgCLW8Xr-j}wU7-*JQxBrW)3`b4AbFj^u8kxBm+op*)raG}bZfi(Efap|9mZ|0- zDurns_wj7_)WLVKKBugU-RX~((JaE|>?R{&-rH^@%!PevM&bE!qLDCXE;Z6HEH;fa z+#kK)NM!aJ31)Af{(NtmKRUul1O3r4MjGUgUSy=B{L$q`8tjk$)ks79(NkdXBHp3! zHIg6k8fk<-+H9nw{n6WuG}0e^%Sgxgqa)M!-edjI^Nnj z=|(!iAB`C4M1S;mMjGvp?lsa${^%hio$QYeg*AeEPw_{m87bW#U1g+GQ5r_Vf_x6F zGU$!*N7oo>tUvlaBaQP%?=#Zr{%8(83Tf^FU7 zqkD{WKJqr4@4W!2GSY>(*GN^lvqAHmX0 ze{{I<&GJW2FuvLT=prNK_@j*`G;j*B||bVe|aa zPNV0bD`Nye3FV;;q0d6P82icCLWDHmADx9=JxBq6^co}O`=fs}(gOINz`h0kXz}SR z75bx@XRuV{kKSOUVt@2kMnX|X?g^*GjB;*TCS zY^guG@kD0J{Lyb2X}Lcd9nI_#EUk@nDQeY7D-a5XU8FwfkG^lD%ly%MPi7YKN3)Dn zhLDX^?vECp!oC&$=tD*d`=b-mnN|9u&l+hZdg!Uls?e^CRPB%6X{5{j(btT$${+p6 zNHypm2QiQ|cdqtFUo=uJ%I`D|r4BurB(D)Rc^6MYc<{E5hApH#I4@lj7szJyqsZevsQTpnElo&%CtmUex3*$w z4t0>y=EgEvGUK$c@oCH|dhnInbR0Qo^5iX=^#hy?+NvQ7hMJnS{Y}#y75^QTwRwCA zQxG#FdPQR0*grA|MoPT(J?#FTOok#o6N5?cW8P;Z%apr@)eeHrf$M0vyQf7mi%TT{V)KkrDV6MLSX zmJUVK0c_=CH=%DJr9J-STRp|vOSei6E`DQ=_u4k&!(?UFK0P;WJSI-+>(ko&(Pzw- zVb3?{zCcySh3riGBC^aB=>R8o7^{E*&a}3s0<^6Dks|z0X_`$-bt!Y$c!$Ksi?>lr zf;GM(7)ehkki{<=^=TbHMI)pQBWq4$Q{M!{F`;PO%P{AA9d*&SX=R6j z;uDz8cav)KCs&LOPg-z$eE0sIvukR{zj^kTMUm*5H;h(lX8pp?9TUS+zsLxb zU0*yuHiJ!Kae`5=Ba~S2^KOdMQiWB@0bZgHAO|a&DgiT93C($|)== zruA_#a)Y(-vZX6Junv2k)=Bf z=Wq00PHF8Wb+4;?Yo#``i^PqRpbS3ZdGDac`GUi$zVVRANa zzz%EsFuY-br>R&;U>^!kU&x5S{?|zKZm0Q8#5IErzP@-raCRE4fS#as-Q1oQAM`x6 z`^TKvrM^IGJ}lye_U3auH{&j2G5Q0oi|OUP$Sb*9`s8lL%NpBwF5lJh&ZSN)o=8Sg z!n=)Lus!L`susU9W2k>q7j4b9Zoq3CYba7XpA@PY zJZ5QDITOXWkBM7L)!}?BGRQ)j@X2Bx z5vW-H`7Ad-yjy}2Y{fez$nx+xTL#S8+=tV%jnV@P^@W~uOy(Z)hb*D7Aw`q-Zp_NS z>!R)3I8l@%y#Kl@G8(U@WN&+r! z|7Iqx2WR77FSp^vka47n7ej`V>ZtCj2@?iY{mCIzHI-WP)D-NZz;*Bd{v`#@;}^EA zNR`I~esR#h>0!Q?Rx}&ZI$ln?g^Go=V0gDsnBUf6ax=oNDSC|ED&X0FiLESD(?G}n zd%O&_tK&mh5b@u=*mIXf@9Z8-!k*oX zfrs%+PuqC1Zkd(V@ecL;m_NUD{ZnX}pK|k}{aSSNr+J^h1q11Y)UlnGBI@YPI|t;o zKblw+B&E-EpxCw~$YV=vBw~2pwBFcr&ZdtegB`qEOu=^T#v2?6wfnG+%6YppIV{?| za9ZX()x$!&7wx3`u_7!*K0WKuByZ_tQ{yMS&~t?(n%4mTrXRd7%?raW7LJ>@z1G ztP;Byx5+)d^zLc7Ql&l28_tBCf!L>cu>pCsF=C`c1&tA>9wFxW}t0pqagsp z70-vLXpr|Jdeab(7m&&4Q31){7&#XlQ)U-F{EZPYVPFNjX)z^+mx8+$7wrTXgUOV! zwo(>8SXs$rb+3M5=`2Rm2t>zTmKg+J71@aTcI9*zQ!%5w+@7s zzG>^)g(#q;?nNP?q+>7%U^M^rab85`#m*j^*NU|}wqI}q>DX~KksmGqnNy_3tWKi& z!Pe<*+LPC)(*n~vuk1_TZu7M0p2`->mU%FVxQBJ`m%;-{9nmD4nuG1J+%=!wOSb3s z-uj^Bv@*aFgI*f)pNe4A_adA)dQ@!v;@PT?0t%u+453uev|e&OA-D9PQD zHfQr7?5WcCuk@nCwUT{!06;sxFyuP76Na^l>nFx)9PYGUK|=(89RO3u@zl@S-oSSO zcH-^%p>&}o*yA1hvB1Rgo_F!+mB*=`Jvv%R(5h!D-c&gdUytWpw1>j$_ZN)MlC%z( zwmY#WK<$ib!-(yp&~4%ycG8gHqdCZF&!%>UlFuHNP1jau6h>nf+f(R9r@0Nr=;KY; z^6SYM_4IK}khfx0Zc>2z=nHNe0SnSPk$1i1or31b}MU|0lY;QzI&9~cEN5%m1P?_|q$$t>JM@35I zM(mn#so13KWza1txU;uzt&5&=I86t8wFK*r?!eaW!9U@jCo#6Lu*(xqeX{3uL2re* zo1V;Yy`nG|2U^a+#wxWn`id33RJc^)!PAWZzXArkm>WFRKE0t;9RE6=SMe7-x#>3z zmTidq*pnR(;TxodyaT;E-uMJ{c8Q84F6@cQ<9@SMMq0<4N1iHGR1}A$<1Q& zFoq`yGDKlqJ`mr^$ zuK{pyC;s)&@O$b*|H5XfY1o17qwr>((=v_5icT|D456odALP+{r7vR$&ZD)K8KJ(~ z80vjwy3WRFhl4GMt+$R(y>&6-?#(~8y_eSapEQI12-vjr?#&>n0I`h3@Xtnq80kD_ zn(x`tl0r7;&&4BNT5Hh8-Y(k9!BPV&hRN^IciATI%AdTKz6v+_ANIRt^l1C__$KPB z^eqrFaBZ04G_Ur?OWP@6STp7!Kt4MY--EnBeDRH+Dak&gU7zEVefqdQT|15XEkrqIteA9LCrgODIfGXLZ5UW#j6(`(FT(V;jm8fgE8*AU@7fUr zN{N*OxXA5dGt8H^+%+FamIK*DBj3G@71_=l~iGm_0fVYGi;mn^VY|ilwP~pGWO$0b{HA)(4TM9*XQD`hM-Tv`Qj@pF^3YWaC4;lw=Q1oLx|& zrcg`6Xp-Xa+%;q`6&2sfR$ZrWJstukr=iz{H)0s*_Cing5>MReIqFGfb%koi*8#BV zp|4{80PoHqnqbGP80zUeN@lArz7}JXomvEiyQAXnD62a>}eb8yCS2Wc{!hNbM`&Wc3t82sk8pDxO``3h4msNyP z%fc(GYx~xOBmK(jYAgDNYAgEGHS`PDG=@{oO36q$Gv%U`%#@kr+1R%{)X=xQq9L`m zsir0?wLVnckkz-gE;6735!Hm&4X6!YSwrC?;z<9RaP7)SRiDg@`pmp2^{Q|~T~`0q zbrnrDbpvXfR+ohvvigOuSd-O1d__~JCTn0rcy*|{wj$inH&oWxcQul*I3O` z$~pb&Dk`#4!)wB|S^Y!x_2Jrz0S$09G=>pDegDepnn<`|U}arRMMh1yGLlwV*N_no zl~<)gxn^De)nQ6%YN)ZXt~~Y1hU!Roh)DvpDSLy&)ex?<9wwGF<8e{eP?Ot?nFb7% z8)h0jq`WHBkTJ8mHWFSLZWtohjG2Uov0tdBzA97}j#QUt8D-oUZh))*ns9lfu3?b5 zWFQ4ciAdEuL}Zi90mhYe)auZxaE5UV7LA!yTZ8Fe#!Q1!DdMbDLRkYFo61a*`-Rum zNBXWTuSku*ANNSWHg4>golXS5N<^J`qk8hDu&gexHIaSBK1v?3>0*DPp8}Q|VvUATCk%8%zqekOoD{>oX|&a4n0W^73$febp*8mlrQp|YCrQLdQfcjXK!_Msj(YUH?N=Q-$qp{AP12oJ6Zqwj@J z^`h`vWW6yt?CPt+-ndqU*EJ6Jgo0Ezg_Fq45EbAMH|M~8N1+i>n{1H+x0XRG%b{6QLlptBF%pV24!W{BQk4-x>4uKt{|1lAbW=G~90+G- zZbL&|!}N65lN#{!^wrgkjp*R%$lsuafx?2~(wqPdY5)8A-xB!W68QhA1f;Jv)t1#Y z)mEgh2{lyHI5<6BJYWK(htd;M@*u$&`P1tv(=mnCHLM#nCNidS{Dd)?YwD^iFc2iP zA(u5_7Ot)(idkXi_zCIh6Vo%sjQ@X~U0Qzme22TtH97XaK3WiU|Mc}Gma_>@e02<; z!(9m=0=_VXPxtV7F%3?Sw!9yFZ3&;l^y@%LpGoXG+{Md1kI!`B^n}&>naz&FUG(hI z`&qz_!(Fu0@qU)F<8T)(TfCnzI}Ufz+Rpo_XUE|#T6TIr>)3I)i`JXoPm~>pyJ+F- z{d|WVhr4L2-20(58kNI8yb$v5*xkLH9~Q35^D*JNe(BACp6cZl;X0gy!ujI)_n~kd z{%69oJ-Q_JWksZ4MR1hmO8*$)O5Jx-FZ$zz^TiX^#9qR=K)7yivxM_LgD0E?!gUW= zCcM8#m&CB}0gBfOSJ-!zaK3mvzad0 z*N69Q&^~F$$@_Uh^yy6y?`MC4dntbMK{#JLUWbJ1{2mdmqV@e-xUMhy=^AS1x*P@y z*Y!1AxUMgHm`LI1@#hrbdi)tL+>DEKuldmLWKcMIT$(BzU!G0+%oeWeYk_clVK(Wr zNI1SAoAkL%cyg`ye3in7Cu#e9HNr$yQVzQ&sL*&2tqud|5T=^H<^c!fMioe>)HP8l6OazP+Na+yAS= z@qK}$&jI21vTD-jL*eO3)aNr3;Nh-Q6(7tE{BYN4iXSa}jN&H>AFKFS;o}saDBR4q zuIDu2XSj%^Y~k8KxmdWKPfLXB`E-SFJ)f==ezuDD3gH=wUnP8^;?2U(QT#^X#*T13 ze;{1X<970#mLDZWei`HDX$T-yV03cpb49~M4U@qY`SruYCJ2oHA| z`^fbiE_{ZISUOR-wnN4Vzewq42%o9=RN+~Q=L*kOyjXaS;>(54QoKU=Y{hGZ&ry7h z@La{O5k6P(nDBXu-z?lw{7&I{ivM2t#ftw$_sH~~{`r}3ZO{BxczRMQ zeZB{Tk5hb`a6O+sAzaUEdxh)y=q2HLzIa2p9_QZ{uE*^UgzItjW8r%I{I_sDPWBr> z8SU%SrvsU*7>0&N0H@Q~YG%e6)cZjBmW~etkR;;<>^{C{DjUM)97Y zc&_l%6)zS(Me(5UY{jdD&sF>i;Q__37H;-G+&nZ3U#|4G2oEa$J>gY~-yuAr_`Slv zruaj`zoB@$@LLrByYQbW{;F`Z|KaBA9pU#X{UgHL6z|6yQGI<+Dn4BJ^NOD${7uEr z6#lN_=L`Rr;yJ?2K8KtBeBncs>9th&35r(;KU48K;WHG!Qh2uF&B6;5ZxtR?{3hY6 z6u(vY)r$W@_!hrBnFv zigyVgqj=g;bZ=kZWW|RIpQHGR!p*whjdz^zkkUU_c#Yy032##TV&NMVUn2Z^#VeQ} z?i%7Ig{6q-e_!ceEBbu#+;hF?-=Xwx5&bb9T@rsO`exnldj3iDdAN76Z-?+n9!BDG z5{}s?a6MlaUZ?`+epCBh$2e3|e^6fYOPRq-0(ZHh;PZ&Q4|@W&L73g4ml zjly>-{$t^L6u(RO3yMD=e4pYwg~t_tUbwMG+;;Vr@J^+FSh$bpA6Nei;c1Ew;tto> zH%#$kg^yDFH0HcH;RX)r>;z9XbS@B{rVQ(B;lmVPAbgbKb9sY5)t9dLC89rG@p9pl z6kjF0UhyW&vy;=mLHJt5%{gU<&2a1~iJMs;&sEj<^K%JjqYCFf(NFh;LE@t}oa|(e z=WIBaC8u+r@Xd<9Z+R$L|1-u>S`~}7DVxHprb#8L`KO}s^++_Z^@Yj;D?-}9! zlZ)B+rtn2PpSw4GAiO~7*YN|f6yJ^N0pTa2|0LI^8%}@T088;LSK$m7ev9HK2>*q$ z8_yR07o~r`@W&O$7aj0P@tvAn?Y?~B`h9~%!p-woH~p2u%|4UMYlWNVjV@m+{3I1` zv+!dSZx!xW{3pWCSN-?b!k<+9LE)FHaCQifDgK=BbQR9q!f#gk^b5;Wo_iGU!yB0? zzMm-W7q0EqQ-r^y^v@J-o?p4;IbHZHHPk!8&*gnVSHDR3c`9Gagll{6a^WpXzfrih z->wn9Q|WIKPQNtn{oEk@L&d)@JV)j0XTo)Ue8PkL^E|;#(ceV> zb*2Bj@S!UFxbXLt{=b9|SNeTLW|!e3OpO8B|FKj(&jh4AT$UoCu*;+uu9Rs6fcql(`q{C35EE&S(-KOp=s zia#d&Pl`Vy{0wEM(XWtGzdlp(gTkjP-YGmw@%|%BI3y#LXrJ?v(C-_4g__+3i> z1mX86K32F{7rNn`BYeNopDO%VUcb8fbA>;kc#-g{6~9EdHmt+K2PyqJ;TeiwBb-i9 z@P1;#`>OK!p741}|L4MM6#t{}Zz%qV@ZTu@r0{KuzbHIarRRX~bj3dsPA5KiKPmje zSBj4g#rA%N2){(}06^Mya8_!8kKD!x+q4-~H#p0D`V zgkPcfO~U`A_)mqK^@>|UcL_hA?P!<(N%&tBe^_{k?J`$?hwxXG{$AnlDgK)9e=B}a zIDePb4c_;W@BuszcszK6C&jl$g_9=y>xvH-{yoJ{6ke(LSmD1=e4_B1R5@e{H}emPlDSoZ+X2s1J+bO;~6u(9E-%|V+!gnivkMJp~oF5dvK=B>I zFIRlG@S7EXLHHIPzuo-4A^h8lAGBO;{2dnltkVBX_&*fy!!J0b__BHYaN`{!d@#2! zmme>@N%675f1vn8;m;_3f$$&m)eS#O_$P|b6MnJE?*idJQTbXS+|2)O_|?MiRr*cB z+ZEp^{C>s1C49HyKNNn7D$hHGpQrde!hfjvcHvhl{+#e@6+a;SCB+X5|5)+Qgy*Vy zN#pXx*RmBqTDTdf-SVU}aL8U=rS#7fzFhGc!p->YhLbD2UFnw!zfJLS;oB5%5MIpf z-3@=E@WV>~o5Hh{{tty;q4;lvzohts!mrMC<0NUP@cCTcuHSRQzoYnm;ksWO68@gj z|3dg%iVq$|ai#b)KSB7pe4m@1@xr@QIOhw`Q2Mik&s4ln_}3M`RCuA{)xxh+yh->G z#Wx85EnnUAUoU*N;@=m3q2fOkzC`g~3BO(OKM229aXvgA<(#fwK;JF;`HDX){JV<3 zBK&p5_X|IU_qpBt(rHjszj=zkFZ^qYeY*$0aS|bgj3u&Ng62pJjI6z zFHrn=;f;!)Cj5trPY|A#o*eIaHXOyXg#TIbdBWQiFB1MQ#g_>meX1|%Qz3kn;#Ua2 zQ}Ok}pHe(3+;>`1@V;*fe?sx^3ja{?9|^x;Oma9s6MmKAzY+dR#qSrsNAYdKI~9LI zc*fY|c%K(ut@uBL->CRu;fuy4htnzi+lu@63nD4LhZG+u{D9&|3%~mG>3Z&7@z@KeSo>(3VcHN^wM?@@e_@DUS|!wCvsqj;6@dlhdI{+!|)gr9U~ za`@K^zeDlw3I9~_+l7DctmJThCw$=9$^1d#6BOSme5vAef*p-xH!8kg_?C&u;lC^V z0mVNS{+Z%F{vr{^v2&8cNfZ8RMlv5Ee1;0=B;gBGIA;pKN%0GXKdADRE&M&j^Mrq* z!YL7+qtdxtxcPZuHxFgP)0KX$@b!~iU6QU5zIJjl|EBQ!&rRmv6Mo%!$^2Ks-&gzr z;Zx2})^8Kup!ie52Van^|Az3>XC?Cwgr6`wng3h(m5L9R=Vd>dldL~VczSL!A1ger z(sRD>LyG4L|4B}AI7@_|a$z#B5&nSU5#i4$zFGL5smbB|Q25Ac$^6&C1ByQ^{4K?w z5?(evIh=#S&z+IXzYyN8^p9pcCdD^G>7OqAUB#yfFUw30e}V896%Px);i6>yHNu}$ zJSzOCnaTP$3E!ajUBb62{ukl<6yGg8kd++%E5i3G-XVMpU)_5?5}vL2zlCp7JoRL{ zH^o<__)y`S6(1@5M~bHlH~DkZGeLN}(w`#y8O3J`-=*xjLgBu2H*AtF5uTGyF85O* zJeck>lIQ>^%J1HEy1Jir!sF>KBgxpoDZY@h$67`IbY)-NB7BqLw+nAo{I|lttN5RV z-=lcD@Bzxc+ADm5;;#yyuXtSeYQ_I4{C;J3_2K$R@$FOGFZ`h5qlI6r?5hmnUnul5yKABFQHozCe1+nxgwIm^D&d8SZxa5X;x`IURd$_OhotzXDt@Qvw<>;* z@C}MTBK&d1O@B!79k1-bXGDL7;;#x{qxjpxpHloo;r*2z_=WHQ*@Cn>&(N`IvA z%M~9dyiD;a!pAAQF-Q0;#RE1R#g_}eS@E#&>lBX&e?{>P!p~9mYOC;4#cvTFQT$Hf zTNMAJ@OH%?79Ll8r|^F({*3TLioYuSYGohBg@2~FS;waMYL&g0!sA_vZ@uC}gg>nK zDB*h)A0zyL;^zqeT=5yghbsGduJE%IFBV>}_$9)xQ@m1mowAd!5PrSl>xKVX@y){9 z6u(LMGm8I2_#wrACH!J#SN}=)3dOeyzfJMo!tYi572!3?K7UL2j}-r>@VgaH;duz} zttoqcknkTWK1%q@ik~X{1I5n~eyOtmrwT7pe4g;hiWdpbS3D^EjVZpQPnGaa#n%Y0 zR^e>vh2JFn8m0eZ;rkW;rSLP<`sI(pD;0lOxKFJY+J(QO_|wAoDE@}TJDT)taj#Jy@V+;Fu;n^0*b)4`l#m^HyO7S_C_eu6BVV>eUOQmOp z@L7si3cpzKTH!&(uNHod;+utEtN8bXe?#$~3V%%TyM_N%@rQ(ep?JISr`7uF@50Yh z>#6<1A5r|U@Q7MZeJ=bN#Rst6mg0Lr@e#uJDSoQ(W7PUZm6O&sO{l;m0XHMfeQG zXA0l0c)*6AotΝnyi%C;T?WHwgco;#-8jt@saw->3MU!e3MTe&L4|-zNN+9ADCB zuki7Tzao5=;%1*3?_((bq3E|N{<-jjil^~QR-c~(*~eWQgBot@0b3Gbu$ zdBRsIev$C|6rU&jGsTO9zoPh3;n&YePES=Y{0iaMD*cVZZ&dsy;m71AhkvW^7nS}U z!t0d&Z-qB2exLAPDE^4>>*prNyHofBia!mmzvIGp&YK-vkdwD4*H^N%Bv_oAGlzx6 z#d)O$6%^(!U^F{WP-0M^BsX_Hv;6#=LL)3(V8xPx+4FNt%`F8B7Ua%0a?b48xrIiY zmAAme638nlmC#FaOX2gY$ArOY`z`eMkdbNM(SXIdg+~3n(t4C8gl` zkOM)RgaW88EJ2>;6#F30DOeC#3Sn`v2(xiVDL`rQ!UeN^l&c`pVT4?yu{38MA}Hl+ zVNPB#3nfeQ`AX%nusE0HSqt-!q6NmkFn4wyezBKsMw;>#%wsV>rvznY{DKSe0tp$B zqgcgbZVn1J;aXIXH^;XqC&2o2WnB`C9!ac2KN1|YVa&=w5KeARVX!1`S*~wZUJwO9 zmy(6E=#sxMK$qMi`X4Bz|MU3&?1BX)KKXs&tuMt;GZg@FR{Sgw~>=I5ZbCv#W}#?dL1|ttDwCqj zotIOJHg7ZvO7aqpIeCjnp{jH6HTPWDMbsO&uN6n z3CC5+9g@_AkvQWJ=j3uYkT5`&lyY}~!}fEC^K+M4ib$=PW2?z2abqo!SWE2q08b~! z+*0C(S(50|m?~x$1OhaoBQtQ7l;VUdk{9QdI>DUc+yy!0V!`#CU9b>M5JOoPlr8_3+FxXrGhVX z>O(!b>EH(z@WapKmg65tlsu70KR?e`J}ALR^nWF%gbsw@FwB_{ps265m=@kMeYhEDhjju0glsiRh9?u^s{kWA+{MCx!%137Ss)Df{he4+&3PZYPX zY>s{)9Y_)_B(ynU)MSk>>(jvk@D~)ROH?H%H5Rs0VusU?m1j%%|1RXVDWjbhrWE?a>XH1YtXG};Xg>g;;AvDoM zTB;&clzhJ_qN<1#dKD^~tDgmqx+;S6B8;v%CBn#bMuU;)ULMuoMjE}E8gZqv5}kFc&EOxTW`Z_?86Y8=X&~X0xgg;- z6GFntvqHj!mYblNhIXDhJ;Ad1v{#1adu0vtf|sxBpj?G5_N@yZ?GO?ka1O` zh^WWm8i}m)VRYf!DKpX_AeG}BfryW~POvP5;)HELv#%4Jm4`Vs;o_;C?xZ3@Fy*Vl zkwzcpUYNfy_!cghUt(Ovv;xY(I%qbm612hcRlx{mmzCuh37cwHnMe{YN_xU!k^*OC zLpW^aEI3w&8dhN}MnI&=t_qw$Q^oh0gHNhyj)Z3oP8$dBL!v0IKqwPq54D+92~}t@|qCF5Gv?uSP%8#^6F4c5L3!(ss$i9 zIHA$k5U#J`EKg*qwvL)4Ob%aTc~y9In1>*vgi#|w>v5KnR0Gn5o-na0gfKB5NO{lz z5OlpN>T1KRgWx@_% zUK=q|LpajZfPtk7$39WuT=L=CH6+(Jp%I`%P_uz{d3msb#!-)mu7w2J+t9>9D_5fQ zM7L}eMZ&j1G`ix(GzC+_<0&aJaYR;Gug1u#l;(vlfjP}I zK=KH)$HbNOXfkzZoGjJW$<>rVeRUPa87dW$C?MQeVJemcQvoEA31&QL>ccr$#(`<~ z!i0nak6;v4P;j^dgR8^~2lT9~@ybLRAxaF8nlJ>Q_2OnYt_;;sAwZ&%NxA`(n-4=S z%0MOwx)ZhrBQqb+q(k$&j|EOTOE&53khbhYZCjIckLZ3dnVv(qK0?5h(`-uyo~C<7JwRN4FgP z$b@YaOx!~1>QOC5xvsvNySPacj#9!TMmWj=+N4z<1G=XL=H3wj$9iLr8-0f-{-; z1{#T3SRGnd7AE_dUA8Epj1eCvrZMFylL9c4CP_T$nQlwE;gzIsgTOEaefR}SMiH8Y{Ylg=~ zoZE$Qcp~g|HU?N=JJc{!K$z@}(<@N^B>{9dyqHJ?LNF8}9rfIA=qkfMGu+QtGYY`d z_9RlY9f@zUHCInv9s>f_pJ@FQ=mqC-5M;-Yrqoq^qOR(VB}0B@bwUzFXlqGal4a}3 z`Gg~30b(Yiu1|Lpqh9C|8i!D#CJFAK1YL5tL6eKh+c&Yk8tFo@<7yiSL|O(+B;(qQ zmEkp5E7w#KGHnf4te@B|%^C#DYf_N)HS5X(n`BvGlW3OM40&i-gN8w4GrVY(O;?nx zJ6d7Xg{d$xTvLWx#*}Zwl{Ix`R+h1VGz^yJKtM({N}pM`Q}|>ElC4RySb~)}=F#iM zbc-bwdY-FNh7%QiS2mEDMW;OaCSF-ai~dNp9Vcx{8{L#bOr#XDO=$w#l#-trf2Dxj z1RCSh^id?nIB~2T6~r1g&MRP4bB)mzc5`h7suX_g;wg(1$z@j_d?$P3u&4?j_dvS> zcl{{83D-(Yt_X$=-b7-I`D=@kUA#Gx&@?k9?jze+#td;K0wJ$Ne#jvM9P}{fx;Md* zxCb)d!mZSdw`h`XZzV^f8;5Jmm=Y@I!tqUnK-ux!!MiS@2<5bwd%*^nk@DrH?jw=xR23kPX_`!L78fgA48JRNH+Wfwb>7#(fWiAZh}-PzAZk7vl#&0t_AI#(Lx=ZuxR7LffK_B)2bBbi zK=yU2X$-gfI>yKD>lhabniG$qQzC;zrV;W5iFb2YvRX7daGqsfhdu4Sj;U(d*D(?B zebfM0u=_eFQr_1g^N$TfB$JLdWhGh2n~fc+7&<QpOZuEfy$ZKZjc>ZS@$J-Rm(fbOSn1)OwoT9^+-Ud#ZWC z!HYOLPLvdR;Yzj&8UeZGP|+Z5_yl1S0I``s=ZbogVm5zJquh>@lgTD9FLTW*nPQ(Q57C4LAIT! zBg6jZqm!PZDw1ywzQ zub>9bO=V(Pjg6`%5mlWm>ngB-G((|pVnz50iH;72oL&JdS6>Tm;YZDYA zQ;aq>>v+E^*bu@3CRC3#qB(xiI1*D3`z>k6QQwoWD#>oWpxAD_{Pbr-ZJc-yXiC`L4gKci&>Uju}mu+(n*vjB|~r9c^reS>W%Y{gq8ji78Hmz9TtO_<2QBP|i3avSpY%|&j zMEW4xfJv4hNEB_%FI*x}CehG(Q%Y=7Vo87wjg4Q|&y)xnE7uG8K?!R{j}om-$u6aC zfF-xtVxCxo#WyegM35liGTMZBI!ZXj=7Yy-YR(C6DiD|i6AUM&k`uu*6>Tz3EU&bq z5J{3}j3y?aGE8E^(6?;6yfWd9TSO6(H)U1Gt?3L6Zm_{dXU7SgLMB_taWyRLYP15P~i#Y+jnSxZZE*}Jp=hct_mM|qwQun&l33)L>JJQA9# zG%;~-)YzJmEfOAHsv_lhz{$yGkwy*E`PgZD>}uR5?F3Iu(9|nJ5$f!CSi+AHc*}xZ zXv#7Vl4pf%;;<-%N^})(;4!VG$7QuJlSv=D$Gq_@j!JC2(iRB&aH>T%`#-=~@VGZn zQ%>A~_HH&BSu1e^?YYv{HU|{)-hdG$aYG2R6}Cz7oH|iWRj6$8r&}=lR5iNgMxv+O z$my0FZ_!g1t-{b0sv%niyHRk}cv1p~n{+r5DS<3WzY=$s!4QL~C)?QA7p|^c$4e*L zX2MqU#L$|=Mr}fr#%$cYFPjjPyd+N7(?l%c(7tR!^xS9mn8~LxREbI?$?UHinJYb9 zTV7Wo_GCral_yrvGYOPt1o`Ko0fM(nMNmVAV@o>JfTtG|BZ$dN@Q`=|1Xoh>C?xJl z3QN>#>o_EO&N30LS9BYKb;u!_wsF_k=^lb$fNOppvL5bz81=0mT2lf3@2 z6bAOSXv-tnhTGTWERTwQsR@REE|$WH%I_C1SA3)V9&xqeom~b*6sPYL(r1I>pUZo_ zUsrsv=(j3v-|4$War?W~dlVll;k=>v7~!9IIF*G>Pqs-emjm%ZqG!)TvE}w_`TgQk z2;gJ+^-?}(_QD$#kBWX&^UF*^ZqQunw^w{$+G(V!kvHE?aVQGDH zuBMw``@7QFO8-VFA9Eh2(WkJ?`7A!4J#WH>Un2!yslus|`udLI>qXz3C+Vigw*Nu> z5E(u;{2xhrZcyBozdi53>f3&Co7R`|KP5Fe{F@~FbGmU;j~8|0CPTTs@Fl(QU^i~U zKfix+dNxaY$X49`KKOjaZ8nt(HvD4; zxcQ|zTc2j!PbwY|K1i;lOMkXsU+v*kBeq@Ha{+97uv!|z4S%$U zQ#eN%HQy8u_v+{M!V5jz8_p^Z_lDEp;iPYW@AwZM?$v+5!%6>P$=3l7_v*jr;iPZQ zFZ1~Z4>K7g=G8yi!^!U<2|v%nz50b7PWqc=o>=AKUi}6SC;jh=eyfLj^>6ZU(zoZS z{Mp03`sR1gO*$E~?C(}z;NhfywzS*Ty>Rn; z;oZaUKLR)7Lt)dO?T<$*{-o4Py5fHqo}u_F!lx^4fB$-(;_r%nsp20A4=Mh+@LI+D z$#`_N;)8{MdNk$M&99Bu{63}2?fmi5$YlMn#CvkO%f0n=dM|uwFTA`LeswRrxflMe zUby)^05@ND{=KUg{p%DsIEyrnsFq z_bP6~e^GI}F8f?@8*e}Pez(n+4QH_8HebgmZqu16-@mru*m{|vxYeJnxD9{4;x;`c zire%rSKNkQrnoJ))r#BjBZ}K{+pM^a_eRBSIJYQn^L3lzHl4Zhy=E#m`m^hq%d*^d zOYQSsvD;TFZr67Wia%uSe8ug$c!%OoivF{T|6TY$6}S3BvXj&KsOX=exJ}Pu#qB!u zau26+u;c0)52tdl_WU)POF#OR;?|yjPxH&nx@>F?0>#I+TU*XfFT6l;TRw{vx8Yo- zxUH{MiraEqr?}ORDsIdF_qlHRDG!5<)Ayj_cD~-GxJ-Y(-HO|J{8`11mGIwC+|KWD z#Yc<&M~d5d|1-r;75xEojX-&#KWh&RReZeYpP;y%uTNEcqUdKRZtaKj6qo71m#w(9 zE9NOK-P~8AxV1NyDQPNDN>&Eq#Rxlf6McP z?^Arf@VMgn!Vf84AiPuYBH_MNBiMLLgr_OKMEEepFA+XU@ymp#D_$vlyy7*&Cn;Vp ze5&GWg=Z_iQMjY{CgFvOUoYJ5BiVAeLHK1#|J%Z=6u0}W^@{&Q^w%nWr|^x6|3>&` z#qSY*qv8(>zeVvj;kPONnDAdJzDxMsitiQvfZ{I+->Ue2;X4(7Pxv0iKNkLi;xdi+ z_9;GyDhQvr;`Y4rLyFt;&N~%PoOj;eglFsBo_C(6_~{bwFvZUlK1y+W-g&y>_Pq1) zire$fCn*{o_Pq0Y z#qD|LYZbTWoo`g!o_D@kaeLnRjf&gz&TmotfaLc!#qD|Lzf|0wcYe3x_Pp~46u0M{ zZ&lo$cfM2c(`oX=XOH6cyz>_n&ldfCiq91uS3Ds6kmB~d^G?MR=bg(wu&rNv-g%nh z_Pq09ire$fM=5U4J5N{Ko_9W8aeLnRB*pD{=TjB8&u_97x96QZire$f3l+D|dzL6} z&pW?NaeLl*mE!M8`PVCM&pWs0zS(lN=bdj<`u4o@&5GOe&TmxwOftstxkYh%-uZ2c z+viWeRNS6-ez)TG`O^c6+w;!1DsIm^->LW(N#`EL?Rn=fC~nU?->0}eKQgYkJ@5RG z;%`g5or)*UJ5Mv^XY0kDcb=xWJ@0&&;$y_F8l|{B?>t>`d*1nY#qD|LlN7h-oljM~ zM&iv@yh*sD_(tLQ(gD6_8!E#!f;Ua+T4kk%a7}1pgkL~o5igH~@D2pNefod@Nk0ZgcZ_5VKs0s+JcxS^s(0Rk4sxy0!qLgYn8fzxDCb)trFbwd!2L7o%efA679F&-{bSwXC9B_ zeeUy~_uZFs?|Zu{KQL!NN{Y|^QhYOguFF!NZ`y8G&So*&H`JHrb7JGk<#cWyN{6XE zPUkkCFCAdZK!AeIEhq6|a}R!nQ+N1N3u2v4EEUjK*#28qH7=)pqj8NOKc|ybC@Fl!)E_29ZrnnjxU_; z^To&KLaTKKMdXVdk8n(IoqT9NhcGgEC=UMA__@eE!idarTDy;nY2 z;cs0FFQ?tKlGvb~A_iio?{s>$I5F1T_sKUsJx-fxA6&hWl}=l_v-3SC^NXf(r>!x~ z*|4K!s1xIg>>A|6E=BP?S1_@=ptXB+)1*LqU|L#1YdozmwxwX_-on_(K-+PYhQinq z$gZ(y45>IOPVh{{^%!UgETFOLKa5biLtpcKEmqOe2Ky*`hkOWZ|NC1lqws z+mJt&~&9|sKg<*+vpmPYqYH=3D(W%hfI)W(uNT$;^ zx7*nnM~#neIo&xhw;OTzT2A6K7ddUS;tNQ-Eo&U5J?_9kxk&H2XRDM~;nd9m(-H#h zT<-;$+nZ0A*LHY^llfB9NC;aXG^a_o+gi}Gx$9M`ABQ@`9(1qnl*rNeKOk}#{tt|d z!2iJ!;zJ@xeC!*i^_}iT4r*)@#xI-jbH&3sFvlc$ysf{h5BjowzUCurMaHt8aeC~y zVpEO0`=d0TqBdp7vHEReo^fKYQ>2NopKw~|cc(ZpRGcLEP);g}35hJ|x`(RmbWWW) zvF*yV_!zjmZX};k%4a~5J3YP(9c5o7!L}ov4bNY8iqkef9p#FW^ta9fFUcuhctP8` zZKLCzP`x;3@e(Ss3UB$e%F(|GloSr8N zGM|eKp4XPOrE6dy*5hP;*_`dPomCL~v|wkKb6^`amBO7~LP}gL;hf3NZ8SJePpBrwZ}bF= zLZ%0HZlT795nD#@PM##-Ml0*sGjQvog&4kR8j4T&0!0{fV$+-$MxfU1Dex$&t%l3iXRuKy1L0;|G4r*;^eoS32-N~F58H~Xwz3XEdlD00A_K%2?lYKNN z8|k6m(CzpiOn2HFQA zA33pNw6#Gvx{)F`=Q-_HrR?J_Cv(ws9z56OSj(biK^ckz1<58#qCNRwm-thcp^N*j zJgW}_XX<8~LjQw2y@ngscgXaVYPMtdk;RP-Uaz^PswM&={v@t8?|2 zUm)pM4C?x8*Q3scS5PXkcQH%FPo+{cCN!6dSkrEi#RpS-VsIn+19Sqlk`hEym~~+! z&BW04cKlU%W!1L~-8N{8F*z)^hZ1BI5{#VUP_rk`9H_aiRXo}7_m99<0!BjC=VHtOHrggAHt~p_`w7}EYWNOJ0UZ596d3%P zDH&;$jEOC&@r?)zb^~jyBN^kan_pf#SS!dEnS+$3MvC!&fIs>q)F7q!qbsRf!7}nk zUp8!zKf1?AgZ2-H=1GO z{_!nTnN-YaF(mgIcB_`%9Y?1%+||4Vpvgdbq!nP(_p>ROl1b`oA@3Z%N0t2HM6J zw0_kS!6NFbZzAKm^7=cO234u1eu5wVof=g2NTx9;vS@9QQPN+0ro5Mw(DJ!$-IHnY zkI`R{_9Zk*{Po++#I^70yE(UaQ-PU#v$ zHquef)aS97qZZ~I*uQ?u6nJht45p84Y_x8kUCQ|U z(Y+j7H@fC7Bc+;w41EqA_c6oJng3`cboGagl;YoTCrM%nwv7(7Er&&87aarq8*aeZ z;Y{cJ_@j@Lu61;J9XtDz|U3xOn@)5vf( zK3o*kS`gbtbUZWy6z35UT85=YP)NJ?tp!FqPmTE90QObVJZ&dKZ`i7AQzF@X?vd`f zXk#D7$Kd>BUD)|y69mz~VhO}PiFbdB$S?tTf=-MLX-->lT1jaj_HO(XuFh>iC-z?a zhd2di2kG=j`a0d%|7{Mkd@!|Tc%m8juy&9EtL^M@@v|tL*2mJ^avJTH(=<+XHO2`{ z!IW5vnMTv(l=AAJk2*?Pwa|iLUp`_>lnHXSHm$_Yew?e0PpC3bvRr(pBvhwS+humB zskP_1hj+cc?>PwG)Fe((RWcw_<;3>!;OZpG7EJ;JuIV6wHVm+~flMpI8kuU0ObV=z zmz81Dh4cSJd>+z>ZG&Z94>+->sakHNRuSvmmk-@U^l6l0G_e9RLl<;*P_w4Gh*a{D z0*kXY#E<&19TYAb{}e=@Q$o8Gl!&)6(+6pTZ%J`UPDvoPEq=v*YA~B~mMmG!3B}&z zGx3!SJD}F}LsILEPnkqpZkvPgQ&{LgJ1?VvDb+8t?XxXsNf4}rDmD-2=PX$Uf48zP z2E&3aXUSsP3~PO(+lkerTd^%O&=x}aKMcfnIITUYk=dNTtVP)9ax+EiC(7)UrKNE{ z2e)nU64bUd(6tCaG@P`qhcWyib^8v&LgM-^NR+6jLK8(do!60(F(sx|{F#k6Y^$L! zBem$uf9gU3Jhks$Gu0Wx-!`wa5<$Do>lhPIGY7=s&|Xq%x0{JTVpy*BMvzad%LNTnTxP(nuueX6MN2W4Jil^ooew?)f_~nIIZhJ zo(-Sf_a4^gly$K?{n7a}i?BI+sgW@6{nkjB3qLXvis%@cTTp@iXugrs{n3b#M*5?_ zG!o|4=Zyrj_d_G4`J>+$X{bNyAIzZ)^G7EdX}CW+*GPx>qxTqTgg-hQ1}|be6uw6C zBVHqo@<$ttbeKPSoso|6M|T?OaG2X^eC`qc=!r%;(jRqN>?LVyN~uqPd3sq z{^)We9qW(&$Vg-S(Z3k!IDhn2BOULLeqp2&{L%5SOAtziKf1_BC!#crga!E&SY_}X z>yK6#X`DZLjgiLtqrWiH$^Pghy6Vx|eTqLi-AGv6-)AH&u1<&b2j5fu(O(L=;anq4^GB~Y()oz@FxH!n92qIgAAQA0GyKtyjg*Phk7B)<{^-|6 zn&poUKAc&$KRVk;IsRzSggo0Hz1B#%{%Fkj=J}(YhUNRCsV0;;{^(7H&Gkp$GJ1|b z`XWXElu!ZM5c({n3$SFv79ym1{^(@v>Ol(lqcuh<^ha+u(tP+H!@foSXxCVliv7{Q zk7KFCADu9srBZ)1_hgpJ{Lx2^RPK+yVB%N+OVWh0&>!7mq(%Pd;U>Jr{^)ClE%8Td zkL6I7`lDAEX_-ITIELAU{^-3%x(Kyuq>KI06&QAr`XCmZMq2KV{_J>WA%FBVBUK<| zBUSpNStqb>l|Op7k;4Ay5gE*?v3xhu3iMDTtwg&zk$r1$naN0(_@hr4X%&{YMyf?W z--m&uwY$zA{Rc^2gKO#zo^WtwZ4V7mY%Rkk=;$8kq;zz>>BOFme}i+pMx|FL*1@MA z$N!J%Ban#{$bo-QI1k!zuvAF#VPGdib95i)_*(p!;FW1lvpDU zjtqlA694%J*y%ll@T5hr-e>766y&sbiBF^b zKr%UDjJk#-mizBfZ&~f!GUfk_7YtgJrq#~ux*c> zgMopR&iJ0U`--)nZj~Hd{Ej})wQa`dj}9{HoW7ejE(s^~^~?@`^lxT+ud?Xhs8g{$?Rw;LdzN)DZ&4gmRwqvOPRx-`&jI`cn7s4Sl$;0BN+(= zvhGErF|F(8XoN5dxG_?~uz_y^;+W91(w*reTlNOpv(p0Y1-PF7eB|kzO}?D-Q(B(J z#he0M4e5EJE3R@&BQ(_k?apA)v*fM5s=-vg4ANuz2qClMN{sOxU9VFEI^y3A;|e#7 zop1J?j@E8iisz8skHW(Ir&a(eX=c!Xbvy81(Ss%X3QYHYM_u%7TE$_YI0!TOeo}2c z2s8Q4Z#(Hpw>bw6Qu}=5js6Sj*EB@? zHylOFo&LrrQ&vVZ`oV#3(Nw*h$IDd@1Ggbp-{W=luJ*3dM2MeS&$6Z@_$ z=)t&tzqJd)9hRWx2$>t9x z+xIcY3>wENr6lHIHzYCY$VI=^d#IMSVV7!m{BLHLs?%wUj7y7O$Ub@F(vp(-U@(5% zzZH3r8+jV0$!BdDeYV?809{PNmNV@=j3O0I#|x~W)A3)y_zz$_e^((S59_8#Vuy_5 z8Y^&9Gz~Wcn2Vs*COOyyAD13q;z`?sm_4w?`4}orr{#BxzbhGt80CMCCqf(F=daT? z)MHfs=wtC>iY2MQAD15b-BHAL+fas4D7{bURTxOqRNHJzsNG@6y1QXr{MqXag2^|euF@$%U7C-AHYWI&jv5S0x z_Ci?13+%~fcuvMy#$xmb+85E?d68H1Hx0<&h#NDu@Lay5>%EJdSUi!8q=fexyp*;q|M<3b6*rXlAK_HTHLym~sFo^5n<-QJ{7&FE?FKS5Sz zZ5x6D{RX#=kO?siyR}q4WJ&b8j`QrsqoC9B4&AXb*y(w8+mK0QAx%8Eh(`n}mN74K z^TT~4D8Y8zKY}ce%-b|1Z{q+?&lXA#EYw|n=a|erNrF7K#EwD?FPYXGd(qkOdE^iWHxE;=J3pmR%aKpdIyA{!I@z@N)Lng7NTPWS@o)Iihtj+->|)`#aTDD8F2ldRf<(^O zZAZjB7gLRmc3MA5!&MyI_WBeLnA?K5B)x-1(!LBMx&`%LtV9|hVxRB^`?pnM@8UMO zr+e8wEmx|vk9otHxIGa2q98V;fR_C2>->negRzNEKz`O#Fl|tkCTgFn?H1TwcNn{j9rXKKys`P7z}WNY3|8 zj^5x^mk7|J0>-m^x9A;)6urSPppj!WW$at*EwzFJ1zQ!elCsJ@pU1k70Cquy$#CDmY z;b$NoqcCD*6}y==4YXJqYVTug62;=Z@wzP!bz`^NxOpRyzIYVY2U1FwFF&htAB@DV zeb%n*?|3m1gG)O|)<;}JZX>4Uf;XX_5tWw`$$p6%>!%|pZ#?!r2*jx=AwQIwZtG`R%SAn6HYv?q{5aIV{w|L=N! z{8_WP``sDNMl(%HkCb52W~_`uZrl2QNZC0$W!wt&_;U@noc=lxTKa~~YZst^lDZd# zgp!WIB!JQU?i0L-EQp;xuAm)jcWl4l1k$nNY9c>e05YdYjai*U^MkF^-?S&UOs54h zyVne)ht@nTy05auvSltzBJN?m`=#(eQb#n&rsiOKEO*U)&y(%BwZA@SIjsz^#Go65 zJo)j=)L0XJ9)Hob`n+B|wfG;TM5pjgA!ezzaR?7!Ka>u%1bd=u zFBX_s-t#UV-QGCOvqwiO30n0`!(A!w#Mj|E7ww_&`hA!2S)A4d({?-d1gM=+Z5Xk0 zG`dav?(H;W_-GDtIdGrL^dVqb`;$Ko@fhVoHlY8d`j|$yk8v7`ICv~XSJ+qwl@~xxE@@_jH+lnRe zH^3>&sV!JfeuP3OiQoP-A+pLlOXB~*j#!G*gXOfR#Zt6^*zzRiiIsK=`broj z2ECGkGyCh-y67o~nL60-NwEItHf-(g`)~a7B*qpNc6s7QKh^iTpufU=hOW$Ty`nG| z1=>!*#wxWndYp=`>n@RaaCIZVw|l`Z<_1r-Pj_RL#=np2Rr~}eH~p4FWE-L|_EguO z@nC2%??68jzxGM$$~oxE9pv@%AZ*Oi_;=#%m?KQISWrKWXBPg=XwOQH_5>X*#dTsLu2(273{P$rlZP=}Nsu85 z||`?lj> z9}T~+KJ*zjQ%%DTY#oie=$y7p8Y{ZZSTTaG@_kf5_mF;sA-I6nT4sd$Zeytbk?Cq1 zryUM9A-4WHKK0gBh`T@k*w%hp-@nofjzPet$@OjqSZ1c9THm66)Y*yum^j|SfJjR# zUQx9^mhRMSCJR-r^YU(D_G~}h6&^_0Om-`$n bOO|I@v-!lA@-gN1bt%6GzvLN5 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 z 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 diff --git a/asm/uncommonlisp.s b/asm/uncommonlisp.s index 1d82b9a..d4dd72b 100644 --- a/asm/uncommonlisp.s +++ b/asm/uncommonlisp.s @@ -195,7 +195,9 @@ .ifdef GC_NAIVE .equ BI_GC_COLLECT, 108 .equ BI_GC_STATS, 109 -.equ BI_COUNT, 110 +.equ BI_WITH_ARENA, 110 +.equ BI_ARENA_STATS, 111 +.equ BI_COUNT, 112 .else .equ BI_COUNT, 108 .endif @@ -335,6 +337,8 @@ bn_hslist: .byte 14; .ascii "hash-set->list" .ifdef GC_NAIVE bn_gccollect: .byte 10; .ascii "gc-collect" bn_gcstats: .byte 8; .ascii "gc-stats" +bn_witharena: .byte 10; .ascii "with-arena" +bn_arenastats: .byte 11; .ascii "arena-stats" .endif s_hashtable: .ascii "#" @@ -379,7 +383,7 @@ bi_names: .quad bn_htexists, bn_htsize, bn_htkeys, bn_htvals, bn_htalist .quad bn_hsmake, bn_hsp, bn_hsadd, bn_hshas, bn_hssize, bn_hslist .ifdef GC_NAIVE - .quad bn_gccollect, bn_gcstats + .quad bn_gccollect, bn_gcstats, bn_witharena, bn_arenastats .endif # Error messages @@ -462,6 +466,16 @@ gc_mark_stack: .skip 131072 # 16K * 8 gc_mark_depth: .skip 8 gc_collections: .skip 8 # counter for --gc-stat gc_live_bytes: .skip 8 # updated at end of sweep +# ── Arena (meta-GC scope) ── +# When arena_active != 0, heap_alloc bypasses the free list and +# bumps only, so gc_free_list's chain stays pristine across the +# arena body and can be restored verbatim on a successful reset. +arena_active: .skip 8 +arena_r15_snap: .skip 8 +arena_calls: .skip 8 +arena_resets: .skip 8 +arena_escapes: .skip 8 +arena_bytes_reclaimed: .skip 8 .endif # ============================================================ @@ -643,6 +657,10 @@ heap_alloc: pushq %r12 movq %rdi, %rbx # size (callee-save register for this function) + # Arena mode: skip free-list reuse so the chain stays valid + # for a verbatim restore at (with-arena) exit. + cmpq $0, arena_active(%rip) + jne .ha_bump movq %rbx, %rdi call gc_freelist_alloc testq %rax, %rax @@ -804,6 +822,11 @@ gc_freelist_alloc: # chunk linearly using each block's size-header and rebuilds the # free list. gc_collect: + # Any in-flight arena is now aborted: once GC runs, the snapshot + # is stale (free list rebuilt, blocks may have moved off/on the + # chain). with-arena's exit will see arena_active=0 and skip + # the reset attempt. + movq $0, arena_active(%rip) # Save all general-purpose registers so the stack scan catches # tagged values that were live in registers at GC entry. pushq %rax @@ -3296,6 +3319,10 @@ eval_list: je bi_gc_collect_user cmpq $BI_GC_STATS, %rax je bi_gc_stats + cmpq $BI_WITH_ARENA, %rax + je bi_with_arena + cmpq $BI_ARENA_STATS, %rax + je bi_arena_stats .endif movq $VAL_VOID, %rax @@ -5961,6 +5988,249 @@ bi_hash_set_to_list: movq %r12, %rax RET_VAL +.ifdef GC_NAIVE +# ============================================================ +# Meta-GC: arena (fast bulk-free) + verifier-gated reset. +# +# (with-arena thunk) — calls thunk with no args, then attempts +# to reset %r15 to where it was at arena entry. Succeeds iff: +# (a) no implicit GC fired during the thunk (that would have +# rebuilt the free list and invalidated the snapshot), AND +# (b) verifier's mark phase finds no live block above the +# snapshot's %r15 after adding the thunk's return value as +# an extra root. +# On success: bulk-reset, bytes freed = (pre_r15 - snap_r15). +# On failure: fall through to the existing naive mark-sweep. +# +# Free-list reuse is disabled while arena_active != 0 so the chain +# stays pristine for a verbatim restore; heap_alloc enforces this. +# ============================================================ + +# bi_with_arena: (with-arena thunk) -> thunk's return value +bi_with_arena: + GETARG %rbx # thunk + # Snapshot. + movq %r15, %rax + movq %rax, arena_r15_snap(%rip) + movq $1, arena_active(%rip) + incq arena_calls(%rip) + # Invoke thunk with no args. + movq %rbx, %rdi + movq $VAL_NIL, %rsi + call apply_proc_raw + movq %rax, %rbx # result (tagged) + # Zero every volatile register before verify's stack scan runs. + # apply_proc_raw leaves stale tagged pointers in callee registers + # (closure envs, intermediate pair chains) that the conservative + # scan would otherwise treat as live roots pointing into the + # arena, triggering a false escape. %rbx keeps the result. + xorq %rax, %rax + xorq %rcx, %rcx + xorq %rdx, %rdx + xorq %rsi, %rsi + xorq %rdi, %rdi + xorq %rbp, %rbp + xorq %r8, %r8 + xorq %r9, %r9 + xorq %r10, %r10 + xorq %r11, %r11 + xorq %r12, %r12 + # If an implicit GC fired during the thunk, arena_active was + # cleared and the snapshot is now stale. Skip reset. + cmpq $0, arena_active(%rip) + je .bwa_abort_gc + # Verify: mark phase with result as extra root. Then scan the + # arena range for any marked block; if any, it escaped. + movq %rbx, %rdi + call arena_verify_and_commit + movq %rbx, %rax + RET_VAL +.bwa_abort_gc: + incq arena_escapes(%rip) + movq %rbx, %rax + RET_VAL + +# bi_arena_stats: (arena-stats) -> (list calls resets escapes bytes-reclaimed) +bi_arena_stats: + # Build right-to-left: NIL -> (bytes) -> (escapes bytes) -> ... + movq arena_bytes_reclaimed(%rip), %rdi + call make_int + movq %rax, %rdi + movq $VAL_NIL, %rsi + call make_pair # (bytes) + movq %rax, %rbx + movq arena_escapes(%rip), %rdi + call make_int + movq %rax, %rdi + movq %rbx, %rsi + call make_pair # (escapes bytes) + movq %rax, %rbx + movq arena_resets(%rip), %rdi + call make_int + movq %rax, %rdi + movq %rbx, %rsi + call make_pair # (resets escapes bytes) + movq %rax, %rbx + movq arena_calls(%rip), %rdi + call make_int + movq %rax, %rdi + movq %rbx, %rsi + call make_pair # (calls resets escapes bytes) + RET_VAL + +# arena_verify_and_commit: %rdi = thunk result (tagged). +# Runs mark phase, detects escape, commits reset or falls through +# to naive sweep. Updates arena_resets / arena_escapes counters. +arena_verify_and_commit: + pushq %rax + pushq %rbx + pushq %rcx + pushq %rdx + pushq %rsi + pushq %rdi + pushq %rbp + pushq %r8 + pushq %r9 + pushq %r10 + pushq %r11 + pushq %r12 + movq %rdi, %r12 # stash result across calls + # Clear mark stack. + movq $0, gc_mark_depth(%rip) + # Root 1: global env. + movq %r14, %rdi + call gc_mark_env + # Root 2: sym_else_val. + movq sym_else_val(%rip), %rdi + call gc_push_if_heap + # Root 3: sym_table. + movq sym_count(%rip), %rcx + leaq sym_table(%rip), %rsi +.avc_r_sym: + testq %rcx, %rcx + jz .avc_r_sym_done + pushq %rcx + pushq %rsi + movq (%rsi), %rdi + testq %rdi, %rdi + jz 1f + call gc_mark_untagged +1: + popq %rsi + popq %rcx + addq $8, %rsi + decq %rcx + jmp .avc_r_sym +.avc_r_sym_done: + # Root 4: sym_hash_buckets. + movq $SYM_HASH_SIZE, %rcx + leaq sym_hash_buckets(%rip), %rsi +.avc_r_bkt: + testq %rcx, %rcx + jz .avc_r_bkt_done + movq (%rsi), %rdi +.avc_r_chain: + testq %rdi, %rdi + jz .avc_r_bkt_next + pushq %rcx + pushq %rsi + pushq %rdi + call gc_mark_untagged + popq %rdi + movq (%rdi), %r8 + pushq %rdi + testq %r8, %r8 + jz 2f + movq %r8, %rdi + call gc_mark_untagged +2: + popq %rdi + movq 8(%rdi), %rdi + popq %rsi + popq %rcx + jmp .avc_r_chain +.avc_r_bkt_next: + addq $8, %rsi + decq %rcx + jmp .avc_r_bkt +.avc_r_bkt_done: + # Root 5: stack scan (two tries per word: tagged then env-walk). + movq %rsp, %rsi + movq stack_top(%rip), %rdx +.avc_r_stk: + cmpq %rdx, %rsi + jae .avc_r_stk_done + pushq %rsi + pushq %rdx + movq (%rsi), %rdi + call gc_push_if_heap + popq %rdx + popq %rsi + pushq %rsi + pushq %rdx + movq (%rsi), %rdi + call gc_mark_env + popq %rdx + popq %rsi + addq $8, %rsi + jmp .avc_r_stk +.avc_r_stk_done: + # Root 6 (extra): thunk result. + movq %r12, %rdi + call gc_push_if_heap + # Drain mark stack. + call gc_mark_drain + # Now scan the arena range for any marked block. We only allow + # single-chunk arenas (enforced because heap_grow clears arena), + # so snapshot and current %r15 share a chunk. Walk from + # arena_r15_snap up to %r15 by block headers. + movq arena_r15_snap(%rip), %rbx +.avc_scan: + cmpq %r15, %rbx + jae .avc_safe + movq (%rbx), %rax + testq $1, %rax + jnz .avc_escape + shrq $1, %rax + leaq 8(%rbx,%rax), %rbx + jmp .avc_scan +.avc_safe: + # Commit the reset: bulk-free everything above the snapshot. + movq %r15, %rax + subq arena_r15_snap(%rip), %rax + addq %rax, arena_bytes_reclaimed(%rip) + movq arena_r15_snap(%rip), %rax + movq %rax, %r15 + movq $0, arena_active(%rip) + incq arena_resets(%rip) + # Now run sweep to clean mark bits on pre-snapshot live blocks + # and rebuild the free list from anything below that became dead + # during the arena (nothing, currently, since we disabled free + # list reuse — but sweep is still the easiest way to clear marks). + call gc_sweep + jmp .avc_done +.avc_escape: + movq $0, arena_active(%rip) + incq arena_escapes(%rip) + # Fall through to naive sweep on the full range, which also + # clears mark bits set during verify. + call gc_sweep +.avc_done: + popq %r12 + popq %r11 + popq %r10 + popq %r9 + popq %r8 + popq %rbp + popq %rdi + popq %rsi + popq %rdx + popq %rcx + popq %rbx + popq %rax + ret +.endif + # bi_current_time_ms: (current-time-ms) → int ms since epoch # struct timespec is { int64_t tv_sec; int64_t tv_nsec; } — 16 bytes. bi_current_time_ms: diff --git a/examples/bench-gc-arena.lsp b/examples/bench-gc-arena.lsp new file mode 100644 index 0000000..c15160a --- /dev/null +++ b/examples/bench-gc-arena.lsp @@ -0,0 +1,55 @@ +;;; bench-gc-arena.lsp — arena (meta-GC fast path) vs naive sweep on +;;; the same transient-allocation workload. Runs inside the GC build +;;; only, since with-arena and arena-stats are GC-build primitives. +;;; +;;; Phase A runs the workload WITHOUT wrapping it — every iteration +;;; triggers a naive mark-sweep when the heap fills. +;;; +;;; Phase B runs the same body inside (with-arena thunk) — each +;;; arena exit attempts an O(1) bulk reset; if the verifier sees no +;;; escape, the body's allocations never hit the mark phase. + +(define K 200) +(define N 2000) + +(define (build-list k acc) + (if (= k 0) acc (build-list (- k 1) (cons k acc)))) + +(define (sum-list lst acc) + (if (null? lst) acc (sum-list (cdr lst) (+ acc (car lst))))) + +;;; ── Phase A: naive sweep only ── +(define total-a 0) +(define i 0) +(define (step-a) + (if (>= i N) total-a + (begin + (set! total-a (+ total-a (sum-list (build-list K '()) 0))) + (set! i (+ i 1)) + (step-a)))) + +(display "=== Phase A: naive sweep (no arena) ===") (newline) +(define t0 (current-time-ms)) +(display "result=") (display (step-a)) (newline) +(display "time_ms=") (display (- (current-time-ms) t0)) (newline) +(display "gc-stats=") (display (gc-stats)) (newline) +(display "arena-stats=") (display (arena-stats)) (newline) + +;;; ── Phase B: each iteration wrapped in an arena ── +(define total-b 0) +(define j 0) +(define (iter-body) (sum-list (build-list K '()) 0)) +(define (step-b) + (if (>= j N) total-b + (begin + (set! total-b (+ total-b (with-arena iter-body))) + (set! j (+ j 1)) + (step-b)))) + +(display "") (newline) +(display "=== Phase B: arena-wrapped (meta-GC fast path) ===") (newline) +(set! t0 (current-time-ms)) +(display "result=") (display (step-b)) (newline) +(display "time_ms=") (display (- (current-time-ms) t0)) (newline) +(display "gc-stats=") (display (gc-stats)) (newline) +(display "arena-stats=") (display (arena-stats)) (newline) diff --git a/tests/bench-gc-arena.sh b/tests/bench-gc-arena.sh new file mode 100755 index 0000000..7df86d6 --- /dev/null +++ b/tests/bench-gc-arena.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# bench-gc-arena.sh — arena (meta-GC) vs naive sweep on the same +# transient-allocation workload. RSS is sampled by an external +# watcher. Both phases run in the same process so their stats +# counters reflect a single interpreter's behavior. +set -e +cd "$(dirname "$0")/.." + +ulimit -v 524288 +trap 'pkill -9 -u "$USER" -f "asm/uncommonlisp" 2>/dev/null || true' EXIT + +make -s -C asm all + +echo "== asm (naive GC, with arena as meta fast path) ==" +./asm/uncommonlisp-gc < examples/bench-gc-arena.lsp & +pid=$! +peak=0 +while kill -0 "$pid" 2>/dev/null; do + rss=$(awk '/^VmRSS:/ {print $2}' /proc/$pid/status 2>/dev/null || echo 0) + [ -n "$rss" ] && [ "$rss" -gt "$peak" ] && peak=$rss + sleep 0.05 +done +wait "$pid" || true +echo "" +echo "peak_rss_kb=$peak" + +if pgrep -u "$USER" -f 'asm/uncommonlisp' > /dev/null; then + echo "STRAGGLER" >&2 + exit 1 +fi