Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions internal/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/clean-dependency-project/cdprun/internal/platform"
"github.com/clean-dependency-project/cdprun/internal/runtime"
nodejsAdapter "github.com/clean-dependency-project/cdprun/internal/runtimes/nodejs"
pythonAdapter "github.com/clean-dependency-project/cdprun/internal/runtimes/python"
"github.com/clean-dependency-project/cdprun/internal/sitegen"
"github.com/clean-dependency-project/cdprun/internal/storage"
)
Expand Down Expand Up @@ -80,11 +81,11 @@ func NewApp() *cli.App {
Name: "download",
Usage: "Download runtime binaries from runtime-registry.yaml",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "runtime",
Aliases: []string{"r"},
Usage: "runtime name (nodejs). If not specified, downloads all enabled runtimes from config",
},
&cli.StringFlag{
Name: "runtime",
Aliases: []string{"r"},
Usage: "runtime name (nodejs, python). If not specified, downloads all enabled runtimes from config",
},
&cli.StringFlag{
Name: "version",
Aliases: []string{"v"},
Expand Down Expand Up @@ -180,6 +181,15 @@ func initializeManager(configPath string, db *storage.DB, stdout, stderr *slog.L
"runtime", runtimeName,
"endoflife_product", runtimeConfig.EndOfLifeProduct,
"policy_file", runtimeConfig.PolicyFile)
case "python":
adapter := pythonAdapter.NewAdapterWithConfig(eolClient, &runtimeConfig, &cfg.Config, stdout, stderr)
if err := registry.Register("python", adapter); err != nil {
return nil, nil, fmt.Errorf("failed to register python adapter: %w", err)
}
stdout.Info("registered runtime adapter",
"runtime", runtimeName,
"endoflife_product", runtimeConfig.EndOfLifeProduct,
"policy_file", runtimeConfig.PolicyFile)
default:
stderr.Warn("unsupported runtime", "runtime", runtimeName)
}
Expand Down
1 change: 1 addition & 0 deletions internal/config/ignore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -400,3 +400,4 @@ func TestMatchPatterns(t *testing.T) {




2 changes: 2 additions & 0 deletions internal/runtimes/python/keys/.gitkeep
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# This file ensures the keys directory exists for Go embed directive
# Python GPG keys can be added here in the future
56 changes: 56 additions & 0 deletions internal/runtimes/python/keys/1
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
EYLKy7c=
=s3E5
-----END PGP PUBLIC KEY BLOCK-----
153 changes: 153 additions & 0 deletions internal/runtimes/python/keys/2
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBFRV/OoBEADs11c9RJUDr1Mz8AfiZGMnba6MtuNzs7KsHaRu2mCZsT0Mf2Pv
pZxp0WvJvCLpls7nOzdZzXN6OumVD/Nwar1nkCm6NKER+dhoaB9APe70Me8QYv1X
3rhk6dx2wHHk0BXFTKiggD6rsklOdF3D1hA0elc4AFIydc0txl9pqritCpRuTARA
SWCUNBC32UQDr/fYGQyu3iXl+VZyjZlA/JTC6Rp/n39FXoT73mJ2yEpS21CTkfd4
3Bx3GnfRs2pKJQs6YmdPMY19kAhjomfiqmXQplOap1mshpalBc3GZy65HDEQwO7+
lWJSEfyFMVTD26fsNyxCl78xpM3Dud5SW2WLvfln5bS8LcQfezHVVVabEk95z8a7
kWL8zb88dNtd6+lU/9s7W6QmVvNnYvXebt52m3HQi0MQhhqmi+YgKZZJOcYnhUws
QhHDAoZANLpzz1XOH27GCGNg/qBvGiNoFfLM2enDv7QGPP8z0D8kfQdW/T3jE100
xgcuGpDWaxcYU5xOMhky8rz8DKJz9wYWvSe4iJejPe00pp13toc8L/p+qm2P1EJU
6XP20y6Qg6xoVnE80my5e5381Tfbo/DpgH3pq7/iqKIoLwRHm0WhRwEb3Tu153dP
gSfJ1q7GLmQSO1CKNMia9JbdkZYLrPyPKQRYfNcTZrC5Z88QT1kW3Qz8TQARAQAB
tDROZWQgRGVpbHkgKFB5dGhvbiByZWxlYXNlIHNpZ25pbmcga2V5KSA8bmFkQGFj
bS5vcmc+iQI3BBMBCgAhAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheABQJXW5Tc
AAoJEC00fqaqZUIduLgP/1IMzLm3R4bGwmVCzCawFadSQAVwZH75/jxPAMlGstOU
NLh5OfVgWr6kGSxyhEvJYAjQokdAIO/Y+XHWgRqTVgfpWZ91aVzAlH2FJKGs8PKq
injqGsfwsHv0JqvLLF7+UNo/LXj8MFn/2hnEhsBVzPHf4MiTxfXfPP9tp2MBJdJW
qJxej5wHOQDVzRDSHms+gyR01chQiHaGFMjzpDxVYkWTVfZYNNVR46SdrbZ9CcIJ
SjQaVezWBc5I3Bhw+h5hJx+Ejwcjb3B0QuvDOwaJ2C7I3hVyJHUhm1dJKnIUhYWB
Cw1tw0TKQnak5f+l0X7LdUamfVbZKMpNT/2+cARrdsVps1b8c8SK+uCrh/UaX55o
67Dz1Qaz6Az24ZHdXpBy17iLAUMbKlu5RXoGEllrgqxbdQjxZ5py4HuU15U/1j31
4gQHFN5rBkG+Oz+1cd3Of1HfZoe6hnWL1oVZGU3APrYB7QX0GMrtHnH+Av2Z5thG
l3ghF/RXhJYgCj3ajCcFjWi8TTfhTcdg5eQcKEYcLY05/VQQ2hqaEU5CFCKKh8C0
nQWXTPr5DeScoUh9I4xUOlTlZbpnWshjit27rm6ZfzC4+jcl6Gfn6wsjStx9zbi9
KZN+q27T1ImfmAz4xlOM4Yo5eSCXOEZVV0uo0e9NkFiHZnMoaNhB4oYzv+POdaQ4
iQEcBBABCgAGBQJUVf2NAAoJEPuZIShvXhVAMkAH/iE4e1wQh8hi+BVrI7IGgZOh
/FABKKYwB03jgEJEGdMJ8g1KbKf+S1wmchQFHMMBsJZ2Q4eImA0BlntvoK9m6dJE
Cwu59qFmkFFgFKnSQ8zRBINuPWR/sEHS/jmOlhbU7g9jZOuftUHR1xBXVhd+s5zi
L2LoJQvpuGjpQwSonSdRabqTcOYPniLiTHFM917PdWm4VYdcq9y73aje1g2AXoNh
UgfiRu0dC3AXoGoC+3H37qCKZMcauJ8httZDONDkWHjyff+q6nQwVcGArse1MeE6
CjGAclh9oTL9qAw4D22RXLfh2MtSDoO9tQzJ6YtRGLGajbR1pXWUxx+wmW5bJ3uJ
AjcEEwEKACEFAlRV/OoCGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQLTR+
pqplQh3hehAAvDtCFZ4/ow8JnYRwzXwS5IOchEPbj8l/1ypgy366YtKx4uIam88k
yDhN9vrx2RLbAQDcLKTfQgPSqbcX/NjfdOwmxp0OOx0cclb9tYxqo7/gf71fb9BP
+Gz3EvpgjL5lwLxvPZwWC9TX0vuXWzLoCiHQkMUfpK0Zgt5bVAK15IrEaIBzsAzW
OWc99fZOYubvJ3SwVK+s7JW0FPAhLoAsbxIiBOngVG5pWKLYskO/+gOIh++VcR51
Mse65geVZZ9TAyw1bMJ32axruUBkHrE+7NPgMkj9ZUdoXZf03Gp05x3JqMqWQwcB
Qger2r1KHu4hLLTqXHUxUTfex4nRlTKjOM/tsq3H+Y5JqcaprzLk3IBPg8HjqOco
qoqyV1fW5vCBtLjM3Zuur8K3kVo7yepxpct2IIhNb+mM+EteU/oUfxlnXSpD4Lpy
WlSDXShExyXHH+R3OAZFh9TCLbgqFN0cuzAjEEZnT0RMNqwMVWbQI3zHT0KZr3Kw
sVGI9WVqVoSjgRb03qO9inBI6dt82KYYUZcjIApyqURqgICBtFQdN94oYhkHHEau
z0O7DzPjljtqvsYgZ07we+MEbGT3pesLL6zKT1nWWKe5YTSfGWh9teRJHw/c2v8M
U08AuF7jnsS1NrQKAtIcXYKbI6W2pO9Qm9HaAMyZqR5i7nRQaXnjmkeJAjoEEwEK
ACQCGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AFAlRWC4ECGQEACgkQLTR+pqpl
Qh2fwxAAoF7pJLZVm0XOgt+o6tGHD4fB2bSqVMtwYHpBlA3SeevwDC3ytxR+tuvC
Zkj73Q9bDsMHJyc7DevYsVvyu3PHG8tmApQLyUPFJ68IVUoI0GYbk6JylCIGKEry
tARZb5tP/Bbwk3OeahoNq26Ny55HoSrl8sbXADPeSiQ+iC+X1Pz/SCMNNGsIajrN
HGeLUnRiVbgIP20G+WIoOQXCyFcQiC4VTppKEfAx/n9jrDr51jmSKWWs+JPOt/Su
VbxpYjltOrC1fg7jwHwVXWNZLc1/Ckng8f0nF3sv3Q7IDl0LUHzoWFpvChgy2Giq
B7CMjFn7/76JNRxs9TGqfMILKQA6gwVxLmmFPvj6Sd+JDuFuvQe5GkiYTOx7Gt0P
1mlPzaV+0or7rbCy0EWy5QmtXNj1fviElcqOWuK+72JiMa9JCQkwSu0E9Gye3hQL
sdzrrB+sArCnO2LEJzo8b+RYZOc6llx3a8Ktyh6ifsBGhlWbPHgTSM1gvQTfPvp9
xpnway/uf6R3ezLvHBM5X7Jr7HswrlcFWdtBDbKIfqjyw2BEpGnymeXc7PhKL4tS
b+7q99Wqf2W2Jm43nFmxFU+apKjqsjkI2XXUYXcotICU6VSO4mihpTVTq8KtqNIh
w9DykwmXqdmCXHf3e23wk6PBdMVRJ2+MxYlYrPWplj8apXMcqJCJAhwEEAEIAAYF
Aldm1WoACgkQEm61Y6dLBr8UtxAAsDENekOatrjf5/Kml1dUwfL72KguskgMWVYT
E0By8lGE5Epa5neDbh/0DuAZlCt+CGUPUhkJptE0nQv+H4iqD93p/giQJwkAo98m
cG2MyT58cpL5/OcsPGDt5bcO0qFy9NpxEhacrxh+1baoimLC81DHLfEgVox8ryKX
wbwfKuMwH1ia8KTBvjwXW6f6v0Q4/jYuKoiIOj5koqphPW0m7LrCiLEAvTZTP5i/
KfAydHXA5JGdnMgVNVm1isSxDf9giCd1rcwM7VAfzCnCgn9XX5YMkLPRZtLWse0q
hrZhZ4V7F3WOKKi/xSDsGYms0UVOgwg4TVTzPqWdFnRdGhTGmhRTwTDm2dohGNoX
/lpIO3fDF3BBgKwdBkytQhjOEgDaEd+72qogn41umOeCpryMU/fBQIrNKEzMCxfq
FB/uEm9wBtddlEpFpPPgc+xNY8Rgmqmt4EwOVy6f7buTFEvLt5ePykccmnKCDAUu
xSYEwcsKQRqpPQlV0tdMxv8004gqZFulmHLrX6NWC+PY0qx+c6p2RMVcoKmYwAaq
2RgJOOyAQHemGNtRVwKIGX5tjBQtxzVGHnJvbHXTNNTie0Tu22ylISq/pPbjSTVG
Allb2Llecn1E5EN5R31FXKWn1KXD42TQrlPQr9XwgdQyKe2PIF01pYisgZ2Gc1vv
9lycDGy0G05lZCBEZWlseSA8bmFkQGJheWJyeWoubmV0PokCNwQTAQoAIQUCVFYL
QwIbAwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRAtNH6mqmVCHdJUD/9sk0Ag
19D+AE4tHq+02Q3cvP9LhDoPkEfWjCR9PV/aggHtFdjEmVB7pO9PASUpFJHdx1eW
A97DCxQaiD4BMt2rsDVZInYuDXW839+Ck8f9D62L2wSCQyNscDRh1RhD5QF8r8Mk
37tK/U7j9/0t535IwzBxZU5om0nl1LZ4+6Glo8OWBdX2558JQT0yj+E3Qbw1bMks
dp//UsRrOUqPDtiMzhqKdOT7m+3cMSNYwO8P9CwZI2pEHS7+qncNLUKNBw/49nXB
igXnEU9y1+zg2u9lPomSPzEvcdO2Sg61BLAOCnkay6zcdiBun86rgWOPLjVNSr0a
TFCXiCoqErwrBLLELwHcLjDQhVjq0uWTQStYAIwkPn6GWo/t0/cqM+z+p8/6K64/
8DwdlwLN0KZoIajGAwvZqddthPpb3swGJlkRsfd6EdAXmvJmH50g2gMu7ZowoXDi
PODGp5cMRxxD+ilcGSIUkTeAPcbF+qzBOD7BpuzEUD7mQj02kkk6a9Iut1Ph2gzF
Ht3+fH5nMBMdZdnuGuY08QOgD0xcdxml0oKn4Q6L8qpNdrNQUDNQ0+M3LdfXhzOP
0ZnE022YtmJ0r4sGOG1CFE5eN/8Kl10O3eTrfY5z7YD7XRanDdB/pnGASI8zf7VJ
nE8ISK36YzlWR963FnczrJqM5g+mMAbcYM766okCHAQQAQgABgUCV2bVagAKCRAS
brVjp0sGvysvD/0UO2NKNU10UjNWetbtpwwkb05vtCPPOoDpk8SWlYCyyv8JlwU6
oD8SyGeJtOJBNfTzJGMWIJg05MbPyy72HNQG1ewteaEcPQMmLUfIj+0HwomLMoDQ
I72MyYsKrlafTd48vk4dgUQWVEZ3rdk0Wgqgoj02N7Z9LuHat6EgX3g04Bjh36EW
JQ0FuVhV85Z8hPiDistpMLo5LAFdhxCZbS7j37EMEHKRXOpEW4e4ZPHkjyAWx2zo
A6tyi4wAiA4qjcyViULz0gXzBGO6aM4O10db/LEOiDTp6bb3/S4RBjeDkRrzeVvN
K5bblVzLngaGWi9gIe1xadY0S3rDWpA/0eYvKce3K3X0J9W2LCr+87n1ESFVo/3l
w6EAN/IQM2ucynUbUqCYX7EHq01c/qxnINh5ZvKLMn93/o3gqGG8PJBIuREuNxUM
Lrii/3mva/7FJUABqvmTNlJYToETMMel9a1p9krEswU7B0yXjCVFQYJD705uM/Ie
UkgE9TgVCCnA+QUm50RRK0s52w7+nG3Ue8ph6HyJ2kerBLSOKzn+obQtNhh9MTiD
vA30P1BJkyq+l3nkmiOfIUVJ9nJ+GQYs0eLZOj4L/S4cfiqCyitx8FMa16LHHN5L
JfeMD5AObLFPn+vrdv1I3AX0LH1ETgXkfwOKmi1CQEXUQccon7S81tVwLrQfa2V5
YmFzZS5pby9uYWQgPG5hZEBrZXliYXNlLmlvPokCLQQTAQoAFwUCVFX86gIbAwML
CQcDFQoIAh4BAheAAAoJEC00fqaqZUIdls0P/A5qR0fAhzwcr8j7K9m0X7lasTeO
ot2NDDvO8WJ9kqv3tnjfOrN2PsKBDbaKKEQRJxhkn6uOELEqSm07n8qLnnj5+UjG
Jl5Q7naWz4yvJ+5ekNeC5sLI5lz5vvefbVpzlIu9BOOK1vBWkJ4DwNQzUSMLNbVd
VpoKDMcdjsnm8AbIbAcuc/ltzUziwfqm/hTiWLN9EnU98zw5uBMQ5eCzEKKAaiTE
VC7WTdGvNO4oe+Yjk5Ie41u+kL5EqQ7n02INJpp/QlMjpCF+hCprJU4DX8DvBtjP
C7jvMrNiwsqH8jgn7xEGJQwFiH59+lnZ9u8fwnwqQjJrUiqjuuHqZuEByLv427+y
/8B98OaqDPN3qvePdhIiC9FB8R8rI+kJl1fx+3cjsz/nVi//0RozmFXtDwsqalJq
tTcxuzgKnmxu+URK3eTRM9CiYG9pnDcu4zlA2qwxTd+4h6aJAr9LYlRt1b/wBvUw
KK+R/ddOVo/VHxLu16q1BOdgQHYqRfDeUy0cLw0OBJWycNglpwMd5fi5X1ThyQ74
lfdqveUKMv5Oso7aWFmR3wU+xSdz4ctz6I2D1lHOgC2VZ+eYZ6vYwScTDXCbN+eH
OeSOC63xUHHjo3yDFfiDBtktEJ2iO1m1MS62EKrqWdHkthOX6hYryIrOZWhWWr1B
MTZuP9fnIIbYe0FwtDdOZWQgRGVpbHkgKFB5dGhvbiByZWxlYXNlIHNpZ25pbmcg
a2V5KSA8bmFkQHB5dGhvbi5vcmc+iQI6BBMBCgAkAhsDBQsJCAcDBRUKCQgLBRYC
AwEAAh4BAheABQJXW5TmAhkBAAoJEC00fqaqZUIdV8AP/20miFOB37OumRy/C5Wb
HIkyQqRE3LDxk3Tqafmrc0HrxMqGg6LuKzPnCO2Ao6seBARhab3iOFF/xSxqjbVv
6gGvUVjN0vgraA1quz9lncdCf69TDbo7r8V9ctpeLGXP2J3MytKvn5UM+yCegoyk
mVr6fwXIWhVMjK/HbqGOzqKWHcjzvhfb7VFJn3AOkeuyDEIYa7ePtmuULCTXeOFP
x5h52TXD5Z8DavSDRlswXCUUVbDLVzRQJ0Cfu0ByGvKVW+5cQIGIm7odStGGsck/
L0neyKrn7XOTALr8AktBTnKSmCqfrx5KLQ2eMJVRZeBTEmj0jilIYy0Y3bEclN1n
9+vYlVhEW8mLXWV1zQRfkXhUYKNCx5VdcpIwsWrtOT9x8kz4BOeOEz+XdkQXrxgf
58XBDaPc1A5llU5UerFYvV0MxHygvE1O4WxMG973eG7sFWzEaT5gFN1vLBwK9ZFV
Z2udg+J2nM4ifMMwwtrL+vUeFoX+8y4O7V691HKLHa8xcqYPnou8s0QeI9EPFbQd
xj+p6vHo9ncTh1THZUFsUzc4zP+Da4nX0m3yRSG1WHWBgBvfn6ZgVfwbXNU+9mf7
9QJbjUjpiHFjgbImnVBD09IXZeWpUcV3IonUTgK/RwXGy5Hdck+mDmPb0EQ6WgDE
pppyiqA29apnf12CguxAMJt5iQIcBBABCAAGBQJXZtVqAAoJEBJutWOnSwa/8TkQ
ALpijIFPZx3NqcjLZaCqXuY3tPxb81hejLbJ3VGeFQer6DjCvDUTTPBBkmFM+WNa
7RsJTYKk/empWk/FUOtQJYnjSJJmCYzdd2wn58gUAT+E0820FQ2ujjVDKA0pYQnG
o4DOVvGX2vMz7YdtIoepY6pujxDwuEedzhlXP8WwkPuDo8h2pdZDf8WAZ9aFo2/F
zJDBXeAx4mbQmQwIEtKBXn7CqvSTPmodcQBOMrDZGA1fykmvGpLfFHyJR5zgctrh
lcCtZfhr63LGqvkggM9rn+oDhgsZYgQqlhQ/fx0XwYUPd3P6AiSq3momd0MdG7fK
H+KKCsH/TC/tDekxrWS8Hm4twFtKUQs64qQ4vbfFV+eiXdYdrHva5kGTOwND/U8L
apl5s6hoZzE+xG3X9V19NFuPPzVU2sW4ADTGUe3iMRWT6Kda4rGRUDKpJWLORFCN
Y4ic7LAj/MDIF7o8BGWIN8+kusN9TDJgjRFk9/pUqT9T2OE3a31OywUZhsdaUxIh
786Bf862/wMKCp609HXV62CJ0WhL6DUTflipof6nh4PI8kmxY4wsFnA8zv5zY5we
UgFf2QG6evFQ/PVR9qaIoqEMVJMlWWusk31+Ee4R7O8MonItvxbAmnOrwSUu48mx
2a08sc1Xnh0E7KPCfF4YDkkLtCfE/Ex/Wv66LfHmTKpbuQINBFRV/OoBEADIMOTd
CAiCV7AZCFADY36j+y6pB8VchhWKtG+yRCTjosreWMpuWYfr1Kapc8iiyi4v2326
VxHxZARxU9J+WcOuOA8Oerz6KpL57np/TBgdYb0difbQTTUAGuKiwAvEKYoydiU2
NtupfJcAcOsRTtBZZpS/sfSKQ/hfh5ZyRECc00TdohEH8qgKEdEOJucGqy2aRCrC
glCqWC5SmhbvB/vsdz1a1J22TfLW+VlFoV7r0tRB8YyQE1p35UBIoHKduVUD2/QV
JoDVwJ9k0aVGdX4/gr+CAZjl7z9rERn/BfAo7avKHlO+5YcEvwf6x1jWch8qdoBw
eDCJtnej9wlKsgvhYPawSis3SqSFRg65LV9Gt765jjjPOQ4D6sWTgL/m7av/2t6c
qA3FxXlZ1qzZ2YufmdPQPYFYrhJNsuuzgwT+lgH9+6cwk0MPjxI4sOBXZ7Khn+di
qDHnJf1QCbfrOYwiPHpOU3wipo4BhmuImD66a/A/L6TPC1ZJutDfqqwd6qAtohC/
CW99YJsb/w9Zgp+8TGg+cyv3CgBbkvXOrkk32y8BAcWEg+ZivOK/QZaS1tGFz0lV
rxCSo+TE+3iSnmkY5jq2Ue+dTWf3ttP3XLEWKkD3jtUvihShTMFtzoqXi1+8ryL6
AIkp5lOV6a69Dir7x0NHaHfITYCfrPgUQj8tDQARAQABiQIfBBgBCgAJBQJUVfzq
AhsMAAoJEC00fqaqZUIdU8gP/ic6ghc+q8gTExXwEFpZ0bIXtMfrdV4MtGtrTX+8
tv5599IrP5tOdv5nQCQpU/7I1y8nFDoyv2o4UNrOKBrQMV3aQ+qkS4ZvsR60wNMT
Nb85PQch+JV748sJ10BGj28pD3rDy57YOzvQa61Mma3UNWXuaa99r7dWrP4st3gi
rs1Z4+NQwYfPolaeFs3Vl2haBxi8U1S40y0t15044a3oeIW9mvEUgAGZHJVqr6xN
3Yei7aHhFOzmyIyHFqQttaV1tWjZbM52WmJLAqtosQ4Ex12kDzNaqHZFctFBVycJ
uDXltji8y+0m3q6sWkyQrOrcnMWEy9cG+HK4SU9qZfZvwr9OG3MtGaIk5LjmGaF6
25FIGVuCLwGc3BNAvL1tk/FU/JXbGrPC/tx7j/9zNUZUKW43yi9BBrzQQaJtL1ji
HRi7FNbW5OsdYwHmJgwH04m9BGe3kf5avZy01n7kKjbMADksYCTXyxO9EgW+x+ko
0yDch9UhQgAe0Svc7JioZ7QEZn9tn+JL22vCkDjlAxUGGY3GP6j7OuF+saKSlwcI
9Bbo8lsP8gTKsipGrtZFIPlkmvIc6stZf9is+Mf1/lEUBRzcIwtGjkBR/vEtPUzN
+knxhcjQAWWl+5RPdPUKcSa9X2W5X7aG0FbLjFNnaKcqa+NLPg4x58636NliS1d1
48Kp
=ffoA
-----END PGP PUBLIC KEY BLOCK-----
Loading