From 96a3e121eb31ef9076438f579d03104e11b0164d Mon Sep 17 00:00:00 2001 From: Oleh Omelchenko Date: Tue, 16 Jun 2026 23:04:17 +0300 Subject: [PATCH] PWA: iPad apple-touch-icon for home-screen install --- docs/manual-verification.md | 5 +++-- index.html | 1 + public/apple-touch-icon.png | Bin 0 -> 22293 bytes vite.config.ts | 12 +++++++++--- 4 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 public/apple-touch-icon.png diff --git a/docs/manual-verification.md b/docs/manual-verification.md index dd80bf0..01c05c8 100644 --- a/docs/manual-verification.md +++ b/docs/manual-verification.md @@ -16,8 +16,9 @@ - [ ] Android adaptive icon (maskable) fills the OS shape without clipping the mark. - [ ] Service-worker update flow: ship a new build, reload — the update-available prompt appears and applying it loads the new version (`registerType: 'prompt'`). -- [ ] iOS home-screen icon — **known residual**: the manifest ships SVG only; iOS - wants a PNG `apple-touch-icon`, so the iOS home-screen icon may fall back. +- [ ] iPad add-to-home-screen (Safari → Share → Add to Home Screen) shows the astrolabe + `apple-touch-icon.png`, not a page screenshot or generic glyph. Phones are out of + scope — iPad is the only touch surface Astrolabe targets. ## Keyboard & accessibility diff --git a/index.html b/index.html index 0541810..2ca84bb 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,7 @@ + Astrolabe diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2036497859e1ce50ef3d70f0cdd56632562452 GIT binary patch literal 22293 zcmV)(K#RYLP)ob!r4u5 z5uvk-li(!c;w}iTmDda@NIcWWxd-k&7gC!5X$=Nm7&PjpYPH(x!UqDuOtv%fNtS@0 z*C_k4{ZB4Qi(Pl*0AD~DSgkgQF0j^%_)2mo;%mv5p&x>{ksO>fsvz!xOmB`mbL{wm z%)bHULI1*u??!RG(i@EKSZi!zPPH4TBQ9)TmIQK!qH6N*L%A(5PZk zq)L%PbV}sOaWG>8UH&s#Iev%z$#gn>jJ@Lt-086N5PO+DSW)2VIrico`*vW@tTd2v zP5531yVR;N}$Z7)kfOYjNO~#Cq-5Dt@P4b6wFkbJmMmH% zWr;E=iD5}G0R)i)kud-UlV{$W_ujmm!+q(-uKlCCs?Mp<_s)Rws^|N9`t_}@u5jvC zzZ0sOwcT_d^B8ad#sD~D9tU8Ian2cI5L^SOYaU*!^dcpMX&^{r$%g~;f;%1nm$`A^ zjHxn!x&{D-Q<_f&`G1E`(pb*`;#nTP7xXj$5TxRqixvRRWlG>Y%mZXT z;jez!Wa2(>4h*=jo{~8*^lX?OK$ZtURxkWj^zczL&YBAI*2n(^>$+ zSD})49vrgii(W(;O2@cffpz;DiSV|ID)-yCGk(V+=#M z;+jVcx#2V)aG;tl2Q1JQOd=_8~B&$F)5GPf2(@q-tGAI5l=8nVjM z(@Kd-kNAO{Knh_78q)+bKs``ATF5+^1)p`CP!d3~!RRw%d;>`R1<-YXNgjHaLjpV^ zE3Wqv+mA!eob4d-!?Wle=9tv`%Y`36Pzuczp{2@`xda8^WCr56kE1aoEHT)n+hka3 z&f-uAEuzK~sxx!_8krvBitF0-UQNPW=`Fpk&y41M2P3w;MdLBW^A95j4NC;)2&{Do zGn7_?a*W~`Jm8568#J^mgc%;ul{jHr=2*1#1jrT?yumsaiCx4)gBl_{(;(D8@C>^Mqs|lO^zw0&%rYQ&v`;(EVUvf zD;hHjNk+6jBKyfGk8uX$I#Q-1aD}{AmC&$PT1GsvHyUrDT+nKRxB~v6y&Y+q9vW=w zec(VgF+^Q`2?_(8EhS3EHRcO6H^vNGg4T9!iD85{kTeFCh%{x@L4a;Y6j+lK_+zOZkPB4M=U42BwV)^`GKws0lpV|d;528gjUb#Q zL3(aMYbgNUzPsnXQ5wQ~#3jS` ztn-2cGwgc2&3XZ1UZ?gY$NZ{nCmzjN=oh9`^g)>2 zN9Q!A9AH_uNl9=6-}hX03pHnXdOOHcYW@+Ik4)Ga0JOPD&caBxJn?QobpW#_9Q)r* zt;9J#)P0lT7O9UE&7xMlA4g>o45Z(A{Lpnbn4&mCY<+f%~Ta zg=(9+e2{U1vVl+~3) zPRelXhIgzvShz?5))M`8r;M`B{e1`SII2m;*vXNnzxdeYcSlyHmsV$%Cr@71l`sG#4G~CbSPCM>y%v!pZ_A=FSxmz2E%FB< z63pO$;!Pm+E0+!5VQ=7ct|jlLc2A3^+rS2SU#~;qQA>TcJ8sycNyfz4u@}DbL}ojq za`0GsGyVKmo*X|jrX}8S{ci1DdaRn~X)zzJQ6w`!<)`V9oFOGtw=vqrvywb44NT`H zMtrBzz{6)fH)co;kk-l-=MlaF$%iptQrQCAQ{)FLwV(gF!W)9DD+p(FoIw4J<2(>%O3WZJW;$jtj2U2SO@uw6O@?9r3mAHxffKq;QPW%- zFCk1~`r>3ZmC^f2q|a`rr-!C+`b23-Ra2eT6IMBp*JO4kGT~`HY7mVci61sOcEmdA zz7jOE$o>V&br^mYByu?7yJS|>_(aZz79?zlPRy|Br8Z49BF@&*jt(r5=R|2K&|`UO zNtYy=!^-rs_DD%tiOol2;nYzvT@pX6b_*d%HvEv*LcsZOTRv!9A-u7VcAH!R#2v93 zjB_3kYR@C_SApKkQ5pz6s8rYW$gIRI?S(Cy_`PaI#P&^XJqxzF5^g2Xi0a!M81wUa z35$VcaQ|%wciylk7LUbC;)#-YytD)Wa_LMqlgnjt`CPuFG@*Q|LAE{@SJGPQq1jrQ zPMOEJkJ9+Q{8iis=7rWtYX4Ri_b_Lb#^c-xJK`;jrq^$RYA-Ek)s6__C~`J-H@6J5wG6a3 zv^P{YMOn&=Kh_u5mS>h`hiB$TW&_J90EpE}>KgF1GUVg{+}Xy`jS z*nea&+L!i^cdRe2jl45F_RjFy>`DZRs9|j%(-bObZ`tr8$b@?1#0gY6IKGd4av~2@ zPMJSJ4#j#rW8JK$%L-E#Rl}oed6x1FVjonwp|^u>L$u>fMSa!4v7P-#2J1T-|8YCN z=wo?$arEusu@jdzmevu9kTtO?weF`?>sqe_KkS}Z`K+=2*6`U<4{h)i>%Q|5FnBVe zU`!wJ;Texz`7FaAgb@Hlo+J||W-uGW(C;^NH6OnBSoi*3q6+?#IXLIzr^ik{`PRzR zVmOXNW0qY$D7Ogz6n$yu4fZ~EU~a7mJm zB|7sE!Vw$}wqddgQ$x`#NV*r^;43z!LSJFSmG)hohweGnHrVk$t7m^|$IQ^=yHC75 zcWD}9L-3O}zD@j)T!7#QWeoP&#KaHIRi221D76JKk63O0UTl{{@fvuPFH7$(IWm6exw>I{$z;y@NKB3A^c$?;TwfIex?L^u< zaGng=a6sJ0j^OSOd_)#0c%$STD9Q`*3>!{h4q;+O1jZOV!@vv%0BrC34_@=Y^_ua! z$Ro3zS{PrLADvs8SX^I9Zmw(w_seT4j@*CEz|kFuvT#)}0M7ZP;}=gnc_NkE3hq?a zS5`GtH}|zR_cpimwj|1QlWQ?YE}eP%M{k~c@gx+BAC#kr@r_5nc!Hy;24j!TImA6Z ze+%a*j%_FnLhuP)e=#w`I{Q%V#;%*l9O}CoZ~EBn%{?tw+6Pk?CnwL0&yUWn&8?CM zD{3FCZm#Xz)7`eSy=|a1o=5;dHl3LpotwKfJ8^b=b7|ccsT;OnU3)`QZ%fa?-j1D} zS6aOJ%X6=Mjh7~BTk47_u;+PQdwc3S8mG@q_&ML?A9&bVeH6j)4t~{a z(_%QPl+s)nUoo`MZY9;DSlk94hT zufOw`?l02Nna|}%-X1>v+`F4g8%A`3OELtT)5@vZ6gMoBvW`7`n2F1jv%@p9Lo-!P zH3#lEIB?C5Vlc1o&_H8n%C=F6$P6$m(HAjvnIiZ!b?SnEPC4@@;EX6u%?lE<~Bta0n0l2aV@4{o%3N!Tk|zgJF{> zGuehA8K(8q%3Z9#0=wa7Z#{b7bzZFSR5J4R(6e88dh+ymE}L_;qjolC8CCwKo@Oi@ zxlC?pe9@W`<%wfBEUR#H>FmtK>7h3-RMb}1w>3mp$BV^!4)m2(mrtD?N5k6)Y~or^ zYmEwYB^A>W=`EvVLcpTHr{El`9oUP;kiv!t+XkTYo@e!;I55M8^FjGyaqsp|-8Xpc z?t)^mzPR@M-#mTcrE~dAPSc4BuXCYM^71+m4jB`gO=p)TmQWhN=^4}3&g(HF%+O5RU|UIf0oAvur=_l~Vf^GM0J4J#`^3EmR!0`fC3O`XLc9vajarxo*V`x5 zhE%)@m`}xO2du~;5yCRQ)jwlwf%z;5jA5GGDC|j;mE85&4|eY9iEg`mHh1!wcV7Pb z^P9_?R;hJKvnJD~1UL0G1*%F=tZX{FG_i=%FueuzoPpL|m(i`&&5N&{_kF*)x7mxN z*mZ3UtvlMs-WgU=MPkQ;|M+n7d#B6uzFKvLAVo(A9IML}PAEN#0f;y;ZpCtAXCEU+ z%6(L~bJRwhv<~4uWX=YL%5*my*#nZ5!--;MYG~Qdx#&v8p1s zqscqaxowXamGZ$s(-KtsW2qIjB>hNvE@R-4Dri^)DykGyW-W$MWBWqC;z&2+c%45^ zSzc55!QXhKzP*6A{qm{N$NuyO$@#Tt?&9DU1%AbQKFL;dq@?+9Q+nhWwfA3ge)X~c z^8N8Mm!s?3(AoUpZ#+^~T`qIDu5S|nZs^^P-W>zaGKhI_bGHx5rh#ak0t-B4cGKh5 zHKYRLEO+k~#fjvhq1K0vl8Tahe)XZ~=siE5KmO?JKl$3TxpWp+UGER0|3q6T{e>~h zo*y8v5Ck-!``Ugz#y%Wkt_-1!6_CZ?CAoC=g}-^~_@l4;z8_KX>ZZDTe)U7~(nK)2 zKDajp0Qc?o@xD4Zt_-c23(q#@!Kuwdq(pJVSR?TeTeRsv+E@pL4QS;Z7*-kpTr!2{ zD(hGxe)q3D6pb1AZ0_kVKYs3o)7DXF=e$ZLtn-2bN!*K4l87Iw7)%1kHN6v#AJj_c zUO4^iUq6}8<<#a192pU@v?A>b z>qsaez^xy@t8;ghZj##Ee*DjWxIDF_Yt*9GT|IO~_vLweovdt2ZKNV_qF`<582RYOkH7GT8&!ZB^V zDAJSl_;Vxk*>o%+-l$5)!f(0eV*P*QA>ks?KSDY;`J9`ET7G< z%&a6AlFQR8^CR=wbe5#ymQ~RNMbONx&9f?{gOLER%vO5*^jPoV{)DlRA_kccE&Y8N zC)8wroBz#s%Q9I{A%x%%gx?q(0zi#?o6aJ1Qjuq@c5pxPp_sj{#-bUOF56B;4+YTftlsUeQ&!KXX6VY7N%*(4=rX>;s>@Ab16OB z$<4)yg}x&LG05Gs{6CJSF1VTt0CqO9W4#;C43%YbjBp6atB_{E_40txZcLR^;0;C& ziWx2p2ros8pwEeh(3wH~pSX@37~5D%R&I~|TGNyL*|`YG z2#(HL_TYi7cjwvMYJ$x2vN+;hXzip#8hkCvMlG2E=b+<>gWNS-MQ_mktRzQq%_*pT zIrCz7fA&M=HO>%?cb|HD_|7LL3mkUrjrIII@h3aBJ!`TO#k)=W`6VVY!y#in#p!lm9j?;=61DhzB8TJ zO2;LKpyF!RSweXgh2UtvhCrU;4F4wm0=hp%i#^u-XJAT+(5E>7+jHB&h_#CIW3#88 zdRycW=Dak%2*7#|^{M;;0HCG6m3eIH+$3sP(Csn6OkK`_7WfRd`(zIYI$t17Uf)AO z^I$RHREMN-T#WhG4y-=1FL~#npYWK$AqpQK*y-IqnEc78|NovSd+9=@&(Vs6(0VDQ zfQvnS^hh(t0O;PjaZx{R!vj%q6@?bYe8?Zr;y3AO^TM4Z003B7b@{OeZ*bW zZ=T}5g`)&foV|zpLCF~aKucdM08F2s5;`0H?g!Ub(ma( zezbgO`($vRmzU=U8#nf}Z0~JM-PDtBsYE0Fs*ae)ZXb-@KA2rgEx$U(Pfo|q&n1TD zN>-9FrL%~Zw5-RMu_Hd0z7danIgHpw0Nd2WHIB^(&@8HG?v#4bjUT%`V!g?WUwbya zkrFgWXPV2COXDZUq`b>=we+<%b~hnS42^83{l|GGIPbW|T*TCOEH+BRwt=M+7{nN_ zE6erNWDd4U$@u9UwPoJn4%pe0Z>q{CVw{#1#GqC<&E>SM_)3T(aSoh;T8Bbe56-0;y`T{X#Ur;dOBb;A6KWmjST(&QpA)^o7eIZgOQjxHfn&ayWBP@t*E9%F^5+NGTOS@91qR=Vm*8_*h@H$cLQQ z=^k7@F!t(j{cD%%_jV+I_l~7K%|$KPSx9-m|5)PXp&IV%93m{fkNC3O$A^>?t$sk* z7DR#xtw!m`7)y+}FVz#8|0XyTM>%rewXP~HO)d<-enE^yyY@w;gfCAljl6X!wUy4K zvJ+<}mc|!wl!~0{WeEv#P+uJYsCC;|sI6yWDHk^k1dOJzQfJ#(SDrefn@ zn|(bd09-8X{z22Pl-AZyU!2-nS*P*kQgc*q!QYfrh=A;>VT~k@1c+nj3#geJ>0rkA zFg$ythQXY2=w7>I1WQiVW|plS#fSw#{9hY?xYDXE)U!zcLfR=o1%|(IDbB#qTw{|GUP8_Q41mWu2f1Olv|-S344m_D zH&QvKDMw)*;VAW8P3=3o?6AT4yHCDNdmYd$rt}nPN5Q=tme9dbES6KGU&uTWR%w0* zCK#B;GY~H!j8e*nuk?K1CvqUHh(T|aCNjI*)(DN7ab;@JH0T44@d`(iqxoKoGT(Rm5f^NXpB~#-N+N|>;ElvXq^E#ZHl3po+%nh(wP+c9 zf=2b3=TJ)293+tyAE-Z=fh7Pe=H>gElKY!C54LO_Zq4@AG5WANUY~^j_HqY8CI+0Z zZkB%Kt;D~)k;HSnQ@(pOPR8Ee_aA!Y>(2qE7&yL@+DVz%4o=!hiPa83#+k;&aKd93 zTWomXxxnk;5Tb;((Ew4rz`GlZ^}B5wC!c(a7_>rthgeyRUf1J75H=9p5;hz8l)(h) zz95m-4v*{)>=O(K`&RAaspgvCy0vaj`8f9g03ZNKL_t*jWBX>0v}N`;VQF%5%*8GK z+duC1^Gxl%;fFfW-yLuM=hsYEmW0px0IyZwuRY#(WXG%Dc#iB1p?Y2JMry=%fV9W> zQl5BtpQG=}${2C9Q-k!X;C+*&nqsnqpmjPA^trZ%oxV7^GPOjlkVrEk2jYO5PK0f# z`0Yv>Ktlp4Xkm>EoZyZ#;`}OlTbq>t`KtgR5zl|>x{>dEbnF)nq^V>$k8GZQ?y;ui zX2ND8f$enc@7`4rK&Q%grQ-U^+tP}%&V9WoJ`^{WQsNCesfNM0^&t2nHI5D8W(s3& zM#i4dufb&t0*8TP&iK&tFP#C90LB5W(2A}V`ITw$ETn8q2|3p5IKm`ukqj`;K{uK6 zl&+nH92OV=>}_BE*2m8Mi=$g{&j}Ld@&CM3d10nDLaTrDtlAUiY`LB3_g}M9a7lb1 z&aS>733wk4!B54WK`2JpLw%!|ZP-6ybda+1ND(4q7bK$aSR&SYaKKvnTskv#b_~P_ zmUa{~a!Itl>?2%RLr)QPmQYIL@wG@eB_A9~2B@>N`!W6NXo_<%RGjeFs`AwD-f`h8 z4^DMd6)hA10PutJvG2Xx9?l4AE&w@l0AOOV^5P-~faPsI&ik$T^d1`U5;1A-0a8pM zbEHPVRr{lv7ma+mZUq4X>ImeI#cN_|kD{5o=Mas8M91j6m;Ai6>=HW+p3AAPS>lSU zrUg-i^%^8cF=j5wYNhW$=3??tCgg*gF<^|5w+Ex*{@oM*@Us^l+)->0hCD7U^Z)y~ zZgZYRqav)?56+hY!1vC?#!u_tj|z@NS!wtF0X()5h={drWJgMZ987X4#2Gy6yiWbG zIwFy|K=`ABr@Hp{x*B5itzq4g!4YyG4HL~5vU8mrMJOd2M?nXYKdgD-r#P39J}BNt z%`br7h38-1TDSS-51stITb8S@d;|Vun*Zy^I}9_AS8^f=;NCgirbQD}86mfv3AnjN0jbsybc5@AOH zBv0sjv(keAoB{In;6v6Q>!_mdJz)_sVmOdhK!~pIt9dr&<$m$V=%)@OuZUjY?PWL4LM}YBZwfC z0vv@SiB}v&v;uHC2VwR~zrGphEW2A5zxk0<|Kia4RZGSfkC(nP-Y7sEk4$8r0Ck^p z{#VBnnGE9`CX6o=21iYEU1?RBP5a>52$3TS*@2YRPO>*E=TL~PX+fgJO%@3N(6P&I z6$OCVp&5;%NPcH}mZhyp-q*N@imq0DOn88LvCW@k<0$&RVL)de*@D#->EF5a%wOL> z-d7S(QlENt@HY`Bqc#>+JB1E9bTyT}1m($N|_M0ccd{>+Tij z06XUhTN$-A+8x*69D?JtxVI#q8=2NP3S&xlx;idGY@-NK>=q6+BCQ;S`kyd+1;xtm z-8J#;pE>>DVCo8mfgDro@cU2o3Vb34L3CJ{M>-P=$~kvw%Jv8VK+)5KWQgpL@JBl}R88uIYA*4joztwm{W+tGzb5gk6L*qgeH#I0rD+(9vXVk*Nz4297D+ z$%rtD;2d&}RGfqOitU_3XmLy;htg;SNFf`KxD!ZiNj(3_qZhvQp>ywDG63KYUZ@*i ztVZo@a1MMQC>KFm!t5pc%u?UpsGil3gBQ&?1ZsM+?F>6dxZ7NjoTIwgxk1nD@U*gu zDsExr9H4U!vU|6Mb8z%^5-G>(-Gp<9y2$S#N;@xk3zvTF!<}<~|M1(td~ofmiKjeH zFR+h(tK+$gZK4g)OourKmU7BDkPNZeVf)PD#bQ-WwRoKCoCB_abHwSqi}gdrIgm#R zk82q3L*s&>JgrRWtE=Tv-B`P^xQ6#Grejk1 z$gHs@5>MJLLgNjr%Do%)=1Nl8DlFVW3IqDSladv}Ergu|a|>zb&})I) zRC?wJM-lSjdAy@;ZFggmbGW!tbD(kMbH^5{ujT_D`tjW5_`iR?XJfmR#%zY3QV|OR ziXl4e9I|JE`y0#7EeUIyYp2f(Tjv$nIfQ=Tb9q0m#ZsWDp6~$Wfz2jUQ6kGj@L zZ!E794xxyzokOVl5Dr1@wgzt5SP|vnlB+VtIX}>`@cTDSbXG_AJ(KS%UNTNEus?jU zdwj7500&!{9!DV=NHYSVH>ov+VBQZOTVGnY3P*W$xvqgKhJZW+h-Vnc0R%Y$44}3L z$t_qILyCMTrhUS-<}tOt32+4*LL3?+!+VWm++xZK;(1s;s5B$b6X%SvJ9`#8tBW*o zMwqI|v7UiHd87VE=Q`B7WisoFu^W6J39l=WtX~iT1rx!@^eIPS031^5`qzenBT-hO z*+t}8u6xrELbHot&Y>_s8;d}YLvTjBmcj8?2k?56nP>^uiuqiPbr6y0x~u@5>9w&dB*4m1#6!8XT{yxRP0Uf`+jYx{)Rhn~R`(Th zgr(7DapQX}I!c3>noAwuiwNovFD+>qXs@iV^5pCw+vJ{&fd*B8eZa+#b9pGagE zwFj7Uit@FB!jH1D%(0d%hJmeg{+`b-UY-l@Jo$F+yRR)i`Fl-7KBS!;SIy^teX{Cn zCwjBlIAFPSjCG4Xg8D0#h&A`MRMu5_G4d3ep}6n!&6SP$k?CAIn{^0B2;l}tk$xg1 zE2cHYx^AU_9YTyh5Ay@nb6&!8eT*%e&N7efx%EJ4Wf@Y2lvD|g12{lUb4_hq{l%Bh z353Ax*n$Cwi{SMpx*Uthcz(2d;q$jm#i+USYcD3HWCX|MIrg;|lb^X8E%a6H!0^f!Wn6YL&Nr!7u2bP#^Kb^{A@zc>tEXZrW2;UCzi%M5cj&uhcZxG;}tee&+35 z+P*b*yd)v!2p{nnSp#VexBG55_)Kt=I2~tJI|Q;(%GFwwL%0Y>fE=Y&<)xLSqK0VJ z;L4sMZL$@$6^Zha>~@CYQ)t1o*&--fZ~s`7Xuzsg?-1cd3m5gdJA%X_r-%l~v}uMj1@nM$p1xio;_8+BHXra%tmd(-SF?)^C&79_my4}t&!HGZD^`MmW@neoy% z_xXjFPxl@k^kSaSM*_&ubXxFp{`l!p#X{7YHm7_L4H^9!k7Yk|{pDZSzvVFtFyP~( zH`aXlsrk_v#hLos{g2(Gdjo#)`#YD{D;SV5C+!o;Yt7{>3E@5*Vf<;(o_5`Y`~JxB zp{{*Bu|!Pax0DNnQhq)^esYBSPTK+ZeLtJ0(uwRSvivqXii+ppz!=1J+W;QNTtv}f z{m{OamFF_ql5&f11a-)6XNF%p2k6UipdvNppG@hoE`-o*Ap}=cp^tRU|K4r$9aT2x z2qSd_fU*+r$G_YB7f-I8oyg^UI5rUf^apBV^b3`X+pw};$$;yUL1uAc-=rQ_8NY%x z5kd#D+nJH$L*`5boFkITr5z<+VqXH1-VRns;8_D>6+slujzaCW5J&y(DG!TmMteLM z)5o;OvZ-uIxg{hzSjK{EToQ+<2UT&1P-C(ognCx3bX7K12Egm8Qvds{6L%LJO(IpQ-GmOz9WcPD*^Lp?u`BcHxi?In!UmuxCWa09g~P*Ql|JtXn?w zyq?D7AKWo>pt<-iFIGM#lko3f*dcuo(*7N`peTey1+Yqnn9H?UL+}y}Z}g&CZK>t9 z7}DVT0&4D)B~fz6gubfd6SCBWHI0jU5?iFrPRd1WpX8FtUjV?j*0vgLD-&v(YHbJs zGRhDUFO5&or-+Y0{aTX9f9A%^zj!cJka(JnUQj;1eWCPEUm3_`=z9D8j-a ze6xhHf-EQID9X-Z+DWmNXzoU;`AgU4*Q{lYCF12ZmD|Zppm^g%2+exoNLgF4{eRp( z{egb}YQ;jy$9jf;;h@n^vM*x6mEHBc8^JGNeaf z{l$U}Xs-$#Q7Rj%T?^LN=2uLPBC*6_;Q+0iK{?`>Lty=oSP_IC8}7m*Ru^)$4u!4F zt+<-Mrnzo=ZIiAgVOmUvhATps(fuaDQy)1p^SK)~iXfhak4J|}{^Zr3%~ToZ{Dl0% zi_X3!p;Rsk8ONnrMR9tG8PWO+P@D)4l|&(m^p(`OWBu0`k`$$I+^Dk8`aUSm;OjQi zpdI4jmCes7`bm`1&{i;qSYM0~j@r55sY1F5HZEHHCP5i`n>Rjx*ZhH&_Y~b39Mc={ zJI}VCn`w|;LHkuh1qRwU6QiH%Bj}P?8?Dw0Ap#a&f>I)GCv6oGUusS+ESq|Ysux=O z!&O~0+h~ZCaX@1w z`GR}`>n8F}TW#v+5B?M+z;Oe|=~^5qnRPv7X_7_(JV3eP`F)Y85x$71$ea*|f7LCr2{DBW&l4N*nQS zskdNFn5h9yW-Fo}an8%C%4?eKvHr8elc@3JXa}(>UB>dL&X6UMXW6r!S_eyIS%5wE zYY>|tjcow{n7!y+{oS^+%e4Pkq`|~q&Kcu>^uejl>h~lWKfDVrcX#MzVpJ6eEf{V2>(cZhEV@d<4P!Q(r$W47;ce$0DzXbR;i+YrRwM%2C{$ETsE z1ikO!8C0CXd>#Z^q9|En83QiF)^@b-?69{N032iL!R^Yjf}?`3fj|KxXD{@v4q z$&C`Ncf)sK%GCA!>;lyLa~He9mJccrWdqMdUJbq#=eHL_s}5HKIm^oi-@M+0B}w3 z>SwRNGB27uaz6jkTV)^pyTP;5bz%%q7N*X=acxhj%}03dz+O--J;e+<-k3Q~RC=pz zt@{A}G?6-%rxtSQEX@GPy{4yNe+uqdR7cOeD=b~|CCZbF^5XhaoCCm&13b!WD%*E; zV_8-*N03(j2aK_{x~>2G!PP4k3IG6jYZ^ZM_0IqPYIimlH+X|QqsVMOSlrx2KYMtgrnIPU(%@q~!~fv9>d*ee zj+y0(AU7uFh~l}0>yE;S2+1&J99PQ7ImoWR3|zn4Rq=^aquAFfdQD3% z?Wwb)3S;m%S2GkSC;_g|3 zM;yWd0DEscB-hMDpzFTQjo*I%6>Q3u%kwY3nRw)@J*OvYNN(KPa|V`RJ%yudHJ&W< z5oWAXe^Fx{;Q>jnV}{kfj-*74#$e#=z3q^z5iY%XL1Y=~l2JM!?mIb4h{zrp7ZF%U zQS1!JU2*{XT@gzNy=8J{L4I1!7@IjizMb4Cud#%pbnNPG=x$z`SiqL%@V%mCYpQa8 z_V8*VR@8)YW}d$@9skCuhMA>G0HAfo?ZS-SVzhM%TvN70amB#oVle}uy`qI=Z$FeX z@aBQGHrF1&$<4W;N%^eigQfNo5lM>Pg<}%%oDdiG_E0`pXx&olKJ4;g`f1TR_u)6s zAN+v*>wkyuyZ+fPKdNHM!d45v>lTagKYD1ssnRJKmsj|S8Sms=>6y9mOLLWZKc>Z% znO1-72R1w=pi4Qv_Brvb;Aa8%fjHF6$dL5Qd4c-h$$TLfmVkjGs^<>fd!4IUhF(8| z^#h9NGWI=4E7zxxcrcBl1b&vdn3G6r>Mct>8i=tfEe506`4>+fxbqle7Ry!7!GY?Q zy7l=r>URxG_G|B7xS^X!#@vQ~V#Yf;lQ=zBc5$vUm5!s8*1~RUGB}FZ#2!Nso2h;> z&mjD5(cA)LZf@pbcnOU8)TU=5OsZ+C@3F;F0RZ>?bI+eJ=XWq|8|YnR=Qwi*JqDaZ zJdC_D_scTlJcMYV$T5zz8?|;}ZFc$cyTg4)EFWHBj2*e}`j@`;6n-}7%RBb0eCj&B zp5`ZK_{o|0skyRKQx)r5C1|G?kHm?gSP+39zFgTrP{jAGyU>K`F{*P2FauTB*DQXD z6EGxOy0=z~@F24iT8DzYj9{h#;iEWw-wjsD0D#dGLmNx$NS_G4AElnP%y(Kmiuf+B zkg%|{agdRrq3Fmy2Hcuf#FprUur!=;PCWj)RX6}(@VY&xo_=d}dKn=W0OvXG-T&Wf zrJ@_0yjYw7ZA3CX4L+mzIV=IHM~!nKEGhcFi4eADp{}E0;2P&Aj^26nRceXg zOfMjs`)syXDnn|njMet<#jA0AJl@C?cRa+%v z>fG3=r;alfz9(l2%yme85jHsN7ostga9Da>lNk9mBbpLjhsy|pIKu7Z){YzYS*ui8 zSGBRSzC5u2C{MMz8i^5z9GiMu`>)xND2d17vD()9Y&sjr2TchELt=E_2Py}ecv#Pd z$Pm^g?f||9)Zf6H`&)Ys_Qw+OSR&TY*_278x7IePtJTF$004Hq@4%j0oEq#)fA`eJ z(i+!CKPZiq=suWjD9a})37TN&`ZgY++bAB6ZL}J@QJM>|$ulF%Q}eD`UH{=*6XhkL zhtJ%msGeZ% z_Vsb?3@^MI>rR<)Aqw`z*mOlDe^cituw(?MzN3R-94M74^eOGTe(eJ&SzzYu|h}=h%aWF?Rc>?hn>W zTJeKO26Fz+U7A@Koh=S0xDms_ow8y*v!Y@cAb-tXFHk57pw;;lP6hh9A+#YO5bE&Xl1N932S)r#4g4@np{|o#p6{CRoEj6!0Xx?(%b3n zwN0#>a1LI~yZ_feV%7D6O2MxkY(9Z7~N&+PE@ z187NT%RwoR|dt3BF&iS zFT_8@v|Uca89nd6__Zh8tql9`IJ)zu{R&Z=YI;HjN?Lh#czW{mC_-T0)EBfE4lsPP zVQEPWM|cEfmb!+EU5dF0pg?Q~nJ)nNBWBjUj$)t!`dE zF;v@H|G=+*)YUja(8iFc>nmU#9Zaq1xBHjup)`D{@+5f4@O835<8>fYU^1n4~9 z=5vvni|KQb9u0B!f)%#ebaruke&mM2xpa2=+~xU8(@2Zq zIDZUi=DF|SsC#LeU>hgFZmdoT-Y%Jip2F)5+yFu)gL>L*7A52*hd2)Vrdwq*B zZ*^*M^sNi!HRTWf=FgQ@mb+R80G{}-|FAZ*q;w*I8Rm$0_)utci~M$gC@uaqNFS^1 z-=l`Pi67yKct9*zg6Ro~w;7>kUe1)bN?^>%V= zd2&9vuv*<*^Wbm&ob^+n@_79_&yT)&PM^^<$smYD$Pf0}YI~xi#>4&);2c8a006w^ zT}J{jUOo9u69<-%r#N^XlQCm5E@WRe2dbN@gX?%nB9@4+&MX@?51XAs{D9so_xh20-zK)8_T62HvIKr~ zVRRPp4~NZz>(V2&7z1wX`b+z+?gu{ikwj^Us~rH~^2tlje(C!bgdlfR&4?Ew^t(EI zD6$q*laP#6u6WbWfN2=ZrMxZ9cOy)^mE z7rzH6XJb7TwsDa*m;K`Oq3Asou9cV12FRiK1eoKVUPwC!CquVT%!eB5;&Gpk9KX*~vx5aD@Lg_q9sp2!LnP*@dwgi_JqnlrD^%?dq-q|O<+S=*NeqXuZG?TvkvEE9gIO0Gw+#{}0Bqx!;7wIi&4d5j&mFk)nuuBh zKyqRA@&EkI;JX=xFaro~IqY4^szD_~)5}nL7OUyq&C&Qq{K2ldXnqr}&_X^>_=Ukg z7|th`&R%-sY}bMQ@){?81pb#@H|<}ZTud&k0^o6v->d#0Dyn!O@DSmm2?S=%{TMkQ zo6gLS&Pu)1LM`w?$%TgM>NNlW&~s?;zJK*db))m^-NCUuz3{{T`1ipl{6)__79=DglpZ9#R53L^yay$rn<&%`#yQ{h$Z6P2l{)D?3f>&-cD{= zV>odAHAF#mRO7z6zdcb}A~O)ep<%<-#CA0HwA}k^AKrQ6{(^uJEL?l`OW)7u)v6P1 zr+V=g5amJpoEnjT*yf@9t_W{rZdTL*fLKlMZfxA3ephCh*RPC!Sp6?x;79NyyL@6O zlgf7N>4|VY1xI;JzERdXBf+ww;Y!e4&He3^b7U7r)#pXADcn&U zPJiJ5tf8y<=KtjbH+=N{6_Io*IQ)G6wQoQF=69aw2q!2?X`|e*XGqCVWw2w0&XH;U zShnJ11OOfr!L@Juz6pvr^62QqUvE*iQMm?5`X+?e#^-9a3+IfnQ%}AzKQevSXCIC> zCkLI~e{^U6(VdfLM^8Nd#{8uzwMN6TGFE=;6|sHtO*PVZb`BwbB{_$^C{woY?ml$y zbzOVy!EffVxsrV9FTS@pHY;^NffI5KAJKQj_a(zV@_m9CjLCiPRhn?!uO=CEFI1F6 zxMnU^)3Zxwmo9C^G=3E3A2$3zIan>8o6E_eS5LR}w@1Xu;iIOxe%H+hdXEgo6Y=E2 zYCe-wHg(YP!|=KR0JQYC5#&f^=0oJL`QG#+9HV8`<$G>D^uC|J>(D*dxwe8dkEwHG zkNxpClJl!!R)k^Tmk=w39W#h#3q;p7Vm0uyDr1_QwZHFyXkUpDL#p!+OL|Ve=cwj; zkbV%k$2rLprR1I$JNn>FM<0A&w53Qp{Cs}$?B(It&W@iP_Vd2RGhEDc;JQ7H-OX}7 zS{$DrJ$_zjLu&7R-EYZ&bBLG3x(^QSym4RWzCN$eY={re`P)By`JG2!32ZWQZ(+(k zkz^3e;3j4Wsba>S>xN{Y{m!-YzOTM1!`k2XK!_D~v_P(wE5;8D85ki<>S3k{@3jne z-uB7+>)RWPZ}i~EY^NsAU7o!-H9s=FG%=4MLyOe_V5L>%dv7}wfJZi!Irrkp^v0H9 zw@^jq92$FCS_e8>cXoB}?~8VhSdZnY`Ja64iTO)`13~JO0u2mJ7~z%_8y@_lk|DT} z6fI8kMDId+te9naxVu$2zqG&aeyN*i>s_sPocLkJtaDB4QK*3JC?SLKh)zNAh9A23 zhGQSPB_a?e`pBj;3!^i$m!_5{msX}1lJl#0SC8NvFHMx!RB#Td^{s3wYw9DltqpY@ zO^sbmEdw1beQmDomkJjql|KIcm(DzM9K~2*JEo@l_;N>6PGzOvEWFFq9HKYh+7trJ}C-=AXa2|LCr(>k@qAGTD`xrIo3L z^`&Gkoy}!(xlA^j%4E}7##p>0o+vAcmn7n)@pwt1x~aClqp`ld>8eE&A0x-lz50!3 zw$?UHFO1cqYOoMwvnq%gh*<+@n4wZ?o;mbV&f0IjFZl498q>(OLD9mB4aMMx#$&i) zJ3-MH4qIn%-Lb##wolww)ld{s{U>#7EU&%rl^;!?zs%5jWBT2=@JshdS5o#8oge7F z)+@q{;6C|Yoq7vG5!Qb5{Xj=BGsm$-v$zucK+kGMc{4J@uwv=n*H}EZ0%FN=aC*K%;?MyzG2c27BD+C_&TqI+baj*D+l$+vthRWX_=OK&4L*$^N z7W8ko>iAI%{~-BjJjTvKY_?RIKOhwGyzYYohwi(+eW!Dm`2XLJ=?mj0pLk>9u;Ye(|8(Y>^`*7p*Ut>SdS-2Q2{VT93fn#PpfQbw5dFolWN_oD z_l6ltXAaY|wwvxn$pUcigzI z|C(La4`csNI5OL*(YG!Ry>@!`;sn|Ci~4K>-ID1aH!I*ztS znbKld+fDbHwhi6p0ibl5NV|n*QB_I6u(J{T00%Zu6fyj2MtbmKv9{gaU3>ew4h%GO zHeZne?J5q=`SRra9K3(eISkR&?&|?>;clxv$r{Y3@}Y zTWcGWXUC?_UY}M zNyHL~cu7275|5W80=rf=mCj`X<3}!^&1TY>RB~&5X>D_PePd;PV=1|{n%rL7l6_41 zgn<+C2a?E%7B(9OI2ncuGf2*n_6&*{T0U_uqnkX@|{slVtrB<&n-TWV35VMPt<*f10LC*M|5&OK+S>wU|&K8_~pX+;esWmb(9^IJN!?U&zhgs&U zJ9CQ3;>@{OceKXe-fj%7%@-Iz+C=TsXTc28$5g6>lFv~J7~_uOG5 zXFG~$H8ji2!x5mbF%c~#?uTQ}^3BJ{v+Wy^zE(#r`Ggf4d|#^_R}7KvCB)VK!w4;` z?Md$I-*e$Q-UDcuq4hf|e;`+}s?Gs@+*>#Swx81bh!b!%_{n{+Xgy9_2z@Wm{7H-% ze%OK~@)AK1{sXSyz&6crpcyt6!Y7o!1EoKc*b(vBh`e@kv! zJT1fTwcw3fmuu)LppA9+nWPEw5$}@uYx)J(al(8T2afm_+0Re-T(mN1?M8Tv;V}`n zL3{;4wy@>#JQ#jgjrLRZzWyb2o~pJKV6Ya*7R1 zV-pH>q{`-`8F<{guEPW8BkfuyLLfd7rbURN?pO^aszx{mfic)dqV!Tj-vMkfL##lz zvZM5XFeAv#Bl4*84~yLb=|UXH_y9V3fcxe;cacV{Z7;Nsr?L(iYv(mfk@&8sRt7Hj z;V2RtT-R#6;&Cs>cO;+SS{jKKq`tDx4g8D1HY-kpiUlFS1jFCScQ1U-cv4{MOGf*BrZG69%vjrRQp+*9}W4DXw zH!xc0duEXFU8MhoX>tJQSAr`dp)#A0uO>+RpxoYN_f&2{#*Dpt>~d|hg&;iCEjBhr zf<|75PX$>H7q$e02VBLOV{Fjs8`hEV2~KbV%S0G&VaHBO`{Q?6qKkdpGOE*+?N#O< zN>Z2;#SFY3Nvx`~FBC8xKh%)6**%G;R#n@gH7ImtUr+vjs~;tK#=+*I2)xocxN;x;;bU7JaWE&{!tuS>_pJEAvNI zaIWbihBT1xyr}o;c3V<@8_vl*nZOJsJ+aD;J{Py(6h8Zt^^hGWC{samrD^#PI*8R$BCRPXxwiMW8c}Bc*bht^ z2H^_+mc5Q28iJYMrZYLeHcD)^3OV;XZJnWv3xAEKPnSyBadobb-fBHuOYX^<(2yP*qKr@r+i=k+N6bKrPp==nYuLS4A(OWDj z(Iwflki>JC-&xYfsM4FkkV@134_Xd|beRGc3k^%8ey{AU=)Ny)m(IAgpYj=%!5Z74 z`-D*&>b@9rtgHQyjc?%!y++2YIB^2!AB`D7yTvNndn4?gXepa!_asQba1bgpo&^hX z6yze*_WZ>-a7y}Q#BhXpY_@;3|REsfvl_DQCj(saXH+30n3xk zM6L~ugF=A8IU@Wf>c7ZeF&-Fp5%De!OUUXbnF^PUA`On!aAHX0eJ##ITz{{TUgILD3 in index.html, where Safari reads it; the + // PNG is the favicon art rasterized full-bleed (no self-rounding — iOS + // masks its own corners). icons: [ { src: 'favicon.svg', sizes: 'any', type: 'image/svg+xml', purpose: 'any' }, { src: 'icon-maskable.svg', sizes: 'any', type: 'image/svg+xml', purpose: 'maskable' }, { src: 'icon-mono.svg', sizes: 'any', type: 'image/svg+xml', purpose: 'monochrome' }, + { src: 'apple-touch-icon.png', sizes: '180x180', type: 'image/png', purpose: 'any' }, ], }, workbox: {