Compare commits

..
Author SHA1 Message Date
stb
816c7497fa Merge branch 'main' into jitsi-docker-compose-role
All checks were successful
/ build (pull_request) Successful in 30s
/ Ansible Lint (push) Successful in 5m9s
/ Ansible Lint (pull_request) Successful in 5m46s
2026-10-08 11:12:38 +02:00
8bf5690275 Customize with our logos
All checks were successful
/ build (pull_request) Successful in 30s
/ Ansible Lint (push) Successful in 2m58s
/ Ansible Lint (pull_request) Successful in 3m15s
2026-10-08 10:50:48 +02:00
610a1faca8 Allow UI customization 2026-10-08 10:50:23 +02:00
86e793c624 Use jitsi role to configure jitsi
All checks were successful
/ Ansible Lint (push) Successful in 3m47s
/ build (pull_request) Successful in 44s
/ Ansible Lint (pull_request) Successful in 3m45s
The host has been manually cleaned up (removed old packages and config) and this config has been deployed already.
2026-10-08 10:24:38 +02:00
dbac5ede16 Add a role for Jitsi in Docker Compose
We need this role to follow the recommended deployment approach from https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker/

This role enables us to keep our config and customizations separate from releases of the Compose setup the Jitsi project publishs.
2026-10-08 10:23:17 +02:00
28 changed files with 965 additions and 493 deletions

View file

@ -44,7 +44,6 @@ keys:
- &host_auth_dns_ansible_pull_age_key age18zgt4y2sd75hxnpe333zz39048ctxpr0q8a3uqh3jajjkyawsdrq8yg5ve - &host_auth_dns_ansible_pull_age_key age18zgt4y2sd75hxnpe333zz39048ctxpr0q8a3uqh3jajjkyawsdrq8yg5ve
- &host_forgejo_runner_ansible_pull_age_key age1az0k6cadssk6r8qcqxfr8cyu5mndy59pwt8yqq6w065ew6au4ezsmg2vkf - &host_forgejo_runner_ansible_pull_age_key age1az0k6cadssk6r8qcqxfr8cyu5mndy59pwt8yqq6w065ew6au4ezsmg2vkf
- &host_forgejo_runner_external_ansible_pull_age_key age1pq1jqrcp3te50xugmv5wst3s9ahj0d38rfktxt43wlcqz7vnwyn3y2h7kyfr6rckrvmuk9m7yvp4efjnfsuxx6d8r9gn222r2eal5593arywrjwrgeypf745wyuvf3z2xk9tm5fgnwckftuvdggk66fph59rw69nt5dpjeewuww4vzt9gs4xelre952s7zjz56qv8tvesg2c89sp8rmy9dvhwfd6tucjhs6sjr6yp2njjra2u6w7c7f0sch3rwkw3wf2dc9su9aaa9q2f22sh5yf0fqejxa2qqpq4pg752589st5xsa5g8tpkjglj4tn35gd4hjj0xet9cjwhydmkmmkffy3nr8zdtctqu6pqsyf7aphvktryez39ru3qe7m6nvr465ffxr0ltvr85nddzxvcwpwpac64nu5tdfrxgjfqzc99vr3zxv8carpsw5evmruqlvrq6v6a4m2cwsz5gqw7nyk3jlj75kp5cnafzjn5dyrf8ppfhp5g5s34zsl7pejmmx2uuudjt7ru2y7as9mtagykrgqgt80fvp3eeh4gsmmd3ujgtp0ranq28aq9x0xdekqh49pfhhprjj6zqdfac5gxtjj736kh5jktc4ls4mjs3p33rzt6ze54uqsfept3qhua2pmugypup6hm6j2ek5sgxjnwvqyfj2l8vz4yfgkaxf699v7jqlwf7g68ang5kzqrjsu78lyardm4zen8zhrr24j334qdgs4zr8dhsfsnmvx9cdvu0swx27tcz8txs46zds9kekgmua7w7fnw3l2lf6zla956ssycac4zjy87rawr4thusxtcqgfzfzh2za9np0s34e5dwkp2l2k06cq09myxqfe7ze6a53d8sl5j43qcekh6kfvl9k0t7903q99pc35630zwm3hwxgnw354du5gngnz56skq9zx3pcnkr5eyh8r8t0dqudmvrrwmxreu6tgrklxw7yvu3zkjgt3gyjhc8kqcrevlukay45sz4k9zqxx9yrs88hzt4h52r2g74alf3cedes3atufy06q4lfq3nxdlnve0kqcwstzr6z6u7fqpqvacezdrr62ycteju6dqawkpthu0drtlxj547htfjcsnrmhgvhskwtuhk6yp7wp30p7qc5vkk8fegg6qx5kc9xs4trx7hj9xgydu7vd30hkceuxsczywjs9v2fl3svkwfypg62882yq6ltv7gfj4ajuy8ezd76g0z7juwspe7q6zs5ceshd6038tvvh2nlpjty6rg6a9qfzhgmjx9s6hynyk7xnq9zra6hxstg8p58x75hapd2mk6rapfunlnnkz5dsxjf4ud4dsvgjfjpzxcdy7sp8dzxtengrsdyu4824mqlw8p63d7m2z4mcyme4tm2qkugtdgrkyphe7akk2geukf6xkfkzd2pkdq5s3qm9fkvfkgrv6yw5kdgjak8xcgesg6tumans4fs8yrxtqlvv2z3emdvwchrjfq4xpzsj27yt4gdg8pknwz9tqpjkjxq6lysutrvwkvt2fwyj8wvv8wtmdl6fk6rsd9kq9a6wkhuq7vvrgwgj3xg2s229sprj4g2vzhy2dfesrp403gs64jqkrjuezwm4zd6uw2x4e2qkj8xqcf7c0zprdzu959x23u878vqqetgpjwt0z3kedt8l6dgpm0rf5dmrya5h3wgzfa0jjvgjphyxgxrwlrzpv4czgal933zs64tn90ks66ejjdaw4t67sch8r3q0kljeqnpdgmw0cpj6arc6k46wcqaccygczy76zt9362vslakvzqqv33tv3sjldp6qxprharmpm9uykgpx66343wuur5xj2aw0rgutpm4ztjzycn3a8d2jq2zpdzwmevezm7mkp9dmndkc3qz0kklgkxq9yehrk5ayfly97umhws0jll8qqg0r7gzxgw5vv76 - &host_forgejo_runner_external_ansible_pull_age_key age1pq1jqrcp3te50xugmv5wst3s9ahj0d38rfktxt43wlcqz7vnwyn3y2h7kyfr6rckrvmuk9m7yvp4efjnfsuxx6d8r9gn222r2eal5593arywrjwrgeypf745wyuvf3z2xk9tm5fgnwckftuvdggk66fph59rw69nt5dpjeewuww4vzt9gs4xelre952s7zjz56qv8tvesg2c89sp8rmy9dvhwfd6tucjhs6sjr6yp2njjra2u6w7c7f0sch3rwkw3wf2dc9su9aaa9q2f22sh5yf0fqejxa2qqpq4pg752589st5xsa5g8tpkjglj4tn35gd4hjj0xet9cjwhydmkmmkffy3nr8zdtctqu6pqsyf7aphvktryez39ru3qe7m6nvr465ffxr0ltvr85nddzxvcwpwpac64nu5tdfrxgjfqzc99vr3zxv8carpsw5evmruqlvrq6v6a4m2cwsz5gqw7nyk3jlj75kp5cnafzjn5dyrf8ppfhp5g5s34zsl7pejmmx2uuudjt7ru2y7as9mtagykrgqgt80fvp3eeh4gsmmd3ujgtp0ranq28aq9x0xdekqh49pfhhprjj6zqdfac5gxtjj736kh5jktc4ls4mjs3p33rzt6ze54uqsfept3qhua2pmugypup6hm6j2ek5sgxjnwvqyfj2l8vz4yfgkaxf699v7jqlwf7g68ang5kzqrjsu78lyardm4zen8zhrr24j334qdgs4zr8dhsfsnmvx9cdvu0swx27tcz8txs46zds9kekgmua7w7fnw3l2lf6zla956ssycac4zjy87rawr4thusxtcqgfzfzh2za9np0s34e5dwkp2l2k06cq09myxqfe7ze6a53d8sl5j43qcekh6kfvl9k0t7903q99pc35630zwm3hwxgnw354du5gngnz56skq9zx3pcnkr5eyh8r8t0dqudmvrrwmxreu6tgrklxw7yvu3zkjgt3gyjhc8kqcrevlukay45sz4k9zqxx9yrs88hzt4h52r2g74alf3cedes3atufy06q4lfq3nxdlnve0kqcwstzr6z6u7fqpqvacezdrr62ycteju6dqawkpthu0drtlxj547htfjcsnrmhgvhskwtuhk6yp7wp30p7qc5vkk8fegg6qx5kc9xs4trx7hj9xgydu7vd30hkceuxsczywjs9v2fl3svkwfypg62882yq6ltv7gfj4ajuy8ezd76g0z7juwspe7q6zs5ceshd6038tvvh2nlpjty6rg6a9qfzhgmjx9s6hynyk7xnq9zra6hxstg8p58x75hapd2mk6rapfunlnnkz5dsxjf4ud4dsvgjfjpzxcdy7sp8dzxtengrsdyu4824mqlw8p63d7m2z4mcyme4tm2qkugtdgrkyphe7akk2geukf6xkfkzd2pkdq5s3qm9fkvfkgrv6yw5kdgjak8xcgesg6tumans4fs8yrxtqlvv2z3emdvwchrjfq4xpzsj27yt4gdg8pknwz9tqpjkjxq6lysutrvwkvt2fwyj8wvv8wtmdl6fk6rsd9kq9a6wkhuq7vvrgwgj3xg2s229sprj4g2vzhy2dfesrp403gs64jqkrjuezwm4zd6uw2x4e2qkj8xqcf7c0zprdzu959x23u878vqqetgpjwt0z3kedt8l6dgpm0rf5dmrya5h3wgzfa0jjvgjphyxgxrwlrzpv4czgal933zs64tn90ks66ejjdaw4t67sch8r3q0kljeqnpdgmw0cpj6arc6k46wcqaccygczy76zt9362vslakvzqqv33tv3sjldp6qxprharmpm9uykgpx66343wuur5xj2aw0rgutpm4ztjzycn3a8d2jq2zpdzwmevezm7mkp9dmndkc3qz0kklgkxq9yehrk5ayfly97umhws0jll8qqg0r7gzxgw5vv76
- &host_matrix_sync_external_ansible_pull_age_key age1q7kz3pnfq6cvtn56rlfgs52efcvtcmaq4xny0va3x5wxj4vpgccsenwxk6
external: external:
age: &host_external_age_keys age: &host_external_age_keys
- &host_status_ansible_pull_age_key age1p546j6whqsyfkjuf674lawrnk2ex653fuvwhcwt46gkrspkq59sqzm5y87 - &host_status_ansible_pull_age_key age1p546j6whqsyfkjuf674lawrnk2ex653fuvwhcwt46gkrspkq59sqzm5y87
@ -234,12 +233,6 @@ creation_rules:
- *host_forgejo_runner_external_ansible_pull_age_key - *host_forgejo_runner_external_ansible_pull_age_key
merge: merge:
- *admin_keys - *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/matrix-sync\\.sops\\..+"
key_groups:
- age:
- *host_matrix_sync_external_ansible_pull_age_key
merge:
- *admin_keys
# external hosts # external hosts
- path_regex: "inventories/external/host_vars/status\\.sops\\..+" - path_regex: "inventories/external/host_vars/status\\.sops\\..+"
key_groups: key_groups:

View file

