From 21bcd0edde9378168f64faa0490c7155dae23d15 Mon Sep 17 00:00:00 2001 From: Adventure Agent Date: Sat, 17 Oct 2026 09:19:47 +0000 Subject: [PATCH] site: add Open Graph/Twitter social preview tags + 1200x630 og-image index.html had a title but zero og:/twitter: tags and an empty meta description, so every share of webglsamples.org rendered as a bare URL. - Add full OG set (type/site_name/title/description/url/image + image:type/width/height) - Add Twitter Card summary_large_image - Fill the empty meta description - Add 1200x630 og-image.png (Pillow-only generator in tools/make-og-image.py) --- index.html | 21 ++++++++-- og-image.png | Bin 0 -> 43489 bytes tools/make-og-image.py | 93 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 og-image.png create mode 100644 tools/make-og-image.py diff --git a/index.html b/index.html index 7bc37427..f03d6fd6 100644 --- a/index.html +++ b/index.html @@ -6,10 +6,23 @@ --> - WebGL Samples - - - + WebGL Samples + + + + + + + + + + + + + + + + diff --git a/og-image.png b/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..5b91b3b1f2935a9a2c85dd8ef15b0319552a8363 GIT binary patch literal 43489 zcmeFZWmHws*Drhogo9FoqJYFfTIrTPbR$SfcXxLkkPhhF&Eh|99Ny zx%a~z@BRAf9*#42ti9H(HRo^6ZGeoFFzPehXCM#=Ra8Vk76d{l27%!0!EnHtU&Mc& zgFrbyMFsdiJ0|^^bFjsezhgPz*#5RQFFuQ(&1MypJdc;g?>Xe6Qd#vHd-ArVuDH0@ zzH-E6zc?I}6TaSNA2>R@TYXNftmb?lC(u<&G8immmoj*`)HTxQx*sgW7q;Km@H_t! z4-A>ZKWz(>Wz-)*mw9dX>AxMUM0UuKAD*8x-~XW5{_ltR_iaq*&&_Jnd&Q@~v_T+G zPpqf4Pac1QFy4S+e}BRG@`4|K5y|}jr~bnUfN{K4|5ybF;`+a0)sNr7-kvXo)P4*8 zw`1}@#mlNQIUEm-_KT48NJNj_)3=7UP_OBd&DYBhh zK(OF0u>NYt1;WM-PXw?K#J>x<*jStM?1F*ry#6`>&J{h=H@Z*|&%bqZAF|0(FhD$u z{;8RTV=60LJjSo=zr%YHawiC40JOtD8i_kujsT#A|Gi#?ThfQ7DnJ7K>p24Sfw2dH zgd^X3so!D2IsW5i^|1=BZH*i7Qrdqn5q6jIp~)ixZh`+h%WAL)uC4O(cnnWQkbI>5{?W=J*^lF6{TpBOO~wQLtNicvMHQ_`L?b|oDSsLG zi(M<`ktX=JV2D=2Bfa;R=4E>v&QtvFaM0IhM&W)EV7h47Gh1L+1A&M<{m3_dOoB4` z?p-NE+)ng6Z}FWj)_8YmdBb_pAKZ+m}eCEpLmT&U;UTuZQ|a}EdtTU z$%AV#9GTzQ1Gt!t`2y-(mvEyRUFiQ`Jf(YK?{)MKzQ(3e?L=gLw}*R^WlE5}wh|uo zh39$YH6s2D)?^35OvIA|JQS)2r$Pko;v~=v#=-dTC`!+RuS{&zx=;+Vza-sPrY;Ny z2pHpWfxK+|xVlf{F<^gmSJ~ z;#1E{h5-3Tz8CS~gp$FEzy5ueI~>vJs|0vS5(<8`$?_lr5V{|sd-vhQq_72Yj)imc z%x~bA6=!8DdehtMP3kA6=%BE_eij2wHIr{KWc1MX<1{Eu9CH&9RD8A?+0?K%-H-CR zuz<_HJ9FZyoC_H9$ycULB)KbOjTS3EI!}TJi}W1wW7=fhB!?aN5I{YLB2!YnFge&a z_uZ72M@2=g{*GFWn>6%=rpa_gKYJ?pi7c{Pmto8HDk5TdX(^()IW2Ucu*`sCW_lon zTWw)%3~Te@J@Z7US2$P5kUp3hk!r2&l8Qy+FW1Wnb(iZqB!a`N<#+ezzmgqF-*oNt zSIyr~4HBGXEz=TQ96B_)ygpu|oh+{@+>2s;1@SyOvQ{WkZ*(3jU0!ygryovvjUCkf z%$Jyffq|0JYCCUbWyQ`e8x6m(AUBuWwOS#4_-LeMrSq)4qk~T4F4=+m=1`hoHIoVC zsR=*?X-t-V%=aZ!tC$L?TGkjvg~$OqrW zMnqKV^+qSMY9z3~^C>bD5)z_OSFLfhB89Y>vJi4AHMm{x6{s{B^UO3WA_Kk+KBF1* zAk-I?=NQ|zS1X;;3>u9@JghV{F*fYcV(bP3rV4qhtGc9QZ8n7zvAsb-L2$xH{!uiv>gH?K}22> zU@f8~c&)MK*8G?v)h@1-l3M4{fy6wasX`UIpMEyf2Z>!>UF4}ZyPbp$C8kq9cq<^p zP`hKv2^x(`5*buL9|pq_eVzf#uPsJ{eKj^^!8-=nZQT@7T9 zou41q8fdf8x2*8#19oh5EFk&G5-jJ26n@A-;=afIo}&7lh1fHi-+&{i0%n2@%%so~ z4F+2au}QK~`!xJEQ?^-4utZ5!U7z~dnZ4KndA!6~SoWRe{r&X|!B1Z1 z0Mij@0iFP+3K0{a!0g~bLN9r%m{pp@AML9yq5P>PTwJiS>I1>Y&sYcN-h+gdaPyky zJhJg8@dkJHmus)f7TyzLon3nq-Yg>VG@q>`ArjV+E=n$Mkk{WeVO&o}Nxa!4TSDR) zy@NTSYstT=v(l>$Ig(v!KggK%W6>LvO6<4aq!Wrl7Qzg;(73-?nPz?uKL^BaVB=Qw zhSiHaxoywy%Sp)OO%5PFiavNPMMY_01Hh(wdjjJJ^(;2}U0-Eps#29E6#Ym`Gt$+K zGDAM_S-4wYl1v;&s(l3lVf+q9f#oFtgY>Z99=ru@LSrf;C&#JxX*vuM_MiR|umv8M+5c$W_5_CGZrIOg@hNs5n z=F)K{woja)rq6t#kXUjOvWyIp%RUfK{6zUxRmFG1tcNL)v6G+9~vj0@Jhao9Dp2&F);jw{Y*|ek{)#9aH4E_&Q88R1D-v1ehnHHU@eb*_l~cB&4LdpT%la0e_Ezn66$#h>yRsy}h^j=c8NgQdfjdXJ{(QQE)^Y zMw9hg>Cw?Q@0(d1Mh4<{V^q;Sx(r6;(|d(`ejV%E+wbbm|CpI@^ePJ0sNN0v@T^tt zmFU>9E?DpXTEx%@Dak9cxM}xkx?4$2sXdL^*{?s=pVb9}FnC3Lv=Apkq2X9UMESY; z1Yl&y^Y^_th)}XyPHCRw5n95#nhiZFsvh9f87qb}$C7{m%y{(a&P0Jqh4$sQpFc$$ zf+(Y(Wy-$5!;4H#Hu4zJq;tLPzcZVu^tkEX__7O&rCy2kY4jC9 zI;nRzVH+Bbr*-FZnWI~-ia`D|%ZH01-UY+xYq|gS3EIV%Iw!=o`wchbtYTszg+-7q z%*oV(=tSRt_@;h#f#*=`Ucb~n$>ndR7k@ZG*wMuxyZ z$kK4&nt0>Qa{B$ix;&z;3FkQqy$e2yw*bUY+?`v9_FC@2-RE z1W%f?qvPsuXUfg$Xo34r00#&SM{Ipli0}KI)SuUJxs6g`A>%az!CGdic7mgVnp)nl zVHiHgl2b{bSQaZW&6h51goNSYlB+AB_1>AxEVBDc=`geV?R31tCZU4R#p0*r5fKp% z^H#^KE|qtyoeR;uYx5T2c!0cD_dSlUOa`%6H>{Po$jNsuH|{R8dAPG=DQlQDPjlBo zxqhO=OJun;9m%!+B3z|6_%W@H%2R{OxfU_G7> zH`qIbZ#!x~+TSH2Eh(8&sr~u0uGSLMD}4Nqsyby;akSEPK0#YJrs&_UUAf~7 zywT%mW#9d-$w7aRX4Ror0#I=GnAJc4-=HvA$N^T~&E- z4B!Dt)e@4C3{f~T1dL3Kfq5oJOIO2S)9n4tXu~qyVu{1i^2$UZd)JiYk1%gRuC@bw znrx2a6_1D85qi_g}cMcKp@%EMgHw#52^{h>^?_bu?%&2U|&HiTHWgv?TNLdOI zmBx<*_h=zP*E`wiA$JW98Z`$ksQF@+?;^YJ4u40U&)Xyt8oz)pFKaKj9}A*Q7(0hY zGp|%Ari2D_I%tqauGHIZL9dVcZa11}9pivSrfNLG7ISoky%xAAcejFS%YtMm!?%KS zL`CnPiI~;?;Mp1f{Z@~eTX(HxD_ybO*3G#yH2FKZn#@nkgoK%_oGwjneg*zuTok_) zcWN#BBpn@{dDoT8%j0#1g~nKlK^@rIxHOVq{0aHpY?uVr{HvPm)`U}aCdQGZSDuyUHO1vO#KhDCZ z9zE=6Pv&rNR97Owqz3jMEw7Q0OWB;?$3kTCJfHdF@HYT9G%s(p6omN;{NTCYa=_U# zdXh5`gtT{W_M8qvqz1IVMyB-=`Wha$WBHX5V4OE^o!6&g z_i8u3ipN?c$(7S_IJg^49R<~cLl zGpMicTpQVM)1}M&BY4cXfZJ7fy8VqGjxgXO56SOtIuiGBLWDXuu8|OdBaEQn`rIRB zq1@CIY?X>4?dipa`ptD6sG zN$#+!6%QQy*3pWxW*g?I$Vw^>Lo4<3e ztU~ms+xKd&D^E^7uP2%r8L2ca9mT4n=?~FdklF zfx`Q*9Uu_z5EK_7c1RlhgaiU>ueVRz)0AgEPLpfXwsKP5N+~**bTb;yj~_jIho7Ho z|FIGYT|vWbY>hx6qFXnU^jK|O2z~2!W-dSTXk(dm%}u3>g=S+v5RBwi&5n~l%dVFSiFe99Lvp-6U37y?-85-(3celLXVhll_ zy?>{mGH=^_b#Zag+zfGePC`yzGED@@sH^+h+9^j9%gS7w=rQ60kA$XX*I(djX7)@> z=Kc-@Lg6|2u~Gztet{l{zFkQo9(E$0fCG2T6C-=yFNT9?jE*WQ zNHK=+85lSi7*vf$Qd67V-onpPm7>AqmN!2uI-<}?+3(#rpYJu~PxFGE?tCZ8r;+`h zD}Ih5B_%DTZXTKn9pK@-bXf1b-#g?Pt$NK+wdGwwpe|1ponI*gj*ruH-UM)nE(j_d ze-~`gqvaWFZmz+A<6}In#+Q%M#8&is1La(>y^ot&{YKBRqx=PE=3frlXtEhu>~HSw z9@k5_y3V%vet?qA5HKdF7cEpZ1unG^M|3&ZU~(U}X`mv)AFowR2k_io66T9V#m4^p zY%Z57o1?@Uaxea2aH-zp)E(bpM0V8cHWIRI9tHRJNnrQ>jv#@ zl0KC`kmV_tCGA`H4fbl;nHh|wZJk?9jR^K3Sq<-;)=fH~kAxEPbh|DI24P#~El*8O zUKpf$blVq%@!TcJ`$dUmKJUrKG4?0LD^h_6vN~Q|1hjDE=2V2&;3;+HFYK8nh1#_{ zf?S`qFom-f@^wd}g~9Af%(tgM^z@G7EehMSQ!n<63zP-4p-tb}taDb+h5j?3uI#cRhOZn4si=CUx0j|`PgmOzh z;cH|CvqiFZT-34!;}Wb|h%=FAi56!z9E0b(Jk>^{AJ=;aQ=NEsjsN z5Y6AGu(z7G<1o%jv2?jw;@4&9YM_vU)B!!jLr$gef!3#Bjk5G@%y)~f=vP;w<^ajgLO^Pm}J0RR7ytFB*E7(g*DIUUCwWYL_ij;ny?U zPoIw7YymNtH^vCj0a`qUtC+vnP~sFgyTMtmXo8SqeapV?o$yW;e%%PYw?b*XSGeeX z_Q>rY@RRIS7m`;YLOcE2`DE~)DOUH?x7m8N8?nCV>SpL@&;xlqPX^z?3qURKA&4zl zmB7N|;x@g#IXkFHnJa|**SBb`P{w-& zks&08MS7>-#*De_^Fw#P0O-iEpbmiDIf(cyA_1I!4saT_BcBc!3Mpp5xr%-%3fDMA zqzX2^JbmJ4{_Ii41^u6L!UB#JwO`s@wG#XFnQ-SCzNpzmnVnXcDCT%yT&aUV-yx{p z3jplCkAMrV33<3%scEp%2mQvIU%x!RDmG2I zc(#IB7i!M!70dus$peZD^8_$e0;`)JZ?`u~czb)r-_WF{#zsa(DSi3!$BBNO@ht(H z5|_oiD*E%6ulhs7!V=G71ck|^8Sp;{7fqm}ppnw01Rlg2s9*J4-2bX4Z5C9ivhKEjMX^}YkyRs(n6KgFDf(F*IaYZbwf+bpCvi%y@66n zAZXDYoq1t8V#Pgu)Wh(8;b32Hx@wJ9n!Lx$)cE(h}5 zEU^+tSn>e1@@9D8T>$LoC|bQh+u6}Em}InQGG7_FR|**X{s~^jrCKeg@xPlKY$J%_*ue3vb$3_`x+tJ>o~lHp(o4Ie-52 zd2pWUnwwXKRZ4>|+u?b%qxXR9OWNZ|O@S1RuuzZTXP8jB+fjE@*>vgLD@E0t=IbJT z-3%KQd=RJ}#suaA%1~@rwnUs=?&@sllR^yZ?}q56aeLXsz?YjVgYmQdy9sKEn41BI zz3SacJSDSP(@NKirEHYfm0t?Z7w$ds^;>K+fNc3}bYBsF_Ap4}Mt8l>RbdAk8(V}V z-y$2pP&4?z$X&2sUf=hHx3{*qTq<=sf>HKa<=b=0N^*0r0^ie|H9C9T^Qz1!SDHvl zY^pnNg%I8ysITXlHXg~^3ADkZbGA4cU&CM*;xsjjemh0_9PNa(?x(%?tOim`7VgJL z4i1L^gnzTGcpuh^8mUs{*1jG0mcxE|Sor>8N8{ex3{nSp%Iij(PPc`c^ookx#pYJw zuyJPADtlXdRMe2oQ|F*|;>hlo&zzvHs$yc+Qs!qjPBz#ys^O85?KQ;v4=R*bw0uAR zdyxD3D8yBc7 zf5FMG;(!2TryBOxs>Nq5&smG{XQR&sJvdwKqXF!w!dmN6@U{7(%)lpmdwqNR^%!bJ z=NdrkERl^cpa3FUOnkztBro6EdlCQEeCeG!0y}v=S(0VOu%X9oBG1iEs)ufcf~jd= zk-ObJJo=4eXDHVgvv3%G-p=MGF5v{QA<0FF%4xSEv8chGQ3G$b_Vm5^Il|qhaFc&nkXrdq@1ht$7n=YE2>`li1BP)5FcjEp zPa|)t8k?FD;Npe`1)Y{Yng7#Hp6c4@d}@uRxYw;)`kY3|q50_!TPzy7bHm+4(0&M+I?o4JA~7P5|ai-eXMcWt+O3Z3wrCqqF`EHK@@4}^!(gGcJabmvts zoesjQ)S|||K7=9`mER|JEb6!R7!7diO+_s~S{S^PGge$9tX&@ zD$l6^=vk$(A*8kMEkP33jMYm2d2mR`adp3pd{F@xZvtNI>{pk?DgwM?=AjpZLR5o z7I_?B2l|?L9B&fV);hzD0evm^{J1bW0FdAF|0ZhG=W6qK%!I}XfGx-U#*3(nei%r+csV*eKJBzjLAi}G)bih*8D`RTByqW>_ z?0oAjRH<4DG)Q$3Odl@gDe^|*+4rTLe}u|Vr)%X#7R{C#n)u`<@;n;&Ej{3sS@#^O z*a`O1kTg*C0l3PKhZw*i#40VC5+(T*QBrEvL!Py2stsQ6^qav_XlYknlYp9*$MFo$ z2ld*e91qUX(b3KdJM&@uM30+Mp7Fva*N1s|EYotH**Jfnz;nMk)|j{LZJ6~|FfqAK zcDO(2qSDYv8q_blT#H>$tyurIQ`mGIDP6T?JL{6hWnyaT4)BIm!%f_&eH&OR zbtEgXOzHwJa-~PnLrdAjYrC%muFZ#v+57#CdA+p11?P+;yJ57|D&H1r-+nJ#kSSZY z*xWHX^;pV?`m>l*XE^NbFz+1EI&R9MVzqU&wDiK<&ghx%jqco&oX)!eK6vmMJ%_7KL-xq^-Ut zCShvMm#0$FVkF;!Xr?WD`zPc-Q0SEcB?qbco1R1fFbSA4wXg9k8Z@X;ZM5xfu`^Mm zQJ0NRj3mXhYMNBZ9!>q|wtjIK`4w$qZ$@!!f#;XjJDT(J$p{N=9UV5-VA@o-yEU%! zySN22#IYvDhi9h_IOOr!Vm5CKwh z^8RE-le0hZPEPEUl%kZ~q9rBt&wN$WWc&q)lcjj*>C?uf49UsJ%CUef-ptHEWqKN@ zjaODA@9yku=GBZiYNGPJ8UE^sn#0LvSHfz4Y!NL`eYXQS2>2!SpyW zj7nf&HeRxqFCUvPz|tZ0O;X>Qn$tOZ`&gT9atWEIC3lI-?3PLv6}eE zPk$ZMlHW|7(EC5qLtuy0va7swM|TOWN-B)RqG$7<=!4W1CYm`i{XesL2-}V6_^u< z+xzc?76~_)Hm#k2u>1n-3{F;-k61t96o)2|LdI}$OhWuCbBN7k<0U^pi0SoMWXayq z<55ONFyIJIe;S@FHgpwXV)=keh#hhgBzzUnkNu#)!2C&QN58vKKa7bBx5U0){&wY$ z7*JIZhvt55HQ1)GGJS)o3nod$n7#fcFxF&3jn)2k(9iuSY?y;! z*u0vrbl8PpRMjz$6w%&y%5xF4K2ql<-xW>7KJXJy-ws~T5E%KP z@rm{2&QS`Yn)%m4Oq6TDFX3(5A>)IuU8Wz}o!fxT zeR{)|Zmu+r`Z5jQ;BWmV9H<2Vaxn2h=O#P=wxHjrJ`W9~+&M${^6^r|ay!M_ADl+t|la2}5gaDc- zL2ut51{aSAAUU9xpdhAAaj6-HTr`j=@_P*92@MNT33OW^Hw7-jQUQKab-_UM7&1gm zdi^YY8rYi(50_v8o*8_x6+n9#8@|%eVC*8t_@wdy+ zz`OeEP|~+{ZKFiyqgxM45g(~GpSd0j?og-o*kM{ODxTV}47l~PM8HG5pr>ZI8B6X^ zkU7FIzhQ`^c4KjVj?~D^fR3H0Vp(n8ROO19Tep}3^_0w%+^)L z94VlxkSxqFWzlBxXKG!Ja2Hh!D!&cRNRPmv!8^w{5s0F!>Pkwn2#~I5Bbn3{OO)Un z-rt`LcPthknIbV`hY;*Nw-vt>3iuGPwZ1B0W1YqPaUSqE@|}|z48#%BZL&S4#QNzX zJP=$w%n&rOD-II1{^b;w9@7&Qcr&pIcGBLYB%=_?QUUTw;ve~e;6zo?Hq1mNs3~v@ zF*X(;Rw4MzQGc?It^2?ZKY?`k<%lQ4n;^Xw!Y~lgo2O2=8EL5)p72@-EkD`TpNp$V zU;IFga)&xC+6?5W$bX7yvlW;1W2c|{7N->;UP(#(W+Ka!m_4G$ED&t+nG@2sdho;0 zR%Y5+Rzc&P8JB3hkb2rK>gM%MyLoAuu%L8ipP2=VN2K1v^OyE!3Sg})H=A2|WIKMBn_ZyX+Rw1XB`n7U zdHVjRQx>ofGgn4T1K2it6f zx}l9MfK_Qpz zzo$*sIvYO`Tm&zmSC@Pjs9M#w`9c#mQ=Us)kSj789KYdSrM!|_9oe}H4=R2IeQbmM z6-WmMDO2SuliCWy1Sc{;s|+LEn?JTU7xdiTr%T+`4GlyvQ@P*d?k7evDi{3>{H^Mm zO_@!xT=rT`ozzfX(3rNdHI6lvKhHD}3`j4&RA1Qj3@+^UXRw%f#xyGHn?OZNl{w5< zPWLhN)y~F%i{%Q8TI}IRj)=9^x5Jhc zY#faUfRf^~8m5O_TvH0er>D49cOXf5v(68JCs80*#kqU4psAE3dWkTlH06Gr>yFh@xccKsHLR;xv^SJT~}bW4%6E!Bde-+%OwTX>xY)YQe5Px)(F` zqw}$k-2R)@(!*J&gy-gG?i>C2twH@>WglM(EsCV#S!3bqZ^E7#w#>Jb6 zn{9`ra{`MDo4*ooP4b;pVC|1%ckd4~73*LYZxa69+8V&HvPtI=knznsq;ziNDya zxv>P;yk-LN#v%JW$|){}2rkVrd@jRV!LDzU8r_7ZaWpAmHxb(xF;SJ>ea$VY^H`Jb z15VRX-TXP~#{?y-Oj4S7f6|8-A|!atsuva>U^j7fR_srzqv)2pz$8*e(m$kX{dzy~ zG(|Fppl)wtJ<614JcDdpHJw(a)i@cr{fm5>)fy0}8vLj49B7RZt4&lc;{W95Brare zJJ!`8Z8%|0zus>^-_QT1q%CtZMs0nE3UJPMWmO_fCDvv3WAcq%Z^r!%0b8xN7#{!} z@BqcZa7V~f(yPEz?rAnwmH=DR-Z1KbtvlL+IZOEC%TFJWxBS?nxy{f)yuW;vaWeoQ z%8|&QmjW06CAz(h$^>R&M$s%AAS^%koAZb|!ckTGF!QCSS%27DYJ5bhGz&<{=!Xgx zTi8sz8b=hng_|^~Uj(?7TWKUJ)x@VnFo;OxH*sseHj;~4U!Ex#4i5Ee)b-6a0^$~^ zhSKBa>&f9AXYY+c%;RLKeYrMo=2P01{bgCM`|`R|Al>KNJd3D9UPhks$e0AqsXA*U zbAR5(Niu4qQP0IAp(k~BDD{)26j}P?7G1a=q!B9DU$c{=^8z#Vt7a9#q ziChQF8g6b?LIQX;8$GyTmxkBedXYWlJB1;x_o-gyUcn_e>%*{hpr?E<_j&CP!cn}UU+djO_*gtwbCd61?w?&4SW`#kq$!o zD5%39#U~vv$rA9JOmTWuED@>~639rNp@KO|jcgP%sY{I6mbw8Viu1L?&CsHG28u<% z0-HE&#i*LD*tLL6Z0qSi&a;&TV*vZ4sB~WWX-4^0b$Pniq$wwMg6t%*8P7WtHe%qw z#Xl$}(i{4Oh(8<}aLoaRtS+)73h2jG2~?e6DpZZ(tkcTvIuEX`xgFss3T=Mv)Bs$Yk~pJXawZ+0hHcz!taGY*sq@HOqZi*Pj9JRYjey zL2f6jN7$vBF-y%z6tnpFYSTQO(TtJP95)b-8M?+P6^wVikvn_qwkD+Bp&U_}8bi21 zzGaLZg8D+cOsFINXnhA;O*2H3mDGpQCFVRt3#wj4yPU^LncQ(GdMH!m_)~G*@i!3E z?OyGm+Pp5A%Qrt1j3B&AY|^(*E1K=vUY0+UvG|?nadhK=0rmeQVJ9KIGimq1&uFZ$ z@r!*{!ess)c5z!a!)#RkR@~L-2C~+nBBVz*iiI$ig;4Q@w!C2cvp`hAAW6n&$i6_M z<{eS^qa(5;eld{xBies~y$PW%a#0Ym>`xwNKk^&LAC{Er_*2^5bm3xsKfyYv ze&#~F^eRCVkMPe6^s}xoH%7o|t}|gflmZD#L4?(hL#=^bEojAx8NhiMhJ(e&%+XvP zccIw@_7Y>pJZik>y#=`x!)?_QX12o=WY4EaWEFId{X6`AsC&pVarfz7{}@i|a=2r0 z?rlXWim2=$0d!3-8@*1=(<-}m`M@3u-ayYW)K+yr!Mhx`0CELj{|mOE@;xqM@^m;5 zT{1j)J;;8Cdw+qi;i{%=Q}{%)Xk}`qC53YEAp@2a$-paQySaTYs~XR{+7E6*i=lh6!TeVG-eTU zKhY4&UaPk9p}87c;K=0b9EsTHZa+IYIQF zer2{je;xOe#~o(g1vSB+PkYyd$7`q0$DJL=$f6l%(dq)Exl9dQm7ErjH#a=`d&fZ_ zRqJTPr_Dyv$)WI`-@z0Zm{1Zfvxxos-of)0WlYA7!s{F$b}(be(xABI?^(x`vC*z2 zL>vpgIao;P^vOKII*LT9F;l%A9$ogLL4WRFo_;hvmtWa^!vIACqUatjLOKogievl; z{V4eW8;4(r{$7%Aqgn7{Std%T)7a{h85mG6vx4FBrrlE6SMpe?4=GV%5kTM%&3{uN zNhP36Lu^(UV~g83yaVZ#>Ryn)EMpJ9|FkDrpZ7UvH{*3zplM!nreuOll{ zmW!>7My<%sd3y#wmrdu(dYUu)8`swAnOe>j`=qvsV_xvMmrM;#MPe*?MAJz~bJX!$}98ieI5Ea%rDGR%> z@qd{>N~!b5@4nN16>}l2?+;B_xlqUDPg15=W%G1a3(7Qj1~E}2$^B9~iq85W{>wve z$S7`MH^Do3DqP{I`P$Kt0442#gU{y4IC{SWL^yCS&lZAx^|0~^OWR1V3kpeDj9ib; ze`vTRDb1njcg4uR(i80|CdpFyft5dO1?P@A5s?a*^+73qY};+} z@|~2BcqkfXVzg5X5zPPVHOX8-Fm{Eq;Je#CT7-&jx3L!_c|{P@ACw^s+nJJ`A-*4I z5SYmg7`EcplG#H9F`{j&F!Ov>APVX0akC5W-{bD-G~$b^mI7f8W!a~ZsSjJ`uh35e z{ao5x-F_UtAlOGh1T7*O4RuG+>!-BRKjC{}NR-h%@Vjd}?9KY;&DZ$`%=HB{j<$3)dF>o2blWe77s=A1ubEv&g?ltHahlmdi1j{=d`6FO6{{2)u zRx<9(-`Uwm*$mRO&frYSE%u|{!8WlqD1c;r_kxf~-1J+cc0-yWeQWc{Dn5oQw5nalKJ(r8nxfX#=dcu2Dmv^IuhKE zBF}U~l=Mh?+Ke&2Ec8|BR5%itjlm=L@*2t`X?}l~C}13N(EYX7C5FPmE4(Xg|C|A% zmN%fUJ01uE-KLDS%S1VFb;aYjLC2{W&!;Q4$1L5n6W)V|(av3zE80gZNF$jUaT{p3w$>8WvNA;)L1|dHwW0 zp~Egv;y8l4lzfC#?_~_TShkj3SZ2S$%Cdwa(?RDHDf(;Qo`g{GtAT__{fk@{!Fc^X zCLqo)S;qxpf}Vy{%eqhyNRujq&o3OA4?wHAUZ9@`e7#;JM+3wuVk(uQB{le<1^sbG za=8strSkY@QoS*@6?DpzQ7TOCW9M$ue6N-AIrvRK_^qaqG3EOm7K^&ssSw#jecGSf zMqF2XiKOcR&ph!Ii{L9_g`la6-ATu_+nl&XWY39S9_n$-Py5EapYuzjUqD0%B0l*< zSl&Zmt7+uWd~6`ZTs}DKI={m?pCA-$y5SHUdp&=1JI~}ZOk%nom4Dd3@O*_ygl(0O zMW?*>Em50~W*3z@5>z2i?vAI<^xLm&^D0gxVmko`GA=?q&h z@0;>i2EXX%AA~jx?2su`UQQ$)DlMJYmv+ZVS!|Zl9FJ|a zQ=VZFI0vkCad~anCPgDv2{zniIR2dA8M6ywjc0szBNv2CcFzsqv(Fj}c}9W09ol_P z-In56jo+_K)gHevZOx*|O!ar&*e9m0bBE5@Vv$d_VXCb;qwPkVB+I)WTdmf447#1? zcu(BPTr67vo4C%l^la+hO0g9goE;0&v;B=%tpXc`g_0f1xr#k6Jw*>DL$UCbXu`_M zZzcN5ngS=!a^w18r>dW(D<&=)d)T$k_8GT-6l(5V@u2#xS=q-Uw>o-!QuO=_?#|pk zfV)z5ls-~Un(y=EvlMBS6G6^DMUv~SIlCcc9614Y$R~x7&6+2ekFY%)*gTBL)e}*tPt#4E{*I=N_poBRRa+IE}j7n=H|8%Qwkrzx)p2>&|lT%hggxW_k z9SJkd4sv3A!DMuuev>ju(y$A7LFU?31o5g3Tx1H&_BhP@ekW&KKTS$$K$@oS3VGE{{O*4eyU_3Pt_SbQIqdu|b6HB-a`mUPpMl_D zz~{q|kFVQ*)h8z3Jzo@g;}uSZxz($H?y-RkKvG|pzd0?`TiKJ=tvl9#4qNMcBEZya z9)$)JTs~0fS3J9jluToI8B?Ox%jN>9Q+{87Eo$&?hN>Pwedd>~{y4M~4*nB+?f!j~(;9Uj* zRQRP{A1y)M`q$P4CvEMuSEijymfE5sc)*!_b0p$XH3s4Mss33rsf1=%t-O!=+Eb+Y zmFRZ{0a9^FR!@)D$Q8^gb9I!W!vU=_!75rM&r|w9jcGzt9dPXbVNXdrk}1)gpz)d> zK&$6End)({=T8eCj-L;50(j#OMIwt zyck$OS-Aaa-_P7JOPnas;cAx%WiDAhicle}Y$GYn6^{?b3>$?nP5#+WXW|v2mHk76 z)BTdG56KY*8lj&3nK%2(uv;+E_W5|}Ozl{Y*(`1&u-~WKep&BLWO&|5+n8Kb^R{ox z=^@Q=9oz>XY@ASVX3Zwc?sgskG}JSB>T5CH=XZTyDPaP^o&XBH0Jv9Z8Jz zUBE?#x^HW2+C-Z8yO|r<9JVij}d|vP_7fz%^M%g65-#qsvrmh%=KHi{zKIz zp`FQ3lFa1edJVb^6TJ|QEerc-4qU+}E397HpvlvejdoLp_DLY8)Q7cSylwfeR@a`y z#NTjBEtYLn<0+XlopZEQ~|NozBE-#;P=FB-~@3Z%PueI)VUub=HE0ADm zDIj3A9eUbIoOMpB^rF=04N|z+eMH^H(<(4&tX%Ps-48WF>Ym6-G96xYpBWO94NKGL z&L}j8W4Yfs_3$8|=1AjmtxV9Lq8tNS|&*UZpofT3Z4vsT#JF1T#B%&{t%S!QB|K7hMD z;h8?6M~;si9P)W0S5RjU6YfFgj18GH(3?#ba&`Ix~pbw@&FZ*`Aj>EeP3 z=<7`7Jq!4+LwTmmaYZpc{SiPF=`(|f;$`UPmtPA?{IX8&FZU=`;EqZFT1XcUiTqi$ zgf|vvU+jUWpn))+@xb$SnNNSTX`on8L42fKkP^pgs=4P%)tazOdosRx=QkA@U(JsG z(36>nvZC?%hDrjZz(@U_#E!)fey`OS`%-=XRuV%w z?;^!J)DQD%gC~Y2^R}+|>kHs+vJP5aD+~=2ZumS*2i#5oO3nS*$4IDeL0vaih)gFJ zI6Uc{=majp%Ki+#g-d)T81Zp>C3~W0zV{ml+E!3*U$Vb$jDJMxXBW4@k@PJ1diUN$?v5x(}9sp)e3BbOUnwyBLVdJQ!ZlW@mhDC$I}7@=^_5mm(D|VniXnr zQFyWP@>Iex@1V?tBgu^!H%n|^EkaX^XJR<|vy@@kWsVuz<=gegUt6vCMpR5kP;SQx zr}EXS25Zl|v!>2tx3)3;dfUJBu|>xeEe%)S|Na)6LKGF-SS(%JNw{_q8GfBPXC|#x zDF<&ejTl@g>aSJ(2zDO5-d8kHTKP<5V0RzTDz%CAn0U&!qAde4@vAIk)7UB&WRRXw`*F-p<8DD-&8v49su(Wmzxn$X5?bh5&c)_C$jzPy zu0o+ydd!Y^p6Puw_@A?#qNk;QPxVb@2rgw*LQl%*O&sX9&W?{?`3YhfcPQ5i$nRbb zMDTTlXq)|w?WVw)R=7elHVn@wRhSy2-Ly!R5vx%D;d-n6pSFQwG%UozPp(9y12;6r zHoQTf=cF8ma=*zHoHC$3RU`1uitE91^A7MeeV5ZhO_yKHc=&m06Q4t zhp%&+n;~_*p|v^_5=xMEdFvY{us-0r&wsEm9%y(my_&80`locX@Hs&G%F+iR zN==6nyxio4vzfnUpKthlYxHAH_g{ADI;{7!kU;vuO3B=dYRpZ#;geuk>eucISbUI_ z4}7@y?ZA^2-@tL_)rs+Z%5c=694)ceKRMrB4Lx=C`QWCeL8m2?*wv!7WWcZ>(d^2J%bP$95! zRNRXNjum%CS`U$iQktAPp+YeTYpVZrhfVXKbgZfiDin`wEW2CcR>LFDaIfLt7cQO; zkxy{d!-SIVzJPqEvupAQL2mYg6I)5CG{+*|U;L+7Y?1@-XMz>xX(|GjeM)pEcl-xO*$#fy0ET<(|f+}3|b!CUDLOIQ2fNBG)xXBr(#a6FK5+jk%!(X8W+?hycdGj z74$%@BBltMB+Gq8{Qt|uPZiZ39*gX)U7wdJPq-ZRG!p_)|wEI*!fb0fk=5 ze!f87)cK45>ub^RlG+iPnfYHP=D%e$A2@onHZbNjG=nof$ttXW;ag(DJ8p0Gs&RP< zdIck*w?}j9`gIEm-4QCW|9Q1m6($!wL%+C5W3(OazPwS-%CqpRKEDDcX|yFEUN#^1c6CUGl_~*S1TMU z^u$&HN_;1!MB+!>7-HvsaQWl^M%2+8+(oN~C>&6b_s=-+8_-)W1Vux}0Oq;>Z@3PS zjIm}G^%D?vrP%+DWQjNuZ%_@egKPNq@7@C0rj_qG7k&tuC*8LxK7bKq5xRLdzM%8VS^vlD49&!2AQr<|=Dp_y-MY}Ps z#PH^>O(RZ{*QlufPTK)-Um7zJj%)vU)_r>fPP?Q3PS&CI?*aPq7+fxz1cD*-;`n!) z@P!B;LV!38%*rN$yGhn`0uGh0; z;ci)Gr{&O)-)!S!JFd11H(kaD=a9v1+<~igSy}H_TId(mp$D*9;{FLwlqAWE`u9># zS6HDI)Jcw`hZ1LavoVhMk8!Us|EWxAQim5tI-s)PQn8|q-*R#$X3BaDqRPsO_is*k z$^EmAbM22-IuRzZB|;8cbWFVR0vzds~mzmN#Y zMtr2C6MByV?ZmzhG1=ypR$(%mm#m+p=Q%!=Ct@9muBz4e7K3Xk4_A7Lsx-e65oWhE zngZueynxkSz0zhPjHtwt1@C?ApqvpnZ_h~SnO^*FaKeXDh9O2S7;h47*yvDuM_BQH zMZJyStWGW#c((V-jyualJ4F)P+E31)qyDQiC}mXpd;GhY$xbx|^5eBE&-} zZcf<@g7{BL0o#tIL;vqLiTl9H9yRPh{^p+|!3+1_`!5i(Rn6=Ip%}F8J8DS$-*L$6 zGK63+5-QMiD1Y9aPgB{ZHe|wEKtW~la6)h=`_e0Najy^`46FxnK+joKGa|(W{aQ7$n|Iee(4Lk<} zTHQG{^QgP<)jY;ZR{R>+wr95t{tB$yh34rI{PYnvg;Ko?lpiMq{M^O}@-5Z~ ztXowRL)G8sZW&-b9nIXgk`ZVzOFTe8B9YgmHQJM8?+1OxL$^xmm;lu2RzFZv5tTv!)wyWKbQeD8z!pVa4MCod3q#&tt8ptL{9Jp?;QTr> zuL%8Qv8BH{na=p2{2NEtxd62FG676t5=`Y=c)#P!?@F>4TJB-8b!!tT4b>dTb&}1u zlsed?&Cz?+`zXeno6wNxB#(;f9EyQnZ2#ojrD&7#IIN=)?OV=)d9sbQZ>1mbG=Cd) zF$;GVl4$SF+yIs9vH&N`Jx*H9`tR=YwZ{cFuw)0!f zbL0-~#G?nClGpIrpyVv@IgFibKfeszBCdvRH(Sf5+MQS|CIZbG*VQ627$4krn4uD- zh6~)Og@P1dIO*%&!r*D{*92S*-)1Hs7(=9ygX!QD9!B0zOssVE9WK$w-@~w&Sve=BhFpK|al&2wS~b6euV7v87;gpqEth3_WPA55P+PU{b$iVA zoH^C7CC;J6y?$emlI_H!`-L)=u>aa~kDJX7V83%5mDv76PD++eTRv3vEekWV6ctWj zU?4mD2pM;=$Cq!ggG2gA6D@0FcXuHvH8m0Flo`8ed0bym5KFdf(k~u^a<%MPFJ<~f zZH+ip`H;9MQfzFB7t+A0Oe}qKZ_DhL!0gP35i6l)A#HeE~-#5ho)?*x!E(^zQfcMqn3vvyWH;5A01Ca1T}}tbt4^f&fXdLU)(H3Hv&6H zXh=iDoX5>>zfz^uKEwmu4O!r$5qn!T^T@)oa#$!JSdNzNHB$`NYkF?AOvTS{qULYr z-#JTNL-_Lc|i-U{+$}ox1v3wdixD5Y<)1IU5DVI|>SGp|+Ny3bzK2c@8sMy6d;cz!nc0~=v8lB;`6ArH04N%4!6La$O z=cC9cc^Esl^RLKiG_04u;|+5SFw)Sl)6h8d%{b+$6uE2%s=CzFPV7Bt`<&kbJGZ02JL)zFX*57-Z_qGOwVjiuF*ms-T!k@ULV zryK_BD^tmSppyKj|KGkY%`&~oY0HMc=8bXjaT_RHPEJbNy?^^shsi0Z=;%HdsF<=6 zc07uZ(w8zJr1+!9Z10d@ua;O;YTfnwx#_s29q&;P(Mi7UVjA!kO3-pY@7v{Rxbj-` zzuvpQeooRPoizLf^)k(dArXy3*&OrK4NX`UQRs4iW!f7{kTthCuPh@!;pS}E zy28!KDg;ZnbaF#a;(|!cU~ox)n_Xie26-2lXFdX}sothd#k5Af!~4~=wjgcdL@Fwp zIqQB%+E?8fhGGYJ`|F~HF*Z3c5`!YXp;t&qNK$7T}g>-(b~$I%S9wsSY)_#W4z(? zbdN#lvb1Yr;1fKC*{aQ#*_8cnu?jy|E-pzIrO^I0C`C+mvte@W+NMi4l!LHkS8q>q zG^QP{0e1l^q;JV+zkCPW)5+cHH>x|z*}7E=X`p)REA4;UgPvl#e9qKed?_rUt-ZfT zqFv6)v3**zu@S>1DhfWQK>G|Da*C%hF*EZgRl1%i&9i_usmv`<9O-(Rxt?A4Nv+~bTQ1wl*YrWhjRjAoSKG)}u%BY-Y9s`yD%qLY z{Rv#%U*2*Sa8?@KY?W_sb};mQ81=~;spf-_I5LMGQ~*# z2%Jv+`r|lfbv1R`s#&y)F6U(VtYVC>7UED=2`udAsdCq{CkgWqBumar zp)0K{`NoGBpfn5X6DU>rJPFK24xv~9ZHkbc82IJQO~YPc-$l)yscE(8 zX|-T7KAUY4h%{B$wO8yR8rlimz`>?^$t!>{iwqMJz5Zy(Hs}ec_yjLIdk5k|?hR#S z`baIi&DE3TegXJJ(@lL)5yr_m=E*r3kMqh|?OtF&KyZ*B*jk+qn)ugv+T>+qc3Rq` zH#>Si1Qs> zm?XRdv!nLweCGIB6LcJ5C)?ilT&>^JmYw+rMbJNK4z^dzvwW2KF6 zYk90vW1Mdu);=Mg1H)FeO?0w|g_l=(;Q(77O`5L-DOPLxIty(=qpLz^^do0{zDK@~ zcAz$0zuY)u+kLLU#95XW4|a7Kr9F0WoOwqWxL<#~Hgafu1#_-+KSP6aHh!Ujy9K1q z@>KG;=|k))>UXV1?+K%dDmYy}k}Zl-RUYyvsQmP%sPQVycmG6Is{4hAhzOQ&5E;)> z1oCcsM>{|4zZj=|pJgBIcZ1ygTvp=bD@@7?r}a znu$T$=DXZ|71ND_Q^!P1z3H_64dK1IB`4>nHl`KPbzJ2;RU|dPAFVTfCMF_*ue6?L z7tW1M{dReE{^XZh9N{Jk7gx9iWzXNP%=zC@Yc$;ZZS8Gb?xd72U*d#^p;3sX4{jn0 zllHfl3=RehI0icrD(5Iy&RKILB6oDOCwWYr%5w}aS>sjJ?;|CApNvdX(wR|MNL~CrKRT? zpB4_<8Al&le#ss8nR8p?^sD%lvrCL+_|29iB9fVC)$I*LKjCQkNf6t^(U;&xoI+X7 zrdH6t%3Q$Ed&ab<(yY1pp;2{c zapM9d=@s%j*nJt`oN7cSbfTx3*p1`TifQyG18`b#{J2QyZ{`1=2&=qLN~V3Y(Dim2iD(J8`ufbdr~F` z65d;T?Y6Zh?xVLw-o4I+L?Tpi&%*00=N8|ijE07S0Q9+^2w2erq8YX8?6@fOTwUv` zb4tJz_F>76{mIrsu&&gNo&7$$n5th{K&}A zyP^gra7Fu@ds5Q<#SkK#a}KN{7xp2%CvQtG*kI zhyyXRMMit@}$Bl8as$oj-aOmhlYQ|+KJeAydQL>6&1h0O=%9wf)8Qp8@b zDOQR+uHgs8*%os1)-vOJSv=`o{f%26_8HY(*({BW4!X^g-Kuw4G8JQ^-ci1O%>$Nj zw`MI}#iIhq%<+!L?J6fSoi-1P%b zQAlRbJth8CYW*bz#EiEr?A%hQk`fYiyL~QcY3bGG^qm6oNI?$)p#VzgRX$}3MR%tp z%NMusVy&&=iHLU;Yj&3?g%%K>dms6Uq~-6}dIvZ_?3ri22rpGz8lcSfzy(peI_-E` zvfUy&TP8~hRP5BOF|uQuvpW|0I6=@TAWxdbXXRR+7ryCvnj{xLK0SThCB8o#YRe%~DM32@dd!2ACI;(k3eQ&e zkcDvuO0A8o4#4HS$7Fj(mTWbhcrMcM$7(`0#3Kc12bARlES&-axQqnM(!ot%tNcv$7^`NgailF@u-{Hvb3U4iGR1| z;ImVTyFNQ`TcUcHhfKMMQ~;{L*9$ zk4*eZCNtU^64|gYyoR1gW-dw-KG|`f;wR>8SsibAoydHhI4WJyFS|<0=TGn?skAi5 z=4=|IR2+i%R#@dQTS)Mnpu)xv{-`xl}`BaftOa7n3Ya{08JX zz#dS<_+Rvs#?F%Jk!f^PTKmMr`ZIS#n4CN|| z(4_cD@=xQ|Ubj6y+9t{Fv{kfoccm;)*^ZgS zC#^Adax!ts$-0_(;{fci!9vzHBGBB^*`rqNoEZI4Ok8|Jqd=Y(SVzmEmZ%k&Glbs| zf9>bZ8!yNvE306wzFvP>Y`EOndGMtFI(jZKW@2J`zm8*U`Oy~Rqf3;>NX7%yfQ)JC z2HpS+dcvup2mH)>2QjJ|G9I%flV;*3dD*kWeSJX<4O&;y4#t;W?d{GM_O{25_Zs$L zwGazSb7S!6Dku!vuDvMuRPIAsGi*}semcsI7nllc_Ufhv07+evoTg_zDUfBj?@b&x1!)l7I2cO%DUR^$f+& zdU|@!Vq)&i`CPUEAnorUYv|b00On+U$)6=qKmT?Wy%p33Ib$?s0LVj#d5a;3VXG&e z_3O0)6ZN(((zfARMM~mgeQ|7%)h)KOpdhBkiyo6w8{SO1^Yjcw3sRSHUMZ31y|0th zSsM$=S6BRM&d$a{7j@DHQ7upaov4cQ1(VaU! z*xQwXCB#oe_cl))oME?`Yf>O7MjVVy8UqC5 zBgwB{8W9NzHofJAw^c`@(dx1Df)c2cjS#s@FW|c`ifa87%>fulURixyZE4%900}nd zyLZN$N0CshSeXj5%fI^FsK8CtaV zZe9PF7J*gu_I24;x&<1z`nC>|n_(mx&Lyj9O`Tod8uWC^NXb$__4L;#e0j@FN12uQHaT-1YFm7z+OYdI<8jaIpS%o}Yu zZGZhC5Iu?GsI8)(|7t<=3P)b0;nMlsw5X1gcg1)L*vsukYrDGd7%}8AKp^&ea0AS6 zYK9lx-Aw%I0N$7tZKMg`%wq!S;ih;#VG~|oFA*`mBdm9vxBu1Pr1e>K_HDtSjPrRc z8F#-Uh%$8EZfLvSY@Su9L>FOzZ2s!#I6a+GOQl4POTyIQ`B@xE6ag98aY&KZq8Tw6 zna5)F?Er)eG|HKESm*Qelk8E&^wC7J@?z}_fnQ7n|~*7xrXWs~y@xOm^aduMt!W6YtbTgS}#0;X;3ZlB7i>2$> z*_D+po55p;PYq?Oi6Z}$GF99ZWmcDD*aM32i7? zd2#JKh=}^CuE+YW2b|iwL1<8*0=q7~rHfP5&`<=(dX{poU5#I}Cjwy0#Z)B-Y{!Wj zZkNd%Gy*yQCU)eT7t${3-6Q(MwGa91Fo(dP02YCX|9oEEqV_cx^~ZuBMC_yGdK23) zN9vP@(#nW5L4p3;%Uzh9UmDPismVa*^M`fbeG&IZvcQ3Kx!MO*r!7m5m8dJgmOyDb zhskH_$j#J4$STQofBRJ1hFp2*7ju+5j8C7GFld%%g1>lL$YMP{ zgA8~#aEKZ3eAL3Z|$p|lkH4^Y+wX7otiyWdE-=iZouupbf8oYHu z#7h_VAhxp5Ng%NJuX)*TW-j!rV8NhL_^+wp(qyz1PFVFG;G~=2_EO(u&5t!T1(by} zO~$U#LH_B<=%G@+&+vcxp82@V3T8fQeyqHOk$XIu^vQ9*`>6lMS;G4sZ(pJF8@NLB zJcA2Ahu0z}tduczpMschBdt$+b0ax9)syl6w3K`mtgv|@R= zsr<+H0qzn0Q5SwCYTv0@i+ZJ@FDYtEvIms|r2~8%t`F0H-UnY!SdKv2?aF-Gg#mnUf>`!5&xt7(a09cHUxY-M3@#qIkzJJW3Fe* z&L6+T^^*IpfuP)cQ2z1dtUi<-pvWm0YIOJRy?^gAsx1F_2^@)qxe-TrPx9{w&wM{q zgD6*ACj=p`p!fj%wNPjKNgY2GsNf1C)&%sEbHHpas6yt?;bmoZ!kq}HZ)OC4V-1Rr zDb8evX|_>8O#aL|>FWT$fKFGgDJa#odckfS66Jbi-@&()XzTWCKhz3pOOAM6e*d;b zrRWG6X}H}}-+Lh~-CqUcnNKG>w}ZgflRY4n8Oro-3yb1^bl*_`NNbKuQN0%uUJs0z zZETLgi@EeSC1rX9eWVNx3;t8*dJC&BDMgi)<(bu))q{G>)f(_zhH<>!csW!qx2+Z6 zzqvDC0X(}ef}>gbC~>`_Ti)DVyD}$A%UF~FH-vOcMFBFXGf@4z@kq03@GUN1)i4MM0wB13 zkfg&T*F3VYf7$cju%z}6mRj`!DNAu<-J-+7tMvF_+q)QlwK- z4!(N_4awh`Vab-Op80ZinIz^i@)Q{xdy8kkzCXzkM9*Eg_8^caF`NcuSaXUh?KAL? zWj}w`)p@l{+UhZX{zCM0!Bp;cJ4cYiGkw6E3;374L!YYj22QVxJ3xg2eATEETu_0n zxnalWE9(l-+$=m?DME^xA_IUbgQ3{M5)Osi)YLeV2;kUSUHZv>!KxTQ;oWvm&sYJg ze2qXV_SB2U$B6g#_v2#*)ZV-(P?;Vdcge`Qs)x*7ACr;J->f27hY173;F5uT(AX5D zo&68P5b5Vr3eeol@4c#)L&bKCVPk!9L3w6D!FQ~%urT`Q?rg@`ca-6KW>n21?>|*r zmGEsR@mgQ6;w9NnVw+@-Z#T@Ym`fDpeBP-|zMoxP{i_UG18;doAt$a6r{#Ffo z5nzH0)!Ce?2}{VBnc2xaokiLB(cn2?P+DGD4lt5_CPsiO#eSYdKkaksa(}S6(fOl$ z0GOQnOaDDG?30m|4E!OFD_o}bLDg_QR_RqR8ILaTZf51A`L^=1dyn91sI8C&VUeoZH9IL8R5cFIu63y|(UK6(Ps-3Y1Y z6nY@W6V4+bAh577F)_&}BgVI?PLs-v<7lKRN+G9a<9qqC<&H=%L=fq60Px?_iB8Nq zk&uz0&->NW&Gf_HAII+xn1|@6*_b=iJpB9y+SD{O6=p)BLW}tu8~Cv@?A+W#6Y`Ca z{zBl~NJ9;J`1Ksxm{hlpFY4Fs^Yhs~ePtOUl?ej#qa(wttW1#Bw&|9DzJf+<0N)Ng zHH?c#ko3{M(gi`+lMgVt_-z5Xz{OB%I37fz?be*T3IIg_lWjHZO&J+8ka{IlivqmR4TN~kHMP8z4wrvN^TrGD{2F#EK1fK&NJzXX`gAdh zr;fP;Yd5}Z`D~k(mbTF`?^+M|I>$M8q+TYv`i-#e#2PIS>w^Cj6^9LalcZ6dmIk$X z0{3$P-<_|euA-&0A5RVa(WYCiL5hc`&D!X=x@B)!e@*#zRNP z`WXlr33vZmbc99K!b@)QNzsl!0QktrHhlBz(U*r5t~8k=;(+@ zrDv-X?B!~Flq{wo>!^jep8_;-*dp6ZsO=G+){>*RHOQXoVq%<*1J2z_*8>WYKWKiR z&c-Llzn}o?L$D00655?y%3C`|o7sdpmUl)hCME(bFG8rP>0dlNl0nD0>Wois`eH&Q z1(KZWH*(pw3+qe*hE*NJtq%_&Gw{T+lc$&;G^-ppr%s7T8gZv3sluKx);WT%FS7mX zYpcVUJqE`ml;x!Cq@SvtE>+DM+E>3m-b#XxLu*`}Ili z>qX$iln76L7J*v?NbO~Y%IGL2E5J-=C~nrE$1~PlDE3d&y)LRcIqKbOk5>C_Ch8=b zIUJrK(1vtxy^?i9`O$dL{SOOZ*)|pT)`&R=we285WGVfPM)4VASbAWGs-&s&20c=A3%fg`q^XQ&a1$9wYYdKhyP zC3+Xf*47pmDeASDqPua!!vfZNnTkHqz6gkv8f}Z#I-Kfeax`iJ^dlMt$Nd&B4$h%g|pZP^Yz5%LLLK+n zM8dS+vhY(hANNXY@6T1ky8(OvgMrRQ8xOFl>DA?hP`d!B53q~#ZS&;Y{)V0=LBx6@ zqVO#76OetmphBVW>2-p}>?mnoQZ1(Q#QFE@u^Nnx3oQY6I~!;qR<~Rj2x6n4AO}Em z^Vo94ToFOXO!&ByslQab3g|+=e$09BJgCJL(B2^Ue(t$ z+ut7h5E zhz5g`XY8=bwEV7duc75X6GhLc*NaG~G2V9$G}L<*J1L%jk(|7Ll{O4;7H&8FN+L2c z*!6JmW(NTCs!g*8ja+XNE3+IUcZ{D->2a=y%ww|r)C`@p$+zYYKne_zvYo)7Al)E!Pq_k2GYdad)hX-io?T@YlRH6wPR$A-Pul{tHbvS2A3x2~8ay-!l~{%lR@DHiQL z&^FiJdiU2`P*ny6>y*+3ig0+>$mF1qfI}VETYd@(X67(XsGzWf90ZS#RoX!|2`(8b z!Ai*z;J#y5zX7ny6Yr_5_oPz;Gb0in=fCHFaE|&dcM$v5+Sy%CU|$If0V1<@!I33+ z5WlXqYr>4(IYpx6Q=M5GJ>;C<`fK9}BOAkPt8Te3<_GwmG-_%Q4sWGQuTFILQ*`t# zyLIHQV$4OB=hKyzYP?Bm3GaBpQoytC+gIupyN+QtTaxZp?`lBg1Fk;d`1~nZK>2bdf&VkcR?F`o#|m=lOGUkD=^jT_kN(M?$;YAYiC0;Y~`8 zi=2AUhzR<|rV;=tOVclQv5OAH@C-@vNc&=-qvl+rOrLp+oE#Npu^(Vds2kD16N+U6 zc7@+7Gf*!+fO}~VT_&@_ubn6 z$|3L&JR_jbrUec?9QnvV1wuOnGt)CA#txasVnauTlOAZX87(S+667z=t zI82b{a`nG={RR~zW`KizI7I#$jGH5Bn(qLR652cTb@osp zc6Nie8w@X=z}@W55~|e;8|lbvm!YlG>-YZO8^l*sy~ybM?(Ez?g8h6U%+=uHJWStB z%f0(1fUxCFO@6zBXd&<3LQe66RCsBiT3nm%YWFlv>3(XPZmPJxM1Kqjos<+6cY$nC zECO^{JBytU3sb5y(=l_c^Hp75!ref@#qgFaOK7|VIP%+_T2y52#KN2so%J)OyeW+sFZLiu4h#c?6 z2!zqws}0948@vFrIBSd_@Q~4=T`&Y#9T~ep-i6=q+W1uC8WQe+zidtRHbbz1pXGHNG42 z4RouU;~Ct2OZaC~>DBHqJ)?Sw|M}}b*C~~i>%+kUDP-#_Ydj4RA&z@6=TY~{;qBg- z#qoFwzJ&wua4hGn;soDKDENSrfj}{-fqsm?Z|mypu04Bv0qlB00)%{|Q9Z9?Bn39M zwoY=XzLN5{A>CmA!>Xb}kn6#7VFhGz08rj(^#y#u03URD`Rn`ljL2nH34sIr)NZB$ z0UJii0Zv-hl2TH+91L&bRP$BDYut_9-|@Zo0l2|VX4$7Vu!hO^0zrWRwL5?FVlV}9 zcy}y4WoSw<!sM{NGP(e4|(c>=am4c2Rk&^a>3 z@GeJpB}E_6#4^^z+LtL+Wp7$~v3P)tk6_&}q>^bLWe;3|JJy}CEWSYqvXiF_{-@Mv zvML|~(@b19pnSu~0QBgTN_%K!+nm#~9=qLLy`}Sl8?0$h3$Elx|NMDKAp+nFkK=-_ zy`nuO`bZ$lO<2Eqoi0ODd$h%X<9Do?i00=9lrit%RY0<19CDuf0JftYvEGvi0czNR z+O;5&my7yV7;8(oIE7O-Zo zSyf2R8!@ry!0B zC9Y2yz{{K;Gs7}<%?k<`A@fG8_7I4^UQe-hp;+H37B`dGTYLf7$udxpM-qBFLPJwwc)*3aVEeU|GDG?5aWV93&)$<%9sL zik6_FkEEw~N5{eBp=FIWyDE(8h92(=NlwP~P7@J5Uh8Lw8y}l;-V)JtaoO%X_%UcC zPyZ3k53Mb8l{!=ZBn&8|?A}aG420YA!B64Ye&e ztz+8L%EW)u`s=Z8Wq)hbC0}{g(kUYNnk(d=g>AcjsdPKr)K}FKMfC#$=yMkVUV!1` zguen(UT`qbUYnblo{gd4i@~Cx$Gobx*)nh(vxBVTf#vwk=L+4F#-in&&;6}=va_8V zog2*$U>jYeHpfT%fIfC{*fTP=7~8hrLiCVa%l}kAHD`OVS^=c%ftNb5*I~zB`;v9P z(OvNJNvUXl5a9g1ofyJ%7_{T;YvBR#S@4$*l;^@b-!5Y0g2eU{wuwDH@LwWh)JBKN zH7q(RyR2&@yB?vFjsH;>`ynVskXc?)_C~$r?;$}n2SB~l)pu33u!Y+@IyMz>vvPSH zSh=~Kf$*2sKTLvZ^?4+C5ywHQwidkpe(&m{Q`O$SVtNVcDAtbH=?hejdm3+@PRqyF zSCWWclpDDpmf^v`=5uzsm$;{u$mY^V8O*=u^kmoEykFp$tiO9g;aOy2c(|MUo8%nU zxI+L7Enf88)N4mGd;)ASDg_w0Gs}ek!;C(iUQkMy=f}L@F4tH(L<~p+CwMT%lwVQN zFlaUayV>wAgnC)PL2>mhMc}#bHlVWrCyImML@gS2W$!rAO}nGobs|fifDJr3o6))T1!qJq-rorp@Q7K zd|pffv?U!lJFiWQouYeP;Z)~gyg%*&8Cd!b1?%S<2Abm`59~_9n;4*yE?zmpcG(VjYmtz`wgc)W6|DNQ|K5^>yFp9>-qRd zqc(RqK^k&9YD9xhnKNjFki-_mmr$3h?SfoxY-XdeHiP$gZTI+Fv{E-UDIyfS12YhN z_J#NPMu1K1!HtzY#C{jHW;%wR*aMOW@Kfb%qkCE3IAUeM5S~qDlev8EL|X?NRWMYD zFauOB%u}MGNqFLv%T|Zw0P^Z~wdSMVC<@Fkr%DvsS5g`x< zBw^Ckb~3=dl-`!UrDRbmQ0ZQMoIVI7S3{$N3La~AfFK;6Q$v7&KtueOp5Dgxm@+*L z5RwxcMoM4bk2b>}z~M>b0G=N8%{9rx1RL7w+Nz;}ehy_iKl|4jQ-%B3(2TO8T2xdLcB+a?(zihp zz3! z4}IbMy&vr+NAasl!h69*wqtTr6RF|H($Zz}aU9x+=&V&P5y`THKYKFHlr?Zs6P+C> z*haS;`hrTb9?}P;uuI^Ii9>F6@$k;I5M)jr2r8u|FW>YB6_<+&<0Un>uaR>LC06#g zpFkb7KreA0CC!d4GpA(a_Zyrpv1kuqeLe%$25p*zPsictEj8|a(0lXR0^`(nUPF}{nnX}qC;_BM z7otRJP>>#ahrru`Q|^85+&}L7?tA(2eVNSOQ`VZb_MVwF>$gDTQuN7(Ofz2iY;wG? zu2*rsCm}Wr5s|zyDbufYLd*B!V6-(in!oFY3HUvnk|g>?HI7`np+VRpi|IS*sSQ!V z^)BPhoDm&*;0+x_+rhGZ@zlac#(9cVdJe!cn29C#2|IN&ZaHuNnOrm{8^BJuV67N% z7PLnf*zF*PeRhc@Q6dxNh&lC+WnYUWkyGH_A_kCNf;2zTomC0ozSsjEfHXr7Unz3W zTs*ZIUZ5Ug2jVNszZ9nj42g|r?VJk|{{+ORT#Y69NFLf-_D#6o}%W@C7=g0RSqH!(y3E+g=km^;L8a6{qirC6`e+ z^*=tj%Q$mYl!FwwkrEawcy{Bp{JWDJ*D7C%^HO~ZE<5#^4+OJQ900T_sRg}!sre}* z_>w2VuTeoa*7P|Ac7=KHUY?yhtD4LBC9cLu6tX-_l z7KN${z#6=9;Js1%!JC4hCc= z8n}=k$*I1$hJMrQTG;$ON)iA!L39>Z2uRVKjstK$K;g{Q{6CzP$SWz&#UAn}IKp2E zsdru~=ZdwAl>rs~Z{G=puLON!U0y%ar$5a6f7<&=N(e9t+S#jTKFEN_s4KnUX)vdM z3h<;@q#$+1C8G1^&IW>r==>Rc0bq^OJv{;eFzWv(>rYSwLK8&)|Ly;q=6V-37wS~gxhlt(w>&K$S-;S4%$->(7s>>+(ctdxcam_=-2|Wn^;6wzDyZ7p*v8s(= zj2eG@XNSg&x;n^Gq&iI;;&5oewME!mQU}`JPW7rn<^XNu(wtM6ynNbb688X@>7G1M59_!J%aP&r{;@l| zLznkf3<-}tA~4yULapi85A4;yi80z~h z*_w&G)LaplY+84x?eJD>TWqA-58#LVY{JQ?*oqH|u!m4?(~|yZJqTOoX5?fVMl}sy z9?zbPx?|;2!P#%0)6+vT7N8?Lslp2 zJbR+Ss~^to-#p#6Azkr28Z;Z4I!-eEZMVK8dNHhUA`LC;UQWc(mICJ_@M|yZ=4(XY znAqUq#Gc6xB&CQNCo8~hSis-n_MNMw%`S9lp;M2ucp3v~?9(q`as}z?a0}OpaATD0 z`M3_;S~JXiX1tL*I^E|IVyZK!QK=Phf+qo08^y#vQ2ix+h*el8t>ooEc=e0{E;(@|WEvSt>3% zarY(9XVkgVA=LQ>A^HNP+d)p;Z^xdxOHZNAMY;jf13oa^Iy78t?b9>Kq7#T!@sF>X zt?q9e8}M#KmZ`9bz`cVxX>uCmuM-~V>}0_nl;7`81WwxO=~^COELAepZ^GWCk#lU) zRKz9Jd(sMAQwh$kcS|mcSH1!+t=#$}PYlB!~yXXwO(p-;=bC(h(X+Q5mIs###5grrP_n{Az((VkxJ7K%Dfzq+hb25tb(5 zu-7#xjM(yn2_T_+dFwlmE0$xrF8`{M{|$oI(&yutNe$S8%Y~(DS_v5Oov54V(`5QV zZ4&1TQycEV%|@0!__uBZ`c3u0n)e^;EH%}dXxp!?2Ei==+TP92bz23b8~zp`PpQE- zh_;V3u6D+`Vx45MIWZH_$BuvKBZ_=ZPnANlrzQN{A%Z%h1O&}_gT9^<9Q(M!v46ju z2VQ#LTh>gNkuU!ER?a72>8Y9)fQEiRi$D5cf`ZN0zx6;^-TNFfJ=gKdhLv%@*A>4? zy6D?`C#bK|C3kf+dLo+TaUAEuTao?fs0KdYp_FCgduePquqvX-bj-uQlQp4lF(-r6 zM6_xefnqBv9j16vW*gKuWINOZ9)7BWIUXw1$zm<{UIfC!;2MjZ4ikvIu$o(6nL0^s zk-YCKtTFjbD~;|R`$Dm2h*g0{lVU3IX4GU?j^ESeosDI?xC7) zm`Y?C7(d{C`5f^{oh_!-CDX(#l$ zcWs<01&@xbd>4TQGN|#ee>p$)Qiu9A9NPfSTr+WHX*WVu#n>a2}iC2V09unaK(B8d{9;{b8;lDqY zwWP61YGg7174PVmv2P=>(bh+ssKGiylLA?IaDc8zM4Z@8qbVwW_3bLdq0B9 z7jgPHdViP58jJneq*I2?&EB~$l4Ge{c`ot=6*XAq=9Xy&YU!HdLE#0W(EhX!P$tlJ z!k)~IU2c12K}mkW%ox3gA$V)tb-Lc_?T!^E_ZKDxf!R7Fx|eI7v@b0Ulg+u6}K)GLAJ6SZFbSOs8rqUC=_=IfkhUh#On8ScKIW3^e#dT_iS1 zG-Wly48l0tHz?LO0(FG?($KKx?~mU*B}I*}`aLM~P)B7i39k9`6Q-?!&|ttBj>CFD zdG)#;cCx-o8TP<4;1|5o!MTJ!bzt|*TS?G}%cm9yO)@lB($g+RiDBaoHy__jmfpXA zxgzSpfO+Kn7jW{_Vsf1|$?l-fJ0ot(;hIJfl=oQGsxNg<9{1nT~*snI~H-M?mWEY=X%Z!+^l|;5kbfwdKthNe4o!5$Q1Lo|b zlbsbQ$(71L;=R>!%p`7j`(*g8R7Ysew{wq_qin4hqh8*%yBSOM{Dp9^Jzh{PC$&)OinEX*m+=UV|T5#zKjA5KF`5=JnMWi`9NQyL5=lGywJ;gWG>@ zvF+@H(h2ahSgxO|n+wl9hIQ4zJ7+DNyFJARvK&NfOgvX2wP4YEoZ9U$aXlIw<0@NJ zCZ&&gpOjS?31IW2=d$*}O*zH; z$+KDfZbpupHF6&grb`E^3&oB28$?c?C-yFrC**C$c-8Sgg+pjm(%+X>3$2zrfg)!z zSf5>=lezZ9Z}bGykH%Y7=yB!Fr{fyeT^?%}@|TkyEq(jWxDxi@3-BOpj<4Ig{K&I| z^O4Cuaqv$>k4A`{Z$NG(RW$7;CB?DqasLgubZEoILDWL^aA;wNa;0q2NE+_=(Ok#e zFm@xwEBjD!^XFIaTyQLL=a4Sh|@+&d`8!9X}^nSm5c)M|7IN93DinH!c)$&Sp zY12@pdGSbBm? zFU~1#mP5Zy4jw+lc$FITFkb6o5@m@&jQEk!jv zj3m`ysSM%k0AZ2Yk_@|3%^KG`&5u3TAlY3{cl%cyw3G*<%N@LXC%27XsmDY$7*t&F z)YcDg6YP`wig~&-7kVO7UwAMx-@@j(^EN6od%v+irhg(z-iROMwm2bciot-gE|-Rq zTD0#E1bg_8US5w(I9brBnH;VxKN1x=ak(i3;h*&L9Qc0J)(Z6*x6~mJq(F5Na?;wi zE+*C9ZhR509+KjrbRE0q?mWMBq~+!j;JMsRN@Bs739WfXQK%k*U>h-a6E-txG8`9K z`;m}GDlnOSi*`l&$gG{GcJ_F_9`ENpAY5TE*TnP=>7Nkf%{C&p%TQme|9#~~{XoOA zP(<#ampM}hr?ot8J+li1ga<=>*_QJ}15lv{+E)S1I=3d~4>CW)he05O$)976c zs2WM=Yd?faAQ&DghM3U~usps>C)^A1+V5;z*AXgx+VnW2Q+0A5J?}U6YuQ8^u1OwU zQOVH=8c7wnu6@1mUId!Q)*Yc0)sQAz2bOwXwAg|V3Modgj(Qm{g^rmH`{x&Pr8`PX zCipoYeM5v|rPt1pYGkE$O&lEe1FXdkyQ@HuP9w`PAkfjQEZPd2ilV*qVQRY^Uzd=M z_4hR>v@$5n6P_4OQm>K9H%*8t;AIq;rTp0m>7xMqAAEuxx(_7S2s59&d&BA z9G?g!s^i5H2D0Q2mf~uz%<;%OIw(tk))t?nlS_bcA-pPs!a7asd!Js&{)QNjH?Iy6rk}mE1YSnZ_byi0Y*D|@TN(x6*}=%oLdV^? zbm2(U=G@3-@~M|%z#>NI>0L*L#x}E&+N0wt|9YNiFd%b{fK|`dJt}<0NK2rp!4kK# zQ<_kbcWYPc3V{2f#uC5?5m7kUU6pN)w6 zlJhGUU}Ko~ejE;5>77}WqkU;h=+-9_j)pzZ?X@8Tt1##8awG?O@N4XXdO-@8{&f41 z?xTb4;y8d3ohX*ARhQ&IfCH`-9^JrRqQVt{JhX71D1a03kWc^7t{&+qkq>O8b!iZW`UUoCD2js zf4?B76dLdYxX^V*+*xgW|8DdDs(>MX1obv6P(P8^!!sUs4Of>VFZBEa=Zwq84`#WS z;?1=a|6(VBN!#5~-63mVK21@>lmCXVyy|98+oLqHF9E!pkRfb_{xL%TVIuxU2L6{V b;OQ)4ChRJS$3*~+5ZzbNRxVe3`0~F12ihd9 literal 0 HcmV?d00001 diff --git a/tools/make-og-image.py b/tools/make-og-image.py new file mode 100644 index 00000000..a3e731bf --- /dev/null +++ b/tools/make-og-image.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Generate a 1200x630 OG image for WebGL Samples (webglsamples.org). + +Pillow-only, reproducible. Draws a dark 3D wireframe-cube card using the +site's brand palette (#0090c5 blue, #ff4486 pink) on a dark ground. +""" +import os +from PIL import Image, ImageDraw, ImageFont + +W, H = 1200, 630 +BG_TOP = (15, 18, 32) +BG_BOT = (26, 31, 51) +BLUE = (0, 144, 197) +PINK = (255, 68, 134) +WHITE = (245, 247, 250) +GREY = (150, 158, 180) + +FONT_DIR = os.environ.get("FONT_DIR", "/usr/share/fonts/truetype/dejavu") + + +def font(size, bold=False): + name = "DejaVuSans-Bold.ttf" if bold else "DejaVuSans.ttf" + p = os.path.join(FONT_DIR, name) + if not os.path.exists(p): + # fallback to Liberation + p = os.path.join(FONT_DIR, "LiberationSans-Bold.ttf" if bold else "LiberationSans-Regular.ttf") + return ImageFont.truetype(p, size) + + +def lerp(a, b, t): + return tuple(int(a[i] + (b[i] - a[i]) * t) for i in range(3)) + + +def draw_cube(d, cx, cy, size, color, width=3): + """Isometric wireframe cube centered at (cx, cy).""" + s = size + # 8 vertices of an isometric cube + v = [ + (cx - s, cy - s * 0.5), # 0 front-left-top + (cx + s, cy - s * 0.5), # 1 front-right-top + (cx + s, cy + s * 0.5), # 2 front-right-bottom + (cx - s, cy + s * 0.5), # 3 front-left-bottom + (cx, cy - s * 1.5), # 4 back-top + (cx, cy - s * 0.5), # 5 back-bottom + ] + edges = [ + (0, 1), (1, 2), (2, 3), (3, 0), # front face + (0, 4), (1, 4), (2, 5), (3, 5), # to back + (4, 5), # back edge + ] + for a, b in edges: + d.line([v[a], v[b]], fill=color, width=width) + + +def main(): + img = Image.new("RGB", (W, H)) + d = ImageDraw.Draw(img) + # vertical gradient + for y in range(H): + t = y / H + d.line([(0, y), (W, y)], fill=lerp(BG_TOP, BG_BOT, t)) + + # subtle grid dots + for gx in range(0, W, 40): + for gy in range(0, H, 40): + d.ellipse([gx - 1, gy - 1, gx + 1, gy + 1], fill=(40, 46, 70)) + + # 3D wireframe cubes (WebGL motif) + draw_cube(d, 900, 300, 150, BLUE, width=4) + draw_cube(d, 1020, 420, 90, PINK, width=3) + draw_cube(d, 780, 430, 60, (70, 90, 130), width=2) + + # Title + f_title = font(88, bold=True) + d.text((70, 120), "WebGL", fill=WHITE, font=f_title) + d.text((70, 220), "Samples", fill=BLUE, font=f_title) + + # Tagline + f_tag = font(34) + d.text((72, 360), "A place to host and work on", fill=GREY, font=f_tag) + d.text((72, 404), "WebGL sample applications", fill=GREY, font=f_tag) + + # Domain + f_dom = font(30, bold=True) + d.text((72, 520), "webglsamples.org", fill=PINK, font=f_dom) + + out = os.environ.get("OUT", "og-image.png") + img.save(out) + print("wrote", out, img.size) + + +if __name__ == "__main__": + main()