From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by 2002:a05:6f02:8585:b0:10e:a910:5047 with SMTP id f5csp3675151rch; Thu, 5 Feb 2026 00:41:09 -0800 (PST) Received: from mail-24427.protonmail.ch (mail-24427.protonmail.ch [109.224.244.27]) by passt.top (Postfix) with ESMTPS id 237CE5A0623 for ; Thu, 05 Feb 2026 07:14:46 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proton.me; s=protonmail; t=1770272085; x=1770531285; bh=udgQ2B6wAaJjb4djhpLlzyRlkqN88tdR67rbVoucBRM=; h=Date:To:From:Subject:Message-ID:Feedback-ID:From:To:Cc:Date: Subject:Reply-To:Feedback-ID:Message-ID:BIMI-Selector; b=eKUqAtH5B1cyL/FPLjESi1Y3Vc75IEiCPRu1zgRuYSiErh8GlyVHPPiaehxJZlfV5 at+HSKnzktPINMgRJvhCb2z+O1PE5hvYty07gG4WUib6uYM4uBHJYHJfJeFzy1ogrF b2ENMCSw/0GANshGA8coe9O4q1m8fpNXxryTtxQDqcYEFgBq/X8q1oCtxKMTy6dHfd 3xOTdSngJoLch2d9onl3jhjrmH1jXt/7PgUwXpQgzAnqfvfF8NTf+zrNpr16/FvT7L adgW3+CLWn/WDSYm7ZMpJbhQf1JKuGHFiPxRUCA6J9Q8V4fWNYDeUsGJSft9pgaW0i VvMf8DrxUuJtg== Date: Thu, 05 Feb 2026 06:14:40 +0000 To: "passt-dev@passt.top" From: jfiusdq Subject: checksum: add VSX fast path for POWER8/POWER9 Message-ID: <5LdZey3mMxwwzujKCRhh-ZEiJi9nQZTX4Q9YabzgvpDN3XkjpaDXWgfUiS7ig1SlB2HCy7ecA1V6bx5F1rhdpuoElNFGZ7i0Z9TccLSms7U=@proton.me> Feedback-ID: 167378330:user:proton X-Pm-Message-ID: 6079b529215cb5b5345da987cfcf6723b49ffd9b MIME-Version: 1.0 X-MailFrom: jfiusdq@proton.me Content-Type: multipart/mixed; boundary="MP_/IBECE7L.G.QHvHYAlGU8.KR" List-Id: --MP_/IBECE7L.G.QHvHYAlGU8.KR Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Disposition: inline Tested with podman on Debian 13 for a while and works ok. It's difficult to run all the tests on POWER but 505-networking-pasta.bats test suite passes. --MP_/IBECE7L.G.QHvHYAlGU8.KR Content-Type: text/x-patch Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=0001-checksum-add-VSX-fast-path-for-POWER8-POWER9.patch >>From b431f05c171a1c9b63ca8a57001188f782354a6a Mon Sep 17 00:00:00 2001 From: user Date: Thu, 5 Feb 2026 06:36:27 +0100 Subject: [PATCH] checksum: add VSX fast path for POWER8/POWER9 --- checksum.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 3 deletions(-) diff --git a/checksum.c b/checksum.c index 0c3837c..828f9ec 100644 --- a/checksum.c +++ b/checksum.c @@ -281,7 +281,7 @@ void csum_icmp6(struct icmp6hdr *icmp6hr, icmp6hr->icmp6_cksum = csum(payload, dlen, psum); } -#ifdef __AVX2__ +#if defined(__AVX2__) #include /** @@ -479,7 +479,111 @@ uint32_t csum_unfolded(const void *buf, size_t len, uint32_t init) return init; } -#else /* __AVX2__ */ +#elif defined(__POWER9_VECTOR__) || defined(__POWER8_VECTOR__) +#include + +/** + * csum_vsx() - Compute 32-bit checksum using VSX SIMD instructions + * @buf: Input buffer + * @len: Input length + * @init: Initial 32-bit checksum, 0 for no pre-computed checksum + * + * Return: 32-bit checksum, not complemented, not folded + */ +/* NOLINTNEXTLINE(clang-diagnostic-unknown-attributes) */ +__attribute__((optimize("-fno-strict-aliasing"))) /* See csum_16b() */ +static uint32_t csum_vsx(const void *buf, size_t len, uint32_t init) +{ + const uint8_t *p = buf; + vector unsigned int sum_even = vec_splat_u32(0); + vector unsigned int sum_odd = vec_splat_u32(0); + const vector unsigned short ones = vec_splat_u16(1); + uint64_t sum64 = init; + +#ifdef __POWER9_VECTOR__ + while (len >= 64) { + vector unsigned char v0b = vec_vsx_ld(0, p); + vector unsigned char v1b = vec_vsx_ld(16, p); + vector unsigned char v2b = vec_vsx_ld(32, p); + vector unsigned char v3b = vec_vsx_ld(48, p); + vector unsigned short v0 = (vector unsigned short)v0b; + vector unsigned short v1 = (vector unsigned short)v1b; + vector unsigned short v2 = (vector unsigned short)v2b; + vector unsigned short v3 = (vector unsigned short)v3b; + + sum_even = vec_add(sum_even, vec_mule(v0, ones)); + sum_odd = vec_add(sum_odd, vec_mulo(v0, ones)); + sum_even = vec_add(sum_even, vec_mule(v1, ones)); + sum_odd = vec_add(sum_odd, vec_mulo(v1, ones)); + sum_even = vec_add(sum_even, vec_mule(v2, ones)); + sum_odd = vec_add(sum_odd, vec_mulo(v2, ones)); + sum_even = vec_add(sum_even, vec_mule(v3, ones)); + sum_odd = vec_add(sum_odd, vec_mulo(v3, ones)); + + p += 64; + len -= 64; + } +#endif + + while (len >= 32) { + vector unsigned char v0b = vec_vsx_ld(0, p); + vector unsigned char v1b = vec_vsx_ld(16, p); + vector unsigned short v0 = (vector unsigned short)v0b; + vector unsigned short v1 = (vector unsigned short)v1b; + + sum_even = vec_add(sum_even, vec_mule(v0, ones)); + sum_odd = vec_add(sum_odd, vec_mulo(v0, ones)); + sum_even = vec_add(sum_even, vec_mule(v1, ones)); + sum_odd = vec_add(sum_odd, vec_mulo(v1, ones)); + + p += 32; + len -= 32; + } + + while (len >= 16) { + vector unsigned char v0b = vec_vsx_ld(0, p); + vector unsigned short v0 = (vector unsigned short)v0b; + + sum_even = vec_add(sum_even, vec_mule(v0, ones)); + sum_odd = vec_add(sum_odd, vec_mulo(v0, ones)); + + p += 16; + len -= 16; + } + + { + vector unsigned int sum32 = vec_add(sum_even, sum_odd); + uint32_t partial[4] __attribute__((aligned(16))); + + vec_st(sum32, 0, partial); + sum64 += (uint64_t)partial[0] + partial[1] + + partial[2] + partial[3]; + } + + sum64 += sum_16b(p, len); + + sum64 = (sum64 >> 32) + (sum64 & 0xffffffff); + sum64 += sum64 >> 32; + + return (uint32_t)sum64; +} + +/** + * csum_unfolded() - Calculate the unfolded checksum of a data buffer. + * + * @buf: Input buffer + * @len: Input length + * @init: Initial 32-bit checksum, 0 for no pre-computed checksum + * + * Return: 32-bit unfolded checksum + */ +/* NOLINTNEXTLINE(clang-diagnostic-unknown-attributes) */ +__attribute__((optimize("-fno-strict-aliasing"))) /* See csum_16b() */ +uint32_t csum_unfolded(const void *buf, size_t len, uint32_t init) +{ + return csum_vsx(buf, len, init); +} +#else /* !__AVX2__ && !__POWER9_VECTOR__ && !__POWER8_VECTOR__ */ /** * csum_unfolded() - Calculate the unfolded checksum of a data buffer. * @@ -495,7 +599,7 @@ uint32_t csum_unfolded(const void *buf, size_t len, uint32_t init) { return sum_16b(buf, len) + init; } -#endif /* !__AVX2__ */ +#endif /* !__AVX2__ && !__POWER9_VECTOR__ && !__POWER8_VECTOR__ */ /** * csum_iov_tail() - Calculate unfolded checksum for the tail of an IO vector -- 2.52.0 --MP_/IBECE7L.G.QHvHYAlGU8.KR-- Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg=pgp-sha512; boundary="------3e34944127ab12e5908fe282a1f3f8c02916ede5c10c0e38d8a5ab443a1b04d9"; charset=utf-8 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------3e34944127ab12e5908fe282a1f3f8c02916ede5c10c0e38d8a5ab443a1b04d9 Content-Type: multipart/mixed;boundary=---------------------fb4e603adb65b6ddebe9353761e78ace -----------------------fb4e603adb65b6ddebe9353761e78ace Content-Type: multipart/alternative;boundary=---------------------fdf214a7f44043b005a4c4eedb2c2d9d -----------------------fdf214a7f44043b005a4c4eedb2c2d9d Content-Transfer-Encoding: quoted-printable Content-Type: text/plain;charset=utf-8 Tested with podman on Debian 13 for a while and works ok. It's difficult to= run all the tests on POWER but 505-networking-pasta.bats test suite passes= . -----------------------fdf214a7f44043b005a4c4eedb2c2d9d Content-Type: multipart/related;boundary=---------------------f679532836418a4e5f28b81955f4e9a6 -----------------------f679532836418a4e5f28b81955f4e9a6 Content-Type: text/html;charset=utf-8 Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0 cHg7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwg MjU1KTsiPlRlc3RlZCB3aXRoIHBvZG1hbiBvbiBEZWJpYW4gMTMgZm9yIGEgd2hpbGUgYW5kIHdv cmtzIG9rLiBJdCdzIGRpZmZpY3VsdCB0byBydW4gYWxsIHRoZSB0ZXN0cyBvbiBQT1dFUiBidXQg PHNwYW4+NTA1LW5ldHdvcmtpbmctcGFzdGEuYmF0czwvc3Bhbj4gdGVzdCBzdWl0ZSBwYXNzZXMu PC9kaXY+ -----------------------f679532836418a4e5f28b81955f4e9a6-- -----------------------fdf214a7f44043b005a4c4eedb2c2d9d-- -----------------------fb4e603adb65b6ddebe9353761e78ace Content-Type: text/x-patch; filename="0001-checksum-add-VSX-fast-path-for-POWER8-POWER9.patch"; name="0001-checksum-add-VSX-fast-path-for-POWER8-POWER9.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-checksum-add-VSX-fast-path-for-POWER8-POWER9.patch"; name="0001-checksum-add-VSX-fast-path-for-POWER8-POWER9.patch" RnJvbSBiNDMxZjA1YzE3MWExYzliNjNjYThhNTcwMDExODhmNzgyMzU0YTZhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiB1c2VyIDx1c2VyQGxvY2FsaG9zdD4KRGF0ZTogVGh1LCA1IEZl YiAyMDI2IDA2OjM2OjI3ICswMTAwClN1YmplY3Q6IFtQQVRDSF0gY2hlY2tzdW06IGFkZCBWU1gg ZmFzdCBwYXRoIGZvciBQT1dFUjgvUE9XRVI5CgotLS0KIGNoZWNrc3VtLmMgfCAxMTAgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0KIDEgZmlsZSBj aGFuZ2VkLCAxMDcgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9j aGVja3N1bS5jIGIvY2hlY2tzdW0uYwppbmRleCAwYzM4MzdjLi44MjhmOWVjIDEwMDY0NAotLS0g YS9jaGVja3N1bS5jCisrKyBiL2NoZWNrc3VtLmMKQEAgLTI4MSw3ICsyODEsNyBAQCB2b2lkIGNz dW1faWNtcDYoc3RydWN0IGljbXA2aGRyICppY21wNmhyLAogCWljbXA2aHItPmljbXA2X2Nrc3Vt ID0gY3N1bShwYXlsb2FkLCBkbGVuLCBwc3VtKTsKIH0KIAotI2lmZGVmIF9fQVZYMl9fCisjaWYg ZGVmaW5lZChfX0FWWDJfXykKICNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KIAogLyoqCkBAIC00Nzks NyArNDc5LDExMSBAQCB1aW50MzJfdCBjc3VtX3VuZm9sZGVkKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6 ZV90IGxlbiwgdWludDMyX3QgaW5pdCkKIAogCXJldHVybiBpbml0OwogfQotI2Vsc2UgLyogX19B VlgyX18gKi8KKyNlbGlmIGRlZmluZWQoX19QT1dFUjlfVkVDVE9SX18pIHx8IGRlZmluZWQoX19Q T1dFUjhfVkVDVE9SX18pCisjaW5jbHVkZSA8YWx0aXZlYy5oPgorCisvKioKKyAqIGNzdW1fdnN4 KCkgLSBDb21wdXRlIDMyLWJpdCBjaGVja3N1bSB1c2luZyBWU1ggU0lNRCBpbnN0cnVjdGlvbnMK KyAqIEBidWY6CUlucHV0IGJ1ZmZlcgorICogQGxlbjoJSW5wdXQgbGVuZ3RoCisgKiBAaW5pdDoJ SW5pdGlhbCAzMi1iaXQgY2hlY2tzdW0sIDAgZm9yIG5vIHByZS1jb21wdXRlZCBjaGVja3N1bQor ICoKKyAqIFJldHVybjogMzItYml0IGNoZWNrc3VtLCBub3QgY29tcGxlbWVudGVkLCBub3QgZm9s ZGVkCisgKi8KKy8qIE5PTElOVE5FWFRMSU5FKGNsYW5nLWRpYWdub3N0aWMtdW5rbm93bi1hdHRy aWJ1dGVzKSAqLworX19hdHRyaWJ1dGVfXygob3B0aW1pemUoIi1mbm8tc3RyaWN0LWFsaWFzaW5n IikpKQkvKiBTZWUgY3N1bV8xNmIoKSAqLworc3RhdGljIHVpbnQzMl90IGNzdW1fdnN4KGNvbnN0 IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgdWludDMyX3QgaW5pdCkKK3sKKwljb25zdCB1aW50OF90 ICpwID0gYnVmOworCXZlY3RvciB1bnNpZ25lZCBpbnQgc3VtX2V2ZW4gPSB2ZWNfc3BsYXRfdTMy KDApOworCXZlY3RvciB1bnNpZ25lZCBpbnQgc3VtX29kZCA9IHZlY19zcGxhdF91MzIoMCk7CisJ Y29uc3QgdmVjdG9yIHVuc2lnbmVkIHNob3J0IG9uZXMgPSB2ZWNfc3BsYXRfdTE2KDEpOworCXVp bnQ2NF90IHN1bTY0ID0gaW5pdDsKKworI2lmZGVmIF9fUE9XRVI5X1ZFQ1RPUl9fCisJd2hpbGUg KGxlbiA+PSA2NCkgeworCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2MGIgPSB2ZWNfdnN4X2xkKDAs IHApOworCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2MWIgPSB2ZWNfdnN4X2xkKDE2LCBwKTsKKwkJ dmVjdG9yIHVuc2lnbmVkIGNoYXIgdjJiID0gdmVjX3ZzeF9sZCgzMiwgcCk7CisJCXZlY3RvciB1 bnNpZ25lZCBjaGFyIHYzYiA9IHZlY192c3hfbGQoNDgsIHApOworCQl2ZWN0b3IgdW5zaWduZWQg c2hvcnQgdjAgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXYwYjsKKwkJdmVjdG9yIHVuc2lnbmVk IHNob3J0IHYxID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2MWI7CisJCXZlY3RvciB1bnNpZ25l ZCBzaG9ydCB2MiA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdjJiOworCQl2ZWN0b3IgdW5zaWdu ZWQgc2hvcnQgdjMgPSAodmVjdG9yIHVuc2lnbmVkIHNob3J0KXYzYjsKKworCQlzdW1fZXZlbiA9 IHZlY19hZGQoc3VtX2V2ZW4sIHZlY19tdWxlKHYwLCBvbmVzKSk7CisJCXN1bV9vZGQgPSB2ZWNf YWRkKHN1bV9vZGQsIHZlY19tdWxvKHYwLCBvbmVzKSk7CisJCXN1bV9ldmVuID0gdmVjX2FkZChz dW1fZXZlbiwgdmVjX211bGUodjEsIG9uZXMpKTsKKwkJc3VtX29kZCA9IHZlY19hZGQoc3VtX29k ZCwgdmVjX211bG8odjEsIG9uZXMpKTsKKwkJc3VtX2V2ZW4gPSB2ZWNfYWRkKHN1bV9ldmVuLCB2 ZWNfbXVsZSh2Miwgb25lcykpOworCQlzdW1fb2RkID0gdmVjX2FkZChzdW1fb2RkLCB2ZWNfbXVs byh2Miwgb25lcykpOworCQlzdW1fZXZlbiA9IHZlY19hZGQoc3VtX2V2ZW4sIHZlY19tdWxlKHYz LCBvbmVzKSk7CisJCXN1bV9vZGQgPSB2ZWNfYWRkKHN1bV9vZGQsIHZlY19tdWxvKHYzLCBvbmVz KSk7CisKKwkJcCArPSA2NDsKKwkJbGVuIC09IDY0OworCX0KKyNlbmRpZgorCisJd2hpbGUgKGxl biA+PSAzMikgeworCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2MGIgPSB2ZWNfdnN4X2xkKDAsIHAp OworCQl2ZWN0b3IgdW5zaWduZWQgY2hhciB2MWIgPSB2ZWNfdnN4X2xkKDE2LCBwKTsKKwkJdmVj dG9yIHVuc2lnbmVkIHNob3J0IHYwID0gKHZlY3RvciB1bnNpZ25lZCBzaG9ydCl2MGI7CisJCXZl Y3RvciB1bnNpZ25lZCBzaG9ydCB2MSA9ICh2ZWN0b3IgdW5zaWduZWQgc2hvcnQpdjFiOworCisJ CXN1bV9ldmVuID0gdmVjX2FkZChzdW1fZXZlbiwgdmVjX211bGUodjAsIG9uZXMpKTsKKwkJc3Vt X29kZCA9IHZlY19hZGQoc3VtX29kZCwgdmVjX211bG8odjAsIG9uZXMpKTsKKwkJc3VtX2V2ZW4g PSB2ZWNfYWRkKHN1bV9ldmVuLCB2ZWNfbXVsZSh2MSwgb25lcykpOworCQlzdW1fb2RkID0gdmVj X2FkZChzdW1fb2RkLCB2ZWNfbXVsbyh2MSwgb25lcykpOworCisJCXAgKz0gMzI7CisJCWxlbiAt PSAzMjsKKwl9CisKKwl3aGlsZSAobGVuID49IDE2KSB7CisJCXZlY3RvciB1bnNpZ25lZCBjaGFy IHYwYiA9IHZlY192c3hfbGQoMCwgcCk7CisJCXZlY3RvciB1bnNpZ25lZCBzaG9ydCB2MCA9ICh2 ZWN0b3IgdW5zaWduZWQgc2hvcnQpdjBiOworCisJCXN1bV9ldmVuID0gdmVjX2FkZChzdW1fZXZl biwgdmVjX211bGUodjAsIG9uZXMpKTsKKwkJc3VtX29kZCA9IHZlY19hZGQoc3VtX29kZCwgdmVj X211bG8odjAsIG9uZXMpKTsKKworCQlwICs9IDE2OworCQlsZW4gLT0gMTY7CisJfQorCisJewor CQl2ZWN0b3IgdW5zaWduZWQgaW50IHN1bTMyID0gdmVjX2FkZChzdW1fZXZlbiwgc3VtX29kZCk7 CisJCXVpbnQzMl90IHBhcnRpYWxbNF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKKwor CQl2ZWNfc3Qoc3VtMzIsIDAsIHBhcnRpYWwpOworCQlzdW02NCArPSAodWludDY0X3QpcGFydGlh bFswXSArIHBhcnRpYWxbMV0gKworCQkJIHBhcnRpYWxbMl0gKyBwYXJ0aWFsWzNdOworCX0KKwor CXN1bTY0ICs9IHN1bV8xNmIocCwgbGVuKTsKKworCXN1bTY0ID0gKHN1bTY0ID4+IDMyKSArIChz dW02NCAmIDB4ZmZmZmZmZmYpOworCXN1bTY0ICs9IHN1bTY0ID4+IDMyOworCisJcmV0dXJuICh1 aW50MzJfdClzdW02NDsKK30KKworLyoqCisgKiBjc3VtX3VuZm9sZGVkKCkgLSBDYWxjdWxhdGUg dGhlIHVuZm9sZGVkIGNoZWNrc3VtIG9mIGEgZGF0YSBidWZmZXIuCisgKgorICogQGJ1ZjogICBJ bnB1dCBidWZmZXIKKyAqIEBsZW46ICAgSW5wdXQgbGVuZ3RoCisgKiBAaW5pdDogIEluaXRpYWwg MzItYml0IGNoZWNrc3VtLCAwIGZvciBubyBwcmUtY29tcHV0ZWQgY2hlY2tzdW0KKyAqCisgKiBS ZXR1cm46IDMyLWJpdCB1bmZvbGRlZCBjaGVja3N1bQorICovCisvKiBOT0xJTlRORVhUTElORShj bGFuZy1kaWFnbm9zdGljLXVua25vd24tYXR0cmlidXRlcykgKi8KK19fYXR0cmlidXRlX18oKG9w dGltaXplKCItZm5vLXN0cmljdC1hbGlhc2luZyIpKSkJLyogU2VlIGNzdW1fMTZiKCkgKi8KK3Vp bnQzMl90IGNzdW1fdW5mb2xkZWQoY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCB1aW50MzJf dCBpbml0KQoreworCXJldHVybiBjc3VtX3ZzeChidWYsIGxlbiwgaW5pdCk7Cit9CisjZWxzZSAv KiAhX19BVlgyX18gJiYgIV9fUE9XRVI5X1ZFQ1RPUl9fICYmICFfX1BPV0VSOF9WRUNUT1JfXyAq LwogLyoqCiAgKiBjc3VtX3VuZm9sZGVkKCkgLSBDYWxjdWxhdGUgdGhlIHVuZm9sZGVkIGNoZWNr c3VtIG9mIGEgZGF0YSBidWZmZXIuCiAgKgpAQCAtNDk1LDcgKzU5OSw3IEBAIHVpbnQzMl90IGNz dW1fdW5mb2xkZWQoY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCB1aW50MzJfdCBpbml0KQog ewogCXJldHVybiBzdW1fMTZiKGJ1ZiwgbGVuKSArIGluaXQ7CiB9Ci0jZW5kaWYgLyogIV9fQVZY Ml9fICovCisjZW5kaWYgLyogIV9fQVZYMl9fICYmICFfX1BPV0VSOV9WRUNUT1JfXyAmJiAhX19Q T1dFUjhfVkVDVE9SX18gKi8KIAogLyoqCiAgKiBjc3VtX2lvdl90YWlsKCkgLSBDYWxjdWxhdGUg dW5mb2xkZWQgY2hlY2tzdW0gZm9yIHRoZSB0YWlsIG9mIGFuIElPIHZlY3RvcgotLSAKMi41Mi4w Cgo= -----------------------fb4e603adb65b6ddebe9353761e78ace Content-Type: application/pgp-keys; filename="publickey - jfiusdq@proton.me - 0x344F580A.asc"; name="publickey - jfiusdq@proton.me - 0x344F580A.asc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="publickey - jfiusdq@proton.me - 0x344F580A.asc"; name="publickey - jfiusdq@proton.me - 0x344F580A.asc" LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgp4ak1FYVJXRTZ4WUpLd1lCQkFI YVJ3OEJBUWRBZi92VUlPRVlEcjl2OHZEQ1RicVlJdnhoUlJ0MjBhTm8KMTF1OUVuVGdyQ0hOSldw bWFYVnpaSEZBY0hKdmRHOXVMbTFsSUR4cVptbDFjMlJ4UUhCeWIzUnZiaTV0ClpUN0N3QkVFRXhZ S0FJTUZnbWtWaE9zREN3a0hDUkR0dzkxdmxVeGhSRVVVQUFBQUFBQWNBQ0J6WVd4MApRRzV2ZEdG MGFXOXVjeTV2Y0dWdWNHZHdhbk11YjNKbk5wY3RzQ0hKRjBqUEZLY3Vod1lCQ1hMZ2Y0S28KZHFy OWdXSmR4bVVPem5jREZRb0lCQllBQWdFQ0dRRUNtd01DSGdFV0lRUTBUMWdLY2hVRDBBWUZvajN0 Cnc5MXZsVXhoUkFBQWorWUEvMlFSRmkvOElBNFU4YWszNVBmN1hDWHdRQkxpTUZDUW16MDhYOWs1 SkNkZgpBUDBSWUpIWHdoZGZ1WUZBT0dsaE9iVzFQejBBM2FLM2dUa09SbE1VSTk5YURzNDRCR2tW aE9zU0Npc0cKQVFRQmwxVUJCUUVCQjBDbmlSQ21tN0MrV2tOaXk5RVcrZFo4MHhsRnZqbk90MXRj TkdrZUJDUVhOUU1CCkNBZkN2Z1FZRmdvQWNBV0NhUldFNndrUTdjUGRiNVZNWVVSRkZBQUFBQUFB SEFBZ2MyRnNkRUJ1YjNSaApkR2x2Ym5NdWIzQmxibkJuY0dwekxtOXlaNUVQUDJ6b3diOG9zZUFP MjRKQjdhMGxRWEVSZnJWK0t4Wm8KM214bldMdldBcHNNRmlFRU5FOVlDbklWQTlBR0JhSTk3Y1Bk YjVWTVlVUUFBQTdRQVAwWjcreHdQRU9hCmpnT3FKR0Z0TEN1M1hsUXhJNUVKSThxdElMc3Z2Vk5i dGdEK01UdjNJeGRvRmUrWmkxeGxnaGd3cjRBYwppdENwamlRL21Jc2lWTXlQb1EwPQo9U2tMTQot LS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCg== -----------------------fb4e603adb65b6ddebe9353761e78ace-- --------3e34944127ab12e5908fe282a1f3f8c02916ede5c10c0e38d8a5ab443a1b04d9 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: ProtonMail wrsEARYKAG0FgmmENUEJEO3D3W+VTGFERRQAAAAAABwAIHNhbHRAbm90YXRp b25zLm9wZW5wZ3Bqcy5vcmcxjX2Cxagbtb9f/LCFy3y4G7SL8pddJHzPYYvw zqP8eRYhBDRPWApyFQPQBgWiPe3D3W+VTGFEAAB97AEA+7CbULzoz/kh1OWY F/OVUDOPVE8FheQrvN5cOoWZDk4BAPOkqthHe0HOlLiCCXMaGbPIAuX+NIku phWpQqhFOUoH =xYCV -----END PGP SIGNATURE----- --------3e34944127ab12e5908fe282a1f3f8c02916ede5c10c0e38d8a5ab443a1b04d9--