@ -4,452 +4,440 @@ sops:
age: age:
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHFyYkk3dyBuYkk0 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHFyYkk3dyBtb2wv
ZzNwWGVvSnEvWjEwREpaTGpvRUVCOGZuRTVBK1ladVA5ajY5ODBRClFXY1ZYMElU QUxXU0tZUzBBc0FXQ0ZpaWRsUjdCZGVzYW5yZllCQnBCRUlobUdRCkt2Z05NY3l0
Mk54WUV4SXdUWmNpbVMvREhld3JTVFZ5OGxoVStYSVlNd0EKLS0tIEJUTFdRVlNI TUpOODJZUUJDUS84WlJ4cG9yaFNzZDVKa2JBWjRYVFY2RXcKLS0tIFJ3K1puSng4
cXV6bWpibEFYdEZVRnhIcDIvOXBzQkdYVUQ0RElxVHRqS00KueMwxtalr0DlYylv UUk5aVMwY3dLMVJ3RTgrenhzTFNBYnl4UzRYZTVKeUwxOHMKXg/vQz4w4t9+dmoS
lu8yuu/igntcbN8G+tyj28GstQJsVPJk7WKQ6TIX2xmuCDrhS5HykH9sUTxE1o+m 1E7usTgQS5hIRPE1q/KfUJYctpJMo516nnBOUPZGzEQrT8yUV2uf23j0e9KTjzeY
36UgzA== FwAFuA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIBQgnQAq6FUSDK8bxtYPjx3oRCAKG+xy9J3Gas2ztJk recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIBQgnQAq6FUSDK8bxtYPjx3oRCAKG+xy9J3Gas2ztJk
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHBpdi1wMjU2IFZoZXNPdyBBc0p0N1g5 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHBpdi1wMjU2IFZoZXNPdyBBcUgvUTZB
SXNacmViRTFubnpDV2UvWFhxTGg1QXpqcjhXbHM4cXU0ZGJWNworaXc4Z09QM3FX OGlxTlpKNUFmZTRxODlwZ2RvU2Nuck9pSWc3RjNwaWZHUUJPZwpETkFJUW9zNzIv
amhlb3ZmeXJXdFhDd2x3WnY0Tmw3QVVISkJSeUJaRW1zCi0tLSB4SE13MlNablZu U2o0enJvQzlmVnJiSG5yTmlWYVFiWUdUajAwL2tmQi9BCi0tLSBhbzdpSTNkOGto
YlVDWTEzOXRvUWszS2prcHpZcmVROGVHeU8zUUtMVEhFClk080enyfNCdttCqXaP RnF2U1ZpOEYvRy9iRWJEK2lEeUdXQ1BhNWIzVDZHRUNRCrmfKVOX6l1pDs6hOR6E
c1y6DPlMX3nf87yOPbjfAKp6fMU3BY5GNGheJFnsaMgakCF2QKlPRxOFY75/+TxL w/6Xex1yrxY84rv0wRfudyb4KyTbmnbqLIDMiH7pMMz5DARHFxTEnf4gdQXE9vFx
qFY= b3c=
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1yubikey1qv7jkffslarpma2fxjm9gnq43xfvwdws0m6y3u58h033edwdyg0uzt8jl5n recipient: age1yubikey1qv7jkffslarpma2fxjm9gnq43xfvwdws0m6y3u58h033edwdyg0uzt8jl5n
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtQThlRTJLeUh1dHlZTE5z YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBEZXBNVnI3alVqY3VTamU5
aGlhb0JqSWNZRjFFR25PMVR3dHZ4MzZ4R0UwCjQ5Ly91ZE5jQWJQZWFQUjJIejd5 WFBXTUFRN1dhZ3F3UFdnT3Zkdnl3SGFJeXlBClVkTzF3NmlVbmJMTlNWRUhPWTBz
QlZWKzNSaEhlN2NUOVh0ejhqK3NZK2sKLS0tIDRGWllIZWZQdUc0MkRCaWk3SGNE MnQ0S0ZLbTRlMnZucy8zZElZMmFNSDAKLS0tIGZNTjlGbHlWWnpPNitjTVRZZjNW
d1RLcmY2bys2ZzlOZnV0cUtORnRnWE0KbHZfpiERwKLar7Qi62mp/kpaK60OwRon T0wyN001aWhCNDdzWkYva3hSZVRRS1kK2TCbV5dde4tHTVfQerRuUfixxU2Z5aaQ
n33HbK727DbaB7vGXx4jFZsB4vMqddWVfNq+ByxtJ6YfSq2cUtkLJw== 1rOxf5GdqmIu3HouAt/ALFtYHRPJXNsS81NUJeOJJ0KVq45TeCQy1A==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1ss82zwqkj438re78355p886r89csqrrfmkfp8lrrf8v23nza492qza4ey3 recipient: age1ss82zwqkj438re78355p886r89csqrrfmkfp8lrrf8v23nza492qza4ey3
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUVDZsUjl0ajlwR0wzRUZE YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmb3VnMjV1VVhEdURxdjB6
V0tNZnJLREdlUjMvV0pXVzhWd0hORVlhdGxvCm1EUm5mM1lseXhQR0xISCtFZ21s QlN3QzVKdlZJTG15YWgvWHJyTmllK0pOaFJRCm1HelJtaW5JbXh3bzBLcm1DQ1VU
aXJ4TFlhelRsWGdSUFAvazI5L2w2ak0KLS0tIDcxYzdaWTN5OHh4R3FZK05oSWZV Tm80aUxoSWlvODJLb2ZwclNQejQvQUEKLS0tIHNwNGtaYlhRWEF0eDFTS2xtKzBB
M3hmMGNHY0t3WlN1TVlOOUZXY0ljc2cKHqdX4VkprUIgo9X3TIZfpZJ7m6wMtWxR Y3p3aDdFcHBuaGRrN21Od3pybzM2TTAKpEGKYhhqLbu17zO1QKvuVzpmienlFIEW
PO36ykssCrQ3fHCfhS+Dd8QjCNsQ4PFYa5LK1FdbwN3FVS2C90aGcA== KXOL5ZEQ3IDAWJkbq8anAIzNzXUo1Wez2KjMGBkB8Y1mgGC8MxSykA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1gdfhx5hy829uqkw4nwjwlpvl7zqvljguzsnjv0dpwz5q5u7dtf6s90wndt recipient: age1gdfhx5hy829uqkw4nwjwlpvl7zqvljguzsnjv0dpwz5q5u7dtf6s90wndt
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZUEdZQ3lHb2QrbHZXQnZo YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxbkE0a2YrQ2NBeXFwV0lU
SkZmRmpCdW9XaWRjdkdNSWZyM3d1NUR5TVRJClhETGtoT2ZFSWFjek5JR0hQMi9I ZWZEcU5uVHh5RXhoelkxM0ZlYUdRUWwvNTNFCnp6ZDkxczFBUE1lK1pvd29MOVFL
Ukowa1ErRDdpQWtodUFsNEN2VzBSMHcKLS0tIHlEbDhrWkRnSXh4a2xVZUNzTjlk VlZCSzBFN0gvaVNyVHBwcVUyUGl0aDQKLS0tIGdOemVKTFAyVitiRGFpZGhXbEdk
NDY3Ty9rSHVBNzFLTUtXbE0wZ1ArdGcK1XSryr6gUZX3L33mROMaeOApnZeLQQ0G MEF6Q3E0Qkswa0pwWGk0eEdKSUZXdGcKvEQSMlSepBlHKbB7/2JuCuJzbrg+jU/m
HPr4sQJgrjVUL0vig8hiOvxDKfOE5eGgOtdrxMZLXD2cHUJjZMPqww== 1c77UgPnVqbXGKW53BydebcE5R+wn5hvTKJXjWPBd3KtMiz+17nC9g==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age13nm6hfz66ce4wpn89fye05mag3l3h04etvz6wj7szm3vzrdlfupqhrp3fa recipient: age13nm6hfz66ce4wpn89fye05mag3l3h04etvz6wj7szm3vzrdlfupqhrp3fa
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRai8ydGVidHBrdXk2QWV6 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBSOExieTFabkkyM2puSEpw
TEd2d0p6S1lKeWlmRk9sOFhpUkRqeC83VDNJCkhqdEwyaWdwdkQvOVJZZUdURUQ1 dmVOVHJUamphRXNuSFFuTFZGSFBvMUFYeUFRCkoyalN1cWdyZlVxMUJwQ0VtNDdV
bTB3SitrT21HNXdvRWVOcGRYYUtrb1EKLS0tIDJ6bDFMOXJxamt2Skt2VVlxa3Bu clM4TG5TM1g0ZjVVWDREd3BtMWgwck0KLS0tIFhCOUJobXRENm03U1lCT25KZDgw
K3MzQ243TkQ0SCt6dDVkV0xJY1I5M0kKD6Y73NEAQYUs5vWeV1GeIPZ2i1FJI3ci QURXMDBldkhIMWtNUzc0SWo2ZE1OY2cKP2YLKg0JO3bIX9zE8GXIboSqVHtO5q2l
Z5g2FbXtAONIJ4Nwg3FFqdK/q41sMpPa5/f3PwlvXEbK4eBrtdHWRQ== r7mTt3c7rCI0mRv2bhm9YkcBBhm+uAaEehDRxQ5lRZHXAWVTKTT6iw==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1jtusr294t8mzar2qy857v6s329ret9s353y4kuulxwnlyy4dvpjsvyl67m recipient: age1jtusr294t8mzar2qy857v6s329ret9s353y4kuulxwnlyy4dvpjsvyl67m
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2OFRxMmZMRkV5dkttQ3Y5 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBJVDE4Vk5wbnZpTEdkeWZ6
MFVqblo5V0tTaFpUaXBFanRoanpmWndSeEVrCldaTjhqS0xwWlpycWkyaHBZMVlI WnNLdFlOWUI2SnRnbVRJMzVJaEs5ZmMybGxZCjBTeld2Z0Q4czZycmxac3VlKzIx
MFFBaWMxQmVkQkdDdGovRXdtMVMvSk0KLS0tIGRiVkVjQkdZb2pubUoyL2VOVmJl NEZZOWpuL2FqRlVGKzFwb3duR1BJM2MKLS0tIGQ5R3BmVzZ2aHhxcDVjbzh2V0tL
OHVmTG5iWWt2bkxvenBSdUpsK3JwK0EKZwjNeJiIMhDtfPYDOLS1vM76ddWw/756 c1VZNmNGajNWVXg4QUsreDU1b2MraWsK/8c8FC+QLFiSJaqQDHWyG9LD80bMncyj
k51dAKcT9WOmrBsxTMxLyZv2i0gs3XAoF2umi6CtbLu5wV3JSj8I+w== Yo0EQxNIDLEJjj5yMnSWL+rzO66HxQMfnQocoJKUvYqnv23kdChzpA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1a27euccw8j23wec76ls8vmzp7mntfcn4v8tkyegmg8alzfhk3suqwm6vgv recipient: age1a27euccw8j23wec76ls8vmzp7mntfcn4v8tkyegmg8alzfhk3suqwm6vgv
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtcU0zZXNNMXFWOUxyY2Zt YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxRHp6Vkw3Ry83ZFdoVzdD
WkErUFIzTEFGeUtkMmRldlNmemY3aFBQQ3dJCmJLK2k3MGJHcUNvWUplNEZmVWN6 a2Y1T3dPZnVxS0luS3RrbjNrR3FEQk9DQlhZCk11bjkxbjF2Snl6RVJ2eHNGSC9L
UUZ2anY4QkkwazNzcURGdTRQSDh5RkUKLS0tIDFVdnBNMDhpZ1JIckk1YzQwUjFM OVJrbFFlbTJlc1hRTExiYnhra3Z2NVUKLS0tIGpvb0JZMWg5eDNuWkNTSlJJei81
bDV0WXpaOHRLekNMa3FBTjdKdk1jSFEKyEW36xrJyJkD4yW6qfkhtlkn9j8uk2G/ K3N1RUgyNXpDZWR3bjVqZjBmUWYvVXcKkIBP6wlWZypntZpeC8HDij2vLEomMH3X
FbWFVfWKVVPLefeeUNCG1hssphnQp44gn0n3IlYLRxzmdwzuSZ+YfA== IaVPhDRN4UTfzK7iSYoUeGG0s1rytpEJ7z2gMXKuPm77yxy1XmGXfQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age133wy6sxhgx3kkwxecra6xf9ey2uhnvtjpgwawwfmpvz0jpd0s5dqe385u3 recipient: age133wy6sxhgx3kkwxecra6xf9ey2uhnvtjpgwawwfmpvz0jpd0s5dqe385u3
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyRTJydk9OZ0N3R25yN1hq YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkWEl3alpsSGpKQittTWVm
bEllVlo1MlhWZk96aFFMcVM5MjI3dnhpWVE4Cmk4cVhKaFNTQWFQaVU2eStiYmFS dmdLU09JWlFMWitGZ0ZVNC9zb05QZHU4L1VNCkpQV014SnhzSHB4eFo2eWd6Szlx
R0pjZElVcTZxODJHaGlGendXNnFxNk0KLS0tIHozREt1RG91a3FOVXZJNTdHNUkz WmhKMjhJWGN0THVsMEdHajVzNVozK3MKLS0tIGtVR1Evek5lVkpFUjlKK01iZUoz
Q3NJR3Q3NzRBSjVGVjU0ZnlUMzRWcm8Kyeam0hAhQM5Bx1nqKoDRdqdycdu7NPsE QjJ3Tnd0SzM3YVhVSit3NVk3V2FJN28KD8pkbpghiDdDydDjO3Tzn89Xg6SpwPoo
5u0G4gLiKWwhVO3mzLmhBBvKjp4OIWs2bK3y7+POCSXQlhNgHwZdyg== 1JWbUcXwL5YMOz1ZLbWcP8gDzC+xGFoQEVGydzsiTRyzBndyF4scig==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1na0nh9ndnr9cxpnlvstrxskr4fxf4spnkw48ufl7m43f98y40y7shhnvgd recipient: age1na0nh9ndnr9cxpnlvstrxskr4fxf4spnkw48ufl7m43f98y40y7shhnvgd
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBMdHNUcGVxV0VScDc2R2Rs YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkNzNrK2doMzY4SWN2WHRC
MTNNSUsyRU9TUlNRMWdiSWE5bjIzYnNXbm00ClVpVUw4UE9IVDlyUXRMWVZqUW1z ZjlTOC9HK3c2QnFXWkZLa2NJWURmSDJrL3hvCldCOXNOZ01YWjVkVCtLMzd2SDRO
S25jQTQxcXBiN1RsSTNFbG5HWjc1NlEKLS0tIFFtWENqaDlWZ3BUbWo4ZWQ3Sk9V SDgzQWduNWRMblNLMEpXNE4zNnhrYnMKLS0tIEVaWlFubGhZSDFhc1JSR0QycTZs
MG1qTlRHSitJa0VjS0IwMHREMzJsM3MK33pKvGNISdlyofjZCSWtAp2TtEnkgDL4 dHFIVkVhM2dicGpjdHdBM3Mvdm1YU1kKZ4nSq32LtQfToeRlTkPNQwK1vS0Sp4td
1t2n/dKQ/N5B4A1GYbmezv6Rqk82CPqCR4aEEcAKNOQrkH6VSUhyxg== 5A+if0MWHHeGLmkeVbczfboxzdqyqCn9SNR/HO2SwcfTAVh+X7D9zw==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1sqs05anv4acculyap35e6vehdxw3g6ycwnvh6hsuv8u33re984zsnqfvqv recipient: age1sqs05anv4acculyap35e6vehdxw3g6ycwnvh6hsuv8u33re984zsnqfvqv
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAzQzN6WXNIelF0SWU3bTRt YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFdEtKdTFxYzJXR0lZYXJN
NTBmODljL0t0aUNwbksrdGpSanhhOHJFUW1zCjZLQWYrRklnb0xiZjN2cHBIOXZp ZU9CMGtYME5xTjNvOTJBY2hUTnVLVUFOd1M0CmYzQ2haNEsxRzhVU0szYVdLZ0Yr
S2tvRnBwSFdiM2lsbENheHVOV2V6VEUKLS0tIGZXcCtZNjQyUU1NSnJFbUxkeVRM dkJEQnM4ekk3TkFsL3Z6TzYwT3VTOU0KLS0tIDN1Wld1K2o5WGczWTZOay90d0J6
M3B0ZDZDei9PMFFSWHdQYTBIRlhGQVkKfXKL6lBiErI8PUUsQgmLQasMuGcswdP0 dFFtNE10aFFwbE9TdStncTZEdFBXSUEKjhbDMGLL/8qj2Mv+IACzzhfhINhsN1ko
KKXwKH9DQwpLJzUTCB6PPfFZggv5bmAFjUHoOUdPwHWpQFa9o2LNRg== /JDtoLtid40UxZXex8u7nuTK6DK7w3OkLVh3Zfg1oJYksCgM1CykuQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age18qam683rva3ee3wgue7r0ey4ws4jttz4a4dpe3q8kq8lmrp97ezq2cns8d recipient: age18qam683rva3ee3wgue7r0ey4ws4jttz4a4dpe3q8kq8lmrp97ezq2cns8d
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvREVZL1BxdkhWVk92bUpE YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAybklqRWMxaVRzRHhtTmtq
MUFaSFRXb001bVd4V0hpV1dIMjVkNWhsT2hFCi9Pdm8ya0dGNlI4aDZUdGlpTllW b2hNSy83QkdMMjRFZk1zeGFXV2YzVmxyV1M0Cmh3eEFWSTNHMVZWS0puUkJxMVZX
a0dDN3lCVGR2dzdtOEtEWER4L3d1UGsKLS0tIER2dTFTbGN4eTZ5dnE2TDBMSUF6 dXBnWTk1WnJ6MTlCVFY3VTVHU1ZlU0kKLS0tIDJxTXFlY0RuOThwTW1xR3cyZ1RM
RGk5QzZVUjB1Q24vMWtoVXc4Umw0b2cKb1iHjrU5rFyCbbcXKX0DoZZeC9SQDimb SXlQNDkxV1cwckVSamlHN1QwTmUrMUkK4W9qh7HkfLzU1B14JbbhYHa/xCZLdlYn
09oEzR/5bPb4zPRwWC5cUiI5TTjxKiW34p1Qo6eSMUNc8rh/5feNtg== rl7cOdxU1+4RFa4+uc1i2+pgcWZlQBfiDwIxN1+vn7cpiM/hmkcg9g==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age19rg2cuj9smv8nzxmr03azfqe69edhep53dep6kvh83paf08zv58sntm0fg recipient: age19rg2cuj9smv8nzxmr03azfqe69edhep53dep6kvh83paf08zv58sntm0fg
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDYTBybklnZW1QYjRzS3NE YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBMYjVaVXQvM3hMMUNRcUxI
RCt1c1BPS1RjZzlTZGlMY3hQZWI2bU9wamcwClNtSFZmZmlRMXpFQ2pyYW5hc00v YkRaQlVQK25BOXBJNjlLOW5nanRHNytGUTBNCkFiZHZYT25SRFB4MkZqcDBoeEh1
bjdpb05SMndiRlZJVGhEWk9GMEJTZ2MKLS0tIE5Fd0dLdjYvM2owWGhBcUc4Y3Ja WTZLNGRHWm1KUkhkTnIyMkxGaW5mSzgKLS0tIGJBdWw5d0puN2dOSWtTSVBhamJ4
ZTlVSmlmazdKYkM1WU1YWldFNVMzUVkKr6FR6B2zLKjgiQhVPGAhVHJJfyTBTnfC T1BwSEZHN2NEZDZCYm9GT2RFK1BuaXMKENs0hLQHkAYjwnFgvrjKJ7FeOwrdBckJ
pw/Ox/qSDtniJWj2TD0rvM06+4lCVGDDcO44kgDLcILzX3mRFC70XA== uXd3Wg65AFDkghFS/1xPaxZq7kp0bTIbcnyLa6r9clO4rocy3t0IBw==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age16znyzvquuy8467gg27mdwdt8k6kcu3fjrvfm6gnl4nmqp8tuvqaspqgcet recipient: age16znyzvquuy8467gg27mdwdt8k6kcu3fjrvfm6gnl4nmqp8tuvqaspqgcet
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmNklDOUFFVUw1MGJpcGM4 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA3WDZGa2o4OGs5WEIySURn
Q3NLNEJUU3I3RDNXbmZSRkxrNXhVWm9lRGxBCmJOWlI5ZE1vZzJ5bnhmREFCZUxt MEpxUUlZM21MTkg5RVU3dGhsNkk2bTE1K0hFCkJ6akliSjZkSE1vMkplaTJMalJw
bitOVnF4d0k4MTFLQnJkQlZBL1B0NjgKLS0tIG1EWWhpdkZFQ05iVjFrajJzbUVF bFlpYTBVVHVTMW05ck1LTVBkaks3eUkKLS0tIEdvY1RUOWllSEc0cW1tVWpWd24w
WUgzQVErdFRiMG81dzRsK0VveGZwN0EKNaX190SiwMM7/vO7OBV9N++4/4ODGJJ8 TmJ1c2xQb1BtUGNUVG9uSk5uOXhOWW8K1KjTL7C86mix5jWvgtl95i1Xqpmb/4K5
Hk7761qSx7TTQp+dBck1zyW2gZ3viVZ32b/tkOizqBxOgKy1P6yCdQ== J4fpJFblkBCQEvewWRh4+oQnXWOyj+XEpOIOKpCx8BUkiNgzoYhIBQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age187zdk64205lx7r83a4m26pfa8hq6khc8sf83k266jasngeq08v3sfqswfg recipient: age187zdk64205lx7r83a4m26pfa8hq6khc8sf83k266jasngeq08v3sfqswfg
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBEQlJ0T3J5R0pucDV1VldB YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvNHMvY2YxaUlCV1RGWUxy
ZU9JRmFBQWxnSndnZk9NRU54eEg4bzI5NjBRClFkWFdFZ1lzYXUwdk11d1pTMmhh YzZxZGxIOU93SkdBa3IwM3VlRldqR0JSelhrCmlZdU5zczJQN3NFaGs3TFBIZGJo
eERkeTVUVklFekJYNGlyckhuNVN5NTgKLS0tIG8wd0k3SE5jSEZFMFYwbGlhd3VU ellaWjRQUUxUOUtkOVVvdHF6ZjI3RWsKLS0tIGZGMm82TXJ4TERpbklBcmRLblVq
dVNTQUx0YWxPVWtVMVltN0xFVTRxUlkKBk+C9FnnCrP+lftnl1QFHwnAe8E4QBnd eVEvbmJwVU1jWjkwdHdidDEyVEc3Um8KmDbOepcoAJ2JD6HqTEBYx8B/b+Dcrtef
UX0DbVjz5KQ2Hi0j4RJk7e4uhKBtgIZEK67eko/G0oJ5rY+KD/JkMA== U7NYNmCueIKIIBt1DbMUsK4Q88wqSpnKjnFmNrjv0oIu2ZVhsNgK2Q==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1azkgwrcwqhc6flj7gturptpl2uvay6pd94cam4t6yuk2n4wlnsqsj38hca recipient: age1azkgwrcwqhc6flj7gturptpl2uvay6pd94cam4t6yuk2n4wlnsqsj38hca
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLWHR4RXpJd2NJVXQ5Rmcv YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBST2NLN0s3dHBHMWZTQitv
Yjl5dGwvdk5xN1B6SVdqYXhyRzhBVDFKRXdnCmExR2JQQlZTdUxNOHlnSlhzWUhS aGpFMjRmWkptVllnSW5CUFc2SjNxZFcwNHlZCnJQa1FFZGZST01tdEg2dDcydjFZ
ck5pWENJQUgyeVFVK0ljL1J5OGcwWDAKLS0tIFB2cnVKcjVkTlhDZmt5QjVoemh6 SjZYYy9ONDhLZCtnb3A0cXI2V1VmZXMKLS0tIDR5eTYxWjJvdWpXZkZ5SzVJNk4z
ZzNKTERYYTRoTmhyR3VRZE95aEU5U28K8cDg+1QeAoDMy4dOHDyGFC3I4EYURiou ZWRKTDlNenRLOFNpRkxCaXhkUTRZVjQKFirSYfaGSzoQY4wkZy9S5gS43zkHzbCd
0UgObnJV2dLEcegNBQQYVjoTU3dglO7xz7pfdOwhQ7oH3xro/9fLig== W03MKdooNXz2n9fdfyFdEqYpG6OgFhuQJLKLP1oR+MUaztm7lc7/cQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age17x20h3m6wgfhereusc224u95ac8aj68fzlkkj5ptvs9c5vlz3usqdu7crq recipient: age17x20h3m6wgfhereusc224u95ac8aj68fzlkkj5ptvs9c5vlz3usqdu7crq
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5UXEzT1FxT1BYZGpvY3Qx YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4REdrakFDTHRmRVFGakp1
dWFSU3hDbjBtRCtkN1dxamppckpUdVBkeGwwCjlJOEowQkJMZkNhait4MDZ0RFV2 RWp0VUQyeWVIVkV0NVlXZjV6UU9YYU54eVhFClVmeE8zTDdOVDdnWFc0anhGTXd3
RGdFWmZOWFVVbTlBMDN5aDRwWndQaHcKLS0tIEZEZTczTDZwYzdYMFFMVjdUckdo S0xtOFdXMnB6OFRNekVxV1VvbGEyS00KLS0tIDcrb0Y1Ykh0WnYwVFpDbmNSYU1a
ZE1pTGU3bFpMZnEvY2xiYVlBT3Z4N0EKb2iDZvQ71/HLzUe+8BVwS1qhtsVK/zfN QnhxVEIyY2s3WDlwTDRLQlZ4cXlwQTgK1iHO4k481GqGZR8K3J+5MEs6NsPwuMY0
GhjABKXnNNauf2bmpGwh3DUcflkfEp2awCgJh+TxjE5LFwMnIcoaqw== Cr8XEgmymhZnQj1WrYbZIgg+VhzfVmvd62yOn+d45Vc6TOnX6d8hdw==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1wnympe3x8ce8hk87cymmt6wvccs4aes5rhhs44hq0s529v5z4g5sfyphwx recipient: age1wnympe3x8ce8hk87cymmt6wvccs4aes5rhhs44hq0s529v5z4g5sfyphwx
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFcGIwRUxaMStxMU1ieFZi YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTdTNveDAxWi9xUERqcUQ4
emJleW12eWVHR01aWVh0SitvSkJuNk04SUZJCmtRcitYTHBkNjk2RTdsRXdCd1pO THJvczlHWDI2V2pOSHIyTXgxWmhRdlpJREhFClJjcWJXc01CSVNQQ0VGc2VzUG1E
NDM4U0NvQUlUSUtxYWUvSHJaMHN0T3cKLS0tIFQ2THhUdmo0MzdQUjhuc0g3Rnoz UW96VlNENEwvSDAyQ3BnMnZBSjdPbTAKLS0tIE5kendXNE1BOElrMEk1U09qc0g2
aXhtc09pVzdFa0pOaDFmTDVlaWFGZzAKWEpuBMLOv61vsvcu5Tflaxi4Lwy84pEM SlpmdjlYVEVvS1ZMOXlXU1pQVWJheE0KZQR65sg6HyNsuF2X8wO5ZzfHdJJA7O8C
YXq3kM3ETimoXB/Yh9XpXCPeq4y/lhifd9CkJKhxo4cbdbyq6uF4oQ== 1AVefTdN9G2xGjvd9IwFww5MbvS1JcFdAratKyntpHA5e44poggNTg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age172pk7lyc6p4ewy0f2h6pau5d5sz6z8cq66hm4u4tpzx3an496a2sljx7x5 recipient: age172pk7lyc6p4ewy0f2h6pau5d5sz6z8cq66hm4u4tpzx3an496a2sljx7x5
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsdVR4bXVtcjBlZDdGa096 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5WGd2dHh5TUZ2QlEwOW9i
a2hXTFBob0t4UTVvdTEvem5MOFliK2FGYmdvCktLM3RBR3ZpS0dST29vOXExdGhn VGdKVG4rVXVaWFE5MTM4NWRCaHh4U0VwVkNJCitRc3VQa2lUUTB5V3I1ZmszRVZI
ZVJZeHJHMXRVZ2FBVG5GU1Z0SmcycDAKLS0tIDZsNXVCUUNZcFY1Y0tCaW1pdzVu a2tBRWkyZnBsbm1KZXhYLzcyZncvelEKLS0tIFRaaTh2SytQUDJ3c2lnN2YwVGVB
cWQ4Zm0vMHg3ZmJUM21SYlI3dkNuZDQK0zMzDVtiBhi61fLHUnS2lQ0Am5JUrh4R aHg3V0V0ajh2d0Zna3lpTWJYNzVMcWsKNI/JHvi/GpNScjK7lykO7Gwdfmi6jqj1
Yr+KuxPftoCww7X6m/Hl5pwhd6CDm+SOm5ysHHaiTTUSFATr7ci7hQ== MfOCHrNJvanFandggCZb0cIbH0heHIQPFauvFTzSmM45W/bWh52sHw==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1p7pxgq5kwcpdkhkh3qq4pvnltrdk4gwf60hdhv8ka0mdxmgnjepqyleyen recipient: age1p7pxgq5kwcpdkhkh3qq4pvnltrdk4gwf60hdhv8ka0mdxmgnjepqyleyen
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1WlVseTA4empPWGtkZ293 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTcWp2Qm9qM0tzSExBejZw
bXVTNm9iMS9iSGxCNGk2MFNjeDJ2WkhBOFJFClArOUl5bEk0MVV5eVd4bWk0WnhS YUwyZS9NNzZrRU0rS3VCR2tDK3piZm1zaUYwCnBVd2V0VkZlUFBPYklPYmlyanZm
czR3VFFacHVSOVV1dTc2blQvOFZpR28KLS0tIFBZdGxGTjhtSmdiTGlDeEhWYndi N2QwTjhjczg2NW1DNHA2WjEzTDVUQkUKLS0tIE9JcE9zV2hlVkhyRXNWVm5lejQ0
d3RIL1lpL1h6WGVaYzZpWERRQTR2cWMKIUoagSG8+i4g1RDa+fbXGVAjJocyMVkA UmFEUWRqdm5lY0hGYlIxSTIzZXZaWEEKDPUpngncY8J2jF/zLPVypu2XE7hrh+c6
fLpm9lAwUDs+9RQ95LMduj6xoPW8vtNL9CQ70Ai5hAZaUgL9HtL0XQ== 9Ibr6H7D6G15emm8ifDbcjbcI84URnVcG0ti31/FzAeAmxnTiv/B+g==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1sv7uhpnk9d3u3je9zzvlux0kd83f627aclpamnz2h3ksg599838qjgrvqs recipient: age1sv7uhpnk9d3u3je9zzvlux0kd83f627aclpamnz2h3ksg599838qjgrvqs
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5WVJIVUFpYmphdnBITGFR YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBhWWYxOFQxeFNndE1reWll
dk1vRnJwdFluVW9TZFBjc0RwTG9JS0l3dWdzClRKVUQrSno5czR0MVd0eEk1Sk1X dlJJK2VCaUlkWDZtaXlpS2d0ZDVhNlpqdFJNCnRyL2JWWm9JWWJyM3owWVpJUmdR
SWNxTEI0bktGVGgzK3hFZzJ2NlR2bGMKLS0tIERtVFFOS0J2WVRJbVNzWTNTL2ZZ UjljdXQyN2dBZ3Zvd09ReFA4Vk9iS3cKLS0tIENRYnhtZUtMV0pkZ3dhU3MwaFhq
Ym5BL2xZRjFpYW9GNFNCbXBTODh4UXMKnZQGe1jhdPDp89w6LdfoRm5qBMaAzuTZ L2RZK2tsRW1FUkhaczZHVmVkeU5UcGcK2FZFoBXcCJPd+qc9HVbgmF29Z1JlYDVF
bwg3QeBHDPYYpB2b4q+mD3XxdIRZh87l+KdrdvrM/7IA9VF0ZNZWsQ== lmGDnSSIxQ3e7fgBVSmuSdVh6kNOx45P++RY0MCEKmmmSg9voRFEmQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1dkecypmfuj0tcm2cz8vnvq5drpu2ddhgnfkzxvscs7m4e79gpseqyhr9pg recipient: age1dkecypmfuj0tcm2cz8vnvq5drpu2ddhgnfkzxvscs7m4e79gpseqyhr9pg
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkc1V0bUtXYWFSVHVnNFYz YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsdCtjYjVsVFNuRm1WU0FK
MWlIdVFtSFhvQUd4Q2tRMjQvMlcxWmhwQWg4Cm5xS05kcjVRU2VEa3VYWFZHVGxH b0hMSURXcndycXlyVURJaTNIeGFUSXNFZ3hFCk1sdkVvUE1vaVFXSHNWQlZKK2Jn
eUh3Yzl5VEF2YjFBdXNBejVTN0tMRG8KLS0tIDJVUEFhNlg4cTJrZCt4UDgzVWVn VDlBV3lybllpaTlVVEl0alAzbk51YjgKLS0tIEJkMXNDcXd1WUtueXdjOFVpQ2tB
SjQxSVo1eklzWm8vVjgxR3F2VXViUncK97WqQpdVMds+gmf1TNC1TCQFFuD7jk0Q Vk8zclE3RW1mcUxmUnZ5R1R6ZnJUK2sKyQUbyKtNgyJ+GmCYCnXuLp2GvqhIB6Ln
sqdCOxceIaQudTM+1M0YYGn6l2sKuBzL290wLVfEDYA31lyu2/ubaw== xFpNeY0WN9nQyYKht0RRbczbwPEm+CUqpVfc4Y3rnaaZ4xfXm+HSIg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1mdtnk78aeqnwqadjqje5pfha04wu92d3ecchyqajjmy434kwq98qksq2wa recipient: age1mdtnk78aeqnwqadjqje5pfha04wu92d3ecchyqajjmy434kwq98qksq2wa
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDSlAveWFBckpyYVNNR0xP YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkQ1pOSWhIOHFlelZjYzQ0
OUh1SFpjVkl1WXk3RXRjMWRweVVlRXppd21RCnJFbkU3OXM2dDc5bDRiVDQzNjdC Z08rcEVveDBTLzNKQjE1aUpkNFgxY3phOUdnCmVxZnVZYnJScGZ2SU5ISlkxd3Rn
aGhvdldWUkgyVVp5a1BndGV0K0xUSUkKLS0tIDR5OXpFcFFJNmwyWmVvNGFOWEFn aE5QVTQ1VlYwL3piZUZHSHpQcndnOG8KLS0tIDJ5NXI0ZjIwZ0dTNndxR2pkSVBr
Z25FL201YUlNT0N5WnR2UnE3ZHpKMWsKuX+ARk/5fo0w8nG1eqhdpZ8KDQEaVh3S NXh2dTdWTTRIRkF4SEZZMndWTVphazgKEcXnLHGfKo0x3n4JMUdrxJ1ukluHz5by
8nf/jJ39QrJwnukQP3+4JvLKl/tp5NihlP/eQ3ZUmvTNqQOsXpTY2g== uEyrZqD4H9NjzJEc0YWo992pqSn6t4c2vf3bu4uMUANIi/24R2L3ew==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age16pxqxdj25xz6w200sf8duc62vyk0xkhzc7y63nyhg29sm077vp8qy4sywv recipient: age16pxqxdj25xz6w200sf8duc62vyk0xkhzc7y63nyhg29sm077vp8qy4sywv
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBITTU3TVhZcTJGVDRlK1J6 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBubnBBeEh4Z21ZMzdnY1ly
aVhsQlhvMm9JdXcvbTc3eExxWjQxdmU0NFZVCmVqbkN0QS9QRHo2SzQ5T3FNTFA4 V1BpN2dpd0trTXlBRHp6R3oraGcvQ3BLQlJRCndDbFJlUlV1VDBrYU9NOWhxdXY3
Vm9zdkg0THFaRzdsU0kwUDVMQUdDM1EKLS0tIGhtdXRMRWxDVVRUQXNCaEVPd0ts YjBVbzR5akN5Tlp2K2t0QjFyajNPOGcKLS0tIDBGdXc1aG9sWHJqTmRXakNQU2xG
Y1ZSOTNjV2ZhZTJzZk5IUENrMUVheFkK3WZbruOLBTzm0WghE+4iCT9l9ZX7LyVu MVZncGdlY015U2tRL2lPSzNldFRpRWcKx3D5/Nya5W4i2by5AeY6zNSBIe5gm3qK
g2K39QgOva2VJPi8TKZ+SUPAJkTs+n++KiEtaanhSKJWhfoCa2hCJA== FMJ1KgoasiHtgKkhumqAnGBqwbp2WFGM9tJK/huImuKeJd23i9G/2A==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1hv7m3xypesdfm0dfzwgctde8v307g9xaunnfu2687y0lagcs5q7s3eg0kj recipient: age1hv7m3xypesdfm0dfzwgctde8v307g9xaunnfu2687y0lagcs5q7s3eg0kj
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBrMmlUdE1XVjMvZ1k3SWRY YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOWHkvMnVzRDBYYTZGZDNG
cTA4ZHF2K2F0VTU0dzhvM2k3S3NXRENJWGxFCnlWZVJ6d3p6eWFSeFFZdU9FRmZS S2xHQVVIcGt0MHhDb0k0c2NDZlhMcDJ4SG40Cm52bUV5emFGMDNCUmVkTmZheW5O
MWJRWElrTXI3SjRUZE5nVGVkZHFXdkEKLS0tIG9veHJjL0lIb25LTWhvcW9oY001 RE56Q2g1Ymk2a0VtWDYyNDBDS0k0Q1UKLS0tIDlXa1gzZVhId3V0NHlqc2E0Sm1C
MzZWUHJnaUJiamI3S1RJd2lweG5FVzgKFb/9A1Ukx1aL51Tf987RMBD1H3Jiosba ZThwZmNRVEhJaWRkcXdocUNqaTlJbWsKt0qDpp+YTa2KaXbbRrXDnu6Jyc3e+6iZ
XBqvr7B+8URqPO0rvFDvlCV/RtLAG9RhxmJqJ23+4Oqm0FzNCx11KQ== wwRg6nztr4AROglPcTopTFCPkct2bdA0Xcj0XozM/TNv1ztC9STNmw==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1522f3qzddm82w63j7ajdkr0khvced6ht7tzp3grvp0j3hewtvesssr5kpf recipient: age1522f3qzddm82w63j7ajdkr0khvced6ht7tzp3grvp0j3hewtvesssr5kpf
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBrdXdrbU5hTnBMaWxwSHNx YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5N1lxNkpoaEd4V2ZYZHJv
emNyQTB6UHVmVUh0N3pnbERtWi9naTBnM1gwCnNnZ3ZEcUtVM1JPY1NnRUUzNElY MThuQi9aZW8zZ1cwa2IxcWd5d29yZ0hpMlQwCndaNmlVY3ZTY1h0U3RkNVc1WDFZ
QmVtbVNiem9LbnFUazFlZW55U3pwZ0EKLS0tIFo2elRISEV0TDdEZlVHU2thclF3 ZmtsbUJqbWk3MjU0ZzlLOGg2VGdmdlkKLS0tIGl0Tk1RRWg2KzkvcjlqMlg3NDRX
SDgrekZBL0tRaTlYTVUxUzM1SVJ4VGcKUaA5Y+cZ99yary7gt5u5DxPcPhHVcpnd QTBEMnNVb2dkQlFMV2o2RG9FcTlCZ3cKm5L7odprrDvS1ufaZIemqgIb2WylDwgX
/ffKgiuXQytnaqTjuK+LznHd0zFh3T4Wgt55ctLP31vr9O3iwzp5Ag== 7gj2WXJzQMnnL7mYeJNXeL4tosgJJlrd9VScikn+GRcMUCRDFm13xQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age18zgt4y2sd75hxnpe333zz39048ctxpr0q8a3uqh3jajjkyawsdrq8yg5ve recipient: age18zgt4y2sd75hxnpe333zz39048ctxpr0q8a3uqh3jajjkyawsdrq8yg5ve
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvcWMyRytmR3R0clBEUHZy YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiellEVllHL3pacUVhUVVD
N1hLV1Q5VnZ2TWJNSE5pelozN2lBVU8vc1VvCmh5bkVoQUo2ejhBVU1hVkNtc3Vs Rmg3SjNxOEtnQlh3MWIrZzkvOCsrTys3aTBNCmRIanptazlDZ1VmelVabVc0b2pv
ZnVGQnFaMFV5ZDZacnoya2k3SXFSWEUKLS0tIDVxSUUzTlR0WmpxalBVLzRyYmlq VkxkakFCdkdnZ1QvTk5SUFF4V2N3V00KLS0tIHc3TnNaWm5xSWNranFBNTlPM2NX
SzRVODNGQU1MeHIrZWQ3RnYzNFAwQzAKFVFt6uESNx6nQwSCqoVt3CFIIykKjz6R NUszTW9VOThVcmhROUJuNEdDUWM2ek0KH5BTMYDwSnhO0MA2/4KgCe1IZABMePX4
AwVU03KFdfTMSHx2KBTDhOnFGdh33m3axIw/CxDFaI5NB8MMa50lBQ== WF/4r3DJ6cPVIyYx2GkxIpr0DVdlTb3KphxL/LBiUoGwHn/F/sfR7A==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1az0k6cadssk6r8qcqxfr8cyu5mndy59pwt8yqq6w065ew6au4ezsmg2vkf recipient: age1az0k6cadssk6r8qcqxfr8cyu5mndy59pwt8yqq6w065ew6au4ezsmg2vkf
- enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IEREcjlDL0Zp YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDBDcFJqSjYr
eEh5bE9wOGt2NTRYd21HbTBQWWFrZ2xCTSthc0hRcmJ0V1Q3UUNXbFRKa25UNWo0 MjFvTEJVWmZpUlkvMGQwRm1EcVJQSWpmUHZ2QXZCV1lKL1pQN2JqRUw5KzNvcm9v
UUFBMHlLTmdaaXpvOHZiOFpmWk5DMUVZbHdRaUdvQks2cEZKZ0dncnlGb29nb2pU dmoxNFJYaGdXeW9CNnhXVU51VlZoTGFFd0dralVrcmNRbDFwVHJlcHRQMzNyNkN2
MG5LUEVWelFNTGYvRWN1Z2xwTzE0bG1VVzZHeXlGZXZjaGw1OFZoTGsvTmZWNkM2 bERFSGtBWG9wUzhPOFBDS3d1T0wzR2lXeWdFa2ZzbGg4MkxLeStiV0d2V0FSOHhn
bkcvbVNpSmhjN1hFVG5nTk5YTTJqVml0MktQcXdnQk9ROW1HV2I2dTMrb29MUDY5 cG1WV1hTanFycE9RZ2NUT01vWm5UNTJYTHVIbWExbm9OYTdqcVAvVDJUa1AvRUhS
U3dsWXpBdVdNT1VPV1RUSTZhSGxUUUxPeTVrUU04Wk1jMERNWFZ6VGZ1dVlxaHVa aHBObVBJa2t2Qk1lT0xWeGNIcitMMExJSXhkcDFHUDdpb1I3VHpxRU54ejBwcmRV
amNQd3d3RGZ5bnpWS2ZESEFwdXdtRVpad25RdFUvU0pCQm1rak1YbVprSVFLT0w1 dHovK1VmN1V0c0pkVnlWbjhlS25hNi9oTG5YMHlBbkxxVUdRN3lhOU9uOEVZVFlF
V3kzdDdYTjNOdnpFdkN0NlFOeXRTb0NxZkdpdkJTdDhQTVlSWmF4bHpDd21hVkhZ bWphNTR6M0xValM1cUxIZHJiRVZ1YUg1amY1ZERBNTZyR3lab0owdml0LzlkZWtz
OGJwN0VxT1Z0RTBxeThjL1h3N2RPM1o1S3hrWk1YeHN4dmdpQ0daaWtXc3I2SmQy dnREVTBjYVNsdFNaZGx2Tk93ZUpBQWQwK25UZHRsclVlcThGS1A5ajU4TEN0cXh0
Tm9LdUs2cXdsL2FkWnIrcFBnazY0dnluaEl4KytYclRmSDRhT0M1Rkx0T3MyOU5U eERqbWkrOUk3aWZ1T2tadWNWc01sbDg5c0lsUVpzb2xSUFphYThhN1FONHM2ZjJT
eDVPNW5RY0tsVE1tMDc3dzc2TU90Lzhzd2E5VjVjcnRua3FEeHVEeDBjVXAzcW5a Q3ByQlMxN1JKbldYZkJ1RjJRT2R6cHVVVmJ1YTZtU1dkRitJQzNOTllTZnNZTlBx
K0VDOEx4VlNUNmszZ0QvTFRsMlRySHNpM3M0STVyeXJmaklUV2pFakZDMjIvQUNH amFpWVVEd050T3ZSM09SQnZIdFgzMlFVS0YvU0FXUS90OHVpY3lSNmpFamJzZ2pD
MVNkLzZ3MXpONEM2eE4xSmllR3Y0SVhlSG4vSlVHNytMeWVpY1F3bmZZNWh4SklQ T2FVVVBUMmNRbU9tUW5Md294dWEyRDcvTEw2TWtQZ25HNEFuMENuUGcxbnNJT0ZB
R3VOaUdvbWtIeHhzUkxxazAzOXVEckVISGN4RHZnRzdKU0hUNGJqSi9tN3JJR3pk YkxGUnhUdFllcXRVdUVyUlhpWVRITUh3N2VGQkFDYUxiNjRZSkhtbk1uN2l4VzBP
U0JzSVhXWHB5amxCTUhvTFdLTzZEODhtNXJBZkQrWTd0NUxVWVlleENLNlp3bzlX TTd3TisxZzU5N0pITERYbEd5c1JMcjJ4QjhPVTI2Zk1wQmJIZk82aVdYcWhQT2p3
NmxWV2NsUERzbGVHdm4ya2Y2RXhLaDV1dHFFV3FqaHlHQVNlOC9hSlgrVWlGOXlD c2I5SzBGVmxDWC9XNGNmcHI3b3N3Q2JRdG9oK053SnlPMFMyTHhlWEdjbmVjWTlD
eURoMjNBOVhUZC9iQmdIZnlYZXAxNXhuWlBTbjNkZmdsMmlZUVBEeW9wb0ZFaVpF a25ZRTFxejZYcnBlcktzT1NCLy81aUczNlo3RXNOQWF6bTVhZ0ZZdXh6VmQ4U2R2
UERta0FpdnQ4ZVExQ0dzeGx1SHBIdGJQRkVsZTMwM0lHVUcxOUc2bWNIeEFSN1BN amZHcUJsZGg2V2VnU0RwRnJTNEpRWlFSUjFmbmZ0R2kvbzFEL3dHdzQ5dFo5UkNa
MjZQU3crc0luZWNtaTVESldLK1cwVWZwOXhlR3JtRm9weTNMOHh1aEFSNnczb0Zl NGhVRC9QZFhUZmpSNm94cEIvOTNRR25DL1pmNkowdVg1dkFZbTMzRDJWQjlPYS93
dWFXelpjRkI1T0JaTzJVSGNsRmx5bUFzR2dFSUVUNXZTS0ZjTEIxT1BVYm5VUmFY ejRYZE5oaVdOSFFvUjFrRFY2ZGlQUUhmNkQ4VUxUWHRtSkJSTHR2QWR4V0xHeDBU
SlVLc3dQYmRWTUIvUE5Fa3l6clBCaUdhMVBVQm5tV0sxamNYNko0UGxjcHR3SkVv QUZNWVVhVXlXZ2R5TUdCNHBocHllSE9rdzBxRTl4MGNzRzc2eXVsVWRNTThER2pC
dXk1Mlp0ZXJTMUFoejI3NXVTa3FzVVhEQ3lWMmJPdFVFZ3dKbDR0b1phYSs5OXVY UXROd2d5SWRGYXhXT2owSEN3K1RBK20wK3EzRzk4emlvK3AvaEdxSGNDNkJEblhs
WnptZ1ZNZ3NHSjBVanpnUmd2em5weThjaGZpekZTUUpPQVRaa2ljVUR3UjVvYmlw VW1HVG1hbzNIUjlqVTdodTlWVzkxQWNGRTVLZkV3MnB0VmpUWGM3eXNZd21ZNGlx
a3NXWFBpdnl2YkNRZTdzdGI1OUhQSW1DcHRNSWlGS09yL1krc3BOaXljSFc4eDRq eHMvRzl1M2xWTWJuM1k5SUIydG4rNTdTM2YvcTlrYng2QXRkSFl3WTc5L2w3Rktq
R0w4TnJSR3I0OThDT1RpaWtPM1NKYlZRQUhGekk1ejN4eEIrZmN1c3pSVnpZa2Zp M1JwaGFjUjFielFZekt4YmE4K2JVUHhTR1hkd3E2QzNzTlFTeitNZDgvOW0wdE82
SmVqa2VmZzRJN25NcUF1RGU3ZTltdTIwVzVGaXlZazJnL3VKanplTDUzb1JDS28z RndzVTk4WVFZT3c1LzdES0N4YVBrN0Qrc1RjcXJOcUZqZnBYaGtQaHB5Yk1oWSt5
eDcwUGRnTGs1dzEzdWFXOHJKazB3eWtyTEJyME5aV3QrMDdaVVMxSi9rYW1vUnZo ZGloZGtPUkpINUZsTEtxS21RWXJpdVI4OUtGYUc0Qi9JcmNudGxiOTVFdFN4R3gx
YTJGbGNuYlV2Snd2b2E4QjhPVit3d2J0S0dpa3R3L21uMm1sTUp3ekdGcmFNRURV U0tqM2h2N215YzlROGRXUVg4cklLNlBLNWxpejJtejRTSTdXblZRNXRqMXBiRElq
OTBkaHZ6czU2emlmVjk3dFREUjBkQTFXVVZSVFphcWt0L3lHK21jNGt6ekJoWFVu NlM5WFp3UVVsMUJGTm1MZW1NVnVqNnQ0b0lZWE8wNlV6RVI1a2M3clRNbE5kMm42
dGN4eW5HT3NIZnNqWDBHZVZlQ3kvZUNZRUJsckJITmY0MnAveGFMcnppT205LzR6 M3Y4UGlZOTlWL3JMWFhTSFBHblZ4dGljNDVLRlExUHZOTGpaOWlQTUFGR3JTeTBI
UG5zRUF1bGxYdHc4QytHZllHdFhMaHp1djQzU0RlOVFCTFFKRXczNzlxbmYzdEI5 R2YvcFlGR0NtOTEwZGJSQlJlSWM2a2p1NnFnV3BXbFEyT0NrN21JS1BtNEw4QjRu
VlBzRGlJdEVwTWlhRVR4S2srczNVbVVWTkt4RWpFWk9oSjduZC9xd3ErWUZYdwpJ bGtRTy9sQm1JQkpWRGFWaTNhc2pyU1hzZDJia242TDYwNGdXbHpCRmpkQlFFUQpN
Y1owa1hUL3BZMFg1Zlp1dTJWSDVWZWYvcUttZk1YM0N0S0ZvbXBlUXU4Ci0tLSA5 UDlNSVBFcnd1dUJZS2lLK2ptNnFYSUZ6bjR2ajZtbEZQL3ZuTThKdTRzCi0tLSBF
R3hGbHdFYmVtcU9EVk11VGcwL3NmVUdRTzl6QXYxeHZSTU5URTJJUzY0CuZDGfZX U3U0bm9oMXlJeUJVL2FEeG9HRzN5c3dUd0NjdUl1MytwaHdVajdHTjBvCgpBoZIr
dFRT0LZDTdxOUWHEjhn8koUBE2R8qRRWD81Zk21P7V7gOuvfNHGnPPAp4AGBwz8y TmMzsSHAr+AszkWpzSgnQw4Yr53dfP3JFertkzbeKeYVC4SsBnNafpPmqikq7l0C
FONEUqwbdjuoU6M= RQGoDZ1GYgj0BQ4=
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age1pq1jqrcp3te50xugmv5wst3s9ahj0d38rfktxt43wlcqz7vnwyn3y2h7kyfr6rckrvmuk9m7yvp4efjnfsuxx6d8r9gn222r2eal5593arywrjwrgeypf745wyuvf3z2xk9tm5fgnwckftuvdggk66fph59rw69nt5dpjeewuww4vzt9gs4xelre952s7zjz56qv8tvesg2c89sp8rmy9dvhwfd6tucjhs6sjr6yp2njjra2u6w7c7f0sch3rwkw3wf2dc9su9aaa9q2f22sh5yf0fqejxa2qqpq4pg752589st5xsa5g8tpkjglj4tn35gd4hjj0xet9cjwhydmkmmkffy3nr8zdtctqu6pqsyf7aphvktryez39ru3qe7m6nvr465ffxr0ltvr85nddzxvcwpwpac64nu5tdfrxgjfqzc99vr3zxv8carpsw5evmruqlvrq6v6a4m2cwsz5gqw7nyk3jlj75kp5cnafzjn5dyrf8ppfhp5g5s34zsl7pejmmx2uuudjt7ru2y7as9mtagykrgqgt80fvp3eeh4gsmmd3ujgtp0ranq28aq9x0xdekqh49pfhhprjj6zqdfac5gxtjj736kh5jktc4ls4mjs3p33rzt6ze54uqsfept3qhua2pmugypup6hm6j2ek5sgxjnwvqyfj2l8vz4yfgkaxf699v7jqlwf7g68ang5kzqrjsu78lyardm4zen8zhrr24j334qdgs4zr8dhsfsnmvx9cdvu0swx27tcz8txs46zds9kekgmua7w7fnw3l2lf6zla956ssycac4zjy87rawr4thusxtcqgfzfzh2za9np0s34e5dwkp2l2k06cq09myxqfe7ze6a53d8sl5j43qcekh6kfvl9k0t7903q99pc35630zwm3hwxgnw354du5gngnz56skq9zx3pcnkr5eyh8r8t0dqudmvrrwmxreu6tgrklxw7yvu3zkjgt3gyjhc8kqcrevlukay45sz4k9zqxx9yrs88hzt4h52r2g74alf3cedes3atufy06q4lfq3nxdlnve0kqcwstzr6z6u7fqpqvacezdrr62ycteju6dqawkpthu0drtlxj547htfjcsnrmhgvhskwtuhk6yp7wp30p7qc5vkk8fegg6qx5kc9xs4trx7hj9xgydu7vd30hkceuxsczywjs9v2fl3svkwfypg62882yq6ltv7gfj4ajuy8ezd76g0z7juwspe7q6zs5ceshd6038tvvh2nlpjty6rg6a9qfzhgmjx9s6hynyk7xnq9zra6hxstg8p58x75hapd2mk6rapfunlnnkz5dsxjf4ud4dsvgjfjpzxcdy7sp8dzxtengrsdyu4824mqlw8p63d7m2z4mcyme4tm2qkugtdgrkyphe7akk2geukf6xkfkzd2pkdq5s3qm9fkvfkgrv6yw5kdgjak8xcgesg6tumans4fs8yrxtqlvv2z3emdvwchrjfq4xpzsj27yt4gdg8pknwz9tqpjkjxq6lysutrvwkvt2fwyj8wvv8wtmdl6fk6rsd9kq9a6wkhuq7vvrgwgj3xg2s229sprj4g2vzhy2dfesrp403gs64jqkrjuezwm4zd6uw2x4e2qkj8xqcf7c0zprdzu959x23u878vqqetgpjwt0z3kedt8l6dgpm0rf5dmrya5h3wgzfa0jjvgjphyxgxrwlrzpv4czgal933zs64tn90ks66ejjdaw4t67sch8r3q0kljeqnpdgmw0cpj6arc6k46wcqaccygczy76zt9362vslakvzqqv33tv3sjldp6qxprharmpm9uykgpx66343wuur5xj2aw0rgutpm4ztjzycn3a8d2jq2zpdzwmevezm7mkp9dmndkc3qz0kklgkxq9yehrk5ayfly97umhws0jll8qqg0r7gzxgw5vv76 recipient: age1pq1jqrcp3te50xugmv5wst3s9ahj0d38rfktxt43wlcqz7vnwyn3y2h7kyfr6rckrvmuk9m7yvp4efjnfsuxx6d8r9gn222r2eal5593arywrjwrgeypf745wyuvf3z2xk9tm5fgnwckftuvdggk66fph59rw69nt5dpjeewuww4vzt9gs4xelre952s7zjz56qv8tvesg2c89sp8rmy9dvhwfd6tucjhs6sjr6yp2njjra2u6w7c7f0sch3rwkw3wf2dc9su9aaa9q2f22sh5yf0fqejxa2qqpq4pg752589st5xsa5g8tpkjglj4tn35gd4hjj0xet9cjwhydmkmmkffy3nr8zdtctqu6pqsyf7aphvktryez39ru3qe7m6nvr465ffxr0ltvr85nddzxvcwpwpac64nu5tdfrxgjfqzc99vr3zxv8carpsw5evmruqlvrq6v6a4m2cwsz5gqw7nyk3jlj75kp5cnafzjn5dyrf8ppfhp5g5s34zsl7pejmmx2uuudjt7ru2y7as9mtagykrgqgt80fvp3eeh4gsmmd3ujgtp0ranq28aq9x0xdekqh49pfhhprjj6zqdfac5gxtjj736kh5jktc4ls4mjs3p33rzt6ze54uqsfept3qhua2pmugypup6hm6j2ek5sgxjnwvqyfj2l8vz4yfgkaxf699v7jqlwf7g68ang5kzqrjsu78lyardm4zen8zhrr24j334qdgs4zr8dhsfsnmvx9cdvu0swx27tcz8txs46zds9kekgmua7w7fnw3l2lf6zla956ssycac4zjy87rawr4thusxtcqgfzfzh2za9np0s34e5dwkp2l2k06cq09myxqfe7ze6a53d8sl5j43qcekh6kfvl9k0t7903q99pc35630zwm3hwxgnw354du5gngnz56skq9zx3pcnkr5eyh8r8t0dqudmvrrwmxreu6tgrklxw7yvu3zkjgt3gyjhc8kqcrevlukay45sz4k9zqxx9yrs88hzt4h52r2g74alf3cedes3atufy06q4lfq3nxdlnve0kqcwstzr6z6u7fqpqvacezdrr62ycteju6dqawkpthu0drtlxj547htfjcsnrmhgvhskwtuhk6yp7wp30p7qc5vkk8fegg6qx5kc9xs4trx7hj9xgydu7vd30hkceuxsczywjs9v2fl3svkwfypg62882yq6ltv7gfj4ajuy8ezd76g0z7juwspe7q6zs5ceshd6038tvvh2nlpjty6rg6a9qfzhgmjx9s6hynyk7xnq9zra6hxstg8p58x75hapd2mk6rapfunlnnkz5dsxjf4ud4dsvgjfjpzxcdy7sp8dzxtengrsdyu4824mqlw8p63d7m2z4mcyme4tm2qkugtdgrkyphe7akk2geukf6xkfkzd2pkdq5s3qm9fkvfkgrv6yw5kdgjak8xcgesg6tumans4fs8yrxtqlvv2z3emdvwchrjfq4xpzsj27yt4gdg8pknwz9tqpjkjxq6lysutrvwkvt2fwyj8wvv8wtmdl6fk6rsd9kq9a6wkhuq7vvrgwgj3xg2s229sprj4g2vzhy2dfesrp403gs64jqkrjuezwm4zd6uw2x4e2qkj8xqcf7c0zprdzu959x23u878vqqetgpjwt0z3kedt8l6dgpm0rf5dmrya5h3wgzfa0jjvgjphyxgxrwlrzpv4czgal933zs64tn90ks66ejjdaw4t67sch8r3q0kljeqnpdgmw0cpj6arc6k46wcqaccygczy76zt9362vslakvzqqv33tv3sjldp6qxprharmpm9uykgpx66343wuur5xj2aw0rgutpm4ztjzycn3a8d2jq2zpdzwmevezm7mkp9dmndkc3qz0kklgkxq9yehrk5ayfly97umhws0jll8qqg0r7gzxgw5vv76
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtVktpa0YxTFlYc1hVM2dP
NFZtbFpERUhuU2FENTFkTVpkQ3lXNzFlMHhVCld2cUQ4Vmc3YmtvVUZYOFFBZUFn
R1g3b1pHWFpXVndUNUpKcW5jcGRnaVEKLS0tIGRqUnltQklEczFzbjJ0Ymx6OENa
S2ZRMWxlbVQwS01EWmV3aHdDWjh2V1UKXfo7ZYYZXIjolTKc+aXHpi0P6QxzpaKA
5wi2gYOF5RdoyOyfjPYsIxCLFc+HO12X3BD2osomsT0yUGD12xWu5Q==
-----END AGE ENCRYPTED FILE-----
recipient: age1q7kz3pnfq6cvtn56rlfgs52efcvtcmaq4xny0va3x5wxj4vpgccsenwxk6
lastmodified: "2026-01-25T18:06:26Z" lastmodified: "2026-01-25T18:06:26Z"
mac: ENC[AES256_GCM,data:plHNLOgGWwNWbakKG6X5EOxwERE3rvYO4EOAzY/sz+uM7cZBEnqU5LZwjlD8B75hgRHqpnDBF0JbHgsEwVxfJJRL1phkeMJFOapQMjZVWMz6j7eb1hOwpdktd+bpuimy4XCD1aOxOoInKpFSK33usxLfyqSxjFDM5+i6D22qBTs=,iv:/iOIfNuSIDsa/UKLP0d63tpOrYMFO3Bk1qPssY0AzuI=,tag:k+824MXD+r0lNUcuvisudw==,type:str] mac: ENC[AES256_GCM,data:plHNLOgGWwNWbakKG6X5EOxwERE3rvYO4EOAzY/sz+uM7cZBEnqU5LZwjlD8B75hgRHqpnDBF0JbHgsEwVxfJJRL1phkeMJFOapQMjZVWMz6j7eb1hOwpdktd+bpuimy4XCD1aOxOoInKpFSK33usxLfyqSxjFDM5+i6D22qBTs=,iv:/iOIfNuSIDsa/UKLP0d63tpOrYMFO3Bk1qPssY0AzuI=,tag:k+824MXD+r0lNUcuvisudw==,type:str]
pgp: pgp:
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hQIMAxK/JaB2/SdtAQ//YjXqHd2fkAaaW3+lpKubSFc0EDoBfVqLm3rF1TSBjmLW hQIMAxK/JaB2/SdtAQ/+KTrL4s2iT7FbW5ofNIj/jzDf5Xq6W/pb4oN2Lfea3ZhK
wC7Xm+Q7TANTVAWSjdvsHhuMVKRtkZHvkM5BWPGAJ3kgv4ATplGg4NQFQCgUMaXm l9fegZDwR0y7Pq4lmzENeIlt4mqHWoINngpQXxuyul6vsIUgJyeYg1FdBWf3t7Oy
JynCePI9yeFtMJuXIjMdcxdEK4TW5QzLpUPyEPsaL2N6yWAQuhNeF0mgxpPwaFYq ToHEYEwxd/SajYQE0JKqb5rpVJUvnGSIpj4MsYgg94+PlsOYFMU08OuJ62w4Ko8F
9BTGHzz42JZciJ8CZzBS88fhxdH7vEFAb1jj4Gjz3NHqphaIDHB27Kk7rWVtr5+d e6lRgBqm8xf6X8apNTTMHgsLrtVWnwGL+Lb1Z6Ro7h7L9vt7QNkFEZPgKhRk8gAQ
Xem/pGd5op16LDeJkYbWwB/H1IwlqnGMEj1cfet0mdvTAR34mhKTXi5goA4DvL11 0OkEB1YerrKclxvq3tkIEwncpdzc3KIaeoVIXHzmr8IkDQ89SJue4TtgsKDlaSkv
eXjFwIsJaXmoqrATkRFjh5MblxQ1T/Xi7s0pf18AY6VpgLTeCEODwZRtRTzw3oh2 QYG7da7IK9eIJQN6y2PTlZlVdscTrPvEFzIZl6yfI/ZoaAXb4NSTXdXn8mT0h0On
/ZNVKrpY9LAlAGJS+2PKNyI1N/s88gtE9PFPQV6mKlkTGrKh/VzSlUI1FY0D2vhZ rWLlntBANQR1lulYADKjy1XZmqu/SqlzQmD5FVVrKs3sLOycnxqYJc/ulafAZoe+
6I9qZ7kM+B+D4+nZazc9RCangZjFQOss2eK0XFaAD7p7Ea40Xmv9QJvYO1DIhl5O 7fQirvNf3sMIowhE4KXJ0ZdMoIVmcKnqYkhKxXIHztUFeHb73zi3mtOTsuOX0rki
8SA2ibRcOZijvtMxZh6HE3kwmtDdrPV3rxO53QlgXOTnmcuvqKB/pviF73EkPpI6 kd+KH8h3ZBqJNvjVwLE2gPZmdrphEyD355ojpc8MglgH8c25IaFHouJKNqLMM+03
wdRZ/Jouz3EEpkrMwSX/+sfKJkTYiPF+2savWX6f2Rt7xuWD4REC9vKFPgRp7rrW s1wpOJ6/SPqKhdjqdHkILYWOfjSNhQDv0/swPxQJPLHwk6+mt1lE5wOpKycyIvtT
bkk9NAgJ10G1VaRCjK5kH2P4+ODsGXSumE/yNgPaYa8fILgw/zA/A9Hrm2+DMPHU 2EiTTTyyFF+WVZB2/D0FPkz6HFlrZSH6QVreCuC+KrZT6WU8sgp6qE/F4oaH9RTS
aAEJAhAvMlG604H1bleSNePoqXi1No2wFvOUAPd0jnDKPasKQRbBzXcIVXSa5Gs7 XgEc0Q/RwSScOs3YXmJUp/1JTiDs+jlPQJpKgR2JrljVNozs/EwqeNS6iQtaOfRf
BG59T5ntp9G1dSkGJwt7IFdnyEVJgQ+/LxhlneK0Ql6WcCvki6CieM92aekMJzGK V6VzxveUMnYPh9vE3VtiYRtQPu7DLzvS67bJukSXwjx5TCLnQgyulAu/XP/wQYg=
jFFdoOk8OPHo =dOub
=DOii
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: EF643F59E008414882232C78FFA8331EEB7D6B70 fp: EF643F59E008414882232C78FFA8331EEB7D6B70
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hQEMA1QflAioE8i3AQf/WEIasJedthFN+4ADOlvk6739WrA3tAG+Ml8IH5VguWWY hQEMA1QflAioE8i3AQf/X7/YOb54Ll1t6jw4bDZrSoJKsJFkyK9LGwYhr5NikP+S
rhquIJ01No1uyWlBnjl+zY4u5KedzBNwiSGH9NqdoFl4T9PDyPzhjwNKdKydelA0 773YDCqAsBUCyklV/oyeK+K7lZHXKGTms6ETObWwejOr8Opd2N9mMefNVmxOUveo
B9h4T1SNNNlhLzW7xwnaE2zzdVXc90MEzpsGXKGmaUjol3glxZGdLw2O/9lYakIJ 0BShc+0pdstTPvDcqVInLZ1FU0XJG90imJ3rRdXog92voiXxipplrNwFBc9lASaC
F68fW4NJSnQ3mDwFzO3fZBUMZxaMrj0eT2fXOFkzpLwO+k99QO5J+H6YDndFIrqJ AXQjuGZ9XzN4FP2k82MM3xNx8+sw926l7iJ/V0A6t1eswaPFaOlbZ/BTsIqQZX5G
NMNeKAPoj/IBAe8gO+zvFqMP6iA+1zyN/WLsMfbRb5F4lnnVkLfcNc0wI2Fzv1p8 M+Xiz1N3j9cH/OdKb50+gAEFGkW4r57qxJ9UNqrMhZ9IgjFANpRPuICb03sN7PyH
yWL3j7es1OYd3Zo6y9Oe/w7QmQJ+8h5+ginRmWic/dJeAU56lkfIB4pbCnGJBLgz tHuNA9LLVazB7+hCUlGCPlbw1JHjko7Eu5zno7Kz09JeAdvAyK4qKWHtxshUsPgL
+nS6EsY7ok+yzG/HelqGEtQwJPfZ9HR6yK2WseP4eYdbIGmkOISnt53Ft3xZPDHg H+GxFb3Pb6sP6hqH8EbRqiqhHFKFZbL9VHvB2u501YGCzv5J8qfyOyCNH64qicsg
FyylghYaF9KiEXknRY2b+fyRCfbHBBjnh6xVyILqPQ== +RSQ7PSX263WI/RvFeJxq72coGAOCygfYvm/AbteFA==
=ytdu =NLrv
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: 21C9579E6503CA815A68ABD8541F9408A813C8B7 fp: 21C9579E6503CA815A68ABD8541F9408A813C8B7
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hF4DsZXvxFXTXoQSAQdAY/QEMTJA1mP4qlWnMD9l3lYyEsF9LO+u0jeYwMR5c1kw hF4DsZXvxFXTXoQSAQdAdMgewk9kwTEHlJ4DrjEBDIQ9UibVAwcQGSDon5P71nAw
GFdqNpvhgbq56qmxgux1lCOcCgforwRZNrRV6zdQEccEpWLRUy/pmvqRBaSOYYe6 mOM7sg7H5GrtTxDN65MLl6P+IxeKkPSg1oWDCzRazfwbz04DKYBI+az1Mjgz0sD/
0l4ByIKrIab1smIea0ZeM7oZ2sRnzgNCOEo44ABuXQW3DoiFc+49DFKi1zM1+0mZ 0l4BL3Ufun28luyJVc65sm8S9xZxCorQlUPlRSRuf3h87cY0xzNtZQE4sFmtTdKn
uRbhv383SvMNWai5Tmf1JkrQHwfBwIuJT63AK98TfmEVrAu20qZ3E0TfB8cZ46PZ FlWirrr8GhxCmwOAuBk9334W7Em2ubSI7PFrr813JV6qSCdTp2GE6XSNMp/tc4Sc
=8UMl =/15a
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: 9633412309CCB83BFA39BA5F2FEF746201D7FCFE fp: 9633412309CCB83BFA39BA5F2FEF746201D7FCFE
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hF4DerEtaFuTeewSAQdAB+o7XTZVQJyJVV+5LDdF2qp3mViYE6srWmSBBQmplB8w hF4DerEtaFuTeewSAQdABZ3azfwilO6LhvmIpSIynGRkdYj+pOFehD4eLc6IX0Qw
o411SxMsKEk8ow1VgNKCr7KQsVgYrMTHVjzt+fWT3/CNYYtIs7/ox1RISHBjmUUg M8Lb1ThNCtEZLzYdxlVLxcQ6EaOcuwzzkNoW0u4Vtyw4ZTxxesr9fKUcjXHCeDS8
0l4BYqWvDsPEyjW1WXVjstuNOJtEgm1JOQwdKMNbBXKa245gFKmV1udAizGpI6DJ 0l4B33eqQMOlQQcTWSaTqVX6+hbDZJhP04e+E6AM5j35+eZI5wf1/RyA8do2CDeH
xiIAOSSYSLxuCY2PzCWsv2jx36nHW8LvELMRWy/YeaSQt4PKMSzqPucXq+2H/dAJ mZRIThD5sWfQQYEGvqGb6N7xzQQL27lYP9K8jsHLK9xsTtnUh+1Pz+l179nxrtYM
=bJQp =Oqyx
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: 057870A2C72CD82566A3EC983695F4FCBCAE4912 fp: 057870A2C72CD82566A3EC983695F4FCBCAE4912
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hQIMAxjNhCKPP69fAQ/+Lc3kfJqZabyEvtn0mT1uWm/TB9K7RcL0tfl7gZ7LVecD hQIMAxjNhCKPP69fAQ//Wz08vnPeK/tq+a+1Y6YU/O6IJ7HP0X1a8rAAarRfdjb6
0CS4vzNFtv52YsKYVJNAnjOWOPcgiXDCfBFAYQyuWINFqhKmeJqnjxCj6jki77j4 noO0y0ezum64yx5V63rTBHbDU34BbCu2+iFBt+tZFvCKNgF+O8wdJMu9sshGjp2v
tZq3wx6MA7es3lzsyw2uSX1duX0AG96YOCxTKuaAufVzWzKuRaxaQSp6fwKYxkGK 2Gu/+bTcBdnD/gIYGR2zKKOoMCNskT6eZhxrjO5w7B3fV64AV7lLQxQY5bXLK5ot
dnhQNcAmcUqgn48zzHppFIotAO+BT8Q3Yl6jwPnU6ofZLruxjsE+KmakNebg4zJ5 mell741FmaZm9cWcI82mlC1QrHlrakTTreNpu5pktTpei66+O2SnVGmHjWrRKDfR
8oc+KfgDF/907mxe7200nKmVRcuQas83q22SJS60n0Mf6S0nGowijqvkWSvDiQCa LCxk/u2bKjaMXDJq0Y+hSk9hEQsg1ZCgfyDmDNfdiqNxuidi5lUJyDPKHX8WZ7bv
3gBYuffrv1D8yjMPqf0qAz+OGdTz+75FEZYOIvCCspb5mgnMnkXTTOSzWQI8LeWu b9CXzqDB3zQekBzIQ/6/VXQxz2bGGcpd/1ksVolP06sNGeJdxxfmbKb041O/rx87
Gx+1gQpGHoD3BGJ2wM744A5J1uVyR/vFF1LGcSXrK2ScGLd4z2ipjjptZOSCjE2D mYkYFPffU/gOrYXrXkhBL8JPPKlBNJHdU101hjGkjdNr6CqHqPU3x1p6TnISQZvP
Kua4WK5tf+oLPMKDSOz+i+UBwOA3vMTPHMoJs+jGqNGqwBjKcbcZneHt080ror3F 4jQH+IjXUa3RoTeiZwgtvilzNyKmIo9RsnIiFcf9BxeAfBXkx1Sw+hR8byBhW0UG
aQawOFtHAxOBXYr+pFsHfbMODXTB570dA3qViVneNUPn8XXYyOYwYkE7/L3XpBV0 80B1Guug4Yq+VvKszNBDHRVhm5OkcDqZHy7dkZWb9BrioiRFK8sy7XtuK2EdbRO5
b8qfW4ueZRLMl2/Iva7YofzzvBoWRsxCNxhejYKsXfBE/N51jVHwFvd/VFQTwNZo prHeoS4BtZ5d6e+IABr7p8Nvf4/fkRumJGQEAwSqelFKaU5CUTu0bSBwYfH7udZZ
FIeDB/VwwsTSGQCKGPvYkLM49R4jrkIYcfmPdkiitGB94VuyREncJZ3j0twWrl7S EM1rQQJdVOeOEp+2hd9qeYSNX3McasYxYD4TqWgtu+94zMEdTN1vjrZCBbV0/ZzS
XgHxOo1fzxBVy7UTRJCdjsxeoLBd1SFUAyzsRe0os5hO7gixCgacPIGvk47BHK1l XgGV3em4L0ayFRC0LYxA2xVimD+Vw0evQ8Rl9YkneIteBW+w0cNIOBAYVtSAZzuf
NtY/JjeNltphHX8FOS98wv9NASAB3SVylfpcU16+u5Viv9cTvU7Y9Lev6ukx+Pg= ipmLlczYM/XLKzT67bprGl2rkOAucsQJL2yrjqyxo8t/ImCJ5poC3UBkbVPKR1o=
=zXaI =+cdX
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: F38C9D4228FC6F674E322D9C3326D914EB9B8F55 fp: F38C9D4228FC6F674E322D9C3326D914EB9B8F55
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hQIMA46L6MuPqfJqAQ//WYtKlggqzpAwBFD8mXalq69/I60hzt+ByURt3/+3jbz0 hQIMA46L6MuPqfJqAQ/+PSXVUk8+tOAvpSx+bzsIA6O6n2IOZ6dRnGO7dpydR08L
+rJd8K4iWvcoNLFYeVJ2gQ4WYUUdFEKRfrrUkytswNddfMEkGMBu1KdHyJuimAqI WpPIBQ4EcXEO+oXto6qrCOhiJfVc3DStAKUp+gSOE4OzE3Z+V1hRZL7PrxXWF+xU
xrtf63nXUSjqsjtsKplybBBEKeyHBN1JU1yT7jSU2RYpdoihTVvGIq6ceZbjB8+v bmB5/K5/52Mjn8tsdh4zLDJfEjw+n+pZabSrCaevcZg/SCnXZnUP5CsyaTlWpAWX
iLWWXGio2sdPtmXrofQ79muWvH6p1XIUHcKfMDA+L4y3AtOyyFZ149S8YaacIKq+ HZwDqtqpN8D2vNF2Rxv6ksksxcDzrMOVTvKimRKwmlHryFjrZ1fRJf0Fic0cDqg+
U8Iba677T5yxAbQ1z7+7ftWGu7RU93oL72oN9tx4Y7jlqbUCn2KvwRgZbjkdksgK 3JFi6yXx+bQwS8MkpDXzNRrL6mLx/HQEfvtEdqotWMhNiwO8n78CWvqaa/K5hdEe
6nfM7clX8EgbFxLermRy52WrooWZwFGuZw0U++fKxfrE/r5b1+uIli3EgNIw867r QiZANSyAeuHsoHyDkcbRitfHLiVfHNHua2GEuJkD5YQMvMwhXCLqfzvDjrATSicy
FooXu/vHClnIuqzE2YO4IABb+jI1qCEyyrrFqIfZJhU/jiueQBMrFgJz9oHvGOTt jyFGIA6kKf76j/JoFBRUXq+g38hNfaY9NnTP2uFBZvNXmC6bmFQAp6VZBi8vAnPZ
niqyAZAGR4j1No8l58ofeUc54TqmJRTgGtOlOJBI8AZPTZdhlN6jwqJl3yPkuRQj zjJB1HOrova/dSVLv2Wy9hI0vITkHwINQi33k+F9AGPYGLgPDJgr4cxkGC1kacyE
qJrC/t5ZvJUDhuy52GTtZNu9Zyc3lLKPs7sIqm3E7ctq7W1sDudNHvEyQmttXtiN /wwY5qBesoNJbDImKKPyH1OYuQwLSh3osWsinAcj02WSlWxe8OwZetAlLdBSINdC
FvF6vLyphMTlJWpqmEYfxsG2mFr+ScBFNdjqhmlKy1sPJ5b46yxkD38DsOYuDdSX 6gdxcy1Z7pDyU2HNOebMMsONtbb9RKjsp+s80J/ivBC+MsMswmkiKRuVuXsSqBKT
+RVHIj9awqqv/DpwSWbfTK/Ao5ZthJrmcbH277in/DngbleU4MRMitsAu7ZQHHLS eLut+lL2rVqs1tZOp6P6GN01LLVtmMGWagFptp/v1NaK7JlZoPBIdaCDde+hirLS
XgEdwO28fTGFvt7jVugFbBUa2HNl/SMBrMJFpMXKPhUv23J97C70cH1XyTNw0p0p XgE5K2Qjt1QmrUMJFCsTvBXcw7BvL9eaxFoSgipv/o8188leq0dR7yMSfIn9Bzhf
RIvbdopk87k8+xr7woi/mAZsBEE9wkNGzDoLgK6vzjA/7VbM9VRrPd9oDbZzkl4= SwIiMaKlw6T9H1ZXbukhAPioHo9QyW/yHIIQi/ALtHhrQcbrw4HHxhxkPCDRsvE=
=KbFY =hLHn
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: 8996B62CBD159DCADD3B6DC08BB33A8ABCF7BC4A fp: 8996B62CBD159DCADD3B6DC08BB33A8ABCF7BC4A
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hF4DQrf1tCqiJxoSAQdA44QMLrMf7v9+JsZLXyE3Qv5sOc+DmVkU6LvboKyV2Wkw hF4DQrf1tCqiJxoSAQdAVfiZlPpOP0mdwHvOGku4Z34jRn12oEkqjdc2GmMyvWkw
Mmm7BWQXJJV3Kc5rYLRUr7R7qg0QRVVekg2mh02TLqb6vcuCTgrKcWYq7ofez6w8 EJUK2uWQAPtMwH+7aXdPfgfgWxG/KtKILV0r4naDG7T2MOJsz6aV2uX0PGWku4ps
0l4B9Y5JV8sUH0uqnKq+TV4SyeGn6G6lSEGypPQ3YBmFSvMLuKzcf/SlR9bHYiHs 0l4Bcpwwt6S4bs5WXjp7Hp+ctwnPhFlIZSJINB99za/aTfQn4+QJIkGuNH7rprml
63g19HXDCAuO0bWP59hmwZL8DV0v55d6wqItA0KmlqreGQjM+11sEdDO5X90XsqL omjF/EmOLddJOjy3JfD04xxGcTXse+kzpDUwo1M8OaVUZQAOodM4CHs5SLNy/UPp
=Xuqq =2tQQ
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: B71138A6A8964A3C3B8899857B4F70C356765BAB fp: B71138A6A8964A3C3B8899857B4F70C356765BAB
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hF4DzAGzViGx4qcSAQdA9Yi0ArgXI5MDjhB8mgruSNLl7V78N2QWolaQB0xhT04w hF4DzAGzViGx4qcSAQdAvhCuEyTS1x2NpCUY8e5Ai6x46Ze3MVF1kQhEnb7jAnow
OLdslCiJJdsdmVJ1ctiD6uURznfn1fCFUL54mzciOF8C9/nHKrJEZt0WiPFXdEBx 7Gxgei2A6gNOF/qFAWRcd2rYJWwJgAAabqxIR9oP4jP15o/3k6ybJzHNu02AGuIr
0lgB5x1GK6zEo/HxyZ0AquRn+kZ0F0W7tYsMLziiDrGMqmc6gIjzA89JyP0fNTZQ 0lgBKQMurnFxnQxQ+ArAhuq8X1Bsr4P8YRkTXvuAMWXNo0Pntdb+Lo/b9/72W8dX
QNcKfhb97qPlka4XiLunRJyn7yE77a1m7WEW737HWndbYtcIRt5oRCFK NoJhpQozsqszCXMlN/zgiEgpW6GDFQbsZU6wCw/FAXK86E5ER65ldm93
=vrvO =BAcl
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: D2E9C0807BF681F5E164DAFC5EE1B61CD90954CD fp: D2E9C0807BF681F5E164DAFC5EE1B61CD90954CD
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hQIMA2pVdGTIrZI+AQ//fH+BFkgjaT20AyGJHUsVfv9BSRi1T7+8ISBiv1yGQ+bA hQIMA2pVdGTIrZI+ARAA2Lc60Bg71oWIpRdVRDkAxoPKQIJJt92TJT2EAOfjqFQQ
TqiShHPcJsq/M++iN+CTRiLpLbZYfSN71mRgYwVsy/2ykGZIzLzEelYAtyfDk17M fZ3xJ9HkA2lLDd7187Ua66RYs79e50nD424TQncyeF5ixxhGuYWRg6fERdk7DYle
GfMwbPSaux0rW/FnwYmYqRgz+4O/FT9N1HQ7uNErAYYoTT7McN1olQxT/qeCcqnD C0W9UPNSlra8vbpjIn2D2xxdgX08HKm0hk1nrrVBnGe+iyiKnoxfqn/L02QYoZ33
pDsodxZxQBGAW8gBTAFodubhj0jNSpaKgy7FUPF5OGeYyF76FjSe7BdKRksTgCPG eK5RIWasOBJg1IWtumVoRtxPQ32I8mZCjfMx0yesR/IzIUqXYEAuw6dYlL94/QDH
LXMcJ1P//sMXuTvs3iLQa7mYtp6n+kHU6dIFRL2iM/skxqvfXjXe13FZ6zFJaI4e Qh/d9hVIL2RZsw9fdIu3tqlOezhA8mBOQa+CpSZwys58ZESiAPQkkUfJm6/RNzoz
QU0FVlm6Tnx0DrBl+gk6/y6+ajVOfY3T+Rj3gBGUoAPuPCNVCcQrg/pSTTV53TyN wF/AxQ+bZJWa30Uopm44JgSLJF8uQ0NYl2HCr94IGsAR+vbM1wdeh1xxyh4bZ/Gr
FpVGwYf0f9kCVjqqviW/f0Bgy2KwqIwSKiTmWP9iFM3C7oEFonXWbtR97DG0OnuF fDFZz9Nm2X4RRvfdC74PBQlgDBU9M+cQfpBgyr8coPkZhQW8a3gHbVDW+Abcm61C
dyw3QeyOnIVXsgpnwouc4FtP7fb+sMZLKaSloo+XzzJSxjP/CWshOCnyZP2PWX7X Qdj9G3ip5OJh4wW+t9qfaXq0RAwYeud17cC5jgBBpGxlBQMG8veh51tAavqVbSCz
pqNXrAnJnZKu4rO79osj4VX8tVXf7vPjjKufzmpuXiErwuS6CNARnLS6PS717hse ASa1IMYlubIhlhAmgj6e444NhbpVBFXhpgRWAdSKQutSUovJHfUNVRhyKJ1YyWYB
wEkz4XLcRd3jVfBlYgkMgzyYiqlSMzL7hHYSyvE1nBP3xPCfKJ+LZ3dnJALT4Bmr 4hH4DU/JPWB89+qcFbxSeKAic9GnlqeZWZhQG0nm7gs6GidqB+Dh5vGYQaHXLYw0
CovNtl4ZcHLHpSG0Uf1pXLEAJsNXMpfdSL6oFw0gS7e9rPoL8tAF1QROFRJ8lEzU zaDDxlsJ6iD43T/lNWXMuHaDEtilXoD7K6SQH4jK6D9CpOjcqxYjS769CxIgEnXS
aAEJAhB1Cio/Bv4BJ74/4GOUJZFmA9oPAoXsJxlLRjNMdkSZEuHI1cQJsr9+TIuu XgFG/n2Oige+Lhs71B/mr0vXO9eTj8bTCL3NFcLn6hZfI1PEim22mliCX6aq/gG8
FOdzTax3Uo9tbCQbLgIh4SAIIl2s3HXzmBcpUg7j+TooYTJRbpeL5FlePysXyxSJ ybF0q1+RXefUyVkm0AypjnAjxT4NcAyofVCSE/p0/ibKo4MAM0ieHFXFSM31CN4=
TCSr2lu4uSj0 =8fSf
=VINh
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: 878FEA3CB6A6F6E7CD80ECBE28506E3585F9F533 fp: 878FEA3CB6A6F6E7CD80ECBE28506E3585F9F533
- created_at: "2026-10-08T12:21:49Z" - created_at: "2026-09-24T19:55:29Z"
enc: |- enc: |-
-----BEGIN PGP MESSAGE----- -----BEGIN PGP MESSAGE-----
hF4DKKbvh61jX5USAQdAi0Rv5GPtHE2h+nFFCxBAgIMtt5DmsvAHEd+ZK8BO7SUw hF4DKKbvh61jX5USAQdAtmcNNFbgzNqbJNDvVBU9/0LvPS/ZQPzUwdLMOKBYRB0w
vKs6PtoSCJKsMcr94ZAMoIeJ/QhrmCEm5yK2Q9zB19wnCCJ4ec2KNISRGbFFEKsS KOj6IwFIjfpWPTp0Hl9hIUqjb+qp+kW/DhVBazi42ewI00ESTkEy55UXXx74LUmF
1GgBCQIQZe+/ScZmD8ShMUYQftcGfi89ylZrOq2ejDpPW/05XFcatLu3yvKa1DVG 0l4BPW/ETSjjC6QWSrAqPN0k+uGY1tp/63lB28CK/4UKI4MykeATONRU8tvvYTS6
myj1Svg4cW831BEUzeLLMwDVAD8Pg83SyFlzqwXxqReCEkylmHDBEkuXlG7hLriX Z0x6Tba8zskvL+KzNhdrEljbXSfR8vVkGtd5Y1Do1lt4JjEMH25L+8pNA5YYC54/
K5gy3LzBcHqjng== =DXqm
=kqyb
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
fp: 41FFAF3D519CF5C039FBD8414BCC213729AF0E49 fp: 41FFAF3D519CF5C039FBD8414BCC213729AF0E49
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted

