From 01bb76fbc7673fff6023e73c9bef66f7833fbefa Mon Sep 17 00:00:00 2001 From: Ayesh Rodrigo Date: Mon, 5 Oct 2026 23:17:43 +1300 Subject: [PATCH] Full-width home page, and a real address for every page for search engines The home page uses the whole window: the colour wash runs edge to edge and the content sits in a wider centred column. Pages move from hash addresses to paths (/rhel9-sysadmin/ch07/acls/). The build writes an HTML file for every page with its title, description, canonical address, social-card tags, structured data and text, plus sitemap.xml, robots.txt, 404.html and a social card image. Old hash links move to the path form when they open. Co-Authored-By: Claude Opus 5.5 --- README.md | 4 +- docs/ARCHITECTURE.md | 4 +- docs/AUTHORING.md | 2 +- package.json | 2 +- packages/engine/index.html | 2 +- packages/engine/public/og-image.png | Bin 0 -> 181125 bytes packages/engine/src/App.jsx | 12 +- .../engine/src/components/prose/Heading.jsx | 9 +- .../engine/src/components/prose/elements.jsx | 7 +- .../engine/src/diagrams/ch04/DataExplorer.jsx | 1 + packages/engine/src/diagrams/ch04/ch04.css | 2 +- packages/engine/src/lib/content.js | 6 +- packages/engine/src/main.jsx | 14 + packages/engine/src/styles/base.css | 8 + packages/engine/src/styles/landing.css | 66 ++-- packages/engine/vite.config.js | 6 +- scripts/inject-meta.mjs | 7 +- scripts/prerender.mjs | 342 ++++++++++++++++++ tests/browser_checks.py | 51 ++- tests/mobile_checks.py | 6 +- tests/snapshots.py | 5 +- 21 files changed, 478 insertions(+), 78 deletions(-) create mode 100644 packages/engine/public/og-image.png create mode 100644 scripts/prerender.mjs diff --git a/README.md b/README.md index 60cef9a..cb32d94 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Kernel Path is being turned into a data-only learning platform (see [docs/PLATFO - **The compiler** (`packages/compiler`, the `kernel` command): validates `content/` against the contract and compiles it into a static, content-hashed bundle. Code is highlighted at build time. - **The engine** (`packages/engine`): a React 19 + Vite 8 player. At startup it fetches the bundle from the location in `kernel.config.json`, validates every file, and renders pages through its own components. It contains no course text and never renders raw HTML. - **A site home and program selector.** `#/` lists every program with the reader's progress, from `content/site/home.md`; the header's program menu switches between programs. A program without authored landing or dashboard copy gets built-in ones, and a planned program shows its outline. -- **No backend.** Routing lives in the URL hash (`#/rhel9-ansible/ch03/inventory`: program, chapter, section). Progress is kept separately for each program. Progress, lab checklists, quiz answers and the last page read are stored in the reader's `localStorage`, sync across tabs, and can be exported or imported from the progress menu. +- **No backend.** Every page has its own address (`/rhel9-ansible/ch03/inventory/`: program, chapter, section), written as a real HTML file at build time. Progress is kept separately for each program. Progress, lab checklists, quiz answers and the last page read are stored in the reader's `localStorage`, sync across tabs, and can be exported or imported from the progress menu. ``` content/ the course (see docs/AUTHORING.md) @@ -92,7 +92,7 @@ The workflow in `.github/workflows/deploy.yml` builds and publishes the site on 2. In **Settings → Pages**, set **Source** to **GitHub Actions**. 3. Push to `main` (or run the workflow manually). The site appears at `https://.github.io//`. -No configuration is needed for the repository name: assets use relative paths and routes live in the URL hash (`#/rhel9-ansible/ch03/inventory`), so deep links and page refreshes work from any sub-path without a 404 fallback. `packages/engine/public/.nojekyll` stops GitHub from running Jekyll over the output. +The site is built for the root of its domain (`CNAME`). To serve it from a project sub-path instead, build with `SITE_BASE=/repo-name/` and `SITE_URL=https://user.github.io`; deep links work because every page is written as its own HTML file, and `404.html` covers the rest. `packages/engine/public/.nojekyll` stops GitHub from running Jekyll over the output. ## Contributing diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 9fbef76..686a78b 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -8,7 +8,7 @@ The public site is `https://kernelpath.dev/`; `packages/engine/public/CNAME` rec The compiler (`packages/compiler`) turns `content/` into a static bundle of JSON files: a site index, a program manifest, one render tree per page, and a search index. At startup the engine (`packages/engine`) fetches the bundle from `contentBase` in `kernel.config.json`, validates every file with the generated validators from `@kernel-path/schema`, and `src/lib/course.js` exposes navigation and page lookup. Pages load on demand. `PageTree` renders only allowlisted elements and catalog tags; see [PLATFORM.md](PLATFORM.md) for the platform design and security model. -Published URLs use hash routing, for example `#/rhel9-ansible/ch03/inventory` (program, chapter, section). Addresses without a program, such as `#/ch03/inventory`, open the default program. The engine loads one program at a time; the program route remounts its pages when the reader moves to another. A second hash identifies a heading or activity. Keep published filenames, heading text, and stable activity IDs when editing. Links into optional reveals open their containing details. +Every page has its own address, for example `/rhel9-ansible/ch03/inventory/` (program, chapter, section). The build (`scripts/prerender.mjs`) writes a real HTML file for each one, with its title, description, canonical address, social-card tags, structured data and the page's text, so a static host serves deep links and search engines can index each page; `404.html` lets the app handle any other address. Old hash addresses (`#/rhel9-ansible/ch03/inventory`, and `#/ch03/inventory` without a program) move to the path form when they open. The engine loads one program at a time; the program route remounts its pages when the reader moves to another. A second hash identifies a heading or activity. Keep published filenames, heading text, and stable activity IDs when editing. Links into optional reveals open their containing details. `content/programs//objectives.yml` maps stable skill IDs to lessons, challenges, and labs. Each chapter lists its objective IDs; quizzes and labs reference the skills they practise. @@ -54,7 +54,7 @@ The lab tools live in `packages/lab-tools`: the `lab` command, the grader and th ## Build and checks -React 19, React Router 7, Vite 8 and CSS build the engine into `dist/`; the compiler (Markdoc, YAML, Shiki) builds the content into `dist/content/`. `base: './'` and hash routing support GitHub Pages. +React 19, React Router 7, Vite 8 and CSS build the engine into `dist/`; the compiler (Markdoc, YAML, Shiki) builds the content into `dist/content/`. `base` is `/` (or `SITE_BASE` for a sub-path), and the prerendered pages plus `404.html` support GitHub Pages. The build also writes `sitemap.xml` and `robots.txt` for the address in `SITE_URL` or the `CNAME` file. PR CI runs formatting, content validation, JavaScript regressions, Python lab-tool tests, a production build, and Chromium learning-flow checks. Content validation covers routes and heading links, activity/objective IDs, quiz answers, starter manifests, setup syntax, and grader coverage. Browser checks cover every route plus mobile layouts, focus, persistence, and imports. diff --git a/docs/AUTHORING.md b/docs/AUTHORING.md index 47de7bd..6369249 100644 --- a/docs/AUTHORING.md +++ b/docs/AUTHORING.md @@ -42,7 +42,7 @@ content/ ``` - **Order** comes from the numeric filename prefix (`01-`, `02-`…). -- **URL slug** is the filename without its prefix: `03-configuration.md` → `#/rhel9-ansible/ch03/configuration` (links inside content leave out the program: write `#/ch03/configuration`, and the site adds the current program). Renaming a file changes its URL and resets anyone's progress for that page, so avoid renaming published sections. +- **URL slug** is the filename without its prefix: `03-configuration.md` → `/rhel9-ansible/ch03/configuration/` (links inside content leave out the program: write `#/ch03/configuration`, and the site adds the current program). Renaming a file changes its URL and resets anyone's progress for that page, so avoid renaming published sections. - **Section links** add the heading's id after a second `#`: `#/ch08/collections#where-collections-come-from`. Ids come from the heading text (lowercased, spaces to hyphens), so renaming an `##` or `###` heading breaks links people have shared to it. Every `##` and `###` heading gets a copy-link button automatically; link to another page's heading with `[text](#/ch01/page#heading-id)`. - **Frontmatter** at the top of each page: diff --git a/package.json b/package.json index 1dc9f82..54c5ad7 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "type": "module", "scripts": { "dev": "npm run dev -w @kernel-path/engine", - "build": "npm run build -w @kernel-path/engine && kernel build content --out dist/content && node scripts/publish-lab.mjs dist && node scripts/publish-schemas.mjs dist && node scripts/inject-meta.mjs dist", + "build": "npm run build -w @kernel-path/engine && kernel build content --out dist/content && node scripts/publish-lab.mjs dist && node scripts/publish-schemas.mjs dist && node scripts/inject-meta.mjs dist && node scripts/prerender.mjs dist", "preview": "npm run preview -w @kernel-path/engine --", "format": "prettier --write \"packages/*/{src,test,plugins,scripts}/**/*.{js,jsx,mjs,css}\" packages/engine/vite.config.js", "format:check": "prettier --check \"packages/*/{src,test,plugins,scripts}/**/*.{js,jsx,mjs,css}\" packages/engine/vite.config.js", diff --git a/packages/engine/index.html b/packages/engine/index.html index 9889795..3a49149 100644 --- a/packages/engine/index.html +++ b/packages/engine/index.html @@ -7,7 +7,7 @@ - +

Loading…

diff --git a/packages/engine/public/og-image.png b/packages/engine/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..16fc8ea2278f28601364c031f5bbdefcb7836a25 GIT binary patch literal 181125 zcmXt;Wmr`2*S5)_25B5>NF_&xmXr>WZjc7yM6sV{@-tN z>`!yt_uAJ!*SS`hvZ4$wHaRvD5)!VQtfVRu5?U1!5{fG(%HJoQbcZ-dNcc!{l49!a zX@^ffhxUuE;2>ex!@U88Z6mK%_glyuX8aG;Bcn$W#FJ74mKBM{w%)l)(ipL@UEg;uk+}==gcvp7N^6QseuwSM_Sqe zt-Ee|4!~>ITX1`%-n^#zgE4>I2ALo~yX#sZE&bC~{%pMyDD$J)CStj~!PM3bMnC%} ztAV=uO!VP60`K#K{Ru{LDItZ*A5BDPvE`Ay!=L1VyH$y>VN>~t;aNAEJRL*o4=XVP zXR=-vad$6lRiZC;=nDJpG%7wPmbN-tJU;z>}WVL5>vn^~)A(7~F#gI5)g_g~@f{J|id_vY{K6h7DH`d zk^}s;eL_G5m}hUjUlWoxb>LaYr6&aSgPE8q>dK|yxF#y@agWzj3qiwR74SVUa z(9L#mzbJvmeh+8GQp@Af-&1|M3gE#AG*e3ZnH(%ztT8qF@g0vx$CE7J;6ZhR8l}sP zi)O?}XNB6mY4-B+t01W!*zyZBYzTxXN zqn;22Qv)9zxN&QKplR^GW4kGsW5C->x1GO!Z@bs0S<$$SG-RK7`!c~TH9uD z0Tr%On~!lC28gXE&~x6@_jLN)=LU6|E7!a6aT=cjMHW1edN?9NT~QLQD#&`^i;1|p zsW8L09miB6C+PjIZLA>zT6o(KebsB2i1{cj>5Z>TIsf6?9F~M{4pYK47P- zv7StyZ*{Pz#_`JW(%1R5P`G`0m)AR%@{hmnYwp^3%;$Qm=I`;DcCO6=Oe4SzmbF`! z2#zX9=?j)jxfX3c`Y#IJ0Gxi;VGQqd`ZFwRgx0DkJqL)$S1z;-Q9l=d3)Hhc^1qF| z4pTa4>xIvM=HtcIBA^H=?*~8;cBfYNvN$Cvmo^mgk~rmAV-=J-fGG!Bh(|_qYc@up@b zwwBD7#s|&#ymi^{DtMf`Ev){KiKsoC<7aLaG*nGSLH6wHq}^(2-B0U4k^C)3w2j zI=NrFe}+!&{o8K?W!3&OU2>)dTmN0egKDp#MbQO^K?wRSaq7X{OP`rH_&Q!E`XL9Z zGY{5={>e(LaBPp`QbRm2HhfB}UpaNtaQ952-1_6}O01Xhp=(Un4iW_z+`D>F9i6SQ zznoRs8yYVD%W&aY+b!?r2>equzZ253Fu5ABr_&gzoUY{kYqKO1n{E!IRUXK5=3{( z5SrvOWkDZ)bR39K0MDL~b{uUsN)x2h06jizY@8h-iM%7)_#5mCTQKW~1|E^`Ge>O!v0 z%*&~sp%qK2;U9=!yM%v;PUGOz5q_=5z`SC~@+f)b_u;W;e4UkdMJ6GJc*rx@xqZ%Q`Dzb1ZZLj=Y z-dNh0duB!pGy!o#cfo-j@w2sfMxxua+q4b+2v87o^{sBwz~FawC|uf_lmniK^&5(r zL#6fz?xdknC@>Q3^Lqd}#~_mh9&_NMs($6T2wa~0+M%VWdoyHOfMo>3@#^%K*JtioQSP*CKPU@w(n^P(W>@n{?aSQ?LId!WHI8<1E ztr!2^RUMSO9J;q`A)jfacT$R=s1vwqFIkP|Q=wo91~HJb>79g?Ump^IdS}X-sI1raWXGA2Y`7b?mvEkM z)IgxY$S#LQ%gr-x>5a%W20{UNcBLTbasR9`+GeILaOzPXd}*7v^9|$O9d?~TK)w{E z%&h>?;me|x*R$2FX&N}`>JfeI{#vugb^AhDkCjZQ`;u=IejbCr(O8Wws*0namWpo2 zn0c1%vUx^dR~Mj~)9ne#S)I8ASGno)4d$?qmuSz`toXRzMJn0eu{A(5D=auOZTGqz zyx*YC2uP|4&<1H{t`D)l;-wR*-nuAa_ZXuH z=TkF95s-Spp-C^JGOc)2Ek^%hxbTN3aQl~?T%1*0Z4s73LmZ|>#PmiN>DK|VNR-~n zm+^d=5yPl^=LOLZv=YMh4kY1}kOs-kkN;9db7t@=bwa!@EK_4j+`Sg&<_opUwfC`wxfw?2@1$>4i4IsVZJZ!ZYa{D0m z_tH4VKVDka8g+&ukD{WW0)V>ED$W@wOs_O&|dl6>3JmUyv9MVA-hZ5jz7{)9`i) z^3Y8Y9CHa9#*R0%M@Z0eTL&wesmd3XX?VzcwMC~hYq><%)y1Vcq=eO5H7!RPKM`bM z097n(v^485X(=hHP2KA2Pa2lg{0Dzck#i&+ST&{E6{Vdxe-9g*(XGk9@US165Zz)S z+fksu64LQZYfqg!Z7Hv=9hmQf3zyi1E=5Jvw%GMTUJ2M4{-rb zDIH?6MVil-wP$SLJizj>5a_ttnDMT@aDee{gGtfYf`Efhk=vK(t}l=~VnAjHF>p+# zTRu0g?ScW`EgBwVdOtPmoo-(;5)DQeLA-lGm(F=HMq~X_C2HboXDl;VAG>7V_Z8vl zD(=l^hi*T<^+mL98-*(a?Ge*tv0C?S)OCrz>eJ#8D^mLyLaycPJ$o$5wXCeVh&Xkc zP5z6)_;NRE>TKN~zM<*IB}2L`I25nvR~B_tF!y{Idl|h)vM$1eGd12Z=t+xMwK3dE zt`T+ZOnj^S6$?RJ4Hvq7H0inD6}UdC7$Bw)*|)zLAf*RT)Yn@2Rr{ffm$rud?H}Su zvx#9bE3bzPqmH;kf2u}^velVdSvs3WIBw4EHVk}>gf#dB7kfBG^(G9cPa=73a_a?* znai(T{NRmr4o~CfB&gKs`#-L{$aG?NVa3r&()rIxG_#el#9q@VZ4r^kxPHc`=Bi^dGZEH)=3eFP z@R0Wy-xrjwSvUb5H&xig4Qc0Lg!OKBQ|3ebnG3f3J8G#A-`qu$P;(K4bSeLV8;$sN zbou=9@o0LnuN&eTb^jAJm4x4pk>s_xi#B7yN>n=-6qXCYlYG64JLknnr)p~6*+)7| zui})a|9|!DrELjGbV3`{x6$cY{`s3x zDDZ*+h>Ge3gg0FuQ!xO|KlaChDU{rVOjiH{xTy7itGb~jC=BJ?@8!8!1`Za_7jV?G zZB!5j$5#S^gS|wKWzVG6)i3XY{j-4$Y0;S6;7N%a4j`_M`qE)DHHn^3@bc_V<*E(8 zgEhiIwMnYJ_0d(b=v781cJZsm_X-?Y0u2XP8vZJcAtYQ;hDq|x5z11e@f4m9#XeOLJtJ+!T?s6r9JK&stG3QMghT6rEY%Ks$fs&F_5rnWiET-nrCY zvSo41&t}W>@zQjU-_Usl91~0bruT^%f!yGC3zr5KzJ2jDw}odqHgwchR%X%}+p+kL z-SWRg{)cq+*5q|Pt-@?8MGC~$%`Ut0$Q3B^k_xK5ql1NfG}=uC6o8GB1*VWEK-sWg zog@42s8D~``u{EfSn=yM@VcB58d|Cv*;UMAS7K82`-%bR%Yq4X1b)B9w_Z0+-Vt)= z)~t68mySWxev!~t)wddl4=NxacwcMU52IuiLxTsK|CSix3Z&>+QJtRiaEJcx>J%B3Q9WQ)&mtk(=jY?DHjuz zRG1!6nv?(JJOky{rz1-~A>58?D{jx>tg@)Diy;wrI+7Ww?q9w5Q%P#p&oknJj zN`$1W+d_|0;y+Ta7uGS^_;|$Tt$KpjXW=RHH$QMobBad(OLFt5Xiw@p^|n$alT-8a z0ez9URUxh!X^~RC#pQ(*&lSIwhyOuh{vHx91%Czh^oJNbMZ5gBx~K1}0qGeUm;a&o z3W~(hVNa(rGXrqT{Pimr-sRY4UH!jdE`iGF_EzNr1kV{&0PWXy$DN{p-*fLDRuG+7 zuF=BWBSTD0W`?PItF{*-*X+4pfWWK92N7{0r)5Aq5XHt;-uy}r7eEYBNvB80Lv%V{ zve2}LYHdTCcSq@BuV3}1u|_F2X^YSM4QpAUTpflcCckSfO2VmjgFZ26^2?*ACd9AJ zdg7`sSPXMBxiZa&Paih_wV)j}#I&=>LV@fH#P~VrY~`q{*lR~RlS)Ce!NGMn zy`E`p@*6FgP*Lt;{OGO@aOp;n7z?2F6@VB>2x^5b!;m1faNS9cvN5<1haiAWiph99 z8kzOv<&R0sTgHWpr~u?>WG|rVR1+3z)#tt|+usth$s{)!xp87!?v8F!+~$ds8N#+$ zVCQa{7^5m77UNDeP#r9Eg)DF%3t$SC)>kA1+@O==Juk9qUiHvKV}DS|77~vzBn7(& z5#JrVjm;lE){EbI#bTQ|NO^>E^E}IbyQ_5Z>=;#~2og&yR#XEr+)OX1OQ{0U>J^o> zIEID3?!Py8K{u~w$C3!qE>gHYrzUFD707MRkx6yY#%CBt%?#3D)%J8n>{y-VOSEZ`T0$E&suj@7I0s;9G&ZM~>@6RDKm^waep$G2}cSbxncE(3Zv!{0Ga~1eGs^ zPtMXuN^hpjlkDj%e7*ihgsLW25FZ&kv#JAe!paV9Er>$AN!8wg9B^h-0;Ea$+yL@^ z?Z{fJ7f=Ju5_*~enFL&8!u|b);nB&|DbO-9bYs~V+(LSQ^;(cWZC*Hd+H+WF6VN*o zdWHr+JLd=7Z!8;uJl;wpqNcyO=e;1;&(L?`^`K$l%=jLhu|5G9U_@2fA{mR(U*sP( zQwGdXr+k()oHg!4m7*Z-u{xkb>}gVeC< zq3Ce)H4Z-Q!ZKC3waO*8@&lQ~R~|A2Aygf7I!|f)IFF0=&a(UaUIICI({6%|itL&j z-aS#bkpZ6V6n&xGu8KpC_n7d zRr9T`0y))prR1E(y5GdJCOEYa*%L9lxSo^}^i)F~O^(zBnbJ=#tpDl5E) zPn7(+bQbdgHoWftg?QT=`IgQ&u`b_FsCqo~KEuwm83nfsI*;&yj4So^0YisO@;{I; z&l@b%Js?TX83faApE9tW0*I}ucs|O(4HUf;F{)Z2Lv6}7!I!550KY?5$^J`p0tqG< z7Ai2X5Ka}S4)ik% z5^D`C+w5Sj$@Q&-eVGpxSn=x|FWEs91q;deZ0(RKwXy^1N(ZHtHfC7F@)KKJ`J5nZ2?Axp z7*1|m3xDvQFo=xV6=N!`J8g0;ieDMNT_3e8wtTX;%48!Ej)@{qK0nlM`R5Vyxgp&a z^v&n89dY2rwD)Cka`rDb^6_v3%VDZ5B2G+g)ago~ft*69(Foe95ZwFj6OcqC{N+06 z*T~HLW`-ANw>TSFtjBN1qiS33=);H^@K+Bi9D+wp2rrq@wS5=1rcJ+^Xz4t9Ql+xw z0^g(+VipJZI)^~142vPGw*+NseV<&sHZ?Oae(&4NM2p@hnkLd%^Vw2k|j z6gQTCoHS79*?lJ0ARCkR2v3&Dx%w-$|6>nBo$&EbLT_#tL3udHw1k}oH-1(xN;xva zXp8ZoW^A0?CqDg-tpjEeYnt*z0JP^@eWflVLp?MAEw1URzpGpnsCDBuuk1u?0ig}0 zfr)neA)`tIOE>Z{JyO!#MOEH^!{)xI64Ae&UNOS2eMQ$LFhhlBaH5hp$^N$SnZ!K* z(yvDA{o0`ROz$CcKMlbG9!&YB4;55mJ+e>9L~jL>{ie6kT{lQCj|Dt)ltc%_7|~9I zhFdxRs1z3AbGOWkd{hnqII{OH9whm0xcz~OR=(6`Y5X3Sp`uWF{!xE1;ZjRrx#-P% zI7OjB;dLsifHAB4j}iBKTNxshac6!Py+d;K2#&(Tb z-Qmw;o4zTLjybcs9zBKws+GZtfr<*&3 zXFEH*ThGxF8Yt{Sz?F_1;@5&{;I=mf&HpMnub0#JK6>)luk8(k6;Eu+;eOg*>5XLV z7SpAQa7V{m2EmaR7L8<=S9*+`{2F^#odWgbmI=qbXspVy0wsEdp(mOIB54hV|q0VF~56 zCf_tHG>k%5BwJlvA1WimEmW$Z_2#8XINj%pBVPNx_AN;P4S|*}FER^XM-8oU=c8cQ zlp>eb8lhxOQ^{B!FnxUx$WZ=^&l+yrR8b4+j|9TFOr9y_$DPCALz7|q*>iL~=Te97 zYc?#%gKXhfeq|o^&RVtTQWH5K$9F5YSYG-&pY*;C>$@``61!%#-IzsmC$>NUk*$31 z_Gg^QTZRUizNS$8Zko@S6V@E!;s zMujOOkowwuBG=HDO-{XY%Z3T@WVA!o|FQ|xI5g5(xgRC#%D%Kmhgn}CmE<^hwShIC z6qa$~0+cBTx^%g=y`}|XJdevm7WsROj(LDmr40ItHJW>S>>j<)&@*MB0Irx$=G>yr zB5;pP#iRrk-d<3zQXlE_`-xQO;+;+K>6h?dIWPKaB!=kkq(2st-?5i`QOd324Q8i5 z02?HpY(KJd8dZLu@JMYITW?FFRZ*9)I5>ud4pFoO9F5kheb(}420T#w88)~NG>^oE z7=sS;nOFc!*BrGGq?tsdB5F3h-xoPg<){Mwq;pudhhY%U6230yAy1&s^eEd}Il0hj zw%#Z@_ppy37EwW-rzmXY2#tCQm6xo7P>5VDNc`WY5cbg>crxkm1P`U)arX;fV-hX%v!!s&`aly zh-%xa`Tf>NA6H`gb<@0Q{ zl_#U~^WLrXI8uz0A%WPird@DG&E_~7n*-M}R>Ab;Ju$MiPqj4ikNx$luXLS^4F})O zb_FJj5?vtjqVE?32nqc{RAzp8`?7QNkPds2gL|@qx`a4C?S^aa>i4c>byAiwopf`C zh9)wadIcX{Rf(2CaF2-KReUD&IRo_I0;wK5W)A6=g~-G_d`%H#!;u=2l>S0|njlv# zwgss&Nu+?|8BG7$k)uXTjs~@$&4EVt_pS83JEvu?0st^`$jL_y^Cu`5Z*{ue&y!+P zd2_vy$>VgFMo*$gc(w6|hP>UV>IRjV5u4SO|H}F=cd%X?=$~-JBR?J}?NhG%_sX43 zoQy%mA$gL(*#KTK))s0d0*VjLZGh%*p2G~T{L3hB|B_6EIu9F=SRb4)S2UC4mBpG* z&PBcL52OS7o5s+x?#MINwdPm(t9N8Kops_3JI{OsiKIAK0V-r!LAcJ!#qeA z#GRigWb*jaKke=~5Q}FDl0U2;+^g0R<5A+U4q@^bRwTB*uh`(ZsMXa7y%2B}ZVadS z;Wwa>@vA0dJ#pEz!kQr%V4mRnBCnOK zy<3v?vZ!g#?y_PYQX~=+wQ;QCq+m)4FobDC@LWvFadP)jX6d5k>B1^ihPtJPbQ?n2 zWLVqHX>94aD_~at-vwCK5reh;Ia=_sX)z@t^=5w^8;Kglk}wP%!11{obs``%=>5!i zE3*E^5%>oh0o;VDk7(QU*WRNvXQQ7-gWnoT(88d;hd1-Rg~6@Wx>HSND!o6;7l*Z* zaW)b_7g8U9mbFs&`{<7-^kam7$5I7MeF-Yz%;MH)DftL7Z}{uG2*TW$HXRbJ*ja&0 zOYd&2hu0!&ph-S$=7m6|#^5_i55fOQDc!dlC}vtT`WXv2H}V(Pwj<$B zfo+-o&5=nO%p=x7Sr=}g4uL0eppYLjp7A(bY>b1F?Uk##SXZvZ?U;nTtll|2zw3Amg6kZJk#d4tG^}??b>)CCc`IDh& z@iIa=j9{^I%oh5z+8>g z^3F`8fa31651alersb;&E7Q7o8LNZR>51&$MY-kdr8)Ji{X|C$i>U^2om(wI@5J8B zkO)Km%K1!;Bl0=>=l7%p-RfM0pz9h^`G zY6w9i3p)HlQuX6o7ECZ1aC&})bHHpsqp+H4F_1K4t4++*MAz&|F#>NrneIED)6M#^wYl ztBYeXyL_DHCr_{IGQ;`Mmy$>wHcvB;v(L)hVGf(92^W{OAwj{XF^tf?$6E}J(jRV+ zk}LXPUM~YR?hHcKbqz&_Yqzi6(tG{N3G(tW_EV0WU--}){~H1db($;-F9C)7nh~^z3Q~3t{oSenIz<77vQ0q;P=(5( zH|D7T^CshwwC>}*fu`U~9Wb{!dEDB=%b6A+uq;e$lms^ZEUc8m7O2Zl!AX%e{~AaU z6Wg3PudUcwG_+=*p5@WI=0yXbIJ0>T+2^q2+`RKZJ`N7;={-#ofUzl__U6>n-b z^YfqQ2Lihhv)F5HPsc7@3g5JKU*gmqK8gVc>UtP zRQA>+&lqRSeZlAauUYvNr@h>`H1!76i>KfzPBCU4-AFz(e*#&e)iwByOwtz&2_NEY zd_sWmLTezc5Bl$L3_W2<1T;w)@44QG49}O#_y1LMi~*K?FhtMm z6zWQ7e2Ey}PPwy0y`}lvKyHE84vvEY^;)>szWLh&(?A*e9bAf3ceK_D4uQu_gFV~s zo^@tw1{3UIalRU@>+D~au+Is!lOPriEKtV+ano0EQWm@!m-@196PcVvxAt3Qr(hCV;x%P9#q z%7^Pm@>^vzl$gF0ddb+bD!5MGnBB<`%vgbF4C2T-sMwalqi<|%Wft-^;r(&!S!NwY z<}N6rX(LIZxh!ZOcfnj%TvEQ443X`i3}t$c88;Wrl!F-;*|puai23PaIEh;qA|6Z6 zaBJ!S$Q*6RV;Zrwcye4<8@;nt8EiPb4T53n1t^({{38zGH`mzFl@R4beC2JYM^tSV z>`q^)nhgDYO3SOGYh~3S6Eg+z5Dt>Qg^642rLL-W0>?y7V)3<2@ejX$Nd^S9i~VM= z61V~4t=|gbaUP9YgIMs+Il*%;LGI8Ii*4i^_gGxKYpYj}XQgy4%vL8K&!uQ|KvRUx zmWW52-%HAoV$Kwl$d^=yzY{`)OdzcBT^KR}+ydH+d6e+jU2#?Zt^q9fkis>U?w%E$ z_Fw%Ub)H7!9X#u}c&>9F%sn_k=va+p92~U%uff>wrchLpIPwexE>g;q9!bF-(#M*H zmJ^}b+LE9mPhdc~lpZj=Er+LXcz6C%boQ63&BHFla%`g)q1bXW<1Io!%X?wlkcTNZ zm&aW3Fd=g?|1)XSf}Ef)DNL!PW9{OfC`C+8f%FtF$KEX$=x$9NdmM*q`(2gb6;Y%2 zNQdzEAdP+6NyY8i7C0M+c2M?Q2)!*W@K$xAM#npC!l+DG#{!0s(WR-|yJG?&*Ezvp zyrY=tHCJX>Rr@7vjN{Nx`WEm7lI)BIZ*;{m9obv{o?N1Lg48_2SbAM|>I5m&gG>9Y znH^MjYLp(wpjx@1of&j=?_kkabu~y;C3G1YT3Yshdf()x?&ayomBDZYzh&k5cFyXq z*x0OWikZvWi`qjO3^QG}0FVl_(>m`x}U7NVlCZ#6n zlfGJh^TAr99w!_3b+Amll+;D!Iw{0!mgCdVnhfZLCKup77&S6s)Or@LT#wkR@O$-i zaX}$RDe+I7i2IY(JN;j5pIIQDI_Vd(tD(a8@r1PPMi@5K%;L6$fautOwK&Xbjlc^` z|5T}a+B^HPLZP39wzs|Tu`;kB_S%227b6k(H$(FJi|Duo%J^39J?W-EWB87{Q0x?3 zYo@41UvX5q<(>|DoWBO{TnLa=q#BLP1=v7_BPU{{8Ff1SE#MRn(H;NGqP)m9N>p`K8--_3r%R=bLF3IJNuWv!+v^n)%DYY;Fy>h-UF$M!K9PN)7uqiz*gbTQ`tp@Tg$euBM zzvISQn0k<>x=$6OPVWu)zH11&l#2<1FxqklV(76vdZk(Nm90(yTHkt{6h|r$X>lp0 zc8OGy(eaeH*C#XU&eWS{o*ph;iO!L?TJf~+JMRP>IRcS!x~5m{3F_s*AM*mv;KZ&o7|&T|K%Ys5PB;|4fe`x`C`2D zHl)FAeI4T9G;Q?PnyD6$^O#0&mk@9P~}{g;2AK_A*J+Iae_MniA8BYG=lf|((eN9V2F z?EK!w$V3jYvg5EXIU?Rb&cmskQ4#gOE?LxYAh1z~!%t)*9fQo9HU`!i*~Mx10K$N8 zFpo|vlmdC_Bnm2D^VpFseA2n}fAWGG_efjL2CeDDgjQ!$@R|sa01~YC8VIIIK?TFx)cRU^pRjV73#V!+jcX+REwV-XDFu^e}UqUsXpia-~{9hc&m=L z3I7Z`8@rAC+&Glq9s6W&(?y17qb5J$dz`g4b-g>N<1|z}>c==jw#%HyTTFFiySZPg z*brVu@tAYPMufKR?e>ynX28i_p_a-5l(CicXf_dwa;kpeO;GA!F+rv2o;&S3dfs4s>`v1f8oD1WITzf}%?|8yvX z+`Qb8!Y-TBnQj3_A7D~o{0mo*Yzd8RzVS4|^X(Ko_c?AYjt*JkxO%I@uW*aT!7!bf z@{z?NZIMccL#$Qt!jp!duea#cLuAr}Qz9(+tQYE{xkfU4&%>H39 zLPyS3uPI}%`7xW4mPRC*!$goy=j1FbOlfJ2$SKH=j^Qk9 z_LTXh&PTq!?h?A|MGb zV^W5-hf)YIDhhr6@(1iCDeQ43Tf2ms`=;?cs9X9Rhwe$M_P8pnD8?3_qcV&;5bOt@0p4ZMdsWy1+Rm~jNWcQ?rfa(v1lnEjAbwK%r#{+u9tO* zBY7gY8{er^j+D(CT#@P5Ybr@^K{r(UK(xmM^D@sNqyIbE%Dx1h4tyKEqWz^?837U{ zP0N>^gX~t<=MzSuuX##ZN#GyR@y=Hb6TY3{JLN$DwGQnDiA6i^Z`&>C;g)X}^Aid` zhjd9-vP)ouMePWGrf5kx`~NN=CMq|*AMPe(7)^FA6J7XD1*K~dD5Z5pyg0RasFP`N zM6G}8vXxMMBK@C#bgVA+;E_$L9)wqRM6->I1t+4Z@*3&pyt1sJu@FWO1H4E%TJ*vB zWc0zGaup46DdJxx+QVpm@Uh-Er!jsT-`OdZIZ zOxcH5(%1KMYorEhzS%N^bT>OtMLu;i{E| z>la~IqJozFdqZqPAH61jQ{ayXF)lbg^WXoFp^*H&^eg(`p@$xL^DBm}d#n@KF$9B+ zfuyG^u>UKEvFIs{6p>dzNTRPv_bS*JxV~)4b9kEq3&p-_UC1%5~}HWJaFVhwwh z2rjd?xTtprX?o$*9m;x6z@It&*0{swD&`ul1U&sseT0+B{PmWRL;^>iDX7emuZAC5 ziu~$K z`HxT@?*`pKdqJHMO9!;7)` zN}&5N9V_HgqN&PaqLN(kfNA;z2o)aMW$D>?CFNN4u_`~oke`;Py)3>D?ZXfSQwa|5 zpwcbtOhU~Ood}3tmL5PjM$tmap*dh97%e_q95JmXK=F zK#_yS-SL&Rj|OU>Ij{?2@sbPBl{L>&tQ5Mbg{->6Ah=Sdye7%qYCG>DB@Uji{S@8n z6Ge}Mt^Y!&DeBhrRZqGt!Fu&t_(!oE9Jy%xn^8XuvaxUvLDKZt+lk?rU(&E_0USNawkgJ&e=OS@KJb*){)ZQM<=09VjQM-bjOLdzorfcqkG{h)NAtCh zD`cXUHieH{^=cO?g~m)V_Kqvwrn7=t3r73BJw`1xdtP1>tVm-Anc;)wPl>l*P#9T9 zV_>4<0im<6%eE>Qr|88 zD3?~*A@cG%k&?Chcfcz*;-#OHiYxh%_M@(4N@^A*-righ1EdI~==es)j;~MJ&?JU2 z1mNc(Boa|H8iq`9oP2qgs&ZMyk7vDhj+;M3RuaJH`rP@xJ=1#BGBR5QFk(IO0K{=o0 zy!f{$=MB`7{p9ZUgbul~oUNcwM>T>vD;Za-<#Y>z_HP8`p?9zVnWa~i;z!}~rX z`R_yk4?*DDE}F86Uh&GUSUeLb{xvQ+w38$9{ZwdIEK=TRlljB#n|cbu?%2A)4cGx# z$6WHJtB09_(=svAw3>sa3ssgI(pgy;{li6(Qeqa1o{|fk8Q}gJrehc#+aoR91#?wM zxjtk*%J{somh9T?>Ym_hMdHNjXdYToNjjVque&|}nA%jn0~-C!6qMwW{bA_puwRa& z|E_GM>_~g$rDb5-4MD+7EhX-mt)1bIZE1?HOO*}eWrk#^R~~i>8S@XV;fc0+I22nU z2aFsM)m2&6{!P1fK7|nzjnd{E1mXDkrmFEr5K`^$yqhuc16|eoxqoG zAbhfYKw#4S+pV=9_jJH^lmoc*FZM1`NZ$5(%*u8O887fgnDZl}OSHh4Pc}KSxo=N@ zf^29MoT2s%8n3727H4_&L($#!sU0{ysP_vI-ebbwAqU`FFTNMouYa2%{Q2!Hp_X~msG5(aOOX1D(hgSx z$RpNbN$n|v6iTfxW;PEXh<8`0XmO}k%-FZa7hO#~CwlSN+2rhS@B}?j}87!?}HjPSqeDCg1CPGq8DMb)PEESY39V#W> z`sJa>I8iW0(vjg|R=2U^;K#q&e=VEFdu3PaI6AaB!P8resxhS1hvFHHOx)M#fYdgp z>*%%+Wc0wNIH-1Nd&$pJ^pCRF>WBh(l*BJix*KxwWh#%2J*oBan>}I?r@U$i zI4Xlpyq5Y~zD&}qj$^@RaEwrNcSuBGzO!b^g!{v3)W;4h%cFVK4smTK)MM*FNDRJ1 zc|Ci%!tz3UaRPTE+D_{zy?b-Q`d}V4IA+wh`k-84!}?U)*=4ke_x5DwO?lhrCohn6 z>Cr*G*xZ1nuBNp{EtY0sWI#)qh&2KE+q9a6kdbXpm^;)&%sayq;-vbtSH8UU$QJ$& z+@9Xl#Y-77jaMN5+C2o!>dwl)<}GrnuXF;gL>n_5DeK3f>`3%DDwTQzd)6DeKLZb> z`yD^}RGaH9d;*duDE6-!N^eVI#<*l9jz$`rz#JF)110i=Lm2uj-qAsNM>Y>KfxGoPLk#m*$BiWX0k@R1Hat!vJgM_AJN*b97E3-2H;$a!tk+gcll}-!wA!Q_KxxC3JxCHD z{PcgZL0wAdwG(ge*Xp1kD~E}0w1x0>)L@z7A7kS4+5t-T8_7v_`vn`Yb~gPddsYAwtB^l3D&Ulb@#BcZEDOKV8&K~>R5&sm z4Gb|3YD}17z)z5oPAN?51$>bsqF|R0&&Dc{StYOWYIP6!TpNv1=x##kA^nwykLwv( zX^Vi{BtmwTtbHDRsi&!?60*Io^MDK6<~?hDhrQS$${y_aW`DkF%aP^C+Dn$`rCNR- zbQlteyIatF9>GCB_7+2^{KX$L{#^iMCyR=fL$f+DgBX`dTFBmEE8s*GT=_9qIG=){ ziT3brHY$EwIAcM|?)4yRNb(Lm+h%A1`n6@#fQFvMVblA@p7@B3{QEb%O`(@uO|?Wo zOUYFgO``FclxhB$xhbTDWyZ^%y`xVeg#Xm~hVpp{>tr61Mof74aY zHO#2}6bW7ejgqPez-Fi%o^C}Gi|<)8f1z6L zh?CQ3V^zb3_pI!#$wvjg{K{N^`&n?`Z(}~!(3l56-qEGsIn*jtN1Vwwq;EHVW_yjR zE8V_;sB*xK3!Kr{9!=GzveeWi#WTw9o5mZMf5EpH@#Muuf=?o|`n`jsi*J6O1fEL>x#3=SveoKO9yPa_bsmVWI}7ymuhc9E6l?yD zqN|Y&Puj|taqprzb(fCurnL{74!wR^%hF=WfwwHn-am7S5VMu;;1+@I(O{Q6rO z-(8*QAU_%R1%}t$Of(Upcadxzt%`WS)I4SW8kJ+vuCS2rymycoJ*Uz)yMkN1B@MbQWCDF za;iM3*L0V3z)9;Ps_7gDI66m1e5ja*oz}FwLMCIm69&nM-+V%Cf&6*@Yn|0)$i_Ix3GXUvZF{8YSMliT13b|DCx|-%x3prN;}rYUgd{^JjSID7{Qslr8`$G&+pgQDu|2V!G@jVD-Pq>DXc}`G+qRR& zjcwbuoqoB$KJOoxnPcy3_Fm`G$pNFTvCZe?Wi>WfvjEiv3SF&4l-^yniuf*~3rZi>q5oLi`-omJMpGSiPqzv(EP*KOq3tZuMdM z90tSOx`bwwPMn&kZ5C)^y*^^7PuM_)1c9H zDR)t(NY=_ym?;Q_3z9EnZ6X1jaa%RX?nI_4YMGae9Gi*(no4j)1=pCQHI$K3?;iUc% z34xcPf`NVr0Iw!NhOAW8yjJ&QXU{DPD%-iHwg|=^AY!j%z`mOaRBKrgx4%d}k@QM8nLC5=7!qL}Wk=+t1&D8!W z#}b1)paN>4nOS`U-P(@Cfw|kx)U~v+{OFCbQYxZ&KNj89z}4VN{De=?Cn>4l1l}xo z*20N(m2*C2o+q*^by~KI)Lfcc``S9;Q+u3cK)?w!CU~YK*s!d!+*6h6Dl8iD3k`@` zHQhoVSy6|^MRo+Mn&B0QIw=kK^{CGfPoP!PkAj=sAO(b5aj%aDaZ#8r!lhS{FpS&w z*B)a~jQLpEz`K9j;x*povaD__Gy+hL#pOlN4^M5M1QC~6cER5^%Pjxq3X}LHb`jZ? zLPb!kBf7f2tckieT9$dv33?mLr8vdR(4u(zMQ@}&Q=ApQn^&j#CXJfL304yPD9#vf zb4>r=*j6h!_tS#X)%%V&PKyzw&h=^?I>?;u(WGf2&AG-S0f=Xo>^E5YV&H=li;e(b z+HK$^5$lWjB!-^G{DWC>d$Ti%86lNvals)^?aT6=@-X4&{JuFw1GM15sGAOHlK&DM z?Bv1(p^7$-4{UUjG(e;dBB5?LLv^_@0|~Ta9H+ogoAx{|^`0Fmsd4woO9yeyTnf$7 z%$6RssPZLiU8=|Nc_?}ni+Xd7gy{nse zP=Rx1k*iM$CWRGWV1=9<-|6yJy8Um+c=dXA96y^ExgzfQA%II`<1Egpnv1Xe$ziou z1uj48?5UiOtvB}0SG-O(Jh~?EwG{H~H{64@tCpGwCSIF`9)t;0v20iM1G6vmPzc*& z)?#%7ml!t_wbB63TX}*ywPcC0Uar%Id-vXch0l{)|J+goWsjnhjFN3SS#x=Z*g8}B z4SCE5C4l3*WPH@%{}OwtZsi5ApZlkodeZ}$iytKY5ae7Dob`1OZlfH>fG*u7Q&%mE z$4t_NV|4kDBD>RWM#k3>b}{8Rn{XkKN^gz&O z7|X<*YUIgTZ`lNKhoAy8YP9g5Y$D9v!~|r4$M5Og#|dMb9_<4f+o&x>Su@KB*2G`x zeif#(86&NQtzg&nW*hP)MCV{s*p;)MILyU^;s=XF#JKv;9G6g^Q&D2i#;-rhBw*Ge zrIlzAidNuzT>ntX$Pg5>S~3}fqT0P%kGM-q_-eaNW`$Y*PJ_65AZnR&BWxnM7mGDV zI}vCTe{e!aO`B%C#3y8F!ZRnZEM?Bqa8j1(GOWA%ZPrH2Y8U||)#Ics14bhwuB4Q7 zb3@nVPWRaPlf;OTi%&Gkpuw)$S4or;gjszvC^rYes6 zloJnHscv<~KcqyWs%P`JL~hRflBI>b>`~BVd?oJtF1z0c5NEwfE{~8TxDdY?bQO|L zGkI}w8_O1NT|MrS{h97e#z1p_^I%nsWO9jGsV_$G*7ejyjHGPzM7}Cd&0`%0b z)0==I?gI=lg58wJ&DaNdn_9$wuidG!;Z>L@&D|!x7~8TiD?F1Vt8ImndfG&qdzBEF zv6Iq9!RWx7dqIz4QC*#j6ZEnD{2%7iIV~{Ts7**B;_BA}JE8h3yq%=n^KZF_^{4Wf zI{rC&=X0o(JR>eDmhgF`<1(xUt>4jG*edOOeu>ADJAEv~s6c~pgbYoXyerU=(?&{M z)Z}8Dyi=ZbDE)Q-%WFQK-;!;eaE`i=8m_MO`m^aFA}yK#%{|Z}93`B4L{*_3J*j~y zK*db>E^K#%o`RPR?vO?ue)g}&uY%S^#e42=4=DD_?jxv>F7>E2*^zxl6EV=f@YW=B zK?A=P`P0i!Bz~K5W{zxJp9zFYgp0!wq~vB5g&S`kN z7BpD2NFzK&<@KD`u+pP?9ZGl={D^!0Rv9oCMQ=QGpGBT%5DL6IaIXg}JzLqLH5I*c zUrh~iZ6J0k-t^t)VrD%X;c$3ync;G|6B%gAAQ$KD7$SVv=KzFnMEgf8kCPo3DwMP% z94)ba5~sqhc&v(j<2zn#VdjGtZBo-B&<>zrp02$N-N2ZMZTmzoh)g{szUD7ElbsAk zA#A|8+kZ_M^E@yvSH3(=^uxw;)=yo{Jx5mEH|K-5&vH^3`W7t)F=JBRK`=F!2BC16 z4-HjI7muH{1fRSU6nIq)EZ)Zq%tfn$-|oGB3_{;eEbciTzOH8_lOlq+Te<6D|L(d> zT+Ub(;Dwu7<5;N{yc}={KVnU{Tc)Btyg} z0j~J{GGq(xLh$Mx1Ju^adEy$v@I|Q~4Ia0~1Uy#amGLM%xh*g+@_aL9ilAnJ6^SZl za|*HOiktc$8hnYpA1C?f7chh|g*fTifz3AO$=*N#@*U4loK59R5UgD=eL{qo0h)9*b;uZ1Y3xucEj zQRV`6-v*}Wtrqr;c2e|A_w4MuDvt|?V^plXl;PRxge6oZZ$4Y)G*~`aKT|!VW<{lD zG^t8}jQbqTJeYvRze*GLS5$y#X1x0)VYYU4Y&A78-;Sc^s^xKG$GLLoZOs}#-)1X4 z)5^MbJ(08mTS>zZQ`)MH7wf$+?x9-Q^m+DNaTCB|@<=|X#*}H5$SbX8K71?_S_I6e z1K0mXa$Xr2EJwpJ*b6J8o|1C*22H3@A4^Nl^hZ-Ca*`$P-Blh<)|!y^9Rh)mDAI&;X6_Cb zEjS(B#;gA}zG;fl3+W>n}4#2;+ z<9m`2xR&GCE^F~B#N6mz?XIf&@wwHUMkeedr|p%+ycjua3`6<$e_Q}-*3L@I{H@%A z5rT}2lE#5|yG|_9j4O_$H~33{rJORRut@AI)x_7$78Eo*;$*@3JvRL9Fd3!ve9|yi zgJ?(c&HVltL4|v^T77DuQ6KO`IPp#WZQg)pybS_@2e!;juRoFwpV0q-H|UsVA}G3? zEN6R=WSbR8gxWQi$()nUds2qWS;oQa#3}YtENO2W=AO+(ViZUyIMnYNUEQAUr8!jf zmiG7Ck5h*)NkO}JoD0`qjnBo79%{=I=aEvMs4M6Y3%z^(PU4tzMLDjtG`eCuGzdAt z2~0A5MSbDMG!Iy)QA6TzJ>pxD@QN_zwusiKXdSVs&RQ-m9zC~}_1SYTCM#lF!pnW8 zz|{$o%a9M|pKxfP=O`UJ?!M%ozJ&ycH-Qi!ZkDQkkKkn-afX)_vDAOAn_l{NwprjR z913Jd<3HbFa#mr03eunJ(v_oq*bz?NteS1QE?FvSjT9$}#NhTNWpAP+BNyuC$MXPe z`*;v)2kGP%t{&4}!$fv#yVzC2jcmX#J(H74Yqt5WP&d`4lns=p1QJ0>%y|=@;W}`M z#o;w`BKE;>-{3h4PM;Kxb@*b&crA6-`^-2^xZ@4-pAz9CO>; zuXgpy(XPp6Ew5fnk8(`1*s%dx4ro?0YnsTCbfhCD`sl~46`OSjE6j5T8ItPgm71i} zYkdK%t)5!!wz(wnL?NAstmLxS8z^KnV!<;cjHbc+S7gAldRcN^)t*YL))UYcBh9@u z?nv2qF3D>jZYud3t@~k1`mdCZtHa_t7l%Hc78fo>9bzCFUKwY# z-VX^^F|1ZW?%i^rdGHj@_~mnNkHuSPg=g@w-&mV^KguI z)7{*f;|;3sbzT3N3$l{YQUR9Onp`z|(E~|S`51ifHONx@n11t}U*4sJrZiPqgF&qh zX`ex-x9uzYP=MDUA3SZQsgVQcr{)RH>kHA^>>Ixq4!a&iH%sj%Tmyk@=xfckT zK;ND-9aWSV6-2Q+xRoCGTlt>AkjHS;nU+WkvnWKvUBx+@%gi=&u6Uh{D6KtcEY}KK z%xn}2;`YrsixD4=gy-J&rZfTm`L$P2*z4vd%6pChKZmA2ILG)#YHxAYoTaD*!`$j7 zE4Y&%j~#xwWIVe}vX)KcmOB8{yCTkB>rsxjQV~u0j+faDWRbBsBG5nl$$L|ktXli} z%5_k|-|mM#4oW(BElE1L26jcWqX-ZfZ z5hcV7D)G=A%O2^AGpAD%Y|*&cUgpPR!HtPTphm2TY&(WD9&5_8*X4cxF!OpVihO9X;5QGeGoPo* zB30)*kf!K!{tk3FFjNUIpF5O$*y|uPYcA*S_G+HV9F996p006iK@}lEa%`DI`{}~- z^oqZsnc@l3zo?k+6h1mjs!#hh?%i^fh@d(gG~Dc9qvDO#*d^)x7_Gge%s-}jVR`|1 zX&oSe7+g$;0PWRVT~>uECU-My1nNTQ9hY?+ea}Y;Hi=0WWueQ(`_HvG;j)0%zK+dl z_fH-$);}%7y=a%*75-bp*nI^TNuYI~z#B_BBd8c3KJ(^<3Gp|Y-r5Kg;up(u;O9Si zFAoS4H!lw;fO4-#7lW&2GwjLyU?JC+hw`w>k+av_0DYz>$b8DNbjiK1LFj7^xhZkw znk@@xtY}v~qk%t5*|m$Mu6R2=q_u)ZGPU1J=}9z&O~cIK1eX;C^>#+HnX#hpJm5;F zWp?DL(kqoClWC@HR1>-6do5%q7ZZ6>w?4*j(j`2#K$ncgh`|GngSX|*C%;JO@M(lV zbNY9^&8>?;gw!J6&?~KFg*h7DhNip~^FUiRvY1-f6I&1fp>bMKD?HKFmrr`p`!DcX0P~4F4&IISC#gcP+I2=q}pZ z&)NwL^Tm_D-m7<3pu03rrcvvDBEW9ItueOjR{!aOJ(N%r1>LjGH$J>Y zSeNO^<*Z|UYr#9;HFaQgQQpR#<%6}xm=!SrMe%*}<(%Fa!diNS5D+m{NU#MLT$7>} z1GpJJAuZuIuo_J*DSRMafy@$lDTRoogdObF@=c8DFIv0~)b7;Py;|sGMj;zEe?&FkwN6%;;nBFWp-Nszc}24VZ;{|ZDC~6+ z(`Ws>)lqJ$-dTMUt`kzPp^fX~HeZ2QmD{G4<9(5YB{xSHxj~o!ND6$V8x^)ksi{$9 zQ}BwT9o5$)3(ZZ<9of(wb~W6_>aFn8qrZOBk;kPpL-xbeClaBXU<24T| z5zLfprgX(WL#J?r)417OLVaD+!G!%$tEb`%fS^<2WTDXSbw&_035X^029-wS2=nZA~%@ z(?{ay5k&@E^#9Z3W$vV@G={5HrrG>5hq6##0T;5TYlZsQ+J_2O2bw(ei1_m znW{)4+`>aJafv=IA~P3~!je*9R}y#WIweded;P~neGZzpdNS5o@OW~4648#U5l^v4 zN}>%ec@8vr6@d$GA)@~!5ZSw^DXC~*F94-NFOg;Mio%N4`D!G;=t}h?vO2KA)e=K? zAuA$|fE959)t@yJdNTICk-}_3*$RfN(HX&D##~^ZN!CK*S~`ykTO4K3ED|e&K!MVJ zB3|PKC;PfN?>h~^ePeu@V%}r=lbj#V`BNL#WG=L{Nqrgnyoo5MZS)gI2~jaz7#-dv z`=@S$C1(rD7!@pA#Z5Zs4p|bzv)VnN6LA~Rp;9HLJ(t_cNL;p@LUMPqYogTnt;G{U zy#UR=843C{|9ge20j;$=Q@1Oa>g?{=7xiK16y91WG&;p^hnATrU4j_*z>t8MH~{oR z;y2drd)i(82p2@$b&2FuAK3`A=GWNR;NEK9KBnR-l4++vMrGPyv>Nsn6KpPvn1J4j z3NJOglhEkFCarp(0#faN6bQPCEILmue6N>ssjI&t!=?wXK?+`U9=>hMJV`dP@#$Nb z><}}4)z000<4Fq}b4I=Ni!tb8hbB1O8=xI z*Hj=en~0IP)?+U?Ca9yMIzet)u9hl{GCOd1r)ZVF;!#lttBohrVI7@`mG! zh{70=7s5O|gbpB9tZBM1eAqhSnh16A>|&S(-w2BSd6*PTnBNB0o9>~21(00uE$v7m zS3e$$2;x09Hp==fd43$+Uv#muW%jrOgKE(u7tC=Wh_KOKW=%5`sTBY&&4Nyw`T%aK zQ2MDDK`MDB$5;%eAGKOn-hWuXK`3!*Ej?YeBgyx#IV#y@?Jh|KhhVDWxKt1_MAPO% zYN@SX)bEOt9NA}Xe|#LT6D=^^xTkG_S*&3_jJkw?Cq$_)k3yB_8FTKBd1OSOK!A)y zS~JCXoo+ysN>4|>(!|Va@5J21NA~Y8SzB>2PeycvoaL~11zTf%6-y)3_~Qd0jC_KO zIVZ!%n$!35_+6*4A`xxG7d$ zey5!dTkLDvVvV`wCGp+-o71IeJTlmHp~737T4Suvs>&|Ny{iWXuU8;-n{Aq>K6q`| zu#-T?nIdVG7z=8Oq8!JuR*u1^g^&$6IF~*3*LxXG8 zb2Iw5tLPM$Zie*ZRymGYv+XFJ9w|#y{xybV_BYSES$rZwiSW#of;Y~Skk(}|fvxA= z-T!d``ZN>Jn*nxY|vPK#HA2PV@Hx~AF^DhN(Ibx2SHG*XPp`eLj= zZ2uDe6D1j;zZWKGUECp2eXeY+n!s4S3LGF#lzQF}fCPAK8I#fqJOv{OWsw|IbJ z^H3gVy$j^PV;o7m?|g-KP&c~T%i7M>JG#In8Q;$XP)}c$urKc>Wqo)NZ0R zGx*RdTJ^}jn1+6QN!f^20lv6U`4h?UWEmOvCMwBNW$$Hxt0RV5>!a7?nYNo{A2Vsl z?fM8Z?=q}6fs!PJn!@nXx@A8QDjx)rk!rL{uAMH(Ku;Eo_&z^)6p1`5h#k27< zk}$?2PlG*ycRm(``wVt+O&o%%=Vr?NrP-K4nDFOaBDE2=Umz}#fLcEV5k&YPrrER= zL`0zaL!y#s+PFA1lWY5-OiEm?n!5b=tD95!MT;UPGu|{O@=QCEASOCpScUKNpCbSxD3pHuW=!(`b5@PSbz#&2720hc$0i%ZJBM4g#?oVqt>DdUqpv z?^yLvo-4|^0#4IwUgBpBkze{8hu6Tf8WFm6!19Ev{m@6{QnoBGW>iEJc2o=9P2x-Mbg3rTsoQnr>;?ejH!LyL}FXMenr%)5AlC7J0SceDLC06^uc~^GoD#hakLn%c1Gnkd%*V)S-nqv zgvQy7d)M6%2w4)SoZS)oVI)S(OLt67x@sN&-+`*&0;?NcAG-7WJin`}nJB2_M0q7m z$VM%FNSYVwZR39#SZ-w`lHVnyik6@r^7$Uq1BDE9cjc#TQIALj^+Ksl71B$2W6V9D z<3YwPqy|5s7za+09S>$_Yw7cK9l7zu$)nJh)lW6GA>7nD%tHE(jlnE!b165L#p%%N zPRRS#JRu#0@Pd1un!P8Q-hdXKARBN5P2t$c>mMoBnYtc`{gDhp&L)F^*$cZY?RS|s z_5Aw>q#~n6d3eEyWE_w4?>f#ENj4_^T0E4Lc#U^Wz!?sPChnzs?Ss#I$B^!~G`38S z3V{hguwUco4CL56;`5e{c1WbRH36jD0E)puGy0NPJ4(0Z*dAdI8I<*AS8+#A1@ztG z$UmxYS~`E??q_9N^<0tmUi=E@3MP;&ELgeLOw#4}6@SPxoC+!M5|!N7U;CHMVO;ts z2ay<>yLY1UWuza%Sf>oHxcTza{sNJR*gCe2l3a!gf3TbEGe^hk!F8d zt-C6~Oj9tOjZOT5u)9On^#WW)D#ODfoU=M!S?)ZE3p@YZp3(YqO9Bt}sOiJxR6OjF zd95V;rr0!baKc$DtDH_8|9PVn3zV!5X^}x@qcP2jO<1#v!74w60gSG&3TOn|HQ0iX zc>5>LvI=tlaO#&=az`{t;jyJluJ-FpYs|u|Tt|FGF4KpNSEpJ+YUIP1QVyvXLb)k^ zu2>_wlck4c8sDq_*3iUUn87-U41N8=X{7m3za zg(B|Fw13irIL{ND1vQ7h_ExLhG4%+FK28~z_ZR4Y7?=}P?1Gq7^zpU+y%=E`@Z@Cc zpiDPRA73`iFk;sDYUmJd-#ZgN{LNZs#h)%VoE?A3Z*9bD)-+)5VxMlzAW}W^QgLpH zn#*%`n##u>L&8v1=ODp?_B|J%z)YDc8NaT|shxP2RG1VfRH=(+@2Jyj$jM4~8%#lq zdM?5){cK*p_(qNd=f`NrLp8ybd~u~=6Myj6i`>6)Qyo2}d=&PYx3c^NecMl@?99%D zNI96hc0Z4y+_>R*0}ih;BE$BQ?e$*JY8H2tDXvRhDk34mJcXs7SYeG!puEO1V?&#Du4)+r|A`-SdsQr{r1J+z#% z$q_`@Msjr4(m4nK+W{5d^475LQCcZ)xxzbuI}yAkYek1SI!il$^#8OuWz%l1Gaa2# zwO4pBjm;3ef!$QS5IjOZjg*$MGU!J?xuyza<1%r#etj+GdG9!w5Oz(!SE{eBP2iDY zXG$>+u+j;`2R=Qo~Eg5r+Vi(3apHN6v4a~B)apd zG``vWcP<;4V8}>xV-6sqcdO-ZIv7XvV!vT$&6Ed-^-IF#q&0%2Y0QzG;_vK&lC zA3vsmOsuty9@x~Pa)e%|YE);$l&`s)j9&0#0aIj-nb#)ypUmGikg6=BgIm3jB3Q2% zQ=&6@JJezP=&rQEgqK|No-`df-i{mf86Aqq`FWW}-x0*40!2Caj-Y<#Ub8;D{{mXv zMAcixTJ6ub@B7q;FPk*YuD6Aymh5R$T@I+we0AkFMRr|JjyuliQWo=ow_)Jh;Nx^J z9gsEGOKZ&(Q^r}WUfZdNBqPX+aUTZ+*Eo#V)w+hbS!r}9FoJAxq#6H`wEPbe=%i9& zS(chMxy@#}>Ke^0u3SBbvj#D-$Lsu3?|dT(@NnnR{ig4lV3}=5o{QUT)>-VnI{TU5 zb>ZS{b!7CA)!jAIss8MX*Rib2U~`byj7OYw5_@v!XBA9w(D z7a@gwyR(&GnS?R#ojT9t&VPox><>M3U-_%NqFF4d`Aca|*0w_|Q!d2|=mC zrhrnQ#e1!Jg`>7wNJXo*F} zHcE0-yDx;uOW4&3jhl&lkO3#wOgwMH$w_y6GV6{kghIkEaN~=GN`wT&bTxonI(MkM zKG)_4NGen@rHAn|;U@SRCvhc)+n-(Rcy0d~WGFOFDF7bJS9TiXEOWHa?|hot#~0qM zp7wtUeOfhq{sP=8V&}L%y^d7nDd|J%Z4mtF*k3$$0=RJby+lY3ONvk-_(=VDB!r~G zO}}h{^8cEGZb%;B8vfW18QaKHX;~C0Q3odM4iFk4cm7iX_K=87jtWcOQjsmF3*el87jEFRQU)qmQIC`nM68~ z@MBkS=)j*lLuWZ~Fut2Kbp+wyy6kV^2Hfx^Jx~5F{QkNNA^Fv2_jkS{F~&&g#Btw$Tu_X(0+F1O=xVU{{!pvKnxJUktx;jl zIqd+!Pu2CG^)5*~r@?;22<*1gQkfa~XzSN*Hw$+Bt9Mjps0rd~qHaM49R8Qxw)@!B z^w{M7M|=Q*VL4~z4eat}pYY&B6Y^Dd_P1(q_&Gd= zC%<%h@PKXykU?$OPSnK$``nRhP==&cK!Vhl>egzpvDuYy zun}hX8;nJjjh`_Oq_+v?o@J!e4|uLXP^c#kU+vFgcC+KT=$;QM8(1MLUt8m1oO-of@6`HT+y^I^KV0M$p87tgYk zyyWGoyu6P3t@;vZ`fYT*_ zFx*N1HCFI__!*#vnKU7i#!%saJYCtD^T&rtUja(%L- zENs~SqgU2Er7-VBuCd@xwNFJhnsn!zvCST_xt_<-eAQPjz1P8WfXD0qH&gzkZLcs* zSkpGWZI!ICF(qc?NAHPy8kG&a>%3TGlpA`Wb7oJzuBaBJl2=Y^fbVZ`eV({Trcvt( z=>H3Q`naZfy<=Vo|HlQ~hgPZfBUVcK4Ng*<1q~EQ^N=^tLAvWc^2eIM4QKZML;=$o zzz?yeTNw5qaD`IHohwoCu3zaq4>Hc~2c2%`UFF63L12oL&FXw}5YNV|jFy31nOxEY z!t6{1DVnE4WPW~Jq%h+zQetXiW#{VqTC$W`VpdW%YT?2UGy$Qo3;AEtN z;4Y?rl;H$8x$)h-DOazcPxP{(4Iv%HS>4K-euf{ao_SNB?6--f-=xW->& zzOnl@er+5jgg?P8DyMxXB>O7D#TA{O$z!(SW{&v6{p-h#jSiJXYx8VCF9x2EBwl2O z?(yQMovf2;{nL!t1})9b&?cyX#nU_+M#}&|eAzb7O~+jWeE}w!r`GjxJW9!^RkWtq z6+IdRT?@*5$>;n<^y@(u&fIU}TD6r&6HG)g*EV@%meuuELG{9B?Z2=iMPBsA5z@kC z2=%=fz49Fc^P<1t@!(JX@0hEVE{kyasC)gI&*~+>g=1 zYVs>if9w(3$yzqDG)N3^CZI^?)^~p%%GV_l`x@& zH<3jzAIlsR#4l#z9)E1FqxwuiZnPaon6Z+A(YON@b-5))P$u!_^+?q~z7+$fk8bP8 z{ev@i2Sa4LZC2{co^zC;zw-nCCSfI0HL7SBXM8dLSQz7pF`+9HhuuFo7BDNU`sbsEI7?yfOVxFQOt4BtC9*KiaC z=^Q!pzRk@vM-{SQ(~z8tW;o(}-0e=D?ov&Jr zgwp%{Cu{c*cx5l zN8y)|o%`tDr}nU1A=WKEBtO4OT_qwS>7fm#Mj?pthxQU2fW7;)!E_YU*t4od;4*Fi z;69Jq#gU+FS_E0;?K6~P&cw9WgI|J?k9gC~8f2)%yxgZEfdz6#R$NCc8+A3kV#lz?k14IS8m z=A4rwzjVVzYX3~atYT9`*zhE)QgzSYVr*GfH#1po1jg$7&#&t>3~wnqOC|fKZ*<(km7vog-z2p9w!Si}dP}@KObc(w{Q7f% zc{3&v^OZ1dgTD%0JdM=CJ=1ufKhyjPHWP0jJ6pMbAC>*VH`;bW^ZYcQH#|-~h3bc? zcRqJoG`5%a)x>~=O$wr7t&+m03^ox10-v|`1BihH{q~<#(VskhEB97GOajkst7U>| zP>0&XU43LP5HW1^l{6Le-lp(U`d=!}CD|D3rMtA3rkU4Y6XJ2Y$;@A7sQvDIjUCAh zMW}%TQ=xeET`PyBARC}Ea{w2{3P&;~?eN`-T_wb%Jf7@()LlY%Ku_Rwu0$iBS!wd| z<1_Trh|7LEcwU2in|22lOzcHYf2Q{*1v~OD+EBlmF=2{_5EBY$8_|%M)M&;Y(`go# zZB{9TjG+cmpDuSwXv&nVduTZClLtmJ$XT?Y*lW2G+Arr{G&SqcslyMMbFH&UG{gn& zMb9BKI6;oD)6d@Lj_J_pgbe3c&ikdYW%a5;bn^(u(!ogb3)o^_t(-vK_pOP_7HnFq zH>g$2cV~BL^VG#9;9vSI6VWMnj-%-D{v)4VEE8cQuealFSgcsf{w()oq-}l`#+c9&u(Hm?^e~adz;3sMe|` zknLN(tgN=2qBvEekdhw8S(|rfI`NrUzAH=S71)Kg0}f|tAKg7ysvEuTC-zp!7&_t3 zjTCSBbmW_n7vD0^N(Becv=U+ynHxowWrbd?na!^g2pG$2rbP5~)WMz1mbE;@n?|H9 z`vCC>hV~-9e(){m1{q<4#DJ$-rri(C>*Prw(i^1VO*h%d^!(J*Fmb*7$lwauF9R#+D ztJk`4rjTr9$CINbV$`nUt-*iQXPmv{kgi~os^I~rq$j0O+ed|@0pAYB$rZuNx9evf zsXBd6ctO9`$;=0O!t-A!NFf!>ZJ-0BQyCj#apj4F)qk{SCa%;FvTP&zj(|BD=ZY-u z*>i2*Xq839+tF8i6jI0J6n00JWf$u1o6;3uxXh$85F4k%8-s~N)WQ}#fpr;V zhMUdWpS>39TW9ylfQ{S%QC&~jIYC-)?fT2)l+gbLuk%K1vtk}??gJ0*u{yBN)++zU z!+gu3>J5@)JmOaF^XAjg?hK8K=N3aJ_4*H_mT}BJJxZ`c`ioNW)+B2GDvy2%V%K>` zxsrWl;|&5f;PkB=2XZUbitM>jp~+wzW#&8gb7H{>b6pi)JYiSPJtaDH&#OE{J`x^+K;WeWID^A8v!v@}KSDi!U(Yg|! zhI{ZwT{Y4>-#7Ot(aaS(3ulCyEgQawtpURzlAI-jWyA(0$ORbb zAfjM>R;QA1#YR5EOUbpJ$om+sm`#&;s1RL4JD2`o)7Gt!{x(v!vOeU}PW%Ln8EZE7))WS6YH-ue)o}s9r49pxOrnbNilfzD6X@S<~~B{IJL~l zIcttGS9SJHJ28la2NE2w078JkAvdkdv{G58;#*Lzk!9)6+|E6a-l-cGDJAiTs>6i! zBF8N(CI-+7sVQ2#=%xGd^&xqeD@Y>4VYXsXg$T{*=SG0cB%8>XwkQ5tr3pa`h(>#G z{kOJRz_4XpRH{pK?*!R_+3tz+Q>FbIk5Yu)rP+t=Ei zTj|v0sS34M{%|B4*Bq)l^h@(&A_5zm*^mcByR3xe*H9rknxA21{S%fM2+lnsccA~Q z2J#tUehh2QJiVHhBg>Sj=UUp&xR$gA^=C^W6lRCkk(KCB+G)t5F?Fhc3UJ+W%lNr( zyp39)r5D4_{$czA-BcvABr+90bvNnbaC6Z_bT6c+aB=}b?C2CggUYcpWr939p-fm_ z2EDPI6-u9)NY6i7vXPxfoBFL71n?#AA-Nl-8Z3{XvA6KKz5ShgQ`M87tT6f zd$01k_1r{7VM5x^Y;t7_h?9g|fDy|en%h4GWLgxdK?kn2gfLkOj2-H+c#k`7J%`eR zj`beIbNc?2qq4=JdRclhc4SKpD5+wJKhhYqRZ9}Ii}aPqej_4ap;p55rOn#fx3+N$ z6e5bB^IHcnpVnWh`^de^@tdw-%V0qmf^M)q;FO@_uu>a@>K=&IN|5jsYJYl0)|`QU z(L=_nAJMt4E->qrSygDg!Q&xHnF(H7K&}ibQB{tht`Ik(o^aZ%J*Sq|UJvE1EVHe^ zhhS)|xuOJPDE;#=l*J1#M^iSK_=KIGZt$$%IKrtwwQ!(%Gw5|K#wa*6IPb z^5hHnY#xHiKtsyw${kMM;tX&TV%bYmtXQtUrl}k4#EMH6>W=GXOn;0K0@TGP;2{)}%j%}_- z7#CMFIRwRIg-;$p7|w_O5_}RILZ}aUcDHbJQo!Rq=C!hC@tkiUti6rK#sKiLiyqj?17e;d=ZG4%SlJ7)s(8e&D*v`iEQH!H|w_UC@Jrb`oHI3ez_e! zc>5H5qhqu(E*5u=EgeC*7Kwqz;Pu7uV<`<60gnFku;7i?JOuczVlbg%Z1E+q97CtF z{8mSY98b=ltF8Owt8_+%#9F^;lH3A|@8d->G^AMxDau4Jb_h;d)yW@?Q_k>k{a)x+ z4vf~mZpP&L+8m@MokyYVK<5X?4Ps$6hylR?*GCTL22J5cT}s=_awJ{xkCn$~rsVX# zNR3BHt2TW$mK8hE19l<#VvG_tQPZsZF)7&Dk;Kyi#)9+3b(AV5nYB^fjqFU~8rlq` znLVzkQuh5c|FcPI(3no{1;06QI-$t~A~XM)337rP`6=9Ur6xR5h0;9WY2X8l{T7lj zESiER*xF1j)643$%e1A$$;#Ll5ICUtd4<4nM(_6=Gnzoi4R00QJNIkoV8`l4Oa>fk z3`jT<4)fQX?(ls8?y7ktyU8GquxcO^V@MUmS*op(DTY^uBEvP$zA!L(j+69bcZGh$ zg95ukfU(@^X)0TfjeSJ=ho}HgwTB;77BI2K^^vi%fAdZISpTDtDWQEfP@I3YK2=x# zjU(Ib9-0(QoYmwmjX1uu(3R5X=u~S$WnsfPK{P;NXzZj&>ge0nd@2u2h>rv2Yn_c^8yz~QA;TmbnVWEj&#}bhS)ckp_S+@9^#m^8JUbLVqmZvC zdY^v1%do~66QjfF_h|F?zOXX9mFtje4!@F>@Oh%d^AykhTAB{f&d_E~BM_RWi2C7j1om-9uNYJ>T<$t=_Ar8@(s;T#8P&=Z+7sxp99a z7EpQrj$g{`x|>4E$i*|7mX7AQYw?>CNKy7gKy=FcKw{R0*{O9S(7;Pgs*{)EGs2{T zXH{$E5aOnOCT{CNd%=uf#g{@;tc-s^ONuu3syh~H8Vzuv)cgPGfGY)$WI==F(m~bO zW4)h-`}HywPAFdYMqh&tH_83GnO%Ige+-!pf z34ZM{u5pnLtH6}}E^Ej4A6peU8!53vlHV7c@H({9jrO)=>x=5L`U!untPJpz{B)|N zFD_FaK7}mO)+t={Z_Q?+wz2A|E@LyN)Wy$41df&jTc0)pW`hTRjlRV$r9QGv$N^+t zXlX(uLQo$%uN`q)WBxlkfhav}=UBkX-O{){aE}Op?BHKBP65R8qoYBna}aXc8oL2q zx5t8^=LgtU2&yT{2b`0iHWpyCE4rJu)9d(!^2rXHGm|{p&q+#}X+K42YY;nkHa6cyKo7l*RciGCUU$S;TO^qvj+*bz9sM;_98PE;0dH;Ij&B5 zvH031WQT>r$LXzUAUQBH=*7dC9gJs{y}3D~
. The app replaces that text when it starts. +// - dist/404.html: the app, for addresses that have no file (it shows its own "not found" page) +// - dist/sitemap.xml and dist/robots.txt +// The site address comes from SITE_URL, or from the CNAME file of the build. +// node scripts/prerender.mjs +import { execFileSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; + +const dist = path.resolve(process.argv[2] ?? 'dist'); +const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..'); +const base = process.env.SITE_BASE ?? '/'; +const cname = fs.existsSync(path.join(dist, 'CNAME')) ? fs.readFileSync(path.join(dist, 'CNAME'), 'utf8').trim() : ''; +const origin = (process.env.SITE_URL ?? (cname ? `https://${cname}` : '')).replace(/\/$/, ''); +if (!origin) throw new Error('Set SITE_URL (or add a CNAME file) so pages can name their canonical address.'); + +const read = (file) => JSON.parse(fs.readFileSync(path.join(dist, 'content', file), 'utf8')); +const site = read('site.json'); +const template = fs.readFileSync(path.join(dist, 'index.html'), 'utf8'); +const siteName = site.site.name; + +const escape = (text) => + String(text ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[c]); +const clip = (text, length = 158) => { + const flat = String(text ?? '').replace(/\s+/g, ' ').trim(); + return flat.length <= length ? flat : `${flat.slice(0, length - 1).replace(/\s+\S*$/, '')}…`; +}; +/** "/rhel9-sysadmin/ch02" → the public address, always with a trailing slash (the form the static host serves). */ +const address = (route) => `${origin}${base}${route.replace(/^\/|\/$/g, '')}${route === '/' ? '' : '/'}`.replace(/([^:])\/\/+/g, '$1/'); + +// ---------- Page trees to HTML ---------- + +const TEXT_TAGS = new Set(['p', 'h2', 'h3', 'h4', 'ul', 'ol', 'li', 'strong', 'em', 'code', 'blockquote', 'table', 'thead', 'tbody', 'tr', 'th', 'td', 'br', 'hr', 'del', 'kbd']); + +/** Content links: "#/ch02/x" is a page of the same program, "#heading" a heading on this page. */ +function link(href, programId) { + if (typeof href !== 'string') return null; + if (href.startsWith('#/')) return `${base}${programId ? `${programId}/` : ''}${href.slice(2)}`.replace(/\/\/+/g, '/'); + if (href.startsWith('#') || /^https:\/\//.test(href) || href.startsWith('mailto:')) return href; + return null; +} + +function text(nodes) { + if (!Array.isArray(nodes)) return ''; + return nodes.map((n) => (n.t === 'text' ? n.v : n.c ? text(n.c) : '')).join(''); +} + +function render(nodes, ctx) { + if (!Array.isArray(nodes)) return ''; + return nodes.map((node) => renderNode(node, ctx)).join(''); +} + +function renderNode(node, ctx) { + if (!node || typeof node !== 'object') return ''; + if (node.t === 'text') return escape(node.v); + if (node.t === 'code') return `
${escape((node.lines ?? []).map((line) => line.map((token) => token.v).join('')).join('\n'))}
`; + if (node.t === 'el') { + const tag = node.tag; + if (tag === 'a') { + const href = link(node.attrs?.href, ctx.programId); + return href ? `
${render(node.c, ctx)}` : render(node.c, ctx); + } + if (tag === 'pre') return `
${escape(text(node.c))}
`; + if (!TEXT_TAGS.has(tag)) return render(node.c, ctx); + const id = /^h[2-4]$/.test(tag) && node.attrs?.id ? ` id="${escape(node.attrs.id)}"` : ''; + return tag === 'br' || tag === 'hr' ? `<${tag}>` : `<${tag}${id}>${render(node.c, ctx)}`; + } + if (node.t === 'tag') { + const a = node.attrs ?? {}; + const data = a.ref ? ctx.data?.[a.ref] : undefined; + switch (node.name) { + case 'hero': + return `

${escape(a.title)}

${render(node.c, ctx)}`; + case 'lab': + return `

${escape(a.title ?? 'Exercise')}

${ + Array.isArray(a.outcomes) && a.outcomes.length ? `
    ${a.outcomes.map((o) => `
  • ${escape(o)}
  • `).join('')}
` : '' + }${render(node.c, ctx)}
`; + case 'task': + return `

${escape(a.title)}

${render(node.c, ctx)}`; + case 'tab': + return `

${escape(a.label)}

${render(node.c, ctx)}`; + case 'callout': + return ``; + case 'quiz': { + const questions = data?.questions ?? []; + return questions.length ? `
    ${questions.map((q) => `
  • ${escape(q.q)}
  • `).join('')}
` : ''; + } + case 'flashcards': { + const cards = data?.cards ?? []; + return cards.length ? `
${cards.map((c) => `
${escape(c.front)}
${escape(c.back)}
`).join('')}
` : ''; + } + case 'diagram': + return data?.title ? `

${escape(data.title)}${data.caption ? `: ${escape(data.caption)}` : ''}

` : ''; + case 'lab-finish': + return `

Check your work with lab grade ${escape(a.exercise)}, then put the exercise away with lab finish ${escape(a.exercise)}.

`; + default: + return render(node.c, ctx); + } + } + return ''; +} + +// ---------- The HTML file of one address ---------- + +const breadcrumb = (items) => ({ + '@type': 'BreadcrumbList', + itemListElement: items.map((item, i) => ({ '@type': 'ListItem', position: i + 1, name: item.name, item: item.url })), +}); +const organization = { '@type': 'Organization', name: siteName, url: address('/') }; + +function page({ route, title, description, body, graph = [], index = true, type = 'website' }) { + const url = address(route); + const image = `${origin}${base}og-image.png`; + const json = JSON.stringify({ '@context': 'https://schema.org', '@graph': graph }).replace(/`, + index ? '' : '', + ``, + ``, + ``, + ``, + ``, + ``, + '', + '', + '', + ``, + ``, + ``, + ...(graph.length ? [``] : []), + ].join('\n '); + return template + .replace(/[^<]*<\/title>/, `<title>${escape(title)}`) + .replace(//, `\n ${head}`) + .replace(/
[\s\S]*?<\/div>\s*(?=)/, `
${body}
\n `); +} + +function write(route, html) { + const file = route === '/' ? path.join(dist, 'index.html') : path.join(dist, route.replace(/^\//, ''), 'index.html'); + fs.mkdirSync(path.dirname(file), { recursive: true }); + fs.writeFileSync(file, html); +} + +/** When a content file last changed, from Git; the build time when Git cannot tell. */ +const fallbackDate = (site.generatedAt ?? new Date().toISOString()).slice(0, 10); +function lastChanged(files) { + if (!files.length) return fallbackDate; + try { + const out = execFileSync('git', ['log', '-1', '--format=%cs', '--', ...files], { cwd: root, encoding: 'utf8' }).trim(); + return out || fallbackDate; + } catch { + return fallbackDate; + } +} +const sourceOf = (programId, key) => { + const [chapter, slug] = key.split('/'); + const dir = path.join(root, 'content/programs', programId, 'chapters'); + const chapterDir = fs.existsSync(dir) ? fs.readdirSync(dir).find((d) => d.startsWith(`${chapter}-`)) : null; + if (!chapterDir) return []; + const found = fs.readdirSync(path.join(dir, chapterDir)).filter((f) => f.endsWith(`-${slug}.md`) || f.endsWith(`-${slug}.data.yml`)); + return found.map((f) => path.join(dir, chapterDir, f)); +}; + +// ---------- Every address ---------- + +const sitemap = []; +const add = (route, lastmod, priority) => sitemap.push({ url: address(route), lastmod, priority }); +let count = 0; + +// The site home +const home = site.site.home ? read(site.site.home) : null; +const homeTitle = `${siteName} · ${site.site.tagline}`; +const programList = `

Programs

`; +write( + '/', + page({ + route: '/', + title: homeTitle, + description: clip(site.site.description), + body: `${home ? render(home.tree, { data: home.data }) : `

${escape(site.site.tagline)}

`}${programList}`, + graph: [ + { '@type': 'WebSite', name: siteName, url: address('/'), description: site.site.description, inLanguage: 'en' }, + { ...organization, sameAs: site.site.repo ? [site.site.repo] : undefined }, + ], + }), +); +add('/', lastChanged([path.join(root, 'content/site')]), '1.0'); +count++; + +for (const entry of site.programs) { + if (!entry.manifest) continue; + const manifest = read(entry.manifest); + const program = manifest.program; + const programRoute = `/${program.id}`; + const course = { + '@type': 'Course', + '@id': `${address(programRoute)}#course`, + name: program.title, + description: program.summary, + url: address(programRoute), + provider: organization, + isAccessibleForFree: true, + inLanguage: 'en', + educationalLevel: 'Beginner to intermediate', + hasCourseInstance: { '@type': 'CourseInstance', courseMode: 'online', courseWorkload: `PT${Math.max(1, Math.round(manifest.chapters.reduce((s, c) => s + c.sections.reduce((m, x) => m + (x.minutes ?? 0), 0), 0) / 60))}H` }, + offers: { '@type': 'Offer', price: 0, priceCurrency: 'USD', category: 'Free' }, + }; + const programCrumb = [ + { name: siteName, url: address('/') }, + { name: program.title, url: address(programRoute) }, + ]; + const chapters = manifest.chapters.filter((c) => c.status !== 'planned'); + + // Program landing + write( + programRoute, + page({ + route: programRoute, + title: `${program.title} · ${siteName}`, + description: clip(program.summary), + body: `

${escape(program.title)}

${escape(program.summary)}

Chapters

    ${chapters + .map((c) => `
  1. ${escape(c.title)}${c.goal ? `: ${escape(c.goal)}` : ''}
  2. `) + .join('')}
`, + graph: [course, breadcrumb(programCrumb)], + }), + ); + add(programRoute, lastChanged([path.join(root, 'content/programs', program.id)]), '0.9'); + count++; + + // Pages that only make sense with the learner's own data: reachable, but not indexed. + for (const extra of ['progress', 'platform']) { + write( + `${programRoute}/${extra}`, + page({ + route: `${programRoute}/${extra}`, + title: `${extra === 'progress' ? 'Your learning' : 'Reference'} · ${program.title}`, + description: clip(program.summary), + body: `

${escape(program.title)}

`, + index: false, + }), + ); + count++; + } + + for (const chapter of chapters) { + const chapterRoute = `${programRoute}/${chapter.id}`; + const chapterTitle = `Chapter ${chapter.number}: ${chapter.title}`; + const chapterCrumb = [...programCrumb, { name: chapterTitle, url: address(chapterRoute) }]; + write( + chapterRoute, + page({ + route: chapterRoute, + title: `${chapterTitle} · ${program.title}`, + description: clip(chapter.goal ?? program.summary), + body: `

${escape(chapterTitle)}

${chapter.goal ? `

${escape(chapter.goal)}

` : ''}${ + chapter.objectives?.length ? `

What you will learn

    ${chapter.objectives.map((o) => `
  • ${escape(o)}
  • `).join('')}
` : '' + }

Sections

    ${chapter.sections + .map((s) => `
  1. ${escape(s.title)}
  2. `) + .join('')}
`, + graph: [breadcrumb(chapterCrumb)], + }), + ); + add(chapterRoute, lastChanged(chapter.sections.flatMap((s) => sourceOf(program.id, `${chapter.id}/${s.slug}`))), '0.7'); + count++; + + for (const section of chapter.sections) { + const key = `${chapter.id}/${section.slug}`; + const file = manifest.pages[key]; + if (!file) continue; + const content = read(file); + const route = `${programRoute}/${key}`; + const lead = content.tree.find((n) => n.t === 'tag' && n.name === 'lead'); + const description = clip(lead ? text(lead.c) : (chapter.goal ?? program.summary)); + const title = `${content.title} · ${chapterTitle}`; + const kind = content.kind === 'lab' ? 'Exercise' : content.kind === 'quiz' ? 'Quiz' : content.kind === 'summary' ? 'Summary' : 'Lesson'; + write( + route, + page({ + route, + title: `${content.title} · ${program.title}`, + description, + type: 'article', + body: `

${escape(chapterTitle)}

${escape(content.title)}

${render(content.tree, { data: content.data, programId: program.id })}`, + graph: [ + { + '@type': 'LearningResource', + name: content.title, + headline: title, + description, + url: address(route), + learningResourceType: kind, + timeRequired: content.minutes ? `PT${content.minutes}M` : undefined, + isAccessibleForFree: true, + inLanguage: 'en', + isPartOf: { '@id': `${address(programRoute)}#course` }, + publisher: organization, + }, + breadcrumb([...chapterCrumb, { name: content.title, url: address(route) }]), + ], + }), + ); + add(route, lastChanged(sourceOf(program.id, key)), content.kind === 'lesson' ? '0.8' : '0.6'); + count++; + } + } +} + +// Addresses without a file: GitHub Pages serves 404.html, and the app shows its own "not found" page there. +fs.writeFileSync( + path.join(dist, '404.html'), + page({ route: '/', title: `Page not found · ${siteName}`, description: clip(site.site.description), body: '

Page not found

', index: false }).replace( + /]*>\n\s*/, + '', + ), +); + +fs.writeFileSync( + path.join(dist, 'sitemap.xml'), + `\n\n${sitemap + .map((u) => ` ${escape(u.url)}${u.lastmod}${u.priority}`) + .join('\n')}\n\n`, +); +fs.writeFileSync( + path.join(dist, 'robots.txt'), + [ + 'User-agent: *', + 'Allow: /', + // Starter files and schemas are for the lab tools, not for readers. + `Disallow: ${base}lab/`, + `Disallow: ${base}schema/`, + '', + `Sitemap: ${origin}${base}sitemap.xml`, + '', + ].join('\n'), +); +console.log(`prerendered ${count} pages; sitemap.xml lists ${sitemap.length} addresses (${origin}${base})`); diff --git a/tests/browser_checks.py b/tests/browser_checks.py index 37ea9f2..a4d6be1 100644 --- a/tests/browser_checks.py +++ b/tests/browser_checks.py @@ -14,6 +14,9 @@ from browser_server import preview_server from waiting import wait_until +# The app's own heading: the build also writes each page's text (with an

) for search engines, and the app replaces it. +APP_H1 = '.shell h1, #root > main:not(.prerendered) h1' + ROOT = Path(__file__).resolve().parents[1] PROGRAM = 'rhel9-ansible' BASE = os.environ.get('PLAYBOOK_TEST_URL', 'http://127.0.0.1:4173/') @@ -30,9 +33,11 @@ def site_with_content(origin, public_key=None): with tempfile.TemporaryDirectory() as temp: copy = Path(temp) / 'site' shutil.copytree(ROOT / 'dist', copy, ignore=shutil.ignore_patterns('content', 'lab')) - html = (copy / 'index.html').read_text() - assert 'connect-src 'self'' in html - (copy / 'index.html').write_text(html.replace('connect-src 'self'', 'connect-src 'self' ' + origin.rstrip('/'))) + assert 'connect-src 'self'' in (copy / 'index.html').read_text() + # Every page the build wrote carries the policy (404.html and the prerendered pages too). + for page_file in copy.rglob('*.html'): + html = page_file.read_text() + page_file.write_text(html.replace('connect-src 'self'', 'connect-src 'self' ' + origin.rstrip('/'))) config = {'contentBase': origin, **({'publicKey': public_key} if public_key else {})} (copy / 'kernel.config.json').write_text(json.dumps(config)) server = ThreadingHTTPServer(('127.0.0.1', 0), partial(QuietHandler, directory=str(copy))) @@ -46,7 +51,8 @@ def site_with_content(origin, public_key=None): def go(page, route, base=None): page.goto((base or BASE) + '#/' + PROGRAM + route) - page.locator('h1').first.wait_for() + page.locator(APP_H1).first.wait_for() + page.wait_for_load_state('networkidle') wait_until(page, "!document.querySelector('.skeleton')") assert not page.evaluate('window.__csp || []'), ('security policy violation', route, page.evaluate('window.__csp')) @@ -62,6 +68,14 @@ def engine_has_no_course_text(): class QuietHandler(SimpleHTTPRequestHandler): + """Serves like GitHub Pages: an address without a file gets 404.html, where the app takes over.""" + + def send_head(self): + target = Path(self.translate_path(self.path)) + if not target.exists() and not Path(self.path.split('?')[0]).suffix and (Path(self.directory) / '404.html').exists(): + self.path = '/404.html' + return super().send_head() + def log_message(self, *args): pass @@ -87,7 +101,7 @@ def content_from_another_origin(browser): requested = [] page.on('request', lambda r: requested.append(r.url)) page.goto(base + '#/' + PROGRAM + '/ch03/inventory') - page.locator('h1').first.wait_for() + page.locator(APP_H1).first.wait_for() assert page.locator('h1').first.inner_text().endswith('Building an Ansible inventory') wait_until(page, "document.querySelectorAll('pre.shiki').length > 3") assert any(url.startswith(origin + 'p/') for url in requested), 'pages came from the content origin' @@ -113,7 +127,7 @@ def slow_program_switch(browser, origin, base=None): held = [] page.route('**/p/second-program/manifest.*.json', lambda route: held.append(route)) page.goto(base + '#/rhel9-ansible/ch02/why-automate') - page.locator('h1').first.wait_for() + page.locator(APP_H1).first.wait_for() page.evaluate("location.hash = '#/second-program/ch01/hello'") for _ in range(100): if held: @@ -162,30 +176,30 @@ def programs_stay_separate(browser): page.evaluate("localStorage.setItem('rhce:rhel9-ansible@completed', JSON.stringify(['ch02/why-automate']))") # The second program opens beside it, with its own navigation and empty progress. page.goto(base + '#/second-program/ch01/hello'); page.reload() - page.locator('h1').first.wait_for() + page.locator(APP_H1).first.wait_for() assert page.locator('h1').first.inner_text().endswith('Saying hello') assert page.evaluate("JSON.parse(localStorage.getItem('rhce:second-program@completed') || '[]').length") == 0 page.get_by_role('button', name='Mark this section complete').click() assert page.evaluate("JSON.parse(localStorage.getItem('rhce:second-program@completed'))") == ['ch01/hello'] assert page.evaluate("JSON.parse(localStorage.getItem('rhce:rhel9-ansible@completed'))") == ['ch02/why-automate'] page.get_by_role('link', name='Looking around').first.click() - page.wait_for_url('**/#/second-program/ch01/next') + page.wait_for_url('**/second-program/ch01/next') assert not page.get_by_role('link', name='Building an Ansible inventory').count(), 'only this program is listed' # The program selector lists both programs and switches between them. page.get_by_role('button', name='Program: Linux basics (test fixture). Switch program').click() panel = page.get_by_role('dialog', name='Programs') assert panel.get_by_role('link', name='Ansible automation on RHEL 9').count() == 1 panel.get_by_role('link', name='Ansible automation on RHEL 9').click() - page.wait_for_url('**/#/rhel9-ansible') + page.wait_for_url('**/rhel9-ansible') page.get_by_role('button', name='Program: Ansible automation on RHEL 9. Switch program').click() page.get_by_role('dialog', name='Programs').get_by_role('link', name='Linux basics (test fixture)').click() - page.wait_for_url('**/#/second-program') + page.wait_for_url('**/second-program') page.get_by_role('heading', name='Linux basics (test fixture)', level=1).wait_for() - page.goto(base + '#/second-program/ch01/next'); page.locator('h1').first.wait_for() + page.goto(base + '#/second-program/ch01/next'); page.locator(APP_H1).first.wait_for() page.goto(base + '#/second-program/progress') page.get_by_role('heading', name='Your learning', level=1).wait_for() assert '0 of 2 sections complete' in page.locator('.reference-intro').inner_text() or '1 of 2 sections complete' in page.locator('.reference-intro').inner_text() - page.goto(base + '#/second-program/ch01/next'); page.locator('h1').first.wait_for() + page.goto(base + '#/second-program/ch01/next'); page.locator(APP_H1).first.wait_for() # Search covers this program only. page.get_by_role('button', name='Search the course').click() dialog = page.get_by_role('dialog', name='Search', exact=True); dialog.wait_for() @@ -203,7 +217,7 @@ def programs_stay_separate(browser): page.keyboard.press('Escape') # Addresses from before programs existed still work; unknown programs are a 404. page.goto(base + '#/ch03/inventory') - page.wait_for_url('**/#/rhel9-ansible/ch03/inventory') + page.wait_for_url('**/rhel9-ansible/ch03/inventory') page.goto(base + '#/no-such-program/ch01/x') page.get_by_role('heading', name="That page isn't here").wait_for() assert page.locator('.site-footer').count() == 1, 'the 404 page has the site frame' @@ -228,8 +242,8 @@ def planned_program_is_listed(browser): assert card.count() == 1, entry['id'] assert ('Growing' in card.inner_text()) == (entry['status'] == 'planned') card.click() - page.wait_for_url('**/#/' + entry['id']) - page.locator('h1').first.wait_for() + page.wait_for_url('**/' + entry['id']) + page.locator(APP_H1).first.wait_for() assert not page.locator('.load-error').count(), entry['id'] expected = sum(c['status'] == 'planned' or not c['sections'] for c in manifest['chapters']) wait_until(page, "document.querySelectorAll('.chapter-card').length === " + str(len(manifest['chapters']))) @@ -238,7 +252,7 @@ def planned_program_is_listed(browser): if authored: section = authored['sections'][0] page.goto(BASE + '#/' + entry['id'] + '/' + authored['id'] + '/' + section['slug']) - page.locator('h1').first.wait_for() + page.locator(APP_H1).first.wait_for() assert section['title'] in page.locator('h1').first.inner_text() context.close() @@ -266,7 +280,7 @@ def open_with(configured_key, source_origin=origin): page = context.new_page() page.goto(base + '#/' + PROGRAM + '/ch03/inventory') try: - page.locator('h1').first.wait_for() + page.locator(APP_H1).first.wait_for() return page.locator('h1').first.inner_text(), context except Exception: return None, context @@ -386,6 +400,7 @@ def fulfill(route): assert selected_command == command.text_content(), 'Soft wrapping must preserve copied commands' table = page.locator('.table-wrap').nth(1) row = table.locator('tbody tr').filter(has_text="VMs can't reach the internet") + page.wait_for_timeout(1500) # let the jump to #general-problems settle before scrolling the row row.evaluate("(e) => e.scrollIntoView({block: 'start', behavior: 'instant'})") pinned_header = table.locator('thead th').first.bounding_box() assert abs(pinned_header['y'] - page.locator('.header').bounding_box()['height']) <= 1 @@ -398,7 +413,7 @@ def fulfill(route): page.get_by_role('button', name='Program: Ansible automation on RHEL 9. Switch program').click() page.get_by_role('link', name='RHEL 9: Platform and versions', exact=True).click() page.get_by_role('heading', name='RHEL 9: Platform and versions', exact=True).wait_for() - assert page.url.endswith('#/rhel9-ansible/platform') + assert page.url.endswith('/rhel9-ansible/platform') assert not page.get_by_role('dialog').count() assert page.title() == 'RHEL 9: Platform and versions · Kernel Path' page.get_by_role('tab', name='Home lab', exact=True).click() diff --git a/tests/mobile_checks.py b/tests/mobile_checks.py index 0ceeb5c..7416cfd 100644 --- a/tests/mobile_checks.py +++ b/tests/mobile_checks.py @@ -10,6 +10,9 @@ from browser_server import preview_server from waiting import wait_until +# The app's own heading: the build also writes each page's text (with an

) for search engines, and the app replaces it. +APP_H1 = '.shell h1, #root > main:not(.prerendered) h1' + PROGRAM = 'rhel9-ansible' BASE = os.environ.get('KERNEL_TEST_URL', os.environ.get('PLAYBOOK_TEST_URL', 'http://127.0.0.1:4173/')) ROOT = Path(__file__).resolve().parents[1] @@ -17,7 +20,8 @@ def go(page, route): page.goto(BASE + '#/' + PROGRAM + route) - page.locator('h1').first.wait_for() + page.locator(APP_H1).first.wait_for() + page.wait_for_load_state('networkidle') wait_until(page, "!document.querySelector('.skeleton, .prose .widget[role=status]')") assert not page.locator('.load-error').count(), route assert 'This activity could not load' not in page.inner_text('body'), route diff --git a/tests/snapshots.py b/tests/snapshots.py index e2985ee..b7914cd 100644 --- a/tests/snapshots.py +++ b/tests/snapshots.py @@ -39,6 +39,9 @@ def capture(out): from browser_server import preview_server from waiting import wait_until +# The app's own heading: the build also writes each page's text (with an

) for search engines, and the app replaces it. +APP_H1 = '.shell h1, #root > main:not(.prerendered) h1' + routes = json.loads((ROOT / 'node_modules/.cache/kernel-path/routes.json').read_text()) snapshots = {} with preview_server(BASE, ROOT): @@ -47,7 +50,7 @@ def capture(out): page = browser.new_context(viewport={'width': 1280, 'height': 900}, reduced_motion='reduce').new_page() for route in routes: page.goto(BASE + '#/' + PROGRAM + route) - page.locator('h1').first.wait_for() + page.locator(APP_H1).first.wait_for() wait_until(page, "!document.querySelector('.skeleton, .prose .widget[role=status]')") height = page.evaluate('document.body.scrollHeight') for y in range(0, height, 900):

