From 46b15b4311de4a186ec594d42fd5e797a8b66b5c Mon Sep 17 00:00:00 2001 From: Airmancooma Date: Tue, 15 Apr 2025 18:57:01 +0200 Subject: [PATCH] =?UTF-8?q?jav=C3=ADt=C3=A1s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch-iso-builder.sh | 179 ++++++++++++++---- pkgs/custom.db | 1 - pkgs/custom.db.tar.gz | Bin 1753 -> 0 bytes pkgs/custom.files | 1 - pkgs/custom.files.tar.gz | Bin 7512 -> 0 bytes releng/airootfs/root/install-calamares.sh | 9 - releng/airootfs/root/ros-settings.sh | 6 +- .../usr/local/bin/progs/3progs.sh.desktop | 2 +- .../usr/local/bin/progs/ros-backup-restore.sh | 2 +- releng/pacman.conf | 4 +- 10 files changed, 146 insertions(+), 58 deletions(-) delete mode 120000 pkgs/custom.db delete mode 100644 pkgs/custom.db.tar.gz delete mode 120000 pkgs/custom.files delete mode 100644 pkgs/custom.files.tar.gz diff --git a/arch-iso-builder.sh b/arch-iso-builder.sh index 6196798..9272d09 100755 --- a/arch-iso-builder.sh +++ b/arch-iso-builder.sh @@ -1,67 +1,166 @@ #!/bin/bash - # Exit on error set -e - ################################################################################################################## -# Custom Arch ISO Builder Script +# Custom Arch ISO Builder Script (Linux Version) ################################################################################################################## # Get absolute path of script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -# Check if running on btrfs -if lsblk -f | grep btrfs > /dev/null 2>&1; then - echo "Warning: Building on BTRFS filesystem. Make backups before continuing." - read -p "Press Enter to continue... CTRL + C to stop" -fi - # Setting general parameters buildFolder="$SCRIPT_DIR/build" outFolder="$SCRIPT_DIR/out" +dockerImageName="arch-iso-builder-kde" +dockerContainerName="arch-iso-builder-kde-container" + +# Get current user ID and group ID +HOST_UID=$(id -u) +HOST_GID=$(id -g) + +# Check if Docker is installed +if ! command -v docker &> /dev/null; then + echo "Docker is not installed. Installing Docker..." + sudo pacman -S --noconfirm docker + + # Start and enable Docker service + echo "Starting Docker service..." + sudo systemctl start docker + sudo systemctl enable docker + + # Add current user to docker group to avoid using sudo + echo "Adding current user to docker group..." + sudo usermod -aG docker $(whoami) + + echo "Docker installation completed. You may need to log out and back in for group changes to take effect." + echo "Continuing with Docker as root for now..." +fi + +# Check if Docker daemon is running +if ! docker info &> /dev/null; then + echo "Docker daemon is not running. Starting Docker service..." + sudo systemctl start docker + + # Wait for Docker daemon to start (with timeout) + echo "Waiting for Docker daemon to start..." + max_attempts=10 + attempt=1 + while ! docker info &> /dev/null; do + if [ $attempt -gt $max_attempts ]; then + echo "Error: Docker daemon failed to start after $max_attempts attempts." + echo "Please try starting it manually with: sudo systemctl start docker" + exit 1 + fi + echo "Attempt $attempt/$max_attempts: Docker daemon not ready yet. Waiting 2 seconds..." + sleep 2 + attempt=$((attempt+1)) + done + echo "Docker daemon is now running." +fi echo "################################################################" echo "Build folder: $buildFolder" echo "Out folder : $outFolder" echo "################################################################" +echo "Building in Docker - using all CPU cores" +echo "################################################################" -# Check if archiso is installed -if ! pacman -Qi archiso &> /dev/null; then - echo "Installing archiso..." - sudo pacman -S --noconfirm archiso +# Create Docker image if it doesn't exist +if ! docker image inspect "$dockerImageName" &>/dev/null; then + echo "Creating Docker image: $dockerImageName..." + # Create temporary Dockerfile + cat > "$SCRIPT_DIR/Dockerfile" << EOF +FROM archlinux:latest + +# Update system and install required packages +RUN pacman -Syu --noconfirm && \ + pacman -S --noconfirm archiso base-devel git sudo + +# Create a build user with same UID as host user +RUN useradd -m -G wheel -u $HOST_UID builder && \ + echo '%wheel ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers + +# Set up working directory +WORKDIR /build + +# Keep container running for reuse +CMD ["/bin/bash"] +EOF + + # Build Docker image + docker build -t "$dockerImageName" -f "$SCRIPT_DIR/Dockerfile" "$SCRIPT_DIR" + + # Remove temporary Dockerfile + rm "$SCRIPT_DIR/Dockerfile" fi -# Make mkarchiso verbose -sudo sed -i 's/quiet="y"/quiet="n"/g' /usr/bin/mkarchiso +# Check if container exists +if docker container inspect "$dockerContainerName" &>/dev/null; then + # Container exists, check if it's running + if [ "$(docker container inspect -f '{{.State.Running}}' "$dockerContainerName")" != "true" ]; then + echo "Starting existing Docker container: $dockerContainerName..." + docker start "$dockerContainerName" + else + echo "Using existing running Docker container: $dockerContainerName..." + fi +else + # Container doesn't exist, create and start it + echo "Creating and starting Docker container: $dockerContainerName..." + docker run -d \ + --name "$dockerContainerName" \ + --privileged \ + --cpus="$(nproc)" \ + -v "$SCRIPT_DIR:/build" \ + "$dockerImageName" \ + tail -f /dev/null +fi -echo "Cleaning build environment..." -[ -d "$buildFolder" ] && sudo rm -rf "$buildFolder" -mkdir -p "$buildFolder" +# Create required directories +mkdir -p "$buildFolder" "$outFolder" -echo "Copying releng folder to build directory..." -cp -r "$SCRIPT_DIR/releng" "$buildFolder/" - -#echo "Cleaning pacman cache..." -#yes | sudo pacman -Scc - -echo "Creating output directory..." -mkdir -p "$outFolder" - -echo "Building ISO..." -cd "$buildFolder/releng" -sudo mkarchiso -v -w "$buildFolder" -o "$outFolder" "$PWD" - -# Save package list -echo "Saving package list..." -rename=$(date +%Y-%m-%d) -cp "$buildFolder/iso/arch/pkglist.x86_64.txt" "$outFolder/archlinux-$rename-pkglist.txt" - -echo "Cleaning build environment..." -[ -d "$buildFolder" ] && sudo rm -rf "$buildFolder" - -sudo chown -R $USER:$GROUP "$outFolder" +# Run the build process inside Docker +echo "Building ISO in Docker container..." +docker exec -it "$dockerContainerName" bash -c " + cd /build && \ + # Make mkarchiso verbose + sudo sed -i 's/quiet=\"y\"/quiet=\"n\"/g' /usr/bin/mkarchiso && \ + # Clean build environment + [ -d \"/build/build\" ] && sudo rm -rf \"/build/build\" && \ + mkdir -p \"/build/build\" && \ + # Copy releng folder + cp -r \"/build/releng\" \"/build/build/\" && \ + # Copy pkgs folder (if it exists), then generate repo db + if [ -d \"/build/pkgs\" ]; then + cp -r \"/build/pkgs\" \"/build/build/\" && \ + echo \"Copied pkgs folder to build directory\" && \ + if ls /build/build/pkgs/*.pkg.tar.* 1>/dev/null 2>&1; then + echo \"Generating local repository database (repo-add custom.db.tar.gz) ...\" && \ + sudo repo-add /build/build/pkgs/custom.db.tar.gz /build/build/pkgs/*.pkg.tar.* && \ + echo \"Local repo database created.\" + else + echo \"No .pkg.tar.* files found in pkgs. Skipping repo-add.\" + fi + else + echo \"Warning: pkgs folder not found in \$SCRIPT_DIR\" + fi && \ + # Create output directory + mkdir -p \"/build/out\" && \ + # Build ISO + cd \"/build/build/releng\" && \ + sudo mkarchiso -v -w \"/build/build\" -o \"/build/out\" \"\$PWD\" && \ + # Save package list + rename=\$(date +%Y-%m-%d) && \ + if [ -f \"/build/build/iso/arch/pkglist.x86_64.txt\" ]; then + sudo cp \"/build/build/iso/arch/pkglist.x86_64.txt\" \"/build/out/archlinux-\$rename-pkglist.txt\" + fi && \ + # Clean build environment + sudo rm -rf \"/build/build\" && \ + # Fix permissions on out folder + sudo chown -R $HOST_UID:$HOST_GID \"/build/out\" +" echo "################################################################" echo "DONE" echo "Check your out folder: $outFolder" echo "################################################################" + diff --git a/pkgs/custom.db b/pkgs/custom.db deleted file mode 120000 index 2ca137e..0000000 --- a/pkgs/custom.db +++ /dev/null @@ -1 +0,0 @@ -custom.db.tar.gz \ No newline at end of file diff --git a/pkgs/custom.db.tar.gz b/pkgs/custom.db.tar.gz deleted file mode 100644 index 7d94251fbcee057ce642886dc77179acb45e8a6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1753 zcmV;~1}6C*iwFP!000001MQewQ{y-m$NSlz!Y_GiJG%MSwNRUdbPqE$O+hm?J1<+Z zBnK16^4JQH`Sg1n=VAf_>Qf&x4-enHwGcv4 z5V-J(qX6|kH*ztH!Z5@X6YL^PLrUMd!JCid3C$bBYZyw+Z`E`4UMgSBWAphxBJtS& zQZ?dD-vR3pGWMJP#|V=h|1%bb?_BhzqxcQ|pZkCC@#J)THu^jsIFGl2cOQrU3YlL` zCqAr_|7&9$XRuQnEdLl??pS^tUtFGiIU6|ZuE2IYzC0Q@$9ZGwJe`|dmtI~>$f-RXJ?jgBr)euln-AjT9W1S}_=1+$O@48^VK^1BfU!pp1AFo-xq zD3c+^SrSW$P=W%YNCba0V_7I;9z=+$5K3txR1#)b38_ekWU7|EU0s|GoNHsM=EHC} z$<6gV^@W}dH}f0zXL@>aG(Kym|LOb`9!D2P-wm8@-P)D8IypT)9(`>G95F&+uhRtV z=cA(^MxVwP1Lvxomin%A&$*cLiK>?ibv`~jz8pBen9xgkqn2Nq+ljN_v%(WqtsCPNdD;%;^XP~1rmdLqsdCD^yy45{M(d(+)V-;>w=DB!TFwiY!?F*@`LlPT z)t{lP;HFW$@Cf`+(SL*fzl;A2Bg_AN=#l^5oc=HJAA#q0`A~rTmXEyyO1>BYXbuMZNR?$*u5Q3fOP3VZn}Z!-I8) z8z7vwwcM&Z1~))}<~6SuZkzT64X2xeR)X_i86 zhegT*h85>rMU3$fCt(~jo@4=644U&qA}&Od2pR~56^a;rh7T~-8(!<-daADj#M3z; zO=6rxA$^GvM_mz_?d$4Ue6IgU&g96t#3A zhX=%G#JK^IY;e=)c|{$W&YR9u=>j50Fn|XXUZwJA(G9)F#gs4!9at?(iT2 zo=wWRDVoCr>a#7n_xoRP_M`h>f-L{{p&tJqZ-wXJ|Cs#GVW0N$z)xoCX0CMa0cRxTX`}+h6^(=vsfajE zWvmpBB_WDSic%h<6h)9hCL}}@VTnb8L&dV-6=6XK=RX<}EU%(p8xnM{>>OZfzGyL- zmogXJ=z3)rMgAa2=#wA(v#HdX=qhzzL3K;hXVfD?CU4RoxByx6fPhue#Zg|DVbL z!!;bowY$)hd2Rd_XMj!jt_EO%d5L&H{k1CE$GbX*lX!V#Pc&4nl?R}$05Gz5TTEfo zM2Ph+1P~z<#pogVGr?k#s5A{k902raUwnG^^^M1aGHWN{QmNM(VDFrh5ULYYM& zi>bu;Ir4u$nX7sTYw!oC-(Gpg0eW~@Jg)Ppdpu8d-nf5L@Zihk!`~+}o)_)A4<7~s z-59oz@1D1O?Nad2$4|hwnM?h_t?K+178oKjRjAt~G99UT^K{9#2{kJ#D=RB2D=RB2 vD=RB2D=RB2D=RB2D=RB2D=RB2D=RB2D=RB2D=RCjzo`BVCfqtr08jt`vo>OC diff --git a/pkgs/custom.files b/pkgs/custom.files deleted file mode 120000 index 3ac51f6..0000000 --- a/pkgs/custom.files +++ /dev/null @@ -1 +0,0 @@ -custom.files.tar.gz \ No newline at end of file diff --git a/pkgs/custom.files.tar.gz b/pkgs/custom.files.tar.gz deleted file mode 100644 index f814d76cd8d6ac03bfbe4d06b0a81b09c71cbe24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7512 zcmaiSRag{&67JH{A-PC*u5^QRcb9Z1AdU3WwKUSOfOI#~OLt01OG+c%?Dd>;@AI9< zneU&OKd2yY0RJtd6H{aNRlx?R-3tb6SF@okyI4E5+|`lkBL4KkD05;@79}ZvAd23e zpos(ih=RU>9D+Tgxx3uBI6t7Z)4!x@0>s8cR^6q=4HrDZ@#}|j9RY_WPM_w^@6?BO z=x&z;$?ht_km)2Y;Y=0Ap&3$A`2Z_HG90il@O+(MlqsGWBa?;3w+Bxx6>2JfaR=MA zT0GwLGI@8ZjmDNRYCo?7FSGy);vIo`GqD1NkIv_!N~Yo7FR&+XA5SjuQgq>8!56#3 z`@Qtk$TOHyNw(|OH; z<76Fzaz=1V;RYlN`bv&n!Y0M{r#!QX?6{obwspk7O63{8MH^_y)}H{LjM7vv5;rQ0!L3+~JnfpkOAnP1;2^UUR|g z9A+)-7P4P)`th|~i!S%DEd@TL*+$+PUAl8M5QtAB!?qWFO_kf@D88_w6;c|+ zXT$Na_zsVyp~giTo^Hqqts`UVt~BLegs$3Tbi{`j^7+h%9w$l&FJfqyS-TBn9@j}`O(N9H z5X7roz9X?v=yOMFLv}nA63rEd$|3L{nsO7(EcTo1P#x-1yoU&}tZ&ea(@%GdIm*}SPP}H_1DJvgHUt8~K+2u}SDki$36z~k^na6XOIM53? zB_}rRzmL^+jhI;B-n3M~kM?d7ckV)}88hTtt8g=X$(SLkxuop!~|3 z&`R0vd$}|S5V`Qh7>G;R8vM(9;@lqEJ=V-hSkxK4GTucFMlQ@E6j$1o)bb}Zg2MiTC^S;vzeyGlaIqqe#K6AzC-KB zMkMuSj?g#ljRZOlHL}TlRUwi~>@h`je>tgN^yio^-W|21Zy9Bj^X#UM1Y@*g>=gI) z?j@eo+M@5a&D&^DH!E4F(h|!rBR916%o}My5e4#TVI_(QCCU@n_L``g>2ksIT9d-m zd`M{QafsS%aiS=kakOBO6vFBXj7t9{N7IG1Bkpy{AKh%wY6$2RK?w&P{Q@pJ0|`T_v=TQ!KK}JF+kWEuOvBA2~uuIFYTj%TN1$Z@*6AX>wQ>c@qSW|R^&OEf-8n)d)lsd;NB1nP&AnaEql8tZ z(7N(q(N?GXn3(G+xF0R&%P|_r3e5nM&?}i}ud~1CYZ8rbSRo3I#y{|!c8u6%kX5)< zMgHevt&(0@t*sdz4weu65;5&-=Tf)P8lGeeZcRMV&J{@V-N2S`P1&?`Lk0}qC&i|r znkkMc3X^Iv9qldR`u;+n^7>(9pSvuL9^s$J6xk|!f*X36PqeV&P~xCAyw-(D zJE2n@|3Z<5WIm1o6dSkP!(x!02O8w4zNfa@=ATRZr9R~N>+T;>5NE+@Q{=?9N2z1e zV(=d`UXiajXfO8Y73sdvBIf%L$*ZHx+9NG5gx{=+C=2rn%29ni$x542t)GejBb?z> zyT}|>2o$OjfKyGu%vh=E@A4;E$Ti*Xep+j%;gF}MG&Nwbmm?O|DQg=2=eOy)LZ7tt zH6Ok8MW0140j$i89Av9>f+DZ4M2^ZxG0tuz`vt1ay2TRH80|x0jSja@v8`dA9lX_K znP8FTs^`NApU$QnysMX?$K~1_n<%5bRyD{@_|bjK0Wn#!{QH$2Hg)4qb`X|}sB%p8 zJpWM)gbu-gM3K+}zzKFi6O=2Naair`r>vg}#zp%BvsuvzY-XBxt?{F)%7vZ0DLzry43a1Y?dat$ znKx>(72!^V9XfBDWe(Mzd(4^#?;4)GvK}tcV3@;Y6Wg?>4ypyRz5;JS8oxU3x*-Tp zo0A{9(|cdfD*vwQVY#-um9Eo!H8eR89WuT=Id*Cno?G#&d|uVswB{na37M=IRw}=HH>>t1H^?>_x71zo@@D%>;KS-_oyFOp+GR1LLY}_T^ncpU;Cp5&d2#PjH?`~Nqyczf4hdpPzCJbv^{mR46*iBZB zowa^Xc~cr~|N7wZ9y$Sr*~+P$25z=6Mp#Ujq%E9JKkgt<=G4I>ZbzU7+Pvb2xEEo? zIChLsRY#<3VoH_AMS@aC*rsXMaTN>pcesf76b0J_Yj?eGv3|N8iNNR{xV_6#Lj8P7 z9CrNIO<8IGZoKm9Y7P|L%T(B#*nG1UJL;@H9cY6zvEDIt{yM~z@H)!@bEPan@$_?b z7Y8r3m8P5#)PJCUNRDk9CD2^L3YlX3t3t3nm7Eymwd}#iwfA_v1fd1x89&9tv5S{k zXuiz%s`JXM^HygMR^}95?VrP$Bw8T$VM(hLb@3~3{8EYTgXiI-S+EHF0x!?#<^1JZ ze(zp_Y;hX=E-v=R1ssoR@F8JuJ|ye7^swxX%K;R}RzUn+f$?+6kxk;p+!V60vu<-{ zbN58nj~lB@EK8+WM zVsM@!eS;f8O7h5Q`HvD2;OnPK!byg2{^&Du2HoB?WC{&8X`{&R>V)K(Ii1iJ9aRO; zjyNaT^&z-qv_wNykWx!)I})B;g$2sJObI5`3x!?>WoZ687dhV zb?kc{fpu&&=2C;gIjd5kRg`rVlr9k8I%#x-w|zilK$!(cWn^;&W z$HkV~P|_HY?`KjCU1o=tf{Nt`jx48Z>iYFiBz2KcoVYYJGBJx-NfeA*d%WrX z-&C}g#7=+!hcohKo=aD^R;=;y{C<8P?q~L*KLvks+y_m;(VWl0f)k|;uOR+#&dVP^ zi{bAKs-E?c2m8QsT2)VZlqh?%rSi*dcJln_372gKZ7a@LjB|lD)nHLkviR8b@YkfS zoaK~)PuQi4*8?)Q=0e75>2&T9c8k9<4DB7W*(oL?_8r&q4BvJ(Rn3l?f5t7fvPQss z@t5<=nJ$YD*M0rsWq?nTG;#py-AFm z;Ed_7vA9g;E2mo&HY2msCEBQ|TW`+{Oj&;Y7_cP*<8b=Y!3b8AOp>u28>!P( z{{6z7Iy4&Mb-P%^9i6Vs`mI|j+L%FT&TB7BkUA;lB;_3VkX6sS$G;>!1TUeMs)vV{D10s}3SfthNlOl-+W zRLjUGGe!ow&3B)LTh9vP@w{TP;=_yUYX1Uo z2(>9(BOxNIHEZeeYKHx|_4h@zB5ANSFjL zdF|JRhBOPm?0J1Gp-H)n~!y%7->iyWueEAK|~xhhAX{p{20hyveW?^J|+%n+1uFetF~4rW758 zaD8&Kg`k1^#oHU9a>b1T=^)96wdzvGU`hLQZ-Y$+MoPxRBAu15rHvF^p;nB|p2|j) z`&ppQes-XDS4j*Jb>97@G$(X4)fXA7%VMrCI>^_0*0sU*SEpUeGFbWYEzv!CPPBLcK-YxfGOL}Stt=!}uUJ{WHN?OPBTy1IsaMQE1psm&6m46L;?nSkCcl>i^%a?Lp14-1!h3QyZYjs!m4)fQcA?HRCO8@4y=-goqwW6Z#9Y;%YiWmNQ;@wKvAx5Dlk@|%n8eLbbbk^gFAM`bKT^EimMyn>fr z`7Mf6V>*r}zw*2qOJ=jKrufK~3qV&HtX&(?kEiJh^|6 zl&yWtKfb-~;31uNXM-TLnw0<16F_}q6RJ@L43k=yvRPHBMo8nC2S^7+8=Yxt9Q9YQ|%+g_l~tiXtUx+EW;Af2!N2^m6 z!|BC7l!+ZX^glOonO%0Jrjq^lM#t!8D*Om~o3`b_yj&XK_qnQ!NPfco(pKD*>cc7Z zPS=xr=s+6xh{wU|y@2{+zef(cO*!JGxNa!==E zztQ((g-JPYJaP}QaI)TBVhj73K`mnWOr7@4FArB2Uj&G|fR;7iII}zBX~y&W=18O@ zp1dn!JMvlK9;r;+@hNbyg`;Aszi4SDpf&9V_wS$DBMsKE2W^7d^1Sc6BO}tsla#yx zU6|lvXxeKa18zTBb+~e(XZ}q6chO7DzrM|?Df&(MC(SIiC683DFU9zf=iYH}2nP+# z^-P*|f+?j3{|#%wT5!MMMbZ)#`H*501#4_d*_15WCmm7e8~kl5<9V$B5ee|~g00#y zV9C&4SjRoNTudg1cJ65>H>K>RhX+CPrPmfAWE%;qk1q}_>H#G;GVTs#uXZM~!u6GA zoBiKdDnRlAq2FKfs+VGshL(l0s~Rp8Ij0M%5rx~qB74d=;M_p6?FR`t`04YHP=D4x zFvV=dYmAJ~5!>v7k_I_w>2HbA`qmlC3MW!Y(E8e*bsOYIy=^J*CGhDllzjx(T)ckf z6@xTKH<5WLvE@RyG`#V#uJjv=yLdSqGn9EL$w+C!)aB@SxolGoJ;H2nNw@IF<8Ae* zGWQ*AafTWBUEtQd$WxKyUo=R%Kb!{%K8RREG?sITWMb*s4dlLfT_qjfbAyyywdTLL zU2mMOJDY)~L9B21RsEewiA?sO`g~hrwK+$c9;1hDp?RCQzJ-#1jAfp;Tic=rdh1f4 zz?7JKj^`<)!T!9>JHP%?&b>QTC;tS;>+^TuojM&oj7q3 z4J6%&VTW0ycr8x$v)12}Q4Wuc)Nn z&jO5vuNtCo*GsS0O$+hnD>$@D_W@<_8~vWN4ef@9eN@Z3jbrsYlTJ63zO&ABh8Md( zzs1BGPM?p6og?1v8ct9vyk#gKsirK@j}2yPFQ;U_3y|-|U$yNgI2-C^wdUcu_u#K4 zS(z8;vC(Jo$(vM@D=4FPA=awyU=Kt$$*~qfO&+UF;;gC?jCT@;;0T7*JY2VR5*{%) zip);MPha05-Et6cvZCIyi{a^~7wP|I%kyp}udeU7@{rPQmpMVD@o{12 zPjF@(2I74FBr*ft5h41S-hDKZAxidEm;0G9AA?b%IqBDR62jFPZg-Nspf?aFYuSg} zQ4-~f08?(Rbharom#Lpv=RK%Ce-g9ws3VPN1Px8Xi*C{Ob#5c|wAD#^_U-{ApeL3_ z6LT*goq+dK(05sgB&tFlmQs5|cs+x3vfbfQ`h557s)kC?r6?(}>N=e^q3lP>OJDk~ zLRBmf?Hq$`%#VZc2y=OfuYXK@a^1UBMOzcYKNTq>d0=v?aHI_aqSIBKmkk5(FrfSUnXTsQ2tQ_VrFa2QlF~bO zI@;7=W4mz|zMcRL(d=l`nG`dcWN7>&roaU}v6M^d zn!9`PW0su0lT zLwjd#kP)6A5|d%On5j_gDcwt9sX3TAE5zv!JX}6VtQg*SI{OR@_uzwrkSJa@TUp<| zh4ZzM@0khMFhB8#xSGTE6O1w#U2$Apj2+gRB-jvsYuuNL$v?$v%e>%)g*L#mJMAq%PFK5mFB)rE^=6Tno7~L8+qNDuBP|5Im%`3=9%gHe$#_j``V!dk8~u0 z>to2>nYBKi?>=qz?K8hNmS4l&G>+jV3*NOw9amYr9EN#%bv+Ou)mTS`)721*R0soi z-!d)6Wh`d&$S@C%c6L@@d6xbcuF;5Ne|xe8F&yQ&nbm^RyI-_$dAmMcAY<9 z28_!p{}o;R>h!)|HjVO9lk~n_Qq)n9G@R3`4yWMM3MrEqCzpC4elIK7;@#ErOSkw3 zqgbPwyGNSg1ykd%ejj0=PuFDu;@*niKEVKD2FQcG!#D9V#zQX!=Wp0+3p_7VhpWNW zCLzb{vFLw{z1}2$T@jCi+9T9ThH{7!aW-aC(=1