View file

@ -1,4 +1,7 @@
ansible_pull__age_private_key: ENC[AES256_GCM,data:8PCkZx76R5aWPITn5MCZCMckXvaLfVvnDgO70XmF/eeH5xLVOVx+EC3DZjmHxEoW7Kn4LAJTR4mWl/xP+p++elRvTMcHltV+vBQ=,iv:jKq07NLM84MSGU4CCyUS9ODmwiUMhlDONkKJ7P9P2DM=,tag:95yBZlwYdSNeX2O4t/h9kw==,type:str] ansible_pull__age_private_key: ENC[AES256_GCM,data:8PCkZx76R5aWPITn5MCZCMckXvaLfVvnDgO70XmF/eeH5xLVOVx+EC3DZjmHxEoW7Kn4LAJTR4mWl/xP+p++elRvTMcHltV+vBQ=,iv:jKq07NLM84MSGU4CCyUS9ODmwiUMhlDONkKJ7P9P2DM=,tag:95yBZlwYdSNeX2O4t/h9kw==,type:str]
jitsi__jicofo_auth_password: ENC[AES256_GCM,data:a7y36RJUR4OBtVNzgmqlGEsg1hNRGgsuwG2YFJrDlMI=,iv:mnGlKOXtNltNe3wY34BnVCJ9CtLQ7aksr4xXbrTOnJg=,tag:j1N7MUTJG8K0JW/a6YESFg==,type:str]
jitsi__jvb_auth_password: ENC[AES256_GCM,data:xUFiIXAzY4pEpwgL/5LPBlhkx73RX6VFT3QJlG5QbFo=,iv:/XqENztrrpj1h3lBhEtJJo78lCrxrMWxRszNjSwx+KQ=,tag:+LRYmv9Tvt0muR47QTd6HA==,type:str]
jitsi__turn_secret: ENC[AES256_GCM,data:UPev9ND9Mf2gGK28huQuuxRyUZvPPCmFL9rU1f0zndSPPBMspSsnlgtMy0+VY/CsGEIEcWsy3eYDPcAW/EKFtA==,iv:ew0MKP5zdQvqfla2y7xkcXLm3qSMlf5sucn8Qu3G3Zs=,tag:dqe239LD+wPVqLQFF+nz2A==,type:str]
sops: sops:
age: age:
- enc: | - enc: |
@ -30,8 +33,8 @@ sops:
QzBBdJ6TiDwJ1rwwM211smfIbcYhWX6C/EfitI5XoIW8aS4ln1g1Ww== QzBBdJ6TiDwJ1rwwM211smfIbcYhWX6C/EfitI5XoIW8aS4ln1g1Ww==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age187zdk64205lx7r83a4m26pfa8hq6khc8sf83k266jasngeq08v3sfqswfg recipient: age187zdk64205lx7r83a4m26pfa8hq6khc8sf83k266jasngeq08v3sfqswfg
lastmodified: "2026-07-29T20:26:44Z" lastmodified: "2026-10-08T07:56:43Z"
mac: ENC[AES256_GCM,data:dHiB768SBppBrjNoSpgDvriCgrSNzIkpSYzm9REx4otbnvNjHYPhP9OdsZ6zTcoFoX+41/zE13r4EoAz4F++jdJidv1+7DMFvVUKMuFNzp2VjDfB1ZNzzyM+px7l83L5eNhgNPp26mweOVMEz92NgB916KMY+5e3uUeSR+iIdho=,iv:7k8rugBXULjPSOZukQiufNn9Vs5uWVhcvFKIhD1o7so=,tag:IE+2uhzGS2xJJgFHuc94CA==,type:str] mac: ENC[AES256_GCM,data:CgD19xHN5nEg9TMQq/c4Xpv1LH0LfcXrkfBMUcbJiIn4FsSzQetLYxueeDXUVOujOb9ZSEin1nR+OZwa/nuwN9mTg37c0XZ6HV0UvNNEIrN/o4doUCQa2jLmbX8etxeNhF7oWJ84OgQIhPLvLwp3Z0A/+kPKbmtz3znQNgKoHQY=,iv:6Dt7z55az2SJovJ7ozG35Q99a08kOrKl/uQCUVcbq8c=,tag:M6p0ZJzoFnWgspnGknq7SQ==,type:str]
pgp: pgp:
- created_at: "2026-09-24T19:54:13Z" - created_at: "2026-09-24T19:54:13Z"
enc: |- enc: |-