OR(j8*`wS#U9s=DZZd8dB7K!WVo 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%0D%o4&K76~eVDRWNMyeOPg-0lf8omd>c;4vo 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 literal 0 HcmV?d00001 diff --git a/packages/engine/src/App.jsx b/packages/engine/src/App.jsx index 47de5fa..943eb18 100644 --- a/packages/engine/src/App.jsx +++ b/packages/engine/src/App.jsx @@ -1,5 +1,5 @@ import { lazy, Suspense, useEffect, useState } from 'react'; -import { HashRouter, Link as RootLink, Navigate, Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom'; +import { BrowserRouter, Link as RootLink, Navigate, Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom'; import AppShell from '@/components/layout/AppShell'; import PlatformShell from '@/components/layout/PlatformShell'; import PlatformHome from '@/pages/PlatformHome'; @@ -83,11 +83,13 @@ function ProgramGate() { return ; } -// Hash routing keeps deep links working on GitHub Pages without a -// server-side rewrite or a 404.html fallback. +// Every page has its own address. The build writes a real HTML file for each one (scripts/prerender.mjs), +// so deep links work on a static host and search engines can read the pages; 404.html covers the rest. +const basename = import.meta.env.BASE_URL.replace(/\/$/, ''); + export default function App() { return ( - + }> } /> @@ -125,6 +127,6 @@ export default function App() { } /> - + ); } diff --git a/packages/engine/src/components/prose/Heading.jsx b/packages/engine/src/components/prose/Heading.jsx index 5b285af..16691e9 100644 --- a/packages/engine/src/components/prose/Heading.jsx +++ b/packages/engine/src/components/prose/Heading.jsx @@ -3,13 +3,10 @@ import { useLocation } from 'react-router-dom'; import { useNavigate } from '@/lib/router'; import { Check, Link as LinkIcon } from 'lucide-react'; -// The router owns the URL hash ("#/ch08/collections"), so a section's address -// adds the heading id after a second "#": "#/ch08/collections#the-role-layout". -// React Router reads that second part as location.hash; shared heading -// navigation scrolls to it once the MDX page has loaded. +// A heading's address is the page's address plus "#id"; shared heading navigation scrolls to it +// once the page has loaded. export function sectionUrl(pathname, id) { - const { origin, pathname: base } = window.location; - return `${origin}${base}#${pathname}#${id}`; + return `${window.location.origin}${import.meta.env.BASE_URL.replace(/\/$/, '')}${pathname}#${id}`; } async function copyText(text) { diff --git a/packages/engine/src/components/prose/elements.jsx b/packages/engine/src/components/prose/elements.jsx index 81e9c72..860a90c 100644 --- a/packages/engine/src/components/prose/elements.jsx +++ b/packages/engine/src/components/prose/elements.jsx @@ -9,9 +9,8 @@ export function Code({ children, ...props }) { return {fillInline(children, labValues)}; } -// The router owns the URL hash, so heading links carry the heading after a -// second "#": "#/ch01/page#heading" opens a page at a heading, "#heading" -// scrolls this one. Page renderers share heading navigation. +// Content writes links to its own pages as "#/ch01/page" (and "#/ch01/page#heading"); they open the +// page's real address. "#heading" scrolls this one. Page renderers share heading navigation. export function Anchor({ href = '', onClick, ...props }) { const navigate = useNavigate(); if (href.startsWith('#/')) { @@ -22,7 +21,7 @@ export function Anchor({ href = '', onClick, ...props }) { e.preventDefault(); navigate(href.slice(1)); }; - return ; + return ; } if (href.startsWith('#') && !href.startsWith('#/')) { const go = (e) => { diff --git a/packages/engine/src/diagrams/ch04/DataExplorer.jsx b/packages/engine/src/diagrams/ch04/DataExplorer.jsx index 0fefc9f..db5cbdb 100644 --- a/packages/engine/src/diagrams/ch04/DataExplorer.jsx +++ b/packages/engine/src/diagrams/ch04/DataExplorer.jsx @@ -1,6 +1,7 @@ import { useState } from 'react'; import { ChevronRight } from 'lucide-react'; import { defineWidget, formatCopy } from '@/components/interactive/TeachingContent'; +import './ch04.css'; export default defineWidget('DataExplorer', (copy) => { const METHOD_NAMES = new Set(['add', 'append', 'clear', 'copy', 'discard', 'get', 'items', 'keys', 'pop', 'update', 'values']); diff --git a/packages/engine/src/diagrams/ch04/ch04.css b/packages/engine/src/diagrams/ch04/ch04.css index ed9e28d..6ed37e4 100644 --- a/packages/engine/src/diagrams/ch04/ch04.css +++ b/packages/engine/src/diagrams/ch04/ch04.css @@ -680,7 +680,7 @@ border: 0; } .cfb-grid .dx-grid { - grid-template-columns: 1fr; + grid-template-columns: minmax(0, 1fr); } .cfb-file .widget-label { display: block; diff --git a/packages/engine/src/lib/content.js b/packages/engine/src/lib/content.js index 7d75cd2..83e6179 100644 --- a/packages/engine/src/lib/content.js +++ b/packages/engine/src/lib/content.js @@ -44,10 +44,12 @@ const cache = new Map(); */ async function configuration() { if (settings) return settings; + // Relative to where the site is served from, not to the page's own address (pages have paths now). + const siteRoot = new URL(import.meta.env?.BASE_URL ?? './', document.baseURI); let configured = './content/'; let publicKey = null; try { - const response = await fetch('./kernel.config.json', { cache: 'no-cache' }); + const response = await fetch(new URL('kernel.config.json', siteRoot), { cache: 'no-cache' }); if (response.ok) { const config = await response.json(); if (typeof config.contentBase === 'string') configured = config.contentBase; @@ -60,7 +62,7 @@ async function configuration() { if (error instanceof ContentError) throw error; /* no config: use the same-origin default */ } - const url = new URL(configured, document.baseURI); + const url = new URL(configured, siteRoot); if (!['https:', 'http:'].includes(url.protocol)) throw new ContentError('The content location must be an http(s) URL.'); settings = { base: url.href.endsWith('/') ? url.href : `${url.href}/`, publicKey }; return settings; diff --git a/packages/engine/src/main.jsx b/packages/engine/src/main.jsx index 3e3016d..c7bc0b3 100644 --- a/packages/engine/src/main.jsx +++ b/packages/engine/src/main.jsx @@ -18,6 +18,20 @@ import App from './App'; import BootError from './pages/BootError'; import { bootContent } from './lib/course'; +// Addresses from before pages had paths ("/#/rhel9-ansible/ch03/inventory#heading") move to the path form, +// on arrival and when an old link changes the hash later. +function moveHashAddress() { + if (!window.location.hash.startsWith('#/')) return false; + const base = import.meta.env.BASE_URL.replace(/\/$/, ''); + window.history.replaceState(null, '', `${base}${window.location.hash.slice(1)}`); + return true; +} +moveHashAddress(); +window.addEventListener('hashchange', () => { + // The router listens for popstate, so it follows the moved address. + if (moveHashAddress()) window.dispatchEvent(new PopStateEvent('popstate')); +}); + const root = createRoot(document.getElementById('root')); bootContent().then( diff --git a/packages/engine/src/styles/base.css b/packages/engine/src/styles/base.css index 8a8800c..b4517d2 100644 --- a/packages/engine/src/styles/base.css +++ b/packages/engine/src/styles/base.css @@ -207,3 +207,11 @@ kbd { font-size: 22px; font-weight: 600; } + +/* The text the build writes into each page for search engines and readers without JavaScript; the app + replaces it when it starts. */ +.prerendered { + max-width: 760px; + margin: 0 auto; + padding: 32px 20px 64px; +} diff --git a/packages/engine/src/styles/landing.css b/packages/engine/src/styles/landing.css index 22a3001..c32fa4b 100644 --- a/packages/engine/src/styles/landing.css +++ b/packages/engine/src/styles/landing.css @@ -6,13 +6,39 @@ .landing { --lt-50: var(--purple-50); - max-width: 1180px; - margin: 0 auto; - padding: 8px 32px 72px; + /* The page uses the whole window: the colour wash runs edge to edge, and the content sits in a + centred column that grows with the screen. */ + --landing-w: min(1360px, 100%); + position: relative; + isolation: isolate; + width: 100%; + padding: clamp(8px, 2vw, 24px) clamp(16px, 4vw, 56px) 88px; overflow-x: clip; } +.landing::before { + content: ''; + position: absolute; + inset: 0 0 auto; + height: clamp(640px, 95vh, 1100px); + z-index: -1; + pointer-events: none; + background: + radial-gradient(48vw 36vw at 2% 6%, color-mix(in srgb, var(--purple-100) 70%, transparent), transparent 72%), + radial-gradient(42vw 34vw at 98% 2%, color-mix(in srgb, var(--teal-100) 62%, transparent), transparent 72%), + radial-gradient(38vw 26vw at 62% 62%, color-mix(in srgb, var(--coral-100) 46%, transparent), transparent 72%), + radial-gradient(30vw 24vw at 18% 78%, color-mix(in srgb, var(--amber-100) 34%, transparent), transparent 72%); + -webkit-mask-image: linear-gradient(#000 45%, transparent); + mask-image: linear-gradient(#000 45%, transparent); +} +:root[data-theme='dark'] .landing::before { + opacity: 0.34; +} +.landing > * { + max-width: var(--landing-w); + margin-inline: auto; +} .landing > h2 { - margin: 64px 0 8px; + margin-block: clamp(48px, 7vw, 88px) 8px; font-family: var(--font-reading); font-size: clamp(28px, 3.4vw, 38px); font-weight: 500; @@ -47,25 +73,9 @@ display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); align-items: center; - gap: 40px; - padding: 24px 0 0; -} -.lh::before { - content: ''; - position: absolute; - inset: -40px -200px auto; - height: 520px; - z-index: -1; - background: - radial-gradient(520px 320px at 12% 20%, color-mix(in srgb, var(--purple-100) 55%, transparent), transparent 70%), - radial-gradient(480px 300px at 88% 10%, color-mix(in srgb, var(--teal-100) 50%, transparent), transparent 70%), - radial-gradient(420px 260px at 55% 90%, color-mix(in srgb, var(--coral-100) 40%, transparent), transparent 70%); - -webkit-mask-image: linear-gradient(#000 55%, transparent); - mask-image: linear-gradient(#000 55%, transparent); - opacity: 0.8; -} -:root[data-theme='dark'] .lh::before { - opacity: 0.22; + gap: clamp(32px, 5vw, 80px); + min-height: min(640px, calc(100vh - var(--header-h) - 24px)); + padding: clamp(16px, 4vw, 48px) 0 0; } .lh-eyebrow { display: inline-flex; @@ -93,7 +103,7 @@ .lh-title { margin: 0 0 20px; font-family: var(--font-reading); - font-size: clamp(38px, 5.6vw, 64px); + font-size: clamp(38px, 4.8vw, 76px); font-weight: 500; line-height: 1.04; letter-spacing: -0.03em; @@ -118,9 +128,9 @@ animation: lh-underline 0.9s 0.5s var(--ease-out) both; } .lh-lead { - max-width: 520px; + max-width: 560px; color: var(--text-2); - font-size: 18.5px; + font-size: clamp(17px, 1.25vw, 20px); line-height: 1.6; } .lh-lead p { @@ -886,6 +896,7 @@ .lh { grid-template-columns: minmax(0, 1fr); gap: 28px; + min-height: 0; padding-top: 24px; } .lh-art { @@ -900,9 +911,6 @@ } } @media (max-width: 600px) { - .landing { - padding: 8px 16px 64px; - } .landing > h2 { margin-top: 44px; } diff --git a/packages/engine/vite.config.js b/packages/engine/vite.config.js index 1f1c3f3..fbe5da2 100644 --- a/packages/engine/vite.config.js +++ b/packages/engine/vite.config.js @@ -11,8 +11,10 @@ const require = createRequire(import.meta.url); const fontPackage = (name) => path.dirname(require.resolve(`${name}/package.json`)); export default defineConfig({ - // Relative asset paths + hash routing = works on any GitHub Pages sub-path. - base: './', + // Pages have real addresses ("/rhel9-sysadmin/ch02/linux-and-the-shell"), so search engines can index + // each one. SITE_BASE is the path the site is served from: "/" for a custom domain, "/repo/" for a + // project page on github.io. + base: process.env.SITE_BASE ?? '/', resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), diff --git a/scripts/inject-meta.mjs b/scripts/inject-meta.mjs index 3834e28..3fbd4dc 100644 --- a/scripts/inject-meta.mjs +++ b/scripts/inject-meta.mjs @@ -58,6 +58,9 @@ export const policy = [ "require-trusted-types-for 'script'", ].join('; '); +// "/assets/x.js" or "./assets/x.js" → the file in dist, whatever base the site is served from. +const base = process.env.SITE_BASE ?? '/'; +const local = (href) => (href.startsWith(base) ? href.slice(base.length) : href.replace(/^\.?\//, '')); const integrity = (href) => `sha384-${crypto.createHash('sha384').update(fs.readFileSync(path.join(dist, href))).digest('base64')}`; const file = path.join(dist, 'index.html'); @@ -71,9 +74,9 @@ let html = fs // The policy goes first so it applies to everything after it. .replace(//, `\n \n `) // Scripts and stylesheets from this site get an integrity hash; the browser refuses a changed file. - .replace(/<(script|link)\b([^>]*?)\b(src|href)="(\.\/[^"]+\.(?:js|css))"([^>]*)>/g, (tag, name, before, attribute, href, after) => { + .replace(/<(script|link)\b([^>]*?)\b(src|href)="((?:\.\/|\/)[^"]+\.(?:js|css))"([^>]*)>/g, (tag, name, before, attribute, href, after) => { if (/\bintegrity=/.test(tag)) return tag; - return `<${name}${before}${attribute}="${href}" integrity="${integrity(href)}"${after}>`; + return `<${name}${before}${attribute}="${href}" integrity="${integrity(local(href))}"${after}>`; }); fs.writeFileSync(file, html); console.log(`index.html: ${title}`); diff --git a/scripts/prerender.mjs b/scripts/prerender.mjs new file mode 100644 index 0000000..0de7b86 --- /dev/null +++ b/scripts/prerender.mjs @@ -0,0 +1,342 @@ +// Writes a real HTML file for every page of the site, so that each page has its own address on a static +// host and search engines can read it without running the app: +// - dist////index.html (and the program and chapter pages): the built index.html +// with the page's title, description, canonical address, social-card tags, structured data (JSON-LD) +// and the page's text in