ci: switch to GitHub actions

simplify much, GitLab less

Signed-off-by: Paul Spooren <paul.spooren@rhebo.com>
pull/95/head
Paul Spooren 2023-03-06 14:02:37 +01:00 committed by Paul Spooren
parent 54561b55a4
commit fd9b8caa4d
6 changed files with 575 additions and 0 deletions

243
.github/workflows/containers.yml vendored 100644
View File

@ -0,0 +1,243 @@
name: Build and push containers
on:
# push:
# pull_request:
workflow_dispatch:
inputs:
release:
description: "Release to deploy (empty for snapshots)"
required: false
schedule:
- cron: "0 5 * * *" # daily snapshot
- cron: "0 6 * * 0" # weekly 22.03-SNAPSHOT
- cron: "0 7 * * 0" # weekly 21.02-SNAPSHOT
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true
jobs:
generate_matrix:
name: Set matrix for SDKs
runs-on: ubuntu-latest
outputs:
imagebuilders: ${{ steps.find_targets.outputs.imagebuilders }}
sdks: ${{ steps.find_targets.outputs.sdks }}
release: ${{ steps.find_targets.outputs.release }}
owner: ${{ steps.find_targets.outputs.owner }}
suffix: ${{ steps.find_targets.outputs.suffix }}
steps:
- name: Set relase to 22.03-SNAPSHOT
if: github.event.schedule == '0 6 * * 0'
run: |
echo "RELEASE=22.03-SNAPSHOT" >> "$GITHUB_ENV"
echo "REF=openwrt-22.03" >> "$GITHUB_ENV"
- name: Set relase to 21.02-SNAPSHOT
if: github.event.schedule == '0 7 * * 0'
run: |
echo "RELEASE=21.02-SNAPSHOT" >> "$GITHUB_ENV"
echo "REF=openwrt-21.02" >> "$GITHUB_ENV"
- name: Set relase manually
if: github.event.inputs.release != ''
run: |
echo "RELEASE=${{ github.event.inputs.release }}" >> "$GITHUB_ENV"
echo "REF=v${{ github.event.inputs.release }}" >> "$GITHUB_ENV"
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
repository: openwrt/openwrt
ref: ${{ env.REF}}
- name: Set targets and release
id: find_targets
run: |
JSON='['
FIRST=1
while read -r line;
do
TARGET=$(echo "$line" | cut -d " " -f 1)
[[ $FIRST -ne 1 ]] && JSON="$JSON"','
JSON="$JSON"'{"target":"'"$TARGET"'","tags":"'"${TARGET/\//-}"'"}'
FIRST=0
done <<< "$(perl ./scripts/dump-target-info.pl targets 2>/dev/null)"
JSON='{"include":'"$JSON"']}'
echo -e "\n---- imagebuilders ----\n"
echo "$JSON"
echo -e "\n---- imagebuilders ----\n"
echo "imagebuilders=$JSON" >> "$GITHUB_OUTPUT"
JSON='['
FIRST=1
while read -r line;
do
ARCH=$(echo "$line" | cut -d " " -f 1)
TARGET=$(echo "$line" | cut -d " " -f 2)
TARGETS=$(echo "$line" | cut -d " " -f 2- | sed -e 's/ /\\n/g')
[[ $FIRST -ne 1 ]] && JSON="$JSON"','
JSON="$JSON"'{"arch":"'"$ARCH"'","target":"'"$TARGET"'","tags":"'"$ARCH"'\\n'"$TARGETS"'"}'
FIRST=0
done <<< "$(perl ./scripts/dump-target-info.pl architectures 2>/dev/null)"
JSON='{"include":'"$JSON"']}'
echo -e "\n---- sdks ----\n"
echo "$JSON"
echo -e "\n---- sdks ----\n"
echo "sdks=$JSON" >> "$GITHUB_OUTPUT"
echo "release=$RELEASE" >> "$GITHUB_OUTPUT"
SUFFIX=${REF:+-$REF}
SUFFIX=${SUFFIX:--master}
echo "suffix=$SUFFIX" >> "$GITHUB_OUTPUT"
echo "owner=${GITHUB_REPOSITORY_OWNER,,}" >> "$GITHUB_OUTPUT"
push-imagebuilder-container:
name: ImageBuilder
runs-on: ubuntu-latest
needs: generate_matrix
strategy:
fail-fast: False
matrix: ${{fromJson(needs.generate_matrix.outputs.imagebuilders)}}
steps:
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
ghcr.io/${{ needs.generate_matrix.outputs.owner }}/imagebuilder
flavor: |
latest=false
suffix=${{ needs.generate_matrix.outputs.suffix }}
tags: ${{ matrix.tags }}
- name: Build and push
uses: docker/build-push-action@v3
with:
file: Dockerfile.unify
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
DOWNLOAD_FILE=imagebuilder-.*x86_64.tar.xz
RELEASE=${{ needs.generate_matrix.outputs.release }}
TARGET=${{ matrix.target }}
push-sdk-container:
name: SDK
runs-on: ubuntu-latest
needs: generate_matrix
strategy:
fail-fast: False
matrix: ${{fromJson(needs.generate_matrix.outputs.sdks)}}
steps:
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
ghcr.io/${{ needs.generate_matrix.outputs.owner }}/sdk
flavor: |
latest=false
suffix=${{ needs.generate_matrix.outputs.suffix }}
tags: ${{ matrix.tags }}
- name: Build and push
uses: docker/build-push-action@v3
with:
file: Dockerfile.unify
push: true
tags: ${{ steps.meta.outputs.tags }}
build-args: |
DOWNLOAD_FILE=sdk-.*.Linux-x86_64.tar.xz
RELEASE=${{ needs.generate_matrix.outputs.release }}
TARGET=${{ matrix.target }}
labels: ${{ steps.meta.outputs.labels }}
push-rootfs-container:
name: RootFS
runs-on: ubuntu-latest
needs: generate_matrix
strategy:
fail-fast: False
matrix:
include:
- target: x86/64
arch: x86_64
- target: x86/generic
arch: i386_pentium4
- target: x86/geode
arch: i386_pentium-mmx
- target: armvirt/32
arch: arm_cortex-a15_neon-vfpv4
- target: armvirt/64
arch: aarch64_cortex-a53
- target: malta/be
arch: mips_24kc
- target: mvebu/cortexa9
arch: arm_cortex-a9_vfpv3-d16
steps:
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
ghcr.io/${{ needs.generate_matrix.outputs.owner }}/rootfs
flavor: |
latest=false
suffix=${{ needs.generate_matrix.outputs.suffix }}
tags: |
${{ matrix.target }}
${{ matrix.arch }}
- name: Build and push
uses: docker/build-push-action@v3
with:
file: Dockerfile.unify
push: true
tags: ${{ steps.meta.outputs.tags }}
build-args: |
DOWNLOAD_FILE=openwrt-.*-rootfs.tar.gz
WORKDIR=/
USER=root
RELEASE=${{ needs.generate_matrix.outputs.release }}
TARGET=${{ matrix.target }}
BASE_IMAGE=scratch
CMD=ash
labels: ${{ steps.meta.outputs.labels }}