View file

@ -0,0 +1,33 @@
nftables__config: "{{ lookup('ansible.builtin.file', 'resources/chaosknoten/jitsi/nftables/nftables.conf') }}"
# renovate: datasource=github-releases depName=jitsi/docker-jitsi-meet versioning=regex:^stable-(?<major>\d+)$
jitsi__version: stable-11248
jitsi__domain: jitsi.hamburg.ccc.de
jitsi__letsencrypt_email: le-admin@hamburg.ccc.de
jitsi__jvb_advertise_ips:
- 212.12.51.139
- 2a00:14b0:f000:23:51:139:0:1
jitsi__whiteboard: true
jitsi__turn: true
jitsi__prometheus_exporter: true
# jitsi__jicofo_auth_password, jitsi__jvb_auth_password and jitsi__turn_secret are defined in jitsi.sops.yaml.
# Branding
jitsi__env:
DYNAMIC_BRANDING_URL: https://jitsi.hamburg.ccc.de/static/ccchh-branding.json
jitsi__custom_interface_config_js: |
// Replace the footer with app store links with our own in welcomePageAdditionalContent.html.
interfaceConfig.DISPLAY_WELCOME_FOOTER = false;
interfaceConfig.DISPLAY_WELCOME_PAGE_CONTENT = true;
interfaceConfig.JITSI_WATERMARK_LINK = 'https://hamburg.ccc.de/';
jitsi__web_files:
- path: images/watermark.svg
content: "{{ lookup('ansible.builtin.file', 'resources/chaosknoten/jitsi/web/ccchh-logo.svg') }}"
- path: images/favicon.svg
content: "{{ lookup('ansible.builtin.file', 'resources/chaosknoten/jitsi/web/round-logo.svg') }}"
- path: images/ccchh-background.svg
content: "{{ lookup('ansible.builtin.file', 'resources/chaosknoten/jitsi/web/background.svg') }}"
- path: static/ccchh-branding.json
content: "{{ lookup('ansible.builtin.file', 'resources/chaosknoten/jitsi/web/branding.json') }}"
- path: static/welcomePageAdditionalContent.html
content: "{{ lookup('ansible.builtin.file', 'resources/chaosknoten/jitsi/web/welcomePageAdditionalContent.html') }}"

