From fd9b8caa4d0ffd823a78e9af4bd8287af0b08ed0 Mon Sep 17 00:00:00 2001 From: Paul Spooren Date: Mon, 6 Mar 2023 14:02:37 +0100 Subject: [PATCH] ci: switch to GitHub actions simplify much, GitLab less Signed-off-by: Paul Spooren --- .github/workflows/containers.yml | 243 +++++++++++++++++++++++++++++++ Dockerfile.unify | 58 ++++++++ keys/2074BE7A.asc | 54 +++++++ keys/626471F1.asc | 102 +++++++++++++ keys/88CA59E8.asc | 53 +++++++ keys/CD54E82DADB3684D.asc | 65 +++++++++ 6 files changed, 575 insertions(+) create mode 100644 .github/workflows/containers.yml create mode 100644 Dockerfile.unify create mode 100644 keys/2074BE7A.asc create mode 100644 keys/626471F1.asc create mode 100644 keys/88CA59E8.asc create mode 100644 keys/CD54E82DADB3684D.asc diff --git a/.github/workflows/containers.yml b/.github/workflows/containers.yml new file mode 100644 index 0000000..d161051 --- /dev/null +++ b/.github/workflows/containers.yml @@ -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 }} diff --git a/Dockerfile.unify b/Dockerfile.unify new file mode 100644 index 0000000..17c24f6 --- /dev/null +++ b/Dockerfile.unify @@ -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} diff --git a/keys/2074BE7A.asc b/keys/2074BE7A.asc new file mode 100644 index 0000000..4d61ebd --- /dev/null +++ b/keys/2074BE7A.asc @@ -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----- diff --git a/keys/626471F1.asc b/keys/626471F1.asc new file mode 100644 index 0000000..9962dc4 --- /dev/null +++ b/keys/626471F1.asc @@ -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----- diff --git a/keys/88CA59E8.asc b/keys/88CA59E8.asc new file mode 100644 index 0000000..e53a85b --- /dev/null +++ b/keys/88CA59E8.asc @@ -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----- diff --git a/keys/CD54E82DADB3684D.asc b/keys/CD54E82DADB3684D.asc new file mode 100644 index 0000000..050b154 --- /dev/null +++ b/keys/CD54E82DADB3684D.asc @@ -0,0 +1,65 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +pnfnQw== +=TMB4 +-----END PGP PUBLIC KEY BLOCK-----