From 82d1b57aaf899768e496be03e895d8effff63621 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Fri, 5 Sep 2025 11:36:02 -0500 Subject: [PATCH] Add more architectures --- .onedev-buildspec.yml | 24 ++++++++++++++--- Packaging/Linux/build-debian-amd64.sh | 14 ---------- Packaging/Linux/build-ubuntu-jammy.sh | 35 +++++++++++++++++++++++++ Packaging/Linux/build-ubuntu-plucky.sh | 35 +++++++++++++++++++++++++ Packaging/Linux/debian/control-amd64 | 8 ------ Packaging/Linux/make-control.sh | 8 ++++++ Packaging/Linux/push-debian-amd64.sh | 6 ----- Packaging/Linux/push-ubuntu-jammy.sh | 14 ++++++++++ Packaging/Linux/push-ubuntu-plucky.sh | 14 ++++++++++ Packaging/Linux/version.sh | 1 + crosslang.png | Bin 1073 -> 4832 bytes logo.svg | 4 +-- winicon.ico | Bin 46215 -> 67758 bytes 13 files changed, 129 insertions(+), 34 deletions(-) delete mode 100644 Packaging/Linux/build-debian-amd64.sh create mode 100644 Packaging/Linux/build-ubuntu-jammy.sh create mode 100644 Packaging/Linux/build-ubuntu-plucky.sh delete mode 100644 Packaging/Linux/debian/control-amd64 create mode 100644 Packaging/Linux/make-control.sh delete mode 100644 Packaging/Linux/push-debian-amd64.sh create mode 100644 Packaging/Linux/push-ubuntu-jammy.sh create mode 100644 Packaging/Linux/push-ubuntu-plucky.sh create mode 100644 Packaging/Linux/version.sh mode change 100755 => 100644 winicon.ico diff --git a/.onedev-buildspec.yml b/.onedev-buildspec.yml index b743b4e..bc40e33 100644 --- a/.onedev-buildspec.yml +++ b/.onedev-buildspec.yml @@ -54,14 +54,30 @@ jobs: - !CommandStep name: Build and Publish Deb Package runInContainer: true - image: onedev.site.tesses.net/dependencies/debbuilder:latest + image: onedev.site.tesses.net/dependencies/debbuilder/jammy:latest interpreter: !DefaultInterpreter commands: | apt update -y - apt install -y tessesframework libffi-dev pkg-config + apt install -y tessesframework libffi-dev pkg-config tessesframework:arm64 tessesframework:armhf tessesframework:riscv64 cd Packaging/Linux - bash build-debian-amd64.sh - bash push-debian-amd64.sh + bash build-ubuntu-jammy.sh + bash push-ubuntu-jammy.sh + envVars: + - name: GITEA_AUTH + value: '@secret:GITEA_AUTH@' + useTTY: true + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !CommandStep + name: Build and Publish Deb Package + runInContainer: true + image: onedev.site.tesses.net/dependencies/debbuilder/plucky:latest + interpreter: !DefaultInterpreter + commands: | + apt update -y + apt install -y tessesframework libffi-dev pkg-config tessesframework:arm64 tessesframework:armhf tessesframework:riscv64 tessesframework:i386 + cd Packaging/Linux + bash build-ubuntu-plucky.sh + bash push-ubuntu-plucky.sh envVars: - name: GITEA_AUTH value: '@secret:GITEA_AUTH@' diff --git a/Packaging/Linux/build-debian-amd64.sh b/Packaging/Linux/build-debian-amd64.sh deleted file mode 100644 index 221a1c6..0000000 --- a/Packaging/Linux/build-debian-amd64.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -mkdir -p build -cd build -mkdir build-deb-amd64 -cmake -S ../../../ -B build-deb-amd64 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCROSSLANG_ENABLE_FFI=ON -cd build-deb-amd64 -make -j`nproc` -make install DESTDIR=../crosslang_1.0.0_amd64 -mkdir -p ../crosslang_1.0.0_amd64/DEBIAN -mkdir -p ../crosslang_1.0.0_amd64/usr/share/Tesses/CrossLang -wget -O ../crosslang_1.0.0_amd64/usr/share/Tesses/CrossLang/Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm https://downloads.tesses.net/ShellPackage.crvm -cp ../../debian/control-amd64 ../crosslang_1.0.0_amd64/DEBIAN/control -cd ../ -dpkg-deb --build crosslang_1.0.0_amd64 \ No newline at end of file diff --git a/Packaging/Linux/build-ubuntu-jammy.sh b/Packaging/Linux/build-ubuntu-jammy.sh new file mode 100644 index 0000000..80baf36 --- /dev/null +++ b/Packaging/Linux/build-ubuntu-jammy.sh @@ -0,0 +1,35 @@ +#!/bin/bash +source ./version.sh +mkdir -p build/jammy +cd build/jammy +wget -O Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm https://downloads.tesses.net/ShellPackage.crvm +mkdir build-amd64 +cmake -S ../../../../ -B build-amd64 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCROSSLANG_ENABLE_FFI=ON +cd build-amd64 +make -j`nproc` +make install DESTDIR=../crosslang_$DEB_VERSION\_amd64 +mkdir -p ../crosslang_$DEB_VERSION\_amd64/DEBIAN +bash ../../../make-control.sh ../crosslang_$DEB_VERSION\_amd64/DEBIAN/control amd64 +cd ../ +mkdir -p crosslang_$DEB_VERSION\_amd64/usr/share/Tesses/CrossLang +cp Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm crosslang_$DEB_VERSION\_amd64/usr/share/Tesses/CrossLang/Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm +dpkg-deb --build crosslang_$DEB_VERSION\_amd64 + +foreign() { + mkdir build-$1 + cmake -S ../../../../ -B build-$1 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCROSSLANG_ENABLE_FFI=ON -DCMAKE_TOOLCHAIN_FILE=/opt/toolchains/$1\.cmake + cd build-$1 + make -j`nproc` + make install DESTDIR=../crosslang_$DEB_VERSION\_$1 + mkdir -p ../crosslang_$DEB_VERSION\_$1/DEBIAN + bash ../../../make-control.sh ../crosslang_$DEB_VERSION\_$1\/DEBIAN/control $1 + cd ../ + mkdir -p crosslang_$DEB_VERSION\_$1\/usr/share/Tesses/CrossLang + cp Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm crosslang_$DEB_VERSION\_$1\/usr/share/Tesses/CrossLang/Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm + dpkg-deb --build crosslang_$DEB_VERSION\_$1 +} + +foreign arm64 +foreign armhf +foreign riscv64 + diff --git a/Packaging/Linux/build-ubuntu-plucky.sh b/Packaging/Linux/build-ubuntu-plucky.sh new file mode 100644 index 0000000..5ea2b18 --- /dev/null +++ b/Packaging/Linux/build-ubuntu-plucky.sh @@ -0,0 +1,35 @@ +#!/bin/bash +source ./version.sh +mkdir -p build/plucky +cd build/plucky +wget -O Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm https://downloads.tesses.net/ShellPackage.crvm +mkdir build-amd64 +cmake -S ../../../../ -B build-amd64 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCROSSLANG_ENABLE_FFI=ON +cd build-amd64 +make -j`nproc` +make install DESTDIR=../crosslang_$DEB_VERSION\_amd64 +mkdir -p ../crosslang_$DEB_VERSION\_amd64/DEBIAN +bash ../../../make-control.sh ../crosslang_$DEB_VERSION\_amd64/DEBIAN/control amd64 +cd ../ +mkdir -p crosslang_$DEB_VERSION\_amd64/usr/share/Tesses/CrossLang +cp Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm crosslang_$DEB_VERSION\_amd64/usr/share/Tesses/CrossLang/Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm +dpkg-deb --build crosslang_$DEB_VERSION\_amd64 + +foreign() { + mkdir build-$1 + cmake -S ../../../../ -B build-$1 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCROSSLANG_ENABLE_FFI=ON -DCMAKE_TOOLCHAIN_FILE=/opt/toolchains/$1\.cmake + cd build-$1 + make -j`nproc` + make install DESTDIR=../crosslang_$DEB_VERSION\_$1 + mkdir -p ../crosslang_$DEB_VERSION\_$1/DEBIAN + bash ../../../make-control.sh ../crosslang_$DEB_VERSION\_$1\/DEBIAN/control $1 + cd ../ + mkdir -p crosslang_$DEB_VERSION\_$1\/usr/share/Tesses/CrossLang + cp Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm crosslang_$DEB_VERSION\_$1\/usr/share/Tesses/CrossLang/Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm + dpkg-deb --build crosslang_$DEB_VERSION\_$1 +} + +foreign arm64 +foreign armhf +foreign riscv64 +foreign i386 diff --git a/Packaging/Linux/debian/control-amd64 b/Packaging/Linux/debian/control-amd64 deleted file mode 100644 index 12ba53d..0000000 --- a/Packaging/Linux/debian/control-amd64 +++ /dev/null @@ -1,8 +0,0 @@ -Package: crosslang -Version: 1.0.0 -Architecture: amd64 -Essential: no -Priority: optional -Depends: tessesframework, libffi-dev -Maintainer: Mike Nolan -Description: A programming language diff --git a/Packaging/Linux/make-control.sh b/Packaging/Linux/make-control.sh new file mode 100644 index 0000000..efb6561 --- /dev/null +++ b/Packaging/Linux/make-control.sh @@ -0,0 +1,8 @@ +echo "Package: crosslang" > "$1" +echo "Version: $DEB_VERSION" >> "$1" +echo "Architecture: $2" >> "$1" +echo "Essential: no" >> "$1" +echo "Priority: optional" >> "$1" +echo "Depends: tessesframework, libffi-dev" >> "$1" +echo "Maintainer: Mike Nolan" >> "$1" +echo "Description: A programming language" >> "$1" \ No newline at end of file diff --git a/Packaging/Linux/push-debian-amd64.sh b/Packaging/Linux/push-debian-amd64.sh deleted file mode 100644 index 9ae8699..0000000 --- a/Packaging/Linux/push-debian-amd64.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -curl --user tesses50:$GITEA_AUTH -X DELETE \ - https://git.tesseslanguage.com/api/packages/tesses50/debian/pool/jammy/main/crosslang/1.0.0/amd64 -curl --user tesses50:$GITEA_AUTH \ - --upload-file build/crosslang_1.0.0_amd64.deb \ - https://git.tesseslanguage.com/api/packages/tesses50/debian/pool/jammy/main/upload diff --git a/Packaging/Linux/push-ubuntu-jammy.sh b/Packaging/Linux/push-ubuntu-jammy.sh new file mode 100644 index 0000000..8ddd4f8 --- /dev/null +++ b/Packaging/Linux/push-ubuntu-jammy.sh @@ -0,0 +1,14 @@ +#!/bin/bash +source ./version.sh +upload() { + curl --user tesses50:$GITEA_AUTH -X DELETE \ + https://git.tesseslanguage.com/api/packages/tesses50/debian/pool/jammy/main/crosslang/$DEB_VERSION/$1 + curl --user tesses50:$GITEA_AUTH \ + --upload-file build/jammy/crosslang/$DEB_VERSION\_$1\.deb \ + https://git.tesseslanguage.com/api/packages/tesses50/debian/pool/jammy/main/upload +} +upload amd64 +upload arm64 +upload armhf +upload riscv64 + diff --git a/Packaging/Linux/push-ubuntu-plucky.sh b/Packaging/Linux/push-ubuntu-plucky.sh new file mode 100644 index 0000000..9305e06 --- /dev/null +++ b/Packaging/Linux/push-ubuntu-plucky.sh @@ -0,0 +1,14 @@ +#!/bin/bash +source ./version.sh +upload() { + curl --user tesses50:$GITEA_AUTH -X DELETE \ + https://git.tesseslanguage.com/api/packages/tesses50/debian/pool/plucky/main/crosslang/$DEB_VERSION/$1 + curl --user tesses50:$GITEA_AUTH \ + --upload-file build/plucky/crosslang/$DEB_VERSION\_$1\.deb \ + https://git.tesseslanguage.com/api/packages/tesses50/debian/pool/plucky/main/upload +} +upload amd64 +upload arm64 +upload armhf +upload riscv64 +upload i386 diff --git a/Packaging/Linux/version.sh b/Packaging/Linux/version.sh new file mode 100644 index 0000000..293fb1c --- /dev/null +++ b/Packaging/Linux/version.sh @@ -0,0 +1 @@ +export DEB_VERSION=1.0.0 \ No newline at end of file diff --git a/crosslang.png b/crosslang.png index e3805eb9d3f2a162513696ff4d408ec4cf23b621..0291e4e3bcaf1cb0f5aba6baf471796ed4c3e8f3 100644 GIT binary patch literal 4832 zcmcIoS5%Whw@tza1VTvy1cXpSQ@YY?=pa%=EFet;3nf%BQEHG5p{RiLCZN(pnt;^M zq*)PAAOrL@35FrZB}M1u(h3XBKJ7bEVNLu; zsu9)Fdbfb)36#1(B|b>pLh7C-QI2&HO5%KZw732HMdVcXedb;~S+4}+9-$Td;hZrb z-!>PeazRmhF>X&a1ZmxL@E6_Z-FKVl<{i4Z`X?5@VoTmMJlSB2muDz~pSCDm7N(TBl{BBTaOc3%~Gye7QkZ8Ex6MNl@E$F@99~ zs$ckEzRZU#A`8#xA+?{$!61G^PqJQ?&x2aHqQ3s@e{CO?*k`{i!9b9=7ZS%>tD*nv6-mN<&fDPbQXLuyonDPTr6m8dfn%5Pt zNhe++drUpEFyM0GPoTpfb5KMSA(r`(m8@Wa*f#u-1sK7)`4weOD7|}(ea;JWmrDex z>?u+$*^q(xidzxg8tXRw=pDP_QnO{2%(bHHWP2<4?2|~Vz(#9YUTGrx?xSaK+*QqJ z*`DI8@&-q(S-LuvG449~%w9*oVh=Z#it_^EwQrf8^9N+ip8VQ+H5+0{(D;F;&~>qX ze|2+-N0rHiHmpvFK^m%Gk zx@dCHsm7B*=@M=Zi!261bz!naXP*8sv;(J@5ApahARLq7Dv!%j8;)|`=y296);>>- zdv{L)xv#7(AulWQEbFe7;2W8F%gRt+nfQL%Rw6R6sLn6kqjY7crs1Us|MgPl4x0J} zldSTMA|#GRMjRWF;}h5BwAha$rdMLBvLT&qlEpI_%$DT*7QLs%+abT$@v*&3%EVFf z8EK&xT@@=*^4f;@`(b*zOUW?=F`Et%YZm>q?2}s&A5rACU()W8D)gs<=A$At>t>|8 z!6|-8L00Gd8Kou@@(wCEjpfKtM)XM>9wJDSE^LMgfRvpL8Q8OqQmLD zaF6IRWw(IswC0~U<1ETC6)tMdFMfT@%qbqQ7*Wofwoqamf!A4cF+|@C3>}o<<(gTI zppJ(X+4Y0}m&~iO@5<8!SUsJ7in`yK+_3gpNL-?V30`Xwv>Dc2;%>Aif_NWZ$lD_3 zgz3~JZ@$Q3GOWoxqt|rS5^Oc@^9YhobD1K|*$&Giy}JX7HIv6EtGvR}%cAm6pMp(_ zgGR!o-h|W-+8i|6ViMCvie;WzdSOx zi00>Czrt|SwMVo9=9-Z-J@kN%wqU?3)Q2Qa@VA|gQSn%*V3?kX88DK z^*Vt;1VVK^)H+pVY5Leazw6?SqGT=o(gYO`0hz(#J0Mkm98TFjPc^pMzGU)DwOt*s z&odmvGx=~%3Jaoe!$0pPQ{d8&p6puykiu|nyOQ_DvavAirs4=QQaN+PedS%lipy3+ zFu&!2H8kcmH%s7r$9-P3c5i3+_s9RoB_jx>bZ#TldAlFjyWSF~m!_hZS%8#}tTM#d z9|bMG#@0@OeapnQ5!5WkAf@o2P?8*I+X8vq;7UYMwryaINiA&zaRLbDHiPl*Aspr`X&<(_5n{m5(m3>C!aU!U>^cnk~5f zZeq_}SryW(-n*XED?N?Q%NM720!Ng-yk~^~UpKTKprWFTtL@=^u|OWmK@OY|!|v%D z;L=;TrN34`oz-h65vf-yLQlyefBfUiiuVi(0Px8sAfptgT%l8c4+^H`7hZo1o=xg& zzu(NZWdHiOZpiQ4EJNeYWdCo3@vRYxt@x?^-|DF?-}If%xk+Pt4R&tqH9R2OFPw@9 zXhjV<(3)egbcADIq>FTdQT#8-R6W+fnZKa&x0*`L{4foCx6Z;Cq67*w5&$3-pU3L# zq)!XkJxVg`9Z;;W9$SAbD(~foyx82J=bBkCBEGvdNERP&JdS@_o@XW*lg?!&9jTkj zELLC;EaeI~76iCt7+=qFmfu!XqIE?)B#7Ohn}%v!%_!2{2-%qtQm8OQa5&WL4r4#H zSmk`=eUgqYzJ!fvoM;NTbr$Hot7)HAB_5gH_qgCT+{nm;MSoE|{0ZnSy!4iQlfPrB zCb7=*M1iHY|7@%ISztt>&Tnz^=Jv?xzgxj?2y*!%nhBs5(>n}bg&D3^KSzYfMw@@Z z=>SM`F2!pUs_=mC`g-dtmV00M8UFmx7(ZrJCoyK1Bf~<$(~-dri*H<%YIsH!)Q@-hM$j zTy{_=;mHDICHss*(6v-Qic5P{!8WMK_~xs!jF?NP>bYv{O%8`j9G}+l_DV6VOs4a0j43TOdIj@IYYUsqc573&jzT64sN z2GxH!V3ks~P8ER6==P3|juvKT_dj~{s2&onhrz^E+ZKd7LMZ6MR88DAUq>uye>bJ+ z&kGr>i;M8hwKwsBJqO`p8ovCiU%os~SQ<#&V$zoh2fK_28l^82=>7LpUJp$en#jH4 z4g=iY>p*(zNMZ*0T7e7WAKL;~13tDsPna^?OY31$VGGZ$@`@Wp=}UuyxK=5y&B4zy zUU7u6i0)LE>Y9V@IZx!N#qo;j^1lHkD<9H1EoV1hkjCC9r z!+#ki@sC%|09#>^-X6Hvt?xIjI5{=78V?ifNFZ#j(BC|?A&liHMKEbg|FJrWiR7z4 zT-tCG-{)GETLV6JB-GX_{+O;4nJUuD-TpBzk`2;M2n|x6YoE3J3Uu^+O{`xBz_hfB z=T2;DosD7R7N(Jt`3S3%MUosbm$lhfZ_RsvI^uYivqAD!7xFDX)wSTBP<>KxWe*sE z70oGf*QI88EH1iYX!$s>ZrqR3fks$}z8v=S;NAMrO^M=}68t)7TQvYquM|nz3$Moq zNg*MJBQMr(DId4M62>+kK+jzqK5KxD?cN7vBz>RwkSks0KdVHkfa{^)QyuZ`j3Zfm zpnza*SJ;QJEwR!QUwL#Dc}+LfOhG+zv={Yt5;f(tQiqs*@p*lk;MOG>vzIjejXJ@Op{9XOGd;~< z$4k7d`eGN~>^8o-Ja57kWoVcQBuO_2cKOO-Ly*B^vg9~rsi@GD`)0>(JOJo+ zF(#r6=FY(pU*>ofX^4FR#f4CB^Iy(ahllZ}!E4)Ya?y>e6{-5kc8i%0D^%`YSjm=J zz7JxG_`PRt+RBMV7eyItykjFJ3?~gYDHlj_(aL44i3`MG*1#-T^f782KUF~&Id!BQ zH{RCJnB%L}f(`_FTWl2E>k@NK-J{FuTa$>N3?N;zm1@p)oqItKGd!PDZ2G3WF9(#s zl3+vdXpIk?{K3mD2>BrxI3-NN(;?!7M-L+D5#QSy+ndmiHrPpkWnRk|)r(yxNPkhKetV9afU=5CAb;`Q%TkKY z%sCkm9_p;S@>R|`^2p#dociE#a8SmDDZz6>-L?tKO+0vWRjXGiUa#iQTT-}nVMAGL zDZ@u8Y>4+O&C~v<-$D^%LpPkZm=Y+CnBP9S>rZuW)rbc-{MHqcpP>oSc{xMm?YK9k z4Opk3ny@ITkG7bKcF#QJ+Y$7>bz!(<4%DG`n@ISx{9t$GwV$re8|^H@UJ={&ZGNi69Hi6#qFC`5XyyjP)~+PXBB>PbBJBN z$v%XKmg%H`bp6t;^GQ%ur#liYbJ67pjvnHyi%M%TEOJN7a-gAw8z!-mW3(RNpY@Vi8286I?)uyh?|c^{`UzSWaiHB}A0)!wi&ldDYJ zA!dw7I&^(SQ+G_0+a{+cWEZnvj;f--aHriKK{&^upoCh36tWm&FmlP1q`RSGoO7aI zU*{!3jgqvbCo(iBl>hXIP;(f7fQxUq^Y_Cp_`IH)e>8~n9z-pH{s~g3GfE};wud2o zj!u5Q>N{6(OhhbHU*ART`uOFIxV4`k5G3KB7f_i`WKzN$A6{|>J~$sW#7Y9ch1}6T ztSPbakIg&MQ_RLbi?rA&Z>G>R$U7u118FVT4 z;c)E^W2~nT#Ae5`B9op?g{bR~q-?CJ8q1w*9O>3%{aDO<_sVE^RzPvQn%I#VjTGiI zX$oTo^GoJEIZmHcr^?~pa1|eH-W^gbu=3lS(Dz6sK3qoktrFwBPXNEC5bco$_US7n z$o@%+z@q}onCrClKW9$+od@5 zlTGg9wWh~8s#6WZrV*w*bmxg<=UBnm-SGI*o>G~$s$2vw>)U<<;(g-gh^8Y#p7g@S zVoUqrPf3H+=%&Cv~})$*gJ64bEBb$|9)alRedLYNN=;DAAyI(N9FT zZIbNX;ZbyW_v@TC@J8@6E}Z zRx71@ElLacwjt-?tM>KVDt_E@JpbHBX-V0SwWZI`^S_h+XZzlQoh5W-?Unp>mi617 z|9RW``QPu__v_~Dw<)SiZ4jYSyNGE|PK_zb>8p;NW4umxsUQi;|Izz>~>G zJ~+Iv_vGVmdAB&JLg7gNsfUdh?9|%Woj%Wyk>mJ!5-4~^?exRO10QZWCH(MFG^kl7 zAYm8G!82czrR}^()2fH{b)|KmHpU*#_K0`q5(we_f5YHGlk~O_kU+Z%%hbcstQXW- zt{#qNzo5z@eE2-`hTXeg`}_Ngo5?I@b@1U>);6DAfhT5qL5~?juA%%nj>ch|Z7AUg(?XP0c$vfN6R(+UxfgsEC`+F|^UBT|Kxoz#?Xa5=2?4M?@ z$?)a&21`gZfyjm*oQx2j591HhvVA|4uIJ0&V&+({SjqcPZWXJ*V}7HgZ>kJSZeJDV z04uCw+pu@<+xEi?BaS~V)NLr}d1BdCog#L?=zinQ`U%yFi@tC#gfWA>0nT{&-42 zoJWZ4m@hy`38uUP7lWORl|F;9yqxT=t?&N)Y}Dmom?3MIBeU(_d#U;NmYg+xe*W8> z{d*_aCo&v)d3WmP>F(#==h*C(KhLz`i^~bw19RU0kYs32Nf|K z?SJ!ikN$-pixtfoO#6QwzcxG)i7&Q6feJ=^DV(9DduMHI8mhLM +b`?>k8#sV2d7K7$ERK1g5- z!v=#IQ%?sE*@mMJR|~d&cs%*@;q7mw;+h}cR_|1ADk+xPH%mv+;7`t`h65kI8ge#1 zoPC^yr7d56Dll!Hh=rMKz?l}Q{%(0&s_y1 z?!~d?o!q|1w1WHUg6G)^f