View file

@ -1,190 +0,0 @@
ansible_pull__age_private_key: ENC[AES256_GCM,data:/+Ub9S/CRrSAeWX9cXzIMHjmDXwAh7hPSzXDnSh8iIZMJg+zW9c7mHqJV5B1AtDp9EQ+pSKpC1TdWuM0qGUABIi+cgZolWISXiI=,iv:lfHLyKsIgNhSm1pVERHT+2uMsP8PP8A49C9OAGsYkL0=,tag:AHRK8KuJJCZst+MsS3wXsw==,type:str]
sops:
age:
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHFyYkk3dyBkU3pq
d2pwbWxYdVFPemtPODFrRVpVZldmWC9UNFZWajZSaGxCY3pVVEdvCi9USGZXbk93
Y0J1dlN1eUdnRWY1TzRadndlTElmZGp5ZzZhUG1wa0Zsbm8KLS0tIGhybHFzWlBv
bnZDWk5HVisrYjJPZkN6ZGFua1VPVEZCUVBlYWdCQkJ3OGMK1ZqF+UtpicLevUOe
LFZwLqDQwXV1lKm8n1+DAnLkObDc0Fi5tcPSouEiANCnE1QjJzOW6gSWv02qhVDR
EcIyEg==
-----END AGE ENCRYPTED FILE-----
recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIBQgnQAq6FUSDK8bxtYPjx3oRCAKG+xy9J3Gas2ztJk
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHBpdi1wMjU2IFZoZXNPdyBBbmw3SGt4
dEdLODhDQmZoV0VBWXVaNGJDSWNpVjF6ZXlLZW9oSzVKaEowUwphOWdtakw1TytC
R3M3S0l5eThRaGYzUlZTeFRYbHI0eGpwSFhuTVc4WTZnCi0tLSBnUGhXeWRUQi9Z
WXc3QWpkZU1zYW9OMnowZXFHMzg5dkZZS01XRTZLbUp3Cs0nUaGOZMEI06uupspL
6qkjvBLKjClmf5ve5P4v10NgOol1tlS1zSHfr8L8RKYMSlTFKaEKRoqVTO58OOsy
1dY=
-----END AGE ENCRYPTED FILE-----
recipient: age1yubikey1qv7jkffslarpma2fxjm9gnq43xfvwdws0m6y3u58h033edwdyg0uzt8jl5n
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5bmxKVk50T204VDVSQzZX
QjNGcmdCVmMxbTRtU2tXa0tsQkNrWjdtYWdvCk92VFE3ZUhnZEthMFYvMVl5dHlu
R3FHZ0ZYT3FMeEdsOG5ReEIxVUpLM3cKLS0tIGRpbXQ5ZHBGdzd1aVM4dzRWUEN1
Uy9kV3hScFR2d0RvS0V6aHc4bHJVbncKznrIswWDf4hULU1YM0ePpoTaU8wE3l42
qIJBztm2souvOZDMZSmbhKRptvwVcjIUrZ09uNqAWe+j22gYNlQMtQ==
-----END AGE ENCRYPTED FILE-----
recipient: age1q7kz3pnfq6cvtn56rlfgs52efcvtcmaq4xny0va3x5wxj4vpgccsenwxk6
lastmodified: "2026-10-08T12:20:28Z"
mac: ENC[AES256_GCM,data:3EAY9S9ZYjjXmqpV0DOZvc1ANHi4P2EhLM+WURsZPE0r1P8YDR0bAxbqilrCbm4U6WznACNfcoyn2esFy63t4va/TyVnLWfukqCUF0+xjd2ICMYTMsT2vzQDFDsBE1RDVJrWuCPC+hsZzBO0cRHrUBRgbWFuDa3eZHXxJl8YAWU=,iv:qNmzrSxrPozOSlh6re/czhUwnfgvAZfn9JQNADSqf3I=,tag:hQAb/WM1ytg3Avomt22P5A==,type:str]
pgp:
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMAxK/JaB2/SdtARAAjTbq4EiPuVnzvKLv4gq9zxoILQFrwx1/SD/oLg7H3Sop
Rg/0Q9MIIREUdxtgrMyurHNCzKkSKnczolPc09qPrRJJ4NwPM0vIcvgAzuazL7GG
UXwszt8aGum516NvABOb7Z1VYsobpHoj23b9kUvC74w2jmXlgnfpzxaHyv7026kP
fRclNkyP9oUpFTPz7Z3VqxeWn6ikEVggloRf/jw29rFtefII529oeIt7YbF+aFYi
CJBfLC5x58KQdVaWC5R/CNMaSNVt7KKnUm6MSkx0du9PpRMqjcZpB26BWb4REGMv
AWW5Lr99vstRBdbGBVHESwu/pkCTtLEA2wBZ7qDWCu7bkrL1p4q7IvQUXqSp4iWG
yagjS2X1ePdXOGgr9bkfcHMoXZw/grc8LFyL79PbuINrnbBW5/XeuaZmxUj73LoA
zGny0He3iMcOzOSrj9FLHODwYblEDMljOP8WEIE+bKhlJwfIRhuTZAzeFWbbV3FB
BH5Lyx3zzGazNxhebiDIuk3Pf3GyRdlWRlXZDtcCyI4wL1tBuFRr83p9IribeFx9
XT0q5+WPbgoLfH7FMdYrT0/rXCZlfRnhTO/lIcph7G10uIRvQxyrKBvTdKKPl/UT
+hWOH4tFTz4sNHiZmGQby7DdE5AYveCHKEgvMIbWa9Xf4O4N731YGjnF28mBE2zU
aAEJAhCvWojK90MZ533d5BPheM/OALJSzV4Rb2dvUF9Pxi0/H4Ur+Aelf6ROPgqg
nXulA7W5CSk+PI5cF1zxBU0SFKvM3Sxtd2HR9rgkfa6z1FVnkkg9nKYoBiPf6i+S
D+y3odZo6qpE
=mezz
-----END PGP MESSAGE-----
fp: EF643F59E008414882232C78FFA8331EEB7D6B70
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQEMA1QflAioE8i3AQgAtTqiXTWMOA5ctm97GM0o1lKPVgvLpmp78pLpE8mQOXzb
WKLInfAdEnBLcWThcEvVuBIvkJI14ZV3FBhLxuwO5mnOv5GbG0n0o6GyAtVOflUi
NycoWMZRzwaddXlPuLc222z+ADbv+7LyKb2gIIkmxj3+oD5BSEIIjjD0yNOMtu/y
jEi8xmuzXhIfHI05jnLMB1aWN1fyBlhTVyS7K7rqJ/8fttwZm31mx7fctq3Auy5n
aODdH7D70CzVulgpjG0v6S1HEO5tXCpPLCWLrKLnFpf1lXkmfJoGCHUPHH/6bag+
p2U3GMW1Hs2/gW7S15KCENMJCiIj5KKuXRWsiQ5xHdJeARvq7GCMXkd4wGwMBSpH
vx44gnqmK5oC/ThJycpZBvw/zWFCZ3SLhKzMXbAa7yHk9lTcLOlxY3QDPfAFmvvF
7AtkynXrwhAzi4K7AMQFl5bOTnIr2AUlNliLQtnzdg==
=GhBB
-----END PGP MESSAGE-----
fp: 21C9579E6503CA815A68ABD8541F9408A813C8B7
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4DsZXvxFXTXoQSAQdAZHaU5wfL+FMNLhmZF3cBSgfo+2Y2HCpiGPpxSS4JPWcw
mq0T6O82EvGF2K1bzGeOOn/yNXQJxHGw27qwDcr0POsKR6FtkuSimlQL/p9TP43I
0l4BV+yTpOOBwG4EXxX0ynx6p0jT//W23AJ+wFpaTjbdYv52AYhoYNaCxBCjUo9b
2h37HLQHm7sgUt+sQTRbUB2PjJMmFrYelKXEu3h0LNsIvEGxDErzjgU5yVsYvz/W
=pk+i
-----END PGP MESSAGE-----
fp: 9633412309CCB83BFA39BA5F2FEF746201D7FCFE
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4DerEtaFuTeewSAQdAF0xXSYZ1taiaFPSvCVwt2Jy+jl2wd25jGsUa4RC/cmcw
7hjeKkXHoM6kjzaTjsXjz9UWol3c5vkX/6fbSrXEUJijCA7IDYdc19HDIOO62Wk3
0l4BYTPcsD3+VrGifY/2lWoEU4lhS659VSQJEThgoRyBRtWuqx9Awhb5IhpR9lP3
h94Fkt5J4VPqBHKKk/tmA0e5FIodiU+U03kvOHH5cVL1SlQBF6GyyJLV1qhl8dYq
=rnX7
-----END PGP MESSAGE-----
fp: 057870A2C72CD82566A3EC983695F4FCBCAE4912
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMAxjNhCKPP69fAQ/+PDBjhWGJseOyYlKQI6NX8qbQa7+73sNVlw3hZkiYGKqY
081OM7MHg+ku3L+uVbYmYkKDFEFrCkcnlMJFiDa20igAf2S2+XpQ4DL1P19rsgPu
g3lmFxqmisB8TE1cT4Nv4myYpWfuYhecliUVqdx+uLX31mkqmG9c4aWIUf09bRWR
nFUihxHtl9ha7qvdyzpAf2qLu9rGUnAfvxWo2mr8IMYyiMMZu5RIS4AEbSgcDmci
zwS/rJvwZ3Lzykxgc81qDXk+Ajg0hW1QwIF6YtIqyg5SPj9TZyy3gHVpLO5zWbm3
XywYH3Ht5qjma9lOGDnWotaBazbCgA9wWmnghwPETwB/9XYtrUTuEu3YWGvpJ5bw
KY+Fak5QzSQD5VtQec1hGoRU7O6rclRGhe/2mF3lssmCwYolkYqZYOyxrhWrtnb9
HYx5ODihDBI5p6mgVhVsb5l7hJdM1qSCRmqk//CNoMUEBftqjKGKf6/c6OPRikr4
3KPPeyqBM85WNT0WbEmcKsPyDqd9UL26RHg6EDsP3pzGEZxgpgvHLWRw5fYfQQJY
rIb/+hbkl51CcJICUh0qiKST/5G78InwOVsAG88X3tK6QQYx3rl6TjD07JL/9Fow
EiSpQRyJaZM/GpbFdEJJN0ic/xnbSdS0SU7G6iuodn/XJQGkbTyfwa3ZQ7KFNATS
XgE74wKyqFmcG0kD6bIR/nxVnVKJBAqzvwIZrFbNdtK+TiaSXfLFKO89MP7fwA3f
w+TwIsvbx70sa/Icxjhzx5WfLUzTFuJiD/N41osLnfRPNLI2gtMw+Sk0b7Tv99w=
=gkl/
-----END PGP MESSAGE-----
fp: F38C9D4228FC6F674E322D9C3326D914EB9B8F55
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA46L6MuPqfJqARAAqw9fVa37NNtVI47ezmuNPHENvQMT5a2Ci3JXAHe4PqtU
J32K5G6kmKSQ0yiuEvJRebSgM5AmCX8yn3Wq0E1titURVbsyazVYWvxoFhm0uvyP
+0cD/HthRUUvnMGOVcFT4rtH83nrc50xvjAWvIRD7ey7ZnwYybJBSKmnIuEtWVlg
JRY3pCHmacEZER4P4zhPm4I2QhcxgNFI4EZCo66TPaeSe7q1Ai9ul+wCT74+z7pk
FXSON8SHYWZCTEXfOrv6U029xuEQRzu4ScvVsAHVsTtZ75b+7CuEwRv9qhpwsLHd
5vwrskhgD90TJ4JDdb3jeeTaqZoqmO02jhfXOdVR1lrQfYnK6qV9Y7gQxkdgw7Jx
Tus56EtLQvp/Z8Uw183oawe6WGnltSTHmShuvUMmwHgtUKWUw0LCHZYRKWmp5LCr
BBDZ5a5dnROVOJQjQq9vZMyg/HDT/OSE5YnfGuwBxkKcR11HKqwwFyu/MUasaVr4
B02gq8ahcEuXt9EeNDyb+pVCo1c7ws2e0X2zpzAVp49R8LQemicLWJlzEZ0/1D9W
WnYS15dPVjBUutBbWw4PeDaRkMsz/QKygWT5eUGdl1NaWtLfQ4GKIJW1M8qqphKX
e2H1aF5m7qi0ITH3Rol54muHRdkSppfofp04UJl7UI5nxnREHyq2Y9w35BEuBdDS
XgGpZd1cam7KeQFJs45KHKVwceVOpzh8isCd9BrDTPZC4yldaZ9mp9m2c9B9zTxL
/C3DtJ1Gn0dzi/+ILMmY/3cAdS1a+4pmeQIHSRTL0pIHIpzG0fiGQw/Ai4s+qI4=
=kFby
-----END PGP MESSAGE-----
fp: 8996B62CBD159DCADD3B6DC08BB33A8ABCF7BC4A
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4DQrf1tCqiJxoSAQdAJH8Ygdx14onZM1SnDCTN1O6x9OmgRgzTEbI6qPNUclEw
HgLaTV80+rFn/ujuPfPyAiTM3XofVd1d8x+jHbjg/craf5cqz0plOfgsdFetKn6+
0l4BW9eo3BLtz5eL0UA+loM74k5tcntEYV9haS4KV+q0HQz39MkBgJoilBfxu/qx
gMfvWmyEYyMv+IgYlPbxkkudgpYRvA7hStpjpDOPtQmJoAZ3/MSUZulJZQVoauyk
=SWSm
-----END PGP MESSAGE-----
fp: B71138A6A8964A3C3B8899857B4F70C356765BAB
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4DzAGzViGx4qcSAQdA8TY0wRPRbBddfSbKOg3IC5WrQ3bWrQhnAolz58UO80Iw
yJy4w50zMmD0cVo2l6lXdH0BFsEdIRJSYGdCln2hFIT3Sc45I9N6XtOI1HTgZQVb
0lgBafSzV6bjtbwa38Us6Rj8IeAw2gCclgLvoDgTYzw6HJ/BsnTfXCUQ9I/rVWuO
b6Be+eiYZZ49c2TsgSSJWFlZftM1dJXvKMK9TnbRxqES7Qbv6vklA9yD
=dpIh
-----END PGP MESSAGE-----
fp: D2E9C0807BF681F5E164DAFC5EE1B61CD90954CD
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA2pVdGTIrZI+AQ/9HrbbnAxvHFakxFXG6Ol7u6N4m872b6bCTo7gIF5z25yB
gstxCI1N8UL2kbbnHRb9WpJzJvkuwgnEnlB7zgf60g3bxD/L4uqSVVQ6M4rOUCp+
1TE4laYekMc1rHVEE4OLLC0yLmgTlD5M2not7aMZBigHMYkeqQFIlGrG2eIqIaPc
CYTnofD/AF8CkG7N3mCIv6Ssd/3DIugeRVnrJnOjQV3IzxLuetgYh328rb5mFoXX
gSOZSr++q6/1/8xUG51k/cp02hiZ3zWhRcZCmxLRJyiJem4StTgIZZCyWnQjJH14
i3+S1k6QXGMQ6kpRvpaChLLHbgHI0lXPQ5xoTA3WTT51S+tOiyiRdxUJ8qGq24vc
cNURS6JkRqaLSUnihSF6/ARargknRgVeKAZk9YEnanx5Me4ItTf3gTip7ublwIxE
E+Xvk6S7E7iYpL+gw4Iilu65IW+vyDNorY+RmsHEpPMeuv48USvKF/zj7TyXvXcS
DZvTNxryKpWoeA4LzGqJ8VcEIZU00AS0UectnfwNCBBbC9OpP56lXphjyjbFDP/P
e3SSy1+oTs1/cUcm1HXusZt6MdlA+du0I78ALw+krioFK1TpPkqyQ6ZQoAla1+Hp
4kyK9tQN9idnPlmKFJieuY6ZOLky9+MktSDDoL3/cqAHqje25LDpocq0EkBUiMHU
aAEJAhD+JlpnuW7EM9qYKAIN5lmiP7K0QbYyhfOYkswxmroGjtX+my5SQqxxr1MG
hJnzY7sYCateW5NkRm+PIAJOgZlCCHLPc5Y/lTmQwMioTe6o5z4BnQKSkpIONCQv
S+jtdlST1LjD
=hfRq
-----END PGP MESSAGE-----
fp: 878FEA3CB6A6F6E7CD80ECBE28506E3585F9F533
- created_at: "2026-10-08T12:18:55Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4DKKbvh61jX5USAQdAuJWl9BzoG4EgrKSWnaV8Q6syp6UK2cAd9LSZdcYl9k0w
FIXutszrxUFVq7+26KMogiSRn6D+MNF7+ECDV6HUMqSQKFi78xzvTsE2nSIcdhV+
1GgBCQIQivn/rlA7N4tsBFG0EYqTczeco9ujSh7s94l9Tgbd6vi5yTjY+M6dGQkk
s1C9k22rcMjeoeumUNZeY8gqh+IoEZyUDGk+faUf4TrXFc9Fmgxc6ME60U0t5Tnr
Aa5A2xoopylZeQ==
=DeqF
-----END PGP MESSAGE-----
fp: 41FFAF3D519CF5C039FBD8414BCC213729AF0E49
unencrypted_suffix: _unencrypted
version: 3.13.3

