From 5b3cb422e0124f81ab648f17abd005338ea7bfdc Mon Sep 17 00:00:00 2001 From: Crony Akatsuki Date: Sat, 10 May 2025 06:34:13 +0200 Subject: [PATCH] feat(servers): add thor. --- flake.nix | 20 ++++++++++++ hosts/thor/configuration.nix | 41 +++++++++++++++++++++++ hosts/thor/disk-config.nix | 54 +++++++++++++++++++++++++++++++ modules/servers/thor/default.nix | 1 + secrets/navidrome.age | Bin 875 -> 985 bytes secrets/rclone.age | 26 ++++++++------- secrets/secrets.nix | 3 +- secrets/traefik.age | 27 +++++++++------- secrets/wg-desktop.age | Bin 1005 -> 1115 bytes secrets/wg-heimdall.age | Bin 1206 -> 1316 bytes 10 files changed, 147 insertions(+), 25 deletions(-) create mode 100644 hosts/thor/configuration.nix create mode 100644 hosts/thor/disk-config.nix create mode 100644 modules/servers/thor/default.nix diff --git a/flake.nix b/flake.nix index 6bd72d7..9c0cd67 100644 --- a/flake.nix +++ b/flake.nix @@ -123,6 +123,15 @@ path = deploy-rs.lib.aarch64-linux.activate.nixos self.nixosConfigurations.bragi; }; }; + + thor = { + hostname = "thor"; + profiles.system = { + sshUser = "root"; + user = "root"; + path = deploy-rs.lib.aarch64-linux.activate.nixos self.nixosConfigurations.thor; + }; + }; }; nixOnDroidConfigurations.default = nix-on-droid.lib.nixOnDroidConfiguration { @@ -181,6 +190,17 @@ ]; }; + thor = nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + modules = [ + disko.nixosModules.disko + agenix.nixosModules.default + ./hosts/thor/configuration.nix + ./modules/servers/general + ./modules/servers/thor + ]; + }; + nixos = nixpkgs.lib.nixosSystem { specialArgs = {inherit inputs;}; modules = [ diff --git a/hosts/thor/configuration.nix b/hosts/thor/configuration.nix new file mode 100644 index 0000000..cda9fca --- /dev/null +++ b/hosts/thor/configuration.nix @@ -0,0 +1,41 @@ +{ + modulesPath, + lib, + pkgs, + ... +}: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + (modulesPath + "/profiles/qemu-guest.nix") + ./disk-config.nix + ]; + + networking.hostName = "thor"; + + boot.loader.grub = { + efiSupport = true; + efiInstallAsRemovable = true; + }; + + environment.systemPackages = map lib.lowPrio [ + pkgs.curl + pkgs.neovim + pkgs.gitMinimal + ]; + + networking.useNetworkd = true; + systemd.network.enable = true; + systemd.network.networks."10-wan" = { + matchConfig.Name = "enp1s0"; # either ens3 or enp1s0 depending on system, check 'ip addr' + networkConfig.DHCP = "ipv4"; + address = [ + # replace this address with the one assigned to your instance + "2a01:4f9:c013:ce0d::1/64" + ]; + routes = [ + {Gateway = "fe80::1";} + ]; + }; + + system.stateVersion = "24.05"; +} diff --git a/hosts/thor/disk-config.nix b/hosts/thor/disk-config.nix new file mode 100644 index 0000000..8f36ed4 --- /dev/null +++ b/hosts/thor/disk-config.nix @@ -0,0 +1,54 @@ +{lib, ...}: { + disko.devices = { + disk.disk1 = { + device = lib.mkDefault "/dev/sda"; + type = "disk"; + content = { + type = "gpt"; + partitions = { + boot = { + name = "boot"; + size = "1M"; + type = "EF02"; + }; + esp = { + name = "ESP"; + size = "500M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + }; + root = { + name = "root"; + size = "100%"; + content = { + type = "lvm_pv"; + vg = "pool"; + }; + }; + }; + }; + }; + lvm_vg = { + pool = { + type = "lvm_vg"; + lvs = { + root = { + size = "100%FREE"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + mountOptions = [ + "defaults" + ]; + }; + }; + }; + }; + }; + }; +} diff --git a/modules/servers/thor/default.nix b/modules/servers/thor/default.nix new file mode 100644 index 0000000..6462967 --- /dev/null +++ b/modules/servers/thor/default.nix @@ -0,0 +1 @@ +{...}: {} diff --git a/secrets/navidrome.age b/secrets/navidrome.age index 01d239e86431f5b0f6adb307f41517a008e75bea..723c0ae0527091d7d0df851bdadfd2e5ac0870ad 100644 GIT binary patch delta 898 zcmaFOc9VUAPQ68DqM=VkdYWlbMMkc3iF2+`UPeV&WR!)eWqFEIdSQl{K~%bvv3Eph zF_(p}ON5t!i@QOHyFpZXQJz~+R8B@-kfBdnp=EYiYLQQRx?{Gtv1ycRIhU@TLUD11 zZfc5=si~o*f|+(kU_qdQUut?tMXr05zf(YRp}DcAr(1}7MR1mjQI=D>fp4IHa-~Uf zc#2P1s%v;8SAMWXPO4!^kzZhmZ&a~?pHqHby17q9c4WSpd4P+Fb49MRzH3^Fr*~-a z#E;_PnSmi;j=^qKL4{5pS%t<%MOB_|#wF!ZeidHD0mi0bK3T3gsij4x7S0x2d9IO# zB^KpI`tD^FF4;!f8D+7nZ~L9ekq|Y#bNpBVR^-q;~B;4Q_Kr0%batf zBFl_YES$we#L&?9~AjG{~!PqRwC?~tfDB7bR!ElLnF&7r!conXCre{?TXZ(GM5O`{D7$Z;?f+m?fwr@Zw9pcIVDrj%g8m&t-3_90>}2AR9XMx!30{%Pmh%{q}9L zvQ5FJ_8(0JTl9F}JJt!jX_}e)dBG*-=Z9w2Uyj%k*mYayaQ6?^N!Lu{?-sp&efz4H zAnT%p&WRtFtdPCqS6!!6Cad=NEc;?NR)*(!OCP9ByjWaOv1ZM=2Y=Y?&fE>GdRNAJ z_r>8vlhV5D6B#n(SkHPn{e0q9zo1wWki~{lc!NdXt2I( zAeVn-k#|V3sbP?hrCE7-qF9q+v!emvd;Sr9oP7gl|?!PFhk$WMWxpQks!xXoO{Us#C6qcZpkgzDcl8S+cju z#E;_PhWSoaewLZp>3+u9m7z)QzKIc~z6R;WDURlWE=4IWIUdH95uS!6*^Z7}iKP|k zfjPn21)kwq<^}%lzJ7rg#@b;4QTfS+WroQH{<)#qnO=q7o>88Y;~B;4tJ2&nQwog<6FtK5SkigR7jLn$pqKguUiAv7Q(+%!AD(AX!vFvTgb zD7@Y$%h4$;H(NW>G{P*aBFfPy+sUlTBQGGskt?|{($yy|Ik?i#Im)mk*Evc*(JwvH zEjQoW($g%xq&PRABqPZ)*U>A)fJ;|bSHaTLQa{ZoHz2*xH^->JsnDy~&^tfNF*_yO zB`ec1-O|<2-88ZyqpBh>kZb+JTILo1E}X0P^J`>lma0~KAfMvvd8u)({VUx!ekv#2 zEX5et$*SE?sbxM}>ycBewuWmi)8DP4%qitg3Q@0?`*y89c)dNiRNJ#`SF-AP7JFTl zinj1}pQx`kgXp89HC&}~2d>j!sKi>^#aJhtj$%aWVfn)R2}mU*wQdiD0p@()-4 z8b2-a;4HqrBGS6iK~8YuXMuVL`(-|C8y=WB?VEB*QSz&o>89|4yYmAXvx#ZO7m7?CUeH{`xa-3@8 ssh-ed25519 2P4nKw qCVX3JMWNQLJXRSVASI2wq4833CucZ8dkp7SHItiVBs -np04RcZXq7QnSTG68F2tk7nfaB8yKATEO+qVEZQJ4/E --> ssh-ed25519 6+hQpQ rWsDHc5UWMkyjSkc+S/Y0G5c4sn2nm8uiwdHiFLxCVI -oIU9myTYDBjYE7K7YEH3D9CJ4hNkxKJBqxtEkbSulpA --> ssh-ed25519 l/ODWA y/9+1Qy6hby0aCMikyadjl28Ft66G44pBQhJcmbvxnk -sRFnG61r72tDGYz+WRnNFmnLpFQ9+ZfsZj+6nMAtEV8 --> ssh-ed25519 7+5K3Q Yk4gRMySBLoMZx1PLolMXB5mr0vl8jhemD5gWDhX4nQ -BCr8IzKrJAq4i++4tstMQdBax08naE6zXcBc5NG2PM4 --> ssh-ed25519 fd/ZLQ DvoaL9OybtLLMfZ5PjrxZ65rrWoj1V+GVvqfBUOyJmE -eiNmcBTdSm7ppdRzo8CGgc7aYF0zINhwlSCdJjtHb1o ---- 1nEcpDp4PWeRi0LHEgeLKaq1OyLFPv5oi4viiTPpXXQ -@ՇM,eAEn*w?Iu)w^G?(Mڒњ-hAƂfCOF_58g̛8UYMe0UCs+D( 2͐xU!]u@8C"& v :A \ No newline at end of file +-> ssh-ed25519 2P4nKw xvG3qjGJWZpTbNq0guN3Mn4MqSgwCpzFRAn+OG0TEyc +ngxenbGpR5AwMXFGOB64bGFdhSCKLJd8ZIgzm0dqbIo +-> ssh-ed25519 6+hQpQ VETaeP/m2gn8NzkmUarz+jkexePixAVkG6i0u+ZPQAM +fYp1Z9wUoc/ieSAFdVEYCrNO5DnZOJY0V06PwGZL24c +-> ssh-ed25519 l/ODWA PdPEB2bWErAlOMpOuzD0aJEl3KHuaWaZnuLU3G791FA +eZ9Ijf6SotwarAPDERkxCinb4mUwyanXV3FkIcIOQpU +-> ssh-ed25519 7+5K3Q TL7zp0FMvGYfREdryz9aP5EFBZgEg4ai63cLJnlFxEw +HXhYexDp3FQrZHOKSiSEhauzHzTDTKbYUZ72WcHt1IE +-> ssh-ed25519 Ow0TGw RjQw98YVsi7+rctOh9/8O+LhYbrP5EJCVuqTccAJ7HQ +jymtMzvlutJytzB8oybAXwZvlu0q2Y/iUt6Ujk8iSig +-> ssh-ed25519 fd/ZLQ T14OqJ/S+A66mJ6uUoxn46uDTjhBNs0cShI9cUCAKn4 +kAhVCdDE+ZYYaQRI4Wi8M1ZRub7TPPIQ0ey1UO2IhEY +--- 8a01nOAShMmHz6+ZTqJPCbGRMieGraVEpFLieSRbEcY +(sXjv%|=T }!;%c]'>֭XDω57[&#&!Tzw oPWFmW#c"P,4(%]0zqwgmE˳sX1Ȝi-`:*3qa7S \ No newline at end of file diff --git a/secrets/secrets.nix b/secrets/secrets.nix index d097065..c0752c7 100644 --- a/secrets/secrets.nix +++ b/secrets/secrets.nix @@ -4,6 +4,7 @@ let loki = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF+xpWCoBEO/pzAwS1ZZEsiLSarvSVkdxQEo49xma2PV"; baldur = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOvZ7Z8GS4+1+9D6u/BDit4Eij5Ubbii2dzJ/+ecT8iR"; bragi = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBKMV2vqlDvIkUefl5oEuVjVtjgFLEXyDKX2LWhVQsWT"; + thor = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHZGQLUhyLwmkTYhSccqO8umQJN0QHk6YaD863x7lcGv"; # USERS root = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBJLduAXHWJiglmfRfkBGKffzVWkJP6porxIzw6+Zz3W crony@cronyakatsuki.xyz"; @@ -11,7 +12,7 @@ let users = [ root ]; - systems = [heimdall loki baldur bragi]; + systems = [heimdall loki baldur bragi thor]; in { "traefik.age".publicKeys = systems ++ users; "wg-heimdall.age".publicKeys = systems ++ users; diff --git a/secrets/traefik.age b/secrets/traefik.age index 836d85f..9b740bb 100644 --- a/secrets/traefik.age +++ b/secrets/traefik.age @@ -1,13 +1,16 @@ age-encryption.org/v1 --> ssh-ed25519 2P4nKw 3TKXwwnX2Ocpo2pVsCU82KypJ7wFNO9OJlurMdRgo3A -qfmmz4Hn/UI7Aj0pyJOCschk5phTeycLPs9rJr0RZyA --> ssh-ed25519 6+hQpQ FGRJpBdyvap0x6L9YXyZRFR59b5IgPzQZGUlmuxHQFg -sySpx8dzSKOVDSaj+YNPYdBZLBK4QvKOrIkYFVqY8TQ --> ssh-ed25519 l/ODWA zTs7AxW1tGA9qrTUYHd2ZRzZygJKXim4ufyW98iHj0I -HZn8hf/wrXEnoqu5yRrVY+DlzALiBjOhpEzY1P4/G/E --> ssh-ed25519 7+5K3Q o1lJBgbwoAgNnMYVdAZHmgyPtpg/OdyLaW3w5dsIE1A -tlDLwrvkdrXbSNgWa4DU8bUI4DwbtduOmMAasGppou8 --> ssh-ed25519 fd/ZLQ AXw77EFOBLHtjDPbNgR7/wW3o9heWqiwMxGwvy12i2g -f06IAJYuaeydMN6QNB8GLv5O8Qf/5NYjZNSt8CEn370 ---- BXQO69Tj8g+ooq7mzNA+soBDjtbb9eu58BpTf+FugyA - bd.y\"J5>H@Xͱ|%<\|[ZY*2vǕGD1 j[ ;=&T)6&l1bESgƿ{,m٫Vv{"OEHUIs1*mg9|J?r)蛙bۤgtP5#+[M} ؎b \ No newline at end of file +-> ssh-ed25519 2P4nKw lWJjHKYXGRRcNN2xrObreMJ+FTuUluF2KNBIpPT44Tc +d0fGThyRx/fDeW2hHqd+yugr+QzXUkphVgs7OQ3mG6E +-> ssh-ed25519 6+hQpQ 1+DKXrD3/RScn2pXu0Wm/3ql1v0kWdiZsan4UOvHnEE +cXEDwSEaGbBUA920OLBq6beeJEexOz5iQRMyRwLSYzg +-> ssh-ed25519 l/ODWA YAuYlX3Ch8UJCvNYh5DM90G0TTP/AkaDUFfyw4SeTiI +Y27RNP0ReuRofqld6l3Q/bpRadfLuRgzLyUmXYPjjRg +-> ssh-ed25519 7+5K3Q VMW97s3k3cCh/CEqNUMb8cbkkbT/YTnMJd9GqcTW4Dk +FtizTODpAGyE44ODkZZMjLJ+kX11dKyVeKoC8PKAkf4 +-> ssh-ed25519 Ow0TGw WnrtP1dCRn2xJ47KbeaVGNvb4CNsZ1BI43TMu3EOYRU +QYrBaza+uHBpQvEVgRBaz90VKtgp3+ULiCY9cQ/OT3w +-> ssh-ed25519 fd/ZLQ VOWE6H7Qe+aBiheT88uEN37JNP5aHesQSHFzCMQ0+38 +vOdQovVfMdqF2YptVwKYHWLkifF5s6bJPik1hFVIPkE +--- hLmH7wM59VfM49mr+srk1I6Qa7ghTOGy06Uo03u4bTc +ȇ=>3AčiNqחzZ1w vԗ? bKq4.ƺ[k-^icp ~ v1eҀM&dag&޹N#ro0x&\jQgdΙ~i4GIb-iKWOd Dk$?̓#^'o55w%,$" +f4X$:l \ No newline at end of file diff --git a/secrets/wg-desktop.age b/secrets/wg-desktop.age index 16a7d0b3e717f9d2542cd613cb63a115dbd84224..a415364e654f22f2a32b9b64e889fcc46f5e3c74 100644 GIT binary patch delta 1028 zcmaFMew$;0PQ9t0cA`$2F3a=8Ih4jzELTOIc~n`F5bn4*@lr^{>6cQ z9;F4jMlMnA8NMOq{yBl+CYgQ_6*(4}C3#tinL!1C&R#}|!H%Aj;~B;4L(9?}gPk+; zojpv7Q;iZ`@=Sc3oP0x^a{XOAB7>YPLVXN;v<-v8gWa;ZGAvTfEA;asOhZ$$OMSzF z&9gJz-K)}EsfVn(Zn*Pq#`Xf#WKw~ovSKaJ2%w5s30jf)4MFaFxV(GEWj+U zD80%tJuxvUB`wILu*}CP)7Lf2VDec;iFyxzgJkV|v$Tq|^iY4Z)Ij5kO4F!peUp%o zGA9>B0@AU9uE|+AV`~qiZ3xiZcm%@rN568$N?GTe>{iGs~)QqHjr!r&j zRG-M~jKF|=E?r$+1rK)%S5psvS8YfAeE%X-FAr@K3tyMWTo(%yk3`etRKMWJiuw$5 zZS(N3Vy^Wn^EO6BAPtC?IPOLs3>xygy;;QRew zS1%S}GC6sxJ5tW(>|ciOUineicg|UHCGw!O!?{Pftnz<-7r*4*wMD^W>w!H#+^qhz z9^Sn1gW`!p-)#2&Y;6SC3HI{H)U><(PCwFTNShS$@O2Z3x7MaA61;)v+yK`mRcNxyA+G`k5xN9@_uh~ z^83eoV%FQ4Vh`CWb}^ytz17f_xk<0XXbM6 zIbPLKb4XgXem=uSrbTy~67Pn(gw9r|%dkCTS~lC!L(^9xeZ_Ryt|sP1=OyRF{VWkk zk4aB@vSDh~qc)k0DKpFWIK22$6LI2tf9tiw{Gqky0@SU%nsuf=%l;wlA)9^7Ku4IN zNvC{6+w9}v&R_nt{@87>b}#qmcgeS6k2x4mvtmyTG5z-0+kr>(2FE7Rxaq7ydL?22 Dz-o+F delta 936 zcmcc3@s@ppPQ87>~NO7dUuU}DRnUA-nTdt?KYfe>&Z)uWOP^wQsZYj=y396 zs%vUhNo0iqS3rJRYNBa?giJ1}3c?QKH6>0AI9+k<4!TBlPiRRhHrEcCvVc|Ij$&Trh;~B;43zBj&T~i9P z^RkUILj9_YQ`7QYEWFCxjWgVQ@;!61+}+$N!wnvh>YOeZo!9Ln$pqKguUi!6d&--?=n5J6*rPF(Sz_ zB&yyd*f_jAC`DV}w7Af(qBzOGFDk68BHuFHf-BuU&A=}-FEb$Ax70r;Bsa|0!ot|o z&?8JcB+RkQ&Cp0Yz|GAu%FsP6l1o=tS0UKY$*s7sBFm+;Bq!3}&onLD)IF;rFxk`4 zFW)8IFwxf~E7QQurPv@lkgKQt&)li0yQ}KIs?81mb-(Ad#ho;}?YG4eZQP$#>FZq! z-Cw&d&-n5gcQ&OpQxYy6Rx1&S5_q;MP_I>C{?`L6UA2dPmUiB*(O#?K707pddTZ+C zuHK1vy-daCPw4-d_~ZOW;f}K_w)b^*-DE0WyywAH{Wa-7i{z?q7WA?`?l@7Nz~Rrt zWg>Ilz1~NABHz8|YGsX^?baC@tzUMA(?%`tqQMH*XopQ__TT?Le|wA3C5zbXBX!>2 zJ~rP|yscZFvX&&wy{Wa-sDhC#5^X9KSF>jr~WRa6oSJY13R@%yEm9TaTzlycIuJNzQ zY$0inW|+;_jXiqR;A_{pMw#;`g?W$O`E&l%vE4dpJ1&{)DPBBK`aQWl_~s(VU-Pb| P?{ZC?^RcJn!)jgtW;b^i diff --git a/secrets/wg-heimdall.age b/secrets/wg-heimdall.age index eb32fec35f490e8e4fd23b7283a3b108550086eb..f9e195ebe1c0e27d45a20d31abb3e1305fef7659 100644 GIT binary patch delta 1231 zcmdnSxrA$iPJN+vNxD;rk6~b%v5U7~ez;?JM3RAzW0k3Pp^0OrS9oe-Xl{9_WnzX$ zI+vqMMux9%MTKRCPnBbsnVV-oSZR59hLe7Bd2nuqt3{HrN3LUUVL1KPNzLTq0Rg`=B z#E;_PS>BNr#_1-0rpcL^soEAssaawE`B8yICE70e`o>W~L8&I;A+E;xriR5_zFC<@ z$*C@xuH}_Zo)wio*%78*0Uqft-g)K*86J6-CYBkF;l=tnNk*QN;~B;4qr8es%JnNu zi^E+i+)DiO+(L2^eZ8HsEpw6#65X;Y%(D~2-SSf1d|WKJvQ4~m%o2?P%5(EW{DYm{ zqO^-cDlENylhb@tqWn#a41!WpjncghQll_J$-mqn#Jya>+%UpJ+c(NM(Kys1Dk{^( z(k-acrz|Bq*ek~`JuKPS$R(>F+~3J9#4FH*D?l(!kNQ(kCUmFv~H?t;8uM zDzC^pG&3p3JijorGR-x-D!?Of@>xdl`XtvhkK)t_zsl^&aEnL_*Pvv_uv}9=H~;*k zl6%WS6|sg0vw0QZLI&pTrDP*Yw1^Bu9gQ zAdisn!btyOE?r$+h2+YJ!bHbFM{UE5)cgX=(BhEXs?^X_Z@(f_!$O~+%F2}TdJCuW zG@}wTPcEIP4^4OS5ATvW;_S89V7}npj}evyQ+GVP^MG~YcjoVvnf&d#m3a)0bPv1C z`4+0?bNQxa31{k5*75d*1x1GmGhQp->uzk) z`}(B#`+l=Cwok*K)W2Rnu|eT?vddCAhOM0&pIFSyTeW8L(KkFVhh8h@>s%-;Q)^zZpU-G%q=l~o>G>(jeA z@lsxN_L2IPw*AHmj)yu#w)3x2V%xGLHt4RdpK0)Qi&^4aY+2iP%~rqY@YSbXX(li%Y^Xa1$H zPQTTBpWoc<*2_xbYo>W+aoZ*(=x_}!yAwIg!M&kTk?G7-sj7V!Z{JurhQ%GRu>7}oBs9urf{l*f1Bwd<) z<0?_#MBmx%9|9I{ztf@3dH&kT$N-s$WpRCxe?-2t9o;Vc?aV>FsqZi6KeS;nOA);n J6Mt+64*)0)`JMm( delta 1139 zcmZ3&wT*LvPQ8DjQMh|%RdJx3zG0-Nv74KBQkrL#xpTN{SV%}^h*`duTbNfwnU6u9 zFIQn{P;r2vXOUZqiK%5-qNQ_cke8dASCV;wfw@I`uB(@RMTNOvSaGC_E0?aFLUD11 zZfc5=si~o*f|+(kU_qdQi+QR+u}`?6ucdQ|S+a#|j$4XxKCZ2AQ`98jr;~B;44ZJg>EG?2U zObXnCGfO-S%u{`WJoA0Bo%15X%`(HYGYtG4)6+7&997oJ&_%SHZC$#LO!&(kNYSliOc zvn12cAUwOYqC7%BJUJsJl&i(Gans+wVV~=JxNn{MS2+Jq&OGxwo_Cv7ELWTe{pc7S za)rO^!s)ql9CPgA`g?E5X&nDjb5b{{XuHDIgZ{t5)qZ!U8|~jTzw8T7Ux#`Si!tZ4 z&)*%S{F4^#aPPk6ohh_VrN8Isti=7hb95|xp7m-+Yj8*xRJ=bN_D9t3=$3m^dd@8F zdd9d#xxUEgIg2aPxr#kLzn=dW4_doi`AC<+-i>C@Ck0G;yLk!o?6oI$p6uZ9xTMaw zMXIPaXkX~TEu4pr`CoJXedmcObAU-``T4cNj7@Ix(~52!Ir}iK&uE6g=a9#Twlyx< zC$L6f)6yp!;(UZx&6%R~x>7WTYij?EinN+Nlk>UrFXYYBuYc8h^zNS6l@_KiKkhp3 z{;0Mp?(SlyfYRAF%~l=zbue_r(PQuGFI4aEuutH9a9aN7*8sl0?J2vR`8JwOIP`M$ zk4LILQ6ek{tnG zC5_j9d2!C}`l+)phx@T>y?V*3HCKygr`}kadCTMb&ZScyc&nK={Bj81vS