From 14467475b033a15001ec8527dab004183f8deba2 Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Fri, 13 Nov 2026 18:34:52 +0600 Subject: [PATCH] stage: IEM HD v8 candidate files (v7 remains in src/profiles) --- stage/iem-hd-v8/EDX_HD.eel | 141 +++++++++++++++++++++++++++++++++++++ stage/iem-hd-v8/EDX_HD.irs | Bin 0 -> 21756 bytes stage/iem-hd-v8/EDX_HD.vdc | 2 + 3 files changed, 143 insertions(+) create mode 100644 stage/iem-hd-v8/EDX_HD.eel create mode 100644 stage/iem-hd-v8/EDX_HD.irs create mode 100644 stage/iem-hd-v8/EDX_HD.vdc diff --git a/stage/iem-hd-v8/EDX_HD.eel b/stage/iem-hd-v8/EDX_HD.eel new file mode 100644 index 0000000..cff796d --- /dev/null +++ b/stage/iem-hd-v8/EDX_HD.eel @@ -0,0 +1,141 @@ +desc:HyperAudio IEM EDX HD v8 (NextGEN) +//tags: iem limiter true-peak tone-control + +preGain10:0<-120,60,1>Pre Gain tenths dB +ceilDb10:-15<-600,-3,1>Limiter Ceiling tenths dBFS +relMs:80<10,500,1>Limiter Release ms +tpDetect:1<0,1,1{Off,On}>True Peak Detect +bassDb:0<-6,6,1>Bass (dB) +trebDb:0<-6,6,1>Treble (dB) + +@init +// Explicit slider defaults for RootlessJamesDSP UI compatibility. +tpDetect = 1; +preGain10 = 0; +ceilDb10 = -15; +relMs = 80; +bassDb = 0; +trebDb = 0; +fs = srate > 0 ? srate : 48000; +pre_k = 1.0 - exp(-1.0 / (0.01 * fs)); preLin = 1.0; preTgt = 1.0; ceilLin = 0.841395; rel_k = 0.001; +prev_pre = -99999; prev_ceil = -99999; prev_rel = -99999; +dcR = exp(-2.0 * $PI * 2.0 / fs); dxL = 0; dyL = 0; dxR = 0; dyR = 0; + +// Tone control state +last_bass = -999; last_treb = -999; +bass_l = 0; bass_r = 0; treb_l = 0; treb_r = 0; +bass_k = 1.0 - exp(-2.0 * $PI * 150.0 / fs); +treb_k = 1.0 - exp(-2.0 * $PI * 4000.0 / fs); +tone_smooth_k = 1.0 - exp(-1.0 / (0.02 * fs)); +b_gain = 1.0; b_target = 1.0; +t_gain = 1.0; t_target = 1.0; + +// shared limiter core v7: 1.5 ms lookahead + 7 samples detector alignment, O(1) sliding minimum (monotonic deque), moving-average ramp, gated true-peak (16-tap Kaiser sinc, 4x) +L_D = max(2, min(500, floor(0.0015 * fs + 0.5))); +L_N = L_D + 1; L_cap = L_N + 1; L_NA = L_N + 7; +L_dlyL = 40000; L_dlyR = L_dlyL + L_NA; L_dqV = L_dlyR + L_NA; L_dqI = L_dqV + L_cap; L_eB = L_dqI + L_cap; +L_fadeLen = max(1, floor(0.05 * fs)); +L_i = 0; +loop(L_NA, L_dlyL[L_i] = 0; L_dlyR[L_i] = 0; L_i += 1; ); +L_i = 0; +loop(L_cap, L_dqV[L_i] = 1.0; L_dqI[L_i] = 0; L_i += 1; ); +L_i = 0; +loop(L_D, L_eB[L_i] = 1.0; L_i += 1; ); +L_w = 0; L_head = 0; L_tail = 0; L_t = 0; L_ew = 0; L_eprev = 1.0; L_esum = L_D; L_chk = 0; L_fadeN = 0; +isp_hot = 0; +ia0 = 0; ib0 = 0; +ia1 = 0; ib1 = 0; +ia2 = 0; ib2 = 0; +ia3 = 0; ib3 = 0; +ia4 = 0; ib4 = 0; +ia5 = 0; ib5 = 0; +ia6 = 0; ib6 = 0; +ia7 = 0; ib7 = 0; +ia8 = 0; ib8 = 0; +ia9 = 0; ib9 = 0; +ia10 = 0; ib10 = 0; +ia11 = 0; ib11 = 0; +ia12 = 0; ib12 = 0; +ia13 = 0; ib13 = 0; +ia14 = 0; ib14 = 0; +ia15 = 0; ib15 = 0; + +@sample +(preGain10 != prev_pre || ceilDb10 != prev_ceil || relMs != prev_rel) ? ( + prev_pre = preGain10; prev_ceil = ceilDb10; prev_rel = relMs; + preTgt = pow(10.0, preGain10 / 200.0); + ceilLin = pow(10.0, min(ceilDb10, -3) / 200.0); + rel_k = 1.0 - exp(-1.0 / (max(relMs, 10) * 0.001 * fs)); +); +preLin += (preTgt - preLin) * pre_k; +abs(spl0) < 1e6 ? 0 : (spl0 = 0.0); +abs(spl1) < 1e6 ? 0 : (spl1 = 0.0); + +l = spl0 * preLin; +r = spl1 * preLin; +// Tone controls: shelf states update every sample; output is bypassed exactly at 0 dB +(bassDb != last_bass || trebDb != last_treb) ? ( + last_bass = bassDb; last_treb = trebDb; + b_target = pow(10.0, bassDb / 20.0); + t_target = pow(10.0, trebDb / 20.0); +); +b_gain += (b_target - b_gain) * tone_smooth_k; +t_gain += (t_target - t_gain) * tone_smooth_k; +abs(b_target - b_gain) < 1e-6 ? ( b_gain = b_target; ); +abs(t_target - t_gain) < 1e-6 ? ( t_gain = t_target; ); +bass_l += (l - bass_l) * bass_k; bass_r += (r - bass_r) * bass_k; +b_gain != 1.0 ? ( l = l - bass_l + bass_l * b_gain; r = r - bass_r + bass_r * b_gain; ); +treb_l += (l - treb_l) * treb_k; treb_r += (r - treb_r) * treb_k; +t_gain != 1.0 ? ( l = treb_l + (l - treb_l) * t_gain; r = treb_r + (r - treb_r) * t_gain; ); +yl = l - dxL + dcR * dyL; dxL = l; dyL = yl; abs(dyL) < 1e-30 ? ( dyL = 0.0; ); l = yl; +yr = r - dxR + dcR * dyR; dxR = r; dyR = yr; abs(dyR) < 1e-30 ? ( dyR = 0.0; ); r = yr; + + + // ---- limiter core (input l,r; output spl0,spl1; needs ceilLin, rel_k) ---- + // true-peak (gated, unrolled, 16-tap Kaiser sinc): history shift + ia0 = ia1; ib0 = ib1; + ia1 = ia2; ib1 = ib2; + ia2 = ia3; ib2 = ib3; + ia3 = ia4; ib3 = ib4; + ia4 = ia5; ib4 = ib5; + ia5 = ia6; ib5 = ib6; + ia6 = ia7; ib6 = ib7; + ia7 = ia8; ib7 = ib8; + ia8 = ia9; ib8 = ib9; + ia9 = ia10; ib9 = ib10; + ia10 = ia11; ib10 = ib11; + ia11 = ia12; ib11 = ib12; + ia12 = ia13; ib12 = ib13; + ia13 = ia14; ib13 = ib14; + ia14 = ia15; ib14 = ib15; + ia15 = l; ib15 = r; + isp_pk = 0; + (tpDetect > 0 && max(abs(l), abs(r)) > ceilLin * 0.4) ? ( isp_hot = 16; ) : ( isp_hot -= 1; ); + isp_hot > 0 ? ( + isp_pk = max(isp_pk, abs((ia0 * -0.005102525 + ia1 * 0.010482265 + ia2 * -0.018833394 + ia3 * 0.031572326 + ia4 * -0.051661508 + ia5 * 0.087265300 + ia6 * -0.172996348 + ia7 * 0.900904607 + ia8 * 0.296268866 + ia9 * -0.118593909 + ia10 * 0.066546515 + ia11 * -0.040392769 + ia12 * 0.024525659 + ia13 * -0.014217483 + ia14 * 0.007482058 + ia15 * -0.003249660))); + isp_pk = max(isp_pk, abs((ia0 * -0.005825492 + ia1 * 0.012595005 + ia2 * -0.023220457 + ia3 * 0.039432255 + ia4 * -0.064636538 + ia5 * 0.107531911 + ia6 * -0.200264293 + ia7 * 0.634387609 + ia8 * 0.634387609 + ia9 * -0.200264293 + ia10 * 0.107531911 + ia11 * -0.064636538 + ia12 * 0.039432255 + ia13 * -0.023220457 + ia14 * 0.012595005 + ia15 * -0.005825492))); + isp_pk = max(isp_pk, abs((ia0 * -0.003249660 + ia1 * 0.007482058 + ia2 * -0.014217483 + ia3 * 0.024525659 + ia4 * -0.040392769 + ia5 * 0.066546515 + ia6 * -0.118593909 + ia7 * 0.296268866 + ia8 * 0.900904607 + ia9 * -0.172996348 + ia10 * 0.087265300 + ia11 * -0.051661508 + ia12 * 0.031572326 + ia13 * -0.018833394 + ia14 * 0.010482265 + ia15 * -0.005102525))); + isp_pk = max(isp_pk, abs((ib0 * -0.005102525 + ib1 * 0.010482265 + ib2 * -0.018833394 + ib3 * 0.031572326 + ib4 * -0.051661508 + ib5 * 0.087265300 + ib6 * -0.172996348 + ib7 * 0.900904607 + ib8 * 0.296268866 + ib9 * -0.118593909 + ib10 * 0.066546515 + ib11 * -0.040392769 + ib12 * 0.024525659 + ib13 * -0.014217483 + ib14 * 0.007482058 + ib15 * -0.003249660))); + isp_pk = max(isp_pk, abs((ib0 * -0.005825492 + ib1 * 0.012595005 + ib2 * -0.023220457 + ib3 * 0.039432255 + ib4 * -0.064636538 + ib5 * 0.107531911 + ib6 * -0.200264293 + ib7 * 0.634387609 + ib8 * 0.634387609 + ib9 * -0.200264293 + ib10 * 0.107531911 + ib11 * -0.064636538 + ib12 * 0.039432255 + ib13 * -0.023220457 + ib14 * 0.012595005 + ib15 * -0.005825492))); + isp_pk = max(isp_pk, abs((ib0 * -0.003249660 + ib1 * 0.007482058 + ib2 * -0.014217483 + ib3 * 0.024525659 + ib4 * -0.040392769 + ib5 * 0.066546515 + ib6 * -0.118593909 + ib7 * 0.296268866 + ib8 * 0.900904607 + ib9 * -0.172996348 + ib10 * 0.087265300 + ib11 * -0.051661508 + ib12 * 0.031572326 + ib13 * -0.018833394 + ib14 * 0.010482265 + ib15 * -0.005102525))); + ); + pk = max(max(abs(ia7), abs(ib7)), isp_pk * 1.015); + req = pk > ceilLin ? ceilLin / pk : 1.0; + req = min(max(req, 0.0), 1.0); + L_t += 1; + while (L_tail > L_head && L_dqV[(L_tail - 1) % L_cap] >= req) ( L_tail -= 1; ); + L_dqV[L_tail % L_cap] = req; L_dqI[L_tail % L_cap] = L_t; L_tail += 1; + while (L_dqI[L_head % L_cap] <= L_t - L_N) ( L_head += 1; ); + m = L_dqV[L_head % L_cap]; + L_dlyL[L_w] = l; L_dlyR[L_w] = r; + rec = L_eprev + (1.0 - L_eprev) * rel_k; + e = min(m, rec); L_eprev = e; + L_esum += e - L_eB[L_ew]; L_eB[L_ew] = e; L_ew += 1; L_ew >= L_D ? ( L_ew = 0; ); + L_chk += 1; + L_chk >= L_N * 8 ? ( L_i = 0; L_s = 0.0; loop(L_D, L_s += L_eB[L_i]; L_i += 1; ); L_esum = L_s; L_chk = 0; ); + g = min(1.0, L_esum / L_D); + L_rp = L_w + 1; L_rp >= L_NA ? ( L_rp = 0; ); + L_fadeN < L_fadeLen ? ( L_fadeN += 1; fg = L_fadeN / L_fadeLen; ) : ( fg = 1.0; ); + spl0 = min(max(L_dlyL[L_rp] * g * fg, -ceilLin), ceilLin); + spl1 = min(max(L_dlyR[L_rp] * g * fg, -ceilLin), ceilLin); + L_w += 1; L_w >= L_NA ? ( L_w = 0; ); diff --git a/stage/iem-hd-v8/EDX_HD.irs b/stage/iem-hd-v8/EDX_HD.irs new file mode 100644 index 0000000000000000000000000000000000000000..5ff4bbdb7bf81817d0fee71a43eb6c2d77ed3602 GIT binary patch literal 21756 zcmX}z1ymK!<(mS_F{K;cXxNUVjzlviH(Jg+`BVe?C!wMuVQz1y*&G# z|BrK?b3Ox{3!JlicV>2JR<~BI&n-MWT32mVv)8~8{yrWa9?3kCdrXN-gihn(ae6!xc|Bdm2z{zn- z;*V4$yezkGg`dBc+Tk+)I#pQF@lSceRdW@tkR!!3JACxc&vG@s_pLzKw{E=qeYd0) z2=Bje&waegjq-%O?#_32?Xsji;ZdE|xqB8GSf22>4`bXfdXy+n_`sFZ?o+vs1rZKC z+C47YpNnq78R`#;+cNK>oA9>s-Qsfgejh~m*NY-?FFGeJPq@+5dG0dKqU8x6oLSNR z^?Qo)gtJds=I$5}RF3civCf^bu1754GAET@*x^?!VWU}m(Az(S+=P2vSr>G+WIH$E zde{Af4vZh+CS0VHhx^Be`F8kujcjh?klPNQ+S$t8ruT6>+<4C?_sM$4?Qp*fP2<}2 zjd2sMKcsKmz=I3igypW1arq{WcN4yN{G_|j;X!tIdzOgUV}07W31?Ps9M_#$-GtA6 zTpfFH>Sa4TtZQL+&3&j9y`gSMEa9G8 z0^MmQuF!=4oX+Fk^JKY6I6A7WdtHYTity|KL)`IQ%W1+z*W_@|FB7Q=C-+|$TmI`- zP59Trwr0UUtu^7drw0Ui4|1A>qp}PLDx9s9gYe|O&Y-v)6BXgnsjQ%oy}_Dr$BdB< z-xtp`;e6|k#x5#;RufLBQOG?dc~ece{jE~&qsPipnX@o(h-O?a2@Lr3BKCl%q*XH4DSEMyVBTqiKrdt_xrcxQ6A_CFb8 z5gyfZO3(n;SVg$d_8UR1$4%0NbKQ#xDsas^mhk-*rGmN^tRG7_-MD4?u5b5P!Z|KP zXg#J!EaAzK)g4Ph%viz~;)Xlgz4wkK+`9fToj>b)J1pvrioN^(swTYb!JOE#?Vf7F zYlG*;PAvLK6JELIo4%d=lpRj*2z0c2=cfsOjVcdm2)qBL4hj!k<04$)Lp8^ocG@Idd|E@@Hb+Va;UU%1#+pkaOv1PN zx%HgY!3NhARaA;?mE?pZe50sO?EOvKO~S{zXVhg@WONYDvhI@O zTE232xL@A^)PJ@nd}y|(98zPt zCcGx#xi)?`w8PtvREUl3|6CFN9Z@j$_kcmlF41P{H@f4807ZDw-Sm3!gmQ|o%zf8& zGJ3B?II_ZCHMe(!MR?Q1uIlTikO5qB}}$f8Qv!0gsO8@)T|;V;ry?6$w6h>n1q*>ijzLc z!%f1e7vwR+Z@TTU=ae9`z^-R@xSVHmnXB^=lW>)SB^@azc$tK~9&dD1U%%WUJi5hl z$Dny#6yYbicbaed7F2}C2Aovghh7tek8ba%-TyL}gbU1Gt=sfUWfHDEx0&v^JxUUu zyv0*rT6;kf4$rquc?E?^!qsX!tiflqO2Wx6`?<~@%J73r@E5x z2ftR1`?D`tggsl7b{Nm@S%gbw%ms;vdDdHvJ6RRufQ&CeT;p{to_4rB)CE>e=D(N++w@JcRb5GR$Umll)8wQoq zuiuw82}f<)W;PO|>~OI=(;Q`9g_?v56ue=hd%Y}@YXh-D%Ymc zf^hcT4&83HVG+LcX}mu8EsaIkF*r;oOTASR{_}X8Ui!9#Nm#y1qu*w#W)i*>y;7a` ze=G?Tmnwg~roP*8WPz1AXp zIsZUCDF14U@X1{>^xt4*5q2!?tCuYHRD@%4&-a z-eHRHsL``@y5RYW@QMCQ^`~@;6yd9#LUo0GPFjQ`cN|s))2_A%uWx%!6>fUMB3vZYS3j?qT@ijUv91n0TT~HF zw!EdzS2VjK+_qOw-D#N;-5u^xjj%cR?l9o|~$2F+09d!yR z!W+&u(@G{$gpd9gs;j&@Y!Qx4XXzF(krv?%9V}hXYp_MQ=ZNvTR;3;m;qGI765l_U zS%eFvU#W8ZylN31Uwfz8WIeYC$5kq%&#w7n5e{nBKo2dIUJ+hgxtSi&I=Lczu6sKj zv^0q#yyMI`-Lcyji|~*8A^N15L=isPbd^rEwWJ~(vDv8|YkMogSig2ZQiRaAH+=}qBEiHAmzdtO(Pg*z81+sZ6!gbz{)bEm(Q-l{ko2zp*=&T5@ z%sxYJZaq>FE_7qMp0RF*B77=jw(fB|ToE2#W0qd@Fj5gtSA3q%`z1yZ-u7v_PDpx6 z5k4|}nl2l0MiE{*d7ZXKA6JA&E{)eS&MHNCN5;4MORbHHaEbm8bmyU~6yb-{j_J-@ z*DAvER;<+bA4e*}5AFo(+=Ess!f8aPj#|A~5e_vM==v+d6yX~kmgo#4W-G#lJ}=Wt z-UKVc{}oxL_xu^92uC)ZuMc19rwFILyHYQ9OjU%NdF|5^mq#eVwcB0PL(E-@aNdJA z^r6LnsSfL2-t8D46%V#UXrDBe0_u^@aa1Y06z4Um9 zB3!3ljQ(w?6XV}4s1MI|N0fK2(K9!s;gCAqzL;}TckH7 zELMbP_6^YqH|8nAvy*kvKQD(U!lf!V*Y3NE72)P7N9hCQw<*GnWw=h;?4Tm-UoG)` z?S5Vn-g#xKUb5(#B0PHQLY*SZc|~}0=9zlvtRsr>(gO>0yKh<%?y_N>&T?tDB79<2 zl+HJPry`uOQj9KgYP%vFe|ejpnLSbw&NXSZ?wEKjA)Lt>rrV#KrU(~GF<8G{GeZ&1 zlC6nOe>hYT{uj|ir}SH{2SP`zDb+R5eXoe!(Fm$1=xo)^399DC)ZeosB zgd3)c(xG~qB0R!#i|*NQmLj}v`wHE8+B`+Lal24`);~lM{!(s%_ANVI5zbS4mF`u3 zlp>sV>k9pLMH@wUY>~-&x~!%MxBSsg-)>W05q?>+v0neBh9Z2hK`$Lwt&t-9Zd8aK zAJkP5&UY$Q4;(s95w72IvR;3EiXxnBc@O>k{8U9aOVO_S$l1|~@YX{8^~$OJ6ya0O zVBLT6U`6=z`L+7S)yazR+iX#~XMt&o@Qx*0b-#xL6=Cf7w<|G95zcpWj$Yhpq9QE*tk6ww4^@N@k4&87_wS(yKOZ(lKl;#A5$JCtb5wYeioZ-D+k_J+DkVMfi7}AUz_sr6N4>NeSKbYHdY0vS4AIZR&|HU)fs`zIUpe&Qq+n zBK+`Ub?yDHg(7^pOAYPysFotUYe!98Fhg}k*#CW?9#gQ2BD}P6DP8zdSw*-({<3;= zR7pj6e$znh9bZBbK9VI!A6-{g5x(0m@pqn8MG>yk)K8bFT1^oin98MA=qh%2h{tioG~Op9en!8B0TxWRW-HIAB*tW?>E$dJDKco!P*IG>X00E zICH{PRj;6CO4Z{-q(%5azirC5!v>3RtDIL7_qumlgcqd0uEH+uvz2aYLqA!m$5IH6Ol+TZWG zMY!$fMXG1hXBOd~=_ac|1>ahP=N+A*UTphj5pL3Srdo6Uw?#N+%{t{*Fqs_=oV8Ki z>XP0L7nr(J6&d7Xhl~EZqt<@+w!@d#rPp_xq*jFWy{vlpp+6SkGR`Errub+P-u?HO znmqfRML5WBjN0vdW)b#!P+gt*ebOR)&TFiym3Fs9_}ravHKWLSi}1@?TUGpwr553K zm3OFfCstU5TSTr_tI{mC2tTerOnnGlU=dzEY=A2IDbgZ*eN2Svu;qkBIO4iXbvt(5 zB0M_NS+%O-VT*9J;<4)XlQkCMa}&dr|Ap=r;abVU)blpdBE06oW;M5KO^fiNG|{T@ zgSHmopx5)&!19AF!bhVzsK|`NEyBm@WKg~>x?6;=G(KcaENR-|#zT%+Lk<yxRg1EyPqZ_gd2a!wv+5gzhrwQ94tl||Utxk0^6*VH2X z-{2*xQREnlq=Li*UIb=dISs z^ScOtjq+A={~O~Xy!`qrYwkD8ML1pDb}MP8<1WItb0@QgemU(TT)KX$n2y#o7vV9j z0~=Tj9;41>q0-^2*_xA_d{A2jk>US1m!f zx3NPeB!6TO9uaX=OquEvNI2=bb)xpglTN~^lQxzKv!^%-533t0-;6)MmvFVTrR1cj z+Xmqay$Tuk^OqBZ`z4--RaZF;!k6BpRf|qubP`^d$yZ(Xt?43s>A*d!c&*M(!dssD zSw*8_4ZPlV|h!t4I_kzXPXI|=_PHAODGr<{b3 zKFuZF8@WoSjY^X6KQhG((E2m1ZAj{S~y5uQ=vnl<}ZRTtsFMYF9#S$$lDyR;k= z7!#Y;ML2xsKan>71SjF~DZ)hWYZaV?%a^<-Hg=omB;4Y81-U70V<%z%)Zy|=vrJCH zH?p6QJMP9Agr_@x$=g-C2*SxqY>}VtH4=oMI#;+>)hucd9@gBlMjwiC5-!l(LoIp{ z>?GXw=~}Dk)~jU+FRV3I6l`6<4!?4T$OUC43BsvSpUb?+#9ESw_fwIBL-GXrEW=mwnj2i{v;PXf1z17PF;nHi*NuP|f1>vd3AIbPR zO$6bmP4b$7A14UHk3vV8wH*kaDVkq?#k=qA}lt(kny*UISI?)b24FCYz*PO zsgKAkNsk5+o-#gM7PJl%hs5sO-vZbLUymC=>v-sJ@l5ob3 z*JXTsRXbd`{bD&HD!(1>;*OE$F8bMFS?5FI^AgGI@QYh1%xsO5O2XfQ(wSKXrI3VI zJ$@}ytobAe|IRc_235Hr2)DeMMn33vLl9n@e!G}>C$l8{dUR@8qPA&=_hpHY-RD)d z!)NlGleaVHx5Hoi+>rfaE(*dWmb{fGx6BrV?~Tu6CcGUW2v>C%Fem#?6oe;ur#5Rm z7$pd&nHn#D_U$DIe<|EcwmqIl5bp7{yc|~`t}Nkh4pW+KBAtZeYxfoLWmCEA5?!-> zTC4t-4^G10kCw4g-H41K{4~u%W6;nMb~yTL7n!HZbAxcd$9H7O^->W2Iqrch_kEop z99(FcOxSor5YE)uQx>>#LJ)4=WTR+z!EJ}9k54Ioc3mn6k4P0F>;DcHgi{pzAaCYc zB?wpk@kRDtI!zEhvU#?=J0*u8oVChS5ft;rAlz-Ehjk=lYeBfirJt^JIW`Nz-G>Jl z1FO9hgny5oDg596u*3a)Qi!;O^LBWZU$96%DasD-?>j?QI3F$uH@<&al#FGXhUi{Jg8^9oOSG>Al!N089DdGWcqT%9o7v$pXBWv{7i$T^`!~Afh*hD2 zuvKlRJTQ5iARH7sUuIu-ND#Ja!)uM!Nx*V}KD!IKPwaQ^6J zGDFrUF@!T_+AICSKRF3MpA;*T4*%;U?5N#Ap2)G!NqF#*jIQN(xfsbTU|l;@AS3ua@1x)IP=^Ca&EWFg78hR zXcqHl+Tnt5d9MpHw$ma(*k4YTA?=R} z!maBRm!B?P7lbFfeB_cwM+9MS?+}^k*Cs)Dp8JF>ldwe)&e{3BT$^W$AiN_mrP=$~ z9zi%w-(=>-K5>HZ(CDx7^II(l&s*wczOHso5FRtFv{}!*Aqa2H8f0cqeozpumNSnz z_2FbexQP5DUr$OY2v-i@D05j|48plzJLQ1vSpo^i|M(?mPaI_s9=XxmeBJS{K{!vB zzw&K?@`AAA*Lk^d$4EiA@$S7+pPMcS&m9&na})>>gcsD>EmIcSBnaQ%bW2X#{74Y~ z+cc?pG%}eaJhpBT^HtU)lJNTYDrTc0F9qRE4XT*sLQe_88;=$@)q=!hD=~b%a1QhL zfTWUelRrOYtLO}NczI1ru6g2Zha=}~m-jMx+Tjtk_Q)m$e+$A5&)kwJ?>rZTZ*@p& zrgeQ1gl7hPmo1(rx5KfWF3CJ|eeH0D;y2~ib4BcM#M4aX=-_ga@ZrH_&2j%#mV^rq zDQ`NZLlSoT7BLU(EF%eTIqhNo^2jR*uR8Tjrp=hv4u@^WgGV`xnf^h7DKQf@$cR@I6PQ3i}=dU0<+<8K_eDFaKZsNEq|2}&n2zSo=Lk?+n zO%Rq9GMbZLCJ4gy_LelucK#s<7wDhQOxyFjAl$|OiER7lo*>+F>_Rzd<^@5x(VhZw zX7GQ4u-3GAe?#EEg8E1 zn;<;B!Z$f$^iM(9f8<|Tt87X;e5}nU`KDhQJ6yENTlqFJwH0LqXX4OnbBO(5r&*m5p`GqfK3ca6;BR=Fz{a1>p)`45H9fTfqarzoK7d>fEaZ;p7j!%vAD(Ae=r&dUI6&l#+10^=Zr@BmE`etLZYCaYynd z&Jhy#!V_I1cXrd^PTX@#3~#bBnm1_43{F_xwC|cuuCYW{%GJCE@a4q}jf9eo462#ro#NI{uPy@)DKI zLG$xV!fkH&nVmxNNy1h3{E#o-X1BxD=X{iH|7EqqDXnj^L=rzcoM-rFx%-{B9j;p9 zyNrL6#ts)a^+rZV{T76mE>B!T*S#+Ym%M&jUY>qm5YE`|y!7_)vcp4%-IMt;<+8&; zhkwhxCyLnNk1PJk?f?Ak@P*ZHWX)_T>~Nb|FJz@@j|E|mPhMvC4HpIBIh%Y;&mG4E z;gJo~n-|h3K{$9{D)ZNbU4roaN}m$f1nULi$oVhj?CmoJVb$QCtdwoCAY66x7CEHT zctLpd*7CAV)0u*B&&X8Lqicj9Y^3WglSge7gl8^|krn$V?*Ar+BTIRhuaj*Pgj0s5 zGxK_#7KH!1`b$QSdLRh@Nn8_6^m#1^S1Ni!-md#u5MFd-zg$@6jUe28)oD3++ySHw@Zb8=si_ZrNhI5`@oJ zek7M&IV=d5+wnnmxO+|zF1G)@yjJV3AUt7lyexP4i6C60jU_Ys-WP;NtU4^$zqls| z-%kEddhNX?2q#&Y-i%nP1!3oh6y~S_vjyQM$DhmS(KQ9(J#CzFua&sgObkD57A=>1 zWf6prxlhaAmFo$@&kvrG8P|*zgfmoJFW<}!5rhN!j*(kOEEI%;w)T+gJI)q_uV3mU z8}yqj2$$#*E|)sy3c{1>?w9wgT7qzk3Bs$z zM_FjhAwk#?c3dtkb5sy+Qhu9^PI^rc9{gdB+?xN6ARN@7jqK4a@qSZcc<`rz(zVzn z2v^!0Ea&XlDF`pkw_bjlzf}-ETRmDnEan!3=k#7I8>hZ32p7s)U0z=NND!_uxP;t1 z>$f1he8e1i{%JBhyr74Y86N!;gkP7tD))STE(rU?o|7m0-4ulLt&Nm9MjR7_FT|~q zQ&;X5gtP3~F1>f`5rjWPMN6x2;{Hlvcx&rbQgk^Y2zz~*D1Qz*BM8^~T1fu4T?@i3 zBL;|zx0l)BB2hu&d&ik}_|KIMqIkOHcG&w+0a+z#n;?9!##}kZ+Y*EwGd9SwOLhvv zlhqRGt`;T;*9@K_|7$lz5Y81lMZR4!P7uEMysd1Ubf_SlYg1m?=6F3p*v#Q2n+(b( z26WJ=M}mpQ#;U2;Z-`)7X&mVIbj7&D*;w zK00O)j-QgtRn#ZFAe_)SB%t1`%z|*h!VMzgi;o>1GwGRFEb`gm<^QzERVa@g-qZi2 zxG>+_4kt}`Bc@GDXNMbl`^qF^QwhRZ{fo*?=Zgx$L$+0yx4+dBgxgN>l;2)d6og~a zUr790lM2FnCth)F58P-FzLX`eW%i9U2v#9Zt7lfhg3! zvmGA(qI2TDP7OOO9w*KVeBK#^zs*nlFM>Yp48q?dePs8CpUV=iT02CX>lYPBxZS^+ zfqm~TGYCgcGhF2g-8BgNXWr(D{&d+Oyrgy$mtVKt2I2W5;+^$oX@l^AySbfrGp#iU zpZ8c~B&|Es4(ANk#^!vD?XbH>TH&mGK9KOPNBhN}m#GZG_YOCZ8C4a7aHp|d<(Ru( z24VHdN3NK#B!=+9MhA`1%wbN#wJu(Ec|3gVBwYT*OIMwfS?zG^Iu%`|o@TJa1Mck% zY~LW2i|~Jb5BBEz{@Y3T>(^-K=INL1@YXen_mwv&J8Z6*)agaZog7Do?Vk0E?~OPI*) z<>e&o>pe@%x^kf`VV!@cQSMV&JG`%QCs&mRjSRxWgQ8tmYMTb(ti#{B4h{`42w#- z2H}c---`Hq&kVxd^Lfj*xf2Y+;#s7q)8dIiIA>s9*VEH(gYfPryImDB)-ni(gao@{ znx6|KTr}c}b6wA%0Kzk_{E4aIUv)3x_UW&bEnWCo0O3(R-a0px9Unuuw!G&m{H>sq za1r5atvZ_8NqB9p{MI~qDv)sX@jg}wG1nm6e#|CU@=}oo;R${Y*NRG|48r#d`?^98 zWN{Kc?m62T^xrN!++tu+k>~X(C*f(C>Wf^Shn$4}tmV6HQ{zI7vXZJds^8%y1EFj`99csb+3Yp z@b*JRtejVKy9k$B8t1B4GqoKy4|jF8di>B1PxHGNbN%{gC*c)?=eZ74OXVayePDvC z!2(Yw;Wtf^SbJaOcM{Iq?v5+GbFh=}lfwO7xvS515}xvSwvl_qI49wjw{{v;o2_#a zKJ&JdOLctVB>X1c!}@prpObLbIW?_KU9^+%oZuQ(=^{0qglp~gwXP<(0tg=r`|4`c zeQY4%#($DqB?4Q;5Khtbg)1yuMknE)new>`XQ=HYT=GR*qkfJ2PQncqbrB0IHH;zL z_rMJCazILhaEjO8jil`>+TpFq9~gBXIsyszEf;5$KKML_@N_ZD`7>F#9j?-2v#WNK zEl$F%f82I8-af@i_?+JfS487(PQuwQM7ZXr3U(46)U|-K;HH^&I3d?wV_&kAPQqng z4L6>Y$Q(m>OIVYbvN>`E5>DnTU1^INfrQuj2fMl*A0I=wXV)<2#*$BC2yctNBnICo zO*`CmzJ0ut@Q-xsU1?@qa}sVBJ>pA`8S?c zPtMA&yRW7N63%h-uXEwb^#O!K2c-y1oXi@87Zz(KB8KiW2-mKfApCD8vBSZ`zlu~F zJnV4#l`-P+jwplh=P@J1hJCFK!kaFv7nL{o8iYrG+$=6OT@gt5VZP-eWA)rIgx{8m z6jyz{orLf1pC{zW$xgzp9Zpev*hwehM?Qx{*N>;2gez!2(KEv?C*h#AlU?q;J)MNF zS9|5k9y~sV@RR7>uJ%_tl_k8O(-UXCh}C7t_KS()SK2vysa~SpMIVbZ(F+0zmpgw| z_{x+9;YmX-h@lw*48r?I9TJs(k1z-y|LYRkd$vLNbyBxjw$o`49#TC)wDgHL2%o>X zU5J;P48p1N^fbzy_!3CCe!Vl!YO}WNC7fbyVOQEzqskH<9y>oUpmzYW5DI_(m#-~BcS*9b}6 z+v=6X4qqLZSzZWATn{CNpIyu=7kGLK!V|n2NUO;{gK)|zy=AuJvkbz;t$H%m#fApq zted`zGfzVe!u6aZMTcT{48nU3#v7d~{<6c~T{;*ZKkwM##Y2O|g;UW6;Yayjim%<2 zLAYS6tn$TJWe{#SLdes*PZ@-3?tkuiiDY^^27+^G;q_<6??@|^ZF2q(|!CEs2eYY@(NG4Xh=8D~!^{|K!iBT^I-gg