View file

@ -1 +0,0 @@
# tbd

View file

@ -104,10 +104,6 @@ all:
ansible_host: forgejo-runner-external.hosts.hamburg.ccc.de ansible_host: forgejo-runner-external.hosts.hamburg.ccc.de
ansible_user: chaos ansible_user: chaos
ansible_ssh_common_args: -J ssh://chaos@router.hamburg.ccc.de ansible_ssh_common_args: -J ssh://chaos@router.hamburg.ccc.de
matrix-sync:
ansible_host: matrix-sync.hosts.hamburg.ccc.de
ansible_user: chaos
ansible_ssh_common_args: -J ssh://chaos@router.hamburg.ccc.de
hypervisors: hypervisors:
hosts: hosts:
chaosknoten: chaosknoten:
@ -122,7 +118,6 @@ base_config_hosts:
jitsi: jitsi:
keycloak: keycloak:
lists: lists:
matrix-sync:
mumble: mumble:
netbox: netbox:
onlyoffice: onlyoffice:
@ -146,6 +141,7 @@ systemd_networkd_hosts:
router: router:
nftables_hosts: nftables_hosts:
hosts: hosts:
jitsi:
router: router:
docker_compose_hosts: docker_compose_hosts:
hosts: hosts:
@ -263,6 +259,9 @@ wiki_hosts:
netbox_hosts: netbox_hosts:
hosts: hosts:
netbox: netbox:
jitsi_hosts:
hosts:
jitsi:
proxmox_vm_template_hosts: proxmox_vm_template_hosts:
hosts: hosts:
chaosknoten: chaosknoten:

