From 5ea920e4db7cd041e7db432bf9588e225ec6b9d2 Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Sun, 21 Jun 2026 16:55:04 +0000 Subject: [PATCH] partial doc update, make -> build with components --- administrator/document/how-to_release.html | 12 +- administrator/document/setup.js | 4 - administrator/tool/html_to_v31 | 63 +++++++++ developer.tar | Bin 0 -> 92160 bytes .../Greeter.lib.c | 0 .../Math.lib.c | 0 .../hello.CLI.c | 0 developer/document/RT-code-format-Lisp.html | 12 +- developer/document/RT-code-format.html | 12 +- .../document/naming_file-and-directory.html | 12 +- developer/document/setup.js | 4 - .../single-file_C-module-and-namespace.html | 12 +- developer/tool/build | 124 ++++++++++++++++++ developer/tool/build_component/copy | 17 +++ developer/tool/build_component/make | 11 ++ developer/tool/{ => build_component}/makefile | 8 +- developer/tool/do-all | 24 ---- developer/tool/make | 114 ---------------- document/introduction_Harmony.html | 12 +- ...role-and-workflow_product-development.html | 12 +- ...role-and-workflow_product-maintenance.html | 12 +- document/setup.js | 4 - shared/document/setup.js | 4 - shared/tool/{penv_to_emacs => env_to_emacs} | 0 24 files changed, 288 insertions(+), 185 deletions(-) delete mode 100644 administrator/document/setup.js create mode 100755 administrator/tool/html_to_v31 create mode 100644 developer.tar rename developer/authored/{ExampleGreet => ExampleGreet.make}/Greeter.lib.c (100%) rename developer/authored/{ExampleGreet => ExampleGreet.make}/Math.lib.c (100%) rename developer/authored/{ExampleGreet => ExampleGreet.make}/hello.CLI.c (100%) delete mode 100644 developer/document/setup.js create mode 100755 developer/tool/build create mode 100755 developer/tool/build_component/copy create mode 100755 developer/tool/build_component/make rename developer/tool/{ => build_component}/makefile (89%) delete mode 100755 developer/tool/do-all delete mode 100755 developer/tool/make delete mode 100644 document/setup.js delete mode 100644 shared/document/setup.js rename shared/tool/{penv_to_emacs => env_to_emacs} (100%) diff --git a/administrator/document/how-to_release.html b/administrator/document/how-to_release.html index 888d414..e2e8a60 100644 --- a/administrator/document/how-to_release.html +++ b/administrator/document/how-to_release.html @@ -3,10 +3,16 @@ Release howto - + diff --git a/administrator/document/setup.js b/administrator/document/setup.js deleted file mode 100644 index de1173d..0000000 --- a/administrator/document/setup.js +++ /dev/null @@ -1,4 +0,0 @@ -window.RT_REPO_ROOT = "../../"; -document.write(''); -document.write(''); -document.write(''); diff --git a/administrator/tool/html_to_v31 b/administrator/tool/html_to_v31 new file mode 100755 index 0000000..b1aba38 --- /dev/null +++ b/administrator/tool/html_to_v31 @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +# -*- mode: python; coding: utf-8; python-indent-offset: 2; indent-tabs-mode: nil -*- +""" +html_update_to_3-1 + +Replaces specific StyleRT script blocks with RT 3.1 loader blocks using +literal string replacement. +""" + +import sys ,os + +OLD_BLOCK = \ +""" + """ + +NEW_BLOCK = \ +""" + """ + +def process_file(file_path: str) -> None: + try: + with open(file_path ,"r" ,encoding="utf-8") as f: + content = f.read() + except Exception as e: + print(f"Error reading {file_path}: {e}" ,file=sys.stderr) + return + + # Normalize line endings to ensure a match across environments + normalized_content = content.replace("\r\n" ,"\n") + normalized_old = OLD_BLOCK.replace("\r\n" ,"\n") + + if( normalized_old in normalized_content ): + new_content = normalized_content.replace(normalized_old ,NEW_BLOCK) + with open(file_path ,"w" ,encoding="utf-8") as f: + f.write(new_content) + print(f"Updated: {file_path}") + else: + print(f"Target lines not found in: {file_path}") + +def CLI() -> None: + args = sys.argv[1:] + + if( not args or "-h" in args or "--help" in args ): + print("Usage: html_update_to_3-1 ") + sys.exit(0) + + for TM_f in args: + process_file(TM_f) + +if __name__ == "__main__": + CLI() diff --git a/developer.tar b/developer.tar new file mode 100644 index 0000000000000000000000000000000000000000..b64d49e71dc400de687dc83665a8eb2eaf331f78 GIT binary patch literal 92160 zcmeIb>2@1OmhbDYhfk3WyNjTU1Vv5mLrc0%(NtNdG+l`<_gQK$6i9$1N+f{7Aev?C zx%}Nvc7Ol9BO)Uc07Y4Ht?s_mvLzD8jA74H?CAF1_D+YR-gxt~-|f#0{(N=g#%KI< z>#Li0@_+S}{(QD|=jPVk8(TMT-1+LW8(Vj8-@N%*ap!kiQ8w^wGVP3u;B(^1>wbDd5Q49a|F58rn>TLWx^s>He+CIHz<=ww zKYi2djXv4*!vEbX@c*4Vx9{AzBm8gOy?ghw;>IUi!6gG-^M8>4iU0S0?3|5Gdw&}D zdehcf=S}ZpCBjwtzr_EoJGXCL^ZzAO`^mmq!2k33H&W=0Tc`bl*5QXw{XYKx>h@jJ z|0VwK-nfhYzvllBhxLcP@p=Df(Cr-+InsaqB_RCQU!FhP-COyb2l|8FrO&K<-X9#E z&bqy#@w78NaZ+ilth^oeyUSiY>7AYq+o!|fsM#M(i^Jh;FkSn4g`tj?E@`DG(oFXz z({6v*I(e|dryo4gPX%uk#nEtVv+qAG?iV+{F8KGJFXijvkAK{My7rSjRus0x*?8O= zOxw0pp07ep8~^o}PPf}+ko7ILq6vy(H0Ir-X5(A!x9CrMBaw7i~sQ47I8wwf8hV?_}@G%KlLXI@c(ju<8avRZD1Lnb*39n`jb)XWO{b` zo2R~9{@>Z!!r1fpFM8t6E%1N)&fRPK?>EEyLtec1FW)@h-T%KY_6ni+!OA`TQ=E1N z$M+k(LE{0U?A}SQ)720Bc-EVC3dzMuZ+gG+-TtGEf3s)!YTBQk_8z?4FLoiG;*k;0 zb|LC1cDh~snAzFAO@GM8njDV%qp1&E6zBaxcX;07{rlO^KmT0(^iJYcf6^nZZht%) zw^3K)&iH~C8ZY-7@u?`sTIXY2t>)@IpQo6N5AQctu@;vN^T%R!^Nz~9}tackq| zzhz(9c=ti&B@`5hO(=*fFz;Ur(3NmHGlv$@6$UbEWi@Z`iJA;#^ho!?fh7bXQzC0 z-k+XeoY?2n@$3-Cr*m2i$H$#P{~s1h&~&}QWH#<;5tII8+8Z2R6nbUiTbc}yrso~L z?;Q>&7kq!#3T$<66R5Yw(Co$=ub?4zjwz@S^a;%7EiJnRexz3~J>*^02d zmqT@ER@4+r3fF8zKB<2=?Hn-TXgoX~_a+k!ax@;E6(rsu$O4M!*z$iQFfw3YC&S?z zz}0d19ceYfRR3+iivb9vhI)0-?Toucr(7m)PJE4%RP9WzQ;MI35ebgCu5c{lr z-DnHYPbWoF+@{q&AXF!kn;OvUlQobB#T=gw4|xA=XWSP7gpC_LOylm@!%63De>lEm zv5(=6F^?Flm7pzN_Kaz}#+G6rQO|lY7!EdiKaPfDxeI5=I+$c~22B{lhbZMlLAkd; zF<_-QnhlJ;*`zU=2#`G>kUOXSe=w4$wO8NFWH!=7hOW`<;1qJUg&cJbd&R+QiW?xG z0ty_u`(lLOiB)FFJ3cW4xJW%5p7Dq< zHyo`O(~D6MxW*p;h=My&uiQO2)RwbWk}#7WouZh|32?q_6Eivjv~oV{v~NB*q<^WLUJX{LI1L7t@Hb2fT9Jib_}Wmt_6 zEoIBrCesTkiGgbjHgVEFK0(PMgiTrYy6Z?_d$NamW#|E~lWlN{mmG#$oS=rq;kYMO z$IdlQz#N+)#!mW>3EJkORqVJf>oEVgn4An}ryzR*UpSa}9rLj`gisNq$W19LUz%(6 zuZxalE5Z%}vKg$$n&G;^M8d*AZu;PW4DGpoJ#z}!8yuhZCns9Pr1wD@O0wg{SfHKt ziiff`GqQbxtP|b?-GW3`L!c#4ZZwsQP+U!%&RE51?+8N2l$R)p;GLL)HEr zg=R*2XqWZpVL=fuvtkqg@5!ihD2z$l_oRb>i2i}yMkj6(VG|bzK>Lk7$JWe#4#rp@ zw1w(VU|6L0Ghlo-34-UW^Ea5qtPq(XGGEYsr~NlQ%+ySau8Td^3^)>!SYRd+k1m7J z(U64DITOhyF_GIJ%uvB-aMEqSz1x|b^rVUkH@5Y;D<(<7g^;v&-?#Z!hm?F3-x{IT zHx0m#5vn6N*mYK^zy*jTo@JDpk>?N!(oAX=y`1bD1SFE=93+BIZRMbM%v)yBc893U zWkgfbOxQ4@umZ0Lfchv7Jelf=mPRfT-v<@&X*#di84QLl4>I69i$V;Zz^p+zn4sbdb~wQ_ z!5!}%zKKFa0vNjx!3R6^fP%}BG%LbU4oI*2K49#RJNTe5;C|;ggTfATB7QQgWt?8( ztO(l=vIHYnW4nhs96J>b(7zEd zXv+Sui#ou`8eE+DK-13gF*`B2&1!j(FH}t>`Q0Cbv_AA-jvoCto`qoE=&5mUc*K^f zPT6CT7~Ug_810(|A7bZ8FT&FCED4&1}u zVFzSn4yw&0&5YKxa87RZo?MJhdT3KZLP&5{Cu=vY6)Lqi3>(k!Dg5 zc!Bd`a&dMrJT02N)^TgSgwP>Dqm2oa*lQom`lqtqHlU;9lib}}Xabzve6Z8Sp*yS+ z$wHi$!3fM5JX0+=cyF1736O^pP6}}>__`RO&CDu?&yto9`OP_kqAzXwP-1foD^4?i z^4DKVGFYpq{}OP~7?a;ryfV#V8fO?x*A5Ddi8Y4?2Tvh5l7YJSwsShesz4wj_wj~N zyr&lxSO$p_J>6tWG^5XpAo=x|qdq3y2K3k)Z(x^AfBi)RVrBUcsPtZOV=c0#LQ-ZI zRqb9(|5wpkEq11mEcSG7d6-4eQ{*XX2RX7h(xP$#REh#<5>5S_CWjXgHi&R;~i4xHo9-Pww>Zqwx(d#q*;hV#SE3g_QT*z$_^< zkrmI$DDhm95Y&x4pl4>CEF%oBBtXE!Y*3Pmcrty*tbfnGQoyA&#^i$GY=L(^w#XFL zJc{+uh=I?OKWmm>jMkWz$5<;3nq_c!6gZ&RMcWp8)J6>zofASA0>Z>(WE)e_Fd=J0 zQDWwKz)VX%6LvN%#L4o*s2IlX^C?{DvJl%C&ca}3FEYp!)WNZnI7-}U(}3~Ao}!$n zwlK_kAs#P4fXSu{gNeczgC23iu1D-d>66OtmvRekMX}l`Ru78RW^uD<-Y)K}tzE_t zHy`{Zx&aSyhloTDj+X&$AD|?h_m6UnBLUJk=O;Mc*_UQd$bXDr9wDjNTeKOG1g2AT zG@>&dqW%SasSdNt{8zWKY=v$f=$WI=DdLUH1nVw(ibD<$4`(BY#tne;EF2_z9tjrt zr=s(3J_s?9Zt>9lcK6tplF(z1YMOAtX2~`yA)Fw=S6^n|i7e1nT6r||^WX;zhee4x z9pUQ%A4F+i%)u^<2osbBqOC-4yfD#o9b9cZ8O4GJy>m1FLU1<3BK$EPNTUK0A5_G> ze9-j_RZQcNB6BOW70^~+kPoV?M)YX4_25&mqo9Xp2b134XAp)jb_r^}vy}l#0fazR z65TR!6$@R=<=+ektJ4L~n~BA`i5LXc2qXcY$>3mc|5b?l>pGvogdMmrn^jwOL*7Jp42m4BvHx0O=D2V6vD?7_v5?a4dxY5cL1L)J5wkZ~{Ll|NNkK)?0{mo< zWg{&R4Gvgwr`Xim@1$6eOUmtvCncMgJMN$mWJvgCjD*_5y-tpn`Fi zqh?xK7*SsJDY>*VATOxm)C;T=YzT|pX#~RhXG3;YSvdxsJT}JbPx)C3Wf!+0Xpe^U{4Xqm%q8dvd{N1p@hY@%qLOQ5gHI`g^r` zr+B@!@Qb^}>jj^e5?!yiTIFs^gC`@Z9b~D;`X=Hyi@h)78Y3&kNBji~s)3Js3`wTF z#qdm|31MkuPjy;A$1c&XIJiKjcf}XLL45 z4J23@I#8R*sNq1NzS@BMfqmi-2c+TO7%jW(D)%ErM23&Wdq|`Nc1p!1c^|g@_1Bn! zr*bpp!C6NsJrwN#AR~muQJ6JCHAgf~{ zLBl~dkO(Jac1?-Jk?$ddv;yPm6c`9tTt+lI^MMNKVe)UC3~kuPLGWvE1qiAUIYaBE z&<*P^HR?*f?A_#Am}14imNr^;eSGEN>wzL?~J*lNl48c@raEolsS z=BA*_(XL`lLc|Z<996Vo8{EN09?x=fl^ENYatE;>y7TWdd~-`&ow@E9%vi7D0qjEo z2PCti^%o%r(@ktq>@m=V0-VQgdk2PVE81;>AH5$xBcwysjI;sMDxEDQ&0&ZMW_6^U zrrePVd!fH6fH~-GU>I4gRa-VG!C!*Q47I9{kB7rPOgC?D0xYY++#acwH9zwszr$Gh{$+BNXin|#dG=Qpz>0-Lqrkz6TYMCRwhOjg^k`}nK+lZ>ob6~ zn0-@778~HSPbh+a5x6ApdXqKJjVZRMOdLc`Z8WZ>XakY@CW=@7!7XDqQ+wpp$NR0L1;{N{bj=Y^A z5yE}t{|4{PzLoO8;pRayqOx6xPr~51Ga>*zJ?~-Eb`IbrSx*Q5V;%qMy=i5&k&jJVJD*&!Gv(*wv9GMl2ach`Dj0jpbW%NsG z^T!246CFty0*=M;4AMi4x<^I{g<|6Ay&6AyZZ?{vozwHq1u4?nJGREl_PR&a!oa=C z09)-$R@0Bm7C!et7252j#4|SXMRCIo9TiAmf*WOpNY)sqj93k+GWKC5ELnv1WCpSq zsf9hy1{4?o1il@g_tAR_TE`TSi`N=uzX$|cnI^8WIYGKn9wFx!yBwnm2{sCE5VKW* z6T2aluJ9^Ph>b#QFFvM#`|`9Cs;2BW6M>ZH=b$DPw-@=w!~Gf%h4_ZGcqI4vxjaTj58G^3hI-)ngmKeBZu zAY|LJIuRJk$U%bCNkB%J9SW7u^PyOnL0xDOIR!Jx^Cocru#2qj{aE>!M^T4o%InB3 zHoT=5tyaydeS|~g25%!GjEuDSvwoNAnyM1Xj06$PBL(m`UlLC#p6F!BK1E}LK0zS2 z7vj^S2YT4hut_AB0FfRJ8v!(EF2t~mBVzx=n&IkEN2$YsXs#?}^7xW!Y9fXKMJzC* z_za_yxUXj?j7T+Y9ElV#Rc4f0Ln)yw!Ub9RLX^fak15jygHXU|*y#(Nx~r30hV@rv`tA`?LkQzmS-9kcQN{p+ zuCiJx#UkP|B0|VrzKIOsTy2YSD?uR7_NV2iGCz>z;b%0U5&@k-&y!X~%-RzC12?LD zI-IdJ+ju0YuyNrIRv8fP1p>ie(KNmk6EJ{@qzKlivhsbLV5*p>GDSnthaQi+Nm1ii zUFJI6FkCK}H{eXi8w5d7oEPn}8pQ>mIujWN8i4?D#w#wL;sz9i304kKGxs$Vo3p|> zElG2_$cnEBsZf?iOjD*g=Hcp+CgZVjB7Oj&QD!42nh@E+vK^B26pmEoSEZfNgU232 zvKa|{iWnFt$ifI|vkBxYvd)x?V(X!@jIYghHu#tl1N0_oy`VVxE5SFYeJYX<9`aCy zeAp*B_9D`ZGxbFf5yc2-YenoiyjKBp`Mk*jf4si^Z$mUpg0F|^KP!xUz6j#XYP311nb^oZHO zP2YgvY7|{=)RI_5)A*yd;Q2+AW3oo2I0tDUEt`pM1xUSuNg9s9$|GqP;-a+f7~aw# zHq7lX%u6YStHGNUSv=$;z#fN~-}nbZUvY=Dap3aOOOBi$@(SHP)vQ{Z%Yt*W0eMo9 zVshietR~xWt}C;UBhyZ?#vkW+f~arYmY!Ke_q9jL$D7(pf=?{2IwH+jCiDMR8(f5aHH!q zw!thPu1T7-gJbjO0WImU{V7(~xgScf@uUCuSGO^SQKsufG|KpvqGk$%&&<@a1j{jT z6-rQK`dXG>EW-j&HfGqyk`FtNLk4#ytD0vq--*s)U2(`u157aLCr1RU2_zE|hd}ZWhZCHHtb$6$D6x$*RHuyvmU%VqN@0 zXzFyrV)~QAnOk12t9LkI!n?b}vyoMGWSec3bdhOGGd#|53z<}DNHai(IDOCowzQ#E zCnwGY)d5C{>Jc-)MZlWJDD;K2>Re5__(ZG1G^cU;nYMNimLI@zxi&YJNo4Q*F(-;X zKt0=dzgbTB{PFJy?69hu;P^Pv!P}0K5@x1qGOMIIJukdpvRFtxzE|>C)Zr+jSE^s| z$hVtZzPZGm0ToIWV7ZKk5y#TdBx2QyJrQ4wb-ipGw-daG=9dpxiM=P*hy7{)?U zh%8{;xBZTdX=0$&NT~m7b14n6#O6F1@#*@%Yc**I+lq1u3pe3zX7dk2JI(|Pc&Tw4 z%P-r{Lme=Xn`xf0GNitJqC??5B!#~zHha0Z|J}=H?Z50iscdBqwd;!}i_hl-g4e*I&ObQH6Njqp`bL$zrT_x{;`IkTb93>Kk^}`dwxxe*N%A`u^QgSv7|UJ$x@}DbikqOpXc*rfQqB|wC^1vtgc+1-p_xl zEw{d4en*#YXyf-fLS~n|~l%Wtm~s67;7TzMVJm%7GSq$GnwcD*$HH621#w zPS9TP-Ta1fKxxI*--9No&oA>ez-;*jFI!}F7Iq|?vFbw`_{6Jn_07DWUwqX;SolT` z$J#aoNEHtJZrG0#EQis1aFs8<4zf7-Wng|Ek(KX?Pirh_)KHz(JhuogxpGT)RvWA2 zjD^y#2(i3y+)NIYI|~@fwnm-*(D`$V&d3ikpZ=VWmL5eZOw7?>kh@#+)~@VH-#2jkBvGML2xnMDtHtXHK2!5JV09pg=e zR6T52I!UUv3)6Cz#!e{(VSZ5@b1E{#*<&bJ1qy^B6hh;zxhXw-k!g*X+^~{Kz`^n6 zH@#{-WZ;W?#NA)&Tq5zi$w|K~F~~*}0`_saikF-cAM3#8qHulof?2abSAfC7!cw&o zI7{a!?aV%uj>ZKelgPju6me)^vOTd@q#pTvEM&$nF)dXo((NCs42isr>WdYMRWjnZ zN2z!?bmR$d9VRwXK)N?=nQMk5pS)-aQ5-Z?8Ni#Hy-1D(-Re!d=3pUr3Tee+Cfi_1Zg;W5z4+%cjsZeOzhoc#s@+vHE-Mp4zLrR85%AXDPnCH| z2$gRrj6yC)tGBU~jrRN^Jv*Q)r#5{(zg9ldG15TAh(CpOO+GE!MWR?=ziD=X$5gRr zfFLmBI&)RqJJ`bPj6nu#MX;=iC(wKi52;;iEYXiU zU{3+*P^^O{gzh4|Mkf~&OFxAiF?1E8bXNPJVuX~#A1ka!c}I3KuD-2(SefIF!2uB= zRAfd{8;9i3tTKab>nYbSR)HJh_Y`EPYQbcFjUwXiTE#ORGW86p4l+3yl};3r8JF4! zYnuR;M}!*ZG;F!IsO%iVdftjRR9c19D5Y>K<&-^3A!$B&k1VfAQCpwqC+yHDZ8Vs# z_u~oqerFz$d=T&=@WV0v4!n>z)J6zMoWMj1NjGV*S><_YX;M@U|C#UTPr6jZ|&m{5KXKf*57&!a4?|y)zT) zbYaHBSC9|K!;Ac&D?}oAv*IenrN`i$Y{t_L+9uDCA_K7?uoaJDOTBB9sQ;!<^5l| z>g&eMTL0Huckf)^|M5?ug5RP4tH*?uRkU1atmD6K{u;W+UN?XB=C4~@3!A?#A)nu^ z^D7}}LU2}{I6PG-tEDWD+l}V5NAsPgL*ekaT1?_U$i9_Mf)&QD1pOzCmv{ZgnUu0Om^EsN1dJ@{EeVN@s_H9cs7WDB7P6$vTD|d zW=)5l@|vQ@%!chVBv_$-fC^g4xiH6&Zj{7P%n!lb=oYI(n`E^t2ac`fVvRx;8$fU?#J{3!~88PS{Ip5U;B;$L}~XFU!r36^G@v7+-6>ww_J*+7Ps& z{z7N5D2Z@KGWpgX8q#R_Ogu!4E}KYDRUlRek!hgi`7gk00j%1PF*d{D^AH5(xKHe= z;tr?^SDDi~g_bKOa80P#9VKf?gj*JBZgIysY^I`r>+BgjQq9e5g(mVS^n%Xj0Hw}Xi08OqZFN4UGyp|(bM&X@2p$#?2lx3ReAjLP}5-oGS=qR1X25dnS z$-x9jK9HkXETiCzJHf0(Uz%}T20paG#S`z_cnamy`ol^a7Cgt05Mzf5Q`)&$7Z){5 zjI3=j2u*5{0lJnVP#*eWx-^!mcPv}r4Jy^%s2ox0fO4=A{AlS2oLxxNPueJkt&tZV zw9U}{ic=ZX4e5j&3{E4g9uAGyf*H%X(8xH$&RS5)Pr#gZRqK?FexgGqKu=2!tLEl9~aQ*`5j0zw60O!*}K9LeFE3Y137evtg7h5m&^ei zJ9r?$pp$&|ob|p@AsYvITROEJ^VuF$5sexckpAWcWq^Q+IxNO_S7EB?lp(XTPHxuF z$_06P!1`@eJ-PZ}$9*A@n5XrJo@|$F^FnPgP8EJFnP>hO*`wH;ixw)eH*+?~Wlh;g z3=vlkur3Q%iQ)uLGjZ@nxq?fY!-2f4Y0dJPp~95-it!$My52T!ez)F`Du>c{FJA1u zY`=Q8^XI*dKkq%~&YO^jU7aJ*UcR5BBnq4wKfU~C8p?{*fXB(qywGy}1 zxV>&@NUcRrfiPLM3*O_sy}h>gytd3A#upLV5@TzNd5sQu2c%jlFtc>wGPsDvu{5+g zYm1t-FO(GIe4rg@GbtsDM2xTI(8#)A-oyq6PgEcYTv912w-(7(3yAp}^mPDUw$&ARK%BLlvq7uwLS{78b!H(e4BrsrgK zbkzS*60(z{A2_OLu6mA;?1aE)(SC3(_?nuhy^jfZ8WIN)>7Zg;q06=f5{(X3LoDQ# zy~ejVHmZYvwyUM>z48v7i@H)`7%wAPxf;174jnn&Zc)?Vtc7GIi8&Ig06Wkk11vQN zKt@=`u?w0k`T-ks7$GcgcWD8A^@(Ax2+h#&TBrja@qA)F z4X1!%?NS6;pT=Id{Ua<5@-3ZL@^uw-^Mvyp+}U|%XvRwx=4EeeR_eV(tr{U`@YJ_q zcfEK)!;j&>xA}iMZ#!hCp^2QfFsHhRJ);?Ua&)o=Jjt4iVBwHD2lcGcx+K|x?Q&Jw zqV0Z*$t({t>?U?!R2o)psvzwS1&c)eTKi->?d=d3x?p>GR2cz87`K01GHbLw@~jF9 zW~WOJ`9r6BZ^pft9G|N53Hd?Vt?C>LXW6lXWf17#w|pG;0g_UwHuyv#W%!U+loTjV zqYU-b_S4x+A~HLn2c9^JP9JGQmdb2Q9)`A`Bm>A&%JOyh$(rT1vX-dExz?o%+{UJ_ zh=9;>-{xMIxaatM_$3+S@dJUKS7cj~Y$pN54BC2vvj!@8sRW~FCwiQ*m}A*XX|EX8)5BKG)uU394wy)ZQC~MPSz(sDP84!py!D57o z<2^N2<&y^|3jHojy5u3$WED#ug;AU(bo&;ZHG=s~YCYjjR*^N=YtgUR z1YnGo1!%yUfX*~3xWq)!RX}V2ydhpx%AtAq%dY^(0wrF`d7914E0X=&(O7tZp?jD&u*35#W)!6x^)U z2}x~guK1FrE2({KH+Q6{2zaxDToUzZSOLujwqvAv*=F#Y!6J@gBC?Vgha~oe(n?@U z&^Do|a)*U5-{oF|G^&9KVGnY(np z;7OwY2*@($xt^y+#p3Eej8jPkk<$c;3A1Y{+ zR#{qaim3Gu^Y28|UIawz9LGio>v;%9yXOw?KEOg?g5D%ExVi%Q zZDVKVjf4|hMFoUFKp_|%0K6Ql^V995x4YcK}-@FxjSmY3HgXvzNz=ha2c?}~tEV`c!BoZKWX`Ge>|Ayks%Ij9& zswo_s3lJjU8%Ev(|G#*xtj5ZqEwyZnYU7uDYY0d*L)RlacZnLEK%XV`k%x~1OeJNr z0V1a5CCP2@_NN9sd6*QEd2<QFc(qQt>H2=oZ5nceIzB#OsyZOI<$%%|kV zw4QNK>5c4L6iy&InMLYvCBH$56)EU!PXIZMvS1EmdZ@Ou;Usx^L+J>1sd#DiYn{;4 zsZFr%+@>Hfd)k4~q+jg3m6?{}1%cN`DJFksiG)XKh@KDuHKM9~QSuy(Jh=1@OCzDjN*g7hnUhp&qKUDA4;nZy^vUJq;Rq* ztQ^}~uAB^AQZl-NkTi!#nBqYW_5CQz##JC-^$d=j4fk*i>oy}1hzzruFhYG&ath#7 z07=cYE8B^J1I_e;W3#|2^AB8M#YZxY^^KR?OZk{kG+W(#*O)FL!f(SVzTjCVRlcz& z$xw_n6(6$q)T>VByrBme7{+AYXIH9}t7;W5vFj{I1S0jGOXB~lZ+8I?w%qG)a zeUL z5FVj#b7eubojx26PiyZdnCm;ES%Zl!I^SAtBzZ zIH4tt%+Je3zDsDGMU6U@FSp%Ammu5}r+V+5a+mL!O#rQpmtcI!BK1riI#+$K4jFsz z3d>v$m805M8BDG+ZWW*zvmedDIsy27<4y*{?m_^?C^J&cC@_e@8W9}n{e^(a-`66d zRk?70rF6vjOJQ~y+HG0O;l-$xFSip#=7ZMweM@nZGu0}{u$S2(X^+%WHAmDEsJ?G$ z)b|f5CHb~`L623$fOj49FVV&!YHRKq!|P5QvuHZpBja&lDF&GtAzR_qn?deI)sql} z#aH}TtX~xC|A-fBm*O#B=wISZ9amhYB01QBy|V|dOYd#+qv>E$HBg zgC3)GhSVG2kv|^ND_PrVDdQLlwuFMZ5XzJG5U&Ad_i_M)<4^ak^r0Qiq`WZP>I2%* zvPqDm3xP-T7k)()W!#I4x5+3$%+*K&ZLXZ>iR7r6qFie~Wf15N+o~9`G*L6{ttj3_3g1j)#ZOr0 zQ?g}qciYsr@LayQQ8!9IZ3B&K*B&`#$qWy4ISRt@&Elwe z-28EEt@zk|hBk@1sYkwvqSS72}@)MOz`{N?~``~iHMqm zj{0F!(a=Cmu$Z>`JcO)x$GOrI=@mCR_Lb zVPf_D51~wB1G}PCUQe_r`IP;8LFj=J4x)y3>0D(e^b}3&7{GY?gxR>dA_i8Y3%YuQsPaa!I zp-vl=#D;3cc^gzPk@;5pM6~R}S`l7DC_$3$a}R4nZCI3|32h0{Gm6cCF3ffE+MX8S zCAo%n;<#fx777!LdmwEM=UcZtTk1QMx_A%us5%W@yB_l`o`6Pj zM@-}ubqd95xt58vN_g}f~;Zlqoz-e5+B&51VRp0h3Q1I5tSJ@#`KV4uG-Evg?Y&?19p zX`aw+RPKw1eQZgw{VPPH z&eMyFv^r=hT;56e-LF^tY@%RSd|ksRsVcu6=rmFr8l zGP{JHBa5IH#*LyHoyv(M`h7_^BBj}HZMpWf_rnGQewDQqnD_~ywCKf262{sG5BV8jN0*+Ih+UW=%-O7}b%C%U0%q+v5@ooofQ1IsxkPPvK zFbbO;`%Q;uK}0EQph6yrLwdnkinE3dY=1>QNRQ3VwhKSVP9n2whwC*57gdo%r>#Ln z64(9x$fF5ivBIZ(UsN#~!a!D=!pNunBMyktGHL<;zpyG?Si(C?mz4S?^#YYTs|+Z1 zARpSK%5*@!HpDtDzN11~qk8MSUzxDRPh99Rqie3YLC(Q`@|n;{@Q9LP4J1v%Cf((U z>8WeBvFN-nvABV<6vgVg;~Do*Snd}I@NI{?x(1{O-Vh|3g1V4FRG5Z4|HK){C~<#~ zBY@3BO)j}!?jN0HC1>itfFUwrGzErZRTL74#Ygr{>|-_P-A#SBnQ?gvTvT*Z#=Vlg zHgN$v)L1t`B+XJ=qAUdX>IA+To^MRmQltM5Atr#DO)5zlixW(;RRpqCayeW~79*jp zUK{}1P3yY##8fysO*#f*2tRfBR|K7`ZSFr2dkIDA18(Gj{Q<}C#JfQ(-25YUMK9LN zb;fkcrJuM;=)9x^PPPIqHDJKX2xgW}DrV#()0&;@XCVk%snH3TjJKeWs75FGS)#Mf_)UZ7CQURk-T_(id` ztq!zABE`SSXfj$a=c!TeOI@viem5MHS4QnZP$=68*IJFd;#PXZ?`T)A5FAF2+aTC8 zwd|G1@Kf?l6a6P;XnyM1MH#Szj0?Mv4f<2+4*|MXo5yp6{rVZIclmM0m@~&_*a#;`#%T%&!PVL&p{(zr_J|s<6IsJOHjYLT`UZX85S_u zY2Y=P!ny{V-wJ&siebo z-Kc+C;&6|G=Y*_&1htQ1Ls7$oMnoFhyrZ&q)T|CWx-^baCsc-xF%)1+D^F@VvD~8b zH?$>tL5W1T^;V{(bhXyWaMB8PS_O6pM^)TP6kXwcAXgA;UcHZ4^a}GUSzJ5#AHP7v{U?_SI?iJWbFpQ zZ1lfj7s68Z@#SM5gakFJ#w1EFs+>8@WmC)1nle_$C{i3tYf%~ zdbP0{#}nc4GEMh>MC#}%ObS)?=)i^&HTo??Plqxg-w;s}G#Cx2xTWNVj@8|y`*Gl+ zc&MggKLiu7?f_+65)tnC%WHP@0-r@Z@;{axjbE=@1N~FFxqSE}3;O@Kh-^zDZy-B1 z$|#l8)`w5=+2#Fzwr@`BzSpgQlBeOGe(U9aOLkUsRr$(Ii>|ic_DLe> zn&*qQpY~{TvpIpO)uk_ENT2nVf9k0^u~$ zVHL%x?9DRU#V7mEX$7HjfcuTD2B%y6qw*1otX>4aM&hjq^<|+Q1%_Z&gq4B}MM@y( z9fG7-N|CzN6DZr|(7H05G)5ZRNZ z5A1VGCk1QLla1E+MS$qceuPA2Sf&x=&e;@)+`VjV!}&n2tA^2+(J=KjMF8Z9%MAAA zijxDRXm~iEiJ5C7TM>oQz^N03!C_wXP(%_>dB{c%i#D8=1DQLll_ukxX9;7qp(n+o ztS4UShj57T&>H+!jN`bkY%g|Rxk4IpN{oZq$)jzfQdw0kgt`$lY-RM zRtkWTGYow`7Ve73;I|he&dE4GcxjG%Qsu@U>yUccoQ2@0wL|d0k0FlA8z{9r!mMUa zerG(1+%Ard4PoK+xSTkOy;*Ni!Knq6(>PO>rw3JK#Y8%uRRO=RLG^XhH&!=0kweKxiqk%X6!~SMCRw1FfRUt4vdE4r<(Zm%UFpQU(Yoz|KpJHQ3sz?Uj*3cJOtQt12UHil zpmoOMCQ6#?c(v;Wj}_XrmXV8iW)R42r>cY=9>!%vwc{K*?YnT)M5=At!Uw` z3bB^vr(0m7HvOL|zXU=l(Ha8eM$HuKxaUTVp27D53y>4+pks@h5|MW0@dn#HlhZA84YAu2z6Q6+8cO=A(k0B^<%? zA@lkJdxBpc|GT+$=kBdq{O_wfcdp}q{}fXA)bYRFpu>nHBytHwEt2hSGN>B$@PaOQ z*MY#LvAq8|fk2O(7vIy<8O!a-1qDo5_^%onT+|c%!$|5Aga}_*V9f*|(F@mv%PjbP zh?**;OmjwU-8sM@Fk_uZC=iPcqGASCg%Q{`-5xP0uW7V8K<{oLGxR|#ud!D=R`xGa zSqhjCq}|$_ongrA=hCPM%lG$Gw44OKnJ22IWIVBEvQ}(#`y?KAaYHPc+a7k*LaM!c z7PvR+qe2|O>!fKb%qh$;n;9|gjNr7SrGFkC$~NHMEl~z9d9)X)7Qw}ne?>$^jeXMM z@q=RX7MC?4#H)%{1D!TzWB7K!fdyr$M3JA06)%Sc!_uxk!SZBqxBk;P1BV9vI6&)A z7M}(-5N0TmQ;!>@47-Cj7*tcrn~6HAGk}m-mI~GpP@B#V2_5N-ge+YMhvQ_2R8msY z?FF%Uup|CVEUDJTZ+Rq1l$?<<=XAO6DbzogqMUuHn1>iUby$;&vjeK#)eoIqg=ig{ z8)`mI?hvBCR>Nn(7OI(fA99xeS(Z3dI|Bk-N*r|Y6$L1HCqfXf7!7lk5ly_;xalm~ zQwfxTTU9ijnfn;95<@4{MZ{+4A$@{(7dhREN{7$PB~6a#^&(wmwld&6zGg%GN{J^S9h1k&`E zJbal3E?b(E!!K}k%Offx@>rZz8*5PkS!FDD6z0Xsj-nho@`U%D3Q?^L$Kzer7aKRS z%s$vjgDTv7dm?3ez?5xW(@t~X|N4sn`s**mYO-zT^cH`H;lxKZ=9R2isz8YJaLfUQ zG7*v)-%)gj)0r;*EIvVmUNJ~j)^RMhBDR!>^6K_0gBagXX~|poHCfmf6sXhG;Q9 zG4a8W@}fnM-zg%1E@iYt$($Xu_+C(;XJm`H(&KPxg3|P^9aB-kn_DUi_=;bqSW9KUaPE-hjT03Gd{1riQ85oc7jI!jJm|Eu{K51jU|IMSD#l9OJH@&l zIlwGMQURpiWiB7FETeJk$re|&hoPh&x7b&q^}oHV$jsNPz-p=;5u(JJq(?P zu`|eWM3pK@h04K>Qun`7O3rERik`RZH!8}m!4}Uah3ud~TIezwgR#j2tHnq-wPRA2 z6)e3i1B9Oeus5LN(8*z_Y&ssKTxdJJFTZ(4oOvPZA|4*wyuQ)Ub8q`9IfhnlR8`mLNjYsu?{+I~=8RRtuu+!+n|)<}-1UB9rx$5vAccQKO> zQr=Q}R%TSPemseI=B$pIDl#La0*!g}v(@OdL9VzoX~*uvg_D~2rG5>xGHasiaLBzh zokQPYj;!lJqjfs6>ONl};ayPE(0Yg}1h;x{1Lx0QYl^hbCwNi$$wjw-nvNpN!KFua zBCelj2=N8emoN9*zU(}HvSu|8W?7*gxLA#Ak`+T(1h)lTC%bQv@Jk}n7B8qK$hMu9 zOq!#zD}954#O34S%i`ujnX91|>6nGXL2P<8b22pyR+aSAXBX0 zz*6h*g*)FKsj-7TP#7c=tQ~O=ANVPwS|-=s#tNy_?Z?ck5OGVqS;Osk^djZxqJUDB zTWXwQB7pI^t&Q_8rTK2$ALW>Jq*Wx_Y#~3(;X#??mmovEf2z&Dh_W)1Wv3+Ax!t&U z&ckKg*FjiH3F<`VbIQbKRa+TrrvhLpdgyW#8u^xY!Z5y0qo@T&iQpvo{9snFAVUzy z<)6g|Kvmv4A&pjR?~;a-LMV+~_jH$Z=1C;B_28RS+2k&*wE@8HPSU8F`p$s6k6cL? zzI)lLLS_{jiUFEz_hmFlolniij&%+0w3T~6FR15(8^*zOkPW;D>-88*bWb0h5-@rd z<4&1lYBi52M=L1M4GGpJESyQsw(q7!g8m#u$Vn-`t@&JmOE?=x6s-(;Ez&^AgxZWi zTinGW&+>+n3oxeu!!!I7i=cJizu|QDy2Nv7QxT0N7*V;}a56iHh*MPLtTUBM;y!R1 z!l1Um9bK@sTvb)5BJ$t z#9?GgojFuh6q*SqiFGB6C25j_szjYDp)x9l9vdMQDFKx^UT)P4MH=+atRDxsBq8HD zk@w^T2ysxFxit8a);T9wP1U-|lEu_8RIqHu<^EtY2_w2xZW_IA`ooz}VT)>V^VTVn z_N-pg7JX99<4}+-?a(b(RTt^&0V(i zR1SNwkoUce`E2MNoq%(iZkcS{N$Wu;*=qjFJ_>HwCy2-UvouYnU2jD)Cr)9qjy+v{%S5h}=TF;3O?s)b)=YIlbi zg3a6PXB7asq=*7xfdGkbT92Ig+@*qJpVcLdh1W|qg5@kpr?x>s@+sti)sBICRKA#C zr*lA&ZtF;oH(ICZA}ls*PkOf&POpbnE!@x}aChj#rRKgs(XYTJg=5xwKwun>yOx67 zMQPI!|CwCM4)Reu0gb*f@6q26nZml z$O6~a;wLO$@V)K(&$Fa`~D1g6bTTzRDWudi<0&^gds zU){Wu|EsU`$LhcC+_`<{#vQ)DdE@TZ&CiNEpLiV$hx`Be`Ok&;Zyoois$5tIun+%G z2)_G4_`iAc)^+{ghXeXIyiwvm6Z*eloXcJj{;$OUU){ZZ^X8WL|IY2(*ZhAOOh46k z3-K@h$EDyX@+X<*z5KuRRZafiyhBTX>+}Dg1p1c`^5x3EY?kO=x%}blZ~whbx~K8((gytbwL){_)p}ZsYZC(;@X}PO@T%I?L0Sb$ED3U-u ziAOTX()2if?ePqS1-#7Lr+G;&5+$CB3+KTXMII_6R-AgKAXN1kl$USvIvSY_`~st!am(*O;Ce+Igq%a z+VT*WiTxN#V0ipEEJR}qz;WzXo-k7ZqY{>6|2268K2N=%cDzpj=v=4!9T9%5HtE<{ zu?NNVkF3wW;A8Qj3xd?d(Lnji%B#Ko?_RW@e)np>{culoP!nR1;B3@b`DX9Y&Ua7t z+uuBX*?#)`8$Eerh#!)^c=Y(mUir;!zFAS4Uw1*YwUo99ayDt6O^%Cor4jCLttksY z%yBSn9yKV#r7-~@|A{BwHJm{2L(;9ulsNEMw=(ND4ah}F-QJo{pw7tSY1@|Bv=Qw` zbw6c|LtgNxee1Y4Z8mJT4BlvHJY7XpKK(EEiz+Z|G%&&f87kgZA^{26CwfTZQY+*@Afn&QUT0VCfX3bvO7eb+u{zymF#o_dCeEIyz-u*P+*S^~O zU+7~`P6b?PTEE144*Exp1M2^?M84fN|JB|9$GeH6Y7+dBM+v7_t=LpLPTmP`Z2+Pc{`01ti|4+`H`Tu9*m z`Nw>T;jwm?&fFy6+mrEObJRu|Y%83*R&cjE|B9Qa9r4tfNISwv3ArKn>jB8uK_deMzSGX#w>=x{O0}el1`TQn%Wcca$KzIR|CBeD`Xv>@KOB% zRysG0RV+JP!_cG1Y35~6({kdOM zF&cJ7!&O~2=UYU&i?t;Zb^V=Xf&!+vv`UzWa<@p+0%)hX1g4DamJOaiV&ldY1e$S@ zDD_d3eXkW~Z`fh6aaQ~^Je)QS8?SF}|M0FrUTTl;R!wL{YGy28ql7Q7O)_XB{kVpB z_~!opc!uTzUu<>UTZnE)niRDW!&!;{KsC~&t?c`S=nv1@vWq`RS%39akRz;{p5a#Z z!JQ*>!yh$%!fcej9G%bTAU>Ibq&7dTwMOT5+0wi1pRg(Q#PRqzJ;6_Ft>dvjAz3(2 zlVMTJkOpNe|C!g{VUNgY-~imTEd#76x!LZH5;4wGUwk6cs869{Xl!Wfn0CK-tx5SZ!OlMNxYt-O+~3?s{>PdNrxG6my9DQ zY2>Snr6sjEqd9GI8}d|21(TDITH!KMX6zYH@E1DC>8pbtoms${=5hb*RXd7vBw!&*8os z{1gChmVmKK;4jEfl?4PO_{rGHq7eLI#0$Fz@$9>lWx>7R;^X-6TJgZ<2|_teT7OEC z-hIeMv>&{B!W8qTTAoD(*m47hjw*AOY5QdEI6FFxPi@cdib6lfjcnih33$EJryj?7 zr*8#@(N+mZ=-zy65K>M*Vz zQ3Z>6w$YqJoM~10GgWKGo?oxoGK{pqOpIgN!;>^*sSKju?{*d^t^s~`E`bNt5-V>ZerSrBe90H z_p?VbDy&!?SMN0$rk;%u}g`ftW6H zdV&*OtS@$VWaw*w!jhyN^x)pPZJ<%c>gv9}_Py98ibEy9%|$qfs37+WHY2y}p?D9h%}D^^!iesE5yNP| ziOJcC;A3PiJP=3Lj&ln0KuDt3i0N(gEWJj!*^gC zg3|l97GaqL+SRv~UX2>>Qu&cB=r?RF&1GAQ^jBg}Ma~ks<)$lC*?7hwRtSoQ?bNiY zojAUHt9S^Frc{#E-BJjRl|Xx1T=_Ya@{Gy#Iqg%BhSfEcTTIq_KWi6%B{g8!}{-74HKvn4Dq=!sh z_|62g1&>E^GVN)P2S|Lb+Z$yMnk>hP4$aHM*OBmktBTMv&+Ni0Q*{-+pje!J7v^$? zsXrYyv{pWy9{*hT77zxz2&7IEij&^qoAO3mOjn&aSC?r_2ft4Wh5%l(D1R^Hi+zJ`|Nh59bXxX7%;Za%|qb;P2nLtJVAgT~T@UKXf%FKLU* z;PuFRbq$t%c@=@dn*2zEnQ(T74rxLJn%-1+h}m9^*CaYhjb@4NB`PiM!-!ah9de@7 zZISGv_;;-|_fC@GDKHr%O!UloUxJF^t08$!7`M;FaT?PybF&!FXhfGDT3dV}qz&+r zf;cX}kQdk-r4^#+tel}WKC^Hzbqrog*|rPcCn=m>rH_~_34Y2b3b3V-+ALXOr*0)% zwPFPulyv6E@7pyl$h;XfyVJKyCn{3E&>1OQ6qyO(wbxsU*)o9a*7PAcglHkz<3twB zt7*gu7Wp}hM(FbPqRG(9=LVB(W zlInxlis?DQ)xaU_>xb7jeo!W|1^|O&=IVLuNt~Zcg8HOUM&zHbU<|h{-qLQ{MD4Z? zYPZ`Bq1o{LiApsShiB>dE0hg=&?E1w|J|BD|8bj^z}NL(9|Yy!_HeEKi;II!R=kL# z-8mZF|Dwr(Cre!xjW2$Bxby1U_N(XLz1-b{11uEy+h)Cf>%R&FYW#1lTHdod3A3^IzBXpPw2N^W)X{KNNrdPL-dk-djX)#YXYa&htOd&tiW+ zRvvV`vSN+sTqvc6yk4B<4GWZ(3H@ix^Thc$md}_Ku(eib=7;yAroptU9S%0aJ-8U# zD0I8MORXdPm}zR5C}YqYzskX2y#9EFDl_#aqh*#YIkXPoQa4Qz&Z35M@Y6B($JkZ6 z*qY(;Lp5r|35!SHD^9xlD6P;GN7K@|<5`^jLF?W=XLuj@>FodsE_CUsBOg~6*`+7) zjalSE0Jn80o@5PYJHtp`Nf|0}vGEA|^FOULaJ1EGhO46n<^`;HPlOAr`@&L9d=WV2<&@>st;#lC2YJj((UyHwUFyn z{>lQxNUFX-Ib>xjk2knsbyT0!(6_zq%|^FV53BLag2bYoP+u6<{SM@&W(p0z!>m^9 z$xdUr=T->#QE*~*oKum5Mc{i)tyBP^|H$t@{GbI#$_TzvbTrIm;gJ}f7=5n=qp4=eF{z)t z_%VMBAUthrDECUhX?1~mt8}}ugqU+cy|E;dzp0IzS&kH|NMlDnavlFu@}zntHOfqpI~^#u=LDo$&xM zwN^aVQ9B8&Rb^QPi+8KrNibZ{Q9E|v3_S&Q{ZNf9JNe#5iqKz zMorbt^t#P*=`Bq-X|5@@s)8e9m$ntwXHRVx%c-`)>&|VB@4PVIW#sF7X*#7Z)obs; z>+O3%bUygu%OAd^kXZN$ZxgCg^QzF9LSgcF0x4XV?dm z?Rz(Gyepb)(Iv7+Ej8%7b$~n$QA{8E-I^_`^dAF&ilRy27p=nD?8>Eb{wNcHl*NFw zy2x;wK3oZh{~UzYD`EF(ct@O*`Fs9ue&aR1QhJn_8|B36f1j^5YToT->DbLZ(`u-< zRbpeSg*qXt(?7&OJOx}Q{4bf~%k9`j<>mf1Lu@O1qgyYthqzrVW5lDZP7@j{ zqKn#wh$ayYE1b@5RSCa~aKev)9?J^rsDD2%Ug{>S$T><}*|4QqAkCk+2J+CTvC<&Q zW79wleIwOU8-S1Wjd+;p5+XdH4pfs#`JD`r)_=60|2c;3!eI-G zo^1y^G2tGOscEU55R)bd^Ktr_?{pfa58WVQ!^Bxr57N~(hOO+~GD%ud?1=QiTf{vp zjp|qlN)I;;-o9?=)Xl3GJG*-gX@#^DAj9+7*E*YGj|9{?^bGhGFe_f$&(eX!ywAE) zN&J^eAWD0!1+6#`d2C(N+~@xgC{HoR5KYWp+l4ZF-4|~3Sq-QPK|+yQ6kQLarRx$a z13FR^R=f=M#!{*!fMF>M`l;7)ZKU7c5AFQvz!Vn!()oc%-Ifce8lMiPbiAU9DmztE zx14wb%W09#l}4!;S0Z%Ke|Q4d(4y4d48&g#oNf^~t(j4EtI*dQxW?XxPGg`E`Tg1t zx{2>BfXTlbC;Dw;!+tlzF=)>@)vaY^mgx=uoew?A-)*ZWPfXs)1Zq=OD?7+ie~EY} zEq#ogpeV2~jw)n{rd|k%y1L5@FurRA^UF1>%rn#d3|%p?;AYqM@pFfmk$RFP@u8?z z`rYmZ7sH&G)Z_Z&JpRqG}T^&9jyKo-bcCw zFe1=OPM=(2lA*P;T8b(XQi?JF*soNnElVeNbaJ? z|7%+P({zHmJpQL|z5f&E|8LSMi1^>lJ9mixUH5;w6m_5E%lF_vHiG=9xrE?L`aj*e zyLH>o|9^Em^#8eila>J2@!yYv`qf_kyv*^J-C|{}6O*k(W1HVz9E>?GwbFX^-J?g3 z|6}jf_DXB-KVCe4x!>M-@}&KjotKYy9zM~>D}3~H=g)g~zWSRN#rFN;i)J#o);6sz zW4Aip3L)pm-1J*2Gg<8fBj3`U7=t!cV<;>ax-FOP3b%9g{$4b{XeP6JZCzSxH{_~h zWor@13(lY9IX|sjd3?n#vshVaz4-R|v;RxC1BEk+75is<<$wLVskx&fhB?G0#cTWa zXD(Qf6ZdoGZvKpY@-yD(&)BX%zoE**I~4q&)6;2+@LsVJe#ob>0+C|lihnfh|N3|C z>mg)~sleHSaD8!{;%4hcwuf&!W6s)MP)PoPGknn$mWlox3BMJbuWe?dhH0}Yy$>UH zrf$6smwtTW`Ik)*7n9(g;fdHjb{8fN`1?rkZ#evSzk3Ps-CzBp=|8QlM$9CBxZlW` zBVjJlvc6BhtflXB;?^Vi@8wf}rtv}h;dhUpd?O~f-{4a6gG~rB z33wG7<2CP6TTbDN*WmV(4I3#x!|xTza>MEJs#KHV;=cyv>%Ai^xEflt5e}5$7B+>f2 z6PT~Ll;z8I`U%N<*%ZE%t7+^{`_vWezmJ|!_TOdwA8+6B{(sj0>#pqoTeq+K|9v#r zuQWg{|8Mm_3vI%c6;i9kMsLQ6hyJK{MC5N}_vtsNo}ae1HxPk33IBPqkAe25XWwxl z78X&ZwYvHXtJ!$2s1%X5dt>y2Y&(J)W#VgPfnjz(v89`pxh9m#|-Q>pI%Cex|$1)FVrqN2MiVdkIn(0lk_VeOAz$ou&J?pJqX{ZH`! zZ(Y~_eKgdsHo%qmUsP}<{wL1&nnFRb3USGXskKJ&!`I^N0iM?Q3^NnAsjQs$gU=-^ zTN4g>E*y;>(LZKa`7=@sm%X9F-O9X3qkPuT5oI(tua%sPijB^!ES0E>mARL)2kMJ` zMd1-^Eq7y{r&=A=8tRu%G**<`l@pq6`nv&V7>37O?d^F^MaPR(fpyiUR5oR6<*5HZ zPaIv1Xs@5ThQKuht|4#@folj{L*N<$*ATddz%>M}A#e?WYY1FJ;2Hwg5V(fGH3Y69 Za1DWL2wX$p8Uoi4xQ4(r1QtTz{{uu$&Uyd< literal 0 HcmV?d00001 diff --git a/developer/authored/ExampleGreet/Greeter.lib.c b/developer/authored/ExampleGreet.make/Greeter.lib.c similarity index 100% rename from developer/authored/ExampleGreet/Greeter.lib.c rename to developer/authored/ExampleGreet.make/Greeter.lib.c diff --git a/developer/authored/ExampleGreet/Math.lib.c b/developer/authored/ExampleGreet.make/Math.lib.c similarity index 100% rename from developer/authored/ExampleGreet/Math.lib.c rename to developer/authored/ExampleGreet.make/Math.lib.c diff --git a/developer/authored/ExampleGreet/hello.CLI.c b/developer/authored/ExampleGreet.make/hello.CLI.c similarity index 100% rename from developer/authored/ExampleGreet/hello.CLI.c rename to developer/authored/ExampleGreet.make/hello.CLI.c diff --git a/developer/document/RT-code-format-Lisp.html b/developer/document/RT-code-format-Lisp.html index edbed6b..888e5fe 100644 --- a/developer/document/RT-code-format-Lisp.html +++ b/developer/document/RT-code-format-Lisp.html @@ -3,10 +3,16 @@ RT Code Format: Lisp Addendum - + diff --git a/developer/document/RT-code-format.html b/developer/document/RT-code-format.html index 8260a9f..e4924fa 100644 --- a/developer/document/RT-code-format.html +++ b/developer/document/RT-code-format.html @@ -3,10 +3,16 @@ RT code format conventions - + diff --git a/developer/document/naming_file-and-directory.html b/developer/document/naming_file-and-directory.html index c4bd65c..7fb7619 100644 --- a/developer/document/naming_file-and-directory.html +++ b/developer/document/naming_file-and-directory.html @@ -3,10 +3,16 @@ File and directory naming conventions - + diff --git a/developer/document/setup.js b/developer/document/setup.js deleted file mode 100644 index de1173d..0000000 --- a/developer/document/setup.js +++ /dev/null @@ -1,4 +0,0 @@ -window.RT_REPO_ROOT = "../../"; -document.write(''); -document.write(''); -document.write(''); diff --git a/developer/document/single-file_C-module-and-namespace.html b/developer/document/single-file_C-module-and-namespace.html index 23af5f8..930f028 100644 --- a/developer/document/single-file_C-module-and-namespace.html +++ b/developer/document/single-file_C-module-and-namespace.html @@ -3,10 +3,16 @@ C modules, namespaces, and the build lifecycle - + diff --git a/developer/tool/build b/developer/tool/build new file mode 100755 index 0000000..1691061 --- /dev/null +++ b/developer/tool/build @@ -0,0 +1,124 @@ +#!/usr/bin/env python3 +# -*- mode: python; coding: utf-8; python-indent-offset: 2; indent-tabs-mode: nil -*- +""" +developer/tool/build - Build Orchestrator Wrapper + +This script acts as the primary entry point for staging the project. +It parses colon-separated arguments mapping specific namespaces to their +intended build commands. + +It enforces the structural convention where authored directories must +be named .. The script delegates execution to +developer/tool/build_component/. +""" + +import sys, os, subprocess, fnmatch +from typing import Dict, Tuple + +def check_environment() -> None: + setup_must_be = "developer/tool/setup" + current_setup = os.environ.get("SETUP", "") + if current_setup != setup_must_be: + print(f"developer/tool/build:: error: must be run in the {setup_must_be} environment", file=sys.stderr) + sys.exit(1) + +def get_namespaces() -> Dict[str, Tuple[str, str]]: + authored_dir = os.path.join(os.environ.get("REPO_HOME", "."), "developer", "authored") + if not os.path.isdir(authored_dir): + return {} + + namespaces = {} + for TM_item in os.listdir(authored_dir): + path = os.path.join(authored_dir, TM_item) + if os.path.isdir(path) and not TM_item.startswith("."): + parts = TM_item.rsplit(".", 1) + if len(parts) == 2: + ns = parts[0] + tool = parts[1] + namespaces[ns] = (tool, TM_item) + else: + print(f"(warning) Ignoring '{TM_item}': directory lacks the required . suffix.", file=sys.stderr) + + return dict(sorted(namespaces.items())) + +def print_usage(namespaces: Dict[str, Tuple[str, str]]) -> None: + print("Usage: build [[:]*]*\n") + print("Commands are passed directly to the component specified by the directory suffix.\n") + + print("Available namespaces:") + if namespaces: + for TM_ns, (TM_tool, TM_raw_dir) in namespaces.items(): + print(f" {TM_ns:<20} (Component: {TM_tool}, Dir: {TM_raw_dir})") + else: + print(" (No conforming namespaces currently found in authored/)") + + print("\nExamples:") + print(" build (Displays this usage message)") + print(" build ExampleGreet (Executes 'all' via its assigned component)") + print(" build Ex*:library RT:all:information (Batch execution with pattern matching)") + print(" build \"*:clean\" (Cleans all namespaces. Quotes prevent Bash expansion)") + +def run_build(cmd: str, namespace: str, tool: str, raw_dir: str) -> None: + # Route to the new build_component subdirectory + tool_path = os.path.join("tool", "build_component", tool) + + if not os.path.isfile(tool_path) or not os.access(tool_path, os.X_OK): + print(f"error: Build component '{tool}' for namespace '{namespace}' is missing or not executable at {tool_path}", file=sys.stderr) + sys.exit(1) + + env = os.environ.copy() + env["NAMESPACE"] = namespace + env["NAMESPACE_DIR"] = raw_dir + + tool_cmd = [tool_path, cmd] + + try: + subprocess.run(tool_cmd, env=env, check=True) + except subprocess.CalledProcessError as e: + print(f"Build component '{tool}' failed for namespace '{namespace}' with exit code {e.returncode}", file=sys.stderr) + sys.exit(e.returncode) + +def CLI() -> None: + check_environment() + + repo_home = os.environ.get("REPO_HOME", ".") + dev_dir = os.path.join(repo_home, "developer") + os.chdir(dev_dir) + + args = sys.argv[1:] + namespaces = get_namespaces() + + if not args or args[0] in ["usage", "help", "-h", "--help"]: + print_usage(namespaces) + sys.exit(0) + + matched_any = False + ns_keys = list(namespaces.keys()) + + for TM_arg in args: + parts = TM_arg.split(":") + pattern = parts[0] + commands = parts[1:] + + if not commands: + commands = ["all"] + + matches = fnmatch.filter(ns_keys, pattern) + + if not matches: + print(f"(warning) Pattern '{pattern}' matched no namespaces.", file=sys.stderr) + continue + + matched_any = True + for TM_ns in matches: + tool, raw_dir = namespaces[TM_ns] + for TM_cmd in commands: + run_build(TM_cmd, TM_ns, tool, raw_dir) + + if not matched_any: + sys.exit(1) + + print("build done.") + +if __name__ == "__main__": + CLI() diff --git a/developer/tool/build_component/copy b/developer/tool/build_component/copy new file mode 100755 index 0000000..f4bbd5a --- /dev/null +++ b/developer/tool/build_component/copy @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# developer/tool/copy + +set -euo pipefail +CMD="${1:-all}" + +if [ "$CMD" = "clean" ]; then + rm -rf "scratchpad/made/$NAMESPACE" + echo "copy: Cleaned scratchpad/made/$NAMESPACE" +elif [ "$CMD" = "all" ]; then + mkdir -p "scratchpad/made" + cp -au "authored/$NAMESPACE_DIR" "scratchpad/made/$NAMESPACE" + echo "copy: Staged $NAMESPACE_DIR -> scratchpad/made/$NAMESPACE" +else + echo "copy: Unrecognized command '$CMD'" + exit 1 +fi diff --git a/developer/tool/build_component/make b/developer/tool/build_component/make new file mode 100755 index 0000000..8b127bf --- /dev/null +++ b/developer/tool/build_component/make @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# developer/tool/make + +set -euo pipefail +CMD="${1:-all}" + +# The GNU Make orchestrator expects C_SOURCE_DIR to point to the raw directory +export C_SOURCE_DIR="authored/$NAMESPACE_DIR" +export KMOD_SOURCE_DIR="authored/$NAMESPACE_DIR" + +/bin/make -f tool/build_component/makefile "$CMD" diff --git a/developer/tool/makefile b/developer/tool/build_component/makefile similarity index 89% rename from developer/tool/makefile rename to developer/tool/build_component/makefile index 070c6ca..7914c0b 100644 --- a/developer/tool/makefile +++ b/developer/tool/build_component/makefile @@ -1,15 +1,9 @@ -# developer/tool/makefile - Orchestrator (Hybrid) +# developer/tool/build_component/makefile .SUFFIXES: .EXPORT_ALL_VARIABLES: RT_MAKEFILE_DP := $(REPO_HOME)/shared/tool/makefile -# If a namespace is provided, update the source directory -ifneq ($(NAMESPACE),) - C_SOURCE_DIR := authored/$(NAMESPACE) - export C_SOURCE_DIR -endif - .PHONY: usage usage: @printf "Usage: make [usage|version|information|all|lib|CLI|kmod|clean]\n" diff --git a/developer/tool/do-all b/developer/tool/do-all deleted file mode 100755 index 2350fd8..0000000 --- a/developer/tool/do-all +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash -script_afp=$(realpath "${BASH_SOURCE[0]}") - -# input guards - - setup_must_be="developer/tool/setup" - if [ "$SETUP" != "$setup_must_be" ]; then - echo "$(script_fp):: error: must be run in the $setup_must_be environment" - exit 1 - fi - -set -e -set -x - - cd "$REPO_HOME"/developer || exit 1 - # /bin/make -f tool/makefile $@ - - scratchpad clear - make - release clean - release write - -set +x -echo "$(script_fn) done." diff --git a/developer/tool/make b/developer/tool/make deleted file mode 100755 index b7e181b..0000000 --- a/developer/tool/make +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python3 -# -*- mode: python; coding: utf-8; python-indent-offset: 2; indent-tabs-mode: nil -*- -""" -developer/tool/make - Build Orchestrator Wrapper - -This script acts as the primary entry point for compiling the project. -It parses colon-separated arguments mapping specific namespace patterns -(including file globs) to their intended build commands. - -A program developer can modify this script to add custom pre-build checks, -custom argument parsing, or project-specific routing logic. -""" - -import sys ,os ,subprocess ,fnmatch -from typing import List - -def check_environment() -> None: - setup_must_be = "developer/tool/setup" - current_setup = os.environ.get("SETUP" ,"") - if( current_setup != setup_must_be ): - print(f"developer/tool/make:: error: must be run in the {setup_must_be} environment" ,file=sys.stderr) - sys.exit(1) - -def get_namespaces() -> List[str]: - authored_dir = os.path.join(os.environ.get("REPO_HOME" ,".") ,"developer" ,"authored") - if( not os.path.isdir(authored_dir) ): - return [] - - namespaces = [] - for TM_name in os.listdir(authored_dir): - path = os.path.join(authored_dir ,TM_name) - if( os.path.isdir(path) and not TM_name.startswith(".") ): - namespaces.append(TM_name) - namespaces.sort() - return namespaces - -def print_usage() -> None: - print("Usage: make [[:]*]*\n") - print("Commands:") - print(" all Build library, CLI, and kmod (Default)") - print(" library Build only the library archives") - print(" CLI Build only the CLI executables") - print(" kmod Build kernel modules") - print(" clean Remove build artifacts") - print(" information Display build environment variables\n") - - print("Available namespaces:") - namespaces = get_namespaces() - if( namespaces ): - for TM_ns in namespaces: - print(f" {TM_ns}") - else: - print(" (No namespaces currently found in authored/)") - - print("\nExamples:") - print(" make (Displays this usage message)") - print(" make ExampleGreet (Builds 'all' for ExampleGreet)") - print(" make Ex*:library G*:all:information (Builds 'library' for Ex*, 'all' and 'information' for G*)") - print(" make \"*:clean\" (Cleans all namespaces. Quotes prevent Bash expansion)") - -def run_make(cmd: str ,namespace: str) -> None: - env = os.environ.copy() - env["NAMESPACE"] = namespace - - make_cmd = ["/bin/make" ,"-f" ,"tool/makefile" ,cmd] - - try: - subprocess.run(make_cmd ,env=env ,check=True) - except subprocess.CalledProcessError as e: - print(f"make failed for namespace '{namespace}' with exit code {e.returncode}" ,file=sys.stderr) - sys.exit(e.returncode) - -def CLI() -> None: - check_environment() - - repo_home = os.environ.get("REPO_HOME" ,".") - dev_dir = os.path.join(repo_home ,"developer") - os.chdir(dev_dir) - - args = sys.argv[1:] - - if( not args or args[0] in ["usage" ,"help" ,"-h" ,"--help"] ): - print_usage() - sys.exit(0) - - namespaces = get_namespaces() - matched_any = False - - for TM_arg in args: - parts = TM_arg.split(":") - pattern = parts[0] - commands = parts[1:] - - if( not commands ): - commands = ["all"] - - matches = fnmatch.filter(namespaces ,pattern) - - if( not matches ): - print(f"(warning) Pattern '{pattern}' matched no namespaces." ,file=sys.stderr) - continue - - matched_any = True - for TM_ns in matches: - for TM_cmd in commands: - run_make(TM_cmd ,TM_ns) - - if( not matched_any ): - sys.exit(1) - - print("make done.") - -if __name__ == "__main__": - CLI() diff --git a/document/introduction_Harmony.html b/document/introduction_Harmony.html index 7d35941..f70cb72 100644 --- a/document/introduction_Harmony.html +++ b/document/introduction_Harmony.html @@ -3,10 +3,16 @@ Introduction to Harmony - + diff --git a/document/role-and-workflow_product-development.html b/document/role-and-workflow_product-development.html index 149624b..e3e55d6 100644 --- a/document/role-and-workflow_product-development.html +++ b/document/role-and-workflow_product-development.html @@ -3,10 +3,16 @@ Product development roles and workflow - + diff --git a/document/role-and-workflow_product-maintenance.html b/document/role-and-workflow_product-maintenance.html index 6063077..3a97e1b 100644 --- a/document/role-and-workflow_product-maintenance.html +++ b/document/role-and-workflow_product-maintenance.html @@ -3,10 +3,16 @@ Product maintenance roles and workflow - + diff --git a/document/setup.js b/document/setup.js deleted file mode 100644 index bbcc31b..0000000 --- a/document/setup.js +++ /dev/null @@ -1,4 +0,0 @@ -window.RT_REPO_ROOT = "../"; -document.write(''); -document.write(''); -document.write(''); diff --git a/shared/document/setup.js b/shared/document/setup.js deleted file mode 100644 index de1173d..0000000 --- a/shared/document/setup.js +++ /dev/null @@ -1,4 +0,0 @@ -window.RT_REPO_ROOT = "../../"; -document.write(''); -document.write(''); -document.write(''); diff --git a/shared/tool/penv_to_emacs b/shared/tool/env_to_emacs similarity index 100% rename from shared/tool/penv_to_emacs rename to shared/tool/env_to_emacs -- 2.20.1