From 3085df1710ed0625b3a8a86c937f87bd438cc527 Mon Sep 17 00:00:00 2001 From: Jack O'Sullivan Date: Fri, 10 Jun 2022 23:25:55 +0100 Subject: [PATCH] nixos: Initial Synapse --- .../vms/shill/containers/chatterbox.nix | 88 ++++++++++++++++-- .../vms/shill/containers/colony-psql.nix | 6 ++ .../colony/vms/shill/containers/default.nix | 1 + nixos/boxes/colony/vms/shill/default.nix | 1 + nixos/modules/tmproot.nix | 9 ++ secrets/cloudflare-credentials.conf.age | Bin 501 -> 507 bytes secrets/dhparams.pem.age | Bin 1126 -> 1216 bytes secrets/pdns-file-records.key.age | Bin 760 -> 869 bytes secrets/synapse.yaml.age | 18 ++-- secrets/user-passwd.txt.age | 40 ++++---- secrets/vaultwarden.env.age | 20 ++-- 11 files changed, 134 insertions(+), 49 deletions(-) diff --git a/nixos/boxes/colony/vms/shill/containers/chatterbox.nix b/nixos/boxes/colony/vms/shill/containers/chatterbox.nix index 414bf95..ecb5d39 100644 --- a/nixos/boxes/colony/vms/shill/containers/chatterbox.nix +++ b/nixos/boxes/colony/vms/shill/containers/chatterbox.nix @@ -15,7 +15,7 @@ }; }; - configuration = { lib, pkgs, config, assignments, ... }: + configuration = { lib, pkgs, config, assignments, allAssignments, ... }: let inherit (lib) mkMerge mkIf; inherit (lib.my) networkdAssignment; @@ -28,8 +28,11 @@ server.enable = true; secrets = { - #key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICkly/tnPmoX05lDjEpQOkllPqYA0PY92pOKqvx8Po02"; - files."synapse.yaml" = {}; + key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP1ajgIF5V14bf9Zol567k2ieeg1zEd1vJ6gXkydE5UT"; + files."synapse.yaml" = { + owner = "matrix-synapse"; + group = "matrix-synapse"; + }; }; firewall = { @@ -42,13 +45,80 @@ }; services = { - #matrix-synapse = { - # enable = true; - # withJemalloc = true; - # settings = { + matrix-synapse = { + enable = true; + withJemalloc = true; - # }; - #}; + extraConfigFiles = [ config.age.secrets."synapse.yaml".path ]; + settings = { + server_name = "nul.ie"; + public_baseurl = "https://matrix.nul.ie"; + admin_contact = "dev@nul.ie"; + prescence.enabled = true; + + listeners = [ + { + port = 8008; + type = "http"; + tls = false; + x_forwarded = true; + resources = [ + { + compress = false; + names = [ "client" "federation" ]; + } + ]; + } + { + port = 9000; + bind_addresses = [ "127.0.0.1" "::1" ]; + type = "manhole"; + + # The NixOS module has defaults for these that we need to override since they don't make sense here + tls = false; + resources = []; + } + ]; + # Even public options must be in the secret file because options are only merged at the top level. + # Let's just override the defaults in the base config to keep Nix happy + database = { + name = "sqlite3"; + args.database = "/dev/null"; + }; + + #media_store_path = "/var/lib/synapse-media"; + max_upload_size = "1024M"; + dynamic_thumbnails = true; + url_preview_enabled = true; + url_preview_ip_range_blacklist = [ + "127.0.0.0/8" + "10.0.0.0/8" + "172.16.0.0/12" + "192.168.0.0/16" + "100.64.0.0/10" + "192.0.0.0/24" + "169.254.0.0/16" + "192.88.99.0/24" + "198.18.0.0/15" + "192.0.2.0/24" + "198.51.100.0/24" + "203.0.113.0/24" + "224.0.0.0/4" + "::1/128" + "fe80::/10" + "fc00::/7" + "2001:db8::/32" + "ff00::/8" + "fec0::/10" + ] ++ (with lib.my.colony.prefixes; [ all.v4 all.v6 ]); + url_preview_ip_range_whitelist = + with allAssignments.middleman.internal; + [ ipv4.address ipv6.address ]; + + enable_registration = false; + allow_guest_access = false; + }; + }; }; } (mkIf config.my.build.isDevVM { diff --git a/nixos/boxes/colony/vms/shill/containers/colony-psql.nix b/nixos/boxes/colony/vms/shill/containers/colony-psql.nix index 7d1cf21..50b9869 100644 --- a/nixos/boxes/colony/vms/shill/containers/colony-psql.nix +++ b/nixos/boxes/colony/vms/shill/containers/colony-psql.nix @@ -6,6 +6,7 @@ assignments = { internal = { name = "colony-psql-ctr"; + altNames = [ "colony-psql" ]; domain = lib.my.colony.domain; ipv4.address = "${lib.my.colony.start.ctrs.v4}4"; ipv6 = { @@ -45,6 +46,11 @@ package = pkgs.postgresql_14; enable = true; enableTCPIP = true; + + authentication = with lib.my.colony.prefixes; '' + host all all ${all.v4} md5 + host all all ${all.v6} md5 + ''; ensureUsers = [ { name = "root"; diff --git a/nixos/boxes/colony/vms/shill/containers/default.nix b/nixos/boxes/colony/vms/shill/containers/default.nix index 4e17621..3fe62eb 100644 --- a/nixos/boxes/colony/vms/shill/containers/default.nix +++ b/nixos/boxes/colony/vms/shill/containers/default.nix @@ -3,5 +3,6 @@ ./middleman ./vaultwarden.nix ./colony-psql.nix + ./chatterbox.nix ]; } diff --git a/nixos/boxes/colony/vms/shill/default.nix b/nixos/boxes/colony/vms/shill/default.nix index a41cf0c..364b6af 100644 --- a/nixos/boxes/colony/vms/shill/default.nix +++ b/nixos/boxes/colony/vms/shill/default.nix @@ -104,6 +104,7 @@ middleman = {}; vaultwarden = {}; colony-psql = {}; + chatterbox = {}; }; }; } diff --git a/nixos/modules/tmproot.nix b/nixos/modules/tmproot.nix index da5f14a..bfadae5 100644 --- a/nixos/modules/tmproot.nix +++ b/nixos/modules/tmproot.nix @@ -245,6 +245,15 @@ in } ]; }) + (mkIf config.services.matrix-synapse.enable { + my.tmproot.persistence.config.directories = [ + { + directory = config.services.matrix-synapse.dataDir; + user = "matrix-synapse"; + group = "matrix-synapse"; + } + ]; + }) (mkIf config.my.build.isDevVM { fileSystems = mkVMOverride { # Hijack the "root" device for persistence in the VM diff --git a/secrets/cloudflare-credentials.conf.age b/secrets/cloudflare-credentials.conf.age index 5fc75c3c19aca3fdfbdcc4d9f07c77d22347c84f..ff62f699aff2e32e84d64d3f471d524a484cdcf3 100644 GIT binary patch delta 473 zcmV;~0Ve+S1N#GzEPq*PcttBuXKPGGIWQ|pH)=0Ic}QAVIB;}tR#-?vPd9C4Xhm*D zNN0IOX9_h*H)u*_NOn&$M_EX9Pcd{vYH(~fb4@{KI89X|BFilG~QY%nwFl0GID@ajmOip-5LT4~jOJz1m3N1b$BRe)) zD`+x(EoX9NVRL05Jt0m}A}=u@K2SGSAb25sYENehWlUE@YgjczZ$(*5S~68kXKGS0 zdNwpoNMtKlWq&X>Vs3UZWO_71RSGRFEg(2kWJp9*MpZXLNLgw^X?j6Rb!Smfcx7%= zSygXmZ8$?vaZO=VG(&Z1O$x~N;Q`C-t&>=Ftt*o-L-!a-;095wdG-S*w6(-l3?;Ah z9<@NP0=Zh3FIl8iE1qgi*Y69rEe7q{hyaxTsn{#4M^an1<}6{5L`oVVH&29x@kGEFDqj~O?Opl zNmXn{V+wa#GdEL5GiyyyK}L2qVmDY-b5T!3SW0Xxc5hcNIZ0?`Zb)KdMrKlEMmSMJX;?N{3N1b$S1oc~ zQ&>VRXL4m>b7deSb8;zkNLe6rDO@3WAaH0(X+SOtX*qdHa570_dRaF|FEn#SST#&- zdUQ#WmDHFj50dQD7JGk0=wXGw5! zGEiAnSxZwyQ%O+@$MQrTB}vIO3%9#s9DfU8n;sjpOu^KaV5H6r@CVkuFNFrRQ@*^UHm&J}NcOjlM|cS2EWP;+WBNlY|) zH8pB#a|&l;FE&qVN;x@cYjARBSTb`^N=7kjcsX%)V@PXrFKT*fZZ&O0W_NB;I0`L3 zAXqXrH8D9Ld3SMjNqJ3KXlyw~XHzhEV{UVIb#riXV?tO#Rex?-D_T@;LRnc%Q(9PA z3R+P~acF5XV_GsYR#SOUYBxnrVns}KF>G}&bW>_HN>*`UZA@fGO<6fr3N1b$S5P4} zL3k@$EoX9NVRK~)a4RruQ&V_ZQb%fOd3tp>b4hYcYDH{$Vm4_nGDSEsIb>8(Ycne} za&<6KXKQgmd4EYod3H%xXl!#gR7OZxMG7=SHds`3Lv2w_cQ|5EZBKSZG)FLVL}M{# zNpxglMrc}Xb7yR4ZZJ|bYiLDdT1HxVPEiUiEiE8WSXXFzPe^5MOe<_kGc`k6bU8FL zPf$xwdTL@MIHrhM`@+=wcN~6~ZNg~ybea{u%<$hXt`&IoMrs6YS?U-KlG|TD}N(tN7|@F{-h14N#Ey04qD|86+YiM zu|%#zDD5!1FbOvf^8F6#<&b#MOY%|kjQbUDnu?KL)f8GUT{X`1`=*)XjQp5A^Gf3s z9rgYNP#yBDTbszg$K@eaP2B%=#V_bq*!_zg`j98h{4+#VQ}jLUCJlA>NYOBS`H^C~ zLx1CIAf+&jzN^y}opP2RSOxxenxM<9gjR3(xT0x6oQyi+Ak9^r5f82xA@ldjuscuz zdb-rq7^{)EF@)hloCuP;FtP>C;a&M&E+UKUE)EDZa-;Xb9;KMSMM~zqSR{E_?IM+@ z?5I=fjI0kuD*Rk!%h*e+p*=2c)qb-MC4XWcJ!Z}tp;o*REZE_jgN$?9t#o5L;KFm` zvQEGuvKx~B;O{hksr0(u1$saHwNY;8fQ|YvS>6pBUHINn?346ezR_BrX1u!sR!jq} zNvm*<9P>)%Sh_1@RwUhM7V=RuokNN=UeA094G+PV1ST|wd=nt8o=g|8x(J;K-+v!5 z5F#H|m0hOd;DENJO}TNg*_+L|tX16EM3x8-FXSP}=lm@T zj#3SC#RGJVFTQPp>|u}pAP7IMa9~Ysx**sd$-MV=$Sw{ydGH9BLP8VsI{O5Q1TyTM zJ*}2Fy?1#&_!xPv3Y?i=ielKL1sz9`BO2{GHMY2?xB-dei&l%Gu&&o1=NL-Xd)%mg C`W9sX delta 1097 zcmV-P1h)IY3FZipEPr`WXmwRysgX>vH^5adKjJSU5sxbboh6Ic`Q(VsukDH%(V> z3S}^MNO)#-H8pH7ad<~&H&9S7M{G<*dN^})RzgcuG)!c3FG*K2IATO|3N1b$S1dXs zYb|GTWnpt=AS!S|a5+y`3U66PQdK!=S8PU3MrcNDK~QFOGGk{7EiEk|X;VxwRCiKt zZAnjNa7cD&H-9&EVNO{!I9OuRmtZRL3u{Bj&S^=W_^?N|u{~)X;fVw!zmzlX zmPNpv+o)s1kCEcm<;i3?gRY!Ru(P)hbE(}Wvs=&xPa@h7?6%7LGEY87jFzXpU>$!N=z@NPxESSdMhRh;vqWi z92WTibfh32lXk~vvLLpad$m^T%I(ityn08U>*$2Fvh6FZ-Ksb}5otT8<|F!R&hb`e zY{%Rb0PKZU<;>D4z~7Bz{s}q`JU#vAg&dbBt$)53D03J3l{TBM>BDZ~3*NidBU&=6 zVxAJTsi2ze;W6CsVv2=7j+o)h06gL22uN{T0j&`ijdM2>qMb|yGt>#C^bLboyVgDJV z{(pprA1YdJhWop~VRHbq)FoaTeuiz|yKlUwt1h58sm&y!L-(o15hx!;r^MH>@-Xy7 zrdXV_Zq+<&UB)DCBei3%8FgOrzwb_nli);flU?+&7vVR&?ZAyOX^-76O7L0Xg6Mlz zp^HbDP=Z1!t{; z6dK1H2*pF^g+p*Tzl~Da3(~b3|G9!JmcKY!Yf1tV^E4ulFHQ3g^fL6)i^{QLZR06ld*vfEy*E-O$&Fsm633EiZA@r PMf2BqXQUx*a-7pF*@5=i diff --git a/secrets/pdns-file-records.key.age b/secrets/pdns-file-records.key.age index 1da9c9f5bf68c447596c0824b7eb78b86aa277dd..47e41529821551fd3e31f7d848c490315f17f16c 100644 GIT binary patch delta 838 zcmV-M1G)V81?2{iEPr}KK`~V?PiJ^FN_KZjW=T+UHA6TsFj7``NL5Z)FlI+`T6R}s zLvChgO$udfN=JG*FIQ<=GBPoERAfhDQFuf-PcLe1L2EcpNmE2nRZ4AkT46#kV+t)k zAXqXrH8D9LSx`r8WetMSpEDdURA*bSro-b6GH1 z3UXt1Vp4ELc4|ymWL0@&PETY?YiKk~O*Te2Y%5wYLu7SVX<0{dM=(xN3N1b$O;l=P zFJ>)ga%Ew2Wgu{2en@;cJ7Nk(Sad^hL1|7-V=+`$Ic`#DOhhkGbT4pbcUCV!Nl0dS zNP1OQc2QY1Nq=EdSyf9ncu-?@P%w9FHEefSGg*3JN_8+eW?4^7Om;a<3V+SkJq)n(xuv=Hq3QRo5v7Cv zOV<(ZABa<7wxPRX^d5~)NC$(ogva07z$12s#!!GenX!SFKcR0=6WvD(g!zu6*;(b^ zf3bV7v`oqsmn3~%{?Q~DvN+UDoDS2mXD?KAZhDxVL9i=rHbGs(>v_c(t9YNiYF&zX zTg*(E?|&5ms_32cu86d`rgI}_#<@EFTM1_tF#Fvn^#^jn`BIs!p>?>)Nwp?1cwNf+ zRs!luu>EN7YN-|`Z`Frn6JGW?E|#!DpRn3eZ;r%l*txHoPZ^yxR)`DSaOQDaUA?BhfjDN7NV(E@a%Z_mWyE+pqJ{x4S&}bkRQ~ZG2|KFP{6~KfLPz zI3Hm=xglB4_Vl$c267TC0x8Az3*W;sDacuZ_(Rdh%< zFf~I{K?-_9L2qzbD^N&vZB#{OD{)LOQ$uPmb4p5iYHDdVIWtssRxfgEK|)q-Sqd#a zAXqXrH8D9LD_K=_Oi)sBQDH)QMKWeedT(%2Y-veMNJ>aJP=8NjZhBIBF?UaROI9;5 z3Ti`fN@+o4Xk}JWD{xa-GJ1DnD|lu_YdJ7+HFq#JcW-S|PE=DzS!!fB3N1b$MJIPH zXL4m>b7cxeX=_YmG&E*+cXmfqH(5AjGB$EaaBB)JEiE8wLRLXoH*-;ALuhGOT0>1j zL}E5!YiMt4Ykx~CbxA>JPcdP7MK(idYHc(M3oAbLUkWEZ3l0L>hV=Ejo#y#iqUPM@ zO%v)CFC%5qNIf?iY@}GVa>h4GTOD<`zb^=@>Bmck1EdHOWA+|?HQL6jl6TSl6xV&j z2k~~ABK4gCqPy^*vc|HmMVoCucPZ`?G zKHNH#7k}Ogd;nbq=&5~`_6kSPB-`?WI4&JQCnBira`5|yi`5iQ*6S#}tnGR-WJOq}1H;!(3EOUnv+G&DFKl6yXn4m=zB`07Ogi#;J1 K_&y3eIu;@#W;CAw diff --git a/secrets/synapse.yaml.age b/secrets/synapse.yaml.age index 59dc14e..401ac7b 100644 --- a/secrets/synapse.yaml.age +++ b/secrets/synapse.yaml.age @@ -1,10 +1,10 @@ age-encryption.org/v1 --> ssh-ed25519 FAIX7A 65LI0Fvoezo5osErygJNYp5d8LhvABZpD5SjjBlvCBc -jsez8jYQjFgR66hJtj3NfD+ugkfuc5CQ2PpLatOstMY --> X25519 JpPee9xg9YoHwwUk8OCYuZQJdq0yYhsJtUFHwumHvSc -MZUCvUjHCS65dBvT/7eNtT+cydIAqa7BAXGBJrP1/Yg --> j-grease `YENpG`_ -7kJXScC89DIP3niPa5sEf8rQQfXCTztTrAyhq8fv/eIFUhWqE1P7TebzPCuE6XeA -p0WTNfd0xsZJ7d+PIK/HLhPFRS2wKaYfHXXCYtJsFK/tbRz522f9O/YH ---- EI8mVA7L/VX9EBG3hvME3sznKAVacRjqRFbcGDhvhSM -;'ɏK}9D,h:l ssh-ed25519 FAIX7A 1P9UO3/Yn0osO1W4zxm6SgkJwGYaqyYGU38QpNtN3nM +GZcsY52UYsuJUEAFL4j4kxV2A2D4iS4JQE9iOSZHMn4 +-> X25519 inCZutigxecNFFhLn6+PNTHdwn3VLnR7TIeEF1ROpRU +43LkgwpJozQXBU+mBnj9QW2u6Ay2LOprYI5Al2v6LNk +-> 3Y-grease +6Fn9H5/BnHQhLEhAYCJ/sJ2h9/29Bvt9BTEuWF6M071W9YG+g1CLgApN3dW4pFkl +oTeaF9xeMPv/wdBWRyZjbg +--- TCIr5y4Z9uWZexDP4jb1o2k/h6rd/7O2UHjPxNaTjm0 +xf9dgh`N;fr`$џOP; 抑AtꩱilTK%M:Ȏ/'5-xELly@ NH/cby0kUUS"|A=*۲z. \ No newline at end of file diff --git a/secrets/user-passwd.txt.age b/secrets/user-passwd.txt.age index 743018f..ea1ed56 100644 --- a/secrets/user-passwd.txt.age +++ b/secrets/user-passwd.txt.age @@ -1,21 +1,21 @@ age-encryption.org/v1 --> ssh-ed25519 SKXJUw CsKtHFHS/9MNiNGT/O+bxx+btotr9riXwJWgHAplcXQ -W6kL/S4y1aFstYGOIhrwJfXx2uhswH3uSdyJzRCAtHM --> ssh-ed25519 wbGjmA 7em05wqUq9PA9CZ9MlnNSxdeknvN0lrS0yYxUTtGawE -TyAI9Pu0DJodhdT5sBodIaBxPg3VBmXcq18IIHtFs3I --> ssh-ed25519 B9K/XQ ZAVd8XBFPOJ6hC2WunnkGmEifYOHcUhYQIi4gvsLajc -5hPdqVBWi9OtqQPyq4gz4CX6vVpuLGQURufTCnDNYgM --> ssh-ed25519 H162lQ wKj8wzesVAOzm5o4VB9NEBSr+xlr0VjR/A48NL+6uls -lpmijvrflnMeVT6R2YcUmLFljFxZsTeVziErcQ7GKuk --> ssh-ed25519 b6YMqg ykVDRMnyBsh6+HN/A/5lT3K36wgJZggIcjlsPSc3byM -HF5qzv2Lf2s87OHi/0++shAjF4+xr5NAHL/9lncMHRU --> ssh-ed25519 Lqn0Yw 4+F3gxpsI9QnbCHWpLz29CUj3RAeXSH7PHkuFw3E7T8 -yzZAylZ7QAV7ufljd4VEBys8sNd8JodWqN5f0JzRI/g --> X25519 YMeCBP/yDOGPs04ihx7NkZSpqEotUHKs3yMRkg9JWAI -Li1FOGm6NIAPGVQRj3HYiyKiR/ZSk35vnOK/ia59IQU --> tjxC(g-grease -817wn107V7X7yjCXvKBMt/55PWcEYdm6ZDOdoZC5A3s+iRFVpLvGmxlkEVxQCqsA -K4WG/Ye5PC/raEjsS8/6AqHs4E+JSfuZjm47fVclbu3kp8Yu3BaLEa9glucxBQbc -X0A ---- C/lfT3RLOrCR2mOv6Q0aDyEVUrq4GzdVpHhj7Ly2ov4 -&Ǩq) Wh&3M}]REe%tX*Xl 0hl[@]8'G>peSfݙPJY۔FLz1?"ݲε)G_ \ No newline at end of file +-> ssh-ed25519 FAIX7A PkWyLLijQZgNyFSvjEcWkYTYIyOpbxsu69hczCKx1g4 +qGruVJb5SjTNm6EhRMbaO+aZc8hXQdU9jcfRN4CVAC8 +-> ssh-ed25519 SKXJUw JIFQcXOdHl/9uLcvmriKLBmtXEHKrKUII99KgOkqPFI +ODO2TuI3VYWcPJnwAmpQi38a8CXV0C6pAFwd5otrh+w +-> ssh-ed25519 wbGjmA rZm8T6+N1cw3vpXrtrAIufUdjTpzu8wXLsERZAjVwHQ +MdfU6LwTZpiBEJwVvsY+BPUmN+955Ty1Xc6c0PfwH+o +-> ssh-ed25519 B9K/XQ XQiWYiYiEcVrrcjkel5TDwZSxIommrxk1cVNvDoiFSo +EE7VDprouGZ/MpNFPjhh7TSr1jzr0ZeIOmmO3G6JAeU +-> ssh-ed25519 H162lQ ce5lAulJBRSzeCKnJBNuSy1HE1R5TG20Wdx5kavPNTg +BPXI69PEmSP0BmO3f8MAPqGyBR29hts798DbevMUATg +-> ssh-ed25519 b6YMqg w0JygLSUv/Y5j1zWlUY5zoeTwX3s+URX1yJxc99rg1Y +01VfQiWgldlCBNPTBoudyKVpXXfVbrXhaVMq+MBFhVM +-> ssh-ed25519 Lqn0Yw TWRasWvKcfxukcFX95KJ6QnRwNfJSF/RCz40IrsfSGY +/CSufoexTjNSVK225VjCD3pm/z2gK6Moud7fST9tjuc +-> X25519 bFnUlqUCBjMxEPrBiMpOeQTqR4qpmBQhMzIvtLKuHUk +PEYj+yEbPfUWDKRTsYMUPUcM+i3KZ0Zu0YQ4JE3zFEE +-> T-grease NFmx4 ssh-ed25519 Lqn0Yw 527NE0GoR6SQTwb1hmgpxn4APXMb2oW3/VNjjbwtnx8 -9jWxt9FYx8G4pyPVtU8mp33QuurzQHI4Npt+79ej2qU --> X25519 wW5ClCuDyZvFJOA/aeitGr5yr29DOdULnUlPRz1sDk0 -db70JP2sIH3T8NsMHqnTCGNE1tY7PyjGKOKmzNE632Q --> zGd-grease * _!K!a] 3C\vn -sOkK0VjY4v3j6XcG ---- CHljgmb9kcrECrIM2Ve+Wp5AkGWeIQb0Bhh9sgEtD5U -K=XK9 ,qj)=Gau{N V,2N$w -kzO @#Fǝ -̻CF3PzNG,3Pw]-VʞoԞmz -e \ No newline at end of file +-> ssh-ed25519 Lqn0Yw COtpnkiIOsiZ6sI7GpZW6DSrMdP+V8SFm+G6VSx6Tlg +foNXyNZ/u5RVNdijDQr0mGn5BQaPDhOqLhD9gxEP5e4 +-> X25519 xbW4hHBb8lJ9fIwnRsfBpTmLGO74ZBkwmdXpWQ1H9CA +ucFk4TvPIxiQNyuNgQ/dHKy+p9LvePmwWLYd2e60AT0 +-> "d-grease +7zl7veXnoG49diEebRbI1ok+U0CMgjo7AQK8rsCsOa4tDR8L460m4CfSOSEMEqzK +QjEjuxC9NY0liwnNsRLNWccKxa3V1LQLL68RhA +--- exAOdELiQNGSJcweG5qVkiX4SLNMq8x9uNyp77pCrWA +B; iAo,ULb(Gea?H؋Ɖfhz+^ij0%ΫKā3azsU]L!YD>v|'W!!K' \ No newline at end of file