View file

@ -110,6 +110,13 @@
tags: tags:
- docker_compose - docker_compose
- name: Ensure Jitsi deployment on jitsi_hosts
hosts: jitsi_hosts
roles:
- jitsi
tags:
- jitsi
- name: Ensure NGINX deployment on nginx_hosts - name: Ensure NGINX deployment on nginx_hosts
hosts: nginx_hosts:!public_reverse_proxy_hosts hosts: nginx_hosts:!public_reverse_proxy_hosts
roles: roles:

View file

@ -139,7 +139,6 @@ waybackproxy A 10.89.212.33
alnair A 10.89.210.23 alnair A 10.89.210.23
TXT "Sun SparcStation 4 Retro" TXT "Sun SparcStation 4 Retro"
ptouch-print-server A 10.89.208.14
; ;
; Public Club Services ; Public Club Services
; ;

View file

@ -512,7 +512,6 @@ public-web-static.hosts IN AAAA 2a00:14b0:42:102::17
forgejo-actions-runner.hosts IN AAAA 2a00:14b0:42:102::18 forgejo-actions-runner.hosts IN AAAA 2a00:14b0:42:102::18
forgejo-runner.hosts IN AAAA 2a00:14b0:42:102::19 forgejo-runner.hosts IN AAAA 2a00:14b0:42:102::19
forgejo-runner-external.hosts IN AAAA 2a00:14b0:42:102::1a forgejo-runner-external.hosts IN AAAA 2a00:14b0:42:102::1a
matrix-sync.hosts IN AAAA 2a00:14b0:42:102::1b
; acme-challenges ; acme-challenges
_acme-challenge.sunders CNAME a5ee8a99-3cdf-4212-972e-c0b6fda1242f.auth.acmedns _acme-challenge.sunders CNAME a5ee8a99-3cdf-4212-972e-c0b6fda1242f.auth.acmedns

View file

