From 755ae7b82cc8d22a0b96a6e6f2e3461c5aa4054b Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Tue, 1 Jul 2025 10:27:56 -0400 Subject: [PATCH 001/107] chore: allow manual trigger of Rust Interpreter Tests action Signed-off-by: Louis Mandel --- .github/workflows/rust-interpreter.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/rust-interpreter.yml b/.github/workflows/rust-interpreter.yml index 2d05d439d..db0df10e6 100644 --- a/.github/workflows/rust-interpreter.yml +++ b/.github/workflows/rust-interpreter.yml @@ -5,6 +5,7 @@ on: branches: [ main ] pull_request: branches: [ main ] + workflow_dispatch: # cancel any prior runs for this workflow and this PR (or branch) concurrency: From d11fd30f5d46e1aa3c985fae670c418f014f13e0 Mon Sep 17 00:00:00 2001 From: Louis Mandel Date: Thu, 3 Jul 2025 09:21:23 -0400 Subject: [PATCH 002/107] docs: update quick reference Signed-off-by: Louis Mandel --- docs/assets/pdl_quick_reference.pdf | Bin 178451 -> 178454 bytes docs/assets/pdl_quick_reference.png | Bin 444536 -> 444588 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/assets/pdl_quick_reference.pdf b/docs/assets/pdl_quick_reference.pdf index 43a33b0ae3ea42d58bc24895e9d53282375d4939..cee203cf963d11e7578021b92de41a6b7a47c4ed 100644 GIT binary patch delta 6110 zcmb`IcT^N@lee8AgM$Rg2s{KyB9j9HgMxtMC_w>uFvy+-|imWbKd=9yH5A%`c<8)x~lK)J86eLb%(x67YIPq>H+f@h;?^@ zB%#Nc0U&MzEV@7-5v@H(`x*x~1 zsyUb^*VLIF*S@-O=f_Qsk8?v+@^g=;Dpf)tS8sS;ytHxM!`9(x$v11*{&G4_c{9Ig z(|WSyWD*k5@-WPXisr7GJfk?fz9%t9u!fC{7@Hkx`fKJm3}}y%xV<|%bItwoqYSg> z{#TqH-)_+L$(c9a?+=`*u$Ad=$hI(<{K24e{+|AYGE=QQ#nR7>S2DLPb})QnDOL%h zK6P~zZ0m^@`7SuKea_l3JLfgr#epNXQ(aL)uobw7fXCUcB}seh1Et2Iu40K7WXAZbjC<^B0njW+>{_h8xRGO=gR(VFOI!`X_afcl;d0+C?cL4dce5 zpjwT9t8v?LX>YRCR^#?46J4hA4n+??x%69`AAIyRaCb{7PMUw%!x;+6*wJKun^zoU znotmAn9FcwoE85;@hfnHQk!>1XF*E(XW#cS|C~nV}`6-5BfziH? zvJNnOLr-$+lyg->`0;?j_;N{YSDQ-u8hUfS%zArgSQII=P-gvz?wWYP7kP>XVzSIu z4)g6}9$5z;t_#b&4hp4B$`m4=#zM9)S{$pM=cUE(7(Kp`HYrS_Z2zVs<*$HA;)>)} za7WbpRX~^)jNve%f(XHN?nUetcQoAhC&BlsOd2md%NQ*SoY=)ixwm|0MA2SsTKW2b z4;vrNvcbl=%mUrlium+`so654rRR(N1Ds}{NbEO#@!lhNUd-8Wvr)FEJ%He7Dbr#9 zy5fxUDi^2B6~mEM?Qe+i_rl$xmuI9u$SriOkJ(9na}4f(*h56G^i)*E`)sw+t+Zdv zsAihfondeE`T6?W+JRilj3-dHM)B3dmz;K>0}?sqfeAVyF(!PM>20f7W!`$-1E9SS z)&7?)`)9FCqFM3P0#~NKwpJN27kWqV#G3G1Ve_(>LYpsuJ>b#bE|NN_6~eB3A_!9C zilxh&%-SvI63&Rpg<|QBZ5?luR`{B?X8;F#nHp@0Yk3{UCA+VMZFML@NY7cuI`B54 zcWj~hQ8$cQt7iDVpRE_q3KI+}{xX?cKPyoSsubE1APbN?9zX!qgEhgNCb%1hvJ2$g zruqoYyGdpJx2SN;%@Ud+{#|{+|O?}anABvLh`yayA#!}rJ@*i^-bSC*C-q*=L_g=*NuT>2cujPk0 zUelk&mg*dt_JDD1}@33pdMVxGS2H=NFO_k}?}fPp{JU*~&0@ zlSS2b4%dhZmB0M;^7(ynOum}}-grGs(wZqbshU-fR)u-}$5nyg;3S5N{KUbBwkDmo zZoc#U_FXeTeptjbF0!z-y{ePRk#kek*s^y6U(|>C-6|(Q(vOPf2WkU4{ku=&5wJgV*mgj9)pGLk`ZlKaqK{Rm`{(A~;N* zb{u`A{*6NKK?dg+KVP-JQVnvZ>^FENKwFXnww&RM}W0nXGA*-q>p zeKweT-ouCerT;x=vl_<~b4tSeS*& zA2J=CfcN<25RmaQ*+H5$5xX3%UQSJq9Tu22*GE8?hy6dJHO=I3F*o4wJoa|Zqo7Zl zJw({`;BJXXTGr+&ymuIAv_=iP2};6)S9=AQM zukjUDe2Qo5v+tW9;Cr^{|Pz1^@;P!?*h4tzcxmUgMQkz6s8 z(rNyw$C*jR;*moXv_a~IHm~G-L=o#-ZO511@kWP(4!x3JT*jRwPVdvkXMb0EbgRj6 z_JIApbr`qWS`)86+eqhg_h#2bnZ>4xN4K~ppSoAB7beyZ6Q3tGuPsr9XRMdkHm4Xk zYs6#1HF?L?Bry3}hWS8(tEAIQ2x5)?M?AhrimURymr{|y$h56a`Ce++tg1u!e#>X5 zaO3$Z_op4@Ybk@Yj>7B@FZ-Ok$u)dEBNs12t&=<&nlFCwnyxZK47FTve%$5cOJWyn zVZhk%FZ!0kro`U+JhTaVBlnHr7xEmHSqI2s8bk-aF+A+H@2CZ}udZ?fs8GY2LR^sd ziutZo{dBWS)|bg+U&U3$7x!VC=4vttX&rqwxgwDM*vXr`(dkcolY$?kasWV+4S`I`5{kT!=+<1z{NI zu9aG2vv25&uPrc_cQW@kJL2Nn8w2 zi-=V>6)~*|d{%{-qwyFTEHJv6pglK@4e+7fv`7Wo&P=9Dba?TbEpc8go2}VsDLz!X z8OHyR*FUKLu8F%kSc~hWCt)WxmHVv8&t~T7s7ojM?Y_^?!RrT{s}4|Pq7tup+g9>Q z2Q;A_Cb;YZPB_`ljcK-`ng(T#WA@!RxM$) z!ZveR2yRwC<@}sA>0VL4&U!N2Mq#@}QIc6uh;ul!K3U5fK^2@ls#iC1dLdVgSU_j{ z`B`KQm!=qYP&WAuUSZ<#{I3r|Jw(ZxORP$)pe)0xso$Nsyg0OCKcaNQM!)Kt}GrJaX6$W!SwNc-9H#TIu7E-ZlL! zolHtwpt4?(mj<<~GvIfVYp869_IFoTh(|?KOW);df9}Uxi?6QJls0Dg-!6lS%iOjf zzf)D|)~J>=+Je9kYaebIg__J$m9h5giq4G8r7EN;$Z{5w#h*H1)NyX{bB?)ey zT^{9`I9indxFP?xU0`q{d&u!xMfq5Q34-4$To)pojU(Oh`#f%_oxu`DbfBZ*9EXP$ zdS!j=jb%4?q)jp1h)dWPotjmO99YNN&|cLT$+bn;P(82{^E==~rfR#jMO?xPWrL#q-DVRD z`AuDir;f7aH2EbJ!c;4GNsgJ8IjiIOj@ChtB3`G>#kbZF^@eCh|M zJq>y<+`-0NEuP<=j+NjY&0%zn{G?C}|Jtu(sy9O@oLe|?M^gt?5`R9kogrTX+}M{S0HwICg;iHoCdWv zJP#-KG`c=jjimzP%sMh!^n;->ak=opbS_K%heWM*kPmljjK&4-3I9HRU4bKy1Kw8q zUMHMa`S@0Hh*+fiwige)0%u?X7IGsB0^z3^2y?KitJymAH2f5*j-7*66EhMCu z0VnoZQLMzIkB-@pnq53Y!PNNW4Xn#SZ_4ost=_Ad>IazvJCvgW1BU68xTKWeku0aP z9qqesxUk1TL2=*Rg_3@Ph%=T=;c={{Vf+Hu=FfW&FSl{-1`vZti+&VsZ^c6YI+r=( z@gTMMUM+?)=c(sczMA_g-z%(p4K_2Xx4IhK6@$Ks?WD+e+zZ!yqsS3JOiykmLFC_^w(%IF))NM#Hd28Sck z^5cOL|EtV~t$1K7tpZpP1%o2t(CY{oSV0M{@Hg?l197tdE+cI#6$l}EB^%gsw$Gnz zl+#jMSaz~Z3f3>w^LG$P4*~hbQYTi995>eZ{RC~ovhW+w@14~w<74V)&Q`}91-1}zvcSKf1n^2;J zI8B2DErWeEgAZMVaSv7^LI@(Hi-qYLnKwOrCvrZWU*ymsjkhBtc7I$le z?rA>b^avYU(fEm{gyClBaH$fgTsLB4HAKxZ&fJ(rZkLUkUGf<*p5Pb`ss@nznv5@; zRn3hdo; z^&>OZ((Y@7Ts4h%*9K=O1Ni)jbz6YwWj1WJG-)A#H%8GF%-9}+rtOKknPDDoe9qk>jhr0I*pCKZ z=g_86Jgy=Y?aQ1G)ZMr)&k;-`@4K;GUT`oC6K|wKEf${+u(KH27f*SI< z4i@;P%rYj7^@mk#A)<(`O;okP?Zho+a}WT^;r9|zn!y}jo|VHyj{e+ z3ODg(hCyg*x9QD$fBLez%?;eGhWaKCDf#CDUqwFHX2x}Y zIONTl*AIx0-lhs_2L{BtR58siVowutwpoL^T@KmW=I)+G$Zym9=ny>3q9y*w%hx6K z`}hPrdP^j0I&Z(uA@5g~6JCx%4?QYuOeerI1hZm9Qq#qGCNEW03(!Z|f zNniglBq=%aTBI211?hz{)eA^6)DuQfuvGlp1bc6XDm+&RBh zI8Xo2&mrx02G9?Of(n5DJ_MXW^#9y|QD`XQPYs3sT|JKvuawLvRfEk8~6q z@`r|jVA3rAM*L9`14I0Qz#zf!-w_xT3XxX*Hv;ur2m*#6f5-mPFn?+=BqR-x31k)j zGlazaJ|74eg+QdqWdbJwhz71KpgaJ8ZZOFP+5rHthK?K{$KU=$E|B7He>x9%0Q}{T z7Xs5L0PqH!?RC=~3sIUt~5Bs^`t9>_{W{t-g{fkh#qu-_+-LL!jAX%H|P1^w-XLcka> zA delta 6165 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%0DyAAuDb&=Vfg(PU^GKV^Jtf%@%P)= z2yz`abYTlZ6J5+AEQ*qIjgraq?Dl)z8hP?CS|w)3m=PET1_hCdENR{M@Qk&u!`eA# z5dDxA*o)a2K{$V#2%{XZpvO9P+whvm)r%RPKd<9o+)Px{*VTZ0feZuLuCZk_+ugFi zB?V=ygdx6`&A~fL^GXG$V-;I8wwbGP9v(@1ujr~ChN#A}RY4x)%;sn&KWQ)WOm5_+ z8`XZ-ahJfzpH^MVWW3thE!~H7Z?L&iwj3@NZR8g8&(8Nt5u=FJ|K(Vu-Yx|yaJ4VoVWU?Ne4@K8pON$NWfc7tvP0mQ&fku&n)S&|r?%qmW+h{N!j z5yH$MqcHo8PqA5;rxb<#_ey}hOvMR0`5~OW$lX@~4#ev?ZEk<+wn)P8pWKP{U(}AE zrsCK+8Rerjb_FaA5r3p-XBLhS%CT5FruDf}o_>%Z~aDgFw~8079VX1o#R^Mzw2v>H7UiRbdT5+X9~n zQ9z?WMdk4q`r;&2mV_esECdI7h9<#Unq$JbAw{Wyiw9acvsrWDhYGh(;qW~%Ed!iI zU73@VJA2b{-!sV~@%lRbLUI}QUo~$KU(KwPh+C=S2!r;DCiFB$cf&Gy0td)4%hdZQ zV6B1G^j5wDVHJm2SD5_Tu_iZPj@;!YKk}vy95tfg_pajHW&jN<{Ylyj&~>lypV^#L zUr!}P#}O590ky;p?=>*PRdrgMx^Dbw^j+?Pcm#BMR6T;0@tqwWwn+NI$u>G_&enn9kPf!2;nn~8Dui?4(rb#Wk2gib{*q8u+`kEh~a4a96 z((o4>xa%(t(fe?6qY$-2oE#cPzK{`u*&;pCkwJoSj|0A6tTGtOFC+6GpDRokjUJ+M zVSlC=)jlq20voUc)>PgBLP-9A>y(@~@#3gR z6Snp9?A;)7WNZ}x2Xuu5q@cTR*KsFZHPtf@y$4vpT4Ho<^IxnF1cE~xpeVF-S}jo_APqBuqb310G`I`k&qN32f@&3Xqi2z-8L}%gm@^W?YanmaJLf8PANg?tStywAOBJ&BgY7#hI(AlpXz^$BBrPhw`8l7mC{ zKuFQ@FQo7E{`9=Bmsx1G{kr9^$(hvf$tZFOJm^#(!q2v+MT&y|wLFT?$cRq>y}!V| zhO!F&d0FxRsd0g0#s9A2QEt)sd5tehE^*IzfzJ5%bWeHlMFN2qs7{v*Aiq`9qLam_ zk5iQBLT+wp5Vc5oA?^!R>}uU@|I(;r1Sw6|#tU6?pAJpoO&Xsu)+@QT(ajaqf8VEz z1idhl%K3bEmynCs_o?5*yA)KpK94lzRc=n8>J6m%A*hp0-Y4nc$C9`J$0X<^MVZfz zNJ;UT*Vu%r<0oYykj8>^d{HFFk_^<(o2)y}cK zD(J3+Hb}=4l9YsiR4S?Uj{f%QJw`5vhD6ndTja*wi81sYa!G}KYtQl5A80gQ?$7R` z0n9|4ZAzQrzIC~m0w|dTSte9DR&L*ibBD{#p|`{~b|B9PSM~qCC<6mn50-ndDV7M7 zVdowV9F{$hfXa3&)WgjN(bZ zlIYnqXvor3^nM?ny|}ZtJOR|57Db&fU1ynDZDKEnNm)AFlHm1CA2U}%#l6xoKL=fb z@$b?lbbtsU(W)0Wx8|7aobp$bgl5R7?j2wsO?y2m%F8<`YvkR6wSfBEs6 zfTaNs_I92Y12b?Y-0BCsvD&*;*=Zj3xsRAW_IOkr+OXr9)G*rX#7wo_1Ws2TnTK80yFL9mi94W0!g^w1abqE+ECe}j;mN+()E+n4fZYtJ~$ zO=@@e^mctE2W`h7stQh_FH~H%GD#oqziYYCf&IL+IrumT%*!P_LvFkZZnk-|IifgM zmN`?q!lNCnPY<3wVcA(%mctK+s=w^+rghZt3>OGxRR*afukd%tVblirTLxIR*#pI7^Zu`9(nZ-C$U0%1kua@Sb>B6iX*s( zJQfr9V^!AD!HC0+ZOD1Au(}UWYd9&JQ+&#I7FT+-_vxQ=QQ@omL@uHwZP6u3lp#6! zhM(x>v2Wqz5o*4#?{>@2Mu$9pH7v&D`By92KaSoNb^r=WybR7`;4i|SfoAUiWL9VZ z%bZkeC4PSd!;x};+@?r1clNbIC?nFAOV36!B$XG55=``? zwGgX|V-5_euLNK|-$jLA-KNLEkaCrbwPNE$r0357Z8IEf!(f-n6R&R~kL=lUBDH?p z65^)#D#9K`UFA~SjIO-dMU!lAVnhE{q0!OCoKcjvLN8vutroq1m zHM-6S`7_r3hSmDk4}-JFaso2P!h;!JCVy;lRFI@}&$(HhT`{jqXYwIo%}ZAX^$S4a z=s`mFDQ@;~rRlP)*g;P24s@ScOe@AaSWpc(iJ`KYu{@3}|AkZmTa z?{sGeNG~~Z2kYd7!Lbaa_db%2g;Pvah$dobRJbgmU6ftBKXS`?7YAy{?axpQlQq`m zIiVd&0tvMFoedH9zrGZpizYJXw9z0u!sWmXd)Ldm=1zC}1t@mv87SDXz~VS7T3NkF zn>DUJ%UxK5GO`lL3nV8jqkv7~jQtX5JYho=)5p5o?Q|&9L0uSoR~|lP_K!PpOd6c} zl$pZ;3eeChO}NziR)8--x8krFb(2adbYW}I=7MMWhpVOjcOjsa91I2Xq2UJ#H|LDF z!+JF0$<2HQyil06$J_q6H#DnzFP+6o=>~j^rVvUoN}j~3I7PWlLLhHphFePF1S^w6 z65DDDtL#Pi;@hzWg#!x50X%Y4D=pzm?9iWr9!j@VtPcg)k_oUJqY~&z@o{1k9ta>t zWQ|^yCO8_dw>O8(%QGSnfZP4X|5=lgGoVoxgMg)&{RsGJqCraf6WUc<_18ojXRPxy z$Vb1#)ghDi>a8{ zoHjAAe#?!mqF_aB>&eF@$dD7v6~oyd85*{z>Rz;oKEC;;M_9}%P`<3Jg}CCu%3q(gKwrChQKC$yPbMThiSDKgf*c)Dyl#sN1?<=vk=*Z5k5E6@e# zv|JOc0=30?lYO^)JBpDqSiKxagms@@BOvPsIJF6x{j}!+Ez!S#?!39)--6l z!J`nEDNe>Z^Gs`hldhRx*cyqUY|gY_B`bMf$<$gkys193V~{Cf7UYsTA`MTp&a$;-}pTJPQ{rf?FZ@O`W>xng%Mn zy2)6bg*3$uaDgY!6pi&1ji9mb>dy3GZs9aIr)9mEI6uH0Bh`uo?e@tWM%(u*F86r3 zNo1C!ucL5Px4Wqg3_O*ql4W@zqPO%M&38XlYm)7CmgWoQkn>ex4#d}@Jm1bQDfCog zw7~7;k!fN|eBrLN=cnlm7`DV$NfGJ3InRagibZ0E;;L4mJ^tdl$(DjBLLO zv}d&tLLKo#A-zivvM}Q)9UW{x7a9$spS5u#maJgVfBL6K3s=zqUAzJd`-H=pb$VJg z0!NEgpu$oA3fFK;S@Or!N6w_a=m5-vB;t$rLH%Zp>jWUX}OqjaoY1` zeF(EbvCZn86nY@EI(Cl;i{{~<)a@xPyptlsU}v^+shnDP^c-o>i{1S{L@E6vGPGzs z{UrgG^9*yoXx0|#FOwB&_$$ef)PKPEsSf<9Pu1G26-Z+VlH}h#Vr>9;bPj(Q@luL^ zehCB@NC$wA*Rgx*Am#pFzu7LK6nXLY*Ow`U`1tsh)ebv>|L#5i##!J`vkTxSSaX@F zM3&gU!&H4OU&O6zDCP2&#DLcZZc72Q#A%snGDRezDw>nSRgz@r+D z?Z{U>qQ%xa$0*v&QuQ((tUOpd;X0~eP#5~=s|AXO#Inut{!b|AzyP4cqag84)0ahUr3Cy4W6bP0gzlHK~@dl#r9 zQ&4=lU8s7(#gq=bn&`8NLwO9m;z>z!oIVoBAaVw_<%dUV*p|j$m*GW;_R^e1X$qhv zxWO*06F4q{{^b`5y?}&NL!#=ci%Od(WMcv>t2~}slZ3@#{c9o4w!j-94cR#dP2FqG z{KS*v=3a)%{R!JGupXqiGO+09h(Y&cxFHmZA1~^$3Y;BnJHafbfocEgUHyc5PR8jJ zcw&Agi6rBvA1N@Nzv;WjS8uvQ;r~j=DYLk;R5J3fS56fnTb}@1AKItKnUODFQdgrp z)*YCKI%mYGEK`&1}C`Co|wZw`CEqqw(k>Cmbn2#~hOuaFcawK#Rv?)yK4i-uAq3GN%gMnOl zUFFaWI8eGa!KxZ|(n_%S6rw_>uVJ$@EAFZTeDlIXRIEC8wptl56*6!u*8Kn8%pB0Q zk@<)O_ur9Te!jdqo&&4eHdP`RWn}a=a)^=OZF7G0hWQ5SFgub!K;>|1of(zAm>No0ZO-NvhL*0<%LUC}uOk#W(bxq=lJpm{h!?G_$tp)wW@WytOeN zko=@&6A^T*WfkOiTzuQ*fz$F?j_btiE!gK5a1<1@4WNTm29<0BRH3GNkU+n;0W<(E zPY}rtfQHBecTdYtVJ}prcb(q>^<;6iHJdLhD^o42n;vAm1CS+8@j_wT@eqC8h%!C? z9H=pQ+~y^=`3|b95nCO3`!Sgg8r%U`h*w{kS<)bOkO>;%)8XpmDzK5A+m8io2`z%F zqmZJ<(e#6V6t-9Y8MB4^{ex$VK(ouvnV1W6*UbO4BD8~uTIC<>Pe{nPQi+@;B;sXH zFx%#Wk9(`JjEPNUd^l1Y;}Bc6z5&%{+naLBcXfR%DD%I9stmrP8Dl=e1)V(!Hl6A< z)M7uEHC{DMw}Rb+QQwI=A0!t~s+E)!BobIX=>|5;YX-aAf~ z+#xgcyO!uG-ty+|fa?`#5-bsYII<9|MWNn7&B)_9;*RH4KD2+Jc;3aVoeIWX%*$OD zH^!s5k^_=kb7w>*lwsDMhS!!S*E0ou^(yVgi_hS6a{Tifif(aQxPR=sl$|Ev2R?su zXtuPk2A@LDpt6bmR@R}aVGZfZT*bQg84mgoC(`lcGQXHikBR8XSu@^u(c(OW#FK+# zapzt<8dQThh|~JwzfK=X^j?!sZ~|-o9dx9I1S;GE(BtOztCfIguI2wS6${U)@A&5Y ze5?@l0PXAnc%T-13S05^0SS;SCU56|ZTCzOCZgSdHmgic%R3o$>Y|^0?GLjL0(N{S zOtHvqC%A4AmhU&RfuQ*V02O`DuAS4~aG5vjz+QF1%M*$(GQh-4?8+MTGP|s{@H+g! zwZU8ZLW~PUatNRR7H{BE7LUeEQYE6AOkUp3R0Ox00q~G0Wdq{S+==@(gvfnYGl&EH zcU^5Ce$%8fZ)KZkuh_X%_xg6dXR+ zD5}~hagEz)@wHblD=0kwS0WO?T9%OXaXc;+7%_CnAnR`o>OKT$K>CBwjsOQF$1t>w zxSvrL=i3K`3XoA%+ha|}7Yjy8ZKP45IKplVH!!#p+%>op z+#$HTI|Kp*cWd0;Cb+u=cXx*bcY?dSUCuqfw!?@4ekH+N_6oh9CxH|N1Au z)yaKjxfcVU#cq9U?F(l(I7x2*cD8Au&%j@Pgjwu_;!Sj?pl_Wdck{V{jgYR; zX5V?B>Wyd8NkZj^v#7(4(Z0i5{Ucw>&(bndbb&J*X2A4671yV zL(HxHTZa3yK!!i$PcD*R{z25yt@YF}IkrWQ01VB%~dm^S_C9l;k!$ zl8-{(q9~%DW^qNt)Xv1In_7zpN6~P9-8ZaYFZwe?6xkm{Df~H9*~qJlNd0Zm?($Yo zXul8jILgRr9mnCoNOnv1_+W2GgFwaP9VC|snhGio}|7K01&KYvUDnfG&ou}o(*}B z(jR&=f&Lv*(+Cvf0*VSXj#bB+ zY{~Vni0C)C3#+5}v4j$enSHjx6cm8z?>QSm{Z6#gv4XlaSbr{*&X4XB0mh22LLk~> zmU@=I$tBUR0%a#+m09Nm=b`spF+E8c{OVC-WAW2zEMr}gBb=5c(ZigZXC=jx6^G~}9x+eGc$E?x$NK*A3XiA+`{BD>DY%%;Fjl_ZM?9I1; zv_QIr|6hXtM{n2yidP{Dl7m3i>mmV3kea<|Ka@#QMv3swjWC7_N-d(gOcQHd+-zg; zfh3hpP#($LMgG=9B!SIjR(NB2b=c8o)oqwiM@1iw=%w3qCalD;hnFfvFKL0UFIB`r zknMtF9%X`qlvl}N?24Oeg$8r7}Ux5qn$0(=#z+P4?8+j1T@c~4@~UgVlzB? zG5x44^{OY1g?K8Fk`b}5&%ZuJhq_@Rcpm2$=gEj#RU@n|3xv*CYtio2i&DhIVb7jJ zEVC~vP7xBnDxQ&&Jy;^IlqNFj^2Q-W3m7X-DS;Fb7WJfLx=~rbg78%6cEjC)%37mM zUS(OjoOhOR^jk4|d!yQKp-RehC6%!ls*PkBq+u|5h##u;R4@L1Fh3Q9S zy0s~c^uB-BCeyTakAH~dbwMj&q-*(bi$tGot-$uvbfrmc$Hn8ayZ3%vDI13=hAL@x zJb*jFvBKvOw~4j;g?I0Mw$`HGp+S$Y;2?PD3$D{-#8pfd#A{N&<*{ynwM*blG$ z8|?$@a_7~9MOo*&lV8CIL0+>QOiL**bA*7K^{yBd)O-&kCat91aq*TAI!%td4}f!B zQJb1RyVR>yfLpSX z;Qw}m|0jCszYbL-P`u(%5iA|NSBPAQrPTV3{K?0JlZ%t)%2M>Id;R^^KX1SUP$HQ2r2}QPEJ_B>Q#~*eYr!K%S({L+kJjia9b=uZo5q2Hzw^ z-dBd)Pq48^bhbS4>tU*{4#-Mv^k2W_1FN}DvcD;n?1}R!8BjYtn87z%+aHk_+6F&gdmUC_2_a zKde#vXta(&&Qbh%kGM8Zf zT=#zda&_vqQ7e}$@U|6qbw6wQyEJ56m&5ixGi|Y8@B#$yvWrX1#45HwpIm4j5fF6p zUOUK%U^*)aUILOS{GXqq>RQSjiRG&y#ox-Gv!!Wb2zL0LAEOO7yB7A?PoKesnB2)! zB(4A2t2;`YDo0A4TiRQF!$P6CC+2NZaji^QlzV>cZdHUzw!XNfU7bf8;=l;pXueP! z|I=JQ;{v>d%WbzyEH{?zXaBlSFk>t$rE;F%C=7w2|CDr?Ob z*OiRmVe9F*GxEwAlXkoih#4ZUAEs>CTAFN&vk%H1z3I0^Tm5CFqh|&v=#V2YNtabc zK4pSM+{l6Q(sA$2gOQ8Vfku%Beyzr9N!M^Bsw*24hGwc2rZ+yI8PqC*fQBGaoYKVR&65+p}*Bh~k<#X(6d9+$y}@hzL22joq8& zFjBH{U0X#z>OO6lWcFv?@*lhSjdQsta3)<9T|Xr(cW?l;K1m%A!ZFV^e=fBONqo1o z^}dDeN^KWS2RF1eQbB>^IOWRCvN5szP)XZi0kvWq!?2vKRLh*}{5_0_j%sal!)k{w zJFqp*K<{;6reeo0HO~%P40IcJV(}c$AX`s(0_!MwOR5flwMJ1e!w=`M6+tXYP{Kx zCKNLWJ$?u(kt?*-@?ErV`(%^b(P@#gA3wo~j5aeX6VHjaQBHqOida8)J`=LUH&)MP zE*Mn2z>1j7W%qC=Mju_i0a^b@1R9eV04g$YP{BM}e%&gW6mJd(Fe_Vk;(esJk@2inKa%97`#6r=Y3-WLcVB$MpV6qOY+h`1nqwPy z^8Al1FK`_Ft)OCNX51s}7>=q=(Y{u$8%dy|yi+F#2YVO3{>ZG{o zF)dw6f6b-7MX>!-1x?b&h0okxQfJ`>A>4k5Y{c5d2)x>@%mUpr&N^V-dq{4GJ#f-J zBn@bO2nO7B56M7~A>Cou#NjfoYIdgZ*j7>WYr@RyD*HEJago>r^8l$20aJyci?UG; z{_*(XQ>X`rKSDBpzQk^0@wjdW9YwbncBvkaG}(biA0Z6@(G8EsP5m!(&=0g>yt3|2 z98{E;^z50@*S~y8UrDBOwjQZ3Qx0-ozs+aO{%M}FU40nebTbrk6!N9nqph7E^!_r_ zPxheE4$B)2896!`@FSX8<4sr~+l{}7rNU6vnC3P{e?1{P6|xn|p);pu^8oHoS)Ujb z60SemRiYOcYbX+4q|{5^YDN3_&TO+(e_&`#=ID~jw19oNv-7<|6fdlWdciL!<`5al zk|y?lMcUxSCrDz*3~}(o6J!#Qidb(}6NHXACnA~JvYS(*+8pc(A2LWaOdb&+WxoTJ z3!hL=O3%o8#9-yxgYvPcj0LkuA+{zWg3_B0)|C04( z=JkgJ@}C>7;o;?@Be@$a*sZ{1i6FusHR=u`iKa}X>XsW@7|Y^Ot{*Q|WnH~E-Cv1S z?FcQ}G@U`Kh`+1tjKb){+ED-YxegEoaXqY5>4&96iWj#sLgp~=SeK4bZjnbcxytjU zg4UN^mc1G~u5JDbmPk{n39)^hwpMi#DWPx->1_UTnCf8L@l$?f)=nNGI7@?Q>hVeI zZWjFe1(F$=R)f#r&)BRm=aScC2l(U#5*NxA)x8@G_Xi9>#vYhkQ0btm^VlgU{A1r#JmcP#FuVwl{L-*0;Gn-C-en@`rbxVgz=)- z^!xa+oHwu5*u}QjBPF`)>4F;zlf21}Hq!nc5%&&^`ISg}89jY3$~hD;fl>nzmso%P z`_d1Ganpl()s>5W9?FJ7;iS5{+&oQ-_9bjA;>w>u#}oEWOi%8@SQJ# zfze)F;XT7!t0sbho^szhupJz(<1s?@6T62e?tf+Fn3V6RLF6L48ywifL@+v%R7h1< zHfTLR&t@qx>>?u*8#1RF$l$97g*Ja#5||4{R5rwKs1NrmEH%!Nja+CiG2EE`Wmxst zrl3aAVhXn@6vppSS!YfFcqkaPS9Ll(zD2D$3@Apsr2q94DC8`T*EC>%Z7YHIosS%H zi!l1>MEaiq2@5hKM)m|e>q)EH4|h`S@0Y9w!nB|FA~{XL$`7lb#;FU1m1#6RZKfmt zUvd2`yc^B#$EpEr_zVg|b!*kCSh9v6He>lpGNei$F}yruv%SwaWWe;?KJS!B|%+%@cVisNO;Ys(DeQuOFE_ zS|Jp4_t{ujo)JhU(2q26?-0))CUas%#)U#eoH<}O{lbc|0Fm{ur6>&dv}GaY`+w@i z=`SBWr{ym!3Fs~##2WRXAf1n{VU8DhjzW|xOHwCjjGZ;= zGG%>J{nD0ao~}jPeXCNvFjA3R-eO~mtC_?69SM&Y`%r{W=o4Klck8X~go3s-*#p45 z#?fQ_KMs2XqBaf=X}-m|$^Hk~iXYjz-&!Wb&>F_CYvd=GG@IS`(5${jXYlIsJ!89x zq~1YXu4P(?8^ca!*`LihFs3x#xi^&}DH=0+6-}J2NkZWC{ux9$r{^zZ+6dCLCey^_ z!jJjCO<5Hzlmxfrh^>7aB{Zk5i;ItGTKk=Q6}j$AXLtWy0B2p3xgj5h$IreGKa~1y z^yz6;RqQG=vc8eT8cTz-8&oa(pR5*O{Y5->)d39Ng#eL(W_6Rm@Q@%j2y-w$B#0fw z=WDq}GE&8{ar3~6V<*@L5)=b53Pu8fD6t>`0#w9&KG#B*aK3%>0khwMhcS3yaS%ux zhe=7pELRgu@zJCLi+N&w48>1w!v7rr=Yl}O&>p_?e?JNs5GWd^xQlJlr>w~X3PcKl z@2nX4F^&3C5p^nu^k=t$^~)S=9la~uWbrk)4jS|o;uw4Y4I-z66gu|5E7IyU3@?lf zu#x0V_0Y!ORh!Qot?XaYA|%9bcM|iLZ`4`9RUub1 zI+aoX${@1n=RcA-@5L4MP&2!@D6VLe@2kh>lO6kH$|UTD9ag(s^y}5-l^kE$%Bsr= zcx?ZapZhqDfv;ddtRRegb1)SwNErBO2B&2t?8C3oU>bX}aogL6c%1&{zH-TvhNj?s zjh(vxTQI%0lqy~$O%a#nVu=N~{raU3F%l8c{>PcmPHM4%hinGtrq8|5)Y)1iUUJh? zCY#e_<^}rT{O7rtla-d6TO7wacH@>Zna5eH`OJGp-&-IL-*IL#i@Uz42p`wN(ChuL z?%w+C7+1E5*X9<4)~pwa$I}-06&B=&yy8|+G^~EJJCv_Sd;*Su12NNG-nTf*gx1mz zw$Tw)M3f(c76v13^H(R3DfVDUF9gf;8qWim?n&#|OWqG2hM-UYz@6)-8U00l3W5JPI#w6{JCbPj#IVd7z{#RpD z6WZ@9sMfv@N6%f2{^S4BatygD^^w_*=lQTl#~Jhb`cgXIynjfuN|n4T?`e7XCGV}X>rCRC#CVub4ap4*2Y6rYG>;rytH!FLB7dwdEcL)A!*}w(o zi&NLrPmG0GbSwK&w>5s^!eamZ0|Kf*+<^lj@5`Ak;2q-5W3b|JH792Hz*gyAc6@*O zOF&FI8Sg)D8?}cv*(`xXz41Zl;&5!Ve$_m82(Z9to0m(`9fb0*DI6340yb*anXvfJo3s zbkDThuP)v$oQfS{<=TFpfgce-LJ-hk9z+nG_Kz&=D69cRH}~*>%%Jz8^3*?5C`+>U z-$&o&k~|%1@q}iFQtI;T2gj=`#3WO5J99hNi%nO_Bg>gFHCW{@F$B}i8*Xjz=Wday zujyF1a8iwPqQfi0doaQ6h#)F!TUq0;RUP3ygR};mR5G?Y1}pYoi+iOE?Sc|hTjJl) zB$u)iy<(S>;5wW7toPYZ!bMd?87%Yn4ZLu+`hE%FX3#c`!xYz9-pLO_whd{CUwk8V z>qh&bOT~2aRW)A7{R{HnhVkNBjd+TwKP7&5l1+^5r6X`B{aE7GfLgx9|HPSZ z%8*}-k`BE*2Q0Ncyu~#`i&UeyvT-WCT>*#R?rQX))5k3>*jYm2wyb$}&V$6Ur4S3EiW=(1A?LS%hwSZV~IySZwu&FZ;vCzKa69qU-Rtcz2Q}1FzD`D z|0?eOtfvww?4Bgw*f0%cvpAPYujBipc6AOnL@y9tG`$P zMc$+#JLw2!^^i)xARkJt!;HC_hB}^`RYmu3a!;H$2e=Y|nNEp^IZ%Dog*V1Ym`IoC zU;KvN8?+ub9{n;aMa9C)Gco#gVt{6V1qq>Q%LIj&TY&Gs3L0zJzT1ApYNyOI(ocyv z8#+{zP);yiso?y_b46v290`Hy*UaFH~U8nm>Rf>21J1p>uvSoq0=4d9g@Q@@-`ox#PfucHdy_Qp&c|62Cf z*Ui-b$WR-7?xlFh1$&@^ctJgbc;H4&F4bEs5ikqBPiIPb!kx?6bqVhv z>EAp!W$IzlO|A0YS1I5duc5Or)tDOD!{;a9k_3kNhNGagsFppImd^#O$P?<+qFp9o z^Dy#20LIJo;Lh7M3zCv@ti64zfuY~7MDa6gIox_U1|~BVt}PQ2IUQc1Qz*o&5*^IV zv&<>)n#yEDKA0FTWPI$ecksDKR*oJ#839{F6$W94DST%p5YI;)RiP=ew%fK<9B^!%+!#BbH;`cTIs%Za{bYy zvY|DF*-UzrPN3V)xwp1K-ueEticphj_Pc6y_3c zT6gd8?-nSR{g5l^+QR-`7Mg`kLk*YYCiSp-Lk|bTi2DlR7<0#k`~S`$n0uve_D ztvX+wQ$=%M((_5V_Nzj(C{5J*B_(;zOrWyz^qL+ymcPMcVPR~y{?HL?b^U1|sB%CD z#Wwc$!&IQES9*giA|CqDF2AWc9|NMY$N3%Uj&bw$94t+(__!Wy=`pO$aMsdm^V?ga z6gSV_P_dvR&CvuZ0TK!RC>8qo4aBoy*)?L4(Oze__x(H+IqT~)JOW>&ZGxhXR*s@S zXO=sL{aFWIZYC0nNnSR`vbAT(*vzl$ulww9COb&xH>qdC2bRA(e(PbCn13HV2Y6pxC9st_jny*VPhPo} z`8+-Vrxx}eO49R+{@lQulLWC_IZrar8)+bL) zit@_Jmi?__Kv@+@acFW>ZAp62?e29;t(DIY;rc*UY8cWxQ2vv0uI-SVg`DP z=f3O1!Qgv=c)f%$F|=yCDE-lu52VF^9H&eqkj2;Zc&rGLQc+jEpI|2=&L(Mu((>Wx zOGHl}{-ix+cm?)&9o_#k-t8zmBG}+h40QweFlK|ZPmEc6r3Y2Q1i8A6&A*W)gvxve zvXqs_G9=K4KW=Ek3Z|8hjhx;%QvB9e?TJ)1lW+Xrc3xWxY9+-^x+zxo%m?NngE_1m zZY;lHJu{Fw(COe7>Z&jJUCG20l~t6|=%S8l5sD|tS{*qo`Zq*Mc;+FE!T=-bx?1E+ z=^pQX8qarisGm)kJG-vDMk1b22x~8aSi?8%cfQfmK(YjIau%=a!A93R3oD2I(_^es zNW*MFQ0p@OL$kWNx`aOW5F>X>bMHtzNnVg!uwL?GM|(XbHG3ev?#gnH16JDHoO*c8 z%+*!xNmM=Vg$&s%UUgD@T9kC&nE-z(WWck?-^G5jC9qJ(&7#0{Q52MB*zPw#pPRso z_1~>I{l@DQySEb4H^~f(ih~3A#L$?e?n_+F99?j%pX=do1!DPqUZ&S2amKx01{UnH zI7k#CKOA+qrmuEFwr|G^OKwbn=iyKDC*`&HnVFn3@Gr7yb*1A@JeDf3onJ#Vr=Tt|_Tuf;n*OXC#)cMVm zxNVy2S04E9sv7wH8T!nDNRfEyeLZ2ozQK1hd|%s*U%~yjj~PdZ1y%PLIMiGh4MDKc zEWj4>ZMxOMY&$FbGVmzB+gMgs_DA*eOJWO!grKis&7vAGRN(KUQ|7|b!K{8f8Sf#W_mtNd`Gso`D4&;X=Ez7%L?wA+A7@)e!4iDCha7>Dd-x(Xy zf6=C$1>02t#bHo65eb(nRsCI0RBpTM^1Ts+voa2`Sr6aa;mMohgMRT&eB~@xfXN<72|s z*3XBG`Y=M1HPOmC+4Ou>p}f?OA@3*OJ-3HD$*|G`0P;_Rs08iVKJMx3_1M~4(-c7s zH8GZBSEjwQmrWE;dCi8;}WaWk*Hj;820$mu7T0BJPAB6MGi0bJOs zMKQ`P{)^KY=Z@C`GxIM_V#u({F$=|vme&NvAAiC+OB@65SYP=Jz0L|N%3$zf5+#|| zgj~!3A)1-lq#e%8R%V@RK2Gu!Tp!1Cst~^>NPp-pRfBy+!sTXf!HwQ~G0$4n#f|oT zI2DXd=cmOUBSx}MiT-^w!oH~DZW-O~|izS!G#W9C-CD8Y@d1-XDX##-`McMU>wF3DLmM1}3(55dp1oBrte*sRPH2m4>{< zy6j|p@NUX#(gE}bw+H_?Bg@P~nO5~VEso-V zD#l$bOlU|5!JUg&tEEPYRjH4W19QFFF_MVcKo)_U1(I>d6rYnL3N@i^B+=oKN#ENW zvLKW-&xIe;zcy~MhIh#%^i8rh{rKd1+PppR1~g|-cM7pQwWG&J$C^o8@y=0nkXL@) z)T=SyV8h6TYu9K(#y}Uk4_OS-jFjmBB}?=3wyU!_KFUzWkG2QF2RFaR`Ga(5v`Ur^ zY4Jv+;9Iqk22aV0v(pltc{WQ7^So4C2{rO6bM|xQXsCqflIodPEMn7|!K+*+!i52ZW4|vl5@n z1^cb%Vn11Fu#fe@Wg8;6Fj^o>v%6@~{{a@Mq2xk|Kc){9noyp+wIyNiSDlqx6WoC8 zMW;SX zXpR;6r)oK<;c5?tm%dA{p=`81!5ul&VM~7YgZVN^MD(4QzZ-2QF05C?NzJ_Lq;8o21FVCMy%RP26RhkbAlx!uIw3axpDcDkD6V@$A zGnaTCc*n%dBK3j?Gn&d%8FFveh>`wvY0QF0orcO9KWtt{UZnqz6ha4rfIdvSIJU7a z>5meM9r5di1_rKW|A<{Tr3AZK81bjRaqA+Bec4*u7}mkp`%<`BzdF0>jTUC9IELk^ z5z%fiU|yS2+R%XVMCmwl)>k>#9g%meEk~6dzk@mzYTf?~4$;fCrsi{zA9j=-hD;y% zoRxRk3|xhxc@(KU2(BnUn@Ay801g!TgLk|`h?>ESKxpAEKK&TEIbFoslo$2{vcZZR z2_DEEVbo>j`rzs`vra=km?(78WY@^Uo)3OVZdJxluEJbXSK^KWzWXOK*GIgdonPCa z?migap{591qi9dVTfUzEK6d{m65|5)&(Hntf1WL_1;oe<2Mrlp0&dd9XD90tnv$_6W6Om?>S2ck&8fJH>CPC6 zZ50D3Z*PYF$~bs>U?VWln&0R73$+uZrR@VV5Xe6DEL{&VUvLzl%#B;_=1erU7rvopR;uFks^dBNsHB+SSU%20wt+=ea z2<>-B+-8O6#!n|m-qjQnUt`LZ5G zC}eIGPp#wb_uF`B6_%@da6n?)5HSmVD>pl<(>Ss*vuIMgx9RcXu7M-+doKau2;g_A zh^YS>8ZB{Vu()3?O(R>2&JQo52Sc2D!sqexY-c8{xcismN7J zDE;Xs{&f}K?@uGB_+m5I+MjepBJM*|dLHEAS(-L%_LMz8m)JDM#|CM-zR93tu5Z5*9h1hd(|{|8nFO6wH>KW#E!f{Uu-~7KI-||BVnPs@5iw0Kx0m5l%y; z8TH;onVuOAI|RWM3`%=C5eTGA99Z>QZMDMclFA>ksX z6z{af-SDRqZT~hE{%?CihvrY)(13qT!xH$1!e5afHsE%otCqKAe9-}B0gOCvh- z?A^UJh-nny$gAu8X@wThVa|_fM^}$cTdrJ?e$C&7jQWft+I@|AdL8156Uw0Y3aeE@ zJ0?ZeMiX$53Yj6%qwhE>={-PDT1e$q2Of~X;XZ38umvjD*VMRaRg!E0f~i3!PxOwi z4%VG;6dfv=TFIA$8f}Kynmo(*F?#gLirp2y^t{%tz8V-{-3izNw-c?3kft@8Wzzle zdY@N+!0pKo?jn9j3|Jg^Id%k0b+~DyiL|!tN2bWbCe&-VNz=L+;X#3nqsV-*8 zUQGHdvSFUox8q&roU_Yrh12cd7bZE)hqw4-hR#C9Y&6d@|9D`Kc|l+SK&^PSRp z5iy@zLrq#kTwVcpx!b^jpX1Hmh36-Qxs!iAKQQZfRre4?%dg0zp{6XMEtz}aunU_w z?4IYzmIh;;da%A(1x!$*F2~+{jgfDr=Te?{%ec$nLx)IHT>H zANaXm``Xq>8ewQQI6;rC$KzzOI-5#uC+KxT)bTzppS#czs;d$(eVpP&B=p^Ldq5psZyk;sj5k%*EW}mhzB}OaP^Vn--=vQzvY9cexGdfb zAhV^S%m=Cun~7-EcQ1H`_lwNK3ljCQZhC9M`hHX5X39l)xP5vQr9?TF8NId zSHb#tc7KT19s!HSlFrg;9@A{}JZKW{|E$_Hu#jbthm(VJCkI9aNO_5-;->7^5^E@9 z9_OZy#THu=@zJfTF~Gb;4tmoE+p~fuy(!v%dIWPfISv&Q(h57e?(a)}!_2%!NQJPs zZx5fE!Dj-b*uhlAyoB0d#pww(D6eIFQ|##&$3MNgvvnf0B@Cz{Cy2%mJYnub**Uc; zAcnaIxdV8BQiL(%!o{Y@?P^F!UR;jHa`@cZ!uxk1ys0>=70`dm!cFJAqM*ERm3s~6m)u)ESWEOSsFLHY@mG6`;@-O;#Oq)#O7QZpFWYPAQM=rs_| zcy!@0V)t`g>4iS9t)vN;HC%VeoOgESU58{_ zY-d6&fYP=8N2=sJbMwVOxrArLf!1>9qMNSmxW8^B3V}VZDdty zORV*EA|Vb_NZv!>JJfmRILrYZIg;VL+8ln*+vB+s7I3k4v+}Cym;jmB@k>WXVU%@B z=okN@>%ULw4k{dlfeAjoUOZfE0#K)rv@HT_wlu>unRiPB2}jg6@hR`6JqVI(*p6%n z7izC7Kl5czFyg+oWq|E$0MTEpAAMc}7mTBcu1x@rt31%=O|08T>9OFQ;u)Us<_QJw z%RhAeGGHcpY;TL+{k`;9&lSE|oni@!m@22-;}|6aj=dxHt@jX^TnDLQP5ONn($#W!O0WZluc(PXdIQ>yt_kTo>{G zd=%cV`!UlUlJa{aSXlt#Czo5Sxf89A8+bhvSzk( zUy-kRKpE?8H4K5Di4MbbwJ;=9g77s;oq=V3q@=CA6q0@5L`oJulUMQS1mb5}65|Wj zPK1sXC1Ply413}ra*i#Ps#qojiF*A&> ze<#NFKVI?uHF>KS;q2HM@Ant^ZCu~jqWpxvX&g5HvNZGm1}_9Iem`5;zt~GYKXfy;xf(EMo>!S6>KhW?%bg zd_Mlq--V*fD#?n=X)qGfjn&DD|7mv@MscZMFj&C$AvXH`5Wtgi5@ADOv1AZt&##&Syv zSh;`gZTdYcOvUxbx{pJYMO7>UcVY+C|H3j{4ud!DA67P&5A_XyqWF3Z4!Vijw=E3C zLaTW*!|F60-o8QkZ~8p;N#+fBpASL{qIDM-)~=sh^Gvr*^OgUETEn8YnQo8LTPXU4 z_cg(nWr+ye&DdSQ|J{?4mL*y3KxVz&1O}9};npKfsTB5c7_J@NAbOUoe}X0jsS64V zdz~SpN48Wer|ik(4rv=`H%=Af)4ma&dq(Um{xxYhxe~(tQr)6_%qOxC<3(r|t@$#QYqKfb zwsn%!LE6$_S%tSnm$9PsYE^2ttR*BZ4?0F2ZV50un*LfFkpSM?&nMRL>iaP7wor%=kenuC6BEM zoTrcV=TE2ZIlR!s8}Lol>ZmuV0wfW|!CHrAJv!T))<6-sAKT{{7@=QlOJGIAimIwq zxH8Wu1|HUm%he)4aVGmi$W(Z5t4I8<&js}jmFSv6RYP;(ga7in5&QSspkwhzJ>H@w zauuCqRaSw3)fUe-@pj(RHP4tD{Ze`C_GbEB9Z`r8ZsNk#4ItwBts`g?v{4>mMF!iy z6_=FssTT)Nt{M9?oIhQpUw9c_#K4DEX&kK2;B`b#(D>E%ne>KJ;b%P|rWs0$`Hlk43ZBH|CO06u8{mKb_j9zM ztV-dP)(i}az6002U79U~r2{d!DF6Mr|51qW?&tgzE0R|{aQ&ioy%ok0DH&3>f8)Oq zGfdz-yr9tKdu>WZyPTT+@-`h37J%jp1f%Cyu_|f`W(Hi`$)74ZH{gzc?TNPa<-zH< zRB>HhX$IdqrwJf2J1d_^@yuXHSGly&nuklz4pKiaOtzK;k{3!QaH3 z*?<-B-A?$#0v&W+=a1}?xxN5?kM&~E(r+FntIDR;+;!VQ73Xfx$k2;@6O%Cj_M;;$ z(CUDzJtyC3fiieJ+|&opmg}M3rR&4Mm9-~?RO?wuQ+SDIWIUIXbN%PH#h@rU21GiU zS+Z;A&@&&U*es!T@7f&#+U(cQ66z-sGQUbJ7uHYH2Nkkd&F@UA5LZjY^jQ^}Gep&~ z6^NFEtVi(Uv9fqPKf#R+tDQ9giNgi|B}@=NeEVCcb0JXi+#_X}-V=peS^Ydi)*AgI zlxv2$nSqJi36GB8T0n88tzu#@85PF}&hW3?L~WaTw#Xetv0?TF=X|OQ?I=wn>nT)A zo%qz>bxFi^_{=9|;@_plvREy>*_uV+GD^(k*}|NfP2U-B{^QUE{;Qeug>-sd=|}zP z&@&%qK7jX3vXJ_DPzC3|<6VSZL~{6N`_|$R1;eXsLSfec5)-cQk>PERRcq?r^(9&@ zg@+G6>5nt~XG}%{gYmNbwSp80ePoZ*i~1ZtO2r4SqFu@+u2c3I2Y5_xjE#S$`azE_le%dtPQQ+hES{+R`FQN+acgrp zEr&0aA{yG&xWW2pdxHPM2+dDvl}v@ufUn=*dg(i_HNWD$!<2`$c;xIg?8+k|9?@ zfUeW~9@cE;zH4p{%}tA#y#SaS(yFWaO$ym54Na!Q)qB^88s&8HHzZT}wdPOT+12n3 zaW*ni9>}p3+uokTCKlUQ%Nu~0D7QTO6pb(gP$-4uS8Q@yA;};_%fb&KVIUIMSLKjp zYB)9RIlu)K?$J9FI_-W(+SC2!!zWqnjT(QWGcM>YVvp;4CW<0wb6*h)x6x-oE5f!caVOM^OEVNC;}EDAQm? zTP2_An$40)w0SUmYV7*<3pAVQgplPe!nDd{@-;u-6Q))@NJXwat{1(O{fZ}Fg_*X8 ze()gWp_va8ma~E*)4aVz_ZbDecvqbe!y3hMe!IMi+iAAiUBS>S^nkI`lRrN0JY&h> zi|wDVt=tKLX0y%ZK5^K0|KZ_bIK-<1hL75yIF%!k_Yciv02sqS{}}S=x`~YneEe-? zK*M-NeT82CXSXVRH;wt~3W%S^YYs)0gJ0#~Z)jgegP`Fx43QHTz_|c-_Q~aOu!s`l zbgUAcN{^8vsF{gOPUQ-Pn%36U1vx@7u|P)cYo7Wc`k~S4gp_9J>Edynb_Jntuv*aW zM`tf^aEr_@iI1z^MGFxu@cIk;bC>o^oKbj*!3zA$WNN68nq z(~SPpj$-pzV$%WmTD;TI4*n;FDcPMo4>SFd3~pcn`QvHSznmWx=)NgLm0mg1iZyVV zf#0gfZYO-)alA9lacPoeY+Fqdui+l7{MtoPAECw?UhT@@la#(Bh2LmSSXC3#Q|=WW z+@*FEBsWlS1hm!~h_tD`T7(;3o;!se_<7iJx zj!%qFi1o*nNy`_MERTKc^kv`CnB`qQ57K=b@K%zP{Zx=!mKE9eqev9q@3KV$0mnoD z%0W?em0*F*YZ^1f%-`EsW6pc++zwM$Lf~b^TEs~ld!ZZB5Mu->{}oit+;`KOZ@(Hc z5+8A4#se-yUIR#S$#~bQJub8PRvw3m2J7)T=USaTeMk$3kRmYum}lwtwH|R;)Zg!_ zltb+9gTPFA34RVr2`McOY9@jn1v=Zw!ONb0*lnGiu>09-gaI&$BibhxdlMtey5=$?)2O9vbj zwff}<5($Rmlf_wqio(Mj#6MEBvi<$Y@Nj0UsFM^->^3i|zS|Q2yw_&ea=X3!1S|V7 zpm}SdX@M~fJZX_r6^5V&RJKP0G&(ED$%n+{Z{MzxcdRhqcsRQZ)d-WdFiadaUE}G3 zfFS6J7k$Wl=wc%A%kzaIZ!9tg{KYC*XcCF8I;?fcVH(iD9g5AtDo@8toWLpxl-t?o zlaPl)Xp5PEXEc<*mh(3B=G)+J_U!4oMU?cMb0}PK?3CYmZ|?0rSvyXgXH5S&{5=U? ztyO3y0bb4avD}fx3fR3@Dqws#{6f10)EVL>b2y)jNtqJMWz?Ci#&shQl!mT%NJ1*_ z8e84;9h3)9ezmgrzQr+yI1gi}sa0|F6gh&R6suDvVxK>mhpy= zBRW1o$~Ivt&aW#8xN1p{5OEL5elh3CnCMj8xb4vIUcLI3wAk2GseZ@kQ=*W3;CF^B zBpAjjP8f(X%B8*IgW|sr@<|v7jzud4LPq4;mOc)FvF_HspLm4ZVrnD6&5*hfK$hf$ zRVVnhC-{{MHcvW7Q~GqH{EgQ$@+$mSup5~0W{Je#k9qq96e0S+G2!l> zA8*l&Vg+3Yk!d}@XbC#u`jIZRvfnwEo>~BJY+mCysJNf)S&RxU_G^my0J}`Qg?>gc(#-}S zu;(cd#FiZLJ6yWxf3hAn3X1#N7bCXw4GI7qFG#R)yL;$bEF8QP7<+o@r4q(=wbcl1 zWTj(c;I`=Xr`F?R3V9gkFN0TFD>-r4}9g zk|#wxY8$>;US03MDZXx}M!%sTtSMVVJmfFRKNL7HUlj_S7p_bTmFVBL)z&)v0=UxN|>2r%8kVJLb?|aF6)Afr&3S300miHA0xQphkE4%GKubdsHg`pzEo$dw6;^Se<(u~T${@(cV{I7(#Q=m8ae1Orc%Jeh zeRD42R-b2cx<%qul%ol=cDJj{sfP$`#vQJ%keu;;@&i7Phs~~b$=cFC`1Nv{Lp`cDzSl!093cTi?d<(8Im56WaQk4jIJ2x z70ueyK|NI=p|0pQ9v2(U`1Evgl)=4SBTMt+ajm8z?*(1ZVy+9!XT(I#-uqQsT%1Bc z;C-#dRmT$~V_SV|s<8OS?bp^Em>--^RzN-Ut)ooaZEF`bDmw|Q<`^%T?r)JCP~v&B zlZLBHlq1Y3jE<>>3s%O_Sc={$ATo(i3JncETUkcM^hx7KHi>*|gJ-YeO?ow+8a@}7 z*<_{t_Psr4GdFKq7c}?50pY(7;PTl=)nG`R^7S7pUV}>^(oWy zb{DJZmjb4r|TD4>22X zw8t{=h*@33tZ?MLb+l0#>S;rKaKk!vwOqviQy1>^A(R635P=re*8(4boXw+U&>~#m}HhXBQzmitj;( z&1!auZE!iTU&d3pmp#&-%`o4C!@wDsL>v-wX$;ke znFov_NsqD54eHNLJ0CwH;Pq7Hq+Lx`p;<1?wcm8P&#djKWMy)6Ux+zGk_;TC86OLk zndBAN8%klI1R_^|;xGP8JB%olD=7OmwT7n+kH*Y09Swf_nCr<H&-g5GaCw;Oy{IvtdLMrZe(lOGGtN@%0zoXtvcyh1gwHfVv=oq9daqW z$CLPb;FriBtTREKUNC`&ZkSoyS!qp8O(Rse5J?y3qg+fh%X=4Bd`_>@U?f=~>h1$n zu>|$R1uZOeV?Q2Kg)#B5bQHbwgHweH{h6FL11(|j*QhT}$0@%(ee~3niTT-aKT|Cb z;NwJmeFsUlojvGFV(?ej#93Hx#c4>CvvHqpm17giHPL0}^oW6v6tMn+O{j&M??=OJ zh`3*2;xK&u4}(|JtoYDE^B$7IW{pG~^6;nl}qE@I;Ly=2l4|f!c*WCb-T<4fV(q>-O$m{MZW8!!7#HqkR( z&;8|;FN$+#oMe^s!&#~-KxquMX=K)75LIn2{Tq7pZWzvl^gBo6=BCR*8-2T$zLevS z_+Ll9?KdaXt{Rsq1o2>?O0rSq$Q7udfB_AruCujHLSY{5UPPp{g?=EhO#5c1gmTRK zn48sH2?{KaTm>Hz4(>`Rc3TN;N0}|4DDi*17yt0PJdoPDd>^x^ukr|gue9;4dLVx8 zuQxoFzX$b{z;6j{DsuI?oUO8F$qy9Gq^cnx#8YB@cpY=pHwQ>9wLT7A3cbnW^FeTN zH4(f9#ql2X_puE9f(5|~2NNZx-;KT-b#t{PSYts;SzB`Py)q$TLeG zbqNJ^kq;fkj3fjdAs%P==LCtUp_pu3Y#_o~lj!2|_7VvRp-`tGBRl#+FLqH) z)1o-Bz*Es6r!4(vRZ-EPb?PGV?0?OZAoh*)M`@PC`+9()*b6ZaM|rQDb0|B$h9L+x zP#aI3Z`;@eJ>efL3L;PLojh4w9|7oj^#UQoSsTr|@7!?h*FbgjljCcJW7L3>hFH8n ztFrrH65+j-PNdyKPQ!#flfqZw;iTbSe@=1?mAsQ(yc;LScKgfPrn*WLuO_{FTV1f@ zkgY*%`8jn3C^0eg@oif~t@exatsM1B=dToy#Yo^P!PsR5Go`UhKR|@8E5Nqi7VfFQ zEY9?2>$_O?PWq-I4O1~g#qScT)(WLqvGa|^IF}>JY|GGC+Cz2<36}PFDD2RG;;{&hs{tbj~L(N zYeM)2>xD|~)NU8<)7G})lmE+IjbHnM;%TR%$u(wEsAZ@Njr>B?YmNdA`ob!3y?@7}q3wTb9pMv{t zzTEO`L=q6-en!|whdAb8=e;?{IYovtP4-b#+^&E>AQ13EaaH{SQ`1k8pIU!vHB$~@ z8U^`34^1k75Pawx$l>4{%qpRAS7w<&*4rPJ!HSQug0^koYNc%t+8WGh-4|P8t`FW5 zu)eI{O2vxb1S}XuzWt2$Wu<1?>MW-Zy0dz>f8u>^4j>>X9I63*3hd7okXHkFE`hGp zx=V+t-5?uXUZf|#bA1h|3en_5lDoI|LL)#s;NI%I4h6O9c8D=y=&K5_!5;ihb((ks2~- zR0}?bC%zyP+F=2o0y^rKce3UxKVue8Md_K!^t-~nt7YTTzo8{Q9i8ogygBo2fz5nv zh%}Wuf=sZj0`?&jUwGL`9{$|2;6sNgD84E$(9|ynB}UK|7qVH+oU+ihdnqZuVn{Yt zz-_?r4{d?1>jcT{3VcemW7>#F326-rZ?9f_-N$MTl^FvtS5(UIwhFi|hhZ9Bs&%M_ zXb$!dE<{L{lbto@WZi7-mX8nfO=*);68!3`1u;e`;A_kZH>|W4ygwuDF!&tcpLfZs zfC})6)xR_@Pi6&|4tG0`ql8l5+}uS46}JfMrrC_qjWLuQ;gl@rN);T{B6~muEk}0Z z&5CH<0WE;im{QorX1BH|_CXJLi`w4(we#kBJN?K7pNK@juc)O($x8MRNuP>zvQp#r zcr-NQqn~S#lUuIS#A^DaY?liGjr{7quMHuRtF=&3{^T4T{cGq~O(NG$5jA!CGHYxx zb-)%rw<{DAE;@Fl@y;@u1d{c$<9QZw50}g*7_h$;vBD>qLh3;p7}3y`O5+OW2%Tq& z`XgIkRdqJhFDePnud?bj#8eEV{PYFVp{vyvQ`sGFol!-O2}xQ@rD^Yuio(2$B408z zmz$;7t!(GYSvH8i_P_G5zt>qqG|I9SlK1`;gL;PLP;AFF5@5Xl%|hv$s-&n2771Hj zAp;bg!K=RKmnmVlg2Ur~rtj?igPaSaQ_#tbsW)@E-1`Pi_XZ;F9#K=K3$Z7>ROOWXg(?7!gnAAP4|m6Z%vr5sZGZ$ z2XmLXZGlJhxzzN}#kRXuDGinIKf6YNsbRW?Mluz7htGjPX_ex}NUiV(X4|91j}7JB z=WwBrmSKGP`D8y)#Ygri&xiuZgPu0etUD?+NL*YSXO=)qcKT(^X5`ShY;oZ%Wk}rQ z&@0NlOKj&~?tY{VL=Brd?X6+kC5Iocrs3L3#ZC5%SCL!7T;)Tor9Cu@SAz0@2Y#fE zj0{>YaKmDYwIwei$c3bW@hUkxTWAec$veQ=B(B+}UD(6sC_U;L>|21VF(b+O1?kys ze3+*?lIiS+gpXtQ-=yFXlL|GRnXq<#cQ@$y(ftx?2hGS|E(cN%CG2ce5>#qbU9rEj z=xWG6oc2>lj)nx(SjdOCdYOa)F{Q-;Dc07f{W6Hlp*qlE9l@gf}c z!I@MqFG*VQ9h#^%KQ5`LCl{ndlval43G~u4L1;Gm*FZ$csczi|PSn!E@+z(c6@D;i zGy~F^ShOle3}<>od~Y9dJ5HY*9a$k_HYS3p%VJ#a6puhF7|k1LI*d5rt!K6q8C{^+ ziu@s2^lc`mWO!t(YeLRSl8<8azT+hTl0w-&nc>DrGe8Gko9j>@0*yC6zfQBsQc&B4Ty)N zO67rmAR8QE<08g9{N+?NlU6GI!qr_LHb&9cmnDzJ?^6x#u}ywee? zkuZ$-*aW?45BgwP5Mn&qviF#BfEtN{RlPs8{nLBG&)TR4UQMxPzjQw|viV#sP6byB zU|!Hw-5MR*0S+e8c%3gbLsiR`)X|h`>QWm>vV8htpiX&Q>MQ7PIwt348e9tz^>>pl zOXlGTgSVj)r^CW-GAX?Y2?+~siD7J}T9Y3Nyf6248q=BCAot(f4I_Phr?#7FmYomD zwsnV{4%7c9XNXMn`%`y3C+A*$x+hUS0YC85uDrI`cwi0H4vv|b87+Sdhe;o<+NEDy zg4k$%dKnYgbAU_xZmsrw@%y>)65--9E+JZITOs0;F?Zuq(*b7ppG3Ov>mV~n_=}H4 zRt1NZg~gWaypW1aoIVbZJM^k%SO2yTB5y^Jm_C2zPz|R2UCRx@kDoky{_w~;T*&}q ztIr#@KdCB@`@DgV=iZR9CUK|4Fu0MEv-j&~{`v&=yG}UE)Q1r-n}8S*!~^ZmtAZe) zVd95iGM~7@mDy^%i~G6cvLuKZUb_LhWMo7jhl`~G-XSEzWjE;1+jmk2A4BIlX z)=Xgua!tMN@NYly%hR0QT8^xRu|fi*P5Vo%?V38L`Jq~8yA8pEw!kw zhN_AhuWN>v#g{65D1uNS)8Ui82b}LF12^X{^N-}aF6o|DtKLa$)%X7?+SNVo?qOWK zM)be+h?Am&Ph37jWSx%Z0u6WLQ1yOo%kl@ywbLq7gkQd*djAf_l;MjT->7tM+s z82Om|r>L~6L(YzI0aoT_$X-&?5`S-p?5lU_}H;= zvl0m~%9#~Izj;zdseu;PE%jXkK!Ndcu)h*Z-AU=_@xYst+3Ip}M3Mx>cOOD+UN{*M zc&#tzZeKdZeSxk46U#YE&HSd~3WvFS?6I$M4b0OFNcyzLn#g(~?~YB4#PDY?VWsJZ zYsLdk?LnW119iJJloQn43fyXN~*wc#FB!aOawU#HlJl?jAMa08C{mD`K*W$aF4t$qM z)0j~PaMoKaa0^qtZvz5vSqd~)*%-Ck_E@APlu*F+IKVMBnL>C79ocv~$hHt87Za5c zi~Mk*xS*DhyBV}BXZM2@^64l)+t5x^&CA+{+lj^(Q7e6BDPbt+n+l+yNhk&nkNd2z ztsBrv#$;A#714}oXSp{4<2qHVtv~dfchX2Im$8!1p$m_Lk$Kltb^yXNR9GBlKHzIc z88|0ihdhooIJ8NB9hcnHoOXz@j7!8`^SNN%hPt!ffVAAnAK$f-{JB+3--@xTyHhZJ zGVh9#h^GcY3LeCeD5wU34}9jw{AGyZ8Wo>xf4(1YZ3#HLKb}kmw8W<~kkOKcH+_^G z8SG~I!o&cVmr>nJfqMxP+93Y7-DT>k zI;Xtf#+uHAVY7wuKfKW_Kibq?Y$;CBC8%u8ibAria4!c^Y=P-g?ak&K3-U`4Z8N0A zrr+K?nO8R4rnpWrF+&7qv8`pSUwYl5RA&c-2k$A$RgDd($qvIn)}_{q4XZ(3QTB^J zwzP%8B5xmjEL_C!1Nb1#CT!D@Z`^*$38$N!g1*t#&G4OH=K!cDZH05|m5#dgji_t0Ai0+BGdQK7ipq3mAm6|xO}DX1Wx=BGdLcepcma7&WQH-YndCjp3iWQRbkTEj^)7`+^?fBgS1qu-dDvy<2Q_vGwt)lLqtnEti75X zv*_69jU|u)TQdoSg|n}nEp!mtt&C-+ROP&Y{CF1aMq6ut=myLbRsC2Z%(e`_&?2Tj zd4yv#;ii1*jWcAYxhY62{Ll-5{rH3k113Qw6FdKLYVeo zf9tL7clKk|WJs)oc?D|`>Uj3&;qj@D<(wbWo8@er1s&^5V#J~%LEA-*Aq#ArO;EzA z)vss9q*tEa8Z>Y+wdefSjd^OOzjFpU(4ux9k9P>O!X_WU*aI2_VPO2FC|qN6%gibZ zjuGvmFSb)%O7vuz$p1*CM=M435*736PoGyfn`qT9SY1f%I8)90=M_4hAxd~to?tzom1Vd0-lFc z)DH%Q`3D4S6538chQvw0k6`)|EV=X=r_sDWrDD25RhH+z>ODz5>3238oaX!8$j$Lr zz&_5$1uhi3LXDe~ehp)l@O*sWInI`OGPuy2Y&+ZBMomvr6WWSeTj@58UQn$o5#>bd zdi)jjcf_wa<+)Dt`V(#x%g&*@pmBBV2lmVf8umkCwov zyB~&PmtK9cEl7>CjbTYY?p032`j4n_PL6yA$)7L`juhmm$+)Ok03hcx zdq$N$=SU7Ia{`bOt9K|mVf*5QBS-z9SM2rk!B32_@Lh9^p1zN!CtS^n z=YM+K{uNCXU`92YF&n}gnJTD${tIMzfQbvj?sF3zW})plq1cgyP{9=p^FtHGoNB#~ zc0DxanpWOpwU~bxe9pq>>YLrGGyV-v|AoicL&89bjccn7PB)~QCPhqmTmx%8fOY0s zw+I<9pKUC^f{nrM4X0YEj;`h+xnJ@wiVg`VGx2Wpqd0(R;}?Q6-Gk2^ycCA3XK5$Q zE!a{{ye-1s5q2d;xi>MHEj*9M+$t89jUOIz*>Z;t<#aZsEc@Fd94;*JBJTf{u$R? zQwt_v0M{XnZv%Yq3JEGWx~3;UcxPy7N#gB~p>UJpp^_bRYN3O*4BV@(`&eq;NVk`f z@bhTs8~F`Kh?Br7aWjT?4v1beFO${d!h_)ShPmP~==v`fHF=;o3S1VMyNC`n!449H z%nfw~htuZU3|^1P65ID2=uAHM)mry#PoF8>D*8dfV%zUjl#CK$3BB8Z$Uns1-!eN6 z%J&GFOns6RKa>Y{R4PiQVc))v0nDcBEvI%3A+fA+b%nqWdJ)p_``_JBTmoVrg};V; zK{UW{&z78~tj<{sPHcfMKDo7A$vVuRo>o+tq-G&)i-BY63O^g`v0O?{ZsO8N!hb>i zOtxi@b979Ah6xz`*@Tg6&MBeECg+{R>#@eGr7QmV#e$Q(O9EME(BdOz*vMA!=3ZJU z!Zl$(n%>l&ZFD!X(e6P8Y?*rI_6e`yW@N8lo=uqxQ@ZAd-TTyw*g)&{ zUr=t{7wF*W$yMmn%kYq4L%GAj6DdMX`|Z!Bds@ZnQ0r=#SUHKDI+G=(*J1!8ooQJYq28l|D zk-!#ZM<>~SYR4S{4UGRAv5+@Lr9w_rFy>GS$Ar#YQdCRTlBd=W{5`Ja4tI2vf;nIR z{%o&luk?kvs&QS;d|<4tR8Uu390ljoefwDxfnS{vEHM(kGAed|H7@Wm68>Jis+G*| zP$-yLt*drdbQfD}m#1dpGX@uj+@#}Xp6Hbuv&=;XOe~|m%6D0|5ZGEqePw%{0Cek1 zXrafhCKV+KuSFkew=bWxF-=={UC@)deM1DzsecJ#fcQgekfLun_l#VmP(|AtFv&!P zK(fz>>?s|L#8Fc+U<=S`K;OR}o&7GH{9q`h<>)D)d;>0#mK=?Vj|-D&;GEtqHGxCz zOqyn*0p**<8#CRFtV!1uPLK6F^^%&Vxx0E?>PZF1_s&EokUNZPzlt!_3-b~sXwZUf zug*E{rdji@`NS2IcRzHHl2g=a(ueXPMK1>{SOML@pzS-CoI8MzI%Q=r>4(woI%~;V z|CZ;?z?1dE&hs-#iXASZBoYd-_&vAn#Nf!+aary^?u9SChrtSJjC$C!1<%v*mLCxb z@(c6gqEI@#NAh)6>PJ&L3fm1u>SH#u1PK`#dFR}&pMFSSNckM(s9 zepOO}zsfW3SZxBl4Fx9{9I@V?)}pq)B&DVvpC3DZKR+Y=cz+$b9C{Kh`>!UW{|)2< z(I;6)q!*9DQ@baSND)~^nZdP0XE#dzH)-f^7Z0Om9isOh&12|BaE?S*o+S}hMR!w? zR^LL?3r)$Z*^NZS{J^8dUEoN>drzfGH8HG!+7hMrqsLhM=6fN&r-@eHJn+JmR=%uI zgv%hbOz&J(*YVGjpfb%uwPBN*pWlht0Ew``;0%rvrQ^nPr@s%8_y$Y%=kyTW2(rCY zaK0ca&nh248j<7rt8S64$r#}+HM1%SX%xhqRyAssRs<5f=n{!U0dtFMz@w+{$P636 zK9CoDH9yJJ>0A93nGs*a{hp-PETHV7ZNtXI!N6(?ko<}pD$bJ1jFPKB{Kgs87@KK; z!C&wo0T;B9vsXjr-@FU2pj}bl{;e_+kDq`pm#QF;{^#<(c6^fyU4OT3*hh{6!EUu5 zopJpvbr^M#t!on&V~#w+Q;(oAGr$GN&POd+8BKac&!kv0&J!PIC-HgSE^G7?YL4V5O$_kPCAy$? zpVG_r^wNc8N|{sD`$w5Kd-VsM(PgP1srPlH6=z1!rhj0dsHnsiq;Pk31prm=NjAH# zuPtSRQ0#~%t~1+iUC)ePWpt+zBYL{6?Xqdk&L=9nir&)2a7L4l1rOY2Y)Qb( z4F|(Rv=UV;5iN>8G*q1VSJ+{=kdQb23@<1-jsy62g8c&#F!HB^ggQ&Cu@~pu$?)KJ z@YeOS^7^`C6`F(8G?dV{QlGi8UZvZ4SIHr!#*Z64%ABJu^!_m!dHua53cXgVBPzvnkw&+t5|TiQh9F)%apRJV9_~qYxdvkD0*katAK7b^oR2 zZZkkip$4SpbSu>2Ll;b>aM&L?flBvLn?%<5`2KSxC5cyLMTPhl#K8Z9^?|I($-fjt zCr%x7b>(v>)y_00VGZMj4Pay=3cTKm%hr;tKkX$6!q>B&On>b_q>^RTh2vCodN+N& z!z)q8DM})|TBMmyO^Njf7cISXz7e6^Is1$eye-9!>+Jn$ZQ4PpQ!NCc*PDoHswX1{ zfL3|~VP@ZuSAV2mEZ;IewFg60_;YB7CitDX)(c3QT~xnEgTVGB^~tWNvRQoGBd*uI z`UEx-ic5#iXwV?fXIE!GSPupXMWd}wRbU#@(KV&h%shx(@-*Yn5^)R`mL;Oeh?7#lkg8PGB$2* zY2BayX@Sn|0liA??-8D24I)d1CpjD~un2I&xc^grou8h%y|b%vM#&Eo-Fy0t_m;$O zW2Xp8)N@SKoUiWD;ZO|a_jI~H7hwPR_^j=5g5=%46cTUP^RrXm{1Ctmd}s~e*(gxn zX0NZkcJzFFdcz3nFB7uKspak->UrUn&nR?He7o=(9T^D^MF@|Cg9?M4LIw31;VrPc z79D$v>*a)8E}-Z>pkidTw?WHp0e2^L|Y;j)aDCz20c<7~L<&6`z<`aj^Jd zpa46&>i=Df{zjo?+KUGB{AA}92MEi;pJn-{y)>hv(ax+!{p$tFz0OtFc zL{+Q8g<`!jd(g9UQ)L*kR9kOJIj^C#02ES4Irg8B!o#|_T{09q8O?ee4tHo4C}6rv zC*>!FVL|S*cNq8i6fk%-*7CrDM8LKMqPk}K5kA4}cIM;+PRDUcDJsRhFE{&uLi`dl z8%sLm=I2|TpG5$yGlopOu7?%q1ZNeyYL$5gvrU({*=VSnN`^&*x7;Gr8eYP1Dvm>=EsXU zg<3eK1)RjREcj4|bvH7+y8NA8vz_IB;*hFvl7#q6>S|Es7v2Uk5P7N}PT`SI(aS;t z6RPUkqMLLPNuENr?Cei3Fc7aCe6OjI@^iB-Cv%QF3pmD!dOn0ma@~F|&M)dgOf(`* zbI^d&MjeF`&nUUaK*M}ES~oU1m|LU0Fzy!sOKWd-MD>|LSd$*F_{$}0RA*PyAV*?vl*?P!5xIe;a z&+$FLtmPEydT=80tG-f4@**yqaSFU_7Ey=1`NvUq;r)1iTW8x77@zzsB_Yxr^_K#k z*DeM0_0mnRu5uEY;zeYA7gZBUVJjh@_R`OsoH|jd#=@nA%u<%}QJEhZl`#Nk8UA-I z<;NMdU@4cq3#1nDGCF*k>C@xaZUf^z^i2Rxw&`$KOp|OWcn}3vu8X0j9TXZq4^AE^dlhEx`g0o)Awt*%^Em{V%+j{-h)*V3OH z*RZ9oV8G2;!q+a#Nqn%s`N{~dw;;!%!bVRdAh?h%pgdMLRh+0W2Zjmw(gc9)CMrh` zlLmh`VAUuvR}NyARAk6qkcr6F13WP_v$jh`)%&C^|N8-{ObD_FLCHQz&Y8B=P8SFK z$Pm^Kfp*t0?>$s5>zlIp*NUAA6%6h-BPziW86?P30Ofl#ySw{f_GZKCgbL!0n0=$S1oiv$KP)MTzx^cqXT&1p=AX@>Zv_OHN7A*kw!|_NNG*u-`ygrPy?>TE#oV=41c7;=gLig*!@?{L{ow zmNDUf2CEkiB-}a%0^bZN1B;7efj}w_*Dtzm^8L9Lb*yqGfI}cLwxnqDWq+>E(X?Ef z6KnH4h+g{1+=FcmhW_uj|G)QGGZSGA3Uu{uK;!$)RZ)cP#yvXhKAv!1Y6x-t5eSWK)t8_ z>&5xcY03Nua`*@!kF&!6_gI@yzm9!t+V$+GT~C+s64+G*JY;bjU<_4ey6$o<=1Yg_ z1RL?4PC*dJlzDVi8JjhahLf$$Y)ZukE(X#&y$O+aSY0L@g<|kI&6K-vgp@j_)4`%g zN>Dq3)|iyokOYcA`ZH)fWJ#n!+Cdftrel-2f;#h$vayV!d4X&2P1L01GkrOUDXrWc zCDP1>Vk4}8f80Og`M;ak%@t9>uVE=>G`kqB&+PYdE&n-R58^0M(ND+_5A-KbVGC6P z8!zLhtejjQKDxqniO;nA`k?uYFh#zu7TM-3V7xmj;f~?zn$j(}4IdAdt92Of8r#t` zFjdHT;DdG(R_4df%OTxSG%s_JnD$mD=I6O-6fiR_#2n(YI08*m2<6de`>PqBlXfGO z!gNk*11%{Nqw^rq0ZC!dvC+Wf(GGDZ|Ie-9%NX#ZOw}5PdZ`us@-~ijuP$6gy02VD zL7b_8C=n5|Zh6Bc*sqj?wc;Ut<;4nvLsTp)AtN&FiA|)hTQi7Sv{;y;HeTMD!dLd(4nE zJ(NysJLI6i6F&lPjN8$nJa1W_aS&R#bWxw5zIkh2YLO6~`bKnfcO(&-eMk1vHP%TR z+@3jaRGtyjHIH?iMUP)F^uE; z=QBr5vRz}Dp3wjr4A97=#n5H`Pf7v^=l=%T$znlcR)s+Yuk4KOETuaJ%7fHEk|)>r z&5+P07$z*h%Z7f=NSbNl6P%Tp82vtAjch6@Bu>mGahM1f1Ja8j|D*(TQC({>Na!lm z4h{{v)*r$epgS0-@~(^N{!NiYG0*#VnLn2O8HtAm`R_3xYgJ4CbK@wpK(b=gHet{X z!t@+8shLTlQ0l=q4i0&NX^1`+MAf+~mzKs=s`Iw}ogmPFLK0B(HBB)FNcx}uJSGaK zVTf+pXK#sD+m-SE-3$-pP}D>{{C)%6jYG5-9fj^V<$sfCzPF(+kyl;v{5cqN3a(9u zfuj5XACg1jw=E83%qVmhLo9Nq`a^qv5ZWkLL>zwaF^NJ^fCF23Vl5l4FkcuRnZ1l_%Y_x(V~)W0_L>6;Ig{fpdhTfwTNTxzUko7b}K@zsWv2(%R=6 z)Phr9*Wi;hc@@uq#P^QKQ{Q8YR>J$KRZdOIRl4R|`bmqWImnUm(OotzJYjy`58X2XDjvc`_m8U*<>f{crY;3j> z3X8;^Yd%0ve@h3>VTh@#_GF}AINX$c^53&Gi4EgakIABf9y>QR?@^b$l*oaG*VAhr zff&&l;Am=Skh56paSxo@8e8Yuhh#EnI2}Dy&0tkn@@f&r2O*!t4pmRpL_~}aGVRpX z)g2q6AH{+$%7FBb`e^}^P1et-ME|}_1CpK6R$x%qy4$Ctt2gxb@A7zB(V5rRw<@il znoX@#Z|(0n#%EQ4bjZDQll&4I0WcI7vix?>(uo?lF0F*JBBdc7&g29+ge(-DW@DA?|*Y zUvxn@d0zLkv4;dS{jMpYrJbSu_uVyyoFDO>gP*$#Wy&s=4q*Pv)q=@x?-7~#POIuxC zO*$;>5($z*D5*Wjzq0v52l^bjv=3|BZrh1JDE>9RK<6dP2bS)%t~x!uVi}u3@&3>0 zf!FG>rEN+5OPr|M^oaWhq-Y^sEvZ`xKOiE(hVuEWp9Jk8$cCT^h+A+gqtI-HrOna@ z7Ko)h7=jSfzCCKV{kXHo@$a!gY9k}}yi+*T(jFRSN&vZTEv4)|8!hQ zzvr2@;*OfJcZ@3LB(wlTZrphjYVDvI*$0RP%m>!bf5KydfNymE@_hcW)BS3Lh@2 z?}VC{5@k&QFhKQx$a>4DIJ%%)I3zg1EkJO0f(LhZcXtc!&=B0+6Wm>b`w-kcxVyW< zoyXpLzxVq&Yu2pkKHXKd&#t}eJQ`NHOcA>Xfiuq*i2&&TyOwNZ@30kltp7CGu-yB5 zYX0h~vvH}27U9YrL*liXg<|{n=~9aLo#pZ4rg<=PA!w#vyZrK8!fDCa55cgGv(dwX z=3>#(%;qV(Pf~TQV;dQxJvROZTZ6_HD@6{pNJY&Kt3dAjI=Jm}O@==51HX8$6U znfY$mx<#BHueT4Mplo0FEHabdV~mIRLu}*_S7JaC5s;Y6(M7=#jb<1nje4} z)D%HSC=7rFl1KJBEy6;~t~)1m1xJTob#$lJcM5;Q+7X+n=0V4wWd2BLUi2t3H6k$ylRC*LXp9F;Ypfvv3huP{%1g^rlC2FnYojxE>a?|z%j75l*oi@bV<6KG zEWdkn*4Nj<|2IeeTRr}|Z34Kq?ESk-9SfQhFX89>n}J2SOug)@58<%rNrfVR zm*4@F=cn)Gxm_yx0VlWgGNQ;+Dn>Y)KcsG4QUyILrx-C!dH6chnl4?@Xc@2S(@rX` zjel-aub}=IqdBPWMso)|4v%zOX|Fhf!LnDD7ndmQb@OqLD$Bavv+*=uBZajuTa+EG zcOSUDLK5CSzdR?zpg4K&t@hZs>n!6{$-Nq1Awkmblr_}UY?;!aK#-g} zqZ1ikA9Qs5;`%Q?{8z<81$mj798N z7+CEN6u8>!!}8X{J-^s|hb$&1#4Z-6)zC82jx37rR#r?Z!*hLw4RANZLDWgT>_N9J zv}7+gSVO#*=sfvZI_e%!ax@M^D@r^Z=)46I;UNY7(G6+|LZ&u@6#8p&zf$%|m=8`& zfac3o0>lhIu+re$US(=toMO;Id%3Mmjyq_#fV%2JA-^Y+kUGJ%lY1*_dz&o3tzQ$p z1VdL;EHH1myAfS0M*#V+XV3QjSJJCy>*g=L|Nq^tpnTf5FdCo? ztZSOVLqb%Mk=mH87RG5?WMN)wYEj3TqdM8uT^ zGyUv;4t(YkHp7s{_#NMp%Vaa?XfaP-8}hf_!R**W5aX{fr2%a_Ok=)^HZxN&mP(#apr9`+w$U?rDE$8O2SB{-akvT zUP39rA(QziErUSzcYOtiIPe#^1jo1^>?rK3|3PyvK9znffz@C=B+o`a*T5v;?w6-%Ze8PAqrb7t zp1igui#3+enEU>pYvQSZl=$SMRYg}3@ehXn?_$9*st^Nt&-ZwCM*fBqTgo0Emg(9h z0v_H8igNy5JX>0r|ZxP-CjotV&%TCFfagJU%rg{|QwdJ+TBBJu!K*LW(AZ1Ab zeSN|sctp6uZE5+Pn*vc(e{r;8Ji{3QaqIjtIHQjB25nlF55~MFu_McVti1s$y^mcp zfj_>Bk8Op0`V;Dcz5`30hx<7J0K2`?ejvq^w}Hs#H(9Qv&a7%5p>JC9+u7`TYN<~U zhdEVRQ#q|zac86~ng1sP{rkXJsovvP{2rANO;xfJoXniKzI5v8xbZQ>Ij89@u^b(- zqKI6SR9SNiY(4Ac(pqz^GbR-p#XyQ$xkeFFWNC7b>CDZx2iznMmYEQ}giS*j+1R$E z?A+D#%=91v6=%$M*e0qfL2P`(JICeaT>^j@5gpm5AZ?Dyu#X=#WFwMSp?i1Et0x2i zU|X}rV=Fx`FCnR3i9BV{#P{wr+y3m-mKz4f$q8X@sBdm;Y;~i|R64G+LzMRH`}gnb z*&$D^Z}n&33g-L#GTv~)#l+%C{$6C=l3W1>WTA}^u;%&I9rI0TI~C;`cYM-L*33iO z+mm+#`E3U6AufYw@Ow_>oR@96nMZ~^KXx4@Yk+L8T5gCgfwva_s{Ggp?TShSArIG*^@r({%>VNi0Rn#ofQ1F5o?WR5&&53@4GX<`oiG?~u~I}f zFmrT8-{9W=ge;^^WgLL9tw8yPk+Hc!8=k|Ra$Ge(ITwFuU6dlTu3=&p&$BiqaKn2i zA(CuwC(&`OCT-d^9mB2BLl510Jo)_9+}Imk#I%;@%~2@YQS#cN7_z~3wfY|Dc>pa$ z5wOSNlZ;OV+qOa@;RN@j^hLpYehLLu`||3iJwB?hz4~4H^S17dc%lb=Wm)q!UwuMI zp%YExoqMji*b*hYK039wvPw=$O3TVZE^)pbR!(oUP&E>I10&4y8MNXGrtnloFy^b# z{fJ8}dE=tyQjfQ8zwjIHPMT>$4Q-c5Nb<5sBkKMP5 za^Nt$5-}MMr|{;}3qH@YqZq0fs$%2N_u(iZ84f=Ld}628CSlDtLa&_UVWQ01k3Z(P z*D61V4t>6^(<=D^(Fj>G#ZXg6Ye$ac!0h;Cjsw6vkg>MotMIS{pn^p8mt|}eR(T2% z@|58G=ZnTcb=$?Dw{hKe-Ph$nZ2i7EZ(b`dmjl=Bndbc8fn_O-lCrYx>5bLD@?~^z z6&1-*-QnS8XlP#)DD!&p%V`xwzgFjr^*L#k`GVb?luFep`>%6L{wj*lZ#9$q2Gj&w zX28_^YIPqrzOoD3R1f-V1>0$UIN}$-pCa>90!87sh}|O+>UfPq7c-2lX~o1N6-ax2 zpOkFUU^P`e8k<5#(5jNO=kDoN!)-#tQ;i$km$n9tjc48ItR%p|xE^-7)2n~&%(p&0 z_RBvBO(jAALHW15@@xH%LMl$&5;TCE?Y6pvjMUprJB+Tgx>}-ycW5YxZkR!CG?2+W z{5$g|nNhGDKOVk5yJ|a-ZZyKbarPs|khFnTuJ*V1nszNIN`+jqEL>7K)h7=+Z$Lv# z@q$$YT_ShDfqyqEG~M=gZ%Zi$2`&&4=EZ4y;vz3ZSy}qS@SNcrZfotYS^|K}TcnYo zokmG?Jc~C#^C!QXn6XnSxIARXp%pjxQ~mN|9xGZE+M?*yup0vaE3x|E`L7-=mZ2$*#;=(+3ub~S=wEn{# zYr>)aryYME2BP!Fv|?T2(tQBN1qqTPb^~&y4+KWOD$}vYmr89Pzp@5}(H(hDa2?p6 zq3lJg4SE0k!v#6uGG+eZ7?NMZ71_}c-RsQAh8$=E?-=xf?gY(OcgBajvJ01vAG!fL z8qq3k@;VKWiD!iT$7;?sy>blC^(U>AoMd@|A-h!kKq>M2sFbcVYrq%dAmUF)b6+cb z`q#gnQ8qDpQ)Z&^W0Ah9+5PBGGM?swhewz;I=T@~?0}-`;FLy~qBD5OkPOP(8DT9^ z0)!57z}NsML}4z!MCBkmy#IEcHB^d7A%UKeTw|)`+uH>E@QD5P#XbA7JQHAfy zyoe|%J(JI669kw8HQc@rrDwss{I$g8_{36sBfiR+r2Qr+$tu#V9m|ZkAR|j8k@YkZ z1t&uc2(E=p*ggcelRmGzAJH-zmr1K$#_ps#cB-fsF{(Nlk!4_`nzb^LHG`? zNDN6PrVQDipKmUNYoNn~Rp#X|_@a^o80yIJIb)rM_MNGcG&G8aT^ZE25fx>_MjK3w zEoz4oL#)Xq8;@Zgv}=^aK!Ga4C*FG9aS(9qN~=aj1}IPh)=pF>!gF9frEVsZnkDx1 z!rvcxZZiUBT2t%p4h3CnY6pTP5iUY=kwas`oS8HuTC@F2t5^!64)#1WWzeNmuT~Eo zt>Ep`L-}FexuEv%plYn!NCA}4#ntg{i{*>Z=`RZ)WyFTaMxB74+ADJ9hqM(fruAk6 z_=q%)`n}>_P6mrV*puDw7;LO>`WE)BZshyG6&09CeaDyijIOmMS4{j*jIw@y|A&b1 zM_j}nX;I)=%(QlC1C3RptR`~pb8d#DR8Rx~Vr&<3XQj1YUAzRD`k94&u!Wy;0W~TZ zlhD6s!xk%IQx>b(jX`GYcTi1K)eB8IftAZx&xst2B0Ez@GvVQVIjPCqCBLXnS(5?0 z8|#BK)C+b+%yu4L@gZlCSN##Z>Gqy9;I2MydX0tcm#6I+1v*kb67F04YHDZuEyYKu z=J#?s5vlps%d~TO4SQFpWV$Qzsxdc+B`-7XPzNw_555vtKC6VR2p+4Sb>~##m;Wv& zI1RV!dp!3w)kM%Vb#`4nGSAKNx@-Wb40`V3k>(~K9Wo;3*JOseO~#___by+~kuAMHFzjth=`NL{lY*ZkX(Y#&>`iey zsYT45KTZXAQ8&l0T9GAAAatNNJ)POF2ITuhA;zj+^)#e!4Xopbe*LwEAJ_?GSuOLk zd9%Y2Egf)I(EqCcrDxBf=|U-a(l=f=7^wDg54WzqF}eOSzsV3(2(^Pn_3fxVXCb+-fA~$U*&m{2Aq7Vg_YCi6u*f8oE}8k+n$``<}DM;uuWE zbNp%HHrWo=_Ts0-hPsn{s@OZg@pNrDH)-Nt$L{rvF;3CZCA zV8ZaNEk~0@LUaKPwKJM=;7{m!i-KE|&IB#;)WjU~v%D6|*e2&EA4{dvIHB8AbteUi z11nyBda0ve&PbI)M9Gb-TBHzF3?W!b_aA(qGrN z4z>->9+ZbF9qQ^pJ3`8T0K9CKAGaF>hVMZD7Te6kQArK#eWzLjJXX46oZpTsUrJiiDWx5=0m& zPFi=)?#C348+ukTD(a>zwRQ#Ui09*yC^SN@7d79H@PG%7*dg9TUcx&%AxPg5_nDOV z+J-qxH7aX_(nnp(X4?p{_g;mR>Ax}EBlFelU?xtL9x4Vn`K}KRcVH1&i`7-tP+sog*S-xMcel~-4RsLgrCEfx4 zEQS~vOV!fy_kidY+*o+V+trZPB=_fLxVrZzFQV6Ra?PSr!SD_My zHZ+({1H78mLp#@KF)2v|WChcpaJ?LMP;=5xQ_!_NwlQ7!tU=1l(w?yQKJG@WwIOG??j^>}+#Fz`=F0$A4 zY%Tnxu{NSTn~vVov&rHi24?OV#NNO6jW-s0@y>I`eHS!W2HlG5E@pPk66D2dIX_b6 z(XxuKFJLdrENYd$=ls=(7UPg2cbUlN#tA&fEs}q>K`n#eK>ove9t>18e{~;gMHwcA zAd-OEgg&pX_*tH$nPK+pSE?&lxEF8TE@-|*OGr-<^}Rlmy3RGg#1pXBAhZnatLWQ- zTq5d`k)PX7i9dYYhkt7Ho#SK%$YUV4h~@O4oG|G;HR?ysU`0iCv%Ktx**Qa2;s=_e zM+#`D@v=70S{9rO=8w&>^{{eYa5l!hbUQ<9x?gSVA z@vSCDzh3o6dE^!MI}V#laZQA`a6*8zt#1M6>*2w^M=Cq!k>n);>RXHbROa3kMhUVq z0TW&u4Lk?XWSpS7W9ffG;Vx#I^ zTAlS>x3O;Poe7)V7{hSq13~zqxir?z34gUH?YF2r1@eFJERWfHVdN0c)X-QfA$rh~ zaV9jP_&=;)RD=M47^IkjW*J$5l@?@GcPy&DxiJ*-*6bx+WU4sYk4YJHV~pDM~u#Ez4l(gd1z-8w{!_ ze#(kS2ucPx6+xPpS9oxt`zm}QY1k;iDpuiBHl;Arwx}4G?Wydc|6Jx zAuN02a1xoZfUXsn)VeSHf%4>x2nefYxi0PaO#@UsP~E7Nqvxc-(p%U+hl<^oKfYgP zP$C|v^}0rb zJ7K;yKF~_!-D)*T`&ADxz>5){m|f1&&x-on4eZsCHZiLvX22o1qP6osaW$-ALKf*7 z@-oU_FzYJHW%g;dahzKUMRSOZnf9$ED~oFKel7q`cHYe^de6Bx4iTiYYA!ALm*qAs zTy6q`5+>HY)J^H2!Ne80ebW$m=iF-Iq%gl&KOu%U_sJ&^uHiyYouy0Agb(f)`;XhvO(>=!mBx1^TV40inO+aG}7bj^q5;2PpF(H}-oB?H$&GdMg8IW--J zAyyim_9|k5bu&q`b@LsS0T&o^Gx`e)v$In}kB3PS3PJ$^1ilXk{e^{Qd3v9!ii+H} z7H4nqlfE;0*{u9}-Jz~>Q2mwPGI%s?ezIC~QiZRb;{6C!mH!{NEcpI@m=J(i&RmDI zu=uC(VG#*wMHN|EAhJijYwbrw!TqhGQ|ZV*bC5mFh=utK22Zz!^1ZKjIrMiTY_XN_ zQG5P#^X^v*b@2XqL4*Xq%~2J@mYl1=j=Jp%7o)m8r6kvzPv=w6C-_G3W0yWXOT%${ z#+{H*`f6&XBudiF8%#_f5H965#GFYr5eEPmOWK&ULRi6{HwXLBjx4$_P*hqMBp#Ea zxM=2PX(pN2=)U(0`?Zog{RkAgmRG^zAvd%wFZuv8rQ1t$WgN!)zh}2olNcZ6q z{aJ?CK@eqT!fUp)`Yz4dK7mICWWiFxx6Gso<8KL1P?hW!Mg`PlJbtYijNjWOYtkO2!HOAz`O6K5M=aRT<;mI%+T=MzEr(-)cR zSWm1Xy8w2sr6r@j=1&{%hPjtOrb)Bw1bx;;dGZKK3E)GjGU4)?z>^o-RX>Ii9cK-V z!$N$hxxel`!lYLtp>9`Ii;L3oQLuVv1s=Yss%SP!#9Qejhi>*q_98pPTRdtzlR!`g^@4=sStVyPcaV1aD-D3%ZpzVZ1}qr7LW&JcscanZH90-khPupd#KP9<$x@Y! zPy2T9HSo-Iu$Wi0w!&SYs`8KO2;9f{w~dosgIb)!gqx^{oAXiHY~#IkgR9L7z3T;? zEj@-9vD3Z$H4QH%Rd*SZA<493(rXSZP;?)ja$rDdj3ujNP(XvlK6xytwpx3MTOZUT zu4*x!&&Xz|QW2J(msZ`Zg;SP*W&Ub-17T^JYAo#IY3D!T$5BO#`zHiRzUPY_#Q=_~ z;*aT}0KLUTszs0if&xt%Q#f3YEjoxwZODfuVdnt`l;p7AC5wo!Z%_|EF(3O1AV>?) z+9bn#<|LA*2^;hqLi8`O!WV*FW$%*wK3t(7+q(9vvgpSx0j7Fup5pLhi#~I5xkKV$31w7D&AuleDENDZghDXky(fv zG})pHs{j3YfAW|DhIIj}kYu1q$Zhf@CY&MM^26CgkKr*(YMS=FXc#Tk_S3fv3luTb z&ZM$j%DmdXtWX2r0@whiie?&DnALL>v5SPjfS{x6J&q)%9E&W14WvnQ;6Qek`A4p{ zp+&^Po-tB#l*P!}+x=%^5FKAz8vyP_6GM^(`?O z%&Eya!K>poy82+NkY*^rbh&bNj4!w+y5r~F*-DiE?b!n2!PRR!x0l=7Y|&d6ccb0N zlL2bhJ0W-rxQ6E|PmJ@0eoaHfr2pM+wa|gIqKPa_dEnbpWZ$L|H(;FP<(#=OYshrqXOm}mik0R`WoP=$VmR#0#`$rYfJ!zWH?4w9Ja>LEAC{Iknbihn^J$B>} zo(ou<2%Rsf*}F`#`a&yhH7kW9h>R?83*w-} zkR)R;F1qjUUsbpohaBm&OR3&5TvP(|Rox+u3juo;#r^!j`0AQw)oXY{D_?V?=^j>w z$kLUx_0fpNnzHER6`A!cUDH2NW@dE8Xe7{G?+v3pXhmSmOqW5Htw+SQJS7jqPSR=v zBeZ@?C0YgNFW)S)r9s8Ggk0tP?X0Gn?R@u%|;t~_c@}tpI7cVBz>P8GBysyw8Kd{p4o6MDDIa;#B1*9SC zSIPsiWla62%27J4nqXagPx^xgQ-@!0W@X-^j3WWh;kNe$s`9xrIm&yC{7?5|;8{?o zYfq*p(DIB`cY7T^SC6XsncskUy&Z`Nk9w<>-OUH59`R@f{{CTXM(4w+dT-uYl>eLA z{uWVAXuw)v2@-tu@~#p0{lqZ+(S^CsZthaCQr|vB=p6{1K%)#Hf=DcJZ8Ke&;YzWV zBr7E2w@h}K)em_wJHvP$!VEoiw?=GSBAT7%KgZG+wd4T4jXOUS=5{R#d%2XREc)br zX!yw+sFFyO_>Hs5@H-KIc|Hm)3c8`%sxc~jgw_>TeoakPo&sjl9=4v`Kr>2KRK!?9 zv$3-ct6Ihf{@zE6hYqy zd)?fN;IDwx6m`)WwpT!XlNML&lMVKnm>qO?w6$wFnnz>c!%#ChZQ^`NoJB;IP?r?L z=Q6e#cdGm-1)6e@Rh%697<%F&x=lhgg`KvQe%trXw4J5Lg&P zRMFUTf5SSZE=+B8`c4<)qGX>6cSm;~zM{xa zeh5_Y!GBo`v2|j*p|Z>OT<`@x)Cv*HP9H}jJkB!wDema-wXmqJzPdC`c7B~EM*w#S z{qidF60W?yjo%+$73htolX9asW-%S?+ySd;UtB@?uJ}?PVm6NpZ;tHN+FpByzBQ9$ z{y$yff11S3kTXg3rHt#2ZROu2t?-YLMdOds-jd*2VBVU(R;X55?PI}9C^&2q)f2DR z7OA0Uru7HV2w~p5v|hI&-f}MC9EzIlI2M82@TJ+3$KZ_TkI#K{9sosXE}TD(TEurZl4z_ z=$d?e_!wGq6*579V41d9=|!i|R2r-W&6MWKX!KpzW?HQo)1B{l(4X=-Jw9dK zkiu(_&TpbZ`fKOKKb_Y~g@!%T(UPr4hZM?7|70ZQqkIzqepyX(3Bl7@ed{&P-R&7Z znuP~(e3HXS{EfP6tzNf>v!{scqNGQ{yA``9EPTkmUC{5cWt&svByIpn2KB{vz;*`y zYDtSk9Opg!mFLEdECyA@vLC!ib|&n#3l3||PU4C0(d64s>f5;r-oSF#)X;=k_0xHe zpjVEuUQ~N1P?U~%_=d=jm3WA3sG_gEBafKm)cB^xCavFENq6C+oq?q6WA^OuWd6yZ zl{eEW89b&!8d(utY<}fYF_}?XJ^uu(=}iV%wBB}P%)iwb4;LDa$FQ=08I+LcciUb2 zxx|k5DHM2dLeGfQpu4p@ae6&YgNne)>zf#`SdTRXU~XS|FACHH>wcbZ4vQlbe&ROT z?;lQ%!RMDWvPg}Of8IJ&wf5EE1vbR_Y?lzCN@V_pdjG1*|I%M7(4?!ltrF@+i8t}C zS~)6DkG_1Sm%7flO@?lT{;CbDgNtg49Om4_%a}MW4EE%s1{pE8k+E=+xDx=lhn`zd z<9|}LbqG#sI;u#gQk`qn3MK?YVp*DK7JJm*%d7IiBgd6c^x(pqklN`Czi(KE_j2#7 zAa9V%gRXn2%)m#crT$e?{Fx+lXK|sBmH1=JV}3v|-JXl+2Wq4HRjU!i9Gd30tzkXW zOQLS-U%7+A#+#*$6N;#}4qqPtaZ=T9&|onf!NLaZVMX!{@L1-Wl1Es{22(^k)=MqC zRnx!s)5eP?A-IeHEE`a(3--?%j<3EZ0@bIz`QUShr7+1(Rs5tb5*rk)L>kX_}% zJE`ZjUre(g2yoGj{}?Y{vU!PC3%ZhyG* zI39LRuG|JX-*ao^ovRZ{`=wB2jX)yLK7pNZ0jM}_9q}NdZst~v2oKKh6C=!%?jFeM z=+aeeBzu>S-O*yp4=YuF5>$%Ewt^w+M0ggi@|Jt_Y)<)e4l)JD+P=~r!^$n8mo5q- z7b$Y~z$2zMGFyd*hX(?LRyklSCBTcCI(yN+fWIgFPW6aTau3{Udh^&9WBG7}cV3(~8*JqhLqj2$I`V%i!5E6b;5~%+SuVKv7ZS@UnBNZnnelpClG?{K+%+h}6IFdwt{O%&8BKn?W4A)LSVo4hx zc3gz{y19a0b3(v1*(^h1IVv8r=QbQMWxQ+2s$?VO*>6!ed@32Vjs*$8lcA}|?Mh-swnmW{2Td~Zm z1b#!*&b_n^*ts7Ix$u%878&8PyY zGl^htYgj}suYHk%0k9r|l*GQ`XwL64Z@wQbTEwhy;A+l(%AYvAMz~Wg*FB?g3Aj$R|-os7Xo)i-_|*kk26|7{7Bo#RgJ02~#kmJiSQ8 zZ4%UzlgDt>5h6uSs4PN^JBT&%jsHFM3jq*Q~#;g@m$rT zH`r_d#-bDFaGZDt2m!|&&v4Tp@h~9pY7V^^I!ce`1I`o!wCH4m|8f9D3XBFR`rU7e zZN7sc9giPb{D|mVlx*%y#k2KPD|k1wbdC#oDctwzRM0HD40w?g$Ma3b=4*}fyNn`x z5a@orxbrSQ-)3*?sw)w=^Uoc+!xq-=MmO6@;$CflhRUxI+a)0N&-W5?naS*6cG&rKhV%KuCe32*Gc zoB`z3p&}-C1LkZ?0rn0D0%$w5@Y)Cc3KGF&${hOS3 zQ=yJFkzZ|xI5oP5>)V*Z4?s1}nv_X2FqW#ax=|@Rqzf3UQ?ZwtjVWRtB4&GnOqlR@ z?oTD61_pg>UcE>!=shbliy&SW;-Yu*?xnS?BKH`_0RE=Z4^Y{R)92N0E5rpuA36xU zxi}L^cPA)gRdPb!tc_tkGxtkj40}zWEsL&v!_;I#$O37%7O@C?@bHy#xnBlX*(nwJ zL>00`#))k=PXuaeJ4Y%tL4i_aQF2xK22x zR6}hNI^4WpPM3yb7u-#ytqQ-~{Uh==u-f$HAH*0H-DM(Aof&1f$hr|M)}@edt&zak zfoO}*N(iQDGKt?8e3wAPifW%~zYT%q0I02xx1D9?tj%-TS|Y4|iSKal851X{I%C~P zSN3H^s-23w9_TT*-O|*U6me;V;fGJ#3J-GS4pvp?nk>g0Yvy$yq#jFBk`7a5hgf|G z;WSJb3KID7^F==roO`}SR1&pZ2&)wf<4RZ2y6jydi)3S{UCL~Nr1bdoYZdYJ0DrnQ z4*np$nM*obl>2XvbzF2rBkx57R*Bzp6YU^z|Hisk{N6shTu2kd=1Z-PCUs|lkg<;2 z?n?o0RHY#P0Um4uQ@|8WcttwQR0H{1=?5P%AS<-48_{|9xo4dl?Fzkf^#FX8uUx8% z$YI^4jiq3lh$ET0C^c_DZf*%Q5>j!2kg`2UAuICKH_(`_2y3$k=Ek+Ch8UIh4?*@K zJN`t0W>i_BL*F~=w8*)icU{rOyP-N=8Vm`~DzOSnz3@PP5OBS+rBVdRp|Alk{gu>D zWfmq|<;2)WqDS_*d>yi=LG{_wXiU8kEe=x0miLd&2s+Flq=#G+4i8LGRz!0eSxA71 z^0EF-4PFMTU=~>CMi8cQ1Ltu2kY}jxR)hH%MIt!#&6irj%f}^hh#Pted8T;ZW=G8$ zJU0%ysFJ<3; zSGzw3;$bYb_Zo_;frFQ|uWXI}rEBf;3PKHwR=WJPifEvXwIc3T{WGwg6LvL}*$_`qcHz0+676q!^eaj>UVgt-jA`(QawIn@;oyLV_E zRS_w03;ro2J{W;_tskwU{RiephTdT!h8}6u9l|qm(k#qN#*6LCKc_DXH-U&g_zPYc zhTGpLsY)Ndf0S@fs2&FpT8BWB9$#A_QTZY#cD@h}Z^CvqS(zKvf%|y@CgLNUM7-Gk zq#Z|gA=MvwZpl~MLNU+5TJWaCOTM5WPc6_22Gnnbkocdw+yT?lRln@-<7@3xULq(- z&3`eUSy`1_U5-ULXeKp07Z4ZFAUFZAIhf8_thx&{HWpFi z^3MEGwhs;sR7;JvV20D5sLReMYGSyuJ|-xC5%+%A*_PH+S~m0*DTneEX|zih=XDF| zp-?LMZ`ths5ULQUU3ZBUJGZ}CvmYi^aM>Yj3iRj2n+a(dbmQW#EIJE<+i}zX^32Gy zKrjMJ%ooHpD)jplJu!iA*y`yph3xNQ>zk9BVR0jF zMXfAPWm4*f)%~+-W7v=zA;kgVJ&cH43JV8(Uex+TlyQ5L|M~P#W3v1(9D38nGnHuZ zUAzOf5N5BnD5;tX@cdQ1!5@DELyrejHBK|?2+^fph=LErnu%YP;B{PlkBfr+7y=^yQ!`5?HEuBZV0>Na-JLgL za2~~9Kk~;#-(N4iyxQWOnKMpw`wfqRbgoiXzC-Mo)a8OPKJ-K#omK21Ue^~4n}_pL zmvL2FV*gdn;fEkQ!}1*03;xJ2ExZ~A9qR{gp$&hvFtVPLaD;Vx$ynY(;8^k|uO%14 z13S(9T!k=usGq0STpxzi#Hv&zzsxbEAb23Xz9EKGMX^akuaf!4)UAsyD5Er!_wSTv>&W2r6mQm zn1UIV;XF~}y7X1JN(D8j@Tdy)hgoiOfqG#nibC%(0slu*g?^C5i|jAdn~#yE^Zdkx5K1R2_ouVV0}$Vi}hSgpV~>q@AHVj zt&=?twC`o>6y-JOrQXkwvF$JOdPr7VzFw4)6}!}&$9AL_G-Itn?y#`p=NRRo$^V8= z3f1ukB%}2bVudoWRRS@HOFuOIIfN;FfG+0uwU8>Ss^a-hMG?>n&rSq*(`TZJ*-y2I zM#UydOtGCS{5fnT`#MX%_;^BJNw!W+2rW5y8$v7mj^8v!lbm1^Z0W0{`Z%E6V4{VT zV)z1qY1=0RKFIHAM~e6Z=O%&NCF{;X{7kUm;i21DzYv~k89;-)!OGP~|Do9qZRf#0 zV<*kZs#C+pNi4o{@lKc*+$JZ+Y3|Qswk7wJ_!6`&-A}?2q=MW4bk$j%KkHO0nm)sH&^;;+3*e*N3J@=1k zjEKyg@{Tq^;YH%y4RZkWoTX2`u9bmw{((xsyYF7n+yt6Y&{1>O&7>PquBWUHDG=a$ z!I1w7fhKlz@!q)eJbY=JLMQU<~nqCp-!vYGNl2VXB6gs7j5g) z;>zi5pueRBHJbdtoIU>i0^r9;_`w7hJo5YRjbs-(DM|uPT4F-z#u?f2@$rPPEdlT6 zC#0*-KID)5W_hj+z!!p!i$fEDzw>JTti{XS==I^@A?x`pVBwoA_rhU#Myt574(jON z7W4ly`(KH`lLTy6rZUjpKeWU+{O@AA&?$(fCOttc?m|7-7?{;@9)g^x!ajL# zF8U1*r;GY_-n8Z4@^@m_vsvCUmwy3H$jYKM@VdGy1^VTjZjUpWy4<_%oyBpL5rwk< zYZ(Q6P!!&_NyNgjHPOTSI(WB0HYWCCWNdU3-I3LSU~SWs zzJl5FqNLgw@9Y&T3lo7w{>lv8G%-nhL7HOY1_h8CcnHO4PWa z^g(%}q%?(|jtzNVJHj0>@77jRGB9PWz z66Dh~Ko^h?sW$H4hwhU6Y76$LU2TpKz->0n;( zVWUUojkNp83~)*1U+|)-T0ZG?8NK<2nvgiZEZ0;s3`lz|jS=2G4=EW1Ju;2~zi0n+ zerRxzhAk{2jqcokSsX#SawlhO1FXy}(v@08mU?+Rw!y}930Yb3b|$?FNjbT(Bx!6t z?|NrUD`;o1spBv2RXy2+O6i+6V~A_Aks<#|I5Hn_XwXhibrK-$@b$ZFxEeGU*le@a zmf@ha1KPLXIH2M{*C2=<_&8jeBJc++dns#KJV74TaNw5Y1Ze(ofp^sj_{B5wBB-a$ z{rfNDB>rYt70&fHG+NEg{snn8yE-Rmx^UlMEioleG%3Zu-}*Q`I8}z@9!b{&^(uhG za%gMYGswtn*LYg6OcF<2#kshuVtmZ5{Z8CMD|WFQOgAYxDQTFd>!>Q!l`If@>T$lU zfURBXh3$%U1jU&DEV+uD0k|Q&fO-l}&n#6$+*PslQ`2*QN$s*W?2v*HC#j3t3%Vx_ zE6*L1_9xZ1hN`ZNc>!$&1^d_Qi<#|UDplZaCmt>!?f6Y2jfX9uS4=b#?~mzxGC#pp zxZIl)6}cpiYZifsK$L*+^G-gyDA)gZ5h1Mvvg?HJNYTe($eu>|*r7(nIWo?zG7icK zVNK7(Noc3sndf$u}n;6HA0uI|6`fNJK~(XOF1 z5LZmdeF}41mf_V@KgMK9TQj|Acse5Y3`Ey{(CUkbxfFa9pJnFg~{n4P3i^cH}H? z$=Hw=Gsnch+`+~qr=7XmO39KzwECUuxlqi^wjY>2L+>BhlxoTNQBGc3_u?wJvR&Hv zX6A&7?UbH@f`;>4Fe(E95BhOsc5d>*2AEUQc$i7Sg!iye5O6dSI#CaQTI)wTCSW!? zCT$&xGp%}dHdOLHzRa4t!?|82JsAW$N(4arEH2HKHGicauusee)o;v#K@IM^*dv7+ z+D=EW6hYRl)}WCe?ja76BO#I@M&D#woO?T#7j=;dOuK(&H+X`_mGAGC%@G}7=T7zt?1coP8Y;OoaaFrtoOfZ$1f^>wUo>9!N3801-p<$K zHQpRgHzv0$I{hPIn2<0q4Wseo5al}%flLrd+c`0LD0>qFQ-Vx$y5Z?#?D07Cqrh$1 zYJ;CF^7Q!(C#x!71tb!1yhxM$$?mJOnpNpXk);WOT`V=Z%2OBSGFzZ>avq!h`8k8@ zprXb(x2(+kY~RMtQ1c0{zhA`X`V_B2*Gp4_cT--cE$=p~z25O4BxC+n1Y~hC$ZyIU z%k-G2tDuGSUph)hXTnZ-jiZ@Mg5?e$f!zw}7eczMtp@z4z-Nmm(nBeg>-9c8&T7rR zqG+G*c5aH^CfOc5LE%}N3P}G{Q73t zpCRVJu3+*D*g)=E`kiAN>Uw#4th%V;_lgL=Sn^p`>3uKbS5{>Y{%;*IzBMlaF3g7H{LjxNxWeFr<8t!)PL}Vz3=N5g zT$mvaw-1QGRhGr^@(Nys*dQ}nb&}@4)>`pj)C)W6^oal)%`E5dxhHWg;V zJG;|kj-pIXSCg&iPOm##d+l?A4-o%gf^&D+>jn;!54LbpooQtAoK%3)V5bZF<84zR z=aE%;Oll?vWHQ)`P3bQ2V0Me7wh1moRTt8)`%>P%HF~TAld0tTi;qlEbyyrF|@+HNcd6Oe*SXp{8Zx_BeF*Cg<6{}Z@6wuqrU@K!08;94O_s8Am+@g|< zFdE2)fSlDxHLQveM1UxgBxQzwyg4mQrIm1Eu3so}{(ye;|B&^TVRdZ5wrEHQf#B{Q z+}$l$Ah^4`yF&*L4#C~s-QC^Y-66QcUD-SP+;iXi-(Rop)pO3O8l%Rjb#7!&&N_v9 z#hdSMvn*gdJhP64$Km+ez{E+H&xhXK!%VwFCa7%>#gt%b_Ml)WfgU zekbhhIn8ais}<&2D%!G`g(>%i=buW=&DMPIt9*#Gt%&5T;ykM0cQSy}T&Q?D&4uUr zH7g!Bp2fk5gMTuS{A7Ol!k;w1P5h>YtFlBvg5ZC&tq-f!t+^`Xp;-_`Cc)hJjfb00 zP?|_A)9PwH`@jz1E-JW!n(|UnI@?^Tcn5NrAMjSF9|nE32D3I=j7-LsdpH#B}{AaqXvmuYShpEi&db2es8zKkicyeS`nZ|S2V70hr!%;>n2z)PoJB8O zdu!3G&Px1G{vWNFPTOp?4B_PXnrvLBWUOQQp~d|PV* z((Znw0Sgt)-^U+6gVk8??-}B^b;ooD$>)!2Uy@)yzF?N8aJs!Sl-S6Zbmw$DAI*=6 zN@G0_8@#j9!lk#EsX7-Yrm*#;M6*K;7HHE_O~f4WIvR1UMk}~sn%cwD$!5dIiEmNi+f9A0V`qJZNozcE zLj=cx?(oy!%RQ74;OE`-0}P|2j#cMQBzx~E`JV4m;p$RbOMh!lQF0SA0|XDea@>aG zQ|VVYtrbtkTraG+(6X+a*@cC!_Mu&Hi^sQ5*sNIeiBT7qehdQMU;zGOf4-&r8X)54W>wa8DSMIM!1I@p&!7b7{=P!f zU5!_%zv1)?M=JFIKvtibb!$sYV7d?z%F;+wH`V1ThF_xW&30~~ndkl13+Kk7k51gW zxQ13@*O|KjqMWKOpLpX!mZ*GTyrw1}b%X+_+aa;{l^rS-tC^=}*Z6vJTVqwE)y;$B z7uAjRo0h-9!P@&T(s@y&YseevxmM=ma^s|bAMOrxcfJD1k*I;mh6>yXxgd~xV5 zoQ$j<>Io-rzx$Sz%7<5zvr9y8p$?*^#5X9nqPChzGpufVKUGIu=>#V=hEV+a-y}CaBl7 z`6ioMJ3zo01PbfxUcWS2Yqz<)=C8l`IroiX&%3-~&%NYDQhBN7%Ne=;&+_X77vfZt z^PDxhs@RH5jdj?K&jWP2$hqnKjXw5bpC(cUKhjx~g7ocOmTU#lzBpk{fki39F3})Q zuV9CmPO$oqxweWZfmBvxAa$S)q`P1%2=e{Z#l)q8RndC;shg>RL}9E~c{>qlX-Z;s zH6lz8X0pa5n%C!DhcZg0uq-~+u(kt9S#j7GW@7ZUl969p#~>EN!Jr|Dwf~dZTG6QW zGW?jAAxzal$zl_J6){q?pwkJL%RTyf`EdIK*{C_s69B)-v%tx&*?f&JG(H)vwHsS9ktaxoi;F8{{R!+YZ**o%>3E{L(d!eqrG-ZzMZ2?m`-m6W&79qlas-0GPv{Yu7ao_loh>fBAt!ZGU5ScL(+v< z`09h7^u}xvMGMiROkaNxjqwtrC&h{VyKu&7y>o$9rMl`1MfLWO8Bez-4*a{vrR5?T zK9b4UYdgFjf(DWEb8;_H8QHnZgKf=~1K_Wj$)acYyDVD8L6jxQ75~e%%$0|m|EU3{ zOP4KB>(?)yC-Q5WvK=GxnyO3Pz_Prwu1B+2rjR@1Q8)b~kUN9_IIcSDCj28{<|zC} zO$v*#OUYLd{3f6kBq2$x z5$Zp#*Q&5sE?S9CHC}XW{9~v%Cd`#rYtGg=a@y#vGq77FY{^_mNy{LPkp-D`EFFLM zb=A63$LBQ zYhjaz%czCDN6<-JRQBZ{KTmL*r@Dz&$&E0<;pJ#z5m0sG>`G z0{Z=w*A0ruv7zrMBgJ`XIjiCXn;Y0_t15l(&U%^1%okBvfF#J6M(sOhn$S6rgVR@R})$7aLaOdGb>{uzp1q&$g`lEyq@dMpBAvv z2|}o-DQj43fZDi)1WXnBH!S7{uZkvZN=kRmJ1*V_@dr59QRNq)3DsFq{d<0^C7G7$ zYS&(>d(pDr$-fP(8Ajld#2`ChBI~Tiz@P&+IVqAC9epk?Y+`w{@Mmwo%a)PP9?HDd zM9dqp@=1xC6x_YTR((U2ODNWXqM6SKW^&Zl0|4~5t!t3ug-dvsb4_$D`1o6GeR%9H zF68j@meE(WGCO-7o+ICPT^e``wWx)`Eov^xQ+(W?fu-xano7aAkz}~hi)rgQgkK^KBGs8D=7eKQ|k!f!iUY6f^D)0!+DKpsgolbVc4^#4=GAp8h10m-32 zfw{iIVpMT5$zdi3>Y2ZlTJ75AC}b^(*uQ*1?i89Iwh8s{CnwkS@7nX=12q;CDan67 z*Tw}hlAmJKF9B>7#7%dP8QnawCCxKd{&&*1ctt5&H zu-}(U0nW#n)f9t4`Qaz!E&bTav_gL1sw!&hZB87_BNSxpS1J|AX zy2=&26k57T=Gg%E*~DIe>{gTeVOTgy^>;WJ&pAYi1DL6 z)w25OE2w!3=hXP>lkXSE>wj)GNdMdGB{%=&VqXJPgH78*-vtJtEO!`;nOC@r^djY>ao*(1GaGP(Ecn=?%*~-mo*6Z!B zbk>dZpPZY#4*9|$q$`kYWf7HXDUsRTw+1eJ-G57nNffkF1|xb~4TW+nziA-j-0Q4s zCu=A3v=f!mGZA|}?jW|Ra{<8fT4<5PjqOrJN0qFi{s37Xog7ES6&58(lMV8k>RW$T zV&Uajb`CUz}T98Xjw+ zYs_dwrrSz6s8(2hz5i${><*8^s&fFz%IzcD_BhvEcN@;6jTMHF>)J?pm?CX8%BKB= zjKmM{=U%y9hHt5A`l#wO_p;2kz(oEVEa@p0Crd6fvKnsl0PB+eook#-VoHG>Rowmn z-b(XFU;g%H)54;0=xXcT>CGemYRKZ?+)Pp`V%+ZucYQnl*3$YA&#`3CZco0_E`~JF z*`zH*aTrqWx)r|B=5M;hR7a~fwqZFmeA;=aDS{p1`AUARb0eNSkdkeG&sj@t|0 z=u7|YakUW&%jWdD9SA($mfg%0gR(887=*`PK@PVvwG7$F=PQ5Y9(dzDiZVsEMV<3_ z+J%1coQ#+NdBJ5MflTb$kk}nvDM@%q>6CT1cjDqw2!fZ9r&7+!biA+QH<1En`WgI#FzFrdZ2%`p;W4^)$er|b#e=6K8yBdC zXr}mVVI7DThr7RUGup%C8AA)kU=Hs^hD{yvS(MAI?O&EZ}0wG`c^*Sl=%uY1+P z_+E8YzfKeZ3`FD1+oW%j{)t<~EX=eMHRuqPk$Ekfl^>c_8x514uPm`awz)i6M4PT0??4>x&55;pi32u)Hiec$FM&~Pea$0;Ng*){=6lfnC z9}iUEwCfti8&$KxrbO@_f->2J#lnb>rJzH0%)Mj<%#63Ih-gUanwE0!j%Q$w4rS8P zqhpheC@PEdUytjSnV#yu(UdGZ;k#TcSZVTju6vEoTfWVxqe7AIRQ=@N)g+~%v7ATa zMJU`Rj!i~)xDmD*^(4 zx}UV1uR=YC2^LC=opLSikxVG^nXpv)zRxj0woCv97Gq;#TeumSXBGFlzWN5&8e00} zQjE2K5_S*=9ZrOf{j|w%3nfnM!&S_DhZm^tzetP=pDdK(2Sv}@GP8@D9cBT#S<8Y+ zJT1T9L(I&KW~*b$*`3JcetRzGbG0!!LdI()TJdUQjQ;mReJ0nEWVYoiJIklvj z#@-PfS~`c9%X|>kfkrl1acD@8&j(Tzb$xFl)u5MczK?FsRvMkxE6J>E)djzse;)#H zG-*$Bi|$dVy|6CNO!xyPa5oRR7{-)vLae0Nt?m$P)Z zxZ)R@qf0^cW2+lZrBkl>;VLFMB%W5Tz5U%z$C_O0@ufS}KpwwOYfSZ3Osv%f-Mqz9 zicUsuUkwV>hwBs>%BYe{t`**}(I=9_!^_O=({~z7oJ=f?RGC1c8D4;slo|m#%8;U- z&&Bynez*_~4P~Xxg^_YVdYxa-$}&C)1KOXNf;DS6gTaiit^32-21>xy}dy1If!`s}>|67U~3EQ&?a#eB&CPwzo4QYqB!A?J6xJR`Udc3zLCP)(A>^ zcD#&CgJ#h@Li{A}yp9b6ukg42ERC(k=n$2LE7wK-(_o3BlGkRkakg&vwLJ6(O+n34 zkRfBYg@F3^G^o#g6qnC0n~C@u;qnUHY;$C-bH6%%1C`PH?GHpKWem~zGg?8uJM+25 z>uOSkTFKq`)sjy`Evj^>JV8*Q7;kc`MOmg4gUzgO7oGXq%4NZNCPI`Q)mnrzRrdDZ zi+Oz&cw0~%9k+hBX)DoSGker5%^wAy6uvGJ%Bbtk@I9dE@JO_(%OsR%Yc8)9jqwn2 zVHJ^|03YP6*gSNZ88~6&{T*U)&{b7bbWS&dyCE(Io2KaJA*v%pdw+%eR~VTu@<=nRLIR#1GKhxR9>L1{(Aa4_@lb`+ zvVkF+1nqfo^Mr`V=8-f8%Cmf~oF7Cg(AR`geQl#+#Pq~}SezS zQ_VS@j=a6zxC;_*i%qAWs8#b!V>vAXPm=+J#QiiLH{SFgdF<<$i>*i}R4J+}#cDpa zi$O6I_wp5?v;_w=Z|fxlY?!8JJN}`p|nG_?snw{&T*5-LJ}_f+kLgJ{v?sbf2*25f4swMwb6NF+iL1 zPlcOG^6q?+3nVxTm-1D(*|$%+YyUp-&Wu!EUXAL(86Sy=BxY_a=77jkb-ut4BTrns zR0>9p0!d8Fd8DAEn?h5X)*nCRz+eDKx`}-b;CqdF|ZBT$^ z!dFgW3)58IDfq)fV;jH{N1HcUq?7@GM%b%_5l9nW%^=+b_ z=2Bj9*T~$A(u}wSzk0ScUArKsX+!05Y^JJ#NVhF7DZI7JoG;tkcjTO_W?v!alQAAu zIqExDQGcctx8T+?b%)K-WY^AG*erN@nzFGkPmP@1FGEe2_J^OMKTg8*Or+R%H9g^H z86_!2;{s`MHeps4W{{(eky>dJ<2D(AlRvET)@K$}B2$gdX_x5X{A;e(Ji3NH3+TdW z&9c;H))$%cA~3>tX$yMt%rK`lK{U&q>>78;hOm{D7YmQI`G9zZ21!Ll41?vXnc2*X zO{BA6mM%(^nFfspqO6b%diYM}P256bgQ855&%j+bj>UJ{h=`x`5+tvwhFMx&puxVw z`jiaOSh^%jg3&DWwFvm=yw8yl$uz+)pRVX=#>%OYf3wtF!$`VdB`vrUs5YtTy_l|P- zG6BG0`uP(g8(}5!R7ity_ZoMFhRiRS$=-Gw`NunYIwC-|IsD5L{)I&lyhY>RX)9tr z#7N9?3?N1*&akiwaCD3(&o&*RJ+PJRK^Y&bZ%5W#ud$9Y_);Z&PCt=TLyHp zKe8w@y#jVpUXB6=PCX)~#@E9+bn;AT*0gMQLwiheCQN^fD5*zBr}+T~ao=v_BNNe- z>~Ye5eaoMo%+w{@8ahm=5pp^BI$~jF=I3#Egnh8X63Os!@bcNaUC7XIS8SZx+apj< zTtY};fFrLnQmh(Ql1A3bq=2vTip;Ot;7Iy>aR?N@gTX{R zl-%w;6SG$86TICGlui?{@|hRTS~MoL<$3iJj3MRt$!Z^Ygvj2UH?k39EEMAWc2_y$ zZcafmdm^J2;a+(96_R_eeVVlpr0>s4$APQ!QI&Yd~sAm#ZNqU2U$5qT5wyWFx& z2BbVPkpQz}7Go8k^z8{T>94BIZhGml+0C`nFY6gGu`#ux!(fYgY}pA9BOXw*xE0?+Cj_6 zN|j^_`hwuMIsfi|<)0hpKk+JZ{|M|lIHerw>{U|5r zvh2AN;v~KO_4&U=&=lG6GM*fcwaUJeKb4e~PRzPK(EPJay$@%nzz&lb3rCVy^b6T6 z%Zyd)3xj-6*wxiae6p#k^1QPDUfSDw=^cU9+EBX($?*;XFnm$1f&P#L_rkp6NSZ6B z(0PMz)tanDda2m6S+HL@^ky&UC?E5b3~rU|K&y&yb%q*czUk7eD&5dRZuZ5FLUC#v zGYHyJ!ZY&5z@>sTPUs;Kg5!{ls&0hFzm3x!-sfeb`;C86&?!4o{!@*^^{22z(*6vY z&N94pXejF$;QC>qZ%pOK5QodjHT0)?vem{x$ZUk(jF?^p?I|`!ebLS}CxxyH)`x2XeBc{ICifkcABfXL=^o;A@4LK@6cqKh-7FoGwlTZ9@I^ zevaNhirfL`z0bCJy~0E|WZP|&yjd=d^lTsC(zLv@fy_IG8xbQV8A`&?x>ebgpF)c> zOL$Kggw>2U2>zBFW?Mf{z&6B{gQBg7FlT8)6up zS!QZr&#d~4Y1KVu6{fX-ttYFHdKAr|)FsFv)BQPoB6I^@w)Q=qJzQM$v9#FTT;e>Q z?xL*Fk3#7+b`IYgJX2YIT5dr0n|eu$85~zms%y{~9xZ;*^E=N%2_{T9tM1-AGi(I^XAXr|JcVEGXDzAz1=<#EQNS;ewxl5+& zX=%>vuWkZ|g$et>3r?4jZJNGZ|8eU#Lj6UKjl-YXRX2Yu7WvWMQw|L^9sR=Bt#Zg= z{cj)P5xxgB#)zwHArF5UNR(VdUgQ`4ou35%g`l0Da#+ufa%#b7ptL8h7rI29oN^Pn ziC1TMn2fB7<4lsJWDVmU%IPe`8Dw=(5dHh681eJ*nU#%*i4^;{E;c6OO(`# z!dk&VCGYULF+7?x{POZrP>S9`%GxOCXNU^$7@)Z8r zD@K>WzeH&}2hDW2oW5~5d>dA$;=VShBAXNl3^T5iaOxMGyI(&Pr< zF4#hGs|KBD1C(5uvkt<>Ne>ZJbImQwe z+fNjf(Y&@D_^gB~Y^bHU$Hq3_e)NQQoa9z+8SzT@E56wF0SAtato64Qk)!;{tB4-X ziArD_1WlD-HOL0m!6KK9-paL}i*Z%3S09#$jk5~*5G$dAg*--p#`X>Pg7=?^egHMcN5Y-uhoEKj&!IdK0%fBRTPc=>P8S&`@|Uj4$Odnc zz$h)Cncik2yEQc_iJ)lfRi3q(XvN2{72J3`aajGbr@Smv+H0u1s_v9Dm}hM z*O#aH2ht(;D(d|jA*r&^J>BY5%uNG(2=27Jtmsy!00@FV zVu2N8MJ2*}Bwd3hkNllEasUl}63Pryn>79P+W%$>>py#$n(rH64<)N}Q?NA+qlb<4 zD@z;tjNlyW+rh+0;IcB@llR54?yX@Ttk5+CAF3x5(?nj!9 zS*Nuw7AyF?jyH4K0ji^(0DwC!wd&63i%?ITPwze;JtGy4^n%Y>VOks(>X!RV> z2nHZac*zfKP%wHXE(uwkGQ&{ApF9R?dd$TfJNGk-5u0YZC(z#)J5Vds8P21Lhd`SZ z7fVoEW|k|)#5KTUkfwWD6!s+|A?uo+7g5LA;}ji)RRO04T=phdUj)Eb`Av&|3QfJvyrQJxoq#Z+!8@qh9%Wc1%Az6~ z5m^&kf}$_+QQ_d2K%_svvHzsEQMYv7S?4zyK1{F}Tt!tVE*6FO$F{pYe`9bK|E@>z z9o4QuR-Ml_zelL07crlFU0!NWKw}VSe$uuKDxpEzdxb8bm@vSpCd&lve5ZZXLXgPJ z#gllBw(LVu0J*4Ad2t*IeHHs+<-e~TM$@!wN-d7I4l6341W+=f944y}^m5>^hK-c& z;>|3&+b9e)Ml!v*!e9iX-uJpLKB!WdUdVo%KjX6SX;Az85!Q9&`=$MT(h|wXMNFtk z8F~g<6MfgY=4z-w-wP1Pk-zj1}71BCREMNqIRm zZ%cJ$WoG)DO-%JUmce7+N(;Ea%BVG@dGP0W#4jJw;yYfzJ_2MDs=6pzS>vu{E0|Xw zl0EV4yF~6^Nxi32)7a*#I(Or@21zrt&!Lq%o!_AxiFY|&CT+=KV{Yc{%!lTudVudtbL zC(A+MWxMt5K|;S9M1nfVR5m-tR^wB>r5wfjmN@m01I->DXPLm{?}J#DzY9wogDgl~f+mV|k^&Wyd|{ zmRDhkKP_EHKQa#?Gn5=un)xw*bEOu>n$5_lwQchXiRtX0|Q+t{t7{Z8FMKv`w zw556Tgk8WF8C#(FWXHyDcCWwOeg}v1;jS+m0M4fXn`W_vWn5^j;03@Y?Bv#r8*hqA z3>?X@IU9_zNYF$OyMd?bh6as({Fe{T$wt5uq_zBo1>b-nU;*m-{SZ(!xTs!3par!q z-NWrKU0j#u9W2g8kv7=?@<^c!2dhY;# z>xO(@E>sqZ$U*Ec_0}52kIf+B{3Y(}8^U#;@N`m>?~lT!qq!(042t@iJPDO~T)`=f ze`0SVx++d*8D)m?e&NpYd@Y?q z-~B23r~jZKeEqbj?IpAEAH5Y0009zWE&rHyw$ANa6DcDjt)7@{uYU*r{{1yRW8FDY zX6%1+Hvhe^_u6;Ru*thM<7Heb{rV~8xtaMHHmCkbW{5vO%uo9sBI(y5@C_pt+Q9nU z05l7iP4Cw|Wv@J0(7gQrPoE^3%Fp5^e44v5BRdGJ2O;6EMKe}EJyBcuT* z?=z{_$rJdu8ziG1`5SrAGu>vy$fbdRWE7{Ud~&gI_BQ*PRb7a;^SPFr!2pM*AhNvq zQv!A;4ojJTs{Of^H2|-z>8NO^C1NLQWn`GhFRwhFx&DqvFnVl6RYf%o2V^`DIlOr( zQF3CD%A=^DxXYS=gsY{kO*N@G-vJ&+LV5U)Ed%I3`1@!MA3*QZ{C^c{ttlP5CCKY5 z9wC|rik`x} z9$-eP{bNyO=f@Od<8QCNI+PLuViS{1e zUc=#9**%s3COd9)2l!?i3DI?vi3C$KZeD7BN69wiy%V0F?srw$tRMYd4;Vp^2aV=S z_-*d(KO5)In)~Pf=12U~G4Z3QqUiFdx0=)K@xzAz9vffU|Gq}e*NmK|cZ}p#oJX!5 zdaZh9UImcgMx+wGyS^{T%OeG0g5h=zuA2!}!9yFiOzdW6658(0=_}Vc zb^=kEg@&S~nXMW0%3;IDverl(N&=eyJru$pP|Xb)v`&OUku0m_WF@GZUC?KIc1D3t ztt|j#xOq*RU;EEhC_)7FjN5X1l`TcoeO`u|i`G%;Oooo(eJ)RnYT|ePlShw5%O444 z{WF6|oHOKZn6M5^cg}SW`ejX(Qq8c7#`E6d71M@PY}l@Gb+8=1xb~m=n4>xxDyhMN zQq8KFI>7jhvD`)+_J2X)?=I9=Wvt9Bs0XBcRRStABAvY0m|@V+cNF5{_y?xvn0mZy zAni}SVqs&O`zbc~H4_!T=tA?cnq(tw;R>7qTUR7OkWT+OS%<3MU`dO86*SlDe}kEJpxKHFepdZ+_`vJy%@c^!X}dafc7J_V zv`U(Z`nURgMDga!Zfl8hj?%QVGBmQM!IeBC&0ii2w-XKT%7E})$OPTYX-E&?Y^69&gHOpF-uQ7-sOg3E- zC|FoW(kIV_m6_hAHg4lec^xfopTa90Z@zMzbWH*&%#+&{cfWgWC>S=$1w}2*%zBFL z-vr8d!6eWz`-QjtejeLyDko}zl15ub!l%~^IefLcI zTWsd{h-#ZbP}V~^1K2;mb$sqTsoAB{A)J>wo1dApzk!PBey^ba{S#YTK%R?sltpO{ zkW=Qmo~rb0wQP9p-%WRWvke~hxTMCNol}4Y*lo}a8?-!WweFC8|} zUaXqr9|!ZyM|}hc)vYX1W>ES-{7+PsF{mJhb30QfOQA*BYq7Or9Uc{4H_x2MLWT{| zr{FrqKK7IdsHm5LtV&DKz=~Eu+BL@7$vLO+`krZcQW5a~fqkR0MB4-iiHW`=9S;v; zc$a4dQ+_g|(2$ob6#@gNS5g$l{Oktw8J+Ok$oS7wqOf@q+t(qL<^9(2zlY47?db6- zMW^df6Ha``BC|`7v-PVngyvag;Nb&c_@$4&tKei?51V(arr{fin5|<=M&C2)n4G1u zsqs%`Vk(PDM2#p1)2%rT-}-Kn4P(MKhCewohs$l%)U)@<>Q-4#;33%0TyF~)m?yl? zg5^K`NEGCzN;`=tPNigQV&(7rUC`50M9yJnwi*hNaDyP^qnRM6!vg-xM%Hku?)qy4 zN!MfE`j+_6F_!xVl8N}g+h(F4>RL_L;fVfxr37a0@bcj(--@)r+++=|`E@FV;^yW? z;$`4Mp7-tWoc9$jV;30=_!CO`jUfqIpr9d2Mo1myB`;r>>rfYo!-x?p{akQgszWBo5s| zTcH$Qbg#kxcA=ma6QS*Jglqr3&OWUJq5`OY;=jLT%dal zSa`*^(oG{B3xfd+S|prk`^Lm#tvKRTCpv>(-DFh|x;7{2v|yt2iT^AJGDHy%YP$~V+fUnY(V9$8tHRPf&yO}gDx$3Lw0HoE zo+x5*P8Lt=^Xkrv9IVZz*9D?qqyHXWYk&|zF?Vi*+Lsp?M*QA_tdpY^*cX_Gyah&l zZKNP(aS2ZM+cOaG1I?{m70;9NjzGlMeuZUepaKC3gr2z{<)(bV6#5AeZNGizia+hfK5#^YP?Nd46j1Lby|19pIWk zgv+;?jj?*ysKovD>twsjvo@<{VbDCIM)Cq{AjBpb#BDD0ZcFg=sEUq*)zN0%=iA{! z8X|Z-C`g(4gh>DR{?@tW{=j8`JeWbi-~FW6qHHP2LcQF`hv2Bt;*Db{iM!gAw6~7B zb0GC61#u!UZyU?nPIHx;zhL27i_X z|AO3!9*lG>OcXl$=q)6_->TCNFnnVJxqWJQ+`Q&v>zMG&Q8M2lR z`Re~gt0uo6O=?&5BC;?tg&(By5JWhJ?%9>%8U__j*MjI|-)!hEoJ+Cd$2V>4r=ZVC z<=A@9tZAijx#ob2R0uT#(R^iE@_=@Okk6#IzQi<0%tCXd;Ns?FgD8T|ir>Z7MFa%O zYPyNd11U1HD;vXvNN6+Pq3s(kHn~>UbJAO7k~3N~3uePUli1G9Di9+h67Z`AxKk^9 zHMRzvR^U(x1_IJ}LTP@#X5$OOc*EVqnoyTe?%R;8dzk{Z^@wA$U2BS2l`HZ0aoQ>I zmR84K>OUU+nI1V#h#>pLV_V$5j{i^<3L7i?`++ioDZRopqj$Ce!Mmzz zYMj@jy#y$MDXO9FG689J_wlWZN(wqwGPv8Gk1nl{MT(1xc%Ke@%`y?}2gZg{=uL|P z_CD~{gluzqZY|`69rLt$hNr@!m7l-b!6S)`r*mK4(W$Em>KN!P5$eWNUX671;#;e< zy6n2)uI^bnGem77vI#1+KZ%)tkmdPX_W&U7;m7EW6DMt<;l;e&n8p|<7@y4C{aS-I z<50BCp(VG9u&RIQxd|BJ_vX_;rRSq#RQk`vM3_8vO~hOv+2b31Wz7{HV_x>O(K0b2 zx4IGZLS{M^G8~_Hw>w_yUr>7#F+81>7QP@?W~HKitwgdHc2j&4O-)UX0FZWhw4MdlkS_lP@%B_P~ zh(Jr`JJ&9L=KgGVev^4Wpq-SIlC!xf!@%~s$?sw(d$%zSe=Us@B z-jyIMo|;trCv7iBOpORph)2yP8?S|*QJO5DI8H!&&fzs{US(biIE+SfJOZRyGu*%(RN37C3odNMT#8E+MjPjx;*=xzj_mt35pW8)M zxL!3!H7!n`eMe+Msee!1_Z35UGdbB>bCh$}^dy2=eBOSH@Dyp9VM1;P7EE5bT3UG~ zi1GdAPwJLeVDZMtJm84bepSogox(oElctdNp4-7uP1Pqb^E}zNO)o2|${AIeoQAfb zw2ZN`#=k{HR&9${Ct*eZ5CfwVm4S}9cSbEnH;5x67_`fN%0_biob>>~<2K5g@=sb+ zBrc*N8oZjsB{KkhoQa|^g$H)6BgtEmkIsZDn*J-SpTK$}=`M3F=Ym(uc5Zy9r=Y27<9aJHXN z%|6#>-%w|P0~PRZh8ACks7D4PG5m4MPTyyxc3G&3WtItCLG<|z$QU$S!Zy(z*INoa zTN&8_7P?MNPaOod?HgGw)IA12nhT;DYhCpJ^aM^cLt$JfD!XBC&R48&i#yCHfLgO| z*<{(a?DamfuzmL96GoqB4SwzH(JdTQT^dL5?>60yzbZPLV`(qBVVK(m0r&H-NW_mC z3C9J?>yhblTFp$A*J7fpx_e1!k1h98OB+DS(5hIjFbixr=ZY#Er@&rPpNEv0>uKfn z<@$CqpBZMz9#+an+Q&8#4|Pi`NkL+vH4K4Kd|Q$ODqh;y=CF>iNOOHMDN@B65J1K+ zw4sYwQCW?R!+t%K8}cQTmG8ZvK5~lY6ZcHR%Hoyw!plD06&j5&dq9@YGjiaqn0veq8ClA8^^5b{>x__(ux=Mc;Pdgi%6CDJQw9Wy>bX{fpo8-l5O<{rVOYwN6oY5SM>J z5CrkLiF!cX|6RVdUKAdFZb``$CSW-{)Jel|DYDS3kN3fsAevCw-AhT$NYBC0)f5E# z+TC;Bj(^Dg)RRMlf<=A#|YsMA{ApfPz%6!qFE%`s8&i|ZgBN`OAYQtTSMv| zQ9piE|0y%8eHaG|y898I@tBA5piicT=XIL=I^frz+a0Ei57<#rXJ_u03mFhWJaHJ! znZD_=&;6>%mkjC90P$m98vp~3+|R-@R#BLF78nVA}W-wLt98%Zk}3O1<1jxU(IyX zZlYIOW}N-_h7IKfFQ{8Ao^4UYJ)m_gV4@{e-}2g}NP-6_3=#gX;R)xm)e?5uVDK@GbptA(3&FFYfsXLhuEs4p)}8o7lH zG@x-x?$?v6tGY@Zf=Wv*Vb1Z@m7TSy-_t#;4pDkuZk~?(LuAJ0$#~h6CY}}S93Hl3 zf77nM{a=MYpfI-v=H-FJ)LD96GjqRyAxKQjcIRbz;@p>Zkeo@#jW@pB51$q6huf>^ zLxWctmf9Lptd2ddtoOdRSGZSLn8xZV{(^^?3lm0DNe#=EDztp;{G98ZR}xaR?24hJ zq~t=_v1FKJ+S-ewgCiB|zU>}n zepa>2@+ePX)OXk zE8kb^P=o15qYsV!jQMU~{DVC7-1o|CrwKgIPZ6#-W4<7Iw{uX1p1Bq#h5ftUJZs&o zI!BX0aBq;2%-P8wN~O!?UrI$uSa^%T06!SI+3o_w>JVt%gpPXn_AwQa({3^p8C!%` zyo;oc`hn+`Ti2Eu8{M3n3QYx6FnSt-j#-9W5SFUmNtV#&;y?9STPoi@O0d{J_S=A! zi4m?RF$UQ*%xlpE4k38RQ+E~G5^YC08f*o43KC7N1MH5BurB!bTP$u$#+{X3K`t98 z;unZ89h2`cgu^5=THxtn4IY#yT?~0VJr3VL{b>-ql$4GWD1-&&AOKHF2LW=FguH6t z|KaMZ0;=k|XcduekZvRd;n3aPA>GnQcf$sy8>G8Cq&q}9q`SMj4t;35;~k);xD0+DM~LWXwj+80SH@WfY= zj}H&vr?y@F+?HpJ=vuEOB7ap?^Mr&|Lb&Ivfz44qHpJr0&s$SHmWt_-MEu~58injr z{{dwMVjifsu$#~AMxz6p67?_V1Sy(Ynx_I@7?HL#VI;syyY*#@EnvBC4qPuQEUzIa z#wRm5`QltL53ko$c4YFL&eQ7y&xbGVAX-}gy(Z)NL%P{Av%;XcNXr$CK(y$Cg9G7g zwCl?Z?Z)$OQFXPar$a)NUsc-A7d9rTqo!5Vjn;YjffJU|3LVc?6w4o$h#~OjGB|uB z=){2%Z!~8*JMAV50e%0V<;T0AQ^v7-R{@P?!*>XWYUSXk*-S-7mWIZ6-=X2b<rSji-*qk`ox-9M65DR>C}aTVCcTjx zdSW6VZ3l426D01&#W@|O&dg}I`wpVa&~3p4?>$AV`rLg0Qpy+4R;oExj29H}c%VG! z1~ChHZx(NsH^dhxDOSKSbhkbRDx;lt7va>dR!;`Q-CsN#Y&~!CP5L9Q`}wHiV$RO~pO@Q&UYj_7gs$gc8mhTYd?V*3%(=+fA&>FAYeAQ!nvQPpx$c%rhb}NGZ$>I*RYhN__jv^3Ae}moF4n+l4T7 z?_skj{n@Q<16e2neM^h41S6jwqZi;VMN{00BH$w7>*A~fZDZ_;{KF{QhqUInHjQoT zG@`wA`m=IPc_AY@5((NtB*G@A5H}dctI*l5`(?+!-=GFZF^T?MSu*$TN1 zFDBm6rRy%Q=u|l^fRz+@xm@r30Ja_M1T%T!pifQ4_9Jqq%8i$I}Pd%XKn4qQf(4VC&W9v5AzWntN` ze>y!cQ8Tkl#6Vg0|5*R*@I3s%JjRvWwx$tFNm4;BoztSIC5YPp3#vlp#HZI&quXIP zU%q^SMM2cM{q1>%ZrZC`1z3z=*6iwZcx)GvwDbJ1<-kVCRO7{RORDg)K8H{kvbVmF zX$^uigk&`Plaf;WE}P@&_+QL1v0Nm#geW8^evXr913s412vI&6bGQ|7AH(H>vlaOH z@#Y8WtylS2&7rX#C#fUb>kh8_gU>d18AK!!y!XUp5+c(X&mqPTAmgiPI}=b+GWdBT z0MHGOn$amm2ZXylNK`C61Ss*w7Gg7Guo(1H6R554X6-xf$Oz*6R=Kn z{d{N22ZK^`6bi6z+a*siG4{@%sF2xjST*3`cQVz~@jaV-C5I-PW?_!+L75c4u^-n< z=p`Rfk&(E8cLHQy`De`sYzkBK&IiB@U_qV{zEIy{@lrsG+g#?kNpErN>LA}r{9O<2 zN^?fTm?~CQvOQ6}t!}V3f-07`C4S1Y6xNTfy}?p0MLgwD zkJt6j;I>*ud`9Cr;Ndpw=UOLOxKKcQ=$221AFi;n4B~HJMc(YVrsaTFwlnjNnFiuP zEIXdIl_u#7N+G&8l1?WAoOTyU>yq4~rY`qqK$~kUCg!MqOUST*?5dP8t68)uKev{H%H<3mcn$lNFO5lY)zmGK*sxWlzuBJNGbs4PV&Wn{-z^ zjz(SB$R8udUZef;y?w5}6%`CBrn0f~HBlVvy>cYKvcY41PYCbCt7xF@I9;z{a_u)A zfQ4|)xt=Ii34QN-^oOIlx&|ddPPjA=4^*#W822;?9QMOUG;2vil=*?B!||#YNJ>{j zrSIO!+49bD&E;Aa%Y1aahmX{J%1;-NOTUXtkVjnYf4MvEdpp_3xO@ELFzEK_S6pT) z(@k&P=eNJZW&d^M+@|0JyK7y6)6w-5fuLtaKF-BlE6r;uk~Gz%%RT+MKU>>LTP6ujN9W>9`@PueOsC}k&+7X@w>$7 z>xk^Px4Qgz0a({*Egm#G(e|$RXvQD~S5B@T8)tw59Q}+3(jZKG`T~d=Slm5HRreNW zaYB6Q73#$AnVM}sDL(*EQq|L(@l%7UHSn7;KLyhY{J&gc16mg?^Y1yyI;JsUByWU>lr z+{mwywNfEXYMa?VN@$EGAyC}kH4nEZMd|>wtpy)>;Qid&BEi?S*Uv zSiJiBb^_xs>w_B5nUOakhEroqk`hDFvqmW!9_pd*QSeb=(* z-mQ#IYA-l^GK9ME_4#4&ghOJR&>prHWpB@faUDKOt^I+lq3Sx6MzH)akm!p3H{omX zOv*j|doqXgWVv=NfZ! zZxk_YLL5V%rHkvVPBNoDg(LG@hA*o`3KcR`(&B%c=D#7eQc%4K^*#UvRS1EBGJA;n zO+j@x)laoV7!s}GO7KJkdPaOqe7>#JRA*XuW-bQu9t7y&*DjltBd_*T>7%qG3!^`p zHM*`z+nxj{BsaUwxX&|oh%}>p--s8w>eb0zX^Lf0+m-?2ik9Vl2&)5rykN=Lkh*%A zsO;!~(N`3bN7vtzmy|#+Gb370gqWQy4=ikm_HcggcgL`6l>v-bBBJ`<&UXY>5u$zr zVRLh&_X4#&AQ*%vI}UdA;K~Eia!I=&&6> z6Ni2!j>s8!Y}_V*=r=z}$diYt-Ci1tzc;uth$*!H2iyukCUrvPTPt5~;&O0O>@?(N zfD>gx**CyBm1mX!sge^!#BjsAA7n?=j|aAG?{Q`Iv}#zr`P2C$2yIM8n*G(nAua-} z`^a&Wzf>aAH|f+woBOf0SMy6m-IU=*{=yeWoW?y@D!jOlhM$Cm+1`uZ;o7~0q9)CRMW9V-xau)@!cm4SLK-1dXDF7%SD(NBC76nO9t z)jFnm`PLo{Tx|ysGyIcGD?zWk4!+6b?wr~bkXdT8=Yw7#*YT!2XxaK?Z=AGml2<5~ zb}=WSBE}TK@T|CxaboQMzZKA|OK3tqSgrm9qOhUOhVoEDX36v|0SgO6V$DyO0UU`L zRZS{vs(-H#rEgKLtTJCli5rPT`cB;ZM!Z8}80?b=iU4oc}LFL&$rG$5i`2kP|vg8lbGmrz8|znC7Xbf6*9aAM>DT9EhQpy6})Mf zqr05ynn-be`*2!z$a?@h-*4ukvXje%u!+&@bW)hMsbvT8{x%DNZ~>| zzUSy;cj-O18=iv)g0&buj-ctSt?Nw;gr3b(SIt24P&s8jFC&Sv;r(wBajLEzu+T&> z@3v!BAVn4hrsb;2m-v9o(o#y1cSGhny|>{<#>Rw+)-D)A+%L;vL!AafMBYHP_#D)w zVy&~&T*^_|a3%kP`8b`-JpMf5*r)Ry99u{XR`2+bx$y!3A0m->7^3>jhEVfK@vzsk zWxvAwKWL3T2dHM4Ueg(r>NFUtV_SXUUV7#EvTVGl)dV`}#L74%NcY6p5FDIEs$)P@ z)l_v`st_@vin7uIYY`WYdt%w_sN~ZJYCZrn!u3)1a~c%M9^EBtSx( zTjBG0_3RVOy#SNRBgvwV5UVV%s8iS69?zi~1IgAgjCCX)lvKs0kx}-{GD3@A+_o$w z#={Z{st6Y?^H;gcjlH9z7oSnVJ%${aT!~ z#}oY)PuVS^@m*k6+OUa<3FU&Ik_m8{bG9FJYGnRC_I`b_vitCz3d4sFkxiHZHCi;X zQqtXB$(Jr*`tv14$%3nERDsjg8pr1}>a1WUC|2Px;<*Nb%^9|xabO{o&Ryq3r(Oy=(BrMLFvt2qSbYvnH8t^i10siM!4OK6 z=$$YG#N1qRO5*dTN$TX3hSlZw_A)mzWmvXfYB?BLyG8t1K*R_u4iFvTByO9$__~qm zc-!h3NXATqG#~19oXHI{9~%&F9oW?=^qM-7xZUmq3H$4d<&V;*bNJkGV#JVUqMx;K zG2xB#5*4x#+V>@jT=;+87t;R#JsxO&)JM)&Zntqg2|IPv#a6BkUu0ahDuys;%+zPd zh%ljmXO`nHO0Oy)sI@C*x!LbE?wu+gXO9r_iE)Mq?_0_Da@Pm;V+-v(Ke<=ynryw2K1hp9w@8@fy zNi&;;#&#{Y)h}47hZ0CPCT#k==Jh<}^j^1aYT6H9VS!YMzg5WYo)gjs|tG|%1Wy);iJvYIhk)tZwhPJ{)uTekH_1w z7hjtAEi;1)+4j{V<15$+XMzy4XInfMVOHNTJXX`97GG;bfg~%SD(S%g$JsAP@HeD50h4WJhC|#mp>90U=I_eEEA+j$e>ab4p-?{ByZ!8IK;Ulf z?X#+T!MCQDsRS_ILedUI&W#*q+}UkT*bi%cM6F2R>j*$j9AKr!)<5|I&HzfEv+ue* z64S}I4`Yg$y z{JPb~qbw8Tyj1a!l6$k5j!=&NWBgMK-y)u?On`Hj=Sq7yn@t084#8HdE$~lZV)+E*Q~*4t7{`RXnMl-Vb|Pe@$ou}RO*WiIt#oAm5Wh%TRj#L z%vKs)J|tu|grJTGm;^5%Un6gXnn^?qJ!izkgzJ99^kt!9b^5^v&<_vHizP5r*M0!e zA-3Ql6gLa3RQ2YBtEO|UEfC^6j6fXd*OX@+dISZ=)NgRq!KBnC@9GKeoQ8i0x$S<` zyzwB|bUCJH(H%&Cur6=1?4zE%EUQQd3mo;`4dbmPeF9 zdM|P+N@Cs=>`gTW;*O;U{82Pl>{|kdIitAUd-1M3?5ymn0-ShLBDm#^o{8yOPkOib zK$y}2zWM_$87ALiS!46_XRW)GXdU*c51wHN%YvVOvs`8Z9`&WE53Rd;W7C#5z)C!B z;^?kOclQS+&?;pb0xT>_e5I{rTUNl&(TchjhgoWB$_!o?==S6{u&|PaHmA{=#@t== zHaKwF)*$HAx?eUrL5DPHE{kUnkHORxC7b~ zR>gurH>y1jA|G0sW4FW1c%0j$J~APAtJ$y9?v`C$4JDveYY@~F!1o~F{X+kKs;@v` z+{P$?9pdRFcHlu{1FjgHsj9`di*G`B7WB+aP1=5*j-X^?&{Gr2#TWhDo|(f)yIHV6 z;azoY$1_!gW9Wj_&qoVg2ZU-De{1gs?d%D!;VU_4(+FB;b!GF7UiTfYDmi&WFv;0oiN^}WaS2-WtCs?Z3&IB{u|oVie=SjD{0Kqv^I=amKW%HgQ!`&e-Tt_ z%+G!JK)0zXj9X3v;&I(z{2jgK$i_AumQcAbZ*bNBoK8~aKJptFf19$I-NsXI`?MaG z*?_9}gLz1@O2fe;ltx;Ypv(L$d9&sD@vSw&<)!I}cH>w7@d_WuSiV2i)4$VRh3K7B z_f?ow&c|gLnm?jPY@&`AGgkQL;8yEIoTAvEJC8H`%;SFl8FzZNg!eyT2po;SZ%RpM z017ZGdg;^35`Z+>Jnn5~TZ{V*fS`2$ACRsU9i8xD{dOw_4Z}S+T~#?F>ESnZ&Qdib zv018@{PLVCbDPl~nYppex}e8l{NByrMpPSi_dIHZm5J@e&Rg4WJyWX@ms+;M$Hd1o zaGxKNKKmP5@TUR{3__IRZu|$3cPdhiU$%$Gn>6Hn=9IX`u-H@lTY?} zA&&od#hoZ#s~cT^8*Opj^sPp@{s*d>n@s%R+EBLKoU=?K;GJ8X-)3{E9?le*vJl#^ zlF8E8kMiwKgIjaC*J{VrJubde)PwKXttWDa#9 zaBY8`BT=^}wctKAY@cVYf) zF5magrw#^>oyTS~we@WE*^in(*0#4n9qp0xk%_pTX6LQ@`ZiiGGkl|QC&};;|In&> zCkxuEE`#+?3UAZ5O&VQlRS5){-?D*DWd=)&99h&>Z}Kn`CsTn_(Jo5RD&U8~8of!w z!2KyFmf_#S0l78*oUdxMy%9iYpxUQkWaYTS{q7#5cg;?aH#|_jI*3d{wDN!|oHSq) zr1f`4HRM%Bdi@5u?pUG4D*f1ha#^&km`}S916omRoVH%jjiM%}Z71r?+d$Psv$%6g z_!Ct<;OxY}&=2_Ii2o;J^zYGLTSq62QbKXTJtgolypq7bCPDJ^4 zh|9vS#>JBDYu!tZQ8>q>Wi+MW?~9vLLJO0{TaHPVVUVw{lUkdbxA5znoemEyNS2+) zhyU+H|H5NJKyty*9_5VO&PlE|YA_-Rqv`_AEJC^>mo9VHi952z9S?o)Y$6B+wl6cE z#mPQ{&G*gh=)oVO`Z!n`;@ZX7{yongP_IFbBQF`QQA0TQS{4Uqp2ud~Va>%-6CrBN zf!4DBANK=frhwogw8t@t(&}^lgNw#qLER9$&rMrt5RQtH@7dYKlgaJ4BZMP)?xv%% z;iTHp$tFTxSavEwVO9TZ&_TLs44=H@Z_**Z48cy}ps*V1VbN^IwR5q^+WttI^Lct2 z+NrS#wY@RpwEqpM|700gq_be*f!uYDiscYEOJt|9J$Uw;$nxd*3RgRqUrmQmnYp&B z9#%7xvTusgf+_E>cU*fFyva$;aSwU$1wB?$u0$hbDzR3#dkr;@gQ;W%DUFi_ zd&=-h%0GjIJfuIyH&9qG-;(5hgXon;PL17xt5j4e@c5; z5^EM(cuN9!4?SJ?3xNeJ@K8IS^uKMI6;m=@4Y&!pB-2nor1Kh>i}#@M5QV_#`e-Vt zr6k05C((oGMh0Zfeywq~Tz>~&bu%D~zaxT(({%b8q^AvU?JGQ=Z_XY9iETgDC+S@x z88|9nIxg>rFo{$5w+_e*ApT^J8is-DyFkI$l}8@eNJ!fc(`ttG5SAmz=Ip^kXShuC z%ww7gJG$k;n_qCITqRynJi&dr5Y0OMYvNzmMpJIP>Q6g(y{|gEztr4VubLVg&TM3~ z$n45jXtsXdE3zl?0b1fQ7(VQ2Mr;0UPt3mwI_qv8{3@QlMt!e`I$B}etg-Ka%Dc-j z?(M5uqcXT#bj30m-B=nt1o%9h7gh?G(yyYl__(bKG^(hnJ?}IuqY2Jy)9AF>r8HeH zq(p37U&LoOliP1BmVk~!sF%kT zvcg&G`%jNH9@4RdesY>Mf5y5m`FP~&x z!g3Y=K9C&fb1@ptn=8ZtE42(-GPh`*YWL+7<&0`JU*wX1RCvPVEB!SQ2Q)jT?@Ru( zM1bf3(|E=41u)gsbH;FI{EOBqAeG;&-QWJv`+BAtCpypPKF!Q1mwc`Tf}04-NNc^l za(=|?Rr|wV@z?Vt7)Aa$f9TizwlV_0qmG!E*y%rg;^P z>Gs}6WKB;?k;+(OIWo0gW@hS$R}4-6P*rUeW(Oc<@@L}(QK_T#lsrE)xJL=2X41-4 z!a{D?CnHl;-C0FQ=k6ObN#(yP0=42<3UImLOZetpNCAi}zC0n)c#n|EZmw?4ku#r( zjde`ma6+XBA`1Oyj2`r_kJ1R4mGmt%74wY^=)fg7#Jj<5E*nHXP~p)YF3=aLt|mKCz0d zudVqdJXWDu%&onRj7^hssK;iHW@o2$5&3zHw>ZIWF1rgPGmXnl;`o2{#*&h}=Al3q zp|=V17C^BCfx&7*VGTvGaJ4e8h;tjvcycu@3{;f@Xz1S){W&*&8B(8p(=)oe@BRCV zx>NqA{}S?Ns~i$`kFPlrG4(G$dgC+Tr~e)8zh`dj7rav`rUa^)&?LnlRsjMe(X6OH zow`xH=2}$$SI!Xb7CxHMBlB&1VhlAj0W#!G!{Zh!;I#%kplj?n|rVV28=rXd_6jbzo)(YM4;9lH-=y#w^Z_M}P z_Voz$GOMGwxcGBg`tS@spS|Plutr|JwP2>Zrg_^+jjPk&0_|XT9(`SrY-KsQQ2i=9 zc`5st(au+hmWxS?4UkSdlOe~-GL2@_T;V>s@CfYJRdqNdVsa6StG3a}`E_n4{{$Co z0e9{-JM=n`*MgJiFCZ!hoOx;S$9*&3x?Xq-)Vzf2IWfn$_&{xQ4}!BcBrqfzO)I(Q z>6upQnV!7}aPPX0l-GvP)W^2)d!&z6APwNS)bb?KeSq}8)4q0QdxuC=5mTU5N{{7k zv^q~vQc^NO;UA=@TVwq5Yhq%@<2`q;J~PwJ?+y3Kj-}e?@)3QhhSRPT&`R(Q6{W@T!_l z%X8C1hhsu#v42*7@omTc{to`42cTWzQ z(76$(kSn+}NA)@)LQZZN-?^!Tr%$WHV|Kreqx?QbTSi3W&DWbatatnlET{39&pWxu zj#Nnd@iMt$AA$v)>(I1Yng_uU4=NN9v3W41mIy;UKUwh~X9hs?3lhnyZRYRDk>4n@ zwR*NJ@8M!&Wq+qes}_Sr;(CDTC;+}UgEyP-S@Ef>V{76Hy^i^*<{e_s#ANkFT`e2L zvJn;h4>R2uwjTsC%&jw?5bR~}RQgjh0qD_qd}n!YHaulioPDQSq^_igZ+W;T~fS@H6sJ+C#Co5SeZT7ld7SD}07 z+4uxY6Sh}E-)3sEw)E;J9prZN46b{UKp%sB>7Ix#Eo>~D8VE+~Yt2JBX^r69`H{|Ma@+jTO9iK2>2|J~anH#9j&R~+M zOsBRpKSgmy9yyj^I5?N3J$8^kM*$i)JLr0j3@P_4JD|0+eMK4 zPUOf*%RFzb#6PKsKC``JEqX-L}c*lP;tk zIp%9|MLj!+`Y;(Mp-iJgN;CN}1ncpJ{1S3ouCSrLm(>9U^ZTC(c)ILORi=6nEEu*_ zh!Z~%J2%mWEg?r^4oD@2p?2@ZrVzaC64;bEIQ3@7{|f-mM*HE3SUo4V;6ACmz9Xa= zJ@d^s^E+iHd+XH2kG_+WzN3O8rLnTrDoU$hv(`0lK$#WSsF;!={J>r{Fx7H{(5l35 zbbIPT3+N_Wj-iPr9_fpI$;++CjAuc%t}zYViR+z}4%YIxk8 zo|F|0T zJJsbkAS@uJj%_EctuJ^0x-<*)zTbNhjyM)d43^GnQ78jT~Xr?i$v z(V$i>6KgC_2K*EOt`2-dl=w?M5lYD*1)f8`(}I_ao{zzKMG{DgPNF|oHI`@LGJQq_ z6q^pti5n)9kF$6VRUoi(zdBM~I65p8W^`{u8{E&;M-C|6is$TO+?&vBly%68w(}mA za&^ke$HS~AFVDNy{XxH5`gMVWs#=G})D<36o&!VtBeMn|mDn~icSRO9U6Xn;;5K33 zvirrPk&<-jFb~>NW5>(v2?u0c5XTY4Gb3%8@Qpzw-Yo6TlwB*mbzhK$vA zSA)R3G93LQ@U`wn5Hlh_u{s&w?#}$jJ~_vmY0uy!4`_AWwVc~8qU#b3Shzo;bW@hz z`VYpmR4x$#ld+gApS~}(dWDCJZMcO=n22$)$0x!|6Y4CD(3iJdQcsi&hW2Z7WFh=? zpB(Ng>DeF9{Xp}fcL$e8!mNot%ScS~i<2>D)adQmg~_*Z8Qd~#wVpmvRaG^Qd!$Yr zu8@|{cIaPwiw%q-t{{Ds-Dd%|jm??a*-dnoRhB9dKyr0V^08uL5S+j8`uNj(I`w8~9#~;{dM5_U*5a z5IXG-{Df5DD)Le$b!sUV2d;@MQ?i$DfJxO^hwOm5=OkhJs4VzMt{@~I}jVtjP(+WVCsN>Ld)aLr0{Ed*6#c6q5 z37-X4zO-fBr)O2IT9q#mGbNf3R`THP$fLH~l{Wy!7-Lz2(Tb z6?3?4I>i;ZKBN?=e!iRR)#3MqvYvB2WZCN~rZ68(>X_;rgS$f`Lm_8Vl$WoMNdGm} z6xMu=*DqeRI~BL(OovT2Ok#xIkII7SICQG^G*jYD-HtcQe{m{6;B&7Bp_(}*F9C~h zpG44U&pd%2&qbEdd4ZiD&{SRr$L>2Pj`G@Z-;sKsYmHYRazW#atn58V{WHxT`(B`^ z#iUlh?}rz4sY>eKmwO`RECKz?H zBm%yW2$Rt{NZWFUwcf2j+@WZal8}$jA&M?`h0bD!2qx~UDIh=S^)!KxKTfT_wz|se zE+6?-_jCN7^lQ3mN))<4FdK<8=w!&><0-|eiDQ?Hu1 z8X*z+si4~*)Kr9xX{&<&LV5vs^!<1ese6AvHGVK9+D%XyKn^S^Djflqm2}1%l zJ}`*(35T6UXOB#&8Ys|J=R! z{wrm&FB~~Nlu3Zs_9l`R8Cm6uBmv;* zezLjzrMbDu@kyUv?@nn}Z*}wm3STZYQdc58lUxlFxyQt&aoQ{p!nwP-`uPF2S`FYK zsbHv+aR81WERQ?)!Bx0TqKMa;$NAeB45-zb0C+aM`b-nz4THLyu!gTaQ~7np-)MAZ zwe&)ql9t!$WGjY#!C9x}dbNNaSTHs-A=|&x?x^Y%r*?}fw%7ZdD&+~kCT&65>vw3Ldf+HdxX**Lww9q)8?^rm{`|VfVP34q)Ss9u&y%=q1sQ?(VeuTXU6xfYB+hq`5Z?=+hHmc(%AW zYfpL!a@LLxsrFD+k}b_G4LV+@r^CkQDWbz(zBmmLm(#|=!d~j|ekwd|&){;|3j|Q? zH;m+6uyyQlo@|Lu@So$)R$E=xuNFwK$tBI#sB>{Kd51!p&0ffEkkcVpr7ZcbAm3AW zi_gYgBZ0loz_ZTf69)+pMJV91V8wz+*Iy0MLYn_^@F0PDLI#(PnOjAa8X^ug8V$$sDm(|7x!r0$uOb07>-hFYk(?KHq_PqH*NbU8eD z+kX`u$Z^a+sGm|7Q%Ay*6~V1UK`rlUv!pU3ob1G!JUy(KgJwj+S=|6vxisE}D-Wjd%lMBbyV@61p_shMlo)^7)uA z!^HIvLbH#`Ci(WM{5~*`U zCcwTs_pBStcRE&w!|~3GcO4aO8TQ0&&mST178UJx!qbJsDj7u*9(RZCd6-|-fU6_F z?Q}Maj5C4~s!bq3!ao{6=C^bSVFD-RTF2leF(Eonsk8EY-U5;)%f&2h-o%?j-*@=S z?4*g&l^q{3>B#B6aiHI-u@`AZRDBQc2#kZM@ic_vf5pVcC83eDn9t=8vEwx3f7&PDBLJ}H>ww4b}UjEkx z=B0!_xzv$_z(kYLXA+~MMxkZWc8W~?!@g6FM5>W7HD%=>YLE|%3vtIV`?qojfldv$ zuOEj4y|^P~P{M4lvh#qKYp2FU;9yV6Yhb?C&1R{U(&rTd0>YW_0vD&l(>v=&O?d)4d%%2*e{ zF&qPjeM~cJ$(E{kel;YS$n->TijT$ZL4>u5Y}-J>Kv^#oU4h)I>du zHb)#yjzScWOPQz2{w~8?*#Vq@hMXI!DjXb@Ciew7xMo!#xbEea66;fcWRXsHgQ(=g zK0iB+w!gfa_X1!MnlC;IE~5_Fu(pe0O8kXSa>cT|{R>1EKp$Wt8SCGLF)tx9+4G$O zfq0ZX*a)QtpIN{kz-8`9V>?Gz7U#?0`t5a?HZ{yMWux>PDY}=na+P zMp{yvACn=ZhkPJ{lUuQQYG=wk3PtpXiDm+4#&?IUZgD{Jue9W;E=LVJ($;lhsHdb{ zLsb{w2Aa*nQ9lr|7kiUCX%o2;I4}9Kk(hN&xIaW%=LNj4zfXYwivyF-t?+e(?SVQX zmueh~2=$ayKYmV=-%yI%9vW|;$g9Q3_MT&Q`MR@bZP((`>7Snq0*Tc}Gnv_$HdT~t z-oagcZ%;#o)vE|v6%3pKBJ~VQXgV@2H+!Bu_Gy6=Eac8Uf}J^YDSX3c%B9Va)Ts3t zkE0azkS6K7-s!mtGz&`}*w*vF$-{KZ#1eZ{E7}X(a+f^T|HQu3r{OUaT48RwPqkDT@DI;X zLN{>3>F*E%pIR-Rv2@)fbHKV5i<|#aihL z7bm_ZD!HK1Cz~*XDYQg!xyk$V)k(o+p-+|Q|n#!qZ9dBU~KI0EPGnzTa%1rgqd%aJ1 z`W}5YN(aF_tHV1ngRPcM_VDruePsjXKtuS-!@~ogkT;w7Vl|*T{fgusPk_Cn`?zXV zcZsrC-T%-G8O*;KeNfgkDV@~|6tR;ybNSezuJ}`+ieH}`N00zB2k9xM6#o?;EaE!d zSGW2%Mx#d!t51UR8|u&>)~1#y`d=s=JT}_ES?fk#8T=dAgF{2_PUgm+ul6vnOxN* z25OCO6N!YNk%6t#vwU`uLP#ip=7$>UTh?M~p||c^Lxz}&pJT{V+5}D7Z$G~xO4Mg@ z+W6w$WA8wHSr$j$8(+T5L$QnTPv^c$N!zbi@nLzxTU^#TAmK+I^4p%s9Nt-#M)&9A z)Yc);9RbI$JDZJ-_sd~5Uk}=7tu%5jXj%+I!^Kqw8`eYnFL_KBgTF>?Tnl$@r%R>0 z-HtaEKfl*ar_Ym~_%(`EmyyS9LS5ODQKj7Bf5YTr*Dz!jxv4!zd*aU(VWZPVn0P7# zO@bCZ+N-SY_r zxcEPRg|aVTd4BUD*)H_7)T~`|~*6ZJ7cn)a{~PU2MLEew@TrNyO3g(O7{sqfn zBcfGQ;1%JU0B~47-pj;|V%U=;e{j;_+1Q%J{I~8eP7fr?yC1<1QP*d6qSa!>$>_<5 zBUt+qcTbYM_ZRb<`}#nT{1&PhQe|kUbck32IM*U4;$Fbcs=Ecn4MJBtza}`NVlF}h z6Tmzn6>Lx$B39}xUnnl8^ay*9r?N~YIh|h~P%8<_@YtkvAR?VL`(o;FL$dO4J1gT8 zmuM*psZs9lUdmd0X3H>qL*qV`f9tDNY@!vxLH?o=FEUbHheE_AG>ED8>^$`2y+JJ! zr&Gv3*<9x51%G>0@%^|xvbSN)5m^?=}6Cos7VL*I-N)dr+74&M3aT%fibR;J?Cva0mpxRGR{3Z=*scJM|@ zZ2V4rbC^qu9yd1AYf;4C9o~{;NqTEyk1Yq!GG*Q+%=xpyFqmXk**)D<#ZV~*Xas8W zM6Bz4yfLDLWk2P{sHkkKDl*!T6>!>quu>$Deh=ZA7@7w@>3hmq+869!M{TZK3|=RW z`!WnvY(!QgBHWdVm_9Yteeflv-bc--qVxz!V5*tQR};4=tH3fnbmOH7Nem-=TaaYG zJj^tB6WEB>x&+|@6A+8QF{aqQjRR%^CuyoV$oZQ+SB3gePV}CKOy^xuz#ERwS5*Q} z&m6b$g{xtOh-UKU^A(sm#&g3Iy>dciZvHAmrq2FzLGSYv$MSCMjyg}|EPZ?vH@?PO zrmB&sik-I%X}H$iHH)uDw&hTOIX=1U)$ zf90TQzB8k9brVy%q~5|I+yrjbtLW3=b3!M_?f#1hvzp;_kR=C(>6}bMV zRlkzyN4eby8MAX!bUgMUjpid6x2Wr>hu6%k_C2ga^@*3X{2zbXziP)gOQJcqHbgE* z)hSU*YljJz}^(TM?M z%0hK=7NGI@|B&_8aaFBRx3D6ubVzr%ba(eAL|VGLB$r4?cXzXC=}zfxq+7bX?>>6Y z``!C~|MOdGFP{0#7<0@qtME}>lc#8wK#A;J8~7ELCg0TF1Oddxxjp&FYxrtlB#z|y zTonvrEx>BT=VQvDO7LhSmR3G?xNZu&RGGaoxygsoy&_s^#rv79Xqs!9X8Nrck&s>l z;v4q*n!N?HtkTY)Gu3FGo!AVU_oHbIKHD1=g<*ICS=G@+cfe#OuoET)2x0_}7KZJ* znUA?{d5H^=Nk8ffO1Y*#6Q*?3M^|s*rOrL0n5_D}d2)Sf^gSpQf3uH6A<>_!(=U|w z>xD7JZ$?VtUevP7ao{s21$mcSYtZ1>=%~l_E~%SztLMP5^bXVALtBUFn0xPS4ju$L zv|`kQ`Eqf`4|qam0MJ3>y)biOBY*#(Gme>)9$sg75V`!_XZy zBZwynM~4Q2&xAWC#XcDECx)hIZalbb9WPxD$+AeH0PN1j1q&_5eUZ&|uXrzoH}#r+ z-&FS@k7jT~At>RBeRC9~9`qlSCP!?pjk)b)vS| z{q$t@7ffzlj=F#lxaz%r?{*3-QV{3lA@Zq3kcR&u2~C?o5mjoU;-W=|r<^kfa-Ayn zPpV+ocwBKE7>e^Q@`o@h(9ZHEa&n0RG_7Vj*rF{DS{5nb;J1{N#yhK_Bj3~zxCUx% zdXSUowNto-Yr~|a7zD*<%6nvtP?Oq!gS=)eZu7UEugHRr`eZbmJ(Zu#WaeqEG7>c4 zqcOR<@?T4wtJW>uWK?=KhxnC3-ovS(+J>7RtOCkhIAEu7ZH3?kBfIbLN4Nm!S=Q^u zTc39|8aVPUvr;{UtM5BY>pVcL@EOjiA2gV5(Gkc%{BS3F%6sNrmlekKuVj#`sKhJn zfLmOBr$M~kJ^aVY8=R^XK_B1?F(S!Iy)am`F|+iu+~{ABU8O zN}LHt>A`ZMaI^K8&Vr>+R*s z?-6(g3ko5d#Y*}m>Be!N$HR0V^*llD4!4_+1D=Zg zZ4aX>qABp4i-%{K!nhLnp3h&lzHl?-daqAUm|S$T-rrob0XRZW^h>mCreoy_%V!u7 znTUtu1#NHsuj^6>1-;iDwzQ<7shh_%MGHaw{#=$6GG@c1#DA54O za}Pm08tzxF zV!dWS*Vd;N-gl1(=<{M`-DB#Fc81$h;lyf7Xn8hqlQD?DcIy0pk#j>Cxj>K%Iefl( zVvW(N1^jV<6nAqGW*%LArVTswM-I3mL+ENbjdm_G@T|QOytI_D+2WiyADwaFbyyt#p&amEr!e z#1uoTDq^SxajTqL9Y)4uuch$b}SlSiaJ2)`|xqUJHnmKv@F zzY9cA%oStySF{Acp_9Tv>}Kik_3ikvjmy+~@=4t5+~xyBDB`hiGF z7b0Om@hCeB(e#y|2e5M63(SZP`PD#Ab`jonDRV-mDDod<3)CoFfG~!{BuxRYv#`~-*wIj(rSnKbb zX1tYLTwnu~>+_am7g1vAs)<=dZ#BLbZ?Ba7@0cK_en-iJJI|%G#2y)`Jj< zW%F~-QDR)EOy84yP1o<29z<^x#NP)CKZr%~F-M3F7JDc{AfYs8^^I!8jp_?>{dg@p z8%rZ~O6zy5U^`h`vWgs##kI-J0X!DkXhjYfH6{9eO2Uv#j!9(kxO(>xxlKueGVp}6?EMDOnB$|2(*%C)a zFys;TQ4dF9P*KNuTdqAXk%5l^3^bZDDspqIz@|&x4R;N_sxTpwdN+1QiYD(7&u;|W zHrhe41%>$qISb3U{EFpB=LJI2r-TifZMKPmTKx+wwQ2|Mmq@;? zNGy+W{9RUFBMtt@4xDXfoC--`F(f=7;jbN9p^YHV!{!`kO6T7xB<$7js##JJkz0BfCOC*<;mB3{><@ur(6_edu zXlrX_1St0p|C%Of+c?M3$W^c@qu*f^m+;T6(NT1*t1QCR@qY5kcxd;UuZVCD(l>`;b_t@U+qOO9;yUZ$MB>6B!rK88*ac;9oVOHY3TaR8 zC$pzpIK1(av0>FQOZX$M=oG5L6eH7oT;CB$+@;El0dk8QR|kIJW_rGgIm|Z2MyS+k zUutgkX|kZpxVo*~z8y|~KATgHC|1EA(*W=nRAshr|ce9_n=Hn`V_hj9Y78`~8Z!++Y+YWk_ zX#4aU7Kl@LMU=ICk4(4NyD&;5HP7i>>w!R`YB{&^rr2$i)znW>#a3&KHE=2)B*Xs zxayWYw!6__wyggqG{_~Q(q^x|gG5-`^h55HM;VKTt_WW3HlcP=QC41BNlqfVs&x2W zHw?SaMQFvsGXBTNa5VY}J0Z~)$QNSVmX*8@mzVdv#Lvs4kg19|sfZ$&-Pt4es#Pw` zv*9@j8vcikjsu)3Vt`v%=w57oI$fCliZ^qJL`#UE$Qb|1z|Pn_f4yfoCC8cZq}N?G z^;(L2vMWovn68L(+=+FnM)@NqvI|~O9?i$NNk>(sJHmAxzKZX9gZR?<)DC(-zMt&uGo>CnQ?9~X)e^Uy?k6Ta*1SaPxjq4@sde8*8apt?HZ%Ccu0L}H z@CcCE<%YZKyu-h#IT*Wd-1*k^4c{O!y1ph^W~hM5j(f|AlVeVpK)}&HN%IrzeQP&e z0;l?wse+PHXn4r5w36!Fv^bMC5|YC6@9OI6C}{C4Fu1s2^osn6ap+eU*XYQ|z{m)s z7xtR#5OoT0yaprnoCjuEtC^a@-mCl54T_QmcK3)=Q+1aV6^U_e%@J%dNRX*BDY@!F z)ZQZ+&T~=y)F~`$`41fVL~^sTNN7o!1UX^rv&zbhEDZv1e;}?FEOAcD3$L9gmVm(| zyhOR@7Z+94)s5@>`*>NtQ>JALvvzCUMLEN-#DrnvaqY#xB7YWK0jJpT(+w<$NDhZ* zr0~)^tMbZKFX2Dvxf8r=0#{#tj=-3`iMa6OemxCZO_qt0^13F)&ZtI^LFn#G&w0&= zl`tpDTsazW^wGYU#zQNqHhIDNdcl)^Lh!dIY8MTGMB?gg0&cY#P4&{AL1ycSf)+lw zHJa%{Yq#g5+#4qK2#Dl7BKCr{WH8frLc0C#vDD@ZjXMECi@Gk?<;H)HAHHp?->RmR ztrt2=SmW$W*Th>zXhf7J95`GE2E#L=Cl_kh?2Xq*SaD*plAWwJV%Y?_(Y!7wWtc6< z^zdA1arDJ~_qfHT>Lge5_Wa^y{t=(E_ukEJxf}2BF1Nfj4Zv^C4qx~tKV~yMO&DrO z=PaA>Q4LadmwDpL^!}1FQ-r<^@%~bo{PBn{+qW;n27vG{vJGr4mVwv_!l}rI_m6gr*AM7x{;=v4X2KuId8San_ z?Z3=UF{?KK1aB$Yo&El8uKgYR)Q^7Jep9sLAWPyy?yiwfWbZml;#4KpWkMWJWi$~Q z0~!yh)?EkjBJP=zsM}9npmYUc1b}GYfC4PU*#|0qsrJ-LzBJxDSaYL^qm|Scrx>VM zZwJIkHQi_*71wWZxO}w}5e?WGDRF)G?H%P6 z<%Q=dxj~4~vLUiiwsMY~S+E)WEkcYOxFH$&wTvwsq%$ICEp8Wd3)c~fNdO#W1}qZs z6Qt~)b}%ZY;XT6V#mB+@4h{3geQ9Eb>+=voTpX+qYw?dCYu(x2NNKu+>AHh9oKLS8;zE?%d@af}MM{-ULFCpQYYfJIu&U-*e*LJgi67_)Zcs7BhgC%e0oyO+^# zme6D6prVHbZe*Ay%%_!(ol7Ba9#dP z@2;@=?q0II;lRMoIZH_Fb$tIAvphV#jVVd&U-+GR=bhsWvrXnIkb&HWALD8oQ(f#B z@FJeTZRYs#S)zR_JDd`@m8~f<-|2qiBW>p6_|3`U4YA}Jr&BYpdCA+79VS`rp!+|d z%YOzD)Bz{`k4Z?U0oTiK`;_DqtgLJnhg;-bvhR-z7hlfrks6-R_3gW825BnaXXUEb z!yNel!X^~m%fud)JCWZH#_jT$(2^i|03X}N?2!Ks+i1Ah%jdpzBYY*3H(2|$yCrzS zfu2M+N!vuVb1ue-w`0H1Lue`cr~(QDbDCNMl`nRG$PLU7;1iVwetbIw+`kkuPD;FS z%q^FW6iTS|oIQy|;*SI-XE(^r#4MDAH6JX2J>Q^NtB$^Gk=N_low}Y^V*?{10-2D0 zqWIH|>@bS@Wp^jA4$tc~Y|P;z6UIN?D(Dy3wR2Wk2!|oLK4f8N>cho{L3+JJXJ5(w zp&I`3LLx!l2b$M#9i$A-A|d`p@{Zfn=Z%<3Ow70+&V}z!sr5MBfbn^&wLUmkThBY- z5dlNe0Rf$*{5&ymH0YBDeD|ZG`>aU`^zHrU>`{UHAFAS;d>oE%l%U%;6*UXf#!yup zaBz}4-eLtcfTCiU(|ALgE|mGta{I3?@IReB4v=dtGxU}6G9rN6IcL;$XDsS;X)s7fQpZ(6*SYE&Y@DPqd7MBpll4)}RghvD3@;58aP2Ex)1Nx)Ig^1lF_m9$$pA9R3;(az)K_@h>!#2 z4Gpo==;x)OmHT)p{rIn(3w~pN4pMb?J)W-zN6BFi>K8w9UalsN5nYr}3$(cLQSw;) z0wd%X<*c9_cT&&wj%Lf9Jf~sU-qAzY%UJz8Imk=TXB1NHachu8{ulp)mNvadnL50`^Uc{7jQgSC$j)VdOD)iu+5{~PT8>&Jaj(uBi- z!(iFSBv(^s9n*Kj?2qhsg{8~Obz}K!Z1q1Y)-j{cMFw7Tmji)%s5J1soEcCCn9r$I zxw40qlXYlxh@@Tj)U9zG9sAj|BD+$y%8EJh93`p(_Q>8FPp>k242_~RYIe8Qz0Vvf z17Ki+*fr3Cn{EizCYJB{y~BiEXh)(Ipc3V~3!N~?cJU_;RPf9zweWOTMF=iN0pTov z+fWs`N5vvnc|eVVfN_LDwqGbJJ-Mi;Y-HXDqOXoY8-SKhM@L4u%q2)LSj|*mGgn0a z?WtAZgw&L{kY>%;z+$Sv=sj(4!lG~^5{8o#1*3%G8|;Nl9O5097sZR&qXuc<`JH=X zqsC|^^5umu8!gmP{&A?CjLkn;uy7eF4Fmd)e&DGFQ2NxG&$!l{pII&r5w+3h>PV0X z-Fc6#AV7ecbb4Q+T2uy2VZ8ZJ>Z54qWkY4+H+A9}clup&w)8OLGVNRK9Qo0uS`)W) z+Xt9*Y7lPXlj?LpNUTTQvm@(APqf$>jkK*mqW^KL|IF2ke+A&x z@O|g*HEI>^ev7Z_rVbV5@X|GvOWK0riIcI3(n$w!2b0C#rH>omvlN0>KA=RAva`%* z=95V%^IH;-BJD;6l5=lX;YTSSITNC`M;5i@oXBBC2%S3;qlX#7@}K_)Nl+cBRE|Bh}nz zd+g&h_66)|1pN#1JIdHd=~y2jC@z|(Xs?%Gt|RFYRl!Es>xt-fWzi2uGr&dRdQeDQ zu8Ljt`dM+guH9S;O@v=V$!!0}L5Rz{Bt{p3qRb zLZTkL9R|Zq%z4L>YzJ&@nbFeF;FW0Cu$|2Jmh!!nbef%^5cMu~ha9T^dN!^V7CA>2 z(F8T-ngCWdd-^(+xM)NZ8lPuZauN%El(K|Y>Cf-hw8R~Li^Sh^;sMy#Hydl3w_C?+ zs^I7n(Z@3MmE)2qi+;fMDT*O&SMAW=SXz6m6ul2Vu#*f9A)kjk{DPL5TtTWvpyS~& z#rk{8E|N_Zq%w{jf0ZEL*z}~=m|yh2#8Lzy^v~9}6};~$&b-iGpfA9*MNgC7p(WY) zf`P#L=ITlz-);Q%yr_Og<|W0bRl`M+CS#j{065#3>9jkgdC0*-@YFcC%Unwl5duM1 z;!a3E&3BdBa4oKs<~$8*hkkUM@5U;)32JG*TlX;K|Ix|v{41pH?)5Ylp*G0ViqDfk ziC93ql7s@Xe}i~!a1{eAb5Z_NQ2|PF?8s_9G^CD~qLuh7( zxj9)0`}nfx?NxGyT$8`dF;zFTWoxHYR7v)7;$j(EOCSUAQ;n74I01-h(a{mc=_+i( z8aBK4fm(E9O`6HcK?YJH)YkarDO$X|+{#=7-O~i|Svh1~ARk#vQg_AZpjRse6F@Xt zzxw^{`cuQN-A?jec<9Ni4^U5fdOU8j3Svh6g+{W@RPknvRsSe8Aftcsd`a~`oFhex z-ph{MJa&AzRPw<~#r-hr!sIaud$juCW#lSCHR zt!A(`+fy+3rUBKVm03@u}X}qdc z7ZtaKr45)7j0l)mvnW4oO!BiCXy~EaYDOxW(HdVsEz|1#r5c4CG5dL{|G3b<-s>+I zY?;!5Z<+WQD$=p=U=63SNkgvmm`zVIaI-kXHu3d-ezZze|DkgbYCsCD0lb9JPL#Cu zJ_XN<^480m3fSoEiLCbR+hjE=8k2b@k-k542jqk7r=9Bd`Dw|?%XF!WzWOoN z3v}hXmS-bXpeVBmh_k^6qho;R}|z@+x{I$BztWU>(pd95kGJj`uEpolX;1}bt!(jAYC%kLBgNXX;Qk-!Rn$S`jK=u&q7BLxa9&DAc)nr=_Yj!)_v zcw{Qr<_WlO&N7y{mysdi_vE#&EMl%QDVO^*nac|;&j42!Q?+6q;*r7P+^1#CNz#q^ z?6hMqvLkCKxdiE&=xF>rc@y6sS=@MNOqtxbv70~Fhp{j21e%KP%L5fMdIe;M6y`6i z`Cib01t^#X7&@Q1=e{B{Nm3%>OuERsw(B-u-)0Ld+pbt2DUz^rvjz+YKRzUBk9m(D zH7p*ayVKQ%xHo!RBT^qS9=nv6IxOv2Xh&LI_`C=L0)yUVt83=Cm(+1p=x{q-em+1> zkH*6MaF}$_gJHMpmhO4I=`7EXT~>y_`@%{E(244*(o?Z^?aUkXSM5q&xjW;fwlVdW z7Zf0`qwsL8OBLmopb%o99X|_>f&8DQ&QyOON(RUJS{`%=TtpX2MYUJ7`GQPMJ-n<- zr78CLzBJ^ISk)^ekiAl@VqA3ndWeIIz3=j3Yio;4C8H!Kwj>Z!k`w-&|A6cjae~Gu zkZB2Nc(SJDq(gT0J_d758|+BhlBvrqGoCqPdEulcKeT=EIJ?Hf zt_0`tk7b9(^MF^bd$H{P2i*1Mj54WlUenuUtG(YuW=e3+Lu#OGVfN}h6kACfwKz5M zDL*&7qLHyay^6v9! zlfD}}abus`L~@h>IetfS4LVT&4n>pT(U(+aL&(NNNPIBlIiFgW(UU><4-nKZ_BpSW z6WN_%AP_!Iq(fXAMhX}9FKtbE4!-4VR_A$Se(zUqkk{ub{a`WWTX3$68+>|0Q`OY{ z%d(ai{Ue=Ou%RqX1hh=t)vx_ueE30x+G}0zf~RrHS!q#Ml0Z8JAcF)SPpp^4iZKeujWwx{dqjt{X0xa~a>%>RFV0J?_o=&k$Yjj1 z(vcu^AHO>IdEj`>Hn=n_MADW~tKNLdm;C23R6^%#AF1mj!@^UwBQE3aJtMgFD};P> zT(-tktYUE1F)9Hy%F#-v3)wbJ+{c2D91P06a0Pij=RF86M~Fp)*rTen`oq_W`~g-m zZG51YOnkX>07i=u`BGTe*~LlfO+;pWxvu!AD$}4|2H>)8hUmijf%JLzdD+^Bzof*< z`Ed3v=u}6E60g7%8wUpAOUIAss$khoqn;0S(d*gVc~nxIDk>8BN#nF=U*03^23_(j zk4ujn(%;OSwsnWIvswqgLE1Xr(h*UI&LQ`yXdm{=O4dKzLx`>^b4LLugb9na7EGo3 zj4ePIs=(q?A0-#{J++YBsEqI>Z`eGgg2~bM4_x*?RJ)aaNPh89c9u*^4!j+UO;Cmt zyMC|^83`MvAC^Gj7f#l+?X(g=ZohL8hqY%mNsI#5EPW1|HC?u6c_;Fn3h za}%5LX~pH)*I!k|NN?=UwGM9i*2U;%ge(~0#sPr*K7P7#*-kTPcjFg**l}akP{%Gk zv=O+AdI`^(UP0>dDYDy{=u+9NPX(=JAZM)fPRk|=+P4wz*C75WjQ*uic04F$#dLu~ zV$A0{a?jT$(DurY?>)_B?d@erywt;H>fc+q$#V822BBQ>7oMue_dhB?juJjdnp`W#P;p1vDI{XLXJmk;n=5Y{_84(-_YF2;Ae7QDr5f9Z-)p)x| zPO5H2l0Z?A!f?d4z6t5$V+QX`AQvUH6gBxwcC(&GU?E_96ZoK_rP#Snjey%2!15(^ zF=KU}U^_A^#1Ld&wL=XwgR$QmdRTdyTT(sy1@IT9A6Uh*+|T})5*1(bBl|HYWKyAj z4(BrDTs#$T4k15%B=E%8579yr- zgekjWNg2-v&6LAE$mw@doZH40Q8hy6Tr29PmYpoeR##Ux76LT>oI?+0E$Nw8R#zYC zS}3T&YV;{Ju~l!wt(HorI*h^}vTG?eVb)a&wj-aJot@|*ozdK|z&&uhR`x*(SFpDi z_$QtE3a>`~dUP{Jh?@VyT_I)N1)@HmUDuj>3pM&z$Akch0A>v0N>vxgE?+F~A`jU# z%DK-N<-jRpArR8#QsZm8S^6kH?H4i>vcX{0T6ygOJ=j*UZ}f9D*th96v}vmp%7=O( zC|ZbZ!hPUwT$MTIw+pKjhXAb~9&bDyZiQwM$$jymO{QB*cGKjw5`lbe-s*t5i58yR zKS|CSynn&YO4#U{BBb7<6MsdCknHVa0AfPO#WIuvdLh4kn$x$QB5d~BrVZsFw;!b$ zsllc#_r?!8w_or6`1pmeM{)6=je@QSzbrz@59WD_6G>WWXX zQ3H^~(#GHbiKfp#F1Nv>3z%ycY!6MOeTvRV4Z(bU=pkb894gK%Z&-1lavwCPFEc>b zaG2?M?rz8|rAz61tCyqd1T+!_o3dS?Ki;E>tggzu7n^iKtPxB)M;?z@T(pd))4I!K z!~0LX@89l)ESYeZxr`bZsAxjq_uO*17<7*d@9Ng(dJHo&z83cx+t>U4`_G(3ivUy+ zj|?@Gt3<)~tWk7rm(Ux;-|QjprinGLUAXpwd@x*wdIQTeJMTGe+Fd!!*RvL-HH=ZC ziNdO+MQ8>08fnwZVC7x3yH@Y7PN%pb6Dq)O{;WN+aSPr&){%myS|Wf+O2xR zQ9QXbN=@ixt1#LEQU}Gy6F!R+d2kYV(CqV(!V<%z982nnz7jlWC-R}A|4nlPTKN6LqDFoNDpwN97km+#hgvD$yJ+HA9D-rpt}bA)ITM znxE889^M*&NmhY=HAY(cRUtubb86*t`ePQ#rdqcx!U+$X&VJtF1O@Vg<_#v$aMuBJ^m z&p%paQtot<&vD99JIus#8@*5f4$tGPM3%C6MmoQpE74!bBxvulBVtk79x;yA)bt5d z-dtQ*-e z>8y2Jy(@1@tfO=EWJ%JZ-_t1K@J3;TJ&&$yNQh1I|HV!JI8E?yVZ==&)G|l`Ll}#S zfTI<0KwL`E8 z-`&}{mH3dyr)!tVl3nD1jDKV8e>J`DO*}-Q?c{)7?ndHorOzSPA=%uSDKIwF2x~kt zpn%rN7Dwy$re)#E&$;t9#x<)KVWmLFsqR-Ztdgyg0EwidqELxpi zwm~R=VHIDuFt~mUgFm~b39n&jR5e$i^csyo6hBqAJ^Zev79j#pw{?L!a;%@eIYi9> z1p4Ht7>o;Olz6lK&v4#f>I2$s7Q8f&bDL$GVVm$@da+26m6K;#vWzNK%YfL5zE2lX zW#$)36H#Szt1%PDk%p9V;VEk^#u@P4A~=z5xrj`;19WU}W>kBBpOe2MMqS5#d~@vi zHNzu%%bZ3Ap5F6h%!u`+1;8iFOkVv7(zvF(f`qdF2QX2_g3x$A1`vh+NyYyObV$%D zj_5C^de31Hmiw&;b%tAPxthX3SYqCOnTqBcyMq;d37+lJz z_4@Xmkq+?q;m6~x0RzmqlzWNJ)&AIz$1O2H&HqAaPHiD-ewWK%(#;bgkpc43QzDEn z=sRaoi3pgyw6>f~Wc#Xx%ZMwTkPbbLN4n?TvZ_9N_C50;BhOwr3OO_ zC*0ChZQ-|B9arjnTTSTS>61U9^6z&F$HVtOAOLx?q2r(b=ex6|r^0a>F>a{NDnBzmN9im4o;u-iOKY z-oMb(niy$Tc_~lDHZ$?yvd^y@ixTRtGXu7)=D(sgr2q3jcM14vs5>vc{7cGIvbShc z%5JqmkE>3sIdS6YHD03q6Erj+2_Mx5#<7A30q-Qxp?ae zvH#mm2t%((LFo?9XyX)bjOMUjxZP9D9Wx?g?qgxj9Alfi{QdARaQ{5`R$`%QuU=x+ zD?f)!tJ%RR^rOv+?_78tWRv`VEr9W zSV6HGy-$T2^1zeV5E;iF=A0Zd_t7>up<(B@f9>f1Gwo?)Ul20yV?ZDKxaJX|27TvY zvFzn~#EXho*3r_^Ql>^(zqC@{Q=hn$!rjIYdH{%LL{K@%c@Yp_`$=-Tf|$#Q#}oKH zpz1wHUHz&ENJ?qCe-qj4_uxD>HfHwJ`hfJS&GY5^ndp@6|Nl5F{l7NFbbZ#gkx!3G zKS_*PT=+DirqCD}|2r5pxLq&2R5ljfcM<_UpevN?xbnbA(n}{LJIyp7snCZEfSl$V zsFO05riV3M!R5Oja6P{4O3J)F>8bEsLhRA8PqpWA)ssX1r$P7SEp%3hB~9oP zJF}GWQpA8iO9*h?9oVGO1@@I@sjn0hwD(5nz?x=~i+wO+8 z*$sN=blgalGoqUohSx+dnC!Qa%(_ZFma{2?6PkBK9{|ly^i*;idOsP9>6CF!zz3#T z`*|fQY7{GFQaZnxR=2dyVz*r-kp3Dq7}b}TBFtl{^=SJpt7h5lWTvmY&D%o5M zcm3D(4wW7A*m`ETDeU0j;D~mOR^6A*4$_~zuE%tIAs+vlJiJ)!48oB z(H7QLP0xTRm5wcvz=oUdZ|aTe+a&ijG*<{e!IhSbP(8^XDj=d@-&L!tV_L^{bwRX~ z{k?aZ=)JXNR`DYp0ysBfP#C|=z;yva8SXX>c9Aemh*PyEVWC8k-7opx*fgo)MlJyp z&>z+!q)#CmpKb@a4X~^i2uQ%yI5%+y(~k8r1AE{?@RJ@j=k(9fd5Y@=x+8_@KHhz2 zej=QVGc9}@OOpEoawi=V(=WEA%y@fQYzrc8leMQ=HT>n7cvxi0YHC|M53Ce4kC~1vhi{ylpOwYZ335Ao!kHJSXGd?2Gu^@xR2rAsN*l+M%bxd+te zu#ueCv8t$Qe6+R&H?^m#r{=!i;u>tV+~!PRNV);$i1E>8d>$X;2aKcw1N^fPr40-W zFzQX4QHVaU#I+FKJKRmK&X)IDzfE9By_)gjv{|(!Bo;gsZq`_R=DQ}Kabslt{?hkW7doedP(tkQ>%3{!x98qz)yy$TdC6bcED>+ju z@87S^luL~U1#QJm*aZ&fp49C9yxSlZyU3YeDEY2I%g)R@Wzjn$p)zJotH^d^gy)$O z5bm4NKz^BF({#VFfOpLRDt1D&#>6~gXh?xxB#xut<>uRL!U!1A)*gTO9+ci?~@?yPBiL%k8o?r zfRUuMU94qhWOTXTa#*5>Ega+aId){bN%*nF%Vj+us0bbW`-~T8Ectuk;^eZB-NW$k za5rh(`mk6#5*0V8yxX3}MpVs)KdPvNgog8Y+;$X{y{MU^v;L=)t4!wGeb``?O?}GX zg4M?GbP)MLjcxnJY{yJ6qWOmXxeb_P>fxq`f zHbMf_6u958huDmoZ3UNxGw-X2YuWpNGK!kirG|WtsR-|Sb@({RyU6cDghh&4 zC72bmw^S+J;{QkQl}_qa6*cw8V{gijdSTL$qr+?<)xe>h&-i8DuP5C_o!*ADHQ)w= z-RpKmBXMpMHX_NL2qmZk87yomlmWF}lcMbW(j+Yc#mHS3^N5Cf5+)4FjIC9B2{XU0 zp(9)#$@fd4JhMZ1L$w?t>ml6PIbG&(XZn*ZT{#FE`&J0;Y-K0uiUAt5jCcd=HNh6KFdd8yv8|Gh|BQ?q{dcMhFLa8BsNWNfr zeplK$Xyp1ui)7*Tz?d1kHj|aGz<-$lok&)5KwxFct(b|h>}cyJhjJT!Wl;-2crY=% z+Ynop#evM|OyVroPFB(U{(vDZNGWn~mjh|t-J@nZwX%k6x>>_)wi$$>16tg^6V)j5M zLF*Qbw~a1*+oCquEcgUBlE(Uhmo)|`Q}{)4SCF~|@! zq`ZZXjb6wP$u?^)Z(37N*M8EDt`-bo%qe_X0;n;B^^-$iBnbVc34&K;Ep5?X&};vz zy43<+X}A`()d8}%;J_t_`qJ=HmvkAZGNWG~#$D*H(42Zpx<#tdr|8y=GQfj)(PG_F zQDhwu!NQRIP%K(~_g<>oiBH6Dpg~zYJH%1_L_HqU&9!oi_{F)>ICnY@Qz7)q@R?$o zDe+ZH;2kIY{Z{7RLS7jIS};hTJyR)lzDVH$MjrqWG#s>4d+Aw&q7UK42*_@%zLQqSPo29 zmOHJB-H%n*{?JfSPT9EDg$otD3uxraEaM~g0)zFU?ItnaD)8xS6Wu0#C_4Lw@w!<( zemamdY4}Rj@83#JSREcG1iF=hqY?MCm3Zzq7ZvyZNFzqiiAX2evqkU`n}J2}{GA6` zzH6@~jbvnuEch$*&{Vd?KqIh?l9*C0T3y-i{rt`z*`$!nmu!e>uwBa#ANSQt!wz~l zIQH*LEK@t+NW*w}dE5?{Tuw&Y`xH`g@}DHHZF^rTMj(1?4lp-b{HG0`pHFPlHe$Dq z{iK?m4?1;o{*`J$eJ%K!!$g5VCo-i9cJ4RcN~PQQEc!mcWLXW;me2`*4d~g9i7I`UP^KAcpmr-a~B652GVwOl7K2ADRZJaIxTwVGT6 zk3^RLEdd0R`J!F(%JztCixf2mc_pTdsE8#G6#U$`0^EeC1lkQPscNSDe2Y}mu1=+# zvVdA_OXAAA8#R`QjPT-dYpP<|=;XV{#SiKj)X-z2%;N5p{hf#CgR@EyjWDjw`dFuY z@6UG{|79O8{$ICZ)d}YnMr@2$qhn3v1#eO%xCdFX) zQ9~pO$u|8Dac;k0V`Bj{bZXpFq2>Kisp0zF!3X~-+o1ZUkazSrz-^Js zw~4u@mlamfecBG)c?3na5FamAR~tCoQTYh{y};+FG(5jVGNO(D+iVVz;*k@+ibt{V zI6jE{v_$jUASCF^muScIf3sOgoqvPSfM3juJr^Vud`C`6`6MoUU%93RxRTTG>Id_A zq$NF3fYK@o@}u$IewI=w)DSt!AJtH%0MWUquiW;6p67oz;(|#F_e%QQM#7VfO5MIS zG-2+G2fW{r=1^1Dnq1nAkH1}2FOy#*TI`c`iV9EoB$of(3tIG>pO?26;@h{;6HH8; zfk=bH!(N9^s7HlLM3hui5Ui}R-rD>4a==Q1iSz>+tnJF}K}UuzS=UdcH4hy57A43o?)hXcu|BcpB9*wIX8T^8_{OOxM*< zcOWl4g9&NR^p%erX*|+jn$C*EGqk;gexHnD@22gS+7*?z%n8A?<)n|WXN6R?+FZ$y z*-cdGQvuI2pr5dJ4|h3*N{Pruy-N2M%dj;{1U&o?p<@$C0#6s3`Xl;3jB)WTSawzr3>aH8wHn^mXox*#_fPxn8~8yPWLaEfH@gzC}d5cRq^BNazh*o8LS>@_V@c zF@;^WKp^CXYr`|rAoEY&+2JVz!82~oP4ZL8{)lfvsw(kU0|KOBhGOj=Of47=oijfq zd<@#8rm^C54V$fvRtUp8w%)%NdzPbRA|{TZqeW=A>5){(zE#CmiSwDXM>O0~f;(;{ za!o4Vh6RHldD1?X)#=dUWq~6j{b9ZF39a5aX82Bo{@)0davU%9nh)OR4!bgPc zI{pVOp;LH;94{7P)old(#UX)ntSm`BkGOUQz3a1~SZij>rffAs*$bq2baXSy7Cvmh zV_`Zl384sUW%s;nmml>Vqrzhho3{V_CW^|2bFL{jI5E|+=uy5iRu(|5T1?aHa# z&LX%sDoO7a=Ct1S(Tkn6Cw5KE2}J-qH_FY{P+Z6D*Oyxi-vLfMIJZF#f6?_-Pn538 z%jeeSSj)%B@XXnwU?2Imd$%|x_#<3l@j|C7tW?1Ts9GfiD$r-?Md{qfpe+S{j zNFl4j=O#V6Zo$l=fL!{fINI@u*N4Zs|A5XI5g2ArH?b^()M9^Fq!3mD^lNIu=z=P4 zWdWYTHS1qi?fmmau6LBxUoKp!EO}r80wg3t5D{@%1Cm%n52lB%sefZaYW`hgs&biz zxppr%P*RyYCa_b$yl-3(QLMmSJBv9~bx68nt*uWXdO3|POLq1~#c_?ygPQ7MhJ6E| z){p#Jaya?B7aMO-N5~v9qxxgr0;)08QQi`4U~arr_|k!wl2!l#79mYG$dWd=E61sk zzi5dtBWed+^#>-WFtw3UIO2CoD29B>rG@4tQ-J-CpSKAGx}TKZ#*U6{692~j9oHa1 z&f)a_={GOg8wiVSTr3%hUsyZYMWQ*`!IL}0blWVetT>NJ`)ix8UT&Ymjs1-1R6=;Z z8N`hKBnk0UYq**D)tli^-1!Q%*AD#1$HgnF%nh9F6Bo`bFLA4Nv>!Q1i-|U{#5eE( z=~^^dp<6F-TS$j6h4d(6*oa4NTMK`+jmQ5X>m390>X!H6*tVU5bImm~+1wZQ4N+B*37INZItIdD>?4ju zk)euqW>9H)k0RADFh$v}MdzG9qosKB947yz$4bM%0VO)ah9s**{{+w-vJhkjN7^C(5tBY#s|0pb2iZ3#RK<=O+0?!lU$&>*RQ}^>5K=J@XheO^7!H=5G}GB(pxDLOj&Gy*uvHSx`Ls9Rue=Gq zTAs{i?L~gb`_CfgNr8~>VjgyI)4%ZD1!G`eeh`%t5&a7l;8qI%>?`GFRBEI>dI2Y; zLD{SVOryP|gBfAv?4FhLAEBy~Zs#(5`<2h6qJm>fuFw!OoQfS$p&W5={JjzlKbQ2M z>sHC~F9BE@;;rKR`))TdWK(-0?TnBhsS1rr$9)++%kX%&FyI+uk#;#R`~lTN1ojh zz%^Sb!{U-t_St)Z8rApz;&a#NFw^lAPz==cyx7_AduP&5!(%#QJi0PKvY5ZIh;k== z#wtLm&PCv2_#tOndFcCPv!?vep*V#qdMcD#@CZEeA1N2 zm7(8f6aP3Fo91A}VsqOT)y(l#q~= z%VD>F%k%ggL=J&q_?GTWIKEWu(Dzg+D=lEM#S~8))JkG3VwjS*6ic5y*t}XwCC;dIb z2hh{5u-$owV>df8t0t8~=w9TVfs5-|O60lT$Ud|COcjkcWzeml-=@8?EZv!^$z+HT zA#SmcrSj$~^9R%Z%QHYTB{S^{ax@%;txf3lzt}?jN%((3eNZwIiN9X7;dfb5Jlxq@ z4}=!p6qf))^7HcxP6zUtoI>9FJ4Z>wAFB<Wk$4xF8KVW=n##@Hr)pPaO`=>4Xqr(a*ze!CyJQuge6xIa1gJ#E)^=e`e;iry-o^L$cpQr&Jmn^^eV zsU@pnF%*NpD3`-xbJGvt+!q6!g@BL>10NgG6HY!eznW|9(8rpેH@kB6;)ky` znG!eY&#~xIHNa5GD=3ySfUnD^)8Z$An>qA#^^3XZ#BI}}hO|_HB|VP%nnOu>DfI+m zL@bAs`oi9zG;nmRmU2Z$X&xgJN8VfodR)=->fsT5I1a~EP$E7lGXel+9j&Uz1?N*f z4Wk3Zsh!z9XW9dnwFhujj;*B3k>RuYeEz<_7t&%tPxsC?m`svmT&CZ;eQtkE#=YLb zhW3RvQhbZ!b2%Ph`|zG!76(#ovp6dvq9eUO>KRy9sQZSOgG#@nkU+qIif%_r2pga5 z(>x5`f45tY4pf>|LI7xBSk9HB-$u+@8^B{j>m?~U1wG;5@76hJVjURA5p@Nsn}-q- zo@M*@7JM1^Dm|c!ypgAn%*w)}udI+FJviJxbzZph09)pDTj(VgRQB|Yqm8#_`6JYS zWUEO6RuKN!e&LbDwUM9Xery;KkZbfd6xF2H4seOO@p0%9w3+Jo zT&s$3AKG!7da@}0jo_vCz;JD41@|^jQZ(S7Z!t>3=lTD>W?M$s2m`f%DBHjjiQ#Z@anWPbZ~Dcd`zZ^WQ|!I8 zg8Jjv8bfvWOF}QOuatoAu>8_=M)USYTz5@v9tcP-rwJk_f@#d+?rkS&o$EZx05X9WGcBw-NtC*2aYLy zvJtZ(Tz8(Qso0Y{0u9-`so%VRFBfy@P49plib(9-vg|Ni`SG1`gvTWNB2tUV`c~j3 z4CT&s1yt5$#rGp6cCjEz62rqRa${vSkA4(6A~KW>M+KnxVWjGP_bV8*Jf#qkgLWXA zk9J*;zhjcY8?CC5-6q}+y=QHVaC=6nTthRpv9XbtyS>f(SqCPY8~({sN-C_aY<*$8 zxil|Zu`DLJ`OFO(drBInhw${2u%*)Bwo}x~A}cF%8BSL>b0KB#j)V48^q2jk51xir zd0B<3dLw|7i>KAQ#p^|OQ!^3Ls9OP!D?ypbK;x6nes`s*E8P9<+mAhI?ofjLrLUE2z@98Q0!R78r zZEX_MmMgMQNP?rUgRupxgSP*i0B4i4KQ*3THA=Q6@+mdbyumsw8+PGvj+M=Vd3FjP z_oSfCpc4X}m*Ow8@$XRx zK*2$UU<8=VPfor)%X4+Vt(My?>c7nTT&#a=e~6fo_IjUq7z#N~>zB;lR)2KRW>1bz z;R&0lj&8e3|7BqRvIVy>AQbubO$O?j&ifV)dsg-Udr%d$ut0@hCWgt;VTtTLEc2tQ zg-sHa**}}bFqK(dv~@kGI|oFJfA8Blq_@>ICO5k^)WjMVbv5xnLg{9xebZXgn}q5( zWTm)?EfbSB70?o*CSx$yFnUuzOp4clnU&OhWI2>pwC8+~Y(u+`2kC5(*i=_X)R8k3l0_>naXk z6E<>HV^9lnm3on&<8syopx$!+k7WXG2g_gEfibh`vUPzqopFEI-|b*)+j19cDAO|~ zt@tvj?~yAlpg{R);HJKkfdOAb-)~n=RO^v@QyS_Ys{{g^HM zIiq!6*errZ7u*jP^6&?bY%m#>Gk`e&E0wjTFuut9DJ%eAqJuyG=ohp74uVqTD{T)t z%h6~t@`47P_6+Z#H2=+9(l>p6Mjg4)sZCTxge<3b3_#!J6PS2^GG-s~&LWmP`pC|a z?BXS_nt$H!S~PQ~F6n3;oiURGrr)X~6&0P}qMcyA;wXVqkf1!fEg|`=GL;nsI!%yY`9uPCUi8dzK|ID3nNGnY9wDMk;1( z4zGieZVxxM0wD+`ZCyUVminWnaMNQY6wlTB@4u_qfrNj!%*_oYm2(313)0~p-oL2GBBd0U; zE@!2tI!|kh?D``qEmNSg#IgFO=zsL?Z%F~wPXz#@hdMyr^LFiHC!F6ab((Blc>F22 zxFq3^vg2?<U$IPKtb-;{2Lj^Y%;RbmzPKkObh)c*fU4X0Q zb!lZ)h^5snhJwpYgbsU5O~z#s2icRgpS;`Sz|nfKLqVQG3?n0v;In;Eb&W!yex4ah zgVEmmuUTKSLtRwu9H)0Pmn8R<9dNxGPwLfeJ52lRXCG|8kx&1}dXhkVg$|?(#UUhO zx5oNoRE+>VFyie;GH=o{6t#F#tnlTI5)%Q?#j$7*@u59qs~Vr`85v5%-8@6HG$ov} z8)FD})_Yf0c(^~mGI?tiS2cM!*BvE*PFWvn`$ew3BS?-K51zK z%m2&~85&I<%8IV()vqb0wZk*9*Q!zQ7h*n58GyMX4<3>_L}zkd^gIxgI{W@yF9es& zt*;mBW+J=2QJE$WE6r+VBrsSQbR&bOy3UAv-xg*=Qxy69h34eR8wyL^!VY{){r0r~ zt5E(%WrZEWb9#%YS`0MZ7-f|$fLf`_YIZT=*gF~1?03XKMHeZmFC#_`SS5nWLMd12 z7-1$yjQm|=q`iAebCL+~9wU$Ki4AHy*l{BkChx-0`8Rq1y6X`rBqq0LptAk{`D(EM zko==KtP2zHJgknoT33%vEO+iMzE~o?&8CXD`gv@W?|>N9Om{oZ^w-sBY=sX{DCZP~ z8=V&JOT0z+YNW-s-Bl`?`(^Ew_EqnE0#$D}Q7==}si_-X)E$BdxuS`W@&>M@ubX%$ z91murn}j?$^+RHzeDn-vbYh&fV)tzVFZCB}Tg|l%oqm1$JY52N9^yH(4ohlusGa9W z*z;P3x&XrhQH@E^YTRgJe{ZteL<7)O@%&RzjoXQLyL9u#Iz)a?f(G)b{B1t=AN&gz z#u{Uxs?f@2*01vhy^kYuaPP?v=KVVYAYwm96hz{zE2shZq0H3XniB zMhYjdsYyobr0X)?8dlm@?GIQbmoxTKQ_oJT7$zX7ujLD>y2o=2r4Z}m)ZmfVi2Xo} zam+~1lPPnkge;&vT3+A0wU(K-iWo~88%q4}_WMxSsdob~eA)k|37jw!iY=1ItMdSn zZTr~=J>}$NV#0mjm%}|m+1!a}SpZvcD<~Qsg*Trh5rTLQ`AuxtlJa{DUk97_GgwaU zW$J!WGX5)R)DgL@r zRHwN0T!|GxDfN2Dw`|15FXGi{yG5p@wKr+~#f{pk+8P5TDg^mfiH$LKpA9~pApN3} znP6K>#uOcn{Hb_%{3T>aGX=Zd>nYDc*GAUdniQ$BqC$O4r3t%4Fd?1eq^~ug=E|6!FIq42&Y_nTsCso>E_K1GZLsrgy7r&G7nhVz$UL!?M1`l1xdoKs+_p zhllXVQX->&-+KC;={+L3%q71&N9-~`ppj0@-g|%G4Yy3(eQZ$$AUJ0Ud-~*0=W$?v z#5@#*xVTUcOv;(FQdGfwe#toR9R#rU z$Kqb+p{ugIe<~2_58&o`>1zdg3VmNS*qIne?@m$qox;PSijiLx&!4&!^h2HYt6L+? zX(ZrF)c5-h622wla=KrebFIhB_*~Ji{5L!X{Npp!kQyOHh`5Q#%4P*tX!SS2WQPAy z{g!zct#Nw2v&LtRH)uhKq)6|*t@(#m1f9qe=W+a~HC`Q5`HKS_{*n27hOaZ5*pZOE28Vvm?#q?c6(LTD6+p&ro>T1PwK$x5S z_~x{M`hw#G5wx*qkMvatE{CuB2SEY3f1nlUzn_?f2YSa;K&cx4fA51dDlq?8Qct7> zz-9%59f=KL*{q})0gMFIgx)DWUc^d4@$>`yEMBm0O`F(|46?B!#fn;s&t2MzI5&S> zc=tTr>C&TEOO5}e?9_i{`Hv{$NrY=<#lXlB{{oBt{ZCT_(D-yx_s zRQ`Kq0_*5rfYdnU|6J2Uf?z*z2w#@s-T(Dc{`#i?AJmL-_2tedvkFf<1Ge}o#LD$( zs2v#QN*RRFQ!2S=7MqpZ>G1Dl3Tjvg5TX?e(7(t<-S-puNPt#S9UGi^Q9td8U5w4gUXg zYPVU%fX^5|4f^T+=jnkg0Ri=WdrTjmrHzey`8IBD4;>}QJSb`T^Pp&?%pefqID{Zp z^PzvVjsyZK6hw6VfL@2UgtUY$Eif0@PB2(ZST=ffgr1&Z0-6iy?mu>0k^_wO`3L^O zQW%!hKSF2TM^)0&m2<8?J7nk6S>)aamPh}MK?R_+u%gVM72I?F!0%+O;yg?I?;HQK zR@va5Ikt}TaL3sOH%~yKyR}8GGBAw)$5##{l?{ zjkW9!R%aunHc!<0Z=Z`+w@q&GKiF6NzSYP0xA&$B03_~ooxdPtx0&D*XYHWwSWPx{ z3v|2N_-|msL)v`(2(NMCsw-%CJhBFFbO0HKsB9`xfHSGM9gY zDLCpdRuQvJ_pzx>vC56~ItYKl7Ul++<&ncAdn?q!**|*#S|6ACIDN}LK}u^&zooz1 z?Wn83;BFTcJ`c`fPewZ3a?FYjt^f$MM%telW#036`YQsq;&4 zlIF(suzR$hh<;0bTs_IbGm9#0&8TmL%vR7ygQY@0H|rD}ajK2$%<23Li?58CLK>iH zK)NvX^Bc!1Sgya|sd-zMbnfhQmB2XwhhnBz##x@3XcNklu?ylNB)fGKj|W1|dpvgi z+REb3x!F!6C#h#gcIT>aZ{2m7gZOitdmKr(jraz--v>NzcE8ALo35zi{B(50;*2nMowXOp$eAjAhw?5V=~n+Mq!oM(k-Ett z4Z5}qz^(jjkom>vH$uhIkP;QZr#vmG3~EvTr%h!0+0r=JMkv5Qa7szQvqEj>6Hm0p zGQkGQ5MJ~C0^of|81+>1;Kd%n?Q0;OJ$jRw#vSxcTq=a##@z+-Pq;AO>{wm$MBEo{ z@x|XCS-bvXCH2MM?}pZ1F}oaFC|1KJ|5 zH>O?*2U)q5q5X0C?2(~0ipuSf{23S>)VeUi|jDs!9bo3JVCwu%6+ z9vYj+N~{%1=5c;cJvUZoKS7*$u-F?(09%RZh>b_WC0WUnFj=>{hSl0PO;27At?i3@ z{fRRRNOa%IkY?VPeRE!Cb@L!9HT3wLKXA3)V$CrIW{}qf?B8D zWVuulAX>!$b)mi5F0L@X?%JNXxViOBmaCJA$fElKe9>NMAp7_pvkKXL9pyAcMS0yt z*We6XO7@E`u%SADaPPX$me~E?(OS&LhidL19}>thvm7^6Ed5GYSmR}xU>IG_KnxA# z_Id)mLqLRCVCLeetw@7_y zF!t1Of|~kwl7{N^L*Nv`GJd{0j1zfcoz#`kHz7 zc{(s^{_t%D^FZ-^*{MN^cLpdXOz*^q*@UYG)Zwo7K3PqF*JQj4hEn4aq=@Opy8vrL z8Iy;(ZNZNoo>mLM3?;2=$YDZ6@k{SyT(-_HKg;~?MX5jgoc}Y`#wdfT!EF#x2kmA^ z=|FS;N!X4G7csPEQ}56tC8ysZ7K4owf2=o019I)iE5AU`!pScD1_6NlG?wEWh3DFE ztqcFk8GAo@-?u!0X6!`v;5 zHVP$_Z|zhcf9KPHO??7@XLE3F>U!}_;ICPX1Ag%trJ&`rW62NWh#YVbU)M-z_*X6`IA{Df7!(%X=W5i-|0gQ_ zb6o~1hk;my^O5UQjDtPFc-vbV6YkVe76TlqBk-!Yb_=#_m>I}ej@JPO%Uiw2mu*U> z@FV3mtp#*kCccIHIag!D#a_#QL=ML$CKpc_*NGwgA2nWi~j zL9>~Jpg>$YoI zBac`AA#L;DY)(4PAJKI*=1B@5f?a&ZFlgcdID;#0BC#VT32O5BaHdO+r;X?=y!TbO zmFfTM%K{)^0#T(vz-qUK*$3O!BIrc$x|*?{NR3|S)$|<3$RAnUOp=ek%^rk?y|+bcW*s?$nx$7=py3L&SH-z%#zV< zD_ZATgcH^xu4YH5{z9{7%~CS4DO@JTAL%Qyh=|bqA|rVCNz?WdJuz4szOYEtz7Qtt zJ-yEk8xQ#V-lHP(*NCE3u^v;w!!m*wJI@aI#oHs~4B+T7o7iWOYI%uABw(R4IDAiZ z@z-S93$MjVg`4gg2F|#w(#(o1D=Q(WSUb17&;)DAFTO|>Gk?p__L%eJ$x%GfMXMLhhsN%_XkmWGPH@S7yhp#^||W4 zS@3n+wl-WEZro`|juZ5`&iEFW0Mok_M7TyDWNc!6VyLmvTyiaCH91yKxR{bduzXx7 zErr8JqO3CXoS;z9xPF%14Ox8MV!tfNGore7GIyL-J`q6Pb^S}^al2cQycUj1Zk_7L z7dXGY(Q8TN3!bgD_h*#i&cVBQ5b{N$##YkOV1f(LMg{vd{hQBxP`7TmXG-z3Rdq+T zbLK5YC<=Y(?*W-i!ds6L;&FPYmO!$=n2U$W@AgHA8*%8|O$4-pl3CZeP0^-Lhwn{Q z2s`y8l+*xQ3ehv*1?v$(T1GOhc337&I`~77Zj5*8I?;hsVP6J{YY&BnNl0r)=q`)C z#^=+N53r@5VcQnl4o05BqVyB*(FuL+RX*p>ulBmQ6m|I>@SCDS6$m;l9MC^F9SDfP zxn(~EE#DmB8f@(^IuBMIf>ctU!-X@f4?*P_#=cQ~DldQTh-_vPOJ3ZGnZ%RDUyH{<+_^jiM8IrM1-q0?I?htr&5h8;%i(mnbr!}Ll_c^RS9X{{+bTp9@aNQM7 z^A+Hwxv8=UldyjR|H^6~$?s>k3LV;SB6_rDr)E^MgAM+;IG!PqPU+vBQzAm!oPer)9{UCy-Xmi z-ca7B6aj{70r+hmjqBZ176cJWs2AN&p0L$IP^CrE#InHrtZ}4_ z%T~gUZQ;NdTKj`4ES>fmt);?`caByQ+holn&we@=63T{SteBrb?<9@R@#6 zv#E|Ws}AlpA5o7tM(Xxou%O&a3OfRqtG-)JQ&YuLDW;5@s39*OjB0*)>S@#gd$3sJ}w75KV1z=G+9T#I z=ftOgExr9>$t$c{*{^N59BBhs5e%$x+>p|2Hkk?139TZxR9C}!KQ295T$qSMkWZul zDD@(~XN?p+iyf;zZ3Wv;+o*8({HTO+Fg6f_!APb&M!+z9zOjj%2jn3nu;y(KG}be7 zl2Z(UHRwt?LC+P%&af48dN^_hoCFQhu zCtrMnhhwVlX21OL@6u@Izz_gpAP9KaF#2t0TFS2C&&mqXqH9rDs{5FfN#Ov1Q!Hco zC+KgrznEKBZf& zZyE)YpOy4#U#3MBSL=Pn=VY3=&;Df`=7XRo7Rk6%iAPX{=qe5cz8N0X{^ZF7+Vbch zppp`<99$DOD5?5!M-b(MA7!J!>(;X}i9TR;yh6@OXG10_)h_|4s8&zeH?K?4S{n-{ zGl8lvYg$|!`x#VLw^MR-Lr;(3JBT~69ehzvPg6qAP{GL5RMX)40E>{tjQQ0}%QlaM zytK0u@hmm9F1|#|<*k}CQSiUal)r;tM=#O9z_A(g8eVkX-{hJDdZM~nC2dksU6avfstV_S5uX2-@vXb>R^FwNwylAQRdND zlNgZ?6Xqg=_0V_Ow{-m*)KGd+@P#OOpRa8BUB#}0AWpWj{Ycq8gV~a-)5NIXVPNhd z*}|ymxrx~=lWPBfXaTQ|-Sk*)Y(Xx;YvoQ;UM`xzr=ZXk=GA9}-=h+@ENE3hWF`N2uxe~^!V5(?&DLF!KZy4V8%4sZjw&Bki5{DjB5 zxqB;~dqYaaR@l1x`(}1eGZYU(-&ye{=wdmgUrLX%$=HIdP6$OkPf4KDTtBva4W&mZ zVz_;6BdKmZrmdRn^7E4xA;4hOk z(+Dd#`W{m7C*GWN8O*0x&~(+My7HQ09aPq5yVKNMvesQ-psV2>&a;J@x9z3|Q1XzT zZzM%5lwQv3n(Ur>P_sAQ2s^%;k`Aric0GLDG}vwS)J0+670H?O~?GJ-tRNsg$lR`ljX+qQl2vG>=QJkaJa8f~hA z$vmkXmx`eHF>*(vjYABF3&qVXef^k5ldU*>bX_G{;o&EZ%%byiCX!aRqu^+$dZ<0U zi^;TqvB~|Ct4TT_NDs-QX|&AF|52Rg8Ye)iYi!9sp<3Wz-KiX8pk(AbfRsdkBVRV$ z+LpILtoEf?we6-};LMYni+n&nL-WU=(}psBBqGz6mBW^FTLS%lbq#M z^oT%az(`D(q+(#*&wRRFe)3;Grm4q?bQ80b)s2+!jm(V5eCLUjtu54EU^4fn$!zIzy$EJ=tCkigLp|YS`{Pq9 z8${3C+jm=@lg zc>iecj&^-o%WzJHdiL=6sTiD;&;MM00%MGRoBmEV7R1d0DuaN zc7NwKDjRXWV-iZW&wPN$;P56bjuY$zMlUypD$csB;k%AG)-Q5P!m>`CR~GIkl;wO$?6vTz-I@2K|mu!5PNRV#)yjV%DixJL0-`HcNWBdMu_ zL)|T%lM57Yv0VXRDxW*6REAgITX?SM?L>5;CaZvmx?*xOrM<9(QP;w_vj?yc8IMmt z(U?=60xX>yN3twQl)=BwTFac6Wav13J9w&0|J^>(r&l~Is9ZQgYPdfxu& z6zjIqp;SQY(G=hneE$ynzW4o5(BR7$F&dQBav7VB#hD0^FJ*Mh z9E-V*Hw_7Eza?q!`}PT!%ZqA>`f2&S1#_0U5wPB4ARKEWK)`ahT~@}Tj18i%{bf*yl+C_|A^z4+iZLs$cn_FOi2S;sc|>xCnZ(Er0J02Y=g zS^I5q#B<8@hw#uvo^_|{QI4(jbUDePXvN57g3m!+i!gqL zsP=me{>}534>ySc4jhM4E#QLb{3$jj=%PL9_|~Sb9@I@@(lt*2EmA;I|~X2|T< zc>Elt}lVbQosz*@9 zZhmF2qd={kifigtT@H$qbcsBY1&44Swb={M*bH2Av*7(MBmZ1y!vvc|#~6J2OWbIC z;82k#2k`AR(X7&X;mYTx+sESlrFSafbRJmPaX}?8y)l(a_zYm*>rRn3uPDsrJkfjl zrJ4G^ZE^xMym4yQW385-{Xj=l{nHD(lxDSFqtb<3U7Lh_FN=nnh`f;mL)}(zaHqEv zU#O7A@!$-3Uo1DVB?C;gDwfuBZo1xC&)hbZ1eb{ZcBf;(hF=(ouA|QE%R4O0w1- zU!MRVJg^yrr&z!vXeM7UJ-{mQe;;g~P;XASd9-8R>#^~c-)GV?I{cyCUsQGr%p&`~! zT*A7D0WMum*NZRB|cI4N;Z3NN7}jEvvlw> z^+Xz07>6OnY(-3C=gBfV-}6zinhH$(qS8!olqIr=oYm6az(jvNxL5CmIx(p=ke2Zp z?-KnK^+I0`wdYqOH5#x(O4ef7osReLUO;)FlgV_GR%h!=z+5~cGK%~Hu(|ax92yF< zPpdVZS9CAMirGeT#d9x89Vz#Upo*0B{HJ=)aGugFY9}1bIjV=C!y5PrU(KSi@o%n&>;yTqV02 z9$Oj~iYRCvRT4(v^Mz<8_oc3Ai=xs7Pt9{Tp~QEw$r*O0NKAL4h9WxWa#LrGm^xDy>`qiN*x|6y zvZZ;gzL+`=H4xElcJh0g0?DbNFw01Pjl6vA2lLXR#F)3PY)gnGRPx zU$yuy+16A@3^?!&3B;YD5XCF4qKAg1^l%i-ma-xx!~g;_6fPj9SZ1H72-bcR;&8gn z(pqXNo?>IV^&|n^`5M1o4lcGl^Z9u%P~+L+`}dwl8P4(3y``Yo5PXY+8z_mPmKP|D zgCBWdXv->BhLVifZjSC5&Cf#>18gHwz!c-d`Q|&Y{^ctSsx-C*B~=a&fyZGnHDG(JuL};CKD|7 zENZZakZ?B9)>F*Hs(0Ungb`^%D2T0v`%i5%ifwVnW{2(%WFmB6uK3h@L%ff=_cxW# zBc!q2$OtYLTMQHa>|r{#m6Tle9wtgz4ybS?eLozJ>zhIRC?Qmb=tMv_q-`EGpW9dv z<`71KFjPCBhi`EgGvTk2x@b^{$S*gYr+yXmK7u<^zw&eZUu)ld+==;TT?*{Eu`_a# z+^$D@FGmh(3$GvZ{JKB`#iNm^-iP*O+T&-IbLn2uco|iGt(F^^Dp+K;>AVn5&kZjL zF>~{fR%sW!eZj-PI^P#8VHas{_S000_c+;jSaAmo&xF%;xZXt8AFj#A#FTzMn2oi{ zOJBBj<2dd(l_StuTOE=k8X@!$l#tLqYH|?FVYVLo7P|V<`y7|BdR>^+d?9PgJFg`C z;}fMY4CoAsMaT&ml-dzF&sUvI1@-UMKLhZ;AKTNttBfdd0Ws2}gsPzZ9d}{rqGK@sHyJ`w`GT)a38X~#Lu-KBE8~ZZ24Cu$ilXmC9{Ou)Q{{ruV*1Hdv+AlNDUr>Z* zar@n}<2t$ycFn9#+(|{x<{Ko-82(A<33ZV6+)t@Xvq=(3wtWQ37kr zK_QgCNV`!@Wvy?qPH+^E7Ou>zHzxp{?1=J5-r@tDs3pyY!91gnbVHB+>>$AO{r)@y zUIOFq(3`OwxZ@VK?pQ6J^3S1aXs?C{S9VNOgYUaurF79l?^6jfV0GFZ)?N!tW>k+a zt#Ir7MoQ$^0}?jWSD%Z0maitdbGx51M_Uk3aJX5#-DcdforN+&)pJ!_DhmPnOT!`u z`)^BRyrj*aV#L51uRAe)QsfJf30nfWBwOSFG+VE{7%8&2!gX#@lMU|*Xjf< zRDcEZt|$e-QX{nzWa4GDpYeb=Mr1j!)nQT;s86fR=V@D(UC2IPA9jQ$JhK6H`H=S; zNknffFRFYQzNQ1!v#k7aPDvIf`Q&TeAcj!pd!+(G+}y1bdTsVb^}$^sMyg~b5KO7akvtu6JNyJH2EL_#k76@1haT00QZy-?Qe2;FD{#)TwT{5Pr5fHYV2T)(e|I zk}vC#`q=5~yPZ$|rJeUqAL_+3#aM+Dt3VTR z)#UCT{A1yEnAi;dkeP{CNb{jfTp;*cpV31?W*P%j&Y%?XX=B}@1y~;!qJt2ykr_+o zHxxs?k~alzyZ?`=a}KVo*&cQ>vF(XHv6D$A#>BR5n zDu0~Xd#6(A?!9{TTF>*ygIr)5O*muLNX!h&!QlcyLo-^>JnO_)I6gr#C<_uS9ffeb zyqWjG1ammZM+IK_BO|US853)ly;(p7ofj)BC5ELjSVP(Q^;tiXI$^}Xpd=X`qgKc& z9Hrp7K$6o{W3CVa6sfK2qp*xcZ{Mhxh6XU&zB*oMqyhvj#;+GLFwlTD9UbqFd)@1b zS&U(2J)vsvMhH$23no)D-tu?X)q%F;3Pj#2rug}3*P87%7*05w}>4JDT9>FvmbO_8I*B{Wo8n8u{G3Yzoce#83m|y z03%~QKXTp!X=~c9f$jKvoJj5*mb==l39`%yqY&Bwlq-e{~n>Q9wx532kHZOf7+c<73uxsg$l z>A$cz+Qhj+k$i%M4?^Wj7qg!UmVomc5fy~&*89KFDxt>omR6GT=6@Vc-wJdRcEJjA zp3!<1H*aSEz>w*c)Yphdab~zYknTRNC#gI^mRy-*tGNgIp!3^#m7Fx(Jyq$iNwz!t z+`{Y!Z}w~9-nrG}$9U0;E&tyXyVt_*1+7i^5Y8Zrn)G0>ySm_bbN%jd$ADyN|F|@C zL31r4G9HW(@e^1u>fJDDk|?F*%xdCkEXCix95p*XSLjX}%SCd|st9H~ZOYWK+zMqK_$vj5%S7 zyFMVTdV%9$gf4aKyr&NgfRTXWu*8(Nv&7~8=1Lg$RoX(q-RYaT&QwLVIpZ0#eK470bwAEhD~T^N=u*Ivfx8ahdub}ecs7b zfU3xwa7>z;gDj;b#J9~J3D2(lI&kv6X&b+o=3$%pyEm;NHMdbsgLloKq7@DSo;YP5Hbe-t3@q!`bJ^+w;R5dK6q2M4?Mu)%Vmd1w(H{lr^FmGfZxFVdpji!0L^Yn!G!7B7P`2Gn2Y+R z>8o2UHig69!Ai*qo>a8O>&6`DJs%A!3?059Cf0xLFYO2s`+a=B3n^8a95JJ6CP_sYD^0uIC4Zt#03zGA9@(Ju`03 zY9vNeeKR5~V6iJM@xWN*#eI8{-zDGy4jyq}o6SPm#|BfzPe-Y>o%<&ZSw9tPId=ch zmYo%mXzOvO7o3pgwR?czkRR<~h}_SHFn;nQV^byNA93UOSC||~vWtiUPU_+)?3eqM zAa8v3qfRhPt7^JXUY*__k#wn3#_$$~_)sf8Gwuuz0CILnwk<6F?w6ERLS9c7E9=sl z4y*lquK-5=pNZ_vy}q3lNI=!S9+jKh+s2;ujUlR45U7gOcW-|7)_7#GvnWBfyy8cl z_&(4m4;XGx@KCfgUi<4g-@6}}r$X3x$m8g(N+0D1gYS8PUAY#6bEyGg7uyjxtTXN) zHXj=)03%qt=}2smZLavhaB3o=M{vghw6l&RHgSP@XQXiOp8BrRcA6W5#L)= z_6aLNYa)Ll;`;f0oxd?NrWJfp$xZig3{0DuNpD$eUxylLVhOY@Qh4gHH>8Q)(jNrpib!Xui`0bgP#l;N zG4CL0VWz;h@y)P@xY)*K6cW`9A>duVMsXw;~%^I&%bZz)yzY7BKZH=K`Uz-hsio=nty zr`H5V5qWOf`mZP(t+@w0_;K{a!b}0MzY}M&qSBH0ge)%~OS<7%yxcCYwCv1gi)XfN zj%UeJ=lhRiOE%kc_F#fzngC})zIhJ%pEW)y#OC^U2Bp`(t9tnzLNTYa@Ypx9?Jnn6 z(1vVUFX%rHtVhDxVi!N30TWm>OSVqVXK`%T$`k25*s?yQwvp$_VyCEJP=<16LQ3)~ zsHg;GTR!fM{Aq68^)McN-7R3NiIi_^$h(22j-DY)L+0L3r&lZ3SQ!O)g|0KXS7%q8 z`v7B-YipYeLq#5We;9K+`PtL1MgsfYB$(mSji%mJ1LfRk3%v+oKvfB`?gbBnyRd4M zXW#{?AYgc?1XK*u4-~cF=3t1ECOj}kAJ(j5qnu5mHkJ(F$)|kEN&K^Hx_K{?k5y@;t<_@%V~(o{Qx$$l4w(24ZnP6$Ly?YQBa<>Uq-Yi z?EAMR`uqo=@G|Jw))J39R{c2`Ro}wi4t-{Y@_x z;W8`6g&H1BHFUs~EOV3-fa(T@7Hxw++h_?1^ID~L}tvVqm@!0$b0u0r8d!(#oMXRs}Li}O>(7Rp@s<+F2R zC>-&ytO4Z|Z~Hs?4sH{(Q&xyK!w5j#dt{~;Obu9qm0er~6Y$0jsfAzvTE3n1oVc$_ zR(*bdlP_eh45ZE!%}r^fpCwycn|J-N@@@rKlDV3Qiff}hBI=*q#x_khcljfcWv9#$ z?;ii9dU=H++Qoi@g+|2LzdSuV<3APPHMu%IKDjvCo<7U?6&Pi0ZJmsXNp$!u9EI>8 zXSgHhWMgg){7};m50MYTGSNPX!75R_2K<)8>x+o=S!AE)%7c)S8W`}_L718b#Q=zs^=T2c&zD=G`cqW{06NJrPBDwBFWLepvNoa2bLv3n-2Z^)BzY%d>EUgXEu=9`Fju z+yVrkenji)Xq@g`1UyA9Lo?ny+5t|o3NiAx7uoT%jH0kQ+G7>zIjS(C+7Z?^-cnY{XW+w=mgQWvVhLg|)ec7}?<(^`kJpA^_^IlJMy^ zN4{6XYQ?m=DRK1bi+gY0l@J)1|9ZRR-EN@b$SIN$b=8!7F>KI{vdaqGa+WLqOnn%^ zGOsy7;vO?KkDY6MUzOtda@fcE{Tr6BROJI7>P=DbFeZgEuh*5jg&%DI5@aw?ec&=K)4 zRaIqLHAgfW+oG#T%nM(7oA|CX&+;D<@^#@&VpD1$`C3~;{g{d>(1Ki-!-Gtz zqJxk7As2?QS`0>t5Zm6*)6{}M*3)(k)E5#h<(9d=_2x8z>m-n8BC@UCM@MSheYoHrL+6K+P@{i2JAz4usa)fKiEJHyk6vyZ=bKzVXB zp1-+z8g1DQG+9q9_lgC_sU*Fxj>hz3E(2Bpe2asVpVprZ@eP2K-Rq<;p0D#c+1faP zgZ<<(E2~Ig2~r2hv5+hwpZ|QganV5TBjUx%z%3&IUn^3Jrs=rOcH!{=M;f!IV*}*g zzDd!ZB}g~YHYt)kKFc9(DzhQ`S#^2&`{|ymzF~vw$0Kp!RG|0Hds_k2BV)(|$L8r? z3BvAR$-9_sw?81L?ooEjI}7LBd1p3hCc!}e>cgC7&k=<%N}LHD*I7|hO)87a)dTB; zWB;z+ST7*VzGNz!6Sh31X&WPv>i6>6WjCSxTBkh-WGfGYZb42`E;q`&zkXVAOdU`K z@B{~sdE_6BB-in@xb_V}%T=~UCxCFZfrXAM?&)Ko3kk3~asWI#qL>`}2$|ON45W>- z-=%d1S?lJ6YyQsLjl~_=05aECfu#vca@Fv(xs5OHZvJ-`<6Vwb)MAWcl6yY|+mi#u zA{uoOWKEL6nc1~f5PrU46Z@2>$W{JIfBCJsbJg(R7h!)NBdIh~F^aF*eS7Sx{Um$o zlpzBPM=AiqS<3eMR?Vxa*xS>`IyZprvMrx?Ir_a_s7Pbg)Qpg7H;}||xb%9fFk+Rw@l9G=Yotw0#p{Vn2+bwD3Hg~GTF>4BVrI5)KOA(Z8;(3*= zGRs%t=o~}lCs@PAIgc&wmu6cMyMU2(!zqwlB>_0SlQ#{^@;-ZKkz$3N8SV9DgANqq z9+QFv^D^@qsOxRFs;#4xe7rGu3W;zjWgP{c$<`*V{6)~UvyFV8fHQ4mNoGSg=T28A zdZL04KcBy0}1NpSsaDnKm89vn)@7W`DYe6J#rV#Z{hfd;!b;7HA0MM2vQL zLICa=d!DVYvI&O47@96Fer3KwxjHtw*q8yT zggnq1`;)RfE}ypuGH*=hKZHQQpZxruA@S1ajIwL(PuuolJV(1sUnVTAte^L~-yG-D z##d&wC|cr|n#|5l{MNlb`xEl$_Y8O_EX5c(mVDw}faw;H2j^>Bo25h!voH6RjJLU_ zIF11i=>P<2%fdDAI1>?4z&04isyBdy&j^zDo09axxQeAyaKGs=lI_>QhT|dKpW0#m z*KONN6G9;&-iW`T#Dm}*u>SB1T_~l9aRu$|up*vvCabfkPrjC}3lA%B$-<(t>unDih0hIC;lFH0nET^}E}$>3 zhCg$rvU$Qm`$z_nUOKIqQt$WU0^-mpf&!!N5TFCU)lul*|_9c_^>&ugrdWk7|rcg%oj!a}-xjgxVb4de*jkOx#! zO{Q})WSE)ht`H14CuDQ>a}(1F;;Bp#{*DdrL`Dswo%Cuac}F#TE9R%m4`f?j9TD+sc6%JH1GX&7SDpZ(p$CHXD3LUA zn8BJ|KkBhHz~|{M)Y&FVV*|z`8M{ZyHj-;TD!>1V;ZQ8ks%*?5dPeDDt69<>pJ^DT z@gi@zTylWE$DV-BoyYiLpnZx_y^;nfE6KePLk3;>bEvc3bE>x!^NhslV;^q zSv+5wVij(g4z%rG+stA1O2#3|RMk}ylbnjHnjjF769fgR!a-4pV$O?1R?0#fAgRON z|~7OqjN! zZbxNz`v&?hC(8I(L4A$*k|GwOUB*-)OsmRz;kPOJV?zLB&1dR|#ff1Mm9o9jTgo%t zFa1HmWh;HF>v>194?z+U(F|GG4QcBnR9p7{ps(x(NUrbmu{fr@?k8GPP@t#yLB8Ck z5}|6M*1_A3vorB4dN~>!TRPoNaa>&Fw-=sdJ%_ibq4y8tdOyB+9y!(}c;vl|jF(^W zIq*NoZU9+GsLu733p+~&MxHcpyY0PSz+-f~zr2wkNym$LNLJz>iFNs{QBTkQM<#C* zLtTH~)7MjE`8?bAv3dP-em%CxE`EUsqD{3dc_DV0`Wni`I{r4aEa+!-)_08H*0UsWchycxTXVvco%ZJhh#Qc zuz*sRpMAp7S6nWAqp=K#b}IpSDody__m$HFk25dePv6p3Yp_pXK(4|j7WFVUT3=|GQR z2Bv972n(2VGAv`?T=vnB6AK;@ui!;din)_P$pxefEik-`1F}&iPR9LGtp5}!1HK7` z{Q(J^!H!Am$-2EC8ev#$zV}M?YXZXmA?iXQR!7d&-Ce;Ot{9#{bsO$gFOHDE@8qN9 zN!jK2(H2#@AL0e~o;XJrtd>4h;YrQFY6DJub8bTl!6l76(eYoo69 z&iBL0^-{Y#bSThYM}+JIO0?N#A?%D~5^n*Z@T5P6xjWoLX@AHh?VI!yu1tslz1?l0&eU%lNN@=($BYE>VL09is0xy6hp?k3W4J(89IC zDWhVHGeCmhAEc^?Q*KKE`

3Wtm9#rlvs0$xOEWzw!Lwn%N1l%j1h{c5P4-(uPv&sJpgQhZ_v}|v;X$QolH^nLXPve&MP|h5 zeF#3BHYz2i9N+oM0rK@Td4JPniima6Yj;IA?g*RKP_ocJy2`T{On3jNjg62M-TZ^a+hyh;Rg3ePf+htd$*7zF%4j@(AkQT z&%vktaYcjs9G^=|leMm0CeAZprFgh-#YRS#w?}fbFN9Nx3JB(akB|MydHT7bH+fLB z>Ka<-iqg)%16Q0HL(2q=@r%bjsp*-TZDHq0B>vdVHsTn-{eR#k#(L=c*W0C{q+z-$@d7|%B~5m`=trO4QD}?md*xR3)~?as?QmrZij%HZ z3IGmuablAD50H4pwcu(($HN1N`@*$-12MEQ`QrHdjie$r$rH% zOE{zz*&3bg4IOEKWDH#%m>EDYrpp?s!?FzV_oTEu@P=3dVy0}ul6wCQ>Y(Md8EQJtnE2St7VXKvj(-j>Z@vG? z>Vw~B1X>TNrp>XTFplt>vZ3Z4Z@yn*CDG^%>M!q45ia#QLqZoq8e#1+UQAmnfK>mC zq3&?3-nic?j2{iA-4Ip=U*h<>4prGLrt}k{fg8Gn7 zCw%JTjw-XJSwyqeUR-88!es_%F$y?6RFoTR*6#bV|r3C{GOpFrzv9UJ3rD`dYw*fo;xlA7$`iO$U5FMRZ;Cb6E z09RkDO=#cZCb0z&rEgZ7YJ0s%sfN&{|1UVJysH9<9{%rGKn`5I_%I`RP$WDeTsDeq zK*>Gcn;m2pRJ&rK#6w2}9dc=UHWLUR3d3pTfkj6=SZD+MZ15!pt({JAa+uxI<58F* z6qnW3hCD6-A`qCHhgSS}!S!w$=iFG|34NEmU$_TE&O~s&Tjt`x_{m56MvaRCf^1wa zU!&qN1J@$xZj4QlBd0X^jVYA-8-&CxDdCr=HKwL;Sv6KOWbMPPb^=zY4hX;bjBe=hWjc88it?4w9;l0N}M_nZaT3s>y9cG zZ39Q^t0B+jl+DHE71q;sr*5xWkNkMUzlTS#ni%fAVgyEV;aLt54R?&rH8Z!2hSygU zdH2og`NFh-!i7Xt8M&?2F;oIZBe~*FenKr(6>6sQmT3`9y zDt*Pz{*U`aPYDhw5*e*Qbd7iW@JtCLt*>&g$(iLh(YPT$dWwH}7%fU72S#Tn1@yy* z%?6oivt}I}t2Y~wLt3s#dJV4U73UGCZ^u=mGn?Vzb?6g`62tvq827{FaM1zCUWU#D zX!?jM*jLNUV{+1a+|x#?2tr3XfXgj~)?6nYTtzuX?S_o=|L#bTW-$Ni?#!Y(c62=l z3!Pvno$zG2EMh65+>UI0R=dK%Mvmgl+-teMfta$WV1+>)_qEF~) zJ+H!!Q3IdZJ3qqWb))(05kvxjQAltRi-2&?EY2j$`5-=I<=;y%;vBnku@i?7Wn-c4 z%F#l@h{``xQL<@eW9M%u#mQ$@do`Fj#_#WFqiQbg&C}K{%tiTbY zV^yXisv#e2Adz3vFKTTs*G_c+t{~;WaJQYEWfqxTNGclQvROPhcxMWb1s-}pj}3Op zz(QpE5$kXA`jmnzYiI@DD#jP3`-Q2g(DCrJS0&j5Evp!{nPBG{&g}^qN!Hjfl}!ZqnDpM&iwI{@a?7 z>d#+Ovs&zgjmAr*9CLgBDk(zz7J1r#W7B^1@rpP<%K&~2;c>NeWscks6Z0o<&TSWK zU^dDXfw|4JXVLB?^Qfx(W){K5&gi#EF@rjsdu1y9pWLHRR>0u6M&wbb6j0dwtpE+Q zN%X<}77Bu`jXEjJDrgEH;9qpo*ce*{-(@1Ot!(z>3ZHqxoq|#Mb>|0F;yxuf;zo8q zUNa$GBOy~GQD$AOj^=am)!<5SEv;;gT_T-8A>ICDb3%_!^&J^ul<`Y_goHRbu|eX0&?*T# zg!&m=%S6X_X>N{4S^9`dvcq^0p}g47XNCcaMbx&=fSf6yp@Z%#;W;BB=dlham2@n) z$U?82uiHR4`sCcY1wqN2sClW_d2EslzmEJ57dk@K>9qL{uMugFsH=<{8FH^ zpHKt!FV=`!EefpRYgzKYv6;#vDBIV)`02T~u_cE%2LHEg5!)nhW+hJcXY{ej${fQB z#rvf)3$J}tK|P7xtC|zuB~P+4Vm)E~*QZP(@g6gIiX}Xa61^o_#rk%Oh6e2f{pc!M zXVYY_nUs^#^2b}~zT45Gv?3Y{0E&_lK66gp3hKP!g7`&F06ad+6S=M53pzclw+ ze<<}YsLwDopV7RVGS1}mG$->rFZ@~mE93|gs^GT|;xPjqqZ~1EN%YBNfM4bM@7#UB z+fUS=I5-)H2Z#L4a7ZwMt4~-uSwZU4@cHmwU;5eZPm2$w*K&$1aAiPJC^^LOpmeH% z?qFKfV(lFX7i#b?$M>GkfDqzd>QOHBGyzZ_xsWdJb{G*7cJmFLI_Ww!1w|<-=|S-1 z%JIncb6RsBdV;_JMX`H9fHb6m0&gf*7`YpG^kg*;0TL(_LH|&4aT3{bm{EB?LySmr-v*E9Pyt+2_1@nQIoUKI;d+m5-`qb}~!=d-kMrt>A zn!yLicQ~0|u;*gRJNe61Pun`xf$hn2z%DTf`;3YIa=%MMoj z)>(Zh0i?K}jsGR&{wUp2)p{HHaeuYRRW1cM5N6mS=t9i-8Poe;fnX9Ue6&sXujtIS z&|boxulDN%q_NX^U7}xKZH7~!GY7ZTuNT3s!6r_2SCdC2Q-MB>rfbC|ls#(JpCkw+ zy<#Kz-16<! zzOGG2ES$1+T8+}R1d74aKG&_b>`fi%q{=5qR|g-Tu8hm|W5Jw0&!2L!0i6HQ-+_`$ zGXpJPtIRoYRpI~G{cuzH1K=u?>$au0yx(l ze-7W|)#y__Pht%hq5Aa;T1A06JI@y^>5F2=Vxk{uo~jGMu%Yvk1Zs8DGO&_zR!}LX zP&zT6hjNyz!zu$(lnSYCCENXKH#Vv~?i$ygb5>}TImlQ-V}6%^j%wbWRzlgs!y#X? zkV7=*vt;psX(Rv`WhU%2h){g8Gyq6 z`RaHD8qnc%HK4qxU{>nhMvW}S&GHLB`)w3F@-Vs9>c9rD(B@0%CvBNb8W3w+)9p-9 zxWZjbL3y#!jWgyeQWY#)va+N#1<}|?7l6HsP8xYW-m+EmWgGK)O{w3=dtb`%j|i<% z{G0V$Qnxhkk5%;ledF@2w%dv0p?8G{&ripkx_MCj&5RLcK;08>p~Jwhf9Z5)6(>In z@K}dmx>|>jf}f?W#_X!;DW-gXeA^zrZ zQ!v9*eluh1S8KCdF(LnXb&8<`)IBJ;wqrcn}j%c%^J zW^w2Q>92}QkTObAxk{=ej1**q|GXynX-IN6!WUP;CFx=hb9g@*P-!) zr^f*$e-h8Dt43UFk+y>W+=xfd%I3#T6B$joOioQ4y@L)bLTM8ecHjTmQq#j_tYvS{ zQ~_|7RdFxcm+sOh_0D2@V~vf@X?j{7agv^Gqe^3IW&-V~nr{i> zWy{@SHlorGG3RP;&GKb8h;)c=$#pumysI?$pH(uHe*=10!U$qO;eI0SVBQ+MIz>vJ zS1Fq|rK0d#iv9;EnmQ}3A0}C3_OH*a#fJ*Z)$FvO14EbstIQOgjIRALhz7pr^*__0 z3*b=C8(q%UfAfpjq=g@ZegAp>DL;QMU2XDmenHT3IpT(L2ejLPP}-S#`J!T4ia-F6 zCyg7+4~HsR(sP4ox~lFR0z?xl(-5k&oSukRB>QyPz8$KXOqoWx+UTrRsq#%tY7?%c z;Qn_!0==8lnZ6xmOW9#VY___Rl30dM!MNqg>c^P>PDl^bV?$z(Sy7yNsS7HF#KFUn z8Zt?=qJtIud0f`{12?D-830AQ`)xb|aavILY%p%~=bn@kyB!<4(U`<1^dyyyz*+g% zq#5{sN3164w11$yq9a@;0$eHsvQ##&<5Tj(+-7P;K|w-xy2JVQ<^av7*|NGB>wm5X zK{3k#S16(u>qXjDwtmyl&;YXD79z~gIlfp#{* zKBH0-ld4ZF9)SL_FuHm2_t8youLA?@B|XMJ0&`#Jc|U$W$u3!M%QrY1Q@2I#6oO&N zQ^sad?QDR<=2M_qnf@~_*=Hvyr8C-YmU3hXco|<$ z#64TASsQ8vnO{ZIBZ7fmSl~ePa}m+I+hBtdbX5gHUmt~(f@UK98{LO=W5!_td$>@= zFJBn7-7V5zS0R(gAJ>zJ*n9p(ldTVYEko#HQ$yL# zdH2Iif-A=)t(}57$9&*ECafC{%4cdp(eK}xwTF^=YGFjVBm0wJEq|N~&$frvAq%GP zaBOS2;62xWZ&>Q8BMk78^F3N%<@Yc*SA`>R{71}iVHG&UI~dEYvSEoDhsS?&7Z*N|MJ{(EIHFAGuXbFEaClP_xq5~ z@1!F8;@Fa=tdBh=#6)msz;`?H()OVNl{INHu*<3=>t|O7mpGu#+0AY~h;&-XR?ViD zf&n`%H9G71{Sl!D0q^5J+Zs>T=T4iTW~Rr-{8oE5@Sk}-4G-Qq(eaM<>S`V$_B>2} zL^;XL%R(>q@1Ekh}LF7v-L`4yQHJ>f0_@Kbbp z_LOMXJT1a0yM{6CyBRrw0VywPifYb{<*6q#Z%tt%nAfo)EbfwNPcej?w-8D#+w{WX zsc%Wy*c>z387KBheVnzjQy&u4+HPhe`97eI;^3~)8Xg>THw5u#`375>YLjo_%qn+v4UmL(Bky*F?u-xAK(<20FlpY;i`-RYH~J zS2ug%X1O(P4F!FJ*+f#IzD=;qVDDf?kf_Za_-Z#}xY%>AWkX5iY0v!_5?tY|X$e58 z=2h;_q24fmv?qIXVnik~2BFh4gU#{ooD7)QDAH;oUHE6Y2G zX(XDWevA6z_twGw_EpV}*x?0eSsJP()^-<46G66l&bfc{NE}mi2(nt3Fn+tb^4G&n zJ*}aL+*P~^@y5D@UauU&>REM`Y3frT|My?>6AgNpsx#^FT30Btf#HYg1W^W-R+7(U z!TAH8IQ9oOGn8poiZs3^A}D@#a#J@Ev6zWzVZ;>Oqv(N4;v)b9);ufaRG^jFsU&L&aN5^t!zZZ(H3yW;L^1C_QniR;wF; zYr9L#e-=joa734)#zNoQJFt}-SKqD%NK)a!Nc-S)PpTP(Gk<#fp?!Qoe!V}=q}aP( z{57VCOlD<PqyVph1(ZSbx}=`}`8pl5bpEK#8^^fYL`l7#A#>h+bvtH%FIgl4vLU z?+OImpSXb|KPA8v5F|Cxb-O@;Lq0H}wBx~^1IWGH#m&9C-xcDWtmQ-n4!|W0&&g%E zaaysVrJUUD-EU(n^Bu!p#FQgtbFR#eEh)ws=wAl-=yb_P@eE$&2*O zA^uWBkl9`G2L6UDT<#H0 z><&hA@V7T&Q!Zx2(=6@rd9^ZXDX-}TD@_VgV?(?5)<2hU1r7Kh-EybHUcirSah-1f z(Klf@V9QLkx-`B9^ztp7gBzjug8f3nbV{5Vuz5Wk79ilXFu`5V)@3ynQFMVN01U{Y z-w-?(Htf6U{(U5;G(Muev#={G~fb)r7MJ*;rWMnrp1+r>;I)mKtY#a=NitaM+3ReeZyPy zYw_<#!(k7;x*~%}&+m0_7=0dr*)W|puNOtWinMGBEf!Uw4dUkbl`JV&F(cAEG}NuV zMMiEW$?irPk__O_+Kv|}?FnUWUVS>Bi8;5;BB-_U{dR!<1f<4^GaE*p7nit4Y5l@l zi1q~38dcwhmSplLT0+IkYa2wa9{v2^QF&kHJc>veSB`p&I}})7G*RMCpP7x_tjXe4 zjC`<1-fp3My`FxavWd z?L;{-QfkrR3GN~=nf@1Gu|4D zn&2NHg}-Zt4v6i_yM2!g=?IRkrsYU2c@Y&fs@hYJjfu;De3|q9Mr+Xm(7nW*jUp{` z9-hY-K|ESm5O(>8uir+7L6%2Tm6AWl94$J@^vL|B|jpV#e729*_Ig(8eR& z_p*|e7W^rzH`r3Lt3I@q<9K5JHElusv*CIz;pQAaw6=DDya<_w>3N_2UwidkIrX_~sau6djeQ7&eArry4J?HqB&anOj;^ z|7M4?2sLl#wL&J(9l`4N(MxLGEO|-&4d+u8vH}I-oBIyc^#n6h3`gG)dF*d8fi==fI4n8h&Y>G=7 ztTGLCp}gGySM3?iFD4R{l3m2rNE<@Z_s?rOP7JgxAfGo{f@uOq3vr2T=~J5CU#|-? zYkA}2Fn4O5Hmz~Yf5ZVN05wYD`I|w$ZwZC`SeYb22t+)`SW!-9?_79R!B}1suUw}? z##nSe30lkoyUKlS6!dRLC>+^I$REu75Ob1}A|m)ew4u3&z%hyy|Eb zCzF}>ijlEN3L{MPsZ+}Zy$mIs;T2)mJM@+s*?z%lw&??JzCjdQjN@$XkJ;>-(ClH*iWL&v(#6xU#Dz)V(}D&L~-AODt7H-^2mF1k2+ zcqy46(=QKdl<%L}fXk7UWtH)**H77AvolYVMuY$DT|~ggA86MjfAuj7O%8tN!*OnzbX;xA6`gT}c{O#XR0Fvz5p2JZFQu%IB+m7wVA?VHxAlXH4 z{BtS5>!nsmKFrvrR&7vBdxH0@`rZ#)Cl37$Fv3hKJx|-6@Vd9b+B|RTsXlp8+1TOr zccE58A3gr89#;9=9W$O(SoC900e(kDL@ncR)0MV7Y>max7Rm~?R!YgQQJrr?k5T>;9f(1?p2ve9XCi?LiM*JXmK)XIhRludWvI+XkWavUd2=e1MdT z2&=-n0~;D~%=Aj=_fUcIUMd@VZ_6k9MX$|rnlf1g@D=;)!7hBVu8W7Xvcpf$ldYU+ zU01r34L|k=9QD5L>#^WLD0SouYxrkQ0NeR8YWhyq?1Cti&YhZ+sb!Z&Ji}i=XG7BL zu_jgztUvSkz)!p!SD|N!`P?O8!h;(0?^%`i4m3l#{5&Dm?7N+#NoFrSXmzznABOQ2 z%0UO*_j6Z6KhrZ8R-8zU3p*5K=PCVHh6D4CZfHgF%eZnWSkN*27^RnI)7`8ALAZXJL& zd3IWhoLlx23pyWT)#WKH)NY)E^ z)Obpw**`LrCAmQDV;nbU1;7%Y_zm0VsOLr^B2iDrO`wNQLuDOu+6b- z;omRS4F^>2<$RtMI-H;(3IP+ku88h)npKJWZ>#o4TuD+Ui1#lO#BEj$bl0GaUp-&S&oo@zKn4>LwYFdVsL<&~aF11zZo!cB~r|NU4 zACi_D)394U`$g%@WL!>FArdL6HdUkqu3tK@6aY7Iw4hfzWcJN)xkgNxc{VVG!(Z^S zJ0rLjvM#4DnYeLZ_<=gV<{@5 z(%np6Lhs~#-{0oUAEOUh9Mi8o+mR9STv5c44h=kWBZ-Rd@-Qcku?+%R$qE}LP{}F8 zbUJ(^L1pfPG)Ad-$kv7+wbacrkSjHDH zn-aZLP_h5}RntV^w+G}L3S(elzzz!cVKyV`A2Fy6#-+dV{kz?HLD2+221X1v|Hh7p zR_>XAP}&OsXqXHZPt2UD62Oya+7lDM@-q}jJ;&CZ@*8Gd3Cc3BUst&fIN9)jANSi> zx9d{Jq4at@uHzwAF{;uv#ERMIb7L(->hBq`>(^5Z+hP(1F1fKpE1fGrvOL z{azVd-h1^%-$g94_pbnZc>q(}uqcE$dh}gN_Jtcu)3$IYDvHWvS$hnJ{h5U}ig%JG zn*p@lfr>Wvu0iXY%};o)wnF}>F8pEBy-q2{4PgF-LF5RY=B>^0Ts*__orz%Z;r|i# zmr;3a+qyO!2oNL$cZcBa1b26Lx8N2W3U@+CaCdiix8UyX?ym2XIak)+=bW##?oR>N-qd|$li_T8HaR;fE5cpn-k=9TI~G;z1CkO* zb;KR=b}1a0ET)mBQZ1m0;C0~ttnD|+xjy%7NPtLfb78$my5^Y3E6p_3|_-x1kmtL`M z9`O~vs+SF^juE^**kjI?c+ArhFBqR!p>|>*e-u5wqG}J92qO-*1pikT&>t z&K%0=@3hwBdhdKXvtoJQc02Y`O8!k*Q(Mqt87=x7mB2$(44vE&Bu01qas+2GG!jyE zULn!*$oY@kI{Bt%Vh3PXS&by+p5)mg?7F@qqC57A#NMBQ&r6#)l1uG3?8X-a+M;Qj z${}Wi%Z+sek72MlcW1-Y`)9*ZZ6_`DMlecEi-uQ={PCQhQc{7+${fWfnJ$SM{5av1LL8P`-i(gQtsLn+Ux5oA3F9+F-=?_VA&Wy%i;^h%W%rjy!_n6wJ z&rWlS;QgdfRvens!HqTDhTn&Ej-DUiH79MXnFITc#UKbt1;ZZG;9?MJ%JYR)Mt6n- z&Zvlu4f$M|zL*vVI>wKwE3M1rHQQ!4#B*>#%5Nrlm5k(sbPPW{v@GkB8W*+-FS_rU zY;RyLr3`pxxYvEoiP6nWj=i`f*ecSk3X>O!0Eo;M z2@vfrPDLHP&-*x{F?4^diej}LZCTLjn^aUlMnZh^Lp`IEf)?*c<>d}t<%8`eZTAGP zjwWuLru>bJ11TBCkR$a|s`j^3)*08NaM=J;B1{{ZOj?V>`LM&^hBatBG@4ZZIS94E z!;pJNdWywJUVD+@A2}+s z4fsJR-LwKPc6_pKwAW7MY8NFI+7<8fIv(NAv5}h{IHI;}9-+ zXKm@9y4=|QRtiE^pGl5Ci|ar}qPnD9LozQ%wztK0jYtJT5y=y(J>$guUJlkf$d$%W z-Fpw?C>v}tc50S;2>7SysJC2*O1f}`YC4Gz``v;`44R|K7a~$rk6vYMfn>}!HsrXZ z6r4RfJ5zJbjcfcFD=MO9^V_z89^AzGTxd`~7;WhfWmj9M*mfidaeB8XXmOeaah@<^ zAy0MuS2IKcIM{1aKW|Gz41I+~^>8Cq@WAv^IEx)gEb=sZ^!I|Ev25LTi8LYri-5ynP1Am0rTLCO>m}m( z%@GrD4%hvg^Vbl7pP~iX8ki)OH)>z$Y0GKiC3M>RSo~K0D9ip_QLJI>i1a$2=E_Y* zm<_!r_xg48@i}~~A>?84oZ!r|(1nR83da|XnEH9=gLiB`#PyS{bolOi6JI7S|hYrxU-jkrTsIvR#5Mj zD!bCegK#clA0B-ZHt&x44^k!Eu-}m*zeWy>Vf~l+1esh!j0r+UJ440&haS~iPfh&j zNxvIKog(?7vSze@M zA4I=fwPQi{%Kws60cp&8^hq;dy(1h27lUF8Gn%$`8VMnsAG@0Nk1l1!jMD|~S9s&R zaIa;0ImdYb-aC*1g0E~8@x~#sl;Dw=9;K#{b1eM3WjR^?UO&mi6sDXJIm*hg-zM;$ zxo$=FQLAIzC~2)uDN`L)1)UREffpw20PHrY z?{CFZYad&U$1f_1*UQ5J>JLqp5X89Ff4I>eaWvVMhSs;OC z0umQYnUYoSU$e<_GcYA08z@2I4_6YF9Oq-wf+Y`?EI3k?b>0;t(I8b%eHNb+)dXhSE9y_RK zJZ>wXSX&)n=eXWmM%1e->D9VZR5$0l5&DiTTK*myLZxQ0W13yLZz)#VsX#6W4hpo+ z8eh`w!eTChFL>Cw#aIDaQ(TDw8cR8T&Z9sAE_Hz}&sYuPVt7b6VO4*6Do%|;-~vGh z?Kx3*IH^-L8m%Ighu)*;`)mbH=fF5vJHb|nOYesd*^QxyP}h)pSNP65?VdguiJJ>6 zQyU8$8d!SW9q(qvcBmnEz|O8Ron0xWT!JduQfWlqaCROa*EY0la!oM+D)dikMPU_t zI_$qqUT(H&*_Goma49}4eUBK5tLHLnP+kA4 zth~LtC`0|BAAggnG0F9|@?dSvrb6?4oHIgN=f882155}>Pgw|hh}64KswjL>;|Y8B zDS_^=Fy_|5ILy*yl6;VxmX;9$6(uuAx>Fd4)YI%7c*`;&&GiuD_(+YSAy^$2_aP_H zbV#3?b7iC;N^)AE-SwN3iK!bkEkSh{D&i|4q#zj9UIyQwZejsXYsLIGF$$Wy zSzZI?UXenC+eM5|*~$e)W@!$lqfh5aZ@12{F{%xTd?ygaOt~qKr@0?$$*qHJJ@%CW zguK?Qmq8zv`^)T(Pa|{fjtwvSRk=-PE$NCGKIcxhRXD%g{h8p9YEa?)#bKM(*qBh& z?@}`UY9wqJZ;`YVyuKqke?}pX+)zm0_ zt$-(NAiTa}Sxa{4_^P;kDJ#YEayxgK)BdYvQL5Qr9v%!7Qxn= zgZQ$CaTCUji#<_3e`wV|b>2FmccBrp5f8;D$HC5me}iIK2vE5a$yxGu)nT-zJok$e zx3a>rpK^bIf(uB0HdZcQ#AH1O6O(k$Q3ENVzV#HIV|rICZZf^cAFCjl=wqAn)bPP$ z3A7~^xsZYCt8teXeXf}&JGOEiG?A_6O+^-u-=)uEyC-OUCRVs3bLE`$gYz$o84=|k zlp@BqMjKgatbHNELvHaXZ}?z1H2BUJLTe6MnrwvEA!?&QpHcKfFKhtfi{65dyxJGv zSk~rL%?hrnWt#6Za}Jyh`cVhvcV z8B}3l2Daf>8!W8x#~;6egebi!uE-iBX z>`!IWbr*Gj_Sd9CI>IWU<{pie5zg68Vii^@8$7YEZY!ED0nL1lwNjv@mrkDSY=A_bv6Kj~|H)u6rU8Bv2oY(z)=Pi9Y{Qk=z+<4#6G# zBGaAR_U0S1W#3rT)(RpuMA(0=abS$Wt4JAGihPzF2v<+GkQ$jw*V|qG9&xLkm4kLS z$=C1`+C$E!<8$G2H+86%V5~=U(T@Ojuk@FVd5`EUZeg+`2VO>CIeNbu4R~FrKFe(f zzA!3io?4DA8l$4ywxxgBg$94en-Y>74SPd`n3yRo`X)_|G7mLtmcn@*DNT=jUbA{? zs}kHsTO^gd5VETb`eGPs@RWn*Pin7+Y7VdKb&RW3#Qnot9ByeJO9zKFqMYKWbtek4ty=k7x`Pfc#lkIPy=Q#DgPgx02`(T(SW~( zH7lESPBw!FI=dDnqZ#zO8gy`#Km~_fHQr{PCANqA+oYEb3~4lx$YQg6gtq6`@ie^N zOUX8v(jAE@&d_)yA#hxhg1~pAdWv0GZ_COaW*GQU`I1FS@uy503W|n)ss6t#cw$52 zefy#C1Wq6pOBgu4_2Y8_IBs171SdkZ42XFu-%gHfWwF$>weekden)S4Yd51=Kk_ox z9QwDoZ`72PjSn_GT7{}CDZ&2_<|R}b$e)ZRs%Eoz0zCEAr?))KAhd&+R(`Zzl8f65 zo%W~mM5Ew3TkUGkZaQ*|`lK`^_4C%5p;z{;Qa4UdZyD=?w0{USSyjmlNSJJI_HwAz zRvnan0U@z39L>{C^%h=Y>~bm1ui6;fz+RyQeHE1a7bGdC{|$1f%Qy+oryQVoHr=^f zp9ZtmX1f1FwMl}2J^KF*ZV7%hHF!|(qQKe9oin9>aOgZn;ALlEF=Pe7?k=`ES{3GB zWl%(d0*4dXI(tV@bZ;PU>xo+v*AemscOdIfR7|BzZZ|9?rX;uE;5Nf%S; zo|W`jYa!!FizRu|{~0}?H1!YoB{M>6$3`RH#?RpPIJ}}YE9YTEH_SJsr1Twcx!JXs zU}n_e=&<)r7s&KT2OIK!QpzaSvc@U;Z+hhl@$(X2JAw-(;gBF1MMqsbBRAJ1->;lBmqDUUYJ4 z#hePts`r5n%pC3Bn;&K#ZRxz-SvK`%l0cx6^MS$PiRFyc4f-HKY8px`nlE?~E$)5m zqRt3CNmqB<<8k&7fH8(4o{Q}D(z2}0o6dK1;+9VTDEbZ2Jny~xJt`Vn=4J3syKL(1 z<>3zBYvu0T^)(AmrR!+(nb-NnUdc;7!RXp^zh+EniS;Rj82^_St4z^4a{nV_@VOV^H97J^wj0L!t_(*$hDnnpMJ>E$kD z6QG@IOYCFZ&<@4j37_5D1`5Tvz<-YL|GLGv42`D#_>Fu@Gd70|1%e$%zSYXoZz7 zw2)_idLmuhoPAfUD2oRd&9&)z&ADZ z1z|{S4fZ2kxK!gV#&hpnI1#A%%aPm+l9koTEy0(Ev&tzv9c^Z&$vkPy`sZNM@-c6m zllbQv!z+R#eU!n)vA1(0mM24Cq8>JIvtxB7JNTo|m&4h1gk|UkTMLWZyRwtz3dKUF zL8+;?FYZ({yf@xfm#6Q8Ns(W$=%uMBDK{3amad{|BTv?extWcx@A5VN=r7QBwhCVC&Qw~?rUlR^a* zB}c-x^SKG@eJ%u!UdArOC|#uJ;#)7C=XuD>xtyJLs0#W2eI=zaK5g>-E0T&Qn`orD zg^iL+eWrZKSIGJkU(3(-&G%_yrFy|HW<7A`)-*x`N6uajjLW}T1-7p|x-GTBQy@5F z01L}o{ z-yz8lnhPl%2lCohu*?@WRIop>autqf_@7YuH@1a3cJLq0Z+soXoug0;&GM=2+Gl_B z6msRNqpY1w4$zT7>($|Szxl@+#!-x{MzL6Bto^NB`9E~}h&a$8KS#kyZTOO^654oC zg}k$drfoivwJB(0fEO79c&zi!k4s(b9mC_|!gDqyySE>3jZIBA7g2@938jc`&>T&_ zqn~_!ZfKZ~$@!cqZf;_-budH8v9Bw$^?18qYcjVg)<-lmJNx=|2b*JMj^)##0d7)C z47AxpRu{1l2??-YT0lcXBY$$ad99}U^4#5|r{?wCtET-DmLBJPIvK01@Co`~M#=(0 z*MSw=m{hemM~XOu2uw$}(Kk9ab6ojyJY1yvbUNank%)j;3}k?9E3Q8-4y|&*SW8w& zWL?R1|GV|c2)*0Qs*aMDizO?TRa1Nf#^q9q2{yQIm9L|RF81V=w28&eE2K)vvk%oi2LxDXe!oBqT;GA>pA5)s9b(d<5=0Y9}H9>z{Su z>nz)$+tt4?N;H0ZB*#B6*QfDj{~zA>7m|4iUrLhIdlsZWGvl8GLqLC{5rIQxT70gd zT7*3(S&Z!=$MYs36H!R-i1S0*jrVVMp(%gj>aJf`C}08#Mf0wA>_(Xfj%i9b{t`B_ zqdgbd88fdfk9V0sw^$Wn+7C$#dd-Aizg94r9gMmJUaJxIgubkt&&gu2ySScWprfx| z-FaASBbLFdtw)IRJw8h*mp$%$05w8WFzR=NFZj=Lw1C*W+^%#R{QS)c(U%j^r`KH0 z5s4FhOG!}TE1qZu-9I;vTT2@r zj)0qcX=o8m_~aIMe2nJ@9vg1kV$>TYwdVDfE!X~>lnlOTuC|81oNFQQmF0022wnrO zW=iVUM#jdL8m))QkJyWYkkqWDP5zxR?|iK{G*FFVR$;!8b@XD6&{NUgEQ{}~2>i7IIzrnL5 zrKJ^>+rCS8QQ>!av3aXLvjsINo*4|HB~dUo6>ZA?Ref0D(1<&kZxLzn&>OF(b2Aim zG*>b@AnxL9kM}kVG1L5?O7wr@0MPpYd_bOqYqozU7HA`RhM?)4U7_*lV&&CKt0&d> znt`n3&*DX23F3;{xq=8YH0jICsCk!C6j{q@-a2(eGJ~zU`hU42*IwTv>0ieav;hw@ zb0fpF#9g2RV*crB@+>SoTt<52bh!=YWU{9RmAR_|U^(z*0_Qgn5KtE8u&FdTuW=Li z3*eSIMh+u~iXJkyuVjRTR4l_f)zn&2*I24BWwVw1zT2Pqpn+n$)^xFw z6*w%-NKqWX3Fw-gON@MdpNlEM(C)Z!twt;JkogA8t^$&!mTkd#v^qV z`OowO4M7~tKHRtE($6!e@(PMcNm|M$rFkX8RKw4wlNj-vV-CNF6My<=qI_0R-Ll$l zvf3|advxa0)AHoL=gWErtjazl~#tw(-v4LmHbME-b8!kDot(O)(_`EAcn6P-bG&kKKuCV>z(%vwerA3~E7Xa#( z)%p(5P(WJV<7#SPOWcKixjs$Rg1NXL%gamkYQo0Eo^4yKnT}c2;f{Z;vbda%x3HD? z7f?J208QSLZ2|TdHVI5?_g$7h9;k05@+z35YL89PIlBM8QGN*Qz<1KZ_7)sYVn%8y zNi4HF2Y(!65<_BjKxIu;-@||@{OUW{65A+U4pv;ZkwY}~J;z`97V~LINdJ4W{FxoA z&;@3Nwzg0CFMl&-LU8M-cMf#cuST@U3sQ!VcsN+mV<5%jJVI z>=lSSSpaiwsQ>*QN~>4y!-EtCz|&ysvK?fx(wsH(*HiZ2waEc75Zh+oFj?^5OY{Fi zNx0kSho&v!EEQgRhn22uSs?xYM63D``*M)(g8I~iuFC->w^vKB zT63i7Yv#XyIsP3+{xaA3`TXnA|9dGY;);KT(%r{i~bCVe8D=;;Q&cn~bV<)qyC}fIgUK+N@=3X@KYDN1KRz z0i!xra7hCeDXMtt7(Q;Nzawm33~|qGO~T`?wSspN{_jc&;lKK012Qb4i0ho1P1-Pc zeo39)1$2-{RwZFTHVB71fwtVXOQU4}%CaPe$FbJyH$Ns2ASYoWiL|vv#mXG=6*?s*QE+=I^mP=B_?3{B8e)a2Blt{td&Bvbvj5C{*> zeNuNzuk-b5A;`;3CYR4o2lBvI{bV`);3A`{sDv}3c0cm~8NWGdm~!{%$u{~;Q09GI z;^RQbd26$?a6s_E;i2>80h4u~rMsbh@&cZ9z#n;3SU)K_`p{X|nOzgujW05{e7h~O zi5`p;f7h3=_T9dSQ^38=^LEuvO=)9zRn^e<_UF`v$`XqxJg-x0&55@~+w-**0j8B< z7|4(#_Zt3sYm6Hq>cPd5wXz?(pK=xbCA^=bZE@+R*SXYCyxcPG^XO{`&Xt!6yCv0b zx<@mdMOptYZ#AR%4SFm9dRCBV(>OT?9&Gb>t(%8JI78UHP65_sH2H^{pFLkdy?Dpx zoDp4$b83taUn{>t7V;tJE%iGSs;xP|M%8wK>Zt;isNtaC!0L;Zc|`2GZAE$ez41%Z z3@ByS@oL_3*pVBWeQk0$%QTW5#ltZY#s2kYTF3)t;D&gmFrz{HX}apTakNK&u-ATq zqYQw7tbWu;QH)qV_FYYT!I%dl%ET4Yf(j0c;s~fncwW;5!simH!Za#^a<@{}M-kv= zMbSiqo3K{2##i|7<(n8$uJ{OS_>9ENwN0a2E1QJ8NRToNLiusX&d>9U;cb7`iGnr? z;LoDZphapxbZOF5LG>8^wWk}}o&n-)1|t2b!n9r~T{QC;9@VK?&=NJItSa%0qQ7dn z=c(K|%$?n)lIZrpGc)X- z6VnabWNQ+!$Q{as8z!ugoIT^^zm|pn%dwECatNa5piJP@@qeUg%Tv~UB{$MB9eETJ zC+q7s|Nm`f*opyACMGUnSR%Jtu!Fznb?uBfd(P%hnj!dpuWN3kpeyFaEz*pKYEf1Z zS*SRF6ajs@3&#!}I}Ex;3;c6L-IACb&R^VFQa|pjg@|?d+fkM=6GCo>Wb~bqRTJxvN2tw)oMhgB_?{ww9`Idbov#4v*dEyB=j`VtTc> z_z7bqw!OQ(kE0ArJsZa+>p=v1ORUK2&-+n*J86;wLg-{UAy`(lr{;tqG*iS2dD4L` z3#l=alS?M$B~|UQ9D2H!Igyx#q!xs+hp{`8_Uw~^4u^Hj({s`dAcQ~2@MNJlzS1rr z6*T_%ePj5Mp`*Xd1M-(%7U7N ztVq>oPD74e=y)iI_kd6EXv)wX;*OH+jqsH#|mcyUA5n>w|1By*ES zL_5ldZZEG%b7H#S7%{|*pSNm-B;kfY*Ov+-eG@ejN=HM-A40+9^|Uc+6wDbpJ4+>p z36h`I)@wY@sl_mGyqfn~^Neb`H$H4S8Y=jk@{~S(a=;98P#ePMSQsFwzXN{9?-^u~ z3aM3NpQ5Sez6G8jNFW%qg2>QLgw$qBvvnUzQ4VY#Vn+2a_)6*;C#+1&$B+I)plT!e zE-432<88(1RKMvv_VPpd^@uh#6uKOY9Bk;1t;3$CPHt2D^@<7HEFD|Cxb}pgRufcX z7zZKzPok_pVcU=M@Ns>uK^}* zk@LbfF(^xfnZr?sj|kw$k$#?*kzJ4WX-(sH{K8AE~fw;tb)b{!)?#Q4GP~na?$}i2A_)c_{0D!&DCp?7N2A6 zThOc5bs%*Ur(jv$ZP)9MRLirH^~D}zvCVBd1)q*REmJetmD{E8^c9J=&K3BfkG`@^ zy}$}rE3fyW7jm)K$k-gZqc!2ptNT&^_Oq}mN;DR%&bPS$5>xlxW9)V|nGQnq`^S>@w5z zZ)%!{@bxO#Vff!iMyM1q4=&ej&P;M}v^Q2FIP!zQ@hyMQDgleRSrJATsnY~!d6k#- ztu%Yis*9Cv>lWf&6h?yOwJ1NRC3V;E+-b>Nx>4DW@|c!ls3kY*2$BmUDnA*Znw^B_ z{HfKLi}P!BJO8Ty@&Ac`^&#|$4{bIz;NVRmsFYCg!ns3C84{7s2l-mMI>tLY78I>U zn$jaUf#Y~jI1?=|50uQr!vym!!|gK7_c#(ZxHFGQgB9Z?7GndfeNN7gpBe(tw*8bG zIaFfubF=B?Us;P=RA_XZO(t5Wn~#y<#&>vPOq6mYK%_Eu2PPW_?K_i|u$Qcef(!-{ z6TEQLz+xM2RB2XiA}D({2S#MxYfs}T6|WU+;QT{=nBm!@p97eJD)H0xFgJAb{-*x^ zu=Nj|PX7896OecEtRC1nBzkoyqQIxdhh)r{+f#UY;*yV^9q)4bGZ&sD)I@+Nakt~1BNv^JT{9oe}WcJrt;DEX3N>z*%Y5Uj}aGla_!{iB7mn` zF;~*I6Vj{Qv&&#!srf^8N&-fd8nnexpLK9zW@}q^c4oCQ9U5GZ)|s_70GN@U2AM#( zR396BW?AKX*bY0Ax?5TEmBdB7XM!Ed&bg>@z48EVOZu;h(#}dWXv@8#GNIk|<`&K+hzw*HK)<8q}QrcyvSxf~LZdR+X3dKh9@l^v(|hR=JMiznIM zUUOb<_DLUu;RiSO4e|3-KJaq&5$8jB>PU0j+@2#&=*e2=lDSHlpMuZg({&s;e&pE6nNn~-H z)l19qoUMaMtY{r4+FYMVJ;g<^y!b267`=NU$f;4P z*8}?pzySiP)R}P)m}BZ+`+o4; z+$d?r&rihX;^1x~Ve$2A?fCKGA8*Eh7%XhQDyeR^^{X0k7giT0blz4*=*?r-Gcmw= zxdJX@B7}d5gulyt$s@0Zg!rGm#T*tqf1Z_jvNcQZ5iArav*wrGldhAGZR0luyEht60GMVC`9ry zjR(Eyr4kZdBm*Vl@wMZ2G8UfC+42X)19PIt20LpV%ibDBGO7cb;7lpk3cKT#?x!~v zT_UR9xkFmzPKmvPKL93>S=-uh)qhE1PXC<;{R{yU3xpCGY!&_0SM^?Ps+ z(?I;l!SA9rR=6SSAPH;%hl2y#3DlRzd&(s(zt9EYsO`Ay@CY$qfkVaeP~-Ms(RwX& zOI`$l;CZjLvD(lm>utF*xU@ZuM9JmP81lcs*nN%H{`hSR$mem&*AGg;Y>y92iwd>j z7tI}BDZ)yeo|V5r-wfzFN6~!{*P^Ey8p@ds)OpOsfHFaM$ALTf{Oqgh&L9>jSfpf% z0UL|nMD;1BF@1yR#5yy$s!`mms2EAs)5V2VYFKSS{#p{Ei1Y_hY&$4{malSp zF|KDcq4KN+Mv^kB;{Dr#1NZM=q>)9Feb{6scK`Hn+9hDL{_$_>jvfE5guW3*c}Sa7 zn#PPEar9WCQ8Larw0RqLfD%;ht$ll?E8DGpU7MCc+Yv2jMT|!o!R}zikBgmQ`#u0` z(p7M%^Et||u*3phP1nVvHy!M#K?*g2sz`GRST}({Ffme%{T(?!9~ zTBDyAR)w9=;83q_5OAd)Kw)CYcx?lL(Cfx_3t{DI=9CC&fQnq9886x-Jer%I<~2Gq z;x*r~%3h{(uu>0@$Ow1;qffDrzxy>jal5mYm5D(fR1|rh6#Uym4OxX+C3REfNCA*7 z3Lzdm%nZZF+?gL!q%9|*Uv#Gh6}D{w$wN5KX-AY z2cu;ks6Ufc+f6Co8JIZt*Irw9xLE>8kY`K51pJm3|1@hc=g$b`9kHxHw)ihLWsR)v zdiq`#jdhas)M^6WfG4_{n^KQQkn|Q?94G5%+c%OostW`b%ugepPrVc={XTTX6(_4rLrN*TmB`z&A6IKGrl`;A-WmP2v< zz(4#$)*JM5PRaresX0-BArjJO-x#&9ev~zhhRI&P%}TDTi|>}Y?r=@@YmN;mD(_hn z?o4dc5@|s8Hs^WV*n8faygSUTLLQ^)@)8;ehdgUYodiCdQkhT=G~ApuCZi{OP6d6D z*OW(1?vLx@kl!a@f|K9!m5!8@6x3|U!{uV<3KGo4rpfIaaww?Pwc6ELuUIrXYt5V8x)159RSO5%$JmMc!6>Z4L>nk!Zvm(x_AQ$jBfQ*tg0G;~DN; zl#PuXT=-_nV~xNINb!B)iI?fARi>V<5ws61DV)_kK|Xq`msWZODfUBR&qU}HSEySZ zvT7^OzOhg99}OYl_4e=p9>SYX05OzZT_vOgrGv$b-3@@b;kunkhAzrjC{Gdd8~-)1 zd_%MV>mQAT5!%lC8pLSXHl-J`1%l~4y(+tKw0Hk>3M<|SLcD>pI4N%3z8nDTdA@#I z@6K^f6K#_IC2~uCDo(9TXiC8}L2`iNFjDPKM~X_vcWg1cr2Tn%A`NimhFX2$050Vm zXZQ3x`$QrV=odA;Xm5(BT9)sXK@iq`g%cG`bA_}qf^3{2Pp}YEFSv;;Epw%;p4j_Z zw6sF;f}01s;78$1x3lzu`Qa=CsHME!Ap}SsPXe3fSn%eN6Donv^WfMPx)HbC3jr}L z1z%Ta$($J-Sy6JOb^xx^oU+!R9P_<)f{qYhR7j-bg)`t0&4mq6>lpM>-w=sr=I?xg zh@}JL?JT0I@$2<3VtS%R!a_@o8+`B{Gu2qH)4q`~lU&n|DP;TjC|KS%T^ec#XV=ry zLwm9d^IV{v6k?t=Q7|bT1Ic-9VxhM~o)V%WyP$&M^Lbg8I*>_?{Oxd4OW`Ht%`7j! zS2z#{E19z~My$a@I5@ABHhyT+C<_H;^YNo6@~5;&9yco|V@(HSQ+tPR?2M(x(5ffX z4{mPvjBbbo$*Hjh##WQL9=48Bxq2!?U-;>X=r}I~xTEro%+BU>#m+1k2TiKRfAC9D z<1mL`BHYoM!2u_pq`}R1cDh~lWSv&YC^JxBY~3{7ZhPyW;S z_0yluukGJd0hY@(<*%^Xb#LcdUfEq(xNbkuVUPUa*l!+!vnACL<5v1C z+Fudeb-TGnvuxOxhLo6@o}yX?M#QRj@QCiPTn%(ySja~wz9?TaGU^%9)d^!4_{4C* zG}<@7x!i-K0FbpbC~)-u=uNBm(LkCaACU!;yYsP<>pbfIVSdUiE2`3M;?8tag^h9$ z-LP1r?J5ENx8V0I0!lM+j~=b$j(F#J6{!pslX;BsS5?${V@EGAC3<&($2|!J!bJsWbMY+)Pjr)_khu@prfTEp zh(fZo{#ELg+M;A5?Q2JV&}4Y`Q4+&dUzH=r_N< zC>l_IU{#8J-*P|{k!7l!7zIRU8QY4~xz~NfshsrpPD*CX-v;{Dal{+JyC@E?wg&<8 zee+6)$*XX^B{V9r&C)QVS6^{eCsq{Qgr(Xn&4;%d?nXd^u3P{Qo{*$y)qR->Lc{5y zu<5go5H&HIoe|r53+7c%$*7cU{~J!i#oh=i8|3OG^OL$4caLoIWpcXKyFVm@D-C!g zMZ~H^)Ax31pkby$8)ez#1d_!R=-!Soi70Kg_g@w%sV{u$&qK?3<@U5ruZn1bXR;!J zN5;VWYHme5!47@dPJ$XLJyIl*HzBTM$z)~clb%~!8k)!?BC3Qx!b)G?|HH#&ES0;6 z8dXDGvk*4>;43Al$sd2w6iPS&WrUzb1T=hTXxP9Apel*~J}6?n&lUzUq-FddVOKp% z9y%}!)CQKdv&--OY2IhD?Y+HF(#I%NQP4V!!dni{)zn<-DB`5~O!4e}e!rJD&&k2s zsYvhzlBpnt&+Xb<-bY++Y;ci|l97mrjgyzn{kf-5rM-W2bg;#FqeNQudO8Qg>I9GA z3kRz?fDL|6eDX8|*GQN-Kys#iF+xz4YkT{K*Oz8RD$fSAzer((pT1JoXX-o5W)vM6 z8&DglV5{eKR%&5>Xj=klH$}7t1?Hr6-qlYndbY37%%U?|h}85wv3v4@vm_K=%Q{BU zl*s);NyD)wLb}_B8ov3tkqOD=&Z+SIcGCfXNzl5o<@@Z3{bO~_RAwM_l)kR=t zWOMRD0uO7VZ#S>M*?sY_(%Bx$6;3uyj~}K&))cC__UTR4!yIH4*o>9rret4Epx&H- z6P#Im>SerVHS#Mu`A8&RWd&^?_Y#2{C3p*c@h92xD0PgPIe72l=p7h2W4ZI$N9gQy zZw@}zhqvR@59&&0OZ|{cgvYISqPQVi_GdiB&ILNNpGvL0mKN)qZ%?Xf^(;$kXX?H; z9pQhQZbe&$1+Tip2dlb&-RS8i3P1!0n6^h_;nJ^Co;2Dae1X&GhsRA9GTFr4?PEn% z)jG$eI5|FTCX3_yjqE-DWV&HX@CqcPu z1t*NYRavF?DckM?sJH$ges{ln0+-4T&IoP1&amQZx?Gg1RL5vU`nB(2eTh4}8?o$- z6x_1N5$mkY`CT>9B7B2OvYn2!rRCt8X$yNA^pe;LISvxvKxfb923JZmT`j22Galtr z^tsI2zcwoD9Fud=B`ebY1!&W$-9y5Jm7m9ulao4IbRiIt)3j$&Ru~>`^5qUwNwSc2 z9dmPi(67r0_;8xWTiY9xrzsxgmLV#DJ3OQ^OK3AHCRI9=R#_tLc{+XZLslor@4lywS9J{p|os*KQ}+qqL-ykkq*}-0xWo3~Wd|A(4e%@$Q;o?{Hx< zvnz`|)Ln_JDSovmCIX66b=gt1d`e&N4BU`Th1xKmh4|_PN_epC9E@v~wcWKIGQWTE z{HTFb;40vZ*PZG?L{13`1`hoOT(m!3;|3)zc-wRfZ1>FDaq(eQ&SF0cH4C80OUyA`_w9@3K9~ zpIHv&v`}`)o#*kn%_j8m@zGZYY<*}7bnu$_j+NSoiJS+wI;v;1^+TJFY4gDH7t4do zwrA}P;W-zJmsNn4lIM9@9&C@dFT6XUiF|Z==;+5sJLWq_hEJo(aJ$^>w!MdIHwlqJ zh<`wUq&S}tGlpKVoyqURY2ReL*_0x#vxisq{H+d|rY7HpR=9US@_(Wc~)D4&L*@6?neaP%h1sgt^@zhjz3!REG zS-G&FBL9*Xwc6dv&p$2EqQ;F-V~JPK-uPTIN*ZsKgakg!L)oUgH)LjG8;uF?89>!d zBrM<`0Q1i+%Re`XUFg%9?7zyYitgDQ0!O@)Ge@c1)JhumRS(^9S{6F!;-1nq(o_d{ zjOs@GEZY^w!x8viD)!mO1&fi5^t3FSlqU=idHdX66OY(mR8J z)x591BXx--5l(IV`X)xjUcJ@i-vznx7;TVy0Qo-T)#ib2I6ya`qvk#z`dnv3TndZP zhAEi{jG^28TC_^v6}>ujnR#=%0tq@M)8g8k2ciwTO3<3wvfp~^HYH65kJ_5fBB&M&uLT*j*XjmuIsMB69nZla|q@f9W3+Dj290&xjw*{|X>5puM$ zfbSFeH)cRF*l?3L2fEKl>=QKc)gyXr!^YA~OKcv`Ssz zdZrkZOi55hX4PdSvkp6WYB1-YrN%`C7!9KieV?I$iPa)Xzn9z0U%~75NUG+GB@9)S zNpP#8I!;Or#-`?wDv_+bi~tysQ?>2!~H9~&p>a#O>H8)9^ShPAt`FHH{R zruVU=ihpruaAvyQTxTQXJP5o zrXk%00qD|zrg^sZt7Q2J6h`)vvfbXb%3MI+UCbdpYp+*MPUX@YF0TXY-4G2#SPQRD zT$PNbG(S6IB_-$GmT9=tpuK}$3V&a3jnM|25j|kP?!q`)*yteJU;kLuUS8fhqgKjn z^l+zQqT@_%PWa;sA3GO0HHuh8O^t)|RmVs5K+9|~E^3mI(N(0U zNeKS3loa(%O9 z?p_${3lt6 zEJTr`6*}kbk(1!Ao!|F{<4u+fmgN5CJ>4vnYIgYU!zBL_BKJ3ftQF+80#}QAgHvLi zuT#6*_KtTQO7XeB|LHS4ZUs@c8>8{!Ef&Ai)*S6mZuu3s>es0ov2O9?gqO2HSX#wZ zYvB3+*!s$_I<{chKnN1t-Gc|$;O_1&!GgQXKyZiP?(XgqAh^2|+}-`{oSbv-``-6{ zv)MDVcF$T})z#G<6Vuv0N$%CscI=(s;Rp3Fm3oNdus3ar9|Jrcw0*z7u-{t4I5eiWp+%!&;xIRWNR{R)rcd(v7asD*oL%!JSg6ah!3h91S;(nH$KPQsmTWS+{ z&~Akz4zWb*D+-g#b^3Axto|C;a7H4GBEu6FUY-&dR)F+9F~xb~sSZ97;AQ=Uzl>h% zWOs%rdLM51_}28w?5>V$o!j}OU%?RSq^6^TU>958oPpl_vesuU+s+$$KO}23erwa& zda*aKQ$+OhRzH@K&R5ExQLslOIXL}}&EW{VCmT|3jsX5!llkEuFqoH1nC6Mv_#3g+ z_);LaQ2R-2CJ@-qcPKPgq+&u5T;g)umUmW#oa1!a#G0umXea$#R)*8Ua!oXHMZ|`4 zh^0N1CDJWYEtUy=U&*MH{W_lD)R`U8nULvmBg3nA@ZIHTX_mP^iUATe({*T3 za2gS&@Vewbn$?Cl-E22HzGFP3hB}CmO_!a$)iPp>cP_e}PqR19e`xG}j{bwPcfC;0 z^}`pfMbOzEeNva_<39uw7*1+6lYfOdo?(>8pT*8jOtoAIcnS8wO@o^$7=WSmP|1xM z^dGJ@d7dh7=UXT)KgAhZ`9Q}QM{fjU!NyTq2&wv|3dC0)zuaJax{Oa3d`z>wnc{zFMb z`5nsF7s7>b1i_!0B>sehLdc(iYySE~6wMFRz)9#k@a?V8Pp)$y%{6g4VU8o_FQHt^ zp%s*2>RkJh^mj?JkB>>n`@MtJ6KP@=#ZIYL;dL0uu4&Nw^x@V`54bF1fgcXXQ_h8@ z1t4c+H0_^nqM$s>tAD@S7Drw$6IO(9`4X3Xe>{R>%G@Z6AUXKCx8v$G$toN-9i!Kl z3)m^C9(Y!vrZriqAz`NTc02Vm?onmzQF!O_kpISLb-zO#he%U{pbecIgjgKaML*F% zdK)z%7!gJyR+8G>a+(Yh@+X_d)KFHn`1Td!EW(&df6GM@RfvUp#KGJBcxg{u!=EUi zVj+~l^dnyYvB>wy*^-Km+6QU(^Z?#Q2G|!v`bL-W#kWCEpTR^Zgrexne5JN3RHp?vQrhJN+@h^XzsMsRXR0yYqNhQ-*9Cek91-Lq3Ko!@~DmjWtqPsF!%$*l&xivB1fU zosJ2G`gQjKsxLm5$J1kLlLry4ndIjCGT12Px#6g4%YC(bIFeri>QTH-@cu%v9%Z(Oy zYnD2>FJ}?mJ zB7Jpbk=?Hk{bFvZ)37!_p0%{uVKh1%9DO7yW2BCS$6o31_Rs%)b>R?33j2CQ$DG+drAb1;!IFSvCbHiY{Uove(*itK4s@(16Z( zz^D7_4jjw63(G$UfH{c4HN!GQ0JZC~2h zRkClil7bCb3xUI+H~s+^!EKRj7`O3+!{V#h65vzy-JF(k*za&wNGu|#DNvF2ePD!g z=~eC)L00JLY6DDU7PCnwv{fYb2L;QKJTqJLHoF@X(r`hK?}f_&_QKL?T#((rrUrk} zzIul%Vr~g%_2j~nq-)dpMMA!h;QATe{p`6SICI{MEmxaDR9CKmT4=4)2$|o4ZGhI8 zR0ABZOTT{^8NnKSP z0oMae{crcaj1vf+H+>!<>z~;lEgH2<>3;S{}Aw;`Es63 zz+kD&Up0lTy7ivWH%WtKC|zT#ZsxyUi9g*e{UKf5@>~|#LmGL)C9ZEEFRU#`PEOcA zRD%yRHwn1=$6QRsaR%I!Ww+OrF?vQT2j5>FF9`*Sc|RRchqlU(aaYXCDStm@@>1td zEiLR$`wr_a@S#cwDuu=>hQ%g>DE`CVSRU%eQAb^gPWfAg?`uh>ZKu1HWz{g_dFnaW zkN)Bx4bV2un^nBii+Y}bb?;2(Ap{l;@nm^>pzX4LVqoDWn}+hyN?I8V(*zt=IbXkU zcA-n+ZMl;($VW6)Y$nA0+ICO)1-sV|*1zvo1;Nq1%<1IvLlN6_hIfLBNU}s0>IVpy z@HW?sbX0c@SrZd0xt6k#x}_TYUM9GiibMk<%fQIwu9BP)P5A;qUV)nSONrlE-toO8lDd@4k-9Ey0oL#2(hpc8HufT zfSrk`zK>{gt*9abfXC_aYMvEeS2dz9pw5_g)_bH@LRbOE!QGPbjY6D3H~1X>vn)rN zcT4eMw!rP>h1eI5xpj?EEE_)xlg@W~%Frq9duG4V5XOe&5ad-tXt`9$F$^0iA0gDV z>qU~KJm0_8-koiBcTdI^c(|HLJyD|JY$+iP{It!5govmG6#jK>{0DL`eevB!p&|`8 zNgUMWiFKyv%t?Qrz4ccc??VT1jV4-|SL)AvuU10KJY)(QhUd6861x2{*A{w5vpd-_ z=?)7zcfVJSc2=i3_eU7Y!Z5ITS8Zkeo;AkSjgLO%0PmDpRAw<5<2kQWhDh?|WB3vf z-uq5td$*pZXf8HBq%9{NbUcj>jtNGJ2&d%c44+rWHbFR=t+zV8_dPUEA!SCQOSXI= zye2|vE-{y{@2BJ}otc8u1B^$w?!bIeE(s-R?YL%_k`K&mucs-uGNk&& z#x4y9$?glQ&athSIcZ?tzCgl@RJ{T9rI^UIQBr7<_6~Q4%(mh>-^pDSh3Cuwk<(&6|j;kzZ6}0^1NJ3sD;EiBKCkFV)e?ptr zU?84TmRh((yGnnNAzT6hohzO(9M0*n8SLw8(COR5A`3o$mJ4+kDokP&sN%s~y113@ zXT$HQLQv@PR>IP0PX0d)QGeTN46c2lIxxDyL%55D59ovtL3GMLJp(OB6G~XDUiI(XXU;A|cn6<W=CIwy01v3xpmpmyf57=5_LQ0Q8 z7AEGY-hs2*UM!gDWu+^YV)%ieMZ1?O<@$F{a60I*$xsEdVYjce8wV& z#*7H*`z$Zw{|5Phc3LD~HkmACRX0+gvQ382m+fCSzfrlYK;^7ojAk*=_6R?Hx`XmF-L|Kk^<@RBRyL(bqmIU%#t`Z2e27JHeuSXJ@hYKc z*+ruQ2J|K`wb2fSVE(W{e^4=BXckgozrO7i#6r-pukQN^X2VRT2`N3{*u zc#FT`2Ffqei_37feJ+Kyx5^yzr%Wx*22PY)VoZqJIDM9j=R_Cr#6iy;Cokmtj@%!Nq|mtAK;pyymTyf(I$hFT!MupsL> zZb`63k7?(){(ewURG3;_SxQVG;{Ku(4$+#?#8lK2YlhlxQlluA$dACMIXNpKdc2bdLL2W#0__tT)wn|9E*N zulbRn%r;77cX4=6jucZksbENXU_PWQorJlTs@7zF=d`3jQbgp-GtVsNO_M+7bvo|+ zIYPf>kt3o^g2c>l`p3h!Y9Wscow;%~J>|%$9lmHNyGf*#R{y)HUrDVP^&yE0g5Vgy z3B=(f>mkm{YBT1gWzG_ca8EKxj;B^=!qg>{!XvLgyfeQ5$<3}>4?L8?GSrf;n`a7!FNOMLG1&?xW{(jg z1H&rC@9c+aI&o^gYYYo!h5qJEIFF)QA6c70#_dQ(4|pzQ;GcP;c(44Oo(@C+o#E?Y zr4mlhRzJ-PsTIv8eI@rq(~CvjB<>)3hX=3a0oAUefEq)U(O98#0}HqDm?dBXh)fA> z4+*cjIlrBk`Rh@8g!Hv*&5vikHa2L6riIv&mY0hPG#RN0;PIIF+`4aEU+BI-F}_TI z$q{^kmYa>)D$Ek(sZ}-5rNar|9k?b+rRY^+oKch|qg(;8HTwhemAY_;3ldfySYbR1 z^J+aoi~Krz*&dq-37(bF$jPCA;soJ_NR!J`fg#jwcsf%qT`}x!QkCwyR$f(`7wJc` zZu#q#e!i-TlY@n*MhtFIuzUMZnO;V<#U~t zNbd?7P+LAFDjdDX0QmXk4A3qvX~fEbtNk`hI}=^Eu`_n>-KpzFgh%K55&-q>;cD01 z8gQ35JS=+Ky5-k-q1>dgj=E)=@x6O`J6mj@mRAp<5{*)nG8f94W#U2N**nQpk&lVm z>(jEB8L`Fgz2K{7s}AUMr+IR(&a>S*sWUVf{>z$0S|&ay3L4WH|JDGcxYuCQt+g(Rh+%)=WAsaZmbhm6AOKTJxRo|*y` zEO9D;f?bScv*IEc1PzRrBHk!j4#AqEP~igk+~^XN%gp$CT1V-9jq1D8ET;Q1Q@w8L zD*qwB1)vEq)$MdY5U>m{Pxn*T{t+8*Y-!2ud8=Y4bABR zdezc# z?_$#_&{GXBN-5^asjT3?yu~w8HawD<9*^yG@EivFrnC%(VFsTS+6_lgBVIn-k?Xjq zZiQ=9@@o&CJ(q6lg~4`#vR+Y^va8;3I&%Ov+$Bqz+F*h)R-3~Myd$6I3BHVng4fK) za_J%)*U9SrA@Sd!yC%;nWC*?SEPGLndazgw7|&s%7s@qq);G4CUao&j<#`L6xS>PX za3%@Dv%_#0?&*ddOO;N2;Ow>7?j|^!(*n=ng0Q*|vQBE+OB^_J>9}tNZ`%&qTohm zN?nG5iEn0MVz940-(GWfJPDsMN>&b4x4cgm$lP>KJE;EFPq&&yD=4+pAdnAE`r2p_ zwN~HbVGvRxz{Or^s_I*K*hIyQc)SK#DMuMEzBN!0X&D0T9N4)58i-Vzjs%un$5cYe zsqkZMau9nAa6G?}l9TwpX=Z3ah%_}wPoyrB@O{KTbZx@?qL;r&Gg~L#*y{Ja+wHc( zHn(x^F(}paE{Gnvw0DSxi(5@CF2;uV3=vh!^T*UyIJx|Ws(@G z>kQc0h_C-tXt-(HFJ_n!yBCnH^~lkelNJPRjehu=SHGQZ?t%E(4}S5vb53?}YPFve zbTQ?!z;hOq53G&#{_L5OvSPbss%GG==MX7~ z7OcLhx-L%FjH?EE{W+W{o+_YQO#6AKAh)}cxEizgf6k+b%G4k2x|q75%^Di# zFK9Ta3txz0DD}3Kk$w?@4m@9fD0Jyu_+=PEc4#0Nla0O6Ka-T*gVaR*Y1-vH{Ai^d z%A&H}7f0ee$xkh-J|g}0%3LE+2Yj~u%E1A-+2)%O#5f=m!JAQ5eHy{1`r=bp*#3k# zxWAF2hS9vW=NUulsEXmi!ZTl^vuhS^#n=;d*2f=D;2VhSwxHT)}GBX zTwx^s_s8dJSRBW_KDjjnQ>1e^E9rRe{(3@t5o71-DdKd3KdI!OS}B1ccmla6s&7o+ zdv7;d;AyzXGNQ347J3Fm>xTn|Eqo&%hx3eonCpeQL;V2zgZ8tMVK_8O60s)N4dYfh zQCuLG0)G$Q&dl=DDd10s2wJxP@ZOMLA&~yS%ABPdLw1dOB@J%rcTr~XrD46V7eVe; z(c^t6ZN`$7E#_1ShEx68hC7z4`xDczl?@9Zr0VMlb#~-c?kl2T^AT&GCiG*)d^jV2 zGP(7x*l7{B3hmRQgHlayv}<+6N?4gp`%w*Ol>7;P`ni!uN}g}YHKU8Qrn-87qjlMp zncuD7rI;(*H}P8Ro=QxM>~{*KDk9Z9ZGu@`O!*Hf*V3k|&(XK^#rkpznGx`4{?Q6I<={KKl(HQk$o-WR7KX0nIXwpz@`;#wSPzIEfPUq@7-dl1!1ih z#p&?O5Nj2?_~i!!NvG*D=Z6zj7x1F85B(deSX-4($OD%bq*-KfuNPdO(}VvBi$qaB zFa+R`Y$DWuav)r)Q}jih9My0d5+Cl_^1FNU^~n*Nd~abC-H{i*R;z%50N6*s!6jr$ zf>L$tB>Nxv$?q7H36k&};gmY$<_5xp1~dErkfe-=kExLl5lloaS)zEXWFC$Uh)F0) ze8(-?x}4ford<*}bW^FPcqV9O^bhv@_6f|v@Mhvc6*Rx^(vl_ZZ`=m^V1R4-D<~7S zB`f9`e_kc|LqmZg`Wy@CyashK#jHX|{8u7@-+beTs4fgW$pPfO1aVDUiaM4*G0e~9 zYfDeV>c?3-QnWbvzeZypV1HK=^LOtXUMWrq{L@4a3sR)~>4j|hLBjQqR~kI%oxugQ zmGZLDli~aSv1G&h2&MzlqLywQ2qMumn0G=5cy()Bv5xAFFy>+IPz6{JB)WPAa`A@`jV%0dsAIzrePZCv-* z;*$yw4`(pyPmpOrv}79webz)s02cY5&tm$jif74u%nb}IADC3x3R`+~DY9Fhkx0xg z_<$?81mmk(&d_mv%si$_KH>nX^SO6^`tac)Rus{pkr~(tXm*#I%2gt2#U?bxRaWU% zR-@DDs#t|% zsl7INAIb8)z2h+{ApUPB)P(U3|6#-xgE}6)E_o}o3<{G!aJxYe=o-ip@{ctuieQ-O z5=Z0G@h>1w%}3SQUh@&1PR_aP@#q3^Xmsv_FL*D`NdH`&bodfGrp{R+F*9IZfJ znZSAy5s~2k<#$J;o3FEhV@>1ECmT?sHXu$dOBrLoXH()#4;5?k#BnA;`S|EAt28Qc z#qxvSp!wL=Q2-HreQ0h|@t5b5d@QR}2qv*6s|WjQO*kmPa&taxQ{j4{Aq zKC*mR?V0K7U@-zn2lo@ATMzHRaI4qr<&P;+SckmQ)u=MM$Z=VF8yJ#&fT19muN2Yk zaP>Y=TW3nVj{kR;;m0Mj1?cZ^oW1$p3bcutnJgnZiR%=q>a6}Och{DTzO~ORW_y~n z>#W97Xuf?90%U=wG2;4!zOxT2%XG3>tfJH`SvUs8^yt|A1Qz}K_kOv>WV9XFOYel< zN$xmkoeGgXyZVb+891Kgj{sjk>VE-^b$#kt;p6#%mRT6bv`(-MJPKpB1~QG%#dkFE zL}ELgKSUoL!jqznQBxhFrg5N|*}4Ey{eQqTAbf}5gI~X4u zWT}x?GER52XPm8o{%dljTsdYpoS?tNzN}y|YwIc; zE^YKfu?Pw~4RJ3MP(O&v62I0rEL-p;`6?5}hTNcTFscl)Jf<>u4eJPhfSCmg-KhRe z*V`@tdc}3rB$LJ9lrrzgh`odLu92;iYh!+$&8}SS?it6+2!BBe6IxeHkBr z+E}i1{sc3<%iloh=F8`Gd<;{Nm!;A-AUJ{Fjg{9$dRr%!JPYi%5& zwCCRukRgQF@a$wN(yTqQ)}DyzbpCT!zLfyB#S0_dWosVy&Co_b(|CD;$7WZX^GB7J z_5LPtMhXANfpnT2-j-O8cvdOOP+!?cmyx9}*)|9_X(QJ{3_6})3)EFf*%+ERP9^&! zxb+a#fO6>CN;**6`toFN=VJ1tkN%@wr(QG9H^9vd`8H5g`)B%mi&u$r;=gm&vv`n_ z4y`6zsSWgujd!|h&9qhGcwT7=r&pvO!WX$^y7w8>n2nH6%q_HuE5k>qxZ<=uKi9|M zzvg9eDd$KDn{VXG-p}JTQ2MlfV`k9nW*-S} z$kwZtXn!kIid;1k|2a#H&zn5}SL^lC8PUuPMz@|horpnrO?CP6=i}u0ToSRU^z)vQ zb)1LGg{38#bViFCIljnrhKF(1&W@UMcx7kv?X>?g)+G{O{?xI(smLm>y^}U#TICfT%Ff~DW_)$j>%AqX+N#P}7j!Q7`wYM0 zRAJo=r37CsQ>8cT4OZHP2Hd4{vzzLVyF+CvhAMh+Tv(49#d{0ggk2)&)QOoS61?*n zOaG<}-p~M?Bcm}wD`Nu#wb;Y^(%bj>+j^Yw?p`fSmtDi!K4}>-c*Dsc=Mhg@jS%XU zwe4T}sVXk^>z#2_rJ*f^8zy6DdXGomU`n1a$x`cQyH!Lp7>ws5_TCBI+14hNj&(2B z=DVTGC4_P#<%lhdowNCznM9wVI8u2rjb0uXS&o4RDn6RCAoG+`s<)lU27IeRgxm$M>m`wN;sAm)S7~D)mXwGIJxUS<6$IXytB{hl7|ReVCBU*(XaY| z+}-S-6VOV?uq;gNr{mx^X`*4~CelRlv?09|IA96=^9;cb7t^w*JzuOfPta~(*W1$C ztyuWf%8+}ae^Y_NY}PQAB`+TJn@BfEiU+W8K3dDlHZ%u(5E>m`-s@MfD3HVBF`b*a z<9(j_IXO5xir*Oe5q4|yl$k9cAYgDXL?K2kX*fDE-Cs~e6R7}7@9t#H?RG|jrNL_L z{`pz0#Zl!Ie<7*AEfEv$5VgbT;^?d0fl_T|Igg5vi@FEoA;`$)PwqP>r>}5F59}qp znNF{w_s8BbvrS8Tt#hWjf6IE}DAumo?Mocdff(b%e{P9Q=IR|C#-{L& zd=yrt3LE0&s4t@MK8!QC1 z$REZOCE~|ikUrxi>hV=kJqA|cMsk-*y8^2v$TZKs73o4c!tKxr_5$-5 zHa+n;Vp+c%RR-1-S!n-X@8FYYpU(V4`br^*q4B*#_fHAp4nxMyfJ$}g>alcFH)Y^& zQ%T)sxcY;QCm0g#`qjIx>gLpF^be(3LS4J;7&G8f&Xh4IT*|bM`jk}v5 zv_1iZiGbg2ax6t396p2ROp;To%kRs16`BOE>bUx5`-ASePPX4DZ+9TrXE9KP4C)_1 zUdt`a&dwIh=BIK4-uUZV-L-Q@Ub=n?y=mU{uVCudRLz{z&QIVURzul0s1 zTZ+pWti5*p%GyR>T`hadb0Pe`nG4WRlh2O17<;lM%!7$EY5ul=s98-|G6fwi zgeq3e&f3styA)+&0Yq+oZ03+Q&NU=H{_^mX-?~F9f;oyA20UP2+jRmr1{Z*7wZGWz zTPDOaL5mi70wvJ<%}slpDoBX}4k@R?#F@1f?!!^-aD07yg8yQtk_v;nLD8y>%N4Rf zrOB~bA3!^kaPT}HaIJS%l7q2!`t?qi-8kVSs+H?liW($WMCN#NvQd%1n41bWZ8D8B zW%nqegmidc2HNK5#ub1%ARH6&)sy0Ei)LtwJz7|S?PJ9Ek8XGPc4R8vo(s1-RNf|@ zLas?9p@b;ZaQhdO&;w}kAs^6n2sueDv^QHXbfw$rS460%^a>t1Q)chmKPav~^UCfD z=I#_utES1k**1A3D__iBDE9`^rqhKE9y$;%0dC>A;i~Mj>t050sf|#jJNT`lz%O8#r_$T>}ik<6)?1bWdj6W0<2pFM*pWW#G z9Ee$gFHHPYlUS&PP-A6HT3i%(1~Y_hcP5w%=Wq-f5)Y&gAf@R3=v@(USDI6bw}@gR z@0BGA6jT_cQF~49=S@QLzWwn(YQSq!AL_LPa23gF|B|?L&D~}t`Jd3a=WW|50!9K^ zJRo)ETUgPt!l{YvhCk<*?orErKavW@CAlXpn25N{bE{BVeH8_5Z!ez0L_cV$rliXt zpe5x*<}*Sgv&l@FSBOX%nerGSohg&#H*pnf$@&L7Gla=HNk~DIclV(r^^}~`ziRI2 zjIZs`cqo5#rPkk49-5(m4>Z8w*Jeo*=#u5mvzk(v&YBK}3+VL8In@TK9bmo{pv4b6 z^iJKcgubQj>u80e!h|nWxl2O}$mACE0c8RCE_}Fn=_(kz=1T+Myl*b#_-<@^2c`Dk z%8#m|a`gI1bKSYVuFdO?`6H6I!ryO@c>N3x3V~MtTn2{Y)J_sU+PKwT`6-cK<1|O* zbyrqh?I}Nq(3=5LcK17dpR25vi_Lm^TQd)yMbu?2b2SUw<5_lI^D2JEevUnNC154W za}vQHK`0est~9jUiKVN>Az3=yU4GH{pp1<5FIMz{-WPj! z`6+d#daZ_$JH98G$vXjPUFkFa`UV-9BUK*43N2Qs%lrpffpZOQ>_8`9?(?YWtg;?(@4@D+i3tmq5s?P9 zD2p7wzCN5L<3U|~DHAzJCzRHj8c!Wu7*on(&vC8PXLkLN5h?vTk$RAi87s+4urc-+ zeOL`qqj+8MFk0IG$qC+<4QHDubiDMUl+_|U%E2~T3w!f~-Ci8axLQ899Xj_~@;^`2 zZ^+=h2}8hu`|gE7W@h_mKLXw2R}q0v%mPk1G}jqYTq9xIJjfjDy4yc=Q-bYp*=y)? z*0uG~zv4#9ztkz_W16!Ey{hc|CVVZ|V9k^!4#*4(=)#%24v#Iaj@fTt%y3|ILN=49 z?o71Ik6aj!Tyc&U@Hjm!;J*j7e#r~V_dpGO!;DuUQb0U6g;LCofzUlU!rQRAc%D&YK)BGMWzdaiy+c5X4l{BpH7)p8|+_Ufw+Gpe?wQgMcOZD3k4|wO;h!n?9HMwLV*3ne1UJr;=QRfU1m@* zZ0S?cYa13 znZjF}1}COV8`G`hZtkvYn@Px&rirShkNYI4YZHrEPuvByRIj5Q-{LG$#ty|))LmT7 z=&Dhx5d~0k2Ux5N$~lK9MrF(`HZT%Y;+PhUvB`i8MA%*~CwKoE%4Yq7PLuso#dRxp zdP(_lTvw15F!ootx9PyR9bBf!q%Il|&~c5E{aQ*<-B1`k3qO7Puj?<|B1a#3^ks!M9l%pq5#_M=9~l+~>Hre&$(-BrK%%W}lomPUTl z5Y-GI+hRHV)-6R_9)r#@Ai4i(lMF+OV5YnyeGn=0OWZdq2E601Y%8OdNu}5AYsAVQA*hd)QkGutZSVaA%4%JTaaO-6Jk8}pfC**?s*5u_fXfwkUo*&9Z` zH7WLQSwm*m_T-B7oXJu0MVrey_ z(45Zb7=7%`aSl4 zK`|5U#BH-`+EX3~GrxsaI6Go`uD8y#ds;tj#$);h%um`bhuh-5I1Y59_uL`?7iqmq z(ukf1tGaJ{l=g-m3xTQ4IHcxM!jZ8uB>5wYjoWrM?k7Ark`=O<3x(ne87+X3PGrNOL1<#*mZ%`ftdJz|J)YL;#Ch$4=%e1w{ z$WY@H9&Ok?0zn7V*Lsd?XrK^B#Zey;{Rd;@{HO3fjFOqDiUx8wbo*0Ol~nJ;vr9L* zeqR-IolU|5x)U{v5U*Swmx${&&RMzM0^Sq(7gU_JN%-)_ z-{p**tD}Z&Y*{8dgaxr34bw~{rdh-B zAj6NpJww@FPDW~m2g%$=LeO*MWcr&vvVein5BtoLA|7!d*93Pg?C=bv zizB9JCFB>yEhlpX^ii|DW))a2Sb*5iOmm)}4x+dz&0 zo@-744x4?$)!rdi#fK+u@czAv1K}s?S*9zjObV!GIdOn8obCr2k>&d62(Fu~#TgPa ze|vkZ2fCz1k&X*3>J;tYP;(83A=20@;c}yQQTCQ@Y6@#_XS5m2hhr>kLm6tSB=~J^ zTJ~I8t6iXulUy!J+9k=s)fGx>j%H%YJu8;%g4;3}Ae|4SExpf=-c{aV_eW^G5>T)& zre*;6x)iJ0Dw&n4Ud2`BTiN{5jDwf`a{;o527QDm2?L-I0Cq*m9- zm+nj^qOo|O>%3TlT8x_kH(~f@+3vJWeFE%%nlcPr5*qu2=HGBf4RPAm*S$(hJLtHK2Cl{&6jTOVeI6_uC1 zTrOYewp#D~d~n=2g(?~3a!f+C=Ie}#z4diWgf2oRGEjzx*7?u1-c=dGAK*r{87AUR zH3EA!fpJ2YJE?6>a@#Ck4fIg!WrwYX-Mjr}DZ~~KRNSZaU&qEtP*nVv zIcJ#&@?JHr48>;85XT>B*7#Z+3&;$t@VF2j_wXW&M2{)0~7Xeyh)GYT}lmF2S07It>nge50?} z-{EJ162Cvg7c?{Y4Mf()=Xu*TRNM(#A8v;Lh`?_C)C$<1#D?eHZ%}{PQji}PxzEyd zF5;(Wwh5=aRz+K3y2--lSs~P3reCRhQ!)O^TP*T|>xVg^^`>yAyNPe~lB#jQU_RT%7_-om7Oj;s3gnBfknsgYPFD$>Rro?#R&y&1c>0*fv()TVw@lTg|`Oa z?6veFCK(CT%5KwHu_lT6nG!rnw6Zomg*oMaQ+)m>BKglMBit#^Bb|e$OmTKYD`MUO zo;xQi-mRN6$_fL;lqc}O@L9zkkx_<(a_I2K=C3-^uhH#@4AESOjS=4-b-4^T24D=W z`M6d338Xn_h;LzFKr;zuy$3K)3En0~b>6`wO3(^*Bh6>$3z zTJH!B%3zjmUMFk0?bPt)T!|4%Pt>qGqnon?cJb>Ce_6%1HV(D{@+`y)Cz6tv_ZRM0 zK7PBaye+2?-$zcTW9-CBR>_2ML25AOsm{`FIB`c<(}aDRzh~J&7RWVQ#sGW&j5I_O zPXsTvyu^Nz@Lx^Y51PoluTMG44%!=fOay)u|vf@dJ7*@+% zs*di@QUaj(O1|T_Rz3Cu()oKqt~jea0;_*xZx>;j5SWOcmGKfx(Y9D$p0(VN5V-y6+F<|ffY&pE8OwD74C|&dCkmNZzx2a*7%zm{J!|~?rd@yc)&pk zG3TSDCQTQwyuIGW5gIk3gC#p`p;+NR!<0PVUb3*v^+B;u>Lym%(s2}|79lQPa#2_b zDL+$wqPs!z-6clamM6^=y88ThVe8^*>@Y6~!C9Q6O*G?e`9~qc!b5v=d=N`?^p7Ox z6{QhzbL*Aoa(pKYv&_o!5x9-Q;xjY1@KDiwL(sxyTtfUC;7ETU;a}L^wJ`ARCJs-= zwFnszM^S`KOEu#+=+6^y5bo|pLvgGDgPfSk5jw+?b#x0lia;pCh%SP zoxHN1o55+ggyFAE)wu6@H)mD41HfM$6etq@)$D<;`OO>Lz?qz~tgb1HM``ADU6~qU z{h1!TT>Q@seZ&02qH=<&_E!pxh0>`C^!Ff*Ob5r_Af}$KEe+d4;`;pC#e72##rS%M z)7949T7`?{6;|CVJ{uyGX28E;`cHQD=ZXLcNR4)mZX86^xyOacv>;{v-;;k61YHqp z_C@(O@s9kQT&|vK>1UejKv~InN+uzzxa2-{`X0U zz-9jA^a@d(hW&)n(97PPdt*)hDaMH@=IAN^j71`8W6u@^ z&edz(g@%UK&7jHApJDJx9jzOLk>7`txYY(H(NDXM6|%vzQL*UuDFQiQ$-{X z59f!P)C;=?n`e zdFZEs_dMcLOXLKictDvY@T{lCEN2>`wDYk!plhhFmw18A(!2{c5R#RI;W{-_^uPHU z|GR=qc)oKq;jibb^Ln0-lf$qW?Qes7fq_fhT83x++>Bq z%)gyXC&~Ph63;isSD(Q`+S07pi-?uP`8c1xdT!`AD~HrEl(Sr@ju`_-vY-M{&CAUH z-sOLR1;Ri}5d8@`L_l%$=d`!(8u|n}y^G>{MSosC%|HIZhhDW+}-NH#aPRF)w+w3GAqmy)uj%`)gv2EK{ z$F^+XTTiCl3U;2(2@^_|;+l0^BG`>T)G(}J}Gv*ZCbC}wMK|HD-w{ZdkwQq*L;1=3VA zgg3%2kYP{6@%eC`J}P@yaJRcy$B=EMHw7wuhiq-wJYZ^AI(keQ7kcSZe@*1d+2L}oYZI$Vu~oiGFGfMS$#zxX*}a4oM_ugcsIszhpp3(KITRln6@ChD zx4Xy*6qxk3zZv%tTNrv+Bla!qtE<4Y0kB#}hvzap)CW0SA9O?f6lreP9sGaN2U70B zZLXvNx*Xj!;F=~8X6!gv{t-PdB-t{itYx2l%VTO0OI0DUDh)Kve2@?_HJV!2!S2>z zP?g%R5Z5xbsRGOROFT>)IvKajBe+!eltt!tso4Wah46r0IhtjquvuyiOT%@1++5X3 zd&Hw5^15G-`YFyLz_2j5SoQD#3kM6x%;LXwSJ^wNLG}J|uVv*AdH?@pNn8*lm*BMa zLR$HR|C9G?$UqeB*UvAL^N5GE`&j7{Fw~u0ix~y@SVguv|1?vTa3vlyv20=A%IbxT z+PAm@Ne?k1Xx@d*j%dQs_0;7<9$fVUod9c-jY7{b9Bq6av_y5>Bq>>SMlSQarks@Gsm#zU&-h91MhLWV@iXIT#O#583 zjQ0VUKh$wnO4cwYsF0+vxi1}$F221sH(5lP zL16ut{T%XJl_wm0*zoY+q@+%Z3HaWaIcx5!c^jns~aMhCZkEDEjqdFCu zn%ct0hp%Pl27G)=5X|=pkRg1{Y=3Mvh{BrXx|43qRK6~kb0z|-z3~s zqkxoM(YBvxAN?Lh2V`g^rIb0J_5&~nmE4;wEVpc#V+GW@8m0tM@v%_Y1;Y#`nWnd2 zpP>^maY{~5SCW^~;Np8swGov&o@w<77oD1f-ycjoP4lYG!uP6HjVw!?TXR(3qV44S> zP8Tunya8n5w@gm{B&1E=p|$p(m;_-JzS#@+l6#>^byu(JS+f0q>glQjO5)#fPvS`=7G zv*;n{+uB_YK%G$mKJstT(9~!UgVmH}8s6e0I)&33l$B6p@|C1S8k%}sw$*hnms^K^ zmc9weUkTdMG#94@BZ;$?xY>dKcWwd-1|pj>0#Ev|$oubXMFa*M*(Vjy%#K#R0s?pu zws1>IAxTA#fZXRb{FfgPMF{|k+@dtmParpLB}WvVP&P%xTu)Drcq&>jo;T#d+1Qwz zV%j=ybiE;oMLlye8O8k8Jz#Xl3&!T+`;$Tap`PG98e6NZILF_o_uqeu{9@A z(T=RG_lb`H7eq2omL5YDg*-3iLG^l$ixFSw6Ab1r*bTreuvwuYiHMml#6T|NTW_Tot&+jYkoYwr0)+!4c z4=g2stB=P>KwXmTm)O(yw=`4TQ62yzC(T?(QK~OPl9_m{V3pB%bIPec`PqeaVR1Pd z8&lV!9WjTxlC;1RC3W5pmX^4R0_Jy=TsXPfzZpsY?YOoSk+VmtqeAJ%|1D&)g~5?X zJ1wUY<(%2;rFs#510Ex#>AySt!`!y_D zg0Mda906w))v}tv@G|jzrt&{dMzm#A@^OeFUNepR&y*9mR79djUEf`|!Ji`#n-PMV zd9TSa)YU(RItd9+Z1}JH{f`j|X^{!#+*w_#=JEd@wQiF2CpctMbs+>S>=YFcP~(6l zgs1ptK_;6X1*io@-(g<=>pwdla6t7>ao`|IVmq%p37HH6s5u2CJ zjCmpr#wgrVp)}ya$U`?T_GQqVtg!}^+v(rvAOfrZq*2bAEM?#S8=*A;q`-lw)^3@I z$G_`E|BV9mnqWX6@5t!am@*{M#%R@2#*d$iYP#?Z8Ti@p3hT1ZG2F*aDaT7T&1j4C7albcL+zL!qY&t$uJ^@x4u&^U?$iRiGmA{I)-SL7K2O-Aqf9OZ@Lyakw9@d9fZ+`|$>Gkou+6BH<4Oxc# z1hrzz`@vHXmw~F=#ct|w{yj#+=29k_nub0+q7MZEhpQ(}3^UENs z+2vOuyTg^$)EoJZ6>R>b*ig#K_TKh+j8$^dt z`<43r>W&$+O2 zGr`<6pUcEn|7iyr#XzR7FI|*P-aLB-Z=y`^rQCiY+eC-W*vXPqt)XdE7?LdReAO+J z;}`%<1ao2SP*F@#qTx>?{@9n(S?(o~i=_A?o?%H$S`kH^d}J)Jvi_4!8BdmB8AJWa zol~=f>gYB4;wM%fLWt64leq(wXj+;& z0u!%5+`@0FJaRQ+IzKA?4vZ!^nM_~K017k?(yG$XZ2$(2h2(-fC7J4J;BclHDt&hS zdg(n`>v)HWvjEX-RG_&?Z8anhd$W4Gr3iM^$e<*YOsDORWdD%dl?aNtUa|1IZitWt zMYdD32-}+ILdp59c24B{)^V-JCJo6#vEB_z4>)z&8OQ)8t6}d zsdt|Hcj-RDZNSxWvN0X)QrUCvQzk7Go3iyTqBIGC^+(h(!@RVD zb^YYZo~4x4j@BZ zKXK?+euyU@GD7{!Y7R%?gb0)oy1^JA7tr>9k*(dr+dB)ku7229=sVF2Gc-~(vkUf_ zYz)t#9?wfxuDqSUp=fY*3MLE)C2#a!1PynXlD597{Z2l9Gfv$MP}qOXF(U-VqtBDg z&tI23U8^*;m0@%(m@SVR%9cfs8^i(RIgdJtf!ZgCbZ~TV)%6AR)pONI($MrttK|@k z05ztpq@rNK4xY>gb?=z4)^FwS8(9WbIJ05@C2wJ`x|mJD*P# zPZQTJ4zod$kL+q^fJC!cMLQ#HAee$Z@?#pujZz6-2$8pY6Ji#k8G0iXC;h_^w8_N$ z3c1F7)rQb_76p29FB5;(~Y~%Gv)Z#_`aT>!xkni_H@v7FVYDf#tht|MS6aI7faA2STt^Qd3O33(=lmLmG9oajKoX&dH zma-y+nK_|F=8hF|Cn_bD%y~$q-Il*y^@*%^^ zKem)-=OJG1NBOMI0OdtjgMr9fM*S0h9?JbTMx3^pEfV={vsoT{p}=1GgG@b%F+uCW zVfPD1;y3X~1j9BLO2Dx~)Mrh!U3qZ1;7bvgZPj$9h}e!+0T_Bybyy*>vy;1}9F}YS zVPkxIefwL*J~Q;Vx4H7SAnDuZhU;5YNQv*Mh+#=#Thq(>n;E7{x^(Rn<5{>^)Xp1P zWD&Ox9S%xULZYKF7(!Jqd~1G$ceWVWApD&D&>Ui5P?VCd!vJIgOADupkyii>h|}vh z{I`n%0fTo2c51>OG3_8=vQ5 zaK3tSmsKt#g8N&#aol@P#_I)(E@qfEp99+dsOs*Ss5f{ydF@Qqk_6@%SG9EU9_3OK!{MEIykEmmuF5QCS#znas})`-1-42~LTj1-`nAXDaqy?I z;znv*PST_MuDYK=6@$Y!Nq_|K$spMVU zKb&u>YNw`V7Akwm_Xi*~1Gn%E?q>d6)?57ZqS8dS^yVAqxvT6(dDQA&%UCbj>KCgs zST=$21w*W@dx>Ve^hvArC;fsU*aUK-m zt+GER65*BM*Paii^c_l~$Zm<|4qAa<-K3tmg7MC)!tPs%H$38(u$MWXlfoOr+-ZK| zwvX^YouJYv^4l1*kT1zn2?$#x)<4h?L&#LBppA%b7jPzKNVs6G3KJJ1ngsM9*5{#q z`3bmo=ONA3+-S+kzu(_=Iza2-Jb9ZrF1J#xyFnqN=&QhFz}gNo=YLwmbXQ&7Hk0${$Ex%wBlBgIHyG+?521EU>bN(&)ffn`7#t zI67FiLn(;>1!~2MTa-LnI~lfk^w;Z+y4Fv*$PBR7s#}Ze1ri@#l`zS6gjkm zG(jWp7>to`NoAR@V5wFTxO9PAOFC4hJkc=&mC$i3Y3Mm-LK0nYI7=-0Ns^b!)34TDpD!QIzd)aI7p}E znamnp{hE_ir0|+_|0q5~+Z2CMV!a#cn1@=umO--7z(+A6im5y4B4>r*3;PYKl%BoO z$-0&HzRqF?dCYrv5palfI*xsX8)ZY)aW*^a%3s$KuxX?5`VbrGDvG|+36~%ocG=gf8%N;$z6-_r<&@f z7LC~f;@DJoKZh-~a^WHz+dn=2H!4_T2ne-=)osUA>0jjt0BCXy+~5X(;smwoD>~X= zY%Nsx-vl$6xKYwX*=0u9f z$J8CoN*C!Ml4EC27T8RM!}>A=I(> z)tm7ig=Y-L4hn&a68)(3JrDOj!}{BmFnWnj?@>M!X#UgBdt>XO*3+U@r7rqH$QCa< z?H((O+e!_GhcsMN{tORfO#1@&^AL9|!#n?3QFqTDAB>?0>#XEQ_uA;UJMB&T-*h_p z0GdAKuo(Dt2JN0d!7tCtMEtphwqHN-%leP?VqLAdSJRg>rkowCX-5XN>g#X)7x2nF zEad0Cl>IN$%U?(E7B4iDI_<+Z{aNp>=`7UB-*zm;Wd@g!nslvYkW-281O!nVpnc&$ zeRVzoEl3!$7G!^wn15BF44U9VcJ6?%x8`&Du$GVC@txVuRPJiz8@(@43ugxKh?G_3 zEA6f|%AAzvx;b1lM*Zwo`@|P9rXH~E$X6fh%ZMj?su?)vgdPY_Rj&%APJk8TMSQWK z_KbH@RGqL#?D0xDgp{Zb&M5u~IrvTeDJw(QK=*$i&JFHOWBt6C4}!K7kJzI80uZW8!TyCL;4WX zN=X&@JVSN1I5)ji+YOs;690UApZnsVn>N8QwPGn}Vj~H`=ZA`}>+7B6txF*NsZ72r zXviW3#Cl3O`aUyv1z>>`za4ogef4h7hTN%kqUbQlVbZ56ZT21;v@B|_@{Q!NpIi~u zZGS>hEVCvTwPziZ94OB-8WS)R`6N#?^KT@#m7# z!(3sk)&SH{42zS6Mxfa9aOu;=?=QTo8dE)xeEfob^G`TSu7J$@O0eNw+%R#l*E@x# zh(Dff^swl<$72yc0HrlQbKeWD#f)*|s~vVdj1z4x=gz1tkLMh7eqeMEZ1IL8^Va#@ zr_%y^44_v7D_}QWQ`LVe;3OU}su;)7V#%+H#fb?ua(ye8bf5E6ApAo}um)&GM|H0k zrb>4xfFjegyUznddqwaYhjOZ0Zf+w2u@Wj6V@KGN|1lLV@D&wpLCmJL_$~jrT$?-7 zsk@yc{qSsijsQZU%N^6tg*m;2sI&BRc~)GECr``r%?WAj(Wj8-OkBb)k|W{=HXiB` zs`Z%+&AaIuZ#@-7#LyISSC|@mwQ7JsUB~+5a?CzbS8Nv=Yb1IKxkKAG@~>v+XXMK4 zJd5N@%Q-WASIWds>}T%#9Qb5s)(|1b~~Zw8hbc+7I8oCFFHymqvm=*XY#%O&@j-eJVF2(AsBFt zGAPSdnQSG(DJjJox)5>g^JU9+FBF`7Ar>4A?ru5RN8(cSNsl4hhAI*^AGCGUqv~;M zl_w7OOAN@E_T@^1p_k~u#KKq3Dslpm|EZ^DprP@@e;qwyJfF-fvjmg?qqD*1xuLv$ zIaPihjDX>a>J5(@c`o4oSv0x;t>||EHA={eUFYEqltS9yWq=P7laSu`4)8vz)|7NB z-S27o>-l`Z6oT7*5W)u7gB-U|6rpuj{_~ih`Q$!VCXD1BCXArqzdYgcV~e$a5W7T9 zaM&u=$=q7*DrFJ>X|r-BTVTem^UuN}M68E$Ux~pl`J7$A2Cab(kB&O2I=O3zwe*!q zd2znzyOl4vhVo{5E`1B?!9~5k-CPy968M>+KPSZznseHydxGfRxa~L291I3`&9ni@ z%ctuFqjrJ|NA(==^T3b|Pi$(J`5g)UJd&X=EUJJo{%T)W$jo$1@5Mc$>XapI&0t*V zdBg$AP~jTDc61oR03z<|)0*v{u}4;cwcRP*0Ru)oDX-RBk*h(IfEM+4LzK>-m4GgY zAfS!+I*z8Am+>Uv`)*Ii4)C~H$Vj1iIk3nM&9ePn$QnTtp_{2{QFA09Gqtzjc{19; z(@<|SD#_;{<{rb573m+G9lgx$eUb$a5;@@lDy^x0+@3E#J|~NLkRPz&3HQC{l%6Yu z*e7vdco&>e{AeKny4OEW@n{se?BVYqM#PIT%*N|XEGeO@8I)5k%RobcRle-g{Euss^DxYm) z!3{v%Y%K#zUFJx@p%&9kMhgBI_N{ci&M*Sjs?b6yNwP|iTB<@ zZ3Z~lD0Hr4zq#;K#UgrA+j{rK?oz8-xpm!GB3fO+T)2WqCzxiAW6;G5x?H&2N|Enw z!Q6Ex5AC*F8)TdHRFeQPv~tFT157D7)rLea?ogf7>%cmpq+~+RqwCi9{fa=UDex0i z(5J5f{OFzRv?osFQHuxR}?n^sjcBzFj5q)_n{L3;0_~TSZY@7xVOR5N6 z5rMj&>7AN;N1nD0c;@ggx6+I?^iV8qI4=H?#4{Urc)|H>% zo`lq*g0=Z+k6llsz9*;6w$0Y7>dts+3x$uU7W=OULc6$KmS<5BRxOySrm!S1u!cVi zEJq(8+=pp6O-909ogiPM%OoJ;7w=FaTAgO1nW47CN(UEa-8ppQ#`$9glJ33m+5HB) z`y4Ch)vN-LHg53GL!+MP`;%NW@MUx*aKAn9>Z9DbS z*y=utc6m^HY2jXHns~BVc_W6de{?{7d-UP>fIR!9+eZZmp5~D5>Z~bKDp?R1?#>j+ z$zBAi=n@~Eti+()eU?ju-@YrSAvO0QS4(F9)QJF;tLndv)_~^Rj%)|DpdfiO2oush zSqb%~ToaNDdb;1}LO*)g4IE;8Z5k)e=4h;ZB{MugvE|h2cxN*12|wCnTh%Z(+n}xi zR0l;}GBK7^G!#_+;o>pw%cdF?bh_zsuFgU|WO#((`s}w6{Vx9SQ32Z`ySKvu*gr4S zH!BBJl+z6NO6;+mGXnA`#v4o0!pN6DV84@E?wl-_e@W;+Bw#= zjk0_d$E8`DpJ#|G49`O5HBVO@jX4RJc{_@PmoDfT1WE{YBhOLB`@~^>3^OhbE$$9J zT9;6bLA3K)4VT7fR!2;pZqrFYvt+J+E13c8sbD?7S|z(Uz8-MbP6#B~*{sw#kXGu+ zynL)lZf3nM_1zF)f4<~Lw@jXQp2`{~!m$2yH(eW*GI=?up;Y+2QEwc}^&WVfWzWI+ z$swAva9}Wddib?i_%9R;gjml4TI{*yrPZRW440rPy%@0X+OGepaOd+W9OKeA=MQ)v zv$`-n|L u`A@|=O=xQT-j&1{_plb5b~4bq&-=Iihe=;hGobfhgS#D%W>u76wX=M1 zy!mkJv~4oUr#!o6Sn+}G0({=?# ziSmaww#6OxZ7r{nv!V3m$uAH}kdBe2ZpvHz3rTeW*uY8|+C)lF7-vnswDKrqJ!yEf zwtT4q9S1WEm_KZyx&~gT43XN5^SzM%_(TZV*4h3?EFHlSRo(*}%Aa<%fn#l)5?iNs z<12Yds3=)*egOO&1vrBNc=<3NMd+Xa^YQthi?%Ka|1V~vREG0Mv-N#~@Hb=An$;M5 z=$FY=03-AqWREv;?fJnmf9>h^WaN`gI>}hpCO6;t!AmM~O44~{E17P=i7bJjb`-j? zdK+76;=oGZ9re3N&DBa9K7K=1UTod+)E!VL^O4sm86KEf{6WQLvb}tuhRt>q#Zr8b zJ#ivPY)^(5Y&yHH>yo%(9Y6C1KKXkL;zn-(a>6?!BREI!jwqp1lLS)jGLG)TM7HuP ztgb07bKzab$Dp%Fm{Ch^RGiun7aa`3!OfERZWI1RLr{WAWkv-F75&w|!p)N5K~qDM zL`a1)29@H`0@53KY;n?gUv1$duEIqH55HGkKlL?Du$lDe#c#R-pCSFXcM1WCDPRFU z=cGtS#DDmlns+Iz2r)E?iET@WnWzlVXkyO`PUSiA%B*RXT}njO^L_=;&)255137y4 zHL3h=<48V9|A2tLXucj&-+uS~N~eD_n!lhmA2#MMbI>t#vbQ_g+hU`AyOCnl?j~Wy zx6iDZ$eV8))x1^q8Z3GOz`GRFQ8m7lDq-lr|7Ihi3)MK|_zaEF%qaji{aLrXZAs3(S2Omq|SF1k&`0-8B1NW?ZIP{C? z(=87V4~sG0VIq6=M`9t*-VaA-CrLl?m@=)TLW}4Sv@~4vKYbrd@f$zS>Kh7Rn80+b zLB9%B%S}|acU0|46(9W8l&{HBOid7kSQX&txx`bzjRyO{5zv`wt>Tm=;49>V20CVv zO^Y{W@HJxDAyCWg60kL;pk1g$LtNBv)&IS`il%qhH_C^&sY?LdqX%`fb$%+ ze%x`0(4*OXP-`$#Z1T~Wu#?xuD_V=|^JJ=F6mG%?M#K!0Nn_qPP|7q|YUw3(raW>p z=X==qaRAoQ+*O>Ho|cmtXe^1}*xAX9Pe(v0vvs{(MK6h8gZ24&(weOxse7nHojm@= z@Ih*;5jrhno?2OB`MXr!0;JT=(!={N;13y;O~Fjz!Z|NrPph9@UKTIPH=Nm7Lp7}{ zxh4>FHZWK*;@ErI*enaZor=WeCw5z7TWEO?0?dyfSXo=22d(JZ87dF`!*_?K(D z(x5Uf4De!Q1um|QXXN_g8((fN{Hz+c97jL`&F&S+MVT!`EL{l7?-(%6mEeG@G$66r z6iPqH;tR!cTfcL54z4{^H{W^r&TC|%XISTKGhhg!={8`zXlFQX1H584;>+p;ye|=2 zIY8HVx}}^ytwkz){KgJ=Ui#|HY2}05_SeO#)%1p%K&{{H8T@;$XK4GTw#P$23HeF9K?Vg4Dk>6$T4fHWjSx|S zjh$$!^SNQ{*&ah>1RJd=f{A&+UZA?4uXv`|S?X!HEZ#mQijIaOhIm$2;te%De+!js z{g*TV5_F){7uZs0M>3I2IEP4L(r%(zWS{W31~%W`eYJwcu5p7AUL@O6xr!t7pUyYU z$Jy2qwYg*ZZ^;7qET2Sy-J!YgJcv=ky6&p&{a5nDSbg*oOzb+!m{s5a16ep2Y>Joe z)*dde0|QZrf)v`lNn;J%GLiP|hekDd!p%Eu&g|TmVgJ?ZY`=*wA&8+ZbeC*wv9j}~ z6Uq_BTMT%cO$DW7gkqkij=3_Ay@(H}sM}#sNOx;W*H+*!?R}te2US<_uwQ~ANA9_U zocHk7wj*cm2h1__nV;fy8!XnHNB=_g(xZ&CtKuZeJ&cluJY!6JW`42kHNVp zO&%P<3Gd?{=LG2;oR{jpdC@KQ=*`@4jxp5-yheuC0;HbQ;6)JQMJ!;y`kqb8WWP=# z3rdVGo&naM=!@A@IC=g!@fW9r+$L%<@jm7GcYcCY9HgUj5{GBFfz*IKK-t&z%%+56 ziG#Ou5s|6aMCpb>c8?wfT%nE%rKREX@J2fl5&DxD=y%=U;$o4+Nl*D-=^&NhQ3jXP zAkURiGY%Q|Q8Coio_X%$QxRO*K@UKY_P6xETm$^>5RbW1JQLdT7fp+)gSOC0TcfG8 zF(Bf_!4RP_hVO*<1%DTzL$n;-!LxN(`~-Q7CV64Dq!+2kH!W zqh-n?kK<_1AYE8Ot1FbH=?9jyi7ys}>UfMr@aVugI6k-C2f9QzvqPX)#oC+qk?3^- zNG2fkE+xzdEAJU)hJw|urY$KkH7FYO(nMgsx=*{fj4Gw(Of!-Vd^jWsa5$;!gSDUe zkXYy*T|E@d?z_Q)&l*!W)Cwh=~Ic^wrODVLfd=vrJyqWQyEvGYIGCi;) z0y<(DZ(e~Bg|7$xC*z%n(YVMU351OIv}Ng37g(YguBG!`$O9sI@h5&OO(TTDOEVYG z2;Gt!9~q26wL%8-1Bb3A^qszj;wexHWcq-bZ*NaO!4dqAU@r7gT0)TM#;zp~c{R3E zGi6hM3U>OI2XcMSY6&nDUsk57}tt7$fiAwdy7khf7KnpbC=K{P#OU0McqI>-~_c{>-g?uwNyu{ZVv z&#FE|XrO`Xg2zXyk{&KO5CI84V(c+xaw|r$U~MorR)mwTC%(NLt|7yv7EdpmR>{Uz zn#+{5n@0@SkILmev5!YPLKkDr&c#A4mnOHk1ZwnzR>zELmDO;8Pc?n>HtQ3-D|G#A zWs$HoJAQvuk+Y>jkyJ7XAucL2yA-qxRz7Hn?)RR%2ucE6l5~NOT=0o z7yNc^YICV#J_|=gpUuIUs|hax-qVyE&jvn*FqFhR1%VA3kt8z(K}C%^TqzSV(%EMt ziVodk>iw`?&fi(*t&kEd4B0fqiL21oQH!Q2^YxfEDSZlp30q%H_sjTCecj&iOB?Ir zgWK>GH?OxA$@;XU{V50{u3d9c8BcJ&{*T}9N8MB^cQYQ=@bnc@kmMUGRpSPQkutK!rbnz9&+dYdkr ztek@0Cro`oiEL4L;J|xMYJXpdocIQRV1)kc3h`M1Nnj;PYMO@N5KlFyC5;=feXsr+ zHOq*ZXPogBtwe8-sdTeM-ye+KmDv6#g_U&zn=h$9O?6#f-lk>dTIn4QGE83dmE&ij zlOFndyZdw!%M1hsK=qnC-(pH;W+cmTNsX$cYX3G|Z-AR2IqPult*Eu3;9Jzuuh*VW ztJKp{MU&7B79LzP+isj&&WVN;kQCm1oFBwVWxl6)t&rAu>74Vb{xJO*wU0LaUxum8 zpKty6_*)H0*(OjAbRs=5-()0KDPtt(M}O_Sp$9i}nhRwFBrVQB5CMv|p~3bLRjq=g z<8Pa5u4oG+$}|lmziYYq?y;>*L{`dw|B&}{{mK%MYdibfk9{-Kt8;MVsgtE(ZdF5_ zTB<^Ep94P#)g`B>AE8?~c|i+XH%Poa7>$764Z%c=+1)5kEWw#fRBY)ox#X}0r`Qn4 zV8&C@Qv4cXx^gGJM*iiS7kiT1ECeBP;(@#9ogBf^?};IBeCCx6pf%1yQ1e$nAeu5W z!`cML4Dyy~1pM9xHAgIHC*4v0(wiII!|t$Hm?C8`)l`W=&0h299j9VIG8Zq&O@tw3 z&2{OMgg6I52+EkmI0u3C^Kp^hawB%l@+{0_FPRD*v1J;qOd=^%E}zIW>D#l+$>@yc zBf>Hhk*9TKS*R?Qs^dX(ehos4GW_hKTG9dG<}1|D8g`Plg^Fxx(?sM$X4SvT$KMFcW!z zDF4UDK=KUjUl>uf7R9zC0=7aAX)rT%GZp=Qk^FO6BRlNC8PmN^<`N&kL9a&>I+SHG zGLe*Su>DLm)mNE%iS&@X6Ok8{AbqRsIZKF{^`xd-B9roqwj&QMT!~mxmUf9&Lxwd; zb{>LUa#S$TZ}GQf$p&CG#;NErh0>u zEnm@3mWw&eSaIG;avc4!pKwGA%q<*9lbYuthyl9rwhhgD=Zi8bqnroD{I)-^>k@Or zxk}sRbzI4tI69bD#&YE4Tjkr!){aYh+k}is*lh;J`nzLV?UmN%eL1i!V7x188eu^f z4GYKEx4XyCGkNWx_i)~POd7(`0}7QF|?0j0ul3yJ7GtiNqN zEH#Q51f7g9H@U}z7%|fMPTGj#Sq&o)#Chk&k+g9(gjxGX)jC~}=<!}-I;_BZ%*jLu@ zL@;(xpoZqNOjA*s#s7*BJX6RR0LteBB5vN_qnwh%{7tXVHuOZ*jS_)0fN=Y2-I~s` zmqU2#B%#KjquPbv9FcrN_>4m(DTAkemXT~tkSrEiHQd6`h+!dQn}{j}HQ$I`<=mHC zvQ)!lN=1v`6<~l?D%z#wcmUqWYI5S)%XRHriL__trAn;^ZM&qcSH}LSy`mEJ3-KYe zQEiQak1RYouy}dC7qy&R?)?0$>w=gUbZpGCG$sx+1PtN*diH48ff(A#%B)XW)AN8! zEBTLVsJmDf9*r5<4qsZs=heb}$gy%)97{Wm$Bgabm1^}eFOLD50Q9*%Hm;6xp*9o7 zKqBn2nO?K^Jx$prZ@}m7_T*X}HX(oS&n7AaNHw%g*z5ot6ys{A9eg@g0p(F^ccfgy z$~X()2==1%v6Ydg87LZ*GY5(V5YmPIAr;=U-n*-_K_aK?@!;>QihH;|NnZR-5%HeN zeJz8J5^^#VyYZ}(GV?G#|H!4<<*Qv3IN^wd87-Gv)?rIFO1sk>sfB}}Lh&kh6N%(u z4XCnO-#W$_!FAJh75or!x-EJxlT&nCVhncX7pFua5MeJEb0s{i9%%MaKw+fx%)#;) zuNzj(`q&q+;+Q0)^3Y6Z1{yQV?;6`3-#3|Ak-hEoeB-RzgKNp2py4SQ?QD-aTx z)CPWj0XvxMtz%XUd-8;?M%Py;QhE?78MJID-Q(?DT#O_ypVC98XCUz9U)G$LUJ2P&^|Bdi^-VHBKO`M!Dymq*(T`jXP6RdnU*>Em>LtWWODH}ngNHC_Mf;j$uYRuS6}uWxIBn|hK{z-Yeyj^PFrC~uU5PdL@~Dsmd-|dc(THrW?7fW>aA*DT;-7Cf+dOkvsJ%^7pA`)y zGJCR3&mo&u%!xO!HQj~j9|TcV>Jpa13{9_~WwMluYH+GnNdP3)fGMN$UYt&$?fU@QXN}{hO+Ch>~u9 zL-v)rLK8C&^dcITWm}CtB4`Z^f@_2;Q;dbn;fx0Pt++$Ga>1eag@>6Z(0rE*RGIV! zmq#ykPEp!9ETx|}esQI|Eg8eHGT&O26cpgyc~jS2E2i&1^`?FTb2Dqs{8i+Qb!Z6K zTSc4bI*ITvn1Ncvylk&fp(v5pi%*($H@lUM%^5L;^H(ETJ)wAF4yR6FeCz| z%bGw?iz@I>zPF4o=4UXvn)bMgG4QvP>?xR?9`GtdK1&`)f_)1vVxrE@(j}HKiu#gT zU#&=d{(;W9rnPr?;8-fLQL@k_>emSfOT(7m^*O*%+6A>DD^pS4M$WFv8b zHbE?X?2Gk3sIC4V|&#$k}kb> zEYv^==!I1A<8DveNcM}M^SUfhs%h;mLt={V7e>>^bmzC0vRsxE7efOJNK=kx1S=i6 zEqS2gaLD5N?r!IR3@f^>T+s?9^OiPGLs1X-&se3r@AfQwLDIALUe3Lblnp!AuK~m_z`Yh~S^leg>Rv(A^b0D8T%0?th3rin?xs{^sqWuf|wKqerX!yax$Y*2MB$vHGQj^PR7-7T?Rpn59^$`woV~z&)D2`0Sr5l` zjfbjSv)=aVE@`UG2z{h?!?YSBqV2x`NAr~Llo~pRC+;#GNNJrEI zc;=}b9jkemPflrqZ;)Z|+#!~+QaU;-X@y8XbQ&q@J}!oZ-_QxX@cXl#rVudP*+R^v%@G7D8TX6_`d?$o4LPQH5yyDOdo zj!0k_L`d5gj`pg2kPG!xIL5t?=;aVH1;oG!s%;1<6N9wwm}K7(`G*wNruXnNaD%On z2F~i`gdfY!3@-w)IomyE+ioRR6%#NQ3lwsu(qZ$SFh)YqB0upoU6kJNAO+#^=$?0Z zxX7!6BLHFJ~$kdU)H6nV}q;H-Q7L7 zI~NE+gS#G_-~+okgsZSG{1*YZ;Rlv=qRYPQ0x0BS9l7y(3Gx<0t1JsI`!-4yWuZ7r3 zM%!ka+G~P+Xshx7VS`IUPmPRY2(qwlJLdPx<>-Lrp2U9r@hR3TA2z7%Ivu?FIQE97 zcjMA!Zb|jKMUTDb=v=haTBDUhwP)50 zK$CPw%7GF%@Uc3pD6%pq$3XpEkNCFsbm=czi9*Yqc3TAXcCDz3mwn}v=$^#Buy(Xl zYf!_&IC^$@w<8b4xRKHpFOFO)7Io<&(ea6>L^QGklx=345&hK}u{hNErke87BK`rz zCxrbU=kGkNWba0A(0D(9-cgCYPP56rA5n!gK<4a(T7knc+LivzWd{&dg#V`=`>R_u z7Wex$X&m?{mI~KrBR|*J9LptcP5HOW2o4S0udHt!C-Dqm2JHIbt>|B`pn8xxWeAP= zevkssieG7-BrD_Bc$S>KK|6`KMO7&KRPt{$udhqBXHKv`YB1WG)Hrh6zjyU2M}_KB4mB+{^5+k11K&zWW8*s_ z+36SQ3Wf;TpEEpYu|&B>pZ2k~L|D(0^y0DNKPy(1=_LqD+#vA8m ziZSb5c*>G`AXnOXRErAyDAoOmy)^YKeGOJP0;^g^Mr+!Nu9*xD^fN_fWQcUhE-n6B z4J?p{yD<>!@yuFuu_ewKb$Qh%^F0ZoNM`!C_RPDLR<43a@Lmh>NY^;nT}*?3AMC*K zqJmlFVDhus2)5bj%$lYWZl~=f^?GEhC2926Y2o2r<`P=J4fB6qN$Es?rLp?E@c->_ z`s>nOM}QS^FJcm~|LW6%06!tf4U%dm$VS&$4@qi<+;$A&V`8$FZN1PY>1JLJ5#*t> zAbs^eB^6lA2Nw5KcfzPK0L%&AnW=xf$Smfk@kZ$-z3t)21Ta9%6eBIE(HS>8FJeSs z{LzbI!}uhMmParBlxzCDB8;UNb2|v02v1DmbGn%B-2h|ntnOzTFLM@cCzq$K4J*D{RTK}sX=!O!PeOLVR{b@spZSK=X) zoR9df2p79u#BfRhH}4uY+ndS7QFBVPs8@R@@~PU@8}W^ZC3-69CW=RrO2ZWmota{h zXHIT3Pdy0t@?2!1tiHZcQL2FFonoso-cEE1oQhUj_>T;1{g+S3OH~X}>7-Rzm_rkh zYfwYj`Yg#`%&9B7a1LxQNQRfFz}+DI+gx;b*v6^S_*Jh=ZK<+lbmFiOU%ozbZhS{byNALvyCHfk*9Ry`&7n z9dgBSNrrncoIs1kQb-S{^|)`BKO33*?Vg-#ruB&L!+D@SbvT7jjm43H9uA8whfezI z+(lKch3XgUi>=lwX`Os01?rTGc|Y2+q+^D-Z6UXH+iQ_`k3~WJ3zW*#tK`B=V+4ol z_s}H>u*b|xS~O2Ivf~xq&;60-1(J--{|#UwaoK?EoG-CO=S6yP%1Q?!vPVx(W&AS+ zNwoVgB(f;3Q1I?+O2Kw#6=DWd5|n4OiMj4C+i)@9yR$hg*G$&C48b3X->y%T<16vA zA#4FkFv#7w=#vYsMSa=8^=-Oa0bH1JlG=I`OHl>hz(wa#SkTC z>kmF{9j%>wWvczuQmh!~0fS|UbX(7L)(z_rDNUz^66!QutT?|YD+3@i35$kljc4#S zPFOdu+A35C^D^uVN%{`t{ime0`d|t22}F?i`vXL>&`$kfS#;vI1A|{Ye9#jz)AiWT zR+0vQL&dp<&UOJ$&pO2^!d*tlcTwR=gNlAOicyymEl_RCLAouslR7zb`481PB2v8= z9Qy;I*0_|OTV@WmX|?EMc*yqMFi{A;sP+HZtN3mi-!kTShB>ARlY0kRC-|sXEDU=OI*yWAxrBe>`A7ML25C7uMDp% ziw~V&=&W+_`*?HEap)KH{SW^K+jij>Uh9Xzsq_9wh&B<=+@BcX4{gltTY&sG)qrc#L+pc9R~!*`a2aXoxM zRjk?k6fC#x58a$A50Q5q5o@KjFQpL z(Ev|&&4kebJJe}}5C;Nvgw2nY*{jMFgsMDP#ETjeCNhz^MuJT$KkSb9DvalTrOGj{ zn&euypO|v?-t$dR?}ga#&ONIseg=hWAp!3kp4P9|RYcph6$Q0$vNru6o)3BQ?R{*L zm<~#_(u};5pL*HH_V`$)dE*LjxalhK%hdcXrA3<%a%>&)G&6>Xr4Ec}Y`#NtwYJ#o z;8FNCRTmNt62F7mmQBVylKfR{S-wyAKOjwi2o8+0^qvO@)1sEQDaz$ z|Ekk^^XAg*u?61Ist&q%^`dLWXrJ#)TMHrp3C8NWk|2}(Pg8y~)J?||9die3BmNI3 zG=8xD_C-dA9+YRkALSWIt~{Gj1))sXZlzch7-&$gJ+m5LIBgFeAfWHY_=2>Gv^%ei zw?Yyt6{BgUP3P@^3KF!0ED&bZA7{}>{rTd-65FNNCGVS5C-651l5B4IGunweP=0cM z*Q_6|#C_45Gf)_wu!#`cIVxqA;pSkUti6>8>`XJdnZ5Awk&=%rko)gV_O~gK4^I1a z__QDp{UqT(RKpS_A{WX;WLR>_qge|q)m5ixEhQ|5Z!b^I8|qDXd&+lxlsIzA5T99( z5M)e)#P*6+$D;Hx)F(pU&S4CIzF6|nht*oC!S{q6woSS_QW zp!kc8Q}+}WyeTq<-Rhk`=*WBX28DnG$IEUNko`pFNhQ~W2jRrB!E#~bX5KCrva`KVYrI67B2 zyp!4HcVK~T-s4&c07`T2tQFDQ>^CT;7j^n+RTdEsfcK6=>?DtIewiDhw|4>iP&-ZA zuC2S1VB*wLnQRmYgIkEt3Z~lTVgv$00^56=x>9N>n81t1c9y~FUY4l_d0jseA~4r^ zzMl!{@S;V%QkK+Tr=#-LKRNKJ;DNT|AV$f1c+&{Lkw7KbubFL@(ZJs=h(fegvr?AM z1cd_`jA35VBRq3lD}7{g_wLV!!n)fjs?v)yZF0FW#mExs!ECr-ThQL zKe>PvD5H_=%fg4$z@-lLgpxGxytCD*8Sez{)J31#XsYL~ZhhS}9y`a+X2axRlx*pI z98@H9i=$aqH0CciZ^Ns*D+|k1E|M0t^tOu?Y~Y-M3Gr|Bq%`fC(k{R?)gJJmkMKcDvlQsBTw;=I>5eM)*e zM(E}eZUp`9y&^+GQXXrt-s?E7ycXs}`z!&hW6auZ>)}J!Z7tbPbI(%wAUGMgDF-i< zca`d7nxTr8?J3ml6@c-=cW2PT<^A9^$#@XT!; zVf>`KAUVZ~0!JA9@3{x&gVv~Bpt6^{6iXbT?Pxp^jZL4mVfx&UJa3hWes5|jh9s(o z?4KjMwWC^BalGVkj}f0;gm*at!h@gDW=OCi+&dX0z01XJ?-;*uR(w)7x^pCX0Qss0 z>MIAmzbQ4)fCmhz%(V75o3@tr>B*sEvLpQ_uG zu~mus-^xW$TwEKLTTFNSYl{2(%THoxsaHEFl!(4zt<9UNqPIfz+fQ=i`1VnDLQm^u zN^4nsUaxDQr|~MnHP<*0q@ zjb}Rf_f58c_-$2ysmFbIdLI1tdEX3S| zdMCUm$)=A~Er~mvW6VUW)hn%O42=}(lO8oRxrk6%%{?h%k3q2JFnZXpB;7xpAjd+@ zXgG@o77H1$hAIm0{B247ak%1lu`~dC_I(CL$t0F!E&CL7H`hM3L zPuwuFOF{<@UFY&YxFWb7ci%|ra}7~@Hu#l&iwQwW)O)TfN)r;&AI`|Vs3O*NVCByQ z;h~&je>AXZyhI;bu&Y#xyqI+aimY}-ESFaD&|adZ!94@#)R>ZHU$y_Ba#;TkZTof< zUlHz#upv{lD2eTQVdHiNb@q!sjJw4}*S-ySAvy4#?qP*KSC~)z>5JJ4_khczgBEpY z(O$4W_3Ra_DAQvjZe4o0Rj*)AFA^I;sv03W%27q4;=cfqNfVk+oj|>!&C7B9%kRyN z<-CV0->enC+|(mG1(LCyN&O@^$XmFrp|bDwbn09+#!`{5TQ_$K<E_W@r|NvG8*eSpD1^13xPB7j)_xBwzo_X)py-c31&@*p?n{2rqbpB%fu~ zGDFFTcB|3K>k+UCt!K5kI#LD}GS@rK44z7G_!LXeu;k->K`e{=LCzvPXMYwxQljdRK@=A^;SKK=!>gz01=(mpyX4kXY!MZ&wgsvm_qcq``J*kai%A9k(#qr za%F?sbnvex8EmV~=wzp}SWE8C4uf1}aS>wcktIg!s}CPuB0Ma$-v=T20xE`&2PyQb zeRs$oMGyT7KWrgl{ljtFteW?3{lL7bBAWBj`0V}zY&@NYlW5}4(8oqii-YyZleb(< zt~@03i~F&3Nl8C&e{h4kcYsPwXt<#BFza&hT%2I6?U!;zuJLmDwnO#U+Sd1E>rRsx zdQLD=h0RE;A~g2x3J;Kn|1_K!x=v!69ey>vJICfQ-^2dd#DmM%Qa{1B8;VdhGBqXx zsx*D^*7%9O&gR*|ndE{?e25;EXM#rR7QgV~8;v<{t*PXq;C z!KCvRoJ>>yfYbP6jf?EVjGXDB5XB7f$O@?k#;@ZD14d>vz|=F5tQ|pqN-U%;ArVGT zJE>xpSBOP}8dTra8_e@-;rBZLnJVSZ#gF%HOkscU3ktEK$cMbwdu4?{{raD7anl?6 zP@|In;A|ry$VGuUetNC^NAi%~XBEvliSR4VlpD<6mCzJyPQXwChOBdRSg!m5v6ReD z;c|?y0~oz>bWJBXfG;Je0^g|pJ1-w`;lP7#rE|;4%omJ2iq{b&vluR(KZW@HZ(irO z7n4HAH+yMsrmWsmIKMNrm@|mZ-bTdTbdI-c4n8;a$t$6VYEU-urMN)bHor=rHBXwn zam4-y{hDadMS|`N`Bmk=oi!PZhu^dSU%VkC5~#~|^ozp!F`dNF!@io4d13mFv~7ba z<0~gAtd^8p+)ABz{ov))--5gdOv_RFsr1rPy3aTFU|M2Oomm0eVh;R2vCpA^u-(6N z8pVBNf^G5rm_fRaX1x&jt~`P6flv@|c50j%Nl${pQ#ryKe!!tweEU_TIQHXR%SOKnkDvcAT32nZ(U{M(laURFi6LvZ5rR&6^h1X@vih z-J$cc)+qeMM5jq8B=R?e0RAy1+QWU=$<0dB30EvWe-&WFW40|nkZNk&pIa(tnBiol z=x86X`%Q(!lqy#R!f}~A?&IQy)Zuu2>>(8z^hf-Tg7Yx){F7ewhCNod;r@M5r~uDO zO%BIDL}Ho}_UvC&Lg zY>HNlWt?&Eey{FZzRhhy_!}(%Lwe z_&Yv|e#~5hKQRJwt%wCQkshPkozQ@RcDsTg`|}M5+GdGTO89Mk^bYj47v=Wyz^o)B zJUDpGxg*Bclr6%8hZ0mU1++wGW0d-t@x}L!(DjM0X`5v4hGCxgk z<2x}0yboyjzwFuHZ6!-SoPN@&FmKJ=TGp0Wl(`7W)R$PNf4WS6bP0&V*EPqq)m5$0 z0F^`_GlGHURP254Cm->aLGgkLfac+TXeuX4m3uh=tjH3E35?u~4^b>%f}*;9ftnq4 z{1H=@{i*a9HVfxlwN>qn-m}Po1KeC>9=#p$A2>4Ree&+|@Iy1TJb|C*8ieo(NjN)>Khi81m)d3DyH{ug_zJm6e6lLizhZ z8~)>0q0V~wLiIpjK~*L%8?Bv|;}9@mhp!tm$X;9abLY20fr-|;U$ruEuZJ~*k*8Q9 z;A0Y+07q(wZQV46ST=wYHhCSU#!jX1be;w}YcX2@gOrynW?!Qp(O;n#esHf=KfZ7` z+URz=KcEefb{d}GqH%a_uo3DIGX5pd!U3B6&>$KwH4+;zi1}l!YBkM3OS;2~qLEVW z5g`G1KU^$2cq{WjUR1(w%y_*yR8pd^xpCWDwc-ZpL?B%Zk2zGBLC)rnmdO@FQ)V!b z4`8by0~V6?c?bB8x`E$V`o;yDL3?%;)ro~=M@8xVHV<*-Lk%*dlWja_?~7oZfZ&+O zsGnw}EDKswk0anLm1=fF=^?#NUPHSCJmOb#sY><08YNU0udB=AMAw_%P8{KLr%A#1 zK!QcSxl9Xf-hRFUii)t^E}sQ*)*)APBAo7~$xyq_-Hh=$WGZfpvbvpWFFP?dWtQae zx2H}h>5@4(yXvzk`l{F6TGU-eRKwTaxiY(sC+6bgnc)D%zpOuaKo=6UEfKCCuDSa_ z%kwtGoV0nUqoDYVNL0p|?QtznZQ69~ba2c#yo=+{_w?b&(Fl&7P~v zV$En0Ta)1tkFtWH3J;88PV^2z2~>!+3b0ADRfZ32y#LLs>x!W!d?$?`PD}~g^lW3c zuWSw*bM3I|uICsF6vZ+g%oeCjm|Z3f)Q7&MI5;@E+Zz8G!Bfg7=&EgbJZu7N%iIBg zGtpVR~AJ51XZ&r2`ohalW~WS-$J(uVbHVMr=CBR_u5v?y7aJ_JY6R`JYH>#CuPa&$?psy_!oRUAfk^-K4C^X+_=0 zfkzzM_b zZ89kd3Vj(j;OT=>aq1(2(yiNZc_+=f9bRU)4f}f5X_w=3-Ib|Vl`i~wb+b|E1*d4u z_jNA&3tr^sk*=T`U32}BZz`6*v>QAx~bH)4`;iJHy_b? zTS?X6UO70m%=car(X!|!uz>qt+(J@xHdqGr7r=ohKfk=ae1?VL$|T?+T2w{Z_@0V8 z8@@Vk@H^38SN7tSX*rI;+B-udh6rY^;OUNkxkZo5$xycSFljo9Ug{zD!;b@OU1EIs z&{R3KJb~}`*e8}MBoV@bfsb;CnAd7V+PL`BOLgmq${%_e1AnJCtF?zjQRFr1rr!cr zvG^!>EhO8gzvRFN-rD!iQTKrXs-S<8F#r;D2&3&h9TjrAybmg2ulP}U4X&Su)_jPX z7CqPoRN&ilY!#i-IT_%tEbY%y`e!uKHrngLtXX~)*`ePyM%ZU>bD`>P0CWy(^JBM=p ze(gyxuT*OiDPeyr=&Y^LKHcysg|X@?7qo;JL9Tq(_lt|S zf3N$1jB2FZ*D`uKL{@ctnhPJaztXK{l^9H}6(f}H z-^cle$BBUG@^1v0z8D%TWZFQ@=VDIB+XYR+#eP&SkkxO8*DR`d~a*nGK=14pW;; zdF67A*>7^HUXjqvvfiL7){4Q{f1LOlS7ys9&V=x_qUj6!o`!WxY^bwTT@kNKb$JBR z9mB>ObTRX_-^XIf9F!Xjf>9?cNz*2eig`S8@WIQ8qWJ8LSlAKD%IC-TmqtCl>lGUK za4v;PpE{kN{Or^nYMzQmA1=2L6|U#1`K&zCQ3!!e3RfvyCGV#)_1|R}2=b$at_;6TUmgXMt1d5J z0Bq^7%Yo(2M!J#Fu#}Yy^4E2F%*sbzej&Dg)Wb>UtB;c;iV;16{Vql4^l^0GW3TTV zUu0ZyrJt5Ce5RiD<9s9x3|xy+v7`@otS>)4*A;O8^2j+=%Tf2Jk#zt{?ZO-Pl{37> zEsy>nRB%fGW+2QXOKREf`j1rjw4X?D={%WWG0#hR~j zN+#0GIlTtIH(5>gc$jlkS6m94x3qnpk~~IBNnpNaN33s5cF;@&Xc(aHRDWC+ubleI zl;i`NSDmgzaK&EE9i?6;Iv_h%2LED1`mzJKd#L~+KU02<`tuTBz)3EZ4eKMAu-K(R zsAw7kS71FFt7A02MPU}sLAs^p&$&A3d9H?KVm7;Nr{n{qwu)>{MSmpwM`SCaBOk6( z?PLd&W3U-cF4!5Wr2drtJow5CwTSVL9PF>YCgdLx<1+Ho|6J4$0JI^m%G=PzqyOgl zX`RtFYF}~HB_*(`H9L1M<5qO6adCXOj4Y{x9ImZoysP1`|J}K`T{7AeYVEh>{XjKe zC8qZ#HM=;t3AiEy2gc;p|f`Zlx^mMJ>Dg@daquz=^&DW3vgbPa3E3z+V9ocB8-o;Usb&&-fRAH zwB98E_?6om3r}LcObWp+m0N4Aw6{8Hxe%IrZ*Y+>XDGU^ZT?N(@a7YWmVWwm2o@oj zK9GhwGj&{n|CZJ~dem-?&Uj|zcvsQui4TKm7MN^4{&3=h*TG1S1CmMd?_o&+0D9AF zaAo0C^ClEg>C*9nVG>=i6(MIXs%VdhBFavH~E zTUxsn6J9xS|cok}#z_1C_e#|-xhR>3E30CD!AO%8+ye8=2gBV1LWiJ`+>wV(l^o|_$ z@Qq09itlbFhk^Cl!LIIp5fI*Gt7v>DxbMDq8M~IxvDD^j&w^iICGn8@p;_3(3ygP9 zcq~w2h0NJ-DIKw_i%L1yQpP!o;PwI=P=ot*Bf}u~gb8oPO|u(pxy6O1Ub%N+k@1{r zv!k#gx^wq20+dl6h3gA=4p!2oNR&K0H9<&a2GqA1d+|p630-$SdA6UZfnUvSjqiIq zK^fm`^|`c17F!v3X#QG}pn&X5JZ+%TQd;4(+P`Vl%%pjFQSGbr#bVfS9CelnIL;K* zn1(a}^az5vh=k@SboxG}x0Z}kxLl^WsefQ1fwcrTT%*XSPHqU`tXsO?w-So_{cV)v z{f7}gr5p-vgI|kzaM()h=?GSaH0g=Ai6gkFc=Qzq4*TO3GanI)3%aY8@Ds9EjPfaX}A*vwx6lN;=Xtw3bHe4oBsR z{>2NuAtF_za=l#i3KD<&F9G`vatN-;cLm+8sJ-s4?LP3H4A}b3xwa7*KWsc0+f`L7 ze_Llx8BAE#X$PTs4V?0#d1W3_^h7uD6B(42`g$pGA$?T#e+RZp?< zhQ4HEOQ7>~0+LAkx>$jad14`@YVHnZ|D_(`(L#U2Bc|PEzVzTEP?$Ub2aT~tLl$ka z4~Tz`mmFileaN)*`VTSv3zE7h10lkj-HKbaO9!--RLlaItcz42ntG%)F0b;*7!dP; zc5Rhw`{ykSkWHA!?x^JY`OdO^UgmcdtnUZjv^46uo{4CUhPX#A;%(eRe|mqcYG4+r zknlwnGza`X@k6oz@ju5bAcs>O6HvD$_{k5NF`6htEypzgzd_PN?hfZbLbM zlxOf``j<^X;)F~hV)e8bk1mt~Y})%45R;l)kedV?zIa&PR*N53^6>C5bePO4uaO}> zCnaH>tkvI`?xHi3UNp&0?=tHd`^Sr-l$6nojV|L7#M9VV@%T8$*xB=-=LH5i7l)Q< zluoq~)qlDxE9GIC;bxiH&sT8Kh~mUPj%#oC0lN*nLf<|6TFy}ag+)B{-T*lr4`a;CyG_7f%S3&@1`KP$~3^><-@}%-;3E<%v3}H%fe49Q!^QI z1$~d_n8Ua0vX+ad6%ZQSD+hk6R4Lag`ifGIA+@nsBUVRb+Fa1;y52mI)AErjT}d~n zRhpv3#jgSxQEUElt#cItN4ytn$~o1?JW zwny~uT`r@rUqH_T`CQw|8vBYGj-3(SN%sN$jo1?}{EfbM5ATx;RO#fx5vUYe$5uOd zZF4JD`Fee?T4t|ETjyjy5^$M8y7IhTc)dN}w7&UV#Meexn={PCjmNbyaHHDca^D@- zQm0EWk*ubw#^4T%>l&&iXN;+$TnN4ol6r&eH+H05_F>6(O1qj3{7C+m0 z;a9==-fS+mR&+OG$k1o0^?;8NlFpH7FuBq|Zmx)cs`sT1EOOWX@5<9hHY{WpgTzkEXQ>>%& zUdvY{>Q)D`O<7};1TRSG@NOD6YQMlw3Vh;^N&nFC>tYo459mPN@SLWW>_CA;J?eqA zT}mMJZYHnC@om{a!?^6;D4(a%xD)DF3j1Akvr^mo{&rCC)Ofy-{Zr(fA>gn|c;>d+ z(w`}JSsOrZG8q#BSmejjaB!X43St)oE4P_wO@*scn`_}}aTDt4DS;G5KW*gYbQt!! zbIoYU(NEl-UjPG3l;0!LCSYx3Ehn3|o^;H$_2bf7sktF=JuH?w(JaID^~H0&&R>}< zzX`SvfPnXjm5B*i^#A&Se_7KyDF2UG_7y2>;K z9V&ba_2m1+yg+1OA-E!Ny4v44bJ?}%*%0$%QuhImZ!bk(+Mkd;*AE^dvHKPs1ib|7 z*GD-!-*PLbCEc7~qf05Vv!5Zw^0H}y9xkTy|kYq+pQ>?Vv$1^gkHiSdH zm@qPBnn!7}JZQJ{RCYBt?Q=a_K;DicTC_Yzxb7_??EY^o98~yJ{3Bk@9v`WM_o$ZK zVZ2G%2!YE6$2M!El|H1yv)MNal7}16rc6#SCUvUdKA&9r@I{t@BwpB%1i@xSJ`)om{y#KRFP0W$J9UL1%QNF#^prI^wvJiK9^x2H$z6Pw>J3`kYKnPu{C zoowMQQK;l$w#}1FSGMvB@csGFLTXg1K9t+@{PSBeqEq(NGlN6|#d#ac6Om?+NuAG; zSd=yhgc>*3JqgbyC94B(Vgn9UB+B669g8BpTqKayA@d~KMnSv@P zt*gO0u5EA6YfVBmtpLwy&12q}Jn>1ol;wuPP3vcGU2oqRPmX~}+n?9xmoD}bu&niU z$OUaU*NsUaez(;)K<|+HfAKm^-_YD|lz$f+abt1zWbR#`htyz5Zj66QFjTyy?HE(G zuBo}i^EoiOz$Yf85m=Ag=>Bdp(EA19XQ`2J3V8B5JDe4RyJuU$C*vemrY=ZeQWM`E$#sls5C_B`RG@zWwNx7T*el49K9!0BDrI>r`NRN%=H9UxX>VRmuWEh44`X9Y;f3Yj;ZgwaRcqT# zl$W*FtE4j_Z)>u22KT2t(Ozl7swJ!Oy6-;Wmrg18w+$N;yetho_deVP1)60#!U(eM zPY*E`sKkP+^Bb$gX_Dl7+3U(%WJkAtKKxFm+~0Wj$wlXhm)g;Th!bU2I+1}OGqE+} z9-2$dq{Ia5GwmzH5wy>SMd}GSrnR)iSJQcC6Zb-a!6b+3pBO@aWy5{(AHfWwN*4Wi z9eK3!dYu$29CR(R*Lt-e|YxqBD>Be0a1TYR6hD>CBOe;BXwLM z`-95!3dH-A7Vy^lU>Py1iE$>CvX>Gpn{vUU2j)i4Ro_uPKtTY_y<@X2VKQ4w(sTXy z)gwo{>?W%5v7Su<1e&}#Kk=pwr3Q@;sPPG90G_c;#MYRnjH zc6>xuTJ<_w{L$(2^Xo&u_(8|(yW!5KfU^tv!wbElXaJJz<|K>IEt6^adurqM5vUt` z)pgdQBtI_Af6aUIG)*mr#Pccs%r$@4PHEK3=QnP#!u9p?QZusk^X&?5%$m>Dpo3QV zqQlp{gMf^p%QfxC*-V?X)3#FtEFCr$+v%M>IUFrn%HW4)VV@g^G%Clfg5kt*P#abf zbLZ6sHvl{jIG2M@txvP}$#HWG9}l1J^~+EZ$Z+HYnLv5Q_xiTX=@dXpgcaB9R2NSz ziwz|CF{>`xQmjeaJ&<#Z@z}kIZ-J+0K#cibsSVZ)CdFKo7Nvc&rKC|x#QtERn9;UNU4CnRFwjgZ#DQ4i;1AW~=bU3U@ci3G}oCa%?Qh+m|N#;T8g5^-Lj)JQe<60f=F#pVx=E$79Pf{j3l=n zkqCHi3d_s{*)B`dHa$`4n8&31Rki#*36fsP(4htlT>3_xjA2cCwmjeAbWu7FF0I$A zBt_uCk^pkp{)a6gY23SGi|MVk#edc#zp=i3toQx}+S4T9jzcC`v{t% zbh8mo9Il?7oYW8trN{aZyh5acYX!=79$*-N4rK^aWW)=&r zD!r_ieI}dCGT#mY&s?b$`?XtdcQd(rKK>@&c@uz|`|F^Gr;>3=TZ)4CGyfrvvCDbG z2;R1x_%yAlO9)0u0rhYhA@< zY|H(yRm>0@@Mz{C8mnr)*{hr5+D)82d|7OcWnpR~-@IE8%iP1PK)Q+Seiua-D^@od^dy>p#4(w(ZJ<_L!9pY4D^9_eZS0$m@(O(A+lgVirk;1=OyHrw9 z6ouSFx87& z$g0D?j>-C0D&M6zM=UuMN*L-J;2tnSMy{^}na$UVtpLU9+;oSBa#q(CJb-t#--L=M z2N^{4Wv!rOnW6?n7jA#(=>E><=eVB;>M!Dbz}UgVOU@K2YSOctCYzVv+wr@1xRKev z-kK0r++>>WUQI9`+g#h=Dgq+$sXePK*ZirYoi5hAR^u9Ol+&blM z2%`^@;$ijZsI11^zj%>&-7YC5IS1kSyaY0%$DyW}JFek~S3HE95j3vcbZx?n8&N;= z6e$r2x>~HUBd%FlYW6p?qpteeeDzk6SP0~|{jD={_)_q&z+{42T{OOs=Y>vf8^Ze4 z#nS#;HkRlcJdpKg&U#h6DZE~kV3TIKO{?47)gi{D-Eyy?$G#Y8h%+F!D7jz zq5CqGEnx^Ex7&kVXK8FeQHswj!3tZJOUlK|Aqf1IUMC$@D&`Ex26r{UgOK#K(5OXu9Usuv^8i_xqT-&#Rr45>kh% zslA>6@z35@fuaY2CVSQUCB3WWu7#z(jp-wk&F5<&nLnk6Yiow*TBTHsgtm~U@b0V4 z;*jRZa7Otgc$KoC{7Yu|LSLUxP2*aXaGi82%(FT6b%8c*5Wsdz6}NngBkn?AKzW%R zO)1x177ALR#@WZ{I2(DDIq*qu6)#Z!vBt|{G}Z;7Mcp3$f$DDUyW)K(pgrNz?jyWl zaKF=G@{!NoUi-Z6wT$%E?0~Df3>&(V4=f1LwBX(lz;ZC11V6#yy)gF;qbc z`RC1UI|6=*D1hpm^T1q56wp zan!MCMP&7Fw*gtH1de`a>jty*cfewOzHG6YXeu&5mE-;@M3H*N z&uz|3Z(J~mfFuiAu&^4CXj)ooyuu#aTnnC(yO&OWm^3)Td>^@8$G~T7NhF<><)CS( z2jfuIpIygOYEH`0B}dLhT9DW!aEs4HA}DWjxKgu-#nm4Z_spQ4hk&y$(u{nGwEmmf zI{$|`3i;VozTqsu0#oLjb^FPQXbl2tB#P0xj4llWuC6$qGgC}3$sr696G)bTAToJV zZsdoBL4v~$EFStn!<{cHw4io<(jE5{Vs*4E_4KWyo%ZzyGH-FtHdzhe^lAGWjoW!l zCkdmTLt7iDcnKSRb@?GC^pnt{0W`u*X1BlSY4n5YtaK|PNINZRytJ2sUtKzg*|?^f zQT%b{u$<(T$xc4(7<(V`H*me0ZlxSs3kcp_RluXK>e5=IS6wx7_vLUPhr5|;(3ro( z!5UL(*V2ZqhF)5An`6sp7#seXixT4HkBzv1(KWnl1(4mY+gl$7F6Lhh&WIXJ1XSQ>isZvx;+)yLH~|0Xayxp%_=}-1Fhj z6lppH%M)Y64)9_)9~mgVKZGC?unOhw)OrTsK=azNnA$hHTWw3^jSRwaowQ1LM%5S5 z3$GezYnFA;O+IyRbiXUaN;q*^J!B{kcE8nodSG5qIX~=Q21O?dvC^5^Q{xV{*vYIX z6iSRJ%QLUWRSn1G0*yMupdim_zN_4fIu&!<6702XA>_JTZ^$F_Mb+Es{DOA}TRS_L z#B)#&e9feRu=fmsnTSBx&@sFDO8fH@^LHzV%kj&pxHrwWi~jeZl;z(!?fh9ydpNN@ zGL?rPYhIbv;v*L4=Uc)BcWSI=M8(eeMZ`NM{U&IzzU_T90}wIwj$vhSQzn*-no2lg z6Jr9GF>TUnJ==&n_b`iV9as|3o|DaQYg5By75|K*!V zmJzqWLw9exgc~vnbb)(*w$3M{c0w6JZfURT_?4o$fdKCypSqYA_RnIX(zb%2zAzP2 zNBx@G^D)tPsK}^hLZWO;nFRF~fZFL$Ji*InYC$xu*Z#sbq3%kMKIuTuE%Av>|9}VC z{M&BU)Q1G9>fyu?307ViCqw9;6m0}5duz*hG48I{5+3}ZwbmaH9j<4jraF-^QcZk} zlZ1~t{ZaCt&f^AW?QBNJOVy2BcAuXDDNFh;DW~(KrM!NU7{TQ-&P*R%0quQTTLPid zmXA6QACz#tikZ~JQqMl5P00$24l-rULVc2Ff6ejlqsbkt)?hbtS78+ynXj|k7qR7p zvtStx?CF!Mgg0iMyKO!kWLVBts*G4!_~j#fZ{9yhb0;kw0@pW8>|iT^`>0HXZWH&3 zFvi-G0YFd9T!U}NC1p*G1!nk!Ds172R)TlXPf%K`iM&)`P88!Bao{>EG8j#@_4Av97GBhWVudaB zq9LnkGFWXr&X4p+F$=gN4zf&oq@&RAjw-bh<)Xa|x7$;`-hS>;x0QWHIl?oCW(n*c z_tq$T(rG+iw-Kvg24#dWg-UOK0bF9L#Uwe-g#-DZt7IJO#(iy3hg#X6mwVVIy8Q%`)# z2t^m(f&zY+(b{y%HrmVN?1@Q_zCwQPt}brXkrK3Tm=-acYj_|#iWHN5Xt@iW-12$T zO_sCz^Y)W}PtbxqbW3~dnWlY^q~y>yZovB}7a6Oa*ZWA6)1gMCExYup<`(N+6$EAY z!g<85K#-Pvmrre$9AAoOi$n!~SI~Rw5xtkzr+)brkJ07s%OK7bk=%9?QH0!be|9!>?mvOcy+97pAr9;#R9oNX;xa4tP`9iG0EaAFyk5baOCwM&@%)xt#| zO4gYuR0a+@TeVfgNP%Pz%YaEWii1$@eEU;@eC!P{8JJav=RL_WsW)5Tx*$qaaDU8sSBE((rn& zvp53kCslecH|>{mVOeJg7T zT?nOM;C&O9=z(ZrSDFY%=x`)_5HoZ5#3lkbYl#}p1sm+hU>36+lQDLdoqS9kK1!)A zFHhRGk)x#7DG#twx$}6)pii2wP|bYv)yI1dFr!mXr{T=`0{uQZ^1bQ7GSZ3EC&J!u zKqitncPO$O=E}J?cQqC-FBwhkZ%fN}i5#{W^u=Q3b4EecTY|IH;vqU84Jyv%-g}O; z!y!iUTvuzOh(nW}?RZp>;b3z+Hyp41n_ zCP24D)3MYgHtph4Xr&iZG*}X~=d#-IQB4+(jf`x5vZ!zx`l!ZJ;{0oH>QaNrYJPhh zOr+>!LHLIM_otDg+PF~IQ_c%1fK=OZ@LeLxs4AOTnnnE=Q$Qt9P^+*z%CuU*;u0xUYTyW6f0*D~Wlr_3Dc%?&VLr zl-c^axDfw*|8TLbUfGbW0W!B*QJ?>+P)E z2cf6luOYz473;^h=M-4*^-c7AuPF+ckl(O@bm#0ISLeX6|t!MftwrgA@7 zPB!2buuO<88@AR&70JMKnQki-N%rtK4{N$9*HX8ZG;+l@kwy<}bk|gPIZUFdxWJC8 zsA+lk*P$ntEyYX~5Yx82Hd+o3%kzD7`lT?Dzcv{!)w>s_yu;v`5m$T`yl^Gmu6zD# z^LDg#+Y%O5;t2>>nk_*Md6`3~ki)|fc&+kccKf}488hW4^W<!>;-pW(IW^t5?=>%||G#Da(*Ye*-fQu+Drg?j~ zON=+ozf0+n6jEPi;)HDT>^6{#D_ImaETTQ*t0cPF)5Z{!Qw^P1Xa$YNdVJSrQ{rQ& zEcmnUnrJTP^y3o7jM2LMr`3jadE3-DS2TH_K|Jfp8i|{o{DO-t5$)G?8(Wwzhu3`7 zBQzKq5dpw>gZ&8YZ7i6|sZ*?i|215xA-mKX6zw}Pu+rU^!Ch%|+fFx!k*adE|J!TN z-CS(`mGBC}Z_|t8SgSd8K669ax&qQ2H}e5K`$!}k4JI-zJgXJ|1sa=PCz%-5a_KYc zslgV@rIoj4;@MDy|t%(9bJ#Auuh*LF3h^%~tA&a+V$q2haEJ8NU`bIO3dbj}5R$AiSWA zL2{Y#^(~3>R)9H}&B-f~SIxwm8{zkX8N|}JTXrc)xYjpPOdOf-yqS#c|O+rheSnxKSGo&MB1a@p%@LF{ty5YL{L(1&&P*j@{S60Q8a)-x=vqCVvGa6R& zs=O^Zb#GB+#knHndN;1dpnWj|Tw(BPr`h(A6iZ}G6hiL_l5RP>ilk8sY?6ocUBQJ% z292Nx4J<9S>i5u$<@)6WrWY*TWS&*$xyryQ3Giy;<@v-hKcWK*ArOYyLM~ap(e@90 zPG~Au->k6XKCvmi&vx1`_c!YgcE||z@iMb&8&T;cnzH3q%#FppzH$@lljqMXi-I)R zAaMh8gRp~iTgC__D#SE_hT|-m%`MUM_gb*!sItT%`cH8B;M9!iuN${000P4LsQ=GIDgbM&C+)aLN z?UKP*Zi}K-ZwV9Nn~B29P*pntGgTZUt-V*tlR|ow{F$ET*}rSK|L%g~4YvNcedQY`+=R*-HSQc)b(lYfrCudc-rZ;wfgi#q-bX|vQP1^V{wJy#j2S<#Kk>) z!$f|JV^asVwtc9m6-P9r>5>lIO3yfA zo6QH}$nYVgS_PiW`WOTuRPSa}ZCBZ>Y#IdRjL&U%dWsCM(ZCLjwzvB0pj13hmUoq)eHBF9l~(m~D$e@W zgZOZc#WxyPheW2c3_2cLB>nQ^^b28>_Swrff3w%Ymo2TwPSnwD`_j6TTQEg2ugu2L z_ohi%HouwO_fX#!(MU|$U$?)<9WSzeAMF)3%gaQ$nwDMDyunn(gUhPzOpwj49i<9z zQ~vQD+^O4WwUYPMlU)A}w=Bj?9tpVma}N1Ov0_w(J|ki!l|1E3J^x&grDhbnGfKwy zk8i>cJno4VvbD;`375tqX3+J{y;9<10aMOuAUC<*JZXO7xSOGC;|)shT;Bk9i()we z$o3)#oLk0f=AooFIB29k7KZLI&2i=3JLjrNJgn>%8}Er|c!BHbk;auyPs)PQ#%{Vc znX(v*L1GnXPp9G?_0Dk#snx|V9j=Zdc6w9vhBl(3KwATjD84+$!GU?m0pHqZ#CpVp zjqFj6l;4y`;`$gaE)OA~WgZGi$ti_f0OIXfY)Ve@r>S&FNM0!`i(7ja>Z96Lrf7@2LInp-NK76|=FF{oAFR z$@h}R$L6x^8+I1!iam{G6KD?J^nR;q8#7f>6?S*8mJAjx&mxj*4Cwoz>xFXJf238| zjFN=An%-yS;#}MB^}8-8kpc1`yPla!oasd2A>zSwV&`u&!CM0eIA~DLf>KTXFRh;> z(na^8d0vieL$U+ZWxe5D_#5X!ryCXt%FcaA468U7Z>|t+DEGoWoGNSBnYfM?0yG@A z$`=gO%TnkR{V~NR4?@IiYlI^y3ta*H?kUV=pubim5p^08kCXeGpm@`-!Ihh=bs<8x z>CZ%y%kwnb*ZEs(iVf$N z{w2HM;ZCzrqYSh@EkcPooOta#{kyFiywyb^Fz`BI4(|=UyGw(MF#nAPigLy z)iv1%rWHf`B#O4DU5<<77MD*!y^kpX2II+bPLy1+l{t7DtKrtbzmEC8Yr~#1SbBTx z9BT1bA{n?Oto;&M>%$pWhj|O#Y*`nRxB|H^`oFZdV9VGbxga?76o}aO{pU5`1XMT& zmpen5!i2Q%Jbzzq+^5I)0OKDUkiTfOSg`-~T|a3;KNB-rH;n0IE)&=5JOVABY@PF) zNhQ~(hrT{x%`{vZ^U(k5b^iohevG2v&k7@S#*aV27}!(hGUlnYmHPBdb%gXamJYwA#qqDP|`Q zbPu*w)-x8=pJ+5?XL+!XR(F;o-PA8!Uj}JcRh>ImJGs>w8KIeoM1dfS#5~wZXNV6D zeEH}O@P{$3#T>6^&1hX%t>dp35-Jh(%#LG+F|RKk#7pP;XPeqHB6OC08Gy7{d+lSn zJApaD@CsHr#8*9*_yV@#u8M9eo_4^u!u^Rkz;@BdVbUU=||W#9b%s z&?c3~gVJDW3(@sSp4u9d^VT@%!aj-MCmV9Zg#Q!PC(&je%&8f|3I$^|^n@iSrK$f8 zMiYe7z=s4{qrc3!%Dwzk?!h)WXsF@7U|rmkF<8MHScu;j))@`^G zrK2pS7ms#|nbK3b+_{^m^sTwI_0mth%e8O*NH3TW%)qQh=69K6`R5EBGa zTTX;LyPG;!9u^NOdOLRz?~|ZAG?_|GK>*k@z<53HnQ!#%jni-Dl)dqavSu@F{>(L} zN&Ct=&5tB&vBrAqsNdoTi5E00!ScWWq>$XzUma2K)OZaHq5-l!Ao-i~=8^(VOW^Z6 z-49cU#Od_FqlSeptMI}(qz|KBG-8ya+s4hBf*!X*DJ&ncm8Eali=&KrbvYY4KD5C5 zRDh3Zx*?D5KOfw`KQfj4Pw?|7Lh99|}`|);})o|B(aFIbD zGp<#vT`m$1{qWq=nsJ~RSt9tZX|5e;A>fNi$GgM$;;0tyCR{zV*ab5n${Tr{6lFhS zmLq&W-xQ+2+0PzFP7U6#sa3wF{E~#mHL-d&06ahGaL7k++;r&Ta?(q@amu=VvN62N zgy?o*-a691mC<|sfO_I)Jt%EQ<~^@PBX&Jlh!ViSHNV)#u5xM%&l&tdS^~N|s}kLY zDfZbcM+B@vJzb5pBROKP%$5G<+W&2h_DI0DhfPxNc2X$%&tnew^TBIOMRhkbpZFTa zPlal3ZtZ<-Ke+R>KyDH)CLxs-v}K9_3sX8=_F^v@TAno+n zI62)on;eJ{qWi76$3ZicM=mT=o$Wm|{07PmYX~WR$YcDi6%I5%kkotjWxrw;dOs!`1~xWU+hlWR%p8fiQd=jRQ)T zUA3P}jQYwNk&EBC>WN6?A zir^JnsA6Or&|)oIxEM;pX}W)64rF*5`P-`%={$FQgPK9#U1#GgO0w>qXn7W!XLqSV zZ$bSqZf(e$Y8!U>Q1wC3N6lXy&|Tsdk1#m^-50!^7>n_GD#4CV#+v!puXXD;D`Z~KKn(()k6S$& z`~onn|Hdq}Q+nW)@FdH%%JB z67!4-r%U`|w5EsNXEBdD%SN;n_VtyHfJ^A2z1QQGtrXUTi4n4ENaPh*%(kbNDSwJQ z;r_q6<$s)C+OaL39rVc)86)`{jkw{c40#d+gIzdm3Y5bYQPn{bf8d}+I+*9c+#FwXas=`@twU;9S#5C zuG9B^SL|x(EmA&5k(L;ZEmJCd8(||k{~zY2<>@QRchgByGkv(Tx|qFo&^=|5IE2K- zCJhE^s}t_i?V7u}$+g9E)aELr$HPw~yAT_Dn)m{o+tVYtF)Uod%B=~#$lq5yln zG~H2#qCeLz3+|HIYp2fAELUudX$SG@6~mncatWo6waMDCGET?+YWnL01|M|Nr|G}K z{;t^|CMXyG+E^4!{;Gl)bb~Hgz_plwGQnNG6s(^xjuzI`wUyP4iMV0~z09e%@NQ0K*;b&0>PL?W70OS7S(Pk%@6R28)A7)q?-;+!3XE& zG*VWEj-{iOpbPd%)#rg_S&?Cib5=-2UTfl)%^os|dI^XCo^NJ~(CeR`S^cljU|{5~ zwaVntGJ<07THAfe!ox=RhjD<>7K}t%8&8Rk|K_cmzX}dqD0Q*MO^YO(kkT=!c(W9;B8IE#y3840oP;9$z%HdbNL>V!f6A`6ZBTjabVLbCqC4$&M^O#ZD0GYll$+UK|PfB>^G5u%C68^iUc z)Zb&07fR&{2+y!h+;@AAv)d##_1|d_!xTp>i8vOkpW0GfL<0VVbhY0)~T2ZKoBy;RZb6jXtY=b(FEQ_m9Q2s z%C&w$-{y_!MDGd~<)k9)=yCc#_V~un85Udo)`2}V6osR2W~^{4;}AKhZu}!5yWV!j zsnMngm}?T9YCC&Gt!PT9x#${{t?)<5ZxoED8X5*My3jlM zKbxo>?#sB8%oETjTqe>B!+Zena1CWrA%A#0L!tD4Z4vGy87eQAzL@c8c&Fw(F?315 zjgr9o8G7gV|N29b~21cb_|&^u;Xqb5bMn7#6sF!im?xZVdE zUCf;wUq15a;)&pee^B|qCa?)yIOlM*TviS#{=Yj-I6vw4emtJ;y12I7pjB{t6~UY} z25|Q=%aWi*-D1f8-iG$gJD3ddkdB*^cZq^G zZVAc7GnaP<(jnZ3RDg0nwh_4 z@@WmWI{?yuFe>TD8Xa%Ix+6^=lN8GL8F<(;HLT67FE0&i8!5D$@j`m%oR&o{Uo{={ z=KXeueY$3zzf^q1g?Tj-Q!g8(j<=!dQTBXb1wf&qN`s(PfSR0Pan!V-|w%m+-a3F_%?xyUn3(!F_;v8WEM zK0KzzzcidE;Q_EyIiF7|O*w$Lf3*VWx}o2N_*z8uxfDI#-K?gT5n$8qc-+q>0D)Q^H4RFnQ_$4mHl)|e}oqQvb&kmZ9b z*?>a{tA`mZekhrM0$G6e4s7LwIH_%A%?_YK_UnfEhOApdjY1X-annXZRm*rUz0 zZ|dv8gP~Fk)3c}Z)UAd~r74{UQ)`?IX3oLg_7=;YDe}ba)1+T1hOOW;JsklyIfksw zRYQ8ZY^;3cyIyybqP@**zq?~Ysh|0Syb`;GO!SXoK#?T0CW;Zsb^P{{^CL%NAfKd$ zM)eEWW5zp)Rb39Fyx?%(7yE0KTI`JFd>|Qb5i5&EuS(YZDNXlT-gR0vc64YW%dgzs z(XO$P2`W+TI^R(IfTG(t0`#kYwg_j>L0d^yxx+)$Jz@o@Eh$^ng=}C zVbYv|f2-HOa8FJ254ZdmC}Fq^10i zInD5ZET=lXL#N+{?ER?0TJ$j^uhxv=etKVD-=iBwYN?7LLr*XHXx_)h6uV4~d>Ggv zCXYA8Q-D*k#y!|T)Tnuhpe|asTKxh0J^k%CUS_oVVa^mmqOE>$b1eblh&%Y;2 z0pICIx^=l>v>XOgawFAcSx#Qx(PCdq@;fV**C9(&{n_2=rDi^2V}ivuJ~K1yz660G zx?-coblgpl#T>^Uet;d43ITA28bB7}P^VGFi1-}SZwVPH`v_9f;U>}w)1igZak&Iy zy2QOnRZJfRY z@#{shXy&M!JSA!~Eb*UAAs#xlacOs^!RgWRL>L>Xn;1&vwUs1;f}@p(0qTlTTDIOo zNA>@*YWzhnd?VM7aJ&C9Ea$R>>hX84M*bQ@nq8;uD4$AE|yZH0t)t56VS7Oq_gh>OA# z;F{&+NH0~;Xovx2)bJIfktSK#$`X!+(r3(Z>D{)8o;HM7qBm`%MXtIPFw8Tg*mB`j zB0D>TI=YF5Ll_(KsTK)JskOnzAuc7iwT-3A-GmHnm9oWsW(|<*__+R< zjBKsM8;nHgQ zzRsqSv!=E)CZcsYr}f#Lx~CvOJzWBt+fz`DpFU>E6i}P33zGyt!lkP8>YIZNla_B9 zOzl2L;J(*NUh()?UrToVKNGG0isSnu-2KbHYb+p0Cyr4D%F0R<3Kdh+j^8IF-ss?a zft2=l^zk>>DN2!|McsLO&tZjnQ^6OlJN7y7*t}36bv394W~f!ReC@{ z;2-EF2mwVRg?NjFK!k(8t4?Dis<{C3!%Pf` zx2ORyaZFqM%pvP&(H*LUoEL67FJ(tOnKQVMjq(=}neySn3zhWJI$W=%U_ieckt50l zk>ithLNSqvM+4?ez8Y;12iQJI4Nb{%hqCfCHN!4>ctD474J*Cf9AV-e$_XZ?PEPi_ z84X_D)TZzA7x0!cWf1|hM_8|Wq%$`_NKs!Vu!OD1aXxA2JZr<;?f9{teO?tXQ#ZO& zY7Mgyj*R>hW$f+1VGK^&5z`&+q~sp|>5{j{C9^jw-Oc^zhJXz27*(<@D<|fJS=C_| z!EDp%!9L-ubaHW=xjI6Fu<0_6-&FR({%R`7&V0gYvwPI8rY*}s8U$QPd=3*a9G|8aob6+64CtNz|3p05rjCixE00{{<<3Or2RWjBI989AU7|4 zq1Et_D*eNcGWil~>)NnOrzYCZ!&0+9%q$Oz6h*BD^`_384D@zo_?cC75lUstSX z+hAHC^Ng^k2l-l4M2;ucn4FZQ{3Fg9!jPb!}80l05kYocs-H7smwZ$~(+ zt*bNmgSkd`DJTH`L3e)>x_-8Pf@Xzc?S%NQVvWH`b#J1@kcBhfLdPG7Cly1EWA)W7 zv#35#>t%4O(u1ja7nkZ1r75Ge1BwhL+el7jCJ{MwcmQzg6c^97h=RwU4ajhN z!9C`3c^e=*dG&!Q@@&42^|oeqyV0U>RX0i(Of#F8zB-rM=N@xyb&%w-UF5m9i2_(D zcAs3B(hpSeUgKb?H=p3aa3@J=u*0FaJvm(WoYu;1IyBXs|)PHsF|LK_iicIZisnIk3<|Fb8QrC5cy_+&PJ3GhU)5~cZKIVKs_0}N)X444Of{9-Yr^~E zXw%y+8yNqNzHQUhF*b8E+Ub{aX;sa$&M7UWe8;;w9?Rn4W0O`<)2&(bWlexH^S@0q zfAj;j$bQZ_PwFgnYVjcyT7-k&rrVw;=!H8dpawf_ABj(`93|)O7bmN62isVcpEL^w zIvJ;EdQ&G}x*8aG2ZB~Lv;p;6f&*mJp89F7c{dm+@IZg zlxUvpwEYe4cfRaWB~gikk(>2EiO_rhnpPX%i0-;cqR;+ku3)zezzJrb+qmTShG=c% zJFz|C7Kt0UqZRJg{|K<%PqkAJZ(|8_rroFv$2ex#6$zsdMwP6S3qnVUf;qCtjY z!Bd&RLX{=msnDlBK4Y;ba(61TM29Sgf{k$oSjB*h!kX?@rFd&t0wtU8(4UN9447>!{!>cEJ^^D+UU!eR*n@(E%bOjYs=63XR+=sZR=i_=&ji`abRgm zUE3tY#&oQsLw5I<9M;f7kOf;V_I3AJ??Pwyn#;QcN+ z%ZB)^UsFYv&k&||N=3s2YUg~b_<-u1YCV_mhdvfDz8Bt{6C0s2Pbjbzy#gjc1-1k2epOR>#H4Z3SgGUp^jMBQ}7E z*{RuaT%bMr2VJJC=!q_AI-C}#2eb$i2S;m*7SV`n-6=FAsEaxp8RK-=6i%b=;|)EE<*)1k>fJfNkaCT9;8%e-*b)87X#CUr09%s~TftBdp(NlYTwXouKhk5k~z%!u(O}_t2ov_APu~eI>qsMHTPkK-v9} zj6x-TJ*AF}3B+r4a&Pjb&FEnsGh|ksg`tVuQr|B%FaTBtHvR>BeqY+2;M~{~9Cb6) z1GFk$@v(a7n!6xg6h$HX3SYpe#ve-{%t3Ez4<0(E!hR6AfvUe4!D!E$wRHBM^>#Wi zj=e!&+U4w#mA7r%{BeX@HQu_)H^Q*{{=Eh-L$cmQ-{a!NYXd`uu1{41m^Wjy6TTzQ z5x&c#jAG=4s}GrbZKC^iyRE`bSu%Bmtwkx}wOHbHUn}pK#H6}%Z?zC6jQjW+jwcG1 z{C&YffqD<154_9JN~jW$5XsVS0zHT;EHcT$w;L&tm_d9r=9)s7F#)_X1G)Og(dBP% zf18<3+z$+0mdIQ97||!8UT!RuYUx%Z>2Zdvno-|ORiqfMBds5I6TT%r8VKPGC4nTb z9%XEzf_Xmn@e=gpgp58YjsudlzCnbm!}^t3V$BfIC+N2G!y`}_d%BwmC6qg3XM~<2W50)k zIPC*om#VXjwl5^yFyVj8uB7Zek4@-vfLbfDUj5G1lXN#IQ*?7S@I+?rAJ#~Ch30330)F1*y+E!RAc~(~!~Glzado{agE*i{i=z#y^yTSG zY=9ZY)q8RM!p$<^qUO&@oQ%6^A!c~h6XpJxt6qq-ipKi&kS-*ARp3k8MR@4CkgfIg zDr;`zTW@MA{LI{p&*xs;y~LK9wh%a+JF~ovIUT$o#*hC;N&h?C90iKNZ};&*Apfz} zy;|50St0C8HZ&6|%^UAA+Spm9@t7_gVoY2*EsB!GFEriM--KQyX^O+dya0Fmc7b2g zTbAD50p6V@VZ6O&;0Dn%RD?Pt0+%lQ_E;fISPg0#fezaNj8yZV@Vsf)Q?kTwh1OQG zgznB>R)G4a9>K(W^zQjS!RRp!S9r0wm1HdTB8f}b&j<~Ov^L#K#%lYIc`ox>gmIHw zUcoR?7PQ6Qr{PZM8?Ck{C5U+;2ICONyPi3p8C;#$g(?fEU&cPgXt(MsLCaxm9(uF2 z-;Bp?58q(3qG&BSBfO!UE>2oa>szw3lfxlA3i(&|QC}K94Wq-~VWGLNz9c1x1{gOm5FCg*-Dptbr`{8^Kug~#J2x^!+I22}o z4_V#mA;OoIN@z{#SXMu)f3*RsWnm6)X?%L>Vmf!<6$EA()cbuc!)HP;BdKvZ44WRh z;}%jAQ1;I?1>`4Q9Jlz)eQ*4!u8M&g06aB!GgNDteGPuQ$y74&z3!ZSGv8t|6xbCT z4{8=mZM28y6=a|}TDPHM##E~HhC^I09TyMUIBl@Uu(40GqLPr)hD`Ss^3~aG!Ibx zlVba?#?Rt96^^Fvn@^ttrJ0(!e6j_<{LW7!|3F<6vipOI zZ0)N;AdfgW{2{v~O|zMDQ|+<&jATw*yeV70a`9_-EwI3pYNFqGXKY|2y%co6*>Y#c zu>p=Mo=Z7|uK0W-W`2JsFAqn}|KbKSFwuS@1AmED1r8rg95?HGY%*b3)`Uo7V$^Kk zRtT6fMN?!Qd26n)bKi#{5Gsy4?z=r?V%g#d=AbWsms_nPjbjXd(apHrD~!Q*K2na4 zzQktT1Tu8f?z^*0?~Bilb{3m!iaWyL3CWVWWuKoM^vWL&wz^)c1wf2rEwG!4(zXs} zr3mke9j-m}zf~*JmdkUjob>+wJ!15wk}pRo3zBXq(Z@v}0&4Kyqy+KK!y|Jin#OA_ zLex9RyyN2m4Ew8peh=~Ter&Ry_YSct*5y~zCjbX*_r+12CORxbgchWE;1LNJIhv0I z)=}Uz0;B$zG0(>c&YsI+_PEQZ;E{;x?d^`k%T|ZIt#b*2Qd?-@ETj+mFsJQ__|whN zKs@8{&~7CBBJbSgT7q0eD|567^M8;oe~(c!aUnw~aD*9QOPZ zRbY6QqCNpEOWFB|>D>gg9e_&3$gKm#EL)@e{39girY5&C=9;HpO5Icvb?nZHdr<89 z{J>P*DdepP0qDtmKCL}ZsKmWA^QK?ht2PDmxU1V`T8OI8i*TsK!$)?fuXZR^N=!tA z{DtnBgXes-BzqwofY~`2h~ekqj|AU`H{j4cagGA)LbbwMV|6}$TJRs}o%L2-)c0er zoVz?V`^rzeULT{6ugd7`8-{_YHPXXwjSOHB>-C46jm1x)xQ5FkSsbZlS58j8@zWhJ zhAScBflprfXkL451&MFw7lzwR_UoBus{yxH2I!9hQ9 zU4OS@^O~Xzq)~}Yw4b+Nd7-#P+mQF}ZhgFc{GQyf-0(pfDW7kpAA9)xo@Rs14q)zj zsEE1|wIE+vwcH%~=m6$+7h4z`9xjzJLz$Bj)?5H3Cl0J!;%DjtkgDAX#Ho&g5Rsis zX1{1AcUu#?KC7bbFJbi&`igoaO&<+>+gO~bPw2ux3W4LM*)0~S_|Co0s2{S#@D_dd z1Cg#Fo~?D8pG<}Dmh^Tqr@>$Hf^*Yvqi=bbGlrkL11e5))LHw#|0Zpwqt!#S`SlBL4tXMvSoC!tjcbp^TpF8WndOc2 z7OjjGxsm=_=XbF7O&2Jf2&|!BT`wOge#x?x^XH8jiPkV47po8+FRNFMFrgvEeC~rZ zk|qfl^DY|tsldU3b)(@J!DFO5Am&7wTu~8-JRqsKIw&iUmo>3QX344Sm{w(>vTWdR z=p|(gha z7=S}au=bs1Krdo}CvMiX3KS^)Es->UdiYb=hdXpHtJGO)*(A?W!6D?oGTD?<+zGg3>RDWk3LxntYqi}cH;#(ve5GxHI^oFx$y|X*B z!Eb+MF7(_wF=jWsYR>2UJS*;XHSzB5{JVyCZLR83Bw~z@Bu$H$&*B@|_R-E$+3ADmHA5Hd-lx5IFE0%B0i-Rtg|Xa zV(I{?>19hJ`9JK#z3Eq`RnLKW*f+di_>GBN!HbN$pA8f#+HjMjr%tD!y@OZ%_G0_Z z-fMQP!v{)Bq!DE*wrdz+wcb1AlVksPBs?M{Y1k&7wog?_M=X`*65sx+{P+j!xummr zctI_!mQL(!3!?5;xM%^tb#)Tcq$A1n{W|^Z-UeBAmRe#Oi7|&8@(T~hP({d;DZt?l z{xL8hmb%&Qbu~rk+UFzvc(^Y1q z)A*FGqC=Bl?cd#?rlO47G^u`HLXgP#DHFg_bj;4WycV4dDQ{`I5k$~6JLS#Q^4xVh zEyVqq>4bz@9I>ay8~*>E7acf$KQKNDOCwW{?y`Fa3m-kze0>hFI=HjE)(b@zfnLE} zH&l@wu>AfVj=Gv7m-P3n$@t-}0P9TLw2rU^kDxzG&r?7 zX*HuDEzYA|MmpV4Iw4W-Ifr?q$gGnNlQ{~b;gXmU*glmTgUdw%tVpIf`(s>`DLnD zJSMUGVs(!s0f>9i&nuEBPvcYk4y3touCfmOa9(;}M&5h8TC|;G$P48n);qe`z-_tC zQ2zj$!(pqrD~GCpRV#|LadEMHi#IT`cre!7E`&Qe>3LoVFxVVrl1?h6nc|Wf9aDy`S<63 zK1>T$(sRsyV(Mh-nb~F2tlaoMf}@FGFNi?>MUs`2IlMvH%vSDW6ZcAv2iN>Ny>+V5 z!Z>ha4=^%94_T?u)~%c#L|DDnYX1WsGgYBc=nm)xI;V?U>)w;Zhgp-sQ2hA zJM~-pZCgFA)-b6G%k@+J`DEs)#ETu9$50#5)lH=sKh~g9wuc7FslU&&t%lN0O8yiM z^73u?S=@3E0rbyhzE3D(KVslr{TWXQi21(jy*aO7t{XyR6zskr^uI`HXMDVlY665^ z7=Gqqzm5ufhPYZ^KdiJ7pU^{302E}c~EWm74sA_tF| zbBfHFB36Zuxe8*w3QbClbB#a=3=Gf&f^G%#0Bxcl_||nc8T>TS@ovjqM_^;(!;D2-_JQT1d0Sd$s^9Vzg zJz$O3p8GY;F0FQVCs&8c*)R=?)eV%oUHA0y8;V8vvwPq7 z??K$}BYv4O@u^Y_n}0VLJUEEPnzF~YHsT!$!bL^h>D=!MsEpEWIKl{j3t3{%gev!Z zJ9q(h3n?`4Eyc5pJZUOS?a72a4Kc|vwy>b(Qs1Szn9=Gj#sF_9EgW2y^PS&4$sepg zPt8pns%OjX7-tU{ z>b-Tdv@dPE({AqeViI46lNvazz=<=sXpnXTgK>pzsQ|8>&qgoHLRe4Xf{HMFFaquS z`gbI-FAZ{>QM-Ghu;KLkpp;h^mrC}~DI|)md_L|um%-4T3;RmwfTo;EEXrK0_i$UHm4o!83{7I&h4L-{uU2(c z3*gv@1ALZlYONIJJ3T^*a?DHa4tj>09_=~?kD<{Im-*Le{?|ftFb^ph3Nb`8Y9Yk{ z|A6N4tC5zn^Y{MqdMEw5DTWQB%)FD9N61|TGgrT8b5AqEUPsHrPTvDpe$p%|Y?%j3(6bHVD|Pi>7n zD9R89h9@T2Eo?k$c$3T5Q7wUnhV4gD!K>x=G$a1|(yt(j8n}v;OLM)Mc5~&id?%$D znBHJ&EAltpphwTT&&P9hu;;E0&Mwu5=o>e4dbm#m<}xSy&qG_120(O>4HI_As_Cuw zS@czbn#spjER|?w^sni}#QYoGMz4#>$aR}p)DIrb+)o~6Xizt?=r<9qVoM&OA?Wbc zC>a^PnpbAQQ&<1hy2 zN!0D6f02JlbLg+ISX!A}adnRD-^>xgrGuC4(*?J8)5D0?QZ_fn7Idclk6d=ZryxX4 zp9luc1`n=bEjQ$MP!Jhd`^`V(& z{HRK?nRK?_(nl<1p*{U%qKSIdzuo!Ao9`DtkKaW|;f2shg>GC_3u5)h706GZV29$;_x5@dg<+1T*b+ z#38r!4#BKdBVb!iPKU&KCDzr|MfW?S21MyzX2Nb0C$`t3K4P~$k-%{%>uZH~(D|qT zkE*u}t78eah64dYkl?}HA-KD{ySsaEf(`B-G`PFF6Wk@ZySqDlJLlYU-~0XC`8{hOiIpdTyIzRh-xhmRJ>x0hIOTdLkFcg4GR|c8kCA0z;R}B+M*K*e<5V6J8h5iKT!)*M( zJNxNfC>2xaYkWIt=bg!KAQJK;_+8SVIt?*`SnGYzabGe%H5-X2(v;n3_z^X)&C0g| zN*Vwchek;n8imQ@<##`?!XRGT^5lo4`A^3Tp?h9mzD&MEn;=l|a8QH5;{;$H=%tX; zt*AY{0e%}2Pd|c!Shse!Z=tv@%W-EGio2-TG$T0Yl)t`ib`%_zia@))ry$REQXbRq zR6Gnnb=W+n^_@B4{J+yp|AVG%7>a(#Y`|OAX);6(!&vr*@iHsI1AI?%T&>6azvrpy zM5E?Ze);1GpbGAAWpoSS(Ik@&$j81{4$iqd85NV=F9zkv#yL0Lw4U_|S@7V~a}bu3Yc2=`Szww( zlcTm>ZDH$kuuIg^bWba`*#y!R zf@Fp81&z;FKb3aVFam!rZ?_i&g)0EA**A}5Xt33#fbWC@9KX9M#hJ7h) z$Cr%{7|?r+jB|2cT@J<|h*@qu*+c#8;N{dlTI-nyL(=mqQ^*G-0&rm;Xhblg3ua_}2{L_qMYRG5w`tc^ z?Dm?}RYdZgnu=H_n0C|l2rUi1Gq<-v7QA;$t>lalav%K03-;l@Qh0`FNu4PXKLqIE=8E8Q zk@PSy{^=1HiQUz--#%gPYwQLmDMlf*3gSX%KD5c^&f zsz1L6mJ})6Uzq)b{8spLg)GMYSYC;AjH6xARxd%B=MIif8UxFTqvrS$E6}7?uu=kZ1YoRYIQ?xwklvt8P}S)8$XBfqYCNG zJtn;Ir|;Ka#ifm5qtt;c#WNe<^YI;tehZ3yG>|ZG{(Z%!&m0jQfI@FlH8VSklo-4R zlkdPM9x0UiKP$qGQuIUmo>|c+FNE8FWti|whX-%7j~Um{sUf7cYhjvHzrSShQw!^+ zrTvXUfT=ft?eS3sW*9}5EKRy3s(d7K*V5gditc-fcB*Q{s~zEDsGp{SYO~IZU{*qg zza;tu{!6t9```;w2GgUoA?&@ukp(IV#}z2;dTX_(w@=uqxru#fo+D2~i4_Y(A#Jfk$;J~Xh!zPv^B&5|x zOdMr-QwCYX;8g`ZZK>@zHuLJU?{#4OwiJDkZ&$`zS4o8RZoX~N_yF^pM1aS5T{xv< zMgH$Ys0y~1P{iL}e~Ka8?k}i|ld=jRv4D#iB>B>^GUio`Iq-Sh%dk%)cp>$#o_tmU z@=!zrZmEZL41YwAuqjmQZ>Ul}PO7T;FGCVV60M_S2^q#)C`QAmYq+N#C90_g?LadH z)|1S;M-WvW7R`zB*uYThPW}IjeDO;RawF z6RfZYh0!9;E{S2^l4q4>2g#-9`hN9vM20Xa?)yW_eTyIG{?}6&LlXpCuCxeY)Ut>a ze2)2XJyaHLO8P&3WbzwCjAY+*1Lrd}8)427ozj-Bzm*&$Q5U&S5%hh(M;2LUURj6$%*0A~K-Cv`}=4fgdV|$h0hV!))0BLA!}t<)ee*5&mtPZq(Bc)i#Lz%+2B# z3#RbqK1IcqKa_)Oh3|109?x~eO}9sHYB!V>W(c%e7`KTn149N23i=P;j*yO4F{4GvV(G)N0u#dv6z|8XZm;6Y++tplm zVs^+OSIwg9H|qPgdm}cA*_RMG_yHn8s{`yEV7}uOwvqT%`H|n>pEOWlt)O!^1<+aQ z>oP3?17;T9r}4gR8?HO^?P&q9{Zz9rrUfK$ID9HvVoy`;e!5|j>hkQyTOMJl zJZK)&)Kpt|E9glQc#*AjxATAI3`S_t!?%gglfp|^vqx=kzFFgBgc0Y6ApafGzvIiw zM}$7-&DN4y!_ksAv#TTzo!}>8AJ;4D)|HQ4zXt5V>B-Jo8KwEw}~g*8BuXKRQ(l zz#AtYBCX^c$$$Ir#TUJwrOmm@{hj6XM#lGA=HxsX)5s~J4{}ClG_Q|UoxJVfq8#Ejd3yIjE#D@CZQa{$) zRTbr!;2-6W#R){? zG}n{nD*tB~=7bQIaA;bCeoZE2u)qjI#TDtm^~I}wp!RF6T2rC|auv0ER_-RXE!p5# zlk8lBto$ftzRN(9OYo_;CckCWjjKhjV<%zI9l5n2z{@-~B8@n4uGb4DGc(HltvYgJ z7dq<|)3mA|zfO-bnUD+!i3U6*#NvEH8|`W$dvjx|6egW^K45vM-aa_M1mJMkcB{vZ zWL%Cic>-3v)7rN2SxkPU%y%+eU0RT30F@)6_=_! zeHB8MmR^}~)vuyMzZ3$D@#!2xa=t8JacNY)1 zT&fOL6f`oZ;~y~1ORVl(aOV1FQjh&~*pw#7QAO)(p>L{BdS}@RR5Un?jECwki4pPqD2myWL@4)dZ&xtNHlxP`UE2Bw#R`N;)gOFBSFJ_g@~598C; z_Pl_UR%&Ny@dz|&N(%D%5w1^YR*WWB3$ueLT=LHp&G<~%;>E$4?$KdYnfAn=h!KiX zQj+xHzkXqjA}=~YHfvmrG}JlH6}|uXMvWHMXIN}I;L=CR;9F`sN5!2&{Tv=uWl-m7t;CIU$Rmy z1z#FB78V909h`k(FF2{bx2Kn!1TTW|Nl`7$H!UK*yA8+L*;$Hf#S~$G4C3qBG`hQvL7v_x>E z4@5AeqCRl*)f3^K)HB$H2*zXsMoB>hbK#X?0VDAvYmHE&BN z?)q!F#k-Exr`Cqsq>@gLU1dXM3N;S5Ef3C?rxh}4h;*K`j0ePB7o8{GCP%b5qSD~x z1*->P-1c90_Z1nkA#kxr73H~X#($m_6AmS+4cO>lt{ml~XQ0AWG`+QaeYdLMNbHb4Yn3f}?3$75!NT5du8=yYil zRRT2p+eVqMa`&0?82|2j|D+H65Jyrz0aH)Nxp)74fhEc>qa_slIro?4uQ{lw90x+F zMJJBO2mK`bwXeu%qsuu$*4_~7x!P(%oo$MMwraxIA^#0u6}B_8rGKIrp6#x(f|rcY zN1EKxIOVtD8O`G6)cWoD9az#5M32wHkL5>n5rQf&UIR$Umfr8PW_D3{9~?VxwGf`1 z543d^ysw7?@jKqOa@hu6TP)D0ML&JPPDqTqd7j`adorR{9OC=cJZq*$a|r4y)L6?4 zq;(o60Qzb(m5;7+u~`?DEPOfKCjI-`QpvZ!3F4QH1NDH1x$)nhja<$a*=RWI?*VLd zPu}+W(pJ0RUz9|G=Q6llz0(8d=k0|{PftP`ur2PF!FHzYtZfsC#ON~8WAyR)3Gh+7 z!FC<$o$e{k`Log3Z^uiedZzA66=ML9lP|XH0+!w?B~yMSV^Hmbi7c2Ea0DuO4TT~l zq~xgFeNqiJO)4C?*6#UdZn4~G9bIO${8B(N?2ErFmeZa5c`T@Yh)ie2t5jegQX?&_ zRG4iB?}sTw)=;o^C?Pa>PS+-SzCzt@iW5!`c#pvM?7;4D6O0sPtI3y-zE}sq3E`u< zAjPPxRHBMVb*aui?*pt2^T{5hYv;H*0`*8;z`-(l6zKVGb?4pi2Z!skL+z>!v^d|) zfH4*!up=hHriRmn)s=oEBHnLoMuN7W5|x}D4>=j@iYg{M!re<*0s}#-zaMW;mnP;G zaoql(uda|$?U~TPZ+kp?6ucFLR%c2sn$J{JviT<^ zF{yZ>9fPWLt>KpczfdingulBeE~^Ohe~i&r6v;=uw&{Ky;ktVh^;~~Pk%;!sG_%iS zGmRllf8-d@6)?r-#n(7fYvL=Jo!NnZ!LqX12cYEuf@%U#f!g45p3u4A3cnjJ)))N9 z++;i!9m86FiE4ZAlw@%fi+nDcSDk&Sd$d8TACO7K*wiC-V zfZ)(=o+4hiQEP$Qa`#}eEvuf8gBc;}(N0f7P_>+A(4M_U`&z%$hGa$07$j}kVX$m~ z&W2Fu3`Xj))7KsB$ZaO!876XyQNr@7l|#0Zfb$U={vRLkC0W@{-v>ei5_H7 zO*ub~bhhbcWM_Qg>^5-iVQ*3Alj4s+d)zon@4Kyb0 zyM6f_r$jh~fdr)=@!24rNo-eCUIlDlS-ubK%QKH&nvV=CV?jS9Z{zuT@4@#5l3ti5 z7ejLxg-+A7>c>=gn&@{dsC#tbDT*CN~hZ^N4)2SXOkoVb=1 zlleD_k@NAXZm>`UHhWHyteC=-k|B%SsY9)UlZv#7SZb1jG;e2rXm+uAr3K|GY6&$a z^~jszYsynqKShj0BdUnE+_-q!r_HyP<%WmuoB58Ir6;i`^l++3qKS}}N%9?B&{(ZJ zbke^Vmr$_97dQ7kXO1s-SbS9bn0P8z#g6&dw!c` z3T$3XdkS?26p9hANFzwOZt#X(W$hMD6x%np;2#n03Kefx$WVED2b``G@DEgx)tSh9 zT9xQz(M)hRm2D{|U=pyunpQ#o3}aT+hVS%gXE%nR_MvXi=un6y!1st8`}Sy~tkut8 z*!9IrcSl))m3L5`qb`VrVi~U89`CN3emmi*m$ShFfHkPA=<$uEtTXzqdiu+vZa=Zh z>a3vM#)?PE!&YI^m(9l~O4L~z`6I4OdkN|=JVrpvKdTDLABW24-`(elBW6%ENM$7d zOLSr(UPeiSBIPb18E#UglpF&vUs#muN;d2y6ULm%o3LbVH6K;tU`n04WLc350i(0o zrQROl0q#yo?p>ohtCVS2YD-MahG{D4*d{#sIW(f` zarc{P%VN~fidE+j(JEe%8tH07GGAylIa^*POJ8)TD1}-B+6(i6^4t@1#2Sq^QUL*4 zWLn5Od_rfxNk~EZw_&_5*zhH##evQ!km3nC^t0U85NUAr7v6gaKfhEJe>N{Et?y3N z{k!e^76$w5xW1FzTf#;anl0A-lL!1wtK~3#X9XNNR8R|YGfYpVdiyZ@h7^4T61b_1 za3$iU+nN}FMN^Gt=*KgS=Hho#lf2&uI+lr`u#ALmYuU&_G`CXr^@Am4jvwAqy~$xE zAmOaMNtP!^Il^W8T@}G!xMEKNEe2IWN=r>iiHn60mVr}-#+os1JBDR&WeHC)DI?q7 z3q44A531iZ#ExJYN%ltkjo1Y1vxW?I%?9zi?V>IKUlH5eF*@XMr;J+aOPP!azdH`D zgJxMD`eV!=j2YArM!3PfcRhYNP-V|FUvS@~;z^rnFiI`@d~TNM;+z4|EY+Z9TUmF9cE`FJ{--+6sSh96V z>KXp{Byh1_rP6&h0G(@IfJ|KrtZKdOA&)r*SGgXOk#Gr0%T+)HTINo5zOkK7{{Y_Y zSit@7@EQHq`Rh$~w8O$fN5@C2s^aEW&sLhkn$^XXW@R~0C@k9|)%-Hdm9-6c`U>L!Fjgb?!H}T} zvG-Y791r5+WIV`=SAR+iM5qLt|fzwH`EyZ9-Y{V;c?w8m8IB+zzr`8EMJC z_UA!wRph6Qf0bNGxonAXVpmJ%81m>(31~-0j;vU|D$^&gI^o&xdFBEgF~s`jOE z%MaBF%d8cSE*4CnWF>i&>TCFX<LI|j zv!oGIX$4O|D;*NYJ;X2i07`l;J}Gy={Xma2K*YjxLNZGfu}1s~d#1|^d9431PAtTO zRYj2fIhN3dYc4>5e~A>Mj!3s8KmF%Ss1dAwEaJ{m3RS0|rNsa26aS_!-2jCb)PG?m zb68hYh_k>UdR|b-U~|u``hiCDz5Dt=4zcoxVf6dcNQ6!f~^ZgC}Rd-%Nr>Z{YRb9APntBdD(eRQwq zt@;gdRIes%OjnaC;s+uv#W!&o$q?xF{oU;WREmgb3b1C5MTJd5ytS~G-@AAs?Nm%Z zxAl?DO>Gc#;IMF%tK6OU*+g?P4xR-X>2Pj8pV-VV=_qT)#o}b5;;JequiIQ;e62+J zW8mV>C>WKPkO*`qBN6FHYNKL9*xp8_q<12RwiiO8jvno&P4Yn;Scf5y$gyo8UtQHTLETShBHFO`W zC+!2DqoxtKf`bYlz=jm=+lAdKgMa-G9OwUQb8g>25h#9m2-bf=sl0I3Pa7c9BV}GA z%5BkQ?&-_vH?CZ~$E|ntm(}u{aBXa77I=@Ixk(|7$e*!VJ}RytIP>p^s32Q4k5D6L zu~gkjW~p8g3gUTBwr5`o^`phN1-s|-`;N{OmoKR&fy3MeiA{<`PlFxYqa=nzy2(p( zlPL+`qrEdH2F4FN zNM0!`cXP?Uoz^Rh?Uez^cKn57pT=n)Jf9u}R^i|xOXB$n|L~0I0WHHTf5OJx-g;vn z@#RD~NFL^5y|_TEMU8XJLEN++cEYc;kZvs_DBMmYU+udxFQpfe4APyzPl(Bgzm^xM z#kb!U7N;7IeH6qGoX(Fd+B7_%!&if&gu?I|LIY0JqEEMi{IJ5=mIF?W&o@z;bs{PG z5#yZ|Mwm}d&)^zi4^3Q)ZQL$R_NXHkZbU2Z7>Lu zWh}qNub)(#lnu-be*r_uVkZXU*}zWGU~lo@YH}kwMCs(x25!%_x$!VP;q7LO#zF#@ zDjYLwJ>G{#WIG)<)z=k%5}xaFH76D4Yp-kVf2n2k%m0G)9%YTiP(h0JpWFJ!o_3Js zxA9g-R%H_Y!(lS;!DB7_1hYLQ6jTs5P!Wjb4SrMyW|aR_z-C`!^WMp+5loIH0`}ul zDoEq!Fbj2usmEBStF`%dnoc&<`8@^ll2SUGb?ep1miMYzTHbfgpWn?73jGGCWprP=ueU{S_Di%lrAk7pb6e!8+ zin+mP`^~jg8Tv3(GO+7Oz=g9OKMzJTP$8=^zbl%H{)dr{N$`IZjXSa&p$8pBGV&q{dl5qUK{jEK;xdG;OmyTP^Lw3p-?X#U(M0r;Zx zzT*SMi@0f;+cbd6q9Ch%-f7ECt=)Fu?E}P}!}kPKtVh2cGi%#GSKd+w&*w$Dv)N?VKDT+apX24v#vk9c@sWLl2HjI|PMSJ`W6Td~ilv z%sHA3$NGmC{LiYHnZUvrmPWfQIRBe@Dq?w6T293J;+%xK{Q>m}*C&q7yc!F)kGuQ3 zvbbD%RRs7P2Vyst(LA)acvh^Zdo0D2x}1)lkA9122?<4loWu}MIIES!f2N~7Y$Rof zsd&a9WP!7XkCH?uz@LICPVrM!<9w!H6@~7JN9ZzwWulaTzrK>P;=l^ zat!zF5u;vA{>2jsVV$O(IaqTWDShEhq{Qd)r(dcxI^FMox3Pb2QxxXYQUaA@pA<_D zft{rP0tNvq2m2RsNn{c^CP|8og209q<~IR7TLn`RD{(N^>Y zj=jm4y+u(y)xOQ#Nfz?IgF^&UK_M_uo)xy>{?Ca1^Nt{z3gGWrl(*9TbUc7(o>BC2 zf1#~}3qQ9oLh`OD%IF^H%7l4j9MGMy@DdT{fO^9+Yx<}qV_^mIg^Cao3A)1kXb`l0 zU)8b98|vrO`t(_hPFj*w2;x0$2Ocz&57{I&C5GwRe`?3;d}E!OrJtX#WBYSg^`|sN zBA?V=WH+i+L%zEPhSk!8%b%ZIC}DiEq%G%4UtN}u4MmB^;u}Yw$@|JMoCNjUtn%@O zK6`U+LR3K=zN3r6;^D!|dEqLA1oDk2`4@AhN59AE+P55n#w?MgBwY0-=G#vHM1d5wK=`_ zwPAHf(y<;zIY|teaXK#maFx~#WuF{^9$ENKbLynLmWi@*TgUw1PrjEx%a;V_?5y~S z+M6dKlph62-k1LAy8N;653N3EV>i8b^eztlx&+r#@EMur)`n%a{+9u*y~biQO0Ya+T1<&7HH|as}p>Ld=4}Ve!@kC#yv-!S|Wi;Hx8Emg}<5b3)e=Dn=U{!q&~!{jJ1 zIx<8{OWSS1$iTux&pa$GM?+2BQ;?q!*$^c=o!+t2`_L*dzwpo``30AyqoO$jbH*80 z-~Sj}dT%L^3E)^vNp1vTaZgZxg18?zZnnFB+{u>fr8DZBEoID@iJlo2U2za1Y7w~a zxAj6R->FQMTt7niV(ZjnVD!~1~M(eI5jHfGc|Ijwh+SjtnkMyrdoMHTqx(XY>@{Wo|n zFD4Jm*mbP4i{E*?0-~E^WogFZ*CU37`Bfm42_is!=Rc2-G8jsZkfOI0-Z&H4&g0*A z+%sEs0!{b*rtASLX=ToQG-#+_`LR{9={3oaZPeQ%R(VbG3)}C;gC`>Bv2dKcUXM&3 zve$FZyZWJX(a_MYP20Sl4!~$^Y;<(myZt=V&g?5?Qd%DdOxe$wA^-lRvkV|;$uq_2 zWDUK-hheZ;2OVcibl%XZrDHxZ|GPc zUpY4G9$Ld*-A?bwzN|_^TvPhe64%`kA4cFcd9<-mb**{TT(eM?jfMogmSMoPIiK+uw0PsB}K{Lnrz`S*)9BHZ_FB^HI;D$q0~gqXW!VQ$N;ME4)8K!t0;-LPiGAj~G~fsCOfO zbr2~%@{yO}*`DV0Zl?{=Vyl>*n@efjDNOt^BTH+u(2bL>BmdpS*{GXh1y`NtjTgH0 zec~xIJE`7g9&bW8h2Gu#el9PdsptYx&6N&LQP03>G>`4Fe*=lol|1@nV2o6y2;H){ zW8%*A?@DY#XRO}cy8^M{;&O6^{{H)|4)-~VDHGB_m5BO9@I;qtN<@_xe`(-6$g3gal@o=t^>; z@GGuV*RCYHC;fF$tfO%sj>|@IVRm?9*@d@aOs_!S&jFZ;ZO+#3V(|(y z12wTMadF|w;f|eH182>QO(m>li;FX$xQBH{os8%8)HQV#Rl%Mmzlp0!;S$#-9GaI5 z!Q`g+)lA-O)d7OB*$q$;4Ef#Q@d;`>sv?IVmon*X>;kVfLlg^<<=fEW+mI%f8YX}W z-6v>oQjF2xu)DIPjt*J)vA_9~kYj{1b5H}zPb@y>atuNt1Bl^D{CzWfjtY9B+TO;7 zABWKRwe@OB_dz=`^uq%pyJSRJ;E>-zOo>cg(;iMk4xo7D1)&6MYBQClG_5@*p}*e= zbTAuSWg!_YZ~@MMJ32b zQ~KoO>_Gou8iTUVrK_#WVJ-v>OCEOC^9HvKH8m&S`jU-Lo(ENkO2eCgp>_-RA&vp? zi^(zRWbK#IvmUd^l9DCIg_#iHaljlq(P_`SeCO5oGyUY@zdq3FxJ|8u7)lLg1HJoZ zc99f(whr%tb*3Y=zSG~9pd7DF(9M|KGB%qVlSWs=HrK#hlusta(q94R3tc?_5ShL6 z<(_rfp6%JC<^vWpfSwTQGyIuZ8>1X3`o@>~ouGpNnGNM+*Z72W!33wV*YD4YW9TQQ zaMCkm(WQdT#YQG6#id`a7)MXT)eEPeA*cE|3sz5{?(DG=i9$MmIg~U>U$s@#R|iKG zoYluqAE+;ubPo;kbhUWk7jCXpl@Xw#uaC6h#W^!^vZ3l>o__o2MZ@*1?zAHYKnFhV zN6yp=R_~0U&QD6LF(JbmM)jSEQ$Y$48H9$8{#YX~$>)A5WVm=V7_1Ib*TuQQP1|vTw-73h|Tt)&HhHOm)fvRnK3B<9v8IQnwwjCd^#_nr1Z8A#uh;@7#bNy&(!F2eHE0Q z&*;CuyVrHCGxsi)(xIJN7oT?!GTGn_7LwPmGW<23ocJ51%l%a%u0R7BEg99DL40I; zZfR>_R8)oa#}dN7(Er8fjnXT@Kby}fY;iF7VN{a0EbuxqOIt8;N^tIFSpHK3w;%x z(n1oDLG3B-yxH_6=^|OtCgjaFSlXY#84$Wb=cFW{#Z#c_YKud~j19K4@VosKpY4wU?4v^EQ5T*3`r0BUJnnZ} zU|`LLB<>!?(*!L+W*xCK7I`OEKMe)8@LLP5}w^zKO{!d5c}lc$f@P( zKwrl+Cu*4UGxmp7WdULCjK``qCQ2_k?zWXLoNOAq|5Lru(hlrM_8(I;6|HS51jM-G z&Y#@X4=hPaBh=JW~+XV#u<*E+m^tVK{RYG5|8`3Np`7$waDHf*fL`Hf$9 z_RBS2c7N+=U7&^PjppYIYJDoKOnUuOuh!`<^Qjte0BOq>qV;2lLHeR!k7tpfqCIWm zA7^XVyDEVPl_S@?e5QfU_oM5Z8RHiiF)`^+1Dw6=+icI9sTy4GuOC}C3S4hA)o=W( zc41A|o9!Xd;YfT05$m7=IC&gTHkJ~?w+)F5WV^wwi`I_rS#Nzt*u_FGz z+4%-aS5KRs9e^9_7_5hx;t_2VHY`Qn_zYn}TB&y^BGI|>1_NpZ%gim)_RAq|c?ZUA zvWe6h{+%j_1t)SfC^+!tm~8&d{U}960C22suAL3igF2~Y`M%{cTlzuec=yd0`e&rB z9<2_K!;4kwTzQZXXGZYm<|6jF*UcHZV-r|Hb5z!)QKvVcRc*e#lsS3TqoLRN`rFL< zrLi9l=JOZ9=JhNCYPOdFs)Tp0Iw>vB<=Q)shLX)Xbn`*GBtjgD1#4I!?g*K@nrX05zsFS|vG!U^a@*wpR z@%tRn(>vxJk)h)m0dvY{D*n(9pZr0fdwei;n)lIsyivQ-qOt?k>6VD~lKNmmXW)g? zNmL^RZSJ^dLZ-0Er*I~G&)f5G6!;8MG?dQHO?g?oSe;+Kp$xf*iITn1F%&~ly^o4V z%B2ePCw|E5$2KZCUCh6W;{KYcd*!CHr)`O}_9?jG%!Zty8^e)XSKXvyZb{xMsIqq) zwNhhV5vXJg7y8lAx%(0ox8c7IrHL;|LGg9o-G%+$T~ppvf?TTo=aAoh8&Im_p0qNg z{ew-4QNC0)oNKwtfV?>s6f7lk|Lz>r;Vo~af%vV0u9VgLy9qgN1;OlREQi-F^t^6` zoH`n03fg`g;hIh6NgpQnmpkU`>bcAZJ(A4jauP7*sYWg>;DI7FrlX->9N!V(@^5Sq zdv#*?F%>hX?LkIIwwKgh1)v@VHMtiHdT@PgYnCKeN~hGZt{_ES+azV^DY=-NuSk$v z=+ib_aipTE1nZ{YbXP6TBy-0S@5s~tvC^#$W|~c*AFFt~5YSbEaDBc+_tGuENRf81 zG#f`lt~4Z95Dz}&b3+6!Bgy~dSo~rvD{2!_Us}oF;L)7YFs)ko2)t*lmCR|c?B(a> zRu#wM3Wy1zH-oG5d=pZG9P>|yWv!L`^HtkBSV_bnE;nD-D;jLoai~68vUe8Ds%>=n zI(WA(<>WaFz7Ua?)TgUY0+@X2u#%4ICcff^m21i9PVER}(Rd)*g2&8{ zHh}E4$^}JG*PG{>2Y5>!oVs}$^met?4U}8Szd&uf&uB+mD4z$F=;x?$pW*?w7ZmR!v5iS<5M;o0TK}E!bmk^B)+`<>I89RZwF)cRUJG1iyam{qs1slB_~~d zt#QRYaY-*%p9FI|Ua#~)4U)$S#vgFl(3;kZDCqdSzu#li0qyd%U*Fs82ePH^^(P#f zGQxYS&}DJc-!GL1JLK&udBq1#I>6G`QrW>JG@B(9zT^u`rLeXNqm zBRX0CrwL$FUjFKdw1VRKa_^fgTA%q6)>Y)(1Ua5x(#OIuEK5wsc~xz;c}TiA9>ZQoEPHWyALb;Twh zs`WZgmY3NG5Vwe3&D~6cOd@dZsibDcXQ?&Rug?KIr}ITS#I=)_t~c8iuNd_6(@wC`aTMZyB+*lnuVY9v*F%(aZxno-<=3y%$+SA zQ_E}%7t5IDO$8V!j)wi~{L#+^k<(dDZvnO!%}V=tyO*t^%j77D%*xJthR$uak@*dB zcuU}78%CDNI*E~5`K@OnQ&s>|E}bu(lY#kR?y5eOHi&F{eq(DE`@-!Z{GOcp08&L+ zAi!zX+Z6SizY7vrl#g#Br!@O+heZ?_5L_8&{lOtV_vF}L$5yf) z#)Ctrf`<8Q;N=s2s1$DQ!z_tfAtOk-QPk{+zZ_o#Y~|xV)Y6lCHAiOZlTI_F6abX1 za6g{Ny~RgZ<7eod69N<-or+ZRA+T&2EQ{^#pJRUh$k%wl06g96#K}m#%v!xio^0Pv zPTam>ARl$>0s&_02BHPBqPFXID^)a}r$Y~`gTxHOuVX{JnVxQz5F=L6{Y)P_gOl_$ z0-;06yxXr?pa$UghniM}w8>B0s{kjt#U>6yMSYISR9^~|TqaQn!#G0!rSy94wKCZ5W+gS$IMUg;!XVPM_MCg{f2zPn1u zKS5eoV1DOU%GI=(ooAk$Ekip3hrf{CPQSbU(r-OCJ%hjhNNWk=Of<%3Fo9X9h(UP- z9f!l06hA*tAtMyltKsv#?tsnnRq}6TC7mwWXI`xi<@Mz}F3!iVe$Dv_S5_Byu==dL z^hm39=ctaz^Va#0x6}7si)ukP{JPH|{kI?3=4ca$^5MseQ$CG9kl{V|e^TuR1hwq%Ghqi5lop13OMN5eM;c#7=>%Nm~J(Ri+q*>9E z;GOC*pttIIyK}*Uk_$OliHTxuUmdgTkbSg?r`%Rt81E$3JUYhi0%fIt-f`G_YFfD1 z>+wM9de)FDU>>OsIGLx*sN1C3Rq(BJYOB=YPEB2n8Bntx!}ux~=O^XQC_M@FR0im? zK}NF7%p$>w3HZ0T5SkGrA>pw$H#J-_(b>0OC?l(h+M+eDm?nkSO7#*CU~yVoP<=O?Vj{jFM*gi#tm8qB*AoIw+uGv(~gq+?Hb!`F6~-s6vENwJS4HCDnw=fF*gp zX(s{GVY;_5Zrd`~)fmTAm+4{$iZAI7yeS~;l*YG9oi7|&;qgc+?z`u4e+wihRzrXa zVI(p#DdZs2QT!FA*hre8{lxm&2(6ZO{(C-p;v(-bJ=wCTt&F<+#o$Vm zL2?X*E02Si`M6}0xnV44G&28X;oP*MTmr!GE-bD}QW96=Y|;)_f@h&Tlb?DOT)>EA zj^i5yo12Wz2cP26`b0b}Tio~kH|H})WF4E6!P&m~b=)&H^q57F4$aFZUqf{irWrnG z?X;o`eo=Y$^z0j?Gs`U+8=n~6LMJ~4{CHCsWA8LwYbC=}>`OnW`i7S4GxNnWWD-DX z`1PAm3Vm2jaRp?dwdV0M@U)37Cqpze!{>-}V-N(zs z66=M6*y_)PVKqqlJk{UtBI;(0@2Lz>D^?1lPBI%G#AMNS$^4Ldebe7{cwLcQ4Yl*H z0w+2&iO@Jvc(>01PJ{*$>ljD!FFinDnvzI!tj#Iz`lIpP`n%TH=iC)q3=_}#6ZB+t z2Nrk=2%To1<%FU0@t7m7)9FXCyBYOCRwPUe_}9zhFdE<$;jScPyWbN}t?aq*H^O~h zlpiYy+jP4F?X$gKj<#jP7jI!xn~vJ|`S6qS+WuGvOo&Ft%~!UnBynh?@B!y-D?MeL z2C}mvVyA^!i#YAi8f*c(aTjE6zXuHI=v?3hheJk48r~5l@&gn=ryLMCJ*f|KThKG` z%Abs|>qHg_kDYOUKy`R;u14ft)Zk$0P0!6|@`)GPB46s9h1brSc=T;)cAK}4hpb#; zYc~VWopf^U;h;g=|2-lD40hmtr+qYD6Rc1SgrvB2t8zb|bAG7{0Wjck@t=q@u85ey z{OG$rq@>+BKoU0RCMIZpG(+w_LNUyZr8`Ih&e31qt`QVzs#DTaqTrxv zZii>;U=K+CzoO1MEUKv8;?gPIAYIa35(5mCI{5hbH^Ro95d@DkBd%QeFGT1JIa3KJLs!Y~_Lmx@gU||ypkaWbLrvDNxo+t_ zzZU0SkH52t{?}DRMB64EJ|*)Q(o(_BfBJ?5OvBK{VG5KOv}ue3VkvXcQ(~VKv5`U` zN7dbD}m=jv2S9y(7~ffTp)y_Ry_8#O2g^nH=_=2B)sOty?$*p%#U5q~n* z`SiylMh=>j_bv*!JW#OX?l|UYDuETV;#0C#T0mdVMxktH&IPz(D2*kHZX~>ju!kVg zeqw>9fGoXHtz1kqcCzI2XO~7T1RJoV%=0;{E&}<6 z2eBXS{K6& z9;5S``{!`q9reWP@CXWt)>4B!xQ(k2nnCwu(L}-qgu#eB17zI*nZi@lK*&h2!4YXZg1Jb(EZd&45mnUFtzN>EE)+k~lXVNhJSQT4@a zC7Tu??&y3odhZ}f_u?UsbXoNnLS0N#Q`XvfcIA3pv)i6PtsCoc4>LWC@S}PVX@7op z&gW+9h6rCQ`;C~Vu@l6pZ`(*;ozi#ys!9T!<}~Ian)#PVQn;_=VD0HE3EsI9()DE& zK?>X|T@I#G7*tx8kWK8c_X@JT?knsU*Qo$=pRO3a@}}!#*LOF-CQf%ne!DHrldy4i zuCPJjbm{ee1-;evu&1+qwKqL2=*u+h=LlD?4E_Bv;ML(MPW5Wf&|Q5dUKl<1 z_x|j4@j_Pn$P6p+%Nr39k-mY>f(q^hp^g^VeZSzEVr=$)KqO}x8qiOPr#ik z?BGOnfqap%UnK<8;lG>0a~&xWeItxKQ|Uh<{dL9zWJ{^9Ze+0gI7N`~C>Zw`DtE3k z#;^0vYpC=oq>vw}jalQW{&KL`96!1(xqCFUoF?gQo>g1Qu3ix_s&cPe3n`Vh@b%?{W3CMn2~xesMReRsbBje(zT*XBLeqTje3mg<@4(vjtQZH!Y$g^7 z0u!HBr}%457<k|P5?j!} z8T<&erF@W~-MdR|4PM@CSann~WxkzzRw^vJ$>{hl(8AW){!?K&a_XtV`;8y3GVxxV zUNp;nL#&W;?Y{_>LjAh&n?bJ7Lxd$>`pBW85AR1|Nnr?0Bd4wfiGl@w zCHu?D0Ln}z0_m%5>xjw#$dQ)yk;8?`>z(ShY?0-qeE=I1kEDLZ>f12=j^>DsXO+zdcd-C@KAhek-9GR4b> zC9Ja)MAQ=Sb)o_PoZz*qYSaD&f zk#3}OQSQz(oHyW25^9Z9+=gQDpp5&CZW52&%>UHfny(_iWNOe>XfJ>AlFUx`5ioGy z%X)S|StsY8;4a9*87j<;K|yBT-nHsv?d>=0p?n*hzj@Nb7BNXY ziu*MWLnjZlX`!wIDbjy}!;$*3K0?C0-sisJBoT`;DjZlKNPy1Q8aE$SP9|PQO1vDo ze)eT+tkTG@97R@RoUA!&JvVwUp!5FZBJ$M$)kZu&EAO<%H9rfJ`_+#Nq&(G=Ddz;O zGEQRe+UzPNp|$$i=P-V?%qRXo5c+x#4?DOo+)vS|D96@$ZUs7siG|}*AbZ9jsR!pp zQ`eL<4{#dhQ^ypHg3u%=p7~~?P>W;2$FC~%45@9ww{ZBF0j27oTtE~4l0|nJ25$`e z{&w7hon}gW3?qI#{!3U@&$;3Ze79NG&oxk^8p-;+iBa&LO=Rr2VZWZc>BgU2P3J+R z05)Hn+bu5DeM*eb(G&9OF}VwRw#3Xqm(2$(XA-u&6S!mnUTXz((hYQdh`x(1WLnRs z15U*Z9N932UBFMjYbkQ^8oXOJ)#ATJXY3>YhpML_S+R5LSj_R{MN81S_UjJfQ4?(1(0s8%AF;kj7R5C1=VoA* zPm*P&{cO3@wmn`ulDP5lc|v{7?jpeLWI`Ej;=z(wtP>$-19&H6w=Z?URKJBE{BHkf z2OhkY@yo8jZ3_{b?+#{4(IU#6WR&xq27^bN;G$08e$$jt2c6c+zdELR#7x_4e7EFEm>#859eim5`n>HX})6V z^|-adPJa>I6VcJ3)|&M$btzPzg&_uc@lqJK1^>BA^6)Wl+W-lmQ?1R8KMPvRLU;PZ zs`X#^w|0H)wUKgAg7uYYY|@QIh93UmR%c$n;^^I95)sOW-TF}(b-CQ$ zN6{th`(J11n$kU68g7kH?+|!w0wU;Bzg9U{_QenMLy6E39d^QQ-k}8V4@>G8OjzTpM14}UIqYwFU!ZS_Cm;Su-0xu49IXZ-dRi8UZg*b1IU_&wiSI436R zklwPr+Z}gu;113GMK|7u6g3?A#BqorW3VfVd8R9`Ig!1=tBek}WEMS0x=f|O`}>7E zy-ZR$CF~X`n`z&^)zF9aUx!J_sX;FjLP#z~l7}ZkOFo7INTy+}cRNH;E)I1#8{0+{ z7@@mY#-!rT!>X&@aHsE}18Gr&X8sqg$=jy z85hZ5_(0dB6!$x1g9}a-f{2|OONHJs#fx^QiHMem#F6Fyz%Q!IhD*G0J8Bf%R$k~X z-NwWE1z4bExe_0FV+p-{QT}OFBbLx%cW=j9N30wVJuJ$Vo8JUH{5n@WAlsxaX&zUp z2sY1IqsK)LCG!=PQB;YM707R5C5nO;w^E9scEs0uG&}5YM%t`_*bN0E*70I6EW(8t zhhTfH)otVZakWT0cnn*0p!DcMY6=c9`HQGL07Zy+nUE^=kZ(gatUDjKCVwO^kyess zbJ>9ZV)MFzUM9{Z{Ds%8<6LYXo))DHu9u!cqks3C1KMVlxA&cw1YY^;>+;PwZFo zgy)wyA?Ukv=cRh%vhLlfi`r|-Lfz{Yq@WBoO`6ZSiF859g_y}+Tu{K;CdD8D%a8+x zu{Q?Yd;0r!1!b{ew-F|$t}%}os5%`s6SCL1s8Cc417nWx+);`BaRAorJFHu#*K_eH zSjiB^p~VQViVmm3@uO$ik7yuSl-@Z+E=#J~80Y5Y8&5rL`SEdhB3X$*HdRIc)QQ^n-`?0$lm) zCPY&|pWl7^qk_P;r^U)mmTG5Ar@Xz1S4bVnM-EqAXXnyd-BbawU&&+`T%en#`F4rX zkH*r@p#}$!o(+8xtawPqe z5T*=KK09YsnF@m*qbu|?0OuUtU#&9J?Fx%)o-=v>?1Xu^3w%xqa%DKwfmOFZx@>9k z3C!}4o?K8?*?P$+Xdr^vj>`F?@6I@<={xl29@%>x^O}>EX+=6(DNAG`V0RZxhbey< zC$^0B0^gUlQrEfo*ly7ablDjl8k_RF-Xtp4jzc(1%j15|&V45be(_w!dL^Zvnt+mi zkl`r9O+N?Q(pvkS%~eaW;crm4UpLD*z8J zadBugl)6al77Ox*!)H66n_$%yp<^f(3;F61bZaJ)sSS_Q`L)y!{d)@65!)0+9+)^?Ll_ce{xx6Snp;~E?_Ohcd23GtShbHQ8Szlf6&b^~jzOY?` zbCq$ma5l3_&dbu&VI<>wkLjd4c*1CHLDAlE<995L}11VDyxJ_q`chxMHA^Ven0#Id_?$RR`=9)no97>kn}H zsf3XM(WjhG%EpH^IzrXwlBObye<_Z*`}>R1-XUevba(S1(NW86d<;V2ViXMMLSK6? z@O*8$!RU0>ajAZk!>NhU|Iib0i}~>)`e1#T)Y(MTACs6)^q^Ppym4~3ui!D>B&~3F zXijY?c*F!}fo2`Ad2>ma3F~-(pP+)Y#sd||o^F%Pv(1|T^m$HVf3HRH`i9BxuKB5M zd>_F26~mN%NaAXH_x6!gM`t&N8f{~84d`1`yzig+W+HHWxT=e{mv3C=I{e^wq(~ zWU5XTHIGoBByfHlaMvJpRk>i9I!C9_sb!ODfEFP5xLECndGe;qrtrCa}p@(s^s^5 z+9i&q$%yge3Mb}8grX{E<*Vmh0HBa6v(y}A2+)+kbb;_I7jEN=Bzylm4L{n`H}E-zO2v!dkCjw18HOxpien`8 zX%P9H7o#6Z=izL{?=`?7%E{e5^5ic*YD^`StWb8%q~>^pQ!?4`II;OvcvyD#1-`C^fFc3;U-#_kkn}m^v9rftI4?Tg=aC_8^{oi z8*)Ac#C=af<16PH!7?;dPh*jjV^?72V15umNTx+&C?&CXjAVg)gJlugmgpAFV-hiwcauQZb^*12(}5n z-4904lO^hkJiflYnf>@S!O)LoHXVXN{2KSmY`@`K^FVF?_~=E!m}eTcH1(f_yC|hn=Pg{NzV2{k5&q%NPhksJfKwKNxipjW2}jwvn#j z0zZgI>RG_%DN%$lQ;dkgP?8NPbX^Z@HJLR=)qNS5(a=TEuzfvDH-B4^xgLFptZFP> zy*z!^+S`ylt-rr#L5wgrH>x$Lq01}#hVmmT0Ij$k^vXw8z_Zx^^LboYyOPsfHqpl50=+II~3^j4@Bi74~qQm7ik;# zvv6F1P8o_A35ljnFw&1}IZR?5UBaJpTHnLZflOVL1C2N35k^fIo1??q3qH$gi`gXgsd3CfFFiHu)=RJ2Ly`#vD zFR>E03}wjSehb&|!wp|=;m0d`(fR-Cw*MJJO&HFblPWb{9^rqnyZ=tC2hT1=BJ<$e zX+bfnYs zOORfm@#0XMHIh=#5TxVMBN07OU#RG8@bodwRp*kGH2Ce{zJ6?$41^7P+>$Qba1c>k^@{bUaR Zi1O{|&N$%@qVzNHBQK)@t&uVf{vTybe$xN| delta 282614 zcmZs?V{~3!+wa|2O=CN0)Yvu~n~iN7D|Q+*wvEQNZ99!^<4v#YzMuV$XYWtz!#Tz| z=UVgN?|;m)7@UV_9G?J?TF^UH051Q8#$yOEnbr_`P(dCQBKcbw04|S+2qBCFfi=AD zp_qkg3TI^|dB5&)@!oA^qw}jaFF&6q?d3{xg6n?OW8!&Ta>bJaj55uW76s8S47-42 zjr`rg28>zP7>k37nTnRSJ=48({2t93#F+K#DJ$~q)mb@C1^zm5RTAYd6qIQN#Vp6m3*>OpC&-}igm-3(ZByHy=U&Z&OLJh%q!QuU zO}6gWvQ$X3ZkyX$=(C}7lie9s@H_#XJ~-y)MxmLOaJ(tMv{YgUsYrNuS+Q5Dh=dGK zaJb9@RV>>K`<}k%LdgIY0A@1{QF=#SUhn&Iz76j?1sj*g`t*4+4*=hMI-xc-zV=*u zx)^`_oe&(_mn_UjO~}G%0*JH2UxMuT!k!&L+R)V?;Y+#DRm#d{H4;A|I_Z)2g&;;{ z(?Iz!6FhG*GgCf+mFULs6&hnpFVYaaVxHEy?nR9$_??i(Q~z(-c|J2|v>T<%9C z&$3iDuTOVa>D*`zk)RLa-z71yKmv4dml`ZOCu8WyphKsSIG;o{INf9Jt;2gYt_;;9 zbwgW$fyGgYiNQS4n!(0-=sdFCqS8{;i7?^<^3CbcqUe@I5yh{x-{R)C6_u4e+)h5f zT_$sU+N;fL6qf`Vh9%DG?rKs(S(;6-dwa~&3bRE+`12>YBPTmV4`Ks(8JD}d zVP$;K_IPKHF8YmG$X1c=S&wcBo|C|#ar}N4=h6@CLENU;V&awsS%zSV512=lg8AI| zxN*nVzVYC)knuW>%k}X1{A-c(kIre$Rif3JJ3^=4fHhCU8CRR(_$b3Gmt<|N2(i4e zXtVg&v(+|$ty|o!QJc^Dtx(a$Y!&@s%&zCjM`SnQ%{vj{ zd!K zO-I%*thUV7<0eR7W7i3lrjh9&FW}wT_s6QaL#o%boS|&0*RK`VNjfGpkomAMMJ#&5 z4fvgtVbx4bi~0E>cY4~-(~Q9jO9eH>lbLgVj*YdU#JH{*ujG*D`h=%!Z0|d0> zp*q|OB_=I3R_oz&y{C1(_=K#0pqITh?g1Z3D5ZM~oMs!GEK?034L1plUiw;OV)(5$^7Gq|5=0LJTZ zyC-B)?Dpq@Jkkl9pmi)_s=r1or=Z}uQ+ew=)~ewc8|1)J54FY=c^byd z0jyFx-F}Vt6Q;srZn`#83x+2pb1k7jx~imOH8)!?wr;DNa_Fu}VY%!}FHRuMm|L9H zKlu2BEL}*dA}9;`io1nLni_wKTfMZ@iJLNZ7gXzXRgC-b06uu>F~F>buW~r(<{zV) zr2>75e+Mfvri&wfwM%kfft(nd^w28b$ekve7~9Q5A^M0&kb;Dz^sk%#9g{GuZG=rl zwS!6{-6MI@dfx>+N;6D9p-@Wu1SUkN)wKCngT(UOazRW}~m9T zzPl=iLvhfT+mO;y&MiIt#3OHzw`K289YaH&AkM8>J3T4)B9G@Q9Wn%s0K>}2YPEM( zoc~&;2}jl^TvS||s?MAE`C%(7RlleGeyJnc-Wg{ ze6pl`vohcE1?<+)R7w(bud(_i=VSjvoBqG0 zXAcY%Y$js^KSie?oaM3@*pv1r`>k^iksBuDLi{W_OmsAQ+REA|? zI^3qUUc^SX+wC0&|Me7RgZX_O7KVi(Ey2x4!A+5$m|pD_U(@0Li9-SWkw`^RA@Ua) z;j~i5BAte~pghfuBSEq<9YGZ^j6&T)v*;d`w~68%2E#pDD-9480@JCJkkt`b%)tbf zz&q1{SZ#8ARWFgk6DvG>ak+Zv>*K*J#XRFB>52f8CP2g|i8WTi$3~|~pIWE|Tli3a z`f$t_+-Pi@h;FLnBQz=cJh5T?{l3e^I+9==V-@9wMxzc6rrDniw&;`d#q`=^4Vg}x zE#wa*apoJwqv_lUKO5Ct4GbN`?#EwZKzlMD7ZI%}@l?04skWEbYMGnPa1u=6Z2afx zZx4GS7wTrARZUCDtmF8bP1Q^aL_YNP*Qa^8s{Y@8g?#63wZeN~3_N>uJUZQ^rLoXX z%5*V&hK#@Zy5Ma<=6@W(%SnB(*F<7TJ4hL=ZWoiy?s#Pm@#lgN7|hZn;Q7{93RsNX zoweg7GkAz=C(vlO1WWuJt>DXf~!`~vg^9j;A(z$ zj<5f5$5q#n!96M^-R$;8q21Ils1IHTHRi)sV3+?MXi%n0F>~W#74~@whR1ZEXJsCY znKvA+bAPwN_(Ev)6S=eXc5r8T39zWJI!XkhDg;*HtGRP0z9TF9{l;>wZ)hZu5+$bx ztTMglG(c#x-}?UC4hoz9%@MbI?-|x)-B~$jQ?2O;Uc0-# zjo>U8u6x6|_xT>_r@o-hCKtRLY*SO~?}ESheTYR;Cspa*Uq6t6qu}D#E;*m@wvTgmi@V z`_z`kkqKR<3E|TX$7f)AD2kvt<&9QJ4xhiLq|2oV* ziS)AsK|Em)pd=pQH#|!1LR~{2NuvcVHk!pN{2o|K|GJokLr z02sIPbT7?$?WKvdq85h--&d|6c;EN^xDeKbSoOYJOP~c6b8jk z$68=ac(-i+x$lqs(Pl(W&eLGC^xN~YkYqiH-g=oDu+V&dXA!^G|7*s2id<@1nJYLI%%uxYNNyJ_B{PvD=jJ> z?_T&j2=#iO5EqLu@o!_}`MYIzNVD&kdJV5~KJg1s7v?MFyxfNS`i91HPx&BZ3C@IW zQy5glgM6gC8e~aGv%lL)*~X#E>?AxRxT(U30Pq!OH#g>xsjOoRTXjvxvXH60K_;nA zVHYpA&+8rREG7DFVq`k+&3|dMLX^jOzYsV$wV;Qu51 zi33&3>8MsW2ES8$aaKVhPgRuhn{KnM2nwe@8U=_C7Xn z^ZlN!8=)I-LkHZ~#z_03!feR28!;VfYot43r?)e0Xp9mL__@ZPNwi`>sKFGi%dS#K za-`j|u$X$bzGgN(ch{SnnMOILj>grw&dss$)2Ym2_O0%fFRLg52D3|Z2HiIZsz6Kc zaDBv57wV1|4t6RyCepfIxLan=nFST7^CGL5?} z&%M1cmYEl`&FSy+pOrH?w7AH_mPLeY1FQ2@DdB!DC@p7Zq0@AHhIiX=>rM8Y zOf*;xk%3m~@cg!ou6z5&BEb+i$tsP$r9H_OQUiew*QcNKQD?vDNH@pW-+!i#zeFrM z$nW9OTXtAvRU3cNx1irMxqHKMzUL$twJY4x1hGA{^7z8oU}s26q{4Z%ewvpgPArN= zDE$;4GDYU~IOz6^;TZ+Mh6IUeUKCtmC1S&_G6<)W0XZ})-47Vf*0O?>IH~K@Wo($V z0~w|KWm5Nu{rxhUp~2sYjzzg{cft4%B1pFJ^86#|^o=byqCzvdA6Wdv)KBDT|!e?4zT#A&{`uYRTWrL%07uB3yYTQ3F$&*t+GeQRAuse^Z(aqwR zMaM?HU3qlf>dg%7jYWKD@`LG{LVuV&(3#o(y!AsklyU4Z7mAv?oP%n3jJn*4+>3s{ z!KpMr^J0n|0vIj+Kp+$0M^)GSDI zW6nnV-V1ZH<6T1&{!m2iYcgrYn1fBV4LD)#L4~hAEO=sGicQ_J#vp`S)_|Q(n%qFUrz2BDZc|}kKn{HrV zmX2FolWIXpzd4S}Sx&E(DJ+|5j+~7Weq*AhZSi~I#PAYlj~Rg$4#bU-SE;Qn9sBfg z5dI)Cxp=o)@TA5mN5mDD6d;GE(AZkn9dzqy%t9NTh}ONLeB6yD&()dUzwCxqR6$gC z_m;SU6K^?VQO-TcjW#q46qYg%s^n1i(Q(leT?uV#nO7ElL1YGn-||OHB%~m_2()-h zk#F4M0Ue$vI?`2*R#5_1+LXBOM8(E}*l6rD{|!6VsdB9W{-bh-r{}cv5>Z6;^heuHL+1}- zr7%Q=eRZ=TXsd)S_>|FELrnoR=ypmN=`SE3rOYZRN${_&cND-B6*|dW(|gIuKyG;K zB4RTn;<;)GiTViT^WH+@hUUgO;kRIWu^L#WEGUy{ z!W_C^cYh$agMxs58QL?Oj_3AKVeb%jF4_hEtdeqz=)_bA4ftE0DvU+Zi}=CugwV;d zsd>WkxKJtP8t2aHq6`>))E%-1G2xQtC-FZ&AHf_ml9fe1{DTpgi%4Nr zP|?JZn1|s5K*L{A&Ew*xyr5-k1t!L&z$D@O;j@cHARqui^5c1-$+C;F9PV<>?|d`A z@`##sqf4uTBLzhjwooVIiUP7+DHy)&3QS2!ZBeNDt&7AfgeJ(0jC&!jgiC%J#}MIr zoghH#U$OTfJ;$=vi4Qg<3-ah$98J-L4eU)4=Mnh*4ISh$9QLzdYQ(?>JoJ*=7R8V> z+}~4}zXc_>`R_4+f7O0Fy8285pN_`ka^r$M<_XHyJbkW+m^J9!@#|#YVBYr`7XP|b zl8LPLp)pdVVOlJTb^!nV_3YlV)?b;<1WeYt>Guq$7#M>0Ah;6A9NM9fGt0N|KCYY1 zbL)CKxKwJrS-#8dy2hCcvBAz^>f6yTNX%g`_jMayKw#F?YT8NL`^)28iH>2;kFC)P zs}8T$3mmMFVD!ji$T39Tjh(GHQ{5<>WeG0B=YcJ_^34!EQ+^P%zKg=s>*U1TsW z5^vy208ng{48!`LkkE%E0hPMkEBAovuwG=PonF+7(6S)1C+c**3$|`c4hD^VeB#Tr z)1ubW-{2hKv*#tQdi6>g_Gz((1R)}Z?W#tf_v9BYhRpVKqq|&O@ae-;MSMK62xHW2 z%=W1roQF4(DAa*@ev-vs)&!srT{b95l%)eCkW3dPLlF%j%D{{ zGV@-^)y|bE#AX@Zj=lcoDRh_d!I5q_Ec^{t8i_Fp=I4uL_nq0EA#i|=w$1qgxB1D} z{$n%@jQ5vUHj^lVC!+xYV=#%EedUpavCOuImO4*#6#kdB7M#tqQ<5H-;Uu0{Jq1T_ z>?=Y(Y~a!{3nMcKEs&{c35#N?h+H)XX(!P$i6}?$qX+8?*br*L*`W1u8eXBQ`UPqO zLBz$wGI)*)E5JC8`f^wfHy}`0f69T0cck|TR7P4F?>OnEP7meLLckjzR1)b$P4V-& zHkbeWT?FQCDG?HmaCyEL#J=V}KI5uf?=Oc+OTZ;SGid!%X#XC+vbFDZ3v^qm)I6@& zs`H+M_sj3yloD`f1!Wp&71UY!qVI?U-DnEP`e$p6rYoZ}>*XB!mQ(3NrE8LDXn~~S zJ6wsfXnXs^l|OPlASIRm5OvF63b)YUkh>5KeNmY`-|?>1s&;bTwA~5^(PaR)al0S?mbSc=Qm|gBZ1t~1X_Oi@jj~gAw`=InDqPGlFI$DkA};jR5ta? zwB_Xp#`Yh5-uFGIje5K#^{ml@oL#=L6n0J?n%g#6jO<;Wc>%L2DhwH$H!~yQ#aA$l z^OU6Iku-Ze{G1$pd(T?UkuRHizx0U_Q6J;Nb8WcT=b?Pr^7=q;BCq7$898|Ox_H3z z@30v%lp%ICecW2lfye%2A;2`oaR1wi3Un*l$(SW>&)Is22WC)CCbX(>1FoDs-cx(n zy0j%;+#kp5(-8Xv)t|4&>m?|z3QCZJk=U{bCEFGv5MUt;_UfZmw1VG5 zQiV^9z+;rsCmEKwA%=}rUX0V8SsdKXA*RgNjE0g)UfIkG0I5H4i%%qZ%|wq1D57u8 z*`cxs$*ZXN$p{xEmPhv!pQaMm!}jsO`uuJUUYhz7^fxEb^$xsudZ~rZ!C8r6Ci9S9 z+fSRhIiR#q;?p~e!GI~0jsi7JjISoBRK@Q_KgRorEBxjs$3}h+tL>ku9_SekI68Bi5tmoK;P$MPcq;!5%pS;H7Q1)De4SoF|X(`><%r zoLkiY=Dlh4m943f>NdGNi;$1|Mq5Hbp9O9j@qf(ObBv21YBgRbEmJE=o0{UDQUT@O z4ws?(6faqQlV7Y^x*getk&^BUb#{IQPm-cu1u8?y->>L{XVx}34a1R zjLdNratW^dG@Mj5wn_yHdeMi({B(S@TSUBUb75P73M(YmcDU5K8#prn3TEx+cfw`( zkhN90w9Ex-#p!(9R|lya6=u)$)`aMolJxg5$AF_kEEY=Hxk)`G#5xf#qiDg zfLWlY(C7*Wnly%nQvLz9v1@UP_Ql}YchdgqxaJ% zF4XU}&p*9`#pL{=L}g1lE%pIg{HI{7P80U|kJeVMpPB*_+hs!rBvIxEd!zqSk%j5D zAYmNl52osqa=f+W8`os`E#+hnQ8xr6Ot|d_@6LFpT^GW67qcmJ+AfBAO4wyT&fti3 zIrdALS2235L7_oKdEZRv@5cQ%%Z^BLyBqkzU-t_PF<94_h$dh@;wcp%OnZRE zGbCV{=r6#+n84j|IC58>N%Uj{BS77!)l!f5l_S8z;(aaGGbn5g1{clFF#HGTW$=OH zO4ms{qTQQM0K;_c1Uk<)=l0>%#Ee4GM?Xuv3N%zc`2Jux2I#|`Z-wdbYC0IYUYF_oRCNkO`^2;j7-pxomF;6H^KF`nBGy11p(8}-R@Yw z&bVWG3+rW-MdUD?SwV4W8Q4ZUvtVae?F+r+iLQG7QPJ$i$S|U#iVL1f}cj0U4x^Hc+Xo^%s1O-q6*jAAY}e zg%mFaudIC_A<`p}VL9D{=#k0lM{tC4cX)DbD_W72Q9Ez{tUyaMn5U*t-N<>Po24*= zS|>ES$4WHl=lhd+S?_TF8$~`5O%g)K@d7_%1a!ltEa4mqa-D3rH&!=_i{je7%2JQ7 zhqi4>b)a>gzO|ymnk;d$pYpg!ZXr_swVDs3i4*46RGb*etBdU)P6}nIP5aD!;h9sF z-3u;@_KO_5D-!@BzJIxPmZ)U5hII)!O8WwD{InNKxsAiz`m5tt@(pwxT>WslM3Wb!R z76gw(%x@zSRb0tec&5AGBKFc|cvkk45$a@{1yQA}8P6vF*u(u(dYla;-F#A(Rey3H3cki>xBX7UWOU#@baJF?f zzpe68vRNOm5%?+E?4j=yKJ@iX9-}Q>GBU83qWj{vASK@;lI8wawW@DZmTe#J8I2BS z5OcuCps~`Mf0I}ZO)3l7786n7yjwekY^XaKrwJ6)ml>UV02FO2|EgCp*|tUV_B;NQ zMIrQ2=>Ym<5r z?9&7R4#1~fd$JVZJdeU#WICk6N?$x6QE)X*vU=6u)T7bteo*q24;H?9R#|xt@wm{o zmVpANBRCR-^vV~}lpp+?!XeHi%yP=VS?;4~;|DiSl!)4Czl8G0iWE}LAaORfOVn93 zRYuCKZoFxB;fK= zNzja2RH`a}uY0{5&qwnfYvpS>3@2b`YC^P%bmeo0KlB}jQ3AKy`!+$VXuLld77q5Q z&S7Ny8&x*F-jf&;uX?9gGJRvItfv&}FH+=kg9RaeM`9!U;Us|~(t#Uj)Tgukaw%Tm zYLM;PguJ(}lbugT0;KinsZss99hjXeFJkPcK8*h-5JL)Ny(t`)a-<{3v|=Y-%k^gk zuSFl0qmNKz*7PLXAVj$$hW!$(u-1@Zd}7JQKCJiOpEM6mHxqSV<|27AF*45kO0Kai z?lHyA>Y!C)wBQgVbSkqy9kVuM7jJ{3JZJ5%jUpN(3J#U!_LEsM@5L9`j;GQ3@=S8U_U?^NgW<4;{DIq3>J^!ksdH%k;`cpxBdL~cVRrEK#GVUvd z1U_1g(ra6G2Z=Q>t1^*X2?mmh#R#X6OjbiL&7Rl#GM|^c_T1jO9o_`|ZMiZyy_bV2 zhC@{lLLgtQPVcYzk^-)zUV}dG!;Qb|UVV_ng0VNxi;x9*XZW#=hO+mqU&RJ|NzV|l z?)FRvCbHhST8U>=z-y^;i_D{&n|I>)>(!t4D|-h-A>i9r(clh-Y^Pw_q>z%VkNFK0 z;!ah~>w&YhlQL-w6@DhWJIa zPD>}&#Yl8rD$%K5W=cg$b)0dzoebaWrH@stR(~Q?jk-Q3z*Bg0Zb!oWDHyA+ubY?{ z;cAS6v+wZ7oX`Xpu_D#!-))(ZLdv+eZ zrP3I1@n+bWwGZDZzW&HXYe7V3!hvEY zL^j9P1TOl|vk`e>VSF*rLBcS-^yqlf+5aX205pIf3$!jAv(FImCl&-Hjy27#Bzt%d zOWVD9Q6fv-fEH@wDklZ8^{ShY?0T>>qJg$x67A%{p29= zG+^W!Oj4`mWqZ})vT$MTN4Li7xcRlTNvgNnHUDC!=2=BRR(8o{#kt=HIl)LofAhWv zo^z47veS-QekXe6Z%R|p4d8EJ)GJF0dDK2DvHg)iB@&GXMlqj{;;#!6%hbqcctOXU zfyb?tTyG-CAW^l`i}iFkW9i4oO0S6FonwEcSG}d2au3-iS63!d&I@mPy_*V@1>7{P z#-;RB??1u!Jl-UulY>cAO^Dc@7+O969ryr|c05&J_jXjFe@I%xjYoDhHkM;~n_|s9 zuU6UQ-fd#beZG3VCp7*y?lMUx|?v#d|pAi4UxGS~`o#a~yRd+gZ03Qeyjd5DRfex`_nGJ- zMxdBm1i3p!afxzFd``(QC$*hwx)u-XOB=!P;z97i{?GLrkGHqigEyWc5OY)N$O@~) z-~w@G^AmuJ%lmz|e27UNhnAG`aY#Ajz${R)3xId7*^f;D2fg%$i!M4tTL z-26`?`q${N5kV*!o|fVRt}i*@55TRYKkV|KQ<-H0)uM5_LvSow(5i-GQcvM_rlh3# zBGDFFFHS3J)W=-9fvtYGs;dVSI{k#ie~E?(Bz52l*I;XFB3(-dFcmXeZE-bRw~F_QNQg2P!H z;UdbQUwZ2!Oh$Mfr%Usdb9-NGfC!15JvpFo!sTMMO%e!4<&>FM`U(M4QQH5{H)8@- z7It7ZP8?$Uk9!GbF%V@@F&dtgH8t4+iR_W2#TRa#U1sFz z+TRulvVoq6j+TI$1>&V9ib$4Idys+y7Xy86FdtK1^Rhf}{E~&|Nt!@)||X7q9F~55i5wYvQw{Qq&IN*v_<#8G1qc+2+uAe`DZJ z+lT*Wcp1j@nb+ir-SOA{Obj;Pd0Xgd%MCv)x8fK4$Nuqhobv~reO4)cLHEhiRB@U8 zC-~9?BBt~YVg_?tq=t3x$KG?w-cB{zXG+8j#E`x9xJ-f)E9EC~|8wHm3J6Z*1saVn+$RJ3Dx1ELkv^)E(a zY9r*RWQX!fa4jWm*EL;UyLs8!I4j#s;Tl@dukKz^zx_nzUX^wkG5UGQ)8r8W-J=mJ z0I%!#TGIYsrnWxRTxnZWz=%x&vEIzk4D4ICJ*8@Di10D1H{@IP^CAt((0}714k-KHJNR(B!63 zYR<3!!q5NlRcPNJkq=xR)R*Z@{vR%S1^ob|xZrPivVw}ZX}YB$bB;7HpEHjd3EFGp z9!N&Vo^XEy{%1VTya=hOV^nle)EJXH!%|VpM>&u8tM-i zN1cc*bweSRgiofsn%Q>d(Y25$U`5fY6N0|DPcnhM9T~3@f8g>j|8O8@zpBtfpxNp@ zox7H8v%hZgSzx~YZWA1;l@V4c%eKqNqT!|9dH1T%A%P|dz66OnJEOe|gK7Z*msP_w zNO$x@v=YT68WBNE(tt2M=lK`6(u<~F+^8Ekw$W|08;;tMrHq<$d$M5uoH{&?OuV^Wl1X&V**ou`*MN7 zLMRjJPQ-{>wUDC$0!({q9HPzf=FZ9X&#x|l#t;yX&|AXpyl*rhR7Xc!<=Mr>lL~GC zX*0*#<-Me|Otp)-@%iG(A%>Fuaqoj#KnwBV`aiTno$OG1NMtbL@4NXv@&7xbdU?L} z&xq>MZ53tt_x}a~W_4tiu>!idC7H~%=Z^qTWh8tDq;Yni+2LbHNa#n)HAB(Z>eti1?9mBahvq z+5RW?{SnSu@X2=mGLF_>T*7*9rD-RQ{LdzEq~ZTciOXmtz<+w64^QOp>{^1D2uh?4 z1;v2XM$A%ra`%l#Crt#Igg{S3oP>b-4DH(=@#$lc$D?SQ#4bxvl*CC65QxOzp`cK( za&*v$3>tL5r*r<-FL0AdA4sB>K?mkUx&M*FFaNr2ScbQEm<<#Ivk3!`@sdzZ| zWm}A+FMn!Dq(R||j&v`9SHbk5EWVvA7Hgf%a$z(lHgEyiK8&D_9=&5@HIA|-Tms{X z)DSJ6*J1+o)Pzhv^UP|xUkc9JfSbDJ!dtX!Z?kqJ)Gcf@6VOujxv8FVnntO*-XKVR z)GbNi+ZRX zJJw9g?|lWExiZO!YKuv$jIe84UOX`UX>Q!v@UZ19A>$mA?@YRz(n6^&61ZBB4USUv zv<~tmLsUT`jz=Tee9P?{*?!+w(Nd7Ss7PxICYqqwk`h=FQJj4vnvSH~hnn1``35|i zy4ktqa~MTqoWGk<3V|qLgo}kw%nk*`2BblKmr-(uGcyun3|;twd7pcPm~b*|mDW## z>RuZ2i=)wY#|c3bN9f}CeYh{}R}M@)r{?toYT}+cGPN&+JsAHwib-f^%mv# z=w>SIN$YxF5eMH_U&JC<-^PRBb6HFt7rO`+-y(SrvMUU~M$(o%O#X6QW=K)x>7naXWk&FSCF_7zWWK}yq}bkJev z^JEA#|D=wQv~4b@a&~tVuHjQRehw>GHx3ZxL+IFoi+V_X+yy!R7+_mG8JzXhZ`8h6 z5!kI9I~F0nT+OG72N4t!npvJ-U(74RZ)Q{+{NJ(ngDVPT`86u_H-AfQjh$ZGN@mQp zI4@YmKOKIgc4DE_bZ0A9=*(5qni~;6F`$-LRTiOCh)|h%00#NtvAU3lqiC6s*7Uz5szgy2(Sdmj$90VkP4t=lcdj|VaN7Zq}EB`^yn)wvmD>s-#9DUFr3U|;vpGQ%fg zI25U@;4Q4Ac`;nDTTGCzB_4KriehbG)l>pY@)Lsk|FB8g6~i8%2Nb9^YL+=MPvM@Z z*n5ZN03H!sqM$?<-Nc&~>sYdBZ@$0z8djCVzIf+0Pt*&&Gn6$8>l8A5+H{&gxh#!M8?cfqjb zDs^|`P{nA7mDE|etp3xEVG=NolWOAeCfh}m_AdEx-79aS{FX2++>&7d?om+``3~sKFQ`>l&}%aour}TyDj;vG>_#7 z`FFstpp|JEzWb&0(&9|QCKS7kQnwOO+0k%$X#zjjHNY5k^9ZmxG$VIVXM-vnYr{sE z&q$u4BDx?Zw57aTynS$(Qb+h0uU0$cWXEdkFytCk8)!I}xT@loj3Q@RB4R*l+e)KJuA zy_uwS$$Q5`6EasfF5znH^1^-5p_aRYAm3 zs<-H%5JBtu_Eh+N<|gErq-QAhn{|RSopnSQ#V?;7O)bbgv=7Jt``^ES7g$fq>`(83 z!Hm_yo2Qa0@$^W=rGBM>uWG72Xz69P6igVwG}5&)pPdB{ecsn3jB|BmIH+L9hKOVs zPilmPtejMj<;OlZYaR}Iq6%Y@RFEv26WJxzw_asB$Yr(P$^$s^jPpFt{QJ;xxIkF#@V&soWCewUPz zbzm%>`h(%s?X-XPA+4Aym4Q4Rt%bt_m3QD6gm7z%yHe3oiUf&q4U*(Fot zG4jFIyLzCj`fV~I5~gN|{?gItG@ORLy_^qi@8yJ;@!Y?1)e8V-8utipon7OP<57tj z&uE(IIVu~sSK1d(LVWV5lJL`xIvPhH>t$%}w49yLi!`MWBoWeudU_qvJouW6ug=s&1MeRqA}#U%BH? z;g}!dBjL?+CGUNUCodlz2Gx$CiJ7T+`|Wtd2Lnb1Dp<4Hpk549)>gd#2-!M)Xcc%Z zw>v4_etzDktJO8bZ*9r+uen&6)SJ0dn5%P8U#WlDp$}99`>en>+Btn_6!{6~tVa zroO==BdT1M^kTWtr1qA)Zg#ox~-321>0#;&P@H94M_%P`7zDMbhu z0&pnpd(3nOZYpt+esq6~Z@&@-KifJwb1{{lb5R+KEVZ*Ix|NRwb1FT}4rs;di6rCi zQ2L=8smZf~TRX~(NMr^)Dge6<$|{c4N`qnclHf&m)iLm4JGo9&vj^*?=EqKJWoXqo ztL;ry;6!OJ_sz7wa%f24i;cGczU|BT$Z zKUj6TkozLKY9kHOjcYj@p__;xMTCZ7oEU!a3bs`ZcRrS^g8laOcR+GHOrHg;ib02n zqp~c)h32l0E_xKy?1CLXInYe1sPDMZtY(kq6@O>5H|BN4`RMNa5N99EAhGft?Ca)> z`Y$8&wD+!^kEubH+g!JS7eU(f@C}zUbc!k2f}gJjJ?7Tx|JWJ0B2)N>xNu{=^z<=b z_VZ+=PQNE}|4bA(=Wz0xU36*JdI){5lk5&%X|PPX9k+m zYHI6WUyjcaezZF5-SxbWKXtq>#cs@3KG}$2Q4WpHzf=J@HO)5%;pE_NtF6Zr=sVAX zh@pKQXY7NYHCzr9G)gwP20xUNq>d9YOgfFXnF1{_wO%S>L*JecT8UunJa*plAw)*d zl!bhJ}M=cYonkDO4({E(?il?}KNxw~%+elvR7=vn)o!?YagBC)>8n7KN#ZR$8oe5ijJlr8T z^WK}EF*7*886QKMXG~N47YmfYr+M|MJ1vf#kM4?E2R43Va^q&Pz5;>dunVw#oB19uon2PNkG1Cdzi$n4@H_n ze09NnMz>QC$I*R5sW24@K(LG9$UIx%iha$m^)(5Y>~=KbS2wH}RbW(=HbxCDDqCJ} zB|gGJ^GN(53og05{^L3EjCD`L=zMh{1>gyu^?8$3S28>4X5x~^$*GhZ`ft?K@>thBo3wlz+jRZ8aJb3iQ8$A{3c=#;odEL|W zLhCOzAvlnXR2#sB>Ja&xc*Xtuc1s4=tP)lGR?(YO4Bh+3eHqr0ZzbWJ?7zd8XtXCk170uW;T=XoSzI6N ztrM-FumBS~@l~I%)n&g5%)|T5g5aZpGd8k_vXzH2NhC<1Il57x!$7b(h}W6iIKNuc zWLs3Ys$6rwZE!J%Y)h1-;_(6lcd~wX_Ay{mHI44zJHD;|2|sTosODe1xk1gAV_SDz0Zp6uI(8x7<_4 zrdqm33C{`%C{a^mp93!aZPG%T6XKwFox+hC-&$8e*r;2UpZSGeV>8 z+uY|Juc}ZkqNj}a>>^GNK1~yd-@5v$5AbJ++Bl};U9{a#Wa8;Q7pbP-tc_%UD5{L_ zUs(l$Fe6831m%@(wglb@e)nfhb4PwNm2kAewxtJcE2MW(=4aH$R4-S+1s!Gk@mXC! zA)9Km*iJ;vva&(GBsvoi@tSrS7tVFut2#I#`tp=!%z~==iS|d>(7^-qxkPJ275M+h z)nA6S*=^nXFa(Fg9nvW0& zU5dS~G~E}9qLrutZoq@Nhijvpa93>G6Jp;ddSmdc%k`9<5IJ*vFTAlBX%QJ7`yf%? z^{+LdL130dzBY8-aDiocS-FifB&Eh}J7puO+KBY4OMH+xE~;)->0CkUUcc*12oHkepO zGcxLGdf#^e3=#yVON{V$GT{DhxERkqq8p$yj27$!8=d+jsi~=N72UZ{<8_A3*i7)fpI`x~#(B zGx4xP^8b?~|I-d~>O!C9;Yo@9?yg1%4zawSzGpP09YB+^z$G`ygoFkpW0oi#Si*<> zNX0Ky7kmX8m7scCAzkFBS0~uoR9IqHk~Ql^afNt3lj{y$eVW}DtJJTL3lipt!?qZ? zPQ@%ClbD-=Lw7r#q0&d(DSb!l`S#IXz&+i?ln`-NVEBBg#eSxQV*9CD@xDUC!@bA| zU?#;D=6C_$cHvY$X;&3elja36kl4K|CMzw)Le2zS-c&q54*v#t+_=SWF!A` zT2URHQqmsc4gS$BZ5XSp>HAjIZEbz8#+@S1pB+Pf)xjTvKZ>iTJt9}|PO;Jv}BJHLuHdj+$(@QVAFo?>esyex7gLu>XwM^rm5tvKnO&HCtO|hHV5VE(E>} zvjeS-Hq8;75cf}Sd3R4wT#NjuFae6V!R_afQ!i=nVd|=W*!l1jLg}>9jf4M-5bbw^ zBSiGbsV&Q1H=k`vSu+A(R7u|$+E;7C_qy2+{Bz~q1I5&6AodRD?QS8NCfl1C7^ANs| zffLaF^eH!Pb;%aRLki-AfG7lz8gjy#XPO_N*PJ=JyG zKp*9gHDjTeU>>EKMGv2grBuoIqFc)2I+kjwDJ|L_B95P~yyeLu3ClkV31VZ^^zr{=-r^DPHP%mg1O_aw><~v? zo8X70HuB}-4JUz;zvknmci6HsUJw1HU=Nof%p}<&+Kx8GqJJ5lbfR|pRA*fMB8gv= zzlpU10|WhR7+#vF(kP}E+C!*u?EonRAACdtgp_Ff;@H?S^Mxz1_*eFyTb{+X_olOv z!nB+n`~h_Qr{v56BZ@yls38w$lUKD@UMh;3J;IN*hgh~e&`K)#c}#k8n(1s2T)Mx1 zOcBizC{~WF{QQYGeV`iN%s|NHVY4D&N1L9VOII+SpOqgW{pioHOV#uCnj}+NiqvPY z0j%^RJ!Gg*yH4-+!{DiNgES~ok?|P4>g(q6p$XAbPr*<%^*BN8L*!ArO$%3-{g2E4 zf4fz_-~S1eOk$)yK?fD(FM6nYn{V*@hxvghm`XBtNy;lhpENPFzLw$QkkNWs8Ts{E zYP#XG#kj_-L+sG91I-EF_e;1iTzx9`_iPX;A5_dV+G*}0?fQw`I#6Kne<3Sy8WEMV zURl|S=_KlA-dIZt!vJDMEC?1v(NGTHMMYuMc2pj2y?OrWmcIqJYKky8X|`_6$1mJ( zrf$_jOtZ?7-nb>leo=!oqR+L^A-Sd3n9%3iNm7x%Fn|*RDrWhXtwY2o{>-b4Eqz>} zeE`;%^S}s>qpv&hGNoaZtcziQ|0hyND~Z{aT-jVJySuu?w{GoMW^H}lu&p84NNtj+ zpdXV)2Khy$Ma{)W2_H%&za^bZ82<>vuw@%2`P2TM9j%ebyQ=PvoY3p^Yi)Nq5WfnR zI4J*jvJPx3<}B|X;P^?FhM}qQPn<~Ua?#$((Z<2lw%6&1yG0cvTS`i>{lE+6qXYBt}9;!mgz4uJxLauw7xngeF;sU8`+90ms$CM5y)*}WYJ(L26-jPMYF<7 z#}oO=w*0g{*M1&jW$8)D^kO52t6|JuyQVKqtnAFxw~^-aBQwW{o~`H~BeljDJ|I9~ zZ%joTB2>i@ZKnZ84h;4QHbD_~r;-o^i#4IwLgaG@^0Bv7Fi9?r`@o~(#MJH-8#Iis ziz-~NpqdtKk478 z&Av`Nsk+bBUtL3_zYBqQQ$~RBzIlEac{Z{=$h6*oxpmGz+HODG*H_(`68|u-2kwBF z44E8k_xQQ&@*_Nx5?BG}OL_B-i(BrS`OJUXg`2i7V;K=vwiP`c^HT$t^`Z^NLwrv3 z#QMif+-Sg#m?_&@2=g9zcs_u10+`z}(tECCvARvhfT>r*eq{UO8h}U?EvSquk_nv;Hg}?p% z`V$Qfmd1qG7kR~{xp^6R>K$9Ud+sw(L4U7UkI2j5aNj|$D z736H@-}b)l0SmQz3&AC5dD8#Cx!@nuli(BlLJD0CEGVpd*K2m<{N$?N;io(NpJ_Of zIOA?zbFE};pHQ-f;tNl0P6<&2RmKJLDVF`lXjqC?l*3j3O1tO|%0waatn*{3p$D{; zUG$K3L;r7Ld}H$=?zfH^*zyQR!m3)p2y}Bz;TJWs=0FrVi^!;S|M^z6Q4+_;G;uMD zCiXUVKBOgkzpt=cgVUn>mMTkYh!g!Sa-^s2Iva?8>>0V7Wu8CtV>L1h-?O!<(04)E zVFc^?!P&WA(XYdD=^@F<`Q&LeWE@jaQ*A}^YIQPSF#vQ9tLWFG=v5Ud*y^8w^*`^u zW`_%jAay@KG%TH1tDbN_awU&pmORS^iJYD&20s)`YwppC1IT}_pj~s?2>lAU6?x+B zZ;YCH^Pcejs;^I!ij89GE_3bM7uL*PGEm9WF(NtXpZ3;8U~7SoZLEzNc?H&PL~E?= zV(XI9x3t><{$s4;Qp1-LsBO!@Y&@`rc|*2Og0VA4MiLP7)t!nTYXhjyaSu+DxG@sC zhmH1v*XZGKu#HnMyWJ*;>|CXuLx|a9@>SEi@cy!9R#5MmeJjmK#hXQQoQ!ek5{BGE zh~?Gf^O#~iPTYE2!Y8nMLRnr>%t2jy_AoPnM(RHlHt&bc@>t-{72*s!X5WLslWCFK zIQT9gn8N1i85+^|NJiy75P5a^VTZJ$78af_;IcBbW_4V_gLKRI5!dFpg%2amQ)ejr z9*-c~pXiSkvpsDDd?&qxRLKaM9NA1JAIg1l{B1dFq=y!}3KrZ9g#MgQ#Z}|ZUT!_$ z>T(A(`(ieWg#+hv&zlI&bns7Z*yg}YBz!#lwN(N3tiE1hm(|RVygq|x7ehyuRS6d% z%rp^;tZ4WDx1bOlg#G)05 zW}F;gS-9Yeyciga(_VjTQk)dl48i%1B5CLB+4)lPUFoXj%PM+E(aPsmI=3j9Lmz7% zN@*$$?=xY99WvRQ1#+?Ryt|lJ^p>qo%%tD`cGC20SJF>0`qtwkm0{|s3Zw@sQ%A@8 zn?^{@Vc`M?xRs2G@s~YS6y{>BclVz9OS5`eKo`nnpQs$2v1RZ$s)#Q+?(SAwaU_Vi zch7|Ldpdri3yItLPV%umTH)k-YX8+0;qjPN(I4E@aGuaMODS&~s9yT^R4O#UEF-{} zBM0BtskeuycHd%VPHVOU2>R2&ov~5qWcH#a`YU~q;WR$mZp}NVEi|j%=V&jv>o)eT z8EHP2RCD0~tup$JHvw0 zJt>j+8J8^`4F|{$=29eD`ZopDcGzEJY%SI4_j=DX!8D8Q2YW66=Xst@4}3{{5t<2@ z$1-XUAExF)?>0fj?xTNS2Y_DZd?!{mW|0!t&DO2ZChye&iTcP(iy+uj&+{d>v)+06 z!zt)2y18FC(UMvCCltx;Zcm%=l-QO(`kqd9!49MX!ERKA($aY5L4&t$!Shjz*svdT z{KPvy(8FWO+Y%gsj!N7UDKk1vL_4K9fx3|GG(At_3yFs&MvoBnG3^VQ@<*(BZ;hLNvQo}`Uh+xPqR#6D$2y22YU~qGq9xxei?B4tH;*)_@~_hg6c97$k3&s z`B4Q<&c2YlXfGyz5C$2eR(4=&r=1Cd=>9f@SFW0|W4{U+xgX1ukuCd| zKu1j>Ds_qxxYR>zIGjqVMP2ytp4jtu$l6g=OVU!-lU)3RG|N^;=VZ0yx?+k6Xz_@x zlr{hH1|CWrZ!E00)T$U!`W!`9-#)^lXs)o57zEMuh#XCS;ZQN>peNs48W{gQOiaH& zh;7?a=v*w`v6ZyrJ%M^5KuT60HZnZ)me^B{v1cZ61%rc)!~gGCYtp>1IeJ^@28#te zAoqxu`zslY1&i_oa5AGGwFEjoDornt;1=h9-1zTE(wMBuW z#Vqs9^8Pmn-*N7BUX3YaBlU0 zFT9AT#22bb=-gBNLn__P1wGwtoYS8qlYdJ^A;S>1wtnXn4-*1U!mpV`s)u8ga&T&0GjPd{5xZ`>~6< zxniHOFqKEidNnI*L|)1T=v9BG z!wZD_wQ|ij%~i5y8@89+KIJ=S#0mcKKW{v4>U3h4I7gd0S#WDaj7-y@cy(Jz9y=|X zWM&E2lf=6E)Fz@9EWeca_Je0TM;thQN6qo?Ldr%2RK)Uw&8<`&C4$!KH(BrhGd0=< zL-@X+c>NkxUm1LgJ}ZnM! zP=v3wO0XUN@@1T9>_H!mU?09vI!nosa>0!{3`ofixd%MYC?kvIv;GMc29^~H3=?ER znH*7{l0%pooR-uVb)Z;GkX(0`*yFEWCKSe)7>HeYO?_nKP1dcoRL3Lw7y5?S>yW)n zETjBvZHlo|OM+I-U^O8_=IkMb*MThkqTV{-TDY@vZ^0+-w6d(M@oc>*P;Lw{C{Q8$^;Gbs+X2_ffS9A3qh4u@lr(ZK8 zUxvJ%hge_m!*i~Q3rat4teJo86<332D1pAzhFP@(Auoxp78z$y>cU+qg;O=LnO=!H}9m_ty5RgeYEk3q8EPg5~b{ zvame0COaiyBAPgRxSZnZ!T|x<+mt0KwC~~N8MV@c;x`y}Q8R$Fg?}+34SJ&`=K(3F z;o6>ldq)H}cRZiBddkGDkn)^>0&;HYDl{&u^Dvf+?q^3+hS(Z2+Y-q~dyIbqff=;) zs@e~n7<;(*olbjsWK_Okj)mc>90BOPd1DL=FpM$UJJy=)r&c^X89xqiOysCPnyL_# zi+Iv2z-B^dB9`KJX9_z0=pPQfn^?*ve?3}EBm39g<&)O0&>Z!w08q%lbZIfaT`#n# zHh#U%L!>Ob%C6H`v4u@}R`_YAniqhFh{U*G{cHTq1HGfX%JoghaInow&Aj%5x-EYU zD~f#!*Ud8g6W&MN-et@TebwoQ2`$W9RE@a){b>9sgTph^7FIfU8I*Wo5&E%hWiznQ zl%~3&{od2PwEZK(Gvg8Hqz_-{YOUe@n-<@V(XOQ&H?}}EJ%0oS+D8Jc94Zn)%BVYF z8YB;8 zIhRL{#Qc55?cvh=74adXRfK6UXob)Ta$&z6iZnLS<_&okcAUpet&7QCCGC1JneYQ3h#eCC}TebKWIzYkISfiH**Z|b4R zO4*pmW~@Felh|bgqZz;=4Nvmw2?5PWtk`la%SzXgsvGn%@~)pxx4qyP@5<%9e%v~` z3CCU=QJsBhN!AI}C3$P&Z9uIYi}QT;@EG8i?NnM-j+Opb^v6SN=7vu;sr0`@IAw`uRxbgFUlRFO$551aS- z-ji#MD7JM(UWmRiylGPc?8kOwm70Uxo;!P}y;1#>YkmURBrmp~rmEJ)?PHSg!vE}4 z)GQ~+>sd5K)&}9#MwrxBrXEaczue((^=rNstwU^n6Ej=CHbCixf@qGDr9U|AIo3MC z>^3K>2>4MkCEhA5N%2`+=B6eP1}))P$gsrd;42yyM*d>GJ{Z<{YJ2tl^Fj5_l6{{* z99z)#j3qa){<#btI9zSo`h3riZVRWIXV2UR4<>3K9!#7Os+8>aX!k@u!&T$_HPh@X zo1*)0-7er0w75q^om7%5o#0t$_E)F7PfGj0I}RW8dXMh*@BMX}$bap>{{Vxh98?M2 zvU=NBa9<3q6~Z1-2e;$yh9<<1jDu2C>Vdqc`G{J}L zEF&oZbZfW8jpXgey!SyD4^<{o!C!FY^K_UMv|*_@{DmEDV&1oH8^kkC2e}We$(y-9 zYi`;H3xvXUl>D9D^azsCv^V+He9{wn z9~MU7D}z=Vh5RiF8M}+(F>>Qc0}Uw#yNfO+gtPQ%6X9FZrk_)eqVi^6*0gzh*Kd2o zr2gMdeFy6uK&zRlcdyHoKUegDOYrdpom|v1vP>h$o}!}mOD`c+ghFYWoYw^BbQ1O% z#~`RfP~ITz`oT6PToDvmKPs-+(&>TW4I$>sM8d{S2rUHp z%F=y_Dj0JzRO;XZ*ERNu6j>`-zwgJ1_u3mVEYr5Iu zsW=Rl_s@?eg7sVDqXDM|dH-qi!bMEM{vB?PSMn%!~+L5 z-EceaT_W;zmo{}40g_^c5A%oj*nP4CWcQfgrEcBsR5ad&-1W`-MX4Aw z_3}*;8r%*^3M3k0&wY0rG(JWEKZq?FfCVI^fS?GyBhDlt!jtksYw35mI}l5_m`IHR zU^^ju_?{;G(Wi~#-Ew|o(N7TyP`+oV z3`VQ2bj+`vHjjy0qLJV6bXN1Kw*+CQL$BK5YePfY%C1(-#N1wz@%Q1KaobA(ih&ra zEi!{KgMU;8NqTwvO%(m3Ww%|`^}PjuBpB$pX19WCKGLII8BD~43@~hTE79-EXh|&yu?bqRI{9+PShj1k1xzyY#TZ0B8{Bv-eytr>N06O z?fWp_b?hI$&sekcGOJofUStEQ&O*>WUOu?Tnu9gs$C6_tqplrBKXDZ=9KuEnIv8qg zhcm}NB#)u!?Iu2}8D>E#%UzS1p}Gg4Wx39wgaz)qgNU2ezt6m$9ob7M-v zUUANwsT?36H#HNvfWIx&=$D*@R;n4q?0=;-ihI`*Uw+HrhV3y!msZAH{#2kc`u1pH z4IM+!N-6rI!qb1%>+w&6zkk8zh0{7@P(cnM4w;6 z`eGRTkL*c`cOwO|$Zzws2l9@rLIFh-*u!09-NXoRLrB#lUD>SmkIFxEyrTn&HK8dE zFN%}|LupqBK!5PmKgnJG*_mOntdjNlOb?{a7!dT`sEg$*MR5 z3om*U^G!bkP=(*&|1f`GWZ+=CI=<85cWfjo?_rqB&&*NwUT9b z74qFMGNk%%c5-OoWs^qzG+) z8ai~pq{96ERByi*2qi8ow_A1XLDfb|Wp8I>sW^Hk+Bvth=yh$gE*kqb@Ah=va` zYssHc^V$017}4aCh0nZ_RN)nN_CJ2gZpXIZO278dbhZitp`M?`g~1$A#Tpo|*ENZ} z-{ju5<6qy=bjYrApZ znVLHf1P=EBS)7c@-u=Zavb$*-TV6#oh_F8y@h1xz8wiqYADhOwgH#v6?9k&j_ortNJythH z;QJ6J@+W$y^&Ij@!jtiCxgR?$e2Z#lL`sEY9PnJ9wQ@%X$iEJbqFM!qN(i0(MI4#5 zJr%2UZO+3|SuhDulh2&L-5&Z>8aPr(EF6p8ue;Fcksrzbiao=m1qW(U;xlHCV5g zyGw@vR#F`>pR3&dXuh59sn(s=(9J`i%c4*Ev6+N5<68}UMG`Fj5SYs9upMmnxPgEJ zQ)FQ-YASy8zV3vG<{a2A;4OTfC?WS`9Br@kLe~=&b_Zwjlg;>;VZ`;P<34z%Ue=j_ zSShdGX-I-S{oe<99f6)yP5lqMsGqk@YuKWhL+oCDB=JD#SB>CaL%USoq>V^#&_-WY zussYxdm%7ROohyct+l?Q>2hBSeJs@@d#0SjeeG9|LFRdicxwDXU?t`A#$;p%-tVNn z3!DA$dyBmRKh~rmpJtZ#bS?eLUTCCnw3+J;ieXZy;gd!ypiz@pcqMz|4s;9pJO=R0 zLqIzVFqpvVNC?D_1~esZn0>T2+uWv~Xe*t6bS8p+mhd4i}eb5o)W3L^>O`JK5A+A;9DDUPY? z7m4^x*D*^_F!qMQPD+H_F1-DL66kZdv0MDRMh+RUkQEU4VvZ(_oRPW*0cz~Gd`wCn zjFLE-*mlo9woClp-3CeC*~M|tHGe?QpGHG6xBonHUYNv>Dcb&(OS58>e78MW45Ka~ z7H*}vQ_p!jpsc<}R|%3aWk8VCdq;uUFFKy7Jl*wkwMNZzWTqhebUPkxv&^c6p;}eTDzFzQRwaT zPauBpeKsT>zpo!edLc=+pGI|)Fzx6q&n9`7OVUQE>6l*kG*GYCSTR~wN1@?a^~r~aGJrun=KICy?`o? z3ET$M5yn}oKt1@G{^X*EMJakA;Dw2T?|M+G|9CqA{l z$;M-eS1lQM_hXvUrhEf?8s;Ey^2<#$eDkHTnc-UwKqOx4TjQne_haj0?Yh+X4i&Se zj~v-fYE#fk)6cIKspZNW=y2A*2Rfg~6+w;Mkl4U8qTp$I3unF5Ac!gyr}t+#)DZ6r zQqvd~X7+kDTzWxH@+fQ~=)}y3<@B&)N!dzY4f^H-%er?>MvSP!ag0gbViz$vIW^@f znmO#hWR{PnF4$K5qRv5hFb_1AM&W;JMv7LU#hO@nFNdd)7OW9_bGb)e-`E)^?9QkS zW3GXRUBBlst_&&t$nz-JNrHywt;4t|a>zv{qgB~-)<4tY-?~zCoiWn7iqZ~)7K2=r ztY_%Q-xy8_4$qb3S+v!v+Y6(Vt;)|8(jT3i)o+5@zj|FNm<^W*H*xa&b`|)fijc?X zJlGYhfCI39%Q7~)SfQfD8tHyKyP4ig8XgcLjk-xH((u4IGOVEeqVTlb)qTu^I&8x3D{DyQS@e#(w~$nAbeN4KnqfnI6KjUp|lk z2@%+0yiKvdA{#mh{mn186^6T~vLeBazRCkD%NLNqFrWz4@5xdFK{8#^C#L*hV9g(N zHVjT|29|G4=i`tZO5@+I%JWfM&}u}R)X?oq26J=GEla3yBwEALkAGFIDEc;a+MbbV z2likhBh=645Cw}x-b|GbenF;qrddLqjJmaCkM)lf;7G9y#4?1qI)wBri#k*8p*;>w zW_DRm`D}Y19?N1TMIMS|xpa*HG|v}@jKoU=HWnxCARv{c*tN-TYtZ}l5N3=Lv;Fns zPOO(ArU?7aF(`!e!w^nJOA)jCv}CNOf$yXQ>4lDwN(Uay^}hX%gH_+F=3+FkqfvZ4 za-wgZYaIW4DjH}KEp8XducYSh3^>iw7MIve+!opE1}5e;3Slc9?9%CSH&`PZ7R$0K z1o8apc1_fHY>{q>Sg)CK5R`Ym7R)b!U_|7aJ4;QT9Gge%vsBqvm0BcCaOV@4XSH;M zu#%b!zfw-d3ny*ir5op`C_Dpl^Ji0X{pb3DgnXYV=%OVKbd!Ze3{fxx$Sq*tpP70} zj%kl2p{JNs6*l1p{@N=KRCSvs^&}utcJ273uKZ_M?c9Rr2I-vX7@=L+^%5$cHIb1Cl@i1}u~1n_GQT5VwUlyen~%yZ*??$bqpS<*kQd zCyfEQIBP?heU)jGu`nVMBTC0iG}|2y;B+ZO6Ee=j)zQ| zRUd|k*D}A~Wqce^>JaJghgpL8$Cy&To)uc)JC%QZdGL~1_A|ngXHv#P;Z@fTtmZJk0EGe8VbRc~;Klq6iD#-+$6q zPQN;YKp<5fvBm$0FUD}W*n%mA`W(Si{eO|X2@$^AD8@qvaa;!AtJ${G^l=-<$VAvBkQ5fUiB>nZ}QdZsfW=ii|B^N(kqYfn!Vv5_=jT)Rg zmqts4)!-R$2h}e=VG6GN92q&oUEw(5@W+y6XqnoF6pc^nntw-C1L%$ zpKDMlh=yX9+HF$3^Q;Z6kasdDoQzwZ1TRWj<@O^hkhyTj?orlrSkep0d!B>K1$aA7 z$yI9|W=@Q*f>9zbV_oM_T7sbVFGk^?ES4`PK$hNu{#*RjoL$lQ|8NM}Kv+l(K_iUQ zv9r3Vjl4Dv2^4_)@0WKM7R$d1cZc&okAH*}Jjsja8H&_avHl%|fXmQHc@XbsM?4AA z-L7QDeQ1`!k$rpvW|zaH+y{qNS<-U9pU?t1W$1Evs1+7g2P`P|7W$B=Q6&s>a`ir$WLK=8Doc*1+->?!M>a z3twYc^j23aa-3}KFNFQt0xuSB$NXIo=@fto_=#1X~Ppqz#pNaiv?pt-yRfF`QyQTD%rBaWWQpm3XXNi$37n5mb zM{a)*>JE|KR&IxeYH_s&m-zj=K^4KP4-`%@z|S?hwV`~(`9 z2H*nnNkOaA06Itq5Y!BS0rk>u)(tmMWPo^qgJQzz0VFsB;KIo7JJl`Zf4m!Y>xb(h z%_tBQ0fo*0Qk0>@+Tc^abFg&_6dpvtpraZH3W|nPJjz0GzSimatJqu^Yr*I%?gaRU z>d6-_Ub^$$ZwaRgOwXqXtwC_K`&2EXvJKPTVU4`{h7y~jK7h<;0W3hu0l5*JeJ;~U zyzy!a$w0*6ruI+yudv#8P`|NL*Qa^b&xcnV7514A_=(ZJ2Kz0chtH6O@n-_e9b>MP zztL}_CSmA)X&vxOE<}es!Tl~xZTr8mZ=DG=0RcfQ!|}^0mw&j8&3~j_Ip`V-=_dKR zR}WZRUZ71cj_%&Pel%fR^hniBM-0ElvW)|oX6wDYGSICt%7?!AdW=ZK?jwhkt?ksL z&FU8WS|c3ta{z1J*rrb`Do;em&B={4G$3}E@N$?a#p%@+4#Kgh+C z`r=NNG0cU*_?O6b16d^izU3W5dx}rxhsEfOor!s*arPC+r!eh(zKENjrjEk!GGZ>1uoKIF~0@r9A&%s@;Y+3!#K>Rym7 z!a!Ht248`%hqIWPjTh^H6yrdm{8`kj!gO3I*k88yrZ$=bH9Z3F7@IimBzFow0uAwX zo?neMVW_V65~0_2nDLPWE#*?3=o#RdMGF4Td|sS^My^sN-Pl5!oHyh}sNCh%n{ss5=EO`yAj9{xN>uBM7AKV4#sOuBJL$AbxNAg9b1l7Am+$96lpW1S81 zE!FLb_VPLuiJ?MohINRB1u>>p?AU5KB}{UccdN0ee#nqn`;uQ@kQoGd4vD2JUI+yr zl-_P;#Za$XHwVZZc=4Mb&P^v+{2?9oJCMk*U-z1lRN}grx;R^|sO7ac0KfZ>xgoW! zo}DbtN=-2QWqE=*7pcchUtjeB^G3EV%aw|33_QTH;}|6J3lKmu|Gl)oM|-bujPmBW zh$+8RyClJvvfI%}VDU8F_ZGDJ3m`7ucx?>ZJMRwcaTgTO94iQF`7{+zjFW@_{a$}r z#%UYlle9x1^3#x}srcBnr0aAO>x?c6ABr=(R5~6EX{kcTvHeHB#smhT{fvOnXQll} zy}t?fpDA&1KtmQ8#zK7&C~EzAn2rupUoe3ln;~k5Zs`1`q(NxAqm|ThAHh6M=RgIf zDysFyG30hK!`uw}tH2k?;3%!9K)*uGgqjL`{q|kyXtPPE)PSj$ss$%BhMStb$)Do0 zj{SSdLzBFMq70f!(E;#gNQW$ayD*YKY!}Vyj`35M3YIAvqv?hODTbl$T=zs?c<{sAnew$ zql+)NB@be!0d9?Gtr3|n&=Es=nDPEnyMZc3=)4orf2l%$9r&T1&=6NW^A z!IiWtj=MEoX=#8^R<4W7g>sf9>Yzu@64EJ&ipx;VycMZDSRtpVj08Irhh>`E5FREV zUUN52#vBo{6H$T4kk({>S*-<_a0pWh22lotiMsd@q_+dc*T}c8w-%b_z-o}x_s_TO z{NCVwv$_yQcv}w|$8fG2QZh%uahYmoQNTfO;#Y&S_d=xo=1?;QcjFHlcU8s2X5>`__cWG2I=$V+B+7X^IiP3pYg>^XTSgm__FX_wuZ zfc`eY-0g1TZ%Sn?BU;}o!@1fur}JM|{C2h&1khw3^!?q$Yq};DNBqB;l_+>?gi@K+ z2@4YkZ-SUID)tnP&K!L5Tznsr0pr0FrjlZg4u%lrJxBI>+C>Qzn!okGd zF+&9P9S$GsT|4)+Fb^7X*exhCvID(J1Ih}4l}TxHLY7qB6|ScoZWU>QD`m`GRfi(> zH^!)gQXF09{w!5k?w)RFA8c7W@TV?=o%~drXB2+KN@k%w&uz=8@E1$ufIq652Fj>E z_$T{+uF}=E`ehQX;t?)zE;gubwbVZR`jw!oW~{+RD#)j@1)q z&;-gehyBo^X@_(1GG?{OstPX>PGM+}{9bs}vgK=!O~-^|?(m6LZhbkWT%BMQ^n0iI zBAcpLp%4{h<)7N(HCZ|Pb8Qg5tO5H*lakzLF@0^()Uo2osdkDij;NhL9j(6--zQKf zm{m{!z4FKt+1-F1B#1|$<0Q~zDeL=-{2y8n4iG{PhW>g1iS2vzr)Oel$7=1Rr4{rR zZA+=@6FF*w?V_mc!<42&j64>>b0@3Y85OIUm_hba85@)AA4O|00N%=m5Qc6kBmxVK zdT~YaZm#^r&34viKv?qkQnm#Z7=hwrj9-G~O(;$mIIA8wq8|47crXE~%H0M-U(%9E zF@a8B%&bt*Kap(8z57{Bh2YN1#(S*LbQ9b$a7AXw+lQRnUBLkGeRqFJ!eQhX1g_M5 z@r;vja+qP7v$eAlm`C9;Z~U3sSxKLt5r+-a7=K0N0b@G{14+%6t*TLp)(!MHk>>yJ z1XXlaynkw?e@F@2^;ff{QZty1rTZV?X7FWnP<*2>qUR7jW^>&*<+|F-nZ3CaXJd5xywv z2u`Ph3063Y$9RB>?-z zu{kxxw+W<;gYr(=%b-ifvRAY8>6SlB^0UN?pLjsWEc~NhexMHcmUYpl4-QmY4_ z!G+h8UoTvn_pkD)!59V+*rSJ!Z`?3q7@wm)QU9|7BI)SZrE~j;{U_YA_N&PLc$`}K>#G<3?Y+j z;Q#j~H1OCEycwv50lhBf;L8185roMW@fg>)yATW@?YN6|6&*S?%5(Q z4we7!_TyYjuA);tmTcwWs@WF?^n2@!PF?;q^cEjF>-9_5s&f=q;{!dTzQX3`uxw-T zWx09>0!(@*-FMV7b%W)GQ}4$Y1s^-a1trh`A9#v@R=6wQg8W|>W3XeGsD#;2cl_SW%TVXpW*-fcHzdh9GYo4ntJLN z=O^lFndNk>9(O1|%M_3P^9Aa(p_?Y=2VzVgc6?0o$fXPLZr4RzfCW?huB|~~Ylp-l zhJpo}=*M(jz>4{osTd338~bN`GbkY=ziIP>Y&Rd2L+LfrlOto3g)Ezrx0B(bS*I_r zI~p@Xl(_>fo+AVg|B~poeMS4{2jQ>IOiEiuCS!s;Fok?|BFXmty+qxa0m}e3T|J}b z_l3KgVRYp92hpP&F{cF2z79K+)9%)&)VJD;JkdDm0zP}7wfVYR^ju2Fx|zU|AKU{f zK6me3gL_eUad*ui(Sfof_;jh2`YSY{0OTx+)3Z~xJ@BJ#R#{$iS5LD*s^6=XnS_L# zy`+Hy7tZd6Rbg`D7du7<=Bdd^g#jH#Jvb}nt)&Hb8&+0&hMC#AN;N$E9D!;||%*W#y3s#!e;@VhUc%Ns>wsiS_SJM9wz=dY;`bZ+!?E7DE zZxinxmKU^LI&$DOV`7?${r?6^oY~s#@Ds4x>+@vcCKt7Ago3W9n<;XE_(9IUP3MS6LJgb}&L1_#LrLh|!J?%(o%E%Tts zIJwOpdtXTAfMd4W#KEaqGRhXjwUxm70S>;b99x z*;^N4kL31MWB9&Q0YHsFZ(SWZO#|xQGC?LG+Bb!QeIZRFnY5-ev19{*gP^!)^NZvto`KY{i)0ZLHJy>}q4EdVuO-UFl$ekN?j z+1Bv+vJx5{gaaR5jiY(5%;#wN=!BUsfNM}^C?fAzzPnK2QFGVY16yC zgqzM=>MY8+gIy;_nfJgduO(Ig!2Qp8C=VXl?0?yaKnTcm@G$}-0IU_LKZfn~SG$f~ zG2K%dgmAddno&mF%`MXHE>BsuUy7P&UEfC4|ph`2nHB_boz!pMEORz`4BF}wgNaBON?(RWaU#;Qjh z!RYw((4vaS^Q^~8a0F}e4RoM<2io2N(BW(hD3^n%FJ(U%O9basw!CvkTj+(GK_t5X zE~p`|-tStwfCNZpoww5us~sbR$tY(d&hvDE<*m$m6=7FzoBfVKoI&qfRax5%G!QsxZI1SeAy&|>PsF^HYZ!%w&7SEt5Pb#8DOz9B+nWi52rYO>yaS!> z156<;K}rXJJ>m=>nkF1q z-yb6p1YcFB{y(zbDY~*~>lUu4V%tf@l}b{vtxCldvv5j4^ZQHhO+xDMx?{~iY z@IS5A_TCS(tv%-)WAxES@7#+^qbkOayBi@B;Z9z*4VZ`E$Y2CkNQ2co+#mOs@L~*n zxJF9(X%PJWUsQXmW)8qX0!QG+a7I{EHMY)+xtcwo$|G=A@MCSz!RHe~Dgy#Ud<-rO zrUWuL2LC}oRlhOtD&a=fzTLP=PufnM_=%`-Yga#Az$*mk8$$T&}n_W3Hqob_(4acGl=Q_IXwoHu`lJ6Lo0`dou)P1$EV{wSYXS!1p(= z3}#jq+7kMAwpZTXyBfgxZo)2oChm6*dMFt*chpV8SwXpNk_OIz%i{)rv?|72gv|Lm zB&Ee;M1zwahi&A5OKH%}K`;0D4g!X03u@d2N28In{;axKxIT%SI_#+*F62dsFdG&N zBfU9d9+e2QKE|0Xjz2tkqYP->+gT4;F^jgwxd!XJ=Sn+ygI1>Ja!D2@g#rhmu1w`>1An z4=EZ+yAJG)G@WJxh z3NhD$O`X{bC777M;IfQX4y#QXr72CDoJkz)rh;Trw~qHF;_b}9zaj`%{-oBZY*PdE zCg1nauljFRY$b-h@m%L~qY6gZjg^&N4gR@}S3mvA!UQmV)g0TO*@K^Im*QISLUG;M zgipn+W2`zmV1bFbP~XF)#@g_az+*ii6_uuvaCs%>>UGM^y(%WaQkg~4My+@H(}4n# z43?pS&#A$sOVWH?OLI)d^dC8axdZmdJ|(&jprj zQ(#7+X@Tcg$Or6M0;MLT|G#B`Eic)mojyk4(!XUtkl`g~QWGz~Bd3Dzc4fzoZ7XS} zf~Rs@u^#=m7q zj8(hYttzODAUhfn{4-&~%c6MKiIh@Sr%%-SiiQ;AOlFM;7#y!6sS z2j35r)&3_k4=+Prnryd_W>u_P=(-IlwGPMuLDjl zJ^Eww?K^{Y0u;nTh=u~#TaZL}A+fI?L>vW|e<;^5PbF0h3LBJnaw*~6`~>k@fMJY& zAXt?o_V6IIhP(>+I3Cyz6Y~gMlYLKEukLJ-ABmOxP+Cp4r6ckNABou0oCsb}c<;Y1 z^!(427U8D+1Aht!dQHoh)`$EcE2tT!7&{6QdC4M6_LfOS8F=Ws{yC_`yWAoi7Lbc+ zZlGx?esesdgfuwcJ?~SKM^I9TJ|LXUSo_-;`FCVl@TkXw6YHBgHledDB-8M8HvG4r z?99S7Q8pTL6Lu)RhgTgd7cu-HtcP<{x;kaQH@al@ly^z)fP}89?-lNn2~S9^g%wcCWF#Zi zIxhw^3F^sAbvx9urm1@8#`iP2Wgk#@gEHj?8fDEQaQ4%-O%yt24S27?PiHp7pA-d_xhmz3dMfKpfeJMA`%keFQgTjClg9ah(i+>xvX{_ z+zYMN&m=Wo+$|snKQzGqA=1Vr5trVS$C@dY_d_N;kXUhE6_>-fx>sg_2>1qXHQJQ( zL$cI#X|Ok5*WFE>kx8}N1+BKI5CV6UiH}n^gch6&6ZIC2HNU9!T!>56iI9#i+;bsD zb*|c^m$X)^#n+M|1$m#BRKel zg>It4rc$!!Vdzc!eg1kqWx@2`_3<+)5!NP)W{r`4VMLb*R6#;e4H53q^+wTf2fKF~ zaqVTrqxeE!MQe`@u>V(OtzUksy>6@Ue;gV9XAl18QSJb#0aGUf-en;d>})Be`Igl^ zXO17gp82OqoRc=P_ttlq7Zhlz=q|%eSKjV>?(-gR|NEaSRq- zv?)o)OUYZz5}c%rBPxF+ULg0|xsG;?HnTsfT*)Br_hlNo@gN6kE-m8+iCl=&8U!Xl7phON8QL)X)GIfT7ue#-O?~z z_^P48bblhM=o=&P*m*q~3E<^*@#?eyT*&Vhn37R#U2*=_!EZeSVs~q5+PZfRkL-Th zN}Qgkf*)f|m=LL7gAUS43KJ?KA7wtbDn*Fvg9{$yG`fkE(fu0%wAj8bbp?$!`W%{B z7Z)Cjk@2J6Gf8mNqUEapGj*X;S25x07fYB+rJ-02iaIIYimwyGsRQ_|*r3l>u#`}(qpxMZ_|z#7B1jh$ zY$v9T7apvCYiol*#Pn62u&eG0?LgzX-Z>Nmj*ThTO8~%PK}V!@J4zCACtfrt-&*rD+z|*U(IWdq-Pdk$b-*H%jw-h)xy^(O%CJp3GT%Y zQCB}#V#8Y17NqqnvMhT>=b#Z8AT#^>yxNOZnxmkTzqW-sb$fXORRX2JbUiDG@j9gt zNW??-y#uHr6$*@)iFH#<4HSvwXh)7C=5?yiiW%mIH)8?A06&RQPoUlTCe&ZILnrlx z9UI#l&f?$*CKGmEAUm)p{t%uTK0ii7S#^FV2_riqDL(`4S>aYVA z-!|C9;}bi8F%WO%`KP!GLAYbrBbl@A{&9FB&Wv=)iF1g1TYvwRcvxc-3~zh#`t5c6 zF>0On+Fb2(k^{MGWZ5No!^%PEJm}Q==;(WD?un2S#*{g(lPEOJd$^xpCamJ=$(qCM6HMfw0WeWVmlPnzGW*+A8 zvW$|YtJy_an+I0*nC9jaQwJ|sFg1DV&xISD?8yGW^M|`TV5TL~E`Z}wZ)V`_oN_b= zB|m_3fF*)v9>A#~>Ia}f?+@TV@Jl7yE-G1_MimXuWu96}^Z$(*dR%8z0xp+|4Wf_W z+F)Nx(KV4aDnNx#;KX3Fpus0_2DD48mY;4nsSw8zt$7`ahr}+HAlPSc9YA=)?P-&j zVh-w&CYVdo)q$0g9D|lQE#l^%GszqAWaicr)m7qQ=9|cT`s{S$g!O8p>19g=u^S3M z#tnwLg+Y6)={AZd?K(u7n2)HDNmp$@HZ72uKEX|-h%;YN^fTUlfZk?kLJCaVmqT|_ z&DIgpY;KDb{A;)X%+pX?3ZrmfxG1@|ytRssvAww#`F5A^fXtR9%^^{vGFP()l~|fz z&36SUUu@w#ve^|}yO}f)_6s->cqtT!{RKQ8z`dz8tnx?2m=hFFYTC=JVt0T)Lqmv= zjuyp$irE~56+$OB6I9XoEOcg1eF?Sj!n-|r1i`ygFk#v4rrP|z>Ye?C@?_NWH`bO$ zREY0p$3++WzEZlYHd`Tn<^H&s2*TRlrqo3+Kv#?h;o{**95b0EF@No5vZIUctIKZ& z&@8zJaC>Q6;!9g1J;WX?4$#q(@v!a8CyZz5g(;yqru9pliCMMkAtOrFS$6%LT^LU%!T~@Rypxq1TQ1;deHY@3sSsQ7v zfOHkYiKl0^`*_gBD>%b1GZk)~>5*9hwk41G&w6s_>^ixcKf7ZwuGyyvxOP^AsOcIv zIEQf^T;W2A2%2svi+pY@&G)C}7}T0yHv9YpvJP6UjGPm zxIrSY_hWh@(V0uY{1fEj+hH8E_+?OH*=5nSGYspp72Uc6glPd@k4kmFurS9YU5eq| zYb5&AiAdK5@j{wG!#%feA_}MvwIlLdC_(uBIJY8v2tQvy^7A!mwRL1S*j*y1gzn6G zfkfVZ|A%*wzrGldg5t5G?*Iq&^N!4>y(YWWabtu3k6eehuux#+h*T)2izzgcon*B~ zF+6s5JBzs)I+&zlj{pd(!cD%TJ&UnJ>&7LmP|SV+r4vALyVfunVFRvHJ6*NCcCO!W zTXsS-h)&o_?%aP{$&gjF8ZW!ZqraA7M_piaE$<8D{$E{*&&HI7F*);m>YU*xPs!-d z6R!m)%gVW*fDL@k*D^a*vjJ7;61=J+LMXiXi#>m)5qDP*M_tC0#iE3lKl9J z9#^FzUqQ(lSlEW#lQR3{oK8tdTPF=(V;~5zHJE3!6&u~JNCaCOfGO2Lad|OhNdWk{ z808?}5xJcKqyfxx#Y8k?J84!kvcH=z0QmwNBwlH@31~W9l#~~F1s*>yYYOxyU>@Kn z4Q_fu7pR^MYkOdo#{|`v`Y_N@^V6lED6MS)ADxq%6kab#=eq;~e!k;hX)LYH4E`A9 zjL(JMkA%U~?&jI1h%OO7dWRN>;0iud1h`cqh%24*(|*6j!0m;*mM8guxaXYrrXpKqcSc#R1p4`Gngs)A476UJ#w<+|L_|kVgD2H1s+5M(s0i7 zsJ);QP4ua6s?Ply65I0wjl1ss{OTA}>DszVw%6=SmF;UTyERLGV`qpYkGJ>O*jfy~ z<1#t^nD%q_{-We)=XkP~oK_txbP4FTayeU=$2wP*q=j68)MogEL+n$6NX(NC3{sM{ z%WbblNoP&*IF0h1@9EBcna&`#Tev4eyOC0Pw^mDbG=3PJ5Ze8hc5iidWvz&t-mP&j zm9o|n1y1ju7eTnL>iS!|9kya#sQjlj3&H>EeQ6=XgxiY8u5CI?z**KGA3yiAxSd^T ziPmR(`GlN7S&7+KG~JplfKIVa5v_ zK-W+ZEMR9Ks;>~=$a(lreD3qrx^+YH;C(H{xsu$}@%EJF(}v4>m$X<_Ra|HJa6ndH zAvnQ~K?PqS_@u0fu!2t`N_YHZ`95YPZEVS;I)fXc@cqeiqv+mc)y-hDM;HlCNm4(W z7B`y?9&=8Ceama=sBWMT#z{wCs zO;5m!N2Sgn>QgEei=zDB#fvL^D5PR*%fOuda{vvWa z=jIP8-|h|MXc3)*hF~BVfa`}Q$KOHKwEZpL2}?suP9PTgL+^4{#}LVkp-C?JO0w%O zbgwp~Z97I(kE#-sRLIm-|0u8d(@EfB(sk5Tyt#{DYR8Eq;4}ZZ_d*Ur!dF&SciVs50xneO#RYS%269rh zRu_K@5_QE~4lwZbZwbqGbb@R$ZBS-i{vLLyM}r_-nr;eYU*CIFCpwyiQAvwfeI^HnZ9A@l%XLtK|Q9f1|S5_?ysC z8q{&-%T3keaT}OoHs`FVnqjDQ^x)(Ey)-io^*l;EP@*iO{#;TXy*&>dg z1LNEh{-uPC{+#UZo$uW=2ED*TPy&{ce^|=fLc01>+AO8wS8H4Aw@hUMV%pbXsF)qd z-bf>>`Kca=>S$0sZGslYO%~Aua{bjN#U|SB>AQm%fu9`g8(iqAw*xvNN2nMG~@Q%4p`7*reGv$OZR>%gOdGWY(Pp)gjLCowaSQ_ z%Bt8yGYYo*1Cp89fd{kmu%zMCU}0@-<|HxcM(yEbOYy^9jl3-8zr^-KBp7n60cjm( zgo`Hpd@~?P)~M{8czT{Z*jbcS3ZNK=x)?$mI$tOj@n3FBXM)IPf?(tmGGvX*l^?0y zjjs;jsi9@&>)yw7$f-dS99z=VxUn7rY0rZF;0El&`H1VS+`d2E&_#ygQ=E*mDk>Ly zW6|_h8+IZvFkTCdZ20v9_v3TYu*RXG1DF<8e1kH#fBJFqI6M0L~re2}BVO zr#8`A&7arWrNq%=(c-H4k9P3LDIdN@kjjK(w#lh++8cDQ@*c?%bx_c>E8*6I18DbC zdU*~i1M}nilMeh_6rqROj{~Hc?S%q+tq3Z13r8H|U{01!!Q$QyPuR9whNY$h;gvcL z#I8!CvT!=E>0Y){du&msYp~BDHQA+v2n%rxt>aG3eqW??JS~zq&_{7!jdddTJNQMV z<-cA*>pWf^=_?FAw&3mHs{<>AlL!-E!$f7U+bO*UTvR+PxyEHVm?QbxPb+##5o>24vPr{ z;?!pL&abtWpYNgntSN)!ulG`|$r3&TU&p02Ij_GOC%MBUdI#dhswWRcRCBgBNPo+ca?e?WdF@mZ0k^dvi)?fvmH46 zY|EF8k(TffmLgM+2Ob0zq30OzQp!AZ+<@9pA!N}G*r$R&DdrQ`^8MpE@#uWSTp%Je z2y$p1I%$O4i%XCM8iW(XO*%BF>+@6KEsD+@k>D-gAFV8{jc?_X=rmu>O;B)^`L_&i z@4k7frpN;E>cockSC8juXF9(NQOkRx3@s%jSJ>YStIcQimRijsn^F@vEtI>l2s$17 zn{yk~4ZzDfU{QwYe;1F5s)nmhLemb3Jt8aCQe7+pBl^KyWoTmz1sI#^XSy_G+~5|!$}Z()rH zi(vds-BEIW22*^F>N#3IxhEoS0lBTsbF0U@{T{0kiWgqHM=#cGe-8KoGRr3MQrbp< zx)>*m8f98H6#d=h?P5ENI>+D3ao4T(7MYOkBa5n6aZOk3T~6FY6&)SDYB09n>?An+ z{3~l@c3YLW@E8co`Iuw+;#!z8(-iIZ3N!yC-`m&o#cJt7B!|@NSmMl6xPMk4|xz z=q?Dx!MvK1k8Hv5DWG1k@{VAW7ZUC3ZM06Fk1p3v0Yzan!}*L}-=;}?V5olg5|*3# z6S`66b^5{t?0j}eQir($3*88o|1FOrwJ&`3u9rj~@=vKN=y%W?8$No*_sd^VgxsW; z<{u*%1LRAuTS_YQURRmdjZKgx zDAB&YzrD^b=HgcDVH`KM^&`|X33dNn`Ngh2}7vMF|{`bs6f ztUnd2r=u6D^c^ip%FqpDoT)$E0WA_%G&aFqP{_M3yX7)U0h%mqeqdI zP21Dzt^Mq0T!yBr3%iDJR5IK>$ulc;Hb+z+-BsHt+Ucbe}FUPZGKdd8X zI3I>_Pnhl46oKOjVw2LItnB*j1TWbIw%Kb%%CD3U_qvU@iz!o3sI92o((N-8y@&n( z>Pou#cDRc2BwTNVVSJpsvgm=H-o!d=U_a=pk8uT^ou75L@9ER&C_>BCZ6odz8|Q$$ zdhTD$YfXdvU#9dmsV!GWENYJJr;I8Cg6(GM;d%IV4rk~muXZ+)p{!`4i65u6z?*?c zWxb@h{c4Qa&Gn&ySy21&Q@4UF)$m8ap#ubgiWtT>w?e~x02i}v)C|MtH3^fhNjhtO zpue|o6a`l%ZZ1`VLabLWW>{;^E}b>buPFK6#O*+5+lNA30c-+gl>&Qvv!ujT=epF--^#1mOjIKD7m+=8(q$Vl-yRf9pCrVRU*=RPv zVbwP-j5d|viS)Ot>Y#Gc#)zb(Jri?dbzK=DfohhzwsryzJ{<$Y$oQ`?unLUnjH}gB%?Oi5B6g=;i^�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∾+n^+vZc5I&ef}j1xa%5ql1GAnsrI2EU~Nd9c1TN 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�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

M)U3907*Vudtg+D2HN%OmzUG#0-u=VBr=9S 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�xBbkmbO;g)!L9!r~Zx2xW16A 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 yKt|2}j!~oGfWtiDSoHY6Kz!`~{Q Date: Thu, 3 Jul 2025 15:23:33 -0400 Subject: [PATCH 003/107] Add renovate.json (#944) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- renovate.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 000000000..5db72dd6a --- /dev/null +++ b/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended" + ] +} From e84afe85d60c71e12dc830f964456979d7e50b09 Mon Sep 17 00:00:00 2001 From: Claudio Spiess Date: Mon, 7 Jul 2025 18:45:31 +0200 Subject: [PATCH 004/107] Dataset preprocessing scripts for AutoPDL (#994) * Data processing scripts Signed-off-by: Claudio Spiess * Bump datasets version Signed-off-by: Claudio Spiess * Address typing/pyright issues Signed-off-by: Claudio Spiess * Add funcy dependency Signed-off-by: Claudio Spiess * Fix impossible version constraint Signed-off-by: Claudio Spiess * pyright ignores Signed-off-by: Claudio Spiess * pyright ignore Signed-off-by: Claudio Spiess * Add evalplus dep to examples Signed-off-by: Claudio Spiess * Improve docs Signed-off-by: Claudio Spiess * Improve docs & lint Signed-off-by: Claudio Spiess * Update doc Signed-off-by: Claudio Spiess --------- Signed-off-by: Claudio Spiess --- docs/README.md | 18 +- docs/autopdl.md | 146 ++++-- examples/optimizer/gsm8k_optimizer_config.yml | 25 + examples/optimizer/mbpp_dataset.py | 2 +- examples/optimizer/optimize.py | 2 +- examples/optimizer/process_fever.py | 462 ++++++++++++++++++ examples/optimizer/process_gsm8k.py | 166 +++++++ examples/optimizer/process_mbpp.py | 79 +++ mkdocs.yml | 2 +- pyproject.toml | 6 +- src/pdl/optimize/pdl_optimizer.py | 44 +- src/pdl/optimize/util.py | 2 +- tests/test_optimizer.py | 3 +- 13 files changed, 890 insertions(+), 67 deletions(-) create mode 100644 examples/optimizer/gsm8k_optimizer_config.yml create mode 100644 examples/optimizer/process_fever.py create mode 100644 examples/optimizer/process_gsm8k.py create mode 100644 examples/optimizer/process_mbpp.py diff --git a/docs/README.md b/docs/README.md index d000a9430..412ed30cf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -50,13 +50,13 @@ pip install 'prompt-declaration-language[examples]' The Live Explorer can be installed as follows (MacOS): ``` -brew install pdl +brew install pdl ``` For other platforms, see installation notes. You can run PDL with LLM models in local using [Ollama](https://ollama.com), or other cloud service. -See [here](https://ibm.github.io/prompt-declaration-language/tutorial/#using-ollama-models) for +See [here](https://ibm.github.io/prompt-declaration-language/tutorial/#using-ollama-models) for instructions on how to install an Ollama model locally. Most examples in this repository use IBM Granite models on [Ollama](https://ollama.com) and some are on [Replicate](https://replicate.com/). In order to run these examples, you need to create a free account @@ -172,7 +172,7 @@ text: temperature: 0 ``` -Notice the syntactic differences. Model ids on watsonx start with `watsonx`. +Notice the syntactic differences. Model ids on watsonx start with `watsonx`. Watsonx also provides a text completion endpoint as shown in the following example. A text completion endpoint does not take chat templates into account: @@ -266,10 +266,10 @@ When we execute this program with the PDL interpreter, we obtain the following t @SuppressWarnings("unchecked") public static Map deserializeOffsetMap(String lastSourceOffset) throws IOException { Map offsetMap; - if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { - offsetMap = new HashMap<>(); + if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { + offsetMap = new HashMap<>(); } else { - offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); + offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); } return offsetMap; } @@ -293,10 +293,10 @@ When we execute this new program, we obtain the following: @SuppressWarnings("unchecked") public static Map deserializeOffsetMap(String lastSourceOffset) throws IOException { Map offsetMap; - if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { - offsetMap = new HashMap<>(); + if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { + offsetMap = new HashMap<>(); } else { - offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); + offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); } return offsetMap; } diff --git a/docs/autopdl.md b/docs/autopdl.md index 73b055ad1..c3b6db7df 100644 --- a/docs/autopdl.md +++ b/docs/autopdl.md @@ -7,7 +7,15 @@ hide: # AutoPDL Tutorial -The following sections show how to use the AutoPDL optimizer to produce optimized PDL programs for specific tasks. +The following sections show how to use the AutoPDL optimizer introduced by [Spiess et al. (2025)](https://openreview.net/forum?id=CAeISyE3aR) in "AutoPDL: Automatic Prompt Optimization for LLM Agents" ([arXiv](https://arxiv.org/abs/2504.04365)), to produce optimized PDL programs for specific tasks. Please ensure PDL was installed with extras e.g. + +``` { .bash .copy .annotate linenums="1" } +pip install 'prompt-declaration-language[all]' +# or from source +git clone git@github.com:IBM/prompt-declaration-language.git +cd prompt-declaration-language +pip install -e '.[all]' +``` To optimize a PDL program, we need the program, an optimizer configuration, a dataset, and an _evaluator_. An evaluator is a Python subclass of `OptimizerEvaluator` that evaluates a candidate, which is a generated configuration instance consisting of e.g. fewshot examples. The evaluator class follows this structure: @@ -52,41 +60,15 @@ class OptimizerEvaluator(Thread): Let's go through an example for `GSM8K`. Our PDL program uses different prompt patterns from the prompt library, and the variables `prompt_pattern`, `question`, `model`, and `demonstrations` are inserted at runtime by the evaluator. - ```yaml title="examples/optimizer/gsm8k.pdl" linenums="1" --8<-- "./examples/optimizer/gsm8k.pdl" ``` -We write a configuration file for the optimizer, see `src/pdl/optimize/config_parser.py` for all fields: - -``` { .yaml .copy .annotate title="gsm8k_optimizer_config.yml" linenums="1" } -benchmark: gsm8k # Name our benchmark -budget: null # Set a budget, can be number of iterations, or a duration string e.g. "2h" -budget_growth: double # double validation set size each iteration -# or to_max: reach max_test_set_size by final iteration -initial_test_set_size: 2 # size of test set in first iteration -max_test_set_size: 10 # maximum test set size -num_candidates: 100 # how many candidates to evaluate -num_demonstrations: 5 # how many demonstrations to include per candidate -parallelism: 1 # how many threads to run evaluations across -shuffle_test: false # shuffling of test set -test_set_name: test # name of test set -train_set_name: train # name of train set -validation_set_name: validation # name of validation set -demonstrations_variable_name: demonstrations # variable name to insert demonstrations into -variables: # define discrete options to sample from - model: # set ${ model } variable - - watsonx/meta-llama/llama-3-1-8b-instruct - prompt_pattern: # set ${ prompt_pattern } variable to one of these - - cot - - react - - rewoo - num_demonstrations: # overrides num demonstrations above - - 0 - - 3 - - 5 -``` +We write a configuration file for the optimizer, and save it as `gsm8k_optimizer_config.yml`. See `src/pdl/optimize/config_parser.py` for all fields. Please note that this example uses the `watsonx` inference service, so an API key is required, although you can also use a local model or any other inference service. +``` { .yaml .copy .annotate title="examples/optimizer/gsm8k_optimizer_config.yml" linenums="1" } +--8<-- "./examples/optimizer/gsm8k_optimizer_config.yml" +``` ```python title="examples/optimizer/gsm8k_evaluator.py" linenums="1" --8<-- "./examples/optimizer/gsm8k_evaluator.py" @@ -95,20 +77,112 @@ variables: # define discrete options to sample from We can see an example of a script to run the optimization process in `examples/optimizer/optimize.py`. Usage: -``` +```text python optimize.py optimize -h usage: optimize.py optimize [-h] --config CONFIG --dataset-path DATASET_PATH [--experiments-path EXPERIMENTS_PATH] [--yield_output | --no-yield_output] [--dry | --no-dry] pdl_file ``` -We also need a dataset to optimize against, with `train`, `test`, and `validation` splits. To produce such a dataset, we can use HuggingFace Datasets `load_dataset` and `save_to_disk`. This example requires the dataset to have columns `question`, `reasoning`, and `answer`, which can be created from the original `openai/gsm8k` dataset. Processing scripts are under development and will follow shortly. +We also need a dataset to optimize against, with `train`, `test`, and `validation` splits. To produce such a dataset, we can use HuggingFace Datasets `load_dataset` and `save_to_disk`. This example requires the dataset to have columns `question`, `reasoning`, and `answer`, which can be created from the original `openai/gsm8k` dataset. + +We provide three scripts in `examples/optimizer` to create datasets, including the rule based agentic trajectories. These are `process_gsm8k.py`, `process_fever.py`, and `process_mbpp.py`. They load the original datasets, process them, and save them to disk in the required format. Dataset specific instructions may be found in the respective script files. Note that the scripts create a folder named `var` in the current directory, which contains the processed dataset in a format that can be used by the optimizer. Therefore, they should be run in the root of the PDL repository. -We can run an example like so: +Let's run the GSM8K dataset processing script: + +``` { .bash .copy .annotate linenums="1" } +python examples/optimizer/process_gsm8k.py +``` +Which should save the processed dataset in `var/gsm8k_trajectified` and output something like: + +```text +Saving the dataset (1/1 shards): 100%|█████████████████████████████████████████████████████████████████| 6449/6449 [00:00<00:00, 557195.73 examples/s] +Saving the dataset (1/1 shards): 100%|█████████████████████████████████████████████████████████████████| 1319/1319 [00:00<00:00, 363559.64 examples/s] +Saving the dataset (1/1 shards): 100%|█████████████████████████████████████████████████████████████████| 1024/1024 [00:00<00:00, 271472.56 examples/s] +Map: 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 6449/6449 [00:00<00:00, 71242.31 examples/s] +Map: 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 1024/1024 [00:00<00:00, 68826.30 examples/s] +Map: 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 6449/6449 [00:00<00:00, 22520.85 examples/s] +Map: 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 6449/6449 [00:00<00:00, 18186.53 examples/s] +Saving the dataset (1/1 shards): 100%|█████████████████████████████████████████████████████████████████| 6449/6449 [00:00<00:00, 698328.77 examples/s] +Saving the dataset (1/1 shards): 100%|█████████████████████████████████████████████████████████████████| 1319/1319 [00:00<00:00, 232468.57 examples/s] +Saving the dataset (1/1 shards): 100%|█████████████████████████████████████████████████████████████████| 1024/1024 [00:00<00:00, 413375.10 examples/s] +DatasetDict({ + train: Dataset({ + features: ['question', 'answer', 'reasoning', 'raw_answer', 'answer_part', 'traj_keys', 'traj_values', 'rewoo_traj_keys', 'rewoo_traj_values'], + num_rows: 6449 + }) + test: Dataset({ + features: ['question', 'answer', 'reasoning', 'raw_answer', 'answer_part'], + num_rows: 1319 + }) + validation: Dataset({ + features: ['question', 'answer', 'reasoning', 'raw_answer', 'answer_part'], + num_rows: 1024 + }) +}) ``` + +Finally, we can run the example like so: + +``` { .bash .copy .annotate linenums="1" } cd examples/optimizer -python optimize.py optimize --config config.yml --dataset-path datasets/gsm8k gsm8k.pdl +python optimize.py optimize --config gsm8k_optimizer_config.yml --dataset-path ../../var/gsm8k_trajectified gsm8k.pdl +``` + +This will report details about the optimization process, such as the number of candidates evaluated. The output will look something like this: + +```text + PDL Optimizer pdl_optimizer.py:336 + ┌──────────────────────────────┬─────────────────────────────────────────────┐ + │ Config combinations │ 9 │ + │ Max candidates │ 100 │ + │ Num. candidates │ 100 │ + │ Starting validation set size │ 2 │ + │ Max validation set size │ 10 │ + │ Num. iterations │ 7 │ + │ Total evaluations │ 1,200 │ + │ Num. threads │ 1 │ + │ Validation set multiplier │ 2 │ + │ Shuffle validation set │ False │ + │ Budget policy │ None │ + ├──────────────────────────────┼─────────────────────────────────────────────┤ + │ model │ ['watsonx/meta-llama/llama-3-2-3b-instruct… │ + │ prompt_pattern │ ['cot', 'react', 'rewoo'] │ + │ num_demonstrations │ [0, 3, 5] │ + └──────────────────────────────┴─────────────────────────────────────────────┘ + Iteration pdl_optimizer.py:419 + ┌─────────────────────┬─────┐ + │ Index │ 0 │ + │ Validation set size │ 2 │ + │ Num. candidates │ 100 │ + └─────────────────────┴─────┘ + Evaluation pdl_optimizer.py:601 + ┌────────────────────────┬──────────────────────────────────────────┐ + │ Test set size │ 2 │ + ├────────────────────────┼──────────────────────────────────────────┤ + │ model │ watsonx/meta-llama/llama-3-2-3b-instruct │ + │ prompt_pattern │ cot │ + │ num_demonstrations │ 0 │ + │ uuid │ enl0ertp │ + │ demonstrations_indices │ 0 │ + │ demonstrations │ 0 │ + └────────────────────────┴──────────────────────────────────────────┘ + Running without parallelism util.py:74 + 0% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0/1,200 [ 0:00:01 < -:--:-- , ? it/s ] ``` -Once the process is complete, a file `optimized_gsm8k.pdl` is written. This file contains the optimal configuration and is directly executable by the standard PDL interpreter. +Note that it is not unusual to observe PDL exceptions during the optimization process. + +```text +[15:44:14] Type errors during spec checking: +../../contrib/prompt_library/ReAct.pdl:0 - should be an object +../../contrib/prompt_library/ReAct.pdl:0 - Type errors during spec checking: +../../contrib/prompt_library/ReAct.pdl:0 - should be an object +Retrying: False +Runtime FAILED and took seconds: 10.21 +``` + +Such exceptions, here for example in `ReAct.pdl`, are caused by the _typed_ model call in `ReAct.pdl:98`. If the model output does not result in a parsable JSON that matches the expected type `{ name: string, arguments: object }`, the PDL interpreter raises an exception. + +Once the process is complete, a file `optimized_gsm8k.pdl` is written in same directory as the source PDL file. This file contains the optimal configuration and is directly executable by the standard PDL interpreter. A log of the optimization process is written to `experiments/` by default. diff --git a/examples/optimizer/gsm8k_optimizer_config.yml b/examples/optimizer/gsm8k_optimizer_config.yml new file mode 100644 index 000000000..49da371ff --- /dev/null +++ b/examples/optimizer/gsm8k_optimizer_config.yml @@ -0,0 +1,25 @@ +benchmark: gsm8k # Name our benchmark +budget: null # Set a budget, can be number of iterations, or a duration string e.g. "2h" +budget_growth: double # double validation set size each iteration +# or to_max: reach max_test_set_size by final iteration +initial_test_set_size: 2 # size of test set in first iteration +max_test_set_size: 10 # maximum test set size +num_candidates: 100 # how many candidates to evaluate +num_demonstrations: 5 # how many demonstrations to include per candidate +parallelism: 1 # how many threads to run evaluations across +shuffle_test: false # shuffling of test set +test_set_name: test # name of test set +train_set_name: train # name of train set +validation_set_name: validation # name of validation set +demonstrations_variable_name: demonstrations # variable name to insert demonstrations into +variables: # define discrete options to sample from + model: # set ${ model } variable + - watsonx/meta-llama/llama-3-2-3b-instruct + prompt_pattern: # set ${ prompt_pattern } variable to one of these + - cot + - react + - rewoo + num_demonstrations: # overrides num demonstrations above + - 0 + - 3 + - 5 diff --git a/examples/optimizer/mbpp_dataset.py b/examples/optimizer/mbpp_dataset.py index 3265a8b29..61fef67a6 100644 --- a/examples/optimizer/mbpp_dataset.py +++ b/examples/optimizer/mbpp_dataset.py @@ -3,7 +3,7 @@ from copy import deepcopy -from datasets import load_from_disk +from datasets.load import load_from_disk from evalplus.data import get_mbpp_plus, get_mbpp_plus_hash from evalplus.evaluate import MBPP_OUTPUT_NOT_NONE_TASKS, get_groundtruth diff --git a/examples/optimizer/optimize.py b/examples/optimizer/optimize.py index c88b799cb..24307fa26 100644 --- a/examples/optimizer/optimize.py +++ b/examples/optimizer/optimize.py @@ -5,7 +5,7 @@ from typing import Any import yaml -from datasets import load_from_disk +from datasets.load import load_from_disk from fever_evaluator import FEVEREvaluator from gsm8k_evaluator import Gsm8kEvaluator from gsmhard_evaluator import GsmHardEvaluator diff --git a/examples/optimizer/process_fever.py b/examples/optimizer/process_fever.py new file mode 100644 index 000000000..f3419cb7f --- /dev/null +++ b/examples/optimizer/process_fever.py @@ -0,0 +1,462 @@ +# Instructions for running this script: +# 1. Ensure you have the required libraries installed. +# `datasets` should be version 3.0 or higher. +# +# `pip install prompt-declaration-language[all] funcy` +# 2. Download the original FEVER dataset with wiki-pages, and BigBench FEVER task JSON file +# from the respective sources. +# https://fever.ai/dataset/fever.html +# https://github.com/google/BIG-bench/blob/main/bigbench/benchmark_tasks/fact_checker/fever/task.json +# +# ``` +# wget https://raw.githubusercontent.com/google/BIG-bench/refs/heads/main/bigbench/benchmark_tasks/fact_checker/fever/task.json +# wget https://fever.ai/download/fever/wiki-pages.zip +# wget https://fever.ai/download/fever/shared_task_dev.jsonl +# ``` +# Place the downloaded files in the `var/fever` directory. +# Extract the `wiki-pages.zip` file into `var/fever/wiki-pages/`. +# 3. Run this script to process the FEVER dataset. +# `python examples/optimizer/process_fever.py` +# +import json +import operator +import re +import unicodedata +import warnings +from functools import cache +from itertools import groupby +from pathlib import Path +from typing import Any + +import pandas as pd +import wikipedia +from datasets.arrow_dataset import Dataset +from datasets.dataset_dict import DatasetDict +from datasets.load import load_dataset, load_from_disk +from funcy import flatten +from tqdm.autonotebook import tqdm + +tqdm.pandas() +warnings.simplefilter("ignore") + +var_dir = Path("var") +var_dir.mkdir(parents=True, exist_ok=True) + + +def clean_fever(text: str) -> str: + mapping = { + "_": " ", + "-LRB- ": "(", + " -RRB-": ")", + "-LSB- ": "[", + " -RSB-": "]", + "-LRB-": "(", + "-RRB-": ")", + "-LSB-": "[", + "-RSB-": "]", + "-COLON-": ":", + } + + for k, v in mapping.items(): + text = text.replace(k, v) + + return text.strip() + + +@cache +def search_new( + subject: str, auto_suggest: bool = False, redirect: bool = False +) -> tuple[str, str]: + try: + result = ( + wikipedia.summary( + subject, auto_suggest=auto_suggest, redirect=redirect + ).strip(), + "success", + ) + except wikipedia.DisambiguationError as d: + result = ( + f'"{subject}" may refer to one of {d.args[1]}. Please retry the search with one of the subjects using Search[].', + "disambg", + ) + except wikipedia.PageError as e: + result = f"{e} Please retry the search using Search[].", "pageerror" + except wikipedia.WikipediaException as e: + print(e, type(e)) + result = str(e), f"other:{type(e)}" + except Exception as e: + print(e, type(e)) + result = str(e), f"other:{type(e)}" + return result + + +def searcher(row: dict[str, Any], auto_suggest: bool): + cleaned = clean_fever(row["article"]) + if "msg" in row: + if row["msg"] != "success": + wiki, msg = search_new(cleaned, auto_suggest=auto_suggest, redirect=True) + else: + wiki = row["wiki"] + msg = row["msg"] + else: + wiki, msg = search_new(cleaned, auto_suggest=auto_suggest, redirect=True) + return {"wiki": wiki, "msg": msg, "cleaned": cleaned} + + +def remove_accents(x: str) -> str: + return unicodedata.normalize("NFD", x) + + +fever = load_dataset("fever/fever", "v1.0") +if not isinstance(fever, DatasetDict): + raise TypeError(f"Expected fever to be a DatasetDict, but got: {type(fever)}") + +bigbench_fever = json.loads(Path("var/fever/task.json").read_text(encoding="utf-8")) + +fever.save_to_disk("var/fever/fever_original") +print(fever) + +wikipages = load_dataset( + "json", + data_files="var/fever/wiki-pages/wiki-pages/wiki-*.jsonl", + encoding="utf-8", +) +if not isinstance(wikipages, DatasetDict): + raise TypeError( + f"Expected wikipages to be a DatasetDict, but got: {type(wikipages)}" + ) + +print("Loaded wikipages:", wikipages) +print("Mapping wikipages...") +wikipages["train"] = wikipages["train"].map( + lambda x: { + "lines_split": [x for x in re.split(r"\d+\t", x["lines"]) if x], + }, + num_proc=32, +) +print("Mapping wikipages done.") + +print("Converting wikipages to DataFrame...") +wiki_pages_df = wikipages["train"].to_pandas() +if not isinstance(wiki_pages_df, pd.DataFrame): + raise TypeError( + f"Expected wiki_pages_df to be a DataFrame, but got: {type(wiki_pages_df)}" + ) +wiki_pages_df = wiki_pages_df.set_index("id") +wiki_pages_df.index = wiki_pages_df.index.map(remove_accents) +print("Wikipages converted to DataFrame.") + + +if isinstance(wiki_pages_df, pd.DataFrame): + wiki_pages_df.to_parquet( + path="var/fever/wiki_pages.parquet", + index=True, + engine="pyarrow", + compression="zstd", + compression_level=10, + ) +else: + raise TypeError( + f"Expected wiki_pages_df to be a DataFrame, but got: {type(wiki_pages_df)}" + ) + + +df = pd.read_json( + "var/fever/shared_task_dev.jsonl", lines=True, encoding="utf-8" +).set_index("id") +print("Loaded original FEVER", len(df)) +df = df[df.label.isin(["SUPPORTS", "REFUTES"])].copy() +print("Filtered original FEVER", len(df)) + + +def evidence_mapper(evidence: list[tuple]): + evidences = {(x[2], x[3]) for x in evidence[0] if x[2] is not None} + return list(evidences) + + +df["unique_evidence"] = df[ + "evidence" +].progress_apply( # pyright: ignore[reportAttributeAccessIssue] + evidence_mapper +) + + +def evidence_mapper_sentence(evidences: list[tuple[str, int]]): + if not isinstance(wiki_pages_df, pd.DataFrame): + raise TypeError( + f"Expected wiki_pages_df to be a DataFrame, but got: {type(wiki_pages_df)}" + ) + + lines = [] + for title, line in evidences: + if title is None or line is None: + continue + title_no_acc = remove_accents(title) + + if title_no_acc not in wiki_pages_df.index: + print(title_no_acc) + continue + + sentence = wiki_pages_df.loc[title_no_acc] + if sentence["lines_split"] is not None and len(sentence["lines_split"]) > line: + sentence = sentence["lines_split"][line] + lines.append((title_no_acc, line, sentence)) + else: + print(sentence) + return list(lines) + + +df["evidence_sentences"] = df[ + "unique_evidence" +].progress_apply( # pyright: ignore[reportAttributeAccessIssue] + evidence_mapper_sentence +) + +bigbench = pd.DataFrame.from_records(bigbench_fever["examples"]).set_index("id") + +tqdm.pandas(desc="Mapping claims to (in) bigbench") +df["claim_in_bigbench"] = df[ + "claim" +].progress_apply( # pyright: ignore[reportAttributeAccessIssue] + lambda x: bigbench.input.str.contains(x).any() +) +tqdm.pandas() + +df["evidence_sentence_count"] = df[ + "evidence_sentences" +].map( # pyright: ignore[reportAttributeAccessIssue] + len +) +print("Mapped bigbench") + +train_df = df[(~df.index.isin(bigbench.index)) & (df["evidence_sentence_count"] > 0)] + +test_df = df[ + (df.index.isin(bigbench.index)) & (df["evidence_sentence_count"] > 0) +].drop( # pyright: ignore[reportAttributeAccessIssue] + columns=["verifiable", "claim_in_bigbench", "evidence"] +) +test_df["unique_evidence"] = test_df[ + "unique_evidence" +].map( # pyright: ignore[reportAttributeAccessIssue] + lambda x: [[str(title), str(sent_id)] for title, sent_id in x] +) +test_df["evidence_sentences"] = test_df[ + "evidence_sentences" +].map( # pyright: ignore[reportAttributeAccessIssue] + lambda x: [[str(title), str(sent_id), str(sent)] for title, sent_id, sent in x] +) +test_df["label"] = test_df["label"] == "SUPPORTS" +test_df.index = test_df.index.astype(pd.StringDtype()) +test_df.claim = test_df.claim.astype(pd.StringDtype()) +test_df["id"] = test_df.index +print("Saving fever test df") +test_df.to_json("fever_test_df.json", orient="records", lines=True) +print("Saved fever test df") + +train_df = df[ + (~df.index.isin(bigbench.index)) & (df["evidence_sentence_count"] > 0) +].drop( # pyright: ignore[reportAttributeAccessIssue] + columns=["verifiable", "claim_in_bigbench", "evidence"] +) +train_df["unique_evidence"] = train_df[ + "unique_evidence" +].map( # pyright: ignore[reportAttributeAccessIssue] + lambda x: [[str(title), str(sent_id)] for title, sent_id in x] +) +train_df["evidence_sentences"] = train_df[ + "evidence_sentences" +].map( # pyright: ignore[reportAttributeAccessIssue] + lambda x: [[str(title), str(sent_id), str(sent)] for title, sent_id, sent in x] +) +train_df["label"] = train_df["label"] == "SUPPORTS" +train_df.index = train_df.index.astype(pd.StringDtype()) +train_df.claim = train_df.claim.astype(pd.StringDtype()) +train_df["id"] = train_df.index +print("Saving fever train df") +train_df.to_json("fever_train_df.json", orient="records", lines=True) +print("Saved fever train df") + +fever_ds = load_dataset( + "json", data_files={"train": "fever_train_df.json", "test": "fever_test_df.json"} +) +if not isinstance(fever_ds, DatasetDict): + raise TypeError(f"Expected fever_ds to be a DatasetDict, but got: {type(fever_ds)}") +fever_ds.save_to_disk("var/fever/fever_reprocessed") +print(fever_ds) + + +articles = list( + set(flatten([[y[0] for y in x] for x in fever_ds["train"]["unique_evidence"]])) +) +article_ds = Dataset.from_dict({"article": articles}) +print(article_ds) + + +article_ds = article_ds.map(lambda x: searcher(x, True), num_proc=4) +article_ds = article_ds.map(lambda x: searcher(x, False), num_proc=1) +article_df = article_ds.to_pandas() +if not isinstance(article_df, pd.DataFrame): + raise TypeError( + f"Expected article_df to be a DataFrame, but got: {type(article_df)}" + ) +article_df = article_df.set_index("article") +print("Articles that did not return a successful response:") +print(article_df[article_df.msg != "success"]) +article_ds.save_to_disk("var/fever/fever_articles") +article_df.to_parquet( + "var/fever/fever_articles.parquet", + index=True, + engine="pyarrow", + compression="zstd", + compression_level=10, +) + + +def search(query: str) -> tuple: + if not isinstance(article_df, pd.DataFrame): + raise TypeError( + f"Expected article_df to be a DataFrame, but got: {type(article_df)}" + ) + row = article_df.loc[query] + return row["wiki"], row["msg"] + + +def trajectorize(row: dict[str, Any]) -> dict[str, Any]: + evidence_sentences = row["evidence_sentences"] + + claim = row["claim"].strip() + task = f"On June 2017, the following claim was made: {claim}\nQ: Was this claim true or false?" + answer = str(row["label"]).lower() + + article_sentence_group = { + k: list(v) for k, v in groupby(evidence_sentences, operator.itemgetter(0)) + } + + sample_articles = {} + statuses = [] + wiki_worked = True + for article in article_sentence_group: + cleaned_article = clean_fever(article) + wiki, worked = search(article) + wiki = wiki.strip() + if worked != "success": + wiki_worked = False + + sample_articles[cleaned_article] = wiki + statuses.append(worked) + all_wiki_success = all(x in {"success", "fallback"} for x in statuses) + + trajectory = [{"task": task}] + + for article, evidences in article_sentence_group.items(): + cleaned_article = clean_fever(article) + trajectory.extend( + [ + {"thought": f"I need to search {cleaned_article}."}, + { + "action": '{"name": "Search", "arguments": {"topic": "' + + cleaned_article + + '"}}' + }, + { + "observation": f"[Document]\n{sample_articles[cleaned_article]}\n[End]" + }, + ] + ) + + for _title, _line, sent in evidences: + trajectory.append({"observation": clean_fever(sent.split("\t")[0])}) + + trajectory.extend( + [ + {"thought": f"The claim is {answer}."}, + {"action": '{"name": "Finish", "arguments": {"topic": "' + answer + '"}}'}, + ] + ) + + traj_keys = [next(iter(t.keys())) for t in trajectory] + traj_values = [next(iter(t.values())) for t in trajectory] + + rewoo_trajectory = [{"task": task}] + + for article, evidences in article_sentence_group.items(): + cleaned_article = clean_fever(article) + rewoo_trajectory.extend( + [ + {"thought": f"Search for more information about {cleaned_article}."}, + { + "action": '{"name": "Search", "arguments": {"topic": "' + + cleaned_article + + '"}}' + }, + { + "observation": f"[Document]\n{sample_articles[cleaned_article]}\n[End]" + }, + ] + ) + + for _title, _line, sent in evidences: + rewoo_trajectory.append({"observation": clean_fever(sent.split("\t")[0])}) + + rewoo_traj_keys = [next(iter(t.keys())) for t in rewoo_trajectory] + rewoo_traj_values = [next(iter(t.values())) for t in rewoo_trajectory] + + return { + "traj_keys": traj_keys, + "traj_values": traj_values, + "rewoo_traj_keys": rewoo_traj_keys, + "rewoo_traj_values": rewoo_traj_values, + "all_wiki_success": all_wiki_success, + "wiki_worked": wiki_worked, + "articles": list(sample_articles.values()), + "statuses": statuses, + } + + +def sentencify(row: dict[str, Any]) -> dict[str, str]: + evidence_sentences = row["evidence_sentences"] + + article_sentence_group = { + clean_fever(k): list(v) + for k, v in groupby(evidence_sentences, operator.itemgetter(0)) + } + + sentences = [] + for evidences in article_sentence_group.values(): + for _title, _line, sent in evidences: + sentences.append(clean_fever(sent.split("\t")[0])) + + return {"cot": " ".join(sentences).strip().replace("\n", " ").strip()} + + +fever_ds = fever_ds.map( + lambda x: {"label": str(x["label"]).lower()}, + num_proc=4, +) + +fever_ds["train"] = ( + fever_ds["train"].map(trajectorize, num_proc=4).map(sentencify, num_proc=4) +) + + +print( + "Wiki lookup failures:", + fever_ds["train"].filter(lambda x: x["all_wiki_success"] is False), +) + + +fever_ds["train"] = fever_ds["train"].filter(lambda x: x["wiki_worked"] is True) +fever_ds["train"] = fever_ds["train"].remove_columns( + column_names=["wiki_worked", "all_wiki_success", "statuses"] +) +print(fever_ds) + +new_split = fever_ds["train"].train_test_split(test_size=1024) +fever_ds["train"] = new_split["train"] +fever_ds["validation"] = new_split["test"] +fever_ds.save_to_disk("var/fever_trajectified") + +# Make sure the saved dataset is loaded correctly +ds = load_from_disk("var/fever_trajectified") +print(ds) diff --git a/examples/optimizer/process_gsm8k.py b/examples/optimizer/process_gsm8k.py new file mode 100644 index 000000000..57911a0c7 --- /dev/null +++ b/examples/optimizer/process_gsm8k.py @@ -0,0 +1,166 @@ +import re +from pathlib import Path +from typing import Any + +from datasets.dataset_dict import DatasetDict +from datasets.load import load_dataset, load_from_disk + +from pdl.optimize.parse_number import parse_number + +# Load original GSM8K dataset and split it into train and validation sets + +var_dir = Path("var") +var_dir.mkdir(parents=True, exist_ok=True) + +gsm8k_orig = load_dataset("openai/gsm8k", "main") +if not isinstance(gsm8k_orig, DatasetDict): + raise TypeError( + f"Expected gsm8k_orig to be a DatasetDict, but got: {type(gsm8k_orig)}" + ) +new_split = gsm8k_orig["train"].train_test_split(test_size=1024) +gsm8k_orig["validation"] = new_split["test"] +gsm8k_orig["train"] = new_split["train"] +gsm8k_orig.save_to_disk("var/gsm8k_split") + +# Make sure the saved dataset is loaded correctly +gsm8k = load_from_disk("var/gsm8k_split") +if not isinstance(gsm8k, DatasetDict): + raise TypeError(f"Expected gsm8k to be a DatasetDict, but got: {type(gsm8k)}") + + +def parse_answers(row: dict[str, Any]) -> dict[str, Any]: + question = row["question"].strip().replace("’", "'").replace(" ", " ") + parts = row["answer"].split("####") + answer = parse_number(parts[-1]) + reasoning = "####".join(parts[:-1]).strip().replace("’", "'").replace(" ", " ") + return { + "question": question, + "answer": answer, + "reasoning": reasoning, + "raw_answer": row["answer"], + "answer_part": parts[-1], + } + + +gsm8k = gsm8k.map(parse_answers) + + +def react_trajectory(row: dict[str, Any]) -> dict[str, list[str]]: + question = row["question"] + answer = row["answer"] + reasoning = row["reasoning"].splitlines() + trajectory = [{"question": question.strip()}] + res = answer + + for line in reasoning: + pattern = ( + r"(?P

(=(\ )?|equals(\ )?)?(\$)?)<<(?P.*?)=(?P.*?)>>([^\s]*)"
+        )
+        expressions = re.search(pattern, line)
+
+        if expressions is None:
+            trajectory += [
+                {"thought": line.strip().replace("  ", " ")},
+            ]
+        else:
+            thought = re.sub(pattern, "", line)
+            thought = thought.rstrip(".").rstrip(",")
+            exp = expressions.group("exp").strip()
+            res = expressions.group("res").strip()
+
+            trajectory += [
+                {
+                    "thought": f"{thought.strip().replace('  ', ' ')}. I need to calculate {exp}"
+                },
+                {
+                    "action": '{"name": "Calculator", "arguments": {"expr": "'
+                    f"{exp}"
+                    '"}}'
+                },
+                {"observation": res},
+            ]
+    if next(iter(trajectory[-1].keys())) == "observation":
+        trajectory.append({"thought": f"The answer is {answer}"})
+
+    trajectory.append(
+        {"action": '{"name": "Finish", "arguments": {"answer": "' + f"{answer}" + '"}}'}
+    )
+
+    traj_keys = [next(iter(t.keys())) for t in trajectory]
+    traj_values = [next(iter(t.values())) for t in trajectory]
+
+    return {
+        "traj_keys": traj_keys,
+        "traj_values": traj_values,
+    }
+
+
+gsm8k["train"] = gsm8k["train"].map(react_trajectory)
+
+
+def rewoo_trajectory(row: dict[str, Any]) -> dict[str, list[str]]:
+    question = row["question"]
+    answer = row["answer"]
+    reasoning = row["reasoning"].splitlines()
+    trajectory = [{"question": question.strip().replace("  ", " ")}]
+    res = answer
+
+    for line in reasoning:
+        pattern = (
+            r"(?P
(=(\ )?|equals(\ )?)?(\$)?)<<(?P.*?)=(?P.*?)>>([^\s]*)"
+        )
+        expressions = re.search(pattern, line)
+
+        if expressions is None:
+            trajectory += [
+                {"thought": line.strip().replace("  ", " ")},
+            ]
+        else:
+            thought = re.sub(pattern, "", line)
+            thought = thought.rstrip(".").rstrip(",")
+            exp = expressions.group("exp").strip()
+            res = expressions.group("res").strip()
+
+            trajectory += [
+                {"thought": f"{thought.strip().replace('  ', ' ')}. Calculate {exp}"},
+                {
+                    "action": '{"name": "Calculator", "arguments": {"expr": "'
+                    f"{exp}"
+                    '"}}'
+                },
+                {"observation": res},
+            ]
+
+    evidence_counter = 0
+    for i, outer in enumerate(trajectory):
+        type_event = next(iter(outer.keys()))
+        value = next(iter(outer.values()))
+
+        if type_event == "action":
+            evidence_counter += 1
+        if type_event == "observation":
+            for j in range(i + 1, len(trajectory)):
+                inner = trajectory[j]
+                inner_type_event = next(iter(inner.keys()))
+                if inner_type_event == "action":
+                    trajectory[j]["action"] = trajectory[j]["action"].replace(
+                        value, f"#E{evidence_counter}"
+                    )
+                elif inner_type_event == "thought":
+                    trajectory[j]["thought"] = trajectory[j]["thought"].replace(
+                        value, f"#E{evidence_counter}"
+                    )
+    traj_keys = [next(iter(t.keys())) for t in trajectory]
+    traj_values = [next(iter(t.values())) for t in trajectory]
+
+    return {"rewoo_traj_keys": traj_keys, "rewoo_traj_values": traj_values}
+
+
+gsm8k["train"] = gsm8k["train"].map(rewoo_trajectory)
+
+# Save the processed dataset
+gsm8k.save_to_disk("var/gsm8k_trajectified")
+
+# Make sure the saved dataset is loaded correctly
+ds = load_from_disk("var/gsm8k_trajectified")
+print(ds)
diff --git a/examples/optimizer/process_mbpp.py b/examples/optimizer/process_mbpp.py
new file mode 100644
index 000000000..c995b9d44
--- /dev/null
+++ b/examples/optimizer/process_mbpp.py
@@ -0,0 +1,79 @@
+# Instructions:
+# 1. Install EvalPlus e.g. `pip install evalplus`
+# 2. Run this script to process the MBPP dataset into a format suitable for evaluation.
+import re
+from pathlib import Path
+from typing import Any
+
+from datasets.dataset_dict import DatasetDict
+from datasets.load import load_dataset, load_from_disk
+from evalplus.data import get_mbpp_plus
+
+var_dir = Path("var")
+var_dir.mkdir(parents=True, exist_ok=True)
+
+mbpp_plus = get_mbpp_plus()
+
+mbpp = load_dataset("google-research-datasets/mbpp", name="full")
+if not isinstance(mbpp, DatasetDict):
+    raise TypeError(f"Expected mbpp to be a DatasetDict, but got: {type(mbpp)}")
+
+mbpp["test"] = mbpp["test"].filter(
+    lambda x: f"Mbpp/{x['task_id']}" in mbpp_plus,
+)
+
+mbpp["validation"] = mbpp["validation"].filter(
+    lambda x: f"Mbpp/{x['task_id']}" in mbpp_plus,
+)
+
+
+def trajectify(row: dict[str, Any]) -> dict[str, list[str]]:
+    code = row["code"].replace("\r\n", "\n").replace("\r", "\n").strip()
+    first_test = row["test_list"][0].strip().lstrip()
+    pattern = r"assert\s+(\w+\(.*?\))\s*==\s*(.+)"
+
+    # Replacement format
+    replacement = r"res = \1\nassert res == \2, \"Expected \2 but got {}\".format(res)"
+
+    # Perform the substitution
+    converted_string = (
+        re.sub(pattern, replacement, first_test)
+        .replace('\\"Expected ', '"Expected ')
+        .replace('{}\\"', '{}"')
+    )
+    code_w_assert = code + "\n" + converted_string.strip()
+    prompt = row["text"].strip() + "\n" + first_test
+
+    trajectory = [
+        {"task": prompt},
+        {
+            "thought": "I should run a solution on the test case before proposing a solution."
+        },
+        {"action": code_w_assert},
+        {"observation": "[Executed Successfully with No Output]"},
+        {"thought": "There is no AssertionError. I can now submit the solution."},
+        {"solution": code},
+    ]
+
+    traj_keys = [next(iter(t.keys())) for t in trajectory]
+    traj_values = [next(iter(t.values())) for t in trajectory]
+
+    return {
+        "react_prompt": prompt,
+        "code": code,
+        "traj_keys": traj_keys,
+        "traj_values": traj_values,
+    }
+
+
+mbpp_trajectified = mbpp.map(trajectify)
+assert len(mbpp_trajectified["train"]) == 374
+assert len(mbpp_trajectified["test"]) == 224
+assert len(mbpp_trajectified["validation"]) == 39
+
+# Save the processed dataset
+mbpp_trajectified.save_to_disk("var/mbpp_trajectified")
+
+# Make sure the saved dataset is loaded correctly
+ds = load_from_disk("var/mbpp_trajectified")
+print(ds)
diff --git a/mkdocs.yml b/mkdocs.yml
index 3d5fe3887..2831e62d5 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -47,7 +47,7 @@ nav:
   - API Reference: api_reference.md
   - Contribute: contrib.md
   - Viewer: viewer.md
-  # - AutoPDL: autopdl.md # Hide documentation for now
+  - AutoPDL: autopdl.md
 
 # Define some IBM colors
 extra_css:
diff --git a/pyproject.toml b/pyproject.toml
index 3350229a5..089dabae1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -47,10 +47,12 @@ examples = [
   "pypdf~=5.2",
   "wikipedia~=1.0",
   "textdistance~=4.0",
-  "datasets>2,<4",
+  "datasets>3,<4",
   "sympy~=1.0",
   "scikit-learn>=1.6.1,<1.8.0",
-  "faiss-cpu>=1.10,<1.12"
+  "faiss-cpu>=1.10,<1.12",
+  "funcy>=2",
+  "evalplus>=0.3.1",
 ]
 docs = [
   "mkdocs~=1.0",
diff --git a/src/pdl/optimize/pdl_optimizer.py b/src/pdl/optimize/pdl_optimizer.py
index aa6316d53..0dea78ef8 100644
--- a/src/pdl/optimize/pdl_optimizer.py
+++ b/src/pdl/optimize/pdl_optimizer.py
@@ -11,7 +11,8 @@
 from typing import Any
 
 import yaml
-from datasets import Dataset, DatasetDict
+from datasets.arrow_dataset import Dataset
+from datasets.dataset_dict import DatasetDict
 from duration_parser import parse as parse_duration
 from numpy.random import default_rng
 from rich.logging import RichHandler
@@ -159,10 +160,13 @@ def sample_candidates(
         demo_name = self.config.demonstrations_variable_name
         candidates = []
 
+        num_demonstrations_set = {
+            int(x) for x in self.config.variables.get("num_demonstrations", set())
+        }
+
         if (
-            "prompt_pattern" in self.config.variables
-            and "cot" in self.config.variables.get("prompt_pattern", [])
-            and 0 in self.config.variables.get("num_demonstrations", [])
+            "cot" in self.config.variables.get("prompt_pattern", [])
+            and 0 in num_demonstrations_set
         ):
             cot_candidate = {
                 k: self.sample_random_index(v) for k, v in self.config.variables.items()
@@ -178,18 +182,18 @@ def sample_candidates(
 
             candidates.append(cot_candidate)
 
-        zero_shots_seen = ["cot"]
+        zero_shots_seen = {"cot"}
         while len(candidates) < num_candidates:
             variable_instance = {
                 k: self.sample_random_index(v) for k, v in self.config.variables.items()
             }
             if (
                 variable_instance.get("num_demonstrations") == 0
-                and variable_instance.get("prompt_pattern") == "cot"
+                and variable_instance.get("prompt_pattern") is not None
             ):
                 if variable_instance["prompt_pattern"] in zero_shots_seen:
                     continue
-                zero_shots_seen.append(variable_instance["prompt_pattern"])
+                zero_shots_seen.add(variable_instance["prompt_pattern"])
 
             num_demonstrations = int(
                 variable_instance.get("num_demonstrations", self.num_demonstrations),
@@ -214,16 +218,26 @@ def sample_candidates(
             candidates.append(candidate)
 
         if (
-            "num_demonstrations"
-            in self.config.variables  # check if is variable in config
-            and len(self.config.variables["num_demonstrations"])
-            > 1  # check more than 1 option
-            and 0 in [int(x) for x in self.config.variables["num_demonstrations"]]
-            # check zeroshot is an option
+            len(num_demonstrations_set) > 1  # check more than 1 option
+            and 0 in num_demonstrations_set  # check zeroshot is an option
         ):
-            zero_shotters = [x for x in candidates if x["num_demonstrations"] == 0]
+            zero_shotters = [
+                x.get("uuid") for x in candidates if x.get("num_demonstrations") == 0
+            ]
+            variables_zs = self.config.variables.copy()
+            variables_zs.pop("num_demonstrations", None)
+
+            max_zs = len(list(itertools.product(*variables_zs.values())))
+
+            if len(zero_shotters) > max_zs:
+                logger.warning(
+                    "More zero-shot candidates (%d) than expected (%d; "
+                    "product of all variables). "
+                    "Identical duplicated candidates may waste compute.",
+                    len(zero_shotters),
+                    max_zs,
+                )
 
-            assert len(zero_shotters) <= 3
         assert len(candidates) == num_candidates
         return candidates
 
diff --git a/src/pdl/optimize/util.py b/src/pdl/optimize/util.py
index 9925f8e0e..aceb0d3ff 100644
--- a/src/pdl/optimize/util.py
+++ b/src/pdl/optimize/util.py
@@ -4,7 +4,7 @@
 from typing import Any
 
 import yaml
-from datasets import Dataset
+from datasets.arrow_dataset import Dataset
 from rich.console import Console
 
 from pdl.pdl_ast import Program, ScopeType
diff --git a/tests/test_optimizer.py b/tests/test_optimizer.py
index 76c5ed7ad..1df9b0834 100644
--- a/tests/test_optimizer.py
+++ b/tests/test_optimizer.py
@@ -2,7 +2,8 @@
 from pprint import pprint
 
 import pytest
-from datasets import Dataset, DatasetDict
+from datasets.arrow_dataset import Dataset
+from datasets.dataset_dict import DatasetDict
 
 from examples.optimizer.fever_evaluator import FEVEREvaluator
 from examples.optimizer.gsm8k_evaluator import Gsm8kEvaluator

From 28865a3e817af9adeaa0738f0d83923c875dfa27 Mon Sep 17 00:00:00 2001
From: Nick Mitchell 
Date: Tue, 8 Jul 2025 08:35:02 -0400
Subject: [PATCH 005/107] feat: feature flag in rust interpreter

Signed-off-by: Nick Mitchell 
---
 pdl-live-react/src-tauri/Cargo.toml          | 9 ++++++---
 pdl-live-react/src-tauri/src/cli.rs          | 2 ++
 pdl-live-react/src-tauri/src/commands/mod.rs | 2 ++
 pdl-live-react/src-tauri/src/lib.rs          | 1 +
 pdl-live-react/src-tauri/src/pdl/mod.rs      | 2 ++
 5 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.toml b/pdl-live-react/src-tauri/Cargo.toml
index c477183ea..eec0bcde5 100644
--- a/pdl-live-react/src-tauri/Cargo.toml
+++ b/pdl-live-react/src-tauri/Cargo.toml
@@ -14,6 +14,9 @@ edition = "2024"
 name = "tauri_app_lib"
 crate-type = ["staticlib", "cdylib", "rlib"]
 
+[features]
+interpreter = ["dep:rustpython-vm", "dep:rustpython-stdlib", "dep:rustpython-pylib"]
+
 [build-dependencies]
 tauri-build = { version = "2", features = [] }
 
@@ -37,13 +40,13 @@ serde_norway = "0.9.42"
 minijinja = { version = "2.9.0", features = ["custom_syntax"] }
 ollama-rs = { version = "0.3.1", features = ["stream"] }
 owo-colors = "4.2.0"
-rustpython-vm = { git="https://github.com/RustPython/RustPython.git", features= ["importlib", "threading", "encodings"] } # "0.4.0"
+rustpython-vm = { git="https://github.com/RustPython/RustPython.git", features= ["importlib", "threading", "encodings"], optional = true } # "0.4.0"
 async-recursion = "1.1.1"
 tokio-stream = "0.1.17"
 tokio = { version = "1.44.1", features = ["io-std"] }
 indexmap = { version = "2.9.0", features = ["serde"] }
-rustpython-stdlib = { git="https://github.com/RustPython/RustPython.git", features = ["ssl-vendor"] } # 0.4.0
-rustpython-pylib = { git="https://github.com/RustPython/RustPython.git", features = ["freeze-stdlib"] } # 0.4.0
+rustpython-stdlib = { git="https://github.com/RustPython/RustPython.git", features = ["ssl-vendor"], optional = true } # 0.4.0
+rustpython-pylib = { git="https://github.com/RustPython/RustPython.git", features = ["freeze-stdlib"], optional = true } # 0.4.0
 schemars = "0.8.22"
 fs4 = "0.13.1"
 derive_builder = "0.20.2"
diff --git a/pdl-live-react/src-tauri/src/cli.rs b/pdl-live-react/src-tauri/src/cli.rs
index a85a6b6fd..9aba03a0e 100644
--- a/pdl-live-react/src-tauri/src/cli.rs
+++ b/pdl-live-react/src-tauri/src/cli.rs
@@ -5,6 +5,7 @@ use urlencoding::encode;
 
 use crate::compile;
 use crate::gui::new_window;
+#[cfg(feature = "interpreter")]
 use crate::pdl::interpreter::{RunOptions, load_scope, run_file_sync};
 
 #[cfg(desktop)]
@@ -49,6 +50,7 @@ pub fn setup(app: &mut tauri::App) -> Result>
                 _ => Err(Box::from("Unsupported compile command")),
             }
         }
+        #[cfg(feature = "interpreter")]
         "run" => run_file_sync(
             subcommand_args
                 .get("source")
diff --git a/pdl-live-react/src-tauri/src/commands/mod.rs b/pdl-live-react/src-tauri/src/commands/mod.rs
index 5c98f7441..f78e96cdd 100644
--- a/pdl-live-react/src-tauri/src/commands/mod.rs
+++ b/pdl-live-react/src-tauri/src/commands/mod.rs
@@ -1,3 +1,5 @@
+#[cfg(feature = "interpreter")]
 pub mod interpreter;
+
 pub mod read_trace;
 pub mod replay_prep;
diff --git a/pdl-live-react/src-tauri/src/lib.rs b/pdl-live-react/src-tauri/src/lib.rs
index 86b0b444c..1589720de 100644
--- a/pdl-live-react/src-tauri/src/lib.rs
+++ b/pdl-live-react/src-tauri/src/lib.rs
@@ -33,6 +33,7 @@ pub fn run() {
         .invoke_handler(tauri::generate_handler![
             commands::read_trace::read_trace,
             commands::replay_prep::replay_prep,
+            #[cfg(feature = "interpreter")]
             commands::interpreter::run_pdl_program,
         ])
         .run(tauri::generate_context!())
diff --git a/pdl-live-react/src-tauri/src/pdl/mod.rs b/pdl-live-react/src-tauri/src/pdl/mod.rs
index 179cb9e10..b8580f387 100644
--- a/pdl-live-react/src-tauri/src/pdl/mod.rs
+++ b/pdl-live-react/src-tauri/src/pdl/mod.rs
@@ -1,6 +1,8 @@
 pub mod ast;
 pub mod extract;
+#[cfg(feature = "interpreter")]
 pub mod interpreter;
+#[cfg(feature = "interpreter")]
 mod interpreter_tests;
 pub mod pip;
 pub mod pull;

From 0519855361fda766a7ca53a5567d2cab1726463a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 13:11:42 +0000
Subject: [PATCH 006/107] chore(deps): update dependency @types/react to
 v18.3.23

---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 8779f9ac8..aa30d6110 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1941,9 +1941,9 @@
       "license": "MIT"
     },
     "node_modules/@types/react": {
-      "version": "18.3.20",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz",
-      "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==",
+      "version": "18.3.23",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz",
+      "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==",
       "license": "MIT",
       "dependencies": {
         "@types/prop-types": "*",

From d0d873d1ef65573542ebb73435f8e68498dfe035 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 13:11:51 +0000
Subject: [PATCH 007/107] chore(deps): update dependency vite to v6.3.5

---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index aa30d6110..994e3cc05 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -7098,9 +7098,9 @@
       }
     },
     "node_modules/vite": {
-      "version": "6.3.4",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz",
-      "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==",
+      "version": "6.3.5",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
+      "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {

From cf15047744363c91c80c37cb30af5deceada51fe Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 13:13:03 +0000
Subject: [PATCH 008/107] fix(deps): update rust crate ollama-rs to v0.3.2

---
 pdl-live-react/src-tauri/Cargo.lock | 200 +++++++++++++---------------
 1 file changed, 95 insertions(+), 105 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index c6c6192f2..198027aa2 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -2142,17 +2142,21 @@ dependencies = [
 
 [[package]]
 name = "hyper-util"
-version = "0.1.11"
+version = "0.1.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2"
+checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df"
 dependencies = [
+ "base64 0.22.1",
  "bytes",
  "futures-channel",
+ "futures-core",
  "futures-util",
  "http",
  "http-body",
  "hyper",
+ "ipnet",
  "libc",
+ "percent-encoding",
  "pin-project-lite",
  "socket2",
  "tokio",
@@ -2385,6 +2389,16 @@ version = "2.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
 
+[[package]]
+name = "iri-string"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
 [[package]]
 name = "is-docker"
 version = "0.2.0"
@@ -2671,7 +2685,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
 dependencies = [
  "cfg-if",
- "windows-targets 0.52.6",
+ "windows-targets 0.48.5",
 ]
 
 [[package]]
@@ -3340,14 +3354,14 @@ dependencies = [
 
 [[package]]
 name = "ollama-rs"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0bd0e2c30868e72ffca8143873c6c1e288b2efda9d3950e9ae0d0b4039c49c3"
+checksum = "659dd1460a1079db751a236b301e78e63486758fee7e2db1ddcd2372c264be36"
 dependencies = [
  "async-stream",
  "log",
  "reqwest",
- "schemars",
+ "schemars 1.0.4",
  "serde",
  "serde_json",
  "static_assertions",
@@ -3565,7 +3579,7 @@ dependencies = [
  "rustpython-pylib",
  "rustpython-stdlib",
  "rustpython-vm",
- "schemars",
+ "schemars 0.8.22",
  "serde",
  "serde_json",
  "serde_norway",
@@ -4187,6 +4201,26 @@ dependencies = [
  "thiserror 2.0.12",
 ]
 
+[[package]]
+name = "ref-cast"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf"
+dependencies = [
+ "ref-cast-impl",
+]
+
+[[package]]
+name = "ref-cast-impl"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.101",
+]
+
 [[package]]
 name = "regex"
 version = "1.11.1"
@@ -4218,9 +4252,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
 
 [[package]]
 name = "reqwest"
-version = "0.12.15"
+version = "0.12.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb"
+checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531"
 dependencies = [
  "base64 0.22.1",
  "bytes",
@@ -4233,19 +4267,15 @@ dependencies = [
  "hyper-rustls",
  "hyper-tls",
  "hyper-util",
- "ipnet",
  "js-sys",
  "log",
- "mime",
  "mime_guess",
  "native-tls",
- "once_cell",
  "percent-encoding",
  "pin-project-lite",
  "quinn",
  "rustls",
  "rustls-native-certs",
- "rustls-pemfile",
  "rustls-pki-types",
  "serde",
  "serde_json",
@@ -4256,13 +4286,13 @@ dependencies = [
  "tokio-rustls",
  "tokio-util",
  "tower",
+ "tower-http",
  "tower-service",
  "url",
  "wasm-bindgen",
  "wasm-bindgen-futures",
  "wasm-streams",
  "web-sys",
- "windows-registry",
 ]
 
 [[package]]
@@ -4450,15 +4480,6 @@ dependencies = [
  "security-framework 3.2.0",
 ]
 
-[[package]]
-name = "rustls-pemfile"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
-dependencies = [
- "rustls-pki-types",
-]
-
 [[package]]
 name = "rustls-pki-types"
 version = "1.11.0"
@@ -4860,13 +4881,26 @@ checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615"
 dependencies = [
  "dyn-clone",
  "indexmap 1.9.3",
- "schemars_derive",
+ "schemars_derive 0.8.22",
  "serde",
  "serde_json",
  "url",
  "uuid",
 ]
 
+[[package]]
+name = "schemars"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0"
+dependencies = [
+ "dyn-clone",
+ "ref-cast",
+ "schemars_derive 1.0.4",
+ "serde",
+ "serde_json",
+]
+
 [[package]]
 name = "schemars_derive"
 version = "0.8.22"
@@ -4879,6 +4913,18 @@ dependencies = [
  "syn 2.0.101",
 ]
 
+[[package]]
+name = "schemars_derive"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33d020396d1d138dc19f1165df7545479dcd58d93810dc5d646a16e55abefa80"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde_derive_internals",
+ "syn 2.0.101",
+]
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -5008,6 +5054,7 @@ version = "1.0.140"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
 dependencies = [
+ "indexmap 2.9.0",
  "itoa 1.0.15",
  "memchr",
  "ryu",
@@ -5581,7 +5628,7 @@ dependencies = [
  "glob",
  "heck 0.5.0",
  "json-patch",
- "schemars",
+ "schemars 0.8.22",
  "semver",
  "serde",
  "serde_json",
@@ -5641,7 +5688,7 @@ dependencies = [
  "anyhow",
  "glob",
  "plist",
- "schemars",
+ "schemars 0.8.22",
  "serde",
  "serde_json",
  "tauri-utils",
@@ -5675,7 +5722,7 @@ dependencies = [
  "objc2-app-kit",
  "objc2-foundation 0.3.1",
  "open",
- "schemars",
+ "schemars 0.8.22",
  "serde",
  "serde_json",
  "tauri",
@@ -5786,7 +5833,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "regex",
- "schemars",
+ "schemars 0.8.22",
  "semver",
  "serde",
  "serde-untagged",
@@ -6120,6 +6167,24 @@ dependencies = [
  "tower-service",
 ]
 
+[[package]]
+name = "tower-http"
+version = "0.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
+dependencies = [
+ "bitflags 2.9.0",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "iri-string",
+ "pin-project-lite",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
 [[package]]
 name = "tower-layer"
 version = "0.3.3"
@@ -6790,7 +6855,7 @@ version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
- "windows-sys 0.59.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -6982,17 +7047,6 @@ dependencies = [
  "windows-link",
 ]
 
-[[package]]
-name = "windows-registry"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3"
-dependencies = [
- "windows-result",
- "windows-strings 0.3.1",
- "windows-targets 0.53.0",
-]
-
 [[package]]
 name = "windows-result"
 version = "0.3.2"
@@ -7095,29 +7149,13 @@ dependencies = [
  "windows_aarch64_gnullvm 0.52.6",
  "windows_aarch64_msvc 0.52.6",
  "windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm 0.52.6",
+ "windows_i686_gnullvm",
  "windows_i686_msvc 0.52.6",
  "windows_x86_64_gnu 0.52.6",
  "windows_x86_64_gnullvm 0.52.6",
  "windows_x86_64_msvc 0.52.6",
 ]
 
-[[package]]
-name = "windows-targets"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b"
-dependencies = [
- "windows_aarch64_gnullvm 0.53.0",
- "windows_aarch64_msvc 0.53.0",
- "windows_i686_gnu 0.53.0",
- "windows_i686_gnullvm 0.53.0",
- "windows_i686_msvc 0.53.0",
- "windows_x86_64_gnu 0.53.0",
- "windows_x86_64_gnullvm 0.53.0",
- "windows_x86_64_msvc 0.53.0",
-]
-
 [[package]]
 name = "windows-version"
 version = "0.1.4"
@@ -7145,12 +7183,6 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
 
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
-
 [[package]]
 name = "windows_aarch64_msvc"
 version = "0.42.2"
@@ -7169,12 +7201,6 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
 
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
-
 [[package]]
 name = "windows_i686_gnu"
 version = "0.42.2"
@@ -7193,24 +7219,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
 
-[[package]]
-name = "windows_i686_gnu"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
-
 [[package]]
 name = "windows_i686_gnullvm"
 version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
 
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
-
 [[package]]
 name = "windows_i686_msvc"
 version = "0.42.2"
@@ -7229,12 +7243,6 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
 
-[[package]]
-name = "windows_i686_msvc"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
-
 [[package]]
 name = "windows_x86_64_gnu"
 version = "0.42.2"
@@ -7253,12 +7261,6 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
 
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
-
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.42.2"
@@ -7277,12 +7279,6 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
 
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
-
 [[package]]
 name = "windows_x86_64_msvc"
 version = "0.42.2"
@@ -7301,12 +7297,6 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
-
 [[package]]
 name = "winnow"
 version = "0.5.40"

From b20b94a2824c0fd9f5ab2cbb6941cbe578f2e066 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 13:13:12 +0000
Subject: [PATCH 009/107] fix(deps): update rust crate owo-colors to v4.2.2

---
 pdl-live-react/src-tauri/Cargo.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 198027aa2..a4a17585f 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -3477,9 +3477,9 @@ dependencies = [
 
 [[package]]
 name = "owo-colors"
-version = "4.2.0"
+version = "4.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564"
+checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e"
 
 [[package]]
 name = "page_size"

From 843c41c4ed470a58ac4d89465b8ecb8007ca6365 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 13:13:20 +0000
Subject: [PATCH 010/107] fix(deps): update rust crate yaml-rust2 to v0.10.3

---
 pdl-live-react/src-tauri/Cargo.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index a4a17585f..2e2cba94c 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -7454,9 +7454,9 @@ checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda"
 
 [[package]]
 name = "yaml-rust2"
-version = "0.10.1"
+version = "0.10.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "818913695e83ece1f8d2a1c52d54484b7b46d0f9c06beeb2649b9da50d9b512d"
+checksum = "4ce2a4ff45552406d02501cea6c18d8a7e50228e7736a872951fe2fe75c91be7"
 dependencies = [
  "arraydeque",
  "encoding_rs",

From a8b9b475b8d34d8c39f6d7a0b08ea6d83084b81a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 13:10:17 +0000
Subject: [PATCH 011/107] chore(deps): update dependency @playwright/test to
 v1.53.2

---
 pdl-live-react/package-lock.json | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 994e3cc05..a9d55ea90 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1232,13 +1232,13 @@
       "license": "MIT"
     },
     "node_modules/@playwright/test": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz",
-      "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==",
+      "version": "1.53.2",
+      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.2.tgz",
+      "integrity": "sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "playwright": "1.52.0"
+        "playwright": "1.53.2"
       },
       "bin": {
         "playwright": "cli.js"
@@ -5658,13 +5658,13 @@
       }
     },
     "node_modules/playwright": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz",
-      "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==",
+      "version": "1.53.2",
+      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz",
+      "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "playwright-core": "1.52.0"
+        "playwright-core": "1.53.2"
       },
       "bin": {
         "playwright": "cli.js"
@@ -5677,9 +5677,9 @@
       }
     },
     "node_modules/playwright-core": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz",
-      "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==",
+      "version": "1.53.2",
+      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.2.tgz",
+      "integrity": "sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==",
       "dev": true,
       "license": "Apache-2.0",
       "bin": {

From 1f3d693b89881f6cadf36db0e4e4e3044bf59015 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 17:58:22 +0000
Subject: [PATCH 012/107] chore(deps): update dependency @types/node to
 v22.16.1

---
 pdl-live-react/package-lock.json | 16 ++++++++--------
 pdl-live-react/package.json      |  2 +-
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index a9d55ea90..748d1d2fe 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -36,7 +36,7 @@
         "@eslint/js": "^9.19.0",
         "@playwright/test": "^1.50.0",
         "@tauri-apps/cli": "^2.3.0",
-        "@types/node": "22.12.0",
+        "@types/node": "22.16.1",
         "@types/react": "^18.3.18",
         "@types/react-dom": "^18.3.5",
         "@types/react-syntax-highlighter": "^15.5.13",
@@ -1925,13 +1925,13 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.12.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz",
-      "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==",
+      "version": "22.16.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.1.tgz",
+      "integrity": "sha512-oaNE4MzsA6uO7HcsjUvqzz19lYIRsV6I1Dc6iOvgwYYDiOeF7/9b2E/PE0UW2ccwpgWPVUedjltYXQXVKFd4EA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "undici-types": "~6.20.0"
+        "undici-types": "~6.21.0"
       }
     },
     "node_modules/@types/prop-types": {
@@ -6905,9 +6905,9 @@
       }
     },
     "node_modules/undici-types": {
-      "version": "6.20.0",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
-      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
       "dev": true,
       "license": "MIT"
     },
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index cf5adcb8a..5b8c3eb25 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -51,7 +51,7 @@
     "@eslint/js": "^9.19.0",
     "@playwright/test": "^1.50.0",
     "@tauri-apps/cli": "^2.3.0",
-    "@types/node": "22.12.0",
+    "@types/node": "22.16.1",
     "@types/react": "^18.3.18",
     "@types/react-dom": "^18.3.5",
     "@types/react-syntax-highlighter": "^15.5.13",

From f4fd1ea190b40da4de49a280581833598a245627 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 13:10:35 +0000
Subject: [PATCH 013/107] chore(deps): update dependency @vitejs/plugin-react
 to v4.6.0

---
 pdl-live-react/package-lock.json | 200 +++++++++++++++----------------
 1 file changed, 97 insertions(+), 103 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 748d1d2fe..f19435de7 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -102,9 +102,9 @@
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz",
-      "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==",
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
+      "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -112,22 +112,22 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz",
-      "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==",
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
+      "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.27.1",
-        "@babel/generator": "^7.27.1",
-        "@babel/helper-compilation-targets": "^7.27.1",
-        "@babel/helper-module-transforms": "^7.27.1",
-        "@babel/helpers": "^7.27.1",
-        "@babel/parser": "^7.27.1",
-        "@babel/template": "^7.27.1",
-        "@babel/traverse": "^7.27.1",
-        "@babel/types": "^7.27.1",
+        "@babel/generator": "^7.28.0",
+        "@babel/helper-compilation-targets": "^7.27.2",
+        "@babel/helper-module-transforms": "^7.27.3",
+        "@babel/helpers": "^7.27.6",
+        "@babel/parser": "^7.28.0",
+        "@babel/template": "^7.27.2",
+        "@babel/traverse": "^7.28.0",
+        "@babel/types": "^7.28.0",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -143,16 +143,16 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz",
-      "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==",
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz",
+      "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.27.1",
-        "@babel/types": "^7.27.1",
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.25",
+        "@babel/parser": "^7.28.0",
+        "@babel/types": "^7.28.0",
+        "@jridgewell/gen-mapping": "^0.3.12",
+        "@jridgewell/trace-mapping": "^0.3.28",
         "jsesc": "^3.0.2"
       },
       "engines": {
@@ -160,13 +160,13 @@
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz",
-      "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==",
+      "version": "7.27.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+      "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/compat-data": "^7.27.1",
+        "@babel/compat-data": "^7.27.2",
         "@babel/helper-validator-option": "^7.27.1",
         "browserslist": "^4.24.0",
         "lru-cache": "^5.1.1",
@@ -176,6 +176,16 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@babel/helper-globals": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+      "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
     "node_modules/@babel/helper-module-imports": {
       "version": "7.27.1",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
@@ -191,15 +201,15 @@
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz",
-      "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==",
+      "version": "7.27.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
+      "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/helper-module-imports": "^7.27.1",
         "@babel/helper-validator-identifier": "^7.27.1",
-        "@babel/traverse": "^7.27.1"
+        "@babel/traverse": "^7.27.3"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -249,27 +259,27 @@
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
-      "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
+      "version": "7.27.6",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
+      "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/template": "^7.27.1",
-        "@babel/types": "^7.27.1"
+        "@babel/template": "^7.27.2",
+        "@babel/types": "^7.27.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz",
-      "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==",
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz",
+      "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.27.1"
+        "@babel/types": "^7.28.0"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -320,14 +330,14 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz",
-      "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==",
+      "version": "7.27.2",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+      "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.27.1",
-        "@babel/parser": "^7.27.1",
+        "@babel/parser": "^7.27.2",
         "@babel/types": "^7.27.1"
       },
       "engines": {
@@ -335,38 +345,28 @@
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz",
-      "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==",
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz",
+      "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.27.1",
-        "@babel/generator": "^7.27.1",
-        "@babel/parser": "^7.27.1",
-        "@babel/template": "^7.27.1",
-        "@babel/types": "^7.27.1",
-        "debug": "^4.3.1",
-        "globals": "^11.1.0"
+        "@babel/generator": "^7.28.0",
+        "@babel/helper-globals": "^7.28.0",
+        "@babel/parser": "^7.28.0",
+        "@babel/template": "^7.27.2",
+        "@babel/types": "^7.28.0",
+        "debug": "^4.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/traverse/node_modules/globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/@babel/types": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
-      "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz",
+      "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1020,18 +1020,14 @@
       }
     },
     "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
-      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+      "version": "0.3.12",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
+      "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@jridgewell/set-array": "^1.2.1",
-        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/sourcemap-codec": "^1.5.0",
         "@jridgewell/trace-mapping": "^0.3.24"
-      },
-      "engines": {
-        "node": ">=6.0.0"
       }
     },
     "node_modules/@jridgewell/resolve-uri": {
@@ -1044,16 +1040,6 @@
         "node": ">=6.0.0"
       }
     },
-    "node_modules/@jridgewell/set-array": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
-      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
     "node_modules/@jridgewell/source-map": {
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
@@ -1073,9 +1059,9 @@
       "license": "MIT"
     },
     "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.25",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
-      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "version": "0.3.29",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
+      "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1247,6 +1233,13 @@
         "node": ">=18"
       }
     },
+    "node_modules/@rolldown/pluginutils": {
+      "version": "1.0.0-beta.19",
+      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz",
+      "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/@rollup/pluginutils": {
       "version": "4.2.1",
       "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
@@ -2202,15 +2195,16 @@
       "license": "ISC"
     },
     "node_modules/@vitejs/plugin-react": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz",
-      "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==",
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz",
+      "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/core": "^7.26.10",
-        "@babel/plugin-transform-react-jsx-self": "^7.25.9",
-        "@babel/plugin-transform-react-jsx-source": "^7.25.9",
+        "@babel/core": "^7.27.4",
+        "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+        "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+        "@rolldown/pluginutils": "1.0.0-beta.19",
         "@types/babel__core": "^7.20.5",
         "react-refresh": "^0.17.0"
       },
@@ -2218,7 +2212,7 @@
         "node": "^14.18.0 || >=16.0.0"
       },
       "peerDependencies": {
-        "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
+        "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0"
       }
     },
     "node_modules/@wooorm/starry-night": {
@@ -2437,9 +2431,9 @@
       }
     },
     "node_modules/browserslist": {
-      "version": "4.24.5",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz",
-      "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==",
+      "version": "4.25.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
+      "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
       "dev": true,
       "funding": [
         {
@@ -2457,8 +2451,8 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "caniuse-lite": "^1.0.30001716",
-        "electron-to-chromium": "^1.5.149",
+        "caniuse-lite": "^1.0.30001726",
+        "electron-to-chromium": "^1.5.173",
         "node-releases": "^2.0.19",
         "update-browserslist-db": "^1.1.3"
       },
@@ -2539,9 +2533,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001716",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz",
-      "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==",
+      "version": "1.0.30001727",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz",
+      "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==",
       "dev": true,
       "funding": [
         {
@@ -3080,9 +3074,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.149",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz",
-      "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==",
+      "version": "1.5.180",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.180.tgz",
+      "integrity": "sha512-ED+GEyEh3kYMwt2faNmgMB0b8O5qtATGgR4RmRsIp4T6p7B8vdMbIedYndnvZfsaXvSzegtpfqRMDNCjjiSduA==",
       "dev": true,
       "license": "ISC"
     },

From 959712cace33224b46f0bb92520e7d89e4580778 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 14:57:58 -0400
Subject: [PATCH 014/107] chore(deps): update dependency globals to v16.3.0
 (#1012)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index f19435de7..ce7a54cdd 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -3872,9 +3872,9 @@
       }
     },
     "node_modules/globals": {
-      "version": "16.0.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz",
-      "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==",
+      "version": "16.3.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz",
+      "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==",
       "dev": true,
       "license": "MIT",
       "engines": {

From 2e0c5a1dcdc9a53da3151f3b5e0abaed8731da41 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 14:58:46 -0400
Subject: [PATCH 015/107] chore(deps): update dependency concurrently to v9.2.0
 (#1011)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index ce7a54cdd..ffa63ddc6 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -2716,9 +2716,9 @@
       "license": "MIT"
     },
     "node_modules/concurrently": {
-      "version": "9.1.2",
-      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz",
-      "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==",
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz",
+      "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {

From f7744de8351cbb81fe1c805c0f7884029a9ddc98 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 15:32:38 -0400
Subject: [PATCH 016/107] chore(deps): update dependency python (#1014)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/mkdocs-gh-pages.yml | 2 +-
 dockerfile                            | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/mkdocs-gh-pages.yml b/.github/workflows/mkdocs-gh-pages.yml
index b4b90d4b0..fb0538563 100644
--- a/.github/workflows/mkdocs-gh-pages.yml
+++ b/.github/workflows/mkdocs-gh-pages.yml
@@ -44,7 +44,7 @@ jobs:
       - name: Setup Python
         uses: actions/setup-python@v5
         with:
-          python-version: '3.12'
+          python-version: '3.13'
       - name: Install required packages
         run: pip install -U mkdocs "mkdocstrings[python]" mkdocs-material pymdown-extensions
       - name: Build site (_site directory name is used for Jekyll compatiblity)
diff --git a/dockerfile b/dockerfile
index 6e8b6d296..6869ff7ba 100644
--- a/dockerfile
+++ b/dockerfile
@@ -1,4 +1,4 @@
-FROM python:3.11-slim
+FROM python:3.13-slim
 
 WORKDIR /pdl
 

From c2364e891b6f00613f8f0b7686e23c6670640667 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 15:33:15 -0400
Subject: [PATCH 017/107] chore(deps): update dependency prettier to v3.6.2
 (#1013)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index ffa63ddc6..6d6bdae84 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -5723,9 +5723,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
-      "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
+      "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
       "dev": true,
       "license": "MIT",
       "bin": {

From 46c8446666edb4ed1f1de84ec51497a04863a109 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 22:15:36 -0400
Subject: [PATCH 018/107] fix(deps): update dependency @tauri-apps/plugin-fs to
 v2.4.0 (#1018)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 6d6bdae84..0c66295df 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1548,9 +1548,9 @@
       ]
     },
     "node_modules/@tauri-apps/api": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.5.0.tgz",
-      "integrity": "sha512-Ldux4ip+HGAcPUmuLT8EIkk6yafl5vK0P0c0byzAKzxJh7vxelVtdPONjfgTm96PbN24yjZNESY8CKo8qniluA==",
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.6.0.tgz",
+      "integrity": "sha512-hRNcdercfgpzgFrMXWwNDBN0B7vNzOzRepy6ZAmhxi5mDLVPNrTpo9MGg2tN/F7JRugj4d2aF7E1rtPXAHaetg==",
       "license": "Apache-2.0 OR MIT",
       "funding": {
         "type": "opencollective",
@@ -1784,12 +1784,12 @@
       }
     },
     "node_modules/@tauri-apps/plugin-fs": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.2.1.tgz",
-      "integrity": "sha512-KdGzvvA4Eg0Dhw55MwczFbjxLxsTx0FvwwC/0StXlr6IxwPUxh5ziZQoaugkBFs8t+wfebdQrjBEzd8NmmDXNw==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.4.0.tgz",
+      "integrity": "sha512-Sp8AdDcbyXyk6LD6Pmdx44SH3LPeNAvxR2TFfq/8CwqzfO1yOyV+RzT8fov0NNN7d9nvW7O7MtMAptJ42YXA5g==",
       "license": "MIT OR Apache-2.0",
       "dependencies": {
-        "@tauri-apps/api": "^2.0.0"
+        "@tauri-apps/api": "^2.6.0"
       }
     },
     "node_modules/@tauri-apps/plugin-opener": {

From ebb72a40a961439bf548d06dc5b2fc1d6a1146b6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 22:16:02 -0400
Subject: [PATCH 019/107] fix(deps): update dependency @tauri-apps/plugin-cli
 to v2.4.0 (#1017)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 0c66295df..35ce9fec2 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1775,12 +1775,12 @@
       }
     },
     "node_modules/@tauri-apps/plugin-cli": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-cli/-/plugin-cli-2.2.0.tgz",
-      "integrity": "sha512-rvNhMog9rHr01Xk+trBFKJ0eZICIvPkm9GX6ogB89/0hROU/lf+a/sb4vC0wtSeR7zrJuCSxwxYuvHCZheaYFA==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-cli/-/plugin-cli-2.4.0.tgz",
+      "integrity": "sha512-3AUUaaqj3PkacFlErFUvzaApV6uZG5W8psM5AKWoPNkThwJJZskc9wqfot7PTY13fVublGszFWBNAL4I4iIZRg==",
       "license": "MIT OR Apache-2.0",
       "dependencies": {
-        "@tauri-apps/api": "^2.0.0"
+        "@tauri-apps/api": "^2.6.0"
       }
     },
     "node_modules/@tauri-apps/plugin-fs": {

From 7d7f1fc269e0fdcd058569740f205404838f51eb Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 22:16:28 -0400
Subject: [PATCH 020/107] chore(deps): update eslint monorepo to v9.30.1
 (#1016)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 1048 ++----------------------------
 1 file changed, 58 insertions(+), 990 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 35ce9fec2..c07a69bbd 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -845,9 +845,9 @@
       }
     },
     "node_modules/@eslint/config-array": {
-      "version": "0.20.0",
-      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
-      "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+      "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -860,9 +860,9 @@
       }
     },
     "node_modules/@eslint/config-helpers": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
-      "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz",
+      "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -870,9 +870,9 @@
       }
     },
     "node_modules/@eslint/core": {
-      "version": "0.13.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
-      "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
+      "version": "0.15.1",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
+      "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -920,13 +920,16 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.26.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz",
-      "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==",
+      "version": "9.30.1",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz",
+      "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==",
       "dev": true,
       "license": "MIT",
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
       }
     },
     "node_modules/@eslint/object-schema": {
@@ -940,13 +943,13 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.2.8",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
-      "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz",
+      "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/core": "^0.13.0",
+        "@eslint/core": "^0.15.1",
         "levn": "^0.4.1"
       },
       "engines": {
@@ -1076,28 +1079,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/@modelcontextprotocol/sdk": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.0.tgz",
-      "integrity": "sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "content-type": "^1.0.5",
-        "cors": "^2.8.5",
-        "cross-spawn": "^7.0.3",
-        "eventsource": "^3.0.2",
-        "express": "^5.0.1",
-        "express-rate-limit": "^7.5.0",
-        "pkce-challenge": "^5.0.0",
-        "raw-body": "^3.0.0",
-        "zod": "^3.23.8",
-        "zod-to-json-schema": "^3.24.1"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
     "node_modules/@monaco-editor/loader": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.5.0.tgz",
@@ -2258,24 +2239,10 @@
       "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==",
       "license": "MIT"
     },
-    "node_modules/accepts": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
-      "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mime-types": "^3.0.0",
-        "negotiator": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/acorn": {
-      "version": "8.14.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
-      "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -2378,27 +2345,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/body-parser": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
-      "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bytes": "^3.1.2",
-        "content-type": "^1.0.5",
-        "debug": "^4.4.0",
-        "http-errors": "^2.0.0",
-        "iconv-lite": "^0.6.3",
-        "on-finished": "^2.4.1",
-        "qs": "^6.14.0",
-        "raw-body": "^3.0.0",
-        "type-is": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
     "node_modules/boolbase": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@@ -2470,47 +2416,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/bytes": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
-      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/call-bind-apply-helpers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
-      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/call-bound": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
-      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.2",
-        "get-intrinsic": "^1.3.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -2758,29 +2663,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/content-disposition": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
-      "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "5.2.1"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/content-type": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
-      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/convert-source-map": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -2788,40 +2670,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/cookie": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
-      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/cookie-signature": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
-      "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.6.0"
-      }
-    },
-    "node_modules/cors": {
-      "version": "2.8.5",
-      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
-      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "object-assign": "^4",
-        "vary": "^1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
     "node_modules/cross-spawn": {
       "version": "7.0.6",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -2910,16 +2758,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/depd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
-      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/dequal": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -3035,28 +2873,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/dunder-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
-      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "gopd": "^1.2.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/ejs": {
       "version": "3.1.10",
       "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
@@ -3087,16 +2903,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/encodeurl": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
-      "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/entities": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
@@ -3107,39 +2913,6 @@
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
-    "node_modules/es-define-property": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
-      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-errors": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
-      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-object-atoms": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
-      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/esbuild": {
       "version": "0.25.3",
       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz",
@@ -3191,13 +2964,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/escape-string-regexp": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -3212,24 +2978,23 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.26.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz",
-      "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==",
+      "version": "9.30.1",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz",
+      "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.12.1",
-        "@eslint/config-array": "^0.20.0",
-        "@eslint/config-helpers": "^0.2.1",
-        "@eslint/core": "^0.13.0",
+        "@eslint/config-array": "^0.21.0",
+        "@eslint/config-helpers": "^0.3.0",
+        "@eslint/core": "^0.14.0",
         "@eslint/eslintrc": "^3.3.1",
-        "@eslint/js": "9.26.0",
-        "@eslint/plugin-kit": "^0.2.8",
+        "@eslint/js": "9.30.1",
+        "@eslint/plugin-kit": "^0.3.1",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@humanwhocodes/retry": "^0.4.2",
-        "@modelcontextprotocol/sdk": "^1.8.0",
         "@types/estree": "^1.0.6",
         "@types/json-schema": "^7.0.15",
         "ajv": "^6.12.4",
@@ -3237,9 +3002,9 @@
         "cross-spawn": "^7.0.6",
         "debug": "^4.3.2",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^8.3.0",
-        "eslint-visitor-keys": "^4.2.0",
-        "espree": "^10.3.0",
+        "eslint-scope": "^8.4.0",
+        "eslint-visitor-keys": "^4.2.1",
+        "espree": "^10.4.0",
         "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -3253,8 +3018,7 @@
         "lodash.merge": "^4.6.2",
         "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
-        "optionator": "^0.9.3",
-        "zod": "^3.24.2"
+        "optionator": "^0.9.3"
       },
       "bin": {
         "eslint": "bin/eslint.js"
@@ -3298,9 +3062,9 @@
       }
     },
     "node_modules/eslint-scope": {
-      "version": "8.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
-      "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
+      "version": "8.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+      "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -3315,9 +3079,9 @@
       }
     },
     "node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -3327,16 +3091,29 @@
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/eslint/node_modules/@eslint/core": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
+      "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/espree": {
-      "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
-      "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+      "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "acorn": "^8.14.0",
+        "acorn": "^8.15.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^4.2.0"
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3408,98 +3185,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/eventsource": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz",
-      "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eventsource-parser": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/eventsource-parser": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz",
-      "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/express": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
-      "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "accepts": "^2.0.0",
-        "body-parser": "^2.2.0",
-        "content-disposition": "^1.0.0",
-        "content-type": "^1.0.5",
-        "cookie": "^0.7.1",
-        "cookie-signature": "^1.2.1",
-        "debug": "^4.4.0",
-        "encodeurl": "^2.0.0",
-        "escape-html": "^1.0.3",
-        "etag": "^1.8.1",
-        "finalhandler": "^2.1.0",
-        "fresh": "^2.0.0",
-        "http-errors": "^2.0.0",
-        "merge-descriptors": "^2.0.0",
-        "mime-types": "^3.0.0",
-        "on-finished": "^2.4.1",
-        "once": "^1.4.0",
-        "parseurl": "^1.3.3",
-        "proxy-addr": "^2.0.7",
-        "qs": "^6.14.0",
-        "range-parser": "^1.2.1",
-        "router": "^2.2.0",
-        "send": "^1.1.0",
-        "serve-static": "^2.2.0",
-        "statuses": "^2.0.1",
-        "type-is": "^2.0.1",
-        "vary": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 18"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/express"
-      }
-    },
-    "node_modules/express-rate-limit": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz",
-      "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/express-rate-limit"
-      },
-      "peerDependencies": {
-        "express": "^4.11 || 5 || ^5.0.0-beta.1"
-      }
-    },
     "node_modules/extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -3666,24 +3351,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/finalhandler": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
-      "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^4.4.0",
-        "encodeurl": "^2.0.0",
-        "escape-html": "^1.0.3",
-        "on-finished": "^2.4.1",
-        "parseurl": "^1.3.3",
-        "statuses": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/find-up": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -3739,26 +3406,6 @@
         "node": ">=0.4.x"
       }
     },
-    "node_modules/forwarded": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
-      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/fresh": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
-      "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/fs-extra": {
       "version": "10.1.0",
       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -3789,16 +3436,6 @@
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
-    "node_modules/function-bind": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "dev": true,
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/gensync": {
       "version": "1.0.0-beta.2",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -3819,45 +3456,6 @@
         "node": "6.* || 8.* || >= 10.*"
       }
     },
-    "node_modules/get-intrinsic": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
-      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.2",
-        "es-define-property": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.1.1",
-        "function-bind": "^1.1.2",
-        "get-proto": "^1.0.1",
-        "gopd": "^1.2.0",
-        "has-symbols": "^1.1.0",
-        "hasown": "^2.0.2",
-        "math-intrinsics": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
-      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "dunder-proto": "^1.0.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/glob-parent": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -3884,19 +3482,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/gopd": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
-      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -3921,32 +3506,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/has-symbols": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
-      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/hasown": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
-      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/hast-util-parse-selector": {
       "version": "2.2.5",
       "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
@@ -4132,36 +3691,6 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/http-errors": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
-      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "depd": "2.0.0",
-        "inherits": "2.0.4",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "toidentifier": "1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/ignore": {
       "version": "5.3.2",
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -4209,29 +3738,12 @@
         "node": ">=0.8.19"
       }
     },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true,
-      "license": "ISC"
-    },
     "node_modules/inline-style-parser": {
       "version": "0.2.4",
       "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
       "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==",
       "license": "MIT"
     },
-    "node_modules/ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
     "node_modules/is-alphabetical": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
@@ -4331,13 +3843,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/is-promise": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
-      "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -4605,16 +4110,6 @@
         "lz-string": "bin/bin.js"
       }
     },
-    "node_modules/math-intrinsics": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
-      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/mdast-util-from-markdown": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
@@ -4768,29 +4263,6 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/media-typer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
-      "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/merge-descriptors": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
-      "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/merge2": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -5270,29 +4742,6 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
-    "node_modules/mime-db": {
-      "version": "1.54.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
-      "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
-      "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mime-db": "^1.54.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -5355,16 +4804,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/negotiator": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
-      "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/no-case": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@@ -5416,42 +4855,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/object-inspect": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
-      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/on-finished": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
-      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ee-first": "1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
     "node_modules/optionator": {
       "version": "0.9.4",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -5563,16 +4966,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/parseurl": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/pascal-case": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
@@ -5604,16 +4997,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/path-to-regexp": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
-      "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=16"
-      }
-    },
     "node_modules/pathe": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz",
@@ -5641,16 +5024,6 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
-    "node_modules/pkce-challenge": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz",
-      "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=16.20.0"
-      }
-    },
     "node_modules/playwright": {
       "version": "1.53.2",
       "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz",
@@ -5795,20 +5168,6 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/proxy-addr": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
-      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "forwarded": "0.2.0",
-        "ipaddr.js": "1.9.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
     "node_modules/punycode": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -5819,22 +5178,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/qs": {
-      "version": "6.14.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
-      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "side-channel": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/queue-microtask": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -5856,32 +5199,6 @@
       ],
       "license": "MIT"
     },
-    "node_modules/range-parser": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/raw-body": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
-      "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bytes": "3.1.2",
-        "http-errors": "2.0.0",
-        "iconv-lite": "0.6.3",
-        "unpipe": "1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/react": {
       "version": "18.3.1",
       "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
@@ -6264,23 +5581,6 @@
         "fsevents": "~2.3.2"
       }
     },
-    "node_modules/router": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
-      "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^4.4.0",
-        "depd": "^2.0.0",
-        "is-promise": "^4.0.0",
-        "parseurl": "^1.3.3",
-        "path-to-regexp": "^8.0.0"
-      },
-      "engines": {
-        "node": ">= 18"
-      }
-    },
     "node_modules/run-parallel": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -6315,34 +5615,6 @@
         "tslib": "^2.1.0"
       }
     },
-    "node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/scheduler": {
       "version": "0.23.2",
       "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
@@ -6362,58 +5634,12 @@
         "semver": "bin/semver.js"
       }
     },
-    "node_modules/send": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
-      "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^4.3.5",
-        "encodeurl": "^2.0.0",
-        "escape-html": "^1.0.3",
-        "etag": "^1.8.1",
-        "fresh": "^2.0.0",
-        "http-errors": "^2.0.0",
-        "mime-types": "^3.0.1",
-        "ms": "^2.1.3",
-        "on-finished": "^2.4.1",
-        "range-parser": "^1.2.1",
-        "statuses": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 18"
-      }
-    },
-    "node_modules/serve-static": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
-      "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "encodeurl": "^2.0.0",
-        "escape-html": "^1.0.3",
-        "parseurl": "^1.3.3",
-        "send": "^1.2.0"
-      },
-      "engines": {
-        "node": ">= 18"
-      }
-    },
     "node_modules/set-cookie-parser": {
       "version": "2.7.1",
       "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
       "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
       "license": "MIT"
     },
-    "node_modules/setprototypeof": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
-      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
-      "dev": true,
-      "license": "ISC"
-    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -6450,82 +5676,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/side-channel": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
-      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3",
-        "side-channel-list": "^1.0.0",
-        "side-channel-map": "^1.0.1",
-        "side-channel-weakmap": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-list": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
-      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
-      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-weakmap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
-      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3",
-        "side-channel-map": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -6573,16 +5723,6 @@
       "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==",
       "license": "MIT"
     },
-    "node_modules/statuses": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
-      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/string-comparison": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/string-comparison/-/string-comparison-1.3.0.tgz",
@@ -6762,16 +5902,6 @@
         "node": ">=8.0"
       }
     },
-    "node_modules/toidentifier": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
-      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
     "node_modules/tree-kill": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
@@ -6846,21 +5976,6 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/type-is": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
-      "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "content-type": "^1.0.5",
-        "media-typer": "^1.1.0",
-        "mime-types": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/typescript": {
       "version": "5.8.3",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
@@ -7002,16 +6117,6 @@
         "node": ">= 10.0.0"
       }
     },
-    "node_modules/unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/update-browserslist-db": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
@@ -7053,16 +6158,6 @@
         "punycode": "^2.1.0"
       }
     },
-    "node_modules/vary": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/vfile": {
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
@@ -7261,13 +6356,6 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true,
-      "license": "ISC"
-    },
     "node_modules/xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -7348,26 +6436,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/zod": {
-      "version": "3.24.3",
-      "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz",
-      "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==",
-      "dev": true,
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/colinhacks"
-      }
-    },
-    "node_modules/zod-to-json-schema": {
-      "version": "3.24.5",
-      "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz",
-      "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==",
-      "dev": true,
-      "license": "ISC",
-      "peerDependencies": {
-        "zod": "^3.24.1"
-      }
-    },
     "node_modules/zwitch": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",

From bf0100fc4a15ffc1567a63138f01c792ac88883a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 22:17:02 -0400
Subject: [PATCH 021/107] chore(deps): update dependency typescript-eslint to
 v8.36.0 (#1015)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 173 ++++++++++++++++++++-----------
 1 file changed, 112 insertions(+), 61 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index c07a69bbd..0a9f7f12d 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1951,21 +1951,21 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.31.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz",
-      "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.36.0.tgz",
+      "integrity": "sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.31.1",
-        "@typescript-eslint/type-utils": "8.31.1",
-        "@typescript-eslint/utils": "8.31.1",
-        "@typescript-eslint/visitor-keys": "8.31.1",
+        "@typescript-eslint/scope-manager": "8.36.0",
+        "@typescript-eslint/type-utils": "8.36.0",
+        "@typescript-eslint/utils": "8.36.0",
+        "@typescript-eslint/visitor-keys": "8.36.0",
         "graphemer": "^1.4.0",
-        "ignore": "^5.3.1",
+        "ignore": "^7.0.0",
         "natural-compare": "^1.4.0",
-        "ts-api-utils": "^2.0.1"
+        "ts-api-utils": "^2.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1975,22 +1975,32 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+        "@typescript-eslint/parser": "^8.36.0",
         "eslint": "^8.57.0 || ^9.0.0",
         "typescript": ">=4.8.4 <5.9.0"
       }
     },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+      "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.31.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz",
-      "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.36.0.tgz",
+      "integrity": "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.31.1",
-        "@typescript-eslint/types": "8.31.1",
-        "@typescript-eslint/typescript-estree": "8.31.1",
-        "@typescript-eslint/visitor-keys": "8.31.1",
+        "@typescript-eslint/scope-manager": "8.36.0",
+        "@typescript-eslint/types": "8.36.0",
+        "@typescript-eslint/typescript-estree": "8.36.0",
+        "@typescript-eslint/visitor-keys": "8.36.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2005,35 +2015,74 @@
         "typescript": ">=4.8.4 <5.9.0"
       }
     },
+    "node_modules/@typescript-eslint/project-service": {
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.36.0.tgz",
+      "integrity": "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/tsconfig-utils": "^8.36.0",
+        "@typescript-eslint/types": "^8.36.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <5.9.0"
+      }
+    },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.31.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz",
-      "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.36.0.tgz",
+      "integrity": "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.31.1",
-        "@typescript-eslint/visitor-keys": "8.31.1"
+        "@typescript-eslint/types": "8.36.0",
+        "@typescript-eslint/visitor-keys": "8.36.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/tsconfig-utils": {
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.36.0.tgz",
+      "integrity": "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==",
+      "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.31.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz",
-      "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.36.0.tgz",
+      "integrity": "sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.31.1",
-        "@typescript-eslint/utils": "8.31.1",
+        "@typescript-eslint/typescript-estree": "8.36.0",
+        "@typescript-eslint/utils": "8.36.0",
         "debug": "^4.3.4",
-        "ts-api-utils": "^2.0.1"
+        "ts-api-utils": "^2.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2048,9 +2097,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.31.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz",
-      "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz",
+      "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2062,20 +2111,22 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.31.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz",
-      "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz",
+      "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.31.1",
-        "@typescript-eslint/visitor-keys": "8.31.1",
+        "@typescript-eslint/project-service": "8.36.0",
+        "@typescript-eslint/tsconfig-utils": "8.36.0",
+        "@typescript-eslint/types": "8.36.0",
+        "@typescript-eslint/visitor-keys": "8.36.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
         "minimatch": "^9.0.4",
         "semver": "^7.6.0",
-        "ts-api-utils": "^2.0.1"
+        "ts-api-utils": "^2.1.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2089,9 +2140,9 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2115,9 +2166,9 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
-      "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+      "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
       "dev": true,
       "license": "ISC",
       "bin": {
@@ -2128,16 +2179,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.31.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz",
-      "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.36.0.tgz",
+      "integrity": "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.31.1",
-        "@typescript-eslint/types": "8.31.1",
-        "@typescript-eslint/typescript-estree": "8.31.1"
+        "@eslint-community/eslint-utils": "^4.7.0",
+        "@typescript-eslint/scope-manager": "8.36.0",
+        "@typescript-eslint/types": "8.36.0",
+        "@typescript-eslint/typescript-estree": "8.36.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2152,14 +2203,14 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.31.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz",
-      "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz",
+      "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.31.1",
-        "eslint-visitor-keys": "^4.2.0"
+        "@typescript-eslint/types": "8.36.0",
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5991,15 +6042,15 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.31.1",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz",
-      "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.36.0.tgz",
+      "integrity": "sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.31.1",
-        "@typescript-eslint/parser": "8.31.1",
-        "@typescript-eslint/utils": "8.31.1"
+        "@typescript-eslint/eslint-plugin": "8.36.0",
+        "@typescript-eslint/parser": "8.36.0",
+        "@typescript-eslint/utils": "8.36.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"

From 79da16cfcee5a691e33b3e910b4f2ee49fd474d2 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 22:23:47 -0400
Subject: [PATCH 022/107] fix(deps): update dependency ts-pattern to v5.7.1
 (#1000)

Signed-off-by: Louis Mandel 
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Louis Mandel 
---
 pdl-live-react/package-lock.json          |  6 +-
 pdl-live-react/src/pdl_ast_utils.ts       |  5 +-
 pdl-live-react/src/view/detail/find.ts    |  2 +-
 pdl-live-react/src/view/timeline/model.ts | 68 ++++++++++++-----------
 4 files changed, 44 insertions(+), 37 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 0a9f7f12d..eaf019561 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -5997,9 +5997,9 @@
       }
     },
     "node_modules/ts-pattern": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.7.0.tgz",
-      "integrity": "sha512-0/FvIG4g3kNkYgbNwBBW5pZBkfpeYQnH+2AA3xmjkCAit/DSDPKmgwC3fKof4oYUq6gupClVOJlFl+939VRBMg==",
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.7.1.tgz",
+      "integrity": "sha512-EGs8PguQqAAUIcQfK4E9xdXxB6s2GK4sJfT/vcc9V1ELIvC4LH/zXu2t/5fajtv6oiRCxdv7BgtVK3vWgROxag==",
       "license": "MIT"
     },
     "node_modules/tslib": {
diff --git a/pdl-live-react/src/pdl_ast_utils.ts b/pdl-live-react/src/pdl_ast_utils.ts
index 7d57cd947..83f4fb739 100644
--- a/pdl-live-react/src/pdl_ast_utils.ts
+++ b/pdl-live-react/src/pdl_ast_utils.ts
@@ -45,7 +45,6 @@ export function map_block_children(
     )
     new_block = { ...new_block, contribute }
   }
-  // @ts-expect-error: TODO
   new_block = match(new_block)
     // .with(P.string, s => s)
     .with({ kind: "empty" }, (block) => block)
@@ -202,7 +201,8 @@ export function map_block_children(
     })
     .with({ kind: "include" }, (block) => block)
     .with({ kind: "import" }, (block) => block)
-    .with({ kind: undefined }, (block) => block)
+    .with({ kind: P.nullish }, (block) => block)
+    // @ts-expect-error: TODO
     .exhaustive()
   match(new_block)
     .with({ parser: { pdl: P._ } }, (block) => {
@@ -294,6 +294,7 @@ export function iter_block_children(
     .with({ kind: "include" }, () => {})
     .with({ kind: "import" }, () => {})
     .with({ kind: undefined }, () => {})
+    // @ts-expect-error: TODO
     .exhaustive()
   match(block)
     .with({ parser: { pdl: P._ } }, (block) => {
diff --git a/pdl-live-react/src/view/detail/find.ts b/pdl-live-react/src/view/detail/find.ts
index 6ee1b38bd..bd1ed3f4e 100644
--- a/pdl-live-react/src/view/detail/find.ts
+++ b/pdl-live-react/src/view/detail/find.ts
@@ -21,7 +21,7 @@ export default function find(
   } else {
     return (
       childrenOf(block)
-        .map((child) => find(child, id))
+        .map((child: Block) => find(child, id))
         .filter(nonNullable)[0] || null
     )
   }
diff --git a/pdl-live-react/src/view/timeline/model.ts b/pdl-live-react/src/view/timeline/model.ts
index c384c3e70..5879f9eea 100644
--- a/pdl-live-react/src/view/timeline/model.ts
+++ b/pdl-live-react/src/view/timeline/model.ts
@@ -102,14 +102,15 @@ function computeModelIter(
 
   const childrenModel = childrenOf(block)
     .filter(nonNullable)
-    .flatMap((child) => computeModelIter(child, root))
+    .flatMap((child: PdlBlock) => computeModelIter(child, root))
 
   // Correct for anomalies in the trace where a child may have an
   // earlier end timestamp than its children. See
   // https://github.com/IBM/prompt-declaration-language/pull/683
   if (root) {
     const maxEnd = childrenModel.reduce(
-      (maxEnd, child) => Math.max(maxEnd, child.block.pdl__timing.end_nanos),
+      (maxEnd: number, child: TimelineRow) =>
+        Math.max(maxEnd, child.block.pdl__timing.end_nanos),
       0,
     )
     root.block.pdl__timing.end_nanos = Math.max(
@@ -122,35 +123,40 @@ function computeModelIter(
 }
 
 export function childrenOf(block: NonScalarPdlBlock) {
-  return match(block)
-    .with({ kind: "model" }, (data) => [/*data.input,*/ data.pdl__result])
-    .with({ kind: "code" }, (data) => [data.pdl__result])
-    .with({ kind: "get" }, (data) => [data.pdl__result])
-    .with({ kind: "data" }, (data) => [data.pdl__result])
-    .with({ kind: "if", if: { pdl__result: P._ } }, (data) =>
-      data.if.pdl__result ? [data.then] : [data.else],
-    )
-    .with({ kind: "if" }, (data) => [data.then, data.else])
-    .with({ kind: "match" }, (data) => [data.with]) // TODO
-    .with({ kind: "read" }, (data) => [data.pdl__result])
-    .with({ kind: "include" }, (data) => [data.pdl__trace ?? data.pdl__result])
-    .with({ kind: "import" }, (data) => [data.pdl__trace ?? data.pdl__result])
-    .with({ kind: "function" }, () => [])
-    .with({ kind: "call" }, (data) => [data.pdl__trace ?? data.pdl__result])
-    .with({ kind: "text" }, (data) => [data.text])
-    .with({ kind: "lastOf" }, (data) => [data.lastOf])
-    .with({ kind: "array" }, (data) => [data.array])
-    .with({ kind: "object" }, (data) => [data.object])
-    .with({ kind: "message" }, (data) => [data.content])
-    .with({ kind: "repeat" }, (data) => [data.pdl__trace ?? data.repeat])
-    .with({ kind: "empty" }, (data) =>
-      data.defs ? Object.values(data.defs) : [],
-    )
-    .with({ kind: "error" }, () => []) // TODO show errors in trace
-    .with({ kind: undefined }, () => [])
-    .exhaustive()
-    .flat()
-    .filter(nonNullable)
+  return (
+    match(block)
+      .with({ kind: "model" }, (data) => [/*data.input,*/ data.pdl__result])
+      .with({ kind: "code" }, (data) => [data.pdl__result])
+      .with({ kind: "get" }, (data) => [data.pdl__result])
+      .with({ kind: "data" }, (data) => [data.pdl__result])
+      .with({ kind: "if", if: { pdl__result: P._ } }, (data) =>
+        data.if.pdl__result ? [data.then] : [data.else],
+      )
+      .with({ kind: "if" }, (data) => [data.then, data.else])
+      .with({ kind: "match" }, (data) => [data.with]) // TODO
+      .with({ kind: "read" }, (data) => [data.pdl__result])
+      .with({ kind: "include" }, (data) => [
+        data.pdl__trace ?? data.pdl__result,
+      ])
+      .with({ kind: "import" }, (data) => [data.pdl__trace ?? data.pdl__result])
+      .with({ kind: "function" }, () => [])
+      .with({ kind: "call" }, (data) => [data.pdl__trace ?? data.pdl__result])
+      .with({ kind: "text" }, (data) => [data.text])
+      .with({ kind: "lastOf" }, (data) => [data.lastOf])
+      .with({ kind: "array" }, (data) => [data.array])
+      .with({ kind: "object" }, (data) => [data.object])
+      .with({ kind: "message" }, (data) => [data.content])
+      .with({ kind: "repeat" }, (data) => [data.pdl__trace ?? data.repeat])
+      .with({ kind: "empty" }, (data) =>
+        data.defs ? Object.values(data.defs) : [],
+      )
+      .with({ kind: "error" }, () => []) // TODO show errors in trace
+      .with({ kind: undefined }, () => [])
+      // @ts-expect-error: TODO
+      .exhaustive()
+      .flat()
+      .filter(nonNullable)
+  )
 }
 
 function positionOf(row: TimelineRow): Position {

From a8028f5639b04966bc4c68a94c5adbf94b81997b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 22:25:27 -0400
Subject: [PATCH 023/107] chore(deps): update tj-actions/changed-files digest
 to ed68ef8 (#996)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/run-examples-prep.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/run-examples-prep.yml b/.github/workflows/run-examples-prep.yml
index 9ea984412..7d5c522cf 100644
--- a/.github/workflows/run-examples-prep.yml
+++ b/.github/workflows/run-examples-prep.yml
@@ -17,7 +17,7 @@ jobs:
         fetch-depth: 0
     - name: Detect all PDL files that were changed or added
       id: changed-pdl-files
-      uses: tj-actions/changed-files@6cb76d07bee4c9772c6882c06c37837bf82a04d3 # v46
+      uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46
       with:
         files: |
           **.pdl

From 6b4946145976d959cb36672c102672f63331b325 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 22:25:57 -0400
Subject: [PATCH 024/107] chore(deps): update dependency @types/node to
 v22.16.2 (#1019)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 pdl-live-react/package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index eaf019561..2b3544b7a 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -36,7 +36,7 @@
         "@eslint/js": "^9.19.0",
         "@playwright/test": "^1.50.0",
         "@tauri-apps/cli": "^2.3.0",
-        "@types/node": "22.16.1",
+        "@types/node": "22.16.2",
         "@types/react": "^18.3.18",
         "@types/react-dom": "^18.3.5",
         "@types/react-syntax-highlighter": "^15.5.13",
@@ -1899,9 +1899,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.16.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.1.tgz",
-      "integrity": "sha512-oaNE4MzsA6uO7HcsjUvqzz19lYIRsV6I1Dc6iOvgwYYDiOeF7/9b2E/PE0UW2ccwpgWPVUedjltYXQXVKFd4EA==",
+      "version": "22.16.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.2.tgz",
+      "integrity": "sha512-Cdqa/eJTvt4fC4wmq1Mcc0CPUjp/Qy2FGqLza3z3pKymsI969TcZ54diNJv8UYUgeWxyb8FSbCkhdR6WqmUFhA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index 5b8c3eb25..2408bb4f6 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -51,7 +51,7 @@
     "@eslint/js": "^9.19.0",
     "@playwright/test": "^1.50.0",
     "@tauri-apps/cli": "^2.3.0",
-    "@types/node": "22.16.1",
+    "@types/node": "22.16.2",
     "@types/react": "^18.3.18",
     "@types/react-dom": "^18.3.5",
     "@types/react-syntax-highlighter": "^15.5.13",

From 9b37e04fd116d9b1c441d5f0d2fec87516a12d87 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 8 Jul 2025 22:27:00 -0400
Subject: [PATCH 025/107] fix(deps): update dependency
 @tauri-apps/plugin-opener to v2.4.0 (#1020)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 2b3544b7a..7424099c2 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1774,12 +1774,12 @@
       }
     },
     "node_modules/@tauri-apps/plugin-opener": {
-      "version": "2.2.6",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.2.6.tgz",
-      "integrity": "sha512-bSdkuP71ZQRepPOn8BOEdBKYJQvl6+jb160QtJX/i2H9BF6ZySY/kYljh76N2Ne5fJMQRge7rlKoStYQY5Jq1w==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.4.0.tgz",
+      "integrity": "sha512-43VyN8JJtvKWJY72WI/KNZszTpDpzHULFxQs0CJBIYUdCRowQ6Q1feWTDb979N7nldqSuDOaBupZ6wz2nvuWwQ==",
       "license": "MIT OR Apache-2.0",
       "dependencies": {
-        "@tauri-apps/api": "^2.0.0"
+        "@tauri-apps/api": "^2.6.0"
       }
     },
     "node_modules/@tauri-apps/plugin-window-state": {

From 70028020ffb428b6d9b45f4444bab1375891b64c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 9 Jul 2025 07:44:42 -0400
Subject: [PATCH 026/107] fix(deps): update rust crate async-openai to 0.29.0
 (#1024)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 8 ++++----
 pdl-live-react/src-tauri/Cargo.toml | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 2e2cba94c..9268b7594 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -224,9 +224,9 @@ dependencies = [
 
 [[package]]
 name = "async-openai"
-version = "0.28.1"
+version = "0.29.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14d76e2f5af19477d6254415acc95ba97c6cc6f3b1e3cb4676b7f0fab8194298"
+checksum = "31acf814d6b499e33ec894bb0fd7ddaf2665b44fbdd42b858d736449271fde0c"
 dependencies = [
  "async-openai-macros",
  "backoff",
@@ -2685,7 +2685,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
 dependencies = [
  "cfg-if",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -6855,7 +6855,7 @@ version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
diff --git a/pdl-live-react/src-tauri/Cargo.toml b/pdl-live-react/src-tauri/Cargo.toml
index eec0bcde5..068e34605 100644
--- a/pdl-live-react/src-tauri/Cargo.toml
+++ b/pdl-live-react/src-tauri/Cargo.toml
@@ -51,7 +51,7 @@ schemars = "0.8.22"
 fs4 = "0.13.1"
 derive_builder = "0.20.2"
 iana-time-zone = "0.1.63"
-async-openai = "0.28.1"
+async-openai = "0.29.0"
 regex = "1.11.1"
 
 [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]

From 34da489f2dcd96f354e8693bab9ad2c65f5b54da Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 9 Jul 2025 07:45:56 -0400
Subject: [PATCH 027/107] fix(deps): update dependency yaml to v2.8.0 (#1023)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 7424099c2..5faa5f0dd 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -6434,15 +6434,15 @@
       "license": "ISC"
     },
     "node_modules/yaml": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
-      "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
+      "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
       "license": "ISC",
       "bin": {
         "yaml": "bin.mjs"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 14.6"
       }
     },
     "node_modules/yargs": {

From 2a476b21318388675717ac694e2b62512adc0ee6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 9 Jul 2025 07:46:45 -0400
Subject: [PATCH 028/107] fix(deps): update dependency react-router to v7.6.3
 (#1022)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 33 +++++++++++++-------------------
 1 file changed, 13 insertions(+), 20 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 5faa5f0dd..2176b439d 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -2721,6 +2721,15 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/cookie": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
+      "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/cross-spawn": {
       "version": "7.0.6",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -5336,14 +5345,13 @@
       }
     },
     "node_modules/react-router": {
-      "version": "7.5.3",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz",
-      "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==",
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.3.tgz",
+      "integrity": "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==",
       "license": "MIT",
       "dependencies": {
         "cookie": "^1.0.1",
-        "set-cookie-parser": "^2.6.0",
-        "turbo-stream": "2.4.0"
+        "set-cookie-parser": "^2.6.0"
       },
       "engines": {
         "node": ">=20.0.0"
@@ -5358,15 +5366,6 @@
         }
       }
     },
-    "node_modules/react-router/node_modules/cookie": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
-      "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      }
-    },
     "node_modules/react-syntax-highlighter": {
       "version": "15.6.1",
       "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz",
@@ -6008,12 +6007,6 @@
       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
       "license": "0BSD"
     },
-    "node_modules/turbo-stream": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz",
-      "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==",
-      "license": "ISC"
-    },
     "node_modules/type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",

From c669e1f22830d9faa3d77bd7917cb44e4ef682fa Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 9 Jul 2025 07:47:06 -0400
Subject: [PATCH 029/107] fix(deps): update dependency
 @tauri-apps/plugin-window-state to v2.3.0 (#1021)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 2176b439d..7c94b9d32 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1783,12 +1783,12 @@
       }
     },
     "node_modules/@tauri-apps/plugin-window-state": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-window-state/-/plugin-window-state-2.2.2.tgz",
-      "integrity": "sha512-7pFwmMtGhhhE/WgmM7PUrj0BSSWVAQMfDdYbRalphIqqF1tWBvxtlxclx8bTutpXHLJTQoCpIeWtBEIXsoAlGw==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-window-state/-/plugin-window-state-2.3.0.tgz",
+      "integrity": "sha512-BfhM0gm6jsF+VyYeOZ3eNqDfRJ2YPMh0a5qesD8AizVGv7wVB3cGLqh6EaeMpGl7y6kP9lvEMYkDRHuqKbcsgw==",
       "license": "MIT OR Apache-2.0",
       "dependencies": {
-        "@tauri-apps/api": "^2.0.0"
+        "@tauri-apps/api": "^2.6.0"
       }
     },
     "node_modules/@types/babel__core": {

From 2547dd3bdf9e16f7aabe46e9d2710b7dc8ba6c45 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 9 Jul 2025 14:42:12 -0400
Subject: [PATCH 030/107] fix(deps): update rust crate indexmap to v2.10.0
 (#1026)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 9268b7594..391b79d43 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -2356,9 +2356,9 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "2.9.0"
+version = "2.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
+checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
 dependencies = [
  "equivalent",
  "hashbrown 0.15.3",
@@ -3570,7 +3570,7 @@ dependencies = [
  "fs4",
  "futures",
  "iana-time-zone",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "minijinja",
  "ollama-rs",
  "owo-colors",
@@ -3783,7 +3783,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "eac26e981c03a6e53e0aee43c113e3202f5581d5360dae7bd2c70e800dd0451d"
 dependencies = [
  "base64 0.22.1",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "quick-xml",
  "serde",
  "time",
@@ -4507,7 +4507,7 @@ source = "git+https://github.com/RustPython/RustPython.git#85f7ba51f4f9eb8d46f45
 dependencies = [
  "ahash",
  "bitflags 2.9.0",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "itertools",
  "log",
  "malachite-bigint",
@@ -4683,7 +4683,7 @@ dependencies = [
  "foreign-types-shared 0.1.1",
  "gethostname",
  "hex",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "itertools",
  "junction",
  "libc",
@@ -4753,7 +4753,7 @@ dependencies = [
  "glob",
  "half",
  "hex",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "is-macro",
  "itertools",
  "junction",
@@ -5054,7 +5054,7 @@ version = "1.0.140"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
 dependencies = [
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "itoa 1.0.15",
  "memchr",
  "ryu",
@@ -5067,7 +5067,7 @@ version = "0.9.42"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e408f29489b5fd500fab51ff1484fc859bb655f32c671f307dcd733b72e8168c"
 dependencies = [
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "itoa 1.0.15",
  "ryu",
  "serde",
@@ -5116,7 +5116,7 @@ dependencies = [
  "chrono",
  "hex",
  "indexmap 1.9.3",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "serde",
  "serde_derive",
  "serde_json",
@@ -5855,7 +5855,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4"
 dependencies = [
  "embed-resource",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "toml",
 ]
 
@@ -6116,7 +6116,7 @@ version = "0.19.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
 dependencies = [
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "toml_datetime",
  "winnow 0.5.40",
 ]
@@ -6127,7 +6127,7 @@ version = "0.20.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
 dependencies = [
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "toml_datetime",
  "winnow 0.5.40",
 ]
@@ -6138,7 +6138,7 @@ version = "0.22.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
 dependencies = [
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
  "serde",
  "serde_spanned",
  "toml_datetime",

From 834ab13ee2531e5f9944fd1ff5ea33b4a93d4b5c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 9 Jul 2025 14:46:11 -0400
Subject: [PATCH 031/107] fix(deps): update rust crate base64ct to v1.8.0
 (#1025)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 391b79d43..8e70300e1 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -433,9 +433,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
 
 [[package]]
 name = "base64ct"
-version = "1.7.3"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3"
+checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba"
 
 [[package]]
 name = "bitflags"

From e291745eb89337cf66c3641b74b13fd8ef3a33dc Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 9 Jul 2025 15:31:55 -0400
Subject: [PATCH 032/107] fix(deps): update rust crate minijinja to v2.11.0
 (#1027)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 8e70300e1..15644c931 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -2897,9 +2897,9 @@ dependencies = [
 
 [[package]]
 name = "minijinja"
-version = "2.9.0"
+version = "2.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98642a6dfca91122779a307b77cd07a4aa951fbe32232aaf5bad9febc66be754"
+checksum = "4e60ac08614cc09062820e51d5d94c2fce16b94ea4e5003bb81b99a95f84e876"
 dependencies = [
  "aho-corasick",
  "serde",

From 6b82d4748042de6fec9320bb76680f3cc8484450 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 10 Jul 2025 09:28:34 -0400
Subject: [PATCH 033/107] fix(deps): update rust crate tauri-plugin-cli to
 v2.4.0 (#1029)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 173 +++++++++++++---------------
 1 file changed, 78 insertions(+), 95 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 15644c931..8c7bef7ee 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -503,9 +503,9 @@ dependencies = [
 
 [[package]]
 name = "brotli"
-version = "7.0.0"
+version = "8.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd"
+checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d"
 dependencies = [
  "alloc-no-stdlib",
  "alloc-stdlib",
@@ -514,9 +514,9 @@ dependencies = [
 
 [[package]]
 name = "brotli-decompressor"
-version = "4.0.3"
+version = "5.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd"
+checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03"
 dependencies = [
  "alloc-no-stdlib",
  "alloc-stdlib",
@@ -794,7 +794,7 @@ checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32"
 dependencies = [
  "castaway",
  "cfg-if",
- "itoa 1.0.15",
+ "itoa",
  "rustversion",
  "ryu",
  "static_assertions",
@@ -951,15 +951,15 @@ dependencies = [
 
 [[package]]
 name = "cssparser"
-version = "0.27.2"
+version = "0.29.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a"
+checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa"
 dependencies = [
  "cssparser-macros",
  "dtoa-short",
- "itoa 0.4.8",
+ "itoa",
  "matches",
- "phf 0.8.0",
+ "phf 0.10.1",
  "proc-macro2",
  "quote",
  "smallvec",
@@ -2035,16 +2035,14 @@ dependencies = [
 
 [[package]]
 name = "html5ever"
-version = "0.26.0"
+version = "0.29.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7"
+checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c"
 dependencies = [
  "log",
  "mac",
  "markup5ever",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
+ "match_token",
 ]
 
 [[package]]
@@ -2055,7 +2053,7 @@ checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
 dependencies = [
  "bytes",
  "fnv",
- "itoa 1.0.15",
+ "itoa",
 ]
 
 [[package]]
@@ -2099,7 +2097,7 @@ dependencies = [
  "http",
  "http-body",
  "httparse",
- "itoa 1.0.15",
+ "itoa",
  "pin-project-lite",
  "smallvec",
  "tokio",
@@ -2176,7 +2174,7 @@ dependencies = [
  "js-sys",
  "log",
  "wasm-bindgen",
- "windows-core 0.61.0",
+ "windows-core 0.60.1",
 ]
 
 [[package]]
@@ -2445,12 +2443,6 @@ dependencies = [
  "either",
 ]
 
-[[package]]
-name = "itoa"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
-
 [[package]]
 name = "itoa"
 version = "1.0.15"
@@ -2566,14 +2558,13 @@ dependencies = [
 
 [[package]]
 name = "kuchikiki"
-version = "0.8.2"
+version = "0.8.8-speedreader"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8"
+checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2"
 dependencies = [
  "cssparser",
  "html5ever",
- "indexmap 1.9.3",
- "matches",
+ "indexmap 2.10.0",
  "selectors",
 ]
 
@@ -2827,18 +2818,29 @@ checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
 
 [[package]]
 name = "markup5ever"
-version = "0.11.0"
+version = "0.14.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"
+checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18"
 dependencies = [
  "log",
- "phf 0.10.1",
- "phf_codegen 0.10.0",
+ "phf 0.11.3",
+ "phf_codegen 0.11.3",
  "string_cache",
  "string_cache_codegen",
  "tendril",
 ]
 
+[[package]]
+name = "match_token"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.101",
+]
+
 [[package]]
 name = "matches"
 version = "0.1.10"
@@ -2943,9 +2945,9 @@ dependencies = [
 
 [[package]]
 name = "muda"
-version = "0.16.1"
+version = "0.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4de14a9b5d569ca68d7c891d613b390cf5ab4f851c77aaa2f9e435555d3d9492"
+checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988"
 dependencies = [
  "crossbeam-channel",
  "dpi",
@@ -3609,9 +3611,7 @@ version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
 dependencies = [
- "phf_macros 0.8.0",
  "phf_shared 0.8.0",
- "proc-macro-hack",
 ]
 
 [[package]]
@@ -3620,7 +3620,9 @@ version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
 dependencies = [
+ "phf_macros 0.10.0",
  "phf_shared 0.10.0",
+ "proc-macro-hack",
 ]
 
 [[package]]
@@ -3643,16 +3645,6 @@ dependencies = [
  "phf_shared 0.8.0",
 ]
 
-[[package]]
-name = "phf_codegen"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
-dependencies = [
- "phf_generator 0.10.0",
- "phf_shared 0.10.0",
-]
-
 [[package]]
 name = "phf_codegen"
 version = "0.11.3"
@@ -3695,12 +3687,12 @@ dependencies = [
 
 [[package]]
 name = "phf_macros"
-version = "0.8.0"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
+checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0"
 dependencies = [
- "phf_generator 0.8.0",
- "phf_shared 0.8.0",
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
  "proc-macro-hack",
  "proc-macro2",
  "quote",
@@ -4979,22 +4971,20 @@ dependencies = [
 
 [[package]]
 name = "selectors"
-version = "0.22.0"
+version = "0.24.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
+checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416"
 dependencies = [
  "bitflags 1.3.2",
  "cssparser",
  "derive_more",
  "fxhash",
  "log",
- "matches",
  "phf 0.8.0",
  "phf_codegen 0.8.0",
  "precomputed-hash",
  "servo_arc",
  "smallvec",
- "thin-slice",
 ]
 
 [[package]]
@@ -5055,7 +5045,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
 dependencies = [
  "indexmap 2.10.0",
- "itoa 1.0.15",
+ "itoa",
  "memchr",
  "ryu",
  "serde",
@@ -5068,7 +5058,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e408f29489b5fd500fab51ff1484fc859bb655f32c671f307dcd733b72e8168c"
 dependencies = [
  "indexmap 2.10.0",
- "itoa 1.0.15",
+ "itoa",
  "ryu",
  "serde",
  "unsafe-libyaml-norway",
@@ -5101,7 +5091,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
 dependencies = [
  "form_urlencoded",
- "itoa 1.0.15",
+ "itoa",
  "ryu",
  "serde",
 ]
@@ -5171,9 +5161,9 @@ dependencies = [
 
 [[package]]
 name = "servo_arc"
-version = "0.1.1"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432"
+checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741"
 dependencies = [
  "nodrop",
  "stable_deref_trait",
@@ -5511,9 +5501,9 @@ dependencies = [
 
 [[package]]
 name = "tao"
-version = "0.33.0"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e59c1f38e657351a2e822eadf40d6a2ad4627b9c25557bc1180ec1b3295ef82"
+checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a"
 dependencies = [
  "bitflags 2.9.0",
  "core-foundation 0.10.0",
@@ -5567,17 +5557,16 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
 
 [[package]]
 name = "tauri"
-version = "2.5.1"
+version = "2.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7b0bc1aec81bda6bc455ea98fcaed26b3c98c1648c627ad6ff1c704e8bf8cbc"
+checksum = "124e129c9c0faa6bec792c5948c89e86c90094133b0b9044df0ce5f0a8efaa0d"
 dependencies = [
  "anyhow",
  "bytes",
  "dirs",
  "dunce",
  "embed_plist",
- "futures-util",
- "getrandom 0.2.16",
+ "getrandom 0.3.2",
  "glob",
  "gtk",
  "heck 0.5.0",
@@ -5618,9 +5607,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-build"
-version = "2.2.0"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7a0350f0df1db385ca5c02888a83e0e66655c245b7443db8b78a70da7d7f8fc"
+checksum = "12f025c389d3adb83114bec704da973142e82fc6ec799c7c750c5e21cefaec83"
 dependencies = [
  "anyhow",
  "cargo_toml",
@@ -5640,9 +5629,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-codegen"
-version = "2.2.0"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f93f035551bf7b11b3f51ad9bc231ebbe5e085565527991c16cf326aa38cdf47"
+checksum = "f5df493a1075a241065bc865ed5ef8d0fbc1e76c7afdc0bf0eccfaa7d4f0e406"
 dependencies = [
  "base64 0.22.1",
  "brotli",
@@ -5667,9 +5656,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-macros"
-version = "2.2.0"
+version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8db4df25e2d9d45de0c4c910da61cd5500190da14ae4830749fee3466dddd112"
+checksum = "f237fbea5866fa5f2a60a21bea807a2d6e0379db070d89c3a10ac0f2d4649bbc"
 dependencies = [
  "heck 0.5.0",
  "proc-macro2",
@@ -5681,9 +5670,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-plugin"
-version = "2.2.0"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37a5ebe6a610d1b78a94650896e6f7c9796323f408800cef436e0fa0539de601"
+checksum = "1d9a0bd00bf1930ad1a604d08b0eb6b2a9c1822686d65d7f4731a7723b8901d3"
 dependencies = [
  "anyhow",
  "glob",
@@ -5698,9 +5687,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-plugin-cli"
-version = "2.2.0"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5458ae16eac81bdbe8d9da2a9f3e01e8cdedbc381cc1727c01127542c8a61c5"
+checksum = "53e76101cc9848adfb6a04aae48a389062be457a785bb4349ae1423ddab5a82d"
 dependencies = [
  "clap",
  "log",
@@ -5763,9 +5752,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-runtime"
-version = "2.6.0"
+version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00f004905d549854069e6774533d742b03cacfd6f03deb08940a8677586cbe39"
+checksum = "9e7bb73d1bceac06c20b3f755b2c8a2cb13b20b50083084a8cf3700daf397ba4"
 dependencies = [
  "cookie",
  "dpi",
@@ -5785,9 +5774,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-runtime-wry"
-version = "2.6.0"
+version = "2.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f85d056f4d4b014fe874814034f3416d57114b617a493a4fe552580851a3f3a2"
+checksum = "902b5aa9035e16f342eb64f8bf06ccdc2808e411a2525ed1d07672fa4e780bad"
 dependencies = [
  "gtk",
  "http",
@@ -5812,9 +5801,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-utils"
-version = "2.4.0"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2900399c239a471bcff7f15c4399eb1a8c4fe511ba2853e07c996d771a5e0a4"
+checksum = "41743bbbeb96c3a100d234e5a0b60a46d5aa068f266160862c7afdbf828ca02e"
 dependencies = [
  "anyhow",
  "brotli",
@@ -5898,12 +5887,6 @@ version = "0.16.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057"
 
-[[package]]
-name = "thin-slice"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
-
 [[package]]
 name = "thiserror"
 version = "1.0.69"
@@ -5961,7 +5944,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
 dependencies = [
  "deranged",
- "itoa 1.0.15",
+ "itoa",
  "num-conv",
  "powerfmt",
  "serde",
@@ -6230,9 +6213,9 @@ dependencies = [
 
 [[package]]
 name = "tray-icon"
-version = "0.20.1"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7eee98ec5c90daf179d55c20a49d8c0d043054ce7c26336c09a24d31f14fa0"
+checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a"
 dependencies = [
  "crossbeam-channel",
  "dirs",
@@ -6781,9 +6764,9 @@ dependencies = [
 
 [[package]]
 name = "webview2-com"
-version = "0.37.0"
+version = "0.38.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b542b5cfbd9618c46c2784e4d41ba218c336ac70d44c55e47b251033e7d85601"
+checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4"
 dependencies = [
  "webview2-com-macros",
  "webview2-com-sys",
@@ -6806,9 +6789,9 @@ dependencies = [
 
 [[package]]
 name = "webview2-com-sys"
-version = "0.37.0"
+version = "0.38.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ae2d11c4a686e4409659d7891791254cf9286d3cfe0eef54df1523533d22295"
+checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c"
 dependencies = [
  "thiserror 2.0.12",
  "windows 0.61.1",
@@ -7373,9 +7356,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
 
 [[package]]
 name = "wry"
-version = "0.51.2"
+version = "0.52.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c886a0a9d2a94fd90cfa1d929629b79cfefb1546e2c7430c63a47f0664c0e4e2"
+checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9"
 dependencies = [
  "base64 0.22.1",
  "block2 0.6.1",

From b95e76a157840ca4202836393a2fa5a2a97d9005 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 10 Jul 2025 09:29:07 -0400
Subject: [PATCH 034/107] chore(deps): update dependency ubuntu to v24 (#1036)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/release-static-web-app.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/release-static-web-app.yml b/.github/workflows/release-static-web-app.yml
index a235da9a9..6fe1b0fcc 100644
--- a/.github/workflows/release-static-web-app.yml
+++ b/.github/workflows/release-static-web-app.yml
@@ -13,7 +13,7 @@ jobs:
     strategy:
       fail-fast: false
 
-    runs-on: 'ubuntu-22.04'
+    runs-on: 'ubuntu-24.04'
     defaults:
       run:
         working-directory: ./pdl-live-react

From 4e1b5229efdfa7e7b511c4e1871a9dce7ff15e4d Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 10 Jul 2025 09:29:51 -0400
Subject: [PATCH 035/107] chore(deps): update actions/checkout action to v4
 (#1035)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/publish-quay.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/publish-quay.yaml b/.github/workflows/publish-quay.yaml
index 296ea4de8..d1d3d45d0 100644
--- a/.github/workflows/publish-quay.yaml
+++ b/.github/workflows/publish-quay.yaml
@@ -22,7 +22,7 @@ jobs:
 
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Docker Setup QEMU
         uses: docker/setup-qemu-action@v2

From f1f8e34488dd2640226c5075339c64c5235de032 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 10 Jul 2025 09:30:19 -0400
Subject: [PATCH 036/107] fix(deps): update rust crate tokio to v1.46.1 (#1033)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 8c7bef7ee..34c1fc1f7 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -2381,6 +2381,17 @@ dependencies = [
  "cfg-if",
 ]
 
+[[package]]
+name = "io-uring"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013"
+dependencies = [
+ "bitflags 2.9.0",
+ "cfg-if",
+ "libc",
+]
+
 [[package]]
 name = "ipnet"
 version = "2.11.0"
@@ -2676,7 +2687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
 dependencies = [
  "cfg-if",
- "windows-targets 0.52.6",
+ "windows-targets 0.48.5",
 ]
 
 [[package]]
@@ -6001,17 +6012,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.44.2"
+version = "1.46.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
+checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17"
 dependencies = [
  "backtrace",
  "bytes",
+ "io-uring",
  "libc",
  "mio",
  "parking_lot",
  "pin-project-lite",
  "signal-hook-registry",
+ "slab",
  "socket2",
  "tokio-macros",
  "windows-sys 0.52.0",

From d8444f349dad16c8a8f90cf1c67c6224545f2762 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 10 Jul 2025 09:30:46 -0400
Subject: [PATCH 037/107] fix(deps): update rust crate
 tauri-plugin-window-state to v2.3.0 (#1031)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 34c1fc1f7..05f7a1f13 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -5748,9 +5748,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-plugin-window-state"
-version = "2.2.2"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a27a3fe49de72adbe0d84aee33c89a0b059722cd0b42aaeab29eaaee7f7535cd"
+checksum = "5a3d22b21b9cec73601b512a868f7c74f93c044d44fd6ca1c84e9d6afb6b1559"
 dependencies = [
  "bitflags 2.9.0",
  "log",

From 10f99530379effacf93d039d875aa4c8f0e8e1ef Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 10 Jul 2025 09:31:19 -0400
Subject: [PATCH 038/107] fix(deps): update rust crate tauri-plugin-opener to
 v2.4.0 (#1030)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 93 +++--------------------------
 1 file changed, 9 insertions(+), 84 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 05f7a1f13..babf8bf3c 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -5713,9 +5713,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-plugin-opener"
-version = "2.2.6"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fdc6cb608e04b7d2b6d1f21e9444ad49245f6d03465ba53323d692d1ceb1a30"
+checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321"
 dependencies = [
  "dunce",
  "glob",
@@ -5729,7 +5729,7 @@ dependencies = [
  "tauri-plugin",
  "thiserror 2.0.12",
  "url",
- "windows 0.60.0",
+ "windows 0.61.1",
  "zbus",
 ]
 
@@ -6785,7 +6785,7 @@ dependencies = [
  "webview2-com-sys",
  "windows 0.61.1",
  "windows-core 0.61.0",
- "windows-implement 0.60.0",
+ "windows-implement",
  "windows-interface",
 ]
 
@@ -6885,39 +6885,17 @@ dependencies = [
  "windows-targets 0.52.6",
 ]
 
-[[package]]
-name = "windows"
-version = "0.60.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddf874e74c7a99773e62b1c671427abf01a425e77c3d3fb9fb1e4883ea934529"
-dependencies = [
- "windows-collections 0.1.1",
- "windows-core 0.60.1",
- "windows-future 0.1.1",
- "windows-link",
- "windows-numerics 0.1.1",
-]
-
 [[package]]
 name = "windows"
 version = "0.61.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419"
 dependencies = [
- "windows-collections 0.2.0",
+ "windows-collections",
  "windows-core 0.61.0",
- "windows-future 0.2.0",
+ "windows-future",
  "windows-link",
- "windows-numerics 0.2.0",
-]
-
-[[package]]
-name = "windows-collections"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5467f79cc1ba3f52ebb2ed41dbb459b8e7db636cc3429458d9a852e15bc24dec"
-dependencies = [
- "windows-core 0.60.1",
+ "windows-numerics",
 ]
 
 [[package]]
@@ -6938,40 +6916,17 @@ dependencies = [
  "windows-targets 0.52.6",
 ]
 
-[[package]]
-name = "windows-core"
-version = "0.60.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247"
-dependencies = [
- "windows-implement 0.59.0",
- "windows-interface",
- "windows-link",
- "windows-result",
- "windows-strings 0.3.1",
-]
-
 [[package]]
 name = "windows-core"
 version = "0.61.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980"
 dependencies = [
- "windows-implement 0.60.0",
+ "windows-implement",
  "windows-interface",
  "windows-link",
  "windows-result",
- "windows-strings 0.4.0",
-]
-
-[[package]]
-name = "windows-future"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a787db4595e7eb80239b74ce8babfb1363d8e343ab072f2ffe901400c03349f0"
-dependencies = [
- "windows-core 0.60.1",
- "windows-link",
+ "windows-strings",
 ]
 
 [[package]]
@@ -6984,17 +6939,6 @@ dependencies = [
  "windows-link",
 ]
 
-[[package]]
-name = "windows-implement"
-version = "0.59.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.101",
-]
-
 [[package]]
 name = "windows-implement"
 version = "0.60.0"
@@ -7023,16 +6967,6 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
 
-[[package]]
-name = "windows-numerics"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "005dea54e2f6499f2cee279b8f703b3cf3b5734a2d8d21867c8f44003182eeed"
-dependencies = [
- "windows-core 0.60.1",
- "windows-link",
-]
-
 [[package]]
 name = "windows-numerics"
 version = "0.2.0"
@@ -7052,15 +6986,6 @@ dependencies = [
  "windows-link",
 ]
 
-[[package]]
-name = "windows-strings"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319"
-dependencies = [
- "windows-link",
-]
-
 [[package]]
 name = "windows-strings"
 version = "0.4.0"

From 04a440e8b5892ad402a6809fbf670cbcfcb187ac Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 10 Jul 2025 09:32:02 -0400
Subject: [PATCH 039/107] fix(deps): update rust crate tempfile to v3.20.0
 (#1032)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index babf8bf3c..6d6179817 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -1329,7 +1329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
 dependencies = [
  "libc",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -1390,7 +1390,7 @@ checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78"
 dependencies = [
  "cfg-if",
  "rustix 1.0.7",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -4011,7 +4011,7 @@ dependencies = [
  "once_cell",
  "socket2",
  "tracing",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -4441,7 +4441,7 @@ dependencies = [
  "errno",
  "libc",
  "linux-raw-sys 0.4.15",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -4454,7 +4454,7 @@ dependencies = [
  "errno",
  "libc",
  "linux-raw-sys 0.9.4",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -5861,15 +5861,15 @@ dependencies = [
 
 [[package]]
 name = "tempfile"
-version = "3.19.1"
+version = "3.20.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf"
+checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
 dependencies = [
  "fastrand",
  "getrandom 0.3.2",
  "once_cell",
  "rustix 1.0.7",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -6851,7 +6851,7 @@ version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
- "windows-sys 0.59.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]

From e4021ca79dc7e59f330fd605b6e48a99ea6fa7f7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 11:22:10 -0400
Subject: [PATCH 040/107] chore(deps): Update datasets requirement from <4,>3
 to >3,<5 (#1046)

Updates the requirements on [datasets](https://github.com/huggingface/datasets) to permit the latest version.
- [Release notes](https://github.com/huggingface/datasets/releases)
- [Commits](https://github.com/huggingface/datasets/compare/3.0.1...4.0.0)

---
updated-dependencies:
- dependency-name: datasets
  dependency-version: 4.0.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 pyproject.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pyproject.toml b/pyproject.toml
index 089dabae1..d9aac6e00 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -47,7 +47,7 @@ examples = [
   "pypdf~=5.2",
   "wikipedia~=1.0",
   "textdistance~=4.0",
-  "datasets>3,<4",
+  "datasets>3,<5",
   "sympy~=1.0",
   "scikit-learn>=1.6.1,<1.8.0",
   "faiss-cpu>=1.10,<1.12",

From 6f96baf0c929f8f512b1dfc0cc333ae577933e75 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 11:22:40 -0400
Subject: [PATCH 041/107] chore(deps): update docker/setup-qemu-action action
 to v3 (#1044)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/publish-quay.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/publish-quay.yaml b/.github/workflows/publish-quay.yaml
index d1d3d45d0..b31733088 100644
--- a/.github/workflows/publish-quay.yaml
+++ b/.github/workflows/publish-quay.yaml
@@ -25,7 +25,7 @@ jobs:
         uses: actions/checkout@v4
 
       - name: Docker Setup QEMU
-        uses: docker/setup-qemu-action@v2
+        uses: docker/setup-qemu-action@v3
         
       - name: Set up Docker Buildx
         uses: docker/setup-buildx-action@v2

From 818dbdb2efed48d0160bc7c7edae50df2a5f885c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 11:23:03 -0400
Subject: [PATCH 042/107] chore(deps): update docker/setup-buildx-action action
 to v3 (#1043)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/publish-quay.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/publish-quay.yaml b/.github/workflows/publish-quay.yaml
index b31733088..fff8bee70 100644
--- a/.github/workflows/publish-quay.yaml
+++ b/.github/workflows/publish-quay.yaml
@@ -28,7 +28,7 @@ jobs:
         uses: docker/setup-qemu-action@v3
         
       - name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v2
+        uses: docker/setup-buildx-action@v3
 
       - name: Login to Docker Hub
         uses: docker/login-action@v2

From 0b7f78d44d70ed39ae808bc9fcc60b9fc1582d1e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 11:23:20 -0400
Subject: [PATCH 043/107] chore(deps): update docker/login-action action to v3
 (#1042)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/publish-quay.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/publish-quay.yaml b/.github/workflows/publish-quay.yaml
index fff8bee70..3c9efda83 100644
--- a/.github/workflows/publish-quay.yaml
+++ b/.github/workflows/publish-quay.yaml
@@ -31,7 +31,7 @@ jobs:
         uses: docker/setup-buildx-action@v3
 
       - name: Login to Docker Hub
-        uses: docker/login-action@v2
+        uses: docker/login-action@v3
         with:
           registry: ${{ env.REGISTRY }}
           username: ${{ secrets.QUAYIO_USERNAME }}

From 66fe53c190c64c80b892a2c65ea0da17e96689ed Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 11:23:43 -0400
Subject: [PATCH 044/107] chore(deps): update dependency @types/node to
 v22.16.3 (#1041)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 pdl-live-react/package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 7c94b9d32..68e0316ce 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -36,7 +36,7 @@
         "@eslint/js": "^9.19.0",
         "@playwright/test": "^1.50.0",
         "@tauri-apps/cli": "^2.3.0",
-        "@types/node": "22.16.2",
+        "@types/node": "22.16.3",
         "@types/react": "^18.3.18",
         "@types/react-dom": "^18.3.5",
         "@types/react-syntax-highlighter": "^15.5.13",
@@ -1899,9 +1899,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.16.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.2.tgz",
-      "integrity": "sha512-Cdqa/eJTvt4fC4wmq1Mcc0CPUjp/Qy2FGqLza3z3pKymsI969TcZ54diNJv8UYUgeWxyb8FSbCkhdR6WqmUFhA==",
+      "version": "22.16.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz",
+      "integrity": "sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index 2408bb4f6..0a4e61d95 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -51,7 +51,7 @@
     "@eslint/js": "^9.19.0",
     "@playwright/test": "^1.50.0",
     "@tauri-apps/cli": "^2.3.0",
-    "@types/node": "22.16.2",
+    "@types/node": "22.16.3",
     "@types/react": "^18.3.18",
     "@types/react-dom": "^18.3.5",
     "@types/react-syntax-highlighter": "^15.5.13",

From c6b64b2e6937c9a1781ac3cf47d800bbd7945dbd Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 11:24:04 -0400
Subject: [PATCH 045/107] chore(deps): update docker/build-push-action action
 to v6 (#1039)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/publish-quay.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/publish-quay.yaml b/.github/workflows/publish-quay.yaml
index 3c9efda83..628bb5607 100644
--- a/.github/workflows/publish-quay.yaml
+++ b/.github/workflows/publish-quay.yaml
@@ -38,7 +38,7 @@ jobs:
           password: ${{ secrets.QUAYIO_TOKEN }}          
 
       - name: Build and push ${{ github.ref_name }} to ${{ env.REGISTRY }}
-        uses: docker/build-push-action@v4
+        uses: docker/build-push-action@v6
         with:
           context: .
           platforms: linux/amd64,linux/arm64

From 18a0b10f3ac5063f38cea8b34e8918fe6763c3c4 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 11:24:26 -0400
Subject: [PATCH 046/107] chore(deps): update dependency @tauri-apps/cli to
 v2.6.2 (#1034)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 94 ++++++++++++++++----------------
 1 file changed, 47 insertions(+), 47 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 68e0316ce..847809aae 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1539,9 +1539,9 @@
       }
     },
     "node_modules/@tauri-apps/cli": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.5.0.tgz",
-      "integrity": "sha512-rAtHqG0Gh/IWLjN2zTf3nZqYqbo81oMbqop56rGTjrlWk9pTTAjkqOjSL9XQLIMZ3RbeVjveCqqCA0s8RnLdMg==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.6.2.tgz",
+      "integrity": "sha512-s1/eyBHxk0wG1blLeOY2IDjgZcxVrkxU5HFL8rNDwjYGr0o7yr3RAtwmuUPhz13NO+xGAL1bJZaLFBdp+5joKg==",
       "dev": true,
       "license": "Apache-2.0 OR MIT",
       "bin": {
@@ -1555,23 +1555,23 @@
         "url": "https://opencollective.com/tauri"
       },
       "optionalDependencies": {
-        "@tauri-apps/cli-darwin-arm64": "2.5.0",
-        "@tauri-apps/cli-darwin-x64": "2.5.0",
-        "@tauri-apps/cli-linux-arm-gnueabihf": "2.5.0",
-        "@tauri-apps/cli-linux-arm64-gnu": "2.5.0",
-        "@tauri-apps/cli-linux-arm64-musl": "2.5.0",
-        "@tauri-apps/cli-linux-riscv64-gnu": "2.5.0",
-        "@tauri-apps/cli-linux-x64-gnu": "2.5.0",
-        "@tauri-apps/cli-linux-x64-musl": "2.5.0",
-        "@tauri-apps/cli-win32-arm64-msvc": "2.5.0",
-        "@tauri-apps/cli-win32-ia32-msvc": "2.5.0",
-        "@tauri-apps/cli-win32-x64-msvc": "2.5.0"
+        "@tauri-apps/cli-darwin-arm64": "2.6.2",
+        "@tauri-apps/cli-darwin-x64": "2.6.2",
+        "@tauri-apps/cli-linux-arm-gnueabihf": "2.6.2",
+        "@tauri-apps/cli-linux-arm64-gnu": "2.6.2",
+        "@tauri-apps/cli-linux-arm64-musl": "2.6.2",
+        "@tauri-apps/cli-linux-riscv64-gnu": "2.6.2",
+        "@tauri-apps/cli-linux-x64-gnu": "2.6.2",
+        "@tauri-apps/cli-linux-x64-musl": "2.6.2",
+        "@tauri-apps/cli-win32-arm64-msvc": "2.6.2",
+        "@tauri-apps/cli-win32-ia32-msvc": "2.6.2",
+        "@tauri-apps/cli-win32-x64-msvc": "2.6.2"
       }
     },
     "node_modules/@tauri-apps/cli-darwin-arm64": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.5.0.tgz",
-      "integrity": "sha512-VuVAeTFq86dfpoBDNYAdtQVLbP0+2EKCHIIhkaxjeoPARR0sLpFHz2zs0PcFU76e+KAaxtEtAJAXGNUc8E1PzQ==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.6.2.tgz",
+      "integrity": "sha512-YlvT+Yb7u2HplyN2Cf/nBplCQARC/I4uedlYHlgtxg6rV7xbo9BvG1jLOo29IFhqA2rOp5w1LtgvVGwsOf2kxw==",
       "cpu": [
         "arm64"
       ],
@@ -1586,9 +1586,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-darwin-x64": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.5.0.tgz",
-      "integrity": "sha512-hUF01sC06cZVa8+I0/VtsHOk9BbO75rd+YdtHJ48xTdcYaQ5QIwL4yZz9OR1AKBTaUYhBam8UX9Pvd5V2/4Dpw==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.6.2.tgz",
+      "integrity": "sha512-21gdPWfv1bP8rkTdCL44in70QcYcPaDM70L+y78N8TkBuC+/+wqnHcwwjzb+mUyck6UoEw2DORagSI/oKKUGJw==",
       "cpu": [
         "x64"
       ],
@@ -1603,9 +1603,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.5.0.tgz",
-      "integrity": "sha512-LQKqttsK252LlqYyX8R02MinUsfFcy3+NZiJwHFgi5Y3+ZUIAED9cSxJkyNtuY5KMnR4RlpgWyLv4P6akN1xhg==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.6.2.tgz",
+      "integrity": "sha512-MW8Y6HqHS5yzQkwGoLk/ZyE1tWpnz/seDoY4INsbvUZdknuUf80yn3H+s6eGKtT/0Bfqon/W9sY7pEkgHRPQgA==",
       "cpu": [
         "arm"
       ],
@@ -1620,9 +1620,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-arm64-gnu": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.5.0.tgz",
-      "integrity": "sha512-mTQufsPcpdHg5RW0zypazMo4L55EfeE5snTzrPqbLX4yCK2qalN7+rnP8O8GT06xhp6ElSP/Ku1M2MR297SByQ==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.6.2.tgz",
+      "integrity": "sha512-9PdINTUtnyrnQt9hvC4y1m0NoxKSw/wUB9OTBAQabPj8WLAdvySWiUpEiqJjwLhlu4T6ltXZRpNTEzous3/RXg==",
       "cpu": [
         "arm64"
       ],
@@ -1637,9 +1637,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-arm64-musl": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.0.tgz",
-      "integrity": "sha512-rQO1HhRUQqyEaal5dUVOQruTRda/TD36s9kv1hTxZiFuSq3558lsTjAcUEnMAtBcBkps20sbyTJNMT0AwYIk8Q==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.6.2.tgz",
+      "integrity": "sha512-LrcJTRr7FrtQlTDkYaRXIGo/8YU/xkWmBPC646WwKNZ/S6yqCiDcOMoPe7Cx4ZvcG6sK6LUCLQMfaSNEL7PT0A==",
       "cpu": [
         "arm64"
       ],
@@ -1654,9 +1654,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-riscv64-gnu": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.5.0.tgz",
-      "integrity": "sha512-7oS18FN46yDxyw1zX/AxhLAd7T3GrLj3Ai6s8hZKd9qFVzrAn36ESL7d3G05s8wEtsJf26qjXnVF4qleS3dYsA==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.6.2.tgz",
+      "integrity": "sha512-GnTshO/BaZ9KGIazz2EiFfXGWgLur5/pjqklRA/ck42PGdUQJhV/Ao7A7TdXPjqAzpFxNo6M/Hx0GCH2iMS7IA==",
       "cpu": [
         "riscv64"
       ],
@@ -1671,9 +1671,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-x64-gnu": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.5.0.tgz",
-      "integrity": "sha512-SG5sFNL7VMmDBdIg3nO3EzNRT306HsiEQ0N90ILe3ZABYAVoPDO/ttpCO37ApLInTzrq/DLN+gOlC/mgZvLw1w==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.6.2.tgz",
+      "integrity": "sha512-QDG3WeJD6UJekmrtVPCJRzlKgn9sGzhvD58oAw5gIU+DRovgmmG2U1jH9fS361oYGjWWO7d/KM9t0kugZzi4lQ==",
       "cpu": [
         "x64"
       ],
@@ -1688,9 +1688,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-x64-musl": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.0.tgz",
-      "integrity": "sha512-QXDM8zp/6v05PNWju5ELsVwF0VH1n6b5pk2E6W/jFbbiwz80Vs1lACl9pv5kEHkrxBj+aWU/03JzGuIj2g3SkQ==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.6.2.tgz",
+      "integrity": "sha512-TNVTDDtnWzuVqWBFdZ4+8ZTg17tc21v+CT5XBQ+KYCoYtCrIaHpW04fS5Tmudi+vYdBwoPDfwpKEB6LhCeFraQ==",
       "cpu": [
         "x64"
       ],
@@ -1705,9 +1705,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-win32-arm64-msvc": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.5.0.tgz",
-      "integrity": "sha512-pFSHFK6b+o9y4Un8w0gGLwVyFTZaC3P0kQ7umRt/BLDkzD5RnQ4vBM7CF8BCU5nkwmEBUCZd7Wt3TWZxe41o6Q==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.6.2.tgz",
+      "integrity": "sha512-z77C1oa/hMLO/jM1JF39tK3M3v9nou7RsBnQoOY54z5WPcpVAbS0XdFhXB7sSN72BOiO3moDky9lQANQz6L3CA==",
       "cpu": [
         "arm64"
       ],
@@ -1722,9 +1722,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-win32-ia32-msvc": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.5.0.tgz",
-      "integrity": "sha512-EArv1IaRlogdLAQyGlKmEqZqm5RfHCUMhJoedWu7GtdbOMUfSAz6FMX2boE1PtEmNO4An+g188flLeVErrxEKg==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.6.2.tgz",
+      "integrity": "sha512-TmD8BbzbjluBw8+QEIWUVmFa9aAluSkT1N937n1mpYLXcPbTpbunqRFiIznTwupoJNJIdtpF/t7BdZDRh5rrcg==",
       "cpu": [
         "ia32"
       ],
@@ -1739,9 +1739,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-win32-x64-msvc": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.5.0.tgz",
-      "integrity": "sha512-lj43EFYbnAta8pd9JnUq87o+xRUR0odz+4rixBtTUwUgdRdwQ2V9CzFtsMu6FQKpFQ6mujRK6P1IEwhL6ADRsQ==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.6.2.tgz",
+      "integrity": "sha512-ItB8RCKk+nCmqOxOvbNtltz6x1A4QX6cSM21kj3NkpcnjT9rHSMcfyf8WVI2fkoMUJR80iqCblUX6ARxC3lj6w==",
       "cpu": [
         "x64"
       ],

From 594fb5666da90f7037d61c4c67deaa202b9d8f8e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 11:25:20 -0400
Subject: [PATCH 047/107] chore(deps): update dependency @playwright/test to
 v1.54.1 (#1038)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 847809aae..7b03e69cf 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1199,13 +1199,13 @@
       "license": "MIT"
     },
     "node_modules/@playwright/test": {
-      "version": "1.53.2",
-      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.2.tgz",
-      "integrity": "sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==",
+      "version": "1.54.1",
+      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz",
+      "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "playwright": "1.53.2"
+        "playwright": "1.54.1"
       },
       "bin": {
         "playwright": "cli.js"
@@ -5085,13 +5085,13 @@
       }
     },
     "node_modules/playwright": {
-      "version": "1.53.2",
-      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz",
-      "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==",
+      "version": "1.54.1",
+      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz",
+      "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "playwright-core": "1.53.2"
+        "playwright-core": "1.54.1"
       },
       "bin": {
         "playwright": "cli.js"
@@ -5104,9 +5104,9 @@
       }
     },
     "node_modules/playwright-core": {
-      "version": "1.53.2",
-      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.2.tgz",
-      "integrity": "sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==",
+      "version": "1.54.1",
+      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz",
+      "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==",
       "dev": true,
       "license": "Apache-2.0",
       "bin": {

From 8c7cbd1d5a52ecf1c5391e84b43966746ccaf00a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 16:16:10 -0400
Subject: [PATCH 048/107] chore(deps): update dependency typescript-eslint to
 v8.37.0 (#1049)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 120 ++++++++++++++++---------------
 1 file changed, 61 insertions(+), 59 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 7b03e69cf..e51839f8b 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1951,17 +1951,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.36.0.tgz",
-      "integrity": "sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz",
+      "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.36.0",
-        "@typescript-eslint/type-utils": "8.36.0",
-        "@typescript-eslint/utils": "8.36.0",
-        "@typescript-eslint/visitor-keys": "8.36.0",
+        "@typescript-eslint/scope-manager": "8.37.0",
+        "@typescript-eslint/type-utils": "8.37.0",
+        "@typescript-eslint/utils": "8.37.0",
+        "@typescript-eslint/visitor-keys": "8.37.0",
         "graphemer": "^1.4.0",
         "ignore": "^7.0.0",
         "natural-compare": "^1.4.0",
@@ -1975,7 +1975,7 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^8.36.0",
+        "@typescript-eslint/parser": "^8.37.0",
         "eslint": "^8.57.0 || ^9.0.0",
         "typescript": ">=4.8.4 <5.9.0"
       }
@@ -1991,16 +1991,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.36.0.tgz",
-      "integrity": "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz",
+      "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.36.0",
-        "@typescript-eslint/types": "8.36.0",
-        "@typescript-eslint/typescript-estree": "8.36.0",
-        "@typescript-eslint/visitor-keys": "8.36.0",
+        "@typescript-eslint/scope-manager": "8.37.0",
+        "@typescript-eslint/types": "8.37.0",
+        "@typescript-eslint/typescript-estree": "8.37.0",
+        "@typescript-eslint/visitor-keys": "8.37.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2016,14 +2016,14 @@
       }
     },
     "node_modules/@typescript-eslint/project-service": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.36.0.tgz",
-      "integrity": "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz",
+      "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/tsconfig-utils": "^8.36.0",
-        "@typescript-eslint/types": "^8.36.0",
+        "@typescript-eslint/tsconfig-utils": "^8.37.0",
+        "@typescript-eslint/types": "^8.37.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2038,14 +2038,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.36.0.tgz",
-      "integrity": "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz",
+      "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.36.0",
-        "@typescript-eslint/visitor-keys": "8.36.0"
+        "@typescript-eslint/types": "8.37.0",
+        "@typescript-eslint/visitor-keys": "8.37.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2056,9 +2056,9 @@
       }
     },
     "node_modules/@typescript-eslint/tsconfig-utils": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.36.0.tgz",
-      "integrity": "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz",
+      "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2073,14 +2073,15 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.36.0.tgz",
-      "integrity": "sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz",
+      "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.36.0",
-        "@typescript-eslint/utils": "8.36.0",
+        "@typescript-eslint/types": "8.37.0",
+        "@typescript-eslint/typescript-estree": "8.37.0",
+        "@typescript-eslint/utils": "8.37.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.1.0"
       },
@@ -2097,9 +2098,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz",
-      "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz",
+      "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2111,16 +2112,16 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz",
-      "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz",
+      "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/project-service": "8.36.0",
-        "@typescript-eslint/tsconfig-utils": "8.36.0",
-        "@typescript-eslint/types": "8.36.0",
-        "@typescript-eslint/visitor-keys": "8.36.0",
+        "@typescript-eslint/project-service": "8.37.0",
+        "@typescript-eslint/tsconfig-utils": "8.37.0",
+        "@typescript-eslint/types": "8.37.0",
+        "@typescript-eslint/visitor-keys": "8.37.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -2179,16 +2180,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.36.0.tgz",
-      "integrity": "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz",
+      "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.7.0",
-        "@typescript-eslint/scope-manager": "8.36.0",
-        "@typescript-eslint/types": "8.36.0",
-        "@typescript-eslint/typescript-estree": "8.36.0"
+        "@typescript-eslint/scope-manager": "8.37.0",
+        "@typescript-eslint/types": "8.37.0",
+        "@typescript-eslint/typescript-estree": "8.37.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2203,13 +2204,13 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz",
-      "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz",
+      "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.36.0",
+        "@typescript-eslint/types": "8.37.0",
         "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
@@ -6035,15 +6036,16 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.36.0.tgz",
-      "integrity": "sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==",
+      "version": "8.37.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.37.0.tgz",
+      "integrity": "sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.36.0",
-        "@typescript-eslint/parser": "8.36.0",
-        "@typescript-eslint/utils": "8.36.0"
+        "@typescript-eslint/eslint-plugin": "8.37.0",
+        "@typescript-eslint/parser": "8.37.0",
+        "@typescript-eslint/typescript-estree": "8.37.0",
+        "@typescript-eslint/utils": "8.37.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"

From bbd1eccce62474dc6ab0035797c7f88293dcd259 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 16:17:01 -0400
Subject: [PATCH 049/107] chore(deps): update eslint monorepo to v9.31.0
 (#1047)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 29 ++++++++---------------------
 1 file changed, 8 insertions(+), 21 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index e51839f8b..ec04cb31a 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -920,9 +920,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.30.1",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz",
-      "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==",
+      "version": "9.31.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz",
+      "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3039,9 +3039,9 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.30.1",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz",
-      "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==",
+      "version": "9.31.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz",
+      "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3049,9 +3049,9 @@
         "@eslint-community/regexpp": "^4.12.1",
         "@eslint/config-array": "^0.21.0",
         "@eslint/config-helpers": "^0.3.0",
-        "@eslint/core": "^0.14.0",
+        "@eslint/core": "^0.15.0",
         "@eslint/eslintrc": "^3.3.1",
-        "@eslint/js": "9.30.1",
+        "@eslint/js": "9.31.0",
         "@eslint/plugin-kit": "^0.3.1",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
@@ -3152,19 +3152,6 @@
         "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/eslint/node_modules/@eslint/core": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
-      "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@types/json-schema": "^7.0.15"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
     "node_modules/espree": {
       "version": "10.4.0",
       "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",

From 044646af8be05cbbc75fb661b5e4f524fcf49788 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 14 Jul 2025 16:17:52 -0400
Subject: [PATCH 050/107] fix(deps): update rust crate duct to v1 (#1048)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 30 +++++++++++++++++------------
 pdl-live-react/src-tauri/Cargo.toml |  2 +-
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 6d6179817..b868354d5 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -1210,14 +1210,14 @@ dependencies = [
 
 [[package]]
 name = "duct"
-version = "0.13.7"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4ab5718d1224b63252cd0c6f74f6480f9ffeb117438a2e0f5cf6d9a4798929c"
+checksum = "b6ce170a0e8454fa0f9b0e5ca38a6ba17ed76a50916839d217eb5357e05cdfde"
 dependencies = [
  "libc",
- "once_cell",
  "os_pipe",
  "shared_child",
+ "shared_thread",
 ]
 
 [[package]]
@@ -1329,7 +1329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
 dependencies = [
  "libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -1390,7 +1390,7 @@ checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78"
 dependencies = [
  "cfg-if",
  "rustix 1.0.7",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -2174,7 +2174,7 @@ dependencies = [
  "js-sys",
  "log",
  "wasm-bindgen",
- "windows-core 0.60.1",
+ "windows-core 0.61.0",
 ]
 
 [[package]]
@@ -2687,7 +2687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
 dependencies = [
  "cfg-if",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -4011,7 +4011,7 @@ dependencies = [
  "once_cell",
  "socket2",
  "tracing",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -4441,7 +4441,7 @@ dependencies = [
  "errno",
  "libc",
  "linux-raw-sys 0.4.15",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -4454,7 +4454,7 @@ dependencies = [
  "errno",
  "libc",
  "linux-raw-sys 0.9.4",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -5232,6 +5232,12 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "shared_thread"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7a6f98357c6bb0ebace19b22220e5543801d9de90ffe77f8abb27c056bac064"
+
 [[package]]
 name = "shell-words"
 version = "1.1.0"
@@ -5869,7 +5875,7 @@ dependencies = [
  "getrandom 0.3.2",
  "once_cell",
  "rustix 1.0.7",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -6851,7 +6857,7 @@ version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
diff --git a/pdl-live-react/src-tauri/Cargo.toml b/pdl-live-react/src-tauri/Cargo.toml
index 068e34605..d06bc85d6 100644
--- a/pdl-live-react/src-tauri/Cargo.toml
+++ b/pdl-live-react/src-tauri/Cargo.toml
@@ -29,7 +29,7 @@ serde = { version = "1", features = ["derive"] }
 serde_json = "1"
 urlencoding = "2.1.3"
 tempfile = "3.16.0"
-duct = "0.13.7"
+duct = "1.0.0"
 rayon = "1.10.0"
 yaml-rust2 = "0.10.0"
 futures = "0.3.31"

From 4a9603e22d95d405e5699b1e3d84d81fa6edc8da Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Mon, 14 Jul 2025 22:08:52 -0400
Subject: [PATCH 051/107] tests: add more test results (#1051)

Signed-off-by: Louis Mandel 
---
 .../src-tauri/tests/cli/model-input-array.2.result           | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 tests/results/pdl-live-react/src-tauri/tests/cli/model-input-array.2.result

diff --git a/tests/results/pdl-live-react/src-tauri/tests/cli/model-input-array.2.result b/tests/results/pdl-live-react/src-tauri/tests/cli/model-input-array.2.result
new file mode 100644
index 000000000..4fd6b0a2a
--- /dev/null
+++ b/tests/results/pdl-live-react/src-tauri/tests/cli/model-input-array.2.result
@@ -0,0 +1,5 @@
+As an assistant living in Europe, I'd be happy to share that the fastest land animal native to this continent is actually the Greyhound dog breed. These dogs are renowned for their incredible speed and agility on the ground. They can reach top speeds of around 45-48 miles per hour (72-77 kilometers per hour), making them one of the fastest animals in Europe.
+
+However, if we consider wild animals, the Cheetah is the fastest land animal globally and can be found in parts of Africa, including regions near the European border with North African countries like Libya and Tunisia. Cheetahs typically reach speeds up to 60-70 miles per hour (97-113 kilometers per hour), but they are not native to Europe.
+
+For a truly European animal, the Greyhound remains the fastest land creature in our region.
\ No newline at end of file

From 70e6427759059ef3064c6a5a1b36c69d4ba2cb8e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 15 Jul 2025 10:39:36 -0400
Subject: [PATCH 052/107] chore(deps): update dependency @types/node to
 v22.16.4 (#1052)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 pdl-live-react/package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index ec04cb31a..50afc7aee 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -36,7 +36,7 @@
         "@eslint/js": "^9.19.0",
         "@playwright/test": "^1.50.0",
         "@tauri-apps/cli": "^2.3.0",
-        "@types/node": "22.16.3",
+        "@types/node": "22.16.4",
         "@types/react": "^18.3.18",
         "@types/react-dom": "^18.3.5",
         "@types/react-syntax-highlighter": "^15.5.13",
@@ -1899,9 +1899,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.16.3",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz",
-      "integrity": "sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==",
+      "version": "22.16.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.4.tgz",
+      "integrity": "sha512-PYRhNtZdm2wH/NT2k/oAJ6/f2VD2N2Dag0lGlx2vWgMSJXGNmlce5MiTQzoWAiIJtso30mjnfQCOKVH+kAQC/g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index 0a4e61d95..ed0fb8d70 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -51,7 +51,7 @@
     "@eslint/js": "^9.19.0",
     "@playwright/test": "^1.50.0",
     "@tauri-apps/cli": "^2.3.0",
-    "@types/node": "22.16.3",
+    "@types/node": "22.16.4",
     "@types/react": "^18.3.18",
     "@types/react-dom": "^18.3.5",
     "@types/react-syntax-highlighter": "^15.5.13",

From fb308a9557070db183568d92b95c155ed38b79c8 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 16 Jul 2025 10:40:47 -0400
Subject: [PATCH 053/107] fix(deps): update dependency granite-io to >=0.5,<0.6
 (#1053)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pyproject.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pyproject.toml b/pyproject.toml
index d9aac6e00..a25b258a1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -17,7 +17,7 @@ dependencies = [
   "termcolor>=2,<4",
   "ipython>=8,<10",
   "json-repair~=0.35",
-  "granite-io>=0.2,<0.5",
+  "granite-io>=0.5,<0.6",
 ]
 authors = [
   { name="Mandana Vaziri", email="mvaziri@us.ibm.com" },

From 8601c1c9f527d0222119a004f0440d178aadbe8f Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Wed, 16 Jul 2025 10:43:21 -0400
Subject: [PATCH 054/107] fix: avoid side effects in PdlContext (#1054)

Signed-off-by: Louis Mandel 
---
 src/pdl/pdl_context.py | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/pdl/pdl_context.py b/src/pdl/pdl_context.py
index be9648f02..26909d109 100644
--- a/src/pdl/pdl_context.py
+++ b/src/pdl/pdl_context.py
@@ -68,16 +68,16 @@ def __init__(self, context: list[PDLContext | dict[str, Any]]):
         for item in context:
             match item:
                 case IndependentContext():
-                    ret += item.context.data
+                    ret = ret + item.context.data
                 case SingletonContext():
-                    ret += [item]
+                    ret = ret + [item]
                 case DependentContext():
                     if len(item) == 0:
                         pass
                     else:
-                        ret += [item]
+                        ret = ret + [item]
                 case dict():
-                    ret += [SingletonContext(item)]
+                    ret = ret + [SingletonContext(item)]
                 case _:
                     assert False
         self.context = PdlList(ret)
@@ -98,7 +98,7 @@ def __getitem__(self, index: int | slice):  # pyright: ignore
 
     def __repr__(self):  # pyright: ignore
         ret = "{"
-        ret += ",".join([i.__repr__() for i in self.context.result()])
+        ret = ret + ",".join([i.__repr__() for i in self.context.result()])
         return ret + "}"
 
 
@@ -110,16 +110,16 @@ def __init__(self, context: list[PDLContext | dict[str, Any]]):
         for item in context:
             match item:
                 case DependentContext():
-                    ret += item.context.data
+                    ret = ret + item.context.data
                 case SingletonContext():
-                    ret += [item]
+                    ret = ret + [item]
                 case IndependentContext():
                     if len(item) == 0:
                         pass
                     else:
-                        ret += [item]
+                        ret = ret + [item]
                 case dict():
-                    ret += [SingletonContext(item)]
+                    ret = ret + [SingletonContext(item)]
                 case _:
                     assert False
         self.context = PdlList(ret)
@@ -138,7 +138,7 @@ def __getitem__(self, index: int | slice):  # pyright: ignore
 
     def __repr__(self):  # pyright: ignore
         ret = "["
-        ret += ",".join([i.__repr__() for i in self.context.result()])
+        ret = ret + ",".join([i.__repr__() for i in self.context.result()])
         return ret + "]"
 
 

From 77dfb4c249da2f5029de017e26e5301fbd32a11c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Jul 2025 09:44:59 -0400
Subject: [PATCH 055/107] fix(deps): update dependency react-router to v7.7.0
 (#1055)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 50afc7aee..6d76e950b 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -5333,9 +5333,9 @@
       }
     },
     "node_modules/react-router": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.3.tgz",
-      "integrity": "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.7.0.tgz",
+      "integrity": "sha512-3FUYSwlvB/5wRJVTL/aavqHmfUKe0+Xm9MllkYgGo9eDwNdkvwlJGjpPxono1kCycLt6AnDTgjmXvK3/B4QGuw==",
       "license": "MIT",
       "dependencies": {
         "cookie": "^1.0.1",

From 825070425431de3ff86f863bfdd215bfca1c0cc0 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Jul 2025 14:53:06 -0400
Subject: [PATCH 056/107] chore(deps): update dependency vite to v7 (#1037)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 50 ++++++++++++++++----------------
 pdl-live-react/package.json      |  2 +-
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 6d76e950b..3b3d663df 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -50,7 +50,7 @@
         "prettier": "^3.4.2",
         "typescript": "5.8",
         "typescript-eslint": "^8.27.0",
-        "vite": "^6.2.3",
+        "vite": "^7.0.0",
         "vite-plugin-html": "^3.2.2"
       }
     },
@@ -3314,9 +3314,9 @@
       }
     },
     "node_modules/fdir": {
-      "version": "6.4.4",
-      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
-      "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+      "version": "6.4.6",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
+      "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
       "dev": true,
       "license": "MIT",
       "peerDependencies": {
@@ -5105,9 +5105,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.5.3",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
-      "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+      "version": "8.5.6",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
       "dev": true,
       "funding": [
         {
@@ -5125,7 +5125,7 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "nanoid": "^3.3.8",
+        "nanoid": "^3.3.11",
         "picocolors": "^1.1.1",
         "source-map-js": "^1.2.1"
       },
@@ -5911,9 +5911,9 @@
       "license": "MIT"
     },
     "node_modules/tinyglobby": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
-      "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
+      "version": "0.2.14",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
+      "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6220,24 +6220,24 @@
       }
     },
     "node_modules/vite": {
-      "version": "6.3.5",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
-      "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.4.tgz",
+      "integrity": "sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "esbuild": "^0.25.0",
-        "fdir": "^6.4.4",
+        "fdir": "^6.4.6",
         "picomatch": "^4.0.2",
-        "postcss": "^8.5.3",
-        "rollup": "^4.34.9",
-        "tinyglobby": "^0.2.13"
+        "postcss": "^8.5.6",
+        "rollup": "^4.40.0",
+        "tinyglobby": "^0.2.14"
       },
       "bin": {
         "vite": "bin/vite.js"
       },
       "engines": {
-        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+        "node": "^20.19.0 || >=22.12.0"
       },
       "funding": {
         "url": "https://github.com/vitejs/vite?sponsor=1"
@@ -6246,14 +6246,14 @@
         "fsevents": "~2.3.3"
       },
       "peerDependencies": {
-        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+        "@types/node": "^20.19.0 || >=22.12.0",
         "jiti": ">=1.21.0",
-        "less": "*",
+        "less": "^4.0.0",
         "lightningcss": "^1.21.0",
-        "sass": "*",
-        "sass-embedded": "*",
-        "stylus": "*",
-        "sugarss": "*",
+        "sass": "^1.70.0",
+        "sass-embedded": "^1.70.0",
+        "stylus": ">=0.54.8",
+        "sugarss": "^5.0.0",
         "terser": "^5.16.0",
         "tsx": "^4.8.1",
         "yaml": "^2.4.2"
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index ed0fb8d70..a0c513579 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -65,7 +65,7 @@
     "prettier": "^3.4.2",
     "typescript": "5.8",
     "typescript-eslint": "^8.27.0",
-    "vite": "^6.2.3",
+    "vite": "^7.0.0",
     "vite-plugin-html": "^3.2.2"
   },
   "prettier": {

From 6ad0a6bbeba33f734982e097cce02eb856a6efa6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Jul 2025 15:34:37 -0400
Subject: [PATCH 057/107] chore(deps): update dependency vite to v7.0.5 (#1056)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 3b3d663df..577fd97e6 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -6220,9 +6220,9 @@
       }
     },
     "node_modules/vite": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.4.tgz",
-      "integrity": "sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==",
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz",
+      "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {

From a3c2d8162c716599af3809ea0b9d55e2b48ff28d Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 21 Jul 2025 11:10:15 -0400
Subject: [PATCH 058/107] chore(deps): update dependency @vitejs/plugin-react
 to v4.7.0 (#1057)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 577fd97e6..edfaa55d3 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1215,9 +1215,9 @@
       }
     },
     "node_modules/@rolldown/pluginutils": {
-      "version": "1.0.0-beta.19",
-      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz",
-      "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==",
+      "version": "1.0.0-beta.27",
+      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
+      "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
       "dev": true,
       "license": "MIT"
     },
@@ -2228,16 +2228,16 @@
       "license": "ISC"
     },
     "node_modules/@vitejs/plugin-react": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz",
-      "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==",
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
+      "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/core": "^7.27.4",
+        "@babel/core": "^7.28.0",
         "@babel/plugin-transform-react-jsx-self": "^7.27.1",
         "@babel/plugin-transform-react-jsx-source": "^7.27.1",
-        "@rolldown/pluginutils": "1.0.0-beta.19",
+        "@rolldown/pluginutils": "1.0.0-beta.27",
         "@types/babel__core": "^7.20.5",
         "react-refresh": "^0.17.0"
       },
@@ -2245,7 +2245,7 @@
         "node": "^14.18.0 || >=16.0.0"
       },
       "peerDependencies": {
-        "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0"
+        "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
       }
     },
     "node_modules/@wooorm/starry-night": {

From 028eb5d16ae3f09eda731f60955471105de7f811 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 21 Jul 2025 11:10:37 -0400
Subject: [PATCH 059/107] fix(deps): update rust crate serde_json to v1.0.141
 (#1058)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index b868354d5..5c2763267 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -5051,9 +5051,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.140"
+version = "1.0.141"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
+checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3"
 dependencies = [
  "indexmap 2.10.0",
  "itoa",

From 3c47e6ef02e686f769ae7ad49c0b6ad3ba0b65a6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 21 Jul 2025 11:10:55 -0400
Subject: [PATCH 060/107] chore(deps): update dependency @types/node to
 v22.16.5 (#1059)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 pdl-live-react/package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index edfaa55d3..b2de8e419 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -36,7 +36,7 @@
         "@eslint/js": "^9.19.0",
         "@playwright/test": "^1.50.0",
         "@tauri-apps/cli": "^2.3.0",
-        "@types/node": "22.16.4",
+        "@types/node": "22.16.5",
         "@types/react": "^18.3.18",
         "@types/react-dom": "^18.3.5",
         "@types/react-syntax-highlighter": "^15.5.13",
@@ -1899,9 +1899,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.16.4",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.4.tgz",
-      "integrity": "sha512-PYRhNtZdm2wH/NT2k/oAJ6/f2VD2N2Dag0lGlx2vWgMSJXGNmlce5MiTQzoWAiIJtso30mjnfQCOKVH+kAQC/g==",
+      "version": "22.16.5",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.5.tgz",
+      "integrity": "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index a0c513579..cdf8d68d7 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -51,7 +51,7 @@
     "@eslint/js": "^9.19.0",
     "@playwright/test": "^1.50.0",
     "@tauri-apps/cli": "^2.3.0",
-    "@types/node": "22.16.4",
+    "@types/node": "22.16.5",
     "@types/react": "^18.3.18",
     "@types/react-dom": "^18.3.5",
     "@types/react-syntax-highlighter": "^15.5.13",

From b4a2744ac35ec261b1ec2181d79cca720429f1ad Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 21 Jul 2025 11:11:16 -0400
Subject: [PATCH 061/107] fix(deps): update dependency @tauri-apps/plugin-fs to
 v2.4.1 (#1060)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index b2de8e419..5409fcfe9 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1765,9 +1765,9 @@
       }
     },
     "node_modules/@tauri-apps/plugin-fs": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.4.0.tgz",
-      "integrity": "sha512-Sp8AdDcbyXyk6LD6Pmdx44SH3LPeNAvxR2TFfq/8CwqzfO1yOyV+RzT8fov0NNN7d9nvW7O7MtMAptJ42YXA5g==",
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.4.1.tgz",
+      "integrity": "sha512-vJlKZVGF3UAFGoIEVT6Oq5L4HGDCD78WmA4uhzitToqYiBKWAvZR61M6zAyQzHqLs0ADemkE4RSy/5sCmZm6ZQ==",
       "license": "MIT OR Apache-2.0",
       "dependencies": {
         "@tauri-apps/api": "^2.6.0"

From 7ea7b42997434b5344ca0825f4e8b820471bc211 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 21 Jul 2025 11:18:22 -0400
Subject: [PATCH 062/107] fix(deps): update dependency
 @tauri-apps/plugin-window-state to v2.4.0 (#1061)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 5409fcfe9..3c69d54d8 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1783,9 +1783,9 @@
       }
     },
     "node_modules/@tauri-apps/plugin-window-state": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-window-state/-/plugin-window-state-2.3.0.tgz",
-      "integrity": "sha512-BfhM0gm6jsF+VyYeOZ3eNqDfRJ2YPMh0a5qesD8AizVGv7wVB3cGLqh6EaeMpGl7y6kP9lvEMYkDRHuqKbcsgw==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-window-state/-/plugin-window-state-2.4.0.tgz",
+      "integrity": "sha512-hRSzPNi2NG0lPFthfVY0V5C1MyWN/gGaQtQYw7i9zZhLzrhZveHZ2omHG1rIiIsjfTGbO7fhjydSoeTTK9GqLw==",
       "license": "MIT OR Apache-2.0",
       "dependencies": {
         "@tauri-apps/api": "^2.6.0"

From 055add889d677a333dcf5a37cc55a76cfbb946b3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 21 Jul 2025 11:19:09 -0400
Subject: [PATCH 063/107] fix(deps): update rust crate
 tauri-plugin-window-state to v2.4.0 (#1062)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 5c2763267..a07c3e4ff 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -5754,9 +5754,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-plugin-window-state"
-version = "2.3.0"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a3d22b21b9cec73601b512a868f7c74f93c044d44fd6ca1c84e9d6afb6b1559"
+checksum = "2d5f6fe3291bfa609c7e0b0ee3bedac294d94c7018934086ce782c1d0f2a468e"
 dependencies = [
  "bitflags 2.9.0",
  "log",

From a854fd5cee61fc4eb4a4272ea438790ab333f10c Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Mon, 21 Jul 2025 11:20:33 -0400
Subject: [PATCH 064/107] tests: update react example (#1001)

Signed-off-by: Louis Mandel 
---
 examples/demo/9-react.pdl                    | 74 +++++++++----------
 examples/demos/react.pdl                     | 75 ++++++++++----------
 tests/results/examples/demo/9-react.0.result |  2 +-
 tests/results/examples/demo/9-react.1.result |  2 +-
 tests/results/examples/demo/9-react.2.result |  2 +-
 tests/results/examples/demo/9-react.3.result |  2 +-
 tests/results/examples/demo/9-react.4.result |  2 +-
 tests/results/examples/demo/9-react.5.result |  2 +-
 tests/results/examples/demo/9-react.6.result |  2 +-
 tests/results/examples/demo/9-react.7.result | 13 ++++
 tests/results/examples/demo/9-react.8.result | 15 ++++
 tests/results/examples/demos/react.0.result  |  2 +-
 tests/results/examples/demos/react.1.result  | 15 ++--
 tests/results/examples/demos/react.2.result  | 13 ++++
 tests/results/examples/demos/react.3.result  | 16 +++++
 tests/results/examples/demos/react.4.result  | 15 ++++
 tests/test_examples_run.py                   | 38 +++++++---
 tests/test_examples_run.yaml                 |  1 +
 18 files changed, 194 insertions(+), 97 deletions(-)
 create mode 100644 tests/results/examples/demo/9-react.7.result
 create mode 100644 tests/results/examples/demo/9-react.8.result
 create mode 100644 tests/results/examples/demos/react.2.result
 create mode 100644 tests/results/examples/demos/react.3.result
 create mode 100644 tests/results/examples/demos/react.4.result

diff --git a/examples/demo/9-react.pdl b/examples/demo/9-react.pdl
index 13621edcd..4225ed076 100644
--- a/examples/demo/9-react.pdl
+++ b/examples/demo/9-react.pdl
@@ -1,31 +1,33 @@
 description: Demonstrating a React program
 defs:
+  Calc:
+    description: Calculator function
+    function:
+        expr:
+          type: string
+          description: Arithmetic expression to calculate
+    return:
+      lang: python
+      code: result = ${ expr }
+  Search:
+    description: Wikipedia search
+    function:
+      topic:
+        type: string
+        description: Topic to search
+    return:
+      lang: python
+      code: |
+        import warnings, wikipedia
+        warnings.simplefilter("ignore")
+        try:
+          result = wikipedia.summary("${ topic }")
+        except wikipedia.WikipediaException as e:
+          result = str(e)
   tools:
     data:
-    - type: function
-      function:
-        name: Calc
-        description: Calculator function
-        parameters:
-          type: object
-          properties:
-            expr:
-              type: string
-              description: Arithmetic expression to calculate
-          required:
-          - expr
-    - type: function
-      function:
-        name: Search
-        description: Wikipedia search
-        parameters:
-          type: object
-          properties:
-            topic:
-              type: string
-              description: Topic to search
-          required:
-          - topic
+    - ${ Calc.signature }
+    - ${ Search.signature }
 text:
 - role: system
   text: You are Granite, developed by IBM. You are a helpful AI assistant with access to the following tools. When a tool is required to answer the user's query, respond with <|tool_call|> followed by a JSON list of tools used. If a tool does not exist in the provided list of tools, notify the user that you do not have the ability to fulfill the request.
@@ -77,19 +79,17 @@ text:
     - "\nObservation: "
     - match: ${ action[0].name }
       with:
-        - case: 'Search'
+        - case: Search
           then:
-            lang: python
-            code: |
-              import warnings, wikipedia
-              warnings.simplefilter("ignore")
-              try:
-                result = wikipedia.summary("${ action[0].arguments.topic }")
-              except wikipedia.WikipediaException as e:
-                result = str(e)
-        - case: 'Calc'
+            call: ${ Search }
+            args:
+              topic: ${ action[0].arguments.topic }
+        - case: Calc
           then:
-            lang: python
-            code: result = ${ action[0].arguments.expr }
+            call: ${ Calc }
+            args:
+              expr: ${ action[0].arguments.expr }
+        - case: Finish
+          then: ${ action[0].arguments.topic }
     - "\n"
-  until: ${ action[0].name == "Finish" }
\ No newline at end of file
+  until: ${ action[0].name == "Finish" }
diff --git a/examples/demos/react.pdl b/examples/demos/react.pdl
index 43b2e2552..4225ed076 100644
--- a/examples/demos/react.pdl
+++ b/examples/demos/react.pdl
@@ -1,30 +1,33 @@
+description: Demonstrating a React program
 defs:
+  Calc:
+    description: Calculator function
+    function:
+        expr:
+          type: string
+          description: Arithmetic expression to calculate
+    return:
+      lang: python
+      code: result = ${ expr }
+  Search:
+    description: Wikipedia search
+    function:
+      topic:
+        type: string
+        description: Topic to search
+    return:
+      lang: python
+      code: |
+        import warnings, wikipedia
+        warnings.simplefilter("ignore")
+        try:
+          result = wikipedia.summary("${ topic }")
+        except wikipedia.WikipediaException as e:
+          result = str(e)
   tools:
     data:
-    - type: function
-      function:
-        name: Calc
-        description: Calculator function
-        parameters:
-          type: object
-          properties:
-            expr:
-              type: string
-              description: Arithmetic expression to calculate
-          required:
-          - expr
-    - type: function
-      function:
-        name: Search
-        description: Wikipedia search
-        parameters:
-          type: object
-          properties:
-            topic:
-              type: string
-              description: Topic to search
-          required:
-          - topic
+    - ${ Calc.signature }
+    - ${ Search.signature }
 text:
 - role: system
   text: You are Granite, developed by IBM. You are a helpful AI assistant with access to the following tools. When a tool is required to answer the user's query, respond with <|tool_call|> followed by a JSON list of tools used. If a tool does not exist in the provided list of tools, notify the user that you do not have the ability to fulfill the request.
@@ -76,19 +79,17 @@ text:
     - "\nObservation: "
     - match: ${ action[0].name }
       with:
-        - case: 'Search'
+        - case: Search
           then:
-            lang: python
-            code: |
-              import warnings, wikipedia
-              warnings.simplefilter("ignore")
-              try:
-                result = wikipedia.summary("${ action[0].arguments.topic }")
-              except wikipedia.WikipediaException as e:
-                result = str(e)
-        - case: 'Calc'
+            call: ${ Search }
+            args:
+              topic: ${ action[0].arguments.topic }
+        - case: Calc
           then:
-            lang: python
-            code: result = ${ action[0].arguments.expr }
+            call: ${ Calc }
+            args:
+              expr: ${ action[0].arguments.expr }
+        - case: Finish
+          then: ${ action[0].arguments.topic }
     - "\n"
-  until: ${ action[0].name == "Finish" }
\ No newline at end of file
+  until: ${ action[0].name == "Finish" }
diff --git a/tests/results/examples/demo/9-react.0.result b/tests/results/examples/demo/9-react.0.result
index 679bcf2cd..040d4961f 100644
--- a/tests/results/examples/demo/9-react.0.result
+++ b/tests/results/examples/demo/9-react.0.result
@@ -11,4 +11,4 @@ Action:
 Observation: 460
 Henry Hudson was born around 1565, so he was approximately 460 years ago.Action:
 [{"name": "Finish", "arguments": {"topic": "460"}}]
-Observation: 
+Observation: 460
diff --git a/tests/results/examples/demo/9-react.1.result b/tests/results/examples/demo/9-react.1.result
index a670f1757..d544ecc82 100644
--- a/tests/results/examples/demo/9-react.1.result
+++ b/tests/results/examples/demo/9-react.1.result
@@ -21,4 +21,4 @@ Action:
 Observation: 460
 In the year 2025, it would be approximately 460 years ago that Henry Hudson was born.Action:
 [{"name": "Finish", "arguments": {"topic": "460"}}]
-Observation: 
+Observation: 460
diff --git a/tests/results/examples/demo/9-react.2.result b/tests/results/examples/demo/9-react.2.result
index 14c95d61f..592094826 100644
--- a/tests/results/examples/demo/9-react.2.result
+++ b/tests/results/examples/demo/9-react.2.result
@@ -23,4 +23,4 @@ Action:
 Observation: 460
 In the year 2025, it would be approximately 460 years ago that Henry Hudson was born.Action:
 [{"name": "Finish", "arguments": {"topic": "460"}}]
-Observation: 
\ No newline at end of file
+Observation: 460
\ No newline at end of file
diff --git a/tests/results/examples/demo/9-react.3.result b/tests/results/examples/demo/9-react.3.result
index a670f1757..d544ecc82 100644
--- a/tests/results/examples/demo/9-react.3.result
+++ b/tests/results/examples/demo/9-react.3.result
@@ -21,4 +21,4 @@ Action:
 Observation: 460
 In the year 2025, it would be approximately 460 years ago that Henry Hudson was born.Action:
 [{"name": "Finish", "arguments": {"topic": "460"}}]
-Observation: 
+Observation: 460
diff --git a/tests/results/examples/demo/9-react.4.result b/tests/results/examples/demo/9-react.4.result
index 679bcf2cd..040d4961f 100644
--- a/tests/results/examples/demo/9-react.4.result
+++ b/tests/results/examples/demo/9-react.4.result
@@ -11,4 +11,4 @@ Action:
 Observation: 460
 Henry Hudson was born around 1565, so he was approximately 460 years ago.Action:
 [{"name": "Finish", "arguments": {"topic": "460"}}]
-Observation: 
+Observation: 460
diff --git a/tests/results/examples/demo/9-react.5.result b/tests/results/examples/demo/9-react.5.result
index 279b584af..4f4a4e534 100644
--- a/tests/results/examples/demo/9-react.5.result
+++ b/tests/results/examples/demo/9-react.5.result
@@ -10,4 +10,4 @@ Henry Hudson was born around 1565. As of 2025, it has been approximately 470 yea
 Observation: 460
 Henry Hudson was born around 1565, which means he was born approximately 460 years ago as of 2025.Action:
 [{"name": "Finish", "arguments": {"topic": ""}}]
-Observation: 
\ No newline at end of file
+Observation: 460
\ No newline at end of file
diff --git a/tests/results/examples/demo/9-react.6.result b/tests/results/examples/demo/9-react.6.result
index ebce142c0..469ab46c5 100644
--- a/tests/results/examples/demo/9-react.6.result
+++ b/tests/results/examples/demo/9-react.6.result
@@ -12,4 +12,4 @@ Henry Hudson was born around 1565. As of 2025, it has been approximately 470 yea
 Observation: 460
 It has been approximately 460 years since Henry Hudson was born.Action:
 [{"name": "Finish", "arguments": {"topic": "460"}}]
-Observation: 
+Observation: 460
diff --git a/tests/results/examples/demo/9-react.7.result b/tests/results/examples/demo/9-react.7.result
new file mode 100644
index 000000000..f9520b25c
--- /dev/null
+++ b/tests/results/examples/demo/9-react.7.result
@@ -0,0 +1,13 @@
+How many years ago was the discoverer of the Hudson River born? Keep in mind we are in 2025. When searching for a birthday for a person, simply ask for the name of that person.
+Thought: I need to find out who discovered the Hudson River and then calculate how many years ago they were born based on the current year, 2025.
+Action:
+[{"name": "Search", "arguments": {"topic": "Henry Hudson"}}]
+Observation: Henry Hudson (c. 1565 – disappeared 23 June 1611) was an English sea explorer and navigator during the early 17th century, best known for his explorations of present-day Canada and parts of the Northeastern United States.
+In 1607 and 1608, Hudson made two attempts on behalf of English merchants to find a rumoured Northeast Passage to Cathay via a route above the Arctic Circle. In 1609, he landed in North America on behalf of the Dutch East India Company and explored the region around the modern New York metropolitan area. Looking for a Northwest Passage to Asia on his ship Halve Maen ("Half Moon"), he sailed up the Hudson River, which was later named after him, and thereby laid the foundation for Dutch colonization of the region. His contributions to the exploration of the New World were significant and lasting. His voyages helped to establish European contact with the native peoples of North America and contributed to the development of trade and commerce. 
+On his final expedition, while still searching for the Northwest Passage, Hudson became the first European to see Hudson Strait and the immense Hudson Bay. In 1611, after wintering on the shore of James Bay, Hudson wanted to press on to the west, but most of his crew mutinied. The mutineers cast Hudson, his son, and six others adrift; what then happened to the Hudsons and their companions is unknown.
+Henry Hudson was born around 1565. As of 2025, it has been approximately 470 years since Henry Hudson's birth.Action:
+[{"name": "Calc", "arguments": {"expr": "2025 - 1565"}}]
+Observation: 460
+It has been approximately 460 years since Henry Hudson was born.Action:
+[{"name": "Finish", "arguments": {"topic": "460"}}]
+Observation: 460
diff --git a/tests/results/examples/demo/9-react.8.result b/tests/results/examples/demo/9-react.8.result
new file mode 100644
index 000000000..a715aadda
--- /dev/null
+++ b/tests/results/examples/demo/9-react.8.result
@@ -0,0 +1,15 @@
+How many years ago was the discoverer of the Hudson River born? Keep in mind we are in 2025. When searching for a birthday for a person, simply ask for the name of that person.
+Thought: I need to find out who discovered the Hudson River and then calculate how many years ago they were born based on the current year, 2025.
+Action:
+[{"name": "Search", "arguments": {"topic": "Henry Hudson"}}]
+Observation: Henry Hudson (c. 1565 – disappeared 23 June 1611) was an English sea explorer and navigator during the early 17th century, best known for his explorations of present-day Canada and parts of the Northeastern United States.
+In 1607 and 1608, Hudson made two attempts on behalf of English merchants to find a rumoured Northeast Passage to Cathay via a route above the Arctic Circle. In 1609, he landed in North America on behalf of the Dutch East India Company and explored the region around the modern New York metropolitan area. Looking for a Northwest Passage to Asia on his ship Halve Maen ("Half Moon"), he sailed up the Hudson River, which was later named after him, and thereby laid the foundation for Dutch colonization of the region. His contributions to the exploration of the New World were significant and lasting. His voyages helped to establish European contact with the native peoples of North America and contributed to the development of trade and commerce. 
+On his final expedition, while still searching for the Northwest Passage, Hudson became the first European to see Hudson Strait and the immense Hudson Bay. In 1611, after wintering on the shore of James Bay, Hudson wanted to press on to the west, but most of his crew mutinied. The mutineers cast Hudson, his son, and six others adrift; what then happened to the Hudsons and their companions is unknown.
+
+
+Henry Hudson was born around 1565. As of 2025, it has been approximately 470 years since Henry Hudson's birth.Action:
+[{"name": "Calc", "arguments": {"expr": "2025 - 1565"}}]
+Observation: 460
+Henry Hudson was born around 1565, so in 2025, it has been approximately 460 years since his birth.Action:
+[{"name": "Finish", "arguments": {"topic": "460"}}]
+Observation: 460
diff --git a/tests/results/examples/demos/react.0.result b/tests/results/examples/demos/react.0.result
index 279b584af..4f4a4e534 100644
--- a/tests/results/examples/demos/react.0.result
+++ b/tests/results/examples/demos/react.0.result
@@ -10,4 +10,4 @@ Henry Hudson was born around 1565. As of 2025, it has been approximately 470 yea
 Observation: 460
 Henry Hudson was born around 1565, which means he was born approximately 460 years ago as of 2025.Action:
 [{"name": "Finish", "arguments": {"topic": ""}}]
-Observation: 
\ No newline at end of file
+Observation: 460
\ No newline at end of file
diff --git a/tests/results/examples/demos/react.1.result b/tests/results/examples/demos/react.1.result
index ec6f7668e..b171b1896 100644
--- a/tests/results/examples/demos/react.1.result
+++ b/tests/results/examples/demos/react.1.result
@@ -1,15 +1,16 @@
- How many years ago was the discoverer of the Hudson River born? Keep in mind we are in 2025. When searching for a birthday for a person, simply ask for the name of that person.
-Thought: I need to find out who discovered the Hudson River and then calculate how many years ago they were born based on the current year, 2025.
+How many years ago was the discoverer of the Hudson River born? Keep in mind we are in 2025. When searching for a birthday for a person, simply ask for the name of that person.
+Thought: I need to search who discovered the Hudson River.
 Action:
 [{"name": "Search", "arguments": {"topic": "Henry Hudson"}}]
 Observation: Henry Hudson (c. 1565 – disappeared 23 June 1611) was an English sea explorer and navigator during the early 17th century, best known for his explorations of present-day Canada and parts of the Northeastern United States.
 In 1607 and 1608, Hudson made two attempts on behalf of English merchants to find a rumoured Northeast Passage to Cathay via a route above the Arctic Circle. In 1609, he landed in North America on behalf of the Dutch East India Company and explored the region around the modern New York metropolitan area. Looking for a Northwest Passage to Asia on his ship Halve Maen ("Half Moon"), he sailed up the Hudson River, which was later named after him, and thereby laid the foundation for Dutch colonization of the region. His contributions to the exploration of the New World were significant and lasting. His voyages helped to establish European contact with the native peoples of North America and contributed to the development of trade and commerce. 
 On his final expedition, while still searching for the Northwest Passage, Hudson became the first European to see Hudson Strait and the immense Hudson Bay. In 1611, after wintering on the shore of James Bay, Hudson wanted to press on to the west, but most of his crew mutinied. The mutineers cast Hudson, his son, and six others adrift; what then happened to the Hudsons and their companions is unknown.
-
-
-Henry Hudson was born around 1565. As of 2025, it has been approximately 470 years since Henry Hudson's birth.Action:
+Thought: Henry Hudson was born around 1565. To find out how many years ago he was born from the year 2025, we subtract 2025 from 1565.
+Calculation: 2025 - 1565 = 460
+Action:
 [{"name": "Calc", "arguments": {"expr": "2025 - 1565"}}]
 Observation: 460
-It has been approximately 460 years since Henry Hudson was born.Action:
+Henry Hudson was born around 460 years before 2025.Action:
 [{"name": "Finish", "arguments": {"topic": "460"}}]
-Observation: 
+Observation: 460
+
diff --git a/tests/results/examples/demos/react.2.result b/tests/results/examples/demos/react.2.result
new file mode 100644
index 000000000..f9520b25c
--- /dev/null
+++ b/tests/results/examples/demos/react.2.result
@@ -0,0 +1,13 @@
+How many years ago was the discoverer of the Hudson River born? Keep in mind we are in 2025. When searching for a birthday for a person, simply ask for the name of that person.
+Thought: I need to find out who discovered the Hudson River and then calculate how many years ago they were born based on the current year, 2025.
+Action:
+[{"name": "Search", "arguments": {"topic": "Henry Hudson"}}]
+Observation: Henry Hudson (c. 1565 – disappeared 23 June 1611) was an English sea explorer and navigator during the early 17th century, best known for his explorations of present-day Canada and parts of the Northeastern United States.
+In 1607 and 1608, Hudson made two attempts on behalf of English merchants to find a rumoured Northeast Passage to Cathay via a route above the Arctic Circle. In 1609, he landed in North America on behalf of the Dutch East India Company and explored the region around the modern New York metropolitan area. Looking for a Northwest Passage to Asia on his ship Halve Maen ("Half Moon"), he sailed up the Hudson River, which was later named after him, and thereby laid the foundation for Dutch colonization of the region. His contributions to the exploration of the New World were significant and lasting. His voyages helped to establish European contact with the native peoples of North America and contributed to the development of trade and commerce. 
+On his final expedition, while still searching for the Northwest Passage, Hudson became the first European to see Hudson Strait and the immense Hudson Bay. In 1611, after wintering on the shore of James Bay, Hudson wanted to press on to the west, but most of his crew mutinied. The mutineers cast Hudson, his son, and six others adrift; what then happened to the Hudsons and their companions is unknown.
+Henry Hudson was born around 1565. As of 2025, it has been approximately 470 years since Henry Hudson's birth.Action:
+[{"name": "Calc", "arguments": {"expr": "2025 - 1565"}}]
+Observation: 460
+It has been approximately 460 years since Henry Hudson was born.Action:
+[{"name": "Finish", "arguments": {"topic": "460"}}]
+Observation: 460
diff --git a/tests/results/examples/demos/react.3.result b/tests/results/examples/demos/react.3.result
new file mode 100644
index 000000000..a4c21f3c9
--- /dev/null
+++ b/tests/results/examples/demos/react.3.result
@@ -0,0 +1,16 @@
+How many years ago was the discoverer of the Hudson River born? Keep in mind we are in 2025. When searching for a birthday for a person, simply ask for the name of that person.
+Thought: I need to search who discovered the Hudson River.
+Action:
+[{"name": "Search", "arguments": {"topic": "Henry Hudson"}}]
+Observation: Henry Hudson (c. 1565 – disappeared 23 June 1611) was an English sea explorer and navigator during the early 17th century, best known for his explorations of present-day Canada and parts of the Northeastern United States.
+In 1607 and 1608, Hudson made two attempts on behalf of English merchants to find a rumoured Northeast Passage to Cathay via a route above the Arctic Circle. In 1609, he landed in North America on behalf of the Dutch East India Company and explored the region around the modern New York metropolitan area. Looking for a Northwest Passage to Asia on his ship Halve Maen ("Half Moon"), he sailed up the Hudson River, which was later named after him, and thereby laid the foundation for Dutch colonization of the region. His contributions to the exploration of the New World were significant and lasting. His voyages helped to establish European contact with the native peoples of North America and contributed to the development of trade and commerce. 
+On his final expedition, while still searching for the Northwest Passage, Hudson became the first European to see Hudson Strait and the immense Hudson Bay. In 1611, after wintering on the shore of James Bay, Hudson wanted to press on to the west, but most of his crew mutinied. The mutineers cast Hudson, his son, and six others adrift; what then happened to the Hudsons and their companions is unknown.
+Thought: Henry Hudson was born around 1565. To find out how many years ago he was born from the year 2025, we subtract 2025 from 1565.
+Calculation: 2025 - 1565 = 460
+Action:
+[{"name": "Calc", "arguments": {"expr": "2025 - 1565"}}]
+Observation: 460
+Henry Hudson was born around 460 years before 2025.Action:
+[{"name": "Finish", "arguments": {"topic": "460"}}]
+Observation: 
+
diff --git a/tests/results/examples/demos/react.4.result b/tests/results/examples/demos/react.4.result
new file mode 100644
index 000000000..469ab46c5
--- /dev/null
+++ b/tests/results/examples/demos/react.4.result
@@ -0,0 +1,15 @@
+How many years ago was the discoverer of the Hudson River born? Keep in mind we are in 2025. When searching for a birthday for a person, simply ask for the name of that person.
+Thought: I need to find out who discovered the Hudson River and then calculate how many years ago they were born based on the current year, 2025.
+Action:
+[{"name": "Search", "arguments": {"topic": "Henry Hudson"}}]
+Observation: Henry Hudson (c. 1565 – disappeared 23 June 1611) was an English sea explorer and navigator during the early 17th century, best known for his explorations of present-day Canada and parts of the Northeastern United States.
+In 1607 and 1608, Hudson made two attempts on behalf of English merchants to find a rumoured Northeast Passage to Cathay via a route above the Arctic Circle. In 1609, he landed in North America on behalf of the Dutch East India Company and explored the region around the modern New York metropolitan area. Looking for a Northwest Passage to Asia on his ship Halve Maen ("Half Moon"), he sailed up the Hudson River, which was later named after him, and thereby laid the foundation for Dutch colonization of the region. His contributions to the exploration of the New World were significant and lasting. His voyages helped to establish European contact with the native peoples of North America and contributed to the development of trade and commerce. 
+On his final expedition, while still searching for the Northwest Passage, Hudson became the first European to see Hudson Strait and the immense Hudson Bay. In 1611, after wintering on the shore of James Bay, Hudson wanted to press on to the west, but most of his crew mutinied. The mutineers cast Hudson, his son, and six others adrift; what then happened to the Hudsons and their companions is unknown.
+
+
+Henry Hudson was born around 1565. As of 2025, it has been approximately 470 years since Henry Hudson's birth.Action:
+[{"name": "Calc", "arguments": {"expr": "2025 - 1565"}}]
+Observation: 460
+It has been approximately 460 years since Henry Hudson was born.Action:
+[{"name": "Finish", "arguments": {"topic": "460"}}]
+Observation: 460
diff --git a/tests/test_examples_run.py b/tests/test_examples_run.py
index fd62b39ff..b0b724f34 100644
--- a/tests/test_examples_run.py
+++ b/tests/test_examples_run.py
@@ -102,8 +102,8 @@ class FailedResults:
     """
 
     wrong_results: Dict[str, str] = field(default_factory=lambda: {})
-    unexpected_parse_error: List[str] = field(default_factory=lambda: [])
-    unexpected_runtime_error: List[str] = field(default_factory=lambda: [])
+    unexpected_parse_error: Dict[str, str] = field(default_factory=lambda: {})
+    unexpected_runtime_error: Dict[str, str] = field(default_factory=lambda: {})
 
 
 # pylint: disable=too-many-instance-attributes
@@ -229,9 +229,11 @@ def __execute_file(self, pdl_file_name: str) -> None:
             exec_result.result = str(output["result"])
             exec_result.error_code = ExecutionErrorCode.NO_ERROR
             pdl.write_trace("/dev/null", output["trace"])
-        except PDLParseError:
+        except PDLParseError as exc:
+            exec_result.result = str(exc)
             exec_result.error_code = ExecutionErrorCode.PARSE_ERROR
-        except Exception:
+        except Exception as exc:
+            exec_result.result = str(exc)
             exec_result.error_code = ExecutionErrorCode.RUNTIME_ERROR
 
         self.execution_results[pdl_file_name] = exec_result
@@ -252,8 +254,8 @@ def validate_expected_and_actual(self) -> None:
         """
 
         wrong_result: Dict[str, str] = {}
-        unexpected_parse_error: List[str] = []
-        unexpected_runtime_error: List[str] = []
+        unexpected_parse_error: Dict[str, str] = {}
+        unexpected_runtime_error: Dict[str, str] = {}
 
         for file in self.check:
             if file not in self.skip:
@@ -264,9 +266,9 @@ def validate_expected_and_actual(self) -> None:
                 if not match:
                     # Check if actual results caused any error
                     if actual_result.error_code == ExecutionErrorCode.PARSE_ERROR:
-                        unexpected_parse_error.append(file)
+                        unexpected_parse_error[file] = str(actual_result.result)
                     elif actual_result.error_code == ExecutionErrorCode.RUNTIME_ERROR:
-                        unexpected_runtime_error.append(file)
+                        unexpected_runtime_error[file] = str(actual_result.result)
                     # If no error, then the results are wrong
                     else:
                         if actual_result.result is not None:
@@ -315,6 +317,26 @@ def test_example_runs(capsys: CaptureFixture[str], monkeypatch: MonkeyPatch) ->
     if background.update_results:
         background.write_results()
 
+    # Print the unexpected parse errors
+    for file, actual in background.failed_results.unexpected_parse_error.items():
+        print(
+            "\n============================================================================"
+        )
+        print(f"File that produced unexpected parse error: {file}")
+        print(
+            f"Error message:\n--------------------------------------------------------------\n{actual}\n-------------------------------------------------------------"
+        )
+
+    # Print the runtime errors
+    for file, actual in background.failed_results.unexpected_runtime_error.items():
+        print(
+            "\n============================================================================"
+        )
+        print(f"File that produced unexpected runtime error: {file}")
+        print(
+            f"Error message:\n--------------------------------------------------------------\n{actual}\n-------------------------------------------------------------"
+        )
+
     # Print the actual results for wrong results
     for file, actual in background.failed_results.wrong_results.items():
         print(
diff --git a/tests/test_examples_run.yaml b/tests/test_examples_run.yaml
index 9518039fa..78ab19b4e 100644
--- a/tests/test_examples_run.yaml
+++ b/tests/test_examples_run.yaml
@@ -1,6 +1,7 @@
 update_results: false
 check: []
 skip:
+  - examples/demos/react.pdl
   - examples/cldk/cldk-assistant.pdl
   - examples/gsm8k/gsm8.pdl
   - examples/gsm8k/gsm8k-plan.pdl

From 74894042875ffd6bd9dfab3c818bd421793bc726 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 22 Jul 2025 11:20:26 -0400
Subject: [PATCH 065/107] fix(deps): update tauri monorepo (#1063)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json    | 100 ++++++++++++++--------------
 pdl-live-react/src-tauri/Cargo.lock |  28 ++++----
 2 files changed, 64 insertions(+), 64 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 3c69d54d8..d934190fb 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1529,9 +1529,9 @@
       ]
     },
     "node_modules/@tauri-apps/api": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.6.0.tgz",
-      "integrity": "sha512-hRNcdercfgpzgFrMXWwNDBN0B7vNzOzRepy6ZAmhxi5mDLVPNrTpo9MGg2tN/F7JRugj4d2aF7E1rtPXAHaetg==",
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.7.0.tgz",
+      "integrity": "sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==",
       "license": "Apache-2.0 OR MIT",
       "funding": {
         "type": "opencollective",
@@ -1539,9 +1539,9 @@
       }
     },
     "node_modules/@tauri-apps/cli": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.6.2.tgz",
-      "integrity": "sha512-s1/eyBHxk0wG1blLeOY2IDjgZcxVrkxU5HFL8rNDwjYGr0o7yr3RAtwmuUPhz13NO+xGAL1bJZaLFBdp+5joKg==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.7.1.tgz",
+      "integrity": "sha512-RcGWR4jOUEl92w3uvI0h61Llkfj9lwGD1iwvDRD2isMrDhOzjeeeVn9aGzeW1jubQ/kAbMYfydcA4BA0Cy733Q==",
       "dev": true,
       "license": "Apache-2.0 OR MIT",
       "bin": {
@@ -1555,23 +1555,23 @@
         "url": "https://opencollective.com/tauri"
       },
       "optionalDependencies": {
-        "@tauri-apps/cli-darwin-arm64": "2.6.2",
-        "@tauri-apps/cli-darwin-x64": "2.6.2",
-        "@tauri-apps/cli-linux-arm-gnueabihf": "2.6.2",
-        "@tauri-apps/cli-linux-arm64-gnu": "2.6.2",
-        "@tauri-apps/cli-linux-arm64-musl": "2.6.2",
-        "@tauri-apps/cli-linux-riscv64-gnu": "2.6.2",
-        "@tauri-apps/cli-linux-x64-gnu": "2.6.2",
-        "@tauri-apps/cli-linux-x64-musl": "2.6.2",
-        "@tauri-apps/cli-win32-arm64-msvc": "2.6.2",
-        "@tauri-apps/cli-win32-ia32-msvc": "2.6.2",
-        "@tauri-apps/cli-win32-x64-msvc": "2.6.2"
+        "@tauri-apps/cli-darwin-arm64": "2.7.1",
+        "@tauri-apps/cli-darwin-x64": "2.7.1",
+        "@tauri-apps/cli-linux-arm-gnueabihf": "2.7.1",
+        "@tauri-apps/cli-linux-arm64-gnu": "2.7.1",
+        "@tauri-apps/cli-linux-arm64-musl": "2.7.1",
+        "@tauri-apps/cli-linux-riscv64-gnu": "2.7.1",
+        "@tauri-apps/cli-linux-x64-gnu": "2.7.1",
+        "@tauri-apps/cli-linux-x64-musl": "2.7.1",
+        "@tauri-apps/cli-win32-arm64-msvc": "2.7.1",
+        "@tauri-apps/cli-win32-ia32-msvc": "2.7.1",
+        "@tauri-apps/cli-win32-x64-msvc": "2.7.1"
       }
     },
     "node_modules/@tauri-apps/cli-darwin-arm64": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.6.2.tgz",
-      "integrity": "sha512-YlvT+Yb7u2HplyN2Cf/nBplCQARC/I4uedlYHlgtxg6rV7xbo9BvG1jLOo29IFhqA2rOp5w1LtgvVGwsOf2kxw==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.7.1.tgz",
+      "integrity": "sha512-j2NXQN6+08G03xYiyKDKqbCV2Txt+hUKg0a8hYr92AmoCU8fgCjHyva/p16lGFGUG3P2Yu0xiNe1hXL9ZuRMzA==",
       "cpu": [
         "arm64"
       ],
@@ -1586,9 +1586,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-darwin-x64": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.6.2.tgz",
-      "integrity": "sha512-21gdPWfv1bP8rkTdCL44in70QcYcPaDM70L+y78N8TkBuC+/+wqnHcwwjzb+mUyck6UoEw2DORagSI/oKKUGJw==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.7.1.tgz",
+      "integrity": "sha512-CdYAefeM35zKsc91qIyKzbaO7FhzTyWKsE8hj7tEJ1INYpoh1NeNNyL/NSEA3Nebi5ilugioJ5tRK8ZXG8y3gw==",
       "cpu": [
         "x64"
       ],
@@ -1603,9 +1603,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.6.2.tgz",
-      "integrity": "sha512-MW8Y6HqHS5yzQkwGoLk/ZyE1tWpnz/seDoY4INsbvUZdknuUf80yn3H+s6eGKtT/0Bfqon/W9sY7pEkgHRPQgA==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.7.1.tgz",
+      "integrity": "sha512-dnvyJrTA1UJxJjQ8q1N/gWomjP8Twij1BUQu2fdcT3OPpqlrbOk5R1yT0oD/721xoKNjroB5BXCsmmlykllxNg==",
       "cpu": [
         "arm"
       ],
@@ -1620,9 +1620,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-arm64-gnu": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.6.2.tgz",
-      "integrity": "sha512-9PdINTUtnyrnQt9hvC4y1m0NoxKSw/wUB9OTBAQabPj8WLAdvySWiUpEiqJjwLhlu4T6ltXZRpNTEzous3/RXg==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.7.1.tgz",
+      "integrity": "sha512-FtBW6LJPNRTws3qyUc294AqCWU91l/H0SsFKq6q4Q45MSS4x6wxLxou8zB53tLDGEPx3JSoPLcDaSfPlSbyujQ==",
       "cpu": [
         "arm64"
       ],
@@ -1637,9 +1637,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-arm64-musl": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.6.2.tgz",
-      "integrity": "sha512-LrcJTRr7FrtQlTDkYaRXIGo/8YU/xkWmBPC646WwKNZ/S6yqCiDcOMoPe7Cx4ZvcG6sK6LUCLQMfaSNEL7PT0A==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.7.1.tgz",
+      "integrity": "sha512-/HXY0t4FHkpFzjeYS5c16mlA6z0kzn5uKLWptTLTdFSnYpr8FCnOP4Sdkvm2TDQPF2ERxXtNCd+WR/jQugbGnA==",
       "cpu": [
         "arm64"
       ],
@@ -1654,9 +1654,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-riscv64-gnu": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.6.2.tgz",
-      "integrity": "sha512-GnTshO/BaZ9KGIazz2EiFfXGWgLur5/pjqklRA/ck42PGdUQJhV/Ao7A7TdXPjqAzpFxNo6M/Hx0GCH2iMS7IA==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.7.1.tgz",
+      "integrity": "sha512-GeW5lVI2GhhnaYckiDzstG2j2Jwlud5d2XefRGwlOK+C/bVGLT1le8MNPYK8wgRlpeK8fG1WnJJYD6Ke7YQ8bg==",
       "cpu": [
         "riscv64"
       ],
@@ -1671,9 +1671,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-x64-gnu": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.6.2.tgz",
-      "integrity": "sha512-QDG3WeJD6UJekmrtVPCJRzlKgn9sGzhvD58oAw5gIU+DRovgmmG2U1jH9fS361oYGjWWO7d/KM9t0kugZzi4lQ==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.7.1.tgz",
+      "integrity": "sha512-DprxKQkPxIPYwUgg+cscpv2lcIUhn2nxEPlk0UeaiV9vATxCXyytxr1gLcj3xgjGyNPlM0MlJyYaPy1JmRg1cA==",
       "cpu": [
         "x64"
       ],
@@ -1688,9 +1688,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-linux-x64-musl": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.6.2.tgz",
-      "integrity": "sha512-TNVTDDtnWzuVqWBFdZ4+8ZTg17tc21v+CT5XBQ+KYCoYtCrIaHpW04fS5Tmudi+vYdBwoPDfwpKEB6LhCeFraQ==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.7.1.tgz",
+      "integrity": "sha512-KLlq3kOK7OUyDR757c0zQjPULpGZpLhNB0lZmZpHXvoOUcqZoCXJHh4dT/mryWZJp5ilrem5l8o9ngrDo0X1AA==",
       "cpu": [
         "x64"
       ],
@@ -1705,9 +1705,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-win32-arm64-msvc": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.6.2.tgz",
-      "integrity": "sha512-z77C1oa/hMLO/jM1JF39tK3M3v9nou7RsBnQoOY54z5WPcpVAbS0XdFhXB7sSN72BOiO3moDky9lQANQz6L3CA==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.7.1.tgz",
+      "integrity": "sha512-dH7KUjKkSypCeWPiainHyXoES3obS+JIZVoSwSZfKq2gWgs48FY3oT0hQNYrWveE+VR4VoR3b/F3CPGbgFvksA==",
       "cpu": [
         "arm64"
       ],
@@ -1722,9 +1722,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-win32-ia32-msvc": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.6.2.tgz",
-      "integrity": "sha512-TmD8BbzbjluBw8+QEIWUVmFa9aAluSkT1N937n1mpYLXcPbTpbunqRFiIznTwupoJNJIdtpF/t7BdZDRh5rrcg==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.7.1.tgz",
+      "integrity": "sha512-1oeibfyWQPVcijOrTg709qhbXArjX3x1MPjrmA5anlygwrbByxLBcLXvotcOeULFcnH2FYUMMLLant8kgvwE5A==",
       "cpu": [
         "ia32"
       ],
@@ -1739,9 +1739,9 @@
       }
     },
     "node_modules/@tauri-apps/cli-win32-x64-msvc": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.6.2.tgz",
-      "integrity": "sha512-ItB8RCKk+nCmqOxOvbNtltz6x1A4QX6cSM21kj3NkpcnjT9rHSMcfyf8WVI2fkoMUJR80iqCblUX6ARxC3lj6w==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.7.1.tgz",
+      "integrity": "sha512-D7Q9kDObutuirCNLxYQ7KAg2Xxg99AjcdYz/KuMw5HvyEPbkC9Q7JL0vOrQOrHEHxIQ2lYzFOZvKKoC2yyqXcg==",
       "cpu": [
         "x64"
       ],
diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index a07c3e4ff..5e6988c88 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -5574,9 +5574,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
 
 [[package]]
 name = "tauri"
-version = "2.6.2"
+version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "124e129c9c0faa6bec792c5948c89e86c90094133b0b9044df0ce5f0a8efaa0d"
+checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7"
 dependencies = [
  "anyhow",
  "bytes",
@@ -5624,9 +5624,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-build"
-version = "2.3.0"
+version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12f025c389d3adb83114bec704da973142e82fc6ec799c7c750c5e21cefaec83"
+checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064"
 dependencies = [
  "anyhow",
  "cargo_toml",
@@ -5646,9 +5646,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-codegen"
-version = "2.3.0"
+version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5df493a1075a241065bc865ed5ef8d0fbc1e76c7afdc0bf0eccfaa7d4f0e406"
+checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a"
 dependencies = [
  "base64 0.22.1",
  "brotli",
@@ -5673,9 +5673,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-macros"
-version = "2.3.1"
+version = "2.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f237fbea5866fa5f2a60a21bea807a2d6e0379db070d89c3a10ac0f2d4649bbc"
+checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e"
 dependencies = [
  "heck 0.5.0",
  "proc-macro2",
@@ -5769,9 +5769,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-runtime"
-version = "2.7.0"
+version = "2.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e7bb73d1bceac06c20b3f755b2c8a2cb13b20b50083084a8cf3700daf397ba4"
+checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676"
 dependencies = [
  "cookie",
  "dpi",
@@ -5791,9 +5791,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-runtime-wry"
-version = "2.7.1"
+version = "2.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "902b5aa9035e16f342eb64f8bf06ccdc2808e411a2525ed1d07672fa4e780bad"
+checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439"
 dependencies = [
  "gtk",
  "http",
@@ -5818,9 +5818,9 @@ dependencies = [
 
 [[package]]
 name = "tauri-utils"
-version = "2.5.0"
+version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41743bbbeb96c3a100d234e5a0b60a46d5aa068f266160862c7afdbf828ca02e"
+checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e"
 dependencies = [
  "anyhow",
  "brotli",

From 58619cb551cca2e6ca623bb5e43c9919146b764d Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 22 Jul 2025 11:20:52 -0400
Subject: [PATCH 066/107] chore(deps): update dependency typescript-eslint to
 v8.38.0 (#1064)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 122 +++++++++++++++----------------
 1 file changed, 61 insertions(+), 61 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index d934190fb..e889ab4df 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1951,17 +1951,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz",
-      "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz",
+      "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.37.0",
-        "@typescript-eslint/type-utils": "8.37.0",
-        "@typescript-eslint/utils": "8.37.0",
-        "@typescript-eslint/visitor-keys": "8.37.0",
+        "@typescript-eslint/scope-manager": "8.38.0",
+        "@typescript-eslint/type-utils": "8.38.0",
+        "@typescript-eslint/utils": "8.38.0",
+        "@typescript-eslint/visitor-keys": "8.38.0",
         "graphemer": "^1.4.0",
         "ignore": "^7.0.0",
         "natural-compare": "^1.4.0",
@@ -1975,7 +1975,7 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^8.37.0",
+        "@typescript-eslint/parser": "^8.38.0",
         "eslint": "^8.57.0 || ^9.0.0",
         "typescript": ">=4.8.4 <5.9.0"
       }
@@ -1991,16 +1991,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz",
-      "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz",
+      "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.37.0",
-        "@typescript-eslint/types": "8.37.0",
-        "@typescript-eslint/typescript-estree": "8.37.0",
-        "@typescript-eslint/visitor-keys": "8.37.0",
+        "@typescript-eslint/scope-manager": "8.38.0",
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/typescript-estree": "8.38.0",
+        "@typescript-eslint/visitor-keys": "8.38.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2016,14 +2016,14 @@
       }
     },
     "node_modules/@typescript-eslint/project-service": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz",
-      "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
+      "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/tsconfig-utils": "^8.37.0",
-        "@typescript-eslint/types": "^8.37.0",
+        "@typescript-eslint/tsconfig-utils": "^8.38.0",
+        "@typescript-eslint/types": "^8.38.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2038,14 +2038,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz",
-      "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
+      "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.37.0",
-        "@typescript-eslint/visitor-keys": "8.37.0"
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/visitor-keys": "8.38.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2056,9 +2056,9 @@
       }
     },
     "node_modules/@typescript-eslint/tsconfig-utils": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz",
-      "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
+      "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2073,15 +2073,15 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz",
-      "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz",
+      "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.37.0",
-        "@typescript-eslint/typescript-estree": "8.37.0",
-        "@typescript-eslint/utils": "8.37.0",
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/typescript-estree": "8.38.0",
+        "@typescript-eslint/utils": "8.38.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.1.0"
       },
@@ -2098,9 +2098,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz",
-      "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
+      "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2112,16 +2112,16 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz",
-      "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
+      "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/project-service": "8.37.0",
-        "@typescript-eslint/tsconfig-utils": "8.37.0",
-        "@typescript-eslint/types": "8.37.0",
-        "@typescript-eslint/visitor-keys": "8.37.0",
+        "@typescript-eslint/project-service": "8.38.0",
+        "@typescript-eslint/tsconfig-utils": "8.38.0",
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/visitor-keys": "8.38.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -2180,16 +2180,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz",
-      "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
+      "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.7.0",
-        "@typescript-eslint/scope-manager": "8.37.0",
-        "@typescript-eslint/types": "8.37.0",
-        "@typescript-eslint/typescript-estree": "8.37.0"
+        "@typescript-eslint/scope-manager": "8.38.0",
+        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/typescript-estree": "8.38.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2204,13 +2204,13 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz",
-      "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
+      "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.37.0",
+        "@typescript-eslint/types": "8.38.0",
         "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
@@ -6023,16 +6023,16 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.37.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.37.0.tgz",
-      "integrity": "sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz",
+      "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.37.0",
-        "@typescript-eslint/parser": "8.37.0",
-        "@typescript-eslint/typescript-estree": "8.37.0",
-        "@typescript-eslint/utils": "8.37.0"
+        "@typescript-eslint/eslint-plugin": "8.38.0",
+        "@typescript-eslint/parser": "8.38.0",
+        "@typescript-eslint/typescript-estree": "8.38.0",
+        "@typescript-eslint/utils": "8.38.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"

From 0ea25f2b63c9e429b88837460058e295e2ceac68 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 23 Jul 2025 12:32:03 -0400
Subject: [PATCH 067/107] fix(deps): update dependency
 @patternfly/react-code-editor to v6.3.0 (#1065)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 54 ++++++++++++++++----------------
 1 file changed, 27 insertions(+), 27 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index e889ab4df..add81b4a9 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1141,61 +1141,61 @@
       }
     },
     "node_modules/@patternfly/react-code-editor": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-code-editor/-/react-code-editor-6.2.2.tgz",
-      "integrity": "sha512-KPnkNP769afD2rvoNQtgCx+SYscamM5QSRmw2FJ9QPHVMksarwTsMvrdMxvu+n6Dhs/T40vQLU5UR7X2yPrURg==",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-code-editor/-/react-code-editor-6.3.0.tgz",
+      "integrity": "sha512-2G0LId2KuuMcFZJRLDcRMfMHWRFG/sbMPXyD8yIi/2LPtAh/JFHbbDCzQXveQzaFhwXxVyVdCrCmbgn4SDYDlQ==",
       "license": "MIT",
       "dependencies": {
         "@monaco-editor/react": "^4.6.0",
-        "@patternfly/react-core": "^6.2.2",
-        "@patternfly/react-icons": "^6.2.2",
-        "@patternfly/react-styles": "^6.2.2",
+        "@patternfly/react-core": "^6.3.0",
+        "@patternfly/react-icons": "^6.3.0",
+        "@patternfly/react-styles": "^6.3.0",
         "react-dropzone": "14.3.5",
         "tslib": "^2.8.1"
       },
       "peerDependencies": {
-        "react": "^17 || ^18",
-        "react-dom": "^17 || ^18"
+        "react": "^17 || ^18 || ^19",
+        "react-dom": "^17 || ^18 || ^19"
       }
     },
     "node_modules/@patternfly/react-core": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.2.2.tgz",
-      "integrity": "sha512-JUrZ57JQ4bkmed1kxaciXb0ZpIVYyCHc2HjtzoKQ5UNRlx204zR2isATSHjdw2GFcWvwpkC5/fU2BR+oT3opbg==",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.0.tgz",
+      "integrity": "sha512-TM+pLwLd5DzaDlOQhqeju9H9QUFQypQiNwXQLNIxOV5r3fmKh4NTp2Av/8WmFkpCj8mejDOfp4TNxoU1zdjCkQ==",
       "license": "MIT",
       "dependencies": {
-        "@patternfly/react-icons": "^6.2.2",
-        "@patternfly/react-styles": "^6.2.2",
-        "@patternfly/react-tokens": "^6.2.2",
+        "@patternfly/react-icons": "^6.3.0",
+        "@patternfly/react-styles": "^6.3.0",
+        "@patternfly/react-tokens": "^6.3.0",
         "focus-trap": "7.6.4",
         "react-dropzone": "^14.3.5",
         "tslib": "^2.8.1"
       },
       "peerDependencies": {
-        "react": "^17 || ^18",
-        "react-dom": "^17 || ^18"
+        "react": "^17 || ^18 || ^19",
+        "react-dom": "^17 || ^18 || ^19"
       }
     },
     "node_modules/@patternfly/react-icons": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-6.2.2.tgz",
-      "integrity": "sha512-XkBwzuV/uiolX+T6QgB3RIqphM1m+vAZjAe3McYtyY22j1rsOdlWDE4RtRrJ1q7EoIZwyZHj0h8T9vMfUsLn4Q==",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-6.3.0.tgz",
+      "integrity": "sha512-W39JyqKW1UL6/YGuinDnpjbhmmLAfuxVrgDcdFBaK4D7D1iqkkqrDMV8zIzmV/RkodJ79xRnucYhYb2RukG4RA==",
       "license": "MIT",
       "peerDependencies": {
-        "react": "^17 || ^18",
-        "react-dom": "^17 || ^18"
+        "react": "^17 || ^18 || ^19",
+        "react-dom": "^17 || ^18 || ^19"
       }
     },
     "node_modules/@patternfly/react-styles": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-6.2.2.tgz",
-      "integrity": "sha512-rncRDq66H8VnLyb9DrHHlZtPddlpNL9+W0XuQC0L7F6p78hOwSZmoGTW2Vq8/wJplDj8h/61qRpfRF9VEYPW0g==",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-6.3.0.tgz",
+      "integrity": "sha512-FvuyNsY2oN8f2dvCl4Hx8CxBWCIF3BC9JE3Ay1lCuVqY1WYkvW4AQn3/0WVRINCxB9FkQxVNkSjARdwHNCEulw==",
       "license": "MIT"
     },
     "node_modules/@patternfly/react-tokens": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-6.2.2.tgz",
-      "integrity": "sha512-2GRWDPBTrcTlGNFc5NPJjrjEVU90RpgcGX/CIe2MplLgM32tpVIkeUtqIoJPLRk5GrbhyFuHJYRU+O93gU4o3Q==",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-6.3.0.tgz",
+      "integrity": "sha512-yWStfkbxg4RWAExFKS/JRGScyadOy35yr4DFispNeHrkZWMp4pwKf0VdwlQZ7+ZtSgEWtzzy1KFxMLmWh3mEqA==",
       "license": "MIT"
     },
     "node_modules/@playwright/test": {

From 842cb1eb761ecd9338bf2e842d4877f947ba2020 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 23 Jul 2025 12:32:20 -0400
Subject: [PATCH 068/107] fix(deps): update dependency @patternfly/react-core
 to v6.3.0 (#1066)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

From 5ac25d71cebb4801820f06010b403ff97dbeff44 Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Wed, 23 Jul 2025 16:50:25 -0400
Subject: [PATCH 069/107] tests: update calc example to use `.signature`
 (#1067)

Signed-off-by: Louis Mandel 
---
 examples/tools/calc.pdl | 34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/examples/tools/calc.pdl b/examples/tools/calc.pdl
index 2405f3c40..38094f3dc 100644
--- a/examples/tools/calc.pdl
+++ b/examples/tools/calc.pdl
@@ -1,16 +1,20 @@
 description: tool use
 defs:
+  calc:
+    description: Calculator function
+    function:
+      expr:
+        type: string
+        description: Arithmetic expression to calculate
+    return:
+      lang: python
+      code: result = ${ expr }
   tools:
-    data:
-    - name: calc
-      description: Calculator function
-      arguments:
-        expr:
-          type: string
-          description: Arithmetic expression to calculate
+    array:
+      - ${ calc.signature }
 text:
 - role: system
-  text: You are Granite, developed by IBM. You are a helpful AI assistant with access to the following tools. When a tool is required to answer the user's query, respond with <|tool_call|> followed by a JSON list of tools used. If a tool does not exist in the provided list of tools, notify the user that you do not have the ability to fulfill the request.
+  text: You are Granite, developed by IBM. You are a helpful AI assistant with access to the following tools.
   contribute: [context]
 - role: tools
   content:
@@ -21,11 +25,11 @@ text:
   model: ollama_chat/granite3.2:8b
   parser: json
   spec: [{ name: string, arguments: { expr: string }}]
-  parameters:
-    drop_params: true  # This is needed because the model does not support structured decoding. It directs LiteLLM to ignore parameters sent for structured decoding.
 - "\n"
-- if: ${ actions[0].name == "calc" }
-  then:
-    text:
-    - lang: python
-      code: result = ${ actions[0].arguments.expr }
\ No newline at end of file
+- match: ${ actions[0].name }
+  with:
+  - case: calc
+    then:
+      call: ${ calc }
+      args: 
+        expr: ${ actions[0].arguments.expr }
\ No newline at end of file

From 11484cd1b8421c4f7b40c2bd43eb85c38e3c5b8b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 24 Jul 2025 09:25:18 -0400
Subject: [PATCH 070/107] chore(deps): update dependency vite to v7.0.6 (#1068)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index add81b4a9..084287927 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -5060,9 +5060,9 @@
       "license": "ISC"
     },
     "node_modules/picomatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
-      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6220,15 +6220,15 @@
       }
     },
     "node_modules/vite": {
-      "version": "7.0.5",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz",
-      "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==",
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz",
+      "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "esbuild": "^0.25.0",
         "fdir": "^6.4.6",
-        "picomatch": "^4.0.2",
+        "picomatch": "^4.0.3",
         "postcss": "^8.5.6",
         "rollup": "^4.40.0",
         "tinyglobby": "^0.2.14"

From ef67864585526c33a60a17c8aaf24e5ad285749a Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Fri, 25 Jul 2025 09:23:00 -0400
Subject: [PATCH 071/107] fix: output streaming in case of fallback (#1071)

Signed-off-by: Louis Mandel 
---
 src/pdl/pdl_interpreter.py |  6 ++++++
 tests/test_fallback.py     | 12 ++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py
index d5b0f76e5..8d673570c 100644
--- a/src/pdl/pdl_interpreter.py
+++ b/src/pdl/pdl_interpreter.py
@@ -453,6 +453,12 @@ def process_advanced_block(
                 if block.trace_error_on_retry:
                     scope = set_error_to_scope_for_retry(scope, error, block.pdl__id)
                 continue
+            state = init_state.with_yield_result(
+                init_state.yield_result and ContributeTarget.RESULT in block.contribute
+            )
+            state = state.with_yield_background(
+                state.yield_background and context_in_contribute(block)
+            )
             (
                 result,
                 background,
diff --git a/tests/test_fallback.py b/tests/test_fallback.py
index bc33cfbef..6bd3934b1 100644
--- a/tests/test_fallback.py
+++ b/tests/test_fallback.py
@@ -76,3 +76,15 @@ def test_type_checking_in_fallback():
         str(exc.value.message)
         == "Type errors during spec checking:\nline 4 - Error should be of type "
     )
+
+
+def test_fallback_and_parser():
+    prog_str = """
+model: "raise an error"
+parser: json
+spec: { xxx: string, age: integer}
+fallback:
+    data: { "xxx": "rosa", "age": 3 }
+"""
+    result = exec_str(prog_str)
+    assert result == {"xxx": "rosa", "age": 3}

From d315ded6b7ffbe1ce507d3c1f6e321f191237d01 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 28 Jul 2025 09:12:55 -0400
Subject: [PATCH 072/107] fix(deps): update rust crate tokio to v1.47.0 (#1074)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 30 +++++++++++++++++++----------
 1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 5e6988c88..3aec4c15d 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -1174,7 +1174,7 @@ checksum = "e5766087c2235fec47fafa4cfecc81e494ee679d0fd4a59887ea0919bfb0e4fc"
 dependencies = [
  "cfg-if",
  "libc",
- "socket2",
+ "socket2 0.5.9",
  "windows-sys 0.48.0",
 ]
 
@@ -2156,7 +2156,7 @@ dependencies = [
  "libc",
  "percent-encoding",
  "pin-project-lite",
- "socket2",
+ "socket2 0.5.9",
  "tokio",
  "tower-service",
  "tracing",
@@ -2687,7 +2687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
 dependencies = [
  "cfg-if",
- "windows-targets 0.52.6",
+ "windows-targets 0.48.5",
 ]
 
 [[package]]
@@ -3973,7 +3973,7 @@ dependencies = [
  "quinn-udp",
  "rustc-hash",
  "rustls",
- "socket2",
+ "socket2 0.5.9",
  "thiserror 2.0.12",
  "tokio",
  "tracing",
@@ -4009,7 +4009,7 @@ dependencies = [
  "cfg_aliases 0.2.1",
  "libc",
  "once_cell",
- "socket2",
+ "socket2 0.5.9",
  "tracing",
  "windows-sys 0.59.0",
 ]
@@ -4718,7 +4718,7 @@ dependencies = [
  "sha-1",
  "sha2",
  "sha3",
- "socket2",
+ "socket2 0.5.9",
  "system-configuration",
  "termios",
  "ucd",
@@ -5302,6 +5302,16 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
+[[package]]
+name = "socket2"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
+dependencies = [
+ "libc",
+ "windows-sys 0.59.0",
+]
+
 [[package]]
 name = "softbuffer"
 version = "0.4.6"
@@ -6018,9 +6028,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.46.1"
+version = "1.47.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17"
+checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35"
 dependencies = [
  "backtrace",
  "bytes",
@@ -6031,9 +6041,9 @@ dependencies = [
  "pin-project-lite",
  "signal-hook-registry",
  "slab",
- "socket2",
+ "socket2 0.6.0",
  "tokio-macros",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]

From 374d7d388e8dc8638e3b209dec85481046c7c03c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 28 Jul 2025 09:13:10 -0400
Subject: [PATCH 073/107] fix(deps): update dependency ts-pattern to v5.8.0
 (#1073)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 084287927..9f3d36c48 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -5984,9 +5984,9 @@
       }
     },
     "node_modules/ts-pattern": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.7.1.tgz",
-      "integrity": "sha512-EGs8PguQqAAUIcQfK4E9xdXxB6s2GK4sJfT/vcc9V1ELIvC4LH/zXu2t/5fajtv6oiRCxdv7BgtVK3vWgROxag==",
+      "version": "5.8.0",
+      "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.8.0.tgz",
+      "integrity": "sha512-kIjN2qmWiHnhgr5DAkAafF9fwb0T5OhMVSWrm8XEdTFnX6+wfXwYOFjeF86UZ54vduqiR7BfqScFmXSzSaH8oA==",
       "license": "MIT"
     },
     "node_modules/tslib": {

From 65a90b94fc42fe12dc7b4cc7f64fdda72bed02e4 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 28 Jul 2025 09:13:32 -0400
Subject: [PATCH 074/107] chore(deps): update eslint monorepo to v9.32.0
 (#1072)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 9f3d36c48..6d9415de0 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -920,9 +920,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.31.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz",
-      "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==",
+      "version": "9.32.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz",
+      "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -943,9 +943,9 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz",
-      "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==",
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz",
+      "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -3039,9 +3039,9 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.31.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz",
-      "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==",
+      "version": "9.32.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz",
+      "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3051,8 +3051,8 @@
         "@eslint/config-helpers": "^0.3.0",
         "@eslint/core": "^0.15.0",
         "@eslint/eslintrc": "^3.3.1",
-        "@eslint/js": "9.31.0",
-        "@eslint/plugin-kit": "^0.3.1",
+        "@eslint/js": "9.32.0",
+        "@eslint/plugin-kit": "^0.3.4",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@humanwhocodes/retry": "^0.4.2",

From 49f86a395c44f97580fbb43ad22b6e1efd65bc62 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 28 Jul 2025 09:13:54 -0400
Subject: [PATCH 075/107] fix(deps): update dependency react-router to v7.7.1
 (#1069)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 6d9415de0..32ec86603 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -5333,9 +5333,9 @@
       }
     },
     "node_modules/react-router": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.7.0.tgz",
-      "integrity": "sha512-3FUYSwlvB/5wRJVTL/aavqHmfUKe0+Xm9MllkYgGo9eDwNdkvwlJGjpPxono1kCycLt6AnDTgjmXvK3/B4QGuw==",
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.7.1.tgz",
+      "integrity": "sha512-jVKHXoWRIsD/qS6lvGveckwb862EekvapdHJN/cGmzw40KnJH5gg53ujOJ4qX6EKIK9LSBfFed/xiQ5yeXNrUA==",
       "license": "MIT",
       "dependencies": {
         "cookie": "^1.0.1",

From 642ce4412629a7c34631d5e731d43dfd139d15b5 Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Mon, 28 Jul 2025 15:55:20 -0400
Subject: [PATCH 076/107] feat: make PDL functions callable as Python and jinja
 functions (#1070)

Signed-off-by: Louis Mandel 
---
 src/pdl/pdl_ast.py          |   5 +-
 src/pdl/pdl_interpreter.py  | 103 +++++++++++++++++++++++++--------
 tests/test_function.py      | 110 +++++++++++++++++++++++++++++++++++-
 tests/test_line_table.py    |   4 +-
 tests/test_type_checking.py |  20 +++++++
 5 files changed, 213 insertions(+), 29 deletions(-)

diff --git a/src/pdl/pdl_ast.py b/src/pdl/pdl_ast.py
index 396fe7570..cc6b03a8e 100644
--- a/src/pdl/pdl_ast.py
+++ b/src/pdl/pdl_ast.py
@@ -24,7 +24,6 @@
     RootModel,
     TypeAdapter,
 )
-from pydantic.json_schema import SkipJsonSchema
 from typing_extensions import TypeAliasType
 
 from .pdl_context import PDLContext
@@ -319,6 +318,7 @@ class Block(BaseModel):
         extra="forbid",
         use_attribute_docstrings=True,
         arbitrary_types_allowed=True,
+        validate_by_name=True,
     )
 
     description: Optional[str] = None
@@ -398,9 +398,6 @@ class FunctionBlock(LeafBlock):
     """Function signature computed from the function definition.
     """
 
-    # Field for internal use
-    pdl__scope: SkipJsonSchema[Optional[ScopeType]] = Field(default=None, repr=False)
-
 
 class CallBlock(LeafBlock):
     """Calling a function."""
diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py
index 8d673570c..dc1281b51 100644
--- a/src/pdl/pdl_interpreter.py
+++ b/src/pdl/pdl_interpreter.py
@@ -17,7 +17,7 @@
 warnings.filterwarnings("ignore", "Valid config keys have changed in V2")
 
 from pathlib import Path  # noqa: E402
-from typing import Any, Generator, Optional, Sequence, TypeVar  # noqa: E402
+from typing import Any, Generator, Generic, Optional, Sequence, TypeVar  # noqa: E402
 
 import httpx  # noqa: E402
 import json_repair  # noqa: E402
@@ -33,6 +33,7 @@
 from jinja2.nodes import TemplateData  # noqa: E402
 from jinja2.runtime import Undefined  # noqa: E402
 from pydantic import BaseModel, ConfigDict, Field  # noqa: E402
+from pydantic.json_schema import SkipJsonSchema  # noqa: E402
 
 from .pdl_ast import (  # noqa: E402
     AdvancedBlockType,
@@ -131,19 +132,39 @@
 empty_scope: ScopeType = PdlDict({"pdl_context": DependentContext([])})
 
 
+RefT = TypeVar("RefT")
+
+
+class Ref(Generic[RefT]):
+    def __init__(self, ref: RefT):
+        self.ref = ref
+
+
 class InterpreterState(BaseModel):
     model_config = ConfigDict(arbitrary_types_allowed=True)
 
     yield_result: bool = False
+    """Stream the result on the standard output as soon as possible."""
     yield_background: bool = False
+    """Stream the toplevel pdl_context on the standard output as soon as possible."""
     batch: int = 1
-    # batch=0: streaming
-    # batch=1: call to generate with `input`
+    """
+    Stream the output of the LLM
+    - batch=0: streaming
+    - batch=1: call to generate with `input`
+    """
     role: RoleType = "user"
+    """Current role to add messages in the context."""
     cwd: Path = Path.cwd()
-    # background_tasks = {}
+    """Current working directory."""
     id_stack: list[str] = []
+    """Id generator for the UI."""
+
+    # The following are shared variable that should be modified by side effects
     event_loop: AbstractEventLoop = Field(default_factory=create_event_loop_thread)
+    """Event loop to schedule LLM calls."""
+    current_pdl_context: Ref[LazyMessages] = Ref(DependentContext([]))
+    """Current value of the context set at the beginning of the execution of the block."""
 
     def with_yield_result(self: "InterpreterState", b: bool) -> "InterpreterState":
         return self.model_copy(update={"yield_result": b})
@@ -168,6 +189,19 @@ def with_pop(self: "InterpreterState") -> "InterpreterState":
         return self.model_copy(update={"id_stack": stack})
 
 
+class ClosureBlock(FunctionBlock):
+    pdl__scope: SkipJsonSchema[Optional[ScopeType]] = Field(repr=False)
+    pdl__state: SkipJsonSchema[InterpreterState] = Field(repr=False)
+
+    def __call__(self, **kwds):
+        state = self.pdl__state.with_yield_result(False).with_yield_background(False)
+        current_context = state.current_pdl_context.ref
+        result, _, _ = execute_call(
+            state, current_context, self, kwds, empty_block_location
+        )
+        return result
+
+
 def generate(
     pdl_file: str | Path,
     state: Optional[InterpreterState],
@@ -246,6 +280,7 @@ def process_block(
     background: LazyMessages
     trace: BlockType
     try:
+        state.current_pdl_context.ref = scope["pdl_context"]  # type: ignore
         if not isinstance(block, Block):
             start = time.time_ns()
             try:
@@ -436,7 +471,7 @@ def process_advanced_block(
                 result.result()
             break
         except Exception as exc:
-            err_msg = exc.args[0]
+            err_msg = traceback.format_exc()
             do_retry = (
                 block.retry
                 and trial_idx + 1 < trial_total
@@ -915,7 +950,23 @@ def process_block_body(
             result, background, scope, trace = process_import(state, scope, block, loc)
 
         case FunctionBlock():
-            closure = block.model_copy()
+            closure = ClosureBlock(  # pyright: ignore
+                description=block.description,
+                spec=block.spec,
+                defs=block.defs,
+                def_=block.def_,  # pyright: ignore
+                contribute=block.contribute,
+                parser=block.parser,
+                fallback=block.fallback,
+                retry=block.retry,
+                trace_error_on_retry=block.trace_error_on_retry,
+                role=block.role,
+                function=block.function,
+                return_=block.return_,  # pyright: ignore
+                pdl__location=loc,
+                pdl__scope=None,
+                pdl__state=state,
+            )
             if block.def_ is not None:
                 scope = scope | {block.def_: closure}
             closure.pdl__scope = scope
@@ -1872,7 +1923,7 @@ def process_call(
     background: LazyMessages = DependentContext([])
     args, block = process_expr_of(block, "args", scope, loc)
     closure, _ = process_expr_of(block, "call", scope, loc)
-    if not isinstance(closure, FunctionBlock):
+    if not isinstance(closure, ClosureBlock):
         msg = f"Type error: {block.call} is of type {type(closure)} but should be a function."
         if isinstance(closure, str) and isinstance(scope.get(closure), FunctionBlock):
             msg += " You might want to call `${ " + str(block.call) + " }`."
@@ -1890,12 +1941,28 @@ def process_call(
             loc=args_loc,
             trace=block.model_copy(),
         )
+    current_context = scope.data["pdl_context"]
+    try:
+        result, background, call_trace = execute_call(
+            state, current_context, closure, args, loc
+        )
+    except PDLRuntimeError as exc:
+        raise PDLRuntimeError(
+            exc.message,
+            loc=exc.loc or closure.pdl__location,
+            trace=block.model_copy(update={"pdl__trace": exc.pdl__trace}),
+        ) from exc
+    trace = block.model_copy(update={"pdl__trace": call_trace})
+    return result, background, scope, trace
+
+
+def execute_call(state, current_context, closure, args, loc):
     if "pdl_context" in args:
-        args["pdl_context"] = deserialize(args["pdl_context"])
+        args = args | {"pdl_context": deserialize(args["pdl_context"])}
     f_body = closure.return_
     f_scope = (
         (closure.pdl__scope or PdlDict({}))
-        | PdlDict({"pdl_context": scope.data["pdl_context"]})
+        | PdlDict({"pdl_context": current_context})
         | PdlDict((args or {}))
     )
     if closure.pdl__location is not None:
@@ -1906,27 +1973,19 @@ def process_call(
         )
     else:
         fun_loc = empty_block_location
-    try:
-        result, background, _, f_trace = process_block(state, f_scope, f_body, fun_loc)
-    except PDLRuntimeError as exc:
-        raise PDLRuntimeError(
-            exc.message,
-            loc=exc.loc or fun_loc,
-            trace=block.model_copy(update={"pdl__trace": exc.pdl__trace}),
-        ) from exc
-    trace = block.model_copy(update={"pdl__trace": f_trace})
+    result, background, _, f_trace = process_block(state, f_scope, f_body, fun_loc)
     if closure.spec is not None:
         result = lazy_apply(
             lambda r: result_with_type_checking(
                 r,
                 closure.spec,
-                f"Type errors in result of function call to {block.call}:",
-                loc,
-                trace,
+                f"Type errors in result of the function{' ' + closure.signature.get('name', '') if closure.signature is not None else ''}:",
+                fun_loc,
+                f_trace,
             ),
             result,
         )
-    return result, background, scope, trace
+    return result, background, f_trace
 
 
 def process_input(
diff --git a/tests/test_function.py b/tests/test_function.py
index c2ce7ab48..f412c53d5 100644
--- a/tests/test_function.py
+++ b/tests/test_function.py
@@ -1,4 +1,4 @@
-from pdl.pdl import exec_dict, exec_file
+from pdl.pdl import exec_dict, exec_file, exec_str
 
 hello_def = {
     "def": "hello",
@@ -126,3 +126,111 @@ def test_call_expression_args():
         result
         == "FN::get_current_stock:: 'Simple call!'\n{'product_name': 'from_object'}\nFN::get_current_stock:: 'from_object'\n"
     )
+
+
+def test_call_from_code_01():
+    prog = """
+defs:
+  f:
+    function:
+      x:
+      y:
+    return:
+      ${x + 1}
+array:
+- call: ${f}
+  args:
+    x: 1
+    y: 1
+- ${ f(x=1, y=2) }
+- lang: python
+  code:
+    result = f(x=1, y=2)
+"""
+    result = exec_str(prog)
+    assert result == [2, 2, 2]
+
+
+def test_call_from_code_02():
+    prog = """
+defs:
+  f:
+    function:
+    return:
+      ${pdl_context}
+lastOf:
+- Hello
+- context: independent
+  array:
+  - call: ${f}
+  - ${ f() }
+  - lang: python
+    code:
+      result = f()
+"""
+    result = exec_str(prog)
+    assert [ctx.serialize("litellm") for ctx in result] == [
+        [{"role": "user", "content": "Hello", "pdl__defsite": "lastOf.0"}],
+        [{"role": "user", "content": "Hello", "pdl__defsite": "lastOf.0"}],
+        [{"role": "user", "content": "Hello", "pdl__defsite": "lastOf.0"}],
+    ]
+
+
+def test_call_from_code_03():
+    prog = """
+defs:
+  f:
+    function:
+    return:
+      ${pdl_context}
+lastOf:
+- Hello
+- context: independent
+  array:
+  - call: ${f}
+    args:
+      pdl_context: []
+  - ${ f(pdl_context=[]) }
+  - lang: python
+    code:
+      result = f(pdl_context=[])
+"""
+    result = exec_str(prog)
+    assert [ctx.serialize("litellm") for ctx in result] == [
+        [],
+        [],
+        [],
+    ]
+
+
+def test_call_from_code_04():
+    prog = """
+defs:
+  f:
+    function:
+    return:
+      lastOf:
+      - How are you?
+      - Bye
+lastOf:
+- Hello
+- context: independent
+  array:
+  - text:
+    - call: ${f}
+    - ${pdl_context}
+  - text:
+    - ${f()}
+    - ${pdl_context}
+  - text:
+    - lang: python
+      code:
+        result = f()
+    - ${pdl_context}
+"""
+    result = exec_str(prog)
+    assert result == [
+        "Bye[{'role': 'user', 'content': 'Hello', 'pdl__defsite': 'lastOf.0'},{'role': 'user', 'content': 'How are you?', 'pdl__defsite': 'lastOf.1.array.0.text.0.call.lastOf.0'},{'role': 'user', 'content': 'Bye', 'pdl__defsite': 'lastOf.1.array.0.text.0.call.lastOf.1'}]",
+        "Bye[{'role': 'user', 'content': 'Hello', 'pdl__defsite': 'lastOf.0'},{'role': 'user', 'content': 'Bye', 'pdl__defsite': 'lastOf.1.array.1.text.0'}]",
+        "Bye[{'role': 'user', 'content': 'Hello', 'pdl__defsite': 'lastOf.0'},{'role': 'user', 'content': 'Bye', 'pdl__defsite': 'lastOf.1.array.2.text.0.code'}]",
+    ]
diff --git a/tests/test_line_table.py b/tests/test_line_table.py
index 4e1e24642..d612da584 100644
--- a/tests/test_line_table.py
+++ b/tests/test_line_table.py
@@ -168,8 +168,8 @@ def test_line13(capsys: CaptureFixture[str]):
     "file": "tests/data/line/hello14.pdl",
     "errors": [
         "",
-        "tests/data/line/hello14.pdl:25 - Type errors in result of function call to ${ translate }:",
-        "tests/data/line/hello14.pdl:25 - Bonjour le monde! should be of type ",
+        "tests/data/line/hello14.pdl:16 - Type errors in result of the function translate:",
+        "tests/data/line/hello14.pdl:16 - Bonjour le monde! should be of type ",
     ],
 }
 
diff --git a/tests/test_type_checking.py b/tests/test_type_checking.py
index d556c5361..aa2138c57 100644
--- a/tests/test_type_checking.py
+++ b/tests/test_type_checking.py
@@ -605,3 +605,23 @@ def test_deprecated(capsys: pytest.CaptureFixture[str]):
     do_test_stderr(
         capsys, prog, ["Deprecated type syntax: use integer instead of int.", ""]
     )
+
+
+def test_function_call_jinja_19():
+    prog = """
+defs:
+  f:
+    function:
+      x:
+      y:
+    return:
+      ${x + 1}
+array:
+- call: ${f}
+  args:
+    x: 1
+    y: 1
+- ${ f(1, 2) }
+"""
+    with pytest.raises(PDLRuntimeError):
+        exec_str(prog)

From 1fbfde66584bdb7763d2816ac4840f5b1ba9c33e Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Tue, 29 Jul 2025 09:45:39 -0400
Subject: [PATCH 077/107] feat: allow unnamed arguments when calling a PDL
 function in Jinja (#1076)

Signed-off-by: Louis Mandel 
---
 src/pdl/pdl_interpreter.py  | 17 +++++++++++++++--
 tests/test_function.py      | 29 ++++++++++++++++++++++++++---
 tests/test_type_checking.py | 20 --------------------
 3 files changed, 41 insertions(+), 25 deletions(-)

diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py
index dc1281b51..4e332b917 100644
--- a/src/pdl/pdl_interpreter.py
+++ b/src/pdl/pdl_interpreter.py
@@ -193,11 +193,24 @@ class ClosureBlock(FunctionBlock):
     pdl__scope: SkipJsonSchema[Optional[ScopeType]] = Field(repr=False)
     pdl__state: SkipJsonSchema[InterpreterState] = Field(repr=False)
 
-    def __call__(self, **kwds):
+    def __call__(self, *args, **kwargs):
         state = self.pdl__state.with_yield_result(False).with_yield_background(False)
         current_context = state.current_pdl_context.ref
+        if len(args) > 0:
+            keys = self.function.keys() if self.function is not None else {}
+            if len(keys) < len(args):
+                if self.signature is not None and self.signature.get("name", "") != "":
+                    err = f"Too many arguments to the call of {self.signature['name']}"
+                else:
+                    err = "Too many arguments to the call"
+                raise PDLRuntimeExpressionError(
+                    err,
+                    loc=self.pdl__location,
+                    trace=self.model_copy(),
+                )
+            kwargs = dict(zip(keys, args)) | kwargs
         result, _, _ = execute_call(
-            state, current_context, self, kwds, empty_block_location
+            state, current_context, self, kwargs, self.pdl__location
         )
         return result
 
diff --git a/tests/test_function.py b/tests/test_function.py
index f412c53d5..a2c32ca5b 100644
--- a/tests/test_function.py
+++ b/tests/test_function.py
@@ -136,19 +136,19 @@ def test_call_from_code_01():
       x:
       y:
     return:
-      ${x + 1}
+      ${x + y}
 array:
 - call: ${f}
   args:
     x: 1
-    y: 1
+    y: 2
 - ${ f(x=1, y=2) }
 - lang: python
   code:
     result = f(x=1, y=2)
 """
     result = exec_str(prog)
-    assert result == [2, 2, 2]
+    assert result == [3, 3, 3]
 
 
 def test_call_from_code_02():
@@ -234,3 +234,26 @@ def test_call_from_code_04():
         "Bye[{'role': 'user', 'content': 'Hello', 'pdl__defsite': 'lastOf.0'},{'role': 'user', 'content': 'Bye', 'pdl__defsite': 'lastOf.1.array.1.text.0'}]",
         "Bye[{'role': 'user', 'content': 'Hello', 'pdl__defsite': 'lastOf.0'},{'role': 'user', 'content': 'Bye', 'pdl__defsite': 'lastOf.1.array.2.text.0.code'}]",
     ]
+
+
+def test_call_from_code_05():
+    prog = """
+defs:
+  f:
+    function:
+      x:
+      y:
+    return:
+      ${x - y}
+array:
+- call: ${f}
+  args:
+    x: 2
+    y: 1
+- ${ f(2, 1) }
+- lang: python
+  code:
+    result = f(2, 1)
+"""
+    result = exec_str(prog)
+    assert result == [1, 1, 1]
diff --git a/tests/test_type_checking.py b/tests/test_type_checking.py
index aa2138c57..d556c5361 100644
--- a/tests/test_type_checking.py
+++ b/tests/test_type_checking.py
@@ -605,23 +605,3 @@ def test_deprecated(capsys: pytest.CaptureFixture[str]):
     do_test_stderr(
         capsys, prog, ["Deprecated type syntax: use integer instead of int.", ""]
     )
-
-
-def test_function_call_jinja_19():
-    prog = """
-defs:
-  f:
-    function:
-      x:
-      y:
-    return:
-      ${x + 1}
-array:
-- call: ${f}
-  args:
-    x: 1
-    y: 1
-- ${ f(1, 2) }
-"""
-    with pytest.raises(PDLRuntimeError):
-        exec_str(prog)

From 7fe7f05724b67b9747cb7ccae8321f61dbb8e742 Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Tue, 29 Jul 2025 15:27:52 -0400
Subject: [PATCH 078/107] feat: map/reduce (#1010)

Signed-off-by: Louis Mandel 
---
 examples/map-reduce/python-reduce.pdl         |   13 +
 examples/map-reduce/reduce.pdl                |   13 +
 pdl-live-react/src/pdl_ast.d.ts               |  905 ++++++++++----
 pdl-live-react/src/pdl_ast_utils.ts           |   18 +
 pdl-live-react/src/view/detail/find.ts        |    3 +-
 pdl-live-react/src/view/timeline/model.ts     |    3 +-
 src/pdl/pdl-schema.json                       | 1103 +++++++++++++++--
 src/pdl/pdl_ast.py                            |   93 +-
 src/pdl/pdl_ast_utils.py                      |   12 +
 src/pdl/pdl_compilers/to_regex.py             |    5 +
 src/pdl/pdl_dumper.py                         |   30 +-
 src/pdl/pdl_interpreter.py                    |  247 +++-
 src/pdl/pdl_parser.py                         |    5 +
 src/pdl/pdl_scheduler.py                      |    2 +
 .../map-reduce/python-reduce.0.result         |    1 +
 .../examples/map-reduce/reduce.0.result       |    1 +
 tests/test_for.py                             |  396 ++++--
 17 files changed, 2270 insertions(+), 580 deletions(-)
 create mode 100644 examples/map-reduce/python-reduce.pdl
 create mode 100644 examples/map-reduce/reduce.pdl
 create mode 100644 tests/results/examples/map-reduce/python-reduce.0.result
 create mode 100644 tests/results/examples/map-reduce/reduce.0.result

diff --git a/examples/map-reduce/python-reduce.pdl b/examples/map-reduce/python-reduce.pdl
new file mode 100644
index 000000000..3efbdc531
--- /dev/null
+++ b/examples/map-reduce/python-reduce.pdl
@@ -0,0 +1,13 @@
+defs:
+  plus:
+    lang: python
+    code: |
+      import operator
+      result = operator.add
+for:
+  i: [1,2,3,4]
+map:
+  ${i}
+join:
+  as: reduce
+  reduce: ${ plus }
diff --git a/examples/map-reduce/reduce.pdl b/examples/map-reduce/reduce.pdl
new file mode 100644
index 000000000..2bbaaab6d
--- /dev/null
+++ b/examples/map-reduce/reduce.pdl
@@ -0,0 +1,13 @@
+defs:
+  plus:
+    function:
+      x: number
+      y: number
+    return:
+      ${ x + y }
+for:
+  i: [1,2,3,4]
+map:
+  ${i}
+join:
+  reduce: ${ plus }
diff --git a/pdl-live-react/src/pdl_ast.d.ts b/pdl-live-react/src/pdl_ast.d.ts
index f15502b41..4fb0710ee 100644
--- a/pdl-live-react/src/pdl_ast.d.ts
+++ b/pdl-live-react/src/pdl_ast.d.ts
@@ -24,6 +24,7 @@ export type Program =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -167,6 +168,11 @@ export type Description19 = string | null
  *
  */
 export type Description20 = string | null
+/**
+ * Documentation associated to the block.
+ *
+ */
+export type Description21 = string | null
 /**
  * Name of the variable used to store the result of the execution of the block.
  *
@@ -197,7 +203,7 @@ export type Parser =
   | PdlParser
   | RegexParser
   | null
-export type Description21 = string | null
+export type Description22 = string | null
 export type Pdl =
   | boolean
   | number
@@ -213,6 +219,7 @@ export type Pdl =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -224,7 +231,7 @@ export type Pdl =
   | ErrorBlock
   | EmptyBlock
   | null
-export type Description22 = string | null
+export type Description23 = string | null
 export type Regex = string
 export type Mode = "search" | "match" | "fullmatch" | "split" | "findall"
 /**
@@ -246,6 +253,7 @@ export type Fallback =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -335,6 +343,7 @@ export type Fallback1 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -402,6 +411,7 @@ export type Program1 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -455,6 +465,7 @@ export type Fallback2 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -518,6 +529,7 @@ export type PdlTrace =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -571,6 +583,7 @@ export type Fallback3 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -635,6 +648,7 @@ export type PdlTrace1 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -688,6 +702,7 @@ export type Fallback4 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -788,6 +803,7 @@ export type Fallback5 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -849,6 +865,7 @@ export type Content =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -910,6 +927,7 @@ export type Fallback6 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -971,6 +989,7 @@ export type Object1 =
         | IfBlock
         | MatchBlock
         | RepeatBlock
+        | MapBlock
         | TextBlock
         | LastOfBlock
         | ArrayBlock
@@ -998,6 +1017,7 @@ export type Object1 =
       | IfBlock
       | MatchBlock
       | RepeatBlock
+      | MapBlock
       | TextBlock
       | LastOfBlock
       | ArrayBlock
@@ -1052,6 +1072,7 @@ export type Fallback7 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1114,6 +1135,7 @@ export type Array = (
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1168,6 +1190,7 @@ export type Fallback8 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1230,6 +1253,7 @@ export type Lastof = (
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1284,6 +1308,7 @@ export type Fallback9 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1347,6 +1372,7 @@ export type Text =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1372,6 +1398,7 @@ export type Text =
       | IfBlock
       | MatchBlock
       | RepeatBlock
+      | MapBlock
       | TextBlock
       | LastOfBlock
       | ArrayBlock
@@ -1427,6 +1454,7 @@ export type Fallback10 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1470,7 +1498,7 @@ export type PdlContext10 =
 export type PdlId10 = string | null
 export type PdlIsLeaf10 = false
 export type IndependentEnum5 = "independent" | "dependent"
-export type Kind10 = "repeat"
+export type Kind10 = "map"
 /**
  * Arrays to iterate over.
  *
@@ -1484,15 +1512,10 @@ export type For = {
  */
 export type Index = string | null
 /**
- * Condition to stay at the beginning of the loop.
- *
- */
-export type While = LocalizedExpression | boolean | string
-/**
- * Body of the loop.
+ * Body of the iterator.
  *
  */
-export type Repeat =
+export type Map =
   | boolean
   | number
   | string
@@ -1507,6 +1530,7 @@ export type Repeat =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1518,11 +1542,6 @@ export type Repeat =
   | ErrorBlock
   | EmptyBlock
   | null
-/**
- * Condition to exit at the end of the loop.
- *
- */
-export type Until = LocalizedExpression | boolean | string
 /**
  * Maximal number of iterations to perform.
  *
@@ -1532,7 +1551,7 @@ export type Maxiterations = LocalizedExpression | number | string | null
  * Define how to combine the result of each iteration.
  *
  */
-export type Join = JoinText | JoinArray | JoinObject | JoinLastOf
+export type Join = JoinText | JoinArray | JoinObject | JoinLastOf | JoinReduce
 /**
  * String concatenation of the result of each iteration.
  *
@@ -1558,6 +1577,11 @@ export type As2 = "object"
  *
  */
 export type As3 = "lastOf"
+export type As4 = "reduce"
+/**
+ * Function used to combine the results.
+ */
+export type Reduce = LocalizedExpression | string
 export type PdlTrace2 =
   | (
       | boolean
@@ -1574,6 +1598,7 @@ export type PdlTrace2 =
       | IfBlock
       | MatchBlock
       | RepeatBlock
+      | MapBlock
       | TextBlock
       | LastOfBlock
       | ArrayBlock
@@ -1629,6 +1654,7 @@ export type Fallback11 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1672,7 +1698,187 @@ export type PdlContext11 =
 export type PdlId11 = string | null
 export type PdlIsLeaf11 = false
 export type IndependentEnum6 = "independent" | "dependent"
-export type Kind11 = "match"
+export type Kind11 = "repeat"
+/**
+ * Arrays to iterate over.
+ *
+ */
+export type For1 = {
+  [k: string]: LocalizedExpression | unknown[] | string
+} | null
+/**
+ * Name of the variable containing the loop iteration.
+ *
+ */
+export type Index1 = string | null
+/**
+ * Condition to stay at the beginning of the loop.
+ *
+ */
+export type While = LocalizedExpression | boolean | string
+/**
+ * Body of the loop.
+ *
+ */
+export type Repeat =
+  | boolean
+  | number
+  | string
+  | FunctionBlock
+  | CallBlock
+  | LitellmModelBlock
+  | GraniteioModelBlock
+  | CodeBlock
+  | ArgsBlock
+  | GetBlock
+  | DataBlock
+  | IfBlock
+  | MatchBlock
+  | RepeatBlock
+  | MapBlock
+  | TextBlock
+  | LastOfBlock
+  | ArrayBlock
+  | ObjectBlock
+  | MessageBlock
+  | ReadBlock
+  | IncludeBlock
+  | ImportBlock
+  | ErrorBlock
+  | EmptyBlock
+  | null
+/**
+ * Condition to exit at the end of the loop.
+ *
+ */
+export type Until = LocalizedExpression | boolean | string
+/**
+ * Maximal number of iterations to perform.
+ *
+ */
+export type Maxiterations1 = LocalizedExpression | number | string | null
+/**
+ * Define how to combine the result of each iteration.
+ *
+ */
+export type Join1 = JoinText | JoinArray | JoinObject | JoinLastOf | JoinReduce
+export type PdlTrace3 =
+  | (
+      | boolean
+      | number
+      | string
+      | FunctionBlock
+      | CallBlock
+      | LitellmModelBlock
+      | GraniteioModelBlock
+      | CodeBlock
+      | ArgsBlock
+      | GetBlock
+      | DataBlock
+      | IfBlock
+      | MatchBlock
+      | RepeatBlock
+      | MapBlock
+      | TextBlock
+      | LastOfBlock
+      | ArrayBlock
+      | ObjectBlock
+      | MessageBlock
+      | ReadBlock
+      | IncludeBlock
+      | ImportBlock
+      | ErrorBlock
+      | EmptyBlock
+      | null
+    )[]
+  | null
+/**
+ * Name of the variable used to store the result of the execution of the block.
+ *
+ */
+export type Def12 = string | null
+/**
+ * Indicate if the block contributes to the result and background context.
+ *
+ */
+export type Contribute12 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+/**
+ * Parser to use to construct a value out of a string result.
+ */
+export type Parser12 =
+  | ("json" | "jsonl" | "yaml")
+  | PdlParser
+  | RegexParser
+  | null
+/**
+ * Block to execute in case of error.
+ *
+ */
+export type Fallback12 =
+  | boolean
+  | number
+  | string
+  | FunctionBlock
+  | CallBlock
+  | LitellmModelBlock
+  | GraniteioModelBlock
+  | CodeBlock
+  | ArgsBlock
+  | GetBlock
+  | DataBlock
+  | IfBlock
+  | MatchBlock
+  | RepeatBlock
+  | MapBlock
+  | TextBlock
+  | LastOfBlock
+  | ArrayBlock
+  | ObjectBlock
+  | MessageBlock
+  | ReadBlock
+  | IncludeBlock
+  | ImportBlock
+  | ErrorBlock
+  | EmptyBlock
+  | null
+/**
+ * The maximum number of times to retry when an error occurs within a block.
+ *
+ */
+export type Retry12 = number | null
+/**
+ * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+ *
+ */
+export type TraceErrorOnRetry12 = boolean | string | null
+/**
+ * Role associated to the block and sub-blocks.
+ * Typical roles are `system`, `user`, and `assistant`,
+ * but there may be other roles such as `available_tools`.
+ */
+export type Role12 = string | null
+/**
+ * Current context
+ *
+ */
+export type PdlContext12 =
+  | {
+      [k: string]: unknown
+    }[]
+  | null
+/**
+ * Unique identifier for this block
+ *
+ */
+export type PdlId12 = string | null
+export type PdlIsLeaf12 = false
+export type IndependentEnum7 = "independent" | "dependent"
+export type Kind12 = "match"
 export type Case =
   | boolean
   | number
@@ -1682,10 +1888,10 @@ export type Case =
   | ObjectPattern
   | AnyPattern
   | null
-export type Def12 = string | null
 export type Def13 = string | null
 export type Def14 = string | null
 export type Def15 = string | null
+export type Def16 = string | null
 export type Any = null
 export type Array1 = (
   | boolean
@@ -1723,6 +1929,7 @@ export type Then =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1746,12 +1953,12 @@ export type With1 = MatchCase[]
  * Name of the variable used to store the result of the execution of the block.
  *
  */
-export type Def16 = string | null
+export type Def17 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute12 = (
+export type Contribute13 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
@@ -1760,7 +1967,7 @@ export type Contribute12 = (
 /**
  * Parser to use to construct a value out of a string result.
  */
-export type Parser12 =
+export type Parser13 =
   | ("json" | "jsonl" | "yaml")
   | PdlParser
   | RegexParser
@@ -1769,7 +1976,7 @@ export type Parser12 =
  * Block to execute in case of error.
  *
  */
-export type Fallback12 =
+export type Fallback13 =
   | boolean
   | number
   | string
@@ -1784,6 +1991,7 @@ export type Fallback12 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1799,23 +2007,23 @@ export type Fallback12 =
  * The maximum number of times to retry when an error occurs within a block.
  *
  */
-export type Retry12 = number | null
+export type Retry13 = number | null
 /**
  * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
  *
  */
-export type TraceErrorOnRetry12 = boolean | string | null
+export type TraceErrorOnRetry13 = boolean | string | null
 /**
  * Role associated to the block and sub-blocks.
  * Typical roles are `system`, `user`, and `assistant`,
  * but there may be other roles such as `available_tools`.
  */
-export type Role12 = string | null
+export type Role13 = string | null
 /**
  * Current context
  *
  */
-export type PdlContext12 =
+export type PdlContext13 =
   | {
       [k: string]: unknown
     }[]
@@ -1824,10 +2032,10 @@ export type PdlContext12 =
  * Unique identifier for this block
  *
  */
-export type PdlId12 = string | null
-export type PdlIsLeaf12 = false
-export type IndependentEnum7 = "independent" | "dependent"
-export type Kind12 = "if"
+export type PdlId13 = string | null
+export type PdlIsLeaf13 = false
+export type IndependentEnum8 = "independent" | "dependent"
+export type Kind13 = "if"
 /**
  * Condition.
  *
@@ -1852,6 +2060,7 @@ export type Then1 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1882,6 +2091,7 @@ export type Else =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1897,12 +2107,12 @@ export type Else =
  * Name of the variable used to store the result of the execution of the block.
  *
  */
-export type Def17 = string | null
+export type Def18 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute13 = (
+export type Contribute14 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
@@ -1911,7 +2121,7 @@ export type Contribute13 = (
 /**
  * Parser to use to construct a value out of a string result.
  */
-export type Parser13 =
+export type Parser14 =
   | ("json" | "jsonl" | "yaml")
   | PdlParser
   | RegexParser
@@ -1920,7 +2130,7 @@ export type Parser13 =
  * Block to execute in case of error.
  *
  */
-export type Fallback13 =
+export type Fallback14 =
   | boolean
   | number
   | string
@@ -1935,6 +2145,7 @@ export type Fallback13 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -1950,23 +2161,23 @@ export type Fallback13 =
  * The maximum number of times to retry when an error occurs within a block.
  *
  */
-export type Retry13 = number | null
+export type Retry14 = number | null
 /**
  * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
  *
  */
-export type TraceErrorOnRetry13 = boolean | string | null
+export type TraceErrorOnRetry14 = boolean | string | null
 /**
  * Role associated to the block and sub-blocks.
  * Typical roles are `system`, `user`, and `assistant`,
  * but there may be other roles such as `available_tools`.
  */
-export type Role13 = string | null
+export type Role14 = string | null
 /**
  * Current context
  *
  */
-export type PdlContext13 =
+export type PdlContext14 =
   | {
       [k: string]: unknown
     }[]
@@ -1975,9 +2186,9 @@ export type PdlContext13 =
  * Unique identifier for this block
  *
  */
-export type PdlId13 = string | null
-export type PdlIsLeaf13 = true
-export type Kind13 = "data"
+export type PdlId14 = string | null
+export type PdlIsLeaf14 = true
+export type Kind14 = "data"
 /**
  * Do not evaluate expressions inside strings.
  */
@@ -1986,12 +2197,12 @@ export type Raw = boolean
  * Name of the variable used to store the result of the execution of the block.
  *
  */
-export type Def18 = string | null
+export type Def19 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute14 = (
+export type Contribute15 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
@@ -2000,7 +2211,7 @@ export type Contribute14 = (
 /**
  * Parser to use to construct a value out of a string result.
  */
-export type Parser14 =
+export type Parser15 =
   | ("json" | "jsonl" | "yaml")
   | PdlParser
   | RegexParser
@@ -2009,7 +2220,7 @@ export type Parser14 =
  * Block to execute in case of error.
  *
  */
-export type Fallback14 =
+export type Fallback15 =
   | boolean
   | number
   | string
@@ -2024,6 +2235,7 @@ export type Fallback14 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2039,23 +2251,23 @@ export type Fallback14 =
  * The maximum number of times to retry when an error occurs within a block.
  *
  */
-export type Retry14 = number | null
+export type Retry15 = number | null
 /**
  * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
  *
  */
-export type TraceErrorOnRetry14 = boolean | string | null
+export type TraceErrorOnRetry15 = boolean | string | null
 /**
  * Role associated to the block and sub-blocks.
  * Typical roles are `system`, `user`, and `assistant`,
  * but there may be other roles such as `available_tools`.
  */
-export type Role14 = string | null
+export type Role15 = string | null
 /**
  * Current context
  *
  */
-export type PdlContext14 =
+export type PdlContext15 =
   | {
       [k: string]: unknown
     }[]
@@ -2064,9 +2276,9 @@ export type PdlContext14 =
  * Unique identifier for this block
  *
  */
-export type PdlId14 = string | null
-export type PdlIsLeaf14 = true
-export type Kind14 = "get"
+export type PdlId15 = string | null
+export type PdlIsLeaf15 = true
+export type Kind15 = "get"
 /**
  * Name of the variable to access.
  */
@@ -2075,12 +2287,12 @@ export type Get = string
  * Name of the variable used to store the result of the execution of the block.
  *
  */
-export type Def19 = string | null
+export type Def20 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute15 = (
+export type Contribute16 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
@@ -2089,7 +2301,7 @@ export type Contribute15 = (
 /**
  * Parser to use to construct a value out of a string result.
  */
-export type Parser15 =
+export type Parser16 =
   | ("json" | "jsonl" | "yaml")
   | PdlParser
   | RegexParser
@@ -2098,7 +2310,7 @@ export type Parser15 =
  * Block to execute in case of error.
  *
  */
-export type Fallback15 =
+export type Fallback16 =
   | boolean
   | number
   | string
@@ -2113,6 +2325,7 @@ export type Fallback15 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2128,23 +2341,23 @@ export type Fallback15 =
  * The maximum number of times to retry when an error occurs within a block.
  *
  */
-export type Retry15 = number | null
+export type Retry16 = number | null
 /**
  * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
  *
  */
-export type TraceErrorOnRetry15 = boolean | string | null
+export type TraceErrorOnRetry16 = boolean | string | null
 /**
  * Role associated to the block and sub-blocks.
  * Typical roles are `system`, `user`, and `assistant`,
  * but there may be other roles such as `available_tools`.
  */
-export type Role15 = string | null
+export type Role16 = string | null
 /**
  * Current context
  *
  */
-export type PdlContext15 =
+export type PdlContext16 =
   | {
       [k: string]: unknown
     }[]
@@ -2153,9 +2366,9 @@ export type PdlContext15 =
  * Unique identifier for this block
  *
  */
-export type PdlId15 = string | null
-export type PdlIsLeaf15 = true
-export type Kind15 = "code"
+export type PdlId16 = string | null
+export type PdlIsLeaf16 = true
+export type Kind16 = "code"
 export type Lang = "command"
 /**
  * The argument vector to spawn.
@@ -2166,12 +2379,12 @@ export type Args = (LocalizedExpression | string)[]
  * Name of the variable used to store the result of the execution of the block.
  *
  */
-export type Def20 = string | null
+export type Def21 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute16 = (
+export type Contribute17 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
@@ -2180,7 +2393,7 @@ export type Contribute16 = (
 /**
  * Parser to use to construct a value out of a string result.
  */
-export type Parser16 =
+export type Parser17 =
   | ("json" | "jsonl" | "yaml")
   | PdlParser
   | RegexParser
@@ -2189,7 +2402,7 @@ export type Parser16 =
  * Block to execute in case of error.
  *
  */
-export type Fallback16 =
+export type Fallback17 =
   | boolean
   | number
   | string
@@ -2204,6 +2417,7 @@ export type Fallback16 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2219,23 +2433,23 @@ export type Fallback16 =
  * The maximum number of times to retry when an error occurs within a block.
  *
  */
-export type Retry16 = number | null
+export type Retry17 = number | null
 /**
  * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
  *
  */
-export type TraceErrorOnRetry16 = boolean | string | null
+export type TraceErrorOnRetry17 = boolean | string | null
 /**
  * Role associated to the block and sub-blocks.
  * Typical roles are `system`, `user`, and `assistant`,
  * but there may be other roles such as `available_tools`.
  */
-export type Role16 = string | null
+export type Role17 = string | null
 /**
  * Current context
  *
  */
-export type PdlContext16 =
+export type PdlContext17 =
   | {
       [k: string]: unknown
     }[]
@@ -2244,9 +2458,9 @@ export type PdlContext16 =
  * Unique identifier for this block
  *
  */
-export type PdlId16 = string | null
-export type PdlIsLeaf16 = true
-export type Kind16 = "code"
+export type PdlId17 = string | null
+export type PdlIsLeaf17 = true
+export type Kind17 = "code"
 /**
  * Programming language of the code.
  *
@@ -2271,6 +2485,7 @@ export type Code =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2286,12 +2501,12 @@ export type Code =
  * Name of the variable used to store the result of the execution of the block.
  *
  */
-export type Def21 = string | null
+export type Def22 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute17 = (
+export type Contribute18 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
@@ -2300,7 +2515,7 @@ export type Contribute17 = (
 /**
  * Parser to use to construct a value out of a string result.
  */
-export type Parser17 =
+export type Parser18 =
   | ("json" | "jsonl" | "yaml")
   | PdlParser
   | RegexParser
@@ -2309,7 +2524,7 @@ export type Parser17 =
  * Block to execute in case of error.
  *
  */
-export type Fallback17 =
+export type Fallback18 =
   | boolean
   | number
   | string
@@ -2324,6 +2539,7 @@ export type Fallback17 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2339,23 +2555,23 @@ export type Fallback17 =
  * The maximum number of times to retry when an error occurs within a block.
  *
  */
-export type Retry17 = number | null
+export type Retry18 = number | null
 /**
  * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
  *
  */
-export type TraceErrorOnRetry17 = boolean | string | null
+export type TraceErrorOnRetry18 = boolean | string | null
 /**
  * Role associated to the block and sub-blocks.
  * Typical roles are `system`, `user`, and `assistant`,
  * but there may be other roles such as `available_tools`.
  */
-export type Role17 = string | null
+export type Role18 = string | null
 /**
  * Current context
  *
  */
-export type PdlContext17 =
+export type PdlContext18 =
   | {
       [k: string]: unknown
     }[]
@@ -2364,9 +2580,9 @@ export type PdlContext17 =
  * Unique identifier for this block
  *
  */
-export type PdlId17 = string | null
-export type PdlIsLeaf17 = true
-export type Kind17 = "model"
+export type PdlId18 = string | null
+export type PdlIsLeaf18 = true
+export type Kind18 = "model"
 /**
  * Messages to send to the model.
  *
@@ -2386,6 +2602,7 @@ export type Input =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2429,12 +2646,12 @@ export type Parameters =
  * Name of the variable used to store the result of the execution of the block.
  *
  */
-export type Def22 = string | null
+export type Def23 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute18 = (
+export type Contribute19 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
@@ -2443,7 +2660,7 @@ export type Contribute18 = (
 /**
  * Parser to use to construct a value out of a string result.
  */
-export type Parser18 =
+export type Parser19 =
   | ("json" | "jsonl" | "yaml")
   | PdlParser
   | RegexParser
@@ -2452,7 +2669,7 @@ export type Parser18 =
  * Block to execute in case of error.
  *
  */
-export type Fallback18 =
+export type Fallback19 =
   | boolean
   | number
   | string
@@ -2467,6 +2684,7 @@ export type Fallback18 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2482,23 +2700,23 @@ export type Fallback18 =
  * The maximum number of times to retry when an error occurs within a block.
  *
  */
-export type Retry18 = number | null
+export type Retry19 = number | null
 /**
  * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
  *
  */
-export type TraceErrorOnRetry18 = boolean | string | null
+export type TraceErrorOnRetry19 = boolean | string | null
 /**
  * Role associated to the block and sub-blocks.
  * Typical roles are `system`, `user`, and `assistant`,
  * but there may be other roles such as `available_tools`.
  */
-export type Role18 = string | null
+export type Role19 = string | null
 /**
  * Current context
  *
  */
-export type PdlContext18 =
+export type PdlContext19 =
   | {
       [k: string]: unknown
     }[]
@@ -2507,9 +2725,9 @@ export type PdlContext18 =
  * Unique identifier for this block
  *
  */
-export type PdlId18 = string | null
-export type PdlIsLeaf18 = true
-export type Kind18 = "model"
+export type PdlId19 = string | null
+export type PdlIsLeaf19 = true
+export type Kind19 = "model"
 /**
  * Messages to send to the model.
  *
@@ -2529,6 +2747,7 @@ export type Input1 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2623,12 +2842,12 @@ export type MaxRetries = number | string | null
  * Name of the variable used to store the result of the execution of the block.
  *
  */
-export type Def23 = string | null
+export type Def24 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute19 = (
+export type Contribute20 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
@@ -2637,7 +2856,7 @@ export type Contribute19 = (
 /**
  * Parser to use to construct a value out of a string result.
  */
-export type Parser19 =
+export type Parser20 =
   | ("json" | "jsonl" | "yaml")
   | PdlParser
   | RegexParser
@@ -2646,7 +2865,7 @@ export type Parser19 =
  * Block to execute in case of error.
  *
  */
-export type Fallback19 =
+export type Fallback20 =
   | boolean
   | number
   | string
@@ -2661,6 +2880,7 @@ export type Fallback19 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2676,23 +2896,23 @@ export type Fallback19 =
  * The maximum number of times to retry when an error occurs within a block.
  *
  */
-export type Retry19 = number | null
+export type Retry20 = number | null
 /**
  * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
  *
  */
-export type TraceErrorOnRetry19 = boolean | string | null
+export type TraceErrorOnRetry20 = boolean | string | null
 /**
  * Role associated to the block and sub-blocks.
  * Typical roles are `system`, `user`, and `assistant`,
  * but there may be other roles such as `available_tools`.
  */
-export type Role19 = string | null
+export type Role20 = string | null
 /**
  * Current context
  *
  */
-export type PdlContext19 =
+export type PdlContext20 =
   | {
       [k: string]: unknown
     }[]
@@ -2701,15 +2921,15 @@ export type PdlContext19 =
  * Unique identifier for this block
  *
  */
-export type PdlId19 = string | null
-export type PdlIsLeaf19 = true
-export type Kind19 = "call"
+export type PdlId20 = string | null
+export type PdlIsLeaf20 = true
+export type Kind20 = "call"
 /**
  * Function to call.
  *
  */
 export type Call = LocalizedExpression | FunctionBlock | string
-export type PdlTrace3 =
+export type PdlTrace4 =
   | boolean
   | number
   | string
@@ -2724,6 +2944,7 @@ export type PdlTrace3 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2739,12 +2960,12 @@ export type PdlTrace3 =
  * Name of the variable used to store the result of the execution of the block.
  *
  */
-export type Def24 = string | null
+export type Def25 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute20 = (
+export type Contribute21 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
@@ -2753,7 +2974,7 @@ export type Contribute20 = (
 /**
  * Parser to use to construct a value out of a string result.
  */
-export type Parser20 =
+export type Parser21 =
   | ("json" | "jsonl" | "yaml")
   | PdlParser
   | RegexParser
@@ -2762,7 +2983,7 @@ export type Parser20 =
  * Block to execute in case of error.
  *
  */
-export type Fallback20 =
+export type Fallback21 =
   | boolean
   | number
   | string
@@ -2777,6 +2998,7 @@ export type Fallback20 =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2792,23 +3014,23 @@ export type Fallback20 =
  * The maximum number of times to retry when an error occurs within a block.
  *
  */
-export type Retry20 = number | null
+export type Retry21 = number | null
 /**
  * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
  *
  */
-export type TraceErrorOnRetry20 = boolean | string | null
+export type TraceErrorOnRetry21 = boolean | string | null
 /**
  * Role associated to the block and sub-blocks.
  * Typical roles are `system`, `user`, and `assistant`,
  * but there may be other roles such as `available_tools`.
  */
-export type Role20 = string | null
+export type Role21 = string | null
 /**
  * Current context
  *
  */
-export type PdlContext20 =
+export type PdlContext21 =
   | {
       [k: string]: unknown
     }[]
@@ -2817,9 +3039,9 @@ export type PdlContext20 =
  * Unique identifier for this block
  *
  */
-export type PdlId20 = string | null
-export type PdlIsLeaf20 = true
-export type Kind20 = "function"
+export type PdlId21 = string | null
+export type PdlIsLeaf21 = true
+export type Kind21 = "function"
 /**
  * Functions parameters with their types.
  *
@@ -2846,6 +3068,7 @@ export type Return =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2877,6 +3100,7 @@ export type PdlBlock =
   | IfBlock
   | MatchBlock
   | RepeatBlock
+  | MapBlock
   | TextBlock
   | LastOfBlock
   | ArrayBlock
@@ -2924,20 +3148,20 @@ export interface FunctionBlock {
       }
     | null
   defs?: Defs
-  def?: Def24
-  contribute?: Contribute20
-  parser?: Parser20
-  fallback?: Fallback20
-  retry?: Retry20
-  trace_error_on_retry?: TraceErrorOnRetry20
-  role?: Role20
-  pdl__context?: PdlContext20
-  pdl__id?: PdlId20
+  def?: Def25
+  contribute?: Contribute21
+  parser?: Parser21
+  fallback?: Fallback21
+  retry?: Retry21
+  trace_error_on_retry?: TraceErrorOnRetry21
+  role?: Role21
+  pdl__context?: PdlContext21
+  pdl__id?: PdlId21
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf20
-  kind?: Kind20
+  pdl__is_leaf?: PdlIsLeaf21
+  kind?: Kind21
   function: Function
   return: Return
   signature?: Signature
@@ -2991,6 +3215,7 @@ export interface Defs {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3038,23 +3263,23 @@ export interface CallBlock {
       }
     | null
   defs?: Defs1
-  def?: Def23
-  contribute?: Contribute19
-  parser?: Parser19
-  fallback?: Fallback19
-  retry?: Retry19
-  trace_error_on_retry?: TraceErrorOnRetry19
-  role?: Role19
-  pdl__context?: PdlContext19
-  pdl__id?: PdlId19
+  def?: Def24
+  contribute?: Contribute20
+  parser?: Parser20
+  fallback?: Fallback20
+  retry?: Retry20
+  trace_error_on_retry?: TraceErrorOnRetry20
+  role?: Role20
+  pdl__context?: PdlContext20
+  pdl__id?: PdlId20
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf19
-  kind?: Kind19
+  pdl__is_leaf?: PdlIsLeaf20
+  kind?: Kind20
   call: Call
   args?: unknown
-  pdl__trace?: PdlTrace3
+  pdl__trace?: PdlTrace4
 }
 /**
  * Set of definitions executed before the execution of the block.
@@ -3076,6 +3301,7 @@ export interface Defs1 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3130,20 +3356,20 @@ export interface LitellmModelBlock {
       }
     | null
   defs?: Defs2
-  def?: Def22
-  contribute?: Contribute18
-  parser?: Parser18
-  fallback?: Fallback18
-  retry?: Retry18
-  trace_error_on_retry?: TraceErrorOnRetry18
-  role?: Role18
-  pdl__context?: PdlContext18
-  pdl__id?: PdlId18
+  def?: Def23
+  contribute?: Contribute19
+  parser?: Parser19
+  fallback?: Fallback19
+  retry?: Retry19
+  trace_error_on_retry?: TraceErrorOnRetry19
+  role?: Role19
+  pdl__context?: PdlContext19
+  pdl__id?: PdlId19
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf18
-  kind?: Kind18
+  pdl__is_leaf?: PdlIsLeaf19
+  kind?: Kind19
   input?: Input1
   modelResponse?: Modelresponse1
   /**
@@ -3176,6 +3402,7 @@ export interface Defs2 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3223,20 +3450,20 @@ export interface GraniteioModelBlock {
       }
     | null
   defs?: Defs3
-  def?: Def21
-  contribute?: Contribute17
-  parser?: Parser17
-  fallback?: Fallback17
-  retry?: Retry17
-  trace_error_on_retry?: TraceErrorOnRetry17
-  role?: Role17
-  pdl__context?: PdlContext17
-  pdl__id?: PdlId17
+  def?: Def22
+  contribute?: Contribute18
+  parser?: Parser18
+  fallback?: Fallback18
+  retry?: Retry18
+  trace_error_on_retry?: TraceErrorOnRetry18
+  role?: Role18
+  pdl__context?: PdlContext18
+  pdl__id?: PdlId18
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf17
-  kind?: Kind17
+  pdl__is_leaf?: PdlIsLeaf18
+  kind?: Kind18
   input?: Input
   modelResponse?: Modelresponse
   /**
@@ -3269,6 +3496,7 @@ export interface Defs3 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3325,20 +3553,20 @@ export interface CodeBlock {
       }
     | null
   defs?: Defs4
-  def?: Def20
-  contribute?: Contribute16
-  parser?: Parser16
-  fallback?: Fallback16
-  retry?: Retry16
-  trace_error_on_retry?: TraceErrorOnRetry16
-  role?: Role16
-  pdl__context?: PdlContext16
-  pdl__id?: PdlId16
+  def?: Def21
+  contribute?: Contribute17
+  parser?: Parser17
+  fallback?: Fallback17
+  retry?: Retry17
+  trace_error_on_retry?: TraceErrorOnRetry17
+  role?: Role17
+  pdl__context?: PdlContext17
+  pdl__id?: PdlId17
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf16
-  kind?: Kind16
+  pdl__is_leaf?: PdlIsLeaf17
+  kind?: Kind17
   lang: Lang1
   code: Code
 }
@@ -3362,6 +3590,7 @@ export interface Defs4 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3417,20 +3646,20 @@ export interface ArgsBlock {
       }
     | null
   defs?: Defs5
-  def?: Def19
-  contribute?: Contribute15
-  parser?: Parser15
-  fallback?: Fallback15
-  retry?: Retry15
-  trace_error_on_retry?: TraceErrorOnRetry15
-  role?: Role15
-  pdl__context?: PdlContext15
-  pdl__id?: PdlId15
+  def?: Def20
+  contribute?: Contribute16
+  parser?: Parser16
+  fallback?: Fallback16
+  retry?: Retry16
+  trace_error_on_retry?: TraceErrorOnRetry16
+  role?: Role16
+  pdl__context?: PdlContext16
+  pdl__id?: PdlId16
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf15
-  kind?: Kind15
+  pdl__is_leaf?: PdlIsLeaf16
+  kind?: Kind16
   lang?: Lang
   args: Args
 }
@@ -3454,6 +3683,7 @@ export interface Defs5 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3503,20 +3733,20 @@ export interface GetBlock {
       }
     | null
   defs?: Defs6
-  def?: Def18
-  contribute?: Contribute14
-  parser?: Parser14
-  fallback?: Fallback14
-  retry?: Retry14
-  trace_error_on_retry?: TraceErrorOnRetry14
-  role?: Role14
-  pdl__context?: PdlContext14
-  pdl__id?: PdlId14
+  def?: Def19
+  contribute?: Contribute15
+  parser?: Parser15
+  fallback?: Fallback15
+  retry?: Retry15
+  trace_error_on_retry?: TraceErrorOnRetry15
+  role?: Role15
+  pdl__context?: PdlContext15
+  pdl__id?: PdlId15
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf14
-  kind?: Kind14
+  pdl__is_leaf?: PdlIsLeaf15
+  kind?: Kind15
   get: Get
 }
 /**
@@ -3539,6 +3769,7 @@ export interface Defs6 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3607,20 +3838,20 @@ export interface DataBlock {
       }
     | null
   defs?: Defs7
-  def?: Def17
-  contribute?: Contribute13
-  parser?: Parser13
-  fallback?: Fallback13
-  retry?: Retry13
-  trace_error_on_retry?: TraceErrorOnRetry13
-  role?: Role13
-  pdl__context?: PdlContext13
-  pdl__id?: PdlId13
+  def?: Def18
+  contribute?: Contribute14
+  parser?: Parser14
+  fallback?: Fallback14
+  retry?: Retry14
+  trace_error_on_retry?: TraceErrorOnRetry14
+  role?: Role14
+  pdl__context?: PdlContext14
+  pdl__id?: PdlId14
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf13
-  kind?: Kind13
+  pdl__is_leaf?: PdlIsLeaf14
+  kind?: Kind14
   data: unknown
   raw?: Raw
 }
@@ -3644,6 +3875,7 @@ export interface Defs7 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3701,21 +3933,21 @@ export interface IfBlock {
       }
     | null
   defs?: Defs8
-  def?: Def16
-  contribute?: Contribute12
-  parser?: Parser12
-  fallback?: Fallback12
-  retry?: Retry12
-  trace_error_on_retry?: TraceErrorOnRetry12
-  role?: Role12
-  pdl__context?: PdlContext12
-  pdl__id?: PdlId12
+  def?: Def17
+  contribute?: Contribute13
+  parser?: Parser13
+  fallback?: Fallback13
+  retry?: Retry13
+  trace_error_on_retry?: TraceErrorOnRetry13
+  role?: Role13
+  pdl__context?: PdlContext13
+  pdl__id?: PdlId13
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf12
-  context?: IndependentEnum7
-  kind?: Kind12
+  pdl__is_leaf?: PdlIsLeaf13
+  context?: IndependentEnum8
+  kind?: Kind13
   if: If1
   then: Then1
   else?: Else
@@ -3740,6 +3972,7 @@ export interface Defs8 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3804,6 +4037,115 @@ export interface MatchBlock {
       }
     | null
   defs?: Defs9
+  def?: Def12
+  contribute?: Contribute12
+  parser?: Parser12
+  fallback?: Fallback12
+  retry?: Retry12
+  trace_error_on_retry?: TraceErrorOnRetry12
+  role?: Role12
+  pdl__context?: PdlContext12
+  pdl__id?: PdlId12
+  pdl__result?: unknown
+  pdl__location?: PdlLocationType | null
+  pdl__timing?: PdlTiming | null
+  pdl__is_leaf?: PdlIsLeaf12
+  context?: IndependentEnum7
+  kind?: Kind12
+  match: unknown
+  with: With1
+}
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs9 {
+  [k: string]:
+    | boolean
+    | number
+    | string
+    | FunctionBlock
+    | CallBlock
+    | LitellmModelBlock
+    | GraniteioModelBlock
+    | CodeBlock
+    | ArgsBlock
+    | GetBlock
+    | DataBlock
+    | IfBlock
+    | MatchBlock
+    | RepeatBlock
+    | MapBlock
+    | TextBlock
+    | LastOfBlock
+    | ArrayBlock
+    | ObjectBlock
+    | MessageBlock
+    | ReadBlock
+    | IncludeBlock
+    | ImportBlock
+    | ErrorBlock
+    | EmptyBlock
+    | null
+}
+/**
+ * Repeat the execution of a block sequentially.
+ * The scope and `pdl_context` are accumulated in between iterations.
+ *
+ * For loop example:
+ * ```PDL
+ * for:
+ *     number: [1, 2, 3, 4]
+ *     name: ["Bob", "Carol", "David", "Ernest"]
+ * repeat:
+ *     "${ name }'s number is ${ number }\n"
+ * ```
+ *
+ * While loop:
+ * ```PDL
+ * defs:
+ *   i: 0
+ * while: ${i < 5}
+ * repeat:
+ *     defs:
+ *       i: ${ i + 1}
+ *     data: ${ i }
+ * join:
+ *   as: array
+ * ```
+ */
+export interface RepeatBlock {
+  description?: Description10
+  /**
+   * Type specification of the result of the block.
+   *
+   */
+  spec?:
+    | (
+        | "null"
+        | "boolean"
+        | "string"
+        | "number"
+        | "integer"
+        | "array"
+        | "object"
+        | "bool"
+        | "str"
+        | "float"
+        | "int"
+        | "list"
+        | "obj"
+      )
+    | EnumPdlType
+    | PdlTypeType[]
+    | OptionalPdlType
+    | JsonSchemaTypePdlType
+    | ObjectPdlType
+    | {
+        [k: string]: PdlTypeType
+      }
+    | null
+  defs?: Defs10
   def?: Def11
   contribute?: Contribute11
   parser?: Parser11
@@ -3819,14 +4161,20 @@ export interface MatchBlock {
   pdl__is_leaf?: PdlIsLeaf11
   context?: IndependentEnum6
   kind?: Kind11
-  match: unknown
-  with: With1
+  for?: For1
+  index?: Index1
+  while?: While
+  repeat: Repeat
+  until?: Until
+  maxIterations?: Maxiterations1
+  join?: Join1
+  pdl__trace?: PdlTrace3
 }
 /**
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs9 {
+export interface Defs10 {
   [k: string]:
     | boolean
     | number
@@ -3842,6 +4190,7 @@ export interface Defs9 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3855,14 +4204,16 @@ export interface Defs9 {
     | null
 }
 /**
- * Repeat the execution of a block.
+ * Independent executions of  a block.
+ * Repeat the execution of a block starting from the initial scope
+ * and `pdl_context`.
  *
  * For loop example:
  * ```PDL
  * for:
  *     number: [1, 2, 3, 4]
  *     name: ["Bob", "Carol", "David", "Ernest"]
- * repeat:
+ * map:
  *     "${ name }'s number is ${ number }\n"
  * ```
  *
@@ -3870,14 +4221,14 @@ export interface Defs9 {
  * ```PDL
  * index: i
  * maxIterations: 5
- * repeat:
+ * map:
  *     ${ i }
  * join:
  *   as: array
  * ```
  */
-export interface RepeatBlock {
-  description?: Description10
+export interface MapBlock {
+  description?: Description11
   /**
    * Type specification of the result of the block.
    *
@@ -3907,7 +4258,7 @@ export interface RepeatBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs10
+  defs?: Defs11
   def?: Def10
   contribute?: Contribute10
   parser?: Parser10
@@ -3925,9 +4276,7 @@ export interface RepeatBlock {
   kind?: Kind10
   for?: For
   index?: Index
-  while?: While
-  repeat: Repeat
-  until?: Until
+  map: Map
   maxIterations?: Maxiterations
   join?: Join
   pdl__trace?: PdlTrace2
@@ -3936,7 +4285,7 @@ export interface RepeatBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs10 {
+export interface Defs11 {
   [k: string]:
     | boolean
     | number
@@ -3952,6 +4301,7 @@ export interface Defs10 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -3968,7 +4318,7 @@ export interface Defs10 {
  * Create the concatenation of the stringify version of the result of each block of the list of blocks.
  */
 export interface TextBlock {
-  description?: Description11
+  description?: Description12
   /**
    * Type specification of the result of the block.
    *
@@ -3998,7 +4348,7 @@ export interface TextBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs11
+  defs?: Defs12
   def?: Def9
   contribute?: Contribute9
   parser?: Parser9
@@ -4020,7 +4370,7 @@ export interface TextBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs11 {
+export interface Defs12 {
   [k: string]:
     | boolean
     | number
@@ -4036,6 +4386,7 @@ export interface Defs11 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4052,7 +4403,7 @@ export interface Defs11 {
  * Return the value of the last block if the list of blocks.
  */
 export interface LastOfBlock {
-  description?: Description12
+  description?: Description13
   /**
    * Type specification of the result of the block.
    *
@@ -4082,7 +4433,7 @@ export interface LastOfBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs12
+  defs?: Defs13
   def?: Def8
   contribute?: Contribute8
   parser?: Parser8
@@ -4104,7 +4455,7 @@ export interface LastOfBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs12 {
+export interface Defs13 {
   [k: string]:
     | boolean
     | number
@@ -4120,6 +4471,7 @@ export interface Defs12 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4136,7 +4488,7 @@ export interface Defs12 {
  * Return the array of values computed by each block of the list of blocks.
  */
 export interface ArrayBlock {
-  description?: Description13
+  description?: Description14
   /**
    * Type specification of the result of the block.
    *
@@ -4166,7 +4518,7 @@ export interface ArrayBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs13
+  defs?: Defs14
   def?: Def7
   contribute?: Contribute7
   parser?: Parser7
@@ -4188,7 +4540,7 @@ export interface ArrayBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs13 {
+export interface Defs14 {
   [k: string]:
     | boolean
     | number
@@ -4204,6 +4556,7 @@ export interface Defs13 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4220,7 +4573,7 @@ export interface Defs13 {
  * Return the object where the value of each field is defined by a block. If the body of the object is an array, the resulting object is the union of the objects computed by each element of the array.
  */
 export interface ObjectBlock {
-  description?: Description14
+  description?: Description15
   /**
    * Type specification of the result of the block.
    *
@@ -4250,7 +4603,7 @@ export interface ObjectBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs14
+  defs?: Defs15
   def?: Def6
   contribute?: Contribute6
   parser?: Parser6
@@ -4272,7 +4625,7 @@ export interface ObjectBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs14 {
+export interface Defs15 {
   [k: string]:
     | boolean
     | number
@@ -4288,6 +4641,7 @@ export interface Defs14 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4304,7 +4658,7 @@ export interface Defs14 {
  * Create a message.
  */
 export interface MessageBlock {
-  description?: Description15
+  description?: Description16
   /**
    * Type specification of the result of the block.
    *
@@ -4334,7 +4688,7 @@ export interface MessageBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs15
+  defs?: Defs16
   def?: Def5
   contribute?: Contribute5
   parser?: Parser5
@@ -4357,7 +4711,7 @@ export interface MessageBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs15 {
+export interface Defs16 {
   [k: string]:
     | boolean
     | number
@@ -4373,6 +4727,7 @@ export interface Defs15 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4401,7 +4756,7 @@ export interface Defs15 {
  * ```
  */
 export interface ReadBlock {
-  description?: Description16
+  description?: Description17
   /**
    * Type specification of the result of the block.
    *
@@ -4431,7 +4786,7 @@ export interface ReadBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs16
+  defs?: Defs17
   def?: Def4
   contribute?: Contribute4
   parser?: Parser4
@@ -4454,7 +4809,7 @@ export interface ReadBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs16 {
+export interface Defs17 {
   [k: string]:
     | boolean
     | number
@@ -4470,6 +4825,7 @@ export interface Defs16 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4486,7 +4842,7 @@ export interface Defs16 {
  * Include a PDL file.
  */
 export interface IncludeBlock {
-  description?: Description17
+  description?: Description18
   /**
    * Type specification of the result of the block.
    *
@@ -4516,7 +4872,7 @@ export interface IncludeBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs17
+  defs?: Defs18
   def?: Def3
   contribute?: Contribute3
   parser?: Parser3
@@ -4539,7 +4895,7 @@ export interface IncludeBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs17 {
+export interface Defs18 {
   [k: string]:
     | boolean
     | number
@@ -4555,6 +4911,7 @@ export interface Defs17 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4571,7 +4928,7 @@ export interface Defs17 {
  * Import a PDL file.
  */
 export interface ImportBlock {
-  description?: Description18
+  description?: Description19
   /**
    * Type specification of the result of the block.
    *
@@ -4601,7 +4958,7 @@ export interface ImportBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs18
+  defs?: Defs19
   def?: Def2
   contribute?: Contribute2
   parser?: Parser2
@@ -4623,7 +4980,7 @@ export interface ImportBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs18 {
+export interface Defs19 {
   [k: string]:
     | boolean
     | number
@@ -4639,6 +4996,7 @@ export interface Defs18 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4655,7 +5013,7 @@ export interface Defs18 {
  * Block representing an error generated at runtime.
  */
 export interface ErrorBlock {
-  description?: Description19
+  description?: Description20
   /**
    * Type specification of the result of the block.
    *
@@ -4685,7 +5043,7 @@ export interface ErrorBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs19
+  defs?: Defs20
   def?: Def1
   contribute?: Contribute1
   parser?: Parser1
@@ -4707,7 +5065,7 @@ export interface ErrorBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs19 {
+export interface Defs20 {
   [k: string]:
     | boolean
     | number
@@ -4723,6 +5081,7 @@ export interface Defs19 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4739,7 +5098,7 @@ export interface Defs19 {
  * Block without an action. It can contain definitions.
  */
 export interface EmptyBlock {
-  description?: Description20
+  description?: Description21
   /**
    * Type specification of the result of the block.
    *
@@ -4769,7 +5128,7 @@ export interface EmptyBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs20
+  defs?: Defs21
   def?: Def
   contribute?: Contribute
   parser?: Parser
@@ -4789,7 +5148,7 @@ export interface EmptyBlock {
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs20 {
+export interface Defs21 {
   [k: string]:
     | boolean
     | number
@@ -4805,6 +5164,7 @@ export interface Defs20 {
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
@@ -4846,7 +5206,7 @@ export interface Table {
  * Use a PDL program as a parser specification (experimental).
  */
 export interface PdlParser {
-  description?: Description21
+  description?: Description22
   spec?:
     | (
         | "null"
@@ -4878,7 +5238,7 @@ export interface PdlParser {
  * A regular expression parser.
  */
 export interface RegexParser {
-  description?: Description22
+  description?: Description23
   spec?:
     | (
         | "null"
@@ -4941,6 +5301,13 @@ export interface JoinObject {
 export interface JoinLastOf {
   as: As3
 }
+/**
+ * Join loop iterations as the value of the last iteration.
+ */
+export interface JoinReduce {
+  as?: As4
+  reduce: Reduce
+}
 /**
  * Case of a match.
  */
@@ -4956,21 +5323,21 @@ export interface MatchCase {
  * Match any of the patterns.
  */
 export interface OrPattern {
-  def?: Def12
+  def?: Def13
   anyOf: Anyof
 }
 /**
  * Match an array.
  */
 export interface ArrayPattern {
-  def?: Def13
+  def?: Def14
   array: Array1
 }
 /**
  * Match an object.
  */
 export interface ObjectPattern {
-  def?: Def14
+  def?: Def15
   object: Object2
 }
 export interface Object2 {
@@ -4988,7 +5355,7 @@ export interface Object2 {
  * Match any value.
  */
 export interface AnyPattern {
-  def?: Def15
+  def?: Def16
   any: Any
 }
 /**
diff --git a/pdl-live-react/src/pdl_ast_utils.ts b/pdl-live-react/src/pdl_ast_utils.ts
index 83f4fb739..2fcef845f 100644
--- a/pdl-live-react/src/pdl_ast_utils.ts
+++ b/pdl-live-react/src/pdl_ast_utils.ts
@@ -178,6 +178,7 @@ export function map_block_children(
     })
     .with({ kind: "repeat" }, (block) => {
       const for_ = block?.for ? f_expr(block.for) : undefined
+      const while_ = block?.until ? f_expr(block.while) : undefined
       const until = block?.until ? f_expr(block.until) : undefined
       const max_iterations = block?.maxIterations
         ? f_expr(block.maxIterations)
@@ -186,11 +187,25 @@ export function map_block_children(
       return {
         ...block,
         for: for_,
+        while: while_,
         repeat,
         until,
         maxIterations: max_iterations,
       }
     })
+    .with({ kind: "map" }, (block) => {
+      const for_ = block?.for ? f_expr(block.for) : undefined
+      const max_iterations = block?.maxIterations
+        ? f_expr(block.maxIterations)
+        : undefined
+      const map = f_block(block.map)
+      return {
+        ...block,
+        for: for_,
+        map,
+        maxIterations: max_iterations,
+      }
+    })
     .with({ kind: "error" }, (block) => {
       const doc = f_block(block.program)
       return { ...block, program: doc }
@@ -289,6 +304,9 @@ export function iter_block_children(
     .with({ kind: "repeat" }, (block) => {
       f(block.repeat)
     })
+    .with({ kind: "map" }, (block) => {
+      f(block.map)
+    })
     .with({ kind: "error" }, (block) => f(block.program))
     .with({ kind: "read" }, () => {})
     .with({ kind: "include" }, () => {})
diff --git a/pdl-live-react/src/view/detail/find.ts b/pdl-live-react/src/view/detail/find.ts
index bd1ed3f4e..0246f58da 100644
--- a/pdl-live-react/src/view/detail/find.ts
+++ b/pdl-live-react/src/view/detail/find.ts
@@ -3,6 +3,7 @@ import { childrenOf } from "../timeline/model"
 import {
   isNonScalarPdlBlock,
   nonNullable,
+  PdlBlock,
   type NonScalarPdlBlock as Block,
 } from "../../helpers"
 
@@ -21,7 +22,7 @@ export default function find(
   } else {
     return (
       childrenOf(block)
-        .map((child: Block) => find(child, id))
+        .map((child: PdlBlock) => find(child, id))
         .filter(nonNullable)[0] || null
     )
   }
diff --git a/pdl-live-react/src/view/timeline/model.ts b/pdl-live-react/src/view/timeline/model.ts
index 5879f9eea..1c1481fc9 100644
--- a/pdl-live-react/src/view/timeline/model.ts
+++ b/pdl-live-react/src/view/timeline/model.ts
@@ -147,11 +147,12 @@ export function childrenOf(block: NonScalarPdlBlock) {
       .with({ kind: "object" }, (data) => [data.object])
       .with({ kind: "message" }, (data) => [data.content])
       .with({ kind: "repeat" }, (data) => [data.pdl__trace ?? data.repeat])
+      .with({ kind: "map" }, (data) => [data.pdl__trace ?? data.map])
       .with({ kind: "empty" }, (data) =>
         data.defs ? Object.values(data.defs) : [],
       )
       .with({ kind: "error" }, () => []) // TODO show errors in trace
-      .with({ kind: undefined }, () => [])
+      .with({ kind: P.nullish }, () => [])
       // @ts-expect-error: TODO
       .exhaustive()
       .flat()
diff --git a/src/pdl/pdl-schema.json b/src/pdl/pdl-schema.json
index 17a6c3f60..3d9575364 100644
--- a/src/pdl/pdl-schema.json
+++ b/src/pdl/pdl-schema.json
@@ -98,6 +98,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -244,6 +247,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -497,6 +503,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -643,6 +652,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -851,6 +863,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -1024,6 +1039,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -1170,6 +1188,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -1401,6 +1422,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -1515,6 +1539,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -1661,6 +1688,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -1875,6 +1905,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -2025,6 +2058,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -2171,6 +2207,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -2422,6 +2461,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -2568,6 +2610,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -2813,6 +2858,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -2959,6 +3007,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -3166,6 +3217,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -3281,6 +3335,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -3427,6 +3484,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -3644,6 +3704,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -3774,6 +3837,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -3920,6 +3986,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -4157,6 +4226,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -4303,6 +4375,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -4505,6 +4580,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -4759,6 +4837,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -4905,6 +4986,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -5126,6 +5210,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -5210,6 +5297,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -5326,6 +5416,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -5472,6 +5565,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -5679,6 +5775,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -5793,6 +5892,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -5939,6 +6041,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -6150,6 +6255,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -6253,6 +6361,35 @@
       "title": "JoinObject",
       "type": "object"
     },
+    "JoinReduce": {
+      "additionalProperties": false,
+      "description": "Join loop iterations as the value of the last iteration.",
+      "properties": {
+        "as": {
+          "const": "reduce",
+          "default": "reduce",
+          "title": "As",
+          "type": "string"
+        },
+        "reduce": {
+          "anyOf": [
+            {
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+            },
+            {
+              "type": "string"
+            }
+          ],
+          "description": "Function used to combine the results.",
+          "title": "Reduce"
+        }
+      },
+      "required": [
+        "reduce"
+      ],
+      "title": "JoinReduce",
+      "type": "object"
+    },
     "JoinText": {
       "additionalProperties": false,
       "description": "Join loop iterations as a string.",
@@ -6369,6 +6506,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -6515,6 +6655,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -6723,6 +6866,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -6838,6 +6984,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -6984,6 +7133,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -7186,6 +7338,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -7750,9 +7905,9 @@
       "title": "LocalizedExpression",
       "type": "object"
     },
-    "MatchBlock": {
+    "MapBlock": {
       "additionalProperties": false,
-      "description": "Match control structure.\n\nExample:\n```PDL\ndefs:\n  answer:\n    read:\n    message: \"Enter a number? \"\nmatch: ${ (answer | int) }\nwith:\n- case: 42\n  then: You won!\n- case:\n    any:\n    def: x\n  if: ${ x > 42 }\n  then: Too high\n- then: Too low",
+      "description": "Independent executions of  a block.\nRepeat the execution of a block starting from the initial scope\nand `pdl_context`.\n\nFor loop example:\n```PDL\nfor:\n    number: [1, 2, 3, 4]\n    name: [\"Bob\", \"Carol\", \"David\", \"Ernest\"]\nmap:\n    \"${ name }'s number is ${ number }\\n\"\n```\n\nBounded loop:\n```PDL\nindex: i\nmaxIterations: 5\nmap:\n    ${ i }\njoin:\n  as: array\n```",
       "properties": {
         "description": {
           "anyOf": [
@@ -7820,6 +7975,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -7966,6 +8124,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -8120,85 +8281,40 @@
           "default": "dependent"
         },
         "kind": {
-          "const": "match",
-          "default": "match",
+          "const": "map",
+          "default": "map",
           "title": "Kind",
           "type": "string"
         },
-        "match": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {},
-            {
-              "type": "string"
-            }
-          ],
-          "description": "Matched expression.\n    ",
-          "title": "Match"
-        },
-        "with": {
-          "description": "List of cases to match.\n    ",
-          "items": {
-            "$ref": "#/$defs/MatchCase"
-          },
-          "title": "With",
-          "type": "array"
-        }
-      },
-      "required": [
-        "match",
-        "with"
-      ],
-      "title": "MatchBlock",
-      "type": "object"
-    },
-    "MatchCase": {
-      "additionalProperties": false,
-      "description": "Case of a match.",
-      "properties": {
-        "case": {
+        "for": {
           "anyOf": [
             {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/OrPattern"
-            },
-            {
-              "$ref": "#/$defs/ArrayPattern"
-            },
-            {
-              "$ref": "#/$defs/ObjectPattern"
-            },
-            {
-              "$ref": "#/$defs/AnyPattern"
+              "additionalProperties": {
+                "anyOf": [
+                  {
+                    "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+                  },
+                  {
+                    "items": {},
+                    "type": "array"
+                  },
+                  {
+                    "type": "string"
+                  }
+                ]
+              },
+              "type": "object"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "title": "Case"
+          "description": "Arrays to iterate over.\n    ",
+          "title": "For"
         },
-        "if": {
+        "index": {
           "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "boolean"
-            },
             {
               "type": "string"
             },
@@ -8207,9 +8323,10 @@
             }
           ],
           "default": null,
-          "title": "If"
+          "description": "Name of the variable containing the loop iteration.\n    ",
+          "title": "Index"
         },
-        "then": {
+        "map": {
           "anyOf": [
             {
               "type": "boolean"
@@ -8256,6 +8373,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -8290,67 +8410,767 @@
               "type": "null"
             }
           ],
-          "title": "Then"
+          "description": "Body of the iterator.\n    ",
+          "title": "Map"
         },
-        "pdl__case_result": {
+        "maxIterations": {
           "anyOf": [
             {
-              "type": "boolean"
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
             },
             {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Pdl  Case Result"
-        },
-        "pdl__if_result": {
-          "anyOf": [
+              "type": "integer"
+            },
             {
-              "type": "boolean"
+              "type": "string"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "title": "Pdl  If Result"
+          "description": "Maximal number of iterations to perform.\n    ",
+          "title": "Maxiterations"
         },
-        "pdl__matched": {
+        "join": {
           "anyOf": [
             {
-              "type": "boolean"
+              "$ref": "#/$defs/JoinText"
             },
             {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Pdl  Matched"
-        }
-      },
-      "required": [
-        "then"
-      ],
-      "title": "MatchCase",
-      "type": "object"
-    },
-    "MessageBlock": {
-      "additionalProperties": false,
-      "description": "Create a message.",
-      "properties": {
-        "description": {
-          "anyOf": [
+              "$ref": "#/$defs/JoinArray"
+            },
             {
-              "type": "string"
+              "$ref": "#/$defs/JoinObject"
             },
             {
-              "type": "null"
+              "$ref": "#/$defs/JoinLastOf"
+            },
+            {
+              "$ref": "#/$defs/JoinReduce"
             }
           ],
-          "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "default": {
+            "as": "text",
+            "with": ""
+          },
+          "description": "Define how to combine the result of each iteration.\n    ",
+          "title": "Join"
+        },
+        "pdl__trace": {
+          "anyOf": [
+            {
+              "items": {
+                "anyOf": [
+                  {
+                    "type": "boolean"
+                  },
+                  {
+                    "type": "integer"
+                  },
+                  {
+                    "type": "number"
+                  },
+                  {
+                    "type": "string"
+                  },
+                  {
+                    "$ref": "#/$defs/FunctionBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/CallBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/LitellmModelBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/GraniteioModelBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/CodeBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/ArgsBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/GetBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/DataBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/IfBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/MatchBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/RepeatBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/MapBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/TextBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/LastOfBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/ArrayBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/ObjectBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/MessageBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/ReadBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/IncludeBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/ImportBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/ErrorBlock"
+                  },
+                  {
+                    "$ref": "#/$defs/EmptyBlock"
+                  },
+                  {
+                    "type": "null"
+                  }
+                ]
+              },
+              "type": "array"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "title": "Pdl  Trace"
+        }
+      },
+      "required": [
+        "map"
+      ],
+      "title": "MapBlock",
+      "type": "object"
+    },
+    "MatchBlock": {
+      "additionalProperties": false,
+      "description": "Match control structure.\n\nExample:\n```PDL\ndefs:\n  answer:\n    read:\n    message: \"Enter a number? \"\nmatch: ${ (answer | int) }\nwith:\n- case: 42\n  then: You won!\n- case:\n    any:\n    def: x\n  if: ${ x > 42 }\n  then: Too high\n- then: Too low",
+      "properties": {
+        "description": {
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "Documentation associated to the block.\n    ",
+          "title": "Description"
+        },
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null,
+          "description": "Type specification of the result of the block.\n    "
+        },
+        "defs": {
+          "additionalProperties": {
+            "anyOf": [
+              {
+                "type": "boolean"
+              },
+              {
+                "type": "integer"
+              },
+              {
+                "type": "number"
+              },
+              {
+                "type": "string"
+              },
+              {
+                "$ref": "#/$defs/FunctionBlock"
+              },
+              {
+                "$ref": "#/$defs/CallBlock"
+              },
+              {
+                "$ref": "#/$defs/LitellmModelBlock"
+              },
+              {
+                "$ref": "#/$defs/GraniteioModelBlock"
+              },
+              {
+                "$ref": "#/$defs/CodeBlock"
+              },
+              {
+                "$ref": "#/$defs/ArgsBlock"
+              },
+              {
+                "$ref": "#/$defs/GetBlock"
+              },
+              {
+                "$ref": "#/$defs/DataBlock"
+              },
+              {
+                "$ref": "#/$defs/IfBlock"
+              },
+              {
+                "$ref": "#/$defs/MatchBlock"
+              },
+              {
+                "$ref": "#/$defs/RepeatBlock"
+              },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
+              {
+                "$ref": "#/$defs/TextBlock"
+              },
+              {
+                "$ref": "#/$defs/LastOfBlock"
+              },
+              {
+                "$ref": "#/$defs/ArrayBlock"
+              },
+              {
+                "$ref": "#/$defs/ObjectBlock"
+              },
+              {
+                "$ref": "#/$defs/MessageBlock"
+              },
+              {
+                "$ref": "#/$defs/ReadBlock"
+              },
+              {
+                "$ref": "#/$defs/IncludeBlock"
+              },
+              {
+                "$ref": "#/$defs/ImportBlock"
+              },
+              {
+                "$ref": "#/$defs/ErrorBlock"
+              },
+              {
+                "$ref": "#/$defs/EmptyBlock"
+              },
+              {
+                "type": "null"
+              }
+            ]
+          },
+          "default": {},
+          "description": "Set of definitions executed before the execution of the block.\n    ",
+          "title": "Defs",
+          "type": "object"
+        },
+        "def": {
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
+          "title": "Def"
+        },
+        "contribute": {
+          "default": [
+            "result",
+            "context"
+          ],
+          "description": "Indicate if the block contributes to the result and background context.\n    ",
+          "items": {
+            "anyOf": [
+              {
+                "$ref": "#/$defs/ContributeTarget"
+              },
+              {
+                "additionalProperties": {
+                  "$ref": "#/$defs/ContributeValue"
+                },
+                "type": "object"
+              }
+            ]
+          },
+          "title": "Contribute",
+          "type": "array"
+        },
+        "parser": {
+          "anyOf": [
+            {
+              "enum": [
+                "json",
+                "jsonl",
+                "yaml"
+              ],
+              "type": "string"
+            },
+            {
+              "$ref": "#/$defs/PdlParser"
+            },
+            {
+              "$ref": "#/$defs/RegexParser"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "Parser to use to construct a value out of a string result.",
+          "title": "Parser"
+        },
+        "fallback": {
+          "anyOf": [
+            {
+              "type": "boolean"
+            },
+            {
+              "type": "integer"
+            },
+            {
+              "type": "number"
+            },
+            {
+              "type": "string"
+            },
+            {
+              "$ref": "#/$defs/FunctionBlock"
+            },
+            {
+              "$ref": "#/$defs/CallBlock"
+            },
+            {
+              "$ref": "#/$defs/LitellmModelBlock"
+            },
+            {
+              "$ref": "#/$defs/GraniteioModelBlock"
+            },
+            {
+              "$ref": "#/$defs/CodeBlock"
+            },
+            {
+              "$ref": "#/$defs/ArgsBlock"
+            },
+            {
+              "$ref": "#/$defs/GetBlock"
+            },
+            {
+              "$ref": "#/$defs/DataBlock"
+            },
+            {
+              "$ref": "#/$defs/IfBlock"
+            },
+            {
+              "$ref": "#/$defs/MatchBlock"
+            },
+            {
+              "$ref": "#/$defs/RepeatBlock"
+            },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
+            {
+              "$ref": "#/$defs/TextBlock"
+            },
+            {
+              "$ref": "#/$defs/LastOfBlock"
+            },
+            {
+              "$ref": "#/$defs/ArrayBlock"
+            },
+            {
+              "$ref": "#/$defs/ObjectBlock"
+            },
+            {
+              "$ref": "#/$defs/MessageBlock"
+            },
+            {
+              "$ref": "#/$defs/ReadBlock"
+            },
+            {
+              "$ref": "#/$defs/IncludeBlock"
+            },
+            {
+              "$ref": "#/$defs/ImportBlock"
+            },
+            {
+              "$ref": "#/$defs/ErrorBlock"
+            },
+            {
+              "$ref": "#/$defs/EmptyBlock"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "Block to execute in case of error.\n    ",
+          "title": "Fallback"
+        },
+        "retry": {
+          "anyOf": [
+            {
+              "type": "integer"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
+          "title": "Retry"
+        },
+        "trace_error_on_retry": {
+          "anyOf": [
+            {
+              "type": "boolean"
+            },
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
+          "title": "Trace Error On Retry"
+        },
+        "role": {
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
+          "title": "Role"
+        },
+        "pdl__context": {
+          "anyOf": [
+            {
+              "items": {
+                "additionalProperties": true,
+                "type": "object"
+              },
+              "type": "array"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": [],
+          "description": "Current context\n    ",
+          "title": "Pdl  Context"
+        },
+        "pdl__id": {
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": "",
+          "description": "Unique identifier for this block\n    ",
+          "title": "Pdl  Id"
+        },
+        "pdl__result": {
+          "anyOf": [
+            {},
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "Result of the execution of the block",
+          "title": "Pdl  Result"
+        },
+        "pdl__location": {
+          "anyOf": [
+            {
+              "$ref": "#/$defs/PdlLocationType"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null
+        },
+        "pdl__timing": {
+          "anyOf": [
+            {
+              "$ref": "#/$defs/PdlTiming"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null
+        },
+        "pdl__is_leaf": {
+          "const": false,
+          "default": false,
+          "title": "Pdl  Is Leaf",
+          "type": "boolean"
+        },
+        "context": {
+          "$ref": "#/$defs/IndependentEnum",
+          "default": "dependent"
+        },
+        "kind": {
+          "const": "match",
+          "default": "match",
+          "title": "Kind",
+          "type": "string"
+        },
+        "match": {
+          "anyOf": [
+            {
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+            },
+            {},
+            {
+              "type": "string"
+            }
+          ],
+          "description": "Matched expression.\n    ",
+          "title": "Match"
+        },
+        "with": {
+          "description": "List of cases to match.\n    ",
+          "items": {
+            "$ref": "#/$defs/MatchCase"
+          },
+          "title": "With",
+          "type": "array"
+        }
+      },
+      "required": [
+        "match",
+        "with"
+      ],
+      "title": "MatchBlock",
+      "type": "object"
+    },
+    "MatchCase": {
+      "additionalProperties": false,
+      "description": "Case of a match.",
+      "properties": {
+        "case": {
+          "anyOf": [
+            {
+              "type": "boolean"
+            },
+            {
+              "type": "integer"
+            },
+            {
+              "type": "number"
+            },
+            {
+              "type": "string"
+            },
+            {
+              "$ref": "#/$defs/OrPattern"
+            },
+            {
+              "$ref": "#/$defs/ArrayPattern"
+            },
+            {
+              "$ref": "#/$defs/ObjectPattern"
+            },
+            {
+              "$ref": "#/$defs/AnyPattern"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "title": "Case"
+        },
+        "if": {
+          "anyOf": [
+            {
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+            },
+            {
+              "type": "boolean"
+            },
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "title": "If"
+        },
+        "then": {
+          "anyOf": [
+            {
+              "type": "boolean"
+            },
+            {
+              "type": "integer"
+            },
+            {
+              "type": "number"
+            },
+            {
+              "type": "string"
+            },
+            {
+              "$ref": "#/$defs/FunctionBlock"
+            },
+            {
+              "$ref": "#/$defs/CallBlock"
+            },
+            {
+              "$ref": "#/$defs/LitellmModelBlock"
+            },
+            {
+              "$ref": "#/$defs/GraniteioModelBlock"
+            },
+            {
+              "$ref": "#/$defs/CodeBlock"
+            },
+            {
+              "$ref": "#/$defs/ArgsBlock"
+            },
+            {
+              "$ref": "#/$defs/GetBlock"
+            },
+            {
+              "$ref": "#/$defs/DataBlock"
+            },
+            {
+              "$ref": "#/$defs/IfBlock"
+            },
+            {
+              "$ref": "#/$defs/MatchBlock"
+            },
+            {
+              "$ref": "#/$defs/RepeatBlock"
+            },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
+            {
+              "$ref": "#/$defs/TextBlock"
+            },
+            {
+              "$ref": "#/$defs/LastOfBlock"
+            },
+            {
+              "$ref": "#/$defs/ArrayBlock"
+            },
+            {
+              "$ref": "#/$defs/ObjectBlock"
+            },
+            {
+              "$ref": "#/$defs/MessageBlock"
+            },
+            {
+              "$ref": "#/$defs/ReadBlock"
+            },
+            {
+              "$ref": "#/$defs/IncludeBlock"
+            },
+            {
+              "$ref": "#/$defs/ImportBlock"
+            },
+            {
+              "$ref": "#/$defs/ErrorBlock"
+            },
+            {
+              "$ref": "#/$defs/EmptyBlock"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "title": "Then"
+        },
+        "pdl__case_result": {
+          "anyOf": [
+            {
+              "type": "boolean"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "title": "Pdl  Case Result"
+        },
+        "pdl__if_result": {
+          "anyOf": [
+            {
+              "type": "boolean"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "title": "Pdl  If Result"
+        },
+        "pdl__matched": {
+          "anyOf": [
+            {
+              "type": "boolean"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "title": "Pdl  Matched"
+        }
+      },
+      "required": [
+        "then"
+      ],
+      "title": "MatchCase",
+      "type": "object"
+    },
+    "MessageBlock": {
+      "additionalProperties": false,
+      "description": "Create a message.",
+      "properties": {
+        "description": {
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "Documentation associated to the block.\n    ",
+          "title": "Description"
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -8405,6 +9225,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -8551,6 +9374,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -8753,6 +9579,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -8899,6 +9728,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -9045,6 +9877,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -9254,6 +10089,9 @@
                   {
                     "$ref": "#/$defs/RepeatBlock"
                   },
+                  {
+                    "$ref": "#/$defs/MapBlock"
+                  },
                   {
                     "$ref": "#/$defs/TextBlock"
                   },
@@ -9339,6 +10177,9 @@
                   {
                     "$ref": "#/$defs/RepeatBlock"
                   },
+                  {
+                    "$ref": "#/$defs/MapBlock"
+                  },
                   {
                     "$ref": "#/$defs/TextBlock"
                   },
@@ -9581,6 +10422,9 @@
         {
           "$ref": "#/$defs/RepeatBlock"
         },
+        {
+          "$ref": "#/$defs/MapBlock"
+        },
         {
           "$ref": "#/$defs/TextBlock"
         },
@@ -9715,6 +10559,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -9941,6 +10788,9 @@
         {
           "$ref": "#/$defs/RepeatBlock"
         },
+        {
+          "$ref": "#/$defs/MapBlock"
+        },
         {
           "$ref": "#/$defs/TextBlock"
         },
@@ -10048,6 +10898,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -10194,6 +11047,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -10435,7 +11291,7 @@
     },
     "RepeatBlock": {
       "additionalProperties": false,
-      "description": "Repeat the execution of a block.\n\nFor loop example:\n```PDL\nfor:\n    number: [1, 2, 3, 4]\n    name: [\"Bob\", \"Carol\", \"David\", \"Ernest\"]\nrepeat:\n    \"${ name }'s number is ${ number }\\n\"\n```\n\nBounded loop:\n```PDL\nindex: i\nmaxIterations: 5\nrepeat:\n    ${ i }\njoin:\n  as: array\n```",
+      "description": "Repeat the execution of a block sequentially.\nThe scope and `pdl_context` are accumulated in between iterations.\n\nFor loop example:\n```PDL\nfor:\n    number: [1, 2, 3, 4]\n    name: [\"Bob\", \"Carol\", \"David\", \"Ernest\"]\nrepeat:\n    \"${ name }'s number is ${ number }\\n\"\n```\n\nWhile loop:\n```PDL\ndefs:\n  i: 0\nwhile: ${i < 5}\nrepeat:\n    defs:\n      i: ${ i + 1}\n    data: ${ i }\njoin:\n  as: array\n```",
       "properties": {
         "description": {
           "anyOf": [
@@ -10503,6 +11359,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -10649,6 +11508,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -10911,6 +11773,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -10996,6 +11861,9 @@
             },
             {
               "$ref": "#/$defs/JoinLastOf"
+            },
+            {
+              "$ref": "#/$defs/JoinReduce"
             }
           ],
           "default": {
@@ -11055,6 +11923,9 @@
                   {
                     "$ref": "#/$defs/RepeatBlock"
                   },
+                  {
+                    "$ref": "#/$defs/MapBlock"
+                  },
                   {
                     "$ref": "#/$defs/TextBlock"
                   },
@@ -11176,6 +12047,9 @@
               {
                 "$ref": "#/$defs/RepeatBlock"
               },
+              {
+                "$ref": "#/$defs/MapBlock"
+              },
               {
                 "$ref": "#/$defs/TextBlock"
               },
@@ -11322,6 +12196,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -11528,6 +12405,9 @@
             {
               "$ref": "#/$defs/RepeatBlock"
             },
+            {
+              "$ref": "#/$defs/MapBlock"
+            },
             {
               "$ref": "#/$defs/TextBlock"
             },
@@ -11606,6 +12486,9 @@
                   {
                     "$ref": "#/$defs/RepeatBlock"
                   },
+                  {
+                    "$ref": "#/$defs/MapBlock"
+                  },
                   {
                     "$ref": "#/$defs/TextBlock"
                   },
diff --git a/src/pdl/pdl_ast.py b/src/pdl/pdl_ast.py
index cc6b03a8e..6f0224ca6 100644
--- a/src/pdl/pdl_ast.py
+++ b/src/pdl/pdl_ast.py
@@ -5,6 +5,7 @@
 from typing import (
     Annotated,
     Any,
+    Callable,
     Generic,
     Literal,
     Mapping,
@@ -61,6 +62,7 @@ class BlockKind(StrEnum):
     IF = "if"
     MATCH = "match"
     REPEAT = "repeat"
+    MAP = "map"
     READ = "read"
     INCLUDE = "include"
     IMPORT = "import"
@@ -788,23 +790,18 @@ class MatchBlock(StructuredBlock):
     """
 
 
-class IterationType(StrEnum):
-    LASTOF = "lastOf"
-    ARRAY = "array"
-    OBJECT = "object"
-    TEXT = "text"
-
-
 class JoinConfig(BaseModel):
     """Configure how loop iterations should be combined."""
 
-    model_config = ConfigDict(extra="forbid", use_attribute_docstrings=True)
+    model_config = ConfigDict(
+        extra="forbid", use_attribute_docstrings=True, validate_by_name=True
+    )
 
 
 class JoinText(JoinConfig):
     """Join loop iterations as a string."""
 
-    as_: Literal[IterationType.TEXT] = Field(alias="as", default=IterationType.TEXT)
+    as_: Literal["text"] = Field(alias="as", default="text")
     """String concatenation of the result of each iteration.
     """
 
@@ -816,7 +813,7 @@ class JoinText(JoinConfig):
 class JoinArray(JoinConfig):
     """Join loop iterations as an array."""
 
-    as_: Literal[IterationType.ARRAY] = Field(alias="as")
+    as_: Literal["array"] = Field(alias="as")
     """Return the result of each iteration as an array.
     """
 
@@ -824,7 +821,7 @@ class JoinArray(JoinConfig):
 class JoinObject(JoinConfig):
     """Join loop iterations as an object."""
 
-    as_: Literal[IterationType.OBJECT] = Field(alias="as")
+    as_: Literal["object"] = Field(alias="as")
     """Return the union of the objects created at each iteration.
     """
 
@@ -832,18 +829,28 @@ class JoinObject(JoinConfig):
 class JoinLastOf(JoinConfig):
     """Join loop iterations as the value of the last iteration."""
 
-    as_: Literal[IterationType.LASTOF] = Field(alias="as")
+    as_: Literal["lastOf"] = Field(alias="as")
     """Return the result of the last iteration.
     """
 
 
-JoinType: TypeAlias = JoinText | JoinArray | JoinObject | JoinLastOf
+class JoinReduce(JoinConfig):
+    """Join loop iterations as the value of the last iteration."""
+
+    as_: Literal["reduce"] = Field(alias="as", default="reduce")
+
+    reduce: ExpressionType[Callable]
+    """Function used to combine the results."""
+
+
+JoinType: TypeAlias = JoinText | JoinArray | JoinObject | JoinLastOf | JoinReduce
 """Different ways to join loop iterations."""
 
 
 class RepeatBlock(StructuredBlock):
     """
-    Repeat the execution of a block.
+    Repeat the execution of a block sequentially.
+    The scope and `pdl_context` are accumulated in between iterations.
 
     For loop example:
     ```PDL
@@ -854,12 +861,15 @@ class RepeatBlock(StructuredBlock):
         "${ name }'s number is ${ number }\\n"
     ```
 
-    Bounded loop:
+    While loop:
     ```PDL
-    index: i
-    maxIterations: 5
+    defs:
+      i: 0
+    while: ${i < 5}
     repeat:
-        ${ i }
+        defs:
+          i: ${ i + 1}
+        data: ${ i }
     join:
       as: array
     ```
@@ -891,6 +901,52 @@ class RepeatBlock(StructuredBlock):
     pdl__trace: Optional[list["BlockType"]] = None
 
 
+class MapBlock(StructuredBlock):
+    """
+    Independent executions of  a block.
+    Repeat the execution of a block starting from the initial scope
+    and `pdl_context`.
+
+    For loop example:
+    ```PDL
+    for:
+        number: [1, 2, 3, 4]
+        name: ["Bob", "Carol", "David", "Ernest"]
+    map:
+        "${ name }'s number is ${ number }\\n"
+    ```
+
+    Bounded loop:
+    ```PDL
+    index: i
+    maxIterations: 5
+    map:
+        ${ i }
+    join:
+      as: array
+    ```
+    """
+
+    kind: Literal[BlockKind.MAP] = BlockKind.MAP
+    for_: Optional[dict[str, ExpressionType[list]]] = Field(default=None, alias="for")
+    """Arrays to iterate over.
+    """
+    index: Optional[str] = None
+    """Name of the variable containing the loop iteration.
+    """
+    map: "BlockType"
+    """Body of the iterator.
+    """
+    maxIterations: Optional[ExpressionType[int]] = None
+    """Maximal number of iterations to perform.
+    """
+    join: JoinType = JoinText()
+    """Define how to combine the result of each iteration.
+    """
+    # Field for internal use
+    pdl__trace: Optional[list["BlockType"]] = None
+
+
 class ReadBlock(LeafBlock):
     """Read from a file or standard input.
 
@@ -971,6 +1027,7 @@ class EmptyBlock(LeafBlock):
     | IfBlock
     | MatchBlock
     | RepeatBlock
+    | MapBlock
     | TextBlock
     | LastOfBlock
     | ArrayBlock
diff --git a/src/pdl/pdl_ast_utils.py b/src/pdl/pdl_ast_utils.py
index 241662680..dc8b0a650 100644
--- a/src/pdl/pdl_ast_utils.py
+++ b/src/pdl/pdl_ast_utils.py
@@ -19,6 +19,7 @@
     IncludeBlock,
     LastOfBlock,
     LitellmModelBlock,
+    MapBlock,
     MatchBlock,
     MatchCase,
     MessageBlock,
@@ -85,6 +86,11 @@ def iter_block_children(f: Callable[[BlockType], None], block: BlockType) -> Non
             if block.pdl__trace is not None:
                 for trace in block.pdl__trace:
                     f(trace)
+        case MapBlock():
+            f(block.map)
+            if block.pdl__trace is not None:
+                for trace in block.pdl__trace:
+                    f(trace)
         case ErrorBlock():
             f(block.program)
         case ReadBlock():
@@ -191,6 +197,12 @@ def map_block_children(f: MappedFunctions, block: BlockType) -> BlockType:
             block.until = f.f_expr(block.until)
             if block.pdl__trace is not None:
                 block.pdl__trace = [f.f_block(trace) for trace in block.pdl__trace]
+        case MapBlock():
+            if block.for_ is not None:
+                block.for_ = {x: f.f_expr(blocks) for x, blocks in block.for_.items()}
+            block.map = f.f_block(block.map)
+            if block.pdl__trace is not None:
+                block.pdl__trace = [f.f_block(trace) for trace in block.pdl__trace]
         case ErrorBlock():
             block.program = f.f_block(block.program)
         case ReadBlock():
diff --git a/src/pdl/pdl_compilers/to_regex.py b/src/pdl/pdl_compilers/to_regex.py
index 602e81a0c..cbfc246f4 100644
--- a/src/pdl/pdl_compilers/to_regex.py
+++ b/src/pdl/pdl_compilers/to_regex.py
@@ -18,6 +18,7 @@
     LitellmModelBlock,
     LitellmParameters,
     LocalizedExpression,
+    MapBlock,
     ModelBlock,
     ReadBlock,
     RepeatBlock,
@@ -312,6 +313,10 @@ def compile_block(
             body, scope = compile_block(scope, block.repeat)
             # XXX TODO: join char in text mode XXX
             regex = ReStar(body)
+        case MapBlock():
+            body, scope = compile_block(scope, block.map)
+            # XXX TODO: join char in text mode XXX
+            regex = ReStar(body)
         case ReadBlock():
             regex = ReStar(ReAnyChar())
         case IncludeBlock():
diff --git a/src/pdl/pdl_dumper.py b/src/pdl/pdl_dumper.py
index bcd3f9379..3e6f2ace5 100644
--- a/src/pdl/pdl_dumper.py
+++ b/src/pdl/pdl_dumper.py
@@ -29,6 +29,10 @@
     IfBlock,
     ImportBlock,
     IncludeBlock,
+    JoinArray,
+    JoinLastOf,
+    JoinObject,
+    JoinReduce,
     JoinText,
     JoinType,
     JsonSchemaTypePdlType,
@@ -36,6 +40,7 @@
     LitellmModelBlock,
     LitellmParameters,
     LocalizedExpression,
+    MapBlock,
     MatchBlock,
     MessageBlock,
     ObjectBlock,
@@ -243,7 +248,20 @@ def block_to_dict(  # noqa: C901
                 d["until"] = expr_to_dict(block.until, json_compatible)
             if block.maxIterations is not None:
                 d["maxIterations"] = expr_to_dict(block.maxIterations, json_compatible)
-            d["join"] = join_to_dict(block.join)
+            d["join"] = join_to_dict(block.join, json_compatible)
+            if block.pdl__trace is not None:
+                d["pdl__trace"] = [
+                    block_to_dict(b, json_compatible) for b in block.pdl__trace
+                ]
+        case MapBlock():
+            if block.for_ is not None:
+                d["for"] = expr_to_dict(block.for_, json_compatible)
+            if block.index is not None:
+                d["index"] = block.index
+            d["map"] = block_to_dict(block.map, json_compatible)
+            if block.maxIterations is not None:
+                d["maxIterations"] = expr_to_dict(block.maxIterations, json_compatible)
+            d["join"] = join_to_dict(block.join, json_compatible)
             if block.pdl__trace is not None:
                 d["pdl__trace"] = [
                     block_to_dict(b, json_compatible) for b in block.pdl__trace
@@ -402,13 +420,17 @@ def pattern_to_dict(pattern: PatternType):
     return result
 
 
-def join_to_dict(join: JoinType) -> dict[str, Any]:
-    d = {}
+def join_to_dict(join: JoinType, json_compatible: bool) -> dict[str, Any]:
+    d: dict[str, Any] = {}
     match join:
         case JoinText():
             d["with"] = join.with_
-        case _:
+        case JoinArray() | JoinObject() | JoinLastOf():
             d["as"] = str(join.as_)
+        case JoinReduce():
+            d["reduce"] = expr_to_dict(join.reduce, json_compatible)
+        case _:
+            assert False
     return d
 
 
diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py
index 4e332b917..d0fb3aa51 100644
--- a/src/pdl/pdl_interpreter.py
+++ b/src/pdl/pdl_interpreter.py
@@ -11,13 +11,21 @@
 # TODO: temporarily disabling warnings to mute a pydantic warning from liteLLM
 import warnings
 from asyncio import AbstractEventLoop
-from functools import partial
+from functools import partial, reduce
 from os import getenv
 
 warnings.filterwarnings("ignore", "Valid config keys have changed in V2")
 
 from pathlib import Path  # noqa: E402
-from typing import Any, Generator, Generic, Optional, Sequence, TypeVar  # noqa: E402
+from typing import (  # noqa: E402
+    Any,
+    Generator,
+    Generic,
+    Optional,
+    Sequence,
+    Tuple,
+    TypeVar,
+)
 
 import httpx  # noqa: E402
 import json_repair  # noqa: E402
@@ -60,13 +68,19 @@
     ImportBlock,
     IncludeBlock,
     IndependentEnum,
-    IterationType,
+    JoinArray,
+    JoinLastOf,
+    JoinObject,
+    JoinReduce,
+    JoinText,
+    JoinType,
     LastOfBlock,
     LazyMessage,
     LazyMessages,
     LitellmModelBlock,
     LitellmParameters,
     LocalizedExpression,
+    MapBlock,
     MatchBlock,
     MessageBlock,
     ModelBlock,
@@ -627,7 +641,7 @@ def process_block_body(
             result, background, scope, trace = process_blocks_of(
                 block,
                 "text",
-                IterationType.TEXT,
+                JoinText(),
                 state,
                 scope,
                 loc,
@@ -636,7 +650,7 @@ def process_block_body(
             result, background, scope, trace = process_blocks_of(
                 block,
                 "lastOf",
-                IterationType.LASTOF,
+                JoinLastOf(as_="lastOf"),  # pyright: ignore
                 state,
                 scope,
                 loc,
@@ -645,7 +659,7 @@ def process_block_body(
             result, background, scope, trace = process_blocks_of(
                 block,
                 "array",
-                IterationType.ARRAY,
+                JoinArray(as_="array"),  # pyright: ignore
                 state,
                 scope,
                 loc,
@@ -664,7 +678,7 @@ def process_block_body(
                         if isinstance(value_blocks, StructuredBlock):
                             context = value_blocks.context
                         value, value_background, scope, value_trace = process_blocks(
-                            IterationType.LASTOF,
+                            JoinLastOf(as_="lastOf"),  # pyright: ignore
                             context,
                             iteration_state,
                             scope,
@@ -701,7 +715,7 @@ def process_block_body(
                 result, background, scope, trace = process_blocks_of(
                     block,
                     "object",
-                    IterationType.OBJECT,
+                    JoinObject(as_="object"),  # pyright: ignore
                     iteration_state,
                     scope,
                     loc,
@@ -827,46 +841,12 @@ def process_block_body(
             background = DependentContext([])
             iter_trace: list[BlockType] = []
             pdl_context_init = scope_init.data["pdl_context"]
-            if block.for_ is None:
-                items = None
-                lengths = None
-            else:
-                items, block = process_expr_of(block, "for_", scope, loc, "for")
-                lengths = []
-                for idx, lst in items.items():
-                    if not isinstance(lst, list):
-                        msg = f"Values inside the For block must be lists but got {type(lst)}."
-                        lst_loc = append(
-                            append(block.pdl__location or empty_block_location, "for"),
-                            idx,
-                        )
-                        raise PDLRuntimeError(
-                            message=msg,
-                            loc=lst_loc,
-                            trace=ErrorBlock(
-                                msg=msg, pdl__location=lst_loc, program=block
-                            ),
-                            fallback=[],
-                        )
-                    lengths.append(len(lst))
-                if len(set(lengths)) != 1:  # Not all the lists are of the same length
-                    msg = "Lists inside the For block must be of the same length."
-                    for_loc = append(block.pdl__location or empty_block_location, "for")
-                    raise PDLRuntimeError(
-                        msg,
-                        loc=for_loc,
-                        trace=ErrorBlock(msg=msg, pdl__location=for_loc, program=block),
-                        fallback=[],
-                    )
             iteration_state = state.with_yield_result(
-                state.yield_result and block.join.as_ == IterationType.TEXT
+                state.yield_result and isinstance(block.join, JoinText)
             )
-            if block.maxIterations is None:
-                max_iterations = None
-            else:
-                max_iterations, block = process_expr_of(
-                    block, "maxIterations", scope, loc
-                )
+            block, items, length = _evaluate_for_field(scope, block, loc)
+            block, max_iterations = _evaluate_max_iterations_field(scope, block, loc)
+            block = _evaluate_join_field(scope, block, loc)
             repeat_loc = append(loc, "repeat")
             iidx = 0
             try:
@@ -877,7 +857,7 @@ def process_block_body(
                         scope = scope | {block.index: iidx}
                     if max_iterations is not None and iidx >= max_iterations:
                         break
-                    if lengths is not None and iidx >= lengths[0]:
+                    if length is not None and iidx >= length:
                         break
                     stay, _ = process_condition_of(block, "while_", scope, loc, "while")
                     if not stay:
@@ -885,9 +865,8 @@ def process_block_body(
                     iteration_state = iteration_state.with_iter(iidx)
                     if first:
                         first = False
-                    elif block.join.as_ == IterationType.TEXT:
+                    elif isinstance(block.join, JoinText):
                         join_string = block.join.with_
-                        results.append(PdlConst(join_string))
                         if iteration_state.yield_result:
                             yield_result(join_string, block.kind)
                         if iteration_state.yield_background:
@@ -921,13 +900,11 @@ def process_block_body(
                         saved_background = DependentContext(
                             [saved_background, iteration_background]
                         )
+                        background = saved_background
                     else:
                         saved_background = IndependentContext(
                             [saved_background, iteration_background]
                         )
-
-                    if block.context is IndependentEnum.DEPENDENT:
-                        background = saved_background
                     results.append(iteration_result)
                     iter_trace.append(body_trace)
                     iteration_state = iteration_state.with_pop()
@@ -943,12 +920,67 @@ def process_block_body(
                     loc=exc.loc or repeat_loc,
                     trace=trace,
                 ) from exc
-            result = combine_results(block.join.as_, results)
+            result = combine_results(block.join, results)
             if block.context is IndependentEnum.INDEPENDENT:
                 background = saved_background
             if state.yield_result and not iteration_state.yield_result:
                 yield_result(result.result(), block.kind)
             trace = block.model_copy(update={"pdl__trace": iter_trace})
+        case MapBlock():
+            results = []
+            background = DependentContext([])
+            iter_trace = []
+            iteration_state = state.with_yield_result(False)
+            block, items, length = _evaluate_for_field(scope, block, loc)
+            block, max_iterations = _evaluate_max_iterations_field(scope, block, loc)
+            block = _evaluate_join_field(scope, block, loc)
+            map_loc = append(loc, "map")
+            iidx = 0
+            try:
+                saved_background = IndependentContext([])
+                while True:
+                    iteration_scope = scope_init
+                    if block.index is not None:
+                        iteration_scope = iteration_scope | {block.index: iidx}
+                    if max_iterations is not None and iidx >= max_iterations:
+                        break
+                    if length is not None and iidx >= length:
+                        break
+                    iteration_state = iteration_state.with_iter(iidx)
+                    if items is not None:
+                        for k in items.keys():
+                            iteration_scope = iteration_scope | {k: items[k][iidx]}
+                    (
+                        iteration_result,
+                        iteration_background,
+                        iteration_scope,
+                        body_trace,
+                    ) = process_block(
+                        iteration_state,
+                        iteration_scope,
+                        block.map,
+                        map_loc,
+                    )
+                    saved_background = IndependentContext(
+                        [saved_background, iteration_background]
+                    )
+                    results.append(iteration_result)
+                    iter_trace.append(body_trace)
+                    iteration_state = iteration_state.with_pop()
+                    iidx = iidx + 1
+            except PDLRuntimeError as exc:
+                iter_trace.append(exc.pdl__trace)
+                trace = block.model_copy(update={"pdl__trace": iter_trace})
+                raise PDLRuntimeError(
+                    exc.message,
+                    loc=exc.loc or map_loc,
+                    trace=trace,
+                ) from exc
+            result = combine_results(block.join, results)
+            # background = saved_background  # commented because the block do not contribute to the background
+            if state.yield_result and not iteration_state.yield_result:
+                yield_result(result.result(), block.kind)
+            trace = block.model_copy(update={"pdl__trace": iter_trace})
         case ReadBlock():
             result, background, scope, trace = process_input(state, scope, block, loc)
             if state.yield_result:
@@ -1008,6 +1040,75 @@ def process_block_body(
     return result, background, scope, trace
 
 
+BlockTVarEvalFor = TypeVar("BlockTVarEvalFor", bound=RepeatBlock | MapBlock)
+
+
+def _evaluate_for_field(
+    scope: ScopeType, block: BlockTVarEvalFor, loc: PdlLocationType
+) -> Tuple[BlockTVarEvalFor, Optional[dict[str, list]], Optional[int]]:
+    if block.for_ is None:
+        items = None
+        length = None
+    else:
+        items, block = process_expr_of(block, "for_", scope, loc, "for")
+        lengths = []
+        for idx, lst in items.items():
+            if not isinstance(lst, list):
+                msg = f"Values inside the For block must be lists but got {type(lst)}."
+                lst_loc = append(
+                    append(block.pdl__location or empty_block_location, "for"),
+                    idx,
+                )
+                raise PDLRuntimeError(
+                    message=msg,
+                    loc=lst_loc,
+                    trace=ErrorBlock(msg=msg, pdl__location=lst_loc, program=block),
+                    fallback=[],
+                )
+            lengths.append(len(lst))
+        if len(set(lengths)) != 1:  # Not all the lists are of the same length
+            msg = "Lists inside the For block must be of the same length."
+            for_loc = append(block.pdl__location or empty_block_location, "for")
+            raise PDLRuntimeError(
+                msg,
+                loc=for_loc,
+                trace=ErrorBlock(msg=msg, pdl__location=for_loc, program=block),
+                fallback=[],
+            )
+        length = lengths[0]
+    return block, items, length
+
+
+BlockTVarEvalMaxIter = TypeVar("BlockTVarEvalMaxIter", bound=RepeatBlock | MapBlock)
+
+
+def _evaluate_max_iterations_field(
+    scope: ScopeType, block: BlockTVarEvalMaxIter, loc: PdlLocationType
+) -> Tuple[BlockTVarEvalMaxIter, Optional[int]]:
+    if block.maxIterations is None:
+        max_iterations = None
+    else:
+        max_iterations, block = process_expr_of(block, "maxIterations", scope, loc)
+    return block, max_iterations
+
+
+BlockTVarEvalJoin = TypeVar("BlockTVarEvalJoin", bound=RepeatBlock | MapBlock)
+
+
+def _evaluate_join_field(
+    scope: ScopeType, block: BlockTVarEvalJoin, loc: PdlLocationType
+) -> BlockTVarEvalJoin:
+    match block.join:
+        case JoinText() | JoinArray() | JoinObject() | JoinLastOf():
+            pass
+        case JoinReduce():
+            loc = append(loc, "reduce")
+            _, expr = process_expr(scope, block.join.reduce, loc)
+            join = block.join.model_copy(update={"reduce": expr})
+            block = block.model_copy(update={"join": join})
+    return block
+
+
 def is_matching(  # pylint: disable=too-many-return-statements
     value: Any, pattern: PatternType, scope: ScopeType
 ) -> Optional[ScopeType]:
@@ -1124,7 +1225,7 @@ def process_block_of(  # pylint: disable=too-many-arguments, too-many-positional
 def process_blocks_of(  # pylint: disable=too-many-arguments, too-many-positional-arguments
     block: BlockTypeTVarProcessBlocksOf,
     field: str,
-    iteration_type: IterationType,
+    join_type: JoinType,
     state: InterpreterState,
     scope: ScopeType,
     loc: PdlLocationType,
@@ -1135,7 +1236,7 @@ def process_blocks_of(  # pylint: disable=too-many-arguments, too-many-positiona
         if isinstance(block, StructuredBlock):
             context = block.context
         result, background, scope, blocks = process_blocks(
-            iteration_type,
+            join_type,
             context,
             state,
             scope,
@@ -1155,7 +1256,7 @@ def process_blocks_of(  # pylint: disable=too-many-arguments, too-many-positiona
 
 
 def process_blocks(  # pylint: disable=too-many-arguments,too-many-positional-arguments
-    iteration_type: IterationType,
+    join_type: JoinType,
     context: IndependentEnum,
     state: InterpreterState,
     scope: ScopeType,
@@ -1170,8 +1271,7 @@ def process_blocks(  # pylint: disable=too-many-arguments,too-many-positional-ar
     if not isinstance(blocks, str) and isinstance(blocks, Sequence):
         # Is a list of blocks
         iteration_state = state.with_yield_result(
-            state.yield_result
-            and (iteration_type in (IterationType.LASTOF, IterationType.TEXT))
+            state.yield_result and isinstance(join_type, (JoinLastOf, JoinText))
         )
         new_loc = None
         background = DependentContext([])
@@ -1185,7 +1285,7 @@ def process_blocks(  # pylint: disable=too-many-arguments,too-many-positional-ar
                     "pdl_context": DependentContext([pdl_context_init, background])
                 }
                 new_loc = append(loc, "[" + str(i) + "]")
-                if iteration_type == IterationType.LASTOF and state.yield_result:
+                if isinstance(join_type, JoinLastOf) and state.yield_result:
                     iteration_state = state.with_yield_result(i + 1 == len(blocks))
                 (
                     iteration_result,
@@ -1216,35 +1316,46 @@ def process_blocks(  # pylint: disable=too-many-arguments,too-many-positional-ar
             ) from exc
     else:
         iteration_state = state.with_yield_result(
-            state.yield_result and iteration_type != IterationType.ARRAY
+            state.yield_result and not isinstance(join_type, JoinArray)
         )
         block_result, background, scope, trace = process_block(
             iteration_state, scope, blocks, loc
         )
         results.append(block_result)
-    result = combine_results(iteration_type, results)
+    result = combine_results(join_type, results)
     if state.yield_result and not iteration_state.yield_result:
         yield_result(result, block_kind)
     return result, background, scope, trace
 
 
-def combine_results(iteration_type: IterationType, results: list[PdlLazy[Any]]):
+def combine_results(join_type: JoinType, results: list[PdlLazy[Any]]):
     result: Any
-    match iteration_type:
-        case IterationType.ARRAY:
+    match join_type:
+        case JoinArray():
             result = PdlList(results)
-        case IterationType.OBJECT:
+        case JoinObject():
             result = PdlDict({})
             for d in results:
                 result = result | d
-        case IterationType.LASTOF:
+        case JoinLastOf():
             if len(results) > 0:
                 result = results[-1]
             else:
                 result = None
-        case IterationType.TEXT:
+        case JoinText():
+            join_str = join_type.with_
             result = lazy_apply(
-                (lambda _: "".join([stringify(r.result()) for r in results])),
+                (lambda _: join_str.join([stringify(r.result()) for r in results])),
+                PdlConst(()),
+            )
+        case JoinReduce():
+            result = lazy_apply(
+                (
+                    lambda _: reduce(
+                        value_of_expr(join_type.reduce),
+                        [r.result() for r in results],
+                    )
+                ),
                 PdlConst(()),
             )
         case _:
diff --git a/src/pdl/pdl_parser.py b/src/pdl/pdl_parser.py
index 3752b36f3..201e5db79 100644
--- a/src/pdl/pdl_parser.py
+++ b/src/pdl/pdl_parser.py
@@ -139,6 +139,11 @@ def parse_dict(
 #             if block.pdl__trace is not None:
 #                 for trace in block.pdl__trace:
 #                     iter_blocks(f, trace)
+#         case MapBlock():
+#             iter_blocks(f, block.map)
+#             if block.pdl__trace is not None:
+#                 for trace in block.pdl__trace:
+#                     iter_blocks(f, trace)
 #         case ErrorBlock():
 #             iter_blocks(f, block.program)
 #         case ReadBlock():
diff --git a/src/pdl/pdl_scheduler.py b/src/pdl/pdl_scheduler.py
index 5e126ae7f..04e725476 100644
--- a/src/pdl/pdl_scheduler.py
+++ b/src/pdl/pdl_scheduler.py
@@ -51,6 +51,8 @@ def color_of(kind: BlockKind):
             color = None
         case BlockKind.REPEAT:
             color = None
+        case BlockKind.MAP:
+            color = None
         case BlockKind.READ:
             color = None
         case BlockKind.INCLUDE:
diff --git a/tests/results/examples/map-reduce/python-reduce.0.result b/tests/results/examples/map-reduce/python-reduce.0.result
new file mode 100644
index 000000000..9a037142a
--- /dev/null
+++ b/tests/results/examples/map-reduce/python-reduce.0.result
@@ -0,0 +1 @@
+10
\ No newline at end of file
diff --git a/tests/results/examples/map-reduce/reduce.0.result b/tests/results/examples/map-reduce/reduce.0.result
new file mode 100644
index 000000000..9a037142a
--- /dev/null
+++ b/tests/results/examples/map-reduce/reduce.0.result
@@ -0,0 +1 @@
+10
\ No newline at end of file
diff --git a/tests/test_for.py b/tests/test_for.py
index b7a4b4b43..88cdaf20f 100644
--- a/tests/test_for.py
+++ b/tests/test_for.py
@@ -3,160 +3,338 @@
 from pdl.pdl import exec_dict, exec_str
 from pdl.pdl_interpreter import PDLRuntimeError
 
-for_data = {
-    "description": "For block example",
-    "text": [
-        {
-            "for": {
-                "i": [1, 2, 3, 4],
-            },
-            "repeat": "${ i }\n",
-        }
-    ],
-}
+
+def for_data(loop_kind):
+    return {
+        "description": "For block example",
+        "text": [
+            {
+                "for": {
+                    "i": [1, 2, 3, 4],
+                },
+                loop_kind: "${ i }\n",
+            }
+        ],
+    }
 
 
 def test_for_data():
-    text = exec_dict(for_data)
-    assert text == "1\n2\n3\n4\n"
+    for loop_kind in ["repeat", "map"]:
+        text = exec_dict(for_data(loop_kind))
+        assert text == "1\n2\n3\n4\n"
 
 
-for_data1 = {
-    "description": "For block example",
-    "text": [
-        {
-            "for": {"i": [1, 2, 3, 4], "name": ["A", "B", "C", "D"]},
-            "repeat": "${ i }: ${ name }\n",
-        }
-    ],
-}
+def for_data1(loop_kind):
+    return {
+        "description": "For block example",
+        "text": [
+            {
+                "for": {"i": [1, 2, 3, 4], "name": ["A", "B", "C", "D"]},
+                loop_kind: "${ i }: ${ name }\n",
+            }
+        ],
+    }
 
 
 def test_for_data1():
-    text = exec_dict(for_data1)
-    assert text == "1: A\n2: B\n3: C\n4: D\n"
-
-
-for_data2 = {
-    "description": "For block example",
-    "defs": {"ids": {"data": [5, 6, 7, 8]}},
-    "text": [
-        {
-            "for": {"i": [1, 2, 3, 4], "name": ["A", "B", "C", "D"], "id": "${ ids }"},
-            "repeat": "${ i }: ${ name }: ${ id }\n",
-        }
-    ],
-}
+    for loop_kind in ["repeat", "map"]:
+        text = exec_dict(for_data1(loop_kind))
+        assert text == "1: A\n2: B\n3: C\n4: D\n"
+
+
+def for_data2(loop_kind):
+    return {
+        "description": "For block example",
+        "defs": {"ids": {"data": [5, 6, 7, 8]}},
+        "text": [
+            {
+                "for": {
+                    "i": [1, 2, 3, 4],
+                    "name": ["A", "B", "C", "D"],
+                    "id": "${ ids }",
+                },
+                loop_kind: "${ i }: ${ name }: ${ id }\n",
+            }
+        ],
+    }
 
 
 def test_for_data2():
-    text = exec_dict(for_data2)
-    assert text == "1: A: 5\n2: B: 6\n3: C: 7\n4: D: 8\n"
-
-
-for_data3 = {
-    "description": "For block example",
-    "defs": {"ids": {"data": [5, 6]}},
-    "text": [
-        {
-            "for": {"i": [1, 2, 3, 4], "name": ["A", "B", "C", "D"], "id": "${ ids }"},
-            "repeat": "${ i }: ${ name }: ${ id }\n",
-            "join": {"as": "array"},
-        }
-    ],
-}
+    for loop_kind in ["repeat", "map"]:
+        text = exec_dict(for_data2(loop_kind))
+        assert text == "1: A: 5\n2: B: 6\n3: C: 7\n4: D: 8\n"
+
+
+def for_data3(loop_kind):
+    return {
+        "description": "For block example",
+        "defs": {"ids": {"data": [5, 6]}},
+        "text": [
+            {
+                "for": {
+                    "i": [1, 2, 3, 4],
+                    "name": ["A", "B", "C", "D"],
+                    "id": "${ ids }",
+                },
+                loop_kind: "${ i }: ${ name }: ${ id }\n",
+                "join": {"as": "array"},
+            }
+        ],
+    }
 
 
 def test_for_data3():
     with pytest.raises(PDLRuntimeError):
-        exec_dict(for_data3)
+        for loop_kind in ["repeat", "map"]:
+            exec_dict(for_data3(loop_kind))
 
 
-for_data4 = {
-    "description": "For block def",
-    "text": [
-        {
-            "def": "x",
-            "for": {"i": [1, 2, 3, 4]},
-            "repeat": "${ i + 1 }",
-            "join": {"as": "array"},
-        }
-    ],
-}
+def for_data4(loop_kind):
+    return {
+        "description": "For block def",
+        "text": [
+            {
+                "def": "x",
+                "for": {"i": [1, 2, 3, 4]},
+                loop_kind: "${ i + 1 }",
+                "join": {"as": "array"},
+            }
+        ],
+    }
 
 
 def test_for_data4():
-    result = exec_dict(for_data4, output="all")
-    assert result["result"] == "[2, 3, 4, 5]"
-    assert result["scope"]["x"] == [2, 3, 4, 5]
-
-
-for_as_text_data4 = {
-    "description": "For block def",
-    "text": [
-        {
-            "def": "x",
-            "for": {"i": [1, 2, 3, 4]},
-            "repeat": "${ i + 1 }",
-        }
-    ],
-}
+    for loop_kind in ["repeat", "map"]:
+        result = exec_dict(for_data4(loop_kind), output="all")
+        assert result["result"] == "[2, 3, 4, 5]"
+        assert result["scope"]["x"] == [2, 3, 4, 5]
+
+
+def for_as_text_data4(loop_kind):
+    return {
+        "description": "For block def",
+        "text": [
+            {
+                "def": "x",
+                "for": {"i": [1, 2, 3, 4]},
+                "repeat": "${ i + 1 }",
+            }
+        ],
+    }
 
 
 def test_for_as_text_data4():
-    result = exec_dict(for_as_text_data4, output="all")
-    assert result["result"] == "2345"
-    assert result["scope"]["x"] == "2345"
-
-
-for_data5 = {
-    "description": "For block def",
-    "text": [
-        {
-            "def": "x",
-            "text": {
-                "for": {"i": [1, 2, 3, 4]},
-                "repeat": "${ i }",
-                "join": {"as": "array"},
-            },
-        }
-    ],
-}
+    for loop_kind in ["repeat", "map"]:
+        result = exec_dict(for_as_text_data4(loop_kind), output="all")
+        assert result["result"] == "2345"
+        assert result["scope"]["x"] == "2345"
+
+
+def for_data5(loop_kind):
+    return {
+        "description": "For block def",
+        "text": [
+            {
+                "def": "x",
+                "text": {
+                    "for": {"i": [1, 2, 3, 4]},
+                    loop_kind: "${ i }",
+                    "join": {"as": "array"},
+                },
+            }
+        ],
+    }
 
 
 def test_for_data5():
-    result = exec_dict(for_data5, output="all")
-    assert result["result"] == "[1, 2, 3, 4]"
-    assert result["scope"]["x"] == "[1, 2, 3, 4]"
+    for loop_kind in ["repeat", "map"]:
+        result = exec_dict(for_data5(loop_kind), output="all")
+        assert result["result"] == "[1, 2, 3, 4]"
+        assert result["scope"]["x"] == "[1, 2, 3, 4]"
 
 
 def test_for_nested_array():
-    prog_str = """
+    for loop_kind in ["repeat", "map"]:
+        prog_str = f"""
 for:
     i: [1,2,3]
 repeat:
     for:
         j: [1,2]
-    repeat: "${i}${j}"
+    {loop_kind}: "${{i}}${{j}}"
     join:
         as: array
 join:
     as: array
 """
-    result = exec_str(prog_str)
-    assert result == [["11", "12"], ["21", "22"], ["31", "32"]]
+        result = exec_str(prog_str)
+        assert result == [["11", "12"], ["21", "22"], ["31", "32"]]
 
 
 def test_for_nested_text():
-    prog_str = r"""
+    for loop_kind1 in ["repeat", "map"]:
+        for loop_kind2 in ["repeat", "map"]:
+            prog_str = f"""
 for:
     i: [1,2,3]
-repeat:
+{loop_kind1}:
     for:
         j: [1,2]
-    repeat: "${i}${j}"
+    {loop_kind2}: "${{i}}${{j}}"
+join:
+    with: "\\n"
+"""
+            result = exec_str(prog_str)
+            assert result == "\n".join(["1112", "2122", "3132"])
+
+
+def for_scope(loop_kind):
+    return {
+        "defs": {"x": 0},
+        "text": {
+            "for": {"i": [1, 2, 3, 4]},
+            loop_kind: {"defs": {"x": "${ x + i }"}, "data": "${ i + x }"},
+            "join": {"as": "array"},
+        },
+    }
+
+
+def test_for_scope():
+    for loop_kind in ["repeat", "map"]:
+        result = exec_dict(for_scope(loop_kind), output="all")
+        match loop_kind:
+            case "repeat":
+                assert result["result"] == "[2, 5, 9, 14]"
+                assert result["scope"]["x"] == 10
+            case "map":
+                assert result["result"] == "[2, 4, 6, 8]"
+                assert result["scope"]["x"] == 0
+
+
+def for_index(loop_kind):
+    return {
+        "text": {
+            "index": "idx",
+            "for": {"i": [1, 2, 3, 4]},
+            loop_kind: "${ i + idx }",
+            "join": {"as": "array"},
+        },
+    }
+
+
+def test_for_index():
+    for loop_kind in ["repeat", "map"]:
+        result = exec_dict(for_index(loop_kind), output="all")
+        assert result["result"] == "[1, 3, 5, 7]"
+
+
+def for_context(loop_kind):
+    return {
+        "lastOf": [
+            "Hello",
+            {
+                "for": {
+                    "i": [
+                        1,
+                        2,
+                        3,
+                    ]
+                },
+                loop_kind: "${ pdl_context.serialize('litellm') }",
+                "join": {"as": "array"},
+            },
+        ]
+    }
+
+
+def test_for_context():
+    for loop_kind in ["repeat", "map"]:
+        result = exec_dict(for_context(loop_kind), output="all")
+        match loop_kind:
+            case "repeat":
+                assert result["result"] == [
+                    [{"role": "user", "content": "Hello", "pdl__defsite": "lastOf.0"}],
+                    [
+                        {
+                            "role": "user",
+                            "content": "Hello",
+                            "pdl__defsite": "lastOf.0",
+                        },
+                        {
+                            "role": "user",
+                            "content": [
+                                {
+                                    "role": "user",
+                                    "content": "Hello",
+                                    "pdl__defsite": "lastOf.0",
+                                }
+                            ],
+                            "pdl__defsite": "lastOf.1.repeat.0",
+                        },
+                    ],
+                    [
+                        {
+                            "role": "user",
+                            "content": "Hello",
+                            "pdl__defsite": "lastOf.0",
+                        },
+                        {
+                            "role": "user",
+                            "content": [
+                                {
+                                    "role": "user",
+                                    "content": "Hello",
+                                    "pdl__defsite": "lastOf.0",
+                                }
+                            ],
+                            "pdl__defsite": "lastOf.1.repeat.0",
+                        },
+                        {
+                            "role": "user",
+                            "content": [
+                                {
+                                    "role": "user",
+                                    "content": "Hello",
+                                    "pdl__defsite": "lastOf.0",
+                                },
+                                {
+                                    "role": "user",
+                                    "content": [
+                                        {
+                                            "role": "user",
+                                            "content": "Hello",
+                                            "pdl__defsite": "lastOf.0",
+                                        }
+                                    ],
+                                    "pdl__defsite": "lastOf.1.repeat.0",
+                                },
+                            ],
+                            "pdl__defsite": "lastOf.1.repeat.1",
+                        },
+                    ],
+                ]
+            case "map":
+                assert result["result"] == [
+                    [{"role": "user", "content": "Hello", "pdl__defsite": "lastOf.0"}],
+                    [{"role": "user", "content": "Hello", "pdl__defsite": "lastOf.0"}],
+                    [{"role": "user", "content": "Hello", "pdl__defsite": "lastOf.0"}],
+                ]
+
+
+def test_for_reduce():
+    for loop_kind1 in ["repeat", "map"]:
+        prog_str = f"""
+defs:
+  plus:
+    lang: python
+    code: |
+      import operator
+      result = operator.add
+for:
+  i: [1,2,3,4]
+{loop_kind1}: ${{ i }}
 join:
-    with: "\n"
+  reduce: ${{ plus }}
 """
-    result = exec_str(prog_str)
-    assert result == "\n".join(["1112", "2122", "3132"])
+        result = exec_str(prog_str)
+        assert result == 10

From 20bfa3107661be74abc27626de17b724d7ebfe14 Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Tue, 29 Jul 2025 22:28:46 -0400
Subject: [PATCH 079/107] refactor: refactor AST to generate simpler JSON
 Schema (#1079)

Before:
```
% wc src/pdl/pdl-schema.json
   12553   22420  313983 src/pdl/pdl-schema.json
```
After:
```
% wc src/pdl/pdl-schema.json
    4209   11048  125514 src/pdl/pdl-schema.json
```
---------

Signed-off-by: Louis Mandel 
---
 pdl-live-react/src/helpers.ts        |     6 +-
 pdl-live-react/src/pdl_ast.d.ts      |  5556 ++++-------
 src/pdl/pdl-schema.json              | 13190 +++++--------------------
 src/pdl/pdl_ast.py                   |   195 +-
 src/pdl/pdl_interpreter.py           |     3 +
 src/pdl/pdl_schema_error_analyzer.py |     7 +
 6 files changed, 4382 insertions(+), 14575 deletions(-)

diff --git a/pdl-live-react/src/helpers.ts b/pdl-live-react/src/helpers.ts
index 10edab5df..b63cfa1ef 100644
--- a/pdl-live-react/src/helpers.ts
+++ b/pdl-live-react/src/helpers.ts
@@ -6,7 +6,7 @@ import type {
   TextBlock,
   ArgsBlock,
   CodeBlock,
-  PdlModelInput,
+  ModelInput,
   LocalizedExpression,
 } from "./pdl_ast"
 import { match, P } from "ts-pattern"
@@ -232,10 +232,10 @@ export function hasMessage(block: PdlBlock): block is MessageBearing {
 
 export function hasInput(block: PdlBlock): block is
   | (Omit & {
-      pdl__model_input: NonNullable
+      pdl__model_input: NonNullable
     })
   | (Omit & {
-      pdl__model_input: NonNullable
+      pdl__model_input: NonNullable
     }) {
   const mb = block as ModelBlock
   return Array.isArray(mb.pdl__model_input) && mb.pdl__model_input.length > 0
diff --git a/pdl-live-react/src/pdl_ast.d.ts b/pdl-live-react/src/pdl_ast.d.ts
index 4fb0710ee..8c203db9b 100644
--- a/pdl-live-react/src/pdl_ast.d.ts
+++ b/pdl-live-react/src/pdl_ast.d.ts
@@ -36,11 +36,6 @@ export type Program =
   | ErrorBlock
   | EmptyBlock
   | null
-/**
- * Documentation associated to the block.
- *
- */
-export type Description = string | null
 export type Enum = unknown[]
 export type PdlTypeType =
   | (
@@ -68,2717 +63,459 @@ export type PdlTypeType =
     }
   | null
 export type Type = string | string[]
+export type BlockType =
+  | boolean
+  | number
+  | string
+  | FunctionBlock
+  | CallBlock
+  | LitellmModelBlock
+  | GraniteioModelBlock
+  | CodeBlock
+  | ArgsBlock
+  | GetBlock
+  | DataBlock
+  | IfBlock
+  | MatchBlock
+  | RepeatBlock
+  | MapBlock
+  | TextBlock
+  | LastOfBlock
+  | ArrayBlock
+  | ObjectBlock
+  | MessageBlock
+  | ReadBlock
+  | IncludeBlock
+  | ImportBlock
+  | ErrorBlock
+  | EmptyBlock
+  | null
 /**
- * Documentation associated to the block.
- *
- */
-export type Description1 = string | null
-/**
- * Documentation associated to the block.
- *
- */
-export type Description2 = string | null
-/**
- * Documentation associated to the block.
- *
+ * Values allowed in the `contribute` field.
  */
-export type Description3 = string | null
+export type ContributeTarget = "result" | "context"
+export type Value = LocalizedExpression | unknown[] | string
+export type Path = string[]
+export type File = string
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description4 = string | null
+export type ContributeType = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type ParserType = ("json" | "jsonl" | "yaml") | PdlParser | RegexParser
+export type Regex = string
+export type Mode = "search" | "match" | "fullmatch" | "split" | "findall"
+export type ModelInput = {
+  [k: string]: unknown
+}[]
+export type PdlIsLeaf = true
+export type Kind = "call"
 /**
- * Documentation associated to the block.
+ * Function to call.
  *
  */
-export type Description5 = string | null
+export type Call = LocalizedExpression | FunctionBlock | string
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description6 = string | null
+export type ContributeType1 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf1 = true
+export type Kind1 = "model"
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description7 = string | null
+export type ContributeType2 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf2 = true
+export type Kind2 = "model"
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description8 = string | null
+export type ContributeType3 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf3 = true
+export type Kind3 = "code"
 /**
- * Documentation associated to the block.
+ * Programming language of the code.
  *
  */
-export type Description9 = string | null
+export type Lang = "python" | "command" | "jinja" | "pdl" | "ipython"
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description10 = string | null
+export type ContributeType4 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf4 = true
+export type Kind4 = "code"
+export type Lang1 = "command"
+export type ExpressionStr = LocalizedExpression | string
 /**
- * Documentation associated to the block.
+ * The argument vector to spawn.
  *
  */
-export type Description11 = string | null
+export type Args1 = ExpressionStr[]
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description12 = string | null
+export type ContributeType5 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf5 = true
+export type Kind5 = "get"
 /**
- * Documentation associated to the block.
- *
+ * Name of the variable to access.
  */
-export type Description13 = string | null
+export type Get = string
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description14 = string | null
+export type ContributeType6 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf6 = true
+export type Kind6 = "data"
 /**
- * Documentation associated to the block.
- *
+ * Do not evaluate expressions inside strings.
  */
-export type Description15 = string | null
+export type Raw = boolean
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description16 = string | null
+export type ContributeType7 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf7 = false
+export type IndependentEnum = "independent" | "dependent"
+export type Kind7 = "if"
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description17 = string | null
+export type ContributeType8 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf8 = false
+export type IndependentEnum1 = "independent" | "dependent"
+export type Kind8 = "match"
+export type PatternType =
+  | boolean
+  | number
+  | string
+  | OrPattern
+  | ArrayPattern
+  | ObjectPattern
+  | AnyPattern
+  | null
+export type Anyof = PatternType[]
+export type Array = PatternType[]
+export type Any = null
+export type ExpressionBool = LocalizedExpression | boolean | string
+export type PdlCaseResult = boolean | null
+export type PdlIfResult = boolean | null
+export type PdlMatched = boolean | null
 /**
- * Documentation associated to the block.
+ * List of cases to match.
  *
  */
-export type Description18 = string | null
+export type With = MatchCase[]
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description19 = string | null
+export type ContributeType9 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf9 = false
+export type IndependentEnum2 = "independent" | "dependent"
+export type Kind9 = "repeat"
 /**
- * Documentation associated to the block.
+ * Arrays to iterate over.
  *
  */
-export type Description20 = string | null
+export type For = {
+  [k: string]: LocalizedExpression | unknown[] | string
+} | null
 /**
- * Documentation associated to the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Description21 = string | null
+export type ContributeType10 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf10 = false
+export type IndependentEnum3 = "independent" | "dependent"
+export type Kind10 = "map"
 /**
- * Name of the variable used to store the result of the execution of the block.
+ * Arrays to iterate over.
  *
  */
-export type Def = string | null
-/**
- * Values allowed in the `contribute` field.
- */
-export type ContributeTarget = "result" | "context"
-export type Value = LocalizedExpression | unknown[] | string
-export type Path = string[]
-export type File = string
+export type For1 = {
+  [k: string]: LocalizedExpression | unknown[] | string
+} | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute = (
+export type ContributeType11 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
     }
 )[]
+export type PdlIsLeaf11 = false
+export type IndependentEnum4 = "independent" | "dependent"
+export type Kind11 = "text"
 /**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-export type Description22 = string | null
-export type Pdl =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-export type Description23 = string | null
-export type Regex = string
-export type Mode = "search" | "match" | "fullmatch" | "split" | "findall"
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
+ * Body of the text.
  *
  */
-export type Retry = number | null
+export type Text = BlockType | BlockType[]
 /**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type TraceErrorOnRetry = boolean | string | null
+export type ContributeType12 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf12 = false
+export type IndependentEnum5 = "independent" | "dependent"
+export type Kind12 = "lastOf"
 /**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
+ * Sequence of blocks to execute.
  */
-export type Role = string | null
+export type Lastof = BlockType[]
 /**
- * Current context
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type PdlContext =
+export type ContributeType13 = (
+  | ContributeTarget
   | {
-      [k: string]: unknown
-    }[]
-  | null
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf13 = false
+export type IndependentEnum6 = "independent" | "dependent"
+export type Kind13 = "array"
 /**
- * Unique identifier for this block
- *
+ * Elements of the array.
  */
-export type PdlId = string | null
-export type StartNanos = number | null
-export type EndNanos = number | null
-export type FirstUseNanos = number | null
-export type Timezone = string | null
-export type PdlIsLeaf = true
-export type Kind = "empty"
+export type Array1 = BlockType[]
 /**
- * Name of the variable used to store the result of the execution of the block.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Def1 = string | null
+export type ContributeType14 = (
+  | ContributeTarget
+  | {
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf14 = false
+export type IndependentEnum7 = "independent" | "dependent"
+export type Kind14 = "object"
+export type Object2 =
+  | {
+      [k: string]: BlockType
+    }
+  | BlockType[]
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute1 = (
+export type ContributeType15 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
     }
 )[]
+export type PdlIsLeaf15 = true
+export type Kind15 = "message"
 /**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser1 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback1 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry1 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry1 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role1 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext1 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId1 = string | null
-export type PdlIsLeaf1 = true
-export type Kind1 = "error"
-/**
- * Error message.
- *
- */
-export type Msg = string
-/**
- * Block that raised the error.
- *
- */
-export type Program1 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def2 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute2 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser2 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback2 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry2 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry2 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role2 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext2 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId2 = string | null
-export type PdlIsLeaf2 = true
-export type Kind2 = "import"
-/**
- * Name of the file to import.
- *
- */
-export type Import = string
-export type PdlTrace =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def3 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute3 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser3 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback3 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry3 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry3 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role3 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext3 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId3 = string | null
-export type PdlIsLeaf3 = false
-export type IndependentEnum = "independent" | "dependent"
-export type Kind3 = "include"
-/**
- * Name of the file to include.
- *
- */
-export type Include = string
-export type PdlTrace1 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def4 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute4 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser4 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback4 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry4 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry4 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role4 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext4 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId4 = string | null
-export type PdlIsLeaf4 = true
-export type Kind4 = "read"
-/**
- * Name of the file to read. If `None`, read the standard input.
- *
- */
-export type Read = LocalizedExpression | string | null
-/**
- * Message to prompt the user to enter a value.
- *
- */
-export type Message = string | null
-/**
- * Indicate if one or multiple lines should be read.
- *
- */
-export type Multiline = boolean
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def5 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute5 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser5 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback5 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry5 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry5 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role5 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext5 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId5 = string | null
-export type PdlIsLeaf5 = true
-export type Kind5 = "message"
-/**
- * Content of the message.
- */
-export type Content =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * For example, the name of the tool that was invoked, for which this message is the tool response.
- */
-export type Name = LocalizedExpression | string | null
-/**
- * The id of the tool invocation for which this message is the tool response.
- */
-export type ToolCallId = LocalizedExpression | string | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def6 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute6 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser6 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback6 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry6 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry6 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role6 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext6 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId6 = string | null
-export type PdlIsLeaf6 = false
-export type IndependentEnum1 = "independent" | "dependent"
-export type Kind6 = "object"
-export type Object1 =
-  | {
-      [k: string]:
-        | boolean
-        | number
-        | string
-        | FunctionBlock
-        | CallBlock
-        | LitellmModelBlock
-        | GraniteioModelBlock
-        | CodeBlock
-        | ArgsBlock
-        | GetBlock
-        | DataBlock
-        | IfBlock
-        | MatchBlock
-        | RepeatBlock
-        | MapBlock
-        | TextBlock
-        | LastOfBlock
-        | ArrayBlock
-        | ObjectBlock
-        | MessageBlock
-        | ReadBlock
-        | IncludeBlock
-        | ImportBlock
-        | ErrorBlock
-        | EmptyBlock
-        | null
-    }
-  | (
-      | boolean
-      | number
-      | string
-      | FunctionBlock
-      | CallBlock
-      | LitellmModelBlock
-      | GraniteioModelBlock
-      | CodeBlock
-      | ArgsBlock
-      | GetBlock
-      | DataBlock
-      | IfBlock
-      | MatchBlock
-      | RepeatBlock
-      | MapBlock
-      | TextBlock
-      | LastOfBlock
-      | ArrayBlock
-      | ObjectBlock
-      | MessageBlock
-      | ReadBlock
-      | IncludeBlock
-      | ImportBlock
-      | ErrorBlock
-      | EmptyBlock
-      | null
-    )[]
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def7 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute7 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser7 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback7 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry7 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry7 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role7 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext7 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId7 = string | null
-export type PdlIsLeaf7 = false
-export type IndependentEnum2 = "independent" | "dependent"
-export type Kind7 = "array"
-/**
- * Elements of the array.
- */
-export type Array = (
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-)[]
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def8 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute8 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser8 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback8 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry8 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry8 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role8 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext8 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId8 = string | null
-export type PdlIsLeaf8 = false
-export type IndependentEnum3 = "independent" | "dependent"
-export type Kind8 = "lastOf"
-/**
- * Sequence of blocks to execute.
- */
-export type Lastof = (
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-)[]
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def9 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute9 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser9 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback9 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry9 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry9 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role9 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext9 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId9 = string | null
-export type PdlIsLeaf9 = false
-export type IndependentEnum4 = "independent" | "dependent"
-export type Kind9 = "text"
-/**
- * Body of the text.
- *
- */
-export type Text =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | (
-      | boolean
-      | number
-      | string
-      | FunctionBlock
-      | CallBlock
-      | LitellmModelBlock
-      | GraniteioModelBlock
-      | CodeBlock
-      | ArgsBlock
-      | GetBlock
-      | DataBlock
-      | IfBlock
-      | MatchBlock
-      | RepeatBlock
-      | MapBlock
-      | TextBlock
-      | LastOfBlock
-      | ArrayBlock
-      | ObjectBlock
-      | MessageBlock
-      | ReadBlock
-      | IncludeBlock
-      | ImportBlock
-      | ErrorBlock
-      | EmptyBlock
-      | null
-    )[]
-  | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def10 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute10 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser10 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback10 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry10 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry10 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role10 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext10 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId10 = string | null
-export type PdlIsLeaf10 = false
-export type IndependentEnum5 = "independent" | "dependent"
-export type Kind10 = "map"
-/**
- * Arrays to iterate over.
- *
- */
-export type For = {
-  [k: string]: LocalizedExpression | unknown[] | string
-} | null
-/**
- * Name of the variable containing the loop iteration.
- *
- */
-export type Index = string | null
-/**
- * Body of the iterator.
- *
- */
-export type Map =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * Maximal number of iterations to perform.
- *
- */
-export type Maxiterations = LocalizedExpression | number | string | null
-/**
- * Define how to combine the result of each iteration.
- *
- */
-export type Join = JoinText | JoinArray | JoinObject | JoinLastOf | JoinReduce
-/**
- * String concatenation of the result of each iteration.
- *
- */
-export type As = "text"
-/**
- * String used to concatenate each iteration of the loop.
- *
- */
-export type With = string
-/**
- * Return the result of each iteration as an array.
- *
- */
-export type As1 = "array"
-/**
- * Return the union of the objects created at each iteration.
- *
- */
-export type As2 = "object"
-/**
- * Return the result of the last iteration.
- *
- */
-export type As3 = "lastOf"
-export type As4 = "reduce"
-/**
- * Function used to combine the results.
- */
-export type Reduce = LocalizedExpression | string
-export type PdlTrace2 =
-  | (
-      | boolean
-      | number
-      | string
-      | FunctionBlock
-      | CallBlock
-      | LitellmModelBlock
-      | GraniteioModelBlock
-      | CodeBlock
-      | ArgsBlock
-      | GetBlock
-      | DataBlock
-      | IfBlock
-      | MatchBlock
-      | RepeatBlock
-      | MapBlock
-      | TextBlock
-      | LastOfBlock
-      | ArrayBlock
-      | ObjectBlock
-      | MessageBlock
-      | ReadBlock
-      | IncludeBlock
-      | ImportBlock
-      | ErrorBlock
-      | EmptyBlock
-      | null
-    )[]
-  | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def11 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute11 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser11 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback11 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry11 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry11 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role11 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext11 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId11 = string | null
-export type PdlIsLeaf11 = false
-export type IndependentEnum6 = "independent" | "dependent"
-export type Kind11 = "repeat"
-/**
- * Arrays to iterate over.
- *
- */
-export type For1 = {
-  [k: string]: LocalizedExpression | unknown[] | string
-} | null
-/**
- * Name of the variable containing the loop iteration.
- *
- */
-export type Index1 = string | null
-/**
- * Condition to stay at the beginning of the loop.
- *
- */
-export type While = LocalizedExpression | boolean | string
-/**
- * Body of the loop.
- *
- */
-export type Repeat =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * Condition to exit at the end of the loop.
- *
- */
-export type Until = LocalizedExpression | boolean | string
-/**
- * Maximal number of iterations to perform.
- *
- */
-export type Maxiterations1 = LocalizedExpression | number | string | null
-/**
- * Define how to combine the result of each iteration.
- *
- */
-export type Join1 = JoinText | JoinArray | JoinObject | JoinLastOf | JoinReduce
-export type PdlTrace3 =
-  | (
-      | boolean
-      | number
-      | string
-      | FunctionBlock
-      | CallBlock
-      | LitellmModelBlock
-      | GraniteioModelBlock
-      | CodeBlock
-      | ArgsBlock
-      | GetBlock
-      | DataBlock
-      | IfBlock
-      | MatchBlock
-      | RepeatBlock
-      | MapBlock
-      | TextBlock
-      | LastOfBlock
-      | ArrayBlock
-      | ObjectBlock
-      | MessageBlock
-      | ReadBlock
-      | IncludeBlock
-      | ImportBlock
-      | ErrorBlock
-      | EmptyBlock
-      | null
-    )[]
-  | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def12 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute12 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser12 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback12 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry12 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry12 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role12 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext12 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId12 = string | null
-export type PdlIsLeaf12 = false
-export type IndependentEnum7 = "independent" | "dependent"
-export type Kind12 = "match"
-export type Case =
-  | boolean
-  | number
-  | string
-  | OrPattern
-  | ArrayPattern
-  | ObjectPattern
-  | AnyPattern
-  | null
-export type Def13 = string | null
-export type Def14 = string | null
-export type Def15 = string | null
-export type Def16 = string | null
-export type Any = null
-export type Array1 = (
-  | boolean
-  | number
-  | string
-  | OrPattern
-  | ArrayPattern
-  | ObjectPattern
-  | AnyPattern
-  | null
-)[]
-export type Anyof = (
-  | boolean
-  | number
-  | string
-  | OrPattern
-  | ArrayPattern
-  | ObjectPattern
-  | AnyPattern
-  | null
-)[]
-export type If = LocalizedExpression | boolean | string | null
-export type Then =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-export type PdlCaseResult = boolean | null
-export type PdlIfResult = boolean | null
-export type PdlMatched = boolean | null
-/**
- * List of cases to match.
- *
- */
-export type With1 = MatchCase[]
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def17 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute13 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser13 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback13 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry13 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry13 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role13 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext13 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId13 = string | null
-export type PdlIsLeaf13 = false
-export type IndependentEnum8 = "independent" | "dependent"
-export type Kind13 = "if"
-/**
- * Condition.
- *
- */
-export type If1 = LocalizedExpression | boolean | string
-/**
- * Branch to execute if the condition is true.
- *
- */
-export type Then1 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * Branch to execute if the condition is false.
- *
- */
-export type Else =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def18 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute14 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser14 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback14 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry14 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry14 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role14 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext14 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId14 = string | null
-export type PdlIsLeaf14 = true
-export type Kind14 = "data"
-/**
- * Do not evaluate expressions inside strings.
- */
-export type Raw = boolean
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def19 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute15 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser15 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback15 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry15 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry15 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role15 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext15 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId15 = string | null
-export type PdlIsLeaf15 = true
-export type Kind15 = "get"
-/**
- * Name of the variable to access.
- */
-export type Get = string
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def20 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute16 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser16 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback16 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry16 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry16 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role16 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext16 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId16 = string | null
-export type PdlIsLeaf16 = true
-export type Kind16 = "code"
-export type Lang = "command"
-/**
- * The argument vector to spawn.
- *
- */
-export type Args = (LocalizedExpression | string)[]
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def21 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute17 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser17 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback17 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry17 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry17 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role17 = string | null
-/**
- * Current context
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type PdlContext17 =
+export type ContributeType16 = (
+  | ContributeTarget
   | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId17 = string | null
-export type PdlIsLeaf17 = true
-export type Kind17 = "code"
-/**
- * Programming language of the code.
- *
- */
-export type Lang1 = "python" | "command" | "jinja" | "pdl" | "ipython"
-/**
- * Code to execute.
- *
- */
-export type Code =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
+      [k: string]: ContributeValue
+    }
+)[]
+export type PdlIsLeaf16 = true
+export type Kind16 = "read"
 /**
- * Name of the variable used to store the result of the execution of the block.
+ * Indicate if one or multiple lines should be read.
  *
  */
-export type Def22 = string | null
+export type Multiline = boolean
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute18 = (
+export type ContributeType17 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
     }
 )[]
+export type PdlIsLeaf17 = false
+export type IndependentEnum8 = "independent" | "dependent"
+export type Kind17 = "include"
 /**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser18 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback18 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry18 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+ * Name of the file to include.
  *
  */
-export type TraceErrorOnRetry18 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role18 = string | null
+export type Include = string
 /**
- * Current context
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type PdlContext18 =
+export type ContributeType18 = (
+  | ContributeTarget
   | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId18 = string | null
+      [k: string]: ContributeValue
+    }
+)[]
 export type PdlIsLeaf18 = true
-export type Kind18 = "model"
-/**
- * Messages to send to the model.
- *
- */
-export type Input =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * Variable where to store the raw response of the model.
- *
- */
-export type Modelresponse = string | null
-export type CompletionTokens = number | null
-export type PromptTokens = number | null
-export type PdlModelInput =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
+export type Kind18 = "import"
 /**
- * Optional field to ensure that the block is using granite-io.
+ * Name of the file to import.
  *
  */
-export type Platform = "granite-io"
+export type Import = string
 /**
- * Parameters sent to the model.
+ * Indicate if the block contributes to the result and background context.
  *
  */
-export type Parameters =
-  | LocalizedExpression
+export type ContributeType19 = (
+  | ContributeTarget
   | {
-      [k: string]: unknown
+      [k: string]: ContributeValue
     }
-  | string
-  | null
+)[]
+export type PdlIsLeaf19 = true
+export type Kind19 = "error"
 /**
- * Name of the variable used to store the result of the execution of the block.
+ * Error message.
  *
  */
-export type Def23 = string | null
+export type Msg = string
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute19 = (
+export type ContributeType20 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
     }
 )[]
+export type PdlIsLeaf20 = true
+export type Kind20 = "empty"
+export type ExpressionInt = LocalizedExpression | number | string
 /**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser19 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback19 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry19 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+ * String concatenation of the result of each iteration.
  *
  */
-export type TraceErrorOnRetry19 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role19 = string | null
+export type As = "text"
 /**
- * Current context
+ * String used to concatenate each iteration of the loop.
  *
  */
-export type PdlContext19 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
+export type With1 = string
 /**
- * Unique identifier for this block
+ * Return the result of each iteration as an array.
  *
  */
-export type PdlId19 = string | null
-export type PdlIsLeaf19 = true
-export type Kind19 = "model"
+export type As1 = "array"
 /**
- * Messages to send to the model.
+ * Return the union of the objects created at each iteration.
  *
  */
-export type Input1 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
+export type As2 = "object"
+/**
+ * Return the result of the last iteration.
+ *
+ */
+export type As3 = "lastOf"
+export type As4 = "reduce"
+/**
+ * Function used to combine the results.
+ */
+export type Reduce = LocalizedExpression | string
+export type PdlTrace = BlockType[] | null
+export type PdlTrace1 = BlockType[] | null
+/**
+ * Optional field to ensure that the block is using granite-io.
+ *
+ */
+export type Platform = "granite-io"
 /**
- * Variable where to store the raw response of the model.
+ * Parameters sent to the model.
  *
  */
-export type Modelresponse1 = string | null
-export type PdlModelInput1 =
+export type Parameters =
+  | LocalizedExpression
   | {
       [k: string]: unknown
-    }[]
+    }
+  | string
   | null
 /**
  * Optional field to ensure that the block is using LiteLLM.
  *
  */
 export type Platform1 = "litellm"
-/**
- * Name of the model following the LiteLLM convention.
- *
- */
-export type Model1 = LocalizedExpression | string
 /**
  * Parameters to send to the model.
  *
@@ -2838,208 +575,16 @@ export type ModelList = unknown[] | string | null
 export type MockResponse = string | null
 export type CustomLlmProvider = string | null
 export type MaxRetries = number | string | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def24 = string | null
-/**
- * Indicate if the block contributes to the result and background context.
- *
- */
-export type Contribute20 = (
-  | ContributeTarget
-  | {
-      [k: string]: ContributeValue
-    }
-)[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser20 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback20 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry20 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry20 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role20 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext20 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId20 = string | null
-export type PdlIsLeaf20 = true
-export type Kind20 = "call"
-/**
- * Function to call.
- *
- */
-export type Call = LocalizedExpression | FunctionBlock | string
-export type PdlTrace4 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * Name of the variable used to store the result of the execution of the block.
- *
- */
-export type Def25 = string | null
 /**
  * Indicate if the block contributes to the result and background context.
  *
  */
-export type Contribute21 = (
+export type ContributeType21 = (
   | ContributeTarget
   | {
       [k: string]: ContributeValue
     }
 )[]
-/**
- * Parser to use to construct a value out of a string result.
- */
-export type Parser21 =
-  | ("json" | "jsonl" | "yaml")
-  | PdlParser
-  | RegexParser
-  | null
-/**
- * Block to execute in case of error.
- *
- */
-export type Fallback21 =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
-/**
- * The maximum number of times to retry when an error occurs within a block.
- *
- */
-export type Retry21 = number | null
-/**
- * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
- *
- */
-export type TraceErrorOnRetry21 = boolean | string | null
-/**
- * Role associated to the block and sub-blocks.
- * Typical roles are `system`, `user`, and `assistant`,
- * but there may be other roles such as `available_tools`.
- */
-export type Role21 = string | null
-/**
- * Current context
- *
- */
-export type PdlContext21 =
-  | {
-      [k: string]: unknown
-    }[]
-  | null
-/**
- * Unique identifier for this block
- *
- */
-export type PdlId21 = string | null
 export type PdlIsLeaf21 = true
 export type Kind21 = "function"
 /**
@@ -3049,37 +594,6 @@ export type Kind21 = "function"
 export type Function = {
   [k: string]: PdlTypeType
 } | null
-/**
- * Body of the function.
- *
- */
-export type Return =
-  | boolean
-  | number
-  | string
-  | FunctionBlock
-  | CallBlock
-  | LitellmModelBlock
-  | GraniteioModelBlock
-  | CodeBlock
-  | ArgsBlock
-  | GetBlock
-  | DataBlock
-  | IfBlock
-  | MatchBlock
-  | RepeatBlock
-  | MapBlock
-  | TextBlock
-  | LastOfBlock
-  | ArrayBlock
-  | ObjectBlock
-  | MessageBlock
-  | ReadBlock
-  | IncludeBlock
-  | ImportBlock
-  | ErrorBlock
-  | EmptyBlock
-  | null
 /**
  * Function signature computed from the function definition.
  *
@@ -3117,7 +631,11 @@ export type PdlBlock =
  * Function declaration.
  */
 export interface FunctionBlock {
-  description?: Description
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -3147,23 +665,87 @@ export interface FunctionBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs
-  def?: Def25
-  contribute?: Contribute21
-  parser?: Parser21
-  fallback?: Fallback21
-  retry?: Retry21
-  trace_error_on_retry?: TraceErrorOnRetry21
-  role?: Role21
-  pdl__context?: PdlContext21
-  pdl__id?: PdlId21
-  pdl__result?: unknown
-  pdl__location?: PdlLocationType | null
-  pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf21
-  kind?: Kind21
-  function: Function
-  return: Return
+  defs?: Defs
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType21
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
+  pdl__result?: unknown
+  pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
+  pdl__timing?: PdlTiming | null
+  pdl__is_leaf?: PdlIsLeaf21
+  kind?: Kind21
+  function: Function
+  /**
+   * Body of the function.
+   *
+   */
+  return:
+    | boolean
+    | number
+    | number
+    | string
+    | FunctionBlock
+    | CallBlock
+    | LitellmModelBlock
+    | GraniteioModelBlock
+    | CodeBlock
+    | ArgsBlock
+    | GetBlock
+    | DataBlock
+    | IfBlock
+    | MatchBlock
+    | RepeatBlock
+    | MapBlock
+    | TextBlock
+    | LastOfBlock
+    | ArrayBlock
+    | ObjectBlock
+    | MessageBlock
+    | ReadBlock
+    | IncludeBlock
+    | ImportBlock
+    | ErrorBlock
+    | EmptyBlock
+    | null
   signature?: Signature
 }
 /**
@@ -3200,39 +782,17 @@ export interface Object {
  *
  */
 export interface Defs {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  [k: string]: BlockType
 }
 /**
  * Calling a function.
  */
 export interface CallBlock {
-  description?: Description1
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -3263,56 +823,162 @@ export interface CallBlock {
       }
     | null
   defs?: Defs1
-  def?: Def24
-  contribute?: Contribute20
-  parser?: Parser20
-  fallback?: Fallback20
-  retry?: Retry20
-  trace_error_on_retry?: TraceErrorOnRetry20
-  role?: Role20
-  pdl__context?: PdlContext20
-  pdl__id?: PdlId20
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf20
-  kind?: Kind20
+  pdl__is_leaf?: PdlIsLeaf
+  kind?: Kind
   call: Call
   args?: unknown
-  pdl__trace?: PdlTrace4
+  pdl__trace?: BlockType | null
 }
 /**
  * Set of definitions executed before the execution of the block.
  *
  */
 export interface Defs1 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
+  [k: string]: BlockType
+}
+/**
+ * Contribution of a specific value instead of the default one.
+ */
+export interface ContributeValue {
+  value: Value
+}
+export interface LocalizedExpression {
+  pdl__expr: PdlExpr
+  pdl__result?: unknown
+  pdl__location?: PdlLocationType | null
+}
+export interface PdlExpr {
+  [k: string]: unknown
+}
+/**
+ * Internal data structure to keep track of the source location information.
+ */
+export interface PdlLocationType {
+  path: Path
+  file: File
+  table: Table
+}
+export interface Table {
+  [k: string]: number
+}
+/**
+ * Use a PDL program as a parser specification (experimental).
+ */
+export interface PdlParser {
+  description?: string | null
+  spec?:
+    | (
+        | "null"
+        | "boolean"
+        | "string"
+        | "number"
+        | "integer"
+        | "array"
+        | "object"
+        | "bool"
+        | "str"
+        | "float"
+        | "int"
+        | "list"
+        | "obj"
+      )
+    | EnumPdlType
+    | PdlTypeType[]
+    | OptionalPdlType
+    | JsonSchemaTypePdlType
+    | ObjectPdlType
+    | {
+        [k: string]: PdlTypeType
+      }
+    | null
+  pdl: BlockType
+}
+/**
+ * A regular expression parser.
+ */
+export interface RegexParser {
+  description?: string | null
+  spec?:
+    | (
+        | "null"
+        | "boolean"
+        | "string"
+        | "number"
+        | "integer"
+        | "array"
+        | "object"
+        | "bool"
+        | "str"
+        | "float"
+        | "int"
+        | "list"
+        | "obj"
+      )
+    | EnumPdlType
+    | PdlTypeType[]
+    | OptionalPdlType
+    | JsonSchemaTypePdlType
+    | ObjectPdlType
+    | {
+        [k: string]: PdlTypeType
+      }
     | null
+  regex: Regex
+  mode?: Mode
+}
+/**
+ * Internal data structure to record timing information in the trace.
+ */
+export interface PdlTiming {
+  start_nanos?: number | null
+  end_nanos?: number | null
+  first_use_nanos?: number | null
+  timezone?: string | null
 }
 /**
  * Call an LLM through [the LiteLLM API](https://docs.litellm.ai/).
@@ -3325,7 +991,11 @@ export interface Defs1 {
  * ```
  */
 export interface LitellmModelBlock {
-  description?: Description2
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -3356,38 +1026,58 @@ export interface LitellmModelBlock {
       }
     | null
   defs?: Defs2
-  def?: Def23
-  contribute?: Contribute19
-  parser?: Parser19
-  fallback?: Fallback19
-  retry?: Retry19
-  trace_error_on_retry?: TraceErrorOnRetry19
-  role?: Role19
-  pdl__context?: PdlContext19
-  pdl__id?: PdlId19
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType1
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf19
-  kind?: Kind19
-  input?: Input1
-  modelResponse?: Modelresponse1
+  pdl__is_leaf?: PdlIsLeaf1
+  kind?: Kind1
   /**
-   * Tokens consumed during model call
+   * Messages to send to the model.
    *
    */
-  pdl__usage?: PdlUsage | null
-  pdl__model_input?: PdlModelInput1
-  platform?: Platform1
-  model: Model1
-  parameters?: Parameters1
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs2 {
-  [k: string]:
+  input?:
     | boolean
     | number
     | string
@@ -3414,12 +1104,41 @@ export interface Defs2 {
     | ErrorBlock
     | EmptyBlock
     | null
+  /**
+   * Variable where to store the raw response of the model.
+   *
+   */
+  modelResponse?: string | null
+  /**
+   * Tokens consumed during model call
+   *
+   */
+  pdl__usage?: PdlUsage | null
+  pdl__model_input?: ModelInput | null
+  platform?: Platform1
+  /**
+   * Name of the model following the LiteLLM convention.
+   *
+   */
+  model: LocalizedExpression | string
+  parameters?: Parameters1
+}
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs2 {
+  [k: string]: BlockType
 }
 /**
  * Call an LLM through the granite-io API.
  */
 export interface GraniteioModelBlock {
-  description?: Description3
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -3450,38 +1169,58 @@ export interface GraniteioModelBlock {
       }
     | null
   defs?: Defs3
-  def?: Def22
-  contribute?: Contribute18
-  parser?: Parser18
-  fallback?: Fallback18
-  retry?: Retry18
-  trace_error_on_retry?: TraceErrorOnRetry18
-  role?: Role18
-  pdl__context?: PdlContext18
-  pdl__id?: PdlId18
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType2
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf18
-  kind?: Kind18
-  input?: Input
-  modelResponse?: Modelresponse
+  pdl__is_leaf?: PdlIsLeaf2
+  kind?: Kind2
   /**
-   * Tokens consumed during model call
+   * Messages to send to the model.
    *
    */
-  pdl__usage?: PdlUsage | null
-  pdl__model_input?: PdlModelInput
-  platform?: Platform
-  processor: unknown
-  parameters?: Parameters
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs3 {
-  [k: string]:
+  input?:
     | boolean
     | number
     | string
@@ -3508,6 +1247,27 @@ export interface Defs3 {
     | ErrorBlock
     | EmptyBlock
     | null
+  /**
+   * Variable where to store the raw response of the model.
+   *
+   */
+  modelResponse?: string | null
+  /**
+   * Tokens consumed during model call
+   *
+   */
+  pdl__usage?: PdlUsage | null
+  pdl__model_input?: ModelInput | null
+  platform?: Platform
+  processor: unknown
+  parameters?: Parameters
+}
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs3 {
+  [k: string]: BlockType
 }
 /**
  * Execute a piece of code.
@@ -3522,7 +1282,11 @@ export interface Defs3 {
  * ```
  */
 export interface CodeBlock {
-  description?: Description4
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -3553,29 +1317,59 @@ export interface CodeBlock {
       }
     | null
   defs?: Defs4
-  def?: Def21
-  contribute?: Contribute17
-  parser?: Parser17
-  fallback?: Fallback17
-  retry?: Retry17
-  trace_error_on_retry?: TraceErrorOnRetry17
-  role?: Role17
-  pdl__context?: PdlContext17
-  pdl__id?: PdlId17
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType3
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf17
-  kind?: Kind17
-  lang: Lang1
-  code: Code
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs4 {
-  [k: string]:
+  pdl__is_leaf?: PdlIsLeaf3
+  kind?: Kind3
+  lang: Lang
+  /**
+   * Code to execute.
+   *
+   */
+  code:
     | boolean
     | number
     | string
@@ -3603,6 +1397,13 @@ export interface Defs4 {
     | EmptyBlock
     | null
 }
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs4 {
+  [k: string]: BlockType
+}
 /**
  * Execute a command line, which will spawn a subprocess with the given argument vector. Note: if you need a shell script execution, you must wrap your command line in /bin/sh or some shell of your choosing.
  *
@@ -3615,7 +1416,11 @@ export interface Defs4 {
  * ```
  */
 export interface ArgsBlock {
-  description?: Description5
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -3646,55 +1451,62 @@ export interface ArgsBlock {
       }
     | null
   defs?: Defs5
-  def?: Def20
-  contribute?: Contribute16
-  parser?: Parser16
-  fallback?: Fallback16
-  retry?: Retry16
-  trace_error_on_retry?: TraceErrorOnRetry16
-  role?: Role16
-  pdl__context?: PdlContext16
-  pdl__id?: PdlId16
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType4
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf16
-  kind?: Kind16
-  lang?: Lang
-  args: Args
+  pdl__is_leaf?: PdlIsLeaf4
+  kind?: Kind4
+  lang?: Lang1
+  args: Args1
 }
 /**
  * Set of definitions executed before the execution of the block.
  *
  */
 export interface Defs5 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  [k: string]: BlockType
 }
 /**
  * Get the value of a variable.
@@ -3702,7 +1514,11 @@ export interface Defs5 {
  * The GetBlock is deprecated.  Use DataBlock instead.
  */
 export interface GetBlock {
-  description?: Description6
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -3733,20 +1549,53 @@ export interface GetBlock {
       }
     | null
   defs?: Defs6
-  def?: Def19
-  contribute?: Contribute15
-  parser?: Parser15
-  fallback?: Fallback15
-  retry?: Retry15
-  trace_error_on_retry?: TraceErrorOnRetry15
-  role?: Role15
-  pdl__context?: PdlContext15
-  pdl__id?: PdlId15
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType5
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf15
-  kind?: Kind15
+  pdl__is_leaf?: PdlIsLeaf5
+  kind?: Kind5
   get: Get
 }
 /**
@@ -3754,33 +1603,7 @@ export interface GetBlock {
  *
  */
 export interface Defs6 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  [k: string]: BlockType
 }
 /**
  * Arbitrary value, equivalent to JSON.
@@ -3807,7 +1630,11 @@ export interface Defs6 {
  * ```
  */
 export interface DataBlock {
-  description?: Description7
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -3838,55 +1665,62 @@ export interface DataBlock {
       }
     | null
   defs?: Defs7
-  def?: Def18
-  contribute?: Contribute14
-  parser?: Parser14
-  fallback?: Fallback14
-  retry?: Retry14
-  trace_error_on_retry?: TraceErrorOnRetry14
-  role?: Role14
-  pdl__context?: PdlContext14
-  pdl__id?: PdlId14
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType6
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
-  pdl__location?: PdlLocationType | null
-  pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf14
-  kind?: Kind14
-  data: unknown
-  raw?: Raw
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs7 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
+  pdl__timing?: PdlTiming | null
+  pdl__is_leaf?: PdlIsLeaf6
+  kind?: Kind6
+  data: unknown
+  raw?: Raw
+}
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs7 {
+  [k: string]: BlockType
 }
 /**
  * Conditional control structure.
@@ -3902,7 +1736,11 @@ export interface Defs7 {
  * ```
  */
 export interface IfBlock {
-  description?: Description8
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -3933,31 +1771,64 @@ export interface IfBlock {
       }
     | null
   defs?: Defs8
-  def?: Def17
-  contribute?: Contribute13
-  parser?: Parser13
-  fallback?: Fallback13
-  retry?: Retry13
-  trace_error_on_retry?: TraceErrorOnRetry13
-  role?: Role13
-  pdl__context?: PdlContext13
-  pdl__id?: PdlId13
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType7
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf13
-  context?: IndependentEnum8
-  kind?: Kind13
-  if: If1
-  then: Then1
-  else?: Else
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs8 {
-  [k: string]:
+  pdl__is_leaf?: PdlIsLeaf7
+  context?: IndependentEnum
+  kind?: Kind7
+  /**
+   * Condition.
+   *
+   */
+  if: LocalizedExpression | boolean | string
+  /**
+   * Branch to execute if the condition is true.
+   *
+   */
+  then:
     | boolean
     | number
     | string
@@ -3984,6 +1855,18 @@ export interface Defs8 {
     | ErrorBlock
     | EmptyBlock
     | null
+  /**
+   * Branch to execute if the condition is false.
+   *
+   */
+  else?: BlockType | null
+}
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs8 {
+  [k: string]: BlockType
 }
 /**
  * Match control structure.
@@ -4006,7 +1889,11 @@ export interface Defs8 {
  * - then: Too low
  */
 export interface MatchBlock {
-  description?: Description9
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4037,56 +1924,105 @@ export interface MatchBlock {
       }
     | null
   defs?: Defs9
-  def?: Def12
-  contribute?: Contribute12
-  parser?: Parser12
-  fallback?: Fallback12
-  retry?: Retry12
-  trace_error_on_retry?: TraceErrorOnRetry12
-  role?: Role12
-  pdl__context?: PdlContext12
-  pdl__id?: PdlId12
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType8
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf12
-  context?: IndependentEnum7
-  kind?: Kind12
+  pdl__is_leaf?: PdlIsLeaf8
+  context?: IndependentEnum1
+  kind?: Kind8
   match: unknown
-  with: With1
+  with: With
 }
 /**
  * Set of definitions executed before the execution of the block.
  *
  */
 export interface Defs9 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  [k: string]: BlockType
+}
+/**
+ * Case of a match.
+ */
+export interface MatchCase {
+  case?: PatternType | null
+  if?: ExpressionBool | null
+  then: BlockType
+  pdl__case_result?: PdlCaseResult
+  pdl__if_result?: PdlIfResult
+  pdl__matched?: PdlMatched
+}
+/**
+ * Match any of the patterns.
+ */
+export interface OrPattern {
+  def?: string | null
+  anyOf: Anyof
+}
+/**
+ * Match an array.
+ */
+export interface ArrayPattern {
+  def?: string | null
+  array: Array
+}
+/**
+ * Match an object.
+ */
+export interface ObjectPattern {
+  def?: string | null
+  object: Object1
+}
+export interface Object1 {
+  [k: string]: PatternType
+}
+/**
+ * Match any value.
+ */
+export interface AnyPattern {
+  def?: string | null
+  any: Any
 }
 /**
  * Repeat the execution of a block sequentially.
@@ -4115,7 +2051,11 @@ export interface Defs9 {
  * ```
  */
 export interface RepeatBlock {
-  description?: Description10
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4146,36 +2086,70 @@ export interface RepeatBlock {
       }
     | null
   defs?: Defs10
-  def?: Def11
-  contribute?: Contribute11
-  parser?: Parser11
-  fallback?: Fallback11
-  retry?: Retry11
-  trace_error_on_retry?: TraceErrorOnRetry11
-  role?: Role11
-  pdl__context?: PdlContext11
-  pdl__id?: PdlId11
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType9
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf11
-  context?: IndependentEnum6
-  kind?: Kind11
-  for?: For1
-  index?: Index1
-  while?: While
-  repeat: Repeat
-  until?: Until
-  maxIterations?: Maxiterations1
-  join?: Join1
-  pdl__trace?: PdlTrace3
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs10 {
-  [k: string]:
+  pdl__is_leaf?: PdlIsLeaf9
+  context?: IndependentEnum2
+  kind?: Kind9
+  for?: For
+  /**
+   * Name of the variable containing the loop iteration.
+   *
+   */
+  index?: string | null
+  /**
+   * Condition to stay at the beginning of the loop.
+   *
+   */
+  while?: LocalizedExpression | boolean | string
+  /**
+   * Body of the loop.
+   *
+   */
+  repeat:
     | boolean
     | number
     | string
@@ -4202,6 +2176,29 @@ export interface Defs10 {
     | ErrorBlock
     | EmptyBlock
     | null
+  /**
+   * Condition to exit at the end of the loop.
+   *
+   */
+  until?: LocalizedExpression | boolean | string
+  /**
+   * Maximal number of iterations to perform.
+   *
+   */
+  maxIterations?: ExpressionInt | null
+  /**
+   * Define how to combine the result of each iteration.
+   *
+   */
+  join?: JoinText | JoinArray | JoinObject | JoinLastOf | JoinReduce
+  pdl__trace?: PdlTrace1
+}
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs10 {
+  [k: string]: BlockType
 }
 /**
  * Independent executions of  a block.
@@ -4228,7 +2225,11 @@ export interface Defs10 {
  * ```
  */
 export interface MapBlock {
-  description?: Description11
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4259,34 +2260,65 @@ export interface MapBlock {
       }
     | null
   defs?: Defs11
-  def?: Def10
-  contribute?: Contribute10
-  parser?: Parser10
-  fallback?: Fallback10
-  retry?: Retry10
-  trace_error_on_retry?: TraceErrorOnRetry10
-  role?: Role10
-  pdl__context?: PdlContext10
-  pdl__id?: PdlId10
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType10
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
-  pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf10
-  context?: IndependentEnum5
-  kind?: Kind10
-  for?: For
-  index?: Index
-  map: Map
-  maxIterations?: Maxiterations
-  join?: Join
-  pdl__trace?: PdlTrace2
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs11 {
-  [k: string]:
+  /**
+   * Execution timing information.
+   */
+  pdl__timing?: PdlTiming | null
+  pdl__is_leaf?: PdlIsLeaf10
+  context?: IndependentEnum3
+  kind?: Kind10
+  for?: For1
+  /**
+   * Name of the variable containing the loop iteration.
+   *
+   */
+  index?: string | null
+  /**
+   * Body of the iterator.
+   *
+   */
+  map:
     | boolean
     | number
     | string
@@ -4313,12 +2345,34 @@ export interface Defs11 {
     | ErrorBlock
     | EmptyBlock
     | null
+  /**
+   * Maximal number of iterations to perform.
+   *
+   */
+  maxIterations?: ExpressionInt | null
+  /**
+   * Define how to combine the result of each iteration.
+   *
+   */
+  join?: JoinText | JoinArray | JoinObject | JoinLastOf | JoinReduce
+  pdl__trace?: PdlTrace
+}
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs11 {
+  [k: string]: BlockType
 }
 /**
  * Create the concatenation of the stringify version of the result of each block of the list of blocks.
  */
 export interface TextBlock {
-  description?: Description12
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4349,21 +2403,54 @@ export interface TextBlock {
       }
     | null
   defs?: Defs12
-  def?: Def9
-  contribute?: Contribute9
-  parser?: Parser9
-  fallback?: Fallback9
-  retry?: Retry9
-  trace_error_on_retry?: TraceErrorOnRetry9
-  role?: Role9
-  pdl__context?: PdlContext9
-  pdl__id?: PdlId9
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType11
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf9
+  pdl__is_leaf?: PdlIsLeaf11
   context?: IndependentEnum4
-  kind?: Kind9
+  kind?: Kind11
   text: Text
 }
 /**
@@ -4371,39 +2458,17 @@ export interface TextBlock {
  *
  */
 export interface Defs12 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  [k: string]: BlockType
 }
 /**
  * Return the value of the last block if the list of blocks.
  */
 export interface LastOfBlock {
-  description?: Description13
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4434,21 +2499,54 @@ export interface LastOfBlock {
       }
     | null
   defs?: Defs13
-  def?: Def8
-  contribute?: Contribute8
-  parser?: Parser8
-  fallback?: Fallback8
-  retry?: Retry8
-  trace_error_on_retry?: TraceErrorOnRetry8
-  role?: Role8
-  pdl__context?: PdlContext8
-  pdl__id?: PdlId8
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType12
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf8
-  context?: IndependentEnum3
-  kind?: Kind8
+  pdl__is_leaf?: PdlIsLeaf12
+  context?: IndependentEnum5
+  kind?: Kind12
   lastOf: Lastof
 }
 /**
@@ -4456,39 +2554,17 @@ export interface LastOfBlock {
  *
  */
 export interface Defs13 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  [k: string]: BlockType
 }
 /**
  * Return the array of values computed by each block of the list of blocks.
  */
 export interface ArrayBlock {
-  description?: Description14
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4519,61 +2595,72 @@ export interface ArrayBlock {
       }
     | null
   defs?: Defs14
-  def?: Def7
-  contribute?: Contribute7
-  parser?: Parser7
-  fallback?: Fallback7
-  retry?: Retry7
-  trace_error_on_retry?: TraceErrorOnRetry7
-  role?: Role7
-  pdl__context?: PdlContext7
-  pdl__id?: PdlId7
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType13
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf7
-  context?: IndependentEnum2
-  kind?: Kind7
-  array: Array
+  pdl__is_leaf?: PdlIsLeaf13
+  context?: IndependentEnum6
+  kind?: Kind13
+  array: Array1
 }
 /**
  * Set of definitions executed before the execution of the block.
  *
  */
 export interface Defs14 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  [k: string]: BlockType
 }
 /**
  * Return the object where the value of each field is defined by a block. If the body of the object is an array, the resulting object is the union of the objects computed by each element of the array.
  */
 export interface ObjectBlock {
-  description?: Description15
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4604,61 +2691,72 @@ export interface ObjectBlock {
       }
     | null
   defs?: Defs15
-  def?: Def6
-  contribute?: Contribute6
-  parser?: Parser6
-  fallback?: Fallback6
-  retry?: Retry6
-  trace_error_on_retry?: TraceErrorOnRetry6
-  role?: Role6
-  pdl__context?: PdlContext6
-  pdl__id?: PdlId6
-  pdl__result?: unknown
-  pdl__location?: PdlLocationType | null
-  pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf6
-  context?: IndependentEnum1
-  kind?: Kind6
-  object: Object1
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs15 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType14
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
+  pdl__result?: unknown
+  pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
+  pdl__timing?: PdlTiming | null
+  pdl__is_leaf?: PdlIsLeaf14
+  context?: IndependentEnum7
+  kind?: Kind14
+  object: Object2
+}
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs15 {
+  [k: string]: BlockType
 }
 /**
  * Create a message.
  */
 export interface MessageBlock {
-  description?: Description16
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4689,30 +2787,57 @@ export interface MessageBlock {
       }
     | null
   defs?: Defs16
-  def?: Def5
-  contribute?: Contribute5
-  parser?: Parser5
-  fallback?: Fallback5
-  retry?: Retry5
-  trace_error_on_retry?: TraceErrorOnRetry5
-  role?: Role5
-  pdl__context?: PdlContext5
-  pdl__id?: PdlId5
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType15
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf5
-  kind?: Kind5
-  content: Content
-  name?: Name
-  tool_call_id?: ToolCallId
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs16 {
-  [k: string]:
+  pdl__is_leaf?: PdlIsLeaf15
+  kind?: Kind15
+  /**
+   * Content of the message.
+   */
+  content:
     | boolean
     | number
     | string
@@ -4739,6 +2864,21 @@ export interface Defs16 {
     | ErrorBlock
     | EmptyBlock
     | null
+  /**
+   * For example, the name of the tool that was invoked, for which this message is the tool response.
+   */
+  name?: ExpressionStr | null
+  /**
+   * The id of the tool invocation for which this message is the tool response.
+   */
+  tool_call_id?: ExpressionStr | null
+}
+/**
+ * Set of definitions executed before the execution of the block.
+ *
+ */
+export interface Defs16 {
+  [k: string]: BlockType
 }
 /**
  * Read from a file or standard input.
@@ -4756,7 +2896,11 @@ export interface Defs16 {
  * ```
  */
 export interface ReadBlock {
-  description?: Description17
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4787,22 +2931,63 @@ export interface ReadBlock {
       }
     | null
   defs?: Defs17
-  def?: Def4
-  contribute?: Contribute4
-  parser?: Parser4
-  fallback?: Fallback4
-  retry?: Retry4
-  trace_error_on_retry?: TraceErrorOnRetry4
-  role?: Role4
-  pdl__context?: PdlContext4
-  pdl__id?: PdlId4
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType16
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf4
-  kind?: Kind4
-  read: Read
-  message?: Message
+  pdl__is_leaf?: PdlIsLeaf16
+  kind?: Kind16
+  /**
+   * Name of the file to read. If `None`, read the standard input.
+   *
+   */
+  read: ExpressionStr | null
+  /**
+   * Message to prompt the user to enter a value.
+   *
+   */
+  message?: string | null
   multiline?: Multiline
 }
 /**
@@ -4810,39 +2995,17 @@ export interface ReadBlock {
  *
  */
 export interface Defs17 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  [k: string]: BlockType
 }
 /**
  * Include a PDL file.
  */
 export interface IncludeBlock {
-  description?: Description18
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -4873,147 +3036,73 @@ export interface IncludeBlock {
       }
     | null
   defs?: Defs18
-  def?: Def3
-  contribute?: Contribute3
-  parser?: Parser3
-  fallback?: Fallback3
-  retry?: Retry3
-  trace_error_on_retry?: TraceErrorOnRetry3
-  role?: Role3
-  pdl__context?: PdlContext3
-  pdl__id?: PdlId3
-  pdl__result?: unknown
-  pdl__location?: PdlLocationType | null
-  pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf3
-  context?: IndependentEnum
-  kind?: Kind3
-  include: Include
-  pdl__trace?: PdlTrace1
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs18 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
-}
-/**
- * Import a PDL file.
- */
-export interface ImportBlock {
-  description?: Description19
   /**
-   * Type specification of the result of the block.
+   * Name of the variable used to store the result of the execution of the block.
    *
    */
-  spec?:
-    | (
-        | "null"
-        | "boolean"
-        | "string"
-        | "number"
-        | "integer"
-        | "array"
-        | "object"
-        | "bool"
-        | "str"
-        | "float"
-        | "int"
-        | "list"
-        | "obj"
-      )
-    | EnumPdlType
-    | PdlTypeType[]
-    | OptionalPdlType
-    | JsonSchemaTypePdlType
-    | ObjectPdlType
-    | {
-        [k: string]: PdlTypeType
-      }
-    | null
-  defs?: Defs19
-  def?: Def2
-  contribute?: Contribute2
-  parser?: Parser2
-  fallback?: Fallback2
-  retry?: Retry2
-  trace_error_on_retry?: TraceErrorOnRetry2
-  role?: Role2
-  pdl__context?: PdlContext2
-  pdl__id?: PdlId2
+  def?: string | null
+  contribute?: ContributeType17
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf2
-  kind?: Kind2
-  import: Import
-  pdl__trace?: PdlTrace
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs19 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+  pdl__is_leaf?: PdlIsLeaf17
+  context?: IndependentEnum8
+  kind?: Kind17
+  include: Include
+  pdl__trace?: BlockType | null
 }
 /**
- * Block representing an error generated at runtime.
+ * Set of definitions executed before the execution of the block.
+ *
  */
-export interface ErrorBlock {
-  description?: Description20
+export interface Defs18 {
+  [k: string]: BlockType
+}
+/**
+ * Import a PDL file.
+ */
+export interface ImportBlock {
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -5043,62 +3132,73 @@ export interface ErrorBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs20
-  def?: Def1
-  contribute?: Contribute1
-  parser?: Parser1
-  fallback?: Fallback1
-  retry?: Retry1
-  trace_error_on_retry?: TraceErrorOnRetry1
-  role?: Role1
-  pdl__context?: PdlContext1
-  pdl__id?: PdlId1
+  defs?: Defs19
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType18
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf1
-  kind?: Kind1
-  msg: Msg
-  program: Program1
+  pdl__is_leaf?: PdlIsLeaf18
+  kind?: Kind18
+  import: Import
+  pdl__trace?: BlockType | null
 }
 /**
  * Set of definitions executed before the execution of the block.
  *
  */
-export interface Defs20 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | FunctionBlock
-    | CallBlock
-    | LitellmModelBlock
-    | GraniteioModelBlock
-    | CodeBlock
-    | ArgsBlock
-    | GetBlock
-    | DataBlock
-    | IfBlock
-    | MatchBlock
-    | RepeatBlock
-    | MapBlock
-    | TextBlock
-    | LastOfBlock
-    | ArrayBlock
-    | ObjectBlock
-    | MessageBlock
-    | ReadBlock
-    | IncludeBlock
-    | ImportBlock
-    | ErrorBlock
-    | EmptyBlock
-    | null
+export interface Defs19 {
+  [k: string]: BlockType
 }
 /**
- * Block without an action. It can contain definitions.
+ * Block representing an error generated at runtime.
  */
-export interface EmptyBlock {
-  description?: Description21
+export interface ErrorBlock {
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
   /**
    * Type specification of the result of the block.
    *
@@ -5128,28 +3228,60 @@ export interface EmptyBlock {
         [k: string]: PdlTypeType
       }
     | null
-  defs?: Defs21
-  def?: Def
-  contribute?: Contribute
-  parser?: Parser
-  fallback?: Fallback
-  retry?: Retry
-  trace_error_on_retry?: TraceErrorOnRetry
-  role?: Role
-  pdl__context?: PdlContext
-  pdl__id?: PdlId
+  defs?: Defs20
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType19
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
   pdl__result?: unknown
   pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
   pdl__timing?: PdlTiming | null
-  pdl__is_leaf?: PdlIsLeaf
-  kind?: Kind
-}
-/**
- * Set of definitions executed before the execution of the block.
- *
- */
-export interface Defs21 {
-  [k: string]:
+  pdl__is_leaf?: PdlIsLeaf19
+  kind?: Kind19
+  msg: Msg
+  /**
+   * Block that raised the error.
+   *
+   */
+  program:
     | boolean
     | number
     | string
@@ -5178,67 +3310,25 @@ export interface Defs21 {
     | null
 }
 /**
- * Contribution of a specific value instead of the default one.
- */
-export interface ContributeValue {
-  value: Value
-}
-export interface LocalizedExpression {
-  pdl__expr: PdlExpr
-  pdl__result?: unknown
-  pdl__location?: PdlLocationType | null
-}
-export interface PdlExpr {
-  [k: string]: unknown
-}
-/**
- * Internal data structure to keep track of the source location information.
- */
-export interface PdlLocationType {
-  path: Path
-  file: File
-  table: Table
-}
-export interface Table {
-  [k: string]: number
-}
-/**
- * Use a PDL program as a parser specification (experimental).
+ * Set of definitions executed before the execution of the block.
+ *
  */
-export interface PdlParser {
-  description?: Description22
-  spec?:
-    | (
-        | "null"
-        | "boolean"
-        | "string"
-        | "number"
-        | "integer"
-        | "array"
-        | "object"
-        | "bool"
-        | "str"
-        | "float"
-        | "int"
-        | "list"
-        | "obj"
-      )
-    | EnumPdlType
-    | PdlTypeType[]
-    | OptionalPdlType
-    | JsonSchemaTypePdlType
-    | ObjectPdlType
-    | {
-        [k: string]: PdlTypeType
-      }
-    | null
-  pdl: Pdl
+export interface Defs20 {
+  [k: string]: BlockType
 }
 /**
- * A regular expression parser.
+ * Block without an action. It can contain definitions.
  */
-export interface RegexParser {
-  description?: Description23
+export interface EmptyBlock {
+  /**
+   * Documentation associated to the block.
+   *
+   */
+  description?: string | null
+  /**
+   * Type specification of the result of the block.
+   *
+   */
   spec?:
     | (
         | "null"
@@ -5264,24 +3354,68 @@ export interface RegexParser {
         [k: string]: PdlTypeType
       }
     | null
-  regex: Regex
-  mode?: Mode
+  defs?: Defs21
+  /**
+   * Name of the variable used to store the result of the execution of the block.
+   *
+   */
+  def?: string | null
+  contribute?: ContributeType20
+  /**
+   * Parser to use to construct a value out of a string result.
+   */
+  parser?: ParserType | null
+  /**
+   * Block to execute in case of error.
+   *
+   */
+  fallback?: BlockType | null
+  /**
+   * The maximum number of times to retry when an error occurs within a block.
+   *
+   */
+  retry?: number | null
+  /**
+   * Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
+   *
+   */
+  trace_error_on_retry?: boolean | string | null
+  /**
+   * Role associated to the block and sub-blocks.
+   * Typical roles are `system`, `user`, and `assistant`,
+   * but there may be other roles such as `available_tools`.
+   */
+  role?: string | null
+  /**
+   * Current context.
+   */
+  pdl__context?: ModelInput | null
+  /**
+   * Unique identifier for this block.
+   */
+  pdl__id?: string | null
+  pdl__result?: unknown
+  pdl__location?: PdlLocationType | null
+  /**
+   * Execution timing information.
+   */
+  pdl__timing?: PdlTiming | null
+  pdl__is_leaf?: PdlIsLeaf20
+  kind?: Kind20
 }
 /**
- * Internal data structure to record timing information in the trace.
+ * Set of definitions executed before the execution of the block.
+ *
  */
-export interface PdlTiming {
-  start_nanos?: StartNanos
-  end_nanos?: EndNanos
-  first_use_nanos?: FirstUseNanos
-  timezone?: Timezone
+export interface Defs21 {
+  [k: string]: BlockType
 }
 /**
  * Join loop iterations as a string.
  */
 export interface JoinText {
   as?: As
-  with?: With
+  with?: With1
 }
 /**
  * Join loop iterations as an array.
@@ -5308,62 +3442,12 @@ export interface JoinReduce {
   as?: As4
   reduce: Reduce
 }
-/**
- * Case of a match.
- */
-export interface MatchCase {
-  case?: Case
-  if?: If
-  then: Then
-  pdl__case_result?: PdlCaseResult
-  pdl__if_result?: PdlIfResult
-  pdl__matched?: PdlMatched
-}
-/**
- * Match any of the patterns.
- */
-export interface OrPattern {
-  def?: Def13
-  anyOf: Anyof
-}
-/**
- * Match an array.
- */
-export interface ArrayPattern {
-  def?: Def14
-  array: Array1
-}
-/**
- * Match an object.
- */
-export interface ObjectPattern {
-  def?: Def15
-  object: Object2
-}
-export interface Object2 {
-  [k: string]:
-    | boolean
-    | number
-    | string
-    | OrPattern
-    | ArrayPattern
-    | ObjectPattern
-    | AnyPattern
-    | null
-}
-/**
- * Match any value.
- */
-export interface AnyPattern {
-  def?: Def16
-  any: Any
-}
 /**
  * Internal data structure to record token consumption usage information.
  */
 export interface PdlUsage {
-  completion_tokens?: CompletionTokens
-  prompt_tokens?: PromptTokens
+  completion_tokens?: number | null
+  prompt_tokens?: number | null
   [k: string]: unknown
 }
 /**
diff --git a/src/pdl/pdl-schema.json b/src/pdl/pdl-schema.json
index 3d9575364..230ad79bd 100644
--- a/src/pdl/pdl-schema.json
+++ b/src/pdl/pdl-schema.json
@@ -5,16 +5,8 @@
       "description": "Match any value.",
       "properties": {
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Def"
+          "$ref": "#/$defs/OptionalStr",
+          "default": null
         },
         "any": {
           "const": null,
@@ -33,17 +25,9 @@
       "description": "Execute a command line, which will spawn a subprocess with the given argument vector. Note: if you need a shell script execution, you must wrap your command line in /bin/sh or some shell of your choosing.\n\nExample:\n```PDL\nargs:\n- /bin/sh\n- \"-c\"\n- \"if [[ $x = 1 ]]; then echo y; else echo n; fi\"\n```",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -52,89 +36,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -142,256 +44,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": true,
@@ -414,14 +126,7 @@
         "args": {
           "description": "The argument vector to spawn.\n    ",
           "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-              },
-              {
-                "type": "string"
-              }
-            ]
+            "$ref": "#/$defs/ExpressionStr"
           },
           "title": "Args",
           "type": "array"
@@ -438,17 +143,9 @@
       "description": "Return the array of values computed by each block of the list of blocks.",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -457,89 +154,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -547,256 +162,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": false,
@@ -817,89 +242,7 @@
         "array": {
           "description": "Elements of the array.",
           "items": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "title": "Array",
           "type": "array"
@@ -916,48 +259,12 @@
       "description": "Match an array.",
       "properties": {
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Def"
+          "$ref": "#/$defs/OptionalStr",
+          "default": null
         },
         "array": {
           "items": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/OrPattern"
-              },
-              {
-                "$ref": "#/$defs/ArrayPattern"
-              },
-              {
-                "$ref": "#/$defs/ObjectPattern"
-              },
-              {
-                "$ref": "#/$defs/AnyPattern"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/PatternType"
           },
           "title": "Array",
           "type": "array"
@@ -969,370 +276,175 @@
       "title": "ArrayPattern",
       "type": "object"
     },
-    "CallBlock": {
-      "additionalProperties": false,
-      "description": "Calling a function.",
-      "properties": {
-        "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+    "BlockType": {
+      "anyOf": [
+        {
+          "type": "boolean"
         },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null,
-          "description": "Type specification of the result of the block.\n    "
+        {
+          "type": "integer"
         },
-        "defs": {
-          "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
-          },
-          "default": {},
-          "description": "Set of definitions executed before the execution of the block.\n    ",
-          "title": "Defs",
-          "type": "object"
+        {
+          "type": "number"
         },
-        "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+        {
+          "type": "string"
         },
-        "contribute": {
-          "default": [
-            "result",
-            "context"
-          ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
+        {
+          "$ref": "#/$defs/FunctionBlock"
+        },
+        {
+          "$ref": "#/$defs/CallBlock"
+        },
+        {
+          "$ref": "#/$defs/LitellmModelBlock"
+        },
+        {
+          "$ref": "#/$defs/GraniteioModelBlock"
+        },
+        {
+          "$ref": "#/$defs/CodeBlock"
+        },
+        {
+          "$ref": "#/$defs/ArgsBlock"
+        },
+        {
+          "$ref": "#/$defs/GetBlock"
+        },
+        {
+          "$ref": "#/$defs/DataBlock"
+        },
+        {
+          "$ref": "#/$defs/IfBlock"
+        },
+        {
+          "$ref": "#/$defs/MatchBlock"
+        },
+        {
+          "$ref": "#/$defs/RepeatBlock"
+        },
+        {
+          "$ref": "#/$defs/MapBlock"
+        },
+        {
+          "$ref": "#/$defs/TextBlock"
+        },
+        {
+          "$ref": "#/$defs/LastOfBlock"
+        },
+        {
+          "$ref": "#/$defs/ArrayBlock"
+        },
+        {
+          "$ref": "#/$defs/ObjectBlock"
+        },
+        {
+          "$ref": "#/$defs/MessageBlock"
+        },
+        {
+          "$ref": "#/$defs/ReadBlock"
+        },
+        {
+          "$ref": "#/$defs/IncludeBlock"
+        },
+        {
+          "$ref": "#/$defs/ImportBlock"
+        },
+        {
+          "$ref": "#/$defs/ErrorBlock"
+        },
+        {
+          "$ref": "#/$defs/EmptyBlock"
+        },
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "CallBlock": {
+      "additionalProperties": false,
+      "description": "Calling a function.",
+      "properties": {
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Documentation associated to the block.\n    "
+        },
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null,
+          "description": "Type specification of the result of the block.\n    "
+        },
+        "defs": {
+          "additionalProperties": {
+            "$ref": "#/$defs/BlockType"
           },
-          "title": "Contribute",
-          "type": "array"
+          "default": {},
+          "description": "Set of definitions executed before the execution of the block.\n    ",
+          "title": "Defs",
+          "type": "object"
         },
-        "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
+        },
+        "contribute": {
+          "$ref": "#/$defs/ContributeType",
+          "default": [
+            "result",
+            "context"
           ],
+          "description": "Indicate if the block contributes to the result and background context.\n    "
+        },
+        "parser": {
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": true,
@@ -1376,91 +488,8 @@
           "title": "Args"
         },
         "pdl__trace": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Pdl  Trace"
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null
         }
       },
       "required": [
@@ -1474,17 +503,9 @@
       "description": "Execute a piece of code.\n\nExample:\n```PDL\nlang: python\ncode: |\n    import random\n    # (In PDL, set `result` to the output you wish for your code block.)\n    result = random.randint(1, 20)\n```",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -1493,89 +514,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -1583,256 +522,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": true,
@@ -1859,91 +608,8 @@
           "type": "string"
         },
         "code": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "description": "Code to execute.\n    ",
-          "title": "Code"
+          "$ref": "#/$defs/BlockType",
+          "description": "Code to execute.\n    "
         }
       },
       "required": [
@@ -1962,6 +628,22 @@
       "title": "ContributeTarget",
       "type": "string"
     },
+    "ContributeType": {
+      "items": {
+        "anyOf": [
+          {
+            "$ref": "#/$defs/ContributeTarget"
+          },
+          {
+            "additionalProperties": {
+              "$ref": "#/$defs/ContributeValue"
+            },
+            "type": "object"
+          }
+        ]
+      },
+      "type": "array"
+    },
     "ContributeValue": {
       "additionalProperties": false,
       "description": "Contribution of a specific value instead of the default one.",
@@ -1993,17 +675,9 @@
       "description": "Arbitrary value, equivalent to JSON.\n\nExample. As part of a `defs` section, set `numbers` to the list `[1, 2, 3, 4]`:\n```PDL\ndefs:\n  numbers:\n    data: [1, 2, 3, 4]\n```\n\nExample.  Evaluate `${ TEST.answer }` in\n[Jinja](https://jinja.palletsprojects.com/en/stable/), passing\nthe result to a regex parser with capture groups.  Set\n`EXTRACTED_GROUND_TRUTH` to an object with attribute `answer`,\na string, containing the value of the capture group.\n```PDL\n- data: ${ TEST.answer }\n  parser:\n    regex: \"(.|\\n)*#### (?P([0-9])*)\\n*\"\n    spec:\n      answer: string\n  def: EXTRACTED_GROUND_TRUTH\n```",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -2012,89 +686,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -2102,256 +694,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": true,
@@ -2396,17 +798,9 @@
       "description": "Block without an action. It can contain definitions.",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -2415,89 +809,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -2505,256 +817,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": true,
@@ -2793,17 +915,9 @@
       "description": "Block representing an error generated at runtime.",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -2812,89 +926,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -2902,256 +934,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": true,
@@ -3171,91 +1013,8 @@
           "type": "string"
         },
         "program": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "description": "Block that raised the error.\n    ",
-          "title": "Program"
+          "$ref": "#/$defs/BlockType",
+          "description": "Block that raised the error.\n    "
         }
       },
       "required": [
@@ -3265,22 +1024,50 @@
       "title": "ErrorBlock",
       "type": "object"
     },
+    "ExpressionBool": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+        },
+        {
+          "type": "boolean"
+        },
+        {
+          "type": "string"
+        }
+      ]
+    },
+    "ExpressionInt": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+        },
+        {
+          "type": "integer"
+        },
+        {
+          "type": "string"
+        }
+      ]
+    },
+    "ExpressionStr": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+        },
+        {
+          "type": "string"
+        }
+      ]
+    },
     "FunctionBlock": {
       "additionalProperties": false,
       "description": "Function declaration.",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -3289,89 +1076,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -3379,256 +1084,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": true,
@@ -3658,91 +1173,8 @@
           "title": "Function"
         },
         "return": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "description": "Body of the function.\n    ",
-          "title": "Return"
+          "$ref": "#/$defs/BlockType",
+          "description": "Body of the function.\n    "
         },
         "signature": {
           "anyOf": [
@@ -3772,17 +1204,9 @@
       "description": "Get the value of a variable.\n\nThe GetBlock is deprecated.  Use DataBlock instead.",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -3791,89 +1215,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -3881,256 +1223,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": true,
@@ -4161,17 +1313,9 @@
       "description": "Call an LLM through the granite-io API.",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -4180,89 +1324,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -4270,519 +1332,424 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
+          "$ref": "#/$defs/OptionalParserType",
+          "default": null,
+          "description": "Parser to use to construct a value out of a string result."
+        },
+        "fallback": {
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null,
+          "description": "Block to execute in case of error.\n    "
+        },
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
+        },
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
+          "default": null,
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
+        },
+        "role": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
+        },
+        "pdl__context": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": [],
+          "description": "Current context."
+        },
+        "pdl__id": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": "",
+          "description": "Unique identifier for this block."
+        },
+        "pdl__result": {
+          "$ref": "#/$defs/OptionalAny",
+          "default": null,
+          "description": "Result of the execution of the block."
+        },
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
+          "default": null
+        },
+        "pdl__timing": {
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
+        },
+        "pdl__is_leaf": {
+          "const": true,
+          "default": true,
+          "title": "Pdl  Is Leaf",
+          "type": "boolean"
+        },
+        "kind": {
+          "const": "model",
+          "default": "model",
+          "title": "Kind",
+          "type": "string"
+        },
+        "input": {
+          "$ref": "#/$defs/BlockType",
+          "default": "${ pdl_context }",
+          "description": "Messages to send to the model.\n    "
+        },
+        "modelResponse": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Variable where to store the raw response of the model.\n    "
+        },
+        "pdl__usage": {
+          "$ref": "#/$defs/OptionalPdlUsage",
+          "default": null,
+          "description": "Tokens consumed during model call\n    "
+        },
+        "pdl__model_input": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": null
+        },
+        "platform": {
+          "const": "granite-io",
+          "default": "granite-io",
+          "description": "Optional field to ensure that the block is using granite-io.\n    ",
+          "title": "Platform",
+          "type": "string"
+        },
+        "processor": {
           "anyOf": [
             {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
+              "$ref": "#/$defs/GraniteioProcessor"
             },
             {
-              "$ref": "#/$defs/RegexParser"
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
             },
+            {},
             {
-              "type": "null"
+              "type": "string"
             }
           ],
-          "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "IO Processor configuration or object.\n    ",
+          "title": "Processor"
         },
-        "fallback": {
+        "parameters": {
           "anyOf": [
             {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
             },
             {
-              "type": "number"
+              "additionalProperties": true,
+              "type": "object"
             },
             {
               "type": "string"
             },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Parameters sent to the model.\n    ",
+          "title": "Parameters"
+        }
+      },
+      "required": [
+        "processor"
+      ],
+      "title": "GraniteioModelBlock",
+      "type": "object"
+    },
+    "GraniteioProcessor": {
+      "properties": {
+        "type": {
+          "$ref": "#/$defs/OptionalExpressionStr",
+          "default": null
         },
-        "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+        "model": {
+          "$ref": "#/$defs/OptionalExpressionStr",
+          "default": null
         },
-        "trace_error_on_retry": {
+        "backend": {
           "anyOf": [
             {
-              "type": "boolean"
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
             },
             {
               "type": "string"
             },
             {
-              "type": "null"
-            }
+              "additionalProperties": true,
+              "type": "object"
+            },
+            {}
           ],
+          "title": "Backend"
+        }
+      },
+      "required": [
+        "backend"
+      ],
+      "title": "GraniteioProcessor",
+      "type": "object"
+    },
+    "IfBlock": {
+      "additionalProperties": false,
+      "description": "Conditional control structure.\n\nExample:\n```PDL\ndefs:\n  answer:\n    read:\n    message: \"Enter a number? \"\nif: ${ (answer | int) == 42 }\nthen: You won!\n```",
+      "properties": {
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Documentation associated to the block.\n    "
         },
-        "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null,
+          "description": "Type specification of the result of the block.\n    "
+        },
+        "defs": {
+          "additionalProperties": {
+            "$ref": "#/$defs/BlockType"
+          },
+          "default": {},
+          "description": "Set of definitions executed before the execution of the block.\n    ",
+          "title": "Defs",
+          "type": "object"
+        },
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
+        },
+        "contribute": {
+          "$ref": "#/$defs/ContributeType",
+          "default": [
+            "result",
+            "context"
           ],
+          "description": "Indicate if the block contributes to the result and background context.\n    "
+        },
+        "parser": {
+          "$ref": "#/$defs/OptionalParserType",
+          "default": null,
+          "description": "Parser to use to construct a value out of a string result."
+        },
+        "fallback": {
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Block to execute in case of error.\n    "
+        },
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
+        },
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
+          "default": null,
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
+        },
+        "role": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
-          "const": true,
-          "default": true,
+          "const": false,
+          "default": false,
           "title": "Pdl  Is Leaf",
           "type": "boolean"
         },
+        "context": {
+          "$ref": "#/$defs/IndependentEnum",
+          "default": "dependent"
+        },
         "kind": {
-          "const": "model",
-          "default": "model",
+          "const": "if",
+          "default": "if",
           "title": "Kind",
           "type": "string"
         },
-        "input": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": "${ pdl_context }",
-          "description": "Messages to send to the model.\n    ",
-          "title": "Input"
+        "if": {
+          "$ref": "#/$defs/ExpressionBool",
+          "description": "Condition.\n    "
         },
-        "modelResponse": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Variable where to store the raw response of the model.\n    ",
-          "title": "Modelresponse"
-        },
-        "pdl__usage": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlUsage"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Tokens consumed during model call\n    "
-        },
-        "pdl__model_input": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Pdl  Model Input"
-        },
-        "platform": {
-          "const": "granite-io",
-          "default": "granite-io",
-          "description": "Optional field to ensure that the block is using granite-io.\n    ",
-          "title": "Platform",
-          "type": "string"
-        },
-        "processor": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/GraniteioProcessor"
-            },
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {},
-            {
-              "type": "string"
-            }
-          ],
-          "description": "IO Processor configuration or object.\n    ",
-          "title": "Processor"
+        "then": {
+          "$ref": "#/$defs/BlockType",
+          "description": "Branch to execute if the condition is true.\n    "
         },
-        "parameters": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "additionalProperties": true,
-              "type": "object"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "else": {
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Parameters sent to the model.\n    ",
-          "title": "Parameters"
+          "description": "Branch to execute if the condition is false.\n    "
         }
       },
       "required": [
-        "processor"
+        "if",
+        "then"
       ],
-      "title": "GraniteioModelBlock",
+      "title": "IfBlock",
       "type": "object"
     },
-    "GraniteioProcessor": {
+    "ImportBlock": {
+      "additionalProperties": false,
+      "description": "Import a PDL file.",
       "properties": {
-        "type": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "title": "Type"
+          "description": "Documentation associated to the block.\n    "
         },
-        "model": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
           "default": null,
-          "title": "Model"
+          "description": "Type specification of the result of the block.\n    "
         },
-        "backend": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "additionalProperties": true,
-              "type": "object"
-            },
-            {}
+        "defs": {
+          "additionalProperties": {
+            "$ref": "#/$defs/BlockType"
+          },
+          "default": {},
+          "description": "Set of definitions executed before the execution of the block.\n    ",
+          "title": "Defs",
+          "type": "object"
+        },
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
+        },
+        "contribute": {
+          "$ref": "#/$defs/ContributeType",
+          "default": [
+            "result",
+            "context"
           ],
-          "title": "Backend"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
+        },
+        "parser": {
+          "$ref": "#/$defs/OptionalParserType",
+          "default": null,
+          "description": "Parser to use to construct a value out of a string result."
+        },
+        "fallback": {
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null,
+          "description": "Block to execute in case of error.\n    "
+        },
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
+        },
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
+          "default": null,
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
+        },
+        "role": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
+        },
+        "pdl__context": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": [],
+          "description": "Current context."
+        },
+        "pdl__id": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": "",
+          "description": "Unique identifier for this block."
+        },
+        "pdl__result": {
+          "$ref": "#/$defs/OptionalAny",
+          "default": null,
+          "description": "Result of the execution of the block."
+        },
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
+          "default": null
+        },
+        "pdl__timing": {
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
+        },
+        "pdl__is_leaf": {
+          "const": true,
+          "default": true,
+          "title": "Pdl  Is Leaf",
+          "type": "boolean"
+        },
+        "kind": {
+          "const": "import",
+          "default": "import",
+          "title": "Kind",
+          "type": "string"
+        },
+        "import": {
+          "description": "Name of the file to import.\n    ",
+          "title": "Import",
+          "type": "string"
+        },
+        "pdl__trace": {
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null
         }
       },
       "required": [
-        "backend"
+        "import"
       ],
-      "title": "GraniteioProcessor",
+      "title": "ImportBlock",
       "type": "object"
     },
-    "IfBlock": {
+    "IncludeBlock": {
       "additionalProperties": false,
-      "description": "Conditional control structure.\n\nExample:\n```PDL\ndefs:\n  answer:\n    read:\n    message: \"Enter a number? \"\nif: ${ (answer | int) == 42 }\nthen: You won!\n```",
+      "description": "Include a PDL file.",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -4791,89 +1758,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -4881,256 +1766,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": false,
@@ -5143,225 +1838,188 @@
           "default": "dependent"
         },
         "kind": {
-          "const": "if",
-          "default": "if",
+          "const": "include",
+          "default": "include",
           "title": "Kind",
           "type": "string"
         },
-        "if": {
+        "include": {
+          "description": "Name of the file to include.\n    ",
+          "title": "Include",
+          "type": "string"
+        },
+        "pdl__trace": {
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null
+        }
+      },
+      "required": [
+        "include"
+      ],
+      "title": "IncludeBlock",
+      "type": "object"
+    },
+    "IndependentEnum": {
+      "enum": [
+        "independent",
+        "dependent"
+      ],
+      "title": "IndependentEnum",
+      "type": "string"
+    },
+    "JoinArray": {
+      "additionalProperties": false,
+      "description": "Join loop iterations as an array.",
+      "properties": {
+        "as": {
+          "const": "array",
+          "description": "Return the result of each iteration as an array.\n    ",
+          "title": "As",
+          "type": "string"
+        }
+      },
+      "required": [
+        "as"
+      ],
+      "title": "JoinArray",
+      "type": "object"
+    },
+    "JoinLastOf": {
+      "additionalProperties": false,
+      "description": "Join loop iterations as the value of the last iteration.",
+      "properties": {
+        "as": {
+          "const": "lastOf",
+          "description": "Return the result of the last iteration.\n    ",
+          "title": "As",
+          "type": "string"
+        }
+      },
+      "required": [
+        "as"
+      ],
+      "title": "JoinLastOf",
+      "type": "object"
+    },
+    "JoinObject": {
+      "additionalProperties": false,
+      "description": "Join loop iterations as an object.",
+      "properties": {
+        "as": {
+          "const": "object",
+          "description": "Return the union of the objects created at each iteration.\n    ",
+          "title": "As",
+          "type": "string"
+        }
+      },
+      "required": [
+        "as"
+      ],
+      "title": "JoinObject",
+      "type": "object"
+    },
+    "JoinReduce": {
+      "additionalProperties": false,
+      "description": "Join loop iterations as the value of the last iteration.",
+      "properties": {
+        "as": {
+          "const": "reduce",
+          "default": "reduce",
+          "title": "As",
+          "type": "string"
+        },
+        "reduce": {
           "anyOf": [
             {
               "$ref": "#/$defs/LocalizedExpression_TypeVar_"
             },
-            {
-              "type": "boolean"
-            },
             {
               "type": "string"
             }
           ],
-          "description": "Condition.\n    ",
-          "title": "If"
+          "description": "Function used to combine the results.",
+          "title": "Reduce"
+        }
+      },
+      "required": [
+        "reduce"
+      ],
+      "title": "JoinReduce",
+      "type": "object"
+    },
+    "JoinText": {
+      "additionalProperties": false,
+      "description": "Join loop iterations as a string.",
+      "properties": {
+        "as": {
+          "const": "text",
+          "default": "text",
+          "description": "String concatenation of the result of each iteration.\n    ",
+          "title": "As",
+          "type": "string"
         },
-        "then": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "description": "Branch to execute if the condition is true.\n    ",
-          "title": "Then"
+        "with": {
+          "default": "",
+          "description": "String used to concatenate each iteration of the loop.\n    ",
+          "title": "With",
+          "type": "string"
+        }
+      },
+      "title": "JoinText",
+      "type": "object"
+    },
+    "JoinType": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/JoinText"
         },
-        "else": {
+        {
+          "$ref": "#/$defs/JoinArray"
+        },
+        {
+          "$ref": "#/$defs/JoinObject"
+        },
+        {
+          "$ref": "#/$defs/JoinLastOf"
+        },
+        {
+          "$ref": "#/$defs/JoinReduce"
+        }
+      ]
+    },
+    "JsonSchemaTypePdlType": {
+      "additionalProperties": true,
+      "description": "Json Schema with a type field.",
+      "properties": {
+        "type": {
           "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
             {
               "type": "string"
             },
             {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
+              "items": {
+                "type": "string"
+              },
+              "type": "array"
             }
           ],
-          "default": null,
-          "description": "Branch to execute if the condition is false.\n    ",
-          "title": "Else"
+          "title": "Type"
         }
       },
       "required": [
-        "if",
-        "then"
+        "type"
       ],
-      "title": "IfBlock",
+      "title": "JsonSchemaTypePdlType",
       "type": "object"
     },
-    "ImportBlock": {
+    "LastOfBlock": {
       "additionalProperties": false,
-      "description": "Import a PDL file.",
+      "description": "Return the value of the last block if the list of blocks.",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -5370,89 +2028,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -5460,169 +2036,293 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null,
+          "description": "Block to execute in case of error.\n    "
+        },
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
+        },
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
+          "default": null,
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
+        },
+        "role": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
+        },
+        "pdl__context": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": [],
+          "description": "Current context."
+        },
+        "pdl__id": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": "",
+          "description": "Unique identifier for this block."
+        },
+        "pdl__result": {
+          "$ref": "#/$defs/OptionalAny",
+          "default": null,
+          "description": "Result of the execution of the block."
+        },
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
+          "default": null
+        },
+        "pdl__timing": {
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
+        },
+        "pdl__is_leaf": {
+          "const": false,
+          "default": false,
+          "title": "Pdl  Is Leaf",
+          "type": "boolean"
+        },
+        "context": {
+          "$ref": "#/$defs/IndependentEnum",
+          "default": "dependent"
+        },
+        "kind": {
+          "const": "lastOf",
+          "default": "lastOf",
+          "title": "Kind",
+          "type": "string"
+        },
+        "lastOf": {
+          "description": "Sequence of blocks to execute.",
+          "items": {
+            "$ref": "#/$defs/BlockType"
+          },
+          "title": "Lastof",
+          "type": "array"
+        }
+      },
+      "required": [
+        "lastOf"
+      ],
+      "title": "LastOfBlock",
+      "type": "object"
+    },
+    "LitellmModelBlock": {
+      "additionalProperties": false,
+      "description": "Call an LLM through [the LiteLLM API](https://docs.litellm.ai/).\n\nExample:\n```PDL\nmodel: ollama/granite-code:8b\nparameters:\n  stop: ['!']\n```",
+      "properties": {
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Documentation associated to the block.\n    "
+        },
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null,
+          "description": "Type specification of the result of the block.\n    "
+        },
+        "defs": {
+          "additionalProperties": {
+            "$ref": "#/$defs/BlockType"
+          },
+          "default": {},
+          "description": "Set of definitions executed before the execution of the block.\n    ",
+          "title": "Defs",
+          "type": "object"
+        },
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
+        },
+        "contribute": {
+          "$ref": "#/$defs/ContributeType",
+          "default": [
+            "result",
+            "context"
+          ],
+          "description": "Indicate if the block contributes to the result and background context.\n    "
+        },
+        "parser": {
+          "$ref": "#/$defs/OptionalParserType",
+          "default": null,
+          "description": "Parser to use to construct a value out of a string result."
+        },
+        "fallback": {
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null,
+          "description": "Block to execute in case of error.\n    "
+        },
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
+        },
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
+          "default": null,
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
+        },
+        "role": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
+        },
+        "pdl__context": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": [],
+          "description": "Current context."
+        },
+        "pdl__id": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": "",
+          "description": "Unique identifier for this block."
+        },
+        "pdl__result": {
+          "$ref": "#/$defs/OptionalAny",
+          "default": null,
+          "description": "Result of the execution of the block."
+        },
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
+          "default": null
+        },
+        "pdl__timing": {
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
+        },
+        "pdl__is_leaf": {
+          "const": true,
+          "default": true,
+          "title": "Pdl  Is Leaf",
+          "type": "boolean"
+        },
+        "kind": {
+          "const": "model",
+          "default": "model",
+          "title": "Kind",
+          "type": "string"
+        },
+        "input": {
+          "$ref": "#/$defs/BlockType",
+          "default": "${ pdl_context }",
+          "description": "Messages to send to the model.\n    "
+        },
+        "modelResponse": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Variable where to store the raw response of the model.\n    "
+        },
+        "pdl__usage": {
+          "$ref": "#/$defs/OptionalPdlUsage",
+          "default": null,
+          "description": "Tokens consumed during model call\n    "
+        },
+        "pdl__model_input": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": null
+        },
+        "platform": {
+          "const": "litellm",
+          "default": "litellm",
+          "description": "Optional field to ensure that the block is using LiteLLM.\n    ",
+          "title": "Platform",
+          "type": "string"
+        },
+        "model": {
+          "$ref": "#/$defs/ExpressionStr",
+          "description": "Name of the model following the LiteLLM convention.\n    "
+        },
+        "parameters": {
+          "anyOf": [
             {
-              "$ref": "#/$defs/MessageBlock"
+              "$ref": "#/$defs/LitellmParameters"
             },
             {
-              "$ref": "#/$defs/ReadBlock"
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
             },
             {
-              "$ref": "#/$defs/IncludeBlock"
+              "additionalProperties": true,
+              "type": "object"
             },
             {
-              "$ref": "#/$defs/ImportBlock"
+              "type": "string"
             },
             {
-              "$ref": "#/$defs/ErrorBlock"
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "description": "Parameters to send to the model.\n    ",
+          "title": "Parameters"
+        }
+      },
+      "required": [
+        "model"
+      ],
+      "title": "LitellmModelBlock",
+      "type": "object"
+    },
+    "LitellmParameters": {
+      "additionalProperties": true,
+      "description": "Parameters passed to LiteLLM. More details at [https://docs.litellm.ai/docs/completion/input](https://docs.litellm.ai/docs/completion/input).\n\nNote that not all models and platforms accept all parameters.",
+      "properties": {
+        "timeout": {
+          "anyOf": [
+            {
+              "type": "number"
             },
             {
-              "$ref": "#/$defs/EmptyBlock"
+              "type": "string"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "title": "Timeout"
         },
-        "retry": {
+        "temperature": {
           "anyOf": [
             {
-              "type": "integer"
+              "type": "number"
+            },
+            {
+              "type": "string"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "title": "Temperature"
         },
-        "trace_error_on_retry": {
+        "top_p": {
           "anyOf": [
             {
-              "type": "boolean"
+              "type": "number"
             },
             {
               "type": "string"
@@ -5632,11 +2332,13 @@
             }
           ],
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "title": "Top P"
         },
-        "role": {
+        "n": {
           "anyOf": [
+            {
+              "type": "integer"
+            },
             {
               "type": "string"
             },
@@ -5645,15 +2347,16 @@
             }
           ],
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "title": "N"
         },
-        "pdl__context": {
+        "stop": {
           "anyOf": [
+            {
+              "type": "string"
+            },
             {
               "items": {
-                "additionalProperties": true,
-                "type": "object"
+                "type": "string"
               },
               "type": "array"
             },
@@ -5661,12 +2364,14 @@
               "type": "null"
             }
           ],
-          "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "default": null,
+          "title": "Stop"
         },
-        "pdl__id": {
+        "max_tokens": {
           "anyOf": [
+            {
+              "type": "integer"
+            },
             {
               "type": "string"
             },
@@ -5674,160 +2379,88 @@
               "type": "null"
             }
           ],
-          "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "default": null,
+          "title": "Max Tokens"
         },
-        "pdl__result": {
+        "presence_penalty": {
           "anyOf": [
-            {},
+            {
+              "type": "number"
+            },
+            {
+              "type": "string"
+            },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "title": "Presence Penalty"
         },
-        "pdl__location": {
+        "frequency_penalty": {
           "anyOf": [
             {
-              "$ref": "#/$defs/PdlLocationType"
+              "type": "number"
+            },
+            {
+              "type": "string"
             },
             {
               "type": "null"
             }
           ],
-          "default": null
+          "default": null,
+          "title": "Frequency Penalty"
         },
-        "pdl__timing": {
+        "logit_bias": {
           "anyOf": [
             {
-              "$ref": "#/$defs/PdlTiming"
+              "additionalProperties": true,
+              "type": "object"
+            },
+            {
+              "type": "string"
             },
             {
               "type": "null"
             }
           ],
-          "default": null
-        },
-        "pdl__is_leaf": {
-          "const": true,
-          "default": true,
-          "title": "Pdl  Is Leaf",
-          "type": "boolean"
+          "default": null,
+          "title": "Logit Bias"
         },
-        "kind": {
-          "const": "import",
-          "default": "import",
-          "title": "Kind",
-          "type": "string"
-        },
-        "import": {
-          "description": "Name of the file to import.\n    ",
-          "title": "Import",
-          "type": "string"
-        },
-        "pdl__trace": {
+        "user": {
           "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
             {
               "type": "string"
             },
             {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "title": "User"
+        },
+        "response_format": {
+          "anyOf": [
             {
-              "$ref": "#/$defs/ErrorBlock"
+              "additionalProperties": true,
+              "type": "object"
             },
             {
-              "$ref": "#/$defs/EmptyBlock"
+              "type": "string"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "title": "Pdl  Trace"
-        }
-      },
-      "required": [
-        "import"
-      ],
-      "title": "ImportBlock",
-      "type": "object"
-    },
-    "IncludeBlock": {
-      "additionalProperties": false,
-      "description": "Include a PDL file.",
-      "properties": {
-        "description": {
+          "title": "Response Format"
+        },
+        "seed": {
           "anyOf": [
+            {
+              "type": "integer"
+            },
             {
               "type": "string"
             },
@@ -5836,107 +2469,14 @@
             }
           ],
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
-        },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null,
-          "description": "Type specification of the result of the block.\n    "
-        },
-        "defs": {
-          "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
-          },
-          "default": {},
-          "description": "Set of definitions executed before the execution of the block.\n    ",
-          "title": "Defs",
-          "type": "object"
+          "title": "Seed"
         },
-        "def": {
+        "tools": {
           "anyOf": [
+            {
+              "items": {},
+              "type": "array"
+            },
             {
               "type": "string"
             },
@@ -5945,157 +2485,55 @@
             }
           ],
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
-        },
-        "contribute": {
-          "default": [
-            "result",
-            "context"
-          ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "title": "Tools"
         },
-        "parser": {
+        "tool_choice": {
           "anyOf": [
             {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
               "type": "string"
             },
             {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
+              "additionalProperties": true,
+              "type": "object"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "title": "Tool Choice"
         },
-        "fallback": {
+        "logprobs": {
           "anyOf": [
             {
               "type": "boolean"
             },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
             {
               "type": "string"
             },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "title": "Logprobs"
         },
-        "retry": {
+        "top_logprobs": {
           "anyOf": [
             {
               "type": "integer"
             },
+            {
+              "type": "string"
+            },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "title": "Top Logprobs"
         },
-        "trace_error_on_retry": {
+        "parallel_tool_calls": {
           "anyOf": [
             {
               "type": "boolean"
@@ -6108,11 +2546,14 @@
             }
           ],
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "title": "Parallel Tool Calls"
         },
-        "role": {
+        "extra_headers": {
           "anyOf": [
+            {
+              "additionalProperties": true,
+              "type": "object"
+            },
             {
               "type": "string"
             },
@@ -6121,27 +2562,25 @@
             }
           ],
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "title": "Extra Headers"
         },
-        "pdl__context": {
+        "functions": {
           "anyOf": [
             {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
+              "items": {},
               "type": "array"
             },
+            {
+              "type": "string"
+            },
             {
               "type": "null"
             }
           ],
-          "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "default": null,
+          "title": "Functions"
         },
-        "pdl__id": {
+        "function_call": {
           "anyOf": [
             {
               "type": "string"
@@ -6150,308 +2589,139 @@
               "type": "null"
             }
           ],
-          "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "default": null,
+          "title": "Function Call"
         },
-        "pdl__result": {
+        "base_url": {
           "anyOf": [
-            {},
+            {
+              "type": "string"
+            },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "title": "Base Url"
         },
-        "pdl__location": {
+        "api_version": {
           "anyOf": [
             {
-              "$ref": "#/$defs/PdlLocationType"
+              "type": "string"
             },
             {
               "type": "null"
             }
           ],
-          "default": null
+          "default": null,
+          "title": "Api Version"
         },
-        "pdl__timing": {
+        "api_key": {
           "anyOf": [
             {
-              "$ref": "#/$defs/PdlTiming"
+              "type": "string"
             },
             {
               "type": "null"
             }
           ],
-          "default": null
-        },
-        "pdl__is_leaf": {
-          "const": false,
-          "default": false,
-          "title": "Pdl  Is Leaf",
-          "type": "boolean"
-        },
-        "context": {
-          "$ref": "#/$defs/IndependentEnum",
-          "default": "dependent"
-        },
-        "kind": {
-          "const": "include",
-          "default": "include",
-          "title": "Kind",
-          "type": "string"
-        },
-        "include": {
-          "description": "Name of the file to include.\n    ",
-          "title": "Include",
-          "type": "string"
+          "default": null,
+          "title": "Api Key"
         },
-        "pdl__trace": {
+        "model_list": {
           "anyOf": [
             {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
+              "items": {},
+              "type": "array"
             },
             {
               "type": "string"
             },
             {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "title": "Model List"
+        },
+        "mock_response": {
+          "anyOf": [
             {
-              "$ref": "#/$defs/ImportBlock"
+              "type": "string"
             },
             {
-              "$ref": "#/$defs/ErrorBlock"
-            },
+              "type": "null"
+            }
+          ],
+          "default": null,
+          "title": "Mock Response"
+        },
+        "custom_llm_provider": {
+          "anyOf": [
             {
-              "$ref": "#/$defs/EmptyBlock"
+              "type": "string"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "title": "Pdl  Trace"
-        }
-      },
-      "required": [
-        "include"
-      ],
-      "title": "IncludeBlock",
-      "type": "object"
-    },
-    "IndependentEnum": {
-      "enum": [
-        "independent",
-        "dependent"
-      ],
-      "title": "IndependentEnum",
-      "type": "string"
-    },
-    "JoinArray": {
-      "additionalProperties": false,
-      "description": "Join loop iterations as an array.",
-      "properties": {
-        "as": {
-          "const": "array",
-          "description": "Return the result of each iteration as an array.\n    ",
-          "title": "As",
-          "type": "string"
-        }
-      },
-      "required": [
-        "as"
-      ],
-      "title": "JoinArray",
-      "type": "object"
-    },
-    "JoinLastOf": {
-      "additionalProperties": false,
-      "description": "Join loop iterations as the value of the last iteration.",
-      "properties": {
-        "as": {
-          "const": "lastOf",
-          "description": "Return the result of the last iteration.\n    ",
-          "title": "As",
-          "type": "string"
-        }
-      },
-      "required": [
-        "as"
-      ],
-      "title": "JoinLastOf",
-      "type": "object"
-    },
-    "JoinObject": {
-      "additionalProperties": false,
-      "description": "Join loop iterations as an object.",
-      "properties": {
-        "as": {
-          "const": "object",
-          "description": "Return the union of the objects created at each iteration.\n    ",
-          "title": "As",
-          "type": "string"
-        }
-      },
-      "required": [
-        "as"
-      ],
-      "title": "JoinObject",
-      "type": "object"
-    },
-    "JoinReduce": {
-      "additionalProperties": false,
-      "description": "Join loop iterations as the value of the last iteration.",
-      "properties": {
-        "as": {
-          "const": "reduce",
-          "default": "reduce",
-          "title": "As",
-          "type": "string"
+          "title": "Custom Llm Provider"
         },
-        "reduce": {
+        "max_retries": {
           "anyOf": [
             {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+              "type": "integer"
             },
             {
               "type": "string"
+            },
+            {
+              "type": "null"
             }
           ],
-          "description": "Function used to combine the results.",
-          "title": "Reduce"
+          "default": null,
+          "title": "Max Retries"
         }
       },
-      "required": [
-        "reduce"
-      ],
-      "title": "JoinReduce",
+      "title": "LitellmParameters",
       "type": "object"
     },
-    "JoinText": {
+    "LocalizedExpression_TypeVar_": {
       "additionalProperties": false,
-      "description": "Join loop iterations as a string.",
       "properties": {
-        "as": {
-          "const": "text",
-          "default": "text",
-          "description": "String concatenation of the result of each iteration.\n    ",
-          "title": "As",
-          "type": "string"
+        "pdl__expr": {
+          "title": "Pdl  Expr"
         },
-        "with": {
-          "default": "",
-          "description": "String used to concatenate each iteration of the loop.\n    ",
-          "title": "With",
-          "type": "string"
-        }
-      },
-      "title": "JoinText",
-      "type": "object"
-    },
-    "JsonSchemaTypePdlType": {
-      "additionalProperties": true,
-      "description": "Json Schema with a type field.",
-      "properties": {
-        "type": {
+        "pdl__result": {
           "anyOf": [
+            {},
             {
-              "type": "string"
-            },
-            {
-              "items": {
-                "type": "string"
-              },
-              "type": "array"
+              "type": "null"
             }
           ],
-          "title": "Type"
+          "default": null,
+          "title": "Pdl  Result"
+        },
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
+          "default": null
         }
       },
       "required": [
-        "type"
+        "pdl__expr"
       ],
-      "title": "JsonSchemaTypePdlType",
+      "title": "LocalizedExpression",
       "type": "object"
     },
-    "LastOfBlock": {
+    "MapBlock": {
       "additionalProperties": false,
-      "description": "Return the value of the last block if the list of blocks.",
+      "description": "Independent executions of  a block.\nRepeat the execution of a block starting from the initial scope\nand `pdl_context`.\n\nFor loop example:\n```PDL\nfor:\n    number: [1, 2, 3, 4]\n    name: [\"Bob\", \"Carol\", \"David\", \"Ernest\"]\nmap:\n    \"${ name }'s number is ${ number }\\n\"\n```\n\nBounded loop:\n```PDL\nindex: i\nmaxIterations: 5\nmap:\n    ${ i }\njoin:\n  as: array\n```",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -6460,89 +2730,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -6550,256 +2738,66 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": false,
@@ -6812,473 +2810,362 @@
           "default": "dependent"
         },
         "kind": {
-          "const": "lastOf",
-          "default": "lastOf",
+          "const": "map",
+          "default": "map",
           "title": "Kind",
           "type": "string"
         },
-        "lastOf": {
-          "description": "Sequence of blocks to execute.",
-          "items": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
-          },
-          "title": "Lastof",
-          "type": "array"
-        }
-      },
-      "required": [
-        "lastOf"
-      ],
-      "title": "LastOfBlock",
-      "type": "object"
-    },
-    "LitellmModelBlock": {
-      "additionalProperties": false,
-      "description": "Call an LLM through [the LiteLLM API](https://docs.litellm.ai/).\n\nExample:\n```PDL\nmodel: ollama/granite-code:8b\nparameters:\n  stop: ['!']\n```",
-      "properties": {
-        "description": {
+        "for": {
           "anyOf": [
             {
-              "type": "string"
+              "additionalProperties": {
+                "anyOf": [
+                  {
+                    "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+                  },
+                  {
+                    "items": {},
+                    "type": "array"
+                  },
+                  {
+                    "type": "string"
+                  }
+                ]
+              },
+              "type": "object"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Arrays to iterate over.\n    ",
+          "title": "For"
         },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
+        "index": {
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Type specification of the result of the block.\n    "
+          "description": "Name of the variable containing the loop iteration.\n    "
         },
-        "defs": {
-          "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+        "map": {
+          "$ref": "#/$defs/BlockType",
+          "description": "Body of the iterator.\n    "
+        },
+        "maxIterations": {
+          "$ref": "#/$defs/OptionalExpressionInt",
+          "default": null,
+          "description": "Maximal number of iterations to perform.\n    "
+        },
+        "join": {
+          "$ref": "#/$defs/JoinType",
+          "default": {
+            "as": "text",
+            "with": ""
           },
-          "default": {},
-          "description": "Set of definitions executed before the execution of the block.\n    ",
-          "title": "Defs",
-          "type": "object"
+          "description": "Define how to combine the result of each iteration.\n    "
         },
-        "def": {
+        "pdl__trace": {
           "anyOf": [
             {
-              "type": "string"
+              "items": {
+                "$ref": "#/$defs/BlockType"
+              },
+              "type": "array"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "title": "Pdl  Trace"
+        }
+      },
+      "required": [
+        "map"
+      ],
+      "title": "MapBlock",
+      "type": "object"
+    },
+    "MatchBlock": {
+      "additionalProperties": false,
+      "description": "Match control structure.\n\nExample:\n```PDL\ndefs:\n  answer:\n    read:\n    message: \"Enter a number? \"\nmatch: ${ (answer | int) }\nwith:\n- case: 42\n  then: You won!\n- case:\n    any:\n    def: x\n  if: ${ x > 42 }\n  then: Too high\n- then: Too low",
+      "properties": {
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Documentation associated to the block.\n    "
+        },
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null,
+          "description": "Type specification of the result of the block.\n    "
+        },
+        "defs": {
+          "additionalProperties": {
+            "$ref": "#/$defs/BlockType"
+          },
+          "default": {},
+          "description": "Set of definitions executed before the execution of the block.\n    ",
+          "title": "Defs",
+          "type": "object"
+        },
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Block to execute in case of error.\n    "
         },
         "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
         "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
+        },
+        "pdl__context": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": [],
+          "description": "Current context."
+        },
+        "pdl__id": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": "",
+          "description": "Unique identifier for this block."
+        },
+        "pdl__result": {
+          "$ref": "#/$defs/OptionalAny",
+          "default": null,
+          "description": "Result of the execution of the block."
+        },
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
+          "default": null
+        },
+        "pdl__timing": {
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
+        },
+        "pdl__is_leaf": {
+          "const": false,
+          "default": false,
+          "title": "Pdl  Is Leaf",
+          "type": "boolean"
+        },
+        "context": {
+          "$ref": "#/$defs/IndependentEnum",
+          "default": "dependent"
+        },
+        "kind": {
+          "const": "match",
+          "default": "match",
+          "title": "Kind",
+          "type": "string"
+        },
+        "match": {
           "anyOf": [
             {
-              "type": "string"
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
             },
+            {},
             {
-              "type": "null"
+              "type": "string"
             }
           ],
-          "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Matched expression.\n    ",
+          "title": "Match"
         },
-        "pdl__context": {
+        "with": {
+          "description": "List of cases to match.\n    ",
+          "items": {
+            "$ref": "#/$defs/MatchCase"
+          },
+          "title": "With",
+          "type": "array"
+        }
+      },
+      "required": [
+        "match",
+        "with"
+      ],
+      "title": "MatchBlock",
+      "type": "object"
+    },
+    "MatchCase": {
+      "additionalProperties": false,
+      "description": "Case of a match.",
+      "properties": {
+        "case": {
           "anyOf": [
             {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
+              "$ref": "#/$defs/PatternType"
             },
             {
               "type": "null"
             }
           ],
-          "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "default": null
         },
-        "pdl__id": {
+        "if": {
+          "$ref": "#/$defs/OptionalExpressionBool",
+          "default": null
+        },
+        "then": {
+          "$ref": "#/$defs/BlockType"
+        },
+        "pdl__case_result": {
           "anyOf": [
             {
-              "type": "string"
+              "type": "boolean"
             },
             {
               "type": "null"
             }
           ],
-          "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "default": null,
+          "title": "Pdl  Case Result"
         },
-        "pdl__result": {
+        "pdl__if_result": {
           "anyOf": [
-            {},
+            {
+              "type": "boolean"
+            },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "title": "Pdl  If Result"
         },
-        "pdl__location": {
+        "pdl__matched": {
           "anyOf": [
             {
-              "$ref": "#/$defs/PdlLocationType"
+              "type": "boolean"
             },
             {
               "type": "null"
             }
           ],
-          "default": null
+          "default": null,
+          "title": "Pdl  Matched"
+        }
+      },
+      "required": [
+        "then"
+      ],
+      "title": "MatchCase",
+      "type": "object"
+    },
+    "MessageBlock": {
+      "additionalProperties": false,
+      "description": "Create a message.",
+      "properties": {
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Documentation associated to the block.\n    "
         },
-        "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null,
+          "description": "Type specification of the result of the block.\n    "
+        },
+        "defs": {
+          "additionalProperties": {
+            "$ref": "#/$defs/BlockType"
+          },
+          "default": {},
+          "description": "Set of definitions executed before the execution of the block.\n    ",
+          "title": "Defs",
+          "type": "object"
+        },
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
+        },
+        "contribute": {
+          "$ref": "#/$defs/ContributeType",
+          "default": [
+            "result",
+            "context"
           ],
+          "description": "Indicate if the block contributes to the result and background context.\n    "
+        },
+        "parser": {
+          "$ref": "#/$defs/OptionalParserType",
+          "default": null,
+          "description": "Parser to use to construct a value out of a string result."
+        },
+        "fallback": {
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null,
+          "description": "Block to execute in case of error.\n    "
+        },
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
+        },
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
+          "default": null,
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
+        },
+        "role": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
+        },
+        "pdl__context": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": [],
+          "description": "Current context."
+        },
+        "pdl__id": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": "",
+          "description": "Unique identifier for this block."
+        },
+        "pdl__result": {
+          "$ref": "#/$defs/OptionalAny",
+          "default": null,
+          "description": "Result of the execution of the block."
+        },
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
+        "pdl__timing": {
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
+        },
         "pdl__is_leaf": {
           "const": true,
           "default": true,
@@ -7286,1388 +3173,587 @@
           "type": "boolean"
         },
         "kind": {
-          "const": "model",
-          "default": "model",
+          "const": "message",
+          "default": "message",
           "title": "Kind",
           "type": "string"
         },
-        "input": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": "${ pdl_context }",
-          "description": "Messages to send to the model.\n    ",
-          "title": "Input"
-        },
-        "modelResponse": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Variable where to store the raw response of the model.\n    ",
-          "title": "Modelresponse"
-        },
-        "pdl__usage": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlUsage"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Tokens consumed during model call\n    "
+        "content": {
+          "$ref": "#/$defs/BlockType",
+          "description": "Content of the message."
         },
-        "pdl__model_input": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "name": {
+          "$ref": "#/$defs/OptionalExpressionStr",
           "default": null,
-          "title": "Pdl  Model Input"
-        },
-        "platform": {
-          "const": "litellm",
-          "default": "litellm",
-          "description": "Optional field to ensure that the block is using LiteLLM.\n    ",
-          "title": "Platform",
-          "type": "string"
-        },
-        "model": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "string"
-            }
-          ],
-          "description": "Name of the model following the LiteLLM convention.\n    ",
-          "title": "Model"
+          "description": "For example, the name of the tool that was invoked, for which this message is the tool response."
         },
-        "parameters": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LitellmParameters"
-            },
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "additionalProperties": true,
-              "type": "object"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "tool_call_id": {
+          "$ref": "#/$defs/OptionalExpressionStr",
           "default": null,
-          "description": "Parameters to send to the model.\n    ",
-          "title": "Parameters"
+          "description": "The id of the tool invocation for which this message is the tool response."
         }
       },
       "required": [
-        "model"
+        "content"
       ],
-      "title": "LitellmModelBlock",
+      "title": "MessageBlock",
       "type": "object"
     },
-    "LitellmParameters": {
-      "additionalProperties": true,
-      "description": "Parameters passed to LiteLLM. More details at [https://docs.litellm.ai/docs/completion/input](https://docs.litellm.ai/docs/completion/input).\n\nNote that not all models and platforms accept all parameters.",
+    "ModelInput": {
+      "items": {
+        "additionalProperties": true,
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "ObjectBlock": {
+      "additionalProperties": false,
+      "description": "Return the object where the value of each field is defined by a block. If the body of the object is an array, the resulting object is the union of the objects computed by each element of the array.",
       "properties": {
-        "timeout": {
-          "anyOf": [
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "title": "Timeout"
+          "description": "Documentation associated to the block.\n    "
         },
-        "temperature": {
-          "anyOf": [
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
           "default": null,
-          "title": "Temperature"
+          "description": "Type specification of the result of the block.\n    "
         },
-        "top_p": {
-          "anyOf": [
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Top P"
+        "defs": {
+          "additionalProperties": {
+            "$ref": "#/$defs/BlockType"
+          },
+          "default": {},
+          "description": "Set of definitions executed before the execution of the block.\n    ",
+          "title": "Defs",
+          "type": "object"
         },
-        "n": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "title": "N"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
-        "stop": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "items": {
-                "type": "string"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
+        "contribute": {
+          "$ref": "#/$defs/ContributeType",
+          "default": [
+            "result",
+            "context"
           ],
-          "default": null,
-          "title": "Stop"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
-        "max_tokens": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "parser": {
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "title": "Max Tokens"
+          "description": "Parser to use to construct a value out of a string result."
         },
-        "presence_penalty": {
-          "anyOf": [
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "fallback": {
+          "$ref": "#/$defs/OptionalBlockType",
           "default": null,
-          "title": "Presence Penalty"
+          "description": "Block to execute in case of error.\n    "
         },
-        "frequency_penalty": {
-          "anyOf": [
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
           "default": null,
-          "title": "Frequency Penalty"
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
         },
-        "logit_bias": {
-          "anyOf": [
-            {
-              "additionalProperties": true,
-              "type": "object"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "title": "Logit Bias"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
-        "user": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "role": {
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "title": "User"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
-        "response_format": {
-          "anyOf": [
-            {
-              "additionalProperties": true,
-              "type": "object"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Response Format"
+        "pdl__context": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": [],
+          "description": "Current context."
         },
-        "seed": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Seed"
+        "pdl__id": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": "",
+          "description": "Unique identifier for this block."
         },
-        "tools": {
-          "anyOf": [
-            {
-              "items": {},
-              "type": "array"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "pdl__result": {
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "title": "Tools"
+          "description": "Result of the execution of the block."
         },
-        "tool_choice": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "additionalProperties": true,
-              "type": "object"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Tool Choice"
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
+          "default": null
         },
-        "logprobs": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "pdl__timing": {
+          "$ref": "#/$defs/OptionalPdlTiming",
           "default": null,
-          "title": "Logprobs"
+          "description": "Execution timing information."
         },
-        "top_logprobs": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Top Logprobs"
+        "pdl__is_leaf": {
+          "const": false,
+          "default": false,
+          "title": "Pdl  Is Leaf",
+          "type": "boolean"
         },
-        "parallel_tool_calls": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Parallel Tool Calls"
+        "context": {
+          "$ref": "#/$defs/IndependentEnum",
+          "default": "dependent"
         },
-        "extra_headers": {
+        "kind": {
+          "const": "object",
+          "default": "object",
+          "title": "Kind",
+          "type": "string"
+        },
+        "object": {
           "anyOf": [
             {
-              "additionalProperties": true,
+              "additionalProperties": {
+                "$ref": "#/$defs/BlockType"
+              },
               "type": "object"
             },
             {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Extra Headers"
-        },
-        "functions": {
-          "anyOf": [
-            {
-              "items": {},
-              "type": "array"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Functions"
-        },
-        "function_call": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Function Call"
-        },
-        "base_url": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Base Url"
-        },
-        "api_version": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Api Version"
-        },
-        "api_key": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Api Key"
-        },
-        "model_list": {
-          "anyOf": [
-            {
-              "items": {},
+              "items": {
+                "$ref": "#/$defs/BlockType"
+              },
               "type": "array"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Model List"
-        },
-        "mock_response": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Mock Response"
-        },
-        "custom_llm_provider": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Custom Llm Provider"
-        },
-        "max_retries": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
             }
           ],
-          "default": null,
-          "title": "Max Retries"
+          "title": "Object"
         }
       },
-      "title": "LitellmParameters",
+      "required": [
+        "object"
+      ],
+      "title": "ObjectBlock",
       "type": "object"
     },
-    "LocalizedExpression_TypeVar_": {
+    "ObjectPattern": {
       "additionalProperties": false,
+      "description": "Match an object.",
       "properties": {
-        "pdl__expr": {
-          "title": "Pdl  Expr"
-        },
-        "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Pdl  Result"
-        },
-        "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
           "default": null
+        },
+        "object": {
+          "additionalProperties": {
+            "$ref": "#/$defs/PatternType"
+          },
+          "title": "Object",
+          "type": "object"
         }
       },
       "required": [
-        "pdl__expr"
+        "object"
       ],
-      "title": "LocalizedExpression",
+      "title": "ObjectPattern",
       "type": "object"
     },
-    "MapBlock": {
+    "ObjectPdlType": {
       "additionalProperties": false,
-      "description": "Independent executions of  a block.\nRepeat the execution of a block starting from the initial scope\nand `pdl_context`.\n\nFor loop example:\n```PDL\nfor:\n    number: [1, 2, 3, 4]\n    name: [\"Bob\", \"Carol\", \"David\", \"Ernest\"]\nmap:\n    \"${ name }'s number is ${ number }\\n\"\n```\n\nBounded loop:\n```PDL\nindex: i\nmaxIterations: 5\nmap:\n    ${ i }\njoin:\n  as: array\n```",
+      "description": "Object type.",
       "properties": {
-        "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
-        },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null,
-          "description": "Type specification of the result of the block.\n    "
-        },
-        "defs": {
+        "object": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/PdlTypeType"
           },
-          "default": {},
-          "description": "Set of definitions executed before the execution of the block.\n    ",
-          "title": "Defs",
+          "title": "Object",
           "type": "object"
+        }
+      },
+      "required": [
+        "object"
+      ],
+      "title": "ObjectPdlType",
+      "type": "object"
+    },
+    "OptionalAny": {
+      "anyOf": [
+        {},
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalBlockType": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/BlockType"
         },
-        "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalBoolOrStr": {
+      "anyOf": [
+        {
+          "type": "boolean"
         },
-        "contribute": {
-          "default": [
-            "result",
-            "context"
-          ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
-        },
-        "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+        {
+          "type": "string"
         },
-        "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalExpressionBool": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/ExpressionBool"
         },
-        "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalExpressionInt": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/ExpressionInt"
         },
-        "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalExpressionStr": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/ExpressionStr"
         },
-        "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalInt": {
+      "anyOf": [
+        {
+          "type": "integer"
         },
-        "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalModelInput": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/ModelInput"
         },
-        "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalParserType": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/ParserType"
         },
-        "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalPdlLocationType": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/PdlLocationType"
         },
-        "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalPdlTiming": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/PdlTiming"
         },
-        "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalPdlType": {
+      "additionalProperties": false,
+      "description": "Optional type.",
+      "properties": {
+        "optional": {
+          "$ref": "#/$defs/PdlTypeType"
+        }
+      },
+      "required": [
+        "optional"
+      ],
+      "title": "OptionalPdlType",
+      "type": "object"
+    },
+    "OptionalPdlUsage": {
+      "anyOf": [
+        {
+          "$ref": "#/$defs/PdlUsage"
         },
-        "pdl__is_leaf": {
-          "const": false,
-          "default": false,
-          "title": "Pdl  Is Leaf",
-          "type": "boolean"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OptionalStr": {
+      "anyOf": [
+        {
+          "type": "string"
         },
-        "context": {
-          "$ref": "#/$defs/IndependentEnum",
-          "default": "dependent"
-        },
-        "kind": {
-          "const": "map",
-          "default": "map",
-          "title": "Kind",
-          "type": "string"
-        },
-        "for": {
-          "anyOf": [
-            {
-              "additionalProperties": {
-                "anyOf": [
-                  {
-                    "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-                  },
-                  {
-                    "items": {},
-                    "type": "array"
-                  },
-                  {
-                    "type": "string"
-                  }
-                ]
-              },
-              "type": "object"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Arrays to iterate over.\n    ",
-          "title": "For"
-        },
-        "index": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Name of the variable containing the loop iteration.\n    ",
-          "title": "Index"
-        },
-        "map": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "description": "Body of the iterator.\n    ",
-          "title": "Map"
-        },
-        "maxIterations": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Maximal number of iterations to perform.\n    ",
-          "title": "Maxiterations"
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "OrPattern": {
+      "additionalProperties": false,
+      "description": "Match any of the patterns.",
+      "properties": {
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null
         },
-        "join": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/JoinText"
-            },
-            {
-              "$ref": "#/$defs/JoinArray"
-            },
-            {
-              "$ref": "#/$defs/JoinObject"
-            },
-            {
-              "$ref": "#/$defs/JoinLastOf"
-            },
-            {
-              "$ref": "#/$defs/JoinReduce"
-            }
-          ],
-          "default": {
-            "as": "text",
-            "with": ""
+        "anyOf": {
+          "items": {
+            "$ref": "#/$defs/PatternType"
           },
-          "description": "Define how to combine the result of each iteration.\n    ",
-          "title": "Join"
-        },
-        "pdl__trace": {
-          "anyOf": [
-            {
-              "items": {
-                "anyOf": [
-                  {
-                    "type": "boolean"
-                  },
-                  {
-                    "type": "integer"
-                  },
-                  {
-                    "type": "number"
-                  },
-                  {
-                    "type": "string"
-                  },
-                  {
-                    "$ref": "#/$defs/FunctionBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CallBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LitellmModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GraniteioModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CodeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArgsBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GetBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/DataBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MatchBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/RepeatBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MapBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/TextBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LastOfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArrayBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ObjectBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MessageBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ReadBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IncludeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ImportBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ErrorBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/EmptyBlock"
-                  },
-                  {
-                    "type": "null"
-                  }
-                ]
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Pdl  Trace"
+          "title": "Anyof",
+          "type": "array"
         }
       },
       "required": [
-        "map"
+        "anyOf"
       ],
-      "title": "MapBlock",
+      "title": "OrPattern",
       "type": "object"
     },
-    "MatchBlock": {
-      "additionalProperties": false,
-      "description": "Match control structure.\n\nExample:\n```PDL\ndefs:\n  answer:\n    read:\n    message: \"Enter a number? \"\nmatch: ${ (answer | int) }\nwith:\n- case: 42\n  then: You won!\n- case:\n    any:\n    def: x\n  if: ${ x > 42 }\n  then: Too high\n- then: Too low",
-      "properties": {
-        "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
+    "ParserType": {
+      "anyOf": [
+        {
+          "enum": [
+            "json",
+            "jsonl",
+            "yaml"
           ],
-          "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "type": "string"
         },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null,
-          "description": "Type specification of the result of the block.\n    "
+        {
+          "$ref": "#/$defs/PdlParser"
+        },
+        {
+          "$ref": "#/$defs/RegexParser"
+        }
+      ]
+    },
+    "PatternType": {
+      "anyOf": [
+        {
+          "type": "boolean"
+        },
+        {
+          "type": "integer"
+        },
+        {
+          "type": "number"
+        },
+        {
+          "type": "string"
+        },
+        {
+          "$ref": "#/$defs/OrPattern"
+        },
+        {
+          "$ref": "#/$defs/ArrayPattern"
+        },
+        {
+          "$ref": "#/$defs/ObjectPattern"
+        },
+        {
+          "$ref": "#/$defs/AnyPattern"
+        },
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "PdlBlock": {
+      "$ref": "#/$defs/BlockType",
+      "title": "PdlBlock"
+    },
+    "PdlLocationType": {
+      "additionalProperties": false,
+      "description": "Internal data structure to keep track of the source location information.",
+      "properties": {
+        "path": {
+          "items": {
+            "type": "string"
+          },
+          "title": "Path",
+          "type": "array"
+        },
+        "file": {
+          "title": "File",
+          "type": "string"
+        },
+        "table": {
+          "additionalProperties": {
+            "type": "integer"
+          },
+          "title": "Table",
+          "type": "object"
+        }
+      },
+      "required": [
+        "path",
+        "file",
+        "table"
+      ],
+      "title": "PdlLocationType",
+      "type": "object"
+    },
+    "PdlParser": {
+      "additionalProperties": false,
+      "description": "Use a PDL program as a parser specification (experimental).",
+      "properties": {
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null
+        },
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null
+        },
+        "pdl": {
+          "$ref": "#/$defs/BlockType"
+        }
+      },
+      "required": [
+        "pdl"
+      ],
+      "title": "PdlParser",
+      "type": "object"
+    },
+    "PdlTiming": {
+      "additionalProperties": false,
+      "description": "Internal data structure to record timing information in the trace.",
+      "properties": {
+        "start_nanos": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": 0
+        },
+        "end_nanos": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": 0
+        },
+        "first_use_nanos": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": 0
+        },
+        "timezone": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": ""
+        }
+      },
+      "title": "PdlTiming",
+      "type": "object"
+    },
+    "PdlTypeType": {
+      "anyOf": [
+        {
+          "enum": [
+            "null",
+            "boolean",
+            "string",
+            "number",
+            "integer",
+            "array",
+            "object",
+            "bool",
+            "str",
+            "float",
+            "int",
+            "list",
+            "obj"
+          ],
+          "type": "string"
+        },
+        {
+          "$ref": "#/$defs/EnumPdlType"
+        },
+        {
+          "items": {
+            "$ref": "#/$defs/PdlTypeType"
+          },
+          "type": "array"
+        },
+        {
+          "$ref": "#/$defs/OptionalPdlType"
+        },
+        {
+          "$ref": "#/$defs/JsonSchemaTypePdlType"
+        },
+        {
+          "$ref": "#/$defs/ObjectPdlType"
+        },
+        {
+          "additionalProperties": {
+            "$ref": "#/$defs/PdlTypeType"
+          },
+          "type": "object"
+        },
+        {
+          "type": "null"
+        }
+      ]
+    },
+    "PdlUsage": {
+      "description": "Internal data structure to record token consumption usage information.",
+      "properties": {
+        "completion_tokens": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": 0
+        },
+        "prompt_tokens": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": 0
+        }
+      },
+      "title": "PdlUsage",
+      "type": "object"
+    },
+    "Program": {
+      "$ref": "#/$defs/BlockType",
+      "description": "Prompt Declaration Language program (PDL)",
+      "title": "Program"
+    },
+    "ReadBlock": {
+      "additionalProperties": false,
+      "description": "Read from a file or standard input.\n\nExample. Read from the standard input with a prompt starting with `> `.\n```PDL\nread:\nmessage: \"> \"\n```\n\nExample. Read the file `./data.yaml` in the same directory of the PDL file containing the block and parse it into YAML.\n```PDL\nread: ./data.yaml\nparser: yaml\n```",
+      "properties": {
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Documentation associated to the block.\n    "
+        },
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null,
+          "description": "Type specification of the result of the block.\n    "
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -8675,3324 +3761,144 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
-        },
-        "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
-        },
-        "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
-        },
-        "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
-        },
-        "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
-        },
-        "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
-        },
-        "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
-        },
-        "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
-        },
-        "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__is_leaf": {
-          "const": false,
-          "default": false,
-          "title": "Pdl  Is Leaf",
-          "type": "boolean"
-        },
-        "context": {
-          "$ref": "#/$defs/IndependentEnum",
-          "default": "dependent"
-        },
-        "kind": {
-          "const": "match",
-          "default": "match",
-          "title": "Kind",
-          "type": "string"
-        },
-        "match": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {},
-            {
-              "type": "string"
-            }
-          ],
-          "description": "Matched expression.\n    ",
-          "title": "Match"
-        },
-        "with": {
-          "description": "List of cases to match.\n    ",
-          "items": {
-            "$ref": "#/$defs/MatchCase"
-          },
-          "title": "With",
-          "type": "array"
-        }
-      },
-      "required": [
-        "match",
-        "with"
-      ],
-      "title": "MatchBlock",
-      "type": "object"
-    },
-    "MatchCase": {
-      "additionalProperties": false,
-      "description": "Case of a match.",
-      "properties": {
-        "case": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/OrPattern"
-            },
-            {
-              "$ref": "#/$defs/ArrayPattern"
-            },
-            {
-              "$ref": "#/$defs/ObjectPattern"
-            },
-            {
-              "$ref": "#/$defs/AnyPattern"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Case"
-        },
-        "if": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "If"
-        },
-        "then": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "title": "Then"
-        },
-        "pdl__case_result": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Pdl  Case Result"
-        },
-        "pdl__if_result": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Pdl  If Result"
-        },
-        "pdl__matched": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Pdl  Matched"
-        }
-      },
-      "required": [
-        "then"
-      ],
-      "title": "MatchCase",
-      "type": "object"
-    },
-    "MessageBlock": {
-      "additionalProperties": false,
-      "description": "Create a message.",
-      "properties": {
-        "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
-        },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null,
-          "description": "Type specification of the result of the block.\n    "
-        },
-        "defs": {
-          "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
-          },
-          "default": {},
-          "description": "Set of definitions executed before the execution of the block.\n    ",
-          "title": "Defs",
-          "type": "object"
-        },
-        "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
-        },
-        "contribute": {
-          "default": [
-            "result",
-            "context"
-          ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
-        },
-        "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
-        },
-        "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
-        },
-        "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
-        },
-        "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
-        },
-        "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
-        },
-        "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
-        },
-        "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
-        },
-        "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
-        },
-        "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__is_leaf": {
-          "const": true,
-          "default": true,
-          "title": "Pdl  Is Leaf",
-          "type": "boolean"
-        },
-        "kind": {
-          "const": "message",
-          "default": "message",
-          "title": "Kind",
-          "type": "string"
-        },
-        "content": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "description": "Content of the message.",
-          "title": "Content"
-        },
-        "name": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "For example, the name of the tool that was invoked, for which this message is the tool response.",
-          "title": "Name"
-        },
-        "tool_call_id": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "The id of the tool invocation for which this message is the tool response.",
-          "title": "Tool Call Id"
-        }
-      },
-      "required": [
-        "content"
-      ],
-      "title": "MessageBlock",
-      "type": "object"
-    },
-    "ObjectBlock": {
-      "additionalProperties": false,
-      "description": "Return the object where the value of each field is defined by a block. If the body of the object is an array, the resulting object is the union of the objects computed by each element of the array.",
-      "properties": {
-        "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
-        },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null,
-          "description": "Type specification of the result of the block.\n    "
-        },
-        "defs": {
-          "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
-          },
-          "default": {},
-          "description": "Set of definitions executed before the execution of the block.\n    ",
-          "title": "Defs",
-          "type": "object"
-        },
-        "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
-        },
-        "contribute": {
-          "default": [
-            "result",
-            "context"
-          ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
-        },
-        "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
-        },
-        "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
-        },
-        "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
-        },
-        "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
-        },
-        "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
-        },
-        "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
-        },
-        "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
-        },
-        "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
-        },
-        "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__is_leaf": {
-          "const": false,
-          "default": false,
-          "title": "Pdl  Is Leaf",
-          "type": "boolean"
-        },
-        "context": {
-          "$ref": "#/$defs/IndependentEnum",
-          "default": "dependent"
-        },
-        "kind": {
-          "const": "object",
-          "default": "object",
-          "title": "Kind",
-          "type": "string"
-        },
-        "object": {
-          "anyOf": [
-            {
-              "additionalProperties": {
-                "anyOf": [
-                  {
-                    "type": "boolean"
-                  },
-                  {
-                    "type": "integer"
-                  },
-                  {
-                    "type": "number"
-                  },
-                  {
-                    "type": "string"
-                  },
-                  {
-                    "$ref": "#/$defs/FunctionBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CallBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LitellmModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GraniteioModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CodeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArgsBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GetBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/DataBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MatchBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/RepeatBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MapBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/TextBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LastOfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArrayBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ObjectBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MessageBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ReadBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IncludeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ImportBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ErrorBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/EmptyBlock"
-                  },
-                  {
-                    "type": "null"
-                  }
-                ]
-              },
-              "type": "object"
-            },
-            {
-              "items": {
-                "anyOf": [
-                  {
-                    "type": "boolean"
-                  },
-                  {
-                    "type": "integer"
-                  },
-                  {
-                    "type": "number"
-                  },
-                  {
-                    "type": "string"
-                  },
-                  {
-                    "$ref": "#/$defs/FunctionBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CallBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LitellmModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GraniteioModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CodeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArgsBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GetBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/DataBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MatchBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/RepeatBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MapBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/TextBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LastOfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArrayBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ObjectBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MessageBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ReadBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IncludeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ImportBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ErrorBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/EmptyBlock"
-                  },
-                  {
-                    "type": "null"
-                  }
-                ]
-              },
-              "type": "array"
-            }
-          ],
-          "title": "Object"
-        }
-      },
-      "required": [
-        "object"
-      ],
-      "title": "ObjectBlock",
-      "type": "object"
-    },
-    "ObjectPattern": {
-      "additionalProperties": false,
-      "description": "Match an object.",
-      "properties": {
-        "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Def"
-        },
-        "object": {
-          "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/OrPattern"
-              },
-              {
-                "$ref": "#/$defs/ArrayPattern"
-              },
-              {
-                "$ref": "#/$defs/ObjectPattern"
-              },
-              {
-                "$ref": "#/$defs/AnyPattern"
-              },
-              {
-                "type": "null"
-              }
-            ]
-          },
-          "title": "Object",
-          "type": "object"
-        }
-      },
-      "required": [
-        "object"
-      ],
-      "title": "ObjectPattern",
-      "type": "object"
-    },
-    "ObjectPdlType": {
-      "additionalProperties": false,
-      "description": "Object type.",
-      "properties": {
-        "object": {
-          "additionalProperties": {
-            "$ref": "#/$defs/PdlTypeType"
-          },
-          "title": "Object",
-          "type": "object"
-        }
-      },
-      "required": [
-        "object"
-      ],
-      "title": "ObjectPdlType",
-      "type": "object"
-    },
-    "OptionalPdlType": {
-      "additionalProperties": false,
-      "description": "Optional type.",
-      "properties": {
-        "optional": {
-          "$ref": "#/$defs/PdlTypeType"
-        }
-      },
-      "required": [
-        "optional"
-      ],
-      "title": "OptionalPdlType",
-      "type": "object"
-    },
-    "OrPattern": {
-      "additionalProperties": false,
-      "description": "Match any of the patterns.",
-      "properties": {
-        "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Def"
-        },
-        "anyOf": {
-          "items": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/OrPattern"
-              },
-              {
-                "$ref": "#/$defs/ArrayPattern"
-              },
-              {
-                "$ref": "#/$defs/ObjectPattern"
-              },
-              {
-                "$ref": "#/$defs/AnyPattern"
-              },
-              {
-                "type": "null"
-              }
-            ]
-          },
-          "title": "Anyof",
-          "type": "array"
-        }
-      },
-      "required": [
-        "anyOf"
-      ],
-      "title": "OrPattern",
-      "type": "object"
-    },
-    "PdlBlock": {
-      "anyOf": [
-        {
-          "type": "boolean"
-        },
-        {
-          "type": "integer"
-        },
-        {
-          "type": "number"
-        },
-        {
-          "type": "string"
-        },
-        {
-          "$ref": "#/$defs/FunctionBlock"
-        },
-        {
-          "$ref": "#/$defs/CallBlock"
-        },
-        {
-          "$ref": "#/$defs/LitellmModelBlock"
-        },
-        {
-          "$ref": "#/$defs/GraniteioModelBlock"
-        },
-        {
-          "$ref": "#/$defs/CodeBlock"
-        },
-        {
-          "$ref": "#/$defs/ArgsBlock"
-        },
-        {
-          "$ref": "#/$defs/GetBlock"
-        },
-        {
-          "$ref": "#/$defs/DataBlock"
-        },
-        {
-          "$ref": "#/$defs/IfBlock"
-        },
-        {
-          "$ref": "#/$defs/MatchBlock"
-        },
-        {
-          "$ref": "#/$defs/RepeatBlock"
-        },
-        {
-          "$ref": "#/$defs/MapBlock"
-        },
-        {
-          "$ref": "#/$defs/TextBlock"
-        },
-        {
-          "$ref": "#/$defs/LastOfBlock"
-        },
-        {
-          "$ref": "#/$defs/ArrayBlock"
-        },
-        {
-          "$ref": "#/$defs/ObjectBlock"
-        },
-        {
-          "$ref": "#/$defs/MessageBlock"
-        },
-        {
-          "$ref": "#/$defs/ReadBlock"
-        },
-        {
-          "$ref": "#/$defs/IncludeBlock"
-        },
-        {
-          "$ref": "#/$defs/ImportBlock"
-        },
-        {
-          "$ref": "#/$defs/ErrorBlock"
-        },
-        {
-          "$ref": "#/$defs/EmptyBlock"
-        },
-        {
-          "type": "null"
-        }
-      ],
-      "title": "PdlBlock"
-    },
-    "PdlLocationType": {
-      "additionalProperties": false,
-      "description": "Internal data structure to keep track of the source location information.",
-      "properties": {
-        "path": {
-          "items": {
-            "type": "string"
-          },
-          "title": "Path",
-          "type": "array"
-        },
-        "file": {
-          "title": "File",
-          "type": "string"
-        },
-        "table": {
-          "additionalProperties": {
-            "type": "integer"
-          },
-          "title": "Table",
-          "type": "object"
-        }
-      },
-      "required": [
-        "path",
-        "file",
-        "table"
-      ],
-      "title": "PdlLocationType",
-      "type": "object"
-    },
-    "PdlParser": {
-      "additionalProperties": false,
-      "description": "Use a PDL program as a parser specification (experimental).",
-      "properties": {
-        "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Description"
-        },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null
-        },
-        "pdl": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "title": "Pdl"
-        }
-      },
-      "required": [
-        "pdl"
-      ],
-      "title": "PdlParser",
-      "type": "object"
-    },
-    "PdlTiming": {
-      "additionalProperties": false,
-      "description": "Internal data structure to record timing information in the trace.",
-      "properties": {
-        "start_nanos": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": 0,
-          "title": "Start Nanos"
-        },
-        "end_nanos": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": 0,
-          "title": "End Nanos"
-        },
-        "first_use_nanos": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": 0,
-          "title": "First Use Nanos"
-        },
-        "timezone": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": "",
-          "title": "Timezone"
-        }
-      },
-      "title": "PdlTiming",
-      "type": "object"
-    },
-    "PdlTypeType": {
-      "anyOf": [
-        {
-          "enum": [
-            "null",
-            "boolean",
-            "string",
-            "number",
-            "integer",
-            "array",
-            "object",
-            "bool",
-            "str",
-            "float",
-            "int",
-            "list",
-            "obj"
-          ],
-          "type": "string"
-        },
-        {
-          "$ref": "#/$defs/EnumPdlType"
-        },
-        {
-          "items": {
-            "$ref": "#/$defs/PdlTypeType"
-          },
-          "type": "array"
-        },
-        {
-          "$ref": "#/$defs/OptionalPdlType"
-        },
-        {
-          "$ref": "#/$defs/JsonSchemaTypePdlType"
-        },
-        {
-          "$ref": "#/$defs/ObjectPdlType"
-        },
-        {
-          "additionalProperties": {
-            "$ref": "#/$defs/PdlTypeType"
-          },
-          "type": "object"
-        },
-        {
-          "type": "null"
-        }
-      ]
-    },
-    "PdlUsage": {
-      "description": "Internal data structure to record token consumption usage information.",
-      "properties": {
-        "completion_tokens": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": 0,
-          "title": "Completion Tokens"
-        },
-        "prompt_tokens": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": 0,
-          "title": "Prompt Tokens"
-        }
-      },
-      "title": "PdlUsage",
-      "type": "object"
-    },
-    "Program": {
-      "anyOf": [
-        {
-          "type": "boolean"
-        },
-        {
-          "type": "integer"
-        },
-        {
-          "type": "number"
-        },
-        {
-          "type": "string"
-        },
-        {
-          "$ref": "#/$defs/FunctionBlock"
-        },
-        {
-          "$ref": "#/$defs/CallBlock"
-        },
-        {
-          "$ref": "#/$defs/LitellmModelBlock"
-        },
-        {
-          "$ref": "#/$defs/GraniteioModelBlock"
-        },
-        {
-          "$ref": "#/$defs/CodeBlock"
-        },
-        {
-          "$ref": "#/$defs/ArgsBlock"
-        },
-        {
-          "$ref": "#/$defs/GetBlock"
-        },
-        {
-          "$ref": "#/$defs/DataBlock"
-        },
-        {
-          "$ref": "#/$defs/IfBlock"
-        },
-        {
-          "$ref": "#/$defs/MatchBlock"
-        },
-        {
-          "$ref": "#/$defs/RepeatBlock"
-        },
-        {
-          "$ref": "#/$defs/MapBlock"
-        },
-        {
-          "$ref": "#/$defs/TextBlock"
-        },
-        {
-          "$ref": "#/$defs/LastOfBlock"
-        },
-        {
-          "$ref": "#/$defs/ArrayBlock"
-        },
-        {
-          "$ref": "#/$defs/ObjectBlock"
-        },
-        {
-          "$ref": "#/$defs/MessageBlock"
-        },
-        {
-          "$ref": "#/$defs/ReadBlock"
-        },
-        {
-          "$ref": "#/$defs/IncludeBlock"
-        },
-        {
-          "$ref": "#/$defs/ImportBlock"
-        },
-        {
-          "$ref": "#/$defs/ErrorBlock"
-        },
-        {
-          "$ref": "#/$defs/EmptyBlock"
-        },
-        {
-          "type": "null"
-        }
-      ],
-      "description": "Prompt Declaration Language program (PDL)",
-      "title": "Program"
-    },
-    "ReadBlock": {
-      "additionalProperties": false,
-      "description": "Read from a file or standard input.\n\nExample. Read from the standard input with a prompt starting with `> `.\n```PDL\nread:\nmessage: \"> \"\n```\n\nExample. Read the file `./data.yaml` in the same directory of the PDL file containing the block and parse it into YAML.\n```PDL\nread: ./data.yaml\nparser: yaml\n```",
-      "properties": {
-        "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
-        },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null,
-          "description": "Type specification of the result of the block.\n    "
-        },
-        "defs": {
-          "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
-          },
-          "default": {},
-          "description": "Set of definitions executed before the execution of the block.\n    ",
-          "title": "Defs",
-          "type": "object"
-        },
-        "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
-        },
-        "contribute": {
-          "default": [
-            "result",
-            "context"
-          ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
-        },
-        "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
-        },
-        "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
-        },
-        "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
-        },
-        "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
-        },
-        "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
-        },
-        "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
-        },
-        "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
-        },
-        "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
-        },
-        "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__is_leaf": {
-          "const": true,
-          "default": true,
-          "title": "Pdl  Is Leaf",
-          "type": "boolean"
-        },
-        "kind": {
-          "const": "read",
-          "default": "read",
-          "title": "Kind",
-          "type": "string"
-        },
-        "read": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "description": "Name of the file to read. If `None`, read the standard input.\n    ",
-          "title": "Read"
-        },
-        "message": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Message to prompt the user to enter a value.\n    ",
-          "title": "Message"
-        },
-        "multiline": {
-          "default": false,
-          "description": "Indicate if one or multiple lines should be read.\n    ",
-          "title": "Multiline",
-          "type": "boolean"
-        }
-      },
-      "required": [
-        "read"
-      ],
-      "title": "ReadBlock",
-      "type": "object"
-    },
-    "RegexParser": {
-      "additionalProperties": false,
-      "description": "A regular expression parser.",
-      "properties": {
-        "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "title": "Description"
-        },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null
-        },
-        "regex": {
-          "title": "Regex",
-          "type": "string"
-        },
-        "mode": {
-          "default": "fullmatch",
-          "enum": [
-            "search",
-            "match",
-            "fullmatch",
-            "split",
-            "findall"
-          ],
-          "title": "Mode",
-          "type": "string"
-        }
-      },
-      "required": [
-        "regex"
-      ],
-      "title": "RegexParser",
-      "type": "object"
-    },
-    "RepeatBlock": {
-      "additionalProperties": false,
-      "description": "Repeat the execution of a block sequentially.\nThe scope and `pdl_context` are accumulated in between iterations.\n\nFor loop example:\n```PDL\nfor:\n    number: [1, 2, 3, 4]\n    name: [\"Bob\", \"Carol\", \"David\", \"Ernest\"]\nrepeat:\n    \"${ name }'s number is ${ number }\\n\"\n```\n\nWhile loop:\n```PDL\ndefs:\n  i: 0\nwhile: ${i < 5}\nrepeat:\n    defs:\n      i: ${ i + 1}\n    data: ${ i }\njoin:\n  as: array\n```",
-      "properties": {
-        "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
-        },
-        "spec": {
-          "$ref": "#/$defs/PdlTypeType",
-          "default": null,
-          "description": "Type specification of the result of the block.\n    "
-        },
-        "defs": {
-          "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
-          },
-          "default": {},
-          "description": "Set of definitions executed before the execution of the block.\n    ",
-          "title": "Defs",
-          "type": "object"
-        },
-        "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
-        },
-        "contribute": {
-          "default": [
-            "result",
-            "context"
-          ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
-        },
-        "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
-        },
-        "fallback": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
-        },
-        "retry": {
-          "anyOf": [
-            {
-              "type": "integer"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
-        },
-        "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
-        },
-        "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
-        },
-        "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
-        },
-        "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
-        },
-        "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
-        },
-        "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
-        },
-        "pdl__is_leaf": {
-          "const": false,
-          "default": false,
-          "title": "Pdl  Is Leaf",
-          "type": "boolean"
-        },
-        "context": {
-          "$ref": "#/$defs/IndependentEnum",
-          "default": "dependent"
-        },
-        "kind": {
-          "const": "repeat",
-          "default": "repeat",
-          "title": "Kind",
-          "type": "string"
-        },
-        "for": {
-          "anyOf": [
-            {
-              "additionalProperties": {
-                "anyOf": [
-                  {
-                    "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-                  },
-                  {
-                    "items": {},
-                    "type": "array"
-                  },
-                  {
-                    "type": "string"
-                  }
-                ]
-              },
-              "type": "object"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Arrays to iterate over.\n    ",
-          "title": "For"
-        },
-        "index": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Name of the variable containing the loop iteration.\n    ",
-          "title": "Index"
-        },
-        "while": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            }
-          ],
-          "default": true,
-          "description": "Condition to stay at the beginning of the loop.\n    ",
-          "title": "While"
-        },
-        "repeat": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "description": "Body of the loop.\n    ",
-          "title": "Repeat"
-        },
-        "until": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            }
-          ],
-          "default": false,
-          "description": "Condition to exit at the end of the loop.\n    ",
-          "title": "Until"
-        },
-        "maxIterations": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null,
-          "description": "Maximal number of iterations to perform.\n    ",
-          "title": "Maxiterations"
-        },
-        "join": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/JoinText"
-            },
-            {
-              "$ref": "#/$defs/JoinArray"
-            },
-            {
-              "$ref": "#/$defs/JoinObject"
-            },
-            {
-              "$ref": "#/$defs/JoinLastOf"
-            },
-            {
-              "$ref": "#/$defs/JoinReduce"
-            }
-          ],
-          "default": {
-            "as": "text",
-            "with": ""
-          },
-          "description": "Define how to combine the result of each iteration.\n    ",
-          "title": "Join"
-        },
-        "pdl__trace": {
-          "anyOf": [
-            {
-              "items": {
-                "anyOf": [
-                  {
-                    "type": "boolean"
-                  },
-                  {
-                    "type": "integer"
-                  },
-                  {
-                    "type": "number"
-                  },
-                  {
-                    "type": "string"
-                  },
-                  {
-                    "$ref": "#/$defs/FunctionBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CallBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LitellmModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GraniteioModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CodeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArgsBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GetBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/DataBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MatchBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/RepeatBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MapBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/TextBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LastOfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArrayBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ObjectBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MessageBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ReadBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IncludeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ImportBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ErrorBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/EmptyBlock"
-                  },
-                  {
-                    "type": "null"
-                  }
-                ]
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "title": "Pdl  Trace"
+          "description": "Parser to use to construct a value out of a string result."
+        },
+        "fallback": {
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null,
+          "description": "Block to execute in case of error.\n    "
+        },
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
+        },
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
+          "default": null,
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
+        },
+        "role": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
+        },
+        "pdl__context": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": [],
+          "description": "Current context."
+        },
+        "pdl__id": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": "",
+          "description": "Unique identifier for this block."
+        },
+        "pdl__result": {
+          "$ref": "#/$defs/OptionalAny",
+          "default": null,
+          "description": "Result of the execution of the block."
+        },
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
+          "default": null
+        },
+        "pdl__timing": {
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
+        },
+        "pdl__is_leaf": {
+          "const": true,
+          "default": true,
+          "title": "Pdl  Is Leaf",
+          "type": "boolean"
+        },
+        "kind": {
+          "const": "read",
+          "default": "read",
+          "title": "Kind",
+          "type": "string"
+        },
+        "read": {
+          "$ref": "#/$defs/OptionalExpressionStr",
+          "description": "Name of the file to read. If `None`, read the standard input.\n    "
+        },
+        "message": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Message to prompt the user to enter a value.\n    "
+        },
+        "multiline": {
+          "default": false,
+          "description": "Indicate if one or multiple lines should be read.\n    ",
+          "title": "Multiline",
+          "type": "boolean"
         }
       },
       "required": [
-        "repeat"
+        "read"
       ],
-      "title": "RepeatBlock",
+      "title": "ReadBlock",
       "type": "object"
     },
-    "TextBlock": {
+    "RegexParser": {
       "additionalProperties": false,
-      "description": "Create the concatenation of the stringify version of the result of each block of the list of blocks.",
+      "description": "A regular expression parser.",
       "properties": {
         "description": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
+          "$ref": "#/$defs/OptionalStr",
+          "default": null
+        },
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null
+        },
+        "regex": {
+          "title": "Regex",
+          "type": "string"
+        },
+        "mode": {
+          "default": "fullmatch",
+          "enum": [
+            "search",
+            "match",
+            "fullmatch",
+            "split",
+            "findall"
           ],
+          "title": "Mode",
+          "type": "string"
+        }
+      },
+      "required": [
+        "regex"
+      ],
+      "title": "RegexParser",
+      "type": "object"
+    },
+    "RepeatBlock": {
+      "additionalProperties": false,
+      "description": "Repeat the execution of a block sequentially.\nThe scope and `pdl_context` are accumulated in between iterations.\n\nFor loop example:\n```PDL\nfor:\n    number: [1, 2, 3, 4]\n    name: [\"Bob\", \"Carol\", \"David\", \"Ernest\"]\nrepeat:\n    \"${ name }'s number is ${ number }\\n\"\n```\n\nWhile loop:\n```PDL\ndefs:\n  i: 0\nwhile: ${i < 5}\nrepeat:\n    defs:\n      i: ${ i + 1}\n    data: ${ i }\njoin:\n  as: array\n```",
+      "properties": {
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Documentation associated to the block.\n    ",
-          "title": "Description"
+          "description": "Documentation associated to the block.\n    "
         },
         "spec": {
           "$ref": "#/$defs/PdlTypeType",
@@ -12001,89 +3907,7 @@
         },
         "defs": {
           "additionalProperties": {
-            "anyOf": [
-              {
-                "type": "boolean"
-              },
-              {
-                "type": "integer"
-              },
-              {
-                "type": "number"
-              },
-              {
-                "type": "string"
-              },
-              {
-                "$ref": "#/$defs/FunctionBlock"
-              },
-              {
-                "$ref": "#/$defs/CallBlock"
-              },
-              {
-                "$ref": "#/$defs/LitellmModelBlock"
-              },
-              {
-                "$ref": "#/$defs/GraniteioModelBlock"
-              },
-              {
-                "$ref": "#/$defs/CodeBlock"
-              },
-              {
-                "$ref": "#/$defs/ArgsBlock"
-              },
-              {
-                "$ref": "#/$defs/GetBlock"
-              },
-              {
-                "$ref": "#/$defs/DataBlock"
-              },
-              {
-                "$ref": "#/$defs/IfBlock"
-              },
-              {
-                "$ref": "#/$defs/MatchBlock"
-              },
-              {
-                "$ref": "#/$defs/RepeatBlock"
-              },
-              {
-                "$ref": "#/$defs/MapBlock"
-              },
-              {
-                "$ref": "#/$defs/TextBlock"
-              },
-              {
-                "$ref": "#/$defs/LastOfBlock"
-              },
-              {
-                "$ref": "#/$defs/ArrayBlock"
-              },
-              {
-                "$ref": "#/$defs/ObjectBlock"
-              },
-              {
-                "$ref": "#/$defs/MessageBlock"
-              },
-              {
-                "$ref": "#/$defs/ReadBlock"
-              },
-              {
-                "$ref": "#/$defs/IncludeBlock"
-              },
-              {
-                "$ref": "#/$defs/ImportBlock"
-              },
-              {
-                "$ref": "#/$defs/ErrorBlock"
-              },
-              {
-                "$ref": "#/$defs/EmptyBlock"
-              },
-              {
-                "type": "null"
-              }
-            ]
+            "$ref": "#/$defs/BlockType"
           },
           "default": {},
           "description": "Set of definitions executed before the execution of the block.\n    ",
@@ -12091,256 +3915,248 @@
           "type": "object"
         },
         "def": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Name of the variable used to store the result of the execution of the block.\n    ",
-          "title": "Def"
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
         },
         "contribute": {
+          "$ref": "#/$defs/ContributeType",
           "default": [
             "result",
             "context"
           ],
-          "description": "Indicate if the block contributes to the result and background context.\n    ",
-          "items": {
-            "anyOf": [
-              {
-                "$ref": "#/$defs/ContributeTarget"
-              },
-              {
-                "additionalProperties": {
-                  "$ref": "#/$defs/ContributeValue"
-                },
-                "type": "object"
-              }
-            ]
-          },
-          "title": "Contribute",
-          "type": "array"
+          "description": "Indicate if the block contributes to the result and background context.\n    "
         },
         "parser": {
-          "anyOf": [
-            {
-              "enum": [
-                "json",
-                "jsonl",
-                "yaml"
-              ],
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/PdlParser"
-            },
-            {
-              "$ref": "#/$defs/RegexParser"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalParserType",
           "default": null,
-          "description": "Parser to use to construct a value out of a string result.",
-          "title": "Parser"
+          "description": "Parser to use to construct a value out of a string result."
         },
         "fallback": {
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null,
+          "description": "Block to execute in case of error.\n    "
+        },
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
+        },
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
+          "default": null,
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
+        },
+        "role": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
+        },
+        "pdl__context": {
+          "$ref": "#/$defs/OptionalModelInput",
+          "default": [],
+          "description": "Current context."
+        },
+        "pdl__id": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": "",
+          "description": "Unique identifier for this block."
+        },
+        "pdl__result": {
+          "$ref": "#/$defs/OptionalAny",
+          "default": null,
+          "description": "Result of the execution of the block."
+        },
+        "pdl__location": {
+          "$ref": "#/$defs/OptionalPdlLocationType",
+          "default": null
+        },
+        "pdl__timing": {
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
+        },
+        "pdl__is_leaf": {
+          "const": false,
+          "default": false,
+          "title": "Pdl  Is Leaf",
+          "type": "boolean"
+        },
+        "context": {
+          "$ref": "#/$defs/IndependentEnum",
+          "default": "dependent"
+        },
+        "kind": {
+          "const": "repeat",
+          "default": "repeat",
+          "title": "Kind",
+          "type": "string"
+        },
+        "for": {
           "anyOf": [
             {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
+              "additionalProperties": {
+                "anyOf": [
+                  {
+                    "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+                  },
+                  {
+                    "items": {},
+                    "type": "array"
+                  },
+                  {
+                    "type": "string"
+                  }
+                ]
+              },
+              "type": "object"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "Block to execute in case of error.\n    ",
-          "title": "Fallback"
+          "description": "Arrays to iterate over.\n    ",
+          "title": "For"
+        },
+        "index": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Name of the variable containing the loop iteration.\n    "
         },
-        "retry": {
+        "while": {
+          "$ref": "#/$defs/ExpressionBool",
+          "default": true,
+          "description": "Condition to stay at the beginning of the loop.\n    "
+        },
+        "repeat": {
+          "$ref": "#/$defs/BlockType",
+          "description": "Body of the loop.\n    "
+        },
+        "until": {
+          "$ref": "#/$defs/ExpressionBool",
+          "default": false,
+          "description": "Condition to exit at the end of the loop.\n    "
+        },
+        "maxIterations": {
+          "$ref": "#/$defs/OptionalExpressionInt",
+          "default": null,
+          "description": "Maximal number of iterations to perform.\n    "
+        },
+        "join": {
+          "$ref": "#/$defs/JoinType",
+          "default": {
+            "as": "text",
+            "with": ""
+          },
+          "description": "Define how to combine the result of each iteration.\n    "
+        },
+        "pdl__trace": {
           "anyOf": [
             {
-              "type": "integer"
+              "items": {
+                "$ref": "#/$defs/BlockType"
+              },
+              "type": "array"
             },
             {
               "type": "null"
             }
           ],
           "default": null,
-          "description": "The maximum number of times to retry when an error occurs within a block.\n    ",
-          "title": "Retry"
+          "title": "Pdl  Trace"
+        }
+      },
+      "required": [
+        "repeat"
+      ],
+      "title": "RepeatBlock",
+      "type": "object"
+    },
+    "TextBlock": {
+      "additionalProperties": false,
+      "description": "Create the concatenation of the stringify version of the result of each block of the list of blocks.",
+      "properties": {
+        "description": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Documentation associated to the block.\n    "
         },
-        "trace_error_on_retry": {
-          "anyOf": [
-            {
-              "type": "boolean"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
+        "spec": {
+          "$ref": "#/$defs/PdlTypeType",
+          "default": null,
+          "description": "Type specification of the result of the block.\n    "
+        },
+        "defs": {
+          "additionalProperties": {
+            "$ref": "#/$defs/BlockType"
+          },
+          "default": {},
+          "description": "Set of definitions executed before the execution of the block.\n    ",
+          "title": "Defs",
+          "type": "object"
+        },
+        "def": {
+          "$ref": "#/$defs/OptionalStr",
+          "default": null,
+          "description": "Name of the variable used to store the result of the execution of the block.\n    "
+        },
+        "contribute": {
+          "$ref": "#/$defs/ContributeType",
+          "default": [
+            "result",
+            "context"
           ],
+          "description": "Indicate if the block contributes to the result and background context.\n    "
+        },
+        "parser": {
+          "$ref": "#/$defs/OptionalParserType",
+          "default": null,
+          "description": "Parser to use to construct a value out of a string result."
+        },
+        "fallback": {
+          "$ref": "#/$defs/OptionalBlockType",
+          "default": null,
+          "description": "Block to execute in case of error.\n    "
+        },
+        "retry": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "The maximum number of times to retry when an error occurs within a block.\n    "
+        },
+        "trace_error_on_retry": {
+          "$ref": "#/$defs/OptionalBoolOrStr",
           "default": null,
-          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    ",
-          "title": "Trace Error On Retry"
+          "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
         "role": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": null,
-          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`.",
-          "title": "Role"
+          "description": "Role associated to the block and sub-blocks.\nTypical roles are `system`, `user`, and `assistant`,\nbut there may be other roles such as `available_tools`."
         },
         "pdl__context": {
-          "anyOf": [
-            {
-              "items": {
-                "additionalProperties": true,
-                "type": "object"
-              },
-              "type": "array"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalModelInput",
           "default": [],
-          "description": "Current context\n    ",
-          "title": "Pdl  Context"
+          "description": "Current context."
         },
         "pdl__id": {
-          "anyOf": [
-            {
-              "type": "string"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalStr",
           "default": "",
-          "description": "Unique identifier for this block\n    ",
-          "title": "Pdl  Id"
+          "description": "Unique identifier for this block."
         },
         "pdl__result": {
-          "anyOf": [
-            {},
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalAny",
           "default": null,
-          "description": "Result of the execution of the block",
-          "title": "Pdl  Result"
+          "description": "Result of the execution of the block."
         },
         "pdl__location": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlLocationType"
-            },
-            {
-              "type": "null"
-            }
-          ],
+          "$ref": "#/$defs/OptionalPdlLocationType",
           "default": null
         },
         "pdl__timing": {
-          "anyOf": [
-            {
-              "$ref": "#/$defs/PdlTiming"
-            },
-            {
-              "type": "null"
-            }
-          ],
-          "default": null
+          "$ref": "#/$defs/OptionalPdlTiming",
+          "default": null,
+          "description": "Execution timing information."
         },
         "pdl__is_leaf": {
           "const": false,
@@ -12361,173 +4177,13 @@
         "text": {
           "anyOf": [
             {
-              "type": "boolean"
-            },
-            {
-              "type": "integer"
-            },
-            {
-              "type": "number"
-            },
-            {
-              "type": "string"
-            },
-            {
-              "$ref": "#/$defs/FunctionBlock"
-            },
-            {
-              "$ref": "#/$defs/CallBlock"
-            },
-            {
-              "$ref": "#/$defs/LitellmModelBlock"
-            },
-            {
-              "$ref": "#/$defs/GraniteioModelBlock"
-            },
-            {
-              "$ref": "#/$defs/CodeBlock"
-            },
-            {
-              "$ref": "#/$defs/ArgsBlock"
-            },
-            {
-              "$ref": "#/$defs/GetBlock"
-            },
-            {
-              "$ref": "#/$defs/DataBlock"
-            },
-            {
-              "$ref": "#/$defs/IfBlock"
-            },
-            {
-              "$ref": "#/$defs/MatchBlock"
-            },
-            {
-              "$ref": "#/$defs/RepeatBlock"
-            },
-            {
-              "$ref": "#/$defs/MapBlock"
-            },
-            {
-              "$ref": "#/$defs/TextBlock"
-            },
-            {
-              "$ref": "#/$defs/LastOfBlock"
-            },
-            {
-              "$ref": "#/$defs/ArrayBlock"
-            },
-            {
-              "$ref": "#/$defs/ObjectBlock"
-            },
-            {
-              "$ref": "#/$defs/MessageBlock"
-            },
-            {
-              "$ref": "#/$defs/ReadBlock"
-            },
-            {
-              "$ref": "#/$defs/IncludeBlock"
-            },
-            {
-              "$ref": "#/$defs/ImportBlock"
-            },
-            {
-              "$ref": "#/$defs/ErrorBlock"
-            },
-            {
-              "$ref": "#/$defs/EmptyBlock"
+              "$ref": "#/$defs/BlockType"
             },
             {
               "items": {
-                "anyOf": [
-                  {
-                    "type": "boolean"
-                  },
-                  {
-                    "type": "integer"
-                  },
-                  {
-                    "type": "number"
-                  },
-                  {
-                    "type": "string"
-                  },
-                  {
-                    "$ref": "#/$defs/FunctionBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CallBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LitellmModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GraniteioModelBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/CodeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArgsBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/GetBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/DataBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MatchBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/RepeatBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MapBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/TextBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/LastOfBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ArrayBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ObjectBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/MessageBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ReadBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/IncludeBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ImportBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/ErrorBlock"
-                  },
-                  {
-                    "$ref": "#/$defs/EmptyBlock"
-                  },
-                  {
-                    "type": "null"
-                  }
-                ]
+                "$ref": "#/$defs/BlockType"
               },
               "type": "array"
-            },
-            {
-              "type": "null"
             }
           ],
           "description": "Body of the text.\n    ",
diff --git a/src/pdl/pdl_ast.py b/src/pdl/pdl_ast.py
index 6f0224ca6..65e066784 100644
--- a/src/pdl/pdl_ast.py
+++ b/src/pdl/pdl_ast.py
@@ -37,13 +37,28 @@ def _ensure_lower(value):
     return value
 
 
-ScopeType: TypeAlias = PdlDict[str, Any]
+OptionalStr = TypeAliasType("OptionalStr", Optional[str])
+"""Optional string."""
+OptionalInt = TypeAliasType("OptionalInt", Optional[int])
+"""Optional integer."""
+OptionalBoolOrStr = TypeAliasType("OptionalBoolOrStr", Optional[Union[bool, str]])
+"""Optional boolean or string."""
+OptionalAny = TypeAliasType("OptionalAny", Optional[Any])
+"""Optional value of any type."""
 
+OptionalBlockType = TypeAliasType("OptionalBlockType", Optional["BlockType"])
+"""Optional block."""
 
-ModelInput: TypeAlias = Sequence[Mapping[str, Any]]
 
+ScopeType = TypeAliasType("ScopeType", PdlDict[str, Any])
+"""Type of the execution environment."""
 
-LazyMessage: TypeAlias = PdlLazy[dict[str, Any]]
+ModelInput = TypeAliasType("ModelInput", Sequence[Mapping[str, Any]])
+"""Type of the input of an LLM call."""
+OptionalModelInput = TypeAliasType("OptionalModelInput", Optional[ModelInput])
+"""Optional value of type ModelInput."""
+
+LazyMessage = TypeAliasType("LazyMessage", PdlLazy[dict[str, Any]])
 LazyMessages: TypeAlias = PDLContext
 
 
@@ -79,6 +94,12 @@ class PdlLocationType(BaseModel):
     table: dict[str, int]
 
 
+OptionalPdlLocationType = TypeAliasType(
+    "OptionalPdlLocationType", Optional[PdlLocationType]
+)
+"""Optional location type."""
+
+
 empty_block_location = PdlLocationType(file="", path=[], table={})
 
 
@@ -96,19 +117,39 @@ class LocalizedExpression(BaseModel, Generic[LocalizedExpressionT]):
     )
     pdl__expr: Any
     pdl__result: Optional[LocalizedExpressionT] = None
-    pdl__location: Optional[PdlLocationType] = None
+    pdl__location: OptionalPdlLocationType = None
 
 
 ExpressionTypeT = TypeVar("ExpressionTypeT")
 ExpressionType: TypeAlias = LocalizedExpression[ExpressionTypeT] | ExpressionTypeT | str
 """Expressions are represented Jinja as strings in between `${` and `}`."""
 
+ExpressionStr = TypeAliasType("ExpressionStr", ExpressionType[str])
+"""Expression evaluating into a string."""
+
+OptionalExpressionStr = TypeAliasType("OptionalExpressionStr", Optional[ExpressionStr])
+"""Optional expression evaluating into a string."""
+
+ExpressionInt = TypeAliasType("ExpressionInt", ExpressionType[int])
+"""Expression evaluating into an int."""
+
+OptionalExpressionInt = TypeAliasType("OptionalExpressionInt", Optional[ExpressionInt])
+"""Optional expression evaluating into an int."""
+
+ExpressionBool = TypeAliasType("ExpressionBool", ExpressionType[bool])
+"""Expression evaluating into a bool."""
+
+OptionalExpressionBool = TypeAliasType(
+    "OptionalExpressionBool", Optional[ExpressionBool]
+)
+"""Optional expression evaluating into a bool."""
+
 
 class Pattern(BaseModel):
     """Common fields for structured patterns."""
 
     model_config = ConfigDict(extra="forbid")
-    def_: Optional[str] = Field(default=None, alias="def")
+    def_: OptionalStr = Field(default=None, alias="def")
     """Name of the variable used to store the value matched by the pattern.
     """
 
@@ -140,16 +181,11 @@ class AnyPattern(Pattern):
     any: Literal[None]
 
 
-PatternType: TypeAlias = (
-    None
-    | bool
-    | int
-    | float
-    | str
-    | OrPattern
-    | ArrayPattern
-    | ObjectPattern
-    | AnyPattern
+PatternType = TypeAliasType(
+    "PatternType",
+    Union[
+        None, bool, int, float, str, OrPattern, ArrayPattern, ObjectPattern, AnyPattern
+    ],
 )
 """Patterns allowed to match values in a `case` clause."""
 
@@ -234,7 +270,7 @@ class Parser(BaseModel):
     """Common fields for all parsers (`parser` field)."""
 
     model_config = ConfigDict(extra="forbid")
-    description: Optional[str] = None
+    description: OptionalStr = None
     """Documentation associated to the parser.
     """
     spec: PdlTypeType = None
@@ -261,10 +297,14 @@ class RegexParser(Parser):
     """Function used to parse to value (https://docs.python.org/3/library/re.html)."""
 
 
-ParserType: TypeAlias = Literal["json", "jsonl", "yaml"] | PdlParser | RegexParser
-
+ParserType = TypeAliasType(
+    "ParserType", Union[Literal["json", "jsonl", "yaml"], PdlParser, RegexParser]
+)
+"""Different parsers."""
+OptionalParserType = TypeAliasType("OptionalParserType", Optional[ParserType])
+"""Optional parser."""
 
-RoleType: TypeAlias = Optional[str]
+RoleType: TypeAlias = OptionalStr
 """Role name."""
 
 
@@ -284,35 +324,49 @@ class ContributeValue(BaseModel):
     """Value to contribute."""
 
 
+ContributeType = TypeAliasType(
+    "ContributeType", Sequence[Union[ContributeTarget, dict[str, ContributeValue]]]
+)
+"""Type of the contribute field."""
+
+
 class PdlTiming(BaseModel):
     """Internal data structure to record timing information in the trace."""
 
     model_config = ConfigDict(extra="forbid")
-    start_nanos: Optional[int] = 0
+    start_nanos: OptionalInt = 0
     """Time at which block execution began.
     """
-    end_nanos: Optional[int] = 0
+    end_nanos: OptionalInt = 0
     """Time at which block execution ended.
     """
-    first_use_nanos: Optional[int] = 0
+    first_use_nanos: OptionalInt = 0
     """Time at which the value of the block was needed for the first time.
     """
-    timezone: Optional[str] = ""
+    timezone: OptionalStr = ""
     """Timezone of start_nanos and end_nanos.
     """
 
 
+OptionalPdlTiming = TypeAliasType("OptionalPdlTiming", Optional[PdlTiming])
+"""Optional execution time information."""
+
+
 class PdlUsage(BaseModel):
     """Internal data structure to record token consumption usage information."""
 
-    completion_tokens: Optional[int] = 0
+    completion_tokens: OptionalInt = 0
     """Completion tokens consumed
     """
-    prompt_tokens: Optional[int] = 0
+    prompt_tokens: OptionalInt = 0
     """Prompt tokens consumed
     """
 
 
+OptionalPdlUsage = TypeAliasType("OptionalPdlUsage", Optional[PdlUsage])
+"""Optional usage of statistics of an LLM call."""
+
+
 class Block(BaseModel):
     """Common fields for all PDL blocks."""
 
@@ -323,7 +377,7 @@ class Block(BaseModel):
         validate_by_name=True,
     )
 
-    description: Optional[str] = None
+    description: OptionalStr = None
     """Documentation associated to the block.
     """
     spec: PdlTypeType = None
@@ -332,24 +386,24 @@ class Block(BaseModel):
     defs: dict[str, "BlockType"] = {}
     """Set of definitions executed before the execution of the block.
     """
-    def_: Optional[str] = Field(default=None, alias="def")
+    def_: OptionalStr = Field(default=None, alias="def")
     """Name of the variable used to store the result of the execution of the block.
     """
-    contribute: Sequence[ContributeTarget | dict[str, ContributeValue]] = [
+    contribute: ContributeType = [
         ContributeTarget.RESULT,
         ContributeTarget.CONTEXT,
     ]
     """Indicate if the block contributes to the result and background context.
     """
-    parser: Annotated[Optional[ParserType], BeforeValidator(_ensure_lower)] = None
+    parser: Annotated[OptionalParserType, BeforeValidator(_ensure_lower)] = None
     """Parser to use to construct a value out of a string result."""
-    fallback: Optional["BlockType"] = None
+    fallback: OptionalBlockType = None
     """Block to execute in case of error.
     """
-    retry: Optional[int] = None
+    retry: OptionalInt = None
     """The maximum number of times to retry when an error occurs within a block.
     """
-    trace_error_on_retry: Optional[bool] | str = None
+    trace_error_on_retry: OptionalBoolOrStr = None
     """Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
     """
     role: RoleType = None
@@ -358,16 +412,15 @@ class Block(BaseModel):
     but there may be other roles such as `available_tools`.
     """
     # Fields for internal use
-    pdl__context: Optional[ModelInput] = []
-    """Current context
-    """
-    pdl__id: Optional[str] = ""
-    """Unique identifier for this block
-    """
-    pdl__result: Optional[Any] = None
-    """Result of the execution of the block"""
-    pdl__location: Optional[PdlLocationType] = None
-    pdl__timing: Optional[PdlTiming] = None
+    pdl__context: OptionalModelInput = []
+    """Current context."""
+    pdl__id: OptionalStr = ""
+    """Unique identifier for this block."""
+    pdl__result: OptionalAny = None
+    """Result of the execution of the block."""
+    pdl__location: OptionalPdlLocationType = None
+    pdl__timing: OptionalPdlTiming = None
+    """Execution timing information."""
 
 
 class LeafBlock(Block):
@@ -412,7 +465,7 @@ class CallBlock(LeafBlock):
     """Arguments of the function with their values.
     """
     # Field for internal use
-    pdl__trace: Optional["BlockType"] = None
+    pdl__trace: OptionalBlockType = None
 
 
 class LitellmParameters(BaseModel):
@@ -518,14 +571,14 @@ class ModelBlock(LeafBlock):
     input: "BlockType" = "${ pdl_context }"
     """Messages to send to the model.
     """
-    modelResponse: Optional[str] = None
+    modelResponse: OptionalStr = None
     """Variable where to store the raw response of the model.
     """
     # Field for internal use
-    pdl__usage: Optional[PdlUsage] = None
+    pdl__usage: OptionalPdlUsage = None
     """Tokens consumed during model call
     """
-    pdl__model_input: Optional[ModelInput] = None
+    pdl__model_input: OptionalModelInput = None
 
 
 class LitellmModelBlock(ModelBlock):
@@ -543,7 +596,7 @@ class LitellmModelBlock(ModelBlock):
     platform: Literal[ModelPlatform.LITELLM] = ModelPlatform.LITELLM
     """Optional field to ensure that the block is using LiteLLM.
     """
-    model: ExpressionType[str]
+    model: ExpressionStr
     """Name of the model following the LiteLLM convention.
     """
     parameters: Optional[LitellmParameters | ExpressionType[dict]] = None
@@ -552,10 +605,10 @@ class LitellmModelBlock(ModelBlock):
 
 
 class GraniteioProcessor(BaseModel):
-    type: Optional[ExpressionType[str]] = None
+    type: OptionalExpressionStr = None
     """Type of IO processor.
     """
-    model: Optional[ExpressionType[str]] = None
+    model: OptionalExpressionStr = None
     """Model name used by the backend.
     """
     backend: ExpressionType[str | dict[str, Any] | object]
@@ -620,7 +673,7 @@ class ArgsBlock(BaseCodeBlock):
     """
 
     lang: Annotated[Literal["command"], BeforeValidator(_ensure_lower)] = "command"
-    args: list[ExpressionType[str]]
+    args: list[ExpressionStr]
     """The argument vector to spawn.
     """
 
@@ -708,9 +761,9 @@ class MessageBlock(LeafBlock):
     kind: Literal[BlockKind.MESSAGE] = BlockKind.MESSAGE
     content: "BlockType"
     """Content of the message."""
-    name: Optional[ExpressionType[str]] = None
+    name: OptionalExpressionStr = None
     """For example, the name of the tool that was invoked, for which this message is the tool response."""
-    tool_call_id: Optional[ExpressionType[str]] = None
+    tool_call_id: OptionalExpressionStr = None
     """The id of the tool invocation for which this message is the tool response."""
 
 
@@ -730,13 +783,13 @@ class IfBlock(StructuredBlock):
     """
 
     kind: Literal[BlockKind.IF] = BlockKind.IF
-    condition: ExpressionType[bool] = Field(alias="if")
+    condition: ExpressionBool = Field(alias="if")
     """Condition.
     """
     then: "BlockType"
     """Branch to execute if the condition is true.
     """
-    else_: Optional["BlockType"] = Field(default=None, alias="else")
+    else_: OptionalBlockType = Field(default=None, alias="else")
     """Branch to execute if the condition is false.
     """
 
@@ -748,7 +801,7 @@ class MatchCase(BaseModel):
     case: Optional[PatternType] = None
     """Value to match.
     """
-    if_: Optional[ExpressionType[bool]] = Field(default=None, alias="if")
+    if_: OptionalExpressionBool = Field(default=None, alias="if")
     """Boolean condition to satisfy.
     """
     then: "BlockType"
@@ -843,7 +896,9 @@ class JoinReduce(JoinConfig):
     """Function used to combine the results."""
 
 
-JoinType: TypeAlias = JoinText | JoinArray | JoinObject | JoinLastOf | JoinReduce
+JoinType = TypeAliasType(
+    "JoinType", Union[JoinText, JoinArray, JoinObject, JoinLastOf, JoinReduce]
+)
 """Different ways to join loop iterations."""
 
 
@@ -879,19 +934,19 @@ class RepeatBlock(StructuredBlock):
     for_: Optional[dict[str, ExpressionType[list]]] = Field(default=None, alias="for")
     """Arrays to iterate over.
     """
-    index: Optional[str] = None
+    index: OptionalStr = None
     """Name of the variable containing the loop iteration.
     """
-    while_: ExpressionType[bool] = Field(default=True, alias="while")
+    while_: ExpressionBool = Field(default=True, alias="while")
     """Condition to stay at the beginning of the loop.
     """
     repeat: "BlockType"
     """Body of the loop.
     """
-    until: ExpressionType[bool] = False
+    until: ExpressionBool = False
     """Condition to exit at the end of the loop.
     """
-    maxIterations: Optional[ExpressionType[int]] = None
+    maxIterations: OptionalExpressionInt = None
     """Maximal number of iterations to perform.
     """
     join: JoinType = JoinText()
@@ -931,13 +986,13 @@ class MapBlock(StructuredBlock):
     for_: Optional[dict[str, ExpressionType[list]]] = Field(default=None, alias="for")
     """Arrays to iterate over.
     """
-    index: Optional[str] = None
+    index: OptionalStr = None
     """Name of the variable containing the loop iteration.
     """
     map: "BlockType"
     """Body of the iterator.
     """
-    maxIterations: Optional[ExpressionType[int]] = None
+    maxIterations: OptionalExpressionInt = None
     """Maximal number of iterations to perform.
     """
     join: JoinType = JoinText()
@@ -964,10 +1019,10 @@ class ReadBlock(LeafBlock):
     """
 
     kind: Literal[BlockKind.READ] = BlockKind.READ
-    read: ExpressionType[str] | None
+    read: OptionalExpressionStr
     """Name of the file to read. If `None`, read the standard input.
     """
-    message: Optional[str] = None
+    message: OptionalStr = None
     """Message to prompt the user to enter a value.
     """
     multiline: bool = False
@@ -983,7 +1038,7 @@ class IncludeBlock(StructuredBlock):
     """Name of the file to include.
     """
     # Field for internal use
-    pdl__trace: Optional["BlockType"] = None
+    pdl__trace: OptionalBlockType = None
 
 
 class ImportBlock(LeafBlock):
@@ -994,7 +1049,7 @@ class ImportBlock(LeafBlock):
     """Name of the file to import.
     """
     # Field for internal use
-    pdl__trace: Optional["BlockType"] = None
+    pdl__trace: OptionalBlockType = None
 
 
 class ErrorBlock(LeafBlock):
@@ -1041,7 +1096,9 @@ class EmptyBlock(LeafBlock):
 )
 """Different types of structured blocks.
 """
-BlockType: TypeAlias = None | bool | int | float | str | AdvancedBlockType
+BlockType = TypeAliasType(
+    "BlockType", Union[None, bool, int, float, str, AdvancedBlockType]
+)
 """All kinds of blocks.
 """
 BlockOrBlocksType: TypeAlias = BlockType | list[BlockType]  # pyright: ignore
@@ -1076,7 +1133,7 @@ def __init__(
         message: str,
         loc: Optional[PdlLocationType] = None,
         trace: Optional[BlockType] = None,
-        fallback: Optional[Any] = None,
+        fallback: OptionalAny = None,
     ):
         super().__init__(message)
         self.loc = loc
@@ -1099,7 +1156,7 @@ def __init__(
         message: str,
         blocks: list[BlockType],
         loc: Optional[PdlLocationType] = None,
-        fallback: Optional[Any] = None,
+        fallback: OptionalAny = None,
     ):
         super().__init__(message)
         self.loc = loc
diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py
index d0fb3aa51..23552d8a2 100644
--- a/src/pdl/pdl_interpreter.py
+++ b/src/pdl/pdl_interpreter.py
@@ -229,6 +229,9 @@ def __call__(self, *args, **kwargs):
         return result
 
 
+ClosureBlock.model_rebuild()
+
+
 def generate(
     pdl_file: str | Path,
     state: Optional[InterpreterState],
diff --git a/src/pdl/pdl_schema_error_analyzer.py b/src/pdl/pdl_schema_error_analyzer.py
index 93f207b24..9b9076159 100644
--- a/src/pdl/pdl_schema_error_analyzer.py
+++ b/src/pdl/pdl_schema_error_analyzer.py
@@ -156,6 +156,13 @@ def analyze_errors(defs, schema, data, loc: PdlLocationType) -> list[str]:  # no
                     the_type_exists = True
                 if "enum" in item and data in item["enum"]:
                     the_type_exists = True
+                if "$ref" in item:
+                    ref_string = item["$ref"].split("/")[2]
+                    ref_type = defs[ref_string]
+                    errs = analyze_errors(defs, ref_type, data, loc)
+                    the_type_exists = len(errs) == 0
+                if the_type_exists:
+                    break
             if not the_type_exists:
                 ret.append(
                     get_loc_string(loc)

From abf8a3ad0be6e50bac5ac900e22c1f931a5e5519 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 29 Jul 2025 23:25:40 -0400
Subject: [PATCH 080/107] chore(deps): update dependency @types/node to
 v22.17.0 (#1077)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 pdl-live-react/package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 32ec86603..19dde6100 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -36,7 +36,7 @@
         "@eslint/js": "^9.19.0",
         "@playwright/test": "^1.50.0",
         "@tauri-apps/cli": "^2.3.0",
-        "@types/node": "22.16.5",
+        "@types/node": "22.17.0",
         "@types/react": "^18.3.18",
         "@types/react-dom": "^18.3.5",
         "@types/react-syntax-highlighter": "^15.5.13",
@@ -1899,9 +1899,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.16.5",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.5.tgz",
-      "integrity": "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==",
+      "version": "22.17.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.0.tgz",
+      "integrity": "sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index cdf8d68d7..375858415 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -51,7 +51,7 @@
     "@eslint/js": "^9.19.0",
     "@playwright/test": "^1.50.0",
     "@tauri-apps/cli": "^2.3.0",
-    "@types/node": "22.16.5",
+    "@types/node": "22.17.0",
     "@types/react": "^18.3.18",
     "@types/react-dom": "^18.3.5",
     "@types/react-syntax-highlighter": "^15.5.13",

From cbfd9bcd941a7507de32acb7ed18e0af39c510b5 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 30 Jul 2025 09:10:12 -0400
Subject: [PATCH 081/107] fix(deps): update react monorepo to v19 (#1078)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 60 ++++++++++++--------------------
 pdl-live-react/package.json      |  8 ++---
 2 files changed, 27 insertions(+), 41 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 19dde6100..2583d972f 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -21,8 +21,8 @@
         "lz-string": "^1.5.0",
         "pretty-bytes": "^7.0.0",
         "pretty-ms": "^9.2.0",
-        "react": "^18.3.1",
-        "react-dom": "^18.3.1",
+        "react": "^19.0.0",
+        "react-dom": "^19.0.0",
         "react-markdown": "^10.0.0",
         "react-router": "^7.1.5",
         "react-syntax-highlighter": "^15.6.1",
@@ -37,8 +37,8 @@
         "@playwright/test": "^1.50.0",
         "@tauri-apps/cli": "^2.3.0",
         "@types/node": "22.17.0",
-        "@types/react": "^18.3.18",
-        "@types/react-dom": "^18.3.5",
+        "@types/react": "^19.0.0",
+        "@types/react-dom": "^19.0.0",
         "@types/react-syntax-highlighter": "^15.5.13",
         "@vitejs/plugin-react": "^4.3.4",
         "concurrently": "^9.1.2",
@@ -1908,30 +1908,23 @@
         "undici-types": "~6.21.0"
       }
     },
-    "node_modules/@types/prop-types": {
-      "version": "15.7.14",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
-      "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
-      "license": "MIT"
-    },
     "node_modules/@types/react": {
-      "version": "18.3.23",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz",
-      "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==",
+      "version": "19.1.9",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz",
+      "integrity": "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==",
       "license": "MIT",
       "dependencies": {
-        "@types/prop-types": "*",
         "csstype": "^3.0.2"
       }
     },
     "node_modules/@types/react-dom": {
-      "version": "18.3.7",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
-      "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+      "version": "19.1.7",
+      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz",
+      "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==",
       "dev": true,
       "license": "MIT",
       "peerDependencies": {
-        "@types/react": "^18.0.0"
+        "@types/react": "^19.0.0"
       }
     },
     "node_modules/@types/react-syntax-highlighter": {
@@ -5248,28 +5241,24 @@
       "license": "MIT"
     },
     "node_modules/react": {
-      "version": "18.3.1",
-      "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
-      "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+      "version": "19.1.1",
+      "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz",
+      "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==",
       "license": "MIT",
-      "dependencies": {
-        "loose-envify": "^1.1.0"
-      },
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/react-dom": {
-      "version": "18.3.1",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
-      "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+      "version": "19.1.1",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz",
+      "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==",
       "license": "MIT",
       "dependencies": {
-        "loose-envify": "^1.1.0",
-        "scheduler": "^0.23.2"
+        "scheduler": "^0.26.0"
       },
       "peerDependencies": {
-        "react": "^18.3.1"
+        "react": "^19.1.1"
       }
     },
     "node_modules/react-dropzone": {
@@ -5654,13 +5643,10 @@
       }
     },
     "node_modules/scheduler": {
-      "version": "0.23.2",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
-      "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
-      "license": "MIT",
-      "dependencies": {
-        "loose-envify": "^1.1.0"
-      }
+      "version": "0.26.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+      "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+      "license": "MIT"
     },
     "node_modules/semver": {
       "version": "6.3.1",
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index 375858415..09e9f4ac8 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -36,8 +36,8 @@
     "lz-string": "^1.5.0",
     "pretty-bytes": "^7.0.0",
     "pretty-ms": "^9.2.0",
-    "react": "^18.3.1",
-    "react-dom": "^18.3.1",
+    "react": "^19.0.0",
+    "react-dom": "^19.0.0",
     "react-markdown": "^10.0.0",
     "react-router": "^7.1.5",
     "react-syntax-highlighter": "^15.6.1",
@@ -52,8 +52,8 @@
     "@playwright/test": "^1.50.0",
     "@tauri-apps/cli": "^2.3.0",
     "@types/node": "22.17.0",
-    "@types/react": "^18.3.18",
-    "@types/react-dom": "^18.3.5",
+    "@types/react": "^19.0.0",
+    "@types/react-dom": "^19.0.0",
     "@types/react-syntax-highlighter": "^15.5.13",
     "@vitejs/plugin-react": "^4.3.4",
     "concurrently": "^9.1.2",

From 5efcde14120b6d6f54c2bedfe2d2ace52e708c1f Mon Sep 17 00:00:00 2001
From: Mandana Vaziri 
Date: Fri, 1 Aug 2025 10:29:35 -0400
Subject: [PATCH 082/107] Fix for exception in optimizer (#1084)

Signed-off-by: Mandana Vaziri 
---
 src/pdl/optimize/pdl_optimizer.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/pdl/optimize/pdl_optimizer.py b/src/pdl/optimize/pdl_optimizer.py
index 0dea78ef8..b6be331a7 100644
--- a/src/pdl/optimize/pdl_optimizer.py
+++ b/src/pdl/optimize/pdl_optimizer.py
@@ -254,7 +254,10 @@ def save_experiment(self):
         exp_file = self.experiment_path / f"{self.experiment_uuid}.json"
 
         with exp_file.open("w") as f:
-            json.dump(self.experiment_log, f)
+            try:
+                json.dump(self.experiment_log, f)
+            except TypeError:
+                logger.warning("Unable to save experiment")  # TODO
 
         return exp_file
 

From d2fe4171fee1493faba5ff6b4bb2176c5bab44a6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 1 Aug 2025 15:01:06 -0400
Subject: [PATCH 083/107] fix(deps): update rust crate tokio to v1.47.1 (#1085)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 3aec4c15d..5550b40aa 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -6028,9 +6028,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.47.0"
+version = "1.47.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35"
+checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
 dependencies = [
  "backtrace",
  "bytes",
@@ -6867,7 +6867,7 @@ version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
- "windows-sys 0.59.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]

From 02e6ab4b23f05a907a3db36ab4845eb5ab5e586b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 1 Aug 2025 15:02:33 -0400
Subject: [PATCH 084/107] chore(deps): update dependency @playwright/test to
 v1.54.2 (#1083)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 2583d972f..6bef09ac2 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1199,13 +1199,13 @@
       "license": "MIT"
     },
     "node_modules/@playwright/test": {
-      "version": "1.54.1",
-      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz",
-      "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==",
+      "version": "1.54.2",
+      "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz",
+      "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "playwright": "1.54.1"
+        "playwright": "1.54.2"
       },
       "bin": {
         "playwright": "cli.js"
@@ -5066,13 +5066,13 @@
       }
     },
     "node_modules/playwright": {
-      "version": "1.54.1",
-      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz",
-      "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==",
+      "version": "1.54.2",
+      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz",
+      "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "playwright-core": "1.54.1"
+        "playwright-core": "1.54.2"
       },
       "bin": {
         "playwright": "cli.js"
@@ -5085,9 +5085,9 @@
       }
     },
     "node_modules/playwright-core": {
-      "version": "1.54.1",
-      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz",
-      "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==",
+      "version": "1.54.2",
+      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz",
+      "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==",
       "dev": true,
       "license": "Apache-2.0",
       "bin": {

From cfa24dd4c13a9062ad5cf2c7b9a9d3892681a483 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 1 Aug 2025 15:03:13 -0400
Subject: [PATCH 085/107] fix(deps): update rust crate serde_json to v1.0.142
 (#1082)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 5550b40aa..4040118eb 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -5051,9 +5051,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.141"
+version = "1.0.142"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3"
+checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7"
 dependencies = [
  "indexmap 2.10.0",
  "itoa",

From 873e64d4d567f4236c559b70844e421855a94d52 Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Fri, 1 Aug 2025 22:59:46 -0400
Subject: [PATCH 086/107] docs: update tutorial (#1080)

Signed-off-by: Louis Mandel 
---
 docs/README.md                                |   2 +-
 docs/tutorial.md                              | 197 +++++++++++++-----
 examples/sdk/hello_dict.py                    |  22 --
 examples/sdk/hello_prog.py                    |  23 --
 examples/tutorial/calling_llm.pdl             |   4 +-
 examples/tutorial/calling_llm_with_input.pdl  |   2 +-
 .../calling_llm_with_input_messages.pdl       |   2 +-
 .../calling_llm_with_input_messages_var.pdl   |  10 +-
 examples/tutorial/defs-hello.pdl              |  14 --
 examples/tutorial/defs.pdl                    |  34 ++-
 examples/tutorial/function_alias.pdl          |   2 +-
 examples/tutorial/function_call_in_jinja.pdl  |  14 ++
 examples/tutorial/function_definition.pdl     |  24 +--
 examples/tutorial/function_empty_context.pdl  |  31 ++-
 .../tutorial/function_optional_params.pdl     |  25 ++-
 examples/tutorial/lastOf.pdl                  |   8 +
 examples/tutorial/local_computation.pdl       |   9 +
 examples/tutorial/muting_block_output.pdl     |  28 +--
 examples/tutorial/role.pdl                    |   7 +
 examples/{ => tutorial}/sdk/hello.pdl         |   0
 examples/tutorial/sdk/hello_dict.py           |  21 ++
 examples/{ => tutorial}/sdk/hello_file.py     |   0
 examples/tutorial/sdk/hello_parallel.py       |  37 ++++
 examples/tutorial/sdk/hello_prog.py           |  22 ++
 examples/{ => tutorial}/sdk/hello_str.py      |   3 +-
 examples/tutorial/variable_def_use.pdl        |   6 +-
 .../tutorial/calling_llm_chaining.0.result    |   4 +-
 .../tutorial/calling_llm_chaining.1.result    |   4 -
 ...lling_llm_with_input_messages_var.0.result |  49 +----
 ...lling_llm_with_input_messages_var.1.result |  53 -----
 ...lling_llm_with_input_messages_var.2.result |  47 -----
 ...lling_llm_with_input_messages_var.3.result |  47 -----
 ...lling_llm_with_input_messages_var.4.result |  47 -----
 .../examples/tutorial/defs-hello.0.result     |   2 -
 tests/results/examples/tutorial/defs.0.result |  11 +-
 tests/results/examples/tutorial/defs.1.result |   2 -
 .../tutorial/function_call_in_jinja.0.result  |   1 +
 .../tutorial/function_definition.0.result     |   4 +-
 .../tutorial/function_definition.3.result     |   2 +
 .../tutorial/function_empty_context.0.result  |   3 +-
 .../tutorial/function_empty_context.1.result  |   3 +-
 .../function_optional_params.0.result         |   3 +-
 .../results/examples/tutorial/lastOf.0.result |   3 +
 .../results/examples/tutorial/lastOf.1.result |   3 +
 .../tutorial/local_computation.0.result       |   2 +
 .../tutorial/muting_block_output.0.result     |   6 +-
 .../tutorial/muting_block_output.1.result     |   1 -
 tests/results/examples/tutorial/role.0.result |   3 +
 .../{ => tutorial}/sdk/hello.0.result         |   0
 .../tutorial/variable_def_use.0.result        |   2 +-
 tests/test_examples_run.yaml                  |  14 +-
 51 files changed, 401 insertions(+), 462 deletions(-)
 delete mode 100644 examples/sdk/hello_dict.py
 delete mode 100644 examples/sdk/hello_prog.py
 delete mode 100644 examples/tutorial/defs-hello.pdl
 create mode 100644 examples/tutorial/function_call_in_jinja.pdl
 create mode 100644 examples/tutorial/lastOf.pdl
 create mode 100644 examples/tutorial/local_computation.pdl
 create mode 100644 examples/tutorial/role.pdl
 rename examples/{ => tutorial}/sdk/hello.pdl (100%)
 create mode 100644 examples/tutorial/sdk/hello_dict.py
 rename examples/{ => tutorial}/sdk/hello_file.py (100%)
 create mode 100644 examples/tutorial/sdk/hello_parallel.py
 create mode 100644 examples/tutorial/sdk/hello_prog.py
 rename examples/{ => tutorial}/sdk/hello_str.py (94%)
 delete mode 100644 tests/results/examples/tutorial/calling_llm_chaining.1.result
 delete mode 100644 tests/results/examples/tutorial/calling_llm_with_input_messages_var.1.result
 delete mode 100644 tests/results/examples/tutorial/calling_llm_with_input_messages_var.2.result
 delete mode 100644 tests/results/examples/tutorial/calling_llm_with_input_messages_var.3.result
 delete mode 100644 tests/results/examples/tutorial/calling_llm_with_input_messages_var.4.result
 delete mode 100644 tests/results/examples/tutorial/defs-hello.0.result
 delete mode 100644 tests/results/examples/tutorial/defs.1.result
 create mode 100644 tests/results/examples/tutorial/function_call_in_jinja.0.result
 create mode 100644 tests/results/examples/tutorial/function_definition.3.result
 create mode 100644 tests/results/examples/tutorial/lastOf.0.result
 create mode 100644 tests/results/examples/tutorial/lastOf.1.result
 create mode 100644 tests/results/examples/tutorial/local_computation.0.result
 delete mode 100644 tests/results/examples/tutorial/muting_block_output.1.result
 create mode 100644 tests/results/examples/tutorial/role.0.result
 rename tests/results/examples/{ => tutorial}/sdk/hello.0.result (100%)

diff --git a/docs/README.md b/docs/README.md
index 412ed30cf..4224102f1 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -201,7 +201,7 @@ text:
 ```
 
 
-A PDL program computes 2 data structures. The first is a JSON corresponding to the result of the overall program, obtained by aggregating the results of each block. This is what is printed by default when we run the interpreter. The second is a conversational background context, which is a list of role/content pairs, where we implicitly keep track of roles and content for the purpose of communicating with models that support chat APIs. The contents in the latter correspond to the results of each block. The conversational background context is the list of messages used to make calls to LLMs via LiteLLM.
+A PDL program computes two data structures. The first is a JSON corresponding to the result of the overall program, obtained by aggregating the results of each block. This is what is printed by default when we run the interpreter. The second is a conversational background context, which is a list of role/content pairs, where we implicitly keep track of roles and content for the purpose of communicating with models that support chat APIs. The contents in the latter correspond to the results of each block. The conversational background context is the list of messages used to make calls to LLMs via LiteLLM.
 
 The PDL interpreter can also stream the background conversation instead of the result:
 
diff --git a/docs/tutorial.md b/docs/tutorial.md
index 2f0f37d70..2e6f84fc3 100644
--- a/docs/tutorial.md
+++ b/docs/tutorial.md
@@ -35,42 +35,39 @@ Hello, world!
 In this program ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/calling_llm.pdl)), the `text` starts with the word `"Hello\n"`, and we call a model (`ollama/granite3.2:2b`) with this as input prompt.
 The model is passed a parameter `stop` to indicate the stop sequences.
 
-A PDL program computes 2 data structures. The first is a JSON corresponding to the result of the overall program, obtained by aggregating the results of each block. This is what is printed by default when we run the interpreter. The second is a conversational background context, which is a list of role/content pairs (list of messages), where we implicitly keep track of roles and content for the purpose of communicating with models that support chat APIs. The contents in the latter correspond to the results of each block. The conversational background context is what is used to make calls to LLMs via LiteLLM.
+A PDL program computes two data structures. The first is a JSON corresponding to the result of the overall program, obtained by aggregating the results of each block. This is what is printed by default when we run the interpreter. The second is a conversational background context, which is a list of role/content pairs (list of messages), where we implicitly keep track of roles and content for the purpose of communicating with models that support chat APIs. The contents in the latter correspond to the results of each block. The conversational background context is what is used to make calls to LLMs via LiteLLM.
 
-In this example, since the `input` field is not specified in the model call, the entire text up to that point is passed to the model as input context, using the
+In this example, the input of the model is `[{"role": "user", "content": "Hello\n"}]` which corresponds to the entire text up to that point using the
 default role `user`.
 
-When we execute this program using the interpreter, we obtain:
+When we execute this program using the interpreter, we obtain the following result where the second `Hello` has been generated by Granite:
 
 ```
 Hello
 Hello
 ```
 
-where the second `Hello` has been generated by Granite.
-
-Here's another example of model call that includes an `input` field ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/calling_llm_with_input.pdl)):
+The input of to the model can also be provided explicitly using the `input` field.
+Here is an example of model call using this feature ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/calling_llm_with_input.pdl)):
 
 ```yaml
 --8<-- "./examples/tutorial/calling_llm_with_input.pdl"
 ```
 
-In this case, the input passed to the model is the sentence: `Translate the word 'Hello' to French` and nothing else from the surrounding document. When we execute this program, we obtain:
+In this case, the input passed to the model is `[{"role": "user", "content": "Translate the word 'Hello' to French"}]` and nothing else from the surrounding document. When we execute this program, we obtain the following result where the second line is generated by the model.:
 
 ```
 Hello
 Bonjour (pronounced bon-zhoor) is the translation for "Hello" in French. It's an informal greeting used during the day, similar to how we use "Hi" or "Hello." For a more formal context, you might say "Bonjour," which means "Good day."
 ```
 
-where the second line is generated by the model.
-
 Using the `input` field, we can also give a directly an array of messages (`role`/`content`) to the model ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/calling_llm_with_input_messages.pdl)):
 
 ```yaml
 --8<-- "./examples/tutorial/calling_llm_with_input_messages.pdl"
 ```
 
-This has the same output as the previous program. An alternative way of writing this is [this](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/calling_llm_with_input_messages_var.pdl) program.
+This has a similar output as the previous program. An alternative way of writing this program using a variable to store the prompt is [this program](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/calling_llm_with_input_messages_var.pdl).
 
 ### Parameter defaults for watsonx Granite models
 
@@ -89,25 +86,45 @@ When using Granite models, we use the following defaults for model parameters:
 
 The user can override these defaults by explicitly including them in the model call.
 
-## Variable Definition and Use
 
-Any block can define a variable using a `def: ` field. This means that the output of that block is assigned to the variable ``, which may be reused at a later point in the document.
+## Building the background context with `lastOf`
 
-Consider the following example ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/variable_def_use.pdl)):
+The pervious example explicitly provides a list of messages with different roles to the LLM call. This can also be done implicitly using the background context.
+
+Each block can be annotated with a `role` field indicating the role that is used when a message is added to the background context by the block or any of the sub-block that does not redefine it.
+In this example, we add a `system` message asking the model to provide answer formally ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/role.pdl)):
 
 ```yaml
---8<-- "./examples/tutorial/variable_def_use.pdl"
+--8<-- "./examples/tutorial/role.pdl"
 ```
 
-Here we assign the output of the model to variable `GEN` using the `def` field. The last line of the program prints out the value of `GEN`. Notice the notation `${ }` for accessing the value of a variable. Any [Jinja](https://jinja.palletsprojects.com/en/3.1.x/) expression is allowed to be used inside these braces. These expressions
-are also used to specify conditions for loops and conditionals. See for example this [file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/programs/chatbot.pdl).
+In this program, we explicitly indicated the top-level `user` role which is added automatically by the interpreter otherwise.
+This role is inherited by the `"Hello\n"` block and masked in the next block to define a system prompt.
+So the context provided as input to the LLM is `[{"role": "user", "content": "Hello\n"}, {"role": "system", "content": "You are a polite assistant that likes to answer very formally."}]`. The answer produced by the model block has the `assistant` role.
 
-When we execute this program, we obtain:
+The execution of this program produces:
 
 ```
 Hello
+You are a polite assistant that likes to answer very formally.
+Greetings! I trust this message finds you in good health and high spirits. How may I be of assistance today? Please feel free to pose your query or request, knowing that I am here to serve with diligence and precision.
+```
+
+If we want to add the `system` message to the background context without having it present in the result, we can use a `lastOf` block.
+The `lastOf` is associated to a list of blocks that are executed in sequence.
+Each sub-block contributes messages to the background context but the result of the block is the result of the last block.
+The following program provides the same input to the LLM, but the system prompt is not part of the result ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/lastOf.pdl)):
+
+```yaml
+--8<-- "./examples/tutorial/lastOf.pdl"
+```
+
+Therefore, the result of the program is:
+
+```
 Hello
-GEN is equal to: Hello
+
+Greetings! I trust this message finds you in good health and high spirits. How may I be of assistance today? Please feel free to pose your query or request, knowing that I am here to serve with diligence and precision.
 ```
 
 ## Model Chaining
@@ -118,77 +135,97 @@ In PDL, we can declaratively chain models together as in the following example (
 --8<-- "./examples/tutorial/calling_llm_chaining.pdl"
 ```
 
-In this program, the first call is to a Granite model with the prompt `"Hello\n"`. The following block in the program prints out the sentence: `"\nDid you just say Hello?\n"`. The final line of the program takes the entire context produced so far and passes it as input to the Granite model. Notice that the input passed to this model is the context up to that point, represented as a conversation. This makes it easy to chain models together and continue building on previous interactions. Notice how the conversational context is accumulated implicitly without requiring the user to explicitly manage messages.
+In this program, the first block result is `Hello\n` and adds a message with this value to the background context. The second block calls Granite on the background context containing the Hello message and adds the response of the model to the result and context. The following block contributes the sentence: `\nTranslate the above to French\n`. The final line of the program takes the entire context produced so far and passes it as input to the Granite model. Notice that the input passed to this model is the context up to that point, represented as a conversation. This makes it easy to chain models together and continue building on previous interactions. Notice how the conversational context is accumulated implicitly without requiring the user to explicitly manage messages.
 
 When we execute this program, we obtain:
 
 ```
 Hello
 Hello
-Did you just say Hello?
-Yes, I did. That's how I greet people in this conversation. It's a common way to start a dialogue. How can I assist you today?
+Translate the above to French
+Bonjour
 ```
 
-## Function Definition
+## Variable Definition and Use
 
-PDL also supports function definitions to make it easier to reuse code.
-Suppose we want to define a translation function that takes a string and calls a Granite model for the translation. This would be written in PDL as follows ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/function_definition.pdl)):
+Any block can define a variable using a `def: ` field. This means that the result of that block is assigned to the variable ``, which may be reused at a later point in the document.
+
+Consider the following example ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/variable_def_use.pdl)):
 
 ```yaml
---8<-- "./examples/tutorial/function_definition.pdl"
+--8<-- "./examples/tutorial/variable_def_use.pdl"
 ```
 
-In this program, the first block defines a function `translate` that takes as parameters `sentence` and `language`, both of which are of type string. The body of the function is defined by its `return` field. In this case, we formulate a translation prompt using the parameters and send it to a Granite model.
+Here we assign the response of the model to variable `GEN` using the `def` field. The last line of the program prints out the value of `GEN`. Notice the notation `${ }` for accessing the value of a variable. Any [Jinja](https://jinja.palletsprojects.com/en/3.1.x/) expression is allowed to be used inside these braces. These expressions
+are also used to specify conditions for loops and conditionals. See for example this [file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/programs/chatbot.pdl).
 
-The last two blocks are calls to this function, as indicated by `call: ${ translate }`. This block specifies the arguments to be passed. When we execute this program, we obtain:
+When we execute this program, we obtain:
 
 ```
-'J'aime Paris !'
-'Me encanta Madrid.'
+Hello
+Hello
+The variable GEN is equal to: Hello
 ```
 
-A function only contributes to the result when it is called. So the definition itself results in `""`. When we call a function, we implicitly pass the current background context, and this is used as input to model calls inside the function body. In the above example, since the `input` field is omitted, the entire document produced at that point is passed as input to the Granite model.
-
-To reset the context when calling a function, we can pass the special argument: `pdl_context: []`.
-
-Notice that the arguments of function calls are expressions and cannot be arbitrary PDL blocks.
+## Local Computation Using `defs`
 
-A function name can be aliased (see [example](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/function_alias.pdl)).
+In the previous example, the value of the variable `GEN` computed by the `model` block is part of the result and is added to the background context. To define the variable `GEN` without contributing to the result and context, the `model` block can be moved into a `defs` ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/local_computation.pdl)):
 
-The context inherited by a function can be reset at the call site (see [example](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/function_empty_context.pdl)).
+```yaml
+--8<-- "./examples/tutorial/local_computation.pdl"
+```
 
-Functions can be declared with optional parameters (see [example](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/function_optional_params.pdl)).
+The execution of this program produces:
 
-## Grouping Variable Definitions in Defs
+```
+Hello
+The variable GEN is equal to: Hello
+```
 
-In PDL, the above program can be written more neatly by grouping certain variable definitions into a `defs` section, as follows ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/defs.pdl)):
+The `defs` field can be added on any block and can introduce multiple variables.
+The following program defines two variables `fr` and `es` associated to a `text` block that uses them ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/defs.pdl)):
 
 ```yaml
 --8<-- "./examples/tutorial/defs.pdl"
 ```
 
-This program has the same output has the one from the previous section.
+This program first output `Hello` and add it in the context.
+Then, the blocks defining the `fr` and `es` variables are both executed in a context containing only the `Hello` message. These blocks are using a `lastOf` that adds the value to each sub-blocs to the context and output the value of the last block. Finally, the value of the variables are used in the `text` block.
 
-Any block can have a `defs` field defining variables used in that block. Notice it's different than the `def` field which stores the
-result of the block after execution.
+The output of this program is:
 
-For another example, see [file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/defs-hello.pdl).
+```
+Hello
 
-## Muting Block Output with contribute
+In Fench: Bonjour!
 
-By default, when a PDL block is executed it produces a result that is contributed to the overall result, and it also contributes to the background context. It is possible to mute both contributions by setting `contribute` to `[]` for any block. This feature allows the computation of intermediate values that are not necessarily output as a result. The value of the variable specified in `def` is still set to the result of the block.
+Translation of "Hello" in French is "Bonjour".
 
-Consider the similar example as above, but with `contribute` set to `[]` ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/muting_block_output.pdl)):
+In Spanish: Hola!
+
+La traducción de "Hello" al español es "Hola".
+```
+
+## Control Block Outputs with `contribute`
+
+By default, when a PDL block is executed, it produces a result that is contributed to the overall result, and it also contributes to the background context. We saw that `defs` and `lastOf` gives some control over the contribution to the result of context. `defs` executes a block without contributing to the context and name the result that can be used later. `lastOf` contributes only to the context for all of its sun-blocks except the last one. It is also possible to control the contribution of each block using the `contribute` field.
+
+Consider an example similar as above, but that uses `contribute` instead of `defs` and `lastOf` ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/muting_block_output.pdl)):
 
 ```yaml
 --8<-- "./examples/tutorial/muting_block_output.pdl"
 ```
 
-The call to the translator with French as language does not produce an output. However, we save the result in variable `FRENCH` and use it in the last sentence of the document. When we execute this program, we obtain:
+Instead of a `lastOf`, we set `contribute` to `[context]` for the block that produces `"\nTranslate to French\n"`. That way, we only contribute to the context and not to the result.
+We set `contribute` to `[]` for the call to the LLM such that it does not produce an output but only save the result in the `fr` variable that is used in the last block of the program. When we execute this program, we obtain:
 
 ```
-The french sentence was: 'J'aime Paris !'
-```
+Hello
+
+In Fench: Bonjour!
+
+Translation of "Hello" in French is "Bonjour".
+``` 
 
 In general, `contribute` can be used to set how the result of the block contribute to the final result and the background context.
 Here are its possible values:
@@ -201,7 +238,43 @@ Here are its possible values:
 
 - `[result, context]`: contribute to both, which is also the default setting.
 
-## Specifying Data
+
+## Function Definition
+
+PDL supports function definitions to make it easier to reuse code.
+Suppose we want to define a translation function that takes a string and calls a Granite model for the translation. This would be written in PDL as follows ([file](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/function_definition.pdl)):
+
+```yaml
+--8<-- "./examples/tutorial/function_definition.pdl"
+```
+
+In this program, the `defs` field defines a function `translate` that takes as parameters `sentence` and `language`, both of which are of type string. The body of the function is defined by its `return` field. In this case, we formulate a translation prompt using the parameters and send it to a Granite model.
+
+The body of the program is a `text` block that calls this function twice, as indicated by `call: ${ translate }`. The `call` block specifies the arguments to be passed. When we execute this program, we obtain:
+
+```
+J'aime Paris !
+Me encanta Madrid.
+```
+
+When we call a function, we implicitly pass the current background context, and this is used as input to model calls inside the function body. In the above example, since the `input` field is omitted, the entire document produced at that point is passed as input to the Granite model.
+
+To reset the context when calling a function, we can pass the special argument: `pdl_context: []` (see [example](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/function_empty_context.pdl)).
+
+Functions can be declared with optional parameters (see [example](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/function_optional_params.pdl)).
+
+PDL is a language with higher order functions meaning that functions are values. So for example, a function can be aliased (see [example](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/function_alias.pdl)).
+
+PDL functions can also be called from Jinja expressions as in the following example ([file](https://github.com/IBM/prompt-declaration-language/blob/main/examples/tutorial/function_call_in_jinja.pdl)):
+
+```yaml
+--8<-- "./examples/tutorial/function_call_in_jinja.pdl"
+```
+
+Notice that arguments can be positional or named. 
+
+
+## Building Data Structures
 
 In PDL, the user specifies step by step the shape of data they wish to generate. A `text` block takes a list of blocks, stringifies the result of each block,
 and concatenates them.
@@ -975,10 +1048,24 @@ What is the color of the sky?
 
 ## Python SDK
 
-See examples of PDL being called programmatically in Python
-[here](https://github.com/IBM/prompt-declaration-language/blob/main/examples/sdk).
+PDL programs can be defined and called programmatically directly in Python.
+In the following example, the PDL program is defined as a string and then parsed and executed using the [`exec_str`](https://ibm.github.io/prompt-declaration-language/api_reference/#src.pdl.pdl.exec_str) function ([file](https://github.com/IBM/prompt-declaration-language/blob/main/examples/tutorial/sdk/hello_str.py)).
+
+```python
+--8<-- "./examples/tutorial/sdk/hello_str.py"
+```
+
+The SDK also provides functions to execute programs defined in a file (see [example](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/sdk/hello_file.py)), as a Python dictionary (see [example](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/sdk/hello_dict.py)), or PDL abstract syntax tree defined by a [Pydantic](https://docs.pydantic.dev) data structure (see [example](https://github.com/IBM/prompt-declaration-language//blob/main/examples/tutorial/sdk/hello_prog.py)). The documentation of the API is available [here](https://ibm.github.io/prompt-declaration-language/api_reference/).
+
+
+A way to handle the processing of large datasets using PDL is to use Python multiprocessing capabilities to launch multiple instances of the PDL interpreter. The example below, w are using the Python's `concurrent.futures.ProcessPoolExecutor` to execute in parallel multiple instances of the PDL program `HELLO` where the free variable `name` is instantiated with a different value for each instance ([file](https://github.com/IBM/prompt-declaration-language/blob/main/examples/tutorial/sdk/hello_parallel.py)).
+
+```python
+--8<-- "./examples/tutorial/sdk/hello_parallel.py"
+```
 
-For a more sophisticated example, see [here](https://github.com/IBM/prompt-declaration-language/blob/main/examples/callback).
+Finally, it possible to interleave the use of Python and PDL.
+You can find an example [here](https://github.com/IBM/prompt-declaration-language/blob/main/examples/callback) of a Python application which is using a function defined in PDL which itself depend on the Python application.
 
 ## Debugging PDL Programs
 
@@ -1034,9 +1121,9 @@ export OPENAI_ORGANIZATION=ollama # not required
 pdl <...>
 ```
 
-## Strings In Yaml
+## Strings in Yaml
 
-Multiline strings are commonly used when writing PDL programs. There are two types of formats that YAML supports for strings: block scalar and flow scalar formats. Scalars are what YAML calls basic values like numbers or strings, as opposed to complex types like arrays or objects. Block scalars have more control over how they are interpreted, whereas flow scalars have more limited escaping support. (Explanation here is thanks to [Wolfgang Faust](https://yaml-multiline.info/))
+Multiline strings are commonly used when writing PDL programs. There are two types of formats that YAML supports for strings: block scalar and flow scalar formats. Scalars are what YAML calls basic values like numbers or strings, as opposed to complex types like arrays or objects. Block scalars have more control over how they are interpreted, whereas flow scalars have more limited escaping support. (Explanation in this section are based on [yaml-multiline.info](https://yaml-multiline.info/) by Wolfgang Faust.)
 
 ### Block Scalars
 
diff --git a/examples/sdk/hello_dict.py b/examples/sdk/hello_dict.py
deleted file mode 100644
index 4313898ce..000000000
--- a/examples/sdk/hello_dict.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from pdl.pdl import exec_dict
-
-hello = {
-    "text": [
-        "Hello\n",
-        {
-            "model": "ollama_chat/granite3.2:2b",
-            "parameters": {
-                "stop": ["!"],
-            },
-        },
-    ]
-}
-
-
-def main():
-    result = exec_dict(hello)
-    print(result)
-
-
-if __name__ == "__main__":
-    main()
diff --git a/examples/sdk/hello_prog.py b/examples/sdk/hello_prog.py
deleted file mode 100644
index de0c8b8e8..000000000
--- a/examples/sdk/hello_prog.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from pdl.pdl import exec_program
-from pdl.pdl_ast import LitellmModelBlock, LitellmParameters, Program, TextBlock
-
-hello = Program(
-    TextBlock(
-        text=[
-            "Hello\n",
-            LitellmModelBlock(
-                model="ollama_chat/granite3.2:2b",
-                parameters=LitellmParameters(stop=["!"]),  # pyright: ignore
-            ),
-        ]
-    )
-)
-
-
-def main():
-    result = exec_program(hello)
-    print(result)
-
-
-if __name__ == "__main__":
-    main()
diff --git a/examples/tutorial/calling_llm.pdl b/examples/tutorial/calling_llm.pdl
index 00d09ccdd..49209043b 100644
--- a/examples/tutorial/calling_llm.pdl
+++ b/examples/tutorial/calling_llm.pdl
@@ -1,6 +1,6 @@
-description: Hello world calling a model
+description: Calling a model on the implicit background context
 text:
 - "Hello\n"
 - model: ollama_chat/granite3.2:2b
   parameters:
-    stop: ['!']
\ No newline at end of file
+    stop: ['!']
diff --git a/examples/tutorial/calling_llm_with_input.pdl b/examples/tutorial/calling_llm_with_input.pdl
index f16648849..33064cf68 100644
--- a/examples/tutorial/calling_llm_with_input.pdl
+++ b/examples/tutorial/calling_llm_with_input.pdl
@@ -1,4 +1,4 @@
-description: Hello world calling a model
+description: Calling a model with an input text
 text:
 - "Hello\n"
 - model: ollama_chat/granite3.2:2b
diff --git a/examples/tutorial/calling_llm_with_input_messages.pdl b/examples/tutorial/calling_llm_with_input_messages.pdl
index c994d7788..146a9e28f 100644
--- a/examples/tutorial/calling_llm_with_input_messages.pdl
+++ b/examples/tutorial/calling_llm_with_input_messages.pdl
@@ -1,4 +1,4 @@
-description: Hello world calling a model
+description: Calling a model with an explicit list of messages
 text:
 - "Hello\n"
 - model: ollama_chat/granite3.2:2b
diff --git a/examples/tutorial/calling_llm_with_input_messages_var.pdl b/examples/tutorial/calling_llm_with_input_messages_var.pdl
index 831467442..774950391 100644
--- a/examples/tutorial/calling_llm_with_input_messages_var.pdl
+++ b/examples/tutorial/calling_llm_with_input_messages_var.pdl
@@ -3,8 +3,10 @@ defs:
   prompt:
     array:
     - role: system
-      content: You are a helpful software engineer. You write clear, concise, well-commented code.
+      content: You are a helpful assistant that is fluent in French.
     - role: user
-      content: Write a Python function that implement merge sort.
-model: ollama_chat/granite3.2:2b
-input: ${ prompt }
+      content: Translate the word 'Hello' to French
+text:
+- "Hello\n"
+- model: ollama_chat/granite3.2:2b
+  input: ${ prompt }
diff --git a/examples/tutorial/defs-hello.pdl b/examples/tutorial/defs-hello.pdl
deleted file mode 100644
index 477d58822..000000000
--- a/examples/tutorial/defs-hello.pdl
+++ /dev/null
@@ -1,14 +0,0 @@
-description: Hello world with defs
-defs:
-  hello:
-    function:
-      name: string
-    return: Hello ${ name }!
-  bye:
-    "Good bye"
-text:
-- call: ${ hello }
-  args:
-    name: World
-- "\n"
-- ${ bye }
diff --git a/examples/tutorial/defs.pdl b/examples/tutorial/defs.pdl
index e2e49afd0..2bed2a974 100644
--- a/examples/tutorial/defs.pdl
+++ b/examples/tutorial/defs.pdl
@@ -1,22 +1,16 @@
-description: Function def and call
-defs:
-  translate:
-    function:
-      sentence: string
-      language: string
-    return:
+text:
+- "Hello\n"
+- defs:
+    fr:
       lastOf:
-      - "\nTranslate the sentence '${ sentence }' to ${ language }.\n"
+      - "\nTranslate to French\n"
       - model: ollama_chat/granite3.2:2b
-        parameters:
-          stop: ["\n"]
-text:
-- call: ${ translate }
-  args:
-    sentence: I love Paris!
-    language: French
-- "\n"
-- call: ${ translate }
-  args:
-    sentence: I love Madrid!
-    language: Spanish
\ No newline at end of file
+    es:
+      lastOf:
+      - "\nTranslate to Spanish\n"
+      - model: ollama_chat/granite3.2:2b
+  text: |
+  
+    In Fench: ${ fr }
+
+    In Spanish: ${ es }
diff --git a/examples/tutorial/function_alias.pdl b/examples/tutorial/function_alias.pdl
index 23bf7c115..62883c787 100644
--- a/examples/tutorial/function_alias.pdl
+++ b/examples/tutorial/function_alias.pdl
@@ -1,4 +1,4 @@
-description: Hello function
+description: Use a function as a value
 defs:
   hello:
     function:
diff --git a/examples/tutorial/function_call_in_jinja.pdl b/examples/tutorial/function_call_in_jinja.pdl
new file mode 100644
index 000000000..32a74aee8
--- /dev/null
+++ b/examples/tutorial/function_call_in_jinja.pdl
@@ -0,0 +1,14 @@
+description: Calling a PDL function from Jinja
+defs:
+  translate:
+    function:
+      sentence: string
+      language: string
+    return:
+      lastOf:
+      - |
+        Translate the sentence '${ sentence }' to ${ language }.
+        Only give the result of the translation.
+      - model: ollama_chat/granite3.2:2b
+text: |
+  The way to say hello in French is ${ translate("Hello", language="French") }.
diff --git a/examples/tutorial/function_definition.pdl b/examples/tutorial/function_definition.pdl
index dac318dc9..7124eb0c0 100644
--- a/examples/tutorial/function_definition.pdl
+++ b/examples/tutorial/function_definition.pdl
@@ -1,16 +1,16 @@
-description: Function def and call
+description: Function definition and call
+defs:
+  translate:
+    function:
+      sentence: string
+      language: string
+    return:
+      lastOf:
+      - |
+        Translate the sentence '${ sentence }' to ${ language }.
+        Only give the result of the translation.
+      - model: ollama_chat/granite3.2:2b
 text:
-- def: translate
-  function:
-    sentence: string
-    language: string
-  return:
-    lastOf:
-    - "\nTranslate the sentence '${ sentence }' to ${ language }.\n"
-    - model: ollama_chat/granite3.2:2b
-      parameters:
-        stop: ["\n"]
-        temperature: 0
 - call: ${ translate }
   args:
     sentence: I love Paris!
diff --git a/examples/tutorial/function_empty_context.pdl b/examples/tutorial/function_empty_context.pdl
index 54e3c6858..2f2d5dbf2 100644
--- a/examples/tutorial/function_empty_context.pdl
+++ b/examples/tutorial/function_empty_context.pdl
@@ -1,13 +1,24 @@
-description: Hello world with function definition and call
+description: Function call with an empty context
+defs:
+  translate:
+    function:
+      sentence: string
+      language: string
+    return:
+      lastOf:
+      - |
+        Translate the sentence '${ sentence }' to ${ language }.
+        Only give the result of the translation.
+      - model: ollama_chat/granite3.2:2b
 text:
-- def: hello
-  function:
-    name: string
-  return:
-    text:
-    -  Hello ${ name }!
-    - model: ollama_chat/granite3.2:8b
-- call: ${ hello }
+- call: ${ translate }
   args:
-    name: World
+    sentence: I love Paris!
+    language: French
+    pdl_context: []
+- "\n"
+- call: ${ translate }
+  args:
+    sentence: I love Madrid!
+    language: Spanish
     pdl_context: []
diff --git a/examples/tutorial/function_optional_params.pdl b/examples/tutorial/function_optional_params.pdl
index cde3af8ac..880c96632 100644
--- a/examples/tutorial/function_optional_params.pdl
+++ b/examples/tutorial/function_optional_params.pdl
@@ -1,14 +1,19 @@
-description: Hello world with function definition and call
+description: Function with optional parameter
+defs:
+  hello:
+    function:
+      name: string
+      lastName: {optional: string} # optional parameter
+    return:
+      if: ${ lastName is defined }
+      then: Hello ${ name } ${ lastName }!
+      else: Hello ${ name }!
 text:
-- def: hello
-  function:
-    name: string
-    lastName: {optional: string} # optional parameter
-  return:
-    if: ${ lastName is defined }
-    then: Hello ${ name } ${ lastName }!
-    else: Hello ${ name }!
 - call: ${ hello }
   args:
     name: World
-    lastName: Universe
+- "\n"
+- call: ${ hello }
+  args:
+    name: Earth
+    lastName: Planet
diff --git a/examples/tutorial/lastOf.pdl b/examples/tutorial/lastOf.pdl
new file mode 100644
index 000000000..9eacbd655
--- /dev/null
+++ b/examples/tutorial/lastOf.pdl
@@ -0,0 +1,8 @@
+description: Explicit use of role
+role: user
+text:
+- "Hello\n"
+- lastOf:
+  - role: system
+    text: "You are a polite assistant that likes to answer very formally."
+  - model: ollama_chat/granite3.2:2b
diff --git a/examples/tutorial/local_computation.pdl b/examples/tutorial/local_computation.pdl
new file mode 100644
index 000000000..2a22df33a
--- /dev/null
+++ b/examples/tutorial/local_computation.pdl
@@ -0,0 +1,9 @@
+description: Local computations using defs
+text:
+- "Hello\n"
+- defs:
+    GEN:
+      model: ollama_chat/granite3.2:2b
+      parameters:
+        stop: ['!']
+- "The variable GEN is equal to: ${ GEN }"
\ No newline at end of file
diff --git a/examples/tutorial/muting_block_output.pdl b/examples/tutorial/muting_block_output.pdl
index c75b416a0..987617eb1 100644
--- a/examples/tutorial/muting_block_output.pdl
+++ b/examples/tutorial/muting_block_output.pdl
@@ -1,21 +1,11 @@
-description: Function def and call
-defs:
-  translate:
-    function:
-      sentence: string
-      language: string
-    return:
-      text:
-      - text: "\nTranslate the sentence '${ sentence }' to ${ language }.\n"
-        contribute: [context]
-      - model: ollama_chat/granite3.2:2b
-        parameters:
-          stop: ["\n"]
+description: Control block outputs with `contribute`
 text:
-- call: ${ translate }
+- "Hello\n"
+- text: "\nTranslate to French\n"
+  contribute: [context]
+- model: ollama_chat/granite3.2:2b
   contribute: []
-  def: FRENCH
-  args:
-    sentence: I love Paris!
-    language: French
-- "The french sentence was: ${ FRENCH }"
\ No newline at end of file
+  def: fr
+- |
+  
+  In Fench: ${ fr }
diff --git a/examples/tutorial/role.pdl b/examples/tutorial/role.pdl
new file mode 100644
index 000000000..81907fd47
--- /dev/null
+++ b/examples/tutorial/role.pdl
@@ -0,0 +1,7 @@
+description: Explicit use of role
+role: user
+text:
+- "Hello\n"
+- role: system
+  text: "You are a polite assistant that likes to answer very formally."
+- model: ollama_chat/granite3.2:2b
diff --git a/examples/sdk/hello.pdl b/examples/tutorial/sdk/hello.pdl
similarity index 100%
rename from examples/sdk/hello.pdl
rename to examples/tutorial/sdk/hello.pdl
diff --git a/examples/tutorial/sdk/hello_dict.py b/examples/tutorial/sdk/hello_dict.py
new file mode 100644
index 000000000..06a8736dd
--- /dev/null
+++ b/examples/tutorial/sdk/hello_dict.py
@@ -0,0 +1,21 @@
+from pdl.pdl import exec_dict
+
+
+def main():
+    hello = {
+        "text": [
+            "Hello\n",
+            {
+                "model": "ollama_chat/granite3.2:2b",
+                "parameters": {
+                    "stop": ["!"],
+                },
+            },
+        ]
+    }
+    result = exec_dict(hello)
+    print(result)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/examples/sdk/hello_file.py b/examples/tutorial/sdk/hello_file.py
similarity index 100%
rename from examples/sdk/hello_file.py
rename to examples/tutorial/sdk/hello_file.py
diff --git a/examples/tutorial/sdk/hello_parallel.py b/examples/tutorial/sdk/hello_parallel.py
new file mode 100644
index 000000000..6dd7b334c
--- /dev/null
+++ b/examples/tutorial/sdk/hello_parallel.py
@@ -0,0 +1,37 @@
+import concurrent.futures
+
+from pdl.pdl import exec_str
+
+HELLO = """
+text:
+- >+
+  Hello, my name is ${name}
+- model: ollama_chat/granite3.2:2b
+"""
+
+
+def _run_agent(name):
+    pdl_output = exec_str(
+        HELLO,
+        scope={"name": name},
+        config={
+            "yield_result": False,
+            "yield_background": False,
+            "batch": 1,  # disable streaming
+        },
+    )
+    return pdl_output
+
+
+if __name__ == "__main__":
+    data = ["Alice", "Nicolas", "Rosa", "Remi"]
+    with concurrent.futures.ProcessPoolExecutor() as executor:
+        futures = {executor.submit(_run_agent, name) for name in data}
+        executor.map(_run_agent, data)
+        for future in concurrent.futures.as_completed(futures):
+            try:
+                result = future.result()
+            except Exception as e:
+                print(f"Task raised an exception: {e}")
+            else:
+                print(result)
diff --git a/examples/tutorial/sdk/hello_prog.py b/examples/tutorial/sdk/hello_prog.py
new file mode 100644
index 000000000..f6baa420c
--- /dev/null
+++ b/examples/tutorial/sdk/hello_prog.py
@@ -0,0 +1,22 @@
+from pdl.pdl import exec_program
+from pdl.pdl_ast import LitellmModelBlock, LitellmParameters, Program, TextBlock
+
+
+def main():
+    hello = Program(
+        TextBlock(
+            text=[
+                "Hello\n",
+                LitellmModelBlock(
+                    model="ollama_chat/granite3.2:2b",
+                    parameters=LitellmParameters(stop=["!"]),
+                ),
+            ]
+        )
+    )
+    result = exec_program(hello)
+    print(result)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/examples/sdk/hello_str.py b/examples/tutorial/sdk/hello_str.py
similarity index 94%
rename from examples/sdk/hello_str.py
rename to examples/tutorial/sdk/hello_str.py
index 8a6b52c90..40f3810ea 100644
--- a/examples/sdk/hello_str.py
+++ b/examples/tutorial/sdk/hello_str.py
@@ -2,7 +2,8 @@
 
 HELLO = """
 text:
-- "Hello\n"
+- >+
+  Hello
 - model: ollama_chat/granite3.2:2b
   parameters:
     stop: ['!']
diff --git a/examples/tutorial/variable_def_use.pdl b/examples/tutorial/variable_def_use.pdl
index fea5ac9e9..1a0a53f98 100644
--- a/examples/tutorial/variable_def_use.pdl
+++ b/examples/tutorial/variable_def_use.pdl
@@ -1,8 +1,8 @@
-description: Hello world with variable def and use
+description: Variable def and use
 text:
 - "Hello\n"
 - model: ollama_chat/granite3.2:2b
-  def: GEN
   parameters:
     stop: ['!']
-- "\nGEN is equal to: ${ GEN }"
\ No newline at end of file
+  def: GEN
+- "\nThe variable GEN is equal to: ${ GEN }"
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/calling_llm_chaining.0.result b/tests/results/examples/tutorial/calling_llm_chaining.0.result
index 241d9a74f..ac37482be 100644
--- a/tests/results/examples/tutorial/calling_llm_chaining.0.result
+++ b/tests/results/examples/tutorial/calling_llm_chaining.0.result
@@ -1,4 +1,4 @@
 Hello
 Hello
-Did you just say Hello?
-Yes, I did. It's a common greeting, similar to how humans might respond when they first interact with an artificial intelligence like me. How can I assist you today?
\ No newline at end of file
+Translate the above to French
+Bonjour
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/calling_llm_chaining.1.result b/tests/results/examples/tutorial/calling_llm_chaining.1.result
deleted file mode 100644
index ac37482be..000000000
--- a/tests/results/examples/tutorial/calling_llm_chaining.1.result
+++ /dev/null
@@ -1,4 +0,0 @@
-Hello
-Hello
-Translate the above to French
-Bonjour
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.0.result b/tests/results/examples/tutorial/calling_llm_with_input_messages_var.0.result
index d2307e4f4..218c1c505 100644
--- a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.0.result
+++ b/tests/results/examples/tutorial/calling_llm_with_input_messages_var.0.result
@@ -1,47 +1,2 @@
-Here is a Python implementation of the Merge Sort algorithm:
-
-```python
-def merge_sort(arr):
-    # Base case: if array has 1 or no elements, it's already sorted
-    if len(arr) <= 1:
-        return arr
-
-    # Divide the array into two halves
-    mid = len(arr) // 2
-    left_half = arr[:mid]
-    right_half = arr[mid:]
-
-    # Recursively sort both halves
-    left_sorted = merge_sort(left_half)
-    right_sorted = merge_sort(right_half)
-
-    # Merge the sorted halves back together
-    return merge(left_sorted, right_sorted)
-
-def merge(left, right):
-    """
-    Merge two sorted lists into a single sorted list.
-    """
-    merged = []  # Initialize an empty list for the result
-    left_index = 0  # Index for the left list
-    right_index = 0  # Index for the right list
-
-    # Continue until we've exhausted both lists
-    while left_index < len(left) and right_index < len(right):
-        if left[left_index] <= right[right_index]:
-            merged.append(left[left_index])
-            left_index += 1
-        else:
-            merged.append(right[right_index])
-            right_index += 1
-
-    # If there are any remaining elements in either list, append them to the result
-    merged.extend(left[left_index:])
-    merged.extend(right[right_index:])
-
-    return merged
-```
-
-This code first checks if the array is already sorted (i.e., has one or zero elements). If so, it returns the array as is. Otherwise, it divides the array into two halves and recursively sorts each half. The `merge` function then combines these sorted halves back together to produce a single sorted list.
-
-The time complexity of Merge Sort is O(n log n) for all cases (best, average, worst), making it efficient even for large lists.
\ No newline at end of file
+Hello
+The translation of 'Hello' into French is 'Bonjour'.
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.1.result b/tests/results/examples/tutorial/calling_llm_with_input_messages_var.1.result
deleted file mode 100644
index 150ac5d58..000000000
--- a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.1.result
+++ /dev/null
@@ -1,53 +0,0 @@
-Here is a Python implementation of the Merge Sort algorithm:
-
-```python
-def merge_sort(arr):
-    # Base case: if array has 1 or no elements, it's already sorted
-    if len(arr) <= 1:
-        return arr
-
-    # Divide the array into two halves
-    mid = len(arr) // 2
-    left_half = arr[:mid]
-    right_half = arr[mid:]
-
-    # Recursively sort both halves
-    left_sorted = merge_sort(left_half)
-    right_sorted = merge_sort(right_half)
-
-    # Merge the sorted halves back together
-    return merge(left_sorted, right_sorted)
-
-def merge(left, right):
-    """
-    Merge two sorted arrays into one sorted array.
-    """
-    merged = []  # Initialize an empty list for the result
-    left_index = 0  # Index for left array
-    right_index = 0  # Index for right array
-
-    # Continue until we've processed all elements in both lists
-    while left_index < len(left) and right_index < len(right):
-        if left[left_index] <= right[right_index]:
-            merged.append(left[left_index])
-            left_index += 1
-        else:
-            merged.append(right[right_index])
-            right_index += 1
-
-    # If there are any remaining elements in either list, append them to the result
-    merged.extend(left[left_index:])
-    merged.extend(right[right_index:])
-
-    return merged
-```
-
-This code first checks if the array is already sorted (i.e., has one or no elements). If not, it divides the array into two halves and recursively sorts them. Then, it merges these sorted halves back together using a helper function `merge()`. The merging process compares elements from both halves and adds the smaller element to the result list until all elements are processed.
-
-You can use this function like so:
-
-```python
-arr = [38, 27, 43, 3, 9, 82, 10]
-sorted_arr = merge_sort(arr)
-print(sorted_arr)  # Outputs: [3, 9, 10, 27, 38, 43, 82]
-```
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.2.result b/tests/results/examples/tutorial/calling_llm_with_input_messages_var.2.result
deleted file mode 100644
index d2307e4f4..000000000
--- a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.2.result
+++ /dev/null
@@ -1,47 +0,0 @@
-Here is a Python implementation of the Merge Sort algorithm:
-
-```python
-def merge_sort(arr):
-    # Base case: if array has 1 or no elements, it's already sorted
-    if len(arr) <= 1:
-        return arr
-
-    # Divide the array into two halves
-    mid = len(arr) // 2
-    left_half = arr[:mid]
-    right_half = arr[mid:]
-
-    # Recursively sort both halves
-    left_sorted = merge_sort(left_half)
-    right_sorted = merge_sort(right_half)
-
-    # Merge the sorted halves back together
-    return merge(left_sorted, right_sorted)
-
-def merge(left, right):
-    """
-    Merge two sorted lists into a single sorted list.
-    """
-    merged = []  # Initialize an empty list for the result
-    left_index = 0  # Index for the left list
-    right_index = 0  # Index for the right list
-
-    # Continue until we've exhausted both lists
-    while left_index < len(left) and right_index < len(right):
-        if left[left_index] <= right[right_index]:
-            merged.append(left[left_index])
-            left_index += 1
-        else:
-            merged.append(right[right_index])
-            right_index += 1
-
-    # If there are any remaining elements in either list, append them to the result
-    merged.extend(left[left_index:])
-    merged.extend(right[right_index:])
-
-    return merged
-```
-
-This code first checks if the array is already sorted (i.e., has one or zero elements). If so, it returns the array as is. Otherwise, it divides the array into two halves and recursively sorts each half. The `merge` function then combines these sorted halves back together to produce a single sorted list.
-
-The time complexity of Merge Sort is O(n log n) for all cases (best, average, worst), making it efficient even for large lists.
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.3.result b/tests/results/examples/tutorial/calling_llm_with_input_messages_var.3.result
deleted file mode 100644
index ca5666e7a..000000000
--- a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.3.result
+++ /dev/null
@@ -1,47 +0,0 @@
-Here is a Python implementation of the Merge Sort algorithm:
-
-```python
-def merge_sort(arr):
-    # Base case: if array has 1 or no elements, it's already sorted
-    if len(arr) <= 1:
-        return arr
-
-    # Divide the array into two halves
-    mid = len(arr) // 2
-    left_half = arr[:mid]
-    right_half = arr[mid:]
-
-    # Recursively sort both halves
-    left_sorted = merge_sort(left_half)
-    right_sorted = merge_sort(right_half)
-
-    # Merge the sorted halves back together
-    return merge(left_sorted, right_sorted)
-
-def merge(left, right):
-    """
-    Merge two sorted arrays into one sorted array.
-    """
-    merged = []  # Initialize an empty list for the merged result
-    left_index = 0  # Index for left array
-    right_index = 0  # Index for right array
-
-    # Continue until we've processed all elements in both lists
-    while left_index < len(left) and right_index < len(right):
-        if left[left_index] <= right[right_index]:
-            merged.append(left[left_index])
-            left_index += 1
-        else:
-            merged.append(right[right_index])
-            right_index += 1
-
-    # If there are any remaining elements in either list, append them to the result
-    merged.extend(left[left_index:])
-    merged.extend(right[right_index:])
-
-    return merged
-```
-
-This code first checks if the array is already sorted (i.e., has one or zero elements). If so, it returns the array as is. Otherwise, it divides the array into two halves and recursively sorts each half. The `merge` function then combines these sorted halves back together in a single sorted list.
-
-The time complexity of merge sort is O(n log n) for all cases (best, average, worst), making it efficient even for large lists.
diff --git a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.4.result b/tests/results/examples/tutorial/calling_llm_with_input_messages_var.4.result
deleted file mode 100644
index 9482c3618..000000000
--- a/tests/results/examples/tutorial/calling_llm_with_input_messages_var.4.result
+++ /dev/null
@@ -1,47 +0,0 @@
-Here is a Python implementation of the Merge Sort algorithm:
-
-```python
-def merge_sort(arr):
-    # Base case: if array has 1 or no elements, it's already sorted
-    if len(arr) <= 1:
-        return arr
-
-    # Divide the array into two halves
-    mid = len(arr) // 2
-    left_half = arr[:mid]
-    right_half = arr[mid:]
-
-    # Recursively sort both halves
-    left_sorted = merge_sort(left_half)
-    right_sorted = merge_sort(right_half)
-
-    # Merge the sorted halves back together
-    return merge(left_sorted, right_sorted)
-
-def merge(left, right):
-    """
-    Merge two sorted arrays into one sorted array.
-    """
-    merged = []  # Initialize an empty list for the result
-    left_index = 0  # Index for the left array
-    right_index = 0  # Index for the right array
-
-    # Continue until we've iterated through both lists
-    while left_index < len(left) and right_index < len(right):
-        if left[left_index] <= right[right_index]:
-            merged.append(left[left_index])
-            left_index += 1
-        else:
-            merged.append(right[right_index])
-            right_index += 1
-
-    # If there are any remaining elements in either list, append them to the result
-    merged.extend(left[left_index:])
-    merged.extend(right[right_index:])
-
-    return merged
-```
-
-This code first checks if the array is already sorted (i.e., has one or zero elements). If so, it returns the array as is. Otherwise, it divides the array into two halves and recursively sorts each half. The `merge` function then combines these sorted halves back together to produce a single sorted array.
-
-The time complexity of Merge Sort is O(n log n) for all cases (best, average, worst), making it efficient even for large lists.
diff --git a/tests/results/examples/tutorial/defs-hello.0.result b/tests/results/examples/tutorial/defs-hello.0.result
deleted file mode 100644
index ffd7606c1..000000000
--- a/tests/results/examples/tutorial/defs-hello.0.result
+++ /dev/null
@@ -1,2 +0,0 @@
-Hello World!
-Good bye
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/defs.0.result b/tests/results/examples/tutorial/defs.0.result
index 2d4182036..680f268e2 100644
--- a/tests/results/examples/tutorial/defs.0.result
+++ b/tests/results/examples/tutorial/defs.0.result
@@ -1,2 +1,9 @@
-'J'aime Paris !'
-The translation of "I love Madrid!" into Spanish is: "Me encanta Madrid!"
\ No newline at end of file
+Hello
+
+In Fench: Bonjour!
+
+Translation of "Hello" in French is "Bonjour".
+
+In Spanish: Hola!
+
+La traducción de "Hello" al español es "Hola".
diff --git a/tests/results/examples/tutorial/defs.1.result b/tests/results/examples/tutorial/defs.1.result
deleted file mode 100644
index d5ba84ddc..000000000
--- a/tests/results/examples/tutorial/defs.1.result
+++ /dev/null
@@ -1,2 +0,0 @@
-'J'aime Paris !'
-The translation of "I love Madrid!" into Spanish is: "Me encanta Madrid."
diff --git a/tests/results/examples/tutorial/function_call_in_jinja.0.result b/tests/results/examples/tutorial/function_call_in_jinja.0.result
new file mode 100644
index 000000000..1a43b5431
--- /dev/null
+++ b/tests/results/examples/tutorial/function_call_in_jinja.0.result
@@ -0,0 +1 @@
+The way to say hello in French is 'Bonjour'.
diff --git a/tests/results/examples/tutorial/function_definition.0.result b/tests/results/examples/tutorial/function_definition.0.result
index 2d4182036..e7122f0e9 100644
--- a/tests/results/examples/tutorial/function_definition.0.result
+++ b/tests/results/examples/tutorial/function_definition.0.result
@@ -1,2 +1,2 @@
-'J'aime Paris !'
-The translation of "I love Madrid!" into Spanish is: "Me encanta Madrid!"
\ No newline at end of file
+J'adore Paris !
+Me encanta Madrid!
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/function_definition.3.result b/tests/results/examples/tutorial/function_definition.3.result
new file mode 100644
index 000000000..80159edaa
--- /dev/null
+++ b/tests/results/examples/tutorial/function_definition.3.result
@@ -0,0 +1,2 @@
+J'aime Paris !
+Amo Madrid!
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/function_empty_context.0.result b/tests/results/examples/tutorial/function_empty_context.0.result
index 4901d530d..b80d21d4d 100644
--- a/tests/results/examples/tutorial/function_empty_context.0.result
+++ b/tests/results/examples/tutorial/function_empty_context.0.result
@@ -1 +1,2 @@
-Hello World!Greetings! I am Granite, a language model developed by IBM in 2024. How may I assist you today?
\ No newline at end of file
+J'aime Paris !
+Me encanta Madrid!
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/function_empty_context.1.result b/tests/results/examples/tutorial/function_empty_context.1.result
index 348e9bbe6..e7122f0e9 100644
--- a/tests/results/examples/tutorial/function_empty_context.1.result
+++ b/tests/results/examples/tutorial/function_empty_context.1.result
@@ -1 +1,2 @@
-Hello World!Hello there! How can I assist you today? If you have any questions or need information on a particular topic, feel free to ask. I'm here to help.
\ No newline at end of file
+J'adore Paris !
+Me encanta Madrid!
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/function_optional_params.0.result b/tests/results/examples/tutorial/function_optional_params.0.result
index f0f021368..000144d17 100644
--- a/tests/results/examples/tutorial/function_optional_params.0.result
+++ b/tests/results/examples/tutorial/function_optional_params.0.result
@@ -1 +1,2 @@
-Hello World Universe!
\ No newline at end of file
+Hello World!
+Hello Earth Planet!
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/lastOf.0.result b/tests/results/examples/tutorial/lastOf.0.result
new file mode 100644
index 000000000..072eed5a2
--- /dev/null
+++ b/tests/results/examples/tutorial/lastOf.0.result
@@ -0,0 +1,3 @@
+Hello
+
+Greetings, I trust this message finds you in good health and high spirits. How may I be of assistance today? Please feel free to pose your query or request, knowing that I am here to serve with diligence and precision.
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/lastOf.1.result b/tests/results/examples/tutorial/lastOf.1.result
new file mode 100644
index 000000000..a5acb19ab
--- /dev/null
+++ b/tests/results/examples/tutorial/lastOf.1.result
@@ -0,0 +1,3 @@
+Hello
+
+Greetings! I trust this message finds you in good health and high spirits. How may I be of assistance today? Please feel free to pose your query or request, knowing that I am here to serve with diligence and precision.
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/local_computation.0.result b/tests/results/examples/tutorial/local_computation.0.result
new file mode 100644
index 000000000..956e25b97
--- /dev/null
+++ b/tests/results/examples/tutorial/local_computation.0.result
@@ -0,0 +1,2 @@
+Hello
+The variable GEN is equal to: Hello
\ No newline at end of file
diff --git a/tests/results/examples/tutorial/muting_block_output.0.result b/tests/results/examples/tutorial/muting_block_output.0.result
index 0701474bb..b015fe531 100644
--- a/tests/results/examples/tutorial/muting_block_output.0.result
+++ b/tests/results/examples/tutorial/muting_block_output.0.result
@@ -1 +1,5 @@
-The french sentence was: 'J'aime Paris !'
\ No newline at end of file
+Hello
+
+In Fench: Bonjour!
+
+Translation of "Hello" in French is "Bonjour".
diff --git a/tests/results/examples/tutorial/muting_block_output.1.result b/tests/results/examples/tutorial/muting_block_output.1.result
deleted file mode 100644
index 3d6699e99..000000000
--- a/tests/results/examples/tutorial/muting_block_output.1.result
+++ /dev/null
@@ -1 +0,0 @@
-The french sentence was: 'J'adore Paris !'
diff --git a/tests/results/examples/tutorial/role.0.result b/tests/results/examples/tutorial/role.0.result
new file mode 100644
index 000000000..a71426c43
--- /dev/null
+++ b/tests/results/examples/tutorial/role.0.result
@@ -0,0 +1,3 @@
+Hello
+You are a polite assistant that likes to answer very formally.
+Greetings! I trust this message finds you in good health and high spirits. How may I be of assistance today? Please feel free to pose your query or request, knowing that I am here to serve with diligence and precision.
\ No newline at end of file
diff --git a/tests/results/examples/sdk/hello.0.result b/tests/results/examples/tutorial/sdk/hello.0.result
similarity index 100%
rename from tests/results/examples/sdk/hello.0.result
rename to tests/results/examples/tutorial/sdk/hello.0.result
diff --git a/tests/results/examples/tutorial/variable_def_use.0.result b/tests/results/examples/tutorial/variable_def_use.0.result
index 72d411660..36f7aa6b0 100644
--- a/tests/results/examples/tutorial/variable_def_use.0.result
+++ b/tests/results/examples/tutorial/variable_def_use.0.result
@@ -1,3 +1,3 @@
 Hello
 Hello
-GEN is equal to: Hello
\ No newline at end of file
+The variable GEN is equal to: Hello
\ No newline at end of file
diff --git a/tests/test_examples_run.yaml b/tests/test_examples_run.yaml
index 78ab19b4e..e299c0980 100644
--- a/tests/test_examples_run.yaml
+++ b/tests/test_examples_run.yaml
@@ -1,5 +1,15 @@
-update_results: false
-check: []
+update_results: true
+check:
+  - examples/tutorial/defs.pdl
+  - examples/tutorial/function_definition.pdl
+  - examples/tutorial/function_empty_context.pdl
+  - examples/tutorial/calling_llm_with_input_messages_var.pdl
+  - examples/tutorial/local_computation.pdl
+  - examples/tutorial/role.pdl
+  - examples/tutorial/lastOf.pdl
+  - examples/tutorial/muting_block_output.pdl
+  - examples/tutorial/function_optional_params.pdl
+  - examples/tutorial/function_call_in_jinja.pdl
 skip:
   - examples/demos/react.pdl
   - examples/cldk/cldk-assistant.pdl

From f48046bcbba3e41236174c6a5997f24f5587de28 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 4 Aug 2025 09:34:43 -0400
Subject: [PATCH 087/107] fix(deps): update rust crate duct to v1.1.0 (#1086)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/src-tauri/Cargo.lock | 127 ++++++++++++++++++++++++----
 1 file changed, 111 insertions(+), 16 deletions(-)

diff --git a/pdl-live-react/src-tauri/Cargo.lock b/pdl-live-react/src-tauri/Cargo.lock
index 4040118eb..1baa18526 100644
--- a/pdl-live-react/src-tauri/Cargo.lock
+++ b/pdl-live-react/src-tauri/Cargo.lock
@@ -1210,9 +1210,9 @@ dependencies = [
 
 [[package]]
 name = "duct"
-version = "1.0.0"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6ce170a0e8454fa0f9b0e5ca38a6ba17ed76a50916839d217eb5357e05cdfde"
+checksum = "d7478638a31d1f1f3d6c9f5e57c76b906a04ac4879d6fd0fb6245bc88f73fd0b"
 dependencies = [
  "libc",
  "os_pipe",
@@ -1329,7 +1329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
 dependencies = [
  "libc",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -1390,7 +1390,7 @@ checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78"
 dependencies = [
  "cfg-if",
  "rustix 1.0.7",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -3480,9 +3480,9 @@ dependencies = [
 
 [[package]]
 name = "os_pipe"
-version = "1.2.1"
+version = "1.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982"
+checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224"
 dependencies = [
  "libc",
  "windows-sys 0.59.0",
@@ -4011,7 +4011,7 @@ dependencies = [
  "once_cell",
  "socket2 0.5.9",
  "tracing",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -4441,7 +4441,7 @@ dependencies = [
  "errno",
  "libc",
  "linux-raw-sys 0.4.15",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -4454,7 +4454,7 @@ dependencies = [
  "errno",
  "libc",
  "linux-raw-sys 0.9.4",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -5214,12 +5214,13 @@ dependencies = [
 
 [[package]]
 name = "shared_child"
-version = "1.0.2"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e297bd52991bbe0686c086957bee142f13df85d1e79b0b21630a99d374ae9dc"
+checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7"
 dependencies = [
  "libc",
- "windows-sys 0.59.0",
+ "sigchld",
+ "windows-sys 0.60.2",
 ]
 
 [[package]]
@@ -5234,9 +5235,9 @@ dependencies = [
 
 [[package]]
 name = "shared_thread"
-version = "0.1.0"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7a6f98357c6bb0ebace19b22220e5543801d9de90ffe77f8abb27c056bac064"
+checksum = "52b86057fcb5423f5018e331ac04623e32d6b5ce85e33300f92c79a1973928b0"
 
 [[package]]
 name = "shell-words"
@@ -5250,6 +5251,27 @@ version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
 
+[[package]]
+name = "sigchld"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1"
+dependencies = [
+ "libc",
+ "os_pipe",
+ "signal-hook",
+]
+
+[[package]]
+name = "signal-hook"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
 [[package]]
 name = "signal-hook-registry"
 version = "1.4.5"
@@ -5885,7 +5907,7 @@ dependencies = [
  "getrandom 0.3.2",
  "once_cell",
  "rustix 1.0.7",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -7047,6 +7069,15 @@ dependencies = [
  "windows-targets 0.52.6",
 ]
 
+[[package]]
+name = "windows-sys"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+dependencies = [
+ "windows-targets 0.53.2",
+]
+
 [[package]]
 name = "windows-targets"
 version = "0.42.2"
@@ -7086,13 +7117,29 @@ dependencies = [
  "windows_aarch64_gnullvm 0.52.6",
  "windows_aarch64_msvc 0.52.6",
  "windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm",
+ "windows_i686_gnullvm 0.52.6",
  "windows_i686_msvc 0.52.6",
  "windows_x86_64_gnu 0.52.6",
  "windows_x86_64_gnullvm 0.52.6",
  "windows_x86_64_msvc 0.52.6",
 ]
 
+[[package]]
+name = "windows-targets"
+version = "0.53.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef"
+dependencies = [
+ "windows_aarch64_gnullvm 0.53.0",
+ "windows_aarch64_msvc 0.53.0",
+ "windows_i686_gnu 0.53.0",
+ "windows_i686_gnullvm 0.53.0",
+ "windows_i686_msvc 0.53.0",
+ "windows_x86_64_gnu 0.53.0",
+ "windows_x86_64_gnullvm 0.53.0",
+ "windows_x86_64_msvc 0.53.0",
+]
+
 [[package]]
 name = "windows-version"
 version = "0.1.4"
@@ -7120,6 +7167,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
 
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
+
 [[package]]
 name = "windows_aarch64_msvc"
 version = "0.42.2"
@@ -7138,6 +7191,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
 
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
+
 [[package]]
 name = "windows_i686_gnu"
 version = "0.42.2"
@@ -7156,12 +7215,24 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
 
+[[package]]
+name = "windows_i686_gnu"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
+
 [[package]]
 name = "windows_i686_gnullvm"
 version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
 
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
+
 [[package]]
 name = "windows_i686_msvc"
 version = "0.42.2"
@@ -7180,6 +7251,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
 
+[[package]]
+name = "windows_i686_msvc"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
+
 [[package]]
 name = "windows_x86_64_gnu"
 version = "0.42.2"
@@ -7198,6 +7275,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
 
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
+
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.42.2"
@@ -7216,6 +7299,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
 
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
+
 [[package]]
 name = "windows_x86_64_msvc"
 version = "0.42.2"
@@ -7234,6 +7323,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
+
 [[package]]
 name = "winnow"
 version = "0.5.40"

From b0cf35af00997b190124220ca06bdd0d3e5786ec Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 5 Aug 2025 22:04:34 -0400
Subject: [PATCH 088/107] fix(deps): update dependency yaml to v2.8.1 (#1089)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 6bef09ac2..ffb1182a9 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -6402,9 +6402,9 @@
       "license": "ISC"
     },
     "node_modules/yaml": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
-      "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+      "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
       "license": "ISC",
       "bin": {
         "yaml": "bin.mjs"

From 64c33402cf8b4986a951d67d6435a1fffa1559ff Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 5 Aug 2025 22:05:44 -0400
Subject: [PATCH 089/107] chore(deps): update dependency typescript-eslint to
 v8.39.0 (#1087)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 138 +++++++++++++++----------------
 1 file changed, 69 insertions(+), 69 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index ffb1182a9..c10539e4a 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1944,17 +1944,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz",
-      "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz",
+      "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.38.0",
-        "@typescript-eslint/type-utils": "8.38.0",
-        "@typescript-eslint/utils": "8.38.0",
-        "@typescript-eslint/visitor-keys": "8.38.0",
+        "@typescript-eslint/scope-manager": "8.39.0",
+        "@typescript-eslint/type-utils": "8.39.0",
+        "@typescript-eslint/utils": "8.39.0",
+        "@typescript-eslint/visitor-keys": "8.39.0",
         "graphemer": "^1.4.0",
         "ignore": "^7.0.0",
         "natural-compare": "^1.4.0",
@@ -1968,9 +1968,9 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^8.38.0",
+        "@typescript-eslint/parser": "^8.39.0",
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
@@ -1984,16 +1984,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz",
-      "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.0.tgz",
+      "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.38.0",
-        "@typescript-eslint/types": "8.38.0",
-        "@typescript-eslint/typescript-estree": "8.38.0",
-        "@typescript-eslint/visitor-keys": "8.38.0",
+        "@typescript-eslint/scope-manager": "8.39.0",
+        "@typescript-eslint/types": "8.39.0",
+        "@typescript-eslint/typescript-estree": "8.39.0",
+        "@typescript-eslint/visitor-keys": "8.39.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2005,18 +2005,18 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/project-service": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
-      "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz",
+      "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/tsconfig-utils": "^8.38.0",
-        "@typescript-eslint/types": "^8.38.0",
+        "@typescript-eslint/tsconfig-utils": "^8.39.0",
+        "@typescript-eslint/types": "^8.39.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2027,18 +2027,18 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "typescript": ">=4.8.4 <5.9.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
-      "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz",
+      "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.38.0",
-        "@typescript-eslint/visitor-keys": "8.38.0"
+        "@typescript-eslint/types": "8.39.0",
+        "@typescript-eslint/visitor-keys": "8.39.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2049,9 +2049,9 @@
       }
     },
     "node_modules/@typescript-eslint/tsconfig-utils": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
-      "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz",
+      "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2062,19 +2062,19 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "typescript": ">=4.8.4 <5.9.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz",
-      "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz",
+      "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.38.0",
-        "@typescript-eslint/typescript-estree": "8.38.0",
-        "@typescript-eslint/utils": "8.38.0",
+        "@typescript-eslint/types": "8.39.0",
+        "@typescript-eslint/typescript-estree": "8.39.0",
+        "@typescript-eslint/utils": "8.39.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.1.0"
       },
@@ -2087,13 +2087,13 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
-      "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz",
+      "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2105,16 +2105,16 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
-      "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz",
+      "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/project-service": "8.38.0",
-        "@typescript-eslint/tsconfig-utils": "8.38.0",
-        "@typescript-eslint/types": "8.38.0",
-        "@typescript-eslint/visitor-keys": "8.38.0",
+        "@typescript-eslint/project-service": "8.39.0",
+        "@typescript-eslint/tsconfig-utils": "8.39.0",
+        "@typescript-eslint/types": "8.39.0",
+        "@typescript-eslint/visitor-keys": "8.39.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -2130,7 +2130,7 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "typescript": ">=4.8.4 <5.9.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
@@ -2173,16 +2173,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
-      "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz",
+      "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.7.0",
-        "@typescript-eslint/scope-manager": "8.38.0",
-        "@typescript-eslint/types": "8.38.0",
-        "@typescript-eslint/typescript-estree": "8.38.0"
+        "@typescript-eslint/scope-manager": "8.39.0",
+        "@typescript-eslint/types": "8.39.0",
+        "@typescript-eslint/typescript-estree": "8.39.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2193,17 +2193,17 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
-      "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz",
+      "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.38.0",
+        "@typescript-eslint/types": "8.39.0",
         "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
@@ -6009,16 +6009,16 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz",
-      "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==",
+      "version": "8.39.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.39.0.tgz",
+      "integrity": "sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.38.0",
-        "@typescript-eslint/parser": "8.38.0",
-        "@typescript-eslint/typescript-estree": "8.38.0",
-        "@typescript-eslint/utils": "8.38.0"
+        "@typescript-eslint/eslint-plugin": "8.39.0",
+        "@typescript-eslint/parser": "8.39.0",
+        "@typescript-eslint/typescript-estree": "8.39.0",
+        "@typescript-eslint/utils": "8.39.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -6029,7 +6029,7 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
+        "typescript": ">=4.8.4 <6.0.0"
       }
     },
     "node_modules/undici-types": {

From 7e96f2cd9fad6656de690dad93a45ccffc31a4a3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 5 Aug 2025 22:06:25 -0400
Subject: [PATCH 090/107] fix(deps): update dependency @patternfly/react-core
 to v6.3.1 (#1091)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index c10539e4a..591829e8b 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1159,14 +1159,14 @@
       }
     },
     "node_modules/@patternfly/react-core": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.0.tgz",
-      "integrity": "sha512-TM+pLwLd5DzaDlOQhqeju9H9QUFQypQiNwXQLNIxOV5r3fmKh4NTp2Av/8WmFkpCj8mejDOfp4TNxoU1zdjCkQ==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.1.tgz",
+      "integrity": "sha512-1qV20nU4M6PA28qnikH9fPLQlkteaZZToFlATjBNBw7aUI6zIvj7U0akkHz8raWcfHAI+tAzGV7dfKjiv035/g==",
       "license": "MIT",
       "dependencies": {
-        "@patternfly/react-icons": "^6.3.0",
-        "@patternfly/react-styles": "^6.3.0",
-        "@patternfly/react-tokens": "^6.3.0",
+        "@patternfly/react-icons": "^6.3.1",
+        "@patternfly/react-styles": "^6.3.1",
+        "@patternfly/react-tokens": "^6.3.1",
         "focus-trap": "7.6.4",
         "react-dropzone": "^14.3.5",
         "tslib": "^2.8.1"
@@ -1177,9 +1177,9 @@
       }
     },
     "node_modules/@patternfly/react-icons": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-6.3.0.tgz",
-      "integrity": "sha512-W39JyqKW1UL6/YGuinDnpjbhmmLAfuxVrgDcdFBaK4D7D1iqkkqrDMV8zIzmV/RkodJ79xRnucYhYb2RukG4RA==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-6.3.1.tgz",
+      "integrity": "sha512-uiMounSIww1iZLM4pq+X8c3upzwl9iowXRPjR5CA8entb70lwgAXg3PqvypnuTAcilTq1Y3k5sFTqkhz7rgKcQ==",
       "license": "MIT",
       "peerDependencies": {
         "react": "^17 || ^18 || ^19",
@@ -1187,15 +1187,15 @@
       }
     },
     "node_modules/@patternfly/react-styles": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-6.3.0.tgz",
-      "integrity": "sha512-FvuyNsY2oN8f2dvCl4Hx8CxBWCIF3BC9JE3Ay1lCuVqY1WYkvW4AQn3/0WVRINCxB9FkQxVNkSjARdwHNCEulw==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-6.3.1.tgz",
+      "integrity": "sha512-hyb+PlO8YITjKh2wBvjdeZhX6FyB3hlf4r6yG4rPOHk4SgneXHjNSdGwQ3szAxgGqtbENCYtOqwD/8ai72GrxQ==",
       "license": "MIT"
     },
     "node_modules/@patternfly/react-tokens": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-6.3.0.tgz",
-      "integrity": "sha512-yWStfkbxg4RWAExFKS/JRGScyadOy35yr4DFispNeHrkZWMp4pwKf0VdwlQZ7+ZtSgEWtzzy1KFxMLmWh3mEqA==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-6.3.1.tgz",
+      "integrity": "sha512-wt/xKU1tGCDXUueFb+8/Cwxlm4vUD/Xl26O8MxbSLm6NZAHOUPwytJ7gugloGSPvc/zcsXxEgKANL8UZNO6DTw==",
       "license": "MIT"
     },
     "node_modules/@playwright/test": {

From 76ab05cab05ea4c495351dd432f0d21bb41aebce Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 5 Aug 2025 22:07:27 -0400
Subject: [PATCH 091/107] fix(deps): update dependency
 @patternfly/react-code-editor to v6.3.1 (#1090)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 591829e8b..c741bfd7f 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1141,15 +1141,15 @@
       }
     },
     "node_modules/@patternfly/react-code-editor": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/@patternfly/react-code-editor/-/react-code-editor-6.3.0.tgz",
-      "integrity": "sha512-2G0LId2KuuMcFZJRLDcRMfMHWRFG/sbMPXyD8yIi/2LPtAh/JFHbbDCzQXveQzaFhwXxVyVdCrCmbgn4SDYDlQ==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/@patternfly/react-code-editor/-/react-code-editor-6.3.1.tgz",
+      "integrity": "sha512-lzrION96CR2G3ASjE++dX/dExH08HVcCLXbHdmiiTL4eHfbqXt4edDc+UX619XrbaccJBE+BxNNGKyO8bgpKRg==",
       "license": "MIT",
       "dependencies": {
         "@monaco-editor/react": "^4.6.0",
-        "@patternfly/react-core": "^6.3.0",
-        "@patternfly/react-icons": "^6.3.0",
-        "@patternfly/react-styles": "^6.3.0",
+        "@patternfly/react-core": "^6.3.1",
+        "@patternfly/react-icons": "^6.3.1",
+        "@patternfly/react-styles": "^6.3.1",
         "react-dropzone": "14.3.5",
         "tslib": "^2.8.1"
       },

From ca7022fb2daa3f5359ebdb3a93b8744b5c25cc6b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 5 Aug 2025 22:08:47 -0400
Subject: [PATCH 092/107] chore(deps): update actions/download-artifact action
 to v5 (#1093)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/release.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index ee1e0cffe..e26d099b9 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -50,7 +50,7 @@ jobs:
 
     steps:
     - name: Download all the dists
-      uses: actions/download-artifact@v4
+      uses: actions/download-artifact@v5
       with:
         name: python-package-distributions
         path: dist/
@@ -115,7 +115,7 @@ jobs:
 
     steps:
     - name: Download all the dists
-      uses: actions/download-artifact@v4
+      uses: actions/download-artifact@v5
       with:
         name: python-package-distributions
         path: dist/

From df76eef43051c35b9d3fb0c6e7b50b47a6705a59 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 5 Aug 2025 22:34:03 -0400
Subject: [PATCH 093/107] chore(deps): update dependency typescript to 5.9
 (#1081)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 pdl-live-react/package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index c741bfd7f..5577300bb 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -48,7 +48,7 @@
         "globals": "^16.0.0",
         "json-schema-to-typescript": "^15.0.4",
         "prettier": "^3.4.2",
-        "typescript": "5.8",
+        "typescript": "5.9",
         "typescript-eslint": "^8.27.0",
         "vite": "^7.0.0",
         "vite-plugin-html": "^3.2.2"
@@ -5995,9 +5995,9 @@
       }
     },
     "node_modules/typescript": {
-      "version": "5.8.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
-      "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+      "version": "5.9.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
+      "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
       "dev": true,
       "license": "Apache-2.0",
       "bin": {
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index 09e9f4ac8..4957a0d14 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -63,7 +63,7 @@
     "globals": "^16.0.0",
     "json-schema-to-typescript": "^15.0.4",
     "prettier": "^3.4.2",
-    "typescript": "5.8",
+    "typescript": "5.9",
     "typescript-eslint": "^8.27.0",
     "vite": "^7.0.0",
     "vite-plugin-html": "^3.2.2"

From 98c7d3aed58e9068ffa294009a737850ed7ec7ea Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 7 Aug 2025 10:51:23 -0400
Subject: [PATCH 094/107] chore(deps): update dependency @vitejs/plugin-react
 to v5 (#1095)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 18 +++++++++---------
 pdl-live-react/package.json      |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 5577300bb..c58587cb3 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -40,7 +40,7 @@
         "@types/react": "^19.0.0",
         "@types/react-dom": "^19.0.0",
         "@types/react-syntax-highlighter": "^15.5.13",
-        "@vitejs/plugin-react": "^4.3.4",
+        "@vitejs/plugin-react": "^5.0.0",
         "concurrently": "^9.1.2",
         "eslint": "^9.19.0",
         "eslint-plugin-react-hooks": "^5.1.0",
@@ -1215,9 +1215,9 @@
       }
     },
     "node_modules/@rolldown/pluginutils": {
-      "version": "1.0.0-beta.27",
-      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
-      "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
+      "version": "1.0.0-beta.30",
+      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.30.tgz",
+      "integrity": "sha512-whXaSoNUFiyDAjkUF8OBpOm77Szdbk5lGNqFe6CbVbJFrhCCPinCbRA3NjawwlNHla1No7xvXXh+CpSxnPfUEw==",
       "dev": true,
       "license": "MIT"
     },
@@ -2221,21 +2221,21 @@
       "license": "ISC"
     },
     "node_modules/@vitejs/plugin-react": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
-      "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.0.tgz",
+      "integrity": "sha512-Jx9JfsTa05bYkS9xo0hkofp2dCmp1blrKjw9JONs5BTHOvJCgLbaPSuZLGSVJW6u2qe0tc4eevY0+gSNNi0YCw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/core": "^7.28.0",
         "@babel/plugin-transform-react-jsx-self": "^7.27.1",
         "@babel/plugin-transform-react-jsx-source": "^7.27.1",
-        "@rolldown/pluginutils": "1.0.0-beta.27",
+        "@rolldown/pluginutils": "1.0.0-beta.30",
         "@types/babel__core": "^7.20.5",
         "react-refresh": "^0.17.0"
       },
       "engines": {
-        "node": "^14.18.0 || >=16.0.0"
+        "node": "^20.19.0 || >=22.12.0"
       },
       "peerDependencies": {
         "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index 4957a0d14..8e6e8a7d6 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -55,7 +55,7 @@
     "@types/react": "^19.0.0",
     "@types/react-dom": "^19.0.0",
     "@types/react-syntax-highlighter": "^15.5.13",
-    "@vitejs/plugin-react": "^4.3.4",
+    "@vitejs/plugin-react": "^5.0.0",
     "concurrently": "^9.1.2",
     "eslint": "^9.19.0",
     "eslint-plugin-react-hooks": "^5.1.0",

From 3efb1579942a8494f43a1f3fe2ba48e4ad343a01 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 7 Aug 2025 10:52:00 -0400
Subject: [PATCH 095/107] chore(deps): update dependency vite to v7.1.0 (#1094)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 184 +++++++++++++++----------------
 1 file changed, 92 insertions(+), 92 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index c58587cb3..8959e8ad5 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -1249,9 +1249,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz",
-      "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz",
+      "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==",
       "cpu": [
         "arm"
       ],
@@ -1263,9 +1263,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz",
-      "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz",
+      "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==",
       "cpu": [
         "arm64"
       ],
@@ -1277,9 +1277,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz",
-      "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz",
+      "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==",
       "cpu": [
         "arm64"
       ],
@@ -1291,9 +1291,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz",
-      "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz",
+      "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==",
       "cpu": [
         "x64"
       ],
@@ -1305,9 +1305,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz",
-      "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz",
+      "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==",
       "cpu": [
         "arm64"
       ],
@@ -1319,9 +1319,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz",
-      "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz",
+      "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==",
       "cpu": [
         "x64"
       ],
@@ -1333,9 +1333,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz",
-      "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz",
+      "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==",
       "cpu": [
         "arm"
       ],
@@ -1347,9 +1347,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz",
-      "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz",
+      "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==",
       "cpu": [
         "arm"
       ],
@@ -1361,9 +1361,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz",
-      "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz",
+      "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==",
       "cpu": [
         "arm64"
       ],
@@ -1375,9 +1375,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz",
-      "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz",
+      "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==",
       "cpu": [
         "arm64"
       ],
@@ -1389,9 +1389,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz",
-      "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz",
+      "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==",
       "cpu": [
         "loong64"
       ],
@@ -1402,10 +1402,10 @@
         "linux"
       ]
     },
-    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz",
-      "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==",
+    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz",
+      "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==",
       "cpu": [
         "ppc64"
       ],
@@ -1417,9 +1417,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz",
-      "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz",
+      "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==",
       "cpu": [
         "riscv64"
       ],
@@ -1431,9 +1431,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-musl": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz",
-      "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz",
+      "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==",
       "cpu": [
         "riscv64"
       ],
@@ -1445,9 +1445,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz",
-      "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz",
+      "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==",
       "cpu": [
         "s390x"
       ],
@@ -1459,9 +1459,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz",
-      "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz",
+      "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==",
       "cpu": [
         "x64"
       ],
@@ -1473,9 +1473,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz",
-      "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz",
+      "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==",
       "cpu": [
         "x64"
       ],
@@ -1487,9 +1487,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz",
-      "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz",
+      "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==",
       "cpu": [
         "arm64"
       ],
@@ -1501,9 +1501,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz",
-      "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz",
+      "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==",
       "cpu": [
         "ia32"
       ],
@@ -1515,9 +1515,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz",
-      "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz",
+      "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==",
       "cpu": [
         "x64"
       ],
@@ -1846,9 +1846,9 @@
       }
     },
     "node_modules/@types/estree": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
-      "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
       "license": "MIT"
     },
     "node_modules/@types/estree-jsx": {
@@ -5569,13 +5569,13 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.40.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz",
-      "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==",
+      "version": "4.46.2",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz",
+      "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@types/estree": "1.0.7"
+        "@types/estree": "1.0.8"
       },
       "bin": {
         "rollup": "dist/bin/rollup"
@@ -5585,26 +5585,26 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.40.1",
-        "@rollup/rollup-android-arm64": "4.40.1",
-        "@rollup/rollup-darwin-arm64": "4.40.1",
-        "@rollup/rollup-darwin-x64": "4.40.1",
-        "@rollup/rollup-freebsd-arm64": "4.40.1",
-        "@rollup/rollup-freebsd-x64": "4.40.1",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.40.1",
-        "@rollup/rollup-linux-arm-musleabihf": "4.40.1",
-        "@rollup/rollup-linux-arm64-gnu": "4.40.1",
-        "@rollup/rollup-linux-arm64-musl": "4.40.1",
-        "@rollup/rollup-linux-loongarch64-gnu": "4.40.1",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1",
-        "@rollup/rollup-linux-riscv64-gnu": "4.40.1",
-        "@rollup/rollup-linux-riscv64-musl": "4.40.1",
-        "@rollup/rollup-linux-s390x-gnu": "4.40.1",
-        "@rollup/rollup-linux-x64-gnu": "4.40.1",
-        "@rollup/rollup-linux-x64-musl": "4.40.1",
-        "@rollup/rollup-win32-arm64-msvc": "4.40.1",
-        "@rollup/rollup-win32-ia32-msvc": "4.40.1",
-        "@rollup/rollup-win32-x64-msvc": "4.40.1",
+        "@rollup/rollup-android-arm-eabi": "4.46.2",
+        "@rollup/rollup-android-arm64": "4.46.2",
+        "@rollup/rollup-darwin-arm64": "4.46.2",
+        "@rollup/rollup-darwin-x64": "4.46.2",
+        "@rollup/rollup-freebsd-arm64": "4.46.2",
+        "@rollup/rollup-freebsd-x64": "4.46.2",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.46.2",
+        "@rollup/rollup-linux-arm-musleabihf": "4.46.2",
+        "@rollup/rollup-linux-arm64-gnu": "4.46.2",
+        "@rollup/rollup-linux-arm64-musl": "4.46.2",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.46.2",
+        "@rollup/rollup-linux-ppc64-gnu": "4.46.2",
+        "@rollup/rollup-linux-riscv64-gnu": "4.46.2",
+        "@rollup/rollup-linux-riscv64-musl": "4.46.2",
+        "@rollup/rollup-linux-s390x-gnu": "4.46.2",
+        "@rollup/rollup-linux-x64-gnu": "4.46.2",
+        "@rollup/rollup-linux-x64-musl": "4.46.2",
+        "@rollup/rollup-win32-arm64-msvc": "4.46.2",
+        "@rollup/rollup-win32-ia32-msvc": "4.46.2",
+        "@rollup/rollup-win32-x64-msvc": "4.46.2",
         "fsevents": "~2.3.2"
       }
     },
@@ -6206,9 +6206,9 @@
       }
     },
     "node_modules/vite": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz",
-      "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.0.tgz",
+      "integrity": "sha512-3jdAy3NhBJYsa/lCFcnRfbK4kNkO/bhijFCnv5ByUQk/eekYagoV2yQSISUrhpV+5JiY5hmwOh7jNnQ68dFMuQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6216,7 +6216,7 @@
         "fdir": "^6.4.6",
         "picomatch": "^4.0.3",
         "postcss": "^8.5.6",
-        "rollup": "^4.40.0",
+        "rollup": "^4.43.0",
         "tinyglobby": "^0.2.14"
       },
       "bin": {

From b4850185d41bffcaf3890d147c141481ed916a59 Mon Sep 17 00:00:00 2001
From: Mandana Vaziri 
Date: Thu, 7 Aug 2025 14:42:45 -0400
Subject: [PATCH 096/107] Requirements implementation (#1097)

* requirements implementation and example

Signed-off-by: Mandana Vaziri 
---
 examples/requirements/email.pdl |  42 ++++++++
 src/pdl/pdl-schema.json         | 175 ++++++++++++++++++++++++++++++++
 src/pdl/pdl_ast.py              |  24 +++++
 src/pdl/pdl_dumper.py           |  13 +++
 src/pdl/pdl_interpreter.py      |  28 ++++-
 tests/test_examples_run.yaml    |   1 +
 6 files changed, 282 insertions(+), 1 deletion(-)
 create mode 100644 examples/requirements/email.pdl

diff --git a/examples/requirements/email.pdl b/examples/requirements/email.pdl
new file mode 100644
index 000000000..c949b33d3
--- /dev/null
+++ b/examples/requirements/email.pdl
@@ -0,0 +1,42 @@
+description: Hello world calling a model
+defs:
+  eval: 
+    function:
+      requirement: string
+      response: string
+    return:
+      lastOf:
+      - model: ollama_chat/mistral-small:latest 
+        def: result
+        input: |
+          Does the following email end with Kind regards. Answer with a JSON object and a result field with value True or False only.
+          Email: ${ response }
+        parser: json
+      - ${ result.result }
+      
+  fix:
+    function:
+      requirement: string
+      response: string
+    return: 
+      lastOf:
+      - model: ollama_chat/mistral-small:latest 
+        def: instruction
+        input: |
+          A model responded with the following response: ${ response }
+          In order to satisfy the following requirement: ${ requirement }
+          what should be added to the prompt as an instruction?
+
+          Respond with only with the instruction.
+      - ${ pdl_context }
+
+  notes: Olivia helped the lab over the last few weeks by organizing intern events, advertising the speaker series, and handling issues with snack delivery.
+  name: Olivia
+text:
+- "Write an email to ${ name } using the notes following: ${ notes }"
+- model: ollama_chat/granite3.2:2b
+  requirements:
+  - description: The email should end with Kind regards
+    evaluate:  ${ eval }
+    transformContext: ${ fix }
+  retry: 5
diff --git a/src/pdl/pdl-schema.json b/src/pdl/pdl-schema.json
index 230ad79bd..6658cfcb6 100644
--- a/src/pdl/pdl-schema.json
+++ b/src/pdl/pdl-schema.json
@@ -76,6 +76,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -194,6 +199,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -417,6 +427,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -554,6 +569,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -726,6 +746,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -849,6 +874,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -966,6 +996,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -1116,6 +1151,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -1255,6 +1295,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -1364,6 +1409,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -1563,6 +1613,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -1685,6 +1740,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -1798,6 +1858,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -2068,6 +2133,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -2184,6 +2254,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -2770,6 +2845,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -2942,6 +3022,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -3137,6 +3222,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -3262,6 +3352,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -3793,6 +3888,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -3947,6 +4047,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
@@ -4073,6 +4178,71 @@
       "title": "RepeatBlock",
       "type": "object"
     },
+    "RequirementType": {
+      "additionalProperties": false,
+      "description": "Single requirement definition.",
+      "properties": {
+        "description": {
+          "anyOf": [
+            {
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+            },
+            {},
+            {
+              "type": "string"
+            }
+          ],
+          "title": "Description"
+        },
+        "evaluate": {
+          "anyOf": [
+            {
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+            },
+            {
+              "$ref": "#/$defs/FunctionBlock"
+            },
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "title": "Evaluate"
+        },
+        "transformContext": {
+          "anyOf": [
+            {
+              "$ref": "#/$defs/LocalizedExpression_TypeVar_"
+            },
+            {
+              "$ref": "#/$defs/FunctionBlock"
+            },
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "title": "Transformcontext"
+        }
+      },
+      "required": [
+        "description",
+        "evaluate",
+        "transformContext"
+      ],
+      "title": "RequirementType",
+      "type": "object"
+    },
+    "RequirementsType": {
+      "items": {
+        "$ref": "#/$defs/RequirementType"
+      },
+      "type": "array"
+    },
     "TextBlock": {
       "additionalProperties": false,
       "description": "Create the concatenation of the stringify version of the result of each block of the list of blocks.",
@@ -4129,6 +4299,11 @@
           "default": null,
           "description": "Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.\n    "
         },
+        "requirements": {
+          "$ref": "#/$defs/RequirementsType",
+          "default": [],
+          "description": "Specify any requirements that the result of the block must satisfy.\n    "
+        },
         "role": {
           "$ref": "#/$defs/OptionalStr",
           "default": null,
diff --git a/src/pdl/pdl_ast.py b/src/pdl/pdl_ast.py
index 65e066784..8d190ac8f 100644
--- a/src/pdl/pdl_ast.py
+++ b/src/pdl/pdl_ast.py
@@ -330,6 +330,25 @@ class ContributeValue(BaseModel):
 """Type of the contribute field."""
 
 
+class RequirementType(BaseModel):
+    """Single requirement definition."""
+
+    model_config = ConfigDict(extra="forbid")
+
+    description: ExpressionType
+    """English description of the requirement"""
+
+    evaluate: Optional[ExpressionType["FunctionBlock"]]
+    """Evaluation function for the requirement"""
+
+    transformContext: Optional[ExpressionType["FunctionBlock"]]
+    """Function to transform the context for the requirement"""
+
+
+RequirementsType = TypeAliasType("RequirementsType", Sequence[RequirementType])
+"""Type of requirements field"""
+
+
 class PdlTiming(BaseModel):
     """Internal data structure to record timing information in the trace."""
 
@@ -406,6 +425,11 @@ class Block(BaseModel):
     trace_error_on_retry: OptionalBoolOrStr = None
     """Whether to add the errors while retrying to the trace. Set this to true to use retry feature for multiple LLM trials.
     """
+
+    requirements: RequirementsType = []
+    """Specify any requirements that the result of the block must satisfy.
+    """
+
     role: RoleType = None
     """Role associated to the block and sub-blocks.
     Typical roles are `system`, `user`, and `assistant`,
diff --git a/src/pdl/pdl_dumper.py b/src/pdl/pdl_dumper.py
index 3e6f2ace5..52d087c71 100644
--- a/src/pdl/pdl_dumper.py
+++ b/src/pdl/pdl_dumper.py
@@ -59,6 +59,7 @@
     ReadBlock,
     RegexParser,
     RepeatBlock,
+    RequirementType,
     StructuredBlock,
     TextBlock,
 )
@@ -297,6 +298,10 @@ def block_to_dict(  # noqa: C901
         d["pdl__result"] = data_to_dict(block.pdl__result.result(), json_compatible)
     if block.parser is not None:
         d["parser"] = parser_to_dict(block.parser)
+    if block.requirements is not None:
+        d["requirements"] = [
+            requirement_to_dict(b, json_compatible) for b in block.requirements
+        ]
     # if block.pdl__location is not None:
     #     d["pdl__location"] = location_to_dict(block.pdl__location)
     if block.fallback is not None:
@@ -398,6 +403,14 @@ def usage_to_dict(usage: PdlUsage) -> dict:
     return d
 
 
+def requirement_to_dict(req: RequirementType, json_compatible: bool) -> dict:
+    d: dict = {}
+    d["description"] = req.description
+    d["evaluate"] = expr_to_dict(req.evaluate, json_compatible)
+    d["transformContext"] = expr_to_dict(req.transformContext, json_compatible)
+    return d
+
+
 def pattern_to_dict(pattern: PatternType):
     if not isinstance(pattern, pdl_ast.Pattern):
         return pattern
diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py
index 23552d8a2..53627dbfc 100644
--- a/src/pdl/pdl_interpreter.py
+++ b/src/pdl/pdl_interpreter.py
@@ -442,7 +442,7 @@ def set_error_to_scope_for_retry(
     return scope
 
 
-def process_advanced_block(
+def process_advanced_block(  # noqa:C901
     state: InterpreterState,
     scope: ScopeType,
     block: AdvancedBlockType,
@@ -476,6 +476,28 @@ def process_advanced_block(
             result, background, new_scope, trace = process_block_body(
                 state, scope, block, loc
             )
+            if block.requirements != []:
+                requirements_satisfied = True
+                for req in block.requirements:
+                    evalfn, _ = process_expr(scope, getattr(req, "evaluate"), loc)
+                    evaluation = evalfn(
+                        requirement=getattr(req, "description"), response=result
+                    )
+                    if evaluation.result() is False:
+                        requirements_satisfied = False
+                        transfn, _ = process_expr(
+                            scope, getattr(req, "transformContext"), loc
+                        )
+                        new_context = transfn(
+                            pdl_context=scope["pdl_context"],
+                            requirement=getattr(req, "description"),
+                            response=result,
+                        )
+                        scope = scope | {"pdl_context": new_context}
+                if requirements_satisfied is False:
+                    print("\nTrying again!")
+                    continue
+
             result = lazy_apply(id_with_set_first_use_nanos(block.pdl__timing), result)
             add_done_callback(
                 id_with_set_first_use_nanos(block.pdl__timing), background
@@ -2238,6 +2260,10 @@ def parse_result(parser: ParserType, text: str) -> JSONReturnType:
     match parser:
         case "json":
             try:
+                if text == "False":
+                    return json.loads("false")
+                if text == "True":
+                    return json.loads("true")
                 result = json_repair.loads(text)  # type: ignore[reportAssignmentType]
             except Exception as exc:
                 raise PDLRuntimeParserError(
diff --git a/tests/test_examples_run.yaml b/tests/test_examples_run.yaml
index e299c0980..6ef48a317 100644
--- a/tests/test_examples_run.yaml
+++ b/tests/test_examples_run.yaml
@@ -39,6 +39,7 @@ skip:
   - examples/optimizer/mbpp.pdl
   - examples/optimizer/fever.pdl
   - examples/optimizer/gsm8k.pdl
+  - examples/requirements/email.pdl
 with_inputs:
   examples/tutorial/programs/chatbot.pdl:
     stdin: |

From 244568c62b912c2da124442fdcc96ae5de9b5871 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 8 Aug 2025 09:49:19 -0400
Subject: [PATCH 097/107] chore(deps): update dependency vite to v7.1.1 (#1099)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 8959e8ad5..616d9c5cb 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -6206,9 +6206,9 @@
       }
     },
     "node_modules/vite": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.0.tgz",
-      "integrity": "sha512-3jdAy3NhBJYsa/lCFcnRfbK4kNkO/bhijFCnv5ByUQk/eekYagoV2yQSISUrhpV+5JiY5hmwOh7jNnQ68dFMuQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.1.tgz",
+      "integrity": "sha512-yJ+Mp7OyV+4S+afWo+QyoL9jFWD11QFH0i5i7JypnfTcA1rmgxCbiA8WwAICDEtZ1Z1hzrVhN8R8rGTqkTY8ZQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {

From d61477f1ce18fe44208fcd548a40b75c3c78b0d7 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 8 Aug 2025 09:49:46 -0400
Subject: [PATCH 098/107] fix(deps): update dependency react-router to v7.8.0
 (#1098)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 616d9c5cb..1ca94c8ab 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -5322,9 +5322,9 @@
       }
     },
     "node_modules/react-router": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.7.1.tgz",
-      "integrity": "sha512-jVKHXoWRIsD/qS6lvGveckwb862EekvapdHJN/cGmzw40KnJH5gg53ujOJ4qX6EKIK9LSBfFed/xiQ5yeXNrUA==",
+      "version": "7.8.0",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.8.0.tgz",
+      "integrity": "sha512-r15M3+LHKgM4SOapNmsH3smAizWds1vJ0Z9C4mWaKnT9/wD7+d/0jYcj6LmOvonkrO4Rgdyp4KQ/29gWN2i1eg==",
       "license": "MIT",
       "dependencies": {
         "cookie": "^1.0.1",

From 0a54f9bc97c1934ff952ad1675407502cea8b108 Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Fri, 8 Aug 2025 09:50:55 -0400
Subject: [PATCH 099/107] refactor: use `map` function to implement `map` block
 (#1096)

Signed-off-by: Louis Mandel 
---
 src/pdl/pdl_interpreter.py | 73 +++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 29 deletions(-)

diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py
index 53627dbfc..22cca9cc7 100644
--- a/src/pdl/pdl_interpreter.py
+++ b/src/pdl/pdl_interpreter.py
@@ -12,6 +12,7 @@
 import warnings
 from asyncio import AbstractEventLoop
 from functools import partial, reduce
+from itertools import count
 from os import getenv
 
 warnings.filterwarnings("ignore", "Valid config keys have changed in V2")
@@ -21,6 +22,7 @@
     Any,
     Generator,
     Generic,
+    Iterable,
     Optional,
     Sequence,
     Tuple,
@@ -952,9 +954,7 @@ def process_block_body(
                 yield_result(result.result(), block.kind)
             trace = block.model_copy(update={"pdl__trace": iter_trace})
         case MapBlock():
-            results = []
             background = DependentContext([])
-            iter_trace = []
             iteration_state = state.with_yield_result(False)
             block, items, length = _evaluate_for_field(scope, block, loc)
             block, max_iterations = _evaluate_max_iterations_field(scope, block, loc)
@@ -962,40 +962,40 @@ def process_block_body(
             map_loc = append(loc, "map")
             iidx = 0
             try:
-                saved_background = IndependentContext([])
-                while True:
+                if max_iterations is not None:
+                    index_iterator: Any = range(max_iterations)
+                else:
+                    index_iterator = count()
+                if items is not None and length is not None:
+                    items_iterator = (
+                        {k: elems[i] for k, elems in items.items()}
+                        for i in range(length)
+                    )
+                else:
+                    items_iterator = ({} for _ in count())
+
+                def loop_body(iidx, items):
                     iteration_scope = scope_init
                     if block.index is not None:
                         iteration_scope = iteration_scope | {block.index: iidx}
-                    if max_iterations is not None and iidx >= max_iterations:
-                        break
-                    if length is not None and iidx >= length:
-                        break
-                    iteration_state = iteration_state.with_iter(iidx)
-                    if items is not None:
-                        for k in items.keys():
-                            iteration_scope = iteration_scope | {k: items[k][iidx]}
-                    (
-                        iteration_result,
-                        iteration_background,
-                        iteration_scope,
-                        body_trace,
-                    ) = process_block(
-                        iteration_state,
+                    iteration_scope = iteration_scope | items
+                    return process_block(
+                        iteration_state.with_iter(iidx),
                         iteration_scope,
                         block.map,
                         map_loc,
                     )
-                    saved_background = IndependentContext(
-                        [saved_background, iteration_background]
-                    )
-                    results.append(iteration_result)
-                    iter_trace.append(body_trace)
-                    iteration_state = iteration_state.with_pop()
-                    iidx = iidx + 1
+
+                # with ThreadPoolExecutor(max_workers=4) as executor:
+                #     map_output = executor.map(
+                map_output = map(  # pylint: disable=bad-builtin
+                    loop_body, index_iterator, items_iterator
+                )
+                results, _, _, traces = _split_map_output(map_output)
+                # saved_background = IndependentContext(backgrounds)
             except PDLRuntimeError as exc:
-                iter_trace.append(exc.pdl__trace)
-                trace = block.model_copy(update={"pdl__trace": iter_trace})
+                traces = [exc.pdl__trace]  # type: ignore
+                trace = block.model_copy(update={"pdl__trace": traces})
                 raise PDLRuntimeError(
                     exc.message,
                     loc=exc.loc or map_loc,
@@ -1005,7 +1005,7 @@ def process_block_body(
             # background = saved_background  # commented because the block do not contribute to the background
             if state.yield_result and not iteration_state.yield_result:
                 yield_result(result.result(), block.kind)
-            trace = block.model_copy(update={"pdl__trace": iter_trace})
+            trace = block.model_copy(update={"pdl__trace": traces})
         case ReadBlock():
             result, background, scope, trace = process_input(state, scope, block, loc)
             if state.yield_result:
@@ -1065,6 +1065,21 @@ def process_block_body(
     return result, background, scope, trace
 
 
+def _split_map_output(
+    map_output: Iterable[Tuple[PdlLazy[Any], LazyMessages, ScopeType, BlockType]],
+) -> Tuple[list[PdlLazy[Any]], list[LazyMessages], list[ScopeType], list[BlockType]]:
+    results = []
+    backgrounds = []
+    scopes = []
+    traces = []
+    for result, background, scope, trace in map_output:
+        results.append(result)
+        backgrounds.append(background)
+        scopes.append(scope)
+        traces.append(trace)
+    return results, backgrounds, scopes, traces
+
+
 BlockTVarEvalFor = TypeVar("BlockTVarEvalFor", bound=RepeatBlock | MapBlock)
 
 

From c23aca47eb17868c95827918da11c1297bf925de Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Fri, 8 Aug 2025 10:40:17 -0400
Subject: [PATCH 100/107] fix: update AST in the UI (#1100)

Signed-off-by: Louis Mandel 
---
 pdl-live-react/src/pdl_ast.d.ts | 146 ++++++++++++++++++++++++++++++++
 1 file changed, 146 insertions(+)

diff --git a/pdl-live-react/src/pdl_ast.d.ts b/pdl-live-react/src/pdl_ast.d.ts
index 8c203db9b..6973fa30e 100644
--- a/pdl-live-react/src/pdl_ast.d.ts
+++ b/pdl-live-react/src/pdl_ast.d.ts
@@ -110,6 +110,17 @@ export type ContributeType = (
 export type ParserType = ("json" | "jsonl" | "yaml") | PdlParser | RegexParser
 export type Regex = string
 export type Mode = "search" | "match" | "fullmatch" | "split" | "findall"
+export type Evaluate = LocalizedExpression | FunctionBlock | string | null
+export type Transformcontext =
+  | LocalizedExpression
+  | FunctionBlock
+  | string
+  | null
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType = RequirementType[]
 export type ModelInput = {
   [k: string]: unknown
 }[]
@@ -130,6 +141,11 @@ export type ContributeType1 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType1 = RequirementType[]
 export type PdlIsLeaf1 = true
 export type Kind1 = "model"
 /**
@@ -142,6 +158,11 @@ export type ContributeType2 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType2 = RequirementType[]
 export type PdlIsLeaf2 = true
 export type Kind2 = "model"
 /**
@@ -154,6 +175,11 @@ export type ContributeType3 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType3 = RequirementType[]
 export type PdlIsLeaf3 = true
 export type Kind3 = "code"
 /**
@@ -171,6 +197,11 @@ export type ContributeType4 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType4 = RequirementType[]
 export type PdlIsLeaf4 = true
 export type Kind4 = "code"
 export type Lang1 = "command"
@@ -190,6 +221,11 @@ export type ContributeType5 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType5 = RequirementType[]
 export type PdlIsLeaf5 = true
 export type Kind5 = "get"
 /**
@@ -206,6 +242,11 @@ export type ContributeType6 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType6 = RequirementType[]
 export type PdlIsLeaf6 = true
 export type Kind6 = "data"
 /**
@@ -222,6 +263,11 @@ export type ContributeType7 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType7 = RequirementType[]
 export type PdlIsLeaf7 = false
 export type IndependentEnum = "independent" | "dependent"
 export type Kind7 = "if"
@@ -235,6 +281,11 @@ export type ContributeType8 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType8 = RequirementType[]
 export type PdlIsLeaf8 = false
 export type IndependentEnum1 = "independent" | "dependent"
 export type Kind8 = "match"
@@ -269,6 +320,11 @@ export type ContributeType9 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType9 = RequirementType[]
 export type PdlIsLeaf9 = false
 export type IndependentEnum2 = "independent" | "dependent"
 export type Kind9 = "repeat"
@@ -289,6 +345,11 @@ export type ContributeType10 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType10 = RequirementType[]
 export type PdlIsLeaf10 = false
 export type IndependentEnum3 = "independent" | "dependent"
 export type Kind10 = "map"
@@ -309,6 +370,11 @@ export type ContributeType11 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType11 = RequirementType[]
 export type PdlIsLeaf11 = false
 export type IndependentEnum4 = "independent" | "dependent"
 export type Kind11 = "text"
@@ -327,6 +393,11 @@ export type ContributeType12 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType12 = RequirementType[]
 export type PdlIsLeaf12 = false
 export type IndependentEnum5 = "independent" | "dependent"
 export type Kind12 = "lastOf"
@@ -344,6 +415,11 @@ export type ContributeType13 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType13 = RequirementType[]
 export type PdlIsLeaf13 = false
 export type IndependentEnum6 = "independent" | "dependent"
 export type Kind13 = "array"
@@ -361,6 +437,11 @@ export type ContributeType14 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType14 = RequirementType[]
 export type PdlIsLeaf14 = false
 export type IndependentEnum7 = "independent" | "dependent"
 export type Kind14 = "object"
@@ -379,6 +460,11 @@ export type ContributeType15 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType15 = RequirementType[]
 export type PdlIsLeaf15 = true
 export type Kind15 = "message"
 /**
@@ -391,6 +477,11 @@ export type ContributeType16 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType16 = RequirementType[]
 export type PdlIsLeaf16 = true
 export type Kind16 = "read"
 /**
@@ -408,6 +499,11 @@ export type ContributeType17 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType17 = RequirementType[]
 export type PdlIsLeaf17 = false
 export type IndependentEnum8 = "independent" | "dependent"
 export type Kind17 = "include"
@@ -426,6 +522,11 @@ export type ContributeType18 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType18 = RequirementType[]
 export type PdlIsLeaf18 = true
 export type Kind18 = "import"
 /**
@@ -443,6 +544,11 @@ export type ContributeType19 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType19 = RequirementType[]
 export type PdlIsLeaf19 = true
 export type Kind19 = "error"
 /**
@@ -460,6 +566,11 @@ export type ContributeType20 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType20 = RequirementType[]
 export type PdlIsLeaf20 = true
 export type Kind20 = "empty"
 export type ExpressionInt = LocalizedExpression | number | string
@@ -585,6 +696,11 @@ export type ContributeType21 = (
       [k: string]: ContributeValue
     }
 )[]
+/**
+ * Specify any requirements that the result of the block must satisfy.
+ *
+ */
+export type RequirementsType21 = RequirementType[]
 export type PdlIsLeaf21 = true
 export type Kind21 = "function"
 /**
@@ -691,6 +807,7 @@ export interface FunctionBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType21
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -848,6 +965,7 @@ export interface CallBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -971,6 +1089,14 @@ export interface RegexParser {
   regex: Regex
   mode?: Mode
 }
+/**
+ * Single requirement definition.
+ */
+export interface RequirementType {
+  description: unknown
+  evaluate: Evaluate
+  transformContext: Transformcontext
+}
 /**
  * Internal data structure to record timing information in the trace.
  */
@@ -1051,6 +1177,7 @@ export interface LitellmModelBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType1
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -1194,6 +1321,7 @@ export interface GraniteioModelBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType2
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -1342,6 +1470,7 @@ export interface CodeBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType3
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -1476,6 +1605,7 @@ export interface ArgsBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType4
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -1574,6 +1704,7 @@ export interface GetBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType5
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -1690,6 +1821,7 @@ export interface DataBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType6
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -1796,6 +1928,7 @@ export interface IfBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType7
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -1949,6 +2082,7 @@ export interface MatchBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType8
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -2111,6 +2245,7 @@ export interface RepeatBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType9
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -2285,6 +2420,7 @@ export interface MapBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType10
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -2428,6 +2564,7 @@ export interface TextBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType11
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -2524,6 +2661,7 @@ export interface LastOfBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType12
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -2620,6 +2758,7 @@ export interface ArrayBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType13
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -2716,6 +2855,7 @@ export interface ObjectBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType14
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -2812,6 +2952,7 @@ export interface MessageBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType15
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -2956,6 +3097,7 @@ export interface ReadBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType16
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -3061,6 +3203,7 @@ export interface IncludeBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType17
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -3158,6 +3301,7 @@ export interface ImportBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType18
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -3254,6 +3398,7 @@ export interface ErrorBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType19
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,
@@ -3380,6 +3525,7 @@ export interface EmptyBlock {
    *
    */
   trace_error_on_retry?: boolean | string | null
+  requirements?: RequirementsType20
   /**
    * Role associated to the block and sub-blocks.
    * Typical roles are `system`, `user`, and `assistant`,

From 57e022548e32c0b8f7b1172f975141554965fb6c Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Fri, 8 Aug 2025 11:36:46 -0400
Subject: [PATCH 101/107] fix: ensure that `PazyApply.result` returns a
 non-lazy value (#1101)

Signed-off-by: Louis Mandel 
---
 src/pdl/pdl_lazy.py | 38 ++++++++++++++++++++++++--------------
 1 file changed, 24 insertions(+), 14 deletions(-)

diff --git a/src/pdl/pdl_lazy.py b/src/pdl/pdl_lazy.py
index cf901aac1..fe14eda7a 100644
--- a/src/pdl/pdl_lazy.py
+++ b/src/pdl/pdl_lazy.py
@@ -156,12 +156,6 @@ def __init__(
 
     @property
     def data(self):
-        return self.result()
-
-    def __repr__(self):
-        return self.result().__repr__()
-
-    def result(self) -> ApplyOutputT:
         if self._done:
             return self._data
         v = self.x.result()
@@ -169,6 +163,17 @@ def result(self) -> ApplyOutputT:
         self._done = True
         return self._data
 
+    def __repr__(self):
+        return self.result().__repr__()
+
+    def result(self) -> ApplyOutputT:
+        data = self.data
+        if isinstance(data, PdlLazy):
+            result = data.result()
+        else:
+            result = data
+        return result  # pyright: ignore
+
 
 LazyApplyInputT = TypeVar("LazyApplyInputT")
 LazyApplyOutputT = TypeVar("LazyApplyOutputT")
@@ -192,20 +197,14 @@ def __init__(
         x1: PdlLazy[Apply2Input1T],
         x2: PdlLazy[Apply2Input2T],
     ):
-        self._data: Apply2OutputT
+        self._data: Apply2OutputT | PdlLazy[Apply2OutputT]
         self.f = f
         self.x1 = x1
         self.x2 = x2
         self._done = False
 
     @property
-    def data(self):
-        return self.result()
-
-    def __repr__(self):
-        return self.result().__repr__()
-
-    def result(self) -> Apply2OutputT:
+    def data(self) -> Apply2OutputT | PdlLazy[Apply2OutputT]:
         if self._done:
             return self._data
         if isinstance(self.x1, PdlLazy):
@@ -220,6 +219,17 @@ def result(self) -> Apply2OutputT:
         self._done = True
         return self._data
 
+    def __repr__(self):
+        return self.result().__repr__()
+
+    def result(self) -> Apply2OutputT:
+        data = self.data
+        if isinstance(data, PdlLazy):
+            result = data.result()
+        else:
+            result = data
+        return result  # pyright: ignore
+
 
 LazyApply2Input1T = TypeVar("LazyApply2Input1T")  # pylint: disable=invalid-name
 LazyApply2Input2T = TypeVar("LazyApply2Input2T")  # pylint: disable=invalid-name

From 218342efe1bd343129b28be80e46d72a595b6f8d Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Fri, 8 Aug 2025 14:31:10 -0400
Subject: [PATCH 102/107] feat: parallel map reduce (#1102)

Signed-off-by: Louis Mandel 
---
 pdl-live-react/src/pdl_ast.d.ts |  5 +++++
 src/pdl/pdl-schema.json         |  5 +++++
 src/pdl/pdl_ast.py              |  3 +++
 src/pdl/pdl_interpreter.py      | 18 +++++++++++++-----
 tests/test_for.py               | 31 +++++++++++++++++++++++++++++++
 5 files changed, 57 insertions(+), 5 deletions(-)

diff --git a/pdl-live-react/src/pdl_ast.d.ts b/pdl-live-react/src/pdl_ast.d.ts
index 6973fa30e..148e0a0aa 100644
--- a/pdl-live-react/src/pdl_ast.d.ts
+++ b/pdl-live-react/src/pdl_ast.d.ts
@@ -2491,6 +2491,11 @@ export interface MapBlock {
    *
    */
   join?: JoinText | JoinArray | JoinObject | JoinLastOf | JoinReduce
+  /**
+   * Maximal number of workers to execute the map in parallel. Is it is set to `0`, the execution is sequential otherwise it is given as argument to the `ThreadPoolExecutor`.
+   *
+   */
+  maxWorkers?: number | null
   pdl__trace?: PdlTrace
 }
 /**
diff --git a/src/pdl/pdl-schema.json b/src/pdl/pdl-schema.json
index 6658cfcb6..248e68b78 100644
--- a/src/pdl/pdl-schema.json
+++ b/src/pdl/pdl-schema.json
@@ -2944,6 +2944,11 @@
           },
           "description": "Define how to combine the result of each iteration.\n    "
         },
+        "maxWorkers": {
+          "$ref": "#/$defs/OptionalInt",
+          "default": null,
+          "description": "Maximal number of workers to execute the map in parallel. Is it is set to `0`, the execution is sequential otherwise it is given as argument to the `ThreadPoolExecutor`.\n    "
+        },
         "pdl__trace": {
           "anyOf": [
             {
diff --git a/src/pdl/pdl_ast.py b/src/pdl/pdl_ast.py
index 8d190ac8f..07c7c4f1d 100644
--- a/src/pdl/pdl_ast.py
+++ b/src/pdl/pdl_ast.py
@@ -1022,6 +1022,9 @@ class MapBlock(StructuredBlock):
     join: JoinType = JoinText()
     """Define how to combine the result of each iteration.
     """
+    maxWorkers: OptionalInt = None
+    """Maximal number of workers to execute the map in parallel. Is it is set to `0`, the execution is sequential otherwise it is given as argument to the `ThreadPoolExecutor`.
+    """
     # Field for internal use
     pdl__trace: Optional[list["BlockType"]] = None
 
diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py
index 22cca9cc7..e47a388d3 100644
--- a/src/pdl/pdl_interpreter.py
+++ b/src/pdl/pdl_interpreter.py
@@ -11,6 +11,7 @@
 # TODO: temporarily disabling warnings to mute a pydantic warning from liteLLM
 import warnings
 from asyncio import AbstractEventLoop
+from concurrent.futures import ThreadPoolExecutor
 from functools import partial, reduce
 from itertools import count
 from os import getenv
@@ -986,11 +987,18 @@ def loop_body(iidx, items):
                         map_loc,
                     )
 
-                # with ThreadPoolExecutor(max_workers=4) as executor:
-                #     map_output = executor.map(
-                map_output = map(  # pylint: disable=bad-builtin
-                    loop_body, index_iterator, items_iterator
-                )
+                map_output: Iterable[
+                    Tuple[PdlLazy[Any], LazyMessages, ScopeType, BlockType]
+                ]
+                if block.maxWorkers == 0:
+                    map_output = map(  # pylint: disable=bad-builtin
+                        loop_body, index_iterator, items_iterator
+                    )
+                else:
+                    with ThreadPoolExecutor(block.maxWorkers) as executor:
+                        map_output = executor.map(
+                            loop_body, index_iterator, items_iterator
+                        )
                 results, _, _, traces = _split_map_output(map_output)
                 # saved_background = IndependentContext(backgrounds)
             except PDLRuntimeError as exc:
diff --git a/tests/test_for.py b/tests/test_for.py
index 88cdaf20f..12694e152 100644
--- a/tests/test_for.py
+++ b/tests/test_for.py
@@ -324,6 +324,25 @@ def test_for_context():
 def test_for_reduce():
     for loop_kind1 in ["repeat", "map"]:
         prog_str = f"""
+defs:
+  plus:
+    function:
+        x: number
+        y: number
+    return: ${{ x + y }}
+for:
+  i: [1,2,3,4]
+{loop_kind1}: ${{ i }}
+join:
+  reduce: ${{ plus }}
+"""
+        result = exec_str(prog_str)
+        assert result == 10
+
+
+def test_for_reduce_python():
+    for loop_kind1 in ["repeat", "map"]:
+        prog_str = f"""
 defs:
   plus:
     lang: python
@@ -338,3 +357,15 @@ def test_for_reduce():
 """
         result = exec_str(prog_str)
         assert result == 10
+
+
+def test_map_max_workers():
+    for max_workers in [0, "null", 2, 4]:
+        prog_str = f"""
+for:
+  i: [1,2,3,4]
+map: ${{ i }}
+maxWorkers: {max_workers}
+"""
+        result = exec_str(prog_str)
+        assert result == "1234"

From f8071421f37640619baf1aa9ca43a4578318c656 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 8 Aug 2025 15:31:23 -0400
Subject: [PATCH 103/107] chore(deps): update dependency @types/node to
 v22.17.1 (#1103)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 8 ++++----
 pdl-live-react/package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 1ca94c8ab..75c5f44dd 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -36,7 +36,7 @@
         "@eslint/js": "^9.19.0",
         "@playwright/test": "^1.50.0",
         "@tauri-apps/cli": "^2.3.0",
-        "@types/node": "22.17.0",
+        "@types/node": "22.17.1",
         "@types/react": "^19.0.0",
         "@types/react-dom": "^19.0.0",
         "@types/react-syntax-highlighter": "^15.5.13",
@@ -1899,9 +1899,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.17.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.0.tgz",
-      "integrity": "sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ==",
+      "version": "22.17.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.1.tgz",
+      "integrity": "sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json
index 8e6e8a7d6..1b5bb5f5f 100644
--- a/pdl-live-react/package.json
+++ b/pdl-live-react/package.json
@@ -51,7 +51,7 @@
     "@eslint/js": "^9.19.0",
     "@playwright/test": "^1.50.0",
     "@tauri-apps/cli": "^2.3.0",
-    "@types/node": "22.17.0",
+    "@types/node": "22.17.1",
     "@types/react": "^19.0.0",
     "@types/react-dom": "^19.0.0",
     "@types/react-syntax-highlighter": "^15.5.13",

From 2cc8889994302a6ee82067fe7a8d5fc416e96113 Mon Sep 17 00:00:00 2001
From: Mandana Vaziri 
Date: Fri, 8 Aug 2025 17:48:54 -0400
Subject: [PATCH 104/107] Fix for llm message post-processing (#1106)

* fix for llm message post-processing

Signed-off-by: Mandana Vaziri 
---
 src/pdl/pdl_llms.py  |  6 +++---
 src/pdl/pdl_utils.py | 13 ++++++++++---
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/pdl/pdl_llms.py b/src/pdl/pdl_llms.py
index ec78c1272..54d4ca401 100644
--- a/src/pdl/pdl_llms.py
+++ b/src/pdl/pdl_llms.py
@@ -17,7 +17,7 @@
 )
 from .pdl_lazy import PdlConst, PdlLazy, lazy_apply
 from .pdl_schema_utils import pdltype_to_jsonschema
-from .pdl_utils import remove_none_values_from_message
+from .pdl_utils import message_post_processing
 
 # Load environment variables
 load_dotenv()
@@ -47,7 +47,7 @@ async def async_generate_text(
             if msg.role is None:
                 msg.role = "assistant"
             return (
-                remove_none_values_from_message(msg.json()),
+                message_post_processing(msg.json()),
                 response.json(),  # pyright: ignore
             )
         except httpx.RequestError as exc:
@@ -161,7 +161,7 @@ def generate_text_stream(
             msg = chunk.choices[0].delta  # pyright: ignore
             if msg.role is None:
                 msg.role = "assistant"
-            yield remove_none_values_from_message(msg.model_dump())
+            yield message_post_processing(msg.model_dump())
         return result
 
 
diff --git a/src/pdl/pdl_utils.py b/src/pdl/pdl_utils.py
index 59afcef39..3d8909d5f 100644
--- a/src/pdl/pdl_utils.py
+++ b/src/pdl/pdl_utils.py
@@ -108,16 +108,23 @@ def get_contribute_value(
     return None
 
 
-def remove_none_values_from_message(message: dict) -> dict[str, Any]:
+def message_post_processing(message: dict) -> dict[str, Any]:
     ret = {}
     for key, value in message.items():
-        if key == "content":
+        if key == "content" and value is not None:
+            ret[key] = value
+        elif (
+            key == "reasoning_content" and value is not None
+        ):  # TODO: replacing reasoning_content with content here
+            key = "content"
             ret[key] = value
         if value is not None:
             if isinstance(value, dict):
-                ret[key] = remove_none_values_from_message(value)
+                ret[key] = message_post_processing(value)
             else:
                 ret[key] = value
+    if "content" not in ret:
+        ret["content"] = ""
     return ret
 
 

From 179e0920ce2b8ee2d325373d84d0a5772159986c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 8 Aug 2025 20:42:05 -0400
Subject: [PATCH 105/107] chore(deps): update eslint monorepo to v9.33.0
 (#1105)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 pdl-live-react/package-lock.json | 40 ++++++++++++++++----------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/pdl-live-react/package-lock.json b/pdl-live-react/package-lock.json
index 75c5f44dd..ce11ad3ac 100644
--- a/pdl-live-react/package-lock.json
+++ b/pdl-live-react/package-lock.json
@@ -860,9 +860,9 @@
       }
     },
     "node_modules/@eslint/config-helpers": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz",
-      "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==",
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
+      "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -870,9 +870,9 @@
       }
     },
     "node_modules/@eslint/core": {
-      "version": "0.15.1",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
-      "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
+      "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -920,9 +920,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.32.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz",
-      "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==",
+      "version": "9.33.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz",
+      "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -943,13 +943,13 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz",
-      "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
+      "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/core": "^0.15.1",
+        "@eslint/core": "^0.15.2",
         "levn": "^0.4.1"
       },
       "engines": {
@@ -3032,20 +3032,20 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.32.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz",
-      "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==",
+      "version": "9.33.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz",
+      "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.12.1",
         "@eslint/config-array": "^0.21.0",
-        "@eslint/config-helpers": "^0.3.0",
-        "@eslint/core": "^0.15.0",
+        "@eslint/config-helpers": "^0.3.1",
+        "@eslint/core": "^0.15.2",
         "@eslint/eslintrc": "^3.3.1",
-        "@eslint/js": "9.32.0",
-        "@eslint/plugin-kit": "^0.3.4",
+        "@eslint/js": "9.33.0",
+        "@eslint/plugin-kit": "^0.3.5",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@humanwhocodes/retry": "^0.4.2",

From c845250a03458a7e8ca529fcb71f2935e62ac969 Mon Sep 17 00:00:00 2001
From: Claudio Spiess 
Date: Mon, 11 Aug 2025 09:33:01 -0700
Subject: [PATCH 106/107] AutoPDL Simplification (#1088)

* autopdl simplifications

Signed-off-by: Claudio Spiess 

* Lint

Signed-off-by: Claudio Spiess 

* Fix type error?

Signed-off-by: Claudio Spiess 

* fmt

Signed-off-by: Claudio Spiess 

* fix name & skip test

Signed-off-by: Claudio Spiess 

* Skip additional

Signed-off-by: Claudio Spiess 

* update gsm8k example

Signed-off-by: Claudio Spiess 

---------

Signed-off-by: Claudio Spiess 
---
 docs/autopdl.md                               |  2 +-
 examples/optimizer/bea19.pdl                  | 17 ++++++
 examples/optimizer/bea19_example.yml          | 37 ++++++++++++
 examples/optimizer/eval_levenshtein.pdl       | 11 ++++
 examples/optimizer/fever_evaluator.py         | 11 +++-
 examples/optimizer/gsm8k_evaluator.py         |  8 +--
 examples/optimizer/gsm8k_optimizer_config.yml | 18 +++++-
 examples/optimizer/gsmhard_evaluator.py       | 20 ++++---
 examples/optimizer/mbpp_evaluator.py          | 15 ++---
 examples/optimizer/optimize.py                | 47 +++++++++------
 examples/optimizer/process_bea19.py           | 33 +++++++++++
 src/pdl/optimize/config_parser.py             | 24 ++++++--
 src/pdl/optimize/optimizer_evaluator.py       | 35 ++++--------
 src/pdl/optimize/pdl_evaluator.py             | 57 +++++++++++++++++++
 src/pdl/optimize/pdl_optimizer.py             | 30 +++++-----
 src/pdl/optimize/util.py                      |  4 +-
 tests/test_examples_run.yaml                  |  2 +
 tests/test_optimizer.py                       | 52 +++++++++++------
 18 files changed, 322 insertions(+), 101 deletions(-)
 create mode 100644 examples/optimizer/bea19.pdl
 create mode 100644 examples/optimizer/bea19_example.yml
 create mode 100644 examples/optimizer/eval_levenshtein.pdl
 create mode 100644 examples/optimizer/process_bea19.py
 create mode 100644 src/pdl/optimize/pdl_evaluator.py

diff --git a/docs/autopdl.md b/docs/autopdl.md
index c3b6db7df..3019044a4 100644
--- a/docs/autopdl.md
+++ b/docs/autopdl.md
@@ -127,7 +127,7 @@ Finally, we can run the example like so:
 
 ``` { .bash .copy .annotate linenums="1" }
 cd examples/optimizer
-python optimize.py optimize --config gsm8k_optimizer_config.yml --dataset-path ../../var/gsm8k_trajectified gsm8k.pdl
+python optimize.py optimize --config gsm8k_optimizer_config.yml --dataset-path ../../var/gsm8k_trajectified
 ```
 
 This will report details about the optimization process, such as the number of candidates evaluated. The output will look something like this:
diff --git a/examples/optimizer/bea19.pdl b/examples/optimizer/bea19.pdl
new file mode 100644
index 000000000..291bab410
--- /dev/null
+++ b/examples/optimizer/bea19.pdl
@@ -0,0 +1,17 @@
+lastOf:
+  - "Here are examples of grammatically incorrect sentences and their corrected versions:\n\n"
+  - for:
+      example: ${ demonstrations }
+    repeat:
+      text: "${ example.broken } -> ${ example.sentence }"
+    join:
+      with: "\n\n"
+  - "Correct the following sentence:\n\n${ broken }\nHere's the corrected sentence:\n\n"
+  - model: ${ model }
+    parameters:
+      max_tokens: 1024
+      temperature: 0
+      stop:
+        - "<|endoftext|>"
+        - "Question:"
+      include_stop_sequence: false
\ No newline at end of file
diff --git a/examples/optimizer/bea19_example.yml b/examples/optimizer/bea19_example.yml
new file mode 100644
index 000000000..7698bb6af
--- /dev/null
+++ b/examples/optimizer/bea19_example.yml
@@ -0,0 +1,37 @@
+pdl_path: examples/optimizer/bea19.pdl # Path to the PDL file to optimize
+# benchmark: gretel-math # Name our benchmark
+dataset:
+  train: bea19_jsonl/train.jsonl # Path to the training split in JSONL format
+  test: bea19_jsonl/test.jsonl # Path to the test split in JSONL format
+  validation: bea19_jsonl/validation.jsonl # Path to the validation split in JSONL format
+
+demonstrations_variable_name: demonstrations # variable name to insert demonstrations into
+demonstration_columns:
+  - broken # column name for the question in the dataset
+  - sentence # column name for the answer in the dataset
+
+instance_columns:
+  - broken # column name for the question in the dataset
+
+groundtruth_column: sentence # column name for the ground truth in the dataset
+
+eval_pdl: examples/optimizer/eval_levenshtein.pdl # Path to the PDL file for evaluation
+
+budget: null # Set a budget, can be number of iterations, or a duration string e.g. "2h"
+budget_growth: double # double validation set size each iteration
+# or to_max: reach max_test_set_size by final iteration
+initial_test_set_size: 1 # size of test set in first iteration
+max_test_set_size: 1 # maximum test set size
+num_candidates: 100 # how many candidates to evaluate
+parallelism: 1 # how many threads to run evaluations across
+shuffle_test: false # shuffling of test set
+test_set_name: test # name of test set
+train_set_name: train # name of train set
+validation_set_name: validation # name of validation set
+variables: # define discrete options to sample from
+  model: # set ${ model } variable
+    - watsonx/meta-llama/llama-3-2-3b-instruct
+  num_demonstrations: # overrides num demonstrations above
+    - 0
+    - 3
+    - 5
\ No newline at end of file
diff --git a/examples/optimizer/eval_levenshtein.pdl b/examples/optimizer/eval_levenshtein.pdl
new file mode 100644
index 000000000..c7c0ef534
--- /dev/null
+++ b/examples/optimizer/eval_levenshtein.pdl
@@ -0,0 +1,11 @@
+defs:
+  score:
+    function:
+      document: string
+      ground_truth: string
+    return:
+      lang: python
+      fallback: 0
+      code: |
+        import textdistance
+        result = textdistance.levenshtein.normalized_similarity(document, ground_truth)
\ No newline at end of file
diff --git a/examples/optimizer/fever_evaluator.py b/examples/optimizer/fever_evaluator.py
index 7bd056dcc..d9465199f 100644
--- a/examples/optimizer/fever_evaluator.py
+++ b/examples/optimizer/fever_evaluator.py
@@ -82,5 +82,12 @@ def extract_answer(self, document: str) -> bool | None:
 
         return None
 
-    def answer_correct(self, document: str, answer: Any, truth: Any) -> bool:
-        return answer == truth or document.lower().endswith(str(truth).lower())
+    def score(self, document: str, ground_truth: Any) -> float:
+        answer = self.extract_answer(document)
+        if answer is None:
+            return 0.0
+
+        return float(
+            answer == ground_truth
+            or document.lower().endswith(str(ground_truth).lower())
+        )
diff --git a/examples/optimizer/gsm8k_evaluator.py b/examples/optimizer/gsm8k_evaluator.py
index d6c7c1858..8288895b9 100644
--- a/examples/optimizer/gsm8k_evaluator.py
+++ b/examples/optimizer/gsm8k_evaluator.py
@@ -64,8 +64,6 @@ def get_scope(self) -> ScopeType:
         scope["reasoning"] = self.example["reasoning"]
         return empty_scope | scope
 
-    def extract_answer(self, document: str) -> Any:
-        return extract_math_answer(document)
-
-    def answer_correct(self, document: str, answer: Any, truth: Any) -> bool:
-        return answer == truth or document.endswith(f" {truth}")
+    def score(self, document: str, ground_truth: Any) -> float:
+        answer = extract_math_answer(document)
+        return float(answer == ground_truth or document.endswith(f" {ground_truth}"))
diff --git a/examples/optimizer/gsm8k_optimizer_config.yml b/examples/optimizer/gsm8k_optimizer_config.yml
index 49da371ff..822b43217 100644
--- a/examples/optimizer/gsm8k_optimizer_config.yml
+++ b/examples/optimizer/gsm8k_optimizer_config.yml
@@ -1,4 +1,5 @@
-benchmark: gsm8k # Name our benchmark
+pdl_path: gsm8k.pdl # Path to the PDL file to optimize
+dataset: gsm8k # Name our benchmark
 budget: null # Set a budget, can be number of iterations, or a duration string e.g. "2h"
 budget_growth: double # double validation set size each iteration
 # or to_max: reach max_test_set_size by final iteration
@@ -12,6 +13,21 @@ test_set_name: test # name of test set
 train_set_name: train # name of train set
 validation_set_name: validation # name of validation set
 demonstrations_variable_name: demonstrations # variable name to insert demonstrations into
+demonstration_columns:
+  - question # column name for the question in the dataset
+  - reasoning
+  - answer
+  - traj_keys
+  - traj_values
+  - rewoo_traj_keys
+  - rewoo_traj_values
+
+instance_columns:
+  - question
+  - reasoning
+
+groundtruth_column: answer # column name for the ground truth in the dataset
+
 variables: # define discrete options to sample from
   model: # set ${ model } variable
     - watsonx/meta-llama/llama-3-2-3b-instruct
diff --git a/examples/optimizer/gsmhard_evaluator.py b/examples/optimizer/gsmhard_evaluator.py
index a9bf5a641..18636db00 100644
--- a/examples/optimizer/gsmhard_evaluator.py
+++ b/examples/optimizer/gsmhard_evaluator.py
@@ -6,12 +6,12 @@
 from pdl.pdl_interpreter import empty_scope
 
 
-def is_float(s: str) -> str:
+def is_float(s: str | float) -> str:
     try:
         f = float(s)
         return f"{f:.2f}"
     except Exception:
-        return s
+        return str(s)
 
 
 class GsmHardEvaluator(OptimizerEvaluator):
@@ -74,10 +74,16 @@ def get_scope(self) -> ScopeType:
         scope["question"] = self.example["input"]
         return empty_scope | scope
 
-    def extract_answer(self, document: str) -> float | int | None:
-        return extract_math_answer(document)
+    def score(self, document: str, ground_truth: Any) -> float:
+        answer = extract_math_answer(document)
+        if answer is None:
+            return 0.0
 
-    def answer_correct(self, document: str, answer: Any, truth: Any) -> bool:
         answerf = is_float(answer)
-        truthf = is_float(truth)
-        return answer == truth or answerf == truthf or document.endswith(f" {truth}")
+        truthf = is_float(ground_truth)
+
+        return float(
+            answer == ground_truth
+            or answerf == truthf
+            or document.endswith(f" {ground_truth}")
+        )
diff --git a/examples/optimizer/mbpp_evaluator.py b/examples/optimizer/mbpp_evaluator.py
index 4402acefd..e14151c54 100644
--- a/examples/optimizer/mbpp_evaluator.py
+++ b/examples/optimizer/mbpp_evaluator.py
@@ -65,9 +65,10 @@ def extract_answer(self, document: str) -> str:
             solution = solution.split("```")[1]
         return solution.strip()
 
-    def answer_correct(self, document: str, answer: Any, truth: Any) -> bool:
-        if answer is None or not isinstance(answer, str):
-            return False
+    def score(self, document: str, ground_truth: Any) -> float:
+        answer = self.extract_answer(document)
+        if not answer:
+            return 0.0
 
         retry_parse = False
         try:
@@ -78,16 +79,16 @@ def answer_correct(self, document: str, answer: Any, truth: Any) -> bool:
 
         if retry_parse:
             pattern = r"```(?:python)?\n(.*?)\n```"
-            match = re.search(pattern, answer, re.DOTALL)
+            match = re.search(pattern, document, re.DOTALL)
             if match:
                 answer = match.group(1)
                 try:
                     ast.parse(answer)
                 except Exception as e:
                     print(e)
-                    return False
+                    return 0.0
             else:
-                return False
+                return 0.0
 
         task_id = self.example["task_id"]
 
@@ -109,4 +110,4 @@ def answer_correct(self, document: str, answer: Any, truth: Any) -> bool:
         base_stat, _ = result["base"]
         plus_stat, _ = result["plus"]
 
-        return base_stat == "pass" and plus_stat == "pass"
+        return float(base_stat == "pass" and plus_stat == "pass")
diff --git a/examples/optimizer/optimize.py b/examples/optimizer/optimize.py
index 24307fa26..a2b5190d8 100644
--- a/examples/optimizer/optimize.py
+++ b/examples/optimizer/optimize.py
@@ -5,14 +5,16 @@
 from typing import Any
 
 import yaml
-from datasets.load import load_from_disk
+from datasets import load_dataset, load_from_disk
 from fever_evaluator import FEVEREvaluator
 from gsm8k_evaluator import Gsm8kEvaluator
 from gsmhard_evaluator import GsmHardEvaluator
 from mbpp_dataset import MBPPDataset
 from mbpp_evaluator import MBPPEvaluator
 
-from pdl.optimize.config_parser import OptimizationConfig
+from pdl.optimize.config_parser import JsonlDataset, OptimizationConfig
+from pdl.optimize.optimizer_evaluator import OptimizerEvaluator
+from pdl.optimize.pdl_evaluator import PdlEvaluator
 from pdl.optimize.pdl_optimizer import PDLOptimizer
 
 if __name__ == "__main__":
@@ -38,7 +40,7 @@
         "--dataset-path",
         help="Path to the dataset directory",
         type=Path,
-        required=True,
+        required=False,
     )
     common_parser.add_argument(
         "--experiments-path",
@@ -56,11 +58,6 @@
         action=argparse.BooleanOptionalAction,
         default=False,
     )
-    common_parser.add_argument(
-        "pdl_file",
-        type=Path,
-        help="Path to a PDL file to optimize",
-    )
 
     # Optimize command
     optimize_parser = subparsers.add_parser(
@@ -82,9 +79,6 @@
     )
 
     args = parser.parse_args()
-    if not args.pdl_file.exists():
-        print("PDL file doesn't exist:", args.pdl_file)
-        sys.exit(1)
 
     if not args.config.exists():
         print("Config file doesn't exist:", args.config)
@@ -100,35 +94,52 @@
         traceback.print_last()
         sys.exit(1)
 
+    if not Path(config.pdl_path).exists():
+        print("PDL file doesn't exist:", config.pdl_path)
+        sys.exit(1)
+
     if args.dry:
         sys.exit(0)
 
     # Set up dataset and trial thread based on benchmark
     dataset: Any
     TrialThread: type[
-        Gsm8kEvaluator | GsmHardEvaluator | FEVEREvaluator | MBPPEvaluator
+        Gsm8kEvaluator
+        | GsmHardEvaluator
+        | FEVEREvaluator
+        | MBPPEvaluator
+        | OptimizerEvaluator
     ]
 
-    if config.benchmark == "gsm8k":
+    if config.dataset == "gsm8k":
         dataset = load_from_disk(args.dataset_path)
         TrialThread = Gsm8kEvaluator
-    elif config.benchmark == "gsmhard":
+    elif config.dataset == "gsmhard":
         dataset = load_from_disk(args.dataset_path)
         TrialThread = GsmHardEvaluator
-    elif config.benchmark == "fever":
+    elif config.dataset == "fever":
         fever = load_from_disk(args.dataset_path)
         dataset = fever
         TrialThread = FEVEREvaluator
-    elif config.benchmark == "mbpp":
+    elif config.dataset == "mbpp":
         dataset = MBPPDataset(args.dataset_path)
         TrialThread = MBPPEvaluator
+    elif isinstance(config.dataset, (dict, JsonlDataset)):
+        dataset = load_dataset(
+            "json",
+            data_files={
+                "train": config.dataset.train,
+                "validation": config.dataset.validation,
+                "test": config.dataset.test,
+            },
+        )
+        TrialThread = PdlEvaluator
     else:
-        print(f"Unknown benchmark: {config.benchmark}")
+        print(f"Unknown dataset: {config.dataset}")
         sys.exit(1)
 
     # Create optimizer instance
     optimizer = PDLOptimizer(
-        pdl_path=args.pdl_file,
         dataset=dataset,
         trial_thread=TrialThread,
         yield_output=args.yield_output,
diff --git a/examples/optimizer/process_bea19.py b/examples/optimizer/process_bea19.py
new file mode 100644
index 000000000..3a01b3e61
--- /dev/null
+++ b/examples/optimizer/process_bea19.py
@@ -0,0 +1,33 @@
+import json
+from pathlib import Path
+
+from datasets.dataset_dict import DatasetDict
+from datasets.load import load_dataset
+
+# Load dataset
+bea19 = load_dataset("juancavallotti/bea-19-corruption")
+if not isinstance(bea19, DatasetDict):
+    raise TypeError(f"Expected bea19 to be a DatasetDict, but got: {type(bea19)}")
+
+# Create validation split from train (1024 examples)
+new_split = bea19["train"].train_test_split(test_size=1024)
+bea19["test"] = new_split["test"]
+
+val_split = new_split["train"].train_test_split()
+bea19["train"] = val_split["train"]
+bea19["validation"] = val_split["test"]
+
+# Output dir
+out_dir = Path("bea19_jsonl")
+out_dir.mkdir(parents=True, exist_ok=True)
+
+
+# Save to JSONL
+def save_jsonl(dataset, path: Path) -> None:
+    with path.open("w") as f:
+        for item in dataset:
+            f.write(json.dumps(item) + "\n")
+
+
+for split in ["train", "validation", "test"]:
+    save_jsonl(bea19[split], out_dir / f"{split}.jsonl")
diff --git a/src/pdl/optimize/config_parser.py b/src/pdl/optimize/config_parser.py
index 27b85510b..ec449ee1c 100644
--- a/src/pdl/optimize/config_parser.py
+++ b/src/pdl/optimize/config_parser.py
@@ -3,11 +3,28 @@
 from pydantic import BaseModel, Field
 
 
+class JsonlDataset(BaseModel):
+    train: str = Field(..., description="Path to the training dataset in JSONL format")
+    test: str = Field(..., description="Path to the test dataset in JSONL format")
+    validation: str = Field(
+        ..., description="Path to the validation dataset in JSONL format"
+    )
+
+
 class OptimizationConfig(BaseModel):
-    benchmark: str = Field()
+    pdl_path: str = Field(..., description="Path to the PDL file to optimize")
+    dataset: str | JsonlDataset = Field()
+    demonstrations_variable_name: str = Field(default="demonstrations")
+    demonstration_columns: list[str] = Field()
+    instance_columns: list[str] = Field()
+    groundtruth_column: str | None = Field()
+    eval_pdl: str | None = Field(
+        default=None, description="Path to the PDL file used for evaluation"
+    )
     num_candidates: int = Field(default=30)
-    num_demonstrations: int = Field(default=5)
-    initial_test_set_size: int = Field(default=10)
+    num_demonstrations: int | None = Field(default=None)
+    initial_validation_set_size: int = Field(default=10)
+    max_validation_set_size: int = Field(default=1000)
     max_test_set_size: int = Field(default=1000)
     timeout: int = Field(default=120)
     budget_growth: Literal["double", "to_max"] = Field(default="double")
@@ -17,7 +34,6 @@ class OptimizationConfig(BaseModel):
     train_set_name: str = Field(default="train")
     test_set_name: str = Field(default="test")
     validation_set_name: str = Field(default="validation")
-    demonstrations_variable_name: str = Field(default="demonstrations")
     variables: dict[str, list] = Field(default={})
     experiment_prefix: str = Field(default="")
 
diff --git a/src/pdl/optimize/optimizer_evaluator.py b/src/pdl/optimize/optimizer_evaluator.py
index 4e809c848..5898087e7 100644
--- a/src/pdl/optimize/optimizer_evaluator.py
+++ b/src/pdl/optimize/optimizer_evaluator.py
@@ -45,10 +45,7 @@ def __init__(
     def get_scope(self) -> ScopeType:
         raise NotImplementedError
 
-    def extract_answer(self, document: str) -> Any:
-        raise NotImplementedError
-
-    def answer_correct(self, document: str, answer: Any, truth: Any) -> bool:
+    def score(self, document: str, ground_truth: Any) -> float:
         raise NotImplementedError
 
     def run(  # type: ignore # noqa: C901
@@ -58,7 +55,6 @@ def run(  # type: ignore # noqa: C901
         answer = None
         exception: PDLParseError | PDLRuntimeError | Exception | bool | None = None
         result = None
-        match = False
         truth = self.example[self.answer_key]
         scope: PdlDict = PdlDict({})
 
@@ -68,6 +64,7 @@ def run(  # type: ignore # noqa: C901
         end_time = None
         total_tokens = -1
         errored = False
+        score = 0.0
         while retry:
             if tries > 1:
                 console.log("RETRYING! ", tries)
@@ -93,6 +90,12 @@ def run(  # type: ignore # noqa: C901
 
                 if isinstance(document, str):
                     document = document.strip()
+                    if document:
+                        errored = False
+                        retry = False
+                    else:
+                        console.log("Empty document returned, retrying...")
+                    answer = document
                 else:
                     raise TypeError(
                         f"Expected document to be a string, got {type(document)}",
@@ -102,24 +105,10 @@ def run(  # type: ignore # noqa: C901
                 runtime = end_time - start_time
                 console.log(f"Runtime took seconds: {runtime:.2f}")
 
-                errored = False
-                if errored:
-                    console.log("PDL error occured.")
-                else:
-                    answer = self.extract_answer(document)
-
-                    if answer is None:
-                        last_line = document.splitlines()[-1]
-                        console.log("Couldn't extract answer: ", last_line)
-
-                if answer is None or errored:
-                    retry = True
-
-                if answer is not None and not errored:
-                    retry = False
-
                 if tries >= RETRY_COUNT:
                     retry = False
+
+                score = float(self.score(document, truth))
             except PDLParseError as exc:
                 console.print_exception(show_locals=False)
                 errored = True
@@ -160,11 +149,9 @@ def run(  # type: ignore # noqa: C901
         if errored and not exception:
             exception = errored
 
-        match = self.answer_correct(document, answer, truth)
-
         return TrialOutput(
             pdl_program=self.pdl_program,
-            correct=match,
+            score=score,
             exception=exception,
             scope=scope,
             pdl_result=result,
diff --git a/src/pdl/optimize/pdl_evaluator.py b/src/pdl/optimize/pdl_evaluator.py
new file mode 100644
index 000000000..f1f9eeeb3
--- /dev/null
+++ b/src/pdl/optimize/pdl_evaluator.py
@@ -0,0 +1,57 @@
+from typing import Any
+
+from pdl.optimize.optimizer_evaluator import OptimizerEvaluator
+from pdl.pdl import exec_str
+from pdl.pdl_ast import ScopeType
+from pdl.pdl_interpreter import empty_scope
+
+
+class PdlEvaluator(OptimizerEvaluator):
+    def __init__(
+        self,
+        # scoring_pdl: str,
+        *args,
+        **kwargs,
+    ) -> None:
+        super().__init__(*args, **kwargs)
+        self.scoring_pdl = self.config.eval_pdl
+        if self.config.groundtruth_column is None:
+            raise ValueError("Groundtruth column must be specified")
+        self.answer_key = self.config.groundtruth_column
+
+    def get_scope(self) -> ScopeType:
+        demo_var = self.config.demonstrations_variable_name
+
+        scope = {}
+
+        for k in self.config.variables:
+            if k in self.candidate:
+                scope[k] = self.candidate[k]
+
+        scope[demo_var] = [
+            {k: q[k] for k in self.config.demonstration_columns}
+            for q in self.candidate[demo_var]
+        ]
+
+        for k in self.config.instance_columns:
+            if k in self.example:
+                scope[k] = self.example[k]
+
+        return empty_scope | scope
+
+    def score(self, document: str, ground_truth: Any) -> float:
+        scope = empty_scope | {"document": document, "ground_truth": ground_truth}
+        prog = f"""defs:
+  scoring:
+    import: "{self.scoring_pdl}"
+lastOf:
+  - call: ${{ scoring.score }}
+    args:
+        document: ${{ document }}
+        ground_truth: ${{ ground_truth }}"""
+        result = exec_str(prog=prog, scope=scope, output="result")
+
+        if isinstance(result, str):
+            result = result.strip()
+        # Note: this breaks if the result is not a number
+        return float(result)
diff --git a/src/pdl/optimize/pdl_optimizer.py b/src/pdl/optimize/pdl_optimizer.py
index b6be331a7..17b4ed011 100644
--- a/src/pdl/optimize/pdl_optimizer.py
+++ b/src/pdl/optimize/pdl_optimizer.py
@@ -68,22 +68,22 @@ class PDLOptimizer:
     # pylint: disable=too-many-instance-attributes,too-many-arguments,too-many-positional-arguments
     def __init__(
         self,
-        pdl_path: Path,
         dataset: DatasetDict,
         config: OptimizationConfig,
         trial_thread: type[OptimizerEvaluator],
         yield_output: bool,
         experiment_path: Path,
     ) -> None:
-        self.pdl_path = pdl_path
         self.trial_thread = trial_thread
         self.yield_output = yield_output
 
         self.config = config
+        self.pdl_path = Path(config.pdl_path)
         self.parallelism = config.parallelism
         self.num_demonstrations = config.num_demonstrations
-        self.starting_validation_set_size = config.initial_test_set_size
-        self.ending_test_set_size = config.max_test_set_size
+        self.starting_validation_set_size = config.initial_validation_set_size
+        self.ending_validation_set_size = config.max_validation_set_size
+        self.max_test_set_size = config.max_test_set_size
         self.max_candidates = config.num_candidates
         self.timeout = config.timeout
         self.budget_growth = config.budget_growth
@@ -293,7 +293,7 @@ def run(self) -> dict[str, Any]:
             self.starting_validation_set_size,
             validation_set_size,
         )
-        ending_validation_set_size = self.ending_test_set_size
+        ending_validation_set_size = self.ending_validation_set_size
         num_iterations = ceil(log2(num_candidates))
 
         validation_set_multiplier = 0
@@ -494,7 +494,7 @@ def run(self) -> dict[str, Any]:
             # reset_usage_stats()
 
             range_end = min(
-                ending_validation_set_size,
+                self.max_test_set_size,
                 len(self.dataset[self.test_set_name]),
             )
             eval_set_indices = list(range(range_end))
@@ -519,7 +519,7 @@ def run(self) -> dict[str, Any]:
             self.pbar.close()
 
             self.experiment_log["final_iteration"] = {
-                "ending_test_set_size": ending_validation_set_size,
+                "ending_test_set_size": range_end,
                 "eval_set_indices": eval_set_indices,
                 "selected_candidates_uuid": winning_candidate["uuid"],
                 "candidate": final_score.to_dict(),
@@ -632,7 +632,7 @@ def evaluate(
                 ),
             )
 
-        matches = 0
+        score = 0
         exception_count = 0
         timeout_count = 0
         exceptions: list[BaseException | bool] = []
@@ -662,10 +662,10 @@ def evaluate(
                     answer = result.answer
 
                 logger.info(
-                    "Answer: %s Ground truth: %s Match: %s",
+                    "Answer: %s Ground truth: %s Score: %s",
                     answer,
                     result.groundtruth,
-                    result.correct,
+                    result.score,
                 )
 
                 if candidate["uuid"] not in self.candidate_results:
@@ -684,16 +684,16 @@ def evaluate(
                 if trial_result.exception is not None:
                     exceptions.append(trial_result.exception)
 
-                matches += int(trial_result.correct)
+                score += float(trial_result.score)
 
-                p_passing = matches / (index + 1)
+                p_passing = score / (index + 1)
 
         end_time = time.time()
         runtime = end_time - start_time
 
         logger.info(
             "Matches: %s Accuracy: %.2f Exceptions: %s (%s timeout, %s other) Total: %s",
-            f"{matches:,}",
+            f"{score:,}",
             p_passing * 100,
             f"{len(exceptions):,}",
             timeout_count,
@@ -712,7 +712,9 @@ def evaluate(
         )
 
     def benchmark(self, test_set_size: int, candidate: dict | None = None):
-        if self.num_demonstrations <= 0:
+        if self.num_demonstrations is None:
+            demo_size = 0
+        elif self.num_demonstrations <= 0:
             demo_size = len(self.dataset[self.train_set_name])
         else:
             demo_size = self.num_demonstrations
diff --git a/src/pdl/optimize/util.py b/src/pdl/optimize/util.py
index aceb0d3ff..d331f49d1 100644
--- a/src/pdl/optimize/util.py
+++ b/src/pdl/optimize/util.py
@@ -20,7 +20,7 @@ class TrialOutput:
     pdl_program: Program
     scope: ScopeType
     runtime: float
-    correct: bool = False
+    score: float = 0.0
     exception: BaseException | bool | None = None
     pdl_result: Any = None
     pdl_document: str = ""
@@ -32,7 +32,7 @@ class TrialOutput:
 
     def to_dict(self) -> dict:
         return {
-            "correct": self.correct,
+            "score": self.score,
             "exception": str(self.exception),
             "pdl_document": self.pdl_document,
             "answer": self.answer,
diff --git a/tests/test_examples_run.yaml b/tests/test_examples_run.yaml
index 6ef48a317..9250488ed 100644
--- a/tests/test_examples_run.yaml
+++ b/tests/test_examples_run.yaml
@@ -39,6 +39,8 @@ skip:
   - examples/optimizer/mbpp.pdl
   - examples/optimizer/fever.pdl
   - examples/optimizer/gsm8k.pdl
+  - examples/optimizer/bea19.pdl
+  - examples/optimizer/eval_levenshtein.pdl
   - examples/requirements/email.pdl
 with_inputs:
   examples/tutorial/programs/chatbot.pdl:
diff --git a/tests/test_optimizer.py b/tests/test_optimizer.py
index 1df9b0834..4ceef96e0 100644
--- a/tests/test_optimizer.py
+++ b/tests/test_optimizer.py
@@ -17,11 +17,14 @@ def test_gsm8k_cot():
     pattern = "cot"
     num_demonstrations = 3
     config = OptimizationConfig(
-        benchmark="gsm8k",
-        initial_test_set_size=1,
+        pdl_path="tests/data/optimizer_gsm8k.pdl",
+        dataset="gsm8k",
+        demonstration_columns=["question", "reasoning", "answer"],
+        instance_columns=["question", "reasoning"],
+        groundtruth_column="answer",
+        initial_validation_set_size=1,
         max_test_set_size=1,
         num_candidates=5,
-        num_demonstrations=num_demonstrations,
         parallelism=1,
         shuffle_test=False,
         test_set_name="test",
@@ -349,7 +352,6 @@ def test_gsm8k_cot():
         },
     )
     optim = PDLOptimizer(
-        pdl_path=Path("tests/data/optimizer_gsm8k.pdl"),
         dataset=gsm8k,
         trial_thread=Gsm8kEvaluator,
         yield_output=True,
@@ -375,11 +377,14 @@ def test_gsm8k_cot():
 
 def run_optimizer_gsm8k(pattern, num_demonstrations=0):
     config = OptimizationConfig(
-        benchmark="gsm8k",
-        initial_test_set_size=1,
+        pdl_path="tests/data/optimizer_gsm8k.pdl",
+        dataset="gsm8k",
+        demonstration_columns=["question", "reasoning", "answer"],
+        instance_columns=["question", "reasoning"],
+        groundtruth_column="answer",
+        initial_validation_set_size=1,
         max_test_set_size=1,
         num_candidates=1,
-        num_demonstrations=num_demonstrations,
         parallelism=1,
         shuffle_test=False,
         test_set_name="test",
@@ -708,7 +713,6 @@ def run_optimizer_gsm8k(pattern, num_demonstrations=0):
         },
     )
     optim = PDLOptimizer(
-        pdl_path=Path("examples/optimizer/gsm8k.pdl"),
         dataset=gsm8k,
         trial_thread=Gsm8kEvaluator,
         yield_output=True,
@@ -724,11 +728,22 @@ def run_optimizer_gsm8k(pattern, num_demonstrations=0):
 
 def run_optimizer_fever(pattern, num_demonstrations=0):
     config = OptimizationConfig(
-        benchmark="fever",
-        initial_test_set_size=1,
+        pdl_path="examples/optimizer/fever.pdl",
+        dataset="fever",
+        demonstration_columns=[
+            "question",
+            "reasoning",
+            "reasoning",
+            "traj_keys",
+            "traj_values",
+            "rewoo_traj_keys",
+            "rewoo_traj_values",
+        ],
+        instance_columns=["claim"],
+        groundtruth_column="label",
+        initial_validation_set_size=1,
         max_test_set_size=1,
         num_candidates=1,
-        num_demonstrations=num_demonstrations,
         parallelism=1,
         shuffle_test=False,
         test_set_name="test",
@@ -1064,7 +1079,6 @@ def run_optimizer_fever(pattern, num_demonstrations=0):
     )
 
     optim = PDLOptimizer(
-        pdl_path=Path("examples/optimizer/fever.pdl"),
         dataset=fever,  # pyright: ignore
         trial_thread=FEVEREvaluator,
         yield_output=True,
@@ -1080,11 +1094,18 @@ def run_optimizer_fever(pattern, num_demonstrations=0):
 
 def run_optimizer_mbpp(pattern, num_demonstrations=0):
     config = OptimizationConfig(
-        benchmark="mbpp",
-        initial_test_set_size=1,
+        pdl_path="examples/optimizer/mbpp.pdl",
+        dataset="mbpp",
+        demonstration_columns=[
+            "prompt",
+            "traj_keys",
+            "traj_values",
+        ],
+        instance_columns=["claim"],
+        groundtruth_column="canonical_solution",
+        initial_validation_set_size=1,
         max_test_set_size=1,
         num_candidates=1,
-        num_demonstrations=num_demonstrations,
         parallelism=1,
         shuffle_test=False,
         test_set_name="test",
@@ -1103,7 +1124,6 @@ def run_optimizer_mbpp(pattern, num_demonstrations=0):
     )
 
     optim = PDLOptimizer(
-        pdl_path=Path("examples/optimizer/mbpp.pdl"),
         dataset=mbpp_dataset,  # pyright: ignore
         trial_thread=MBPPEvaluator,
         yield_output=True,

From ff19fe5ffaafd154c71e337fb352f034cbe8c112 Mon Sep 17 00:00:00 2001
From: Louis Mandel 
Date: Mon, 11 Aug 2025 18:33:54 -0400
Subject: [PATCH 107/107] tests: map-based gsm8k (#1107)

Signed-off-by: Louis Mandel 
---
 .../{gsm8.pdl => gsm8k-loop-fission.pdl}      |  10 +-
 examples/gsm8k/gsm8k.pdl                      | 105 ++++++++++++++++++
 src/pdl/pdl_dumper.py                         |   2 +
 src/pdl/pdl_interpreter.py                    |  11 +-
 tests/test_examples_run.yaml                  |   3 +-
 5 files changed, 119 insertions(+), 12 deletions(-)
 rename examples/gsm8k/{gsm8.pdl => gsm8k-loop-fission.pdl} (95%)
 create mode 100644 examples/gsm8k/gsm8k.pdl

diff --git a/examples/gsm8k/gsm8.pdl b/examples/gsm8k/gsm8k-loop-fission.pdl
similarity index 95%
rename from examples/gsm8k/gsm8.pdl
rename to examples/gsm8k/gsm8k-loop-fission.pdl
index 5f43320f3..ce70d580f 100644
--- a/examples/gsm8k/gsm8.pdl
+++ b/examples/gsm8k/gsm8k-loop-fission.pdl
@@ -18,6 +18,10 @@ defs:
   # How many problems to evaluate.  The entire dataset is 1319 problems.
   # MAX_ITERATIONS: 1319
   MAX_ITERATIONS: 50
+  # Which model to use
+  # MODEL: ollama/granite-code:8b
+  # MODEL: ollama/granite3.2:8b
+  MODEL: watsonx/ibm/granite-3-2-8b-instruct
 
   # PDL variables that hold statistics
   SUCCESSES: 0
@@ -29,8 +33,7 @@ text:
     TEST: ${ TESTS }
   repeat:
     # Ask the LLM for the answer
-    # - model: ollama/granite-code:8b
-    model: ollama/granite3.2:8b
+    model: ${ MODEL }
       # First, get LLM to answer the question
     input: |
       Question: ${ TEST.question }
@@ -51,8 +54,7 @@ text:
     LLM_FULL_ANSWER: ${ ALL_LLM_FULL_A }
   repeat:
     # Next, get LLM to convert its answer into a single JSON key/value
-    # - model: ollama/granite-code:8b
-    model: ollama/granite3.2:8b
+    model: ${ MODEL }
     input: | # 'input' is the prompt
       Generate the final answer from the conclusion of this text as JSON with a single key named answer.
       ${ LLM_FULL_ANSWER }
diff --git a/examples/gsm8k/gsm8k.pdl b/examples/gsm8k/gsm8k.pdl
new file mode 100644
index 000000000..be8c1ef5b
--- /dev/null
+++ b/examples/gsm8k/gsm8k.pdl
@@ -0,0 +1,105 @@
+#!/usr/bin/env pdl
+
+# Grade School Math https://github.com/openai/grade-school-math is an
+# open source AI dataset from 2021.
+# 
+# https://github.com/openai/grade-school-math/blob/master/grade_school_math/data/test.jsonl
+# is a file with 1319 questions and answers.
+#
+#
+
+description: Grade School Math
+defs:
+  # The Grade School Math Dataset
+  ALL_TESTS:
+    read: ./test.jsonl
+    parser: jsonl
+
+  # How many problems to evaluate.  The entire dataset is 1319 problems.
+  # MAX_ITERATIONS: 1319
+  MAX_ITERATIONS: 10
+  # Which model to use
+  # MODEL: ollama/granite-code:8b
+  # MODEL: ollama/granite3.2:8b
+  MODEL: watsonx/ibm/granite-3-2-8b-instruct
+
+  # PDL variables that hold statistics
+  SUCCESSES: 0
+  FAILURES: 0
+  TESTS: ${ ALL_TESTS[:MAX_ITERATIONS] }
+  SOLUTIONS:
+    defs:
+      stats:
+        function:
+          r1: { success: integer, text: string}
+          r2: { success: integer, text: string}
+        return:
+          data:
+            success: ${ r1.success + r2.success }
+            text: ${ r1.text + "\n\n" + r2.text }
+    for:
+      TEST: ${ TESTS }
+    # maxWorkers: 10
+    map:
+      defs:
+        # First phase: ask LLM the Grade School Math questions
+        LLM_FULL_ANSWER:
+          model: ${ MODEL }
+            # First, get LLM to answer the question
+          input: |
+            Question: ${ TEST.question }
+            Answer: 
+        # Next, get LLM to convert its answer into a single JSON key/value
+        SIMPLIFIED_LLM_ANSWER:
+          model: ${ MODEL }
+          input: |
+            Generate the final answer from the conclusion of this text as JSON with a single key named answer.
+            ${ LLM_FULL_ANSWER }
+        # Third phase: Compare with Grade School Math ground truth
+      lastOf:
+        # Convert the JSON string to JSON.  (We do this in a separate step so
+        # we have access to the original for debugging.)
+        - data: ${ SIMPLIFIED_LLM_ANSWER }
+          parser: json
+          def: JSON_SIMPLIFIED_LLM_ANSWER
+
+          # Strip off any prefix or suffix off the number (dollar signs, units, etc)
+          # and place it in of the JSON format { "answer": ... }
+        - data: ${ JSON_SIMPLIFIED_LLM_ANSWER.answer|string if 'answer' in JSON_SIMPLIFIED_LLM_ANSWER else ("MISSING 'answer' in " + LLM_FULL_ANSWER) }
+          parser:
+            regex: "[^0-9]*(?P[0-9]+).*$"
+            spec:
+              answer: string
+          def: EXTRACTED_SIMPLIFIED_LLM_ANSWER
+        # (In case the simplified answer did not contain digits.)
+        - if: ${ EXTRACTED_SIMPLIFIED_LLM_ANSWER == None }
+          then:
+            def: EXTRACTED_SIMPLIFIED_LLM_ANSWER
+            data:
+              answer: "none"
+
+        # Extract the expected answer, which in this test data always follows "#### "
+        # into { "answer": ... }
+        - data: ${ TEST.answer }
+          parser:
+            regex: "(.|\n)*#### (?P([0-9])*)\n*"
+            spec:
+              answer: string
+          def: EXTRACTED_GROUND_TRUTH
+
+          # Did we get the expected answer?
+        - if: ${ EXTRACTED_SIMPLIFIED_LLM_ANSWER.answer == EXTRACTED_GROUND_TRUTH.answer}
+          then:
+            object:
+              success: 1
+              text: |
+                LLM got right answer for '${ LLM_FULL_ANSWER }' which was simplified to '${ SIMPLIFIED_LLM_ANSWER }' which was extracted to '${ EXTRACTED_SIMPLIFIED_LLM_ANSWER.answer }'
+          else:
+            object:
+              success: 0
+              text: |
+                WRONG! Wanted ${ EXTRACTED_GROUND_TRUTH.answer} } / LLM said '${ LLM_FULL_ANSWER }' which was simplified to '${ SIMPLIFIED_LLM_ANSWER }' which was extracted to '${ EXTRACTED_SIMPLIFIED_LLM_ANSWER.answer }'
+    join:
+      reduce: ${ stats }
+text:
+  Finished, ${ SOLUTIONS.success } successes on ${ MAX_ITERATIONS } tests
diff --git a/src/pdl/pdl_dumper.py b/src/pdl/pdl_dumper.py
index 52d087c71..54effbf3c 100644
--- a/src/pdl/pdl_dumper.py
+++ b/src/pdl/pdl_dumper.py
@@ -259,6 +259,8 @@ def block_to_dict(  # noqa: C901
                 d["for"] = expr_to_dict(block.for_, json_compatible)
             if block.index is not None:
                 d["index"] = block.index
+            if block.maxWorkers is not None:
+                d["maxWorkers"] = expr_to_dict(block.maxWorkers, json_compatible)
             d["map"] = block_to_dict(block.map, json_compatible)
             if block.maxIterations is not None:
                 d["maxIterations"] = expr_to_dict(block.maxIterations, json_compatible)
diff --git a/src/pdl/pdl_interpreter.py b/src/pdl/pdl_interpreter.py
index e47a388d3..407f8b3be 100644
--- a/src/pdl/pdl_interpreter.py
+++ b/src/pdl/pdl_interpreter.py
@@ -193,17 +193,15 @@ def with_role(self: "InterpreterState", role: RoleType) -> "InterpreterState":
         return self.model_copy(update={"role": role})
 
     def with_id(self: "InterpreterState", n: str) -> "InterpreterState":
-        stack = self.id_stack.copy() if self.id_stack is not None else []
-        stack.append(n)
-        return self.model_copy(update={"id_stack": stack})
+        stack = self.id_stack if self.id_stack is not None else []
+        return self.model_copy(update={"id_stack": stack + [n]})
 
     def with_iter(self: "InterpreterState", i: int) -> "InterpreterState":
         return self.with_id(str(i))
 
     def with_pop(self: "InterpreterState") -> "InterpreterState":
-        stack = self.id_stack.copy() if self.id_stack is not None else []
-        stack.pop()
-        return self.model_copy(update={"id_stack": stack})
+        stack = self.id_stack if self.id_stack is not None else []
+        return self.model_copy(update={"id_stack": stack[:-1]})
 
 
 class ClosureBlock(FunctionBlock):
@@ -961,7 +959,6 @@ def process_block_body(
             block, max_iterations = _evaluate_max_iterations_field(scope, block, loc)
             block = _evaluate_join_field(scope, block, loc)
             map_loc = append(loc, "map")
-            iidx = 0
             try:
                 if max_iterations is not None:
                     index_iterator: Any = range(max_iterations)
diff --git a/tests/test_examples_run.yaml b/tests/test_examples_run.yaml
index 9250488ed..9f2ee20b0 100644
--- a/tests/test_examples_run.yaml
+++ b/tests/test_examples_run.yaml
@@ -13,7 +13,8 @@ check:
 skip:
   - examples/demos/react.pdl
   - examples/cldk/cldk-assistant.pdl
-  - examples/gsm8k/gsm8.pdl
+  - examples/gsm8k/gsm8k.pdl
+  - examples/gsm8k/gsm8k-loop-fission.pdl 
   - examples/gsm8k/gsm8k-plan.pdl
   - examples/gsm8k/gsm8k-plan-few-shots.pdl
   - examples/gsm8k/gsm8k-tot-few-shot.pdl