58
Dockerfile.unify 100644
View File

@ -0,0 +1,58 @@
ARG BASE_IMAGE=registry.gitlab.com/openwrt/buildbot/buildworker:latest
FROM registry.gitlab.com/openwrt/buildbot/buildworker:latest
WORKDIR /build/
# use "sdk-.*.Linux-x86_64.tar.xz" to create the SDK
ARG DOWNLOAD_FILE="imagebuilder-.*x86_64.tar.xz"
ARG TARGET=x86/64
ARG FILE_HOST=downloads.openwrt.org
ARG RELEASE
# if $RELEASE is empty fallback to snapshots
ENV RELEASE_PATH=${RELEASE:+releases/$RELEASE}
ENV RELEASE_PATH=${RELEASE_PATH:-snapshots}
ENV DOWNLOAD_PATH=$RELEASE_PATH/targets/$TARGET
RUN curl "https://$FILE_HOST/$DOWNLOAD_PATH/sha256sums" -fs -o sha256sums
RUN curl "https://$FILE_HOST/$DOWNLOAD_PATH/sha256sums.asc" -fs -o sha256sums.asc || true
RUN curl "https://$FILE_HOST/$DOWNLOAD_PATH/sha256sums.sig" -fs -o sha256sums.sig || true
ADD keys/*.asc keys/
RUN gpg --import keys/*.asc
RUN gpg --with-fingerprint --verify sha256sums.asc sha256sums
# determine archive name
RUN echo $(grep "$DOWNLOAD_FILE" sha256sums | cut -d "*" -f 2) >> ~/file_name
# download imagebuilder/sdk archive
RUN wget --quiet "https://$FILE_HOST/$DOWNLOAD_PATH/$(cat ~/file_name)"
# shrink checksum file to single desired file and verify downloaded archive
RUN grep "$(cat ~/file_name)" sha256sums > sha256sums_min
RUN cat sha256sums_min
RUN sha256sum -c sha256sums_min
# cleanup
RUN rm -rf sha256sums{,_min,.sig,.asc} keys/
RUN tar xf "$(cat ~/file_name)" --strip=1 --no-same-owner -C .
RUN rm -rf "$(cat ~/file_name)"
FROM $BASE_IMAGE
ARG USER=buildbot
ARG WORKDIR=/builder/
ARG CMD="/bin/bash"
USER $USER
WORKDIR $WORKDIR
COPY --from=0 --chown=$USER:$USER /build/ ./
ENTRYPOINT [ ]
# required to have CMD as ENV to be executed
ENV CMD_ENV=${CMD}
CMD ${CMD_ENV}

54
keys/2074BE7A.asc 100644
View File

@ -0,0 +1,54 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: OpenWrt 19.07 public key
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
=VpI5
-----END PGP PUBLIC KEY BLOCK-----

102
keys/626471F1.asc 100644
View File

@ -0,0 +1,102 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: PGP key for unattended snapshot builds
mQINBFeXZ7wBEAC3QZ+jhWrdj2XW9AdZpZrgHETZCW7lXxI3pJ2kS4UXNq+40KR2
GJOdsXDnLb7ZiHNn6yio6qKLXFD/bimxK+22HSJlc3LSF2kKzNrgKoFR2rIKbL3c
Us7GpWY8VqGTrfwR6OQNcoWqa1n5/tK9xuqKhfpoA2Eci8K+w5YCzCmnOz2vzbgS
ptuFshTKYI2Z/DLQZyP+OQkEYPfCdani2KsISn4DTx8xFjmW/sb/zf0isemTwWyK
Oh76FTa0tYdjTtAv3JHqyr2XkddM/oUSc09baCOfhUdo7Ep5rUqKw7BQsjreBYoZ
WcL/hmlIksUrFlqo/HRpoBgCZpSjsF/Z9otZpSugMHVVlRCnAKQiWxWAd+V+y2FG
q79myPgiMkbkaIrCelrUhDFRQ5wTnfAppFolw+xtT9bwdkwxZDNBe6PCYuLqD8wg
jtDtt3q5UaUOMGJrMDKZ0Wi6ycdl/sM59kLfyBV4ybmYkwOLTlMvOATiyUZeJJZO
2bTKBvD+izsx3Ea4VLPWYSFmk6QwaOMtj6tcXwBgtljzqMJ0S9Gubmopy3WAkP/m
/6ETJpuIupqEtvbRTX4O/+qnBgY40aQX7B4NgJi2SypP/WML5v2B2amLlhTcN+we
ULWyH9KvfKny5mrtG5C9xq1eAgKtB2QEDEbRyz34DWVWGpqIY1mscaNv8wARAQAB
tF1PcGVuV3J0IEJ1aWxkIFN5c3RlbSAoUEdQIGtleSBmb3IgdW5hdHRlbmRlZCBz
bmFwc2hvdCBidWlsZHMpIDxwZ3BzaWduLXNuYXBzaG90c0BvcGVud3J0Lm9yZz6J
AlEEEwEIADsCGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AWIQRUzHQweixtyc5h
gmnNhLztYmRx8QUCXTdRjQIZAQAKCRDNhLztYmRx8QgjEACmORm3zSoIX77q3YXg
rjLiCaHBCT+2ViyuGbI121jUhy1mJk3+258Jl0YOddLjQovK3mECWOIU8UoucAkK
OKRNV5bSCQtlp5sjiw8mUc6NAJ74Ef+SHEV4JYK64JDfQrQU8TuqzWUwTDHhJxhU
nlk4NWSpq9jQDIaeS5YqS2SHNOGACAYmcRWuWEkAXe/FECWZYR3C8ukX3FhdSZM2
I3J0xmrsKI7Yu6EgPwpVjDPrnkA/++vXaGSfFKlf1OoKB209KXa04LefukkPdecs
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
XNiJCsDUg/RfnN2p9pOYzMY/0HliaQqzkdcznSclfG/g+KV754Du2v/5M9qXPZCx
Axg0Ms9Qprg5FOxY3VNQ2sAjGIqRqRx+DfihDgXuE/bxHi2wLelinGMrXid26FvM
DMLyYC0NA1zSJdBpoH/iNGc9JmfuFi+xX6WgtC4YR6aCKpWhTzR0z0Me0whgp4wt
qmdVBru8MoxJUGe05FlYG2O73+3QxhDpxnpsFAGkE8aA8yQK77w8m+ClgFiw7uB7
vHi4xJtKN2HYKaycWidxS57eMM5FBRHkdzJvEALzheWr2R0TsfLlW42Gex+HPZYB
PfJ9c44SuTJni0htTZl1gMiEIj7lc4xvg0MmOwqG93SlhEvcEPR4uQINBFeXaH8B
EADO0x1PmKDkwozTZMWyYa91zRJBUc8nKY9OHqL9fABtJ5pMSu8Ys/eR77Zx0KMw
56ziy14gjkxTpoPnuLXNT/rGFnZmvyxnh8I7N+qgjgA4h566I74jlvLY/4z6+Pa/
9TsoxZ6LEWNOSi1Zy8YauI/WNxFjUUcytN+r/mVlg0cfPP/bO+zOrTb9Y/5v8aHV
F/XJ+vkOVcrDpD7t+QKDwFZ8uJyFO0eJHQ5w7Sa0PoQLHP6KoMSVtIB4T1DTZ84V
MXiycfAIm/KQdDgQq50ShdwgQ5HxPIfa0qisPzbUT8NJX04D1cgGkMdq8VDcYKzb
0ZBypyLjqc4uf8taqBMHzqyAfiadCsaxx5VjN/xq8zxzxPLGS58F3+TTWU+fWwr/
nvcBZ0VFdWY4IyaXE9wjyTX6IYfULvPRpfjc2+EQjfF9uBMrwT/sqWuf/nFdS7ZQ
Fii/SApplHLcukYX/JJHWm+cdmZQ/nybLYsN9YMd0esaaSMtqrKT/6oL00rBRAFL
uNXsybXkHRuRHuCsvH683mVdV4bDIMvZ1tFPT5wfyWgdv6UE5HwBsObhIld1pF0O
0/Krzko36Ob701OhHP6jJ0v2uaC5TnNFwgO1oWJivtm2QslTdTTaunS5/8N3K0W3
NL9gRumCDZSLfurnmaXvTvMkvYO8F9/L8XaSI2lV9ni7lwARAQABiQQ+BBgBAgAJ
BQJXl2h/AhsCAikJEM2EvO1iZHHxwV0gBBkBAgAGBQJXl2h/AAoJEPk1JaiLaZAp
D88P/1z+ydDaKiT0f08WKdia44Dq1/g1ufTJf2g5OyUMnyi3pIHg5cZcZ5PSW+rK
1thV4CWJ8ESVhFUVhm3vp1uOGqayYMxmxgdtpchgtlI+5MRNUTelmulaGb1CSFt4
TKKECh+BaV4GYlx3xVeevOw2QkY2iQDqCpn+V2om3MzCR4cznwMej+AU002XF7wz
zc8cDSs3jwXoNTi1l4S/P79AauefgNZwGGZaj7Zku9MsjhwH3fz2PySzsUUVcuLW
CdaKBavb24a/yJmkCd5jrjXhxlbcbv3BMjAABNG8i+sj2ly+uJSsx07JxNzBc5p3
15er+Yl2Dx0SkqIgDxVz1Q11P3dpm3yvrXQts5GZ2r7AWMSFa+HvEq72EWb/dQxB
RpWXeOwiWplPgbx6z5EsecpU7MsxGi+pEpFuwKxfEjGxWrHOEpDn7AsKmKxU18fn
VYJNIugDPuzSMosJLO55QhuFXa80EzmUUs0KXflSA3Vpi5G6wjsbKqQ9P8DxVaPF
XGfujZIEjDK7iFniMWyreoc7KAi5G104dFfW9ESansUDf59WfHQIlSKV+caOF/+j
J18QLoa5ZSf2RMR/Z4mw43BD2A9D1AL1wUZEVGtXBBx6OvtX4MFlJ3Njxgu+ftGp
HcyaVd2laKOqPueiLYL6RtWpsuJf8tZ7ZrGAoT5RMHuUZ2Xu/bkP/324UjMmaoB2
EQARCBvXsvuQ5XQw4HAW1np8SUlpARBXj0mJCaBPMAsOBcPQAKlPmqhBgIFPC7Ob
YP3d6R8yfPEXw+bBbprZzOsbUqhGKvYRrKGASg4m5Ycud5vmdRztfeSsY1InebL6
UzDZADfAhfsQBLoklSdkWnvBrB5x0J6REX1kTVn9kGJRlHXsORsChiMRhkXGJcBw
bqwUQz25Mb7L3VFxA+ry1j6PDZ3vpmMdKegqOc/ZXGya2JZDvIuP/m2OtXNB+0ht
tBBMrhXg7hpXZjXCCQNs080nq3RuJCQdC/7i9osyic58yAZ1Z1gniET2eW3rUCoa
J06fIzE5v7ZelXKk6g49xPJOp7wFSMJy8dDC6RkuTdcTs5ChHTBkEWE6vgkJjNPE
jP1ditLKRmCRkynw7jNs/6PVlNe0kS+88eM5LUeQvU7Uf5b3x2eX6hAw1CEe+8Tp
R9YSiV+5a8Gl8/XalSdFAADIIGqXgkAV6gIkR0kaTPygU4XG/SQKl3skzWBYSza7
TDrX7kx6WaWIciZaLKGBXhfIpbqN4pYil70TkvtvxI8jkcd1PuinLcbtoPVcjeSN
1oiIyclurSdK9zlWpETtS/QQRx6m8V6K5gdjJ2W7FHI1/+2zYmyR8Sew5zUmJL4Y
94igaYUvzmq0U7NziyphAaEuP2IxF+Y3
=hW8R
-----END PGP PUBLIC KEY BLOCK-----

53
keys/88CA59E8.asc 100644
View File

@ -0,0 +1,53 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBGAxDKABEADFofbu6NlHoSG+2/cp7wuTzp5iaEOWoitN1k7K7htQwJf2OHsa
kvSAUJm1XQi/2mz+v67UnDeUY8TpFqjMW6d1h8YU/lH0rMoUV14W51xLrad4SO67
cfEWfm4b9LNHO5gbxY3Wzh8RYgaXUdyeTUwjChilaiMmPCp6ES3ZPyjJbI0/NhNJ
U/4Yn3/R+8rgdmWAI1CEMmVQzxT2UvS0YlgIxcI17nLGz+EQF3NAQILXSs3vA368
scP7LqjMnGFY+FJ7ZztzlQ23agPbNml1Ii0xc0GkQYG2jTRfBYnrm03LvQOw3h6u
1odWCVDdEz/9yhUySCq8y8YtRKRze+/mkWRA+88Vb6rn8rGo/BcAil/Foz3m5y+0
7to8UDnKYFx0iJwDuBsEu9lkajyFrYSKBQzLuQc+UZ71E/GTBBqhyZqCkXZZmS8p
tWBCfPe5DVBZAcCt+jkjcSrx8RjSwxur76T1ChJ7A1TCQR/hwyVOejF1QjRotDkc
+z5kSHY3vkIaWaPx6sy53fCqoxSvtglXzXtpco0yNdrT/cgrOzIYcQFiMS1W1WS6
UrBWXUa+FWJgT1DVUFNbKwIm/WwEmq+GjCiO+43VVxdLJtAGiooq9t6fcYq4BhyG
Pvepdtx/wokxK7m6aqT3jWgp4XMlThcIyFhbpQbgUu1Yol7Ce9JxamHk/wARAQAB
tFNPcGVuV3J0IEJ1aWxkIFN5c3RlbSAoUEdQIGtleSBmb3IgMjEuMDIgcmVsZWFz
ZSBidWlsZHMpIDxwZ3BzaWduLTIxLjAyQG9wZW53cnQub3JnPokCVAQTAQoAPhYh
BGZyBeN5uvNIhjpcZojKWeiPaBWABQJgMQygAhsDBQkDwmcABQsJCAcCBhUKCQgL
AgQWAgMBAh4BAheAAAoJEIjKWeiPaBWAUo8P/2gNjI9KMR2gHPIKGcfJHDP2SnUU
aBdwOn2xThdO2s6BKp1Tri3tM6cIhfQC3T/16Kp4pjD/XC6oiNnTbsHz0i7Xvjje
rTMKoG1RaRB0habJL3E/ENPS3glPp5t7wZfLbMOkSbDbvw6oNI1p2D4N4Q1nydn4
f14eRnn2s0tuJ2hR2P9n7qIKtnIa+E3MoVLR9v7zzWWfezyDR/PMd+UgyeSwl5z6
sAwv1wwtH8vDNEZrqfwRn6HeeSeFXxwUaXhO18teD/fEYCvprITX5f3cY05OZPDE
Huoy9KAHSvsn+pfqCrPnXG0kGoT8bjEPN3EbRddaVPnSzz0DJjc5AW9wa5EdCkSg
umrBeHQYbcqyShpcjsMMzs2KezK29ptv/E9lh1wxtUmJ7kIhCpryPpcKB5PjuOWn
iRbNML//Oea7btX0mT6MGmbMP5A4hywWUa8hSPa/1Gub0j1ixvT9a7vf1jZDrgDH
dMpgWJCzWx/NFtg+yoaFVscnq+ULzWmGjyrZ8Oe1+2E+ytwqJleh0WXLMOEKjzR4
ZobE9qwYdrfL1n0BOqvQqLiYEM4pAyNGRxCvnNBmQD00iN4zbYqPWiAbUTBvuhrb
iASt9kwk/3zW6p1acAHDmQZTN40OWZum0cssPr340z8Q7WFZ2LBIMqWkwNa5x3Oi
d4lvvwxgcNDv+KOMuQINBGAxDKABEADSQdK7L30Gz4cj76S7yDRx/HMljPRwdwoD
pcH74WdZLzaM0cagzCXmuEfQmRgJmmG0edyL7sSL+II+wlFmU6TYnt9lM3kLmIGm
Rl66SJVMAk0nKTX2bFnU8KP8yJC0mcfvJy57Dr999V7TXnKzTEIsFQRn93fkwp4u
1bs/yMCsbF558TRAErfXYUDbw+sj4yZ5eV2B4eFWN2/g6BwFDxHoo3DdAc6Exg+7
XodLEEpMElM0qXPL4wWoPbCwYZ/CDGLRYPRGXwURCRQ6ZOY++ia6QqbL7JmDXHPa
zhcB0GIIH8r/O3wFUifLczif13+hP1L6AoWchp9M0iTwCjGqouvG68JBGUuaPhvv
TwQ2949SDT8awDVKFEi4GlgGYOR3knKTqvNm9mtw32cWWBGjOorN1dRTqkgmoXle
4GsHBncEjZjamaK7X9h+YA1F43WnsMuRuuS3Y6oysbClBxZgPwDvJJP3EFiIh1Hc
T4r/G9G0FjrQHVcQl8QWk40QheS3pWd4L9VK1ijNS9Cew+d/X6OgHakESGt5weNK
wtA/uHqcsSaeJIL2Ok2e3C7JTXNFf+XQs0SVFaswuryEiZ/t0LG8rEZY31ZAS/wK
Xd4SW45SVXJMtybqxQuFrYTeFl0hxd5qfALVf6CiLh5uI9aJf4XBn7wD86yBHkfn
BIACpWweawARAQABiQI8BBgBCgAmFiEEZnIF43m680iGOlxmiMpZ6I9oFYAFAmAx
DKACGwwFCQPCZwAACgkQiMpZ6I9oFYAY6RAAwpS+42+jC8v8hHuORjaInQ7zC9RD
VXc3c6jJRqGvyX5xww4tOurfxN88kEwWfsHXNHSUSDF6CjjNitLqSkyR351fdFby
kiKE11Cg1VPaeLsAaSFLDpxZmhVGufqs0VJEdJAtHJUOGcC62mWA4ZuKiT3jVLrc
EJfBSYtoqrqk2kDP4G69fD84MP2pDThq4buCTDCoQqZXh2GQJRg7C0K7u7jY9Fao
ji73VQrf+ds3MQwA7UoXqG9tEBL+XAM7MbkphzyMFMetTGSsKHyVtNMJZsowzkrv
JxmKm0cDgEYeZpcSqVZygWtAAVUwzsx7GEVqeGoe1+wsm8YD+HsMAzbc7cDHGLSc
Hqx2nXsh9NWwfVB7nWsZ7QcNdkGsTLjhZk8v8+a6yIuq/yNTPexGskZft/00SI9k
zPHO196lTeCnkdDFgbkUprhMgOi70FOw4xhhZiIa3I8150ZkoZ19fIAV/bf2RCMX
1xQSgKFYnfb9gtP93Bz342u/P9dNy64aZxRg+Qtg2PTIMIozAIsfhEMqvAFM+I1/
nEzqqHE3tQzZhD0y2NWVeEbJ5MBJkK0sKYJtXW9Muw3acPS1XIQ92MmjO00mFIoT
9PrMw4utdbCUDzqpOhViiv/rCMsTJe6MnchlDACRnliv2eQuevfzRfWtfIweGfoJ
DAT8f8syxL8GNRw=
=Odut
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -0,0 +1,65 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
pnfnQw==
=TMB4
-----END PGP PUBLIC KEY BLOCK-----