From 39792f4360fa58cbf7042bcd5bbdbc89ea1f24cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jim=20Liu=20=E5=AE=9D=E7=8E=89?= Date: Wed, 15 Apr 2026 21:33:56 -0500 Subject: [PATCH] feat(baoyu-diagram): add SVG-to-PNG @2x conversion script and consolidate references --- bun.lockb | Bin 131320 -> 143224 bytes package.json | 3 +- skills/baoyu-diagram/SKILL.md | 759 +++++---------- .../baoyu-diagram/references/architecture.md | 74 ++ skills/baoyu-diagram/references/class.md | 360 -------- .../baoyu-diagram/references/design-system.md | 158 ---- .../references/flowchart-phase-bands.md | 278 ------ .../references/flowchart-poster.md | 203 ---- skills/baoyu-diagram/references/flowchart.md | 678 +------------- skills/baoyu-diagram/references/glyphs.md | 633 ------------- .../baoyu-diagram/references/illustrative.md | 492 ---------- .../baoyu-diagram/references/layout-math.md | 552 ----------- .../references/patterns/README.md | 38 - .../references/patterns/agent-skills.md | 92 -- .../patterns/contextual-retrieval.md | 98 -- .../references/patterns/message-bus.md | 73 -- .../patterns/multi-agent-research.md | 84 -- .../references/patterns/shared-state.md | 64 -- skills/baoyu-diagram/references/pitfalls.md | 323 ------- skills/baoyu-diagram/references/sequence.md | 337 ++----- .../references/structural-matrix.md | 113 --- .../references/structural-network.md | 168 ---- skills/baoyu-diagram/references/structural.md | 871 ++---------------- .../baoyu-diagram/references/svg-template.md | 258 ------ skills/baoyu-diagram/scripts/main.ts | 100 ++ 25 files changed, 586 insertions(+), 6223 deletions(-) create mode 100644 skills/baoyu-diagram/references/architecture.md delete mode 100644 skills/baoyu-diagram/references/class.md delete mode 100644 skills/baoyu-diagram/references/design-system.md delete mode 100644 skills/baoyu-diagram/references/flowchart-phase-bands.md delete mode 100644 skills/baoyu-diagram/references/flowchart-poster.md delete mode 100644 skills/baoyu-diagram/references/glyphs.md delete mode 100644 skills/baoyu-diagram/references/illustrative.md delete mode 100644 skills/baoyu-diagram/references/layout-math.md delete mode 100644 skills/baoyu-diagram/references/patterns/README.md delete mode 100644 skills/baoyu-diagram/references/patterns/agent-skills.md delete mode 100644 skills/baoyu-diagram/references/patterns/contextual-retrieval.md delete mode 100644 skills/baoyu-diagram/references/patterns/message-bus.md delete mode 100644 skills/baoyu-diagram/references/patterns/multi-agent-research.md delete mode 100644 skills/baoyu-diagram/references/patterns/shared-state.md delete mode 100644 skills/baoyu-diagram/references/pitfalls.md delete mode 100644 skills/baoyu-diagram/references/structural-matrix.md delete mode 100644 skills/baoyu-diagram/references/structural-network.md delete mode 100644 skills/baoyu-diagram/references/svg-template.md create mode 100644 skills/baoyu-diagram/scripts/main.ts diff --git a/bun.lockb b/bun.lockb index 0741acf8e049c0d43f3a176432a5951288caf241..88db0bebb0a4b9f52ef0dc7e6ba0ac4ff50751b6 100755 GIT binary patch delta 31713 zcmeHwcU%i3dRE)CikMw< zTC^Fi%Fb7dMUQypkE$m@Y>LCebYFH}?o{AEyE z(EUUWNUTD_22=p844Ny`zB27BQ-4rv=?MiYM()C#myX_cxRXjW!& zQVe8g0f>x;WtthE(%%rDp;AqNKm$de%t1-yxt*m{Z~-V8WT0h1N69o5lnf07rHCb^ zCdOwZWo0I1MrUM14^&yo^7QDwX)vcsPKqa@vMn#wa|(q@pGeHkP zL56i`J{eArOK_pKD<0f{9JY-|K`CMbQKlkjR(3{eT-tzC7cdow&&+{FrAo+*?;oF< zmAMUavgZeH&<10CW=wWca-8aXWyGHf>_gni&>B$k_(xEZj{v1UOOxeYK=IG0!;SL0 zgHo4N2c`U_L8<%;2$3}2044q?C^dMaEMEXhcbcq$m~z}E9#jxmfbs1 zrMm0LN|kUjFo-GO1+}H-4jPb@6$|xTCrRG8jx-mXL8)Vnkkg!5>@3YWm%5T$Q^1q^ zy+GYTTZ7UZ+Feg_zZc3mfY*akI5wg_wBBI!fq>#y50v~LBe(NG1Ia*)i%JC-j9ox! z3Osa`Iy?!K;(HRbDrg=kHDHshH-J)wVW8BpO+f8H13V-LYKzo>*^dNec!_2cEd-^2 z#l^>D_eNY(GI7J@0s|E9eV$T7vd~a!c>BguB+h}tDPyvi}&d7{MBa{Ks5poK3ASiY5o2JsD@eGs(%A95@RSWXS6B%e3asn+2nw=V#6q}?{ zb(cK|k!hbymx0kK$*Sm#-eO%#TChH5PKNV-lD#y4DS%@FR4R0)F#(i%pe-l`v=%4@ zNDW#8^fK~elo+EysoDpvq!8jiYDi9l+ zmYte~NM~Zss32=ARrIlqG&CNA(iFTT)1#nRr;J-=T1788vK%}G>_h zL6UwN%lm+eJ(ii7nKdvuzFDx;pj)8i z$$C)o>w+xg*F{-mP=;z6L>u^yY zYn%)LRoFaID&PT1F*+jCT`~>nBIR2QY6*RMbXKBE-}r$85|e0bqk-``G#i|dpDNUX zQfSqYtdxblp>B6cY!6E2`(&o2CL|@t$EWtoPRfYSsMSNt-bbcSBcw=M_mm>}8uGFz zr}&$Y=@Orll@Xnglp5!fov!NEOR^gx({z{QwAkpZc+jMjq%4Cf-6bo70=W@}Y3!K8 zFd0-wOMa&(C6HRxJ2@>T2B}SuQ$ttE`q&t$fy+TDurV3YvDB9}VkLP3DB0TrO8S)e zjNb8Bp(2sLw8|4(d8P~5RxON^3bcWO2CFloRuR-k=8fPffTa^ySB<@a!%{}}l6t46 zWk8jg9Gyw=J`X?aAXgTJSe&im;jRK|W z(_PRFS@9X^E-BIJu=_qqijTZz7>X8+I252U-5HbyjJeF;>njo~)Z{pjeE^76mulh;{b=7JqrT0dkTc0>(*PI6}4&{G1 z)y;7C&Z4K0SEiS3x5-9Z_4W8Wjmn*$UB*G9?$X?U`Sz%X3x_B4-+pWQ`36%gx4ao2 zP;=PXS=k+)=kHE%&9)i*DCSw25zF(_m$cY2eDLq{_r7ZIYR%!t`T7A|yU;%`m(M-P z*XcNdANpkM*vl5J`whRo$NIy_3yHUr7Uq}TQlY|ky7^aDX!C8hze;>P#HjY$)ViuF z#PMX_W=rd~cfu{F)w;DIuT-M>hVm8u;w>8?5Qv9(IkFoz-kKIAFqk3b*q(NNn#JHS zGG)#}ZOZiphfyx;j)TJ_lDYb3rrfwsxCh`cE#;iLk}6fVB5r{xXY~#o)&ry5K$X}+ zt4`)BRi`hc%f6J>^(hY_R>;o`1Y4+7Azw)6eO3D8tI`%2v0qx41SwYT&uY8;RcSqp z@t`mA_W!DM?^mT|vCQbcun-Gr3rIORW*X*R+1qLXq*zppyezd~0bV{9a#o&2$M|Wi zuy{0~f^0!;KR%)iTM?ntjE4}11f!bWu=e8%%dmFVI^NlmO#|6v$qKD?8Z)e3t;BLx zu6}&mvaC;K9Y3)w>l&lukCkO_D(lQjW8V9)p)P?Ifk=5FGwb)E?cB%fNXsOV>b)LQ0w1Dr3ct+Ucyq zuuKO)jfclkV za8dIDoDVp2w#Uhj_p8WCX?0fPv2-uGae_6AkjiFQj%;2Qo*9^c9GT%r)$Yrf25>F?5ZjnIVNV%=s=)s%dxNJ;s&DKeh7Cu6+Mo|USt(=5QEO+!M(qWk)D_G~s}uGnd4 zOz|`hG#TKUfiq*Ajh|*UI4S%zB=1&d+njWo1~rrd>+1RO=`~opIy%iV2>ns6gjnuA zI1jO&&^msaDh`TGbfTsgIA5{8ewFwQ=Md6(6I*6hzm`hn$t<;jnqEjz zi`6s-HS=AvPDR_4U{sWHbcMmnB3)bqCh<0dkcu`jr`;7T*ZLUSHmCsBt<&aZT0 zgIsi)>rUt&2+hQ~-o6ei<*L&xt|PUyB+YfRd*Gtj73)B=1J3w3fDH`|)cDm!XDaoW zjRzM-IW$+08mGuLz3WMfHqQ`D%~^0Eiq5QNeVo=ss}qq5VXNw)G*T1{HOqDJ(^PIC z%{3_mao}1(S3(TPGH?OlB+ob(r5;4qY!tXuu{D1pMV+Y@XR8{svO74QESN=s>m=5{ z5viVH{t5_Pn3&^_D*kFP-Ng(ANQq6=)N@yM-0QZZs}_0elII@D}kupi&Ula=z;@!xy0FmIjaICRJ;xAh~qVCLcz$fq=B z^?Y=iH+a^|5Y-e|BPI<6mSZ%YPl2P6BXWE-Z`Q7fPSYKOlI)chdtxOxDqtawiy9c= zQe@#Z=fnE=>NGzj*vq643t0fT9 zjKuCIUZuq?;69{eLL4<#UT~FWG)_O_RhD*9KBWbl?XNRi3uQC*zH*?(&QJ19+8#Uj zv5bI8R@WiK5H#Z8AYPSd|IyU;mlhl`t7bGf8d73xHLEbFv%raCRO5ig^$|ImzvIEh zh#YnLV{p-KqwVb%V z%mo)FcG451XjKtQYkb>DoVnPx(cth;)}4|$=xqJ0YU!njnu}3ZsW9|0_@W?1wHP#5 z3(b~+^JhI`0{Q29R!qbDi6>LcLBi5kksRiuLpL(;Njyi;m=k8m9#s$7)d*3QiibWQ^}1 zEl4HA&7vnbavmoh1b+p%Fp;B9tB9DAPF$s}dVxdl8+lWA`2`_tMX-*)9KxOl>oiuO z%GN_25eUwQ_7#3~C_CCgXY~sN)E}}1l_ia84Tl=3dD7C+IgI6p=rlWugr}SPTXd9q z0f#6Y@p^P*gFZ|M?>wUeTFFir3}VNIBSlfLqZP_(5;$7CmF}t_PN_?s zSiO!qD;s>w;0dLL+_VZbCwYBmwymR1GZRXTFhmpED}SvsYu8CCtMsQ zF&6HEBl}qWy!dppr#R;j0H29^JGE3&n zL~qxE!lC#%<8r@09wwZ=l6u2p&|Ya7O* zSpv8gVy`Zu6mm%;{U$gnBSp4KlvGAMx0!{2!%-dQn&C)M87Wr*I9hO|lZ<7wGnevv`l^|Dz`xEXO$8oFRv>3!gTiL*T=9GQ98{dC~0&_ z2f=!=^131Jido>OF;eLEfb#_>tv+wTQ8|v~cJ<>M#?dp4CM8aZ3!O$+fx~u#Heq?T zdH~Lk3doH>OVNs^@oZ46PBS51Qu5-&KL*ZUw2gsaRwaS9EZXa%64>lGorXa`yQUPQ zBjBWQNJq0$z0pXqFIpi*4Mbl=`Dt>%d4LlmX|@7f2<=i zwvSv;>_r_oYNgbRIpC;X6&;5(o54|=ux?iNGkZkk#Eqm@UuA00CKv~fI!RhHmlo-0 zM!f{rMzpu5qo2kvS;{HSHj4@1=rK+{*J~`mQ(UCSx*91`UTKl*n!*Mp>ojX1q+Y^4 z=j~_q6kK;^=^e=HQ(0Jw&TM%q9nnrS57fLwDiRr`Q_Z9_$q$uyHro%5+N8z?RlLQN zNmq{B2(CpixG3Z)j(=JZbF)<&N+a4;0Vja2|Cf}8X&r#5vrOyCv>qrfgNhQAp}tHT z$kYXtE~2EzswQ4UiEk)V%x00txml#>d-3`wszwfs1C<)}Q&+3ZfdGImQ%V)J6s7-r zl*$Fl<%kmBN~Smti5F20_0#SkUPP&7?Ic#DR8S8P4U*+ViEl6SL`wi6GEbEB*p0=D zXcYiMSG-Iq)&Et+e@HIY|9{nhl4xl^YAr6J6v1p_a1o_Q^d|-vQHs<+nGT`;r)!8r zKA~oi6wfs#QB zP%@;Un@lNLO6G}DK1)#Qno2TH-=UyOqAYb-NtQg!!a&2Q8dTKlj&c@LN>w|_@_&bx zMt*nXr`RP`Zdx zCrp#&f=uUvQu#bky7I~>2~ca+!`RS@{Mjl?iSlff(MFsuJ7uXUrQEwACsl#0H>ITC z3pvsKpw!4Cpp^9}-DFCQ`bFl6QvOpi589IQi2{xwaHK)pgt`KDUUGDJ5^?M)VGDv~+(YMyAvxj&3rg@@nvu#Y~o)Qj(XHPChLik6?>UhmuU@I zZ%WB-Em>|#X*ky7=}&f2LhONt$jGy51FMVC^^}X5QmVEwJyA;f$kbPs6Qz7j zWu7SU&19Y^@y%u4gi7l=3CMqcIb(pFktq4~oy>oYlBzXsG`)gBsiF>Yexj5NmE~cw zoG9h%$fJH5k&&{Xi=2TdW#}r?ZnB&xHK-RT1vVa(=6Q-N?rJtQQ|5L|J13iO?7f}kWbl&_=9XHYctxzdN;5&dWqQvWn z!9|oB_CIpmr19SupzHq!73bgoM8z~a{*B|NSpQefn_@sdIcAcCj-NDLa{=n2;Q(D< zqyOGy>V^QL6?fBv{B*Dszs$s^^w`JXy&8g9#;5~T**0ccJ74;?p4O6N`1W0=i< zkC*>FUSi;h$4pvp|9iZYj+_5IUSd6>rRl%N%m3};r3EeJxJI#cBeD#>Putw?HZ<}# zK4s9aFZR`FX2aLtd$VBM+_VOjuU>Vw?D2Mf*UTli^y|hNBMwa}n{#QCCahe^{`~^% z16!!?<=)vW_Jdmd^g*^O8dqC)GT&Y%yTQ=3w$!}?G{_E=HQ%Cng@8X{YeXK#FUAfe+wq=wI zK6Yz#n_gu;b{=zm`r?oIK|PPRn)@Iqu-$}Z7k=`sW8)LMz2u~smHz&voJXm=NzJ3; z8Y~X3GqFz}KCn@KwMO0ILbE%TI8%7Y!&Wq`7LSE=9#Jm! zFUxK%+}L$v#DTo`Wu}(Rp7?fDoZY#KeL}xq`J?lX2Hl5s7k3S=uPrgxpFceQlIqUU zCI=pz%5Iuh>TS1k$L2ph(CenuVxA&FCn)7oujn&0e8=?`C7kW%PTsZAd_{Y&?al>f z|EeGKcw6vtUtx6TQ~S<4q>c}6H_37QhdSLyZr@PVy5xwZ=IOPTb#r<<^#Iw$7pBEf z(36sKsVf~@Q^on1W$w1=X>;D|pO5QYdHWQP?T>%IcqQ!lAeXUGV~>pTd%84#MCa-r zNp?@()$rYM^p{Rmt?N%2rrB;cs@x(u64YRN5K=DnV4Iq~3a+gkqxmf;yT0$M?+(m6 zXSmn$uQ#hLD|I;3-@4Ra4POT*Js!KX@WkK4F5jFwsAgKn!`3I?dtBM^v0=WhZQL3u z67)?+@dLdg!@rLB@t)1O(V=U5J^F2T?9i+2J=|`kg@sri4L`Ckg7v9h>fM~A@jcs> zzBBFn#UJO|&6yMZN2?Q2z1yDYZ}42XYR18OvSDg5oe`Bwy>V{L*zHc$PWm4T|MTkT zNm15T?fZ>w)o4V?WoZLL@6TIznq#)9PC@^l zCQA+G#R${Wn{ug>!GrwYUpfD$ zNfv9JJICLc_;O3dazkJ2xt%?@TKDrimY4D8ycgZQRC!ZD@M1&suE4Cex6fvFX_42| z;mRiZJO}^8X-5yK%B6NH=hnD+P)Co3Bdz*{*ZZl0^@ysz>t|1V6tUxN!oe9SEYKyZ zZNf<1>ZXgAuCk3em$T>ZW}Sx5?OG=`zlpwIpDTYzcEw1PRg8if)b}DaTQ;1nyZXWR zBMQS$mYk_w_Vh*5j~g%gu9^E|Mw@EWX73o;TJ_=W;LQHowgdWGtjO|vcD8o)v9k`> z+;wt`+kpXcBxp>~$8*Z19@jVIO01^G2HP9&y1n}?>3(|0#@)g-Ej_ywRy}Gn+Ax3i zfRzz{gc(XSJ+^s&aJ|fzzn?7_SM|e{vWG@(9yZ}&x!@q z{eAS>*s4dCmd@|N&MnxmVdID@(W%`^@4OJUxYpy@Pj<$o=%((Pxb0oCr)urk7lYD& zo#ov$%lWO_6Dbnnbha{Ce^lxpOSfc!SL(h>ymEc3$L3S{&YD8=>{8}ELXK2PY4c&F z&6*9zx?DU^x~aWy#cdwF9{WW0E-1;n%`Dg$zHDA_t(-}sVQD%`pX^9YRzGcaui*TO zZcAL&y*X&>=4)nW(I!t-F)Z=4c~WD;s1t63H@|J&aplW9K^x*0pRE1pK)Kr|2E_@L zcGtJ=(&zZVzx!;FBSBH9sDuGjoxG?~;t!GUx0Y)%WZa>t*4ySioVucBd53MDn;Y!a zxHOqr*yCOW?)r@H=emuJc=>+vq+bUWZgcRq?pAVtWV6iF`U$X$&zdZ-1d0D=q{y_| zx>v%-4GB4Qr)k|@PoBJG(V1qYek|;EGtG6><@W779ak=F`^>J+p*CTO3lDXj?X=gi zx6ZYRWvy2w3({ctGeY*4otCpvwL>uZq5dWiGDw6 zW2W?&)}?S*V>>4|`{#eH?ZS1Pa?4p)D(%qaq1#X0UO#R56u106BP#?}lnqmZE1MdA zn-=MDbmpaxJu9`D@p8b5u7k(->+L#hg3aJE6+B12=~%KysQ*um2ANGbFy{Td-9bm@ z+_d{{(7^dz_ya?i-i1@+|Y{f$p6L4N>*I8S2OJkGa^q7pwKG z%iOAi%m<}D3fOG-*l|GD($!{nsD1He6MmPO>gK-7XEryyu*&L+|~*aJOFbAaci^{RNF3lJ@jE=yQJ6o$HHEl=A!a$%a-_jXF`sw!_MG_Ih0$o&Bo*qIt`a*kD~9TyvWXz%i>>dDntb`SB7SX6D%w5csM ztjy)<2|a%wv8mUn+F`ycmTjJ#(k>~eiN?25)!p_Nb=}Y3aXjI$U2O4(a%7l3y;Uyt zmEaa`qsBP)UcbG2omt)U#!O$F`*(?->-@zEs=8J*+kb!gIGZ=~HVwadeC(XR)>_@0 zdnPt4=~cd0re@EM!gu3+8?yHkYz=u+Q(xwuO1n9||Lq_AcRiaoYsHVR$FIHaH`iiN z+5+>ls*!oC{ARusIxh7t$UFCEW-Z?vCtD2;>z@C^%QIYG&)xJPG^dgpr&U@8sxEoq zZ}qK7e-85Q=J5K((=xe(-L1^J_t{#>cdG5`yL-+&d^Yz=))C7$Rc>x~G_T$GeE<06 z33hXWV?K;|J8qKGFU|p*IJSDCO;G!*Z+_bH`pM+SE)h}sUB3N{Rzn-CV~0l$)%Gmd z9ew>)qnOI)Z@6if%*vY8!v5&uEB)=qe`x01Xjj6*E$jNeX*tlOdG>7Txd@gx$&%F` zspo32ej_6|2X+K^N9Hgpf~&~};$DlL#=SPHJ34}MV!622VHa_CX6|DmxVr3n-0QI$ zxYuV*#zt@r*i_tI*aO^MS-|%ZTthYscQ^J2?(VGZxCqXJEx^4IdyTs%3mqT9HD=3k z_hQ_H2+o^z!QF?g!@UX9OpM@sS@gsRW--%}9hj)+nlY`8jA1=}+zg7af` zlOs5P)(`gpb_Dm9%wb9d7sv+U-in>Z{X157Y6PcaxwyAx7jbXH+^0owZQ1v@w_`VO z*Rv)pf(v3(ac|Ea;2z8Zeu&^Yuvxf=us?7QWo@TNaA9l#?j6}{+&i(*84+A(wjB3x z#t9Kz1nYu(BwHs$u*iH%W<68Sb!E{r;l)CD0j@i`iHpz|v-MmQ z>o+@s*)FzZ=fK4A7S!bzTJXS#HT*fJk*nb2LOnN# zMK6SptKlQKAJemz`xacZZ?Zv4ga>nKX7xI)f)H*E_;oho5%KmOWX$k*6O)D)^9ER+YbN0e`~$a)xo?1f;HGcTb1T>laASADzm0lsC7Zet z{_Tc;;8wGMP4Exg;!S#PE&Bu9%mVngSx@bNHw1b3LZ?}Crurti{oN7)Ty@!<8(N)y$lDz@*HzK6V48U9d$;}t2uTCY|a(9cvjDs=vgX(H*y_H&hVBIS7+gKp zG* z{QCp`-P2?HI|9!3IsCh?#|Aj?K5c-fac{-yKA;US7k3@Ih2lfZ!kd-jRhqp$%|3?wuL;ls3RF zxJR&cxJNS0vk0yWi^jbx+lqTPX7xt|Hoqj?d$2vY_hfd@Be-50`aK`aZ3ubMfWud~ z)k1eO&cdu69$YOqgnq0l$}E-FTy(=3*ouXIyhb_M^}j55Lq!(+v8Bkmy|6G7D&bF| zDA$^Y!8kKf{^*^BU3vVc06el9>0>D6|Mz!qtlB;jIP&e!naqjZsszNbRk@1!h6JXNZb zWgX=_^Z{F2Sw`P$p(H&}|0T=lohnq0KG#ydZV@5pqmQI+NNIyAQWnz3N!O94tBWk7 zkAmo-nhbT7W%RWy`i2KJpqnhC4`6;mny&7$j6OWEk!3w(8GY`dm1R9e89vOT&n(;k zy5x@#>A!HR+ET5!qU6H#Q9(sn77ZCC>EVmMJVIW^%K5C2Zh$mhak7jau3cqWyey;V z;(8P&YAHR~k{$z9RUHXxsq(-?&!ZuzjT%MY5TbnaC^?%FxRPYqOiJMLPZPXCIY;3Y zRw@I9hQ6QF3ZQFOUqR0I5J4 z&;e)<1Oq{U4rooEKDI%ktzZ?*RW#7!Bt^mzum|XQs5(#ss0la#)qvVSEr23U0igiU z6C*iI5vOl7(1RWYgdTkISU5hw)C0>1+EO{GP^Vqgh< z>1#a_tAN$O1|T0;1}p%U11kXf1aK`t19~N}6j%q)ETiEP4s3^qJAetmL|_sy8JGf0 z1*QRh$VU^v4yXcDr7ow@UkaFw4D@I4p@0z>2G9rFSpe2A`fn?$jzA}%GY}3$0Fgi! zl@J`n*=wSajsaqYS?#&%h7csb0|Egrpb6juxB&w(e1`!>AQu=8Bm?w?nT`O>wIHA+ zK;PnN0h9-5zR~NQ=<8`^0Qy4&eP>Do(3h(|!WEi`SEzUCQTsAL-v`?VYy(aK+X4FW zni0qah65vjkw8~~RuNh?XqBKI)FV;18@MWfO0^2U>*w32NnPefki+ope4{8@CE#VW&pMz`o9P&`pT6X zKwmAQ?;`56 zvw=Cl1Yih|1M~;hpdrVAbHGKQC1i$5xNQZq6mUlc^rfe&fEJ*yZsFTws`@|!Kn<7y z$57^XUmc^rX<>?Qm&yO z?G6H*aOcT`4eYh}P1ApJnd8iUr95eoT_NT;XahHKUw4bK{xNrU3kgm$4Ey$?tlKf6G&Wz(w{#5qHg0S60lVt9a72gr&&KuaDig?0cf zk+h`IQb)@kEq}DU(XvTP94&veEYi|POC2qFwA|4$kDalK_}3G2FeL#qKn;`tc;UUC ztLaYpC_gQqw2ac^YzVjjHGuj+J%GN)+xMNh@QV ztRUe|U<>dwumH#d<^ywp(LffE1f&3&KtCWINCQ%VJ^<r8qWK?DtFccUJ43X2s8v)WQX{92fWQ*t+zz9%73`zzv zMBY$Cz6YoRY7CtW6l3HKrDp*Gpp==4^b~+99uG_gsQg5L%1;6&0OJ6~7S)Bkh9Ute z$N&{mGLbPOKyso=g)@+z4p5~(01QwnrzlPXl!{F&RT`<-pF*Xmpdz4FnewLTnb6G! z<^mKo3LoXCveZ!W@<+f3Pz2`zq$3+Y0V{wWz;a+2kPj>++WwfqB zdNV+Bl2P7GKrdh;uohSYtOO`8XMh5LW`#H41yDqG1M-8%M~c#6U=Kj~l-Y9#>4U%l3eJ8c_5phV z8aPIP!uok%eM?SxDg4y$)CClBBS3PZ#4EO@B25F4#s)=x0^OAYG%bDsP5{S&qree> z<}7(a1}Tpzf9x~a=X!;w3dzQ4fb5(Er~xDBb_!7D`EI120FMFc%R9hr;1+NlxCUGW zE&=NR>ij|83re*iQ-{si6tuYs4q3jhr=sQyOc74R0I4CFP@j{t`O zNNGCDMFL#_IwW@hA^IN~l?5z;GIX}H zhf)ou1W*z%1Lz=4Clzymj#H%pI@{4ns3K57rewG>(sUZH189LNKrMg{8FWIg29Ufe zKsr+!;@9g<50Q?@-~`ZgtPM()wE&s}bnt8n)CHUYFTfLU2S`UJA3CJcVbuko!)imo z1E5n<6M#-XbV{PKK7hd&w`PEJ)Rn?b3k8MhJD?Rn;UrKfm2kI{Wt6WCK;fjv5Xz?q zf&h|*0@N^yFm)T*2m!)?j&!ys15`*+Mj}mptn{Z+G3lw#+XG4;lQAk!6;L-)g-U+n zP3=+{Do--9-xCPtJU=x?4+>9npkKsT8wQB@>}PMRrGjFD&@U&#hUrDMtO5xv1TVU)lo)yw_UO3GBh=yQQm%6 zta&GD@MSLL1$o6P<;Bd(EA;*yjb!d?*1p{YG~4ivc7NN~Z^x%7s9(hN+Z|z`r_!(Y z-nV;PdGE9GhCXq+ded}O-lI(K?4wuqiPP1SG|C$*r#9?5(P>ljCZzFj^%1Ie=c@6i z$_T#Qxdg59Ugw!hR}Bv9U*)Q3*v+*uwg^jMM|UpBOL;T2!=;8j>-2QE$8*CPV?A)k z*}zhK8Z>SmvtY}2X=9f_Bd;N&EQJ<5I9o5}Ez|jp&Iiw5{MuX2fwIbbsE;+(H5CRg z?f{L4wEm=83KLM4w=FL$>A?lz)o4;JnzUvIABN7}j+|bu9;irl)JiDZ6FF~K3C=w^ zBkxjCSkaU7;I~y2u7YZnS3}!3(na4NG~H454WYSMNodfEv(+lET0U$ZBIxd??4`-) z;Z1YwV7d~6sw0baa zb^k-fIh0pI?^Qi%?eu{6FV+mU7T!_ICSv`g#qrXJ1fBbg!ac<~7FY{zQLwJOclsw? zQjZM3I&+J2C~u}dy`X%x{mu_M6l-o+3&W_a@-FM-sQi!Tr)~`>&Y`^RI;QeFO}Xlo z{w~&3uPhu#S*`MZ>;`>p%>UfiM^~IfS9wM>j4LnH_OKcneq&o$OmPO~mD{Z8qndpt z&K_H=8BtjXrn1UQy7%0fx~!s2>zBnjl-GD4{@Yl6$fC}yShKIPFc)RD=dt`(K*+p; zj&EKtZR4Qg97cQLR5S*J@&fFf@mV`7K6*0|1ELWI9k#<6_JVy3hEV0|LS77pRE_FF zdaMbRqd)(lV<&cdSsifg}>u49||3X>+zhe&@!G2=I=TR)8e@xMX0S+6UP&n z8QFPq;tTV-dtnBv2bqzJ@tHLR*94eT%tR%?!;Q6t)FcQCY70FLu)W$;sFbYdBz!Eb$+mwO*~u=B5WFr`hgrk9ft)Em8Obdpxf%mc&ktzXkljT~~s z=Q;_--o@_m&UJ)esD$zY@(oTl))VH$u0#p1Pd$=zDjxBzorRD@lvG|te$?^u-*fl> zU|(F<6z3VK@OH7YFpn}S?=W}Kj_NscazX1aGRpaP*Av`QP)@FZ|4b|gQClc?veS)s z<=)r3Y2>+j*yZU`!mPAd;U6>*o>BPa3IxYKCVirWUv8~%xi42m`|U_~aS;mopqIYw z{kQud#ziRG7w!1WF=fceVi#9oN?-KUCk;|wuio!=!1aPTo68i(FwAwv;G&?}ajt^> z5U>VUAu9PFo0;b-9UHw`zg+m+>*{lhEy~T*DzAFq@6$Hep1WJCILAp>q1jN>^3YXy zlJ>bn9(})X<`k%5#hl@DTFI>3`Np7t=3HZ8Wd`a|ev+U=h1Z_G&%55KRI~apMXv=_Ypp1f?|uZ%|h`CK0;6yT>EUR5{_qKbyxN&k&K zdz^fQkZiR0+dG-3uP|XGDh%`$=21@NR{?hZ9`oXfpbv*FZ|Q-sx36#}8%>gH73}+S zo?7L-;78W9*cR8RSq)@&bM>N4_DxeEWH@K*`ehC|gNlA&pbSRtYfHyX*8X|Vcy4?% zVPk);6EAJywn|mX1}%gSKoFO-kiN^n!k2Pw7IQn~V>+jj52#l4j)&u(!)6@BX5i90Ksh# zT&@)${_(`PrIL1)O_gQe73XLR4Lu~T^{utL%Bc$p#hQcwVHnD4#~=sxU1R=%S2bs6 zv}{tEbe`7)_lS$e2Je1u}*?m4;XSCnmV3fsP*}ast zMv;HETFaZQR{0r;4`V+bn6y3X@8YQBw-U+>L)?@fo+wo^VO56*?+S`@oNFccQx4@P zE6N&&^;~nUCx)uhZ}LfsM#ZFI7;efI|CwB?{K$o7`ilxpXX($tf;?KjQbIhVeMOEM zT+GGw;B%!C6M1k7QAW&Zr`F=%?u^YF3^=gx{dSW&mCz|;S^0U0Nek9@en0eNXS5Ed zRT|665vFk+!8VthtyO;FVuJ0=y`3-G({?83%xok4l8X_n{78nC-2uV&l+StOaQ74+ zJ*D5#P#G(*M8+r(U$1br8YtfS}Gs65mHAW zr}DcYqjd#?$23Z&nJgcsE43ABj6km{wM!*D_$qoKpX8wDiPjDhN{s}SEPH6b9s{ae zY5%ul(JWXfKrdH?Z;Ko>+M3{#f0U(9fF|B;*`m(uwzp&ro}E$lD#~iVVI4W% zbr7Z?2e0J(+*Wz17JLdJ=iqMz3$I2YF4E?SsUIptjm9q6I!suN&6Gb-MmRnObbf2$ z=4j;OI|`M@V6ooUQF`pkxxes->L31WBzh?Joz6-aMkVBu!rC!7S;&l5`PGtL%?EAu z>fmZod?L3FpE0($lverCh(%nTW83m-&`6}s5hHPXxDbq-Udqo)MCXn0Zh6G^0&-w< z(RQKyAVpzKub~%nuWt||C`R8rLdcteTI?c(;OU@EB7{?9OZf?m*NyrlEQ@OGBbGo{ z;*Z4TLU2tVJB}{UZeX@6j8|?{0+swr>BtQ{nV!2yMIG_={zPkS?H> zjS(|YnO6BBj~x~6)p^h$WRsW?!x(>yL9<|re;Of_odzl$QLKdr-*ch7I#Osh4nl3D zU{7s#iWJhv;h|gkU6*|q{P~}&ztGEVhX2hYgroQeWw3h^7u9UT!BJ(o0xNe79c0 z(TP|F)zQ)b-7Awhg-2vFAyzt+s3Sc(ohZ5D0Bq9oj2v5Hg&I>}Yhj$w3DisZ9hnnl+W*>h(^D)W zw1yyP_zYM&&W$mzJFor1^-E!cj#g;7PmHi*3ffgVK{!vgxZXmksi4oA3N5B`ww|AV zc3FvQ(cIk!Cck<_l)M)vP2;Kvi>7j(@<>*QJY4^eX3zU1p*szAX>L#zp2`RpE~7q0 zQJxhm_<4PWD275(v~B-k3Mdm@Zld;HU&)vC2XAYuJlYhAh#}?_%z??mJF;1rEL8ph zk&+t3e`bJ}R~_xQ*Oq_19>}JZS*}zeFGkvLFEyVoB+4=&{4yPJl4Bw8Gr%Zo#HTe0 zeMt8W#}wPjk|<^S2R}Qc3C*yoX}`T@DkeW|1>Y}C*d-vs!_tK30%o+lkd+#{oudJ$ zve+REnaOo>e1xZt@)+cY$E|<2FC=uyJNYT(R@U&O@^Ni1mGl#y&*WNEJ=sZ`1tWbL zALnw)e(>2L*}2<*7xc5Za|ZG6bq!q_iqu8=^O$Q^??L`aDZLxUrX{Ck(+@1g$7azF zC&r3WDeHjf%#=nRCIb9aV0Mm6bVkY-vK%i@6WM^I)J7gIvdkb?92cDdxgwQ?QqH94 zuUGSlQK|Cu^w_URGaEH=%lV=KXeja;$W6&1xe1cISS(r2NXm@u|E2Ae?9AlP8ZG7* z7SIIi9i+y%AnMa=$a@$jhLeQYLFCVk=4&yX=?V%_!vypp9e}Y{msaj7XDg< zO!QxkR7`)XqJStN6QUMz_TQPt|8py1T#JUR(#X%^?t({bA#V}q81PS~5a)j|1ns{x z<0AY0bu)^#$c*2Ytuc-67gkJ_MMj!`X+-LMu>-%bVWRujCd47~4HKg7Uz_-c{-Nc; zB&bclbfkEUf6<6yRZ$z7d}%=P_M06`v-MvWM>D^uUNQ_#QE@NR+A*h98s)XDTc%*3hJwv><=l zzb3M;7cv=sMOB%|{;AOCgOU7_24PV+Oq*BKL!WnmJnV`JxqRUhZ8AlzE8cgC8)sUi zcpw%PDHatMssBYSrrj%5@=4d47La@~El?!+dJRR+7qzKKQe2>kX_LeayePM{pNm;t z8;d7^_>@%qerLlB{7Pw3iePn%tET-#6pyl!G9FW+iE!f>=U^p%B>)PMy3n8exl3G4 zyP^{WR3_&M7Z0JvbFQYX*evO^fecatHr)mL`&`V=HD+__VBz5^uIkUm``l~m(#|ft zcpCC|;f3uVx!S_jk6e|~V`ZtED=!@Tz}+bwmnx727hI?F{NMiz#I{-m!xZu+mQbqXgSbfkd*?>%Fakl81i~*n7bsEB%e7HIg->rGx4>=)U3?i zkh7z0JtQfo1QLmv{j!si6Qr}~1q&PkWknl6Y4JisJ|5H?{4hfv4_X#{M^NfF1uX+w z8J^;OZBXbA=v{4O45z8 z;!&X*IkO<9zYkQ<%^CiBQdT^&KZ8>#4}VFL%7X@jvbu4Q`+%;%tqN!u>ZV!K!PERC z&>+wlP?p(qCIpc#}x?y{nr4L=1n&Gc^kE}f@GAc3K|azm%8rw z=>wh#O8=h#Mc-UYK-qz9M*dh(HrNxC0~-a3HeHSyx&ieynj^W&BS8h(pubet9hQ*T zFM9y|nv#hdt}s+U2Og@WcjQg9&W<~4>z?=t6h&RH)zK}?FbqkF%fNt3(xB|5_(aq* zx2~S=Qx67nuB9ZUP@WeFUdUiX6gDWPR{UV(rzECka%iTZ0(v5TU?L{<5Gg%Ck}88w zi_6GNY$!=)fb@c#u5J&?p>zw>7mY{t^*~twz6C960R^rmfuO}evr`k2;*&5r4GX#( zbWo=Mu(*_DDK2Ax*4D~k(Yz?ZHxP>#T>pp3u(P&%j>Xcf?l z(1$NwgF)Hs?MAxZPoV7g&c?cY7kEUI>vK>J)Ob+Z8`xAE`5f0`Bv>Fmen@s|7Cg;4 z1BX>=t~X=_Era~~&GcBkV9@VCy&&IZ&}!kjA*;dDVGBX&pRDABECxaS2t9u$E2BXu^rW=x)M4>M5)wz6a!_r=GBY!?h9xK3BlQmb21-jdgVM5ZK`{+n zg_4UlSGz?5;+|WdJXlP1u{6O)-t_}Ot*qkZxtwAF|n;4^oxxA%I&oL9M?1m*x<|2 zdVyx3^wGBl-DlA5?RC8spf=>E#bpijADlSs^?^x@ZFDekC}%@vV#;fY8Ilx;a-Ptu z0ZJDa11%4lo*kE(IV?3kB?JDzl8v3jKXGVQMqE}$y+9HuJ1{77NNWG2QC281CodI>&H~AUc-GOe>r%Xb_bNc?w1i4&*2^H)aALL>`|ev zdVWe`#(>0NNt$QWgE3{*Ins3~up)sB#&2dfeX!m(_=Di-%h>Mv81#?J%t}XpG7_^h z*~f&W46UZ<9(qGb15$@%U@$V1<1#rmXJKFkls6ZU_kVuMWt2__^#jH7r5Ui|&F>?}KJL}xsbBfli4z}M=12*9SHI)g)7_&?+Y7O_ z538MDeYVsc#nJ?2+=OqHaOD?CjH_%{f@N_OWScC!tJtl@6-mNWcgaF-60W?eh$RrJ z5VnBOBGM~`E5{Vk#Mf>qQ%I5;i7jDK9_^6|MYbB`AvY4+%X?Vgh9p9(Wk*W5va68j z?q|2&fiM8VLSjdcaHX!BxC-HGINo6?LVI3q!mX>oA&gvw*}BIs2A5Z_Qr04hRI_{a zv`A7*s=;<%WkjxDm@>;ErX%wKGBNXAvYsau6G4^2taYK=SZfESdnACvY%kE`Tu3@- z`Doet3>=npm%EUI!j-n}qFoKU*A#cGw-BON+NHPpjk`Em!>)LE2)~+kk8U0a9q8nB z+44CgVd6>6DCJfW@u;TV5?WM}>=al=Ak{|8+Fex3^1xK+tY!5?O3Sj$M=DyA-9Sn& z7>WRBrxkSBw1T@K(A7OLEp_#-Na?cKNOjPvxSp5W1i`CU=0ZyE#lGTNWuBN1dcn>} z>6Oh!$}X1GZsmqVJMmlHR&H2VbgiLC=~}x@nc`WJRVf`yigxww)};t^28bkLYJ@B2 zN{W*ZHY%k@n!<3fjsV9vu!xqv;nwxwbpJC@Z`0`1mNY^bfEqKKeQ;mYvRVqB2j zx(dPw2n%WDZh>R`NMdqOxV0K~SiMe+qBRK|gI^K3h=6(E*h1bwSx*@f#2&Oum6arH zNT?~dRhZZw($TsMk}yb$3dFSaF*rR^=Y&RhV5f{kmK!@^nGUX>@b465eT)=?PV1bd zVR=bvAllc6vL+$LPP>V7^~0@;Dc7_ZdZ!Ie*7Cft6fjTGYHkfKP&{cIWz9wk`yM(2 zUs%q9>nu_#MJZo+i;ZD+>s4&o3`2`ni4%v>uHdv;WnBS|oh>ZjTgy#weMQA8QI^A4 zl?I9}J)$gaaWuk!Hjc7PL8=pTl}i=HqsDe?I+i3>r8&`Z8eB(B(I0E+Agvk|sg9cU zmyl`Nf^i#2_ zlGIb{34CZ71g^8z{#K-VYbl>$Sz8NW0ao4z@Zi8!>4e2d*PHS&QD2;20ztr_`(~#zon!{p;%W6=e`xzW~Pq9*hEO zoqDEEIcZYsi6yP<)=wbh(rwio{iDGZ(h7L{>v?V>re(O&)n6QFZTET~LPnfqT!ln> zxiITCNSi|H$!a_vf#ZD6pFEQSaNL2!U2EnZIM(5=P3<~ZG#i1_0?yhG9Q*9fy~Mf- z90OGnK|LZo0NY8@nYJ!U)E;h`Zn6U2Of;0kBH|{825ty=^!`O+mtC&cy5~jQ!EKatwTQ(xInP~1CWvz-KqkZ~5 z*)2q@a!l~L3L)%vc^G9&bJMZbhn-wwG*#;)aIvgk^Y6Nbl9UBb(VS8jH4f4^4%QTK z{WOjPc^{k}2V4-6(8Ymy<&JxJKMflu4~ck?wY{;}CFIj2a{xW7}F3ePj3ZRiuwy{M_Ac-IFK8 zq03V7W$iT4xRv~}*x18vnFe0pr@lvub}KxbSxR6G^p(9YQk>BhxKMdb1qTPY%t0%u zO{xoR#GqbwFJJ6Zm=t-lrldI6rIFlLJnCh)&P5(t;0A$H;+3{yTyMLj7Gk5R7~eZe zNp2^+``E1=;ibGzSjT}gh8OeZjKS%ficfnzPm3jM5;$6}&xXz5=wN+jJ_Sbuw3Wuv zu>%~dZL4oFWtLHPbP$g!*{ydWjDS#|1`S`~DzOY(V)`p$ct5-400fQ2$bM1QLYORA z`QU4YLJ&B%;V!(wBRs&c4oO?}wu3_y!|+l4!Y$9JsIO}=dJ*_LIovu79G4b--P~qy z7S1#4AKnIH`f{V6Te^bdpy}@Z5L}?9 z$-eId*AQG$tw%+%4zU(}k!%Z2FLw?n#r3hG`yjj56GLcD4s1z?>@cSuS^CK@8yubG zu5FClz+pzg95(3LRj*WAe?;FtZo)IUm326zy2;##)`O#w+7ZtB032)6jyXz$ZlX?# z-Rr$>l7u-{V2++E8>alwO>9iDTg!IW2Ur_>OCmTsH+rw7NQIz~Y)s42+OBj4Qnsc$ zt8@?D-B_}4BI^RK2?xb%B2o>YWiiU?cJG2T7*fr(mb>6Oa??^;_Y~vO?AB2|&C%j= zwyvk}PDcnsNLveQ0TS6uEP-%%FLRU`L#x1{S9*kcdG^*FV6-e17C|+`tlc1O1RZ^> zCWB)~bZ!^87Fv0nf@E3b_Ae*4R|&L)^+6eJa~Xn^J_oqvtpL{q`uf^2R97l}OGozoJ; zqoL!(jdpH1MI=db1Bw~6Bq*1~3IMNyR0i*@N&hvNXh%?G>2bmY8NRpD(S37 z*)czZCuM$BgH|)-q?A`Tc+x^ZErTazermU}U8M8`Vo|$DbLc9p%$m!vI%?O8C}%WQ6Rm>ox*8{+b`_+Irv!j8G#F5T6oU={ zWe3s#UZAx99|U`ON$_gg{%%5n`NubpG5a31120jKnfw=(n=K)^88i4uh0m?T3tamfOYcuU<#uk7T zZ!_o)&=SBAfEOt%I%d!l20abR3eN(p=N!O`l>EGj9)!=h}M}pUjD1+%P zz_EV>@G3~zp{JVkpQHSoV@0oMXi-r7wU9j7O=FGWm42~`6Pi#>x>LiCfDOe*Kac9q)cu$=oV0K@IO#! zP&RPF;7M8jM^K7R^CtX9)fCaAJb)_N;`uYBxC&B=&f~_~E`XB1$eTeKNxy=pSvL%M zLCRKdL(cMdjeJrj?-}$yBaeayygf%*@nb_?kg{QgwHlOucLz_A)sU02Xc2=JHK?bN zpHIu zXdS5x1T~mC3UqMli2`g|ggV9LQd99@FgC4`%d$ zA6vsk%8IHQv>GTcQp&57!9~h}tVISFDf4TS!9~i>N0GtxCu+3+=L}u{-!9MjQ;+_I zh8Zhu4SiC2@b3;}^i&K$YMjGz%)~!XhG;i{uGA;Mi|N03AVY1>pU2>Tp4iw>I&*Oq zr0nVc-GNMRXDsUE#L>=U9RL5=fedZY(1PbNZF$=P;eX;l_JVVm9{F#VekWG^_6 z)z!!1zXvjSUq6^JLJA(lC?`+(e-C8;J&-XT{_$YOWxwD-jQQmMdmz&fW?bz5=>u6W zdhg$MAQQtTW{Kw09kL?EPIt<9Y=yg1b3t|Ct0?kj>8IAuRE7Wb;+9PZUbHATyXPPvwthI?&s6Zblz z?INdKSIoh^o_L76zld4vlmo~-Ea>Qxwr=l>r$s2BI0mwAU5FMPy%rI$++9a72IDIEmt|^Hewp?ZN*L8+o`gj9Ibzw z@U-|-%rS?Uv)U;~i-)+k7cpy`atE;(_g93x)+u)s-EfZ)xwv-{)-Rm$t0E5f&SC@Z zU4+*zrcWGMlKr-XV7r>FY5j%P}V4dI;YQuxJG=+Tf6Ti6h{SgKN0a zA@>oZHaf+al{Rq!T$~8nQ_Q!H9z6P9fbIYq>5bBeBOZDK9BAwu5n6dqsL zMB;XboGx;~tp`_TheOU3aXXx1;5wW55?r?M+UXSK*V{z)PKW%u*a2=Ixazwc@-UIU z3-)b*ec;{@zPn-HM%cI8A&(SCz#RwI@JolBBSw7*`!>NoaHB-f9@w`T_U&=VZ;Nx_ zE`w{m*CD?vChvuPTVNl!(W2!(*tgXt7VLA#W5rEy55RTV?~vaYbN0i&ZLsfvLmn?; z4#2+cun*isAs>W&J7C{Ihdf#2f?E%+%vTOsh`6s{-%i*EZi?_a1p9WuzC#XK6+6J~ z16TcPhdfQBe+~O~!#;2`gzsV4_a*E*?2u=PBjApMYxs>r{#1-P>hSLA|Q53bA)4tceR`vJBdg00}z z3a{g^^=sIA+##hr4*5$l`84eN7WRSLD_Wj`ec!>p zGY)ybxC!n7xGq0A^tj_4~dwwu{-y(uxK7-JxtDFC`7H-Fwz0P`oZx-~XAzBWV>qwa#H`y6Y;IS;wYh2& z?e93Sy-mA=;RN>tTv5^XE{5}(O)R_Xz!vuqT-RT1qSrkKHo3+3Fr2@^&if8*bKUM^ zIKgcJS4vnPU^uVC$_EZ?bsNBy{~bm?bjamI(nAav#~99Au$4SblIgRj-{`65x@I17 znvCDFy4gyvF)ztcHuE2Z=HRQWqU)fUBdaB_ zef|e-%|0$8dsgtqhf91-=HmI!{NIjVkXhO7x=^vK>rzHuDqDi_+_sn|R0GS&4J_mF zh}!e{9^>aSfi$&<`OgNo!q;uBAWx8$cU!9+UXty$nRfk0(#t?AXg*L5y{uk*N#3Kx zw^Nt<$e-9k@m!4FivTUb7V%WLyqo%C5!u7C1~S|8t^O0vLdTlAT*oJ zA9ugo8Uw(_2561-^+RKt$@z`7S{GPNu2YQn*Glkyxzs<=^8cSI@JFSha*1~Qz${7o z9O|F}a+4hC=`;PJFcf*ruBhwe@r;y8hAhm`;a5<;hOChx<0r1K3|V7Pmg9G3=F@+5be6+xdS{O1b(tJL_4w#RO_=Ow)Wsp~dp;r`X z^P8QPhK$b(?@$R>BxU@bhhG`{vISgGhGH?KuOZE=6)3Y2KiYE)T4Xo$`1O>Vq4%;O z^Mb6fA!}pE_=sOYnw{c5Niw?>5P2Ur_KL$oVQHWiT4Sg9;EOUoo62AUSF|C+a<1|9 zV$^m+B0o8$8Ky6vAlq^@u>4$2ffK~t|1b+<0 zpIb>af$BgFpc=s62vi2D0KNcSPHWhCc6JNu+zM<1wgWqWoxm<&H}EB}2iObj1NH+4 z_&ntx5)7I{z}LWG;2Yowa1{6!_zpM*d=D^~HUf;5l|U}A3Rnt!4)EF52w)`eCNK_o z7kCeN9~cg}fMLKWxjvp;BQY8n12Bl*0r-GzEKm>d2Lb>AD?d_OC(D&{%7JBU-2`p{ zw*ki0&p-yy8R!Dw2SWS>rGy_E@n?M6_wIE-vD!-Y0Dm9=Kri^yC;kH>e=Nh_0`WIJ z`~ehyUcz6a@+UR?p)`NwlEYuw@~21q^&x*x!{3QX5kN~I65tp96#+hRU@S8x8LKf0 zIs|kDx&hsRRsbKo@F5K6K{db|;M1Y9z-1VF4Y&wg0e<1EIg7+kz&YRy@B?rh;1fbV zHCzKM2W9{t0*e3vOaZzA-GJ^u51=Oy41@p;fQA5#pW%4`K>(k3@uAtTXh;Tq2Ff+#3FuScG4KF*1Y7`40;hlzz*(ry0{s-2 z4SWL31o#kH1=4^FAQMOcI&;!=M4|&Q8inTp%YaMfnJlj~Q*ieeiq) zxdC(?z*YJxa0%E9d;t_SDAW9QTLJE)5w3aHk^T)}UJPV5&_6&4eo>VTzH1C_T!Fvp z&V|n}CldT@@a+IT?7{TVqP_yCIc8AN#*njst2pY?)+|p@u3_9txSnxqaR<2VaF1d; z+|wxIEaD8J4p(l50Ae9WTL2j(tc+mLR0cTx7(`q+Id2;QVL&LrdCmFFdCvJB1aSUy z9pHMvb)g=>b%N_fZGcm{Ccp)m3o{qxsvKlLBz%D?Kx?2Cz!kk2&=lbQ9swE-aIN5) zK``CYNJknx-@t0Zzkdz}vuEz$m(SBrp(&1suRDKo@mKnp`R;+F;uo zw1YvpKqdlCfJK;Qu>nATAOVO6dIH^mt^o6U0No3uDT@R80)2p9KyM=rK8L@a*A$q^ zwAm0TD&Vvd7=Y@mwcMcN95&Ie4v;>$36r3=N z!7ozJWn#iGRQdt*ECem^Sq>4|1fH5Uc=} z1D^v+0nSqPoee?hANXa@$)3+Qc{a#8Rs*aj7hne{TLtJdJ4bieHxL{KIAVK&J;0a1 zPGASH9oPa0fJ43+*a&O@)&uK+FMzcGoliZ=I7>Gbpj(mN2J8Y@Zg(x**a$0SL;HZQ zfkVIn;2^M{X*E3?qeT(fBLKs>3Gf~8Ex;%^2K)$|0!{!w0PMqY;3RMwU_R|6JqMgO z(#>To-#{~b^ zTmUWumw;b^YrqxYD)1X{3%C#51MV7>^*#h1ad|6(#-4$B0`Qo{BiCc3B}4wy$SYWh zf;<^01n`(<0j$6b=<>M6#(Y7m0HuIRfG5DS1CMy+fYLxIp3-?p;6b7oPy+A*N&;no zvVaf3Ga*k#Ec_Bs5vUAQ1F8aaJr@IdsuuW~0KG}jlZLysPXd%tuP$f~-N}y#6b1nG z0m>SHvSV~H$BmWnbZee$SpmzKc^qesu{oS(!{(S{tn-GLb+J6^AFPcd8#D`WTnkpr zxM0vw#s*pfw8o4VRu%!C6^4Vh0BF4#Bii{Kc^OmJO&BHz$jV_!{rXKgSUD-FN{-y$ zhhyQ1wSDTsWp8wP&HIcZ_YMjOatIFQ^?ker{^2OO94LTGY*`!^eEHPtz}R%Y1P1REW`2XkN3ZH(aty33FF7M!~k- z?&@ctp?s%L3A9=%#2$Bf_!PhV66cXq5;k1cF@-=!`)k&<~ ze3#Eo>H5nxt|$@t8s^)6k~TD3)Sz(6#rz!As-9t4^Zh_`7r!~^x<~b+`5JhIkoIPp zrS_y=8R0c&=I4B8RqMTto|!Kls#CI7i2VNfIr$pTtZH9qgqp7@>R0x$wRq*y_wqH& z7a3jpIP2D&@Ozu`bD9=Wm$R(->Z37kpAYQg)nsVCMtl*yXTe@0W6y2u)Gt40SP}Ix zduF~)X=CEnfQFT0_vdRYETRU!gWAm(FzvhNsyt$T7m=@FzM{#)t3}=Q@<(6g=bSB~ zzKOERxRUDBcMusLl~lhXKf9!Q@f}1=l~U^0Q^D6MrOte}05#>cN~_-#kgLjjvNsD= zdM{sD?f9PDLFrpYolT*UsUCe#Zs23Szou}l>6d2?Pnm!KY=E#2#u>S+>Ngs}ol#az z8x8Z#clz`#Z!PiQK#hZ1sA3}GBve+NG!qriDywcC4HJGTtCkommsg97L8~{)s@=z+ z8bjz~zI*ANE)xgdb+5hCXb{zy8s=M>8oV{hx9Q;>HJ;Z9R<>49Bj%#P0~OTXW6_|= zn>Cp4OIld_rCzzmx_P075PdF3daGyAHKmKUnmQgd$@}9^LB@Hj0pmbF^H$r8%eTPC ze6!PlrXDLs40*RPDhkyr3V%sm$r5Ihf30a~C^0^2;AHsGd<)b8zaQ_--2G7{)M+d< z(|yz%?9>V$^@9nZVHH)^`=F-Wr28wWeJ4R~)R>oV$_u!o;|I_)_`k8nEOEPvI(s%s z7&WO^KR_^K`L;B%(={B;bN znqhuw*9jOZvo}$G>UKJbdcScLP5` z*Nv`O&^6O4a|lh|9AdK@rrgvkP=zTniU%!xsuV7ouTj6o#~=RL+cZg^T0Z7G#pb6cMA~wWEXptX zoJ)QFDaUDn|NIy~@0GvF*Bo!U==pLlkf(hl2m6?>HEW&Gx$W7*UZjIuL z?^@deg&OJWSK)f<=O1G=GGD0n{-?u3LUNA{frhbEVgow+G3xTErnz`X%BO0N~ z{quNTue^`>hP19H8}^Fs@}P<~(AxfBZc!}))M#vFKITi;CVV!sbV^j?>(IoGLsNPM zs4i}H=>h8Wsc2hoGg^66U-g*=xm%#>^BE}kj^Il#Kp7qlAKLuZmWh~sLy@Nhsw1Y! zoqfzV{uTeBhEL8lbt~H7kr4U??BIr~R+^4oYGtsRIvxHuU)42Z=%T&P>cj+laPo%m z7-+uL>pR)wgWQP#(NAK1KuQ-^&z=x7o&8U+O5Pud%z-k1(^ zj)bVyX5hSfHbna}(B;2<(WwRHf|AfVZn}sNV=GnX&yWWyo*Nc zckcG%9rx05i{=fXA1s+m^WX+*PimU4nOhS-;B?_iS=p%A7|nm&qXY52yNeCfGbj^k zzH;tZWc-ccZ_G$V8DqUNUrM*Ww9m3~-iuo2=e*ibtv3tp<-NwvRkMHiZx=qu*O=T; z?MscnUUL!h+GPBj$*N8Ee?ss1)zsM4jkUVq=AvnuE2BC6pYMUOmH7Pi8gDLL#)9!T znr0hjo5l_sYQCuN>6m9|jfN&aOu4b!?WQ=1TzUk6E;1 z=KSVrzJ~dlz+$d9d$0JZ_vZW@{iu|87En{?U}rbC`xj;U>};$@ops9Hl1-;Mj-oCj zmj0sH-&I#etvp4x{7J*~BjUKkJghN+P1WA>Fu%=(*o^PRP1VmK|CT#x_MrDc_{@ljJi3{>5*o_nW@_p}Xqs;Tnll}gRk%L}k*n62M$riOk7zFN3C z$e^E)){jt+l3r-07G4Od+gG|UD>Hj+*cxh&)SfoE-v6NYSAV?wSp&)%5sosD_sQJpq@fRao z)STY-yrBV4K3^8w8e<7LsJ+D^lr>-L_hN|f*dxp|CkTnY`Xxh1qNWH4#Zc2>ZHZ+J|b?(VwCWFSv`Xi z{5eUzC1}fhxvzCdvprX1rf3ZYW0f)wvyoQhX z+_!_U*qfRQ+o_MCseIW^?Yj>2Vmmc(DN34e<~vz6bmWOqXIE?fL}7dbAIbdf1_MfZXRS3RXbDeU=Yf-|;Lm6b1P$3<^GUsFS{c zCXN&{KgXfNd=2IC44z@OMzmUK88ic<)ke$Us%Ft@GI$^J#h5ETs@A4+ zl_d#Ur?ky_U$i=#CBBVTH!j1#nXkx2(FaxS!e~$mpk!`4-LCn1dbSO03z7I*cXavscv*S7NbyrHdMnt6S72S9XP( zZ_Nw}pI?2%+g{!%!KDlfIUk&{KVSc{C2i`2yFVd^M^E(p?O63G>hLjNjJd7ejFU~f zl;={#^9_P+UaT6t3Zu0=R_zZOYQBrJOW$9gJ(?7!Z(WG!{I_y8zr8*8K#7I}Q3p(B zPOek^dKG$FsH=LJbzSeO`m6@c?51{Hjp=W`esi>Y?N8dzTeVPYJ%~Mj8$B<9p1+^) zQSRoG`_Xg8E57`bV!NxKu#V^+>QPW1^VOUCSG3re(7728pn-5XY{W#Xf=Te=<6`t0 zxpQ8$n^AAZ^z+lld>iNF<<*M35wv-P)&^HeMgZrF8oO3*pcsL!&R@&V&st8jDGW8= z%sGGJ*E<(06B`+}!b|4cPOqixp3(JE3_nzI8aKi>^!iLu%!zOGFEqHX?wwV8e(~}C zb!}IzKS6ZQZse4L-)?5ztUI~;Ic!dxu5gA_Jx)FI1^i~(`dppnG8FpP%g_J1h?rHI zZZw-P)+=*0`qN@#=&K*Ehu;uytJb5R=Bn{rrE2hoJm;2w-Z6PKn=KlJ|HdfuJ*FF- zbuMQ;X;RV{T6oM1g6Ee;)4I*^>U$f}(f#r2#*IA1=*wG??NjlcGOmbeYO76hXTN(` zgc!>E#;tn1t7FV(g%LLR*3or7>#d{`32jf62vIj~l3Ua~(MJDN^G>6NU&%v@Jx!aY z*OSEGdEhG2EW1&QDnaV(VTiY|&2sL#Gy7z>4(eO` + @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap'); + text { font-family: 'JetBrains Mono', 'SF Mono', 'Cascadia Code', monospace; } + +``` + +Font sizes by role: +- **Title:** 16px, weight 700 +- **Component name:** 11-12px, weight 600 +- **Sublabel / description:** 9px, weight 400, color `#94a3b8` +- **Annotation / note:** 8px, weight 400 +- **Tiny label (on arrows):** 7-8px + +### Core Visual Elements + +**Background:** `#0f172a` (slate-900) with subtle grid: +```svg + + + + + + + +``` + +**Arrowhead marker (standard):** +```svg + + + +``` + +**Arrowhead marker (colored) — create per-color as needed:** +```svg + + + +``` + +**Open arrowhead (for async/return messages):** +```svg + + + +``` + +### SVG Structure & Layering + +Draw elements in this order to get correct z-ordering (SVG paints back-to-front): + +1. Background fill + grid pattern +2. Region/group boundaries (dashed outlines) +3. Connection arrows and lines +4. Opaque masking rects (same position as component boxes, `fill="#0f172a"`) +5. Component boxes (semi-transparent fill + stroke) +6. Text labels +7. Legend (bottom-right or bottom area, outside all boundaries) +8. Title block (top-left) + +The opaque masking rect trick is essential — semi-transparent component fills will show arrows underneath without it: +```svg + + + + +API Gateway +Kong / Nginx +``` + +### Spacing Rules + +These prevent overlapping — follow them strictly: + +- **Component box height:** 50-70px (standard), 80-120px (large/complex) +- **Minimum gap between components:** 40px vertical, 30px horizontal +- **Arrow label clearance:** 10px from any box edge +- **Region boundary padding:** 20px inside edges around contained components +- **Legend placement:** At least 20px below the lowest diagram element +- **Title block:** 20px from top-left, outside diagram content area +- **viewBox:** Always extend to fit all content + 30px padding on all sides + +### Component Patterns + +**Standard box (service/process):** +```svg + + +Name +description +``` + +**Decision diamond (flowchart):** +```svg + + + + Condition? + +``` + +**Database cylinder:** +```svg + + + + + + + + + + PostgreSQL + +``` + +**Region boundary:** +```svg + +AWS us-east-1 +``` + +**Security group:** +```svg + +VPC / Security Group +``` + +## Type-Specific Layout Guidance + +Determine this SKILL.md file's directory path as `{baseDir}`. Read the reference file for the specific diagram type before starting layout. Reference files are located at `{baseDir}/references/` and contain detailed layout algorithms and examples. + +### Architecture Diagrams +→ Read `{baseDir}/references/architecture.md` + +Key points: left-to-right or top-to-bottom data flow. Group related services in region boundaries. Use buses/connectors between layers. Place databases at the bottom or right. + +### Flowcharts +→ Read `{baseDir}/references/flowchart.md` + +Key points: top-to-bottom primary flow. Diamonds for decisions with Yes/No labels on exit arrows. Rounded rectangles for start/end. Use the Highlight color for the happy path. + +### Sequence Diagrams +→ Read `{baseDir}/references/sequence.md` + +Key points: actors as boxes at top, vertical dashed lifelines, horizontal arrows for messages (solid=sync, dashed=return). Time flows downward. Activation bars show processing. Number messages if complex. + +### Structural Diagrams +→ Read `{baseDir}/references/structural.md` + +Key points: compartmented boxes (name / attributes / methods for class diagrams). Relationship lines: solid with filled diamond=composition, solid with empty diamond=aggregation, dashed arrow=dependency, solid triangle=inheritance. + +### Mind Maps +Free-form radiating layout from a central concept. Use organic curves (`` with cubic beziers) for branches. Vary branch colors using the palette. Larger font for central node, decreasing as you go outward. + +### Timelines +Horizontal or vertical axis line. Event markers as circles or diamonds on the axis. Description text offset to alternating sides to avoid overlap. Use color to categorize event types. + +### State Machines +Rounded-rect states with double-border for composite states. Filled circle for initial state, bullseye for final state. Curved arrows for self-transitions. Label all transitions with `event [guard] / action` format. + +## Output Rules + +1. Output a **single `.svg` file** — no external dependencies except the Google Fonts import +2. Set `viewBox` to fit all content with 30px padding; do NOT set fixed `width`/`height` attributes (let the SVG scale responsively) +3. Include `xmlns="http://www.w3.org/2000/svg"` on the root `` element +4. Put all `