@ -0,0 +1,65 @@
#!/usr/sbin/nft -f
# Docker manages its own tables (via iptables-nft), so don't use "flush ruleset" here,
# but only replace our own table. This also means that a reload is fine, but stopping
# or restarting nftables.service (which flushes the whole ruleset) requires restarting
# Docker afterwards.
# Traffic to ports published by Docker containers (web, JVB, exporter) gets DNATed in
# prerouting and therefore passes the forward hook instead of the input hook.
## Variables
define if_wan = "ens18"
# Prometheus on grafana (IPv4 via the NAT of router)
define prometheus_v4 = { 212.12.48.123 }
define prometheus_v6 = { 2a00:14b0:42:102::e }
## Rules
table inet host_filter
delete table inet host_filter
table inet host_filter {
# Runs before Docker's DNAT, so this also applies to ports published by containers.
chain prerouting {
type filter hook prerouting priority dstnat - 10; policy accept;
iifname $if_wan tcp dport 9888 ip saddr $prometheus_v4 accept comment "jitsi exporter (container)"
iifname $if_wan tcp dport 9888 ip6 saddr $prometheus_v6 accept comment "jitsi exporter (container)"
iifname $if_wan tcp dport 9888 drop
}
chain input {
type filter hook input priority filter; policy drop;
iifname "lo" accept
ct state invalid drop
ct state established,related accept
# ICMPv6 is needed for neighbour discovery etc.
meta l4proto ipv6-icmp accept
meta l4proto icmp accept
# Docker networks
iifname { "docker0", "br-*" } accept
tcp dport 22 accept comment "ssh"
# Ports published by containers normally get DNATed and never reach the input
# hook, but they do when handled by docker-proxy (e.g. for IPv6 without IPv6
# enabled on the Docker network).
tcp dport { 80, 443 } accept comment "jitsi web (container)"
udp dport 10000 accept comment "jitsi jvb (container)"
# coturn (runs in the host network namespace)
udp dport 3478 accept comment "turn"
tcp dport 3478 accept comment "turn"
tcp dport 5349 accept comment "turns"
udp dport 5349 accept comment "turns (dtls)"
udp dport 49152-65535 accept comment "turn relay ports"
tcp dport { 9100, 9888 } ip saddr $prometheus_v4 accept comment "node exporter, jitsi exporter (container)"
tcp dport { 9100, 9888 } ip6 saddr $prometheus_v6 accept comment "node exporter, jitsi exporter (container)"
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -0,0 +1,5 @@
{
"logoImageUrl": "https://jitsi.hamburg.ccc.de/images/watermark.svg",
"logoClickUrl": "https://hamburg.ccc.de/",
"backgroundImageUrl": "https://jitsi.hamburg.ccc.de/images/ccchh-background.svg"
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 84 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

View file

@ -0,0 +1,13 @@
<template id = "welcome-page-additional-content-template">
<footer class = "welcome-footer">
<div class = "welcome-footer-centered">
<div class = "welcome-footer-padded">
<div class = "welcome-footer-row-block welcome-footer--row-1" style = "flex-wrap: wrap; gap: 16px;">
<a href = "https://wiki.hamburg.ccc.de/infrastructure:services:jitsi" style = "color: #fff;">Technical Information for CCCHH Jitsi</a>
<a href = "https://hamburg.ccc.de/imprint/" style = "color: #fff;">Imprint and Contact</a>
<a href = "https://hamburg.ccc.de/privacy-notice/" style = "color: #fff;">Privacy Policy</a>
</div>
</div>
</div>
</footer>
</template>

View file

@ -4,7 +4,7 @@
services: services:
onlyoffice: onlyoffice:
image: docker.io/onlyoffice/documentserver:10.0.0 image: docker.io/onlyoffice/documentserver:9.4.0
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- "./onlyoffice/DocumentServer/logs:/var/log/onlyoffice" - "./onlyoffice/DocumentServer/logs:/var/log/onlyoffice"

64
roles/jitsi/README.md Normal file
View file

@ -0,0 +1,64 @@
# Role `jitsi`
A role for deploying [Jitsi Meet](https://jitsi.org/) using the official [docker-jitsi-meet](https://github.com/jitsi/docker-jitsi-meet) release.
The given release is downloaded and unpacked unmodified to `/opt/jitsi/releases/` and `/opt/jitsi/release` is pointed to it.
The `.env` file at `/opt/jitsi/.env` is fully managed by this role; `env.example` and `gen-passwords.sh` of the release are not used.
The `.env` also sets `COMPOSE_PROJECT_NAME` and `COMPOSE_FILE`, so `docker compose` can be run by hand in `/opt/jitsi`.
The Jitsi configuration directory (`CONFIG`) is `/opt/jitsi/config`, with persistent state in `/opt/jitsi/config/storage/`.
The image version (`JITSI_IMAGE_VERSION`) always equals the release version, so upgrading means bumping `jitsi__version`.
Releases other than the configured one are removed.
TLS certificates are obtained by the web container itself using Let's Encrypt, so ports 80/tcp and 443/tcp as well as 10000/udp (media) must be reachable.
Optionally, a [coturn](https://github.com/coturn/coturn) TURN server and the [Prometheus Jitsi Meet exporter](https://github.com/systemli/prometheus-jitsi-meet-exporter) are deployed as additional services of the same Compose project, defined in `/opt/jitsi/compose.override.yaml`.
coturn uses the certificate obtained by the web container and is restarted weekly to pick up renewals.
It needs 3478/udp+tcp, 5349/tcp and the relay port range 49152-65535/udp to be reachable.
The exporter scrapes the JVB statistics and listens on port 9888.
Files can be added to or replaced in the Jitsi Meet web root (`/usr/share/jitsi-meet` in the web container) using `jitsi__web_files`, e.g. for branding.
They are deployed to `/opt/jitsi/web-files/` and bind-mounted into the web container.
## Supported Distributions
Should work on Debian-based distributions.
## Required Arguments
- `jitsi__version`: The docker-jitsi-meet release to deploy, e.g. `stable-11248`.
- `jitsi__domain`: The domain Jitsi is served on. Used for `PUBLIC_URL` and the Let's Encrypt certificate.
- `jitsi__letsencrypt_email`: The e-mail address for the Let's Encrypt account.
- `jitsi__jicofo_auth_password`: XMPP password for Jicofo. Generate using `openssl rand -hex 16`.
- `jitsi__jvb_auth_password`: XMPP password for the JVB. Generate using `openssl rand -hex 16`.
## Optional Arguments
- `jitsi__timezone`: The time zone for the containers.
Defaults to `Europe/Berlin`.
- `jitsi__jvb_advertise_ips`: List of IP addresses the JVB should advertise for media (`JVB_ADVERTISE_IPS`).
Defaults to `[ ]`.
- `jitsi__whiteboard`: Whether to deploy the Excalidraw whiteboard backend (`whiteboard.yml`).
Defaults to `false`.
- `jitsi__turn`: Whether to deploy coturn and configure Jitsi to use it.
Defaults to `false`.
- `jitsi__turn_secret`: The shared secret between Prosody and coturn. Required if `jitsi__turn` is `true`.
Generate using `openssl rand -hex 32`.
- `jitsi__prometheus_exporter`: Whether to deploy the Prometheus Jitsi Meet exporter on port 9888.
Defaults to `false`.
- `jitsi__env`: Dictionary of additional variables to put into the `.env` file.
See `env.example` of the release and the handbook for available variables.
Defaults to `{ }`.
- `jitsi__custom_config_js`: Content of `custom-config.js`, which gets appended to the generated `config.js`.
Defaults to `""` (no file).
- `jitsi__custom_interface_config_js`: Content of `custom-interface_config.js`, which gets appended to the generated `interface_config.js`.
Defaults to `""` (no file).
- `jitsi__web_files`: List of files to mount into the Jitsi Meet web root.
Defaults to `[ ]`.
- `jitsi__web_files.*.path`: Path relative to the web root, e.g. `images/watermark.svg` or `static/welcomePageAdditionalContent.html`.
- `jitsi__web_files.*.content`: The content of the file.
## Links & Resources
- <https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker/>
- <https://github.com/jitsi/docker-jitsi-meet>
- <https://github.com/jitsi/docker-jitsi-meet/releases>

View file

@ -0,0 +1,9 @@
jitsi__timezone: Europe/Berlin
jitsi__jvb_advertise_ips: [ ]
jitsi__whiteboard: false
jitsi__turn: false
jitsi__prometheus_exporter: false
jitsi__env: { }
jitsi__custom_config_js: ""
jitsi__custom_interface_config_js: ""
jitsi__web_files: [ ]

View file

@ -0,0 +1,19 @@
- name: restart jitsi web
community.docker.docker_compose_v2:
project_src: "{{ jitsi__base_dir }}"
project_name: jitsi
files: "{{ jitsi__compose_files }}"
services:
- web
state: restarted
become: true
- name: restart jitsi coturn
community.docker.docker_compose_v2:
project_src: "{{ jitsi__base_dir }}"
project_name: jitsi
files: "{{ jitsi__compose_files }}"
services:
- coturn
state: restarted
become: true

View file

@ -0,0 +1,69 @@
argument_specs:
main:
options:
jitsi__version:
type: str
required: true
jitsi__domain:
type: str
required: true
jitsi__letsencrypt_email:
type: str
required: true
jitsi__jicofo_auth_password:
type: str
required: true
no_log: true
jitsi__jvb_auth_password:
type: str
required: true
no_log: true
jitsi__timezone:
type: str
required: false
default: Europe/Berlin
jitsi__jvb_advertise_ips:
type: list
elements: str
required: false
default: [ ]
jitsi__whiteboard:
type: bool
required: false
default: false
jitsi__turn:
type: bool
required: false
default: false
jitsi__turn_secret:
type: str
required: false
no_log: true
jitsi__prometheus_exporter:
type: bool
required: false
default: false
jitsi__env:
type: dict
required: false
default: { }
jitsi__custom_config_js:
type: str
required: false
default: ""
jitsi__custom_interface_config_js:
type: str
required: false
default: ""
jitsi__web_files:
type: list
elements: dict
required: false
default: [ ]
options:
path:
type: str
required: true
content:
type: str
required: true

View file

@ -0,0 +1,4 @@
---
allow_duplicates: false
dependencies:
- role: docker

226
roles/jitsi/tasks/main.yaml Normal file
View file

@ -0,0 +1,226 @@
- name: make sure a TURN secret is given, if TURN is enabled
ansible.builtin.assert:
that:
- jitsi__turn_secret is defined
- jitsi__turn_secret | length > 0
quiet: true
when: jitsi__turn
- name: make sure the Jitsi base directories exist
ansible.builtin.file:
path: "{{ item }}"
state: directory
mode: "0755"
owner: root
group: root
become: true
loop:
- "{{ jitsi__base_dir }}"
- "{{ jitsi__base_dir }}/releases"
- name: make sure the docker-jitsi-meet release is present
ansible.builtin.unarchive:
src: "https://github.com/jitsi/docker-jitsi-meet/archive/refs/tags/{{ jitsi__version }}.tar.gz"
remote_src: true
dest: "{{ jitsi__base_dir }}/releases"
creates: "{{ jitsi__release_dir }}/docker-compose.yml"
owner: root
group: root
become: true
- name: point the `release` symlink to the configured release
ansible.builtin.file:
src: "{{ jitsi__release_dir }}"
dest: "{{ jitsi__base_dir }}/release"
state: link
owner: root
group: root
become: true
# Configuration read by the containers at startup; managed by Ansible.
- name: make sure the configuration input directories exist
ansible.builtin.file:
path: "{{ jitsi__config_dir }}/{{ item }}"
state: directory
mode: "0755"
owner: root
group: root
become: true
loop:
- ""
- web
- prosody
- prosody/config
- prosody/prosody-plugins-custom
- jicofo
- jvb
- storage
- tmp
# State written by the containers, which run as uid/gid 1000.
# The certificate directory is created here, as Docker would otherwise create it owned by
# root for the coturn bind mount, before the web container gets to write the certificate.
- name: make sure the storage and tmp directories exist and are writable by the containers
ansible.builtin.file:
path: "{{ jitsi__config_dir }}/{{ item }}"
state: directory
mode: "0750"
owner: "1000"
group: "1000"
become: true
loop:
- storage/prosody
- storage/web
- storage/web/acme-certs
- "storage/web/acme-certs/{{ jitsi__domain }}"
- storage/transcripts
- tmp/web-crontabs
- tmp/web-load-test
- name: deploy custom web configuration
ansible.builtin.copy:
content: "{{ item.content }}"
dest: "{{ jitsi__config_dir }}/web/{{ item.name }}"
mode: "0644"
owner: root
group: root
become: true
when: item.content != ""
loop:
- name: custom-config.js
content: "{{ jitsi__custom_config_js }}"
- name: custom-interface_config.js
content: "{{ jitsi__custom_interface_config_js }}"
loop_control:
label: "{{ item.name }}"
notify: restart jitsi web
- name: remove unconfigured custom web configuration
ansible.builtin.file:
path: "{{ jitsi__config_dir }}/web/{{ item.name }}"
state: absent
become: true
when: item.content == ""
loop:
- name: custom-config.js
content: "{{ jitsi__custom_config_js }}"
- name: custom-interface_config.js
content: "{{ jitsi__custom_interface_config_js }}"
loop_control:
label: "{{ item.name }}"
notify: restart jitsi web
- name: make sure the coturn directory exists
ansible.builtin.file:
path: "{{ jitsi__base_dir }}/coturn"
state: "{{ 'directory' if jitsi__turn else 'absent' }}"
mode: "0755"
owner: root
group: root
become: true
# Readable by uid 1000, which coturn runs as.
- name: deploy the coturn configuration
ansible.builtin.template:
src: turnserver.conf.j2
dest: "{{ jitsi__base_dir }}/coturn/turnserver.conf"
mode: "0640"
owner: root
group: "1000"
become: true
when: jitsi__turn
notify: restart jitsi coturn
# coturn doesn't notice the certificate renewed by the web container on its own.
- name: ensure the weekly coturn restart cron job is present
ansible.builtin.cron:
name: "jitsi coturn restart for certificate renewal"
special_time: weekly
job: "cd {{ jitsi__base_dir }} && docker compose restart coturn >/dev/null"
state: "{{ 'present' if jitsi__turn else 'absent' }}"
become: true
# Files mounted into the web container, replacing or adding to the files of Jitsi Meet.
- name: make sure the directories for the web files exist
ansible.builtin.file:
path: "{{ jitsi__base_dir }}/web-files/{{ item }}"
state: directory
mode: "0755"
owner: root
group: root
become: true
loop: "{{ [''] + (jitsi__web_files | map(attribute='path') | map('dirname') | unique | reject('equalto', '') | list) }}"
- name: deploy the web files
ansible.builtin.copy:
content: "{{ item.content }}"
dest: "{{ jitsi__base_dir }}/web-files/{{ item.path }}"
mode: "0644"
owner: root
group: root
become: true
loop: "{{ jitsi__web_files }}"
loop_control:
label: "{{ item.path }}"
# Single file bind mounts keep pointing to the replaced file until the container is restarted.
notify: restart jitsi web
- name: find web files to remove
ansible.builtin.find:
paths: "{{ jitsi__base_dir }}/web-files"
recurse: true
register: jitsi__web_files_found
- name: remove web files, which should be removed
ansible.builtin.file:
path: "{{ item }}"
state: absent
become: true
loop: "{{ jitsi__web_files_found.files | map(attribute='path') | reject('in', jitsi__web_files_paths) | list }}"
vars:
jitsi__web_files_paths: "{{ jitsi__web_files | map(attribute='path') | map('regex_replace', '^', jitsi__base_dir ~ '/web-files/') | list }}"
# Changes to these make `docker compose up` below recreate the affected containers.
- name: deploy the compose override file
ansible.builtin.template:
src: compose.override.yaml.j2
dest: "{{ jitsi__base_dir }}/compose.override.yaml"
mode: "0644"
owner: root
group: root
become: true
- name: deploy the .env file
ansible.builtin.template:
src: jitsi.env.j2
dest: "{{ jitsi__base_dir }}/.env"
mode: "0600"
owner: root
group: root
become: true
- name: docker compose up
community.docker.docker_compose_v2:
project_src: "{{ jitsi__base_dir }}"
project_name: jitsi
files: "{{ jitsi__compose_files }}"
state: present
pull: missing
remove_orphans: true
become: true
- name: find old releases
ansible.builtin.find:
paths: "{{ jitsi__base_dir }}/releases"
file_type: directory
excludes: "docker-jitsi-meet-{{ jitsi__version }}"
register: jitsi__old_releases
- name: remove old releases
ansible.builtin.file:
path: "{{ item.path }}"
state: absent
become: true
loop: "{{ jitsi__old_releases.files }}"
loop_control:
label: "{{ item.path }}"

View file

@ -0,0 +1,47 @@
# {{ ansible_managed }}
# Services in addition to the ones of the docker-jitsi-meet release.
# Docker Compose explicitly disables IPv6 for networks not enabling it, overriding the
# daemon's default-network-opts.
networks:
meet.jitsi:
enable_ipv6: true
services:
{% if jitsi__web_files | length > 0 %}
web:
volumes:
{% for file in jitsi__web_files %}
- {{ jitsi__base_dir }}/web-files/{{ file.path }}:/usr/share/jitsi-meet/{{ file.path }}:ro
{% endfor %}
{% endif %}
{% if jitsi__turn %}
coturn:
image: docker.io/coturn/coturn:4.18.0
restart: unless-stopped
# Recommended by coturn, as Docker performs badly with large port ranges.
network_mode: host
# Needs to be able to read the certificate obtained by the web container.
user: "1000:1000"
command: ["-c", "/etc/coturn/turnserver.conf"]
volumes:
- {{ jitsi__base_dir }}/coturn/turnserver.conf:/etc/coturn/turnserver.conf:ro
- {{ jitsi__config_dir }}/storage/web/acme-certs/{{ jitsi__domain }}:/certs:ro
tmpfs:
- /var/lib/coturn
{% endif %}
{% if jitsi__prometheus_exporter %}
prometheus-jitsi-meet-exporter:
image: docker.io/systemli/prometheus-jitsi-meet-exporter:1.4.2
restart: unless-stopped
command: ["-videobridge-url", "http://jvb:8080/colibri/stats"]
ports:
- "9888:9888"
depends_on:
- jvb
networks:
meet.jitsi:
{% endif %}
{% if not (jitsi__web_files or jitsi__turn or jitsi__prometheus_exporter) %}
{}
{% endif %}

View file

@ -0,0 +1,46 @@
# {{ ansible_managed }}
# Only the settings differing from the defaults are set here.
# Reference: {{ jitsi__base_dir }}/release/env.example and
# https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker
# Allow running `docker compose` by hand in {{ jitsi__base_dir }}.
COMPOSE_PROJECT_NAME=jitsi
COMPOSE_FILE={{ jitsi__compose_files | join(':') }}
CONFIG={{ jitsi__config_dir }}
JITSI_IMAGE_VERSION={{ jitsi__version }}
TZ={{ jitsi__timezone }}
PUBLIC_URL=https://{{ jitsi__domain }}
HTTP_PORT=80
HTTPS_PORT=443
ENABLE_HTTP_REDIRECT=1
ENABLE_LETSENCRYPT=1
LETSENCRYPT_DOMAIN={{ jitsi__domain }}
LETSENCRYPT_EMAIL={{ jitsi__letsencrypt_email }}
LETSENCRYPT_ACME_SERVER=letsencrypt
{% if jitsi__jvb_advertise_ips | length > 0 %}
JVB_ADVERTISE_IPS={{ jitsi__jvb_advertise_ips | join(',') }}
{% endif %}
{% if jitsi__whiteboard %}
WHITEBOARD_COLLAB_SERVER_URL_BASE=http://whiteboard.meet.jitsi
{% endif %}
{% if jitsi__turn %}
TURN_CREDENTIALS={{ jitsi__turn_secret }}
TURN_HOST={{ jitsi__domain }}
TURN_PORT=3478
TURN_TRANSPORT=udp,tcp
TURNS_HOST={{ jitsi__domain }}
TURNS_PORT=5349
{% endif %}
{% if jitsi__env | length > 0 %}
{% for key, value in jitsi__env.items() %}
{{ key }}={{ value }}
{% endfor %}
{% endif %}
JICOFO_AUTH_PASSWORD={{ jitsi__jicofo_auth_password }}
JVB_AUTH_PASSWORD={{ jitsi__jvb_auth_password }}

View file

@ -0,0 +1,34 @@
# {{ ansible_managed }}
listening-port=3478
tls-listening-port=5349
realm={{ jitsi__domain }}
use-auth-secret
static-auth-secret={{ jitsi__turn_secret }}
cert=/certs/fullchain.pem
pkey=/certs/key.pem
no-tlsv1
no-tlsv1_1
no-cli
no-multicast-peers
no-loopback-peers
log-file=stdout
# Don't relay to private and otherwise special addresses.
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff

View file

@ -0,0 +1,4 @@
jitsi__base_dir: /opt/jitsi
jitsi__config_dir: "{{ jitsi__base_dir }}/config"
jitsi__release_dir: "{{ jitsi__base_dir }}/releases/docker-jitsi-meet-{{ jitsi__version }}"
jitsi__compose_files: "{{ ['release/docker-compose.yml'] + (['release/whiteboard.yml'] if jitsi__whiteboard else []) + ['compose.override.yaml'] }}"

View file

@ -13,3 +13,10 @@
group: root group: root
become: true become: true
notify: Reload nftables service notify: Reload nftables service
- name: ensure nftables service is enabled and started
ansible.builtin.systemd_service:
name: nftables
enabled: true
